记录ros学习 ros nodehand和param参数服务

转载大佬文章

以下为链接
1:https://blog.csdn.net/i_robots/article/details/107508346
2:https://blog.csdn.net/u014695839/article/details/78348600

命名空间

全局

全局命名空间,就是默认路jin为全局的命名空间,和绝对路jin的概念相仿。定义时需要注意下面的几点。

1.node不带任何命名空间
ros::NodeHandle node;

2.此时参数路jin均为"imu_mti/imu_mti_sequence"
node.param(“imu_mti/imu_mti_sequence”, sequence, 100);
ros::param::param(“imu_mti/imu_mti_sequence”, sequence, 100);

3.此时订阅的topic为"imu"
sub =new message_filters::Subscriber<sensor_msgs::Imu>(node, “imu”, 100);

局部

局部命名空间,就是默认路jin为局部的命名空间,和相对路jin的概念相仿。定义时需要注意下面的几点。

1.node带有命名空间
ros::NodeHandle node("/myname");

2.此时参数路jin为"/myname"+“imu_mti/imu_mti_sequence”-> “/myname/imu_mti/imu_mti_sequence”
node.param(“imu_mti/imu_mti_sequence”, sequence, 100);

3.此时参数路jin为"imu_mti/imu_mti_sequence",不受node影响
ros::param::param(“imu_mti/imu_mti_sequence”, sequence, 100);

3.此时订阅的topic为"/myname"+“imu”->"/myname/imu"
sub =new message_filters::Subscriber<sensor_msgs::Imu>(node, “imu”, 100);

特别地

特别地,下面的 ~ 表示当前节点的命名空间

1.node带有命名空间"~"= 当前节点的命名空间,以节点命名,类似于"linux下面的~"
ros::NodeHandle node(“~”);

2.此时参数路jin为"~"+“imu_mti/imu_mti_sequence”-> “~/imu_mti/imu_mti_sequence”
node.param(“imu_mti/imu_mti_sequence”, sequence, 100);

3.此时参数路jin为"imu_mti/imu_mti_sequence",不受node影响
ros::param::param(“imu_mti/imu_mti_sequence”, sequence, 100);

4.此时参数路jin为"~imu_mti/imu_mti_sequence",不受node影响
ros::param::param("~imu_mti/imu_mti_sequence", sequence, 100);

5.此时订阅的topic为""+“imu”->"/imu"
sub =new message_filters::Subscriber<sensor_msgs::Imu>(node, “imu”, 100);

测试用

可以使用下面的代码获取当前node所使用的的命名空间,
ros::NodeHandle node;
ROS_INFO("%s",node.getNamespace().c_str());

不同情况下输出为

ros::NodeHandle node;
ROS_INFO("%s",node.getNamespace().c_str());// /全局命名空间

ros::NodeHandle node1("~");
ROS_INFO("%s",node1.getNamespace().c_str());// /nlink_sub节点名称作为命名空间

ros::NodeHandle node2("/myname");
ROS_INFO("%s",node2.getNamespace().c_str());// /myname自定义命名空间

对应输出为

[ INFO] [1595406961.125790392]: /
[ INFO] [1595406961.125846145]: /nlink_sub
[ INFO] [1595406961.125868992]: /myname

参数读取

首先明确,ROS下的参数服务器的参数都是有具体的路jin,如果路jin不对,是不能准确找到参数的,例如下面,在使用时,一定要确保参数目录一致,才能正确读取参数。
第一种:ros::param
三个参数,第一个表示参数路jin,第二个表示赋值变量,第三个表示默认参数值。
ros::param::paramstd::string("~port/mti_port", port_name_.mti_port, “mti”);
这里的“~”表示当前节点默认命名空间,在参数服务器上获取参数时实际的目录里为node_name/port/mti_port。
第二种:nh.param
三个参数,第一个表示参数路jin,第二个表示赋值变量,第三个表示默认参数值。
nh.paramstd::string(“port/MdVn_port”, port_name_.MdVn_port, “MdVn”);
如果定义下面的形式,
ros::NodeHandle nh(“myname”);
那么参数目录为
“myname”+“port/MdVn_port” -> “myname/port/MdVn_port”
如果定义了nh的命名空间,后面的sub以及pub都会受到影响,或者说与nh_有关的都会受到影响,例如
sub =new message_filters::Subscriber<sensor_msgs::Imu>(nh_ “imu”, 100);
实际订阅的topic为
“myname”+“imu” -> “myname/imu”

ROS参数服务

ros参数服务应用举例:

1 使用yaml文件加载参数

一般地,我们可以将需要设置的参数保存在yaml文件中,使用rosparam load [文件路径\文件名] 命令一次性将多个参数加载到参数服务器。

(yaml文件的格式和使用方法:https://www.ibm.com/developerworks/cn/xml/x-1103linrr/)

举个例子,一个名称为param.yaml的参数文件,内容为:

#There are some params which will be loaded
yaml_param_string1: abcd123
yaml_param_string2: 567efg
 
yaml_param_num1: 123.123
yaml_param_num2: 1234567
 
yaml_param_set:
  param_set_string1: zzzzz
  param_set_num1: 999
  param_set_string2: a6666
  param_set_num2: 2333
 
  param_subset:
    param_set_string1: qwer
    param_set_num1: 5432
    param_set_string2: a12s3
    param_set_num2: 1111

现在,我们要其中的参数加载到ROS的参数服务器中。两种方法

(1)终端启动

$ rosparam load param.yaml
然后,输入命令:
$ rosparam list
即可在终端看到参数被加载

(2)launch文件启动

xxx 是指yaml文件存储路径

2 launch文件加载参数

< node name=“test_example_node” pkg=“test_example” type=“test_example” output=“screen”>
< param name=“dt” value=" ( a r g d t ) " n s = " g l o b a l c o s t m a p " / < p a r a m n a m e = " d t " v a l u e = " (arg dt)" ns="global_costmap" / < param name="dt" value=" (argdt)"ns="globalcostmap"/<paramname="dt"value="(arg dt)" />
< param name=“test_x” value=“8” />

name 对应参数名称 value对应参数值 ns对应命名空间

3 代码中使用

Commands:
rosparam set set parameter 设置参数
rosparam get get parameter 获得参数值
rosparam load load parameters from file 从文件中加载参数到参数服务器
rosparam dump dump parameters to file 将参数服务器中的参数写入到文件
rosparam delete delete parameter 删除参数
rosparam list list parameter names 列出参数服务器中的参数
示例
nh.param(“test_x”, test_x, 0.0);
将参数“test_x”中的数值放入变量test_x中,如果该参数没有值将0.0赋值给变量
nh.setParam(“string_param”, “hehe”);
nh.getParam(“string_param”, s);
set和get分别是参数赋值和参数获取函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值