parameter/argument-两大参数

参数

每个结点都有参数,且以字典的形式存储
使用参数而不是程序中的变量的好处是可以动态修改关键值,而不需要重新编译代码,特别适合调试

ros2 param
ros2 param list        列出当前运行结点的参数列表
ros2 param get <node> <param>获取某个结点的某个参数值
ros2 param set <node> <param>设置某个结点的某个参数值
ros2 param dump <node>打印某个结点的所有参数
ros2 param dump <node> >> xxx.yaml将结点的参数全部保存到文件
ros2 param load <node> xxx.yaml将参数文件值应用到node中
ros2 param describle <node> <param>查看某节点参数的含义

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):                                 # ROS2节点主入口main函数
    rclpy.init(args=args)                            # ROS2 Python接口初始化
    node = ParameterNode("param_declare")            # 创建ROS2节点对象并进行初始化
    rclpy.spin(node)                                 # 循环等待ROS2退出
    node.destroy_node()                              # 销毁节点对象
    rclpy.shutdown()                                 # 关闭ROS2 Python接口

import rclpy                      # ROS2 Python接口库
from rclpy.node import Node       # ROS2 节点类
from sensor_msgs.msg import Image # 图像消息类型
from cv_bridge import CvBridge    # ROS与OpenCV图像转换类
import cv2                        # Opencv图像处理库
import numpy as np                # Python数值计算库

lower_red = np.array([0, 90, 128])     # 红色的HSV阈值下限
upper_red = np.array([180, 255, 255])  # 红色的HSV阈值上限

"""
创建一个订阅者节点
"""
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(50)
       
  def listener_callback(self, data):
    self.get_logger().info('Receiving video frame')     # 输出日志信息,提示已进入回调函数
    image = self.cv_bridge.imgmsg_to_cv2(data, "bgr8")  # 将ROS的图像消息转化成OpenCV图像
    self.object_detect(image)                            # 苹果检测
  
def main(args=None):                                    # ROS2节点主入口main函数
    rclpy.init(args=args)                               # ROS2 Python接口初始化
    node = ImageSubscriber("param_object_detect")       # 创建ROS2节点对象并进行初始化
    rclpy.spin(node)                                    # 循环等待ROS2退出
    node.destroy_node()                                 # 销毁节点对象
    rclpy.shutdown()                                    # 关闭ROS2 Python接口

先声明参数字典-获取参数值使用-终端更新参数值
 

parameter-结点级参数

定义:结点的编写过程中就进行参数定义:本质上属于结点的内容参数

赋值:在结点内赋默认初值,在laucn封装节结点时可重新赋值

应用:常规应用场景比如:修改A*算法的启发式权重值 H_weight : 1.0

argument-命令级参数

定义:launch文件的编写过程中参数定义赋值:本质上属于结点的启动参数

使用:使用LaunchConfiguration 通过键来获取值如作为路径拼接的一环

应用:常规应用场景比如:修改Rviz启动时的配置文件   -d xxx.rviz

《parameter》

# 编写结点时声明​并赋默认值
self.declare_parameter('my_int_param', 42)  # 声明并赋值参数
self.get_parameter('my_int_param').value    # 获取其值来使用
​
# 编写launch时赋予其新的值
 Node(
        package="my_pkg",
        executable="my_node",
        parameters=[{"my_int_param": 42},{"my_str_param": "hello"}]
      )

from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration

# 在launch文件中参数声明
arg_model = DeclareLaunchArgument(
    name='model',                   # 参数名
    default_value='default.urdf',   # 默认值
    description='URDF 文件路径'      # 描述
)

# 在launch文件中参数使用
LaunchConfiguration(‘model’)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值