ROS2自学笔记:参数

参数为ROS2系统中的全局字典,类似于编程语言里的全局变量,具有以下特点:
1 全局共享字典
2 由键和值构成
3 可以动态监控,在一个程序里对参数的修改在其他程序里也会生效

在终端操作参数:
1 查询参数列表

ros2 param list

ROS2自学笔记:参数_第1张图片

2 获取参数描述

ros2 param describe (节点名) (参数名)

ROS2自学笔记:参数_第2张图片
3 获取参数

ros2 param get (节点名)(参数名)

4 修改参数

ros2 param set (节点名) (参数名)(设置值)

ROS2自学笔记:参数_第3张图片
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

在终端通过修改阈值即可手动选取要识别的颜色范围
ROS2自学笔记:参数_第4张图片

你可能感兴趣的:(实习记录,python,人工智能,机器学习,linux,opencv)