改进D*算法动态路径规划仿真系统
项目简介
本项目实现了一套基于 D* Lite 算法(代码中体现为改进的D*逻辑)的动态路径规划仿真系统。该系统模拟了移动机器人在栅格地图中从起点向终点导航的过程。与传统的静态路径规划算法(如A*)不同,本系统能够应对环境的动态变化。当机器人在移动过程中检测到路径上出现新增障碍物时,算法利用增量搜索特性(Incremental Search)进行局部重规划,快速修正路径,而无需重新计算全局地图,从而极大地提高了实时性和计算效率。
功能特性
- 栅格地图建模:构建了30x30的二维栅格环境,支持静态障碍物(墙体)的预设。
- D* Lite 核心算法:实现了基于
G 值和 RHS 值的增量搜索逻辑,使用双键值(Key)优先队列管理搜索节点。 - 动态环境仿真:模拟机器人在移动过程中探测到未知障碍物的情景(代码设定在第5步触发),并在可视化界面中实时更新地图。
- 高效局部重规划:利用
Km 变量累积机器人移动带来的启发式偏差,仅更新受障碍物影响的节点及其邻居,实现快速避障。 - 实时可视化:动态展示地图、障碍物、当前规划的路径以及机器人的实时位置,并统计重规划耗时。
- 8邻域移动:支持机器人向周围8个方向移动,区分直线移动代价(10)和对角线移动代价(14)。
系统要求
- MATLAB R2016b 或更高版本
- 无需额外工具箱,使用MATLAB基础绘图库
使用方法
- 确保工作目录中包含主程序脚本及相关辅助函数。
- 直接运行主程序脚本。
- 系统将自动弹出一个图形窗口:
* 首先进行初始全局路径规划并显示路径。
* 随后机器人开始向目标移动。
* 当机器人移动到一定步数(第5步)时,路径前方会自动生成动态障碍物。
* 系统将自动检测变化,触发重规划,并引导机器人绕过新障碍物到达终点。
- 控制台将输出规划耗时、动态障碍物检测信息及总步数。
实现逻辑与代码分析
本项目通过MATLAB脚本实现了完整的仿真流程,具体的实现逻辑如下:
1. 环境与参数初始化
程序首先定义了一个30x30的二维矩阵作为地图(0表示空地,1表示障碍物)。预设了部分静态墙体障碍物。初始化 D* Lite 算法所需的关键数据结构,包括:
- G矩阵:存储从特定节点到目标点的当前估计代价。
- RHS矩阵:基于前驱节点计算的一步Lookahead代价值。
- 优先队列 (U):使用结构体数组模拟Open List,按键值排序,用于管理待扩展节点。
- Km:累积移动代价修正值,用于在机器人位置变化时维持启发式函数的一致性,避免重新计算所有Key值。
初始状态下,终点的
RHS 被设为0,并加入优先队列,算法执行反向搜索(从终点向起点规划)。
2. 初始全局规划
调用核心路径计算函数
ComputeShortestPath。该阶段假设地图环境已知,计算出一条从起点到终点的无碰撞最优路径。计算完成后,通过回溯
G 值提取出初始路径并在界面上绘制。
3. 机器人移动与动态仿真循环
进入
while 循环,只要机器人未到达终点,程序将持续运行:
- 贪婪移动:机器人扫描周围8个邻居,根据
edge_cost + G(neighbor) 寻找最小代价值的节点作为下一步位置。 - Km更新:机器人每移动一步,计算原位置与新位置之间的启发式距离差,并累加到
Km 中,以保证后续重规划时优先队列中节点的Key值有效性。 - 动态障碍物触发:代码中硬编码了一个触发条件,当
step_count == 5 时,在机器人当前规划路径的前方(约第4个节点处)生成一组新的障碍物。 - 局部重规划检测:一旦检测到新障碍物:
1. 更新地图矩阵,将对应坐标设为障碍物。
2. 识别受影响的节点(新障碍物本身及其邻居)。
3. 将受影响节点的
RHS 值设为无穷大(或重新计算),并将它们重新插入优先队列。
4. 再次调用
ComputeShortestPath。此时算法仅会扩展受影响路径段涉及的节点,而非重构整张图。
4. 核心算法函数(ComputeShortestPath)
这是 D* Lite 算法的核心松弛过程。函数主要逻辑如下:
- 不断从优先队列
U 中取出Key值最小的节点 u。 - 比较该节点的 Key 与起点的 Key,以及检查起点的
RHS 是否等于 G(一致性检查)。 - Overconsistent (G > RHS):表示找到了更短路径,更新
G = RHS,并传播更新给邻居节点。 - Underconsistent (G < RHS):通常发生在障碍物出现导致路径变长或阻断时。将
G 设为无穷,并将该节点及邻居重新加入队列进行后续修正。
5. 键值计算 (CalculateKey)
实现了 D* Lite 的 Key 计算标准:
- k1 = min(G, RHS) + 启发式距离(h) + Km
- k2 = min(G, RHS)
Key 用于确定扩展节点的优先级,确保在环境变化后,算法能优先处理最有希望找到最优解的节点。
6. 数据可视化
程序通过
DrawMap(代码中调用,逻辑隐含)实时刷新图像。使用了
imagesc 或类似的矩阵绘图方式展示地图网格,不同颜色代表空地、障碍物和路径。标题栏实时显示当前步数和重规划所消耗的时间,直观反映算法性能。