1. 项目概述:为什么双足机器人需要“自己的”路径规划器?
如果你接触过移动机器人,无论是轮式的、履带式的,还是四足的,路径规划(Path Planning)这个概念应该不陌生。简单说,就是给机器人一个起点和一个终点,规划出一条能避开障碍物的可行路线。听起来,这事儿对双足人形机器人(Humanoid Robotics)来说,不就是把轮式机器人的规划器拿过来用吗?我最初也是这么想的,直到自己动手给一个双足机器人做导航时,才真正踩进了坑里。
轮式或履带式机器人的路径规划,输出通常是一条连续的几何曲线,比如一系列坐标点。控制器只需要让机器人沿着这条线走,保持合适的朝向和速度就行。它们的“脚”(轮子或履带)与地面是连续接触的,运动模型相对简单。但双足机器人完全不同。它的运动是离散的、间歇性的——靠两只脚交替迈步前进。规划器给出的那条光滑的几何路径,对双足机器人来说,可能根本无法执行。
举个例子,规划器可能给出了一条紧贴墙壁的路径,对轮式机器人来说,贴着墙走没问题。但对双足机器人,这意味着它需要把脚精确地落在墙根处。如果地面不平,或者落脚点恰好有一块小石头,这条“可行”的几何路径就变成了“不可行”的步态序列,轻则步态不稳,重则直接摔倒。所以,双足机器人需要的不是一条“线”,而是一系列离散的、安全的“落脚点”(Footstep)序列。这就是“Footstep Path Planner”(步态路径规划器)存在的核心原因:它直接规划落脚点,而不是连续路径,将高层导航指令与底层的步态生成与控制无缝衔接起来。
这个规划器要解决的核心矛盾是:如何在高层的、连续的空间导航需求,与底层的、离散的脚部运动约束之间,架起一座可靠的桥梁。它决定了机器人每一步该踩在哪里,用什么姿态(脚掌角度),以及何时切换支撑脚。这不仅仅是“规划”,更是运动可行性、稳定性与效率的全局博弈。
2. 核心需求解析:从“画线”到“踩点”的范式转变
为什么传统的路径规划器(如A*、D*、RRT等)直接用在人形机器人上会“水土不服”?我们需要深入拆解双足步行的独特约束,这些约束构成了步态路径规划器的设计出发点。
2.1 运动模型的根本差异:离散vs连续
轮式机器人的运动模型通常是微分驱动或阿克曼模型,其状态(位置、朝向)变化是连续的、可微的。规划器可以在位姿空间(如SE(2))中自由搜索。而双足机器人的运动模型本质上是混杂系统(Hybrid System):在单脚支撑期,机器人是一个倒立摆,绕支撑脚旋转;在双脚支撑期,可以进行质心转移。它的状态切换是离散事件(脚触地、抬脚)驱动的。规划器必须在落脚点空间(一个离散的、高维的空间)中进行搜索,每个可能的落脚点都关联着一系列动力学可行性检查。
2.2 丰富的运动约束:稳定性、可达性与地形适应性
一个可行的落脚点序列,必须满足多重严苛约束:
- 静态稳定性约束:在规划阶段,通常以零力矩点(Zero Moment Point, ZMP)准则作为稳定性判据。规划出的步态序列,必须保证机器人在每一步的ZMP始终落在支撑多边形(Support Polygon)内。这意味着落脚点的横向间距不能太窄(易侧翻),也不能太宽(超出关节运动范围)。
- 运动学可达性约束:机器人的腿不是无限长的。从一个落脚点迈到下一个落脚点,需要检查髋关节、膝关节、踝关节的角度是否在极限范围内,是否存在奇异位形,以及摆动腿能否在不碰撞支撑腿或自身躯干的情况下完成轨迹。
- 动力学可行性约束:机器人有质量,关节有输出力矩极限。从一个状态切换到另一个状态,所需的加速度和力矩必须在执行器能力范围内。规划时需要考虑惯性、科里奥利力等因素,避免规划出需要“瞬间大力出奇迹”才能完成的步态。
- 地形适应性约束:这是与传统规划器差异最大的地方。每个候选落脚点都需要进行足地接触评估。评估内容包括:
- 地面法向:落脚点处的地面倾斜度是否在机器人脚踝关节的俯仰/翻滚容差内?
- 地面摩擦系数:预估的接触面能否提供足够的摩擦力防止打滑?
- 地面平整度与刚度:落脚点是否平整?是坚硬地面还是柔软草地?这会影响接触冲击和状态估计。
- 障碍物:落脚点区域是否被占用?即使几何路径上空无一物,但落脚点位置有一块砖头,这一步就不可行。
2.3 规划目标的特殊性:不仅仅是距离最短
对于轮式机器人,最优路径通常是欧氏距离最短或时间最短。对于步态路径规划,优化目标更为复杂,可能是多目标的加权和:
- 能量效率:最小化执行器做功或总力矩。
- 步态自然度:模仿人类步态,避免步幅忽大忽小、转向过于突兀。
- 稳定性裕度:最大化ZMP到支撑多边形边界的距离,留出更多抗扰动余量。
- 地形惩罚:倾向于选择地面更平整、摩擦系数更高的区域落脚。
- 动作平滑性:最小化连续步态之间在位置、朝向、速度上的突变。
注意:在实际项目中,我们往往需要在规划速度和质量之间做权衡。一个考虑所有约束的完整优化问题计算量巨大,无法用于实时导航。因此,实用的步态路径规划器通常采用分层或搜索剪枝策略,先快速找到可行解,再对其进行局部优化。
3. 核心技术架构:如何构建一个步态路径规划器
一个典型的Footstep Path Planner通常采用基于搜索的规划框架,核心流程可以概括为:状态定义、动作生成、代价评估、图搜索。下面我们拆解每个环节的实现要点。
3.1 状态空间与动作空间定义
这是规划的数学基础。
- 状态(State):通常定义为机器人支撑脚的位置和朝向。例如,状态
s_i = (x_i, y_i, θ_i)表示第i步时,机器人支撑脚(假设为左脚)在全局坐标系下的坐标和偏航角。同时,状态中还需要隐含或显式地包含机器人的质心(CoM)状态信息,因为稳定性与之强相关。更复杂的模型会将CoM的位置和速度也纳入状态向量。 - 动作(Action):定义为从当前支撑脚状态
s_i到下一个支撑脚状态s_{i+1}的变换。由于是交替迈步,动作实际上定义了下一步摆动脚相对于当前支撑脚的落脚点。一个动作a_i可以用相对坐标表示:(Δx, Δy, Δθ),即下一步落脚点相对于当前支撑脚在局部坐标系下的偏移。
为什么用相对坐标?因为机器人的运动能力是局部的。它更关心“我下一步能迈多远、转多少度”,而不是直接思考一个遥远的全局坐标点。相对定义也使得动作集可以预先离散化,简化搜索。
3.2 离散动作集的生成
我们无法在连续的相对动作空间中搜索,需要将其离散化为一组有限的、合理的候选动作。这组动作构成了搜索图中从当前状态出发的所有可能边。
一个典型的离散动作集可能包括:
- 前进步幅:例如,
Δx = {0.2m, 0.25m, 0.3m},Δy = 0(对于直线行走),Δθ = 0。 - 侧向步幅:
Δx = 0.1m,Δy = {±0.15m}(用于小幅调整横向位置),Δθ = 0。 - 旋转步幅:
Δx = 0.1m,Δy = 0,Δθ = {±10°, ±20°}。 - 原地踏步:
Δx = 0, Δy = 0, Δθ = 0(用于等待或调整时机)。
动作集的生成需要严格基于机器人的运动学极限。例如,最大步幅不能超过腿完全伸展时的可达范围,并留有余量。我们可以通过机器人的正运动学模型,计算出髋关节位置对应脚部可达的工作空间,从中采样得到安全的(Δx, Δy)对。
3.3 代价函数设计:引导搜索的指挥棒
代价函数g(s, a)用于评估执行动作a从状态s转移到新状态的“代价”。它是多目标优化的具体体现。一个综合的代价函数可能包含以下部分:
总代价 = w1 * 距离代价 + w2 * 转向代价 + w3 * 地形代价 + w4 * 稳定性代价 + w5 * 动作切换代价- 距离代价:鼓励向目标点前进。通常使用到终点的欧氏距离的减少量作为负代价,或直接使用曼哈顿距离。
- 转向代价:惩罚不必要的旋转,使路径更平滑。
w2 * |Δθ|。 - 地形代价:基于落脚点区域的地图信息计算。这是核心之一。我们可以预先计算一个代价地图(Costmap):
- 障碍物层:二值地图,落脚点中心或脚形覆盖区域内有障碍物则代价无穷大。
- 坡度层:计算落脚点局部区域的地面法向量倾斜角,坡度越大,代价越高。
- 粗糙度层:计算落脚点区域内的高度方差,方差越大说明越不平整,代价越高。
- 摩擦层(如果已知):赋予不同地表类型(如水泥地、地毯、草地)不同的代价。
- 稳定性代价:预估执行该步态后的稳定性裕度。可以通过简化的模型(如线性倒立摆模型LIPM)快速计算一步之后的ZMP位置,并计算其到支撑多边形边缘的最小距离。距离越小,代价越高。
- 动作切换代价:惩罚步幅或转向角度的剧烈变化,使步态更自然。例如,
w5 * (|Δx_i - Δx_{i-1}| + |Δθ_i - Δθ_{i-1}|)。
权重w1~w5需要大量仿真和实际测试来调整,没有银弹。我的经验是,初期应给予地形代价和稳定性代价较高的权重,安全第一;在基础稳定后,再优化效率和平滑性。
3.4 图搜索算法选择与优化
有了状态、动作和代价,规划问题就转化为了在一个庞大状态空间中的图搜索问题。常用的算法有:
- A搜索*:最经典的选择。它结合了从起点到当前节点的实际代价
g(n)和到终点的启发式代价h(n)。对于步态规划,启发函数h(n)的设计很关键。一个简单有效的启发函数是:将机器人视为一个点,用该点到终点的欧氏距离除以最大步幅,得到一个乐观的剩余步数估计。 - Dijkstra 算法:当动作代价均为正且不需要启发式时可用,但通常比A*慢。
- ARA(Anytime Repairing A)**:这是更实用的选择。ARA* 首先快速找到一个次优解,然后利用剩余时间不断优化它。这对于需要实时响应的机器人导航至关重要——规划器可以在收到目标后很快给出一个“可用”的步态序列,然后边执行边在后台优化后续步骤。
- RRT(快速探索随机树)及其变种:在高维连续状态空间(如包含CoM状态)中更有效,但生成的路径可能不够最优,且难以直接融入丰富的代价函数。
实操中的性能瓶颈与优化技巧:
- 状态剪枝:如果搜索图中两个状态非常接近(位置和朝向差异小于阈值),可以认为它们是等价的,只保留代价更低的那一个。这能大幅减少搜索空间。
- 动作剪枝:在动作生成后,立即用运动学模型进行快速碰撞检测和可达性检查,过滤掉明显不可行的动作,避免无效的状态扩展。
- 分层规划:先使用一个低分辨率的全局规划器(如传统的2D路径规划器)规划出一条粗略的几何路径。然后,步态规划器只在这条路径周围的“走廊”内进行搜索。这相当于用几何路径约束了搜索方向,极大提高了效率。
- 预计算与缓存:对于固定的机器人模型,其可行的相对动作集是固定的,可以预先计算并存储。地形代价也可以预先计算到代价地图中,搜索时直接查表。
4. 与导航栈的集成:从全局规划到局部执行
步态路径规划器不是孤立的模块,它需要嵌入到完整的机器人导航栈中,与感知、定位、控制模块协同工作。一个典型的集成架构如下:
[全局代价地图] -> [全局路径规划器(几何)] -> [Footstep Path Planner] -> [步态生成器] -> [全身控制器] ^ ^ ^ ^ | | | | [定位模块] [局部代价地图] [地形感知] [状态估计]4.1 输入与输出
输入:
- 目标位姿:来自导航系统(如
move_base)的全局目标。 - 机器人状态:来自状态估计模块的当前支撑脚位姿、CoM位置/速度、关节角度等。
- 环境信息:主要是3D点云或深度图,用于构建包含高度、坡度、粗糙度信息的多层代价地图。
- 全局粗路径(可选):来自上层几何路径规划器(如NavFn),用于引导搜索方向。
- 目标位姿:来自导航系统(如
输出:
- 落脚点序列:一系列按时间顺序排列的脚部位姿
[footstep_1, footstep_2, ..., footstep_N]。 - 预计的支撑脚切换时间(或步态周期)。
- 伴随的质心轨迹参考(如果规划器是模型预测控制MPC-based的)。
- 落脚点序列:一系列按时间顺序排列的脚部位姿
4.2 与局部规划/控制的衔接
规划出的落脚点序列是离散的、稀疏的。步态生成器(Gait Generator)的任务是将其填充为连续的、光滑的足端轨迹和躯干轨迹。这通常通过插值(如三次样条插值)和基于动力学模型(如LIPM或全身动力学模型)的优化来实现。
然后,全身控制器(Whole-Body Controller)接收这些轨迹参考,并结合实时状态反馈,计算每个关节的力矩指令,驱动机器人准确、稳定地走出每一步。这里有一个关键的回环:控制器实际执行的效果可能与规划预期有偏差(例如地面打滑、模型误差),因此需要在线重规划(Replanning)。
4.3 在线重规划策略
机器人不可能“闭着眼”走完预先规划的所有步子。必须有一个重规划机制:
触发条件:
- 定位漂移:实际位置与规划预期位置偏差超过阈值。
- 地形突变:传感器发现下一步的预定落脚点出现未知障碍物或地形剧变。
- 执行失败:控制器报告当前步无法稳定完成或跟踪误差过大。
- 固定周期:例如,每执行完2-3步就重新规划一次剩余路径。
重规划策略:
- 从当前状态重启规划:以机器人最新的估计状态为起点,向原目标或更新后的目标重新进行搜索。这是最彻底但也最耗时的方式。
- 局部路径修复:如果只是局部地形有变,可以只重规划受影响的前面几步(例如接下来5步),后面的步子尽量沿用原计划,以保持规划一致性。
- 落脚点调整:如果只是一个落脚点有问题,可以尝试在它周围微调,寻找一个邻近的、可行的替代落脚点,而不改变整体序列结构。
实操心得:重规划的频率和粒度是需要精心调参的。过于频繁的重规划会导致步态抖动和能量浪费;过于迟钝则可能导致机器人走向危险区域。我们的策略是采用“事件驱动+周期备份”结合。主要依靠地形突变和定位大漂移事件触发重规划;同时,无论是否触发,每走5步都强制进行一次轻量级的“检查性规划”,只评估后续10步的可行性,不通过则立即启动完整重规划。这能在响应速度和计算负载间取得较好平衡。
5. 实现细节与避坑指南
理论很丰满,实现起来却处处是坑。下面分享一些在具体编码和调试中积累的经验。
5.1 地图表示与查询效率
步态规划器需要频繁查询任意落脚点的地形属性(高度、法向量、代价)。使用标准Occupancy Grid(占据栅格地图)效率低下,因为它只存储二值障碍信息。
推荐方案:使用高程网格(Elevation Map)或成本地图(Costmap 2D Layers)
- 开源库:
grid_map(ROS) 是处理高程地图的利器。它可以管理多个图层(elevation,slope_x,slope_y,roughness,traversability)。 - 数据结构:将3D点云通过滤波和插值,生成一个2.5D的高程网格。每个网格单元格存储平均高度、高度方差等。
- 查询优化:当评估一个落脚点(通常用一个矩形表示脚掌)时,需要查询该矩形覆盖的所有网格单元格。为了效率,可以预先计算每个单元格的“地形特征”(如最大坡度、平均粗糙度),或者使用图像处理中的积分图(Integral Image)技术来快速计算矩形区域内的统计值。
5.2 运动学与动力学可行性检查的简化
在搜索的每一步都对每个候选动作进行完整的逆运动学(IK)和动力学求解是不现实的。必须进行简化:
运动学快速检查:
- 使用一个简化的可达性模型。例如,将机器人的腿建模为两个连杆(大腿和小腿),在矢状面和冠状面内分别计算步幅极限。可以预先计算一个“步幅-转向角”可行性查找表,搜索时直接查表判断
(Δx, Δy, Δθ)是否在可行范围内。 - 碰撞检查:只进行粗略的包围盒检查。将机器人的大腿、小腿、躯干简化为圆柱体,检查摆动腿的轨迹是否会与支撑腿或自身躯干发生干涉。这一步可以过滤掉大量明显不合理的动作。
- 使用一个简化的可达性模型。例如,将机器人的腿建模为两个连杆(大腿和小腿),在矢状面和冠状面内分别计算步幅极限。可以预先计算一个“步幅-转向角”可行性查找表,搜索时直接查表判断
动力学快速预估:
- 在搜索阶段,使用线性倒立摆模型(LIPM)进行稳定性预估就足够了。LIPM假设质心在恒定高度运动,动力学方程是线性的,可以极快地计算一步转移后的ZMP位置,并与支撑多边形进行比较。
- 更精细的动力学优化(如基于全身动力学模型的MPC)可以放在步态生成器阶段进行,那时已经有了一个粗略的落脚点序列,可以在更小的解空间内进行优化。
5.3 调试与可视化
步态规划器的调试非常依赖可视化,因为中间状态多且抽象。
必备的可视化工具:
- RViz (ROS):是核心调试界面。
- 发布落脚点序列:将规划出的每个落脚点用带箭头的立方体(
MarkerArray)显示出来,箭头代表脚掌朝向。用颜色区分左右脚(如红色右脚,蓝色左脚)。 - 发布支撑多边形:在每一步,显示当前双脚(或单脚)构成的支撑多边形区域。
- 发布ZMP轨迹:显示规划器预估的ZMP点轨迹,看其是否始终在支撑多边形内。
- 发布代价地图:将坡度、粗糙度等图层以彩色网格的形式发布出来,直观看到规划器对地形的评估。
- 发布落脚点序列:将规划出的每个落脚点用带箭头的立方体(
- 录制与回放:使用
rosbag录制完整的规划周期数据(目标、传感器数据、规划结果、控制指令)。当出现规划失败或步态怪异时,可以离线回放,逐帧分析问题出在哪个环节。
5.4 常见问题与排查清单
在实际部署中,你大概率会遇到以下问题。这里提供一个快速排查的思路:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 规划器超时,找不到路径 | 1. 动作集太稀疏或约束太严。 2. 启发函数过于乐观,引导搜索进入死胡同。 3. 地形代价地图中可行区域被误判为障碍。 | 1.检查动作集:在空旷平地测试,看是否能规划出直线行走。适当增加动作数量或减小离散化粒度。 2.调整启发函数:尝试使用更保守的启发函数(如将欧氏距离除以 最小步幅)。3.检查代价地图:可视化 traversability层,确认传感器噪声或地图更新延迟是否导致了“幽灵障碍”。增加地图的膨胀半径或进行形态学开运算滤波。 |
| 规划出的步态不稳定(仿真中ZMP出界) | 1. 稳定性代价权重w4太低。2. LIPM模型参数(如质心高度)与实际不符。 3. 步幅规划过大,接近运动极限。 | 1.增加稳定性权重,让规划器更倾向于选择支撑多边形中心的落脚点。 2.校准模型参数:通过系统辨识或CAD模型获取准确的质心高度。 3.限制最大步幅:在动作生成阶段就剪掉步幅过大的动作。 |
| 机器人执行时打滑或摇晃 | 1. 规划时未考虑地面摩擦系数。 2. 落脚点地面法向量估计不准,导致脚掌未平贴地面。 3. 步态生成器生成的足端轨迹加速度过大。 | 1.引入摩擦代价:对不同地面类型赋予不同代价,规划器会主动避开低摩擦区域。 2.改进法向量估计:使用更大范围的点云(如半径5cm的邻域)进行平面拟合,或使用更稳健的估计算法(如RANSAC)。 3.平滑足端轨迹:在步态生成阶段,对足端位置进行速度、加速度甚至加加速度(jerk)的约束优化。 |
| 转向时步态不自然,动作僵硬 | 1. 动作集中转向步幅设置不合理(如只有±30°的大转向)。2. 动作切换代价权重 w5太低,允许相邻步幅/转角差异过大。 | 1.丰富转向动作:增加小角度转向(如±5°, ±15°),让规划器有更平滑的选择。2.提高动作切换代价,鼓励连续的步态动作变化平缓。也可以引入“历史状态”,让代价函数惩罚与上一步差异过大的动作。 |
| 在线重规划导致步态频繁突变 | 1. 重规划触发过于敏感(如定位噪声阈值设得太小)。 2. 重规划后的新序列与正在执行的序列衔接不光滑。 | 1.调整触发阈值:适当放宽定位偏差和地形变化的触发条件,并加入滤波和迟滞。 2.强制衔接约束:在重规划时,固定前1-2个落脚点与当前正在执行的步态一致,只规划后续步子,保证连续性。 |
6. 进阶思考:从规划到学习的趋势
基于模型的搜索规划方法虽然可靠,但其性能严重依赖于模型的准确性和代价函数的手工调参。近年来,随着机器学习的发展,出现了一些新的思路:
- 模仿学习(Imitation Learning):从人类步行数据或最优控制生成的演示数据中,学习一个策略网络,直接根据当前状态和目标,输出下一步的落脚点。这可以绕过复杂的搜索过程,实现毫秒级响应。但难点在于数据的获取、泛化能力和安全性保障。
- 强化学习(Reinforcement Learning):让机器人在仿真环境中通过试错,自学步态规划和行走策略。RL可以学习到非常复杂和鲁棒的行为,甚至能应对从未见过的地形。然而,训练样本效率低、从仿真到现实的迁移(Sim2Real)是巨大挑战。
- 混合方法:目前更实用的可能是混合架构。例如,仍然使用基于搜索的规划器作为“主干”,保证基本的安全性和可行性;同时,使用一个轻量级的神经网络来学习启发函数或预测动作的代价,从而极大地加速搜索过程,或者用来微调规划出的落脚点序列,使其更自然、更节能。
对于我们工程实践者来说,基于模型的Footstep Path Planner仍然是当前最可靠、可解释性最强的方案。理解其每一个环节的原理和实现细节,是构建稳定可靠的双足机器人导航系统不可或缺的基础。当你亲手实现并调试通整个流程,看着机器人一步步稳健地走向目标,避开那些你故意设置的坑洼和斜坡时,那种成就感是无可替代的。这个过程充满了挑战,但每一步问题的解决,都让你对双足机器人的“行走”这件事,有了更深一层的理解。