探索龟甲虫的基本行为

这个例子帮助您探索TurtleBot®的基本自治。所描述的行为驱动机器人前进,并在遇到障碍物时改变方向。您将订阅激光扫描主题并发布速度主题来控制TurtleBot。

先决条件:和它交流

TurtleBot万博1manbetx的硬件支持包

这个示例概述了如何使用TurtleBot的本机ROS接口来处理它。基于TurtleBot的ROS T万博1manbetxoolbox™支持包为TurtleBot提供了更加流线型的接口。它允许你:

  • 采集传感器数据和发送控制命令,而无需显式调用ROS命令

  • 透明地与Gazebo中的模拟机器人或实际的龟甲机器人通信

要安装支持包,请打开万博1manbetx附加组件>获取硬件支持包万博1manbetx在MATLAB®首页选项卡,选择工具箱中ROS支持包基于TurtleBot万博1manbetx机器人。或者,使用rosAddons命令。

连接到TurtleBot

请确保您有在模拟两种运行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,要知道激光扫描的局限性。

下一个步骤

请参考下面的例子:用远距操作控制乌龟机器人