参数
很多参数,比如相机的分辨率,端口号,opencv各种函数的阈值等。在很多节点里都需要去使用。
我们就必须有一个方法高效地管理参数
ROS2专门为我们提供了参数:
- 是全局共享的字典
- 采用键值对
- 可实现动态监控
查看和修改小海龟示例里的参数
依旧
bash
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key输入ros2 param按两次Tab查看提示:
bash
delete describe dump get list load set列举
列举所有参数:
bash
ros2 param list输出为节点+该节点的参数:
bash
/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列举出某个节点的参数在后面加上节点名称:
bash
ros2 param list /turtlesim输出的是该节点的参数
查看说明
用describe命令可以查看参数的说明:
bash
ros2 param describe /turtlesim background_b回车后显示:
bash
Parameter name: background_b
Type: integer
Description: Blue channel of the background color
Constraints:
Min value: 0
Max value: 255
Step: 1可以看出,参数名称叫做background_b,类型为整数,是背景的蓝色通道值,最小值和最大值也符合RGB定义
获取值
要获取具体的值,要使用get:
bash
ros2 param get /turtlesim background_b结果为:Integer value is: 255
所以默认的小海龟背景是蓝色
修改(设置)值
使用set:
bash
ros2 param set /turtlesim background_b 10终端显示Set parameter successful,可以发现背景颜色改变
配置文件处理
将参数全部打包到一个文件内:
bash
ros2 param dump /turtlesim >> turtlesim.yaml该目录下就会出现一个turtlesim.yaml:
yaml
/turtlesim:
ros__parameters:
background_b: 10
background_g: 86
background_r: 69
holonomic: false
qos_overrides:
/parameter_events:
publisher:
depth: 1000
durability: volatile
history: keep_last
reliability: reliable
start_type_description_service: true
use_sim_time: false这样我们就可以在yaml文件里直观地对参数进行修改了: 比如我们把第一个参数background_b改回255,然后保存文件 要想把修改后的参数加载回去,用load命令:
bash
ros2 param load /turtlesim turtlesim.yaml可以看到终端输出一大堆successful,背景重新变蓝色
参数的基本用法
python
import rclpy
from rclpy.node import Node
class ParameterNode(Node):
def __init__(self,name):
super().__init__(name)
self.timer = self.create_timer(2,self.timer_callback) # 创建一个定时器,每2秒调用一次回调函数
self.declare_parameter('robot_name','mbot') # 创建一个参数,并设置名称为‘robot_name’,默认值为'mbot'
def timer_callback(self):
robot_name_param = self.get_parameter('robot_name').get_parameter_value().string_value # 读取参数的值
self.get_logger().info(f'Hello {robot_name_param}')
new_name_param = relpy.parameter.Parameter('robot_name',rclpy.Parameter.Type.STRING,'mbot') # 重新将参数值设为默认值
all_new_parameters = [new_name_param]
self.set_parameters(all_new_parameters) # 改完参数后还要把它们放进列表里,然后调用set_parameters,这才把新的参数列表发送到ROS2全局
def main(args=None):
rclpy.init(args=args)
node = ParameterNode('param_declare')
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()