主要内容

探索TurtleBot的基本行为

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

先决条件:与TurtleBot交流

连接到TurtleBot

确保你有一个TurtleBot运行在模拟通过Gazebo®或真正的硬件。指开始凉亭和模拟乌龟机器人开始一个真正的乌龟机器人用于启动过程。本例使用gazebo模拟的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的终端上执行该命令。TurtleBot使用LDS-01激光雷达来构建激光扫描,并将其发布在/扫描的话题。对于这个例子的剩余部分,项激光扫描参考关于此主题发表的数据。

订阅主题/扫描

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

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

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

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

运行以下几行代码,绘制实时激光扫描馈送10秒。移动一个物体到TurtleBot的前面,并把它足够近,直到它不再显示在绘图窗口中。由于硬件的限制,激光扫描的范围有限。LDS-01激光雷达具有0.12米的最小探测距离和3.5米的最大探测距离。超出这些限制的任何物体都不会被传感器检测到。

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

简单避障

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

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

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

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

抽搐;Toc < 20激光扫描收集信息扫描=接收(激光);rosPlot(扫描);数据= rosReadCartesian(扫描);X = data(:,1);Y = data(:,2);计算最近障碍物的距离Dist =√(x。²+ y.²);minDist = min(dist);命令机器人动作如果minDist < distanceThreshold%如果靠近障碍物,稍微后退并旋转velmsg.Angular.Z = spinVelocity;velmsg.Linear.X = backwardVelocity;其他的%继续前进路径velmsg.Linear.X =前进速度;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可能无法检测到,请注意激光扫描的局限性。

下一个步骤

参考下一个例子:远程操作控制TurtleBot