Compare commits

..

172 Commits

Author SHA1 Message Date
6b36e1f182 Merge branch 'MC_02' of http://gitea.qutrobot.top/robofish/rm_balance into MC_02 2026-03-15 11:56:14 +08:00
68b167d3d2 123 2026-03-15 11:50:11 +08:00
760aaebfae 合并 神秘小轮腿 到 MC_02 2026-02-25 15:45:02 +08:00
04027e2c52 合并 测试比较 到 MC_02 2026-02-25 15:44:56 +08:00
f84458f243 合并 有可能疯的底盘 到 MC_02 2026-02-25 15:43:42 +08:00
887f9d778e 合并 单独底层纯转发 到 MC_02 2026-02-25 15:43:35 +08:00
e4fda840a0 合并 main 到 MC_02 2026-02-25 15:43:18 +08:00
72f710c27b 合并 balance_infantry 到 MC_02 2026-02-25 15:43:10 +08:00
62ed731cd2 改vmc 2026-01-08 11:31:52 +08:00
b1300f0d7d 抽象参数 2025-11-03 01:51:01 +08:00
a0908af220 优化速度估计 2025-10-25 23:31:28 +08:00
22e8029853 lqr好难调啊草 2025-10-25 00:17:56 +08:00
f87d2a29a6 开启上交建模 2025-10-23 23:22:54 +08:00
12016916ef 加个音乐 2025-10-23 23:22:20 +08:00
ce85f0f66c 加了个蜂鸣器 2025-10-23 01:59:27 +08:00
6d9e2a184d 添加ai 2025-10-19 20:22:55 +08:00
10ca460ebf 可以 2025-10-19 16:55:34 +08:00
1850429757 改rc 2025-10-19 14:17:18 +08:00
63db275f58 加imu铝箔 2025-10-19 13:37:10 +08:00
0b3cd65b2b 改参数 2025-10-19 11:25:16 +08:00
a9f8e48463 有点说法 2025-10-19 03:12:39 +08:00
3ebd0927a8 太奇怪了 2025-10-17 23:02:42 +08:00
45e340156c 改参数 2025-10-15 22:05:05 +08:00
8b5a7ec6cb 好用 2025-10-15 03:42:44 +08:00
3149179e9c 修线 2025-10-15 03:02:08 +08:00
7070545aa2 改can 2025-10-15 00:31:49 +08:00
8a16ea4f45 改can 2025-10-14 23:44:55 +08:00
4fed910cb7 改改 2025-10-14 22:14:41 +08:00
a5456a9094 改腿长 2025-10-14 21:34:49 +08:00
dd3501693b 修can发送 2025-10-13 01:29:09 +08:00
85d16a1bc0 添加cmd 2025-10-10 22:02:47 +08:00
22654da273 改名字 2025-10-10 20:16:28 +08:00
db7f569b5c 改轮腿 2025-10-10 17:31:19 +08:00
596de8c320 修ctrl 2025-10-10 16:59:25 +08:00
64216877e5 好qr 2025-10-10 00:21:11 +08:00
dcc3b55df8 改代码 2025-10-09 17:27:14 +08:00
17c6a92fd0 稀烂小陀螺 2025-10-09 00:03:30 +08:00
8f0f615fb1 改一下速度 2025-10-07 23:20:04 +08:00
ec8dd40ced 添加速度规划 2025-10-07 21:48:38 +08:00
ee435d8001 添加ai 2025-10-07 21:19:04 +08:00
b8698147d5 加ai 2025-10-07 20:10:56 +08:00
b5b1219f4a 添加crc 2025-10-07 19:45:47 +08:00
da38e37d02 添加命令任务 2025-10-07 16:12:17 +08:00
042ab6e390 加回rol补偿 2025-10-07 16:10:13 +08:00
cd01371736 Merge branch '准备重构' into balance_infantry - 解决冲突,保留balance_infantry版本 2025-10-07 14:00:53 +08:00
b4fe3ca2c3 好滤波 2025-10-07 13:56:53 +08:00
5851d2bbe7 完成上层 2025-10-07 03:51:47 +08:00
7da67a7f8c Merge branch 'upper' into 准备重构 2025-10-07 03:51:28 +08:00
522de3fe82 Merge branch 'main' into 单独底层纯转发 2025-10-07 03:49:27 +08:00
51fe29f605 牛逼 2025-10-07 03:45:56 +08:00
d5357ba317 改imu数据 2025-10-07 03:17:46 +08:00
489415aa34 纠正陀螺仪 2025-10-07 03:11:45 +08:00
83354623d1 添加088 2025-10-07 02:53:20 +08:00
96b6389a46 小改 2025-10-07 02:41:01 +08:00
1184b2d532 改k 2025-10-07 00:43:40 +08:00
85c698e7e6 改急性 2025-10-06 22:01:27 +08:00
92a75811ae 比较代码 2025-10-06 21:58:56 +08:00
df420f0324 调参数 2025-10-06 21:40:11 +08:00
827a871299 改范围 2025-10-06 20:46:21 +08:00
6e2e973dab 改解析 2025-10-06 20:39:44 +08:00
5207a45727 改发送 2025-10-06 20:37:54 +08:00
880cbdb8d9 改解析 2025-10-06 20:34:24 +08:00
bac96f42e6 修改发送规则 2025-10-06 20:30:04 +08:00
0e8981bfa8 imu还是寄了 2025-10-06 20:22:45 +08:00
eb691ab545 改发送 2025-10-06 20:10:27 +08:00
cce8e7bdaf 给底盘添加yaw 2025-10-06 19:28:34 +08:00
39108dec77 添加上层 2025-10-06 17:37:53 +08:00
9b5d806e5f 改k 2025-10-06 02:09:43 +08:00
676d877d24 改发送顺序 2025-10-05 21:05:17 +08:00
cedc8bbab1 改参数 2025-10-05 20:15:37 +08:00
11aef0acb2 改解析 2025-10-05 19:42:19 +08:00
7492cf8e05 调试1 2025-10-05 19:22:09 +08:00
89092f771b 修轮子方向 2025-10-05 19:10:49 +08:00
600568fcff 神秘小延时 2025-10-05 17:41:45 +08:00
24160f21dc 改rc,改pid 2025-10-05 17:39:38 +08:00
7f1c8f38b4 修改out 2025-10-05 17:23:03 +08:00
593cf97ae2 测试 2025-10-05 17:16:04 +08:00
50775af3b0 添加超时 2025-10-05 17:10:43 +08:00
3e400fadc0 添加rc 2025-10-05 17:03:34 +08:00
8feb1860a0 改id 2025-10-05 16:52:46 +08:00
21b565eaa9 使能失败 2025-10-05 16:24:06 +08:00
6035580f27 接受延时 2025-10-05 16:05:47 +08:00
555317ea3b 修lk 2025-10-05 14:43:31 +08:00
db9d9f7db5 改底盘 2025-10-05 14:13:49 +08:00
fa75912567 添加关节 2025-10-05 13:54:26 +08:00
000293a9b8 修改接受 2025-10-05 13:44:59 +08:00
5f33aac541 修改imu发送 2025-10-05 13:41:10 +08:00
cdd7be6ad7 改好底盘了 2025-10-05 13:33:46 +08:00
3b1ef030c2 有反馈了 2025-10-05 12:04:46 +08:00
16d4558693 道爷~我成了!!! 2025-10-05 11:15:25 +08:00
e4b1655698 imu完成 2025-10-05 03:25:18 +08:00
4f4e485912 添加imu 2025-10-05 03:03:27 +08:00
84c8d72e38 失败 2025-10-05 01:57:06 +08:00
722ea07411 关imu 2025-10-05 00:26:46 +08:00
59472bd2e8 关一下 2025-10-05 00:15:44 +08:00
7ac7f7d868 改发送 2025-10-05 00:03:38 +08:00
acedef346b 去掉delay 2025-10-04 23:35:04 +08:00
8edcf3205e gai ic 2025-10-04 23:30:57 +08:00
700b0dee8c gai 2025-10-04 23:28:12 +08:00
a5dbc24f25 1 2025-10-04 23:24:46 +08:00
50a36aa5f6 改id 2025-10-04 23:22:40 +08:00
acb070fce7 xiu 2025-10-04 23:19:58 +08:00
01ea1a9e78 2025-10-04 22:46:02 +08:00
1a739ab634 改imu 2025-10-04 22:12:03 +08:00
088db5d94f 1 2025-10-04 21:49:19 +08:00
81a5306962 修改imu 2025-10-04 21:05:11 +08:00
ca97903bab 暂存 2025-10-04 21:00:35 +08:00
ff2a3c5862 重构转发用的底层 2025-10-04 17:38:10 +08:00
7d868bf32a 添加底层 2025-10-04 11:50:40 +08:00
8ee3b8a298 改can 2025-10-03 22:12:28 +08:00
50e6b12cbc 更新can 2025-10-03 22:08:44 +08:00
ad9898bdc4 启动 2025-10-03 14:59:39 +08:00
9904b9ed81 改惨 2025-10-03 00:51:25 +08:00
d2ed44fee1 gai0 2025-10-03 00:15:58 +08:00
fe6a028033 第一次改lqr 2025-10-02 21:54:50 +08:00
0b74f21104 修改神秘小bug 2025-10-02 19:50:55 +08:00
938115adff 神秘小参数 2025-10-02 17:32:22 +08:00
555e6e3747 好用的云台pid 2025-10-02 17:25:47 +08:00
bf7533e7c2 重构 2025-10-02 16:59:28 +08:00
f641fe4051 更新shoot 2025-10-02 01:19:13 +08:00
1b237f9944 好参数 2025-10-01 20:53:02 +08:00
650ebc1f87 改k 2025-10-01 20:11:20 +08:00
d0727de06f 改完bug 2025-10-01 18:50:38 +08:00
1f2406508d 改config 2025-10-01 17:43:39 +08:00
fbeb29513d 修云台 2025-10-01 17:38:21 +08:00
65571643d6 修改rc_can 2025-10-01 15:07:01 +08:00
7aa5148a2b 修改can解析 2025-10-01 03:39:08 +08:00
e1c1c07b52 修rc发送 2025-10-01 03:20:52 +08:00
c024cb537e 俯仰角有问题 2025-10-01 03:16:28 +08:00
fcbb76fda4 修改遥控 2025-10-01 03:03:41 +08:00
57b47b800e 添加yaw 2025-10-01 03:01:32 +08:00
476268298a 修改射速 2025-10-01 02:35:44 +08:00
5d310fb707 云台差不多了 2025-10-01 02:29:24 +08:00
3892733f4d 暂存云台 2025-09-30 22:10:48 +08:00
ad716705ff 添加了can遥控 2025-09-30 21:56:07 +08:00
821fa5a03d 添加can遥控器 2025-09-30 21:01:58 +08:00
4da08b6e4b 添加rc——can 2025-09-30 19:12:10 +08:00
2b35ce3955 添加dm 2025-09-30 16:56:04 +08:00
fd58bb0462 添加陀螺仪 2025-09-30 16:32:29 +08:00
7905d42542 射了 2025-09-30 04:43:02 +08:00
799ad45397 修改了can发送演示 2025-09-29 20:11:16 +08:00
410d3a2376 删了shoot 2025-09-29 09:58:44 +08:00
5abffb4cd1 shoot 2025-09-29 03:35:01 +08:00
bc9628b56e 修改ccmram 2025-09-28 16:29:10 +08:00
e048e821e2 启动ccmram 2025-09-28 16:27:20 +08:00
aaa2e773d7 使用ccmram 2025-09-28 16:26:56 +08:00
830e749021 底层配置 2025-09-28 16:26:18 +08:00
5dd11c231d 优化freertos堆 2025-09-28 16:10:40 +08:00
21fd13e6c3 电机修好了 2025-09-26 15:09:20 +08:00
5254b6baa8 电机死了 2025-09-25 10:00:38 +08:00
734d2c90dc 管底盘 2025-09-24 17:44:40 +08:00
040176d54f dm 2025-09-23 21:31:03 +08:00
3e7ff5a16a 去掉usb 2025-09-20 01:38:52 +08:00
5ed34c0388 使用新版代码更新 2025-09-20 00:45:52 +08:00
4c6686a26a 修can 2025-09-20 00:39:04 +08:00
403a04fa2c cmake启动 2025-09-19 15:33:41 +08:00
01377f99e7 收腿 2025-09-18 23:05:44 +08:00
221673f702 修好了 2025-09-18 21:09:22 +08:00
ea97df03a8 起来自旋 2025-09-17 08:19:07 +08:00
b00ecf1af5 会斜腿 2025-09-17 08:10:09 +08:00
eef7001e2b 起飞了旋转了 2025-09-17 07:38:59 +08:00
de8bc5ac8c 起不来站不住 2025-09-17 07:10:10 +08:00
e7cccbf706 提交 2025-09-17 03:41:35 +08:00
58f7ba86db 修改vmc 2025-09-16 23:18:47 +08:00
e7aaf1b98f 提交 2025-09-08 20:05:22 +08:00
b7876f7eab 写好 2025-09-02 20:25:52 +08:00
6bb0e96aa8 修领空 2025-09-02 15:06:58 +08:00
38d4139f06 修复can发送无限制导致mailbox爆炸 2025-08-31 23:52:43 +08:00
9574929545 差一个电机 2025-08-31 22:25:15 +08:00
e75094a41d 添加电机 2025-08-31 15:41:31 +08:00
843ca3d931 添加陀螺仪 2025-08-30 11:37:24 +08:00
23ae0c3fa9 新建工程 2025-08-30 10:42:12 +08:00
4 changed files with 21 additions and 159 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -31,6 +31,7 @@ static void Chassis_UpdateChassisState(Chassis_t *c);
static void Chassis_ResetControllers(Chassis_t *c);
static void Chassis_SelectYawZeroPoint(Chassis_t *c);
static void Chassis_JumpControl(Chassis_t *c, const Chassis_CMD_t *c_cmd, float *target_L0, float *extra_force);
static void Chassis_RecoverControl(Chassis_t *c);
/* Private functions -------------------------------------------------------- */
@ -77,7 +78,6 @@ static void Chassis_ResetControllers(Chassis_t *c) {
PID_Reset(&c->pid.leg_length[0]);
PID_Reset(&c->pid.leg_length[1]);
PID_Reset(&c->pid.yaw);
PID_Reset(&c->pid.rotor);
PID_Reset(&c->pid.roll);
PID_Reset(&c->pid.roll_force);
PID_Reset(&c->pid.tp[0]);
@ -144,13 +144,6 @@ static int8_t Chassis_SetMode(Chassis_t *c, Chassis_Mode_t mode) {
return CHASSIS_OK;
}
/* ROTOR -> BALANCE启动退出过渡减速→对齐不立即切换 */
if (c->mode == CHASSIS_MODE_BALANCE_ROTOR &&
mode == CHASSIS_MODE_WHELL_LEG_BALANCE) {
c->rotor_state.exiting = true;
return CHASSIS_OK; /* 保持在 ROTOR 模式,由控制循环处理退出 */
}
Chassis_MotorEnable(c);
Chassis_ResetControllers(c);
Chassis_SelectYawZeroPoint(c);
@ -179,12 +172,6 @@ static int8_t Chassis_SetMode(Chassis_t *c, Chassis_Mode_t mode) {
c->recover.state[1] = (fabsf(theta_r) > (float)M_PI_2) ? RECOVER_FLIP : RECOVER_STRETCH;
}
/* 进入小陀螺时重置旋转状态 */
if (mode == CHASSIS_MODE_BALANCE_ROTOR) {
c->rotor_state.current_spin_speed = 0.0f;
c->rotor_state.exiting = false;
}
c->mode = mode;
return CHASSIS_OK;
}
@ -468,7 +455,6 @@ int8_t Chassis_Init(Chassis_t *c, Chassis_Params_t *param, float target_freq) {
PID_Init(&c->pid.leg_length[0], KPID_MODE_CALC_D, target_freq, &param->leg_length);
PID_Init(&c->pid.leg_length[1], KPID_MODE_CALC_D, target_freq, &param->leg_length);
PID_Init(&c->pid.yaw, KPID_MODE_CALC_D, target_freq, &param->yaw);
PID_Init(&c->pid.rotor, KPID_MODE_CALC_D, target_freq, &param->rotor);
PID_Init(&c->pid.roll, KPID_MODE_CALC_D, target_freq, &param->roll);
PID_Init(&c->pid.roll_force, KPID_MODE_CALC_D, target_freq, &param->roll_force);
PID_Init(&c->pid.tp[0], KPID_MODE_CALC_D, target_freq, &param->tp);
@ -557,13 +543,6 @@ int8_t Chassis_Init(Chassis_t *c, Chassis_Params_t *param, float target_freq) {
c->jump.launch_force = c->param->jump.launch_force;
c->jump.retract_leg_length = c->param->jump.retract_leg_length;
/* 初始化电机离线检测 */
c->motor_status.any_offline = false;
/* 初始化小陀螺状态 */
c->rotor_state.current_spin_speed = 0.0f;
c->rotor_state.exiting = false;
return CHASSIS_OK;
}
@ -580,19 +559,10 @@ int8_t Chassis_UpdateFeedback(Chassis_t *c) {
MOTOR_LK_UpdateAll();
/* 更新关节电机反馈 */
uint64_t now_us = BSP_TIME_Get_us();
bool any_offline = false;
for (int i = 0; i < 4; i++) {
MOTOR_LZ_t *joint_motor = MOTOR_LZ_GetMotor(&c->param->joint_param[i]);
if (joint_motor != NULL) {
c->feedback.joint[i] = joint_motor->motor.feedback;
/* 检测关节电机离线500ms 无更新 */
if (now_us - joint_motor->motor.header.last_online_time > 500000u) {
any_offline = true;
}
} else {
any_offline = true;
}
/* 机械零点调整 */
@ -610,17 +580,9 @@ int8_t Chassis_UpdateFeedback(Chassis_t *c) {
MOTOR_LK_t *wheel_motor = MOTOR_LK_GetMotor(&c->param->wheel_param[i]);
if (wheel_motor != NULL) {
c->feedback.wheel[i] = wheel_motor->motor.feedback;
/* 检测轮子电机离线500ms 无更新 */
if (now_us - wheel_motor->motor.header.last_online_time > 500000u) {
any_offline = true;
}
} else {
any_offline = true;
}
}
c->motor_status.any_offline = any_offline;
/* 更新机体状态估计 */
Chassis_UpdateChassisState(c);
@ -653,17 +615,6 @@ int8_t Chassis_Control(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
c->dt = (BSP_TIME_Get_us() - c->lask_wakeup) / 1000000.0f;
c->lask_wakeup = BSP_TIME_Get_us();
/* 电机离线保护:有电机离线时强制 RELAX 并持续使能 */
if (c->motor_status.any_offline) {
if (c->mode != CHASSIS_MODE_RELAX) {
c->mode = CHASSIS_MODE_RELAX;
Chassis_ResetControllers(c);
}
Chassis_MotorRelax(c);
Chassis_MotorEnable(c);
return CHASSIS_OK;
}
/* 设置底盘模式 */
if (Chassis_SetMode(c, c_cmd->mode) != CHASSIS_OK) {
return CHASSIS_ERR_MODE;
@ -715,6 +666,8 @@ int8_t Chassis_Control(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
break;
case CHASSIS_MODE_BALANCE_ROTOR:
Chassis_LQRControl(c, c_cmd);
c->output.wheel[0] += c_cmd->move_vec.vy * 0.2f;
c->output.wheel[1] -= c_cmd->move_vec.vy * 0.2f;
Chassis_VMCControl(c, c_cmd);
Chassis_Output(c);
break;
@ -770,18 +723,21 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
if (c == NULL || c_cmd == NULL) return CHASSIS_ERR_NULL;
/* ==================== 速度控制 ==================== */
if (c_cmd->mode == CHASSIS_MODE_BALANCE_ROTOR) {
/* 小陀螺平移:将世界坐标系期望速度投影到机体坐标系 */
float yaw_angle = c->feedback.imu.euler.yaw;
float world_vx = c_cmd->move_vec.vx * c->param->rotor_ctrl.max_trans_speed;
c->chassis_state.target_velocity_x = world_vx * cosf(yaw_angle);
c->chassis_state.last_target_velocity_x = c->chassis_state.target_velocity_x;
c->chassis_state.target_x += c->chassis_state.target_velocity_x * c->dt;
} else {
c->chassis_state.target_velocity_x = c_cmd->move_vec.vx * 2.0f;
c->chassis_state.last_target_velocity_x = c->chassis_state.target_velocity_x;
c->chassis_state.target_x += c->chassis_state.target_velocity_x * c->dt;
}
// float raw_vx = c_cmd->move_vec.vx * 2.0f;
// float desired_velocity = c->yaw_control.is_reversed ? -raw_vx : raw_vx;
// /* 加速度限制 */
// float velocity_change = desired_velocity - c->chassis_state.last_target_velocity_x;
// float max_velocity_change = c->param->motion.max_acceleration * c->dt;
// velocity_change = LIMIT(velocity_change, -max_velocity_change, max_velocity_change);
// float target_dot_x = c->chassis_state.last_target_velocity_x + velocity_change;
// c->chassis_state.target_velocity_x = target_dot_x;
// c->chassis_state.last_target_velocity_x = target_dot_x;
// c->chassis_state.target_x += target_dot_x * c->dt;
c->chassis_state.target_velocity_x = c_cmd->move_vec.vx * 2.0f;
c->chassis_state.last_target_velocity_x = c->chassis_state.target_velocity_x;
c->chassis_state.target_x += c->chassis_state.target_velocity_x * c->dt;
/* ==================== 状态更新 ==================== */
@ -805,71 +761,17 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
LQR_CalculateGainMatrix(&c->lqr[1], c->vmc_[1].leg.L0);
/* ==================== 目标状态 ==================== */
/* 腿长-位移补偿:根据腿长多项式拟合补偿位移偏移 */
float avg_L0 = (c->vmc_[0].leg.L0 + c->vmc_[1].leg.L0) * 0.5f;
float leg_x_comp = -45.406f * avg_L0 * avg_L0 * avg_L0
+ 7.06585f * avg_L0 * avg_L0
+ 5.98465f * avg_L0
- 1.14975f;
LQR_State_t target_state = {
.theta = 0.0f+c->param->lqr_offset.theta,
.d_theta = 0.0f,
.phi = 0.0f+c->param->lqr_offset.phi,
.d_phi = 0.0f,
.x = c->chassis_state.target_x+c->param->lqr_offset.x + leg_x_comp,
.x = c->chassis_state.target_x+c->param->lqr_offset.x,
.d_x = c->chassis_state.target_velocity_x,
};
/* ==================== Yaw轴控制 ==================== */
if (c_cmd->mode == CHASSIS_MODE_BALANCE_ROTOR || c->mode == CHASSIS_MODE_BALANCE_ROTOR) {
/* 小陀螺模式PID跟踪目标角速度带速度斜坡 */
float target_spin = c_cmd->move_vec.vy * c->param->rotor_ctrl.max_spin_speed;
if (c->rotor_state.exiting) {
/* 退出过渡目标角速度为0用减速斜坡 */
target_spin = 0.0f;
float decel_step = c->param->rotor_ctrl.spin_decel * c->dt;
if (c->rotor_state.current_spin_speed > decel_step) {
c->rotor_state.current_spin_speed -= decel_step;
} else if (c->rotor_state.current_spin_speed < -decel_step) {
c->rotor_state.current_spin_speed += decel_step;
} else {
/* 减速完成检查yaw对齐 */
c->rotor_state.current_spin_speed = 0.0f;
Chassis_SelectYawZeroPoint(c);
float yaw_error = CircleError(c->yaw_control.target_yaw,
c->feedback.yaw.rotor_abs_angle, M_2PI);
if (fabsf(yaw_error) < c->param->rotor_ctrl.align_threshold) {
/* 对齐完成,切换到平衡模式 */
c->rotor_state.exiting = false;
c->mode = CHASSIS_MODE_WHELL_LEG_BALANCE;
Chassis_ResetControllers(c);
}
}
} else {
/* 正常旋转:平滑加速斜坡 */
float accel_step = c->param->rotor_ctrl.spin_accel * c->dt;
if (c->rotor_state.current_spin_speed < target_spin - accel_step) {
c->rotor_state.current_spin_speed += accel_step;
} else if (c->rotor_state.current_spin_speed > target_spin + accel_step) {
c->rotor_state.current_spin_speed -= accel_step;
} else {
c->rotor_state.current_spin_speed = target_spin;
}
}
/* 退出过渡减速完成后用yaw PID对齐零点 */
if (c->rotor_state.exiting && c->rotor_state.current_spin_speed == 0.0f) {
c->yaw_control.yaw_force = PID_Calc(&c->pid.yaw, c->yaw_control.target_yaw,
c->feedback.yaw.rotor_abs_angle, 0.0f, c->dt);
} else {
float current_yaw_omega = c->feedback.imu.gyro.z;
c->yaw_control.yaw_force = PID_Calc(&c->pid.rotor, c->rotor_state.current_spin_speed,
current_yaw_omega, 0.0f, c->dt);
}
c->yaw_control.is_reversed = false;
} else {
if (c_cmd->mode!= CHASSIS_MODE_BALANCE_ROTOR || c_cmd->move_vec.vy == 0.0f) {
c->yaw_control.current_yaw = c->feedback.yaw.rotor_abs_angle;
float manual_offset = c_cmd->move_vec.vy * M_PI_2;
@ -921,6 +823,7 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
/* ==================== 轮毂输出 ==================== */
/* 腿长增加时有效轮距增大等比例缩小yaw_force防止过冲 */
float avg_L0 = (c->vmc_[0].leg.L0 + c->vmc_[1].leg.L0) * 0.5f;
float yaw_scale = c->param->leg.base_length / avg_L0; /* 以基础腿长为基准归一化 */
float scaled_yaw_force = c->yaw_control.yaw_force * yaw_scale;

View File

@ -103,7 +103,6 @@ typedef struct {
LQR_GainMatrix_t lqr_gains; /* LQR增益矩阵参数 */
KPID_Params_t yaw; /* yaw轴PID控制参数 */
KPID_Params_t rotor; /* 小陀螺角速度PID */
KPID_Params_t roll; /* roll轴腿长补偿PID */
KPID_Params_t roll_force; /* roll轴力补偿PID */
KPID_Params_t tp; /* 摆力矩PID */
@ -147,15 +146,6 @@ typedef struct {
float non_contact_theta; /* 离地时摆角目标 (rad) */
} motion;
/* 小陀螺参数 */
struct {
float max_spin_speed; /* 最大旋转角速度 (rad/s) */
float max_trans_speed; /* 小陀螺时最大平移速度 (m/s) */
float spin_accel; /* 旋转加速度 (rad/s²) */
float spin_decel; /* 退出减速度 (rad/s²) */
float align_threshold; /* 退出对齐阈值 (rad)yaw误差小于此值时回到BALANCE模式 */
} rotor_ctrl;
/* LQR 目标状态偏移 */
struct {
float theta;
@ -210,12 +200,6 @@ typedef struct {
bool is_reversed; /* 是否使用反转的零点180度零点影响前后方向 */
} yaw_control;
/* 小陀螺状态 */
struct {
float current_spin_speed; /* 当前旋转速度 (rad/s),含斜坡 */
bool exiting; /* 正在退出小陀螺 */
} rotor_state;
/* 跳跃控制相关 */
struct {
Jump_State_t state; /* 跳跃状态 */
@ -231,11 +215,6 @@ typedef struct {
Recover_State_t state[2]; /* 左右腿自起状态 */
} recover;
/* 电机离线检测 */
struct {
bool any_offline; /* 是否有电机离线 */
} motor_status;
/* PID计算的目标值 */
struct {
AHRS_Eulr_t chassis;
@ -244,7 +223,6 @@ typedef struct {
/* 反馈控制用的PID */
struct {
KPID_t yaw; /* 跟随云台用的PID */
KPID_t rotor; /* 小陀螺角速度PID */
KPID_t roll; /* 横滚角腿长补偿PID */
KPID_t roll_force; /* 横滚角力补偿PID */
KPID_t tp[2];

View File

@ -243,17 +243,6 @@ Config_RobotParam_t robot_config = {
.range=M_2PI, /* 2*PI用于处理角度循环误差 */
},
.rotor={
.k=1.0f,
.p=0.5f,
.i=0.0f,
.d=0.01f,
.i_limit=0.0f,
.out_limit=1.0f,
.d_cutoff_freq=30.0f,
.range=-1.0f, /* 角速度不需要循环误差处理 */
},
.roll={
.k=0.15f,
.p=0.3f, /* 横滚角腿长补偿比例系数 (降低避免抖动) */
@ -394,14 +383,6 @@ Config_RobotParam_t robot_config = {
.non_contact_theta = -0.01f, /* 离地摆角目标 (rad) */
},
.rotor_ctrl = {
.max_spin_speed = 0.05236f, /* 最大旋转角速度 (rad/s)0.5rpm */
.max_trans_speed = 1.5f, /* 小陀螺时最大平移速度 (m/s) */
.spin_accel = 5.0f, /* 旋转加速度 (rad/s²) */
.spin_decel = 8.0f, /* 退出减速度 (rad/s²),比加速更快 */
.align_threshold = 0.15f, /* 退出对齐阈值 (rad)约8.6° */
},
.vmc_param = {
{ // 左腿
.leg_1 = 0.215f, // 后髋连杆长度 (L1) (m)