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,这样就可以简单地做到多机器人同时接收一致的控制指令:
vel_pub = rospy.Publisher('/cmd_vel', Twist, queue_size=1)
单独控制一个机器人
与前面相对,在这里我们将发布和接收的cmd_vel全部设置为相对名称(相对名称的典型特征是它缺少全局名称带有的前斜杠“/”),在我们设置的命名空间内发布后,ROS将当前命名空间的名称加在相对名称的前面,从而将相对名解析为全局名称。
即做以下修改:
vel_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
在终端启动键盘控制节点时加上命名空间,即可实现对单个机器人的控制:
$ ROS_NAMESPACE=ares1 rosrun ares_teleop ares_teleop.py
https://www.guyuehome.com/2195