主要内容

探索乌龟机器人的基本行为

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

先决条件:与乌龟机器人交流

连接到乌龟机器人

确保你在Gazebo®模拟或真实硬件上运行一个TurtleBot。指开始使用凉亭和模拟乌龟机器人从一个真正的乌龟机器人开始用于启动过程。这个例子使用了露台模拟的Turtlebot。

在下载的虚拟机中,单击露台的房子开启世界的捷径。

初始化ROS。通过替换连接到TurtleBotipaddress乌龟机器人的IP地址

ipaddress =“http://192.168.178.133:11311”;rosinit (ipaddress)
使用NodeURI http://192.168.178.1:51558/初始化全局节点/matlab_global_node_05319

为机器人的速度创建一个发布者,并为该主题创建一条消息。使用结构格式消息进行通信以提高性能。

机器人= rospublisher (“/ cmd_vel”“DataFormat”“结构”);velmsg = rosmessage(机器人);

接收扫描数据

如果使用的是真正的TurtleBot硬件,请确保启动了激光雷达和摄像机。启动激光雷达和摄像机的命令为:

roslaunchturtlebot3_bringupturtlebot3_core.launchroslaunchturtlebot3_bringupturtlebot3_lidar.launchroslaunchturtlebot3_bringupturtlebot3_rpicamera.launch

必须在TurtleBot上的终端中执行该命令。乌龟机器人使用LDS-01激光雷达构建激光扫描,发表在/扫描的话题。对于本例的其余部分,术语激光扫描参考就此主题发表的数据。

订阅主题/扫描

激光= rossubscriber (“/扫描”“DataFormat”“结构”);

等待一个激光扫描信息到达,然后显示它。

激光扫描=接收(3)
扫描=结构体字段:MessageType: 'sensor_msgs/LaserScan' Header: [1×1 struct] AngleMin: 0 AngleMax: 6.2832 AngleIncrement: 0.0175 TimeIncrement: 0 ScanTime: 0 RangeMin: 0.1200 RangeMax: 3.5000 Ranges: [360×1 single]强度:[360×1 single]
图rosPlot(扫描);

如果您看到一个错误,可能是激光扫描主题没有接收任何数据。如果您正在运行模拟,尝试重新启动Gazebo。如果您正在使用硬件,请确保正确启动激光雷达和摄像机。

运行以下代码行,绘制10秒内的实时激光扫描提要。在TurtleBot前面移动一个对象,并使其足够接近,直到它不再出现在情节窗口。由于硬件的限制,激光扫描的范围有限。LDS-01激光雷达的最小感应距离为0.12米,最大感应距离为3.5米。任何超出这些限制的物体都不会被传感器检测到。

抽搐;Toc < 10 scan = receive(laser,3);rosPlot(扫描);结束

简单的避障

根据激光扫描的距离读数,可以实现一个简单的避障算法。你可以用一个简单的循环来实现此行为。

设置处理循环中将使用的一些参数。您可以针对不同的行为修改这些值。

spinVelocity = 0.6;角速度(rad/s)forwardVelocity = 0.1;线速度(m/s)backwardVelocity = -0.02;线速度(反向)(m/s)distanceThreshold = 0.6;%转弯距离阈值m

运行一个循环来移动机器人,并计算离机器人最近的障碍物。当障碍在极限之内时distanceThreshold,机器人转过身来。这个循环在运行时间20秒后停止。CTRL+C(或Mac上的Control+C)也会停止此循环。

抽搐;toc < 20通过激光扫描收集信息扫描=接收(激光);rosPlot(扫描);data = rosReadCartesian(扫描);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.178.1:51558/关闭全局节点/matlab_global_node_05319

更多的信息

激光扫描有一个最小的范围,在这个范围内,它将不再看到挡道的物体。距离激光雷达的最小距离约为0.12米。

激光扫描不能探测到玻璃墙。以下是来自相机的图像:

下面是相应的激光扫描:

垃圾桶是看得见的,但玻璃墙是看不到的。当您在TurtleBot可能无法检测到的有窗户或墙壁的区域使用TurtleBot时,请注意激光扫描的局限性。

下一个步骤

参考下一个例子:用遥操作控制乌龟机器人