参数的设置获取通常可以通过命令行来实现,但是为了便于维护和排查错误,我们接下来将通过编写可执行文件的方式来演示获取和设置参数的不同方法。
ROS中有如下三种获取参数的方式:
ros::param::get()
ros::NodeHandle::getParam()
ros::NodeHandle::param()
特别的是,第三种:ros::NodeHandle::param() 方式在获取失败时会自动设置一个默认参数值。
ROS中有如下两种设置参数的方式:
ros::param::set()
ros::NodeHandle::setParam()
下面演示具体例子:
创建文件book_param.cpp,如下:
#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"\
<<" 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;
}
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;
}
说明:
if(argc!=2): 如果用户输入命令行错误,则打印提示信息。在本例子中5种模式展示如何获取和设置参数。
int flag = atoi(argv[1]): 模式选择标志位
ros::param::set(): 设置IntParam和StrParam参数。
ros::NodeHandle::setParam(): 设置IntParam和StrParam参数。
ros::param::get(): 获取IntParam和StrParam参数。
ros::NodeHandle::getParam() :获取IntParam和StrParam参数。
ros::NodeHandle::param(): 获取IntParam和StrParam参数。
CMakeList.txt
cmake_minimum_required(VERSION 2.8.3)
project(book_param)
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs)
catkin_package(
)
include_directories(
include ${catkin_INCLUDE_DIRS}
)
add_executable(book_param
src/book_param.cpp
)
add_dependencies(book_param ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(book_param
${catkin_LIBRARIES}
)
测试:
rosrun book_param book_param
结果:
Error command paramter! Please run command eg:
rosrun book_param book_param 1
help information:
1 ------ set param mode(ros::param::set())
2 ------ set param mode(ros::NodeHandle::setParam())
3 ------ get param mode(ros::param::get())
4 ------ get param mode(ros::NodeHandle::getParam())
5 ------ get param mode(ros::NodeHandle::param())
测试:
rosrun book_param book_param 6
结果:
[ INFO] [1630305519.823623550]: flag value is not in range: [1,5]
测试:
rosrun book_param book_param 3
结果:
[ INFO] [1630305550.059033968]: get param mode(ros::param::get()):
[ INFO] [1630305550.060341782]: The IntParam is:1
[ INFO] [1630305550.060381996]: The StrParam is:stringdemo
测试:
rosparam list
结果:
/IntParam
/StrParam
测试:
nanorobot@ubuntu:~/catkin_test$ rosparam get StrParam
结果:
stringdemo
reference: 《ROS机器人编程与SLAM算法解析指南》