remake_jump
This commit is contained in:
parent
957706859a
commit
6d70af4599
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 底盘输出值
|
||||
*
|
||||
|
||||
@ -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, /* 收腿前馈力加大 */
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user