参数服务器在ROS中主要用于实现不同节点之间的数据共享。
案例:实现参数增删改查操作,以给小车设置参数为例
C++实现
在C++中提供了两套API,分别是:ros::NodeHandle
ros::param
- 实现数据的新增和修改,功能包plumbing_param_server,新建文件demo01_set_param关键代码实现如下:
/*
实现参数的新增与修改
需求:首先设置小车的共享参数,类型、半径(0.15m)
再修改半径(0.2m)
实现:
ros::NodeHandle
setParam
ros::Param
setParam
修改:只需要继续调用setParam 或 set 函数,保证键是已经存在的,值会被覆盖
*/
ros::NodeHandle nh;
//参数增---------------------
//方案1: nh
nh.setParam("type","xiaohuang");
nh.setParam("radius",0.15);
//方案2:ros::param
ros::param::set("type_param","xiaobai");
ros::param::set("radius_param",0.15);
//参数改---------------------
//方案1: nh
nh.setParam("radius","0.2");
//方案2:ros::param
ros::param::set("radius_param",0.25);
配置CMakeList.txt
add_executable(demo01_param_set src/demo01_param_set.cpp)
target_link_libraries(demo01_param_set
${catkin_LIBRARIES}
)
编译并执行,可以查看参数是否新增和修改成功
启动roscore
启动另一终端:
source ./devel/setup.bash
rosrun plumbing_param_sever demo01_param_set.cpp
启动另一终端:
source ./devel/setup.bash
rosparam list
rosparam get (rosparam list下的键)
- 2.参数的查询(获取参数)
2.1 ros::NodeHandle-----------------
//1.param(键,默认值)存在,返回对应结果,否则返回默认值
double radius = nh.param("radius_param",0.5);
ROS_INFO("radius_param = %.2f",radius);
//getParam(键,存储结果的变量)存在true,且将值赋值给参数2,键不存在,那么返回值为 false,且不为参数2赋值
double radius2 = 0.0;
bool result = nh.getParam("radius_param",radius2);
//3.getParamCached 与 getParam 类似,只是性能有提升
bool result = nh.getParamCached("radius_param",radius2);
if (result)
{
ROS_INFO("获取的半径是:%.2f",radius2
} else
{
ROS_INFO("被查询的变量不存在。");
}
//4.getParamNames(std::vector<std::string>)获取所有的键,并存储在参数 vector 中
std::vector<std::string> names;
nh.getParamNames(names);
for (auto &&name : names)
{
ROS_INFO("遍历的元素:%s",name.c_str());
}
//5.hasParam
bool flag1 = nh.hasParam("radius");
bool flag2 = nh.hasParam("radiusxxx");
ROS_INFO("radius存在吗?%d",flag1);
ROS_INFO("radiusxxx存在吗?%d",flag2);
//6.searchParam (参数1,参数2) 搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
std::string key;
nh.searchParam("radius",key);
ROS_INFO("搜索的结果:%s",key.c_str());
- 2.2 ros::param-------------------------
//ros::param::param(键,默认值)
double radius_param = ros::param::param("radius_paramxxx",100.5);
ROS_INFO("radius_param = %.2f",radius_param);
// getParamNames获取键
std::vector<std::string> names_param;
ros::param::getParamNames(names_param);
for (auto name : names_param)
{
ROS_INFO("键:%s",name.c_str());
}
- 参数的删除
/*
参数服务器操作之删除_C++实现:
ros::NodeHandle
deleteParam("键")
根据键删除参数,删除成功,返回 true,否则返回 false
ros::param
del("键")
根据键删除参数,删除成功,返回 true,否则返回 false
*/
ros::NodeHandle nh;
bool flag1 = nh.deleteParam("radius");
Python实现
- 参数的增删改查
#新增
rospy.set_param("type_p","xiaohuangche")
rospy.set_param("radius_p",0.15)
#修改
rospy.set_param("radius_p",0.25)
#查询
radius = rospy.get_param("radius_p",0.5)
radius2 = rospy.get_param("radius_pxxx",0.5)
rospy.loginfo("radius = %.2f",radius)
rospy.loginfo("radius2 = %.2f",radius2)
# radius3 = rospy.get_param_cached("radius_p",0.5)
# radius4 = rospy.get_param_cached("radius_pxxx",0.5)
names = rospy.get_param_names()
for name in names:
rospy.loginfo("name = %s",name)
#has_param
flag1 = rospy.has_param("radius_p")
if flag1:
rospy.loginfo("radius_p exist")
else:
rospy.loginfo("radius_p not exist")
key = rospy.search_param("radius_p")
rospy.loginfo("key = %s", key)
#删除
rospy.delete_param("radius_p")
常用ros命令
(1)rosnode 运行节点
rosnode list //列出活动节点
rosnode info //打印节点信息
rosnode kill //杀死某个节点
rosnode cleanup // 清除不可连接的节点
(2)rostopic 操作话题
rostopic delay 显示带有 header 的主题延迟
rostopic echo 打印消息到屏幕
rostopic hz 显示主题的发布频率
rostopic info 显示主题相关信息
rostopic list 显示所有活动状态下的主题
rostopic pub 将数据发布到主题
rostopic type 打印主题类型
(3)rosparam 操作参数
rosparam set //设置参数
rosparam get //获取参数
rosparam load //从外部文件加载参数
rosparam dump //将参数写出到外部文件
rosparam delete //删除参数
rosparam list //列出所有参数