• ROS2自学笔记:参数


    参数为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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    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

    在终端通过修改阈值即可手动选取要识别的颜色范围
    在这里插入图片描述

  • 相关阅读:
    自动化控制系统的设计重点是什么?
    第七十一天 来道水题得了
    中国人保为正华消防承保产品责任险,为消费者保驾护航!
    python采集小破站视频弹幕
    Vue3 Diff算法之最长递增子序列,学不会来砍我!
    redis 实现互相关注功能
    小物体的目标检测的研究综述
    Raymarching(光线步进)基础
    AWS SAP-C02考试题库
    【网络是怎样连接的】第五章 探索服务器
  • 原文地址:https://blog.csdn.net/Raine_Yang/article/details/125619852