摘自:https://blog.csdn.net/qq_35358125/article/details/107023972
ROS-节点参数param
嵌入式小白woods 2020-06-29 17:03:32 275 收藏 5
版权
简介
ROS中提供了的参数服务器机制,用户可以将参数以yaml文件格式保存在本地,程序运行(运行launch文件)时动态载入,修改参数并不需要重新编译。而且,ROS中更为人性化的一点就是支持程序运行时动态修改参数,实时的观测参数对运行结果的影响,极大地方便了参数调试。
载入参数
Ros通过launch文件载入参数,载入完成后可以通过rosparam list在命令行中查看。
1.通过param标签载入参数:
该方法适用于少量参数的载入,格式为:
<param name="parameter_name" type="double" value="10.0" />
- 1
2.通过rosparam标签导入.yam文件载入参数:
该方法适用于大量载入参数,格式为:
<rosparam command="load" file="$(find examle_pkg)/example.yaml" />
- 1
重新运行launch文件,参数就会更新。私有参数放在节点中。
ROS中有如下3种获取参数的方式,2中设置参数的方式
include "ros/ros.h"
#include <cstdlib>
using namespace std;
int main(int argc,char** argv)
{
//initial and name node
ros::init(argc,argv,"node_param");
if(argc!=2)
{
cout<<"Error command paramter! Please run command eg:\n"\
<<"rosrun book_param book_param 1\n"\
<<"help information:\n"\
<<" 1 ------ set param mode(ros::param::set())\n"\
<<" 2 ------ set param mode(ros::NodeHandle::setParam())\n"\
<<" 3 ------ get param mode(ros::param::get())\n"\
<<" 4 ------ get param mode(ros::NodeHandle::getParam())\n"\
<<" 5 ------ get param mode(ros::NodeHandle::param())\n"\
<<endl;
return 1;
}
//create node handle
ros::NodeHandle nh;
//param variable
int IntParam;
string StrParam;
bool isIntParam, isStrParam;
//mode flag
int flag = atoi(argv[1]);
// set or get param with different ways
switch(flag)
{
case 1:
ROS_INFO("set param mode(ros::param::set()):");
ros::param::set("IntParam",1);
ros::param::set("StrParam","stringdemo");
break;
case 2:
ROS_INFO("set param mode(ros::NodeHandle::setParam()):");
nh.setParam("IntParam",1);
nh.setParam("StrParam","stringdemo");
break;
case 3:
ROS_INFO("get param mode(ros::param::get()):");
isIntParam = ros::param::get("IntParam",IntParam);
isStrParam = ros::param::get("StrParam",StrParam);
if(isIntParam){
ROS_INFO("The IntParam is:%d",IntParam);
}else{
ROS_INFO("Get IntParam fail!");
}
if(isIntParam){
ROS_INFO("The StrParam is:%s",StrParam.c_str());
}else{
ROS_INFO("Get StrParam fail!");
}
break;
case 4:
ROS_INFO("get param mode(ros::NodeHandle::getParam()):");
isIntParam = nh.getParam("IntParam",IntParam);
isStrParam = nh.getParam("StrParam",StrParam);
if(isIntParam){
ROS_INFO("The IntParam is:%d",IntParam);
}else{
ROS_INFO("Get IntParam fail!");
}
if(isIntParam){
ROS_INFO("The StrParam is:%s",StrParam.c_str());
}else{
ROS_INFO("Get StrParam fail!");
}
break;
case 5:
ROS_INFO("get param mode(ros::NodeHandle::param()):");
//warning: this way will set default value when get no param!
nh.param("IntParam",IntParam,11);
// be careful when use ros::NodeHandle::param get string param!
nh.param<std::string>("StrParam",StrParam,"stringdemo_default");
ROS_INFO("\nThe IntParam is:%d\nThe StrParam is:%s",IntParam,StrParam.c_str());
break;
default:
ROS_INFO("flag value is not in range: [1,5]");
}
return 0;
}