四足机器人MPC控制算法编写仿真
原理介绍
机器人控制系统,就是要解决机器人在哪儿、去哪儿、怎么去的问题,分别对应了机器人控制系统的状态估计器、轨迹规划器和控制器。
原论文中第二章介绍了控制系统中的2.3步态调度、2.4状态估计、2.5质心轨迹生成、2.6摆动相规划,分别解决了在哪儿(状态估计)与去哪儿(轨迹规划)的问题。第三章使用MPC对四足机器人控制量进行优化计算,解决机器人怎么去(模型预测控制)的问题。现对以上内容尝试c++面向对象的实现。
狗腿说明:
狗头
2 1
4 3
框架设计
GaitPlanner
类:步态调度器,提供机器人步态变量输出,以供摆动相规划与支撑相控制。StateEstimator
类:状态估计器,收集IMU与编码器返回的原始状态信息,加工并输出世界系下质心与四足的位置速度信息。TrajectoryGenerator
类:质心轨迹生成器,接收遥控器的指令期望速度,生成期望轨迹。MPCsolver
类:凸优化求解器,根据生成的估计状态与期望轨迹创建qp问题并求解,生成所需的足底反力。
模块实现
以下为提供给用户使用的接口说明。
params.h
这里定义了四足机器人全局静态参数,使用时预先在这里设置好:
1 |
|
GaitPlanner.cpp
步态调度器,负责根据用户选择的步态模式计算输出每个控制周期四足的摆动相、支撑相相位,反映步态信息。
类定义
1 |
|
使用方法
1 | // 未使用单例模式,因此写在main里,向线程函数传入引用 |
StateEstimator.cpp
状态估计器,负责估计四足机器人运动过程中难以直接测量的状态信息,对IMU返回的原始旋转矩阵、电机编码器返回的角度与转速进行转换,反映四足机器人在世界系下的质心位置、质心速度、四足位置等状态信息。其中包括一个使用卡尔曼滤波实现的足底里程计,帮助MPC算法更加精确地收集状态信息。
类定义
1 |
|
使用方法
1 | // 未使用单例模式,因此写在main里,向线程函数传入引用 |
TrajectoryGenerator.cpp
质心轨迹生成器,负责接受手柄传来的控制命令,转化为MPC算法需要的未来h周期地机器人期望轨迹(状态),作为实际轨迹优化问题的目标。
- 接受:期望速度,期望角速度
- 返回:期望速度,期望角速度,期望位置,期望角位置(欧拉角)
构造时默认当前周期为0, 接收到手柄传来的本体系下的期望速度与角速度后生成未来h周期的、世界系下的期望速度,角速度,位置,欧拉角。
每次生成期望轨迹后,预测区间右移一格,重新生成未来h周期期望轨迹。
类定义
1 |
|
使用方法
1 | // 未使用单例模式,因此写在main里,向线程函数传入引用 |
MPCsolver.cpp
- 目的:计算出当前时刻(t时刻)应当输入的控制量
- 约束:
- 输入后系统状态与预期状态尽可能接近(误差最小)
- 所输入的本身尽可能小(输入最小)
控制以上两个约束的权重后,求为一个二次凸优化问题,以下为MPC具体实现时所需要的变量推导:
根据前文实现的四个计算类编写代码,求出当前时刻最优输入控制量,其中第一列为所需足底反力。
类定义
1 |
|
使用方法
1 | // 未使用单例模式,因此写在main里,向线程函数传入引用 |
控制器
电机编号说明
1 | /* 电机编号 |
键盘输入
1 | switch (key) { |
贝塞尔曲线
1 | Vector3d cubicBezier3D(Vector3d &p0, Vector3d &p1, Vector3d &p2, Vector3d &p3, |
运动学逆解
位置控制的运动学逆解,将足端坐标、速度转化为电机转角、转速。
原位控版本:
1 |
|
推荐使用更精简版本:(更新于12.22)
1 | Vector3d inverseKinematics(int legNumber, Vector3d footPosition) { |
开始第一个demo
1 | void trot_balanced() { |
其他
Intel MKL加速
在#include
之后的预处理区添加以下代码,可利用intel硬件加速Eigen矩阵的计算:
1 | // 使用Intel MKL 线性代数库加速 |
代码性能测量
1 |
|
Eigen库使用
1 | matrix.block<p,q>(i,j); //从坐标(i,j)提取大小为<p,q>的块,可读可写 |
qpOASES使用
Webots手册
IMU相关
卡尔曼滤波相关
日志
- 11.19 构建第二章代码框架
- 11.20 实现
GaitScheduler
,增加性能测试函数 - 11.22 添加Eigen矩阵计算库,添加开源协议,开始实现
StateEstimator
- 11.23 实现
StateEstimator
卡尔曼滤波前的部分 - 11.24 实现
StateEstimator
卡尔曼滤波状态方程部分,完善readmeGaitScheduler
部分 - 11.28 实现
StateEstimator
完成(含卡尔曼滤波),通过初步测试 - 11.30 实现
TrajectoryGenerator
至地形坡度估计,暂时跳过 - 12.02 分析MPC算法具体实现逻辑
- 12.06 搭建MPC算法框架
- 12.10 实现MPC初版代码
- 12.25 Webots仿真移植成功