
机械臂路径规划算法(一)
前言
机械臂路径规划算法是机器人运动控制的核心技术之一,主要目的是在复杂环境中为机械臂规划出安全、高效的运动轨迹。根据算法原理的不同,主要可分为以下三类:
- 传统路径规划算法
- 智能路径规划算法
- 基于采样的路径规划算法
这节笔记主要讲述传统路径规划算法有哪些,对这些算法进行基本描述与总结
一、基于图搜索的算法
通过将环境建模为图结构(如栅格、路标点)进行路径搜索,追求全局最优或次优解。
配置空间(Configuration Space)这个概念。在实际环境,也就是机器人的工作空间(Workspace)中,机器人是有形状和大小的,这不利于进行运动规划。要将工作空间转换到配置空间中,即将机器人转化为一个质点,同时将障碍物按照机器人的体积进行膨胀,如下图:
**1. 广度优先搜索(**Breadth First Search,BFS)
- 原理:逐层遍历所有相邻节点,直到找到目标节点。
- 特点:
- 保证找到最短路径,但效率低。
- 适用于小规模栅格地图。
为了实现波状推进搜索特性,BFS采用**队列(Queue)作为openlist的数据结构。队列是一种先进先出(FIFO)**的容器,如下图
过程如下,首先创建一个队列作为容器,将节点a
加入队列
接着将节点a
弹出队列,将节点a
周围没有访问过的节点加入队列
按照上面的流程不断地弹出、扩展节点,直到找到节点i
为止,完整流程如下图:
从终点回溯,i
的父节点为f
,f
的父节点为e
,e
的父节点为a
,这样就可以得到a
到i
的最短路径为:a
->e
->f
->i
,如下
显而易见,相较于DFS,BFS中使用了大量的入队、出队操作,耗时增加,但是能保证找到最优路径。
2. 深度优先搜索(Depth First Search,DFS)
- 原理:沿分支尽可能深入搜索,回溯后继续其他分支。
- 特点:
- 不保证最优解,可能陷入死循环,但内存占用低。
- 适用于路径存在性验证。
DFS能够快速地找到一条路径,是一种以时间换空间的方法。将其应用到二维地图的路径规划中,如下图,很显然找到的路径并不是移动机器人运动规划所需要的最优路径
深度优先,顾名思义即深度越大的节点会被优先扩展。在DFS中,使用**栈(Stack)**数据结构来实现上述特性。
栈是一种**后进先出(LIFO)**的容器,如下图
以在下面的无权图中找到从节点a
到节点i
的路径为例,说明一下DFS算法的工作流程
按照上节的图搜索算法的基本流程进行搜索,过程如下:
从i
回溯得到路径:a
->b
->c
->g
->i
,如下:
3. Dijkstra算法(狄克斯特拉算法)
- 原理:从起点出发,逐步扩展到距离最短的未访问节点,更新邻节点代价。
- 特点:
- 全局最优,但计算量大。
- 适用于静态环境全局规划(如仓储机器人)。
以下图为例,计算起点a到终点i的最短路径,箭头上的数值表示两个节点间的距离
首先扩展第一个节点,计算其余节点与第一个节点的距离,用橙色标出已经扩展的节点,未扩展的节点仍用绿色标出,其中圆中的数值表示该节点的代价函数,字母则表示该节点没有直接到达此时已扩展节点的路径。从未扩展的节点(绿色节点)中选择代价函数最小的节点进行拓展,并更新其余节点的代价函数,如下图
重复进行上面的步骤,直到所有节点都已扩展。
最后标出起点到终点的最短路径
将Dijkstra算法应用到二维地图路径规划中,如下图,可以看到Dijkstra算法能够得到最优路径,但是它的速度和BFS是一样的,采取的都是稳扎稳打、波状前进的方式,导致速度较慢。
4. A*算法
- 原理:结合Dijkstra的实际代价和启发式估计,优化搜索方向。
- 特点:
- 启发函数需满足可采纳性(如曼哈顿距离)。
- 效率高于Dijkstra,广泛应用于游戏和无人机路径规划。
- 变种:
- D*(动态A)*:支持动态环境下的增量式重规划。
- Weighted A*:牺牲最优性以提升速度(f(n)=g(n)+w⋅h(n)f(n)=g(n)+w⋅h(n))。
将A*算法应用到二维地图路径规划中,如下图:
5. 其他图搜索算法
- Floyd-Warshall算法(多源最短路径–弗洛伊德):计算所有节点对之间的最短路径,适用于多目标规划。Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
- Bellman-Ford算法:支持负权边的最短路径搜索,复杂度 O(n⋅m)O(n⋅m)(mm为边数)。
二、基于栅格的规划算法
将环境离散化为栅格单元,通过栅格状态(自由/障碍)规划路径。
1. 波前规划法(Wavefront Planning)
- 原理:从目标点向外扩散“波前”,标记各栅格到目标的距离,反向生成路径。
- 特点:
- 适合全局静态环境,路径平滑但计算量大。
- 常用于扫地机器人全覆盖路径规划。
2. 动态窗口法(Dynamic Window Approach, DWA)
- 原理:在速度空间内采样可行轨迹,选择最优局部路径(兼顾避障和速度)。
- 特点:适合移动机器人实时避障,但依赖高精度传感器。
DWA算法主要包括3个步骤:速度采样、轨迹预测(推算)、轨迹评价。
Python实现
完整程序请移步github仓库。
本次代码的参数配置和画图代码参考了AtsushiSakai/PythonRobotics 。
参数配置
1 | import numpy as np |
值得注意的是,这边障碍物只给了位置,并没有给定大小,因为这边相当于把障碍物的大小合并到了机器人本体大小上,也即代码中的robot_radius
上。
机器人运动学模型
主要用于轨迹推算。
1 | def KinematicModel(state,control,dt): |
在这里顺便保存了线速度和角速度作为状态分量,便于后面轨迹计算。
DWA算法类实现
1 | class DWA: |
从后面的实验效果上看,这边没有进行归一化也是可以的。
画图
主要用于机器人和方向箭头的绘制。
1 | def plot_arrow(x, y, yaw, length=0.5, width=0.1): # pragma: no cover |
主函数
1 | def main(config): |
运行主函数,即可得到下图所示的效果:
三、人工势场法(Artificial Potential Field, APF)
- 原理:目标点产生引力,障碍物产生斥力,合力引导机器人运动。
- 改进方法:
- 虚拟力场法:引入旋转力解决局部极小问题。
- 势场+随机扰动:通过随机扰动逃离局部极小(如U型陷阱)。
- 应用:机械臂末端实时避障、无人机动态路径调整。
四、基于动态规划的算法
通过递推公式求解多阶段决策问题,适用于离散状态空间。
1. 值迭代(Value Iteration)
- 原理:迭代更新各状态的最优值函数,最终回溯路径。
- 特点:
- 适合马尔可夫决策过程(MDP),但计算复杂度高。
2. 策略迭代(Policy Iteration)
- 原理:交替优化策略和值函数,收敛速度快于值迭代。
五、基于几何的规划算法
利用几何学原理直接生成路径,适用于结构化环境。
1. 可见图法(Visibility Graph)
- 原理:连接障碍物顶点与起点/目标点,构建可见边网络,搜索最短路径。
- 特点:
- 路径为折线段,全局最优,但计算复杂度高(O(n3)O(n3))。
- 适用于多边形障碍物环境(如室内导航)。
六、传统算法的改进与混合方法
1. Hybrid A*
- 原理:结合连续状态空间和离散搜索,解决车辆运动学约束问题。
- 应用:自动驾驶汽车的路径规划。
2. APF + 图搜索
- 原理:先用A*生成全局路径,再用APF实时避障。
- 优势:兼顾全局最优性和动态适应性。
3. D* Lite
- 原理:增量式重规划算法,高效处理动态环境变化。
- 应用:火星探测车、战场机器人