3、Nav2模型加载基础:什么是导航模型、模型文件的类型、模型加载的流程、模型加载的配置文件

好,咱们正式开始聊Nav2的模型加载。说实话,我刚接触ROS2导航那会儿,也被这一堆.yaml、.xml、.bt文件搞得有点懵。你想想看,一个机器人要动起来,背后得有多少模型在支撑?今天我就带你把这些「模型」的门道捋清楚。

3.1 什么是导航模型?

导航模型,说白了就是机器人的「大脑地图」和「行为手册」。它不是指机器人长得像什么,而是指机器人如何理解环境、如何规划路径、如何执行动作。

我个人习惯把导航模型分成三类:

  • 环境模型:描述机器人周围的世界,比如地图、障碍物、可行区域。
  • 机器人模型:描述机器人自身的尺寸、形状、运动能力。
  • 行为模型:描述机器人应该做什么、怎么做,比如避障、规划、控制。

我在项目中遇到过一个问题:有个同学把机器人模型尺寸写错了,结果导航时机器人总以为自己能钻过很窄的缝隙,结果撞墙了。嗯,这就是模型没搞对。

核心要点:导航模型是连接传感器数据与运动控制的桥梁。没有模型,机器人就是个瞎子。

3.2 模型文件的类型

Nav2里常见的模型文件有三种格式,每种都有自己的用途。我按使用频率给你排个序:

文件类型 扩展名 主要用途 我常用的场景
YAML .yaml 配置参数、地图数据 机器人参数、代价地图配置
XML .xml 机器人描述、插件配置 URDF模型、插件加载
行为树 .bt 导航行为逻辑 导航流程控制

3.2.1 YAML 文件

YAML是Nav2里最常见的配置文件格式。它的特点是可读性好,写起来也方便。我一般用它来配置:

  • 机器人底盘参数(尺寸、速度限制)
  • 代价地图参数(膨胀半径、障碍物层)
  • 规划器参数(A*权重、路径平滑度)

举个例子,一个简单的机器人参数配置:

robot_radius: 0.18
footprint: [[-0.25, -0.25], [-0.25, 0.25], [0.25, 0.25], [0.25, -0.25]]
inflation_radius: 0.55
cost_scaling_factor: 10.0

你看,这些参数直接决定了机器人怎么走、怎么避障。我曾经因为把inflation_radius设得太小,结果机器人贴着墙走,差点卡住。

3.2.2 XML 文件

XML在Nav2里主要用来描述机器人的物理结构,也就是URDF(Unified Robot Description Format)。它定义了机器人的连杆、关节、传感器位置。

我建议你至少写一个简单的URDF,哪怕只是个圆形底盘。因为导航时需要知道机器人的实际轮廓,不然代价地图没法正确计算。

<robot name="my_robot">
  <link name="base_link">
    <collision>
      <geometry>
        <cylinder radius="0.18" length="0.2"/>
      </geometry>
    </collision>
  </link>
</robot>

3.2.3 行为树文件

行为树(Behavior Tree)是Nav2里最酷的东西。它用树状结构来描述导航的「决策逻辑」。比如:先定位,再规划路径,然后控制移动,遇到障碍就绕行。

我记得第一次看到行为树文件时,觉得它像流程图。后来用多了才发现,它比流程图灵活得多。你可以动态地组合、复用节点。

小技巧:如果你刚开始接触行为树,建议先看Nav2自带的navigate_to_pose.bt文件。它包含了最基础的导航流程。

3.3 模型加载的流程

模型加载不是一步到位的,它有个清晰的流程。我把它总结成四个阶段:

  1. 解析阶段:读取YAML/XML文件,解析成内存中的数据结构。
  2. 验证阶段:检查参数是否合法,比如速度不能为负、半径不能为零。
  3. 实例化阶段:根据配置创建对应的对象,比如代价地图、规划器。
  4. 注册阶段:把创建好的对象注册到Nav2的插件系统中,供后续使用。

这里我画了一张流程图,帮你直观理解:

解析阶段 验证阶段 实例化阶段 注册阶段 失败则返回解析阶段重新加载 Nav2 模型加载流程图

你看,这个流程是环环相扣的。任何一个阶段出问题,模型都加载不成功。我调试时经常卡在验证阶段,比如参数类型写错了,YAML里把浮点数写成了字符串。

注意:验证阶段最容易出问题。我曾经因为YAML里多了一个空格,导致整个导航系统启动失败。建议用yaml-cpp的校验工具先检查一遍。

3.4 模型加载的配置文件

Nav2的模型加载依赖一个核心配置文件,通常叫nav2_params.yaml。这个文件里定义了所有模型的行为和参数。

我一般把它分成几个部分:

  • 全局规划器:路径规划算法、权重、启发式函数
  • 局部规划器:速度控制、避障策略、轨迹跟踪
  • 代价地图:地图层配置、膨胀参数、传感器融合
  • 行为树:导航流程、恢复行为、超时设置

给你看一个简化版的配置示例:

planner_server:
  ros__parameters:
    planner_plugins: ["GridBased"]
    GridBased:
      plugin: "nav2_navfn_planner/NavfnPlanner"
      tolerance: 0.5
      use_astar: false

controller_server:
  ros__parameters:
    controller_plugins: ["FollowPath"]
    FollowPath:
      plugin: "nav2_regulated_pure_pursuit_controller/RegulatedPurePursuitController"
      desired_linear_vel: 0.5
      max_linear_accel: 2.5

嗯,这里要注意:每个插件都有自己的参数,你得去查对应的文档。我刚开始时总以为参数名是通用的,结果配了半天机器人不动。

我的习惯:每次修改配置文件后,先用ros2 param dump看看实际加载的参数值,确认和预期一致。这能省下不少调试时间。

好了,关于Nav2模型加载的基础知识就聊到这儿。记住,模型加载是导航系统的地基,地基不稳,上层建筑再漂亮也没用。下一节我们会深入具体的模型文件怎么写,到时候我会拿实际项目中的例子给你演示。

可可精品资料库