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 模型加载的流程
模型加载不是一步到位的,它有个清晰的流程。我把它总结成四个阶段:
- 解析阶段:读取YAML/XML文件,解析成内存中的数据结构。
- 验证阶段:检查参数是否合法,比如速度不能为负、半径不能为零。
- 实例化阶段:根据配置创建对应的对象,比如代价地图、规划器。
- 注册阶段:把创建好的对象注册到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模型加载的基础知识就聊到这儿。记住,模型加载是导航系统的地基,地基不稳,上层建筑再漂亮也没用。下一节我们会深入具体的模型文件怎么写,到时候我会拿实际项目中的例子给你演示。