当前位置:   article > 正文

基于ROS的多差速移动机器人编队控制仿真实现_基于ros2的多机器人编队

基于ros2的多机器人编队

目录

1、前置知识

2、ROS加载多机器人(rviz与gazebo显示)

2.1 rviz和gazebo加载机器人模型

2.2 控制单个机器人

3、编队仿真

4、开源代码

5、小结


1、前置知识

我都是跟着B站上赵虚左老师的ROS教学视频实现的单个差速移动机器人的建模与仿真,链接如下:

【赵虚左】《ROS理论与实践》第8、9章--ROS机器人操作系统_哔哩哔哩_bilibili

跟着这个课学完前八章即可完成差速移动机器人的建模。

2、ROS加载多机器人(rviz与gazebo显示)

下面介绍一下如何实现ROS的多机器人配置。

2.1 rviz和gazebo加载机器人模型

首先是在赵老师搭建的单个机器人仿真框架下,利用group为各个机器人分配一个命名空间,具体launch文件如下:

  1. <launch>
  2. <!-- 启动 gazebo -->
  3. <include file="$(find gazebo_ros)/launch/empty_world.launch">
  4. </include>
  5. <!-- 第1个机器人 -->
  6. <group ns="robot1">
  7. <!-- 将模型文件写入参数服务器 -->
  8. <param name="robot_description" command="$(find xacro)/xacro $(find mydiffcar_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro ns:=robot1" />
  9. <!-- 在 gazebo 中显示机器人模型 -->
  10. <node pkg="gazebo_ros" type="spawn_model" name="robot1" args="-urdf -model robot1 -param robot_description -x 0.5"></node>
  11. <!-- 关节以及机器人状态发布节点 -->
  12. <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
  13. <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
  14. <!-- 坐标系变换,这个是跟着赵老师敲的,用来在rviz中正常显示深度相机点云数据 -->
  15. <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /robot1_support /robot1_support_depth" />
  16. <!-- 设置一个全局坐标系map,这是rviz中显示多机器人的关键,将map坐标系作为机器人的odom坐标系的父亲,使得三个机器人能正常在rviz中显示 -->
  17. <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher1" args="0 0 0 0 0 0 /map /robot1_odom" />
  18. </group>
  19. <!-- 第2个机器人 -->
  20. <group ns="robot2">
  21. <!-- 将模型文件写入参数服务器 -->
  22. <param name="robot_description" command="$(find xacro)/xacro $(find mydiffcar_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro ns:=robot2" />
  23. <!-- 在 gazebo 中显示机器人模型 -->
  24. <node pkg="gazebo_ros" type="spawn_model" name="robot2" args="-urdf -model robot2 -param robot_description -x 1"></node>
  25. <!-- 关节以及机器人状态发布节点 -->
  26. <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
  27. <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
  28. <!-- 坐标系变换 -->
  29. <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /robot2_support /robot2_support_depth" />
  30. <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher1" args="0 0 0 0 0 0 /map /robot2_odom" />
  31. </group>
  32. <!-- 第3个机器人 -->
  33. <group ns="robot3">
  34. <!-- 将模型文件写入参数服务器 -->
  35. <param name="robot_description" command="$(find xacro)/xacro $(find mydiffcar_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro ns:=robot3" />
  36. <!-- 在 gazebo 中显示机器人模型 -->
  37. <node pkg="gazebo_ros" type="spawn_model" name="robot3" args="-urdf -model robot3 -param robot_description -x 1.5"></node>
  38. <!-- 关节以及机器人状态发布节点 -->
  39. <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
  40. <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
  41. <!-- 坐标系变换 -->
  42. <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /robot3_support /robot3_support_depth" />
  43. <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher1" args="0 0 0 0 0 0 /map /robot3_odom" />
  44. </group>
  45. <!-- 启动 rviz -->
  46. <node pkg="rviz" type="rviz" name="rviz" args="-d $(find mydiffcar_gazebo)/config/multi_diffcar.rviz" />
  47. <!-- <node pkg="rviz" type="rviz" name="rviz" /> -->
  48. </launch>

重点:这个其实也是我参考了很多博客写的,里面有一段代码很多人没有提及,导致走了很多弯路,具体如下:

  1. <!-- 设置一个全局坐标系map,这是rviz中显示多机器人的关键,将map坐标系作为机器人的odom坐标系的父亲,使得三个机器人能正常在rviz中显示 -->
  2. <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher1" args="0 0 0 0 0 0 /map /robot1_odom" />
  3. </group>

这个每个group里面都设置的有,其目的就是创建一个根坐标系,将三个机器人的odom坐标系,都纳入其中,作为其子坐标系,这样才能在rviz中完整显示三个移动机器人。

2.2 控制单个机器人

还有一个比较重要的就是,在赵老师写的ROS仿真框架下,无论怎么改代码,都只有一个/cmd_vel话题,意味着就只能通过这个话题控制全部的机器人,最后发现,需要修改my_move.urdf.xacro文件中的差速驱动插件部分代码,需要将<robotNamespace>${ns}</robotNamespace>加上命名空间,ns是通过2.1中的launch文件设置的,<param name="robot_description" command="$(find xacro)/xacro $(find mydiffcar_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro ns:=robot1" />,还有一种改法更简单,就是<robotNamespace></robotNamespace>,没错,就是啥也不加,下面是我更改后的代码:

  1. <gazebo>
  2. <!-- 差分小车控制插件 -->
  3. <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
  4. <rosDebugLevel>Debug</rosDebugLevel>
  5. <publishWheelTF>true</publishWheelTF>
  6. <robotNamespace>${ns}</robotNamespace>
  7. <publishTf>1</publishTf>
  8. <publishWheelJointState>true</publishWheelJointState>
  9. <alwaysOn>true</alwaysOn>
  10. <updateRate>100.0</updateRate>
  11. <legacyMode>true</legacyMode>
  12. <leftJoint>${ns}_left_wheel2base_link</leftJoint> <!-- 左轮 -->
  13. <rightJoint>${ns}_right_wheel2base_link</rightJoint> <!-- 右轮 -->
  14. <wheelSeparation>${base_link_radius * 2}</wheelSeparation> <!-- 车轮间距 -->
  15. <wheelDiameter>${wheel_radius * 2}</wheelDiameter> <!-- 车轮直径 -->
  16. <broadcastTF>1</broadcastTF>
  17. <wheelTorque>30</wheelTorque>
  18. <wheelAcceleration>1.8</wheelAcceleration>
  19. <commandTopic>cmd_vel</commandTopic> <!-- 运动控制话题 -->
  20. <odometryFrame>${ns}_odom</odometryFrame>
  21. <odometryTopic>odom</odometryTopic> <!-- 里程计话题 -->
  22. <robotBaseFrame>${ns}_base_footprint</robotBaseFrame> <!-- 根坐标系 -->
  23. </gazebo>

注:在赵老师原有的写法中是<robotNamespace>/</robotNamespace>,加了/意味着cmd_vel和odom为全局的,这样即使加了group也不会有ns属性。

3、编队仿真

上面配置完以后就可以显示多机器人,并且可以单独控制机器人了,运行launch文件后rviz中显示如下:

 gazebo中显示如下:

rostopic list显示如下:

可以看出cmd_vel 和odom话题都加上了相应的命名空间属性。

4、开源代码

为方便大家学习,代码开源链接如下:
https://github.com/quyinsong/multi_diffcar_ws.git
# 1 拷贝源码与编译  
git clone https://github.com/quyinsong/multi_diffcar_ws.git  
cd multi_diffcar_ws  
catkin_make  
source devel/setup.bash  

# 2 运行代码  
运行多机器人仿真环境(gazebo与rviz):roslaunch mydiffcar_gazebo multi_diffcar_gazebo.launch  
运行编队控制器:roslaunch nmpc_ctr test_formation.launch  

# 3 rviz为领航车发布2D nav goal 

5、小结

其实我的代码改的复杂了,主要是之前不知道怎么修改,概括出来的三个步骤就是:

(1)launch文件中利用group为机器人分组----避免重名

(2)在每个group中完成odom到map的坐标变换---便于rviz显示多机器人

(3)修改机器人控制插件,使其发布的cmd_vel话题不具备全局属性,即去掉话题前面的 / ----便于单个控制机器人

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/939552
推荐阅读
  

闽ICP备14008679号