cheetah mini一步的周期约0.3s,这在稍大型的机器人上是不合理的。为了增加迈步周期,需要增加步态循环中MPC计算的次数。这样,预测时域就无法cover整个迈步周期,因此需要增加预测时域。
MPC求解中,运算量随着预测时域n增大成指数上升.在ConvexMPCLocomotion.cpp文件中解除注释:
printf("MPC Solve time %f msn", t2.getMs());
可以实时打印MPC计算时间,在我的笔记本上(Intel(R) Core(TM) i5-8500 CPU @ 3.00GHz),使用源代码默认的预测时域为10,测试发现mpc计算时间约0.35ms:
当调整预测时域至18时,MPC计算时间嗖的就增加到5.5ms了:
据手里有upboard板子的小伙伴介绍,预测时域在18时,upboard上计算时间能到接近30ms,因此有必要对原算法做一些调整来提高运算效率。
一、在eigen中使用静态矩阵
在SolveMPC.cpp中,使用eigen定义了一些动态矩阵:
Matrix<fpt,Dynamic,13> A_qp;
Matrix<fpt,Dynamic,Dynamic> B_qp;
Matrix<fpt,13,12> Bdt;
Matrix<fpt,13,13> Adt;
Matrix<fpt,25,25> ABc,expmm;
Matrix<fpt,Dynamic,Dynamic> S;
Matrix<fpt,Dynamic,1> X_d;
Matrix<fpt,Dynamic,1> U_b;
Matrix<fpt,Dynamic,Dynamic> fmat;
Matrix<fpt,Dynamic,Dynamic> qH;
Matrix<fpt,Dynamic,1> qg;
Matrix<fpt,Dynamic,Dynamic> eye_12h;
这些矩阵之所以是动态的,是因为其大小取决于预测时域。而预测时域在机器人运行过程中是不会变的,因此完全可以将这些矩阵设置成静态的:
Matrix<fpt,13*HORIZON_LENGTH,13> A_qp;
Matrix<fpt,13*HORIZON_LENGTH,12*HORIZON_LENGTH> B_qp;
Matrix<fpt,13,12> Bdt;
Matrix<fpt,13,13> Adt;
Matrix<fpt,25,25> ABc,expmm;
Matrix<fpt,13*HORIZON_LENGTH,13*HORIZON_LENGTH> S;
Matrix<fpt,13*HORIZON_LENGTH,1> X_d;
Matrix<fpt,20*HORIZON_LENGTH,1> U_b;
Matrix<fpt,20*HORIZON_LENGTH,12*HORIZON_LENGTH> fmat;
Matrix<fpt,12*HORIZON_LENGTH,12*HORIZON_LENGTH> qH;
Matrix<fpt,12*HORIZON_LENGTH,1> qg;
Matrix<fpt,12*HORIZON_LENGTH,12*HORIZON_LENGTH> eye_12h;
注意
-
<