2024-04-30 21:23:03 +08:00
|
|
|
#include "balance.h"
|
|
|
|
|
#include "arm_math.h"
|
|
|
|
|
#include "math.h"
|
|
|
|
|
#include "user_lib.h"
|
|
|
|
|
|
|
|
|
|
// 驱动轮支持力解算
|
2024-05-03 23:22:05 +08:00
|
|
|
void NormalForceSolve(LinkNPodParam *p, INS_t *imu)
|
2024-04-30 21:23:03 +08:00
|
|
|
{
|
|
|
|
|
static float accx, accy, accz;
|
|
|
|
|
accx = imu->MotionAccel_b[X];
|
|
|
|
|
accy = imu->MotionAccel_b[Y];
|
|
|
|
|
accz = imu->MotionAccel_b[Z];
|
|
|
|
|
|
|
|
|
|
static float pitch, roll;
|
|
|
|
|
pitch = imu->Pitch;
|
|
|
|
|
roll = imu->Roll;
|
|
|
|
|
|
2024-05-03 23:22:05 +08:00
|
|
|
// 机体竖直方向加速度
|
2024-04-30 21:23:03 +08:00
|
|
|
p->zw_ddot = -msin(roll) * accx + mcos(roll) * msin(pitch) * accy + mcos(pitch) * mcos(roll) * accz;
|
|
|
|
|
|
|
|
|
|
// 驱动轮支持力解算
|
|
|
|
|
static float P;
|
|
|
|
|
P = p->F_leg * mcos(p->theta) + p->T_hip * msin(p->theta) / p->leg_len;
|
|
|
|
|
p->normal_force = P + WHEEL_MASS * (p->zw_ddot + 9.81f);
|
2024-05-03 23:22:05 +08:00
|
|
|
|
|
|
|
|
// 离地检测
|
|
|
|
|
if(p->normal_force < 20.0f)
|
|
|
|
|
p->fly_flag = 1;
|
|
|
|
|
else
|
|
|
|
|
p->fly_flag = 0;
|
2024-04-30 21:23:03 +08:00
|
|
|
}
|