param就是个中央注册表,可以进行参数的增删改查.可以在代码中和在ros launch中都可以设置这个参数,参数的名字要是一样的.并且ros launch中的参数会覆盖代码中的参数.
roscpp提供了两套,一套是放在ros::param namespace
下,另一套是在ros::NodeHandle
下,这两套API的操作基本一样。
推荐使用ros::param
的方式,因为ros::param
给人感觉,增删改善参数是静态的,实例无关的,这更像参数的本质
#include
int main(int argc, char **argv)
{
ros::init(argc, argv, "param_demo");
ros::NodeHandle nh;
int parameter1, parameter2, parameter3, parameter4, parameter5;
// get param
bool ifget1 = ros::param::get("param1", parameter1);
// set param
parameter4 = 4;
ros::param::set("param4", parameter4);
// check param
bool ifparam6 = ros::param::has("param6");
if(ifparam6) {
ROS_INFO("Param6 exists");
}
else {
ROS_INFO("Param6 doesn't exist");
}
// delete param
bool ifdeleted6 = ros::param::del("param6");
if(ifdeleted6) {
ROS_INFO("Param6 deleted");
}
else {
ROS_INFO("Param6 not deleted");
}
// get all param names. New in ROS indigo
std::vector keys;
ros::param::search(keys);
return 0;
}
#include
int main(int argc, char **argv)
{
ros::init(argc, argv, "param_demo");
ros::NodeHandle nh;
int parameter1, parameter2, parameter3, parameter4, parameter5;
// get param 1
bool ifget2 = nh.getParam("param2",parameter2);
// get param 2. 33333 is default value. When no param3, parameter3=33333.
nh.param("param3", parameter3, 33333);
// set param
parameter5 = 5;
nh.setParam("param5",parameter5);
// check param
bool ifparam5 = nh.hasParam("param5");
if(ifparam5) {
ROS_INFO("Param5 exists");
}
else {
ROS_INFO("Param5 doesn't exist");
}
// delete param
bool ifdeleted5 = nh.deleteParam("param5");
if(ifdeleted5) {
ROS_INFO("Param5 deleted");
}
else {
ROS_INFO("Param5 not deleted");
}
// get all param names. New in ROS indigo
std::vector keys;
nh.getParamNames(keys);
return 0;
}
有时会看到 ros::NodeHandle n;
和 ros::NodeHandle nh("~");
两种用法。
ros::NodeHandle n;
是全局命名空间。ros::NodeHandle nh("~");
是局部命名空间
如下一个lauch文件,有两个serial
参数,一个全局的,一个局部
使用两种命名空间句柄获取全局和局部参数的用法如下:
#include
int main(int argc, char* argv[])
{
int serial_number = -1;
ros::init(argc, argv, "name_demo");
ros::NodeHandle nh_global;
ros::NodeHandle nh_local("~");
// global namespace
nh_global.getParam("serial", serial_number); // get global serial
nh_global.getParam("name_demo/serial", serial_number); // get local serial. add "name_demo/"
// local namespace
nh_local.getParam("serial", serial_number); // get local serial
nh_local.getParam("/serial", serial_number); // get global serial. add "/"
ros::spin();
return 0;
}
代码修改参数,必须重新编译。
launch文件可以方便的修改参数。
param3: 3
param4: 4
param5: 5