ROS2教程 07 参数Param

本文详细介绍了ROS2中的参数管理系统,包括参数的定义、命令行工具ros2param的使用,如参数的获取、设置、删除和描述。此外,还展示了如何在ROS2中创建包含参数的功能包,以及如何在启动节点时配置参数,包括通过命令行和launch文件加载参数。

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

一、什么是参数

参数类似ROS中的全局字典,多个节点可以共享参数中的数据。
参数在ROS中以键-值对的形式存储,即字典中的一个名目对应一个值,可以通过访问参数名来获取参数值
在ROS1中,全局参数存储在ROSMASTER参数服务器中,(不知是否准确,后续作修改)
在ROS2中,参数属于节点,存储在节点中

二、ros2 param

ROS2 param下的命令有七条

  delete    Delete parameter
  describe  Show descriptive information about declared parameters
  dump      Dump the parameters of a node to a yaml file
  get       Get parameter
  list      Output a list of available parameters
  load      Load parameter file for a node
  set       Set parameter
ROS1的param
rosparam set 修改参数值 set parameter
rosparam get 获取参数 get parameter
rosparam load 加载参数文件 load parameters from file
rosparam dump 将参数保存到文件 dump parameters to file
rosparam delete delete parameter
rosparam list 显示当前的参数表 list parameter names

区别于ros1,多了一条 describe命令 Show descriptive information about declared parameters

① ros2 param list

输出当前的Param表,每个节点名后面跟的是这个节点的参数

ros2 param list
OUTPUT:
/teleop_turtle:
  scale_angular
  scale_linear
  use_sim_time
/turtlesim:
  background_b
  background_g
  background_r
  use_sim_time

② ros2 param get

输出节点Node的参数Param的数据类型Type以及它的值Value

ros2 param get <node_name> <parameter_name>
OUTPUT:
Integer value is: 86

③ ros2 param set

设置参数值

ros2 param set <node_name> <parameter_name> <value>

以修改海龟背景色为例

ros2 param set /turtlesim background_r 150
OUTPUT:
Set parameter successful

④ ros2 param dump

将节点Node的参数Param存储到文件

ros2 param dump <node_name>

以保存海龟节点的参数信息为例,将会自动保存到当前工作目录(存疑,因为没有找到)

ros2 param dump /turtlesim
OUTPUT:
/turtlesim:
  ros__parameters:
    background_b: 255
    background_g: 86
    background_r: 150
    qos_overrides:
      /parameter_events:
        publisher:
          depth: 1000
          durability: volatile
          history: keep_last
          reliability: reliable
    use_sim_time: false

保存到指定位置(但当前命令已经弃用,提示使用重定向)

ros2 param dump /turtlesim --output-dir /home/ubuntu2204/turtle_ws
OUTPUT:
WARNING: '--output-dir' is deprecated; use redirection to save to a file
Saving to:  /home/ubuntu2204/turtle_ws/turtlesim.yaml

⑤ ros2 param load

加载参数文件

ros2 param load <node_name> <parameter_file>

以加载海龟的配置参数文件为例

ros2 param load /turtlesim /home/ubuntu2204/turtle_ws/turtlesim.yaml
OUTPUT:
Set parameter background_b successful
Set parameter background_g successful
Set parameter background_r successful
Set parameter qos_overrides./parameter_events.publisher.depth failed: parameter 'qos_overrides./parameter_events.publisher.depth' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.durability failed: parameter 'qos_overrides./parameter_events.publisher.durability' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.history failed: parameter 'qos_overrides./parameter_events.publisher.history' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.reliability failed: parameter 'qos_overrides./parameter_events.publisher.reliability' cannot be set because it is read-only
Set parameter use_sim_time successful

因为只读参数只能在程序启动时修改,运行后不得修改,所以此处报错
在启动节点时一并加载相应的参数文件:

ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
ros2 run turtlesim turtlesim_node --ros-args --params-file /home/ubuntu2204/turtle_ws/turtlesim.yaml

此时成功加载文件,并且不会报只读参数的错

⑥ ros2 param delete

删除节点的某个参数

ros2 param delete <node_name> <parameter_name>

⑦ ros2 param describe

展示某个参数的描述性信息,这部分属于ros2新加的内容,一般参数都没有说明

ros2 param describe <node_name> <parameter_name>

三、建一个含参数的功能包

1.新建功能包

在工作空间src目录下

ros2 pkg create --build-type ament_python python_parameters --dependencies rclpy

2.新建文件

在功能包下的同名文件夹中新建python_parameters_node.py

gedit python_parameters_node.py

3.编写代码

import rclpy
from rclpy.node import Node # 导入rclypy
from rcl_interfaces.msg import ParameterDescriptor
class MinimalParam(Node):
    def __init__(self):
        super().__init__('minimal_param_node')
        timer_period = 2  # seconds
        self.timer = self.create_timer(timer_period, self.timer_callback) # 定时器
		
        my_parameter_descriptor = ParameterDescriptor(description='This parameter is mine!') # 写参数的描述,也可以对参数限制为只读,进一步了解请查阅文献
        self.declare_parameter('my_parameter', 'world', my_parameter_descriptor) #声明参数 (参数名,参数值,参数描述与限制[可选])

    def timer_callback(self): # 回调函数
        my_param = self.get_parameter('my_parameter').get_parameter_value().string_value # 获取参数值并存储在my_param中

        self.get_logger().info('Hello %s!' % my_param) # 打印my_param确保成功存储

        my_new_param = rclpy.parameter.Parameter(
            'my_parameter',
            rclpy.Parameter.Type.STRING,
            'world'
        )
        all_new_parameters = [my_new_param]
        self.set_parameters(all_new_parameters) # 确保每次回调都把参数my_parameter重新设置为world,避免用户外部修改

def main():
    rclpy.init()
    node = MinimalParam()
    rclpy.spin(node)

if __name__ == '__main__':
    main()

4.添加入口点

在setup.py中修改入口点部分

entry_points={
    'console_scripts': [
        'param_talker = python_parameters.python_parameters_node:main',
    ],
},

5.编译

colcon build --packages-select python_parameters

6.测试

ros2 run python_parameters param_talker

四、在启动节点时配置参数

1. 通过命令行启动时手动加载参数

先通过dump下载当前节点的配置文件,然后在启动时可以这样加载

ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
ros2 run turtlesim turtlesim_node --ros-args --params-file turtlesim.yaml

通过launch文件在启动节点时为其配置参数,参考此部分
ROS2官方相关文档

### ROS 2 参数使用与配置 #### 参数简介 在 ROS 2 中,参数是一种用于动态调整节点行为的方式。它们可以被设置、修改并实时更新,从而允许开发者灵活控制系统的运行状态[^1]。 #### 配置方式 可以通过多种途径来定义和加载参数: 1. **命令行传递参数** 使用 `ros2 run` 或 `ros2 launch` 启动节点时,可以直接通过命令行指定参数及其值。例如: ```bash ros2 run demo_nodes_cpp parameter_blackboard __params:='{"my_parameter": 42}' ``` 这种方法适用于简单的场景,但在复杂项目中可能不够直观[^1]。 2. **YAML 文件配置** YAML 是一种常用的结构化数据表示格式,在 ROS 2 中广泛应用于参数管理。创建一个 `.yaml` 文件并将参数写入其中,例如: ```yaml my_node: ros__parameters: my_int_param: 42 my_double_param: 3.14159 my_string_param: "hello" ``` 然后在启动文件(launch file)中引入该 YAML 文件即可完成参数加载。以下是 Python 和 XML 的两种实现方式: - **Python Launch File** ```python from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package="demo_package", executable="example_node", name="my_node", parameters=["path/to/my_params.yaml"] ) ]) ``` - **XML Launch File** ```xml <launch> <node pkg="demo_package" exec="example_node" name="my_node"> <param from="path/to/my_params.yaml"/> </node> </launch> ``` 3. **程序内部初始化** 如果需要更精细地控制参数生命周期或者依赖于某些逻辑判断,则可以在 C++ 或 Python 节点代码里手动声明和设定默认值。下面展示了一个基于类封装的 C++ 实现案例: ```cpp #include "rclcpp/rclcpp.hpp" class MyNode : public rclcpp::Node { public: explicit MyNode(const std::string &name) : Node(name){ this->declare_parameter<int>("my_int", 0); int value; this->get_parameter("my_int", value); RCLCPP_INFO(this->get_logger(), "Parameter 'my_int' set to %d.", value); } }; int main(int argc, char *argv[]) { rclcpp::init(argc, argv); auto node = std::make_shared<MyNode>("parameter_test"); rclcpp::spin(node); rclcpp::shutdown(); return 0; } ``` #### 动态参数更新机制 除了静态赋值外,还支持监听外部变化事件并通过回调函数响应这些更改操作。具体做法如下所示: ```cpp #include "rclcpp/rclcpp.hpp" class ParameterCallbackExample : public rclcpp::Node{ public: ParameterCallbackExample() : Node("set_parameters_callback"){ this->add_on_set_parameters_callback(std::bind(&ParameterCallbackExample::onSetParameters, this, _1)); } private: rcl_interfaces::msg::SetParametersResult onSetParameters(const std::vector<rclcpp::Parameter> &parameters){ rcl_interfaces::msg::SetParametersResult result; for(auto param : parameters){ if(param.get_name()=="max_velocity"){ double max_vel=param.as_double(); RCLCPP_INFO(get_logger(),"Max velocity updated:%lf",max_vel); result.successful=true; }else{ result.successful=false; } } return result; } }; int main(int argc,char* argv[]){ rclcpp::init(argc,argv); auto node=std::make_shared<ParameterCallbackExample>(); rclcpp::spin(node); rclcpp::shutdown(); } ``` 以上展示了如何注册自定义处理流程以便及时感知到任何潜在影响因素的变化情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值