大家好,我是最近爱吃牛肉面的小鱼。今天我想分享一个来自社区的问题,关于 Gazebo 复合机器人仿真插件不能同时使用的困扰。这个问题我曾在多年前遇到过,并在社区中找到了一些解决方案,现在就来分享给大家。
背景:
在 Gazebo 中对复合机器人(移动底盘加机械臂)进行仿真,即需要能够用键盘控制底盘的移动,并且用 MoveIt 控制机械臂。系统环境:Ubuntu 16.04;ROS Kinetic;Gazebo 7.16
问题描述:
在 AGV 底盘的 xacro 文件中,配置了两轮差速的插件 <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
;在机械臂的 xacro 文件中,配置了机械臂控制的插件 <plugin name="gazebo_ros_controller" filename="libgazebo_ros_control.so">
。
当启动 Gazebo 仿真环境后,通过 rostopic list
查看话题,发现确实有 /cmd_vel
话题存在。于是尝试使用 teleop_twist_keyboard
控制底盘运动,但是却没有任何反应,而此时却可以通过 MoveIt 控制机械臂。将机械臂的插件注释掉后,底盘可以正常控制移动,由此推测是两个插件发生了冲突。
上网查阅后发现,有人在知乎上提到了相同的问题(链接:https://zhuanlan.zhihu.com/p/402596766),其中提到了插件冲突可能导致的问题。但是对于是否将两个插件放在同一 URDF 文件中的问题,作者并未明确说明。我将底盘和机械臂各自写为一个 xacro 文件,最后通过一个总的 xacro 文件来汇总两个部分。如果这种方式仍然会导致冲突,那么两个插件应该如何配置呢?
感谢阅读!如果有任何思路,请不吝赐教。
@1103445927 这个问题是我三四年前遇到的,具体解决方法我已经记不太清了。但是现在我能给你的建议是,可以考虑放弃两轮差速插件,然后在 ROS Control 中寻找适用于两轮差速控制的控制器(虽然不一定能找到,但这个思路应该是正确的)。祝好!
再更新下这个答案,为什么 ROS 2 Control 会和 Gazebo 其他插件发生冲突呢?
Gazebo 其实是一个仿真软件,他可以提供对其中关节的控制接口。但这些控制接口是独占的,也就是说,同一时间只能接收一个控制指令,否则就不知道该听谁的。ROS 2 Control 会尝试接管所有可控关节,并将其抽象为 ROS 2 Control 接口,然后由其下的控制器来使用。因此,解决这个问题最好的方法是统一使用 ROS 2 Control,利用 ROS 2 Control 下的关节轨迹跟踪控制器来控制机械臂的关节,用两轮差速控制器来控制底盘轮子的接口即可。