从单刚体模型到QP求解:MIT Cheetah 3 Convex MPC姿态控制实战拆解

张开发
2026/4/18 5:18:22 15 分钟阅读

分享文章

从单刚体模型到QP求解:MIT Cheetah 3 Convex MPC姿态控制实战拆解
1. 从单刚体模型到QP求解的工程路径当你第一次看到MIT猎豹机器人以3m/s的速度奔跑时可能会好奇这么复杂的动态平衡是如何实现的答案就藏在Convex MPC凸模型预测控制的姿态控制算法中。作为一个在机器人领域摸爬滚打多年的工程师我想分享如何将论文中的数学公式变成实际可运行的代码。单刚体模型是这个控制方案的核心假设。想象一下把四足机器人简化成一个飞在空中的盒子四条腿产生的力都作用在这个盒子的底部。这种简化虽然忽略了腿部动力学但实测表明对于中等速度的运动已经足够精确。我在自己的机器人项目中也验证过当速度不超过3.5m/s时单刚体模型的预测误差可以控制在5%以内。建立模型的第一步是确定状态变量。我通常用12个变量来描述这个飞行盒子位置(x,y,z)、姿态角(roll,pitch,yaw)、线速度(vx,vy,vz)和角速度(wx,wy,wz)。这比完整动力学模型少了关节角度等变量大大降低了计算复杂度。在实际编程时我会用Eigen库的VectorXd来存储这些状态量。2. 关键线性化技巧与离散化论文中最精妙的部分是对旋转动力学的线性化处理。当机器人pitch和roll角度较小时小于15度我们可以把复杂的旋转矩阵简化为绕Z轴的单一旋转。这个假设在大多数行走和慢跑场景都成立我在测试中发现即使故意推搡机器人这两个角度也很少超过10度。连续时间的状态方程需要离散化才能用于数字控制器。这里有个工程细节MIT团队使用的是矩阵指数法expm而不是简单的欧拉离散化。用Eigen库实现时是这样的MatrixXd A_continuous ...; // 连续状态矩阵 MatrixXd B_continuous ...; // 连续输入矩阵 MatrixXd A_discrete (A_continuous * dt).exp(); MatrixXd B_discrete A_continuous.inverse() * (A_discrete - MatrixXd::Identity()) * B_continuous;离散化后的模型精度直接影响控制效果。我对比过不同方法当控制周期dt0.03秒时矩阵指数法的位置预测误差比欧拉法小60%。这也是为什么Cheetah 3能在30Hz的控制频率下保持稳定。3. 构建MPC优化问题有了离散模型接下来要设计代价函数。MIT的方案很聪明他们不直接跟踪轨迹而是最小化预期状态与参考状态的偏差同时限制输入力的大小。这相当于让机器人自主决定如何到达目标而不是严格遵循预设路径。代价函数通常设计为J (x-x_ref)^T Q (x-x_ref) u^T R u其中Q和R是需要调节的权重矩阵。经过多次实验我发现Q矩阵中对z轴高度的权重应该设为其他位置的3-5倍因为高度控制对稳定性最敏感。而R矩阵的值会影响力的幅值MIT使用的4e-5确实是个不错的起点。4. 转化为QP问题的高效方法真正的工程魔法发生在将MPC转化为二次规划(QP)问题的过程中。通过引入预测时域内的状态序列和输入序列我们可以把整个优化问题重写为min 1/2 U^T H U f^T U s.t. G U h其中H矩阵包含了系统动力学和权重矩阵的所有信息。为了实时求解这个QP问题我推荐使用OSQP求解器它的C接口非常高效OSQPSolver solver; SolverSettings settings; settings.eps_abs 1e-4; settings.eps_rel 1e-4; solver.setup(H, f, G, h, settings); OSQPResult result solver.solve();在实际部署时有几点经验值得注意首先预测时域不是越长越好Cheetah 3使用10步预测约0.3秒取得了最佳效果其次QP问题的稀疏结构可以被 exploit来加速求解OSQP在这方面做得很好最后记得检查H矩阵的正定性必要时可以添加小的正则化项。5. 参数调试与性能优化调参是让算法真正工作的关键步骤。根据我的笔记本记录这些参数对性能影响最大参数推荐范围影响效果Q位置权重1e2-1e4跟踪精度值越大越精确R力权重1e-6-1e-4力的大小值越小力越大预测时域8-12步计算量vs前瞻性的权衡OSQP容差1e-4-1e-3求解精度vs速度的平衡调试时建议先用仿真环境我通常这样进行固定R4e-5只调Q的位置权重找到不引起振荡的最大Q值保持Q不变调整R直到最大力达到执行器极限的80%最后微调预测时域在Intel i7处理器上经过优化的QP求解耗时可以控制在2ms以内完全满足30Hz的控制频率要求。如果发现计算时间超标可以尝试减少预测时域或者降低求解精度。6. 实际部署中的注意事项真正把算法部署到实体机器人上时会遇到很多论文里没提到的坑。第一个坑是状态估计的延迟IMU数据通常会有10-20ms的延迟这会导致预测不准。我的解决方案是在状态估计器中使用运动学外推补偿这个延迟。第二个常见问题是执行器动力学。仿真中假设力可以瞬时变化但实际电机需要几毫秒才能达到目标力。在Cheetah 3的代码中可以看到他们对期望力做了低通滤波截止频率约50Hz。我在自己的机器人上测试发现30Hz的滤波效果最好。最后别忘了地面反作用力约束。四条腿的总垂直力应该等于机器人重量这个物理约束可以显著提高稳定性。在代码中实现时我添加了这样的不等式约束sum(leg_force_z) 0.9 * mass * g sum(leg_force_z) 1.1 * mass * g7. 超越Cheetah 3的改进空间虽然Cheetah 3的方案已经很优秀但在实际项目中我发现还有改进余地。首先是模型误差补偿当机器人高速运动时单刚体假设的误差会变大。我尝试在预测模型中添加一个经验修正项效果不错// 在状态更新后添加速度相关的修正 if(velocity.norm() 1.0) { position_error 0.02 * velocity * dt; predicted_state.position position_error; }另一个改进方向是QP问题的热启动。利用上一控制周期的解作为初始猜测可以将求解迭代次数减少30-50%。OSQP支持直接设置初始解solver.setWarmStart(last_solution);经过这些优化后我的测试机器人即使在2.5m/s的速度下也能保持稳定验证了Convex MPC的强大性能。这套方案最大的优势在于其实用性——不需要昂贵的GPU或特殊硬件在普通的嵌入式处理器上就能实时运行。

更多文章