1. 說明
param就是個(gè)中央注冊(cè)表,可以進(jìn)行參數(shù)的增刪改查
2. roscpp中的使用
roscpp提供了兩套,一套是放在ros::param namespace下,另一套是在ros::NodeHandle下,這兩套API的操作基本一樣。
推薦使用ros::param的方式,因?yàn)?code>ros::param給人感覺,增刪改善參數(shù)是靜態(tài)的,實(shí)例無關(guān)的,這更像參數(shù)的本質(zhì)。
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;
// 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<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;
// 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<std::string> keys;
nh.getParamNames(keys);
return 0;
}
2.3 命名空間
有時(shí)會(huì)看到 ros::NodeHandle n; 和 ros::NodeHandle nh("~"); 兩種用法。
ros::NodeHandle n;是全局命名空間。
ros::NodeHandle nh("~");是局部命名空間
如下一個(gè)lauch文件,有兩個(gè)serial參數(shù),一個(gè)全局的,一個(gè)局部
<launch>
<!-- global serial -->
<param name="serial" value="5" />
<node name="name_demo" pkg="name_demo" type="name_demo" output="screen">
<!-- local serial -->
<param name="serial" value="10" />
</node>
</launch>
使用兩種命名空間句柄獲取全局和局部參數(shù)的用法如下:
#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("~");
// 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;
}
3. rospy中的使用
3.1 get param
rospy.get_param()
parameter1 = rospy.get_param("/param1")
parameter2 = rospy.get_param("/param2", default=222)
3.2 set param
rospy.set_param()
rospy.set_param('/param2',2)
3.3 check param
rospy.has_param()
ifparam3 = rospy.has_param('/param3')
if(ifparam3):
rospy.loginfo('/param3 exists')
else:
rospy.loginfo('/param3 does not exist')
3.4 delete param
rospy.delete_param()
rospy.delete_param('/param2')
3.5 get all param names
rospy.get_param_names()
params = rospy.get_param_names()
rospy.loginfo('param list: %s', params)
3.6 search param
rospy.search_param()
param = rospy.search_param('param_name')
v = rospy.get_param(param)
當(dāng)有多個(gè)名為param_name參數(shù)時(shí),找到離當(dāng)前node最近的參數(shù)名稱。
假設(shè)當(dāng)前node在/foo/bar層級(jí), rospy.search_param()會(huì)按如下順序找
/foo/bar/param_name
/foo/param_name
/param_name
4. 在 launch 文件中載入?yún)?shù)
代碼修改參數(shù),必須重新編譯。
launch文件可以方便的修改參數(shù)。
param_demo.launch
<launch>
<!--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" />
</launch>
5. 參考
roscpp/Overview/Parameter Server
http://wiki.ros.org/roscpp/Overview/Parameter%20Server
rospy/Overview/Parameter Server
http://wiki.ros.org/rospy/Overview/Parameter%20Server