我自己写了个.launch.py文件用于启动robot_localization的ekf_node

ekf_yaml = PathJoinSubstitution([
        FindPackageShare('start_robot_localization'),
        'config',
        'ekf.yaml'
    ])
    
node = Node(
    package='robot_localization',
    executable='ekf_node',
    name='ekf_robot_localization',
    output='screen',
    parameters=[ekf_yaml],
    remappings=[('/odometry/filtered','/odom_combined')]
)

但是不管怎么改ekf_taml的地址,我指定的那个yaml文件都没有被加载,
后来一直反复问ai改地址格式都没有用,突然ai提出了一个点“robot_localization 要求 yaml 的顶层节点名 必须等于节点名。“,这个点我从来没想过,于是我去看了下我ekf.yaml的第一行写的是什么,

### ekf config file ###
ekf_filter_node:
    ros__parameters:

前两行是这样的,第一行确实像是一个节点名,于是我将我的.launch.py中的node启动代码中的name修改为ekf_filter_node

node = Node(
    package='robot_localization',
    executable='ekf_node',
    name='ekf_filter_node',
    output='screen',
    parameters=[ekf_yaml],
    remappings=[('/odometry/filtered','/odom_combined')]
)

终于,再次运行的时候我的ekf.yaml参数被加载了。

后来去查了一下,这并不是robot_localization的要求,而是ros2的要求,
以下是Copilot给出的解释:
ROS2 YAML 参数规则
在 ROS2 中,YAML 文件常用于配置节点参数,方便管理和修改参数而无需重新编译代码。以下是 ROS2 中 YAML 参数的基本规则和使用方法:

1. YAML 文件的基本格式
YAML 文件的格式需要遵循以下规则:

使用缩进表示层级关系(通常为两个空格)。
键值对以 key: value 的形式表示。
字符串可以加引号(单引号或双引号),也可以不加引号。
支持布尔值、数字、列表等多种数据类型。

示例:
my_node:
  ros__parameters:
    param1: "Hello, ROS2"
    param2: 42
    param3: true
    param_list:
      - 1
      - 2
      - 3


2. ROS2 参数命名规则

节点名称:顶层键为节点名称。
ros__parameters:固定关键字,表示该节点的参数集合。
参数名称:参数名可以是任意字符串,但建议使用有意义的名称,避免特殊字符。


3. 加载 YAML 文件的方式
YAML 文件可以通过 ROS2 的 launch 文件加载,或者直接在命令行中指定。
通过 Launch 文件加载
在 launch.py 文件中,可以使用 Node 的 parameters 参数加载 YAML 文件:
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='my_package',
            executable='my_node',
            name='my_node',
            parameters=['config/my_params.yaml']
        )
    ])

通过命令行加载
可以在运行节点时通过 --ros-args 指定 YAML 文件:
ros2 run my_package my_node --ros-args --params-file config/my_params.yaml


4. 支持的数据类型
ROS2 参数支持以下数据类型:

标量:字符串、整数、浮点数、布尔值。
数组:列表形式的标量值。
嵌套结构:可以通过嵌套 YAML 表示复杂的参数结构。

示例:
my_node:
  ros__parameters:
    string_param: "example"
    int_param: 10
    float_param: 3.14
    bool_param: false
    list_param: [1, 2, 3]
    nested_param:
      sub_param1: "nested"
      sub_param2: 100


5. 注意事项

缩进:YAML 文件对缩进敏感,务必保持一致。
文件路径:确保 YAML 文件路径正确,尤其在团队协作或跨平台时。
参数覆盖:命令行参数会覆盖 YAML 文件中的参数。

通过 YAML 文件管理参数,可以极大地提升 ROS2 应用的灵活性和可维护性!
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐