2024-01-27 19:38:00 +08:00
|
|
|
|
#include "balance.h"
|
|
|
|
|
|
#include "stdint.h"
|
|
|
|
|
|
#include "arm_math.h"
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 根据状态反馈计算当前腿长,查表获得LQR的反馈增益,并列式计算LQR的输出
|
|
|
|
|
|
* @note 得到的腿部力矩输出还要经过综合运动控制系统补偿后映射为两个关节电机输出
|
|
|
|
|
|
*
|
|
|
|
|
|
*/
|
|
|
|
|
|
static void CalcLQR(LinkNPodParam *p, ChassisParam *chassis)
|
|
|
|
|
|
{
|
2026-07-07 02:03:16 +08:00
|
|
|
|
static float k[12][3] = {91.443258,-113.149301,-8.780431,
|
|
|
|
|
|
2.186397,-6.908826,-0.171192,
|
|
|
|
|
|
47.943203,-39.423913,-13.297140,
|
|
|
|
|
|
30.671413,-28.308799,-9.363969,
|
|
|
|
|
|
231.778706,-224.742110,68.974495,
|
|
|
|
|
|
18.910995,-20.079072,7.490403,
|
|
|
|
|
|
50.114072,-58.670210,23.856863,
|
|
|
|
|
|
3.273746,-3.321150,1.267603,
|
|
|
|
|
|
140.969395,-137.481822,42.507159,
|
|
|
|
|
|
93.859327,-90.754295,27.811839,
|
|
|
|
|
|
-283.581279,232.017305,87.865897,
|
|
|
|
|
|
-28.193619,23.802666,3.963794,};
|
2024-03-23 11:06:37 +08:00
|
|
|
|
float T[2] = {0}; // 0 T_wheel 1 T_hip
|
2024-01-27 19:38:00 +08:00
|
|
|
|
float l = p->leg_len;
|
|
|
|
|
|
float lsqr = l * l;
|
|
|
|
|
|
|
2024-05-04 20:26:57 +08:00
|
|
|
|
uint8_t i, j;
|
2024-05-03 23:22:05 +08:00
|
|
|
|
|
2024-05-04 20:26:57 +08:00
|
|
|
|
// 离地时轮子输出置0
|
|
|
|
|
|
i = 0; j = i * 6;
|
|
|
|
|
|
T[i] = p->fly_flag ? 0 :
|
|
|
|
|
|
((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);
|
|
|
|
|
|
|
|
|
|
|
|
// 离地时关节输出仅保留 theta 和 theta_dot,保证滞空时腿部竖直
|
|
|
|
|
|
i = 1; 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 + (p->fly_flag ? 0 :
|
|
|
|
|
|
((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));
|
|
|
|
|
|
|
2024-01-27 19:38:00 +08:00
|
|
|
|
p->T_wheel = T[0];
|
|
|
|
|
|
p->T_hip = T[1];
|
|
|
|
|
|
}
|