
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_{i1}的变换。由于是交替迈步动作实际上定义了下一步摆动脚相对于当前支撑脚的落脚点。一个动作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*慢。ARAAnytime 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仍然是当前最可靠、可解释性最强的方案。理解其每一个环节的原理和实现细节是构建稳定可靠的双足机器人导航系统不可或缺的基础。当你亲手实现并调试通整个流程看着机器人一步步稳健地走向目标避开那些你故意设置的坑洼和斜坡时那种成就感是无可替代的。这个过程充满了挑战但每一步问题的解决都让你对双足机器人的“行走”这件事有了更深一层的理解。