mirror of
https://gitee.com/dlmu-cone/half-steering-basic-framework
synced 2026-10-24 01:52:20 +08:00
小陀螺旗舰版
This commit is contained in:
@@ -284,7 +284,8 @@ static void SteeringWheelCalculate()
|
||||
vt_rf = 0, vt_lb = 0;
|
||||
} else {
|
||||
// 生成预计算变量,减少计算量,空间换时间
|
||||
float w = chassis_cmd_recv.wz * CHASSIS_WHEEL_OFFSET * SQRT2;
|
||||
//float w = chassis_cmd_recv.wz * CHASSIS_WHEEL_OFFSET * SQRT2;
|
||||
float w = chassis_cmd_recv.wz * CHASSIS_WHEEL_OFFSET ;
|
||||
// float temp_x = chassis_vx - w, temp_y = chassis_vy - w;
|
||||
// arm_sqrt_f32(temp_x * temp_x + temp_y * temp_y, &vt_lf); // lf:y- , x-
|
||||
// temp_y = chassis_vy + w; // 重复利用变量,temp_x = chassis_vy - w;与上次相同因此注释
|
||||
@@ -408,25 +409,55 @@ void ChassisTask() {
|
||||
{
|
||||
single_round_offset += 360.0f;
|
||||
}
|
||||
chassis_cmd_recv.wz = -PIDCalculate(&chassis_follow_pid, single_round_offset, 0)/70.0f;
|
||||
chassis_cmd_recv.wz = -PIDCalculate(&chassis_follow_pid, single_round_offset, 0)/60.0f;
|
||||
break;
|
||||
case CHASSIS_ROTATE: // 自旋,同时保持全向机动;当前wz维持定值,后续增加不规则的变速策略
|
||||
chassis_cmd_recv.wz = 0.95;//实验版
|
||||
chassis_cmd_recv.wz = 1.00;//实验版
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
static float sin_theta, cos_theta;
|
||||
cos_theta = arm_cos_f32(chassis_cmd_recv.offset_angle * DEGREE_2_RAD);
|
||||
sin_theta = arm_sin_f32(chassis_cmd_recv.offset_angle * DEGREE_2_RAD);
|
||||
chassis_vx = (chassis_cmd_recv.vx * cos_theta + chassis_cmd_recv.vy * sin_theta)/4;
|
||||
chassis_vy = (-chassis_cmd_recv.vx * sin_theta + chassis_cmd_recv.vy * cos_theta)/4;
|
||||
// ------------------ 【修改部分:加入相位滞后动态补偿】 ------------------
|
||||
// 提取当前的云台-底盘夹角
|
||||
float real_offset_angle = chassis_cmd_recv.offset_angle;
|
||||
|
||||
// 如果处于小陀螺模式(或者 wz 不为 0),根据旋转速度进行超前补偿
|
||||
if (chassis_cmd_recv.chassis_mode == CHASSIS_ROTATE )
|
||||
{
|
||||
// 补偿系数 K 需要实车微调。
|
||||
// 根据你的描述 wz=0.95 时偏差约45度,初始 K 值可以设为 45.0 / 0.95 ≈ 47.3f
|
||||
float lag_compensation_K = 45.0f;//47.3f;
|
||||
|
||||
// 符号(+或-)取决于你的电机正方向、底盘旋转正方向,如果不正就改成减号
|
||||
real_offset_angle -= (chassis_cmd_recv.wz * lag_compensation_K);
|
||||
cos_theta = arm_cos_f32(real_offset_angle * DEGREE_2_RAD);
|
||||
sin_theta = arm_sin_f32(real_offset_angle * DEGREE_2_RAD);
|
||||
|
||||
}else if (chassis_cmd_recv.chassis_mode == CHASSIS_FOLLOW_GIMBAL_YAW)
|
||||
{
|
||||
cos_theta = arm_cos_f32(chassis_cmd_recv.offset_angle * DEGREE_2_RAD);
|
||||
sin_theta = arm_sin_f32(chassis_cmd_recv.offset_angle * DEGREE_2_RAD);
|
||||
|
||||
}
|
||||
// ----------------------------------------------------------------------
|
||||
chassis_vx = (chassis_cmd_recv.vx * cos_theta + chassis_cmd_recv.vy * sin_theta)/4;
|
||||
chassis_vy = (-chassis_cmd_recv.vx * sin_theta + chassis_cmd_recv.vy * cos_theta)/4;
|
||||
|
||||
// 使用补偿后的角度进行坐标系投影
|
||||
|
||||
|
||||
// static float sin_theta, cos_theta;
|
||||
// cos_theta = arm_cos_f32(chassis_cmd_recv.offset_angle * DEGREE_2_RAD);
|
||||
// sin_theta = arm_sin_f32(chassis_cmd_recv.offset_angle * DEGREE_2_RAD);
|
||||
// chassis_vx = (chassis_cmd_recv.vx * cos_theta + chassis_cmd_recv.vy * sin_theta)/4;
|
||||
// chassis_vy = (-chassis_cmd_recv.vx * sin_theta + chassis_cmd_recv.vy * cos_theta)/4;
|
||||
|
||||
// 根据控制模式进行正运动学解算,计算底盘输出
|
||||
SteeringWheelCalculate();
|
||||
// MecanumCalculate();
|
||||
|
||||
|
||||
// 根据裁判系统的反馈数据和电容数据对输出限幅并设定闭环参考值
|
||||
LimitChassisOutput();
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
/* 机器人重要参数定义,注意根据不同机器人进行修改,浮点数需要以.0或f结尾,无符号以u结尾 */
|
||||
// 云台参数
|
||||
#define YAW_CHASSIS_ALIGN_ECD -3595 // 云台和底盘对齐指向相同方向时的电机编码器值,若对云台有机械改动需要修改
|
||||
#define YAW_ECD_GREATER_THAN_4096 0 // ALIGN_ECD值是否大于4096,是为1,否为0;用于计算云台偏转角度
|
||||
#define YAW_ECD_GREATER_THAN_4096 0 // ALIGN_ECD值是否大于4096,是为1,否为0;用于计算云台偏转角度
|
||||
#define PITCH_HORIZON_ECD 3412 // 云台处于水平位置时编码器值,若对云台有机械改动需要修改
|
||||
#define PITCH_MAX_ANGLE 30 // 云台竖直方向最大角度 (注意反馈如果是陀螺仪,则填写陀螺仪的角度)
|
||||
#define PITCH_MIN_ANGLE -20 // 云台竖直方向最小角度 (注意反馈如果是陀螺仪,则填写陀螺仪的角度)
|
||||
|
||||
Reference in New Issue
Block a user