ROS加载yaml文件设置嵌套字典参数

本文深入探讨了ROS(Robot Operating System)中如何使用<rosparam>标签进行参数的加载与管理,包括如何定义和加载YAML文件中的参数,以及直接在XML中声明参数的方法。此外,还介绍了通过Python脚本获取这些参数的具体方式。

参考:https://answers.ros.org/question/197304/creatingparsing-a-dictionary-of-dictionary-params/

官网:http://wiki.ros.org/roslaunch/XML/rosparam

官网解读:

The load command is considered additive: if you declare a dictionary or namespace of parameters, those parameters will be added to any other parameters declared for that namespace. Similarly, load commands can override parameters previously declared.

The <rosparam> tag can either reference a YAML file or contain raw YAML text. If the YAML text defines a dictionary, the param attribute may be omitted.

<launch>
    <node pkg="beginner_tutorials" type="v1.py" name="" output="screen" respawn="true">
        <param name="launchpath" value="/home/haypin/pytest/launchdir"/>
        <rosparam command="load" file="$(find beginner_tutorials)/launch/mydict.yaml" />
        <rosparam param="a_list">[3,1,4,1,5,9,2,6]</rosparam>
    </node>
    <!-- <node pkg="beginner_tutorials" type="SubYamlOrder.py" name="tacticSub" output="screen" respawn="true"/> -->
</launch>
ob_extract: 
  board: 
    adjacent_dis_min: 0.1 
    len: 
      min: 0.2                
      max: 0.3                
if DEBUG:
    param_ob_extract = rospy.get_param("~ob_extract")  #~替代/node_name/,不用再加/
    print(type(param_ob_extract))             #已经是个Python字典dict了

 

<think>我们正在讨论如何在YAML文件中添加新参数。根据用户提供的引用,我们可以总结出几种常见的添加新参数的方法,具体取决于YAML文件的用途和读取方式。以下是几种常见场景的解决方案: ### 1. **直接编辑YAML文件添加参数** 这是最直接的方法,只需在YAML文件中按正确格式添加新的键值对。 **示例**: 假设原YAML文件内容如下: ```yaml # config.yaml server_ip: "192.168.1.100" port: 8080 ``` 要添加新参数`timeout`,修改后: ```yaml server_ip: "192.168.1.100" port: 8080 timeout: 30 # 新增参数 ``` **注意事项**: - 保持缩进一致(通常使用2个空格) - 确保键名唯一(YAML键名区分大小写) - 支持的数据类型:字符串、数字、布尔值、列表、字典等[^3] ### 2. **在程序运行时动态添加参数** 通过代码读取YAML文件后,以字典操作方式添加新参数(如Python): ```python import yaml # 读取现有配置 with open('config.yaml', 'r') as f: config = yaml.safe_load(f) # 添加新参数 config['new_param'] = "value" # 简单值 config['nested'] = {'key': 'subvalue'} # 嵌套结构 # 写回文件(可选) with open('config.yaml', 'w') as f: yaml.dump(config, f) ``` 这种方法适用于需要程序生成部分配置的场景[^1][^4]。 ### 3. **在ROS/ROS2系统中添加参数** 对于机器人操作系统(ROS),参数定义需符合特定规范: **ROS1示例**: ```yaml # 原有参数 camera_topic: "/camera/image_raw" # 新增参数 lidar_topic: "/lidar/scan" # 添加字符串参数 max_speed: 2.5 # 添加浮点参数 enable_debug: false # 布尔参数 ``` **ROS2参数规范**: - 参数值需明确类型(ROS2严格要求类型) - 可通过`rclpy`库在节点中声明参数[^3] ```yaml # ROS2参数文件示例 (node_params.yaml) your_node_name: # 节点名称 ros__parameters: existing_param: 10 new_string_param: "text" # 新增字符串参数 new_array_param: [1,2,3] # 新增整数数组 ``` ### 4. **参数化测试中的YAML参数添加** 在pytest数据驱动测试中,YAML用于存储测试用例: ```yaml # 原login.yaml - method: "POST" url: "/login" data: {"user": "test1", "pass": "123"} # 添加新测试参数 - method: "POST" url: "/login" data: {"user": "admin", "pass": "admin123"} # 新增用例 # 可添加新字段(需在测试代码中处理) expected_status: 200 # 新增断言字段 ``` 测试代码需相应调整以读取新字段[^4]。 ### 关键注意事项 1. **数据类型匹配**:确保添加的参数类型与程序预期一致(如ROS2对类型要求严格)[^3] 2. **层级结构**:嵌套参数需正确缩进(通常2空格) ```yaml # 正确嵌套 sensor: type: "LiDAR" resolution: 0.5 # 新增参数 ``` 3. **注释说明**:建议为新增参数添加注释说明用途 ```yaml max_retries: 3 # 最大重试次数(单位:次) ``` 4. **避免重复键名**:YAML文件内键名必须唯一(区分大小写) > **最佳实践**:修改YAML文件后,运行前验证语法: > - 在线校验工具:https://www.yamllint.com/ > - 命令行工具:`yamllint config.yaml` §§相关问题§§ 1. YAML文件中如何定义嵌套参数结构? 2. ROS2中如何通过代码动态注册新参数? 3. 如何验证YAML文件的语法正确性? 4. 在参数化测试中如何处理YAML文件的动态字段?</think>### 在 YAML 文件中添加新参数的完整指南 #### 1. **直接编辑 YAML 文件(最常用)** 在现有结构中直接添加新键值对,保持缩进一致: ```yaml # 原文件内容 server_ip: "192.168.1.100" port: 8080 # 添加新参数后 server_ip: "192.168.1.100" port: 8080 timeout: 30 # 新增参数 max_retries: 3 # 新增参数 ``` #### 2. **通过代码动态添加参数** 使用 Python 的 yaml 库读取-修改-保存: ```python import yaml # 读取现有配置 with open('config.yaml', 'r') as f: config = yaml.safe_load(f) # [^1] # 添加新参数 config['new_param'] = "value" # 简单值 config['nested'] = {'key': 'subvalue'} # 嵌套结构 # 写回文件 with open('config.yaml', 'w') as f: yaml.dump(config, f, sort_keys=False) # 保持原顺序 ``` #### 3. **ROS/ROS2 系统中的参数添加** 需符合 ROS 参数规范,包含类型描述: ```yaml # ROS2 参数文件示例 [^3] node_name: ros__parameters: existing_param: 10 new_string_param: "text" # 新增字符串参数 new_array_param: [1,2,3] # 新增整数数组 nested_param: # 新增嵌套参数 sub_param1: true sub_param2: 3.14 ``` #### 4. **参数化测试中的数据添加** 在测试用例 YAML 中添加新测试数据: ```yaml # login.yaml 测试数据 [^4] - test_name: "admin_login" method: "POST" url: "/login" data: {"user": "admin", "pass": "admin123"} # 原有参数 expected_code: 200 # 新增断言参数 - test_name: "new_user_login" # 全新测试用例 method: "POST" url: "/login" data: {"user": "guest", "pass": "12345"} ``` ### 关键注意事项 1. **数据类型匹配**: - 字符串:`name: "text"`(引号可选但推荐) - 数字:`timeout: 30`(无引号) - 布尔值:`enable: true`(true/false 小写) - 列表:`items: [a, b, c]` 或 多行格式 2. **嵌套参数结构**: ```yaml database: host: "db.example.com" port: 3306 credentials: # 新增嵌套组 user: "admin" password: "secret" ``` 3. **特殊字符处理**: - 包含冒号的值需加引号:`message: "Error: invalid input"` - 多行文本用 `|` 或 `>`: ```yaml description: | 这是多行文本 第二行内容 ``` ### 验证添加结果 使用 Python 快速验证: ```python import yaml with open('config.yaml') as f: print(yaml.safe_load(f)) # 检查新增参数是否解析正确 [^1] ``` > **最佳实践**:修改后运行关联程序测试参数是否生效(如 ROS 节点或 pytest 测试)[^3][^4]。对于团队项目,应在文档中记录新增参数的用途和默认值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值