当前位置: 首页 > news >正文

ROS系统中常用的数据传输方式——参数

什么是参数:

类似C++编程中的全局变量,可以便于在多个程序中共享某些数据,参数是ROS机器人系统中的全局字典,可以运行多个节点中共享数据。

什么叫字典:

就像真实的字典一样,由名称和意义一一对应,也叫做键和值,合成键值

参数的可动态监控特性:

比如某一个节点共享了一个参数,其他节点都可以访问。

如果某一个节点对参数进行了修改,其他节点也有办法立刻知道,从而获取最新的数值。

通信模式:

在NodeA相机驱动节点中,就需要考虑很多问题,相机连接到哪个usb端口,使用的图像分辨率
是多少,曝光度和编码格式分别是什么。

这些都可以通过参数设置,我们可以通过配置文件或者程序进行设置。

NodeB节点中也是一样,图像识别使用的阈值是多少,整个图像面积很大,那个部分是我们关注
的核心区域,识别过程是否需要美颜等等。

参数的一些常用的命令:

$ ros2 param list  # 查看系统当前的所有参数

$ ros2 param describe turtlesim background_b    # 查看 turtlesim节点中的background_b参数的值

$ ros2 param get turtlesim background_b       # 查询turtlesim节点中的参数turtlesim background_b的值

$ ros2 param set turtlesim background_b 10    # 修改turtlesim节点中的参数turtlesim background_b为10

可以在param命令后边跟dump子命令,将某个节点的参数都保存到文件中,或者通过load命令一次性加载某个参数文件中的所有内容:

$ ros2 param dump turtlesim >> turtlesim.yaml # 将turtlesim所有节点的参数保存到参数文件turtlesim.yaml中

$ ros2 param load turtlesim turtlesim.yaml    # 将参数文件 turtlesim.yaml中的配置值批量加载到正在运行的 turtlesim节点中​​,从而动态地改变节点的行为(例如小乌龟仿真器的背景颜色)。

如何实现命令行在线调节参数(摄像头识别红色物体):

在机器视觉识别任务中,物体识别对光线比较敏感,不同的环境大家使用的阈值也是不同的。每次在代码中修改阈值还挺麻烦,不如我们就把阈值提炼成参数,运行过程中就可以动态设置,不是大大提高了程序的易用性么?


import rclpy                      # ROS2 Python接口库
from rclpy.node import Node       # ROS2 节点类
from sensor_msgs.msg import Image # 图像消息类型
from cv_bridge import CvBridge    # ROS与OpenCV图像转换类
import cv2                        # Opencv图像处理库
import numpy as np                # Python数值计算库lower_red = np.array([0, 90, 128])     # 红色的HSV阈值下限
upper_red = np.array([180, 255, 255])  # 红色的HSV阈值上限"""
创建一个订阅者节点
"""
class ImageSubscriber(Node):def __init__(self, name):super().__init__(name)                                  # ROS2节点父类初始化    self.sub = self.create_subscription(Image,              # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)     'image_raw', self.listener_callback, 10) self.cv_bridge = CvBridge()                             # 创建一个图像转换对象,用于OpenCV图像与ROS的图像消息的互相转换self.declare_parameter('red_h_upper', 0)                # 创建一个参数,表示阈值上限self.declare_parameter('red_h_lower', 0)                # 创建一个参数,表示阈值下限def object_detect(self, image):upper_red[0] = self.get_parameter('red_h_upper').get_parameter_value().integer_value      # 读取阈值上限的参数值lower_red[0] = self.get_parameter('red_h_lower').get_parameter_value().integer_value      # 读取阈值下限的参数值self.get_logger().info('Get Red H Upper: %d, Lower: %d' % (upper_red[0], lower_red[0]))   # 通过日志打印读取到的参数值hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)                                          # 图像从BGR颜色模型转换为HSV模型mask_red = cv2.inRange(hsv_img, lower_red, upper_red)                                     # 图像二值化contours, hierarchy = cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)    # 图像中轮廓检测for cnt in contours:                                                                      # 去除一些轮廓面积太小的噪声if cnt.shape[0] < 150:continue(x, y, w, h) = cv2.boundingRect(cnt)                                      # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)                        # 将苹果的轮廓勾勒出来cv2.circle(image, (int(x+w/2), int(y+h/2)), 5, (0, 255, 0), -1)           # 将苹果的图像中心点画出来cv2.imshow("object", image)                                                   # 使用OpenCV显示处理后的图像效果cv2.waitKey(50)def listener_callback(self, data):self.get_logger().info('Receiving video frame')     # 输出日志信息,提示已进入回调函数image = self.cv_bridge.imgmsg_to_cv2(data, "bgr8")  # 将ROS的图像消息转化成OpenCV图像self.object_detect(image)                            # 苹果检测def main(args=None):                                    # ROS2节点主入口main函数rclpy.init(args=args)                               # ROS2 Python接口初始化node = ImageSubscriber("param_object_detect")       # 创建ROS2节点对象并进行初始化rclpy.spin(node)                                    # 循环等待ROS2退出node.destroy_node()                                 # 销毁节点对象rclpy.shutdown()                                    # 关闭ROS2 Python接口

你可能会好奇,命令行的一条指令是如何最终影响节点内部变量的。这个过程依赖于ROS2的​​服务通信​​机制:

  1. ​服务调用​​:当执行 ros2 param set /param_object_detect red_h_upper 10时,命令行工具会作为一个客户端,向节点 param_object_detect发起一个服务调用,请求是设置指定参数的新值。

  2. ​参数更新​​:节点内部有一个参数服务端(由ROS2底层自动创建),它接收这个请求,并更新内存中 red_h_upper参数的值。

  3. ​值被读取​​:当下一个图像帧到达,触发 listener_callback并执行到 object_detect方法时,self.get_parameter('red_h_upper')语句会​​重新读取​​此时参数服务器中该参数的值。因此,读取到的是刚刚设置的新值。

  4. ​立即生效​​:新阈值被赋值给 upper_red[0],随后在 cv2.inRange(hsv_img, lower_red, upper_red)函数中用于二值化处理,从而立即影响红色的识别范围。

http://www.dtcms.com/a/495592.html

相关文章:

  • 网站移动端是什么问题吗移动商城积分兑换
  • 淘宝API数据采集的日志监控与异常报警
  • 熊猫(安卓):识字软件
  • 水题记录2.3
  • Google Landmarks Dataset v2 (GLDv2):500万地标图像的识别与检索基准​(数据集概览、下载与使用全流程​)
  • 在设置feign请求的请求头透传(Header Propagation)时获取不到当前服务请求头的信息
  • 服装网站设计网站强制分享链接怎么做的
  • DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(二)
  • WPF中的变换(Transform)功能详解
  • 北京做网站主机开通成功网站建设中
  • 工业显示器在微铣削机床中的应用
  • 合肥手机网站建设陕西网站建设平台
  • 东莞网站推广及优化平台营销策略
  • exp4j并发解决
  • 学习博弈本身过程脑是怎么看的?
  • 风险感知中枢:监测预警系统的架构与核心
  • 使用ROS2 + Qt编写一个简易计算器
  • 校园资料分享平台|基于SpringBoot和Vue的校园资料分享平台(源码+数据库+文档)
  • 企业花钱做的网站出现违禁词本地wordpress 手机浏览器
  • 网站建设最基础是什么广东网站建设服务商
  • 如何模仿一个网站云手机免费版无限挂机
  • Vue2 + Office Add-in关于用vue项目于加载项控制excel单元格内容(Demo版)
  • TS在Vue3中的使用实例集合
  • 储能技术适配绿电直连场景深度对比
  • React + Ant Design 日期选择器避免显示“Invalid Date“的解决方案
  • Vue 3 多实例 + 缓存复用:理念及实践
  • 手机网站自适应布局怎么做wordpress背景图片下载
  • Java基础——面向对象进阶复习知识点3
  • wordpress资讯站模板网站建设 智能建站
  • NoSQL介绍