ros2-humble加载多体机器人时遇到的gazebo_ros2_control,namespace加载问题
-
ros2多机contorller namespace挂载错误问题
背景:
我在尝试使用fishbot based的机器人仿真框架进行多机navigation实例操作,当我单独加载任意机器人模型时,都能够正常启动,启动部分log如下:
从图中可以看出<robot_namespace>_diff_drive_controller和<robot_namespace>_joint_state_broadcaster都已经被正常发布,同时service和topic也都正常启动,机器人可以通过teleop_twist_keyboard命令正常运行。问题描述:
当我在用一个gazebo仿真环境中加载成功第一个机器人后,我希望继续加载第二个机器人,这时,在启动机器人模型的过程中,load controller出现了问题,如下图红框所示:
我启动了namespace为scout_mini_1_的机器人节点,但是从图中可以看出,gazebo_ros2_control仍然试图从scout_mini_0_的namespace中进行控制器搜索,从而导致无法正确加载控制器配置文件,导致两个控制器服务器都发布失败。
###测试与尝试
我也尝试过使用统一namespace下的controller manager,通过定义不同名称的diff_drive_control来实现控制,但是在launch文件中由于加载机器人节点时也需要明确其namespace,导致controller manager实际上也会与namespace挂钩,从而加载失败,我的机器人加载代码如下:scout_mini_node = Node( package='gazebo_ros', executable='spawn_entity.py', name=robot_ns, namespace=robot_ns, arguments=[ '-topic', ['/', robot_ns, '/robot_description'], '-entity', [robot_ns, 'robot'], '-robot_namespace', robot_ns, '-x', init_x, '-y', init_y, '-Y', init_yaw ], )
我的gazebo控制插件代码如下:
<gazebo> <plugin filename="libgazebo_ros2_control.so" name="${robot_namespace}gazebo_ros2_control"> <parameters>$(find scout_mini_description)/config/${robot_namespace}.yaml</parameters> <ros> <namespace>${robot_namespace}</namespace> </ros> </plugin> </gazebo>
此外,也尝试过手动启动服务,也无法成功运行,但是无论是否正确启动,controller相关的service都能够正常启动。个人推测是gazebo ros2 control插件默认会启动在第一个namespace下,但是不知道如何规避这个问题