目录
简介
参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关于参数服务器的典型应用场景如下:
导航实现时,会进行路径规划,比如: 全局路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成时时的行进路径
上述场景中,全局路径规划和本地路径规划时,就会使用到参数服务器:
- 路径规划时,需要参考小车的尺寸,我们可以将这些尺寸信息存储到参数服务器,全局路径规划节点与本地路径规划节点都可以从参数服务器中调用这些参数
参数服务器,一般适用于存在数据共享的一些应用场景。
理论模型
因为用的是rpc协议所以并不高效
iso8601 dates是日期类的数据
C++实现
新建功能包
然后回车 输入依赖roscpp rospy std_msgs
实现参数服务器新增(修改)参数
然后新建文件
写入以下代码
修改CMakeLists
然后编译
然后启动终端执行
可以看到参数传入了
还可以查到参数信息
接下来实现修改参数
可以看到键是一样的
所以后面的覆盖掉前面的键值实际上就是实现了修改
测试
被改成了0.2
实现参数服务器查询
新建文件
然后修改CMakeLists
然后输入以下代码测试查询功能
编译
然后测试
测试getparam
打开终端
测试getparamnames
打开终端
成功遍历
测试ros::param
终端
参数服务器删除实现
新建文件
修改配置
复制以下代码
/*
参数服务器操作之删除_C++实现:
ros::NodeHandle
deleteParam("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
ros::param
del("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
*/
#include "ros/ros.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"delete_param");
ros::NodeHandle nh;
bool r1 = nh.deleteParam("nh_int");
ROS_INFO("nh 删除结果:%d",r1);
bool r2 = ros::param::del("param_int");
ROS_INFO("param 删除结果:%d",r2);
return 0;
}
然后
ctrl shift b编译
删除成功
Python实现
新建文件夹新建文件
实现服务器新增修改参数
复制以下代码
#! /usr/bin/env python
"""
参数服务器操作之新增与修改(二者API一样)_Python实现:
"""
import rospy
if __name__ == "__main__":
rospy.init_node("set_update_paramter_p")
# 设置各种类型参数
rospy.set_param("p_int",10)
rospy.set_param("p_double",3.14)
rospy.set_param("p_bool",True)
rospy.set_param("p_string","hello python")
rospy.set_param("p_list",["hello","haha","xixi"])
rospy.set_param("p_dict",{"name":"hulu","age":8})
# 修改
rospy.set_param("p_int",100)
修改配置
然后添加执行权限
然后编译
然后启动命令行
可以看到运行成功
实现服务器查询参数
新建文件
添加可执行权限
配置CMakeLists
然后编译
然后打开终端测试
测试成功
参数服务器的删除实现
新建文件
复制以下代码
#! /usr/bin/env python
"""
参数服务器操作之删除_Python实现:
rospy.delete_param("键")
键存在时,可以删除成功,键不存在时,会抛出异常
"""
import rospy
if __name__ == "__main__":
rospy.init_node("delete_param_p")
try:
rospy.delete_param("p_int")
except Exception as e:
rospy.loginfo("删除失败")
添加执行权限
配置CMakeLists
编译
打开终端
成功删除
常用命令
rosnode
rostopic
rosmsg
打开消息发布方和订阅方
这是查看正在用的消息类型
其实就是功能包下的定义了一个消息类型
所以rosmsg显示时要调用这个自定义消息文件来显示消息
发布方调用
rosservice
以上是消息列表
这里是作为客户端
注意要在节点后输入type消息类型
然后按Tab补全
然后修改消息发布
这里是显示节点信息
然后里面的type就是上面要补全要用的
rossrv
以下是显示所有服务消息
显示对应节点的srv消息
注意:如果消息是自定义的,要先进入工作空间,然后刷新环境变量才能找到
rosparam
参数服务器里的数据
增加了一个参数
删除参数
创建了一个yaml文件
其中就包括了我们设置的参数
关掉roscore再启动
此时可以看到参数width和length这两个参数被释放掉了
此时想要加载回来
以上是从yaml释放回来
然后又可以读取到了