ROS中多机协同时,如何解决topic 相同造成的冲突问题

在ROS(Robot Operating System)中,`ROS_NAMESPACE` 是一个环境变量,用于指定节点的命名空间(namespace)。命名空间是ROS中用来隔离节点和话题名称的一种机制,可以帮助组织和管理节点之间的通信和数据流。

当一个节点启动时,可以通过设置 `ROS_NAMESPACE` 环境变量来指定该节点的命名空间。这样,节点发布的话题名称和服务名称会自动添加命名空间前缀,从而使节点在特定命名空间内运行而不会与其他节点产生冲突。

通过使用 `ROS_NAMESPACE` 环境变量,可以更好地组织和管理ROS系统中的节点和话题,避免命名冲突,并提高系统的可维护性和可扩展性。

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

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

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

<group ns="命名空间">
    <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find ares_description)/urdf/ares_laser.xacro' ns:= 命名空间" /> 
        <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> 
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
     <param name="publish_frequency" type="double" value="50.0" />
</node>
        <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
    args="-urdf -model 命名空间 -param robot_description -x 0"/>   
</group>

 ```cpp
    命名空间根据工程定义,在我的仿真中为ares1、ares2、ares3;“-x 0”为机器人在gazebo中的初始位置。
    将原本有关机器人状态的节点以及机器人模型放在<group>标签内,这样被<group>标签包围的节点、话题、参数、服务,都会在前面加入<命名空间>的前缀,如 /ares2/joint_state_publisher


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

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

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)

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

即做以下修改:

cmd_vel

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

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

$ ROS_NAMESPACE=ares1 rosrun ares_teleop ares_teleop.py

https://www.guyuehome.com/2195

sitemap