ROS与Matlab语言入门教程-在仿真中测试机器人的自主性
本例程探索Gazebo仿真器的MATLAB控制。
在仿真应用领域,在仿真运行期间测试算法的自主性和动态更改世界环境是非常重要的。本例程演示如何使用Gazebo创建基本的机器人自主性和如何交互,本例程的机器人是TurtleBot平台。有关TurtleBot细节的例程参考:4.3TurtleBot的通信。
本例程中,用户将使用“timer”控制TurtleBot的自主移动。定时器允许在后台以规律的时间间隔执行处理,而不必阻断MATLAB命令行的执行。当用户使用循环或者其它方法检测基本的自主性,定时器的预定执行和不阻断特定让定时器成为获得自主行为的最佳选择。
预备知识:"4.2开始使用Gazebo和仿真TurtleBot","5.1从Gazebo读取模型和仿真性能","5.2在Gazebo中增加、建立和移除对象","5.4在Gazebo中应用力和力矩"。
连接到Gazebo
在用户的Linux机器启动Gazebo,如果用户使用"4.2开始使用Gazebo和仿真TurtleBot"中的虚拟机,则使用“Gazebo Empty world”。
初始化ROS,需要用虚拟机的IP地址替换示例IP地址(192.168.1.1),创建“ExampleHelperGazeboCommunicator”类的实体。
ipaddress = '192.168.1.1'
rosinit(ipaddress)
gazebo = ExampleHelperGazeboCommunicator();
在界面中创建一堵墙。
wall = ExampleHelperGazeboModel('grey_wall','gazeboDB');
spawnModel(gazebo,wall,[-2 4 0]);
Gazebo中所有单位都是SI约定。
为移动机器人基创建一个“ExampleHelperGazeboSpawnedModel”对象,并更改方向。手动旋转TurtleBot90°(pi/2),使得它直接面向墙。
kobuki = ExampleHelperGazeboSpawnedModel('mobile_base',gazebo)
setState(kobuki,'orientation',[0 0 pi/2]);
启动TurtleBot壁障
本小节描述一个简单的方法在Gazebo中的TurtleBot创建自主行为,使TurtleBot实现基本的壁障行为。壁障行为是驱动机器人前进并通过激光扫描仪检测非常接近障碍物时转弯。
为发布器和订阅器创建全局变量,使得它们能够被控制算法应用。
global robot
global velmsg
创建速度发布器和携带信息的ROS消息。
robot = rospublisher('/mobile_base/commands/velocity')
velmsg = rosmessage(robot)
发布器的输出类似如下所示。
robot =
Publisher with properties:
TopicName: '/mobile_base/commands/velocity'
IsLatching: 1
NumSubscribers: 0
MessageType: 'geometry_msgs/Twist'
velmsg =
ROS Twist message with properties:
MessageType: 'geometry_msgs/Twist'
Linear: [1x1 Vector3]
Angular: [1x1 Vector3]
Use showdetails to show the contents of the message
订阅激光扫描话题。
timerHandles.sub = rossubscriber('/scan')
创建定时器控制TurtleBot的主要控制环。
t = timer('TimerFcn',{@exampleHelperGazeboAvoidanceTimer,timerHandles},'Period',0.1,'ExecutionMode','fixedSpacing');
在定时器的回调函数中,“exampleHelperGazeboAvoidanceTimer”定义了激光扫描回调函数并执行基本的算法允许TurtleBot在运动过程中避免碰撞。文件位于+Gazebo路径。
启动定时器的命令如下所示。
start(t);
增加对象
TurtleBot向墙壁移动,一旦距离墙壁非常近,它必须向左转弯避免冲撞墙壁。
注意,如果TurtleBot撞上墙壁,激光扫描仪可能没有通过Gazebo发布,重启Gazebo并重试。
在TurtleBot移动过程中,用户仍然可以更改环境,增加一堵墙到环境中,如果用户增加足够迅速,墙可能阻挡住TurtleBot,使得避免撞上墙。
spawnModel(gazebo,wall,[-5.85 0.15 0],[0, 0, pi/2]);
用户可以看到的界面如下图所示。
移除模型和关闭
停止定时器以停止机器人算法。
stop(t)
查找环境中所有对象,并移除手动添加的对象。
list = getSpawnedModels(gazebo)
list =
'ground_plane'
'mobile_base'
'grey_wall'
'grey_wall_0'
使用如下的命令移除两堵墙。
removeModel(gazebo,'grey_wall');
removeModel(gazebo,'grey_wall_0');
当用户完成工作后,清楚工作空间中的发布器、订阅器和其它有关ROS的对象是个良好的习惯。
clear
建议当完成ROS网络有关的工作之后,使用“rosshutdown”指令关闭全局节点和断开与Gazebo的连接。
rosshutdown
当用户已经完成操作,在虚拟机上关闭Gazebo窗口。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号