关于ros node 中的namespace

在ros node中必然用到nodehandle,namespace也肯定会用到,一直都是用的固定模式,没看到这么多,其实是被保护得太好了。

如无指定namespace,常用~代替当前namespace,但这个“当前”到底是由哪里决定的,下面就实践经验,描述一下:

1-当用launch文件启动时,node里面的name属性替代了~,也就是说

1  ros::NodeHandle private_nh("~");
2  private_nh.param("lidar_frame", mLidarFrame, std::string("scan_head"));

假设launch文件如下

1 <launch>
2   <rosparam file="$(env HOME)/params.yaml" command="load" ns="AAA" />
3   <node pkg="ros_node" type="ros_node" name="ros_node" output="screen"/>
4 </launch>

如果想要通过配置文件加载上述参数,那么代码里读取参数的路径为 ros_node/lidar_frame

而launch文件中,ns=“AAA”意思是参数要从"AAA/params.yaml"处加载,即参数写入了AAA/lidar_frame中

由此出现了不一致的情况,导致参数加载失败。

如果没有launch文件,则以下面代码中初始化中的bbb代替“~”,launch文件里node一栏的name属性优先级要高于代码中init语句中定位的name

1 ros::init(argc, argv, "bbb");

比较方便的写法是将三处namespace写为一致,这样就简单省事多了。但是探索还是要有的,不能被蒙蔽了眼睛

原文地址:https://www.cnblogs.com/lqc-blog/p/14389162.html