ROS参数服务器调用以及常用命令

参数服务器在ROS中主要用于实现不同节点之间的数据共享。

案例:实现参数增删改查操作,以给小车设置参数为例

C++实现

在C++中提供了两套API,分别是:ros::NodeHandle
ros::param

  1. 实现数据的新增和修改,功能包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());
}
  1. 参数的删除
/* 
    参数服务器操作之删除_C++实现:
    ros::NodeHandle
        deleteParam("键")
        根据键删除参数,删除成功,返回 true,否则返回 false
    ros::param
        del("键")
        根据键删除参数,删除成功,返回 true,否则返回 false
*/
    ros::NodeHandle nh;
    bool flag1 = nh.deleteParam("radius");

Python实现

  1. 参数的增删改查
	#新增
	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    //列出所有参数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值