参数服务器

  • 前言
  • 理论
  • 查看
  • 增加、修改
    • C++
    • python
  • 删除
    • C++
    • python
  • 查询
    • C++
    • python

前言

本文主要是跟着audolabor学习ROS笔记,多为操作性质,并从另一种角度对实现的顺序进行调整,想要多学习,可以参考autolabor教程

理论


参数服务器里存的类似于全局变量,所有节点都可以编程增删改查这些变量,这些变量存储与ROS Master中。参数的类型可以是:

  • 32-int整形
  • bool
  • string
  • double
  • iso8601 dates(时间的一种表示方法)
  • lists
  • 字典

查看

终端中使用以下命令查看

rosparam list     #得到所有的参数的键名
rosparam get key #得到键key对应的参数

增加、修改

增加和修改的语法相同

C++

C++中的所有参数修改有两套API,可以使用节点句柄nh.,也可以使用ros::param::。

#include "ros/ros.h"
int main(int argc,char* argv[])
{
	ros::init(argc,argv,"name");
	ros::NodeHandle nh;
	//增加参数
	nh.setParam("radius",10);
	ros::param::set("radius_ros",10);
	//修改参数
	nh.setParam("radius",20);
	ros::param::set("radius_ros",30);
}

python

import rospy

if __name__ == "__main__":
	rospy.init_node("python")
	# 新增
	rospy.set_param("type","minions")
	# 修改
	rospy.set_param("type","dragon")

删除

初始化等框架不在赘述

C++

// 传参为键名,返回值为删除是否成功的bool值
ros::param::del("radius");
nh.deleteParam("radius")

python

# python中如果删除不成功程序会报错,所以建议使用try语法
try:
	rospy.delete_param("type")
except Exception as e:
	rospy.loginfo("删除失败")

查询

C++

nh.param("radius",-1.);
ros::param::param("radius",-1.);//输入的是键名和如果没有找到相应值返回的默认值
double radius
nh.getParam("radius",radius)
bool flag = ros::param::get("radius",radius);//将radius键查到的数值带入到radius里,返回一个bool类型的值,表示有没有查到
string key;
nh.searchParam("radius",key);
bool flag2 = ros::param::search("radius",key);//查找是否有radius参数,如果有将键名保存到key中
nh.getParamCached("radius",radius);
bool flag3 = ros::param::getCached("radius",radius);
nh.hasParam("radius");
bool flag4 = ros::param::has("radius");//参数是否存在
std::vector<std::string> keys;
nh.getParamNames(keys);
ros::param::search(keys);//将所有的键名存入keys中

python

type = rospy.get_param("type","None")
type = rospy.get_param_cached("type","None")
rospy.has_param("type")#返回是否查到
name = rospy.get_param_names()#返回所有参数的名字
key = rospy.search_param("type")#返回键的全名

更多推荐

3,ROS参数服务器C++与python