一、什么是参数
参数类似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官方相关文档