一、ROS中Parameter server机制
用于存储节点参数,以键值对的形式存储,全局共享
二、Parameter server中参数维护方式
2.1 命令行维护
2.2 launch文件进行读写
写入单个参数到参数服务器 <param>
<!--直接定义参数并赋值-->
<param name="velodyne_frame_id" type="string" value="velodyne"/>
<!--定义参数并通过arg给参数赋值-->
<arg name="velodyne_frame_id" default="velodyne"/>
<param name="velodyne_frame_id" type="string" value="$(arg velodyne_frame_id)"/>
从.yaml文件批量写入参数到参数服务器 <rosparam>
<!--从../config/params.yaml文件中加载参数 -->
<rosparam command="load" file="$(find *package_name)/config/params.yaml" />
2.3 节点源码内进行读写
C++节点中实现参数服务器的读写有两套API系统:
ros::NodeHandle
/**
* C++中分别通过ros::NodeHandle实现参数服务器中参数的读写
**/
#include "ros/ros.h"
int main(int argc, char *argv[])
{
//初始化ros节点
ros::init(argc,argv,"param_demo_node");
//创建ros节点句柄
ros::NodeHandle nh;
string node_param;
std::vector<std::string> param_names;
// 新增参数到参数服务器中
nh.setParam("param_1", 1.0);
// 读取参数
// 如果参数服务器中参数"param_2"存在, 把"param_2"的值传递给变量node_param;如果"param_2"不存在,就传递默认值"hahaha"
nh.param<std::string>("param_2",node_param,"hahaha");
// 如果参数"param_2"存在,返回true,并赋值给变量node_param;如果"param_2"不存在,返回false,不赋值
nh.getParam("param_2", node_param);
//其他功能
nh.getParamNames(param_names);
nh.hasParam("param_2");
nh.searchParam("param_2",node_param);
}
ros::param
/**
* C++中分别通过ros::param实现参数服务器中参数的读写
**/
#include "ros/ros.h"
int main(int argc, char *argv[])
{
//初始化ros节点
ros::init(argc,argv,"param_demo_node");
string node_param;
std::vector<std::string> param_names;
// 新增参数到参数服务器中
ros::param::set("param_1", 1.0);
// 读取参数
// 如果参数服务器中参数"param_2"存在, 把"param_2"的值传递给变量node_param;如果"param_2"不存在,就传递默认值"hahaha"
node_param = ros::param::param("param_2","hahaha");
// 如果参数"param_2"存在,返回true,并赋值给变量node_param;如果"param_2"不存在,返回false,不赋值
ros::param::get("param_2", node_param);
//其他功能
ros::param::getParamNames(param_names);
ros::param::has("param_2");
ros::param::search("param_2",node_param);
}
三、如何向ROS节点传递参数
3.1 通过参数服务器的方式传递
通过launch文件启动节点
<launch>
<node pkg="process_velodyne" type="velodyne_sub_pub" name="velodyne_sub_pub" output="screen" >
<param name="velodyne_frame_id" type="string" value="$(arg velodyne_frame_id)"/>
</node>
</launch>
通过rosrun启动节点,param前面加_
rosrun process_velodyne velodyne_sub_pub _velodyne_frame_id:="velodyne"
节点中读取参数
见2.3节内容
3.2 通过main()函数参数的形式传递
通过launch文件启动节点
<launch>
<node pkg="process_velodyne" type="velodyne_sub_pub" name="velodyne_sub_pub" args="arg1 arg2" output="screen"/>
</launch>
通过rosrun启动节点,参数通过空格隔开
rosrun proess_velodyne velodyne_sub_pub arg1 arg2
节点中读取参数
在节点中main()函数内,argv[0]是节点名称,argv[1], argv[2]...依次是输入的参数
Q:在使用rosrun/launch向main()函数传递参数时,-d, -r, --hz这类是什么意思?是指定名名称的参数么?
<launch>
<node name="rosplay"pkg="rosbag"type="play"args="−s 5 −r 1 −−clock −−hz=10 (find costmap_2d)/test/simple_driving_test_indexed.bag" />
</launch>