关于参数重名的处理,没有重映射实现,为了尽量的避免参数重名,都是使用为参数名添加前缀的方式,实现类似于话题名称,有全局、相对、和私有三种类型之分。
全局(参数名称直接参考ROS系统,与节点命名空间平级)
相对(参数名称参考的是节点的命名空间,与节点名称平级)
私有(参数名称参考节点名称,是节点名称的子级)
---------------------------------------------------------------------------------------------------------------------------------rosrun设置参数
$rosrun 包名 节点名称 _参数名:=参数值
1.设置参数
启动乌龟显示节点,并设置参数A=100
rosrun turtlesim turtlesim_node _A:=100
2.运行
$rosparam list查看节点信息,显示结果:
/turtlesim/A
结果显示,参数A前缀节点名称,也就是说rosrun执行设置参数参数名使用的是私有模式。
---------------------------------------------------------------------------------------------------------------------------------
launch文件设置参数
可以在node标签外,或node标签中通过param或rosparam来设置参数。在node标签外设置的参数是全局性质的,参考的是/,在node标签中设置的参数是私有性质的,参考的是/命名空间/节点名称。
1.设置参数
以para标签为例,设置参数
<!--设置参数-->
<launch>
<!--格式1:全局-->
<param name="radius" value="0.2" />
<node pkg="turtlesim" type="turtlesim_node" name="t1" ns="xxx">
<!--私有-->
<param name="radius" value="0.08" />
</node>
</launch>
---------------------------------------------------------------------------------------------------------------------------------
编码设置参数
1.C++实现
在C++中,可以使用ros::param或ros::NodeHandle来设置参数。
代码示例:
#include "ros/ros.h"
int main(int argc, char *argv[])
{
ros::init(argc,argv,"hello");
ros::NodeHandle nh;
//$rosrun rename03_param param_name __ns:=xxx
/*
使用ros::param来设置参数
*/
//1.全局
ros::param::set("/radiusA",100);
//结果:/radiusA
//2.相对
ros::param::set("radiusB",100);
//结果:/xxx/radiusB
//3.私有
ros::param::set("~radiusC",100);
//结果:/xxx/hello/radiusC
/*
使用nodeHandle设置参数
*/
//1.全局
nh.setParam("/radius_nh_A",1000);
//结果:/radius_nh_A
//2.相对
nh.setParam("radius_nh_B",1000);
//结果:/xxx/radius_nh_B
//3.私有
ros::NodeHandle nh_private("~");
// nh.setParam("~radius_nh_C",1000);
nh_private.setParam("radius_nh_C",1000);
//结果:/xxx/hello/radius_nh_C
return 0;
}