mirror of
https://gitee.com/dlmu-cone/half-steering-basic-framework
synced 2026-10-23 17:42:20 +08:00
单发模式前几发会连发,后续正常,先急停再启动也会出现相同问题
This commit is contained in:
@@ -341,7 +341,7 @@ static void EmergencyHandler()
|
|||||||
{
|
{
|
||||||
robot_state = ROBOT_STOP;
|
robot_state = ROBOT_STOP;
|
||||||
gimbal_cmd_send.gimbal_mode = GIMBAL_ZERO_FORCE;
|
gimbal_cmd_send.gimbal_mode = GIMBAL_ZERO_FORCE;
|
||||||
gimbal_cmd_send.yaw = 0;
|
gimbal_cmd_send.yaw = -gimbal_fetch_data.gimbal_imu_data.YawTotalAngle;;//0
|
||||||
gimbal_cmd_send.pitch = 0;
|
gimbal_cmd_send.pitch = 0;
|
||||||
chassis_cmd_send.chassis_mode = CHASSIS_ZERO_FORCE;
|
chassis_cmd_send.chassis_mode = CHASSIS_ZERO_FORCE;
|
||||||
shoot_cmd_send.shoot_mode = SHOOT_OFF;
|
shoot_cmd_send.shoot_mode = SHOOT_OFF;
|
||||||
|
|||||||
@@ -78,10 +78,10 @@ void GimbalInit()
|
|||||||
.MaxOut = 1000,
|
.MaxOut = 1000,
|
||||||
},
|
},
|
||||||
.speed_PID = {
|
.speed_PID = {
|
||||||
.Kp = 80, // 50
|
.Kp = 70, // 50
|
||||||
.Ki = 15, // 350
|
.Ki = 15, // 350
|
||||||
.Kd = 0.6, // 0
|
.Kd = 0.6, // 0
|
||||||
.MaxOut = 30000,//20000
|
.MaxOut = 20000,//20000
|
||||||
},
|
},
|
||||||
.other_angle_feedback_ptr = &gimba_IMU_data->Pitch,
|
.other_angle_feedback_ptr = &gimba_IMU_data->Pitch,
|
||||||
// 还需要增加角速度额外反馈指针,注意方向,ins_task.md中有c板的bodyframe坐标系说明
|
// 还需要增加角速度额外反馈指针,注意方向,ins_task.md中有c板的bodyframe坐标系说明
|
||||||
|
|||||||
@@ -68,35 +68,32 @@ void ShootInit()
|
|||||||
.controller_param_init_config = {
|
.controller_param_init_config = {
|
||||||
.angle_PID = {
|
.angle_PID = {
|
||||||
// 如果启用位置环来控制发弹,需要较大的I值保证输出力矩的线性度否则出现接近拨出的力矩大幅下降
|
// 如果启用位置环来控制发弹,需要较大的I值保证输出力矩的线性度否则出现接近拨出的力矩大幅下降
|
||||||
.Kp = 50,
|
.Kp = 12, // 10
|
||||||
.Ki = 0,
|
.Ki = 5,
|
||||||
.Kd = 0,
|
.Kd = 0,
|
||||||
.Improve = PID_Trapezoid_Intergral | PID_Integral_Limit | PID_Derivative_On_Measurement | PID_DerivativeFilter | PID_ErrorHandle,
|
.MaxOut = 10000,
|
||||||
.IntegralLimit = 10000,
|
|
||||||
.MaxOut = 15000,
|
|
||||||
.Derivative_LPF_RC = 0.01,
|
|
||||||
},
|
},
|
||||||
.speed_PID = {
|
.speed_PID = {
|
||||||
.Kp = 5, // 10
|
.Kp = 3, // 10
|
||||||
.Ki = 100, // 1
|
.Ki = 10, // 1
|
||||||
.Kd = 0,
|
.Kd = 0,
|
||||||
.Improve = PID_Trapezoid_Intergral | PID_Integral_Limit | PID_Derivative_On_Measurement,
|
.Improve = PID_Integral_Limit,
|
||||||
.IntegralLimit = 10000,
|
.IntegralLimit = 250,
|
||||||
.MaxOut = 15000,
|
.MaxOut = 10000,
|
||||||
},
|
},
|
||||||
.current_PID = {
|
.current_PID = {
|
||||||
.Kp = 0.7, // 0.7
|
.Kp = 1.5, // 0.7
|
||||||
.Ki = 0, // 0.1
|
.Ki = 0, // 0.1
|
||||||
.Kd = 0,
|
.Kd = 0,
|
||||||
.Improve = PID_Integral_Limit,
|
.Improve = PID_Integral_Limit,
|
||||||
.IntegralLimit = 10000,
|
.IntegralLimit = 5000,
|
||||||
.MaxOut = 15000,
|
.MaxOut = 10000,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.controller_setting_init_config = {
|
.controller_setting_init_config = {
|
||||||
.angle_feedback_source = MOTOR_FEED, .speed_feedback_source = MOTOR_FEED,
|
.angle_feedback_source = MOTOR_FEED, .speed_feedback_source = MOTOR_FEED,
|
||||||
.outer_loop_type = SPEED_LOOP, // 初始化成SPEED_LOOP,让拨盘停在原地,防止拨盘上电时乱转
|
.outer_loop_type = SPEED_LOOP, // 初始化成SPEED_LOOP,让拨盘停在原地,防止拨盘上电时乱转
|
||||||
.close_loop_type = CURRENT_LOOP | SPEED_LOOP| ANGLE_LOOP,
|
.close_loop_type = ANGLE_LOOP | SPEED_LOOP|CURRENT_LOOP,
|
||||||
.motor_reverse_flag = MOTOR_DIRECTION_REVERSE, // 注意方向设置为拨盘的拨出的击发方向
|
.motor_reverse_flag = MOTOR_DIRECTION_REVERSE, // 注意方向设置为拨盘的拨出的击发方向
|
||||||
},
|
},
|
||||||
.motor_type = M2006 // 英雄使用m3508
|
.motor_type = M2006 // 英雄使用m3508
|
||||||
@@ -141,17 +138,36 @@ void ShootTask()
|
|||||||
DJIMotorSetRef(loader, 0); // 同时设定参考值为0,这样停止的速度最快
|
DJIMotorSetRef(loader, 0); // 同时设定参考值为0,这样停止的速度最快
|
||||||
break;
|
break;
|
||||||
// 单发模式,根据鼠标按下的时间,触发一次之后需要进入不响应输入的状态(否则按下的时间内可能多次进入,导致多次发射)
|
// 单发模式,根据鼠标按下的时间,触发一次之后需要进入不响应输入的状态(否则按下的时间内可能多次进入,导致多次发射)
|
||||||
case LOAD_1_BULLET: // 激活能量机关/干扰对方用,英雄用.
|
// case LOAD_1_BULLET:
|
||||||
DJIMotorOuterLoop(loader, ANGLE_LOOP); // 切换到角度环
|
// DJIMotorOuterLoop(loader, ANGLE_LOOP); // 切换到角度环
|
||||||
static float last_target_angle = 0; // 存储上次的目标角度
|
// static float last_target_angle = 0; // 存储上次的目标角度
|
||||||
if (dead_time == 0) { // 第一次触发
|
// if (dead_time == 0) { // 第一次触发
|
||||||
last_target_angle = loader->measure.total_angle;
|
// last_target_angle = loader->measure.total_angle;
|
||||||
}
|
// }
|
||||||
last_target_angle += ONE_BULLET_DELTA_ANGLE * REDUCTION_RATIO_LOADER; // 每次都在上次目标角度基础上增加固定角度
|
// last_target_angle += ONE_BULLET_DELTA_ANGLE * REDUCTION_RATIO_LOADER; // 每次都在上次目标角度基础上增加固定角度
|
||||||
DJIMotorSetRef(loader, last_target_angle);
|
// DJIMotorSetRef(loader, last_target_angle);
|
||||||
hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间
|
// hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间
|
||||||
dead_time = shoot_cmd_recv.dead_time; // 完成1发弹丸发射的时间
|
// dead_time = shoot_cmd_recv.dead_time; // 完成1发弹丸发射的时间
|
||||||
break;
|
// break;
|
||||||
|
// case LOAD_1_BULLET:
|
||||||
|
// DJIMotorOuterLoop(loader, ANGLE_LOOP);// 切换到角度环
|
||||||
|
// DJIMotorSetRef(loader, loader->measure.total_angle+51*36);
|
||||||
|
// //DJIMotorSetRef(loader, loader->measure.total_angle + ONE_BULLET_DELTA_ANGLE);
|
||||||
|
// // 控制量增加一发弹丸的角度,其中90为36减速比*1.5
|
||||||
|
// hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间
|
||||||
|
// dead_time = 1000; // 完成1发弹丸发射的时间
|
||||||
|
// // 记录触发指令的时间
|
||||||
|
// //dead_time = 500;
|
||||||
|
// // 完成1发弹丸发射的时间
|
||||||
|
// break;
|
||||||
|
case LOAD_1_BULLET:
|
||||||
|
DJIMotorOuterLoop(loader, ANGLE_LOOP);// 切换到角度环
|
||||||
|
static float target_angle = 0;
|
||||||
|
target_angle += 51*36;
|
||||||
|
DJIMotorSetRef(loader, target_angle);
|
||||||
|
hibernate_time = DWT_GetTimeline_ms(); // 记录触发指令的时间
|
||||||
|
dead_time = 450; // 完成1发弹丸发射的时间
|
||||||
|
break;
|
||||||
// 三连发,如果不需要后续可能删除
|
// 三连发,如果不需要后续可能删除
|
||||||
case LOAD_3_BULLET:
|
case LOAD_3_BULLET:
|
||||||
DJIMotorOuterLoop(loader, ANGLE_LOOP); // 切换到速度环
|
DJIMotorOuterLoop(loader, ANGLE_LOOP); // 切换到速度环
|
||||||
@@ -183,20 +199,20 @@ void ShootTask()
|
|||||||
switch (shoot_cmd_recv.bullet_speed)
|
switch (shoot_cmd_recv.bullet_speed)
|
||||||
{
|
{
|
||||||
case SMALL_AMU_15:
|
case SMALL_AMU_15:
|
||||||
DJIMotorSetRef(friction_l, 58000);
|
DJIMotorSetRef(friction_l, 30000);
|
||||||
DJIMotorSetRef(friction_r, 58000);
|
DJIMotorSetRef(friction_r, 30000);
|
||||||
break;
|
break;
|
||||||
case SMALL_AMU_18:
|
case SMALL_AMU_18:
|
||||||
DJIMotorSetRef(friction_l, 58000);
|
DJIMotorSetRef(friction_l, 30000);
|
||||||
DJIMotorSetRef(friction_r, 58000);
|
DJIMotorSetRef(friction_r, 30000);
|
||||||
break;
|
break;
|
||||||
case SMALL_AMU_30:
|
case SMALL_AMU_30:
|
||||||
DJIMotorSetRef(friction_l, 58000);
|
DJIMotorSetRef(friction_l, 50000);
|
||||||
DJIMotorSetRef(friction_r, 58000);
|
DJIMotorSetRef(friction_r, 50000);
|
||||||
break;
|
break;
|
||||||
default: // 当前为了调试设定的默认值4000,因为还没有加入裁判系统无法读取弹速.
|
default: // 当前为了调试设定的默认值4000,因为还没有加入裁判系统无法读取弹速.
|
||||||
DJIMotorSetRef(friction_l, 58000);
|
DJIMotorSetRef(friction_l, 30000);
|
||||||
DJIMotorSetRef(friction_r, 58000);
|
DJIMotorSetRef(friction_r, 30000);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,7 +135,6 @@ void INS_Task(void)
|
|||||||
INS.Gyro[X] = BMI088.Gyro[X];
|
INS.Gyro[X] = BMI088.Gyro[X];
|
||||||
INS.Gyro[Y] = BMI088.Gyro[Y];
|
INS.Gyro[Y] = BMI088.Gyro[Y];
|
||||||
INS.Gyro[Z] = BMI088.Gyro[Z];
|
INS.Gyro[Z] = BMI088.Gyro[Z];
|
||||||
|
|
||||||
// demo function,用于修正安装误差,可以不管,本demo暂时没用
|
// demo function,用于修正安装误差,可以不管,本demo暂时没用
|
||||||
IMU_Param_Correction(&IMU_Param, INS.Gyro, INS.Accel);
|
IMU_Param_Correction(&IMU_Param, INS.Gyro, INS.Accel);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user