用于调整出最优参数

This commit is contained in:
2026-04-22 18:34:11 +08:00
parent a1e0b4312f
commit 85ef07da95
5 changed files with 255 additions and 118 deletions

View File

@@ -62,29 +62,13 @@ void CorridorCtrl_Compute(const CorridorState_t *state,
w_cmd = -(s_cfg.kd_theta * imu_wz);
} else {
/*
* 简化原则:
* - IMU 只管航向 (e_th + wz)
* - 左右激光只管居中
*
* 只要左右两侧都完整有效,就直接用左右平均距离差做横向误差:
* e_y_direct = (d_right - d_left)/2
* 车在正中时 d_left ~= d_right因此误差应接近 0。
*
* 若当前帧双侧不完整,再退回滤波器给出的 e_y。
* 横向偏差始终使用 EKF 滤波输出 state->e_y
* EKF 内部已做分侧 inset 补偿、马氏距离异常检测和协方差加权,
* 控制器不应越级用原始观测差值覆盖。
*/
float e_y_ctrl = state->e_y;
bool left_ok = ((obs->valid_mask & (1U << 0)) != 0U) &&
((obs->valid_mask & (1U << 1)) != 0U);
bool right_ok = ((obs->valid_mask & (1U << 2)) != 0U) &&
((obs->valid_mask & (1U << 3)) != 0U);
if (left_ok && right_ok) {
float d_left = (obs->d_lf + obs->d_lr) * 0.5f;
float d_right = (obs->d_rf + obs->d_rr) * 0.5f;
e_y_ctrl = 0.5f * (d_right - d_left);
}
/* 正常控制: IMU 管航向, 左右激光管居中 */
/* 正常控制: IMU 管航向, EKF 管居中 */
w_cmd = -(s_cfg.kp_theta * state->e_th
+ s_cfg.kd_theta * imu_wz
+ s_cfg.kp_y * e_y_ctrl);