mirror of
https://gitee.com/dlmu-cone/bf_original_balance_chassis
synced 2026-07-23 19:25:09 +08:00
添加速度位置闭环分离和电机离线保护
This commit is contained in:
@@ -186,14 +186,36 @@ static void EnableAllMotor() /* 打开所有电机 */
|
||||
LKMotorEnable(driven[i]);
|
||||
}
|
||||
|
||||
// 检查关节电机是否离线
|
||||
static uint8_t JointMotorIsLost()
|
||||
{
|
||||
for (uint8_t i = 0; i < JOINT_CNT; i++)
|
||||
{
|
||||
if(joint[i]->motor_daemon->temp_count == 0)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 检查驱动轮电机是否离线
|
||||
static uint8_t DrivenMotorIsLost()
|
||||
{
|
||||
for(uint8_t i = 0; i < DRIVEN_CNT; i++)
|
||||
{
|
||||
if(driven[i]->daemon->temp_count == 0)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 切换底盘遥控器控制和云台双板控制 */
|
||||
static void ControlSwitch()
|
||||
{
|
||||
// 根据裁判系统底盘输出电压设定底盘状态
|
||||
float chassis_vol = referee_data->PowerHeatData.chassis_voltage * 0.001;
|
||||
if (chassis_vol < 15.0f ||
|
||||
l_driven->daemon->temp_count == 0 ||
|
||||
r_driven->daemon->temp_count == 0)
|
||||
if (chassis_vol < 15.0f || JointMotorIsLost() || DrivenMotorIsLost())
|
||||
{
|
||||
chassis_cmd_recv.chassis_mode = CHASSIS_ZERO_FORCE; // 皆离线,急停
|
||||
return;
|
||||
@@ -310,8 +332,6 @@ static void WokingStateSet()
|
||||
|
||||
// 加速度限幅,防止键盘控制摔倒
|
||||
chassis.target_v += sign(chassis_cmd_recv.vx - chassis.target_v) * MAX_ACC_REF * del_t;
|
||||
// 模型距离参考输入
|
||||
chassis.target_dist += chassis.target_v * del_t;
|
||||
|
||||
// 角度输入
|
||||
chassis.target_yaw = chassis_cmd_recv.offset_angle;
|
||||
|
||||
@@ -11,16 +11,14 @@
|
||||
#define BALANCE_GRAVITY_BIAS 0
|
||||
#define ROLL_GRAVITY_BIAS 0
|
||||
#define MAX_ACC_REF 0.9f
|
||||
#define MAX_DIST_TRACK 1.0f
|
||||
#define MAX_VEL_TRACK 0.5f
|
||||
|
||||
// 驱动轮质量
|
||||
#define WHEEL_MASS 0.58f
|
||||
|
||||
// IMU距离中心的距离
|
||||
#define CENTER_IMU_W 0
|
||||
#define CENTER_IMU_L 0.1f
|
||||
#define CENTER_IMU_H -0.055f
|
||||
#define CENTER_IMU_W -0.024f
|
||||
#define CENTER_IMU_L 0.09f
|
||||
#define CENTER_IMU_H -0.1f
|
||||
|
||||
#define VEL_PROCESS_NOISE 10 // 速度过程噪声
|
||||
#define VEL_MEASURE_NOISE 2000 // 速度测量噪声
|
||||
|
||||
@@ -9,18 +9,18 @@
|
||||
*/
|
||||
static void CalcLQR(LinkNPodParam *p, ChassisParam *chassis)
|
||||
{
|
||||
static float k[12][3] = {62.680622,-74.772126,-13.135672,
|
||||
1.620796,-4.331826,-0.454705,
|
||||
32.093563,-25.558681,-16.605856,
|
||||
19.128242,-17.562747,-10.815380,
|
||||
225.373594,-201.324771,53.236052,
|
||||
13.575849,-13.013546,3.845604,
|
||||
76.704297,-72.201666,20.359891,
|
||||
4.520141,-4.051799,1.189345,
|
||||
139.418565,-125.750074,34.110069,
|
||||
88.295852,-79.170124,21.430975,
|
||||
-163.725633,127.852860,110.004619,
|
||||
-9.557678,7.476790,4.655220};
|
||||
static float k[12][3] = {64.570926,-78.151551,-15.098827,
|
||||
1.716153,-4.573289,-0.526836,
|
||||
25.565621,-20.634320,-17.563574,
|
||||
11.633020,-11.021911,-13.087704,
|
||||
212.754066,-196.450645,56.227305,
|
||||
12.051262,-11.941105,4.523285,
|
||||
74.149148,-71.296364,23.673363,
|
||||
4.449069,-4.214434,1.145555,
|
||||
115.321993,-106.373546,29.626387,
|
||||
82.459182,-74.915697,20.072512,
|
||||
-163.793049,130.808796,114.419419,
|
||||
-13.396998,11.357026,4.288949};
|
||||
float T[2] = {0}; // 0 T_wheel 1 T_hip
|
||||
float l = p->leg_len;
|
||||
float lsqr = l * l;
|
||||
|
||||
@@ -59,5 +59,13 @@ void SpeedEstimation(LinkNPodParam *lp, LinkNPodParam *rp, ChassisParam *cp, INS
|
||||
cp->vel_cov = (1 - k) * vel_cov; // 后验协方差
|
||||
|
||||
VAL_LIMIT(cp->vel_cov, 0.01, 100); // 协方差限幅
|
||||
cp->dist = cp->dist + cp->vel * delta_t;
|
||||
|
||||
// 速度和位置分离,有速度输入时不进行位置闭环
|
||||
if(abs(cp->target_v) < 0.001)
|
||||
{
|
||||
cp->target_dist = 0;
|
||||
cp->dist += cp->vel * delta_t;
|
||||
}
|
||||
else
|
||||
cp->target_dist = cp->dist = 0;
|
||||
}
|
||||
Reference in New Issue
Block a user