问题的提出

ROS通过node的名字进行通信,当运行两个名字相同的node时,第二个node会无视用户权限,将原先的node杀死。当多个用户使用同一台机器调试ROS时,这个现象会造成很大的问题。

分析

ROS node间的p2p通信是通过master建立的。一个master下无法注册两个相同名字的node,因此会出现重名node被杀死的情况。
ROS master运行时,会在某个端口上建立一个名称服务,例如默认端口为11311。当node建立时,会通过环境变量ROS_MASTER_URI,将自己的名字注册到对应的master。ROS_MASTER_URI的默认值为http://localhost:11311,即对应了默认的master。
因此只需要在不同的端口上开启多个master,再分别设置环境变量,就可以建立相互隔离的ROS环境了。

解决方式

可以通过 -p port命令行参数制定ros master的端口
terminal 1:

# 创建默认的ros master
roscore
# 运行一个节点
rosrun my_package my_node

terminal 2:

# 创建另一个ros master
roscore -p 23333
# 查看环境变量
echo $ROS_MASTER_URI
# http://localhost:11311
# 当前仍然指向默认的master,将环境变量修改至新的master
export ROS_MASTER_URI=http://localhost:23333
# 现在就能安全的运行新的节点
rosrun my_package my_node