关于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写为一致,这样就简单省事多了。但是探索还是要有的,不能被蒙蔽了眼睛