项目任务是在有障碍的室内地图中,从起点到达目标;已知障碍变化时重新规划,并说明每一层使用的数据。先做可检查的小模型,再接入完整系统,能把规划、跟踪、定位和通信错误分开。
先运行随附实验
下载navigation_lab.py,使用Python 3运行,不需要第三方库:
python navigation_lab.py
它在26×20格、每格0.25米的地图上做四邻接A*。底盘抽象为半径0.12米的圆盘,障碍再做一格保守膨胀。输出路径由一个有限线速度/角速度的差速运动学控制器跟踪,控制器每步读取理想当前位置和朝向,并对误差反馈。之后在路径上的指定状态加入两个已知障碍格,更新地图后重新规划。
控制器先朝向下一路点,再根据朝向误差和距离限制速度;接近路点时减速。它会逐步检查中心点是否进入膨胀障碍,并设置最大步数,避免无限循环。控制周期0.02秒,线速度上限0.45米/秒,角速度上限2弧度/秒。
2026-10-24在Python 3.12.14执行,两个场景均到达目标,检查结果如下。
| 场景 | 路径边数 | 仿真时间 | 终点误差 |
|---|---|---|---|
| 静态地图 | 32 | 36.12 s | 0.0250 m |
| 更新障碍后,从新状态重规划 | 29 | 35.74 s | 0.0238 m |
原始检查记录包含行驶距离和步数。第二行的起点已经前进了五个路径节点,所以边数与时间不能和第一行直接比较优劣。这里的时间是累计仿真时间,不是程序运行耗时。
**本实验假设完整地图、理想位姿和已知新增障碍。**没有模拟激光、编码器、IMU、SLAM、延迟或轮胎打滑,未运行Nav2,也没有真机碰撞测试。因此只能证明这两个小模型场景中,规划、更新与运动学跟踪按脚本完成。
把每一层替换成ROS 2接口
完整Nav2分支按以下顺序集成,具体安装与启动文件使用目标发行版的官方首次配置指南,不要混用旧Gazebo Classic教程与现代Gazebo配置。
- 机身与传感器:确定轮径、轮距、碰撞外形、激光位置及单位;发布机身到传感器的固定TF和关节状态。先验证转向符号及外形,而非直接启动导航。
- 里程计与时间:提供带时间的里程计和
odom→base_link;检查运动方向、速度、协方差、仿真时钟和TF缓存。融合IMU时避免重复融合同源信息。 - 地图与定位:先用SLAM建图并保存,再用已有地图定位,或明确选择边建图边导航。
map→odom由所选定位/SLAM模块提供。启动位置不确定时先完成定位初始化。官方建图与定位说明列出这两个流程。 - 代价地图与规划:配置静态、障碍与膨胀层,核对观测源、清除逻辑、量程和未知区策略;选择适合底盘运动约束的规划器,确认路径不会穿过狭窄但实际上无法通过的区域。
- 控制与任务:将路径交给跟踪控制器,设置速度/加速度、进度与到达条件,再由行为树管理重规划与恢复。动作结果、取消及停止确认按任务执行章节记录。
若规划出来但不动,先检查生命周期状态、action反馈、速度命令类型、控制器接口与超时。若来回振荡,检查定位/时间、路径形状、障碍余量、速度和控制参数,不能先把到达容差无限放大。
两级验收
数值模型的练习包括增加机器人半径、减小通道宽度、改变角速度上限、把新增障碍放在目标旁。每次记录规划是否可行、控制是否超时、最小余量与终点误差。对离散碰撞检查的采样分辨率要保留说明,不能据此声称连续安全保证。
Nav2集成应另存配置、地图、场景、版本、rosbag与任务日志,测试多个起终点、动态障碍、定位失效、传感器暂停、无路及取消任务。明确到达率、碰撞判据、规划/控制周期、恢复次数和停止延迟。该分支和实物步骤尚未执行;完成时应新增实测记录,而不是沿用本页小模型的数字。