跟踪和跟踪一个对象
在本例中,您将探索包含Kinect®摄像头的自主行为。这个算法涉及TurtleBot®寻找一个蓝色的球,然后呆在一个固定距离的球。你融入了安全功能,比如颠簸和悬崖感知。
运行此示例需要图像处理工具箱™。
先决条件:与TurtleBot交流,探索乌龟机器人的基本行为,用远程操作控制TurtleBot,TurtleBot和VFH避障
TurtleBot硬件支持包
本示例概述了如何使用TurtleBot的本机ROS接口。的基于TurtleBot的机器人的ROS工具箱™支持包为TurtleBot提供了更精简的界面。它允许您:
获取传感器数据并发送控制命令,而不显式调用ROS命令
透明地与Gazebo中的模拟机器人或物理TurtleBot交流
要安装支持包,请打开获取硬件支持包在MATLAB®上首页按TAB键选择基于TurtleBot的机器人的ROS工具箱™支持包.或者,使用roboticsAddons
(机器人系统工具箱)命令。
连接到TurtleBot
确保您有一个TurtleBot运行在模拟通过Gazebo®或在真正的硬件。指开始与露台和模拟乌龟机器人或开始与一个真正的乌龟机器人用于启动过程。如果使用硬件,请使用一个蓝色的球进行跟踪。如果你正在使用Gazebo®,蓝色的球必须在机器人的世界前面(确保你正在使用露台的办公室世界)。
初始化ROS。通过更换连接到TurtleBotipaddress
上面有乌龟机器人的IP地址
ipaddress =“192.168.178.133”;rosinit (ipaddress, 11311)
使用NodeURI http://192.168.178.1:49316/初始化全局节点/matlab_global_node_76155
如果你使用的是真正的TurtleBot硬件,请确保你已经启动了Kinect摄像头。启动相机的命令是:
Roslaunch turtlebot_bringup 3dsensor.launch。
你必须在TurtleBot的终端上输入这个。
为彩色相机、悬崖传感器和保险杠传感器创建订阅者。为发出声音和控制机器人速度信息创建发布者。使用结构格式的消息进行通信以获得更好的性能。
句柄。colorImgSub = exampleHelperTurtleBotEnableColorCamera;
成功启用相机(原始图像)
useHardware = examplehelperturtlebotiphysicalrobot;如果useHardware处理。cliffSub = rossubscriber(“/ mobile_base /事件/悬崖”,...“BufferSize”5,“DataFormat”,“结构”);句柄。bumpSub = rossubscriber(“mobile_base /传感器/ bumper_pointcloud”,...“BufferSize”5,“DataFormat”,“结构”);句柄。soundPub = ropubblisher (“mobile_base /命令/声音”,“kobuki_msgs /声音”,...“DataFormat”,“结构”);句柄。velPub = ropublisher (“/ mobile_base /命令/速度”,...“DataFormat”,“结构”);其他的悬崖传感器,保险杠传感器和声音发射器只出现在真正的TurtleBot硬件句柄。cliffSub = []; handles.bumpSub = []; handles.soundPub = []; handles.velPub = rospublisher(“/ cmd_vel”,“DataFormat”,“结构”);结束
调整蓝球探测
设置图像过滤参数。将它们添加到算法中使用的数据结构中。
blueBallParams.blueMax= 120;与纯蓝色的最大允许偏差blueBallParams.darkMin= 30;最小可接受的暗值
试着把球形象化,以确保找球参数可以定位它。运行exampleHelperTurtleBotFindBlueBall
函数来查看是否找到了圆。如果是这样,c
而且米
被赋值。球
通过在图像上应用蓝色和黑暗滤镜创建的二值图像。视图球
看看蓝球是否被正确分离:
latestImg = rosReadImage(handles.colorImgSub.LatestMessage);[c,~,ball] = exampleHelperTurtleBotFindBlueBall(latestImg,blueBallParams,useHardware);
使用这个示例帮助器可以在图形中显示实数和二值图像,并在球的中心绘制一个红色加号。
exampleHelperTurtleBotPlotObject (latestImg,球,c);
如果没有找到球,试着增加或减少blueBallParams.blueMax
而且blueBallParams.darkMin
.再次查看图,直到找到球。这种方法是在使用控制器之前对寻球算法进行微调的好方法。
在Gazebo中,使用的参数可能找不到球,因为阈值太大了。凉亭的图像(左图)包括部分墙壁和白色空间中的其他物体。真实的图像(右图)看起来非常饱和的白色。尝试改变参数,让它们更具限制性:
blueBallParams.blueMax= 200;与纯蓝色的最大允许偏差blueBallParams.darkMin= 220;最小可接受的暗值latestImg = rosReadImage(handles.colorImgSub.LatestMessage);[c,~,ball] = exampleHelperTurtleBotFindBlueBall(latestImg,blueBallParams,useHardware);
使用这个示例帮助器来显示数字。
exampleHelperTurtleBotPlotObject (latestImg,球,c);
现在的参数限制太大了。球的一部分甚至没有在Gazebo的图像中显示出来,你在真实的图像中什么也看不到。如果进一步优化参数,您可以找到一个中间立场。在Gazebo中,以下参数应该工作得很好。对于硬件,环境照明可能需要你花更多的时间微调参数。
blueBallParams.blueMax= 30;与纯蓝色的最大允许偏差blueBallParams.darkMin= 90;最小可接受的暗值latestImg = rosReadImage(handles.colorImgSub.LatestMessage);[c,~,ball] = exampleHelperTurtleBotFindBlueBall(latestImg,blueBallParams, useHardware);
使用这个示例帮助器来显示数字。
exampleHelperTurtleBotPlotObject (latestImg,球,c);
与在Gazebo等模拟环境中调优颜色阈值相比,调优颜色阈值具有挑战性。
参数调优之后,将它们添加到处理
对象,该对象将由球跟踪算法使用。
句柄。参数个数= blueBallParams;
测试固定距离控制器
为TurtleBot设置控制器增益。TurtleBot使用PID控制器与球保持恒定的距离。
第一组控制器增益对Gazebo中的TurtleBot是好的。第二组适合真实硬件中的TurtleBot。根据你的需要调整增益。
这是一种分配结构值的紧凑方法。
凉亭模拟的有效增益:
收益。Lin = struct(“pgain”, 1/100,“dgain”, 1/100,“igain”0,“maxwindup”0,“选点”, 0.65);收益。Ang = struct(“pgain”, 1/400,“dgain”, 1/500,“igain”0,“maxwindup”0,“选点”, 0.5);
TurtleBot硬件的有效收益:
收益。Lin = struct(“pgain”, 1/100,“dgain”, 1/1000,“igain”0,“maxwindup”0,“选点”, 0.75);收益。Ang = struct(“pgain”, 1/100,“dgain”, 1/3000,“igain”0,“maxwindup”0,“选点”, 0.5);
确保添加收益
的结构处理
变量。
句柄。收益= gains;
定义一个计时器来通过回调执行球跟踪行为。定义stop函数来关闭ROS。在计时器的回调函数中包含句柄:
Timer2 = timer(“TimerFcn”{@exampleHelperTurtleBotTrackingTimer、句柄useHardware},“期”, 0.1,“ExecutionMode”,“fixedSpacing”);timer2。StopFcn = {@exampleHelperTurtleBotStopCallback};
使用下面的命令启动定时器。你看到乌龟机器人开始在世界各地移动,寻找球。当它在Kinect图像中找到它时,机器人将使用控制器保持固定的距离。
开始(timer2);暂停(1);
碰撞传感器在模拟中没有激活,所以TurtleBot在撞到墙时可能无法恢复。
如果你想移动蓝色的球,使用以下命令施加一个力:
g = ExampleHelperGazeboCommunicator();球柄= ExampleHelperGazeboSpawnedModel(“unit_sphere_1”,g) duration = 2;forvecector = [0 4 0];applyForce (ballhandle“链接”、持续时间、forceVector)
如果想进一步探索凉亭控件的仿真参考在Gazebo中添加、构建和删除对象.
停止机器人运动
要停止定时器和自治行为,使用以下命令:
停止(timer2);
如果计时器在停止之前从工作区中清除,则必须以另一种方式删除它。要停止所有计时器(甚至是后台的计时器),执行以下命令:
删除(timerfindall)
在处理完发布者、订阅者和其他ROS相关对象后,清除它们的工作区
清晰的
更多的信息
注意:本节中的代码不是用于MATLAB命令行执行的
在本例中,支持文件的组织允许您在定制和重新使用代码方面具有很大的灵活性。中的值可以改变寻球参数和控制器增益处理
结构体。此示例包含一个计时器
管理控制算法的所有方面。这个定时器是exampleHelperTurtleBotTrackingTimer
.该计时器具有名称-值对期
而且ExecutionMode
用来确定计时器回调被调用的频率。此外,还使用了stop回调函数。如果需要,可以合并其他回调函数。
传入计时器的句柄包括参数个数
找球和收益
对于控制器。
的结构exampleHelperTurtleBotTrackingTimer
很简单。它是一个具有一些初始化步骤的基本状态机。初始化函数确定在不处于悬崖或缓冲器恢复状态时使用哪个跟踪算法和哪个控制器。函数是:
function [objectTrack, imgControl] = initControl() % initControl -初始化函数,确定使用哪个控件%和对象检测算法objectTrack = @exampleHelperTurtleBotFindBlueBall;imgControl = @exampleHelperTurtleBotPointController;
在本例中,跟踪函数为exampleHelperTurtleBotFindBlueBall
控制器是exampleHelperTurtleBotPointController
您可以用任何具有相同输入和输出参数结构的用户定义函数替换此函数和控制器。的输入参数exampleHelperTurtleBotFindBlueBall
是一个彩色图像和一个寻球参数结构。输出参数是所寻找对象的中心、幅度和二值图像。的输入参数exampleHelperTurtleBotPointController
是对象中心、幅度(尽管在示例中没有使用幅度)、图像大小和控制器增益(一个结构)。输出参数是线速度和角速度。
使用的基本状态机exampleHelperTurtleBotTrackingTimer
是:
开关状态情况下ExampleHelperTurtleBotStates。寻求查找对象的状态[center, scale] = findObject(handles.Tbot.ImColor,handles.params);如果没有找到圆,就瞄准圆。如果isempty(center) [linearV, angularV] = exampleHelperTurtleBotWanderController();其他的[linearV, angularV] = imageControl(center, scale, size(handles.Tbot.ImColor),handles. gets);setSound (handles.Tbot 2);结束state = ExampleHelperTurtleBotStates.Seek;情况下ExampleHelperTurtleBotStates。保险杠保险杠触点状态情况下ExampleHelperTurtleBotStates。自旋%自旋状态情况下ExampleHelperTurtleBotStates。悬崖%悬崖规避结束
可以从状态机中添加或删除用例。如果要更改状态名,请使用ExampleHelperTurtleBotStates
类。
寻球算法是模块化和可变的。它使用两个图像滤镜(一个在黑暗上,一个在蓝色上)蒙面在一起来隔离蓝色的球。你可以改变面具找到一个红色或绿色的球代替。如果您想探索其他形式的形状跟踪,基本工作流程保持不变。
蓝色通道被隔离(有一些缩放因子)和一个阈值被应用来产生二值图像掩码。
blueImg = img (:: 1) / 2 + img (:,: 2) / 2 - img (:,:, 3) / 2;blueThresh = blueImg < params.blueMax;
这些命令隔离了蓝色的倒数(用不同的比例)并强调了黑暗。应用阈值。
darkIso = img (:: 1) / 2 - img (:,: 2) / 2 + 3 * img (:,:, 3) - 2 * rgb2gray (img);darkThresh = darkIso > params.darkMin;
将两张二值图像蒙版在一起以隔离深蓝色的球。
ball1 = blue ethresh & darkThresh;
图像上的常数和缩放因子是用户确定的,以隔离特定的颜色。你可以尝试不同的组合。
还可以在过滤后的图像中查找相邻区域regionprops
,这是图像处理工具箱的一部分。
S = regionprops(球1,{“重心”,“区域”,“EquivDiameter”});
有额外的步骤来找到这个区域的球,你可以在exampleHelperTurtleBotFindBlueBall
.
的exampleHelperTurtleBotPointController
函数使用ExampleHelperPIDControl
类将指定的点(在本例中为球的中心位置)保持在图像中的确切位置。
示例代码的模块化和灵活性使您可以试验自己的算法和函数。