【友情分享】如何在Gazebo中实现多机器人仿真?

gazebo是一款功能强大的三维物理仿真平台,具备强大的物理引擎、高质量的图形渲染、方便的编程与图形接口,最重要的是其开源免费的特性。gazebo中的机器人模型与rviz使用的模型相同,但是需要在模型中加入机器人和周围环境的物理属性,例如质量、摩擦系数、弹性系数等。机器人的传感器信息也可以通过插件的形式加入仿真环境,以可视化的方式进行显示。

在ros学习及研发过程中,经常需要使用gazebo来进行3D仿真,对模型的各种物理参数、控制代码等进行实物前的操练。在多智能体协同控制的研究中,需要在gazebo中添加多个机器人用于仿真,那么,应该如何将一个乃至多个机器人,放入gazebo仿真环境中呢?

单机器人仿真

在gazebo中放入机器人的操作通常用launch文件实现,步骤可归纳为:

设置launch文件参数-运行gazebo仿真环境-加载机器人模型描述参数-加载机器人模型

其中有关于urdf模型的构建可以参考古月学院的课程《一起从零手写URDF模型》(点击阅读原文查看此课程)和前面小伙伴的文章《一文读懂URDF物理参数解释及生成》。

在我的仿真任务中代码如下:




   
   
   
   
   
   
   


   
   
       
       
       
       
       
       
   


   
   


   
   


   
   
       
   


   
   



【友情分享】如何在Gazebo中实现多机器人仿真?_第1张图片

多机器人仿真

相比于单机器人,多机器人仿真需要在原基础上加入标签,做到用同样的descripion配置文件加载多个独立的机器人。

具有ns属性,可以将节点组推送到单独的命名空间中。

在前面的基础上,在launch文件中改写成以下内容:


   
     
  
    

        

命名空间根据工程定义,在我的仿真中为ares1、ares2、ares3;“-x 0”为机器人在gazebo中的初始位置。

将原本有关机器人状态的节点以及机器人模型放在标签内,这样被标签包围的节点,话题,参数,服务,都会在前面加入<命名空间>的前缀,如 /ares2/joint_state_publisher

【友情分享】如何在Gazebo中实现多机器人仿真?_第2张图片

(在命名空间为ares2下的节点、话题等)

这样便可以加入独立的多个机器人模型,效果如下:

【友情分享】如何在Gazebo中实现多机器人仿真?_第3张图片

(多机器人仿真效果)

及命名空间使用正确时,机器人的输入输出都应独立,如下图中三车搭载的摄像头所看的图像正确,无相互影响:

【友情分享】如何在Gazebo中实现多机器人仿真?_第4张图片

【友情分享】如何在Gazebo中实现多机器人仿真?_第5张图片

【友情分享】如何在Gazebo中实现多机器人仿真?_第6张图片

(ares1、ares2、ares3视角图像)

多机器人运动控制

在加入多个机器人后,想再做一下键盘对其的简单控制。

1)同时控制多个机器人

这里我使用的方法,是在机器人配置文件控制驱动插件代码中设置全局名称/cmd_vel



/cmd_vel
/odom
odom  wheel_lf_joint
wheel_rf_joint
wheel_lb_joint
wheel_rb_joint
20.0
base_link


然后在键盘控制节点中发布全局名称/cmd_vel,这样就可以简单地做到多机器人同时接收一致的控制指令:

vel_pub = rospy.Publisher('/cmd_vel',  Twist,   queue_size=1)

【友情分享】如何在Gazebo中实现多机器人仿真?_第7张图片

(整体控制时的rqt_graph)

【友情分享】如何在Gazebo中实现多机器人仿真?_第8张图片

(整体控制时的效果)

2)单独控制一个机器人

与前面相对,在这里我们将发布和接收的cmd_vel全部设置为相对名称(相对名称的典型特征是它缺少全局名称带有的前斜杠“/”),在我们设置的命名空间内发布后,ROS将当前命名空间的名称加在相对名称的前面,从而将相对名解析为全局名称。

即做以下修改:

cmd_vel
vel_pub = rospy.Publisher('cmd_vel',  Twist,   queue_size=1)

在终端启动键盘控制节点时加上命名空间,即可实现对单个机器人的控制:

$ ROS_NAMESPACE=ares1 rosrun ares_teleop ares_teleop.py

【友情分享】如何在Gazebo中实现多机器人仿真?_第9张图片
(单独控制时的rqt_graph)

【友情分享】如何在Gazebo中实现多机器人仿真?_第10张图片

【友情分享】如何在Gazebo中实现多机器人仿真?_第11张图片

(单独控制时的效果)

在命名空间下,还有经常使用的重映射操作,这里就不再赘述,感兴趣的小伙伴可以参考古月君的文章《ROS探索总结(五十六)—— launch文件》。

在gazebo中加载多机器人仅仅是多智能体协同控制研究的第一步,之后还有大量的研究要做,我写的也只是个人总结 ,一定有很多不足之处,欢迎大家一起留言讨论,引用古月君的话作为总结,“怕什么真理无穷,进一寸有一寸的欢喜”,共勉!

完整代码


   
   
   
   
   
   
   


   
   
       
       
       
       
       
       
   


   


     


     
     


     
  
       




     
     
 



     


     
     


     
  
       

     
     



     
     
     
     
  
       

     
     



你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!

RT-Thread


让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。

长按二维码,关注我们

点击下方“阅读全文”查看课程《一起从零手写URDF模型》

你可能感兴趣的:(【友情分享】如何在Gazebo中实现多机器人仿真?)