diff --git a/MDK-ARM/AUTO_CHASSIS.uvoptx b/MDK-ARM/AUTO_CHASSIS.uvoptx index 5f23ba8..7f33d80 100644 --- a/MDK-ARM/AUTO_CHASSIS.uvoptx +++ b/MDK-ARM/AUTO_CHASSIS.uvoptx @@ -103,7 +103,7 @@ 1 0 0 - 6 + 3 @@ -114,7 +114,7 @@ - STLink\ST-LINKIII-KEIL_SWO.dll + BIN\CMSIS_AGDI.dll @@ -140,12 +140,12 @@ 0 CMSIS_AGDI - -X"Horco CMSIS-DAP" -U4626385832 -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC168000000 -TT168000000 -TP20 -TDS8010 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM) + -X"Horco CMSIS-DAP" -U8626380832 -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC168000000 -TT168000000 -TP20 -TDS8010 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM) 0 DLGUARM - (105=-1,-1,-1,-1,0) + 0 @@ -235,6 +235,11 @@ 1 flaggg,0x0A + + 16 + 1 + ddd + diff --git a/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf b/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf index 1b1ae25..dd93e1a 100644 Binary files a/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf and b/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf differ diff --git a/User/Module/config.c b/User/Module/config.c index 78ab050..32fc173 100644 --- a/User/Module/config.c +++ b/User/Module/config.c @@ -38,14 +38,14 @@ static const ConfigParam_t param_chassis ={ }, .M3508_angle_param = { .p = 10.0f, - .i = 0.0f, - .d = 1.5f, + .i = 0.5f, + .d = 0.0f, .i_limit = 1000.0f, .out_limit = 3000.0f, }, .M3508_speed_param={ - .p = 5.1f, - .i = 0.02f, + .p = 6.0f, + .i = 0.0f, .d = 3.2f, .i_limit = 200.0f, .out_limit =6000.0f, @@ -77,25 +77,25 @@ static const ConfigParam_t param_chassis ={ .rev = 0, .T=0.1, .W=0.1, - .K_P=0.10f, + .K_P=0.20f, .K_W=0.1, }, /*上层其他参数*/ /*运球*/ .DribbleConfig_Config = { - .m3508_init_angle = 0, - .m3508_high_angle = 900, - .go2_init_angle = 35, - .go2_flip_angle = -130, + .m3508_init_angle = 50, + .m3508_high_angle = 1200, + .go2_init_angle = 0, + .go2_flip_angle = -250, .flip_timing = 200, - .release_threshold = -1.2f, + .go2_release_threshold = -550.0f, }, /*投球*/ .PitchConfig_Config = { - .m2006_init_angle =-140, + .m2006_init_angle =-150, .m2006_trigger_angle =0, - .go1_init_position = 0, - .go1_release_threshold =-2050, + .go1_init_position = -300, + .go1_release_threshold =-1900, }, diff --git a/User/Module/up.c b/User/Module/up.c index 1c00309..9d37a0d 100644 --- a/User/Module/up.c +++ b/User/Module/up.c @@ -45,15 +45,13 @@ int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq) u->DribbleContext .DribbleConfig = u->param ->DribbleConfig_Config ;//赋值 u->DribbleContext .DribbleState = Dribble_PREPARE; u->DribbleContext .is_initialized = 1; - u->DribbleContext .Dribble_run_num =0;//记录运行次数 + } if (!u->PitchContext .is_initialized) { u->PitchContext .PitchConfig = u->param ->PitchConfig_Config ;//赋值 u->PitchContext .PitchState = PITCH_PREPARE; //状态更新,开始夹球 u->PitchContext .is_initialized = 1; - u->PitchContext .Pitch_run_num =0;//记录运行次数 - } @@ -201,7 +199,7 @@ int8_t GO_SendData(UP_t *u,int id,float pos) { GO_M8010_send_data(BSP_UART_GetHandle(BSP_UART_RS485), id,u->param->go_param[id] .rev ,u->param->go_param[id] .T ,u->param->go_param[id] .W ,AngleChange(RADIAN,pos),u->param->go_param [id].K_P ,u->param->go_param[id] .K_W ); - return 0; + return 0; } @@ -246,47 +244,52 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c) { case UP_RCcontrol: //在手动模式下 - switch (c->CMD_UP_mode ) + switch (c-> CMD_UP_mode ) { case Normal : /*投篮*/ u->motor_target .go_shoot =u->PitchContext .PitchConfig .go1_init_position ; u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ; + u->PitchContext .PitchState = PITCH_PREPARE; //状态更新,开始夹球 + /*运球*/ u->motor_target .go_spin = u->DribbleContext.DribbleConfig .go2_init_angle ; u->motor_target .M3508_angle =u->DribbleContext .DribbleConfig .m3508_init_angle ; + u->DribbleContext .DribbleState = Dribble_PREPARE; //重置最初状态 - RELAY1_TOGGLE (1);//接球,1开0关 - RELAY2_TOGGLE (1);//夹球,0关1开 + RELAY1_TOGGLE (1);//夹球,0夹1开 + RELAY2_TOGGLE (0);//球,0接1收 break; case Pitch : - Pitch_Process(u,out); - u->PitchContext .PitchState=PITCH_START;//置标志位用于启动投篮 - + if (u->PitchContext .PitchState ==PITCH_PREPARE) //首次启动 + { + u->PitchContext .PitchState=PITCH_START;//置标志位用于启动投篮 + } + + Pitch_Process(u,out); + break ; case Dribble: { /*夹球 -> 3508 升起 ,同时go2翻转 -> 到位置后,继电器开,放球,同时3508降,go2翻回->接球,收 */ - Dribble_Process(u,out); - u->DribbleContext .DribbleState =STATE_GRAB_BALL;//置标志位用于启动运球 - + + if(u->DribbleContext.DribbleState== Dribble_PREPARE){ + + u->DribbleContext .DribbleState =STATE_GRAB_BALL; + } + Dribble_Process(u,out); + + }break ; - - case PICK_Pitch_START : + case Dribbl_transfer: - Pitch_Process(u,out); - u->PitchContext .PitchState=PITCH_START;//置标志位用于启动视觉辅助投篮 - - break; - - - + Dribbl_transfer_a(u,out); } break; @@ -311,12 +314,15 @@ int8_t Pitch_Process(UP_t *u, CAN_Output_t *out) case PITCH_START: u->motor_target .go_shoot = u->PitchContext .PitchConfig .go1_release_threshold; - if(u->motorfeedback .GO_motor_info[0]->Pos < -35.0) //检测go位置到达最上面,这里的检测条件可以更改 + if(u->motorfeedback .GO_motor_info[0]->Pos < -32.40){ //检测go位置到达最上面,这里的检测条件可以更改 u->motor_target .M2006_angle = u->PitchContext .PitchConfig .m2006_trigger_angle ;//设置2006角度,0 - u->PitchContext .PitchState =PITCH_PULL_TRIGGER; //更改标志位 + + u->PitchContext .PitchState=PITCH_PULL_TRIGGER;//置标志位用于启动视觉辅助投篮 +}//更改标志位 + break ; case PITCH_PULL_TRIGGER: - if(u->motorfeedback .M2006 .total_angle <5) //当2006的总角度小于5,可以认为已经勾上 + if(u->motorfeedback .M2006 .total_angle >-1) //当2006的总角度小于1,可以认为已经勾上,误差为1 { u->motor_target .go_shoot =u->PitchContext.PitchConfig .go1_init_position;//go下拉 u->PitchContext.PitchState =PITCH_LAUNCHING;//转移标志位 @@ -324,18 +330,17 @@ int8_t Pitch_Process(UP_t *u, CAN_Output_t *out) break ; case PITCH_LAUNCHING: - if(u->motorfeedback .GO_motor_info [0]->Pos <2.0f) + if(u->motorfeedback .GO_motor_info [0]->Pos >0) { - u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ;//给-140角度发射 +// u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ;//给-140角度发射 u->PitchContext .PitchState =PITCH_COMPLETE; } break ; case PITCH_COMPLETE://完成运行动作后,恢复2006,-140度,go,pos0位置 - u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ;//给-140角度 + u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ;//给-140角度 u->motor_target .go_shoot = u->PitchContext .PitchConfig .go1_init_position; - u->PitchContext .Pitch_run_num ++;//运行次数+1 break ; @@ -349,6 +354,8 @@ return 0; +// RELAY1_TOGGLE (1);//夹球,0夹1开 +// RELAY2_TOGGLE (0);//夹球,0接1收 @@ -358,18 +365,18 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out) switch (u->DribbleContext.DribbleState) { case STATE_GRAB_BALL://开始 - RELAY2_TOGGLE (0);//夹球 + RELAY1_TOGGLE (0);//夹球 u->motor_target.M3508_angle =u->DribbleContext .DribbleConfig .m3508_high_angle;//3508升起 u->motor_target.go_spin =u->DribbleContext .DribbleConfig .go2_flip_angle; if((u->motorfeedback .M3508 .total_angle >400)) { - RELAY1_TOGGLE (0); + RELAY2_TOGGLE (1); - if((u->motorfeedback.GO_motor_info[1]->angle) <-53){ - + if(((u->motorfeedback.GO_motor_info[1]->Pos ) <-1.1)&&(u->motorfeedback.M3508 .total_angle >1190)){ + u->DribbleContext .DribbleState = STATE_RELEASE_BALL; //当go2到标准位置,标志位改变 } @@ -378,13 +385,13 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out) case STATE_RELEASE_BALL: - RELAY2_TOGGLE (1);//松球 + RELAY1_TOGGLE (1);//松球 - if((u->motorfeedback.GO_motor_info[1]->angle) <-60){ - u->motor_target.go_spin =u->DribbleContext .DribbleConfig .go2_init_angle ; //恢复go2位置 + if((u->motorfeedback.GO_motor_info[1]->Pos ) <-1.3){ + u->motor_target.go_spin =-40; //恢复go2位置 u->DribbleContext .DribbleState = STATE_CATCH_PREP; //当go2到标准位置,标志位改变 } @@ -392,22 +399,25 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out) break; case STATE_CATCH_PREP: - if((u->motorfeedback.GO_motor_info[1]->angle) > -0){ - u->motor_target.M3508_angle =u->DribbleContext .DribbleConfig .m3508_init_angle ; //当go2到初始位置,3508降 + if((u->motorfeedback.GO_motor_info[1]->Pos )> -0.4){ + u->motor_target.M3508_angle =0 ; //当go2到初始位置,3508降 - RELAY1_TOGGLE (1);//接球 + RELAY2_TOGGLE (0);//接球 } - if(u->motorfeedback .M3508 .total_angle <5){ - u->DribbleContext .DribbleState = STATE_CATCH_DONE; + if(u->motorfeedback .M3508 .total_angle <51.0f){ + RELAY1_TOGGLE (0);//夹球,0夹1开 + + u->DribbleContext .DribbleState = STATE_TRANSFER; } + break; + + + + + break ; - case STATE_CATCH_DONE: - RELAY2_TOGGLE (1);//松球 - RELAY1_TOGGLE (0); - u->DribbleContext .Dribble_run_num ++;//运行次数增加 - break; default: break; @@ -416,3 +426,42 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out) return 0; } +void Dribbl_transfer_a(UP_t *u, CAN_Output_t *out) +{ + switch (u->DribbleContext.DribbleState) { + + + + case STATE_TRANSFER: + if((u->motorfeedback.M3508 .total_angle <52.0f )) //满足这个状态时认为go和3508到达初始位置,再夹上球 + { + + u->motor_target .go_spin =u->DribbleContext .DribbleConfig .go2_release_threshold ; + } + + if(u->motorfeedback .GO_motor_info [1]->Pos < -4.9) + { + RELAY1_TOGGLE (1);//夹球,0夹1开 + + if(u->motorfeedback .GO_motor_info [1]->Pos > -4.8) + { + u->DribbleContext .DribbleState = STATE_CATCH_DONE; //当go2到标准位置,标志位改变 + } + } + + + break ; + + case STATE_CATCH_DONE: + + RELAY1_TOGGLE (1);//夹球,0夹1开 + RELAY2_TOGGLE (0);//夹球,0接1收 + + u->motor_target.go_spin=u->DribbleContext .DribbleConfig.go2_init_angle ; + + break; + + break; + + } +} diff --git a/User/Module/up.h b/User/Module/up.h index 5250861..3019478 100644 --- a/User/Module/up.h +++ b/User/Module/up.h @@ -44,7 +44,7 @@ typedef enum { PITCH_PREPARE, // 准备阶段 PITCH_START, //启动,拉扳机 - PITCH_PULL_TRIGGER, // 扳机拉动 + PITCH_PULL_TRIGGER, PITCH_LAUNCHING, // 发射中 PITCH_COMPLETE // 完成 } PitchState_t; @@ -63,7 +63,6 @@ typedef struct { PitchConfig_t PitchConfig; uint8_t is_initialized ; - uint8_t Pitch_run_num; } PitchContext_t; @@ -80,6 +79,7 @@ typedef enum { STATE_RELEASE_BALL, // 释放球体 STATE_CATCH_PREP, // 接球准备 STATE_CATCH_BALL, // 接球动作 + STATE_TRANSFER, //转移球 STATE_CATCH_DONE //完成 } DribbleState_t; @@ -90,7 +90,8 @@ typedef struct { fp32 go2_init_angle; // GO2初始角度 fp32 go2_flip_angle; // GO2翻转角度 fp32 flip_timing; // 翻转触发时机 - fp32 release_threshold; // 释放球 +// fp32 + fp32 go2_release_threshold; // 释放球 } DribbleConfig_t; /* 状态机上下文 */ @@ -99,7 +100,6 @@ typedef struct { DribbleConfig_t DribbleConfig; uint8_t is_initialized; - uint8_t Dribble_run_num; } DribbleContext_t; @@ -177,7 +177,7 @@ typedef struct{ uint8_t up_task_run; const UP_Param_t *param; - int state; + int state; @@ -260,7 +260,7 @@ typedef struct{ LowPassFilter2p_t filled[6]; /* 输出滤波器滤波器数组 */ - fp32 vofa_send[8]; + fp32 vofa_send[8]; @@ -282,5 +282,6 @@ int8_t Pitch_Process(UP_t *u, CAN_Output_t *out); int8_t Dribble_Process(UP_t *u, CAN_Output_t *out); +void Dribbl_transfer_a(UP_t *u, CAN_Output_t *out); #endif diff --git a/User/device/cmd.c b/User/device/cmd.c index 88a50c0..961968d 100644 --- a/User/device/cmd.c +++ b/User/device/cmd.c @@ -43,9 +43,12 @@ int8_t CMD_ParseNuc(CMD_t *cmd,CMD_NUC_t *n){ /*遥控器,上下层通用,按键控制,统一到cmd*/ int8_t CMD_ParseRC(CMD_t *cmd,const CMD_RC_t *rc) { - + + if(cmd == NULL) return -1; - + const CMD_CtrlType_t prev_CtrlType = cmd->CMD_CtrlType ; + const CMD_UP_mode_t prev_mode = cmd->CMD_UP_mode ;//保存旧状态 + if ((rc->sw_l == CMD_SW_ERR) || (rc->sw_r == CMD_SW_ERR)) { cmd->CMD_CtrlType =RELAXED; } @@ -54,7 +57,7 @@ int8_t CMD_ParseRC(CMD_t *cmd,const CMD_RC_t *rc) { cmd ->CMD_CtrlType =UP_RCcontrol; if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_UP_mode =Pitch; //左上,右上,投篮 if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_UP_mode =Normal; //左上,右中,无模式 - if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =Dribble; //左上,右上,运球 + if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =Normal; //左上,右上,运球 } else if(rc->sw_l==CMD_SW_MID) @@ -74,13 +77,16 @@ int8_t CMD_ParseRC(CMD_t *cmd,const CMD_RC_t *rc) { } else if(rc->sw_l==CMD_SW_DOWN) { - cmd ->CMD_CtrlType =PICK_t; - if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_UP_mode =PICK_Pitch_Normal; //左下,右上,投篮 - if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_UP_mode =Normal; //左下,右中,无模式 - if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =PICK_Pitch_START; //左下,右上,投篮 + cmd ->CMD_CtrlType =UP_RCcontrol; + if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_UP_mode =Dribbl_transfer; //左下,右上,投篮 + if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_UP_mode =Dribble; //左下,右中,无模式 + if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =Normal; //左下,右上,无模式 } - - + + if (prev_CtrlType!= cmd->CMD_CtrlType ) cmd ->last_CMD_CtrlType = prev_CtrlType; + if (prev_mode!=cmd->CMD_UP_mode ) cmd ->last_CMD_UP_mode =prev_mode; + + return 0; } diff --git a/User/device/cmd.h b/User/device/cmd.h index 24e998b..cb73edc 100644 --- a/User/device/cmd.h +++ b/User/device/cmd.h @@ -26,8 +26,7 @@ typedef enum{ /*视觉辅助下的投篮*/ PICK_Pitch_Normal, - PICK_Pitch_START - + Dribbl_transfer }CMD_UP_mode_t; typedef struct { uint8_t status_fromnuc; @@ -99,7 +98,8 @@ typedef struct { CMD_UP_mode_t CMD_UP_mode; CMD_CtrlType_t CMD_CtrlType; - + CMD_CtrlType_t last_CMD_CtrlType; + CMD_UP_mode_t last_CMD_UP_mode; } CMD_t; diff --git a/User/task/up_task.c b/User/task/up_task.c index 63701fd..5f1b52a 100644 --- a/User/task/up_task.c +++ b/User/task/up_task.c @@ -67,19 +67,16 @@ void Task_up(void *argument) // -// GO_SendData(&UP, 1,CCC); -// GO_SendData(&UP, 0,aaa); UP_control(&UP,&UP_CAN_out,&up_cmd); // UP.motor_target .go_shoot =aaa; // UP.motor_target .M2006_angle =bbb ; -// UP_control(&UP,&UP_CAN_out,&up_cmd); // UP.motor_target .M3508_angle =CCC; // UP.motor_target .go_shoot =aaa; // UP.motor_target .M2006_angle =bbb; // UP.motor_target .go_spin =ddd; - +// ALL_Motor_Control(&UP,&UP_CAN_out); osDelay(1);