ROS2 参数

本文详细介绍了ROS机器人系统中参数的使用,包括全局字典的概念、动态监控、查询修改、参数文件的保存与加载,以及在机器视觉应用中的阈值调整实例。通过Python接口展示了如何创建和操作参数,提升程序的灵活性和易用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参数

参数是ROS机器人系统中的全局字典,可以运行多个节点中的共享数据

通信模型

请添加图片描述

全局字典

ROS系统中,参数以全局字典的形态存在,键值对形式存在,访问的时候,访问键名进行

可动态监控

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

案例一:小乌龟例程中的参数

$ ros2 run turtlesim turtlesim_node
$ ros2 run turtlesim turtle_teleop_key

查看参数列表

$ ros2 param list

请添加图片描述

参数查询与修改

想要查询或者修改某个参数的值,可以在param命令后边跟get或者set子命令:

$ ros2 param describe turtlesim background_b   # 查看某个参数的描述信息
$ ros2 param get turtlesim background_b        # 查询某个参数的值
$ ros2 param set turtlesim background_b 10     # 修改某个参数的值

参数文件保存与加载

参数文件可以避免一个一个查询或修改的麻烦,ROS中的参数文件使用yaml格式,可以在param命令后边跟dump子命令,将某个节点的参数都保存到文件中,然后在文件中集中进行修改,再通过load命令一次性加载某个参数文件中的所有内容:

$ ros2 param dump turtlesim >> turtlesim.yaml  # 将某个节点的参数保存到参数文件中
$ ros2 param load turtlesim turtlesim.yaml     # 一次性加载某一个文件中的所有参数

案例二参数编程

启动一个终端,先运行第一句指令,启动param_declare节点,终端中可以看到循环打印的日志信息,其中的“mbot”就是设置的一个参数值,参数名称是“robot_name”,通过命令行修改这个参数

$ ros2 run learning_parameter param_declare
$ ros2 param set param_declare robot_name turtle

在这里插入图片描述

代码解析

learning_parameter/param_declare.py

import rclpy                                     # ROS2 Python接口库
from rclpy.node   import Node                    # ROS2 节点类

class ParameterNode(Node):
    def __init__(self, name):
        super().__init__(name)                                    # ROS2节点父类初始化
        self.timer = self.create_timer(2, self.timer_callback)    # 创建一个定时器(单位为秒的周期,定时执行的回调函数)
        self.declare_parameter('robot_name', 'mbot')              # 创建一个参数,并设置参数的默认值

    def timer_callback(self):                                      # 创建定时器周期执行的回调函数
        robot_name_param = self.get_parameter('robot_name').get_parameter_value().string_value   # 从ROS2系统中读取参数的值

        self.get_logger().info('Hello %s!' % robot_name_param)     # 输出日志信息,打印读取到的参数值

        new_name_param = rclpy.parameter.Parameter('robot_name',   # 重新将参数值设置为指定值
                            rclpy.Parameter.Type.STRING, 'mbot')
        all_new_parameters = [new_name_param]
        self.set_parameters(all_new_parameters)                    # 将重新创建的参数列表发送给ROS2系统

def main(args=None):                                 # ROS2节点主入口main函数
    rclpy.init(args=args)                            # ROS2 Python接口初始化
    node = ParameterNode("param_declare")            # 创建ROS2节点对象并进行初始化
    rclpy.spin(node)                                 # 循环等待ROS2退出
    node.destroy_node()                              # 销毁节点对象
    rclpy.shutdown()                                 # 关闭ROS2 Python接口

完成代码的编写后需要设置功能包的编译选项,让系统知道Python程序的入口,打开功能包的setup.py文件,加入如下入口点的配置:

entry_points={
    'console_scripts': [
     'param_declare          = learning_parameter.param_declare:main',
    ],
},

案例三:机器视觉应用

优化机器视觉的示例,物体识别对光线比较敏感,每次在代码中修改阈值比较麻烦,将阈值提炼成参数,运行过程中可以动态设置,大大提高程序的易用性

$ ros2 run usb_cam usb_cam_node_exe 
$ ros2 run learning_parameter param_object_detect
$ ros2 param set param_object_detect red_h_upper 180

在启动的视觉识别节点中,我们故意将视觉识别中红色阈值的上限设置为0,如果不修改参数,将无法实现目标识别。
为了便于调整阈值,我们在节点中将红色阈值的限位修改为了ROS参数,通过命令行修改该参数的值,就可以实现视觉识别啦请添加图片描述

代码解析

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接口

完成代码的编写后需要设置功能包的编译选项,让系统知道Python程序的入口,打开功能包的setup.py文件,加入如下入口点的配置:

entry_points={
    'console_scripts': [
     'param_declare          = learning_parameter.param_declare:main',
     'param_object_detect    = learning_parameter.param_object_detect:main',
    ],
},

ROS 2中,LiDAR(光探测和测距)传感器的参数配置通常涉及多个方面,包括硬件驱动、数据采集频率、点云处理以及与其他传感器(如IMU)的同步。以下是一些与LiDAR相关的常见参数及其作用说明: ### LiDAR 驱动配置 LiDAR驱动负责从硬件设备获取原始数据并发布到ROS 2的话题系统中。以`livox_ros_driver2`为例[^1],其配置文件可能包含如下参数: - `device_type`: 指定使用的LiDAR类型,例如Livox Mid-360或Horizon。 - `frame_id`: 设置LiDAR数据的坐标系名称,通常是`laser`或具体的安装位置标识。 - `publish_freq`: 控制LiDAR数据发布的频率,单位为Hz。 - `port`: 如果使用网络接口连接LiDAR,则需要指定端口号。 - `xfer_format` 和 `multi_topic`: 决定点云数据是以单个还是多个话题形式发布。 ### 点云预处理参数 对于点云数据的预处理,可能会涉及到降采样、滤波等操作。这些参数可以在SLAM节点或者单独的数据处理节点中找到。例如,在`lidarslam_ros2`中可以设置: - `downsample_size`: 指定点云下采样的体素大小,用于减少计算量[^2]。 - `min_distance` 和 `max_distance`: 过滤掉距离过近或过远的点,避免无效数据干扰。 ### SLAM 节点参数 如果LiDAR用于SLAM(即时定位与地图构建),则还需要考虑SLAM算法本身的参数配置。这通常包括: - `map_resolution`: 地图的分辨率,影响最终生成的地图精度。 - `scan_matching_method`: 扫描匹配的方法选择,比如ICP(迭代最近点算法)或其他优化方法。 - `use_imu`: 是否启用IMU数据进行融合,提高定位稳定性。 ### 标定参数 当LiDAR与其他传感器(如相机)联合使用时,标定变得尤为重要。`direct_visual_lidar_calibration`工具可以帮助完成视觉和LiDAR之间的外参标定。相关参数可能包括: - `calibration_pattern`: 标定板的类型,如棋盘格。 - `pattern_size`: 标定图案的尺寸。 - `image_topic` 和 `pointcloud_topic`: 指定图像和点云的主题名称以便同步数据流。 ### 参数加载方式 在ROS 2中,可以通过多种方式来加载上述参数。一种是通过启动文件直接传递参数给节点;另一种是使用参数服务器,将所有参数存储在一个YAML文件中,并在启动时加载该文件。例如: ```yaml # example_params.yaml lidar_node: ros__parameters: device_type: "mid360" frame_id: "laser" publish_freq: 10.0 port: 55555 xfer_format: true multi_topic: false ``` 然后,在启动文件中引用这个YAML文件: ```python from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource from launch.substitutions import ThisLaunchFileDir def generate_launch_description(): ld = LaunchDescription() # 包含其他launch文件 lidar_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource([ThisLaunchFileDir(), '/lidar.launch.py']), launch_arguments={'params_file': 'path/to/example_params.yaml'}.items() ) return ld ``` ### 总结 以上提到的参数只是ROS 2中与LiDAR相关的部分配置项。实际应用中,根据具体的需求和技术方案,还可能存在更多细节性的参数需要调整。正确地配置这些参数能够显著提升系统的性能和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值