remake_jump

This commit is contained in:
Robofish 2026-02-19 13:03:05 +08:00
parent 957706859a
commit 6d70af4599
5 changed files with 16 additions and 31 deletions

View File

@ -580,6 +580,13 @@ int8_t Chassis_Control(Chassis_t *c, const Chassis_CMD_t *c_cmd) {
return CHASSIS_ERR_MODE; 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正解算 */
VMC_ForwardSolve(&c->vmc_[0], c->feedback.joint[0].rotor_abs_angle, VMC_ForwardSolve(&c->vmc_[0], c->feedback.joint[0].rotor_abs_angle,
c->feedback.joint[1].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; 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;
}
}

View File

@ -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); 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 * \brief
* *

View File

@ -348,7 +348,7 @@ Config_RobotParam_t robot_config = {
.launch_time_ms = 120, .launch_time_ms = 120,
.retract_time_ms = 80, .retract_time_ms = 80,
.land_time_ms = 300, .land_time_ms = 300,
.crouch_leg_length = 0.1f, .crouch_leg_length = 0.14f,
.launch_force = 200.0f, .launch_force = 200.0f,
.retract_leg_length = 0.1f, /* 收腿目标更短 */ .retract_leg_length = 0.1f, /* 收腿目标更短 */
.retract_force = -120.0f, /* 收腿前馈力加大 */ .retract_force = -120.0f, /* 收腿前馈力加大 */

View File

@ -90,12 +90,6 @@ void Task_ctrl_chassis(void *argument) {
Chassis_UpdateFeedback(&chassis); Chassis_UpdateFeedback(&chassis);
/* 检查跳跃触发 */
if (chassis_cmd.jump_trigger) {
Chassis_TriggerJump(&chassis);
chassis_cmd.jump_trigger = false; /* 清除触发标志 */
}
Chassis_Control(&chassis, &chassis_cmd); Chassis_Control(&chassis, &chassis_cmd);
osMessageQueueReset(task_runtime.msgq.chassis.vofa); // 重置消息队列,防止阻塞 osMessageQueueReset(task_runtime.msgq.chassis.vofa); // 重置消息队列,防止阻塞
osMessageQueuePut(task_runtime.msgq.chassis.vofa, &chassis, 0, 0); osMessageQueuePut(task_runtime.msgq.chassis.vofa, &chassis, 0, 0);

View File

@ -143,18 +143,23 @@ void Task_rc(void *argument) {
/************************* 底盘命令 **************************************/ /************************* 底盘命令 **************************************/
/* 跳跃触发检测ch_res 从 -1.0f 松开回 0 时触发 */ /* 跳跃触发检测ch_res 从 -1.0f 松开回 0 时触发 */
static bool ch_res_was_min = false; /* 记录上次是否在最低位置 */ 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_MIN_THRESHOLD = -0.9f; /* 判定为最低位置的阈值 */
const float CH_RES_RELEASE_THRESHOLD = -0.3f; /* 判定为松开的阈值 */ const float CH_RES_RELEASE_THRESHOLD = -0.3f; /* 判定为松开的阈值 */
cmd_for_chassis.jump_trigger = false; /* 默认不触发 */
if (dr16.data.ch_res < CH_RES_MIN_THRESHOLD) { if (dr16.data.ch_res < CH_RES_MIN_THRESHOLD) {
ch_res_was_min = true; /* 记录已到达最低位置 */ ch_res_was_min = true; /* 记录已到达最低位置 */
} else if (ch_res_was_min && dr16.data.ch_res > CH_RES_RELEASE_THRESHOLD) { } 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; /* 重置状态 */ 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) { switch (dr16.data.sw_l) {
case DR16_SW_UP: case DR16_SW_UP:
cmd_for_chassis.mode = CHASSIS_MODE_RELAX; cmd_for_chassis.mode = CHASSIS_MODE_RELAX;