这个例子帮助您探索TurtleBot®的基本自治。所描述的行为驱动机器人前进,并在遇到障碍物时改变方向。您将订阅激光扫描主题并发布速度主题来控制TurtleBot。
先决条件:和它交流
这个示例概述了如何使用TurtleBot的本机ROS接口来处理它。基于TurtleBot的ROS T万博1manbetxoolbox™支持包为TurtleBot提供了更加流线型的接口。它允许你:
采集传感器数据和发送控制命令,而无需显式调用ROS命令
透明地与Gazebo中的模拟机器人或实际的龟甲机器人通信
要安装支持包,请打开万博1manbetx附加组件>获取硬件支持包万博1manbetx在MATLAB®首页选项卡,选择工具箱中ROS支持包基于TurtleBot万博1manbetx机器人。或者,使用rosAddons
命令。
请确保您有在模拟两种运行TurtleBot通过Gazebo®或在真实硬件。请参阅开始使用凉亭和模拟TurtleBot要么开始使用一个真正的TurtleBot用于启动过程。然而,任何Gazebo世界都是在模拟中运行的,露台TurtleBot世界
对于本示例来说,是最有趣的。
初始化ROS。通过更换连接到TurtleBotipaddress
与乌龟的IP地址。
IPADDRESS =“http://192.168.233.133:11311”
IPADDRESS = 'http://192.168.233.133:11311'
rosinit(ip地址)
初始化的全球节点/ matlab_global_node_09953与NodeURI http://192.168.233.1:61154/
为机器人的速度创建一个发布者,并为该主题创建一条消息。
机器人= rospublisher (“/ mobile_base /命令/速度”);velmsg = rosmessage(机器人);
请确保您启动Kinect®相机,如果你是真正的TurtleBot硬件工作。启动Kinect的摄像头的命令是:
roslaunchturtlebot_bringup3 dsensor.launch
您必须在TurtleBot的终端上执行该命令。TurtleBot使用Kinect数据来模拟发布在/扫描
的话题。在本例的其余部分中,术语是激光扫描指就此主题发表的数据。
订阅主题/扫描
。
激光= rossubscriber (“/扫描”);
等待一个激光扫描消息到达,然后显示它。
扫描=接收(激光,3)
扫描= ROS激光扫描消息属性:消息类型: 'sensor_msgs /激光扫描' 部首:[1×1接头] AngleMin:-0.5216 AngleMax:0.5243 AngleIncrement:0.0016 TimeIncrement:0 SCANTIME:0.0330 RangeMin:0.4500的RangeMax:10个范围:[640×1单]强度:[0×1单]使用showdetails来显示消息的内容
图图(扫描);
如果您看到一个错误,可能是激光扫描主题没有收到任何数据。如果您在模拟中运行,请尝试重新启动Gazebo。如果使用硬件,请确保正确启动了Kinect摄像头。
运行的代码的以下各行,该绘制十秒钟活激光扫描饲料。移动对象在TurtleBot面前,并把它足够近,直到它不再显示在了绘图窗口。激光扫描具有由于Kinect的摄像机的硬件限制在有限的范围内。Kinect的具有0.8米的最小检测范围和4米的最大范围。这些限度之外的任何对象不会被传感器检测到。
抽动;而TOC <10扫描=接收(激光,3);情节(扫描);结束
基于从激光扫描的距离数据,可以实现简单的避障算法。您可以使用一个简单的而
循环来实现此行为。
设置一些将在处理循环中使用的参数。您可以根据不同的行为修改这些值。
spinVelocity = 0.6;%角速度(rad/s)forwardVelocity = 0.1;线速度% (m/s)backwardVelocity = -0.02;线速度(反向)(m/s)distanceThreshold = 0.6;%转弯距离阈值(m)
运行一个循环的机器人向前移动,并计算到机器人最接近的障碍。当障碍物是的范围内distanceThreshold
,机器人转动。运行时间20秒后这个循环停止。CTRL + C(或在Mac上控制+ C)也停止该循环。
抽动;而toc < 20%来自激光扫描收集的信息扫描=接收(激光);情节(扫描);data = readCartesian(扫描);x =数据(:1);y =数据(:,2);%计算最近障碍物的距离dist =√x。^ 2 + y ^ 2);minDist = min(经销);%命令机扑动作如果minDist < distanceThreshold%当接近障碍物时,备份略和旋velmsg.Angular。Z = spinVelocity;velmsg.Linear。X = backwardVelocity;其他的继续前进路径velmsg.Linear.X = forwardVelocity;velmsg.Angular.Z = 0;结束发送(机器人,velmsg);结束
处理完发布者、订阅者和其他ROS相关对象后,清除工作区。
明确
用rosshutdown
一旦你完成了ROS网络的工作。关闭全局节点并断开与TurtleBot的连接。
rosshutdown
使用NodeURI http://192.168.233.1:61154/关闭全局节点/matlab_global_node_09953
激光扫描有一个最小的范围,在这个范围内它将不再看到阻挡它的物体。这个最小距离距离Kinect摄像头0.5米左右。
激光扫描不能检测到玻璃墙。以下是从Kinect的摄像头的图像:
以下是相应激光扫描:
的垃圾桶是可见的,但你不能看到玻璃墙。当你在窗户或墙的TurtleBot可能无法检测到的区域使用TurtleBot,要知道激光扫描的局限性。
请参考下面的例子:用远距操作控制乌龟机器人