参数为ROS2系统中的全局字典,类似于编程语言里的全局变量,具有以下特点:
1 全局共享字典
2 由键和值构成
3 可以动态监控,在一个程序里对参数的修改在其他程序里也会生效
在终端操作参数:
1 查询参数列表
ros2 param list
2 获取参数描述
ros2 param describe (节点名) (参数名)
3 获取参数
ros2 param get (节点名)(参数名)
4 修改参数
ros2 param set (节点名) (参数名)(设置值)
5 保存参数
保存一个节点全部参数
ros2 param dump (节点名)
如果要保存参数到另一个文件,可以使用重定向将终端信息保存到一个yaml文件里(参数文件类型为yaml)
ros2 param dump (节点名) >> (文件名).yaml
6 读取参数
将一个节点所有参数设为保存的参数文件里的值
ros2 param load (节点名)(参数文件)
示例1
在程序中创建,读取,修改参数
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)
self.declare_parameter('robot_name', 'mbot')
def timer_callback(self):
robot_name_param = self.get_parameter('robot_name').get_parameter_value().string_value
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)
def main(args=None):
rclpy.init(args=args)
node = ParameterNode("param_declare")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
1 self.timer = self.create_timer(2, self.timer_callback)
创建定时器,每隔1秒执行self.timer_callback函数
2 self.declare_parameter(‘robot_name’, ‘mbot’)
创建参数,名称robot_name,值为mbot (参数为键-值对)
3 robot_name_param = self.get_parameter(‘robot_name’).get_parameter_value().string_value
使用get_parameter(‘robot_name’)读取robot_name参数,再利用get_parameter_value()读取参数该键对应值,最后使用string_value读取String值
4 self.get_logger().info(“Hello %s !” % robot_name_param)
把参数值打印到终端
5 new_name_param = rclpy.parameter.Parameter(‘robot_name’, rclpy.Parameter.Type.STRING, ‘mbot’)
rclpy.parameter.Parameter修改参数值,该函数参数为:参数名,参数数据类型,参数值
6 all_new_parameters = [new_name_param]
self.set_parameters(all_new_parameters)
更新参数列表并上传至ROS2系统
示例2
利用参数动态调节图像处理阈值
(图像处理主体函数可以参考https://blog.csdn.net/Raine_Yang/article/details/125349724?spm=1001.2014.3001.5501)
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import numpy as np
lower_red = np.array([0, 90, 128])
upper_red = np.array([180, 255, 255])
class ImageSubscriber(Node):
def __init__(self, name):
super().__init__(name)
self.sub = self.create_subscription(Image, 'image_raw', self.listener_callback, 10)
self.cv_bridge = CvBridge()
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)
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)
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)
cv2.waitKey(10)
def listener_callback(self, data):
self.get_logger().info('Receiving video frame')
image = self.cv_bridge.imgmsg_to_cv2(data, 'bgr8')
self.object_detect(image)
def main(args=None):
rclpy.init(args=args)
rclpy.ImageSubscriber("param_object_detect")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
1 self.declare_parameter(‘red_h_upper’, 0)
self.declare_parameter(‘red_h+lower’, 0)
创建参数red_h_upper和red_h_lower,初始值为0
2 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
将阈值上下限里面红色的值分别赋为red_h_lower,red_h_upper
在终端通过修改阈值即可手动选取要识别的颜色范围