diff --git a/diaoerqiege/BHBF_Robot_Lifting_Lug/.settings/language.settings.xml b/diaoerqiege/BHBF_Robot_Lifting_Lug/.settings/language.settings.xml index 07f8dd5..15fa460 100644 --- a/diaoerqiege/BHBF_Robot_Lifting_Lug/.settings/language.settings.xml +++ b/diaoerqiege/BHBF_Robot_Lifting_Lug/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/BASE/Inc/MSP/msp_PID.h b/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/BASE/Inc/MSP/msp_PID.h index fbbaf55..c7951a2 100644 --- a/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/BASE/Inc/MSP/msp_PID.h +++ b/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/BASE/Inc/MSP/msp_PID.h @@ -1,27 +1,20 @@ + /* - * msp_PID.h - * - * Created on: 2024年1月22日 - * Author: Administrator + * msp_PID.h - 两轮差速机器人角度追踪PID(内置参数,数组输出) */ #ifndef INC_MSP_MSP_PID_H_ #define INC_MSP_MSP_PID_H_ +/** + * @brief 两轮差速角度控制(内置 dt=0.1s,最大速度 = 1.6 * |base_speed|) + * @param current_angle 当前角度(度) + * @param desired_angle 期望角度(度) + * @param base_speed 基础前进速度(可正可负) + * @param speeds 输出速度数组,speeds[0]=左轮,speeds[1]=右轮 + */ +void TwoWheel_AngleControl(float current_angle, float desired_angle, + float base_speed,float zoom, float speeds[2]); +void TwoWheel_AngleControl_Weld(float current_angle, float desired_angle, + float base_speed,float zoom, float speeds[2]); -#include "bsp_include.h" - -void GF_MSP_Auto_Motion_adj(double Current_Angle, double Auto_Speed, double Auto_Speed_Max, double System_time ,double *W_Speed_1); -void GF_MSP_Auto_adj_Unicycle(double Current_Angle_11,double Desire_Angle_11, double Auto_Speed, double Auto_Speed_Max, double System_time ,double *W_Speed_1); -void GF_MSP_Auto_Motion_adj_Com(double Current_Angle, double Horizontal_Compen_Angle ,double Auto_Speed, double Auto_Speed_Max, double System_time ,double *W_Speed_1); - -void GF_MSP_PID_Now_Der_adj_Com(double Current_Angle,double Desire_Angle_Input, double Auto_Speed, double Auto_Speed_Max, double System_time ,double *W_Speed_1); - - - - - - -int Angle_Tune_PID(float CurrentAngle, float TargetAngle, int Position_KP, - int Position_KI, int Position_KD, int MaxValue); - -#endif /* INC_MSP_MSP_PID_H_ */ +#endif diff --git a/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/BASE/Src/MSP/msp_PID.c b/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/BASE/Src/MSP/msp_PID.c index 8192b62..bd38ed1 100644 --- a/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/BASE/Src/MSP/msp_PID.c +++ b/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/BASE/Src/MSP/msp_PID.c @@ -1,350 +1,151 @@ /* - * msp_PID.c - * - * Created on: 2024年1月18日 - * Author: Administrator + * msp_PID.c - 两轮差速机器人角度追踪PID(内置参数,数组输出,float版本) */ #include "msp_PID.h" #include - -void Speedl_PID(double CurrentValue, double TargetValue, double Sys_T, +#include + +// ========== 内置固定参数 ========== +#define CONTROL_DT 0.1f // 固定采样时间 0.1秒 +#define MAX_SPEED_FACTOR 1.6f // 最大速度 = 基础速度 * 1.6 + +// ========== 全局可调参数 ========== +float PID_KP = 0.5f; // 比例系数 +float PID_KD = 0.012f; // 微分系数 +float PID_KP_WELD = 0.1f; // 比例系数 +float PID_KD_WELD = 0.025f; // 微分系数 +float Kp1 = 1.0f; // 小角度增益因子 +float Kp2 = 0.95f; // 中小角度增益因子 +float Kp3 = 0.80f; // 中大角度增益因子 +float Kp4 = 0.50f; // 大角度增益因子 +double Desire_Angle = 0; //用于焊缝跟踪的期望角度 + +// 误差分段阈值(度) +static const float ANGLE_THRESHOLD1 = 2.0f; +static const float ANGLE_THRESHOLD2 = 5.0f; +static const float ANGLE_THRESHOLD3 = 10.0f; + +// ========== 内部静态变量 ========== +static float last_error = 0.0f; // 上一次误差(用于微分) + +// ========== 内部函数声明 ========== +static float normalize_angle(float angle); +static float compute_pd_output(float error,float KP,float KD); +static float get_gain_factor(float abs_error); +void Weld_PID(double CurrentValue, double TargetValue, double Sys_T, double *Gain_speed); -double Desire_Angle = 0; -double PID_KP = 50; -double PID_KD = 12; -//double Sys_T=0.01;//System time -double k_1_error = 0; -void Speedl_PID(double CurrentValue, double TargetValue, double Sys_T, - double *Gain_speed) +void GF_MSP_PID_Now_Der_adj_Com_Weld(double Current_Angle, double Desire_Angle_Input, + double Auto_Speed, double Auto_Speed_Max, double System_time, double *W_Speed_1); + +// ========== 函数实现 ========== + +/* 将角度归一化到 [-180, 180) */ +static float normalize_angle(float angle) { - double Error; - double P_Error; - double D_Error; - Error = TargetValue - CurrentValue; - if (Error >= 180) - { - Error = Error - 360; - } - else if (Error <= -180) - { - Error = Error + 360; - } - P_Error = Error; - D_Error = Error - k_1_error; - k_1_error = Error; - Gain_speed[0] = PID_KP * P_Error + PID_KD * D_Error / Sys_T; + while (angle >= 180.0f) angle -= 360.0f; + while (angle < -180.0f) angle += 360.0f; + return angle; } -double Kp1 = 1; -double Kp2 = 0.950; -double Kp3 = 0.80; -double Kp4 = 0.50; -/* Input: - */ -//void GF_MSP_Auto_Motion_adj(double Current_Angle, double Auto_Speed, double Auto_Speed_Max, double System_time ,double *W_Speed_1) -void GF_MSP_Auto_Motion_adj(double Current_Angle, double Auto_Speed, - double Auto_Speed_Max, double System_time, double *W_Speed_1) +/* PD控制器:输入误差,输出控制增量(使用固定 dt = CONTROL_DT) */ +static float compute_pd_output(float error,float KP,float KD) { - // double Desire_Angle=0; - //double Horizontal_Compen_Angle=0;, - double Horizontal_Compen_Angle = 0; - if ((Current_Angle >= 45) & (Current_Angle < 135)) - { - Desire_Angle = 90 + Horizontal_Compen_Angle; - } - else if ((Current_Angle <= -45) & (Current_Angle >= -135)) - { - Desire_Angle = -90 + Horizontal_Compen_Angle; - } - else if ((Current_Angle > -45) & (Current_Angle < 45)) - { - Desire_Angle = 0 + Horizontal_Compen_Angle; - } - else - { - Desire_Angle = 180 + Horizontal_Compen_Angle; - } - //水平 前进抬车头 - double Detal_Angle = fabs(Current_Angle - Desire_Angle); - double Incre_Speed[1]; - Speedl_PID(Current_Angle, Desire_Angle, System_time, Incre_Speed); - Incre_Speed[0] = 1 * Incre_Speed[0]; - double deltaAngle1 = 2; - double deltaAngle2 = 5; - double deltaAngle3 = 10; - //double deltaAngle4=25; - double LeftSpeed_Con_1; - double RightSpeed_Con_1; - double LeftSpeed_Con_2; - double RightSpeed_Con_2; - if (Detal_Angle <= deltaAngle1) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp1 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp1 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp1 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp1 * Incre_Speed[0]; -//小角度时,两前轮调整 - } - else if (Detal_Angle > deltaAngle1 && Detal_Angle <= deltaAngle2) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp2 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp2 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp2 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp2 * Incre_Speed[0]; -//中小角度时,两前轮差速,两后轮跟踪调整 - } - else if (Detal_Angle > deltaAngle2 && Detal_Angle <= deltaAngle3) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp3 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp3 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp3 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp3 * Incre_Speed[0]; - } - else - { - LeftSpeed_Con_1 = (Auto_Speed + Kp4 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp4 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp4 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp4 * Incre_Speed[0]; - } - - double Jud_value = fabs(LeftSpeed_Con_1) - fabs(RightSpeed_Con_1); - double factor = 0; - if (Jud_value >= 0) - { - if (LeftSpeed_Con_1 > Auto_Speed_Max) - { - factor = Auto_Speed_Max / LeftSpeed_Con_1; - LeftSpeed_Con_1 = Auto_Speed_Max; - LeftSpeed_Con_2 = LeftSpeed_Con_2 * factor; - RightSpeed_Con_1 = RightSpeed_Con_1 * factor; - RightSpeed_Con_2 = RightSpeed_Con_2 * factor; - } - else if (LeftSpeed_Con_1 < -Auto_Speed_Max) - { - factor = -Auto_Speed_Max / LeftSpeed_Con_1; - LeftSpeed_Con_1 = -Auto_Speed_Max; - LeftSpeed_Con_2 = LeftSpeed_Con_2 * factor; - RightSpeed_Con_1 = RightSpeed_Con_1 * factor; - RightSpeed_Con_2 = RightSpeed_Con_2 * factor; - } - } - else - { - if (RightSpeed_Con_1 > Auto_Speed_Max) - { - factor = Auto_Speed_Max / RightSpeed_Con_1; - RightSpeed_Con_1 = Auto_Speed_Max; - RightSpeed_Con_2 = RightSpeed_Con_2 * factor; - - LeftSpeed_Con_1 = LeftSpeed_Con_1 * factor; - LeftSpeed_Con_2 = LeftSpeed_Con_2 * factor; - } - else if (LeftSpeed_Con_2 < -Auto_Speed_Max) - { - factor = -Auto_Speed_Max / RightSpeed_Con_1; - RightSpeed_Con_1 = -Auto_Speed_Max; - RightSpeed_Con_2 = RightSpeed_Con_2 * factor; - - LeftSpeed_Con_1 = LeftSpeed_Con_1 * factor; - LeftSpeed_Con_2 = LeftSpeed_Con_2 * factor; - } - } - - W_Speed_1[0] = LeftSpeed_Con_1; - W_Speed_1[1] = RightSpeed_Con_1; - W_Speed_1[2] = LeftSpeed_Con_2; - W_Speed_1[3] = RightSpeed_Con_2; - + float p_term = KP * error; + float d_term = KD * (error - last_error) / CONTROL_DT; + last_error = error; + return p_term + d_term; } -void GF_MSP_Auto_adj_Unicycle(double Current_Angle_11, double Desire_Angle_11, - double Auto_Speed, double Auto_Speed_Max, double System_time, - double *W_Speed_1) +/* 根据误差绝对值选择增益因子 */ +static float get_gain_factor(float abs_error) { - //水平 前进抬车头 - double Detal_Angle = fabs(Current_Angle_11 - Desire_Angle_11); - double Incre_Speed[1]; - - Speedl_PID(Current_Angle_11, Desire_Angle_11, System_time, Incre_Speed); - Incre_Speed[0] = 1 * Incre_Speed[0]; - - double deltaAngle0 = 1; - double deltaAngle1 = 2; - double deltaAngle2 = 5; - double deltaAngle3 = 10; - //double deltaAngle4=25; - double LeftSpeed_Con_1; - - if (Detal_Angle <= deltaAngle0) - { - LeftSpeed_Con_1 = 0; - } - else if (Detal_Angle <= deltaAngle1) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp1 * Incre_Speed[0] / 2); - } - else if (Detal_Angle > deltaAngle1 && Detal_Angle <= deltaAngle2) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp2 * Incre_Speed[0] / 2); - } - else if (Detal_Angle > deltaAngle2 && Detal_Angle <= deltaAngle3) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp3 * Incre_Speed[0] / 2); - } - else - { - LeftSpeed_Con_1 = (Auto_Speed + Kp4 * Incre_Speed[0] / 2); - } - - if (LeftSpeed_Con_1 > Auto_Speed_Max) - { - LeftSpeed_Con_1 = Auto_Speed_Max; - } - else if (LeftSpeed_Con_1 < -Auto_Speed_Max) - { - LeftSpeed_Con_1 = -Auto_Speed_Max; - } - else - { - //LeftSpeed_Con_1=LeftSpeed_Con_1; - } - W_Speed_1[0] = LeftSpeed_Con_1; + if (abs_error <= ANGLE_THRESHOLD1) return Kp1; + if (abs_error <= ANGLE_THRESHOLD2) return Kp2; + if (abs_error <= ANGLE_THRESHOLD3) return Kp3; + return Kp4; } -void GF_MSP_Auto_Motion_adj_Com(double Current_Angle, - double Horizontal_Compen_Angle, double Auto_Speed, - double Auto_Speed_Max, double System_time, double *W_Speed_1) +/* 两轮差速角度控制(对外接口) */ +void TwoWheel_AngleControl(float current_angle, float desired_angle, + float base_speed,float zoom, float speeds[2]) { - // double Desire_Angle=0; - //double Horizontal_Compen_Angle=0; - if ((Current_Angle >= 45) & (Current_Angle < 135)) - { - Desire_Angle = 90 + Horizontal_Compen_Angle; - } - else if ((Current_Angle <= -45) & (Current_Angle >= -135)) - { - Desire_Angle = -90 + Horizontal_Compen_Angle; - } - else if ((Current_Angle > -45) & (Current_Angle < 45)) - { - Desire_Angle = 0 + Horizontal_Compen_Angle; - } - else - { - Desire_Angle = 180 + Horizontal_Compen_Angle; - if (Desire_Angle > 180) - { - Desire_Angle = Desire_Angle - 360; - } - } - //水平 前进抬车头 - double Detal_Angle = fabs(Current_Angle - Desire_Angle); - double Incre_Speed[1]; - Speedl_PID(Current_Angle, Desire_Angle, System_time, Incre_Speed); - Incre_Speed[0] = 1 * Incre_Speed[0]; - double deltaAngle1 = 2; - double deltaAngle2 = 5; - double deltaAngle3 = 10; - //double deltaAngle4=25; - double LeftSpeed_Con_1; - double RightSpeed_Con_1; - double LeftSpeed_Con_2; - double RightSpeed_Con_2; - if (Detal_Angle <= deltaAngle1) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp1 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp1 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp1 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp1 * Incre_Speed[0]; -//小角度时,两前轮调整 - } - else if (Detal_Angle > deltaAngle1 && Detal_Angle <= deltaAngle2) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp2 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp2 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp2 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp2 * Incre_Speed[0]; -//中小角度时,两前轮差速,两后轮跟踪调整 - } - else if (Detal_Angle > deltaAngle2 && Detal_Angle <= deltaAngle3) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp3 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp3 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp3 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp3 * Incre_Speed[0]; - } - else - { - LeftSpeed_Con_1 = (Auto_Speed + Kp4 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp4 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp4 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp4 * Incre_Speed[0]; - } - - double Jud_value = fabs(LeftSpeed_Con_1) - fabs(RightSpeed_Con_1); - double factor = 0; - if (Jud_value >= 0) - { - if (LeftSpeed_Con_1 > Auto_Speed_Max) - { - factor = Auto_Speed_Max / LeftSpeed_Con_1; - LeftSpeed_Con_1 = Auto_Speed_Max; - LeftSpeed_Con_2 = LeftSpeed_Con_2 * factor; - RightSpeed_Con_1 = RightSpeed_Con_1 * factor; - RightSpeed_Con_2 = RightSpeed_Con_2 * factor; - } - else if (LeftSpeed_Con_1 < -Auto_Speed_Max) - { - factor = -Auto_Speed_Max / LeftSpeed_Con_1; - LeftSpeed_Con_1 = -Auto_Speed_Max; - LeftSpeed_Con_2 = LeftSpeed_Con_2 * factor; - RightSpeed_Con_1 = RightSpeed_Con_1 * factor; - RightSpeed_Con_2 = RightSpeed_Con_2 * factor; - } - } - else - { - if (RightSpeed_Con_1 > Auto_Speed_Max) - { - factor = Auto_Speed_Max / RightSpeed_Con_1; - RightSpeed_Con_1 = Auto_Speed_Max; - RightSpeed_Con_2 = RightSpeed_Con_2 * factor; - - LeftSpeed_Con_1 = LeftSpeed_Con_1 * factor; - LeftSpeed_Con_2 = LeftSpeed_Con_2 * factor; - } - else if (LeftSpeed_Con_2 < -Auto_Speed_Max) - { - factor = -Auto_Speed_Max / RightSpeed_Con_1; - RightSpeed_Con_1 = -Auto_Speed_Max; - RightSpeed_Con_2 = RightSpeed_Con_2 * factor; + // 1. 计算归一化误差 + float raw_error = desired_angle - current_angle; + float error = normalize_angle(raw_error); + float abs_error = fabsf(error); + + // 2. PD控制量 + float delta = zoom*compute_pd_output(error,PID_KP,PID_KD); + + // 3. 根据误差大小选择增益因子 + float factor = get_gain_factor(abs_error); + + // 4. 计算左右轮速度 + float left = base_speed + factor * delta; + float right = base_speed - factor * delta; + + // 5. 内置最大速度 = 1.6 * |base_speed| + float max_speed = fabsf(base_speed) * MAX_SPEED_FACTOR; + + // 6. 限幅:等比缩放至最大速度以内 + float max_abs = fmaxf(fabsf(left), fabsf(right)); + if (max_abs > max_speed && max_abs > FLT_MIN) { + float scale = max_speed / max_abs; + left *= scale; + right *= scale; + } + + speeds[0] = left; + speeds[1] = right; +} - LeftSpeed_Con_1 = LeftSpeed_Con_1 * factor; - LeftSpeed_Con_2 = LeftSpeed_Con_2 * factor; - } - } +/* 两轮差速角度控制(对外接口) */ +void TwoWheel_AngleControl_Weld(float current_angle, float desired_angle, + float base_speed,float zoom, float speeds[2]) +{ + // 1. 计算归一化误差 + float raw_error = desired_angle - current_angle; + float error = normalize_angle(raw_error); + float abs_error = fabsf(error); + + // 2. PD控制量 + float delta = zoom*compute_pd_output(error,PID_KP_WELD,PID_KD_WELD); + + // 3. 根据误差大小选择增益因子 + float factor = get_gain_factor(abs_error); + + // 4. 计算左右轮速度 + float left = base_speed + factor * delta; + float right = base_speed - factor * delta; + + // 5. 内置最大速度 = 1.6 * |base_speed| + float max_speed = fabsf(base_speed) * MAX_SPEED_FACTOR; + + // 6. 限幅:等比缩放至最大速度以内 + float max_abs = fmaxf(fabsf(left), fabsf(right)); + if (max_abs > max_speed && max_abs > FLT_MIN) { + float scale = max_speed / max_abs; + left *= scale; + right *= scale; + } + + speeds[0] = left; + speeds[1] = right; +} - W_Speed_1[0] = LeftSpeed_Con_1; - W_Speed_1[1] = RightSpeed_Con_1; - W_Speed_1[2] = LeftSpeed_Con_2; - W_Speed_1[3] = RightSpeed_Con_2; -} -void GF_MSP_PID_Now_Der_adj_Com(double Current_Angle, double Desire_Angle_Input, - double Auto_Speed, double Auto_Speed_Max, double System_time, - double *W_Speed_1) +void GF_MSP_PID_Now_Der_adj_Com_Weld(double Current_Angle, double Desire_Angle_Input, double Auto_Speed, double Auto_Speed_Max, double System_time, double *W_Speed_1) { Desire_Angle = Desire_Angle_Input; //水平 前进抬车头 double Detal_Angle = fabs(Current_Angle - Desire_Angle); double Incre_Speed[1]; - Speedl_PID(Current_Angle, Desire_Angle, System_time, Incre_Speed); - Incre_Speed[0] = 1 * Incre_Speed[0]; - double deltaAngle1 = 2; + Weld_PID(Current_Angle, Desire_Angle, System_time, Incre_Speed); + Incre_Speed[0] = 8 * Incre_Speed[0]; + double deltaAngle1 = 0.2; double deltaAngle2 = 5; double deltaAngle3 = 10; //double deltaAngle4=25; @@ -352,36 +153,38 @@ void GF_MSP_PID_Now_Der_adj_Com(double Current_Angle, double Desire_Angle_Input, double RightSpeed_Con_1; double LeftSpeed_Con_2; double RightSpeed_Con_2; - if (Detal_Angle <= deltaAngle1) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp1 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp1 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp1 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp1 * Incre_Speed[0]; -//小角度时,两前轮调整 - } - else if (Detal_Angle > deltaAngle1 && Detal_Angle <= deltaAngle2) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp2 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp2 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp2 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp2 * Incre_Speed[0]; -//中小角度时,两前轮差速,两后轮跟踪调整 - } - else if (Detal_Angle > deltaAngle2 && Detal_Angle <= deltaAngle3) - { - LeftSpeed_Con_1 = (Auto_Speed + Kp3 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp3 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp3 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp3 * Incre_Speed[0]; - } - else - { - LeftSpeed_Con_1 = (Auto_Speed + Kp4 * Incre_Speed[0]); - RightSpeed_Con_1 = (Auto_Speed - Kp4 * Incre_Speed[0]); - LeftSpeed_Con_2 = Auto_Speed + Kp4 * Incre_Speed[0]; - RightSpeed_Con_2 = Auto_Speed - Kp4 * Incre_Speed[0]; - } + + LeftSpeed_Con_1 = (Auto_Speed + Kp1 * Incre_Speed[0]); + RightSpeed_Con_1 = (Auto_Speed - Kp1 * Incre_Speed[0]); + LeftSpeed_Con_2 = Auto_Speed + Kp1 * Incre_Speed[0]; + RightSpeed_Con_2 = Auto_Speed - Kp1 * Incre_Speed[0]; +// if (Detal_Angle >= deltaAngle1) +// { +// +////小角度时,两前轮调整 +// } +// else if (Detal_Angle > deltaAngle1 && Detal_Angle <= deltaAngle2) +// { +// LeftSpeed_Con_1 = (Auto_Speed + Kp2 * Incre_Speed[0]); +// RightSpeed_Con_1 = (Auto_Speed - Kp2 * Incre_Speed[0]); +// LeftSpeed_Con_2 = Auto_Speed + Kp2 * Incre_Speed[0]; +// RightSpeed_Con_2 = Auto_Speed - Kp2 * Incre_Speed[0]; +////中小角度时,两前轮差速,两后轮跟踪调整 +// } +// else if (Detal_Angle > deltaAngle2 && Detal_Angle <= deltaAngle3) +// { +// LeftSpeed_Con_1 = (Auto_Speed + Kp3 * Incre_Speed[0]); +// RightSpeed_Con_1 = (Auto_Speed - Kp3 * Incre_Speed[0]); +// LeftSpeed_Con_2 = Auto_Speed + Kp3 * Incre_Speed[0]; +// RightSpeed_Con_2 = Auto_Speed - Kp3 * Incre_Speed[0]; +// } +// else +// { +// LeftSpeed_Con_1 = (Auto_Speed + Kp4 * Incre_Speed[0]); +// RightSpeed_Con_1 = (Auto_Speed - Kp4 * Incre_Speed[0]); +// LeftSpeed_Con_2 = Auto_Speed + Kp4 * Incre_Speed[0]; +// RightSpeed_Con_2 = Auto_Speed - Kp4 * Incre_Speed[0]; +// } double Jud_value = fabs(LeftSpeed_Con_1) - fabs(RightSpeed_Con_1); double factor = 0; @@ -433,78 +236,21 @@ void GF_MSP_PID_Now_Der_adj_Com(double Current_Angle, double Desire_Angle_Input, } -//喷漆机器人PID算法 -int32_t PositionalPID(double pidTargetValue, double pidCurrentValue, double Kp, - double Kd) -{ - double Error = 0; - double P_Error = 0; - double I_Error = 0; - double D_Error = 0; - double delta = 0; - - Error = pidTargetValue - pidCurrentValue; - // - if (pidTargetValue - pidCurrentValue >= 180) - { - Error = (pidTargetValue - pidCurrentValue) - 360; - } - if (pidTargetValue - pidCurrentValue <= -180) - { - Error = pidTargetValue - pidCurrentValue + 360; - } - //计算误差 - P_Error = Error; //比例环节 - - D_Error = Error - k_1_error; //微分环节 - - //deltaSpeed = Kp * P_Error + Ki * I_Error + Kd * D_Error; //计算Speed输出值 - delta = Kp * P_Error + Kd * D_Error; - - k_1_error = Error; - - return (int32_t) (delta); -} - -int Angle_Tune_PID(float CurrentAngle, float TargetAngle, int Position_KP, - int Position_KI, int Position_KD, int MaxValue) +double Weld_KP = 10; +double Weld_KD = 10; +//double Sys_T=0.01;//System time +double Weld_1_error = 0; +void Weld_PID(double CurrentValue, double TargetValue, double Sys_T, + double *Gain_speed) { - static float Bias, delta_Speed, Integral_bias, Last_Bias; - Bias = CurrentAngle - TargetAngle; - Integral_bias += Bias; - + double Error; + double P_Error; + double D_Error; + Error = TargetValue - CurrentValue; - delta_Speed = Position_KP * Bias + Position_KI * Integral_bias - + Position_KD * (Bias - Last_Bias), Last_Bias = Bias; - if (delta_Speed >= MaxValue) - { - delta_Speed = MaxValue; - } - if (delta_Speed <= -MaxValue) - { - delta_Speed = -MaxValue; - } - return (int) delta_Speed; + P_Error = Error; + D_Error = Error - Weld_1_error; + Weld_1_error = Error; + Gain_speed[0] = Weld_KP * P_Error + Weld_KD * D_Error / Sys_T; } - -//int Angle_Tune_PID(float CurrentAngle, float TargetAngle, int Position_KP, -// int Position_KI, int Position_KD, int MaxValue) -//{ -// static float Bias, delta_Speed, Integral_bias, Last_Bias; -// Bias = CurrentAngle - TargetAngle; -// Integral_bias += Bias; -// -// delta_Speed = Position_KP * Bias + Position_KI * Integral_bias -// + Position_KD * (Bias - Last_Bias), Last_Bias = Bias; -// if (delta_Speed >= MaxValue) -// { -// delta_Speed = MaxValue; -// } -// if (delta_Speed <= -MaxValue) -// { -// delta_Speed = -MaxValue; -// } -// return (int) delta_Speed; -//} - diff --git a/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/Src/robot_state.c b/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/Src/robot_state.c index aa84a89..6a33201 100644 --- a/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/Src/robot_state.c +++ b/diaoerqiege/BHBF_Robot_Lifting_Lug/Core/Src/robot_state.c @@ -20,6 +20,20 @@ double RP_Speed_Ctrl = 0; float speedAdj = 0; +#define MOTOR_TO_COUNT 164.433 + +void SetMoveMotorSpeed(double Speed) +{ + double Inspeed = (Speed*360/100/101/6*3.1415926*0.325);//转换为m/min进入PID + + float Outspeed[2] = {0}; + TwoWheel_AngleControl(GV.TL720DParameters.RF_Angle_Roll, 0, Inspeed, 1, Outspeed); + + GV.LeftFrontMotor.Target_Velcity = Outspeed[0] * MOTOR_TO_COUNT; + GV.RightFrontMotor.Target_Velcity = Outspeed[1] * MOTOR_TO_COUNT; + GV.LeftBackMotor.Target_Velcity = Outspeed[0] * MOTOR_TO_COUNT; + GV.RightBackMotor.Target_Velcity = Outspeed[1] * MOTOR_TO_COUNT; +} void Manual_State_Do(void) { @@ -402,10 +416,7 @@ void auto_forward_state_do(void) Act_Speed =Speed_Ctrl; if(Ref_Speed >= 5000) Ref_Speed = 5000; - GV.LeftFrontMotor.Target_Velcity = Ref_Speed; - GV.RightFrontMotor.Target_Velcity = -Ref_Speed; - GV.LeftBackMotor.Target_Velcity = Ref_Speed; - GV.RightBackMotor.Target_Velcity = -Ref_Speed; + SetMoveMotorSpeed(Ref_Speed); } void auto_backward_state_do(void) @@ -420,10 +431,7 @@ void auto_backward_state_do(void) Act_Speed =Speed_Ctrl; if(Ref_Speed >= 5000) Ref_Speed = 5000; - GV.LeftFrontMotor.Target_Velcity = -Ref_Speed; - GV.RightFrontMotor.Target_Velcity = Ref_Speed; - GV.LeftBackMotor.Target_Velcity = -Ref_Speed; - GV.RightBackMotor.Target_Velcity = Ref_Speed; + SetMoveMotorSpeed(-Ref_Speed); }