1.概念:在ROS的网络拓扑中,是不可以出现重名的节点的,因为假设可以重名存在,那么调用时会产生混淆,这也就意味着,不可以启动重名节点或者同一个节点启动多次,的确,在ROS中如果启动重名节点的话,之前已经存在的节点会被直接关闭。
2.在ROS中给出的解决策略是使用命名空间或名称重映射。一般有三种方法,rosrun 命令;launch 文件;编码实现。
2.1rosrun 命令:
(1)rosrun设置命名空间:语法: rosrun 包名 节点名 __ns:=新名称,如:
rosrun turtlesim turtlesim_node __ns:=/xxx
rosrun turtlesim turtlesim_node __ns:=/yyy
//__ns 这里前面是两个—
(2)rosrun名称重映射:语法: rosrun 包名 节点名 __name:=新名称,如:
rosrun turtlesim turtlesim_node __name:=t1 | rosrun turtlesim turtlesim_node /turtlesim:=t1(不适用于python)
rosrun turtlesim turtlesim_node __name:=t2 | rosrun turtlesim turtlesim_node /turtlesim:=t2(不适用于python)
//这里的__ 也是一样的两个_ 后面不再赘述
(3)rosrun命名空间与名称重映射叠加:rosrun 包名 节点名 __ns:=新名称 __name:=新名称,如:
rosrun turtlesim turtlesim_node __ns:=/xxx __name:=tn
2.2launch 文件:
介绍 launch 文件的使用语法时,在 node 标签中有两个属性: name 和 ns,二者分别是用于实现名称重映射与命名空间设置的。使用launch文件设置命名空间与名称重映射也比较简单。跟上面的命令实现差不多。
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="t1" />
<node pkg="turtlesim" type="turtlesim_node" name="t2" />
<node pkg="turtlesim" type="turtlesim_node" name="t1" ns="hello"/>
</launch>
2.3编码实现,及写代码的时候实现(c++):
核心代码:ros::init(argc,argv,"zhangsan",ros::init_options::AnonymousName);当修改AnonymousName参数,
会在名称后面添加时间戳。