控制理论系列讲完了,从今天开始进入运动规划领域。这个系列大概会写十几篇,把规划算法从头到尾讲一遍。

运动规划是机器人最"烧脑"的模块之一。说白了就是回答一个问题:机器人怎么从A点到达B点,同时不撞到任何东西?这个问题看似简单,但根据场景不同,解法天差地别。工业机械臂在固定工位搬东西,和自动驾驶汽车在城市里穿梭,用的规划算法完全不是一个路数。

今天先做一个全景式的概述,把运动规划的分类、核心概念和算法框架理清楚。后面十几篇会逐个展开。

一、运动规划的本质

运动规划的数学定义很简洁:给定一个构型空间C和障碍物空间C_obs,找到一条从起始构型q_start到目标构型q_goal的无碰撞路径。

构型空间(Configuration Space,C-space)是关键概念。一个n自由度机器人的构型空间是n维的——每个维度对应一个关节角度(或位移)。障碍物在构型空间里会变成"膨胀"后的障碍物区域C_obs。膨胀的量等于机器人的"半径"——这样机器人就可以被当作一个点来处理。

# 构型空间的基本概念
# 2D平面上的点机器人:C = R^2
# 2D平面上的移动机器人(含朝向):C = R^2 × S^1
# 6轴机械臂:C = R^6(每个维度是一个关节角度)
# 自由度越多,构型空间维度越高

# 障碍物膨胀示例
# 圆形机器人(半径r)在2D空间
# 原始障碍物 → 膨胀r → 机器人简化为点

为什么要在构型空间做规划而不是笛卡尔空间?因为构型空间把机器人"简化"成了一个点。碰撞检测变成了"这个点是否在障碍物区域内"的问题,比直接处理机器人的几何形状简单得多。代价是维度变高了——一个6轴机械臂的构型空间是6维的,但这比在3D工作空间里处理一个复杂形状的碰撞检测要方便。

二、规划算法的三大分类

运动规划算法按工作方式分三大类:

1. 全局规划(离线规划)

全局规划假设环境完全已知,在规划前就把整条路径算好。

特点:

  • 环境信息完整(已知地图、已知障碍物位置)
  • 规划一次,执行多次
  • 追求最优性(最短路径、最少时间)
  • 计算时间可以长一些(秒级甚至分钟级)

典型算法:Dijkstra、A、D Lite、PRM、RRT*

适用场景:仓储AGV(地图已知)、机械臂搬运(工件位置固定)、自动驾驶的全局路线规划。

2. 局部规划(在线规划)

局部规划只关注机器人周围一小片区域,实时生成局部路径。

特点:

  • 环境信息不完整(只知道传感器能看到的范围)
  • 每个控制周期都要重新规划
  • 追求实时性(毫秒级响应)
  • 不保证全局最优

典型算法:DWA、TEB、人工势场法、Lattice Planner

适用场景:移动机器人避障(动态行人)、无人机避障(未知环境)、机械臂在杂乱环境中运动。

3. 反应式规划

反应式规划不做"规划",而是根据当前传感器输入直接输出控制指令。相当于一个从传感器到执行器的映射函数。

特点:

  • 极简计算(微秒级)
  • 没有显式的路径概念
  • 对突发情况响应最快
  • 容易陷入局部极小值

典型算法:人工势场法(也可以归入局部规划)、向量场直方图(VFH)、Bug算法

适用场景:紧急避障、简单场景下的导航、和其他规划方法配合使用。

三、全局规划的两大流派

全局规划算法又分两大流派:图搜索和采样规划。

图搜索(Graph Search)

思路:把连续空间离散化成图(网格或节点),然后用图搜索算法找最短路径。

代表算法:Dijkstra、A、D Lite

优点:

  • 能找到最优解(如果存在)
  • 算法成熟,理论完备
  • 实现相对简单

缺点:

  • 维度灾难——空间维度越高,网格数量指数增长
  • 离散化误差——路径只能沿网格方向走
  • 不适合高维空间(比如7轴机械臂的构型空间)

采样规划(Sampling-based)

思路:在构型空间里随机采样点,用采样的点构建路线图(roadmap),在路线图上搜索路径。

代表算法:PRM、RRT、RRT、BIT

优点:

  • 不受维度影响——高维空间也能用
  • 不需要离散化——处理连续空间
  • 概率完备——采样足够多一定能找到解(如果存在)

缺点:

  • 路径质量不稳定——每次运行结果不同
  • 狭窄通道难以通过——随机采样很难命中狭窄通道
  • 最优性需要额外保证(RRT*等渐进最优算法)

所谓概率完备,是指"如果解存在,随着采样次数趋向无穷,找到解的概率趋向1"。这和A*那种"一定能找到最优解"的确定完备不同。工程上概率完备够用了——只要你给它足够的时间,它几乎一定能找到解。

四、规划系统的工程架构

实际工程中,运动规划通常是一个多层架构:

全局规划器(低频,1-10Hz) ↓ 全局路径 局部规划器(中频,10-50Hz) ↓ 局部轨迹 反应式层(高频,100-1000Hz) ↓ 控制指令 执行器

全局规划器在后台运行,每隔几秒更新一次全局路径。局部规划器根据全局路径和传感器数据,实时生成可执行的局部轨迹。反应式层处理紧急情况——比如突然出现的障碍物,直接输出避障指令。

这种分层架构的好处是:每一层关注不同时间尺度的问题,互不干扰。全局规划不用操心实时性,反应式层不用操心全局最优。

之前做AMR项目的团队就是这种架构。全局用A*在已知地图上规划,局部用DWA实时避障,最底层还有一个反应式急停——超声波检测到0.3m内有障碍物就直接停车。三层之间通过"路径-轨迹-指令"三级传递信息。全局路径是 waypoints 列表,局部规划器把 waypoints 转成速度指令,反应式层在紧急情况下覆盖速度指令。

还有一个细节:全局规划器通常跑在工控机上(算力充足),局部规划器跑在实时控制器上(保证时序),反应式层直接跑在安全PLC或MCU上(最高优先级)。

五、规划算法的评估指标

面试时经常被问到"你怎么评估一个规划算法好不好"。核心指标有这几个:

完备性:如果解存在,算法能保证找到吗?概率完备(RRT)还是确定完备(A*)?

最优性:找到的是最优解吗?最优(Dijkstra)、渐进最优(RRT*)、还是次优(DWA)?

计算效率:规划一次要多久?全局规划可以慢一些(秒级),局部规划必须快(毫秒级)。

路径质量:路径长度、平滑度、离障碍物距离。这些直接影响后续轨迹跟踪的效果。一条贴着障碍物走的最短路径,在实际执行时可能因为定位误差而碰撞。所以工程上通常偏好"离障碍物远一点"的路径,即使它更长。

可扩展性:维度增加时性能怎么变?高维空间用采样规划,低维空间用图搜索。

鲁棒性:环境有微小变化时,路径质量会不会剧烈下降?有些算法对环境变化很敏感,每次都要重新规划;有些算法能在环境变化后快速调整。

六、面试实战

Q:构型空间和工作空间有什么区别? A:工作空间是机器人末端运动的物理空间(通常是2D或3D)。构型空间是描述机器人所有关节状态的抽象空间(维度等于自由度数)。一个6轴机械臂的工作空间是3D的,但构型空间是6D的。

Q:为什么不在工作空间直接规划? A:因为机器人在工作空间不是"一个点"——它有体积、有形状。在构型空间里,机器人被简化成一个点,碰撞检测变成了点是否在障碍物区域内的问题。虽然构型空间维度高,但处理起来反而更统一。

Q:全局规划和局部规划怎么配合? A:全局规划给出粗略路径("走哪条路"),局部规划负责细节("怎么避眼前的障碍")。局部规划偏离全局路径太远时,触发全局重新规划。工程上还有一个常见做法:全局规划给出的路径作为局部规划的参考线,局部规划在参考线附近搜索最优轨迹。

小结

运动规划分三大类:全局规划(已知环境,求最优路径)、局部规划(实时避障,保证安全)、反应式规划(紧急响应,极速避障)。

全局规划分两大流派:图搜索(低维最优)和采样规划(高维可行)。工程上通常分层使用——全局+局部+反应式三层架构,各层各司其职。

下一篇开始深入图搜索,从最基础的Dijkstra算法讲起。


如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。

「机器人软件开发面试·从入门到精通」连载系列 

上一篇:第205篇 控制理论面试高频题——面试官最爱问的15个控制问题

下一篇预告:第207篇 图搜索基础——状态空间离散化的思路

有任何问题欢迎评论区留言,我会尽量回复。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐