ROS机器人入门第七课:参数服务器

2024-04-21 23:04

本文主要是介绍ROS机器人入门第七课:参数服务器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • ROS机器人入门第七课:参数服务器
    • 一、参数服务器介绍
    • 二、参数操作
      • 1.参数服务器新增(修改)参数
      • 2.参数服务器获取参数
      • 3.参数服务器删除参数

ROS机器人入门第七课:参数服务器

一、参数服务器介绍

参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关于参数服务器的典型应用场景如下:

导航实现时,会进行路径规划,比如: 全局路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成时时的行进路径

上述场景中,全局路径规划和本地路径规划时,就会使用到参数服务器:

  • 路径规划时,需要参考小车的尺寸,我们可以将这些尺寸信息存储到参数服务器,全局路径规划节点与本地路径规划节点都可以从参数服务器中调用这些参数

参数服务器,一般适用于存在数据共享的一些应用场景。

概念
以共享的方式实现不同节点之间数据交互的通信模式。

作用
存储一些多节点共享的数据,类似于全局变量。

案例
实现参数增删改查操作。

参数可使用数据类型:

  • 32-bit integers:32位整数类型,用于存储不需要小数部分的数值,如计数器、标识符等。

  • booleans:布尔类型,用于存储真(True)或假(False)值,适用于开关状态、条件判断等场景。

  • strings:字符串类型,用于存储文本数据,如路径名、配置选项的名称等。

  • doubles:双精度浮点数类型,用于存储需要精确到小数点后多位的数值,如传感器读数、位置坐标等。

  • iso8601 dates:符合ISO 8601标准的日期格式,用于存储日期和时间信息,如日志时间戳、事件发生的时间等。

  • lists:列表类型,用于存储一系列同种或不同种类型的数据项,适用于配置参数的多个值、一系列操作指令等。

  • base64-encoded binary data:Base64编码的二进制数据类型,用于存储二进制数据,如图像数据、文件内容等。采用Base64编码是因为参数服务器通常以文本形式存储和传输数据,而Base64编码能将二进制数据转换为文本表示。

  • 字典:字典类型(也称为映射或哈希表),用于存储键值对,每个键对应一个值。适用于存储具有结构性的数据,如配置参数的集合、不同类型数据的聚合等。

注意:参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据

二、参数操作


需求:实现参数服务器参数的增删改查操作。


1.参数服务器新增(修改)参数

#! /usr/bin/env python
# - coding: utf-8 -*-
"""参数服务器操作之新增与修改(二者API一样)_Python实现:本脚本展示了如何在ROS中使用Python设置和更新参数服务器的参数。
"""# 导入rospy模块,这是ROS中与Python程序交互的主要模块。
import rospy# 确定这个脚本是作为主程序运行,而不是作为模块导入到其他脚本中。
if __name__ == "__main__":# 初始化一个ROS节点,节点名为"set_update_paramter_p"。# 在ROS中,节点是通信的基本单元,每个节点都要有一个唯一的名称。rospy.init_node("set_update_paramter_p")# 下面一系列的set_param调用设置了参数服务器上的不同类型的参数。# 参数服务器是ROS中用于存储和管理参数的系统,如配置参数。# 设置一个名为"p_int"的整型参数,值为10。rospy.set_param("p_int",10)# 设置一个名为"p_double"的浮点型参数,值为3.14。rospy.set_param("p_double",3.14)# 设置一个名为"p_bool"的布尔型参数,值为True。rospy.set_param("p_bool",True)# 设置一个名为"p_string"的字符串型参数,值为"hello python"。rospy.set_param("p_string","hello python")# 设置一个名为"p_list"的列表型参数,值为一个字符串列表["hello", "haha", "xixi"]。rospy.set_param("p_list",["hello","haha","xixi"])# 设置一个名为"p_dict"的字典型参数,值为一个字典{"name":"hulu","age":8}。rospy.set_param("p_dict",{"name":"hulu","age":8})# 修改已有的参数。这行代码将名为"p_int"的参数的值更改为100。rospy.set_param("p_int",100)

ros函数解释:

  • rospy.init_node(NAME, ...): 这个函数告诉ROS你将要开始一个新的节点。NAME是节点的名称,在ROS网络中应当是唯一的。

  • rospy.set_param(PARAM_NAME, PARAM_VALUE): 这是一个设置参数的函数,PARAM_NAME是要设置的参数的名称,PARAM_VALUE是参数的值,可以是整型、浮点型、布尔型、字符串型、列表型、字典型等。这个函数既可以用来创建新的参数,也可以用来修改现有的参数。如果参数已经存在,这个函数将更新它的值。

然后和前几篇文章一样修改CmakeLists.txt文件和为python文件添加可执行权限,这里不再赘述


可以用rosparam list列出当前参数服务器上所有的参数名称
在这里插入图片描述

可以用rosparam get从参数服务器检索单个参数的值

在这里插入图片描述


2.参数服务器获取参数

#! /usr/bin/env python
# - coding: utf-8 -*-
"""参数服务器操作之查询_Python实现:本脚本展示了如何在ROS中使用Python查询参数服务器中的参数。
"""# 导入rospy模块,rospy是ROS用于Python的主要客户端库。
import rospy# 这个条件确保了以下代码只有在该Python文件作为主程序运行时才会执行。
# 当文件被其他文件import时,这些代码不会执行。
if __name__ == "__main__":# 初始化ROS节点,节点名为"get_param_p"。rospy.init_node("get_param_p")# 获取参数服务器上名为"p_int"的参数,如果该参数不存在,则返回默认值10000。int_value = rospy.get_param("p_int",10000)# 获取参数服务器上名为"p_double"的参数,如果该参数不存在,将引发错误。double_value = rospy.get_param("p_double")# 获取参数服务器上名为"p_bool"的参数,如果该参数不存在,将引发错误。bool_value = rospy.get_param("p_bool")# 获取参数服务器上名为"p_string"的参数,如果该参数不存在,将引发错误。string_value = rospy.get_param("p_string")# 获取参数服务器上名为"p_list"的参数,如果该参数不存在,将引发错误。p_list = rospy.get_param("p_list")# 获取参数服务器上名为"p_dict"的参数,如果该参数不存在,将引发错误。p_dict = rospy.get_param("p_dict")# 使用loginfo打印信息,显示获取的各种类型的参数。rospy.loginfo("获取的数据:%d,%.2f,%d,%s",int_value,double_value,bool_value,string_value)# 遍历列表参数,并打印其元素。for ele in p_list:rospy.loginfo("ele = %s", ele)# 打印字典参数中的"name"和"age"键对应的值。rospy.loginfo("name = %s, age = %d", p_dict["name"], p_dict["age"])# get_param_cached用于获取参数的缓存值,这可能比直接获取参数更快。int_cached = rospy.get_param_cached("p_int")rospy.loginfo("缓存数据:%d", int_cached)# get_param_names返回一个包含所有参数名称的列表。names = rospy.get_param_names()# 遍历并打印出所有参数的名称。for name in names:rospy.loginfo("name = %s", name)# 打印分隔线,用于清晰显示输出结果。rospy.loginfo("-" * 80)# has_param检查参数服务器是否有名为"p_int"的参数。flag = rospy.has_param("p_int")rospy.loginfo("包含p_int吗?%d", flag)# search_param搜索特定的参数名称,并返回完整的参数名称路径。# 如果参数位于不同的命名空间下,这个方法会很有用。key = rospy.search_param("p_int")rospy.loginfo("搜索的键 = %s", key)

ROS函数解释:

  • rospy.init_node(NAME, ...): 初始化一个ROS节点。NAME是节点的名称,在ROS网络中必须是唯一的。

  • rospy.get_param(PARAM_NAME, DEFAULT=None): 从参数服务器获取一个参数。如果指定的PARAM_NAME存在,返回其值;否则返回DEFAULT指定的默认值。

  • rospy.loginfo(msg, *args): 将一个消息作为info类型记录到/rosout话题和节点的控制台。msg是消息格式,*args是格式化消息的参数。

  • rospy.get_param_cached(PARAM_NAME): 与get_param类似,但是它使用缓存来加速参数的获取。适合频繁查询的情况。

  • rospy.get_param_names(): 返回一个字符串列表,包含参数服务器上所有参数的名称。

  • rospy.has_param(PARAM_NAME): 检查参数服务器上是否有指定的参数。返回True或False。

  • rospy.search_param(PARAM_NAME): 在当前命名空间以及父命名空间中搜索参数,并返回完整的参数名称(可能包含命名空间路径)。如果参数不存在,返回None。

每个函数都与ROS参数服务器的操作有关,这些操作用于查询和管理参数,这些参数可以配置ROS节点的行为。

在这里插入图片描述

3.参数服务器删除参数

下面是提供的代码块的详细注释版本,包括ROS函数delete_param的作用说明:

#! /usr/bin/env python
# 上面的shebang指令告诉操作系统使用env来查找python解释器的位置,以便执行此脚本。"""参数服务器操作之删除_Python实现:rospy.delete_param("键")键存在时,可以删除成功,键不存在时,会抛出异常。本脚本用于演示如何从ROS参数服务器中删除一个参数。
"""# 导入rospy模块,rospy是ROS用于Python的主要客户端库,用于与ROS系统通信。
import rospy# 这个条件确保了以下代码只有在该Python文件作为主程序运行时才会执行。
# 当文件被其他文件import时,这些代码不会执行。
if __name__ == "__main__":# rospy.init_node用于告诉ROS系统这里是一个新的节点。# "delete_param_p"是这个新节点的名称。rospy.init_node("delete_param_p")# 尝试执行一个可能会抛出异常的操作。try:# rospy.delete_param函数用于删除参数服务器上的一个参数。# 这里尝试删除名为"p_int"的参数。# 如果参数存在,它将被删除。rospy.delete_param("p_int")except Exception as e:  # 如果在尝试删除参数时出现任何异常,将执行这个块内的代码。# rospy.loginfo函数用来打印信息级别的日志到/rosout话题和节点的控制台。# 这里它被用来告知用户参数删除失败。rospy.loginfo("删除失败")

ROS函数解释:

  • rospy.init_node(NAME, ...): 这个函数初始化一个ROS节点。NAME是节点的名称,在ROS网络中必须是唯一的。节点是ROS通信网络中的一个基本单位,所有的通信工具如话题(topics)、服务(services)和参数(parameters)都会与一个特定的节点相关联。

  • rospy.delete_param(PARAM_NAME): 这个函数用于删除参数服务器上的一个参数。PARAM_NAME是你想要删除的参数的名称。如果参数存在,它将被删除。如果不存在,函数会抛出rospy.ROSException

  • rospy.loginfo(msg, *args): 这个函数用来打印信息级别的日志到/rosout话题和节点的控制台。这对于调试和用户反馈都是非常有用的。

在这段代码中,delete_param函数是用来从ROS参数服务器上删除一个指定名称的参数。如果这个参数不存在,将会抛出一个异常,然后脚本会捕获这个异常并打印出"删除失败"的信息。这是一个参数管理的典型用例,确保了在删除不必要或过时的参数时系统的稳定性和一致性。

删除p_int
在这里插入图片描述
再次删除p_int
在这里插入图片描述

这篇关于ROS机器人入门第七课:参数服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924254

相关文章

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

基于Python打造一个可视化FTP服务器

《基于Python打造一个可视化FTP服务器》在日常办公和团队协作中,文件共享是一个不可或缺的需求,所以本文将使用Python+Tkinter+pyftpdlib开发一款可视化FTP服务器,有需要的小... 目录1. 概述2. 功能介绍3. 如何使用4. 代码解析5. 运行效果6.相关源码7. 总结与展望1