|
|
@ -48,6 +48,7 @@ static SP_MSP_MK32_Button g_stMK32; |
|
|
static PV_struct_define g_stPV; |
|
|
static PV_struct_define g_stPV; |
|
|
static IV_struct_define g_stIV; |
|
|
static IV_struct_define g_stIV; |
|
|
static int g_Is_All_Button_Reset = 0; // 1表示按钮正常工作,0表示需要复位
|
|
|
static int g_Is_All_Button_Reset = 0; // 1表示按钮正常工作,0表示需要复位
|
|
|
|
|
|
static int g_ichangLineState = 0; // 换道状态,0表示起始状态,1表示第一次旋转完成,2表示计时行走 完成
|
|
|
|
|
|
|
|
|
/*----------------------------------------------*
|
|
|
/*----------------------------------------------*
|
|
|
* 常量定义 * |
|
|
* 常量定义 * |
|
|
@ -64,6 +65,110 @@ static int32_t RunTime_DistanceCm_SpeedE_2MPMin(void) |
|
|
return (600 * (g_stPV.LaneChangeDistance + g_stCV.Vertical_ChangeLane_Compensation) / g_stCV.Lane_Change_Speed_m_per_min); |
|
|
return (600 * (g_stPV.LaneChangeDistance + g_stCV.Vertical_ChangeLane_Compensation) / g_stCV.Lane_Change_Speed_m_per_min); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 竖直从左往右作业 上端 向右换道 最终头朝上
|
|
|
|
|
|
static void Vertical_Lane_Change_From_Left_To_Right_UP_Control(int _iRight_Compensation) |
|
|
|
|
|
{ |
|
|
|
|
|
int iTargetAngle = 0; |
|
|
|
|
|
if (0 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
iTargetAngle = g_stCV.RobotLeftAngleValue; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
|
|
|
else if (1 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
BHBF_straight_drive_Cmd stCmd = { |
|
|
|
|
|
.m_iMode = -1, |
|
|
|
|
|
.m_iAngle = g_stCV.RobotLeftAngleValue - _iRight_Compensation, |
|
|
|
|
|
.m_iTime = RunTime_DistanceCm_SpeedE_2MPMin(), |
|
|
|
|
|
.m_iSpeed = g_stCV.Lane_Change_Speed_m_per_min |
|
|
|
|
|
}; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_STRAIGHT_DRIVE, &stCmd, sizeof(stCmd)); |
|
|
|
|
|
} |
|
|
|
|
|
else if (2 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
iTargetAngle = g_stCV.RobotUpAngleValue; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 竖直从左往右作业 下端 向右换道 最终头朝上
|
|
|
|
|
|
static void Vertical_Lane_Change_From_Left_To_Right_Down_Control(int _iRight_Compensation) |
|
|
|
|
|
{ |
|
|
|
|
|
int iTargetAngle = 0; |
|
|
|
|
|
if (0 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
iTargetAngle = g_stCV.RobotRightAngleValue; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
|
|
|
else if (1 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
BHBF_straight_drive_Cmd stCmd = { |
|
|
|
|
|
.m_iMode = 1, |
|
|
|
|
|
.m_iAngle = g_stCV.RobotRightAngleValue - _iRight_Compensation, |
|
|
|
|
|
.m_iTime = RunTime_DistanceCm_SpeedE_2MPMin(), |
|
|
|
|
|
.m_iSpeed = g_stCV.Lane_Change_Speed_m_per_min |
|
|
|
|
|
}; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_STRAIGHT_DRIVE, &stCmd, sizeof(stCmd)); |
|
|
|
|
|
} |
|
|
|
|
|
else if (2 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
iTargetAngle = g_stCV.RobotUpAngleValue; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 竖直从右往左作业 上端 向左换道 最终头朝上
|
|
|
|
|
|
static void Vertical_Lane_Change_From_Right_To_Left_UP_Control(int _iLeft_Compensation) |
|
|
|
|
|
{ |
|
|
|
|
|
int iTargetAngle = 0; |
|
|
|
|
|
if (0 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
iTargetAngle = g_stCV.RobotRightAngleValue; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
|
|
|
else if (1 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
BHBF_straight_drive_Cmd stCmd = { |
|
|
|
|
|
.m_iMode = -1, |
|
|
|
|
|
.m_iAngle = g_stCV.RobotRightAngleValue + _iLeft_Compensation, |
|
|
|
|
|
.m_iTime = RunTime_DistanceCm_SpeedE_2MPMin(), |
|
|
|
|
|
.m_iSpeed = g_stCV.Lane_Change_Speed_m_per_min |
|
|
|
|
|
}; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_STRAIGHT_DRIVE, &stCmd, sizeof(stCmd)); |
|
|
|
|
|
} |
|
|
|
|
|
else if (2 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
iTargetAngle = g_stCV.RobotUpAngleValue; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 竖直从右往左作业 下端 向左换道 最终头朝上
|
|
|
|
|
|
static void Vertical_Lane_Change_From_Right_To_Left_Down_Control(int _iLeft_Compensation) |
|
|
|
|
|
{ |
|
|
|
|
|
int iTargetAngle = 0; |
|
|
|
|
|
if (0 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
iTargetAngle = g_stCV.RobotLeftAngleValue; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
|
|
|
else if (1 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
BHBF_straight_drive_Cmd stCmd = { |
|
|
|
|
|
.m_iMode = 1, |
|
|
|
|
|
.m_iAngle = g_stCV.RobotLeftAngleValue + _iLeft_Compensation, |
|
|
|
|
|
.m_iTime = RunTime_DistanceCm_SpeedE_2MPMin(), |
|
|
|
|
|
.m_iSpeed = g_stCV.Lane_Change_Speed_m_per_min |
|
|
|
|
|
}; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_STRAIGHT_DRIVE, &stCmd, sizeof(stCmd)); |
|
|
|
|
|
} |
|
|
|
|
|
else if (2 == g_ichangLineState) |
|
|
|
|
|
{ |
|
|
|
|
|
iTargetAngle = g_stCV.RobotUpAngleValue; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
static struct { |
|
|
static struct { |
|
|
int m_iPaintState; // 喷枪状态:0=打开,1=关闭
|
|
|
int m_iPaintState; // 喷枪状态:0=打开,1=关闭
|
|
|
int m_iAnglelock; // 1=角度异常,触发 Move_Halt_AngleError 并屏蔽互斥代码
|
|
|
int m_iAnglelock; // 1=角度异常,触发 Move_Halt_AngleError 并屏蔽互斥代码
|
|
|
@ -188,70 +293,12 @@ static void Custom_ModuleHandler(const Msg_t *pstMsg) |
|
|
} |
|
|
} |
|
|
case CUSTOM_CMD_STRAIGHT_DRIVE: |
|
|
case CUSTOM_CMD_STRAIGHT_DRIVE: |
|
|
{ |
|
|
{ |
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_UP, NULL, 0); |
|
|
g_ichangLineState = 2; // 走到这说明换道直线走完了
|
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case CUSTOM_CMD_TURN_ANGLE: |
|
|
case CUSTOM_CMD_TURN_ANGLE: |
|
|
{ |
|
|
{ |
|
|
int iTargetAngle = 0; |
|
|
g_ichangLineState = 1; // 走到这说明换道第一次转完了
|
|
|
if (pstMsg->m_uiDataLen >= sizeof(int)) |
|
|
|
|
|
{ |
|
|
|
|
|
RD_MEMCPY(&iTargetAngle, pstMsg->m_aucData, sizeof(int)); |
|
|
|
|
|
if (iTargetAngle == g_stCV.RobotUpAngleValue) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
else if (iTargetAngle == g_stCV.RobotLeftAngleValue) |
|
|
|
|
|
{ |
|
|
|
|
|
if (g_stPV.RunMode == 2)//竖直从右往左作业 下端 向左换道 最终头朝上
|
|
|
|
|
|
{ |
|
|
|
|
|
BHBF_straight_drive_Cmd stCmd = { |
|
|
|
|
|
.m_iMode = 1, |
|
|
|
|
|
.m_iAngle = g_stCV.RobotLeftAngleValue + iLeft_Compensation, |
|
|
|
|
|
.m_iTime = RunTime_DistanceCm_SpeedE_2MPMin(), |
|
|
|
|
|
.m_iSpeed = g_stCV.Lane_Change_Speed_m_per_min |
|
|
|
|
|
}; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_STRAIGHT_DRIVE, &stCmd, sizeof(stCmd)); |
|
|
|
|
|
} |
|
|
|
|
|
else if (g_stPV.RunMode == 3)//竖直从左往右作业 上端 向右换道 最终头朝上
|
|
|
|
|
|
{ |
|
|
|
|
|
BHBF_straight_drive_Cmd stCmd = { |
|
|
|
|
|
.m_iMode = -1, |
|
|
|
|
|
.m_iAngle = g_stCV.RobotLeftAngleValue - iRight_Compensation, |
|
|
|
|
|
.m_iTime = RunTime_DistanceCm_SpeedE_2MPMin(), |
|
|
|
|
|
.m_iSpeed = g_stCV.Lane_Change_Speed_m_per_min |
|
|
|
|
|
}; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_STRAIGHT_DRIVE, &stCmd, sizeof(stCmd)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else if (iTargetAngle == g_stCV.RobotRightAngleValue) |
|
|
|
|
|
{ |
|
|
|
|
|
if (g_stPV.RunMode == 2)//竖直从右往左作业 上端 向左换道 最终头朝上
|
|
|
|
|
|
{ |
|
|
|
|
|
BHBF_straight_drive_Cmd stCmd = { |
|
|
|
|
|
.m_iMode = -1, |
|
|
|
|
|
.m_iAngle = g_stCV.RobotRightAngleValue + iLeft_Compensation, |
|
|
|
|
|
.m_iTime = RunTime_DistanceCm_SpeedE_2MPMin(), |
|
|
|
|
|
.m_iSpeed = g_stCV.Lane_Change_Speed_m_per_min |
|
|
|
|
|
}; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_STRAIGHT_DRIVE, &stCmd, sizeof(stCmd)); |
|
|
|
|
|
} |
|
|
|
|
|
else if (g_stPV.RunMode == 3)//竖直从左往右作业 下端 向右换道 最终头朝上
|
|
|
|
|
|
{ |
|
|
|
|
|
BHBF_straight_drive_Cmd stCmd = { |
|
|
|
|
|
.m_iMode = 1, |
|
|
|
|
|
.m_iAngle = g_stCV.RobotRightAngleValue - iRight_Compensation, |
|
|
|
|
|
.m_iTime = RunTime_DistanceCm_SpeedE_2MPMin(), |
|
|
|
|
|
.m_iSpeed = g_stCV.Lane_Change_Speed_m_per_min |
|
|
|
|
|
}; |
|
|
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_STRAIGHT_DRIVE, &stCmd, sizeof(stCmd)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else if (iTargetAngle == g_stCV.RobotDownAngleValue) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
case COMMON_CMD_STOP_ALL: |
|
|
case COMMON_CMD_STOP_ALL: |
|
|
@ -340,19 +387,16 @@ static void Custom_ModuleHandler(const Msg_t *pstMsg) |
|
|
|
|
|
|
|
|
Move_Halt_AngleError(); |
|
|
Move_Halt_AngleError(); |
|
|
|
|
|
|
|
|
int iTargetAngle = 0; |
|
|
|
|
|
// 根据模式判断换道(仅在竖直向左或向右生效)
|
|
|
// 根据模式判断换道(仅在竖直向左或向右生效)
|
|
|
if (g_stMK32.CH4_SA == 1000) |
|
|
if (g_stMK32.CH4_SA == 1000) |
|
|
{ |
|
|
{ |
|
|
if (g_stPV.RunMode == 2)//竖直从右往左作业 下端 向左换道 最终头朝上
|
|
|
if (g_stPV.RunMode == 2)//竖直从右往左作业 下端 向左换道 最终头朝上
|
|
|
{ |
|
|
{ |
|
|
iTargetAngle = g_stCV.RobotLeftAngleValue; |
|
|
Vertical_Lane_Change_From_Right_To_Left_Down_Control(iLeft_Compensation); |
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
} |
|
|
else if (g_stPV.RunMode == 3)//竖直从左往右作业 下端 向右换道 最终头朝上
|
|
|
else if (g_stPV.RunMode == 3)//竖直从左往右作业 下端 向右换道 最终头朝上
|
|
|
{ |
|
|
{ |
|
|
iTargetAngle = g_stCV.RobotRightAngleValue; |
|
|
Vertical_Lane_Change_From_Left_To_Right_Down_Control(iRight_Compensation); |
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
@ -360,13 +404,11 @@ static void Custom_ModuleHandler(const Msg_t *pstMsg) |
|
|
{ |
|
|
{ |
|
|
if (g_stPV.RunMode == 2)//竖直从右往左作业 上端 向左换道 最终头朝上
|
|
|
if (g_stPV.RunMode == 2)//竖直从右往左作业 上端 向左换道 最终头朝上
|
|
|
{ |
|
|
{ |
|
|
iTargetAngle = g_stCV.RobotRightAngleValue; |
|
|
Vertical_Lane_Change_From_Right_To_Left_UP_Control(iLeft_Compensation); |
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
} |
|
|
else if (g_stPV.RunMode == 3)//竖直从左往右作业 上端 向右换道 最终头朝上
|
|
|
else if (g_stPV.RunMode == 3)//竖直从左往右作业 上端 向右换道 最终头朝上
|
|
|
{ |
|
|
{ |
|
|
iTargetAngle = g_stCV.RobotLeftAngleValue; |
|
|
Vertical_Lane_Change_From_Left_To_Right_UP_Control(iRight_Compensation); |
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_TURN_ANGLE, &iTargetAngle, sizeof(iTargetAngle)); |
|
|
|
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
@ -374,6 +416,7 @@ static void Custom_ModuleHandler(const Msg_t *pstMsg) |
|
|
{ |
|
|
{ |
|
|
if (g_stPV.RunMode == 2 || g_stPV.RunMode == 3) |
|
|
if (g_stPV.RunMode == 2 || g_stPV.RunMode == 3) |
|
|
{ |
|
|
{ |
|
|
|
|
|
g_ichangLineState = 0; |
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_RESET_STRAIGHT, NULL, 0); |
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_RESET_STRAIGHT, NULL, 0); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|