param就像一個(gè)中央注冊(cè)表,可以進(jìn)行參數(shù)的增刪改查。roscpp提供了兩套參數(shù)調(diào)用方法,一套是放在ros::param namespace,另一套放在ros::NodeHandle下,這兩套API的操作基本一樣。推薦使用ros::param給人感覺,增刪改查參數(shù)是靜態(tài)的,實(shí)例無關(guān)的。
1. launch文件中載入?yún)?shù)
代碼修改參數(shù),必須重新編譯,launch文件可以方便的修改參數(shù)。
<launch>
<!--全局參數(shù)-->
<!--param 載入方式-->
<param name="param1" value="1" />
<param name="param2" value="2" />
<!--rosparam 載入方式-->
<rosparam>
param3: 3
param4: 4
param5: 5
</rosparam>
<node pkg="param_demo" type="param_demo" name="param_demo" output="screen" />
<!--局部參數(shù)-->
<!--rosparam 載入方式-->
<param name="serial" value="10" />
</node>
</launch>
2. CPP文件引用參數(shù)
2.1. ros:param方式
#include<ros/ros.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "param_demo");
ros::NodeHandle nh;
int parameter1, parameter2, parameter3, parameter4, parameter5;
// 獲取參數(shù)
bool ifget1 = ros::param::get("param1", parameter1);
// 設(shè)置參數(shù)
parameter4 = 4;
ros::param::set("param4", parameter4);
// 檢查參數(shù)
bool ifparam6 = ros::param::has("param6");
if(ifparam6) {
ROS_INFO("Param6 exists");
}
else {
ROS_INFO("Param6 doesn't exist");
}
// 刪除參數(shù)
bool ifdeleted6 = ros::param::del("param6");
if(ifdeleted6) {
ROS_INFO("Param6 deleted");
}
else {
ROS_INFO("Param6 not deleted");
}
// 獲取參數(shù)名
std::vector<std::string> keys;
ros::param::search(keys);
return 0;
}
2.2. ros:NodeHandle方式
#include<ros/ros.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "param_demo");
ros::NodeHandle nh;
int parameter1, parameter2, parameter3, parameter4, parameter5;
// 方法一:獲取參數(shù)
bool ifget2 = nh.getParam("param2",parameter2);
// 方法二:獲取參數(shù),具備默認(rèn)值
nh.param("param3", parameter3, 33333);
// 設(shè)置參數(shù)
parameter5 = 5;
nh.setParam("param5",parameter5);
// 檢查參數(shù)
bool ifparam5 = nh.hasParam("param5");
if(ifparam5) {
ROS_INFO("Param5 exists");
}
else {
ROS_INFO("Param5 doesn't exist");
}
// 刪除參數(shù)
bool ifdeleted5 = nh.deleteParam("param5");
if(ifdeleted5) {
ROS_INFO("Param5 deleted");
}
else {
ROS_INFO("Param5 not deleted");
}
// 獲取所有參數(shù)名
std::vector<std::string> keys;
nh.getParamNames(keys);
return 0;
}
3. 命名空間
在ROS項(xiàng)目文件中,有時(shí)會(huì)看到ros::NodeHandle n和ros::NodeHandle nh("~")兩種用法,兩種命名空間句柄獲取全局和局部參數(shù)的用法也存在不同。
ros::NodeHandle n;是全局命名空間句柄
ros::NodeHandle nh("~");是局部命名空間句柄
- launch文件
<launch> <!-- 全局參數(shù): serial --> <param name="serial" value="5" /> <node name="name_demo" pkg="name_demo" type="name_demo" output="screen"> <!-- 局部參數(shù): serial --> <param name="serial" value="10" /> </node> </launch> - cpp文件
#include <ros/ros.h> int main(int argc, char* argv[]) { int serial_number = -1; ros::init(argc, argv, "name_demo"); ros::NodeHandle nh_global; ros::NodeHandle nh_local("~"); // 全局命名空間句柄獲取全局參數(shù)和局部參數(shù) nh_global.getParam("serial", serial_number); // get global serial nh_global.getParam("name_demo/serial", serial_number); // get local serial. add "name_demo/" // 局部命名空間句柄獲取全局參數(shù)和局部參數(shù) nh_local.getParam("serial", serial_number); // get local serial nh_local.getParam("/serial", serial_number); // get global serial. add "/" ros::spin(); return 0; }