From 6d70af459920d865af05d51ab41f2893427d5530 Mon Sep 17 00:00:00 2001 From: Robofish <1683502971@qq.com> Date: Thu, 19 Feb 2026 13:03:05 +0800 Subject: [PATCH] remake_jump --- User/module/balance_chassis.c | 20 +++++++------------- User/module/balance_chassis.h | 8 -------- User/module/config.c | 2 +- User/task/ctrl_chassis.c | 6 ------ User/task/rc.c | 11 ++++++++--- 5 files changed, 16 insertions(+), 31 deletions(-) diff --git a/User/module/balance_chassis.c b/User/module/balance_chassis.c index e3b8ddc..8cb2ebf 100644 --- a/User/module/balance_chassis.c +++ b/User/module/balance_chassis.c @@ -580,6 +580,13 @@ int8_t Chassis_Control(Chassis_t *c, const Chassis_CMD_t *c_cmd) { return CHASSIS_ERR_MODE; } + /* 跳跃触发入口统一放在底盘控制主流程:由chassis_cmd直接驱动 */ + if (c_cmd->jump_trigger && + c->mode == CHASSIS_MODE_WHELL_LEG_BALANCE && + c->jump.state == JUMP_IDLE) { + c->jump.trigger = true; + } + /* VMC正解算 */ VMC_ForwardSolve(&c->vmc_[0], c->feedback.joint[0].rotor_abs_angle, c->feedback.joint[1].rotor_abs_angle, @@ -948,16 +955,3 @@ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd) { return CHASSIS_OK; } - -/** - * @brief 触发跳跃 - * @param c 底盘结构体指针 - */ -void Chassis_TriggerJump(Chassis_t *c) { - if (c == NULL) return; - - /* 只在平衡模式且待机状态下可触发跳跃 */ - if (c->mode == CHASSIS_MODE_WHELL_LEG_BALANCE && c->jump.state == JUMP_IDLE) { - c->jump.trigger = true; - } -} diff --git a/User/module/balance_chassis.h b/User/module/balance_chassis.h index e6dfda9..19a5879 100644 --- a/User/module/balance_chassis.h +++ b/User/module/balance_chassis.h @@ -249,14 +249,6 @@ int8_t Chassis_Control(Chassis_t *c, const Chassis_CMD_t *c_cmd); */ int8_t Chassis_LQRControl(Chassis_t *c, const Chassis_CMD_t *c_cmd); -/** - * \brief 触发跳跃 - * - * \param c 包含底盘数据的结构体 - * \note 只在CHASSIS_MODE_WHELL_LEG_BALANCE模式下有效 - */ -void Chassis_TriggerJump(Chassis_t *c); - /** * \brief 底盘输出值 * diff --git a/User/module/config.c b/User/module/config.c index 2b7c900..775a8a7 100644 --- a/User/module/config.c +++ b/User/module/config.c @@ -348,7 +348,7 @@ Config_RobotParam_t robot_config = { .launch_time_ms = 120, .retract_time_ms = 80, .land_time_ms = 300, - .crouch_leg_length = 0.1f, + .crouch_leg_length = 0.14f, .launch_force = 200.0f, .retract_leg_length = 0.1f, /* 收腿目标更短 */ .retract_force = -120.0f, /* 收腿前馈力加大 */ diff --git a/User/task/ctrl_chassis.c b/User/task/ctrl_chassis.c index b5d3439..e180d6a 100644 --- a/User/task/ctrl_chassis.c +++ b/User/task/ctrl_chassis.c @@ -90,12 +90,6 @@ void Task_ctrl_chassis(void *argument) { Chassis_UpdateFeedback(&chassis); - /* 检查跳跃触发 */ - if (chassis_cmd.jump_trigger) { - Chassis_TriggerJump(&chassis); - chassis_cmd.jump_trigger = false; /* 清除触发标志 */ - } - Chassis_Control(&chassis, &chassis_cmd); osMessageQueueReset(task_runtime.msgq.chassis.vofa); // 重置消息队列,防止阻塞 osMessageQueuePut(task_runtime.msgq.chassis.vofa, &chassis, 0, 0); diff --git a/User/task/rc.c b/User/task/rc.c index 55698da..6a82a6c 100644 --- a/User/task/rc.c +++ b/User/task/rc.c @@ -143,18 +143,23 @@ void Task_rc(void *argument) { /************************* 底盘命令 **************************************/ /* 跳跃触发检测:ch_res 从 -1.0f 松开回 0 时触发 */ static bool ch_res_was_min = false; /* 记录上次是否在最低位置 */ + static uint8_t jump_trigger_hold_cnt = 0; /* 触发保持计数,避免单拍脉冲被队列重置吞掉 */ const float CH_RES_MIN_THRESHOLD = -0.9f; /* 判定为最低位置的阈值 */ const float CH_RES_RELEASE_THRESHOLD = -0.3f; /* 判定为松开的阈值 */ - - cmd_for_chassis.jump_trigger = false; /* 默认不触发 */ + if (dr16.data.ch_res < CH_RES_MIN_THRESHOLD) { ch_res_was_min = true; /* 记录已到达最低位置 */ } else if (ch_res_was_min && dr16.data.ch_res > CH_RES_RELEASE_THRESHOLD) { /* 从最低位置松开,触发跳跃 */ - cmd_for_chassis.jump_trigger = true; + jump_trigger_hold_cnt = 5; /* 保持5个RC周期,确保ctrl任务一定能收到 */ ch_res_was_min = false; /* 重置状态 */ } + cmd_for_chassis.jump_trigger = (jump_trigger_hold_cnt > 0); + if (jump_trigger_hold_cnt > 0) { + jump_trigger_hold_cnt--; + } + switch (dr16.data.sw_l) { case DR16_SW_UP: cmd_for_chassis.mode = CHASSIS_MODE_RELAX;