ROS与Matlab语言入门教程-探索TurtleBot的基本行为
本例程帮助用户使用TurtleBot探索基本的自主性。描述的行为驱动机器人前进并在碰到障碍物的时候转弯。用户将会订阅激光扫描话题和发布速度话题以控制TurtleBot。
预备知识:4.3 TurtleBot的通信。
连接到TurtleBot
确保用户用一个运行中的TurtleBot,不管是通过Gazebo仿真的还是真实硬件都可以。有关启动过程请参考4.2 开始使用Gazebo和仿真的TurtleBot或4.1 开始使用实际的TurtleBot。任何Gazebo中的环境都能够工作,但是,“Gazebo TurtleBot World”与本例程的目的最合适。
在MATLAB中初始化ROS,注意使用TurtleBot的IP地址替换如下的示例IP地址(192.168.1.1)以连接到TurtleBot。
ipaddress = '192.168.1.1'
rosinit(ipaddress)
为机器人的速度创建一个发布器,并为话题创建消息。
robot = rospublisher('/mobile_base/commands/velocity');
velmsg = rosmessage(robot);
接收扫描数据
如果用户使用实际的TurtleBot硬件,确保启动了Kinect相机,命令是“roslaunch turtlebot_bringup 3dsensor.launch”,用户必须在TurtleBot上的终端执行该指令。TurtleBot使用Kinect的数据模拟激光扫描,发布到“/scan”话题。本例程中的提醒,激光扫描数据(laser scan)指的是发布到“/scan”话题的数据。
订阅“scan”话题。
laser = rossubscriber('/scan');
等待激光扫描的数据的到来并显示。
scan = receive(laser,3)
plot(scan);
如果用户看到错误,说明是激光扫描的话题还没有收到数据。如果用户使用仿真的TurtleBot,尝试重启Gazebo,如果使用真实的TurtleBot,确保正确地启动了Kinect相机。
在Gazebo中,扫描的结果类似下图。
运行如下代码,实时的绘制加载20秒的激光扫描的数据。在TurtleBot前方移动物体,不断靠近直到在绘图窗口上看不到。由于Kinect相机硬件上的限制,激光扫描范围也有限制。Kinect的测量范围是0.8~4m,不能检测到在这范围之外的任何物体。
tic;
while toc < 20
scan = receive(laser,3);
plot(scan);
end
简单壁障
基于激光扫描读取的距离数据,用户可以实现简单的壁障算法,可以通过“while”循环实现壁障。
设置在循环处理中需要的若干参数,用户可以修改参数实现不同的表现行为。
spinVelocity = 0.6; % Angular velocity (rad/s)
forwardVelocity = 0.1; % Linear velocity (m/s)
backwardVelocity = -0.02; % Linear velocity (reverse) (m/s)
distanceThreshold = 0.6; % Distance threshold (m) for turning
运行循环让机器人前进并计算距离机器人最近的障碍物。当障碍物在“distanceThreshold”的范围内,机器人则转弯。在运行20秒之后循环将会停止,CTRL+C(Mac上Control+C)也会停止循环。
tic;
while toc < 20
% Collect information from laser scan
scan = receive(laser);
plot(scan);
data = readCartesian(scan);
x = data(:,1);
y = data(:,2);
% Compute distance of the closest obstacle
dist = sqrt(x.^2 + y.^2);
minDist = min(dist);
% Command robot action
if minDist < distanceThreshold
% If close to obstacle, back up slightly and spin
velmsg.Angular.Z = spinVelocity;
velmsg.Linear.X = backwardVelocity;
else
% Continue on forward path
velmsg.Linear.X = forwardVelocity;
velmsg.Angular.Z = 0;
end
send(robot,velmsg);
end
断开与机器人的连接
当用户完成工作后,清楚工作空间中的发布器、订阅器和其它有关ROS的对象是个良好的习惯。
clear
建议当完成ROS网络有关的工作之后,使用“rosshutdown”指令关闭全局节点和断开与Gazebo的连接。
rosshutdown
更多消息
激光扫描有最小测量范围限制,小于该范围的将不能看到任何物体。Kinect相机的最小范围大概0.5m。
激光扫描不能检测玻璃墙,Kinect相机的图像如下所示。
下图是相应的激光扫描。
垃圾桶可以看到,但是用户不能看到玻璃墙。当用户使用TurtleBot在有窗户或者墙壁的环境中,TurtleBot可能无法检测到,要注意激光扫描的这种缺陷。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号