ROS通信之参数服务器
参数服务器(参数共享模式)是ROS 中的基本通信机制
1 参数服务器
参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。类似于全局变量。
1.1 理论模型
- ROS Master (管理者)
- Talker (参数设置者)
- Listener (参数调用者)
ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。
1.2 参数操作(增删改查)
1.2.1 新增与修改
#include "ros/ros.h"
int main(int argc, char *argv[])
{
ros::init(argc,argv,"talker");
ros::NodeHandle nh;
// 参数增(设置键值对)
// 方1:nh
nh.setParam("type","phd"); //参数:键值对
nh.setParam("age",25);
// 方2:param
ros::param::set("type_param","phd");
ros::param::set("age_param",25);
// 参数改--实际上就是修改键对应的值
nh.setParam("age",25);
ros::param::set("age_param",25);
return 0;
}
1.2.2 查
参数服务器操作之查询_C++实现: 在 roscpp 中提供了两套 API 实现参数操作
ros::NodeHandle
param(键,默认值)
存在,返回对应结果,否则返回默认值
getParam(键,存储结果的变量)
存在,返回 true,且将值赋值给参数2
如果·键不存在,那么返回值为 false,且不为参数2赋值
---------------------------------------------------------------------------------------
关于上面两种方法区别,getParam():Get an value from the parameter server. If you want to provide a default value in case the key does not exist use param().就是说,如果只是想获取一个参数,不设置默认值,可以使用getParam(),如果想在参数服务器没有提供这个参数值的时候使用默认值,请使用param()
ros::NodeHandle nh;
nh.param<int>("grid_row", processor_config.grid_row, 4);
nh.getParam("cam0/resolution", cam0_resolution_temp);
--------------------------------------------------------------------------------------
getParamCached(键,存储结果的变量)--提高变量获取效率
存在,返回 true,且将值赋值给参数2
若果键不存在,那么返回值为 false,且不为参数2赋值
getParamNames(std::vector<std::string>)
获取所有的键,并存储在参数 vector 中
hasParam(键)
是否包含某个键,存在返回 true,否则返回 false
searchParam(参数1,参数2)
搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
ros::param ----- 与 NodeHandle 类似
- 源程序
#include "ros/ros.h"
using namespace std;
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"get_param");
ros::NodeHandle nh;
// 1.param
int get_age = nh.param("age",30); // 把键age的值给get_age,如果没有键没有对应的值,就令值为30
ROS_INFO("age = %d",get_age);
ros::param::param("age",30);
ROS_INFO("age = %d",get_age);
// 2.getParam
int getParam_age;
bool result = nh.getParam("age",getParam_age);
if(result)
{
ROS_INFO("age = %d",getParam_age);
}
else
{
ROS_INFO("don't find parameter");
}
// 3.getParamCached 与 getParam相似,性能提升
int getParamCache_age;
bool result1 = nh.getParamCached("age",getParamCache_age);
if(result1)
{
ROS_INFO("age = %d",getParamCache_age);
}
else
{
ROS_INFO("don't find parameter");
}
bool result2 = ros::param::getCached("age",getParamCache_age);
if(result2)
{
ROS_INFO("age = %d",getParamCache_age);
}
else
{
ROS_INFO("don't find parameter");
}
// 4. getParamNames(std::vector<std::string>)
vector<std::string> names;
nh.getParamNames(names);
for(auto &k:names)
{
ROS_INFO("遍历的键:%s",k.c_str());
}
ros::param::getParamNames(names);
for(auto &k:names)
{
ROS_INFO("遍历的键:%s",k.c_str());
}
// 5. hasParam(键)
bool a = nh.hasParam("type");
ROS_INFO("Pair is %d exit",a);
bool n = ros::param::has("type");
ROS_INFO("Pair is %d exit",n);
// 6. searchParam(参数1,参数2)
string key;
nh.searchParam("type",key);
ROS_INFO("search result:%s",key);
ros::param::search("type",key);
ROS_INFO("search result:%s",key);
return 0;
}
3.2.3 删
- 方法
参数服务器操作之删除_C++实现:
ros::NodeHandle
deleteParam("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
ros::param
del("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
- 源程序
#include "ros/ros.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"del");
ros::NodeHandle nh;
bool r1 = nh.deleteParam("age");
ROS_INFO("nh 删除结果:%d",r1);
bool r2 = ros::param::del("age_param");
ROS_INFO("param 删除结果:%d",r2);
return 0;
}
2 关于launch文件中参数
以MSCKF
中image_processor_euroc.launch
为例
<launch>
<!-- 动态参数 -->
<arg name="robot" default="firefly_sbx"/>
<arg name="calibration_file" default="$(find msckf_vio)/config/camchain-imucam-euroc.yaml"/>
<!-- Image Processor Nodelet -->
<group ns="$(arg robot)">
<node pkg="nodelet" type="nodelet" name="image_processor"
args="standalone msckf_vio/ImageProcessorNodelet"
output="screen">
<!-- 从配置文件加载参数,存入参数服务器 -->
<rosparam command="load" file="$(arg calibration_file)"/>
<!-- 在参数服务器上设置参数 -->
<param name="grid_row" value="4"/>
<param name="grid_col" value="5"/>
<param name="grid_min_feature_num" value="3"/>
<param name="grid_max_feature_num" value="4"/>
<param name="pyramid_levels" value="3"/>
<param name="patch_size" value="15"/>
<param name="fast_threshold" value="10"/>
<param name="max_iteration" value="30"/>
<param name="track_precision" value="0.01"/>
<param name="ransac_threshold" value="3"/>
<param name="stereo_threshold" value="5"/>
<remap from="~imu" to="/imu0"/>
<remap from="~cam0_image" to="/cam0/image_raw"/>
<remap from="~cam1_image" to="/cam1/image_raw"/>
</node>
</group>
</launch>