#include "balance.h" #include "stdint.h" #include "arm_math.h" /** * @brief 根据状态反馈计算当前腿长,查表获得LQR的反馈增益,并列式计算LQR的输出 * @note 得到的腿部力矩输出还要经过综合运动控制系统补偿后映射为两个关节电机输出 * */ static void CalcLQR(LinkNPodParam *p, ChassisParam *chassis) { float k[12][3] = {155.616146,-200.327241,-0.278791, -12.564474,-24.018026,0.674594, 145.503085,-87.742553,-5.916048, 97.588867,-70.361944,-4.007305, 303.894243,-240.356086,68.074439, 18.743007,-15.738160,4.718314, -170.799127,75.225969,18.998160, -29.312006,20.892957,1.529644, 122.553208,-114.023608,38.147691, 63.561616,-64.916409,25.861226, -657.233777,402.487049,66.281303, -40.107302,25.117848,1.705173}; float T[2] = {0}; // 0 T_wheel 1 T_hip float l = p->leg_len; float lsqr = l * l; for (uint8_t i = 0; i < 2; ++i) { uint8_t j = i * 6; T[i] = (k[j + 0][0] * lsqr + k[j + 0][1] * l + k[j + 0][2]) * -p->theta + (k[j + 1][0] * lsqr + k[j + 1][1] * l + k[j + 1][2]) * -p->theta_w + (k[j + 2][0] * lsqr + k[j + 2][1] * l + k[j + 2][2]) * (chassis->target_dist - chassis->dist) + (k[j + 3][0] * lsqr + k[j + 3][1] * l + k[j + 3][2]) * (chassis->target_v - chassis->vel) + (k[j + 4][0] * lsqr + k[j + 4][1] * l + k[j + 4][2]) * -chassis->pitch + (k[j + 5][0] * lsqr + k[j + 5][1] * l + k[j + 5][2]) * -chassis->pitch_w; } p->T_wheel = T[0]; p->T_hip = T[1]; }