|
|
|
@ -23,6 +23,7 @@ |
|
|
|
#include "Protobuf/PSource/msp_MK32.pb.h" |
|
|
|
#include "Protobuf/PSource/bsp_CV.pb.h" |
|
|
|
#include "Protobuf/PSource/bsp_IV.pb.h" |
|
|
|
#include "msp_MK32.h" |
|
|
|
|
|
|
|
/*----------------------------------------------*
|
|
|
|
* 外部变量说明 * |
|
|
|
@ -64,15 +65,31 @@ static int g_iS2LastValue = 0; |
|
|
|
* 宏定义 * |
|
|
|
*----------------------------------------------*/ |
|
|
|
|
|
|
|
#define IV_SEND_TIME 50 // IV上报周期(单位毫秒)
|
|
|
|
static struct { |
|
|
|
int m_iPaintState; // 喷枪状态:0=打开,1=关闭
|
|
|
|
int m_iAnglelock; // 1=角度异常,触发 Move_Halt_AngleError 并屏蔽互斥代码
|
|
|
|
int m_ipaintOffCount; // Move_Halt_AngleError 中的计时,当前为 1 秒
|
|
|
|
} g_stAngleError_Ctl = { |
|
|
|
.m_iPaintState = -1 |
|
|
|
}; |
|
|
|
|
|
|
|
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); |
|
|
|
} |
|
|
|
|
|
|
|
/*----------------------------------------------*
|
|
|
|
* 二维数组映射表!!! * |
|
|
|
*----------------------------------------------*/ |
|
|
|
static void E_Robot_Stop(void) |
|
|
|
{ |
|
|
|
MsgCenter_SendTo(MODULE_NAME_MOTOR, MOTOR_POWER_DISABLE, NULL, 0); |
|
|
|
MsgCenter_SendTo(MODULE_NAME_RBCORE, RBCORE_CMD_STOP_ALL, NULL, 0); |
|
|
|
g_Is_All_Button_Reset = 0; |
|
|
|
} |
|
|
|
|
|
|
|
// 竖直从左往右作业 上端 向右换道 最终头朝上
|
|
|
|
static void Vertical_Lane_Change_From_Left_To_Right_UP_Control() |
|
|
|
static void Vertical_Lane_Change_From_Left_To_Right_UP_Control(void) |
|
|
|
{ |
|
|
|
int iTargetAngle = 0; |
|
|
|
if (0 == g_ichangLineState) |
|
|
|
@ -98,7 +115,7 @@ static void Vertical_Lane_Change_From_Left_To_Right_UP_Control() |
|
|
|
} |
|
|
|
|
|
|
|
// 竖直从左往右作业 下端 向右换道 最终头朝上
|
|
|
|
static void Vertical_Lane_Change_From_Left_To_Right_Down_Control() |
|
|
|
static void Vertical_Lane_Change_From_Left_To_Right_Down_Control(void) |
|
|
|
{ |
|
|
|
int iTargetAngle = 0; |
|
|
|
if (0 == g_ichangLineState) |
|
|
|
@ -124,7 +141,7 @@ static void Vertical_Lane_Change_From_Left_To_Right_Down_Control() |
|
|
|
} |
|
|
|
|
|
|
|
// 竖直从右往左作业 上端 向左换道 最终头朝上
|
|
|
|
static void Vertical_Lane_Change_From_Right_To_Left_UP_Control() |
|
|
|
static void Vertical_Lane_Change_From_Right_To_Left_UP_Control(void) |
|
|
|
{ |
|
|
|
int iTargetAngle = 0; |
|
|
|
if (0 == g_ichangLineState) |
|
|
|
@ -150,7 +167,7 @@ static void Vertical_Lane_Change_From_Right_To_Left_UP_Control() |
|
|
|
} |
|
|
|
|
|
|
|
// 竖直从右往左作业 下端 向左换道 最终头朝上
|
|
|
|
static void Vertical_Lane_Change_From_Right_To_Left_Down_Control() |
|
|
|
static void Vertical_Lane_Change_From_Right_To_Left_Down_Control(void) |
|
|
|
{ |
|
|
|
int iTargetAngle = 0; |
|
|
|
if (0 == g_ichangLineState) |
|
|
|
@ -175,13 +192,268 @@ static void Vertical_Lane_Change_From_Right_To_Left_Down_Control() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static struct { |
|
|
|
int m_iPaintState; // 喷枪状态:0=打开,1=关闭
|
|
|
|
int m_iAnglelock; // 1=角度异常,触发 Move_Halt_AngleError 并屏蔽互斥代码
|
|
|
|
int m_ipaintOffCount; // Move_Halt_AngleError 中的计时,当前为 1 秒
|
|
|
|
} g_stAngleError_Ctl = { |
|
|
|
.m_iPaintState = -1 |
|
|
|
static void Lane_Change_State_Reset(void) |
|
|
|
{ |
|
|
|
g_ichangLineState = 0; |
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_RESET_STRAIGHT, NULL, 0); |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Move_Forward(void) |
|
|
|
{ |
|
|
|
if (g_iVehicleSpeed >= 0) |
|
|
|
{ |
|
|
|
int aiMotorSpeed[2] = {0}; //0索引表示左,1索引表示右,多轮时到对应motor的MOTOR_CMD_SET_SPEED命令自行处理
|
|
|
|
aiMotorSpeed[0] = g_iVehicleSpeed * 10; |
|
|
|
aiMotorSpeed[1] = g_iVehicleSpeed * 10; |
|
|
|
MsgCenter_SendTo(MODULE_NAME_MOTOR, MOTOR_SET_SPEED, aiMotorSpeed, sizeof(aiMotorSpeed)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Paint_SP(void) |
|
|
|
{ |
|
|
|
if (g_stMK32.CH13_S2 != g_iS2LastValue) |
|
|
|
{ |
|
|
|
if (0 == g_stAngleError_Ctl.m_iAnglelock) |
|
|
|
{ |
|
|
|
if(g_stIV.CurrentSpeed != 0) |
|
|
|
{ |
|
|
|
g_stAngleError_Ctl.m_iPaintState = 0; |
|
|
|
MsgCenter_SendTo(MODULE_NAME_CUSTOM, CUSTOM_CMD_PAINTGUN, &g_stAngleError_Ctl.m_iPaintState, sizeof(int)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
g_iS2LastValue = g_stMK32.CH13_S2; |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Move_Forward_PID(void) |
|
|
|
{ |
|
|
|
Robot_Paint_SP(); |
|
|
|
if (0 == g_stAngleError_Ctl.m_iAnglelock) |
|
|
|
{ |
|
|
|
BHBF_straight_drive_Cmd stCmd = { |
|
|
|
.m_iMode = 1, |
|
|
|
.m_iAngle = g_stCV.RobotUpAngleValue + g_stPV.Vertical_Calibration, |
|
|
|
.m_iTime = -1, |
|
|
|
.m_iSpeed = g_iVehicleSpeed |
|
|
|
}; |
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_STRAIGHT_DRIVE, &stCmd, sizeof(stCmd)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Move_Backward(void) |
|
|
|
{ |
|
|
|
if (g_iVehicleSpeed >= 0) |
|
|
|
{ |
|
|
|
int aiMotorSpeed[2] = {0}; //0索引表示左,1索引表示右,多轮时到对应motor的MOTOR_CMD_SET_SPEED命令自行处理
|
|
|
|
aiMotorSpeed[0] = -g_iVehicleSpeed * 10; |
|
|
|
aiMotorSpeed[1] = -g_iVehicleSpeed * 10; |
|
|
|
MsgCenter_SendTo(MODULE_NAME_MOTOR, MOTOR_SET_SPEED, aiMotorSpeed, sizeof(aiMotorSpeed)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Move_Backward_PID(void) |
|
|
|
{ |
|
|
|
Robot_Paint_SP(); |
|
|
|
if (0 == g_stAngleError_Ctl.m_iAnglelock) |
|
|
|
{ |
|
|
|
BHBF_straight_drive_Cmd stCmd = { |
|
|
|
.m_iMode = -1, |
|
|
|
.m_iAngle = g_stCV.RobotUpAngleValue + g_stPV.Vertical_Calibration, |
|
|
|
.m_iTime = -1, |
|
|
|
.m_iSpeed = g_iVehicleSpeed |
|
|
|
}; |
|
|
|
MsgCenter_SendTo(MODULE_NAME_TIMER, TIMER_CMD_STRAIGHT_DRIVE, &stCmd, sizeof(stCmd)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Paint_ON(void) |
|
|
|
{ |
|
|
|
if (0 == g_stAngleError_Ctl.m_iAnglelock) |
|
|
|
{ |
|
|
|
if (0 == g_bIsStopOffPaint) |
|
|
|
{ |
|
|
|
g_stAngleError_Ctl.m_iPaintState = 0; |
|
|
|
MsgCenter_SendTo(MODULE_NAME_CUSTOM, CUSTOM_CMD_PAINTGUN, &g_stAngleError_Ctl.m_iPaintState, sizeof(int)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Paint_OFF(void) |
|
|
|
{ |
|
|
|
if (0 == g_stAngleError_Ctl.m_iAnglelock) |
|
|
|
{ |
|
|
|
g_bIsStopOffPaint = 0; |
|
|
|
g_stAngleError_Ctl.m_iPaintState = 1; |
|
|
|
MsgCenter_SendTo(MODULE_NAME_CUSTOM, CUSTOM_CMD_PAINTGUN, &g_stAngleError_Ctl.m_iPaintState, sizeof(int)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Stop_After(void) |
|
|
|
{ |
|
|
|
if (0 == g_iPaint) |
|
|
|
{ |
|
|
|
MsgCenter_SendTo(MODULE_NAME_MOTOR, MOTOR_CMD_STOP_AFTER, NULL, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Stop(void) |
|
|
|
{ |
|
|
|
MsgCenter_SendTo(MODULE_NAME_MOTOR, CMD_STOP_ALL, NULL, 0); |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Move_Left(void) |
|
|
|
{ |
|
|
|
if (g_stCV.LeftTurnSpeed > 0 && g_stCV.RightTurnSpeed > 0) |
|
|
|
{ |
|
|
|
int aiMotorSpeed[2] = {0}; //0索引表示左,1索引表示右,多轮时到对应motor的MOTOR_CMD_SET_SPEED命令自行处理
|
|
|
|
aiMotorSpeed[0] = -g_stCV.LeftTurnSpeed; |
|
|
|
aiMotorSpeed[1] = g_stCV.RightTurnSpeed; |
|
|
|
MsgCenter_SendTo(MODULE_NAME_MOTOR, MOTOR_SET_SPEED, aiMotorSpeed, sizeof(aiMotorSpeed)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void Robot_Move_Right(void) |
|
|
|
{ |
|
|
|
if (g_stCV.LeftTurnSpeed > 0 && g_stCV.RightTurnSpeed > 0) |
|
|
|
{ |
|
|
|
int aiMotorSpeed[2] = {0}; //0索引表示左,1索引表示右,多轮时到对应motor的MOTOR_CMD_SET_SPEED命令自行处理
|
|
|
|
aiMotorSpeed[0] = g_stCV.LeftTurnSpeed; |
|
|
|
aiMotorSpeed[1] = -g_stCV.RightTurnSpeed; |
|
|
|
MsgCenter_SendTo(MODULE_NAME_MOTOR, MOTOR_SET_SPEED, aiMotorSpeed, sizeof(aiMotorSpeed)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
const ActionFunc g_ActionTable[KEY_MAX][MODE_MAX][SUB_MODE_MAX] = { |
|
|
|
[E_STOP] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = E_Robot_Stop, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = E_Robot_Stop, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = E_Robot_Stop, |
|
|
|
}, |
|
|
|
}, |
|
|
|
[KEY_SA_UP] = { |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = Vertical_Lane_Change_From_Right_To_Left_UP_Control, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = Vertical_Lane_Change_From_Left_To_Right_UP_Control, |
|
|
|
}, |
|
|
|
}, |
|
|
|
[KEY_SA_DOWN] = { |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = Vertical_Lane_Change_From_Right_To_Left_Down_Control, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = Vertical_Lane_Change_From_Left_To_Right_Down_Control, |
|
|
|
}, |
|
|
|
}, |
|
|
|
[KEY_SA_DEFAULT] = { |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = Lane_Change_State_Reset, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = Lane_Change_State_Reset, |
|
|
|
}, |
|
|
|
}, |
|
|
|
[KEY_SB_UP] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Forward, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Forward_PID, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Forward_PID, |
|
|
|
} |
|
|
|
}, |
|
|
|
[KEY_SB_DOWN] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Backward, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Backward_PID, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Backward_PID, |
|
|
|
} |
|
|
|
}, |
|
|
|
[KEY_SC_DOWN] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Paint_OFF, |
|
|
|
} |
|
|
|
}, |
|
|
|
[KEY_SC_DEFAULT] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Paint_OFF, |
|
|
|
} |
|
|
|
}, |
|
|
|
[KEY_SC_UP] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Paint_ON, |
|
|
|
} |
|
|
|
}, |
|
|
|
[JOY_DEFAULT] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Stop, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Stop_After, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Stop_After, |
|
|
|
}, |
|
|
|
}, |
|
|
|
[JOY_LEFT_UP] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Forward, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Forward_PID, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Forward_PID, |
|
|
|
}, |
|
|
|
}, |
|
|
|
[JOY_LEFT_DWON] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Backward, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Backward_PID, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Backward_PID, |
|
|
|
}, |
|
|
|
}, |
|
|
|
[JOY_LEFT_LEFT] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Left, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Left, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Left, |
|
|
|
}, |
|
|
|
}, |
|
|
|
[JOY_LEFT_RIGHT] = { |
|
|
|
[MODE_DEFAULT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Right, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_LEFT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Right, |
|
|
|
}, |
|
|
|
[MODE_VERTICAL_RIGHT] = { |
|
|
|
[SUB_MODE_NULL] = Robot_Move_Right, |
|
|
|
}, |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
#define IV_SEND_TIME 50 // IV上报周期(单位毫秒)
|
|
|
|
|
|
|
|
static void Move_Halt_AngleError(void) |
|
|
|
{ |
|
|
|
@ -219,7 +491,7 @@ static void Move_Halt_AngleError(void) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void MK32_Key_Func(SP_MSP_MK32_Button *_pstMK32, int _iMode) |
|
|
|
void MK32_Key_Func(SP_MSP_MK32_Button *_pstMK32, int _iMode, int _iSubMode) |
|
|
|
{ |
|
|
|
// 急停
|
|
|
|
if (_pstMK32->CH8_SE == -1000 && _pstMK32->CH9_SF == -1000) |
|
|
|
@ -235,11 +507,11 @@ void MK32_Key_Func(SP_MSP_MK32_Button *_pstMK32, int _iMode) |
|
|
|
{ |
|
|
|
if (_iMode == 2)//竖直从右往左作业 下端 向左换道 最终头朝上
|
|
|
|
{ |
|
|
|
Vertical_Lane_Change_From_Right_To_Left_Down_Control(g_iLeft_Compensation); |
|
|
|
Vertical_Lane_Change_From_Right_To_Left_Down_Control(); |
|
|
|
} |
|
|
|
else if (_iMode == 3)//竖直从左往右作业 下端 向右换道 最终头朝上
|
|
|
|
{ |
|
|
|
Vertical_Lane_Change_From_Left_To_Right_Down_Control(g_iRight_Compensation); |
|
|
|
Vertical_Lane_Change_From_Left_To_Right_Down_Control(); |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
@ -247,11 +519,11 @@ void MK32_Key_Func(SP_MSP_MK32_Button *_pstMK32, int _iMode) |
|
|
|
{ |
|
|
|
if (_iMode == 2)//竖直从右往左作业 上端 向左换道 最终头朝上
|
|
|
|
{ |
|
|
|
Vertical_Lane_Change_From_Right_To_Left_UP_Control(g_iLeft_Compensation); |
|
|
|
Vertical_Lane_Change_From_Right_To_Left_UP_Control(); |
|
|
|
} |
|
|
|
else if (_iMode == 3)//竖直从左往右作业 上端 向右换道 最终头朝上
|
|
|
|
{ |
|
|
|
Vertical_Lane_Change_From_Left_To_Right_UP_Control(g_iRight_Compensation); |
|
|
|
Vertical_Lane_Change_From_Left_To_Right_UP_Control(); |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
@ -628,7 +900,7 @@ static void Custom_ModuleHandler(const Msg_t *pstMsg) |
|
|
|
|
|
|
|
Move_Halt_AngleError(); |
|
|
|
|
|
|
|
MK32_Key_Func(&g_stMK32, g_stPV.RunMode); |
|
|
|
MK32_Key_Func(&g_stMK32, g_stPV.RunMode, SUB_MODE_NULL); |
|
|
|
break; |
|
|
|
} |
|
|
|
case CMD_SHOW_INFO: |
|
|
|
|