前言
本文主要是跟着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")#返回键的全名