主要内容

探索TurtleBot的基本行为

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

先决条件:与TurtleBot沟通

连接TurtleBot

确保您有一个TurtleBot运行在模拟通过Gazebo®或在真正的硬件上。指从Gazebo和simulation TurtleBot入手从一个真正的TurtleBot开始用于启动程序。本例使用gazebo模拟的Turtlebot。

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

初始化ROS。通过替换连接到TurtleBotipaddressTurtleBot的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激光雷达构建激光扫描,并发布在/扫描的话题。对于本例的其余部分,术语激光扫描参考本课题发表的数据。

订阅主题/扫描

激光= 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(扫描);结束

简单的避障

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

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

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时,要注意激光扫描的局限性。

下一个步骤

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

Baidu
map