|
|
@ -20,6 +20,7 @@ |
|
|
|
|
|
|
|
|
/*=========================== 2.宏定义 ===========================*/ |
|
|
/*=========================== 2.宏定义 ===========================*/ |
|
|
/* 姿态控制常量(用于 Robot_Posture_Adjus_Gravity) */ |
|
|
/* 姿态控制常量(用于 Robot_Posture_Adjus_Gravity) */ |
|
|
|
|
|
#define TT_One_Deg_Count2 11014 |
|
|
#define POSTURE_ERROR_THRESHOLD 5.0f /* 姿态调整误差阈值(度) */ |
|
|
#define POSTURE_ERROR_THRESHOLD 5.0f /* 姿态调整误差阈值(度) */ |
|
|
#define ANGLE_NORMALIZE_BOUNDARY 180.0f /* 角度归一化边界 */ |
|
|
#define ANGLE_NORMALIZE_BOUNDARY 180.0f /* 角度归一化边界 */ |
|
|
#define SPEED_FACTOR_LARGE 1.0f /* 大误差速度系数 */ |
|
|
#define SPEED_FACTOR_LARGE 1.0f /* 大误差速度系数 */ |
|
|
@ -76,6 +77,9 @@ enum swing_state { |
|
|
////局部静态变量
|
|
|
////局部静态变量
|
|
|
/* 状态机当前状态(多个状态机共用,可能存在潜在冲突,但是现在还不知道咋搞呢) */ |
|
|
/* 状态机当前状态(多个状态机共用,可能存在潜在冲突,但是现在还不知道咋搞呢) */ |
|
|
int s_currentState = STATE_ATTITUDE_JUDGE; |
|
|
int s_currentState = STATE_ATTITUDE_JUDGE; |
|
|
|
|
|
int horizontal_s_currentState = STATE_ATTITUDE_JUDGE; |
|
|
|
|
|
int vertical_s_currentState = STATE_ATTITUDE_JUDGE; |
|
|
|
|
|
int ChangeRoad_currentState = STATE_ATTITUDE_JUDGE; |
|
|
int swing_currentState = SWING_START_STATE; |
|
|
int swing_currentState = SWING_START_STATE; |
|
|
|
|
|
|
|
|
/* 换道计时变量 */ |
|
|
/* 换道计时变量 */ |
|
|
@ -87,12 +91,20 @@ static float LEFT_TARGET_ANGLES[2]; |
|
|
|
|
|
|
|
|
int Change_stop_flag=0; |
|
|
int Change_stop_flag=0; |
|
|
|
|
|
|
|
|
|
|
|
static int S1_Last_Value; |
|
|
|
|
|
static int S2_Last_Value; |
|
|
|
|
|
int center_angle; |
|
|
|
|
|
int offset_angle; |
|
|
|
|
|
int center_position; //中间位置-944334
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*===========================5. 静态函数声明 ===========================*/ |
|
|
/*===========================5. 静态函数声明 ===========================*/ |
|
|
/* 水平/垂直状态机函数 */ |
|
|
/* 水平/垂直状态机函数 */ |
|
|
static void handleAttitudeJudge_horizontal(void); |
|
|
static void handleAttitudeJudge_horizontal(void); |
|
|
static void handleAttitudeJudge_vertical(void); |
|
|
static void handleAttitudeJudge_vertical(void); |
|
|
static void handleAttitudeAdjust(void); |
|
|
static void handleAttitudeAdjustHorizontal(void); |
|
|
|
|
|
static void handleAttitudeAdjustVertical(void); |
|
|
|
|
|
static void handleAttitudeAdjustChangeRoad(void); |
|
|
static void handleWorkWay(void); |
|
|
static void handleWorkWay(void); |
|
|
void horizontal_work(void); |
|
|
void horizontal_work(void); |
|
|
|
|
|
|
|
|
@ -116,6 +128,7 @@ void swing_work(void); |
|
|
static void swing_start_move(void); |
|
|
static void swing_start_move(void); |
|
|
static void swing_left_move(void); |
|
|
static void swing_left_move(void); |
|
|
static void swing_right_move(void); |
|
|
static void swing_right_move(void); |
|
|
|
|
|
static void get_swing_mode(void); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* PID系数 */ |
|
|
/* PID系数 */ |
|
|
@ -129,7 +142,7 @@ int factor_2= -1; |
|
|
*/ |
|
|
*/ |
|
|
static const void (*const horizontal_single_lane_auto_operation[])(void) = { |
|
|
static const void (*const horizontal_single_lane_auto_operation[])(void) = { |
|
|
[STATE_ATTITUDE_JUDGE] = handleAttitudeJudge_horizontal, |
|
|
[STATE_ATTITUDE_JUDGE] = handleAttitudeJudge_horizontal, |
|
|
[STATE_ATTITUDE_ADJUST] = handleAttitudeAdjust, |
|
|
[STATE_ATTITUDE_ADJUST] = handleAttitudeAdjustHorizontal, |
|
|
[STATE_WORK_WAY_OR_DIRECT_MOVE] = handleWorkWay, |
|
|
[STATE_WORK_WAY_OR_DIRECT_MOVE] = handleWorkWay, |
|
|
[STATE_FIGHT_ALTERNATELY] = NULL, /* 待实现 */ |
|
|
[STATE_FIGHT_ALTERNATELY] = NULL, /* 待实现 */ |
|
|
[STATE_FIGHT_RETREATING] = Fight_Countinus_Function_Horizontal, /* 待实现 */ |
|
|
[STATE_FIGHT_RETREATING] = Fight_Countinus_Function_Horizontal, /* 待实现 */ |
|
|
@ -141,7 +154,7 @@ static const void (*const horizontal_single_lane_auto_operation[])(void) = { |
|
|
*/ |
|
|
*/ |
|
|
static const void (*const robot_horizontal_drive[])(void) = { |
|
|
static const void (*const robot_horizontal_drive[])(void) = { |
|
|
[STATE_ATTITUDE_JUDGE] = handleAttitudeJudge_horizontal, |
|
|
[STATE_ATTITUDE_JUDGE] = handleAttitudeJudge_horizontal, |
|
|
[STATE_ATTITUDE_ADJUST] = handleAttitudeAdjust, |
|
|
[STATE_ATTITUDE_ADJUST] = handleAttitudeAdjustHorizontal, |
|
|
[STATE_WORK_WAY_OR_DIRECT_MOVE] = auto_drive_pid_horizontal, |
|
|
[STATE_WORK_WAY_OR_DIRECT_MOVE] = auto_drive_pid_horizontal, |
|
|
[STATE_HALT] = handleHalt, |
|
|
[STATE_HALT] = handleHalt, |
|
|
}; |
|
|
}; |
|
|
@ -153,7 +166,7 @@ static const void (*const robot_horizontal_drive[])(void) = { |
|
|
*/ |
|
|
*/ |
|
|
static const void (*const robot_vertical_drive[])(void) = { |
|
|
static const void (*const robot_vertical_drive[])(void) = { |
|
|
[STATE_ATTITUDE_JUDGE] = handleAttitudeJudge_vertical, |
|
|
[STATE_ATTITUDE_JUDGE] = handleAttitudeJudge_vertical, |
|
|
[STATE_ATTITUDE_ADJUST] = handleAttitudeAdjust, |
|
|
[STATE_ATTITUDE_ADJUST] = handleAttitudeAdjustVertical, |
|
|
[STATE_WORK_WAY_OR_DIRECT_MOVE] = auto_drive_pid_vertical, |
|
|
[STATE_WORK_WAY_OR_DIRECT_MOVE] = auto_drive_pid_vertical, |
|
|
[STATE_HALT] = handleHalt, |
|
|
[STATE_HALT] = handleHalt, |
|
|
}; |
|
|
}; |
|
|
@ -163,10 +176,10 @@ static const void (*const robot_vertical_drive[])(void) = { |
|
|
*/ |
|
|
*/ |
|
|
static const void (*const vertical_lane_change_left[])(void) = { |
|
|
static const void (*const vertical_lane_change_left[])(void) = { |
|
|
[LANE_CHANGE_STATE_ATTITUDE_JUDGE] = handleLaneChangeAttitudeJudgeLeft, |
|
|
[LANE_CHANGE_STATE_ATTITUDE_JUDGE] = handleLaneChangeAttitudeJudgeLeft, |
|
|
[LANE_CHANGE_STATE_ATTITUDE_ADJUST] = handleAttitudeAdjust, |
|
|
[LANE_CHANGE_STATE_ATTITUDE_ADJUST] = handleAttitudeAdjustChangeRoad, |
|
|
[LANE_CHANGE_STATE_CALC_RETREAT_TIME] = handleLaneChangeCalcRetreatTime, |
|
|
[LANE_CHANGE_STATE_CALC_RETREAT_TIME] = handleLaneChangeCalcRetreatTime, |
|
|
[LANE_CHANGE_STATE_CONTINUOUS_RETREAT] = handleLaneChangeContinuousRetreat, |
|
|
[LANE_CHANGE_STATE_CONTINUOUS_RETREAT] = handleLaneChangeContinuousRetreat, |
|
|
[LANE_CHANGE_STATE_RETREAT_DONE_SWITCH] = handleAttitudeAdjust, |
|
|
[LANE_CHANGE_STATE_RETREAT_DONE_SWITCH] = handleAttitudeAdjustChangeRoad, |
|
|
[STATE_HALT] = handleHalt, |
|
|
[STATE_HALT] = handleHalt, |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
@ -213,6 +226,7 @@ void Turn_Right(void) |
|
|
|
|
|
|
|
|
void Robot_Stop(void) |
|
|
void Robot_Stop(void) |
|
|
{ |
|
|
{ |
|
|
|
|
|
get_swing_mode(); |
|
|
Robot_Swing_Operation_Function(); |
|
|
Robot_Swing_Operation_Function(); |
|
|
GV.Left_Speed_M_min = 0; |
|
|
GV.Left_Speed_M_min = 0; |
|
|
GV.Right_Speed_M_min = 0; |
|
|
GV.Right_Speed_M_min = 0; |
|
|
@ -249,12 +263,31 @@ void Robot_Posture_Adjus_Gravity(float *pError) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void handleAttitudeAdjust(void) |
|
|
static void handleAttitudeAdjustHorizontal(void) |
|
|
{ |
|
|
{ |
|
|
float errorAbs; |
|
|
float errorAbs; |
|
|
Robot_Posture_Adjus_Gravity(&errorAbs); |
|
|
Robot_Posture_Adjus_Gravity(&errorAbs); |
|
|
if (errorAbs < ANGLE_ERROR_THRESHOLD) { |
|
|
if (errorAbs < ANGLE_ERROR_THRESHOLD) { |
|
|
s_currentState++; |
|
|
horizontal_s_currentState++; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void handleAttitudeAdjustVertical(void) |
|
|
|
|
|
{ |
|
|
|
|
|
float errorAbs; |
|
|
|
|
|
Robot_Posture_Adjus_Gravity(&errorAbs); |
|
|
|
|
|
if (errorAbs < ANGLE_ERROR_THRESHOLD) { |
|
|
|
|
|
vertical_s_currentState++; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void handleAttitudeAdjustChangeRoad(void) |
|
|
|
|
|
{ |
|
|
|
|
|
float errorAbs; |
|
|
|
|
|
Robot_Posture_Adjus_Gravity(&errorAbs); |
|
|
|
|
|
if (errorAbs < ANGLE_ERROR_THRESHOLD) { |
|
|
|
|
|
ChangeRoad_currentState++; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
/*-----------------------------------------------------------------
|
|
|
/*-----------------------------------------------------------------
|
|
|
@ -269,7 +302,7 @@ static void handleAttitudeJudge_horizontal(void) |
|
|
} else { |
|
|
} else { |
|
|
GV.Robot_Angle_Desire = 90.0f + (float)GV.Left_Compensation / 100.0f; |
|
|
GV.Robot_Angle_Desire = 90.0f + (float)GV.Left_Compensation / 100.0f; |
|
|
} |
|
|
} |
|
|
s_currentState = STATE_ATTITUDE_ADJUST; |
|
|
horizontal_s_currentState = STATE_ATTITUDE_ADJUST; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void handleAttitudeJudge_vertical(void) |
|
|
static void handleAttitudeJudge_vertical(void) |
|
|
@ -284,18 +317,18 @@ static void handleAttitudeJudge_vertical(void) |
|
|
GV.Robot_Angle_Desire -= 360.0f; |
|
|
GV.Robot_Angle_Desire -= 360.0f; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
s_currentState = STATE_ATTITUDE_ADJUST; |
|
|
vertical_s_currentState = STATE_ATTITUDE_ADJUST; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void handleWorkWay(void) |
|
|
static void handleWorkWay(void) |
|
|
{ |
|
|
{ |
|
|
int mode = (int)GV.PV.Robot_backMode; |
|
|
int mode = GV.PV.Robot_backMode; |
|
|
if (mode == 1) { |
|
|
if (mode == 1) { |
|
|
s_currentState = STATE_FIGHT_ALTERNATELY; |
|
|
horizontal_s_currentState = STATE_FIGHT_ALTERNATELY; |
|
|
} else if (mode == 2) { |
|
|
} else if (mode == 2) { |
|
|
s_currentState = STATE_FIGHT_RETREATING; |
|
|
horizontal_s_currentState = STATE_FIGHT_RETREATING; |
|
|
} |
|
|
} |
|
|
/* 其他模式保持当前状态?目前没有 else,可能默认留在该状态 */ |
|
|
/* 其他模式保持当前状态?目前没有 else,可能默认留在该状态 */ |
|
|
} |
|
|
} |
|
|
@ -310,7 +343,7 @@ static void handleLaneChangeAttitudeJudgeLeft(void) |
|
|
Change_stop_flag=0; |
|
|
Change_stop_flag=0; |
|
|
get_ChangeAngle(); |
|
|
get_ChangeAngle(); |
|
|
GV.Robot_Angle_Desire = LEFT_TARGET_ANGLES[0]; |
|
|
GV.Robot_Angle_Desire = LEFT_TARGET_ANGLES[0]; |
|
|
s_currentState = LANE_CHANGE_STATE_ATTITUDE_ADJUST; |
|
|
ChangeRoad_currentState = LANE_CHANGE_STATE_ATTITUDE_ADJUST; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
@ -345,16 +378,19 @@ void get_ChangeAngle(void) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
float distanceM; |
|
|
static void handleLaneChangeCalcRetreatTime(void) |
|
|
static void handleLaneChangeCalcRetreatTime(void) |
|
|
{ |
|
|
{ |
|
|
float distanceM; |
|
|
//float distanceM;
|
|
|
if(GV.PV.Robot_Operation_Mode==2)//水平
|
|
|
if(GV.PV.Robot_Operation_Mode==2)//水平
|
|
|
{ |
|
|
{ |
|
|
distanceM = ((float)GV.LaneChangeDistance * 0.01f-B_OF_DIS_HOR)/K_OF_DIS_HOR; /* 厘米 → 米 */ |
|
|
distanceM = ((float)GV.LaneChangeDistance-B_OF_DIS_HOR)/K_OF_DIS_HOR; /* 厘米 → 米 */ |
|
|
|
|
|
distanceM=distanceM * 0.01f; |
|
|
} |
|
|
} |
|
|
else if(GV.PV.Robot_Operation_Mode==4||GV.PV.Robot_Operation_Mode==5) //竖直
|
|
|
else if(GV.PV.Robot_Operation_Mode==4||GV.PV.Robot_Operation_Mode==5) //竖直
|
|
|
{ |
|
|
{ |
|
|
distanceM = ((float)GV.LaneChangeDistance * 0.01f-B_OF_DIS_VER)/K_OF_DIS_VER; /* 厘米 → 米 */ |
|
|
distanceM = ((float)GV.LaneChangeDistance-B_OF_DIS_VER)/K_OF_DIS_VER; /* 厘米 → 米 */ |
|
|
|
|
|
distanceM=distanceM * 0.01f; |
|
|
} |
|
|
} |
|
|
float timeSec = distanceM / LANE_CHANGE_SPEED; /* 秒 */ |
|
|
float timeSec = distanceM / LANE_CHANGE_SPEED; /* 秒 */ |
|
|
float timeMs = timeSec * 60.0f * 1000.0f; /* 毫秒 */ |
|
|
float timeMs = timeSec * 60.0f * 1000.0f; /* 毫秒 */ |
|
|
@ -363,11 +399,11 @@ static void handleLaneChangeCalcRetreatTime(void) |
|
|
uint32_t tickNow = HAL_GetTick(); |
|
|
uint32_t tickNow = HAL_GetTick(); |
|
|
s_retreatStartTick = tickNow; |
|
|
s_retreatStartTick = tickNow; |
|
|
|
|
|
|
|
|
s_currentState = LANE_CHANGE_STATE_CONTINUOUS_RETREAT; |
|
|
ChangeRoad_currentState = LANE_CHANGE_STATE_CONTINUOUS_RETREAT; |
|
|
|
|
|
|
|
|
if(P_MK32->CH4_SA == -1000&&Change_stop_flag==1) |
|
|
if(P_MK32->CH4_SA == -1000&&Change_stop_flag==1) |
|
|
{ |
|
|
{ |
|
|
s_currentState = LANE_CHANGE_STATE_ATTITUDE_JUDGE; |
|
|
ChangeRoad_currentState = LANE_CHANGE_STATE_ATTITUDE_JUDGE; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -378,7 +414,7 @@ static void handleLaneChangeContinuousRetreat(void) |
|
|
auto_drive_pid_vertical(); |
|
|
auto_drive_pid_vertical(); |
|
|
|
|
|
|
|
|
if ((tickNow - s_retreatStartTick) >= s_retreatDurationTicks) { |
|
|
if ((tickNow - s_retreatStartTick) >= s_retreatDurationTicks) { |
|
|
s_currentState++; |
|
|
ChangeRoad_currentState++; |
|
|
GV.Robot_Angle_Desire = LEFT_TARGET_ANGLES[1]; |
|
|
GV.Robot_Angle_Desire = LEFT_TARGET_ANGLES[1]; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -404,10 +440,11 @@ void Move_Horizontal_Vertical_Task_Backwards_Do_Backward(void) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int present_angle; |
|
|
static void swing_start_move(void) |
|
|
static void swing_start_move(void) |
|
|
{ |
|
|
{ |
|
|
if(GV.SwingMotor.Real_Position<=left_compare_value-20000) |
|
|
present_angle=-(GV.SwingMotor.Real_Position+944334)/11014; |
|
|
|
|
|
if(present_angle>=left_compare_value+2) |
|
|
{ |
|
|
{ |
|
|
swing_currentState=SWING_LEFT_MOVE; |
|
|
swing_currentState=SWING_LEFT_MOVE; |
|
|
Move_Swing_Left_Func_Do_imm(); |
|
|
Move_Swing_Left_Func_Do_imm(); |
|
|
@ -422,7 +459,8 @@ static void swing_start_move(void) |
|
|
|
|
|
|
|
|
static void swing_left_move(void) |
|
|
static void swing_left_move(void) |
|
|
{ |
|
|
{ |
|
|
if(GV.SwingMotor.Real_Position>left_compare_value-10000) |
|
|
present_angle=-(GV.SwingMotor.Real_Position+944334)/11014; |
|
|
|
|
|
if(present_angle<=left_compare_value+1) |
|
|
{ |
|
|
{ |
|
|
Move_Swing_Right_Func_Do_lay(); |
|
|
Move_Swing_Right_Func_Do_lay(); |
|
|
swing_currentState=SWING_RIGHT_MOVE; |
|
|
swing_currentState=SWING_RIGHT_MOVE; |
|
|
@ -433,7 +471,8 @@ static void swing_left_move(void) |
|
|
|
|
|
|
|
|
static void swing_right_move(void) |
|
|
static void swing_right_move(void) |
|
|
{ |
|
|
{ |
|
|
if(GV.SwingMotor.Real_Position<right_compare_value+10000) |
|
|
present_angle=-(GV.SwingMotor.Real_Position+944334)/11014; |
|
|
|
|
|
if(present_angle>right_compare_value-1) |
|
|
{ |
|
|
{ |
|
|
Move_Swing_Left_Func_Do_lay(); |
|
|
Move_Swing_Left_Func_Do_lay(); |
|
|
swing_currentState=SWING_LEFT_MOVE; |
|
|
swing_currentState=SWING_LEFT_MOVE; |
|
|
@ -441,6 +480,37 @@ static void swing_right_move(void) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void get_swing_mode(void) |
|
|
|
|
|
{ |
|
|
|
|
|
if(GV.PV.Robot_symmetricalOrNot==1) |
|
|
|
|
|
{ |
|
|
|
|
|
if(GV.PV.Robot_Swing_Range_Angle!=offset_angle) |
|
|
|
|
|
{ |
|
|
|
|
|
offset_angle=GV.PV.Robot_Swing_Range_Angle; |
|
|
|
|
|
center_angle=-(GV.SwingMotor.Real_Position+944334)/TT_One_Deg_Count2; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
left_compare_value=center_angle-offset_angle/2; |
|
|
|
|
|
right_compare_value=center_angle+offset_angle/2; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
else if(GV.PV.Robot_symmetricalOrNot==2) //非对称式
|
|
|
|
|
|
{ |
|
|
|
|
|
if(P_MK32->CH12_S1!=S1_Last_Value) |
|
|
|
|
|
{ |
|
|
|
|
|
left_compare_value=-(GV.SwingMotor.Real_Position+944334)/11014; |
|
|
|
|
|
} |
|
|
|
|
|
else if(P_MK32->CH13_S2!=S2_Last_Value) |
|
|
|
|
|
{ |
|
|
|
|
|
right_compare_value=-(GV.SwingMotor.Real_Position+944334)/11014; |
|
|
|
|
|
} |
|
|
|
|
|
S1_Last_Value=P_MK32->CH12_S1; |
|
|
|
|
|
S2_Last_Value=P_MK32->CH13_S2; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------
|
|
|
/*-----------------------------------------------------------------
|
|
|
* PID驱动及停机处理 |
|
|
* PID驱动及停机处理 |
|
|
*-----------------------------------------------------------------*/ |
|
|
*-----------------------------------------------------------------*/ |
|
|
@ -473,20 +543,23 @@ static void handleHalt(void) |
|
|
GV.Right_Speed_M_min = 0; |
|
|
GV.Right_Speed_M_min = 0; |
|
|
GV.SwingMotor.Position_immediately1_Lag2=1; |
|
|
GV.SwingMotor.Position_immediately1_Lag2=1; |
|
|
GV.SwingMotor.Target_Velcity=0; |
|
|
GV.SwingMotor.Target_Velcity=0; |
|
|
|
|
|
horizontal_s_currentState = 0; |
|
|
|
|
|
vertical_s_currentState = 0; |
|
|
|
|
|
ChangeRoad_currentState = 0; |
|
|
s_currentState = 0; |
|
|
s_currentState = 0; |
|
|
} |
|
|
} |
|
|
/*=========================== 8.对外接口函数(需外部调用) ===========================*/ |
|
|
/*=========================== 8.对外接口函数(需外部调用) ===========================*/ |
|
|
|
|
|
|
|
|
void Move_Horizontal_Auto_Init(void) |
|
|
void Move_Horizontal_Auto_Init(void) |
|
|
{ |
|
|
{ |
|
|
s_currentState = STATE_ATTITUDE_JUDGE; |
|
|
horizontal_s_currentState = STATE_ATTITUDE_JUDGE; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void Move_Horizontal_Auto_Sub_Func(void) |
|
|
void Move_Horizontal_Auto_Sub_Func(void) |
|
|
{ |
|
|
{ |
|
|
if (s_currentState >= 0 && s_currentState < STATE_COUNT) { |
|
|
if (horizontal_s_currentState >= 0 && horizontal_s_currentState < STATE_COUNT) { |
|
|
if (horizontal_single_lane_auto_operation[s_currentState] != NULL) { |
|
|
if (horizontal_single_lane_auto_operation[horizontal_s_currentState] != NULL) { |
|
|
horizontal_single_lane_auto_operation[s_currentState](); |
|
|
horizontal_single_lane_auto_operation[horizontal_s_currentState](); |
|
|
} else { |
|
|
} else { |
|
|
/* 遇到未实现的状态,停机处理 */ |
|
|
/* 遇到未实现的状态,停机处理 */ |
|
|
handleHalt(); |
|
|
handleHalt(); |
|
|
@ -496,11 +569,11 @@ void Move_Horizontal_Auto_Sub_Func(void) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void Vertical_Left_Func(void) |
|
|
void Change_Road_Func(void) |
|
|
{ |
|
|
{ |
|
|
/* 注意:此函数实际使用换道状态表,但命名可能引起混淆,建议后续改为垂直换道相关名称 */ |
|
|
/* 注意:此函数实际使用换道状态表,但命名可能引起混淆,建议后续改为垂直换道相关名称 */ |
|
|
if (s_currentState >= 0 && s_currentState < LANE_CHANGE_STATE_COUNT) { |
|
|
if (ChangeRoad_currentState >= 0 && ChangeRoad_currentState < LANE_CHANGE_STATE_COUNT) { |
|
|
vertical_lane_change_left[s_currentState](); |
|
|
vertical_lane_change_left[ChangeRoad_currentState](); |
|
|
} else { |
|
|
} else { |
|
|
handleHalt(); |
|
|
handleHalt(); |
|
|
} |
|
|
} |
|
|
@ -510,16 +583,16 @@ void Vertical_Left_Func(void) |
|
|
|
|
|
|
|
|
void vertical_forward(void) |
|
|
void vertical_forward(void) |
|
|
{ |
|
|
{ |
|
|
if (s_currentState >= 0 && s_currentState < STATE_COUNT) { |
|
|
if (vertical_s_currentState >= 0 && vertical_s_currentState < STATE_COUNT) { |
|
|
robot_vertical_drive[s_currentState](); |
|
|
robot_vertical_drive[vertical_s_currentState](); |
|
|
} else { |
|
|
} else { |
|
|
handleHalt(); |
|
|
handleHalt(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
void horizontal_forward(void) |
|
|
void horizontal_forward(void) |
|
|
{ |
|
|
{ |
|
|
if (s_currentState >= 0 && s_currentState < STATE_COUNT) { |
|
|
if (horizontal_s_currentState >= 0 && horizontal_s_currentState < STATE_COUNT) { |
|
|
robot_horizontal_drive[s_currentState](); |
|
|
robot_horizontal_drive[horizontal_s_currentState](); |
|
|
} else { |
|
|
} else { |
|
|
handleHalt(); |
|
|
handleHalt(); |
|
|
} |
|
|
} |
|
|
@ -527,8 +600,8 @@ void horizontal_forward(void) |
|
|
|
|
|
|
|
|
void horizontal_work(void) |
|
|
void horizontal_work(void) |
|
|
{ |
|
|
{ |
|
|
if (s_currentState >= 0 && s_currentState < STATE_COUNT) { |
|
|
if (horizontal_s_currentState >= 0 && horizontal_s_currentState < STATE_COUNT) { |
|
|
horizontal_single_lane_auto_operation[s_currentState](); |
|
|
horizontal_single_lane_auto_operation[horizontal_s_currentState](); |
|
|
} else { |
|
|
} else { |
|
|
handleHalt(); |
|
|
handleHalt(); |
|
|
} |
|
|
} |
|
|
@ -552,6 +625,9 @@ void flag_reset(void) |
|
|
&&P_MK32->CH3_LY_H==0) |
|
|
&&P_MK32->CH3_LY_H==0) |
|
|
{ |
|
|
{ |
|
|
s_currentState = 0; |
|
|
s_currentState = 0; |
|
|
|
|
|
horizontal_s_currentState = 0; |
|
|
|
|
|
vertical_s_currentState = 0; |
|
|
|
|
|
ChangeRoad_currentState = 0; |
|
|
swing_currentState = 0; |
|
|
swing_currentState = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|