介绍
ROS2中的参数是单个节点相关联的,当我们新建一个节点的时候,通常需要在启动文件中为该节点添加参数。通过配置参数,我们在启动节点的时候可以无需更改节点代码。
通过本文可以快速了解ros2中的参数相关功能,从零在python类中创建ros2参数,并在启动文件中设置该参数。
创建步骤
体验官方案例
- 运行节点
$ ros2 run turtlesim turtlesim_node $ ros2 run turtlesim turtle_teleop_key
- 通过 param list 查看节点的参数
从结果可以参考背景色的 r g b可以通过参数来设置。/teleop_turtle: qos_overrides./parameter_events.publisher.depth qos_overrides./parameter_events.publisher.durability qos_overrides./parameter_events.publisher.history qos_overrides./parameter_events.publisher.reliability scale_angular scale_linear start_type_description_service use_sim_time /turtlesim: background_b background_g background_r holonomic qos_overrides./parameter_events.publisher.depth qos_overrides./parameter_events.publisher.durability qos_overrides./parameter_events.publisher.history qos_overrides./parameter_events.publisher.reliability start_type_description_service use_sim_time
- 获取、设置参数
$ ros2 param get /turtlesim background_g Integer value is: 86 $ ros2 param set /turtlesim background_g 150 Set parameter successful
background_g=86 background_g=150 - 保存、加载节点参数
保存参数: $ ros2 param dump /turtlesim > turtlesim.yaml 加载参数: $ ros2 param load /turtlesim turtlesim.yaml
基于python开发参数案例
- 创建python_parameters包
继续前几篇ros2博文,当前工作目录依旧为dev_ws $ cd dev_ws/src $ ros2 pkg create --build-type ament_python --license Apache-2.0 python_parameters --dependencies rclpy 注意: 此处使用了 --dependencies rclpy ,因此不需要在 package.xml 中单独增加依赖
- 在dev_ws/src/python_parameters/python_parameters中新增参数节点python文件
vim python_parameters_nodeimport rclpy import rclpy.node class MinimalParam(rclpy.node.Node): def __init__(self): super().__init__('minimal_param_node') self.declare_parameter('my_parameter', 'world') self.timer = self.create_timer(1, self.timer_callback) def timer_callback(self): my_param = self.get_parameter('my_parameter').get_parameter_value().string_value self.get_logger().info('Hello %s!' % 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) def main(): rclpy.init() node = MinimalParam() rclpy.spin(node) if __name__ == '__main__': main()
- 在 setup.py中新增 entry point
entry_points={ 'console_scripts': [ 'minimal_param_node = python_parameters.python_parameters_node:main', ], },
- 在dev_ws/src/python_parameters/launch 中新增节点启动python文件
vim python_parameters_launch.py
在 setup.py 中 data_files 新增如下内容,使其能够包括所有的启动文件from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='python_parameters', executable='minimal_param_node', name='custom_minimal_param_node', output='screen', emulate_tty=True, parameters=[ {'my_parameter': 'earth'} ] ) ])
import os from glob import glob # ... setup( # ... data_files=[ # ... (os.path.join('share', package_name), glob('launch/*launch.[pxy][yma]*')), ] )
- 构建 & 运行
输出结果:构建 $ cd dev_ws $ colcon build --packages-select python_parameters 运行 $ source install/setup.bash $ ros2 run python_parameters minimal_param_node $ ros2 param set /minimal_param_node my_parameter earth 也可以通过launch脚本启动 $ ros2 launch python_parameters python_parameters_launch.py
默认输出 Hello world, 设置my_parameter earth后输出 Hello earth ,随后定时任务又将其更新为 Hello world,符合预期
launch 脚本启动:
注意事项
- 待添加
说明
软件版本
ubuntu24.04 Desktop
ros2 jazzy
python 3.12.4(conda)
参考文档
ros官方文档 Beginner-Client-Libraries/Using-Parameters-In-A-Class-Python
ros官方文档 jazzy/Concepts/Basic/About-Parameters