From f2b71bfae3a666447145a13f6256b35dfba110f3 Mon Sep 17 00:00:00 2001 From: guoxy06 <209087794@qq.com> Date: Thu, 26 Mar 2026 21:21:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=94=AE=E9=BC=A0=E5=8F=91?= =?UTF-8?q?=E5=B0=84=EF=BC=8C=E7=8E=B0=E5=9C=A8=E9=94=AE=E9=BC=A0=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=B0=8F=E9=99=80=E8=9E=BA=E7=A7=BB=E5=8A=A8=E6=9C=89?= =?UTF-8?q?=E7=82=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/cmd/robot_cmd.c | 73 ++++++++++++++++++++++++++++--------- application/gimbal/gimbal.c | 4 +- application/shoot/shoot.c | 31 ++++++++++------ 3 files changed, 78 insertions(+), 30 deletions(-) diff --git a/application/cmd/robot_cmd.c b/application/cmd/robot_cmd.c index 7cf6724..d8e1c3d 100644 --- a/application/cmd/robot_cmd.c +++ b/application/cmd/robot_cmd.c @@ -230,7 +230,7 @@ static void RemoteControlSet() shoot_cmd_send.friction_mode = FRICTION_OFF; // 拨弹控制,遥控器固定为一种拨弹模式,可自行选择 if (rc_data[TEMP].rc.dial >500) - shoot_cmd_send.load_mode = LOAD_1_BULLET; + shoot_cmd_send.load_mode = LOAD_3_BULLET; else shoot_cmd_send.load_mode = LOAD_STOP; // 射频控制,固定每秒1发,后续可以根据左侧拨轮的值大小切换射频, @@ -269,20 +269,45 @@ static void MouseKeySet() shoot_cmd_send.bullet_speed = 30; break; } - switch (rc_data[TEMP].key_count[KEY_PRESS][Key_E] % 4) // E键设置发射模式 - { - case 0: - shoot_cmd_send.load_mode = LOAD_STOP; - break; - case 1: - shoot_cmd_send.load_mode = LOAD_1_BULLET; - break; - case 2: - shoot_cmd_send.load_mode = LOAD_3_BULLET; - break; - default: - shoot_cmd_send.load_mode = LOAD_BURSTFIRE; - break; + // switch (rc_data[TEMP].key_count[KEY_PRESS][Key_E] % 4) // E键设置发射模式 + // { + // case 0: + // shoot_cmd_send.load_mode = LOAD_STOP; + // break; + // case 1: + // shoot_cmd_send.load_mode = LOAD_1_BULLET; + // break; + // case 2: + // shoot_cmd_send.load_mode = LOAD_3_BULLET; + // break; + // default: + // shoot_cmd_send.load_mode = LOAD_BURSTFIRE; + // break; + // } + // switch (rc_data[TEMP].mouse.press_l) // 鼠标左键射击 + // { + // case 0: + // shoot_cmd_send.load_mode = LOAD_STOP; + // break; + // default: + // shoot_cmd_send.load_mode = LOAD_1_BULLET; // 按鼠标进行单发 + // break; + // } + // switch (rc_data[TEMP].mouse.press_r) // 鼠标右键射击 + // { + // case 0: + // shoot_cmd_send.load_mode = LOAD_STOP; + // break; + // default: + // shoot_cmd_send.load_mode = LOAD_3_BULLET; // 按鼠标进行单发 + // break; + // } + if (rc_data[TEMP].mouse.press_l) { + shoot_cmd_send.load_mode = LOAD_1_BULLET; // 左键单发 + } else if (rc_data[TEMP].mouse.press_r) { + shoot_cmd_send.load_mode = LOAD_3_BULLET; // 右键三连发 + } else { + shoot_cmd_send.load_mode = LOAD_STOP; // 不按鼠标不发射 } switch (rc_data[TEMP].key_count[KEY_PRESS][Key_R] % 2) // R键开关弹舱 { @@ -317,7 +342,18 @@ static void MouseKeySet() chassis_cmd_send.chassis_speed_buff = 100; break; } - switch (rc_data[TEMP].key[KEY_PRESS].shift) // 待添加 按shift允许超功率 消耗缓冲能量 + switch (rc_data[TEMP].key_count[KEY_PRESS][Key_Q] % 2) // Q键设置底盘运动模式 + { + case 0: + chassis_cmd_send.offset_angle = chassis_cmd_send.offset_angle - 360*around; + chassis_cmd_send.chassis_mode = CHASSIS_FOLLOW_GIMBAL_YAW; + break; + default: + chassis_cmd_send.chassis_mode = CHASSIS_ROTATE; + around= chassis_cmd_send.offset_angle/360; + break; + } + switch (rc_data[TEMP].key[KEY_PRESS].shift) // 待添加 按shift允许超功率 消耗缓冲能量。 { case 1: @@ -330,6 +366,9 @@ static void MouseKeySet() } /** + * + * + * * @brief 紧急停止,包括遥控器左上侧拨轮打满/重要模块离线/双板通信失效等 * 停止的阈值'300'待修改成合适的值,或改为开关控制. * @@ -383,7 +422,7 @@ void RobotCMDTask() { else if (switch_is_up(rc_data[TEMP].rc.switch_left)) { // 遥控器左侧开关状态为[上],键盘控制 MouseKeySet(); - shoot_cmd_send.shoot_mode =SHOOT_OFF; + shoot_cmd_send.shoot_mode =SHOOT_ON; } else if (switch_is_mid(rc_data[TEMP].rc.switch_left)) { // 遥控器左侧开关状态为[中],视觉模式,使用遥控器控制底盘和云台,同时开启发射系统 diff --git a/application/gimbal/gimbal.c b/application/gimbal/gimbal.c index 83e532d..25681e5 100644 --- a/application/gimbal/gimbal.c +++ b/application/gimbal/gimbal.c @@ -78,7 +78,7 @@ void GimbalInit() .MaxOut = 1000, }, .speed_PID = { - .Kp = 70, // 50 + .Kp = 60, // 50 .Ki = 15, // 350 .Kd = 0.6, // 0 .MaxOut = 20000,//20000 @@ -135,7 +135,7 @@ void GimbalTask() // 计算零飘导致的角度误差 float angle_error = gimba_IMU_data->YawTotalAngle - last_yaw_angle; // 补偿目标角度,避免突然旋转 - gimbal_cmd_recv.yaw -= angle_error; + gimbal_cmd_recv.yaw -= angle_error; in_protection_mode = 0; } DJIMotorEnable(yaw_motor); diff --git a/application/shoot/shoot.c b/application/shoot/shoot.c index 2cdee42..afd3de6 100644 --- a/application/shoot/shoot.c +++ b/application/shoot/shoot.c @@ -17,7 +17,7 @@ static Shoot_Upload_Data_s shoot_feedback_data; // 来自cmd的发射控制信 // dwt定时,计算冷却用 static float hibernate_time = 0, dead_time = 0; - +//static float target_angle = 0; void ShootInit() { // 左摩擦轮 @@ -126,8 +126,8 @@ void ShootTask() // 如果上一次触发单发或3发指令的时间加上不应期仍然大于当前时间(尚未休眠完毕),直接返回即可 // 单发模式主要提供给能量机关激活使用(以及英雄的射击大部分处于单发) - if (hibernate_time + dead_time > DWT_GetTimeline_ms()) - return; + if (hibernate_time + dead_time > DWT_GetTimeline_ms()) + return; // 若不在休眠状态,根据robotCMD传来的控制模式进行拨盘电机参考值设定和模式切换 switch (shoot_cmd_recv.load_mode) @@ -144,10 +144,10 @@ void ShootTask() // if (dead_time == 0) { // 第一次触发 // last_target_angle = loader->measure.total_angle; // } - // last_target_angle += ONE_BULLET_DELTA_ANGLE * REDUCTION_RATIO_LOADER; // 每次都在上次目标角度基础上增加固定角度 + // last_target_angle += 51*36;//ONE_BULLET_DELTA_ANGLE * REDUCTION_RATIO_LOADER; // 每次都在上次目标角度基础上增加固定角度 // DJIMotorSetRef(loader, last_target_angle); // hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间 - // dead_time = shoot_cmd_recv.dead_time; // 完成1发弹丸发射的时间 + // dead_time = 450;//shoot_cmd_recv.dead_time; // 完成1发弹丸发射的时间 // break; // case LOAD_1_BULLET: // DJIMotorOuterLoop(loader, ANGLE_LOOP);// 切换到角度环 @@ -162,19 +162,28 @@ void ShootTask() // break; case LOAD_1_BULLET: DJIMotorOuterLoop(loader, ANGLE_LOOP);// 切换到角度环 - static float target_angle = 0; + static float target_angle = -1900; target_angle += 51*36; + //float target_angle = loader->measure.total_angle + 51*36; DJIMotorSetRef(loader, target_angle); hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间 dead_time = 450; // 完成1发弹丸发射的时间 break; // 三连发,如果不需要后续可能删除 case LOAD_3_BULLET: - DJIMotorOuterLoop(loader, ANGLE_LOOP); // 切换到速度环 - DJIMotorSetRef(loader, loader->measure.total_angle + 3 * ONE_BULLET_DELTA_ANGLE); // 增加3发 - hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间 - dead_time = 300; // 完成3发弹丸发射的时间 - break; + // DJIMotorOuterLoop(loader, ANGLE_LOOP); // 切换到速度环 + // DJIMotorSetRef(loader, loader->measure.total_angle + 3 * ONE_BULLET_DELTA_ANGLE); // 增加3发 + // hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间 + // dead_time = 300; // 完成3发弹丸发射的时间 + // break; + DJIMotorOuterLoop(loader, ANGLE_LOOP);// 切换到角度环 + //static float target_angle = -1872; + target_angle += (51*36)*3; + //float target_angle = loader->measure.total_angle + 51*36; + DJIMotorSetRef(loader, target_angle); + hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间 + dead_time = 700; // 完成3发弹丸发射的时间 + break; // 连发模式,对速度闭环,射频后续修改为可变,目前固定为1Hz case LOAD_BURSTFIRE: DJIMotorOuterLoop(loader, SPEED_LOOP);