diff --git a/MDK-ARM/.vscode/keil-assistant.log b/MDK-ARM/.vscode/keil-assistant.log index 2caa556..4555934 100644 --- a/MDK-ARM/.vscode/keil-assistant.log +++ b/MDK-ARM/.vscode/keil-assistant.log @@ -459,3 +459,7 @@ [info] Log at : 2025/6/12|16:54:50|GMT+0800 +[info] Log at : 2025/6/13|16:30:54|GMT+0800 + +[info] Log at : 2025/6/14|15:14:16|GMT+0800 + diff --git a/MDK-ARM/R2.uvoptx b/MDK-ARM/R2.uvoptx index 403d151..b1b816f 100644 --- a/MDK-ARM/R2.uvoptx +++ b/MDK-ARM/R2.uvoptx @@ -158,102 +158,22 @@ 0 1 - Nor_Vx + can,0x0A 1 1 - Nor_Vy + chassis,0x0A 2 1 - count,0x0A + UP,0x0A 3 1 - count - - - 4 - 1 - pid - - - 5 - 1 - BMI088_t - - - 6 - 1 - up,0x0A - - - 7 - 1 - low,0x0A - - - 8 - 1 - UP,0x0A - - - 9 - 1 - send,0x0A - - - 10 - 1 - cmd,0x0A - - - 11 - 1 - rc_ctrl,0x0A - - - 12 - 1 - a,0x0A - - - 13 - 1 - delay_aa,0x0A - - - 14 - 1 - aaaaaaaaaaa,0x0A - - - 15 - 1 - task_runtime,0x0A - - - 16 - 1 - last_tick,0x0A - - - 17 - 1 - chassis,0x0A - - - 18 - 1 - can,0x0A - - - 19 - 1 - can_rx,0x0A + NUC_send,0x0A diff --git a/MDK-ARM/R2/R2.axf b/MDK-ARM/R2/R2.axf index 07eaeff..45fd09e 100644 Binary files a/MDK-ARM/R2/R2.axf and b/MDK-ARM/R2/R2.axf differ diff --git a/User/Module/Chassis.c b/User/Module/Chassis.c index 75040b9..1924905 100644 --- a/User/Module/Chassis.c +++ b/User/Module/Chassis.c @@ -28,6 +28,11 @@ int8_t Chassis_UpdateFeedback(Chassis_t *c, const CAN_t *can) { c->motorfeedback.rotor_rpm3508[i] = can->motor.chassis_motor3508.as_array[i].rotor_speed; c->motorfeedback.rotor_current3508[i] = can->motor.chassis_motor3508.as_array[i].torque_current; } + for (uint8_t i = 0; i < 4; i++) { + + c->sick_cali.sick_dis[i]=can->sickfed.raw_dis[i] / 10; //没使用原值 + } + return CHASSIS_OK; } @@ -40,8 +45,10 @@ int8_t Chassis_init(Chassis_t *c, const Chassis_Param_t *param, float target_fre } PID_init(&(c->pid.chassis_PICKWzPID_HIGN), PID_POSITION, &(c->param->chassis_PICKWzPID_HIGN_param)); PID_init(&(c->pid.chassis_PICKWzPID_LOW), PID_POSITION, &(c->param->chassis_PICKWzPID_LOW_param)); - PID_init(&(c->pid.sick_CaliforYPID), PID_POSITION, &(c->param->Sick_CaliYparam)); - PID_init(&(c->pid.sick_CaliforXPID), PID_POSITION, &(c->param->Sick_CaliXparam)); + PID_init(&(c->pid.SickCaliWzPID), PID_POSITION, &(c->param->Sick_CaliWparam)); + PID_init(&(c->pid.SickCaliVxPID), PID_POSITION, &(c->param->Sick_CaliXparam)); + PID_init(&(c->pid.SickCaliVyPID), PID_POSITION, &(c->param->Sick_CaliYparam)); + LowPassFilter2p_Init(&(c->filled[0]), target_freq, 80.0f); // 角加速度滤波 LowPassFilter2p_Init(&(c->filled[1]), target_freq, 80.0f); // w滤波 @@ -65,7 +72,6 @@ void Chassis_speed_calculate(Chassis_t *c, fp32 Vx, fp32 Vy, fp32 Vw) { c->hopemotorout.OmniSpeedOut[2] = Nor_Vx - Nor_Vy + Vw; // 左后 c->hopemotorout.OmniSpeedOut[3] = Nor_Vx + Nor_Vy + Vw; // 左前 } -float aaaaa=0; int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) { if (c == NULL) return CHASSIS_ERR_NULL; if (ctrl == NULL) return CHASSIS_ERR_NULL; @@ -75,98 +81,66 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) { // IMU加滤波修正 c->pos088.bmi088.filtered_gyro.z = LowPassFilter2p_Apply(&(c->filled[0]), c->pos088.bmi088.gyro.z); + /*初始数据*/ + c->move_vec.Vw = 0; + c->move_vec.Vx = 0; + c->move_vec.Vy = 0; + c->NUC_send.send[0] = 0; + c->sick_cali.is_reach = 0; + switch (c->chassis_ctrl.ctrl) { - case RCcontrol: // 手动控制 - /* - 在cmd里对数据进行处理 包括方向和油门 - 6000为全向轮的倍率,遥控器坐标系和机器人坐标系不同 - */ - c->NUC_send .send [0]=0; - c->NUC_send .send [1]=0; - c->NUC_send .send [2]=10; - c->NUC_send .send [3]=100; - + case RCcontrol: switch (c->chassis_ctrl.mode) { case Normal: - - if(ctrl->Vw){ c->move_vec.Vw = ctrl->Vw * 6000; c->move_vec.Vx = ctrl->Vy * 6000; c->move_vec.Vy = ctrl->Vx * 6000; - } - else - { - c->move_vec.Vw = ctrl->Vw * 6000 + c->pos088 .bmi088 .gyro .z * aaaaa; - c->move_vec.Vx = ctrl->Vy * 6000 + c->pos088 .bmi088 .gyro .z * aaaaa ; - c->move_vec.Vy = ctrl->Vx * 6000 + c->pos088 .bmi088 .gyro .z * aaaaa ; - - - - } - break; case Pitch: - c->move_vec.Vw = 0; - c->move_vec.Vx = 0; - c->move_vec.Vy = 0; + break; case UP_Adjust: c->move_vec.Vw = ctrl->Vw * 6000; - c->move_vec.Vx = 0; - c->move_vec.Vy = 0; + + break; + case Chassis_Adjust: + + sick_calibration(c, ctrl, out); + c->NUC_send.send[0] = (c->sick_cali.is_reach == 1) ? 1 : 0; break; default: - c->move_vec.Vw = 0; - c->move_vec.Vx = 0; - c->move_vec.Vy = 0; + break; } break; - case AUTO: // 自动模式 + case AUTO: switch (c->chassis_ctrl.mode) { - - case AUTO_MID360: // 自动雷达 - // 全向轮方向, 注意xy方向 + case AUTO_MID360: c->move_vec.Vw = ctrl->cmd_MID360.posw * 1000; c->move_vec.Vy = -ctrl->cmd_MID360.posy * 1000; c->move_vec.Vx = -ctrl->cmd_MID360.posx * 1000; - abs_limit_fp(&c->move_vec.Vx, 5000.0f); abs_limit_fp(&c->move_vec.Vy, 5000.0f); abs_limit_fp(&c->move_vec.Vw, 5000.0f); - - c->NUC_send .send [0]=0; break; - - case AUTO_MID360_Pitch: - c->move_vec.Vw = 0; - c->move_vec.Vy = 0; - c->move_vec.Vx = 0; - - c->NUC_send .send [0]=0; + case AUTO_MID360_Pitch: + break; - case AUTO_MID360_Adjust: + case AUTO_MID360_Adjust: c->move_vec.Vw = ctrl->Vw * 6000; c->move_vec.Vx = ctrl->Vy * 6000; c->move_vec.Vy = ctrl->Vx * 6000; - - c->NUC_send .send [0]=1; + c->NUC_send.send[0] = 1; break; default: - c->move_vec.Vw = 0; - c->move_vec.Vx = 0; - c->move_vec.Vy = 0; - c->NUC_send .send [0]=0; - + break; } break; default: - c->move_vec.Vw = 0; - c->move_vec.Vx = 0; - c->move_vec.Vy = 0; + break; } @@ -183,8 +157,12 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) { c->hopemotorout.OmniSpeedOut[i]); out->motor_CHASSIS3508.as_array[i] = c->final_out.final_3508out[i]; } -c->NUC_send .send [1]=1; + + c->vofa_send[0] = (fp32)c->sick_cali.sick_dis[1] - c->sick_cali.sick_dis[2]; return CHASSIS_OK; + + + } @@ -203,33 +181,35 @@ int8_t sick_calibration(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) if (ctrl == NULL) return CHASSIS_ERR_NULL; - fp32 sick0 = c->sick_cali.sick_dis[0]; + fp32 sick0 = c->sick_cali.sick_dis[0] ; fp32 sick1 = c->sick_cali.sick_dis[1]; fp32 sick2 = c->sick_cali.sick_dis[2]; const sickparam_t *param = &c->sick_cali.sickparam; - fp32 diff = fabsf(sick0 - sick1); + fp32 diff_yaw = -(fp32)(sick1 - sick2); + fp32 diff_y = -(fp32)(sick1 - c->sick_cali.sickparam.y_set); + fp32 diff_x = (fp32)(sick0 - c->sick_cali.sickparam.x_set); - // 1. yaw修正 - if (diff > param->w_error) { - c->move_vec.Vw = PID_calc(&(c->pid.chassis_SickVxPID), diff, 0); - c->move_vec.Vx = 0; - c->move_vec.Vy = 0; - } - // 2. xy修正 - else if (diff > param->xy_error) { - c->move_vec.Vw = 0; - c->move_vec.Vx = PID_calc(&(c->pid.chassis_SickVxPID), sick0, param->x_set); - c->move_vec.Vy = PID_calc(&(c->pid.chassis_SickVyPID), sick2, param->y_set); - } - // 3. 修正完成 - else { - c->move_vec.Vw = 0; - c->move_vec.Vx = 0; - c->move_vec.Vy = 0; - - } + c->move_vec.Vw = (fabsf(diff_yaw) > param->w_error) ? PID_calc(&(c->pid.SickCaliWzPID), diff_yaw, 0) : 0; + c->move_vec.Vx = (fabsf(diff_x) > param->xy_error) ? PID_calc(&(c->pid.SickCaliVxPID), diff_x, 0) : 0; + c->move_vec.Vy = (fabsf(diff_y) > param->xy_error) ? PID_calc(&(c->pid.SickCaliVyPID), diff_y, 0) : 0; + + static uint16_t reach_cnt = 0; + if (fabsf(diff_yaw) <= param->w_error && + fabsf(diff_x) <= param->xy_error && + fabsf(diff_y) <= param->xy_error) { + reach_cnt++; + if (reach_cnt >= 50) { + + c->sick_cali.is_reach = 1; + + } + } else { + reach_cnt = 0; + c->sick_cali.is_reach = 0; + } + return CHASSIS_OK; } diff --git a/User/Module/Chassis.h b/User/Module/Chassis.h index 8e153bb..dd09723 100644 --- a/User/Module/Chassis.h +++ b/User/Module/Chassis.h @@ -156,12 +156,10 @@ typedef struct{ - pid_type_def chassis_SickWzPID; - pid_type_def chassis_SickVxPID; - pid_type_def chassis_SickVyPID; + pid_type_def SickCaliWzPID; + pid_type_def SickCaliVxPID; + pid_type_def SickCaliVyPID; - pid_type_def sick_CaliforYPID; - pid_type_def sick_CaliforXPID; }pid; @@ -170,8 +168,9 @@ typedef struct{ LowPassFilter2p_t filled[6]; /* 输出滤波器滤波器数组 */ struct { - int32_t sick_dis[3]; //获取到的sick激光值 + int32_t sick_dis[4]; //获取到的sick激光值 sickparam_t sickparam; + int is_reach; }sick_cali; NUC_send_t NUC_send; @@ -179,38 +178,17 @@ typedef struct{ }Chassis_t; -/** - * @brief - * - * @param c - * @param param - * @param mech_zero - * @param wheelPolar - * @return - */ - int8_t Chassis_init(Chassis_t *c,const Chassis_Param_t *param,float target_freq); +int8_t Chassis_init(Chassis_t *c,const Chassis_Param_t *param,float target_freq); -/** - * \brief - - */ int8_t Chassis_UpdateFeedback(Chassis_t *c, const CAN_t *can); -/** - * \brief - - */ int8_t Chassis_Control(Chassis_t *c,CMD_t *ctrl,CAN_Output_t *out); -fp32 jiuzheng(fp32 yaw); +int8_t sick_calibration(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) ; - -/// @brief -/// @param c -void vesc_current_detection(Chassis_t *c); #endif diff --git a/User/Module/config.c b/User/Module/config.c index 0de4e36..134e59f 100644 --- a/User/Module/config.c +++ b/User/Module/config.c @@ -99,8 +99,8 @@ static const ConfigParam_t param ={ .dribble_flag=0, .m3508_init_ang = -5, .m3508_translate_angle = 1000, - .rev_spd=-1500, - .spd= 4000, // 转动速度 + .rev_spd=-2000, + .spd= 4200, // 转动速度 .init_spd=0, .light_3508_flag=0,//3508平移处的光电,0初始,1到位置 @@ -147,31 +147,31 @@ static const ConfigParam_t param ={ .out_limit =1000.0f, }, .Sick_CaliWparam ={ - .p = 0.0f, - .i = 0.0f, + .p = 4.5f, + .i = 0.005f, .d = 0.0f, - .i_limit = 0.0f, - .out_limit =0.0f, + .i_limit = 500.0f, + .out_limit =1000.0f, }, .Sick_CaliYparam ={ - .p = 0.0f, - .i = 0.0f, + .p = 2.9f, + .i = 0.0051f, .d = 0.0f, - .i_limit = 0.0f, - .out_limit =0.0f, + .i_limit = 500.0f, + .out_limit =3000.0f, }, .Sick_CaliXparam ={ - .p = 0.0f, - .i = 0.0f, + .p = 2.9f, + .i = 0.0065f, .d = 0.0f, - .i_limit = 0.0f, - .out_limit =0.0f, + .i_limit = 500.0f, + .out_limit =3000.0f, }, .sickparam={ - .w_error=5000, - .xy_error=5000, - .x_set=1000, - .y_set=1000, + .w_error=5, + .xy_error=5, + .x_set=927, + .y_set=1255, }, diff --git a/User/Module/up.c b/User/Module/up.c index 54d8964..95d17c1 100644 --- a/User/Module/up.c +++ b/User/Module/up.c @@ -520,7 +520,10 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out) // CoTRANSLATE_IN,//上方平移,送球发射,回到运球位置 // CoPITCH, //发射 // CoDONE, - +//int8_t Trans_Process (UP_t *u, CAN_Output_t *out) +//{ +// +//} int8_t Co_Process(UP_t *u, CAN_Output_t *out) { switch(u->CoContext .CoState ) diff --git a/User/device/can_use.c b/User/device/can_use.c index bb02319..0f2730c 100644 --- a/User/device/can_use.c +++ b/User/device/can_use.c @@ -1,3 +1,4 @@ + /* CAN总线上的设备1到7 将所有CAN总线上挂载的设备抽象成单个设备进行管理和控制 diff --git a/User/device/cmd.c b/User/device/cmd.c index 027e402..f5fa1bf 100644 --- a/User/device/cmd.c +++ b/User/device/cmd.c @@ -205,6 +205,7 @@ int8_t CMD_LD(CMD_t *cmd,const CMD_RC_t *rc){ if(rc->LD.key_G ==CMD_SW_DOWN ) cmd ->CMD_mode=Dribble ; else if(rc->LD.key_G ==CMD_SW_UP) cmd ->CMD_mode =Pitch; else if(rc->LD .key_H==CMD_SW_UP) cmd ->CMD_mode =UP_Adjust; + else if(rc->LD.key_C == CMD_SW_UP) cmd->CMD_mode =Chassis_Adjust; else cmd ->CMD_mode =Normal; } } diff --git a/User/device/cmd.h b/User/device/cmd.h index 6f77a9a..6e7df12 100644 --- a/User/device/cmd.h +++ b/User/device/cmd.h @@ -28,6 +28,7 @@ typedef enum{ AUTO_MID360_Adjust,//雷达调整 UP_Adjust,//上层调整 + Chassis_Adjust, Dribble , //运球 Pitch, //投篮,底盘锁定 diff --git a/User/device/vofa.c b/User/device/vofa.c index d1f8b7f..b897999 100644 --- a/User/device/vofa.c +++ b/User/device/vofa.c @@ -5,37 +5,61 @@ //用来对需要的数据进行串口绘图 (未添加接收函数) +//float vofa_send[8]; + +////发送函数 +//void vofa_tx_main(float *data) +//{ +// float fdata[8]={0}; +// uint8_t tail[4]; +// tail[0]=0x00; +// tail[1]=0x00; +// tail[2]=0x80; +// tail[3]=0x7f; +// /*在下面添加发送的数据*/ +// fdata[0] = data[0]; +// fdata[1] = data[1]; +// fdata[2] = data[2]; +// fdata[3] = data[3]; +// fdata[4] = data[4]; +// fdata[5] = data[5]; +// fdata[6] = data[6]; +// fdata[7] = data[7]; +// +// +// /*在下面使用对应的串口发送函数*/ +//// CDC_Transmit_FS( ( uint8_t *)fdata, sizeof(fdata)); +//// osDelay(1); +//// CDC_Transmit_FS( tail, 4); +//// HAL_UART_Transmit_DMA(&huart1, ( uint8_t *)fdata, sizeof(fdata)); +//// osDelay(1); +// HAL_UART_Transmit_DMA(&huart1, tail, 4); +// osDelay(1); + +// +//} + float vofa_send[8]; //发送函数 void vofa_tx_main(float *data) { - float fdata[8]={0}; - uint8_t tail[4]; - tail[0]=0x00; - tail[1]=0x00; - tail[2]=0x80; - tail[3]=0x7f; - /*在下面添加发送的数据*/ - fdata[0] = data[0]; - fdata[1] = data[1]; - fdata[2] = data[2]; - fdata[3] = data[3]; - fdata[4] = data[4]; - fdata[5] = data[5]; - fdata[6] = data[6]; - fdata[7] = data[7]; - - - /*在下面使用对应的串口发送函数*/ -// CDC_Transmit_FS( ( uint8_t *)fdata, sizeof(fdata)); -// osDelay(1); -// CDC_Transmit_FS( tail, 4); -// HAL_UART_Transmit_DMA(&huart1, ( uint8_t *)fdata, sizeof(fdata)); -// osDelay(1); -// HAL_UART_Transmit_DMA(&huart1, tail, 4); -// osDelay(1); + float fdata[8] = {0}; + uint8_t tail[4] = {0x00, 0x00, 0x80, 0x7f}; - -} + + for (int i = 0; i < 8; i++) { + fdata[i] = data[i]; + } + + uint8_t packet[8 * sizeof(float) + 4]; + memcpy(packet, fdata, 8 * sizeof(float)); + memcpy(packet + 8 * sizeof(float), tail, 4); + + /*在下面使用对应的串口发送函数*/ +// HAL_UART_Transmit_DMA(&huart6, packet, sizeof(packet)); +// CDC_Transmit_FS( packet, sizeof(packet)); +// osDelay(1); + +} \ No newline at end of file