You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
527 lines
12 KiB
527 lines
12 KiB
|
3 weeks ago
|
/*
|
||
|
|
* fsm.c
|
||
|
|
*
|
||
|
|
* Created on: Oct 18, 2024
|
||
|
|
* Author: akeguo
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include "fsm.h"
|
||
|
|
#include "msp_DAM0404D.h"
|
||
|
|
#include "BHBF_ROBOT.h"
|
||
|
|
#include "BSP/bsp_include.h"
|
||
|
|
#include "msp_DH_Roughening.h"
|
||
|
|
#include "MSP/msp_PID.h"
|
||
|
|
#include "robot_state.h"
|
||
|
|
void Vertical_Left_Right_Lane_Change_Control(int *LaneChangeCmd, int left_or_right);
|
||
|
|
void Horizontal_Up_Down_Lane_Change_Control(int *LaneChangeCmd, int up_or_down,
|
||
|
|
int head_to_left_or_right);
|
||
|
|
|
||
|
|
int32_t *RobotSpeed;
|
||
|
|
|
||
|
|
int32_t *RobotLaneChangeDistance;
|
||
|
|
|
||
|
|
int LaneChangeCommand;
|
||
|
|
int LastLaneChangeCommand;
|
||
|
|
int LaneChangeCommandState;
|
||
|
|
int var0;
|
||
|
|
int var1;
|
||
|
|
|
||
|
|
MoveSTATE_t CurrentMoveState;
|
||
|
|
SwingSTATE_t CurrentSwingState;
|
||
|
|
TiltSTATE_t CurrentTiltState; //点头,抬头
|
||
|
|
|
||
|
|
LaneChangeSTATE_t CurrentLaneChangeSTATE;
|
||
|
|
|
||
|
|
RougheningEndState_t CurrentRougheningEndState; //拉毛运动或者不动
|
||
|
|
SetSTATE_t CurrentSetState; //设置
|
||
|
|
int index_counter = 0;
|
||
|
|
|
||
|
|
void LaneChangeControl();
|
||
|
|
void DHRougheningControl();
|
||
|
|
void TiltControl();
|
||
|
|
|
||
|
|
//手动下 机器人运动
|
||
|
|
transition_t MoveTransitions[] =
|
||
|
|
{
|
||
|
|
|
||
|
|
{ Move_Forwards, Forwards_State_Do },
|
||
|
|
{ Move_Backwards, Backwards_State_Do },
|
||
|
|
{ Move_TurnLeft, TurnLeft_State_Do },
|
||
|
|
{ Move_TurnRight, TurnRight_State_Do },
|
||
|
|
{ Move_HALT, HALT_State_Do },
|
||
|
|
{ Move_Vertical_Task_Forwards, Move_Vertical_Task_Forwards_Do },
|
||
|
|
{ Move_Vertical_Task_Backwards, Move_Vertical_Task_Backwards_Do },
|
||
|
|
{ Move_Horizontal_Task_Forwards, Move_Horizontal_Task_Forwards_Do },
|
||
|
|
{ Move_Horizontal_Task_Backwards, Move_Horizontal_Task_Backwards_Do },
|
||
|
|
|
||
|
|
{ Move_Head_To_Left_Enum, Move_Head_To_Left_Do },
|
||
|
|
{ Move_Head_To_UP_Enum, Move_Head_To_UP_Do },
|
||
|
|
{ Move_Head_To_Right_Enum, Move_Head_To_Right_Do },
|
||
|
|
{ Move_Head_To_Down_Enum, Move_Head_To_Down_Do },
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
transition_with_state_t LaneChangeTransitions[] =
|
||
|
|
{
|
||
|
|
|
||
|
|
{ Lane_HALT, Lane_HALT_Do },
|
||
|
|
{ Lane_Turn_To_Straight_Up, Lane_Turn_To_Straight_Up_Do },
|
||
|
|
{ Lane_Turn_To_Straight_Down, Lane_Turn_To_Straight_Down_Do },
|
||
|
|
{ Lane_Turn_To_Horizontal_Left, Lane_Turn_To_Horizontal_Left_Do },
|
||
|
|
{ Lane_Turn_To_Horizontal_Right, Lane_Turn_To_Horizontal_Right_Do },
|
||
|
|
|
||
|
|
{ Lane_Vertical_Task_Move_Forwards,
|
||
|
|
Lane_Vertical_Task_Move_Forwards_Do },
|
||
|
|
{ Lane_Vertical_Task_Move_Backwards,
|
||
|
|
Lane_Vertical_Task_Move_Backwards_Do },
|
||
|
|
{ Lane_Horizontal_Task_Move_Forwards,
|
||
|
|
Lane_Horizontal_Task_Move_Forwards_Do },
|
||
|
|
{ Lane_Horizontal_Task_Move_Backwards,
|
||
|
|
Lane_Horizontal_Task_Move_Backwards_Do }, };
|
||
|
|
|
||
|
|
transition_t SetTransitions[] =
|
||
|
|
{
|
||
|
|
|
||
|
|
{ OtherMode, OtherMode_State_Do },
|
||
|
|
{ SetLaneChangeDistance, LaneChangeDistance_Setting_State_Do },
|
||
|
|
{ SetBackwardsDistance, BackWardsDistance_Setting_State_Do },
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
transition_t TiltTransitions[] =
|
||
|
|
{
|
||
|
|
{ TiltHALT, TiltHalt_Do },
|
||
|
|
{ TiltUP, TiltUp_Do },
|
||
|
|
{ TiltDown, TiltDown_Do },
|
||
|
|
{ TiltHome, TiltHome_Do },
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
transition_t RougheningEndTransitions[] =
|
||
|
|
{
|
||
|
|
{ RougheningEndHALT, RougheningEndHALT_Do },
|
||
|
|
{ RougheningEndSwing, RougheningEndSwing_Do },
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
void Fsm_Init()
|
||
|
|
{
|
||
|
|
GF_BSP_Interrupt_Add_CallBack(
|
||
|
|
DF_BSP_InterCall_TIM8_2ms_PeriodElapsedCallback, GF_Dispatch);
|
||
|
|
}
|
||
|
|
|
||
|
|
void GF_Dispatch()
|
||
|
|
{
|
||
|
|
TiltControl();
|
||
|
|
DHRougheningControl();
|
||
|
|
|
||
|
|
if (Get_BIT(SystemErrorCode, DHRougheningController) == 1)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_HALT;
|
||
|
|
|
||
|
|
action_perfrom(MoveTransitions,
|
||
|
|
sizeof(MoveTransitions) / sizeof(transition_t),
|
||
|
|
CurrentMoveState);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
LaneChangeControl();
|
||
|
|
//获取电机速度及状态 m/min
|
||
|
|
|
||
|
|
//电机直径280mm/101传动比 发送的数据单位是0.1 rpm
|
||
|
|
// 1 rpm 意思是1分钟转1圈,英文是 1rotation per minite。一圈的弧度是2π rad,一分钟60秒,那么
|
||
|
|
// 1 rpm = 1(r)/1(min) = 1(r)/60(s) = 2π (rad)/60(s) =π/30 (rad/s)
|
||
|
|
// 所以,1 rpm = π/30 (rad/s), 即 1 rpm = 0.1047 (rad/s)
|
||
|
|
// v=ω×r
|
||
|
|
|
||
|
|
*RobotSpeed = (int32_t) (DHRougheningGetSpeed(DHRougheningContrller) / 0.880
|
||
|
|
* 101 * 10);
|
||
|
|
|
||
|
|
*RobotLaneChangeDistance = DHRougheningGetLaneChangeDistance(
|
||
|
|
DHRougheningContrller);
|
||
|
|
|
||
|
|
LaneChangeControl();
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
if (DHRougheningContrller.Forward_Backward_Speed > 1000
|
||
|
|
|| DHRougheningContrller.Left_Right_Turn_Speed > 1000)
|
||
|
|
{
|
||
|
|
|
||
|
|
if (DHRougheningContrller.Forwards + DHRougheningContrller.Backwards
|
||
|
|
+ DHRougheningContrller.Left_Turn
|
||
|
|
+ DHRougheningContrller.Right_Turn == 1)
|
||
|
|
{
|
||
|
|
|
||
|
|
if (DHRougheningContrller.Forwards == 1)
|
||
|
|
{
|
||
|
|
|
||
|
|
if (DHRougheningContrller.Horizontal_Task == 1)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Horizontal_Task_Forwards;
|
||
|
|
}
|
||
|
|
else if (DHRougheningContrller.Vertical_Task == 1)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Vertical_Task_Forwards;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Forwards;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
if (DHRougheningContrller.Backwards == 1)
|
||
|
|
{
|
||
|
|
|
||
|
|
if (DHRougheningContrller.Horizontal_Task == 1)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Horizontal_Task_Backwards;
|
||
|
|
}
|
||
|
|
else if (DHRougheningContrller.Vertical_Task == 1)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Vertical_Task_Backwards;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Forwards;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
if (DHRougheningContrller.Left_Turn == 1)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_TurnLeft;
|
||
|
|
}
|
||
|
|
if (DHRougheningContrller.Right_Turn == 1)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_TurnRight;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_HALT;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_HALT;
|
||
|
|
}
|
||
|
|
|
||
|
|
//参数设置
|
||
|
|
|
||
|
|
//手动模式
|
||
|
|
action_perfrom(MoveTransitions,
|
||
|
|
sizeof(MoveTransitions) / sizeof(transition_t), CurrentMoveState);
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
void action_perfrom(transition_t transitions[], int length, int state)
|
||
|
|
{
|
||
|
|
|
||
|
|
for (index_counter = 0; index_counter < length; index_counter++)
|
||
|
|
{
|
||
|
|
if (transitions[index_counter].State == state)
|
||
|
|
{
|
||
|
|
if (transitions[index_counter].robotRun != NULL)
|
||
|
|
{
|
||
|
|
transitions[index_counter].robotRun();
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
//return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//int* LaneChangeCommand, int* var0,int* var1)
|
||
|
|
void action_perfrom_with_state(transition_with_state_t transitions[],
|
||
|
|
int length, int *state, int *LaneChangeCommand, int *var0, int *var1)
|
||
|
|
{
|
||
|
|
|
||
|
|
for (index_counter = 0; index_counter < length; index_counter++)
|
||
|
|
{
|
||
|
|
if (transitions[index_counter].State == *state)
|
||
|
|
{
|
||
|
|
if (transitions[index_counter].robotRunWithState != NULL)
|
||
|
|
{
|
||
|
|
transitions[index_counter].robotRunWithState(state,
|
||
|
|
LaneChangeCommand, var0, var1);
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
//return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//超过某个角度,则一直向左转,在误差允许范围内,进行水平左移动,然后计算时间,随后停止
|
||
|
|
|
||
|
|
void TiltControl()
|
||
|
|
{
|
||
|
|
//Tilt 部分 前端上升、前端下降
|
||
|
|
if (DHRougheningContrller.End_Up == 1)
|
||
|
|
{
|
||
|
|
CurrentTiltState = TiltUP;
|
||
|
|
|
||
|
|
}
|
||
|
|
else if (DHRougheningContrller.End_Down == 1)
|
||
|
|
{
|
||
|
|
CurrentTiltState = TiltDown;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
CurrentTiltState = TiltHALT;
|
||
|
|
}
|
||
|
|
|
||
|
|
//点头、抬头 上下移动
|
||
|
|
action_perfrom(TiltTransitions,
|
||
|
|
sizeof(TiltTransitions) / sizeof(transition_t), CurrentTiltState);
|
||
|
|
}
|
||
|
|
|
||
|
|
void DHRougheningControl()
|
||
|
|
{
|
||
|
|
//拉毛部分
|
||
|
|
if (DHRougheningContrller.Roughening_Start == 1)
|
||
|
|
{
|
||
|
|
CurrentRougheningEndState = RougheningEndSwing; //拉毛开启
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
CurrentRougheningEndState = RougheningEndHALT; //拉毛关闭
|
||
|
|
}
|
||
|
|
|
||
|
|
//拉毛
|
||
|
|
action_perfrom(RougheningEndTransitions,
|
||
|
|
sizeof(RougheningEndTransitions) / sizeof(transition_t),
|
||
|
|
CurrentRougheningEndState);
|
||
|
|
}
|
||
|
|
void LaneChangeControl()
|
||
|
|
{
|
||
|
|
//换道
|
||
|
|
if (DHRougheningContrller.LaneChange_Horizontal_Left == 1)
|
||
|
|
{
|
||
|
|
LaneChangeCommand = 1;
|
||
|
|
}
|
||
|
|
else if (DHRougheningContrller.LaneChange_Vertical_Up == 1)
|
||
|
|
{
|
||
|
|
LaneChangeCommand = 2;
|
||
|
|
}
|
||
|
|
else if (DHRougheningContrller.LaneChange_Horizontal_Right == 1)
|
||
|
|
{
|
||
|
|
LaneChangeCommand = 3;
|
||
|
|
}
|
||
|
|
else if (DHRougheningContrller.LaneChange_Vertical_Down == 1)
|
||
|
|
{
|
||
|
|
LaneChangeCommand = 4;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
LaneChangeCommand = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (LastLaneChangeCommand != LaneChangeCommand)
|
||
|
|
{
|
||
|
|
LaneChangeCommandState=1;
|
||
|
|
switch (LaneChangeCommand)
|
||
|
|
{
|
||
|
|
|
||
|
|
case 0:
|
||
|
|
{
|
||
|
|
//CurrentAutoMoveSTATE = Auto_Move_HALT;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
{
|
||
|
|
//CurrentLaneChangeSTATE = Lane_Turn_To_Horizontal_Left;
|
||
|
|
|
||
|
|
Vertical_Left_Right_Lane_Change_Control(&LaneChangeCommandState,0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
{
|
||
|
|
//up
|
||
|
|
Horizontal_Up_Down_Lane_Change_Control(&LaneChangeCommandState, 0,
|
||
|
|
0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
{
|
||
|
|
//CurrentLaneChangeSTATE = Lane_Turn_To_Horizontal_Right;
|
||
|
|
Vertical_Left_Right_Lane_Change_Control(&LaneChangeCommandState,1);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
{
|
||
|
|
//CurrentLaneChangeSTATE = Lane_Turn_To_Straight_Down;
|
||
|
|
//down
|
||
|
|
Horizontal_Up_Down_Lane_Change_Control(&LaneChangeCommandState, 1,
|
||
|
|
0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
|
||
|
|
}
|
||
|
|
LastLaneChangeCommand = LaneChangeCommand;
|
||
|
|
}
|
||
|
|
static int32_t timeCount = 0;
|
||
|
|
|
||
|
|
//Move_Head_To_UP_Enum,
|
||
|
|
|
||
|
|
//Move_Head_To_Down_Enum,
|
||
|
|
void Vertical_Left_Right_Lane_Change_Control(int *LaneChangeCmd, int left_or_right)
|
||
|
|
{
|
||
|
|
//1. 转到方向朝左,2. 前进距离,3.方向朝上
|
||
|
|
switch (*LaneChangeCmd)
|
||
|
|
{
|
||
|
|
case 1:
|
||
|
|
{
|
||
|
|
|
||
|
|
if (left_or_right == 0) //left
|
||
|
|
{
|
||
|
|
if (abs(GV.Robot_Angle - CV.RobotHorizontalDirectionAngle)
|
||
|
|
>= 20 * 100)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Head_To_Left_Enum; //转到左边,前进
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
//开始计时
|
||
|
|
timeCount = 0;
|
||
|
|
*LaneChangeCmd += 1; //
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (left_or_right == 1) //right
|
||
|
|
{
|
||
|
|
if (abs(GV.Robot_Angle - CV.RobotHorizontalDirectionAngle)
|
||
|
|
>= 20 * 100)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Head_To_Right_Enum; //转到左边,前进
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
//开始计时
|
||
|
|
timeCount = 0;
|
||
|
|
*LaneChangeCmd += 1; //
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
{
|
||
|
|
timeCount++;
|
||
|
|
CurrentMoveState = Move_Horizontal_Task_Forwards; //转到左边,前进
|
||
|
|
|
||
|
|
if (timeCount
|
||
|
|
>= 60 * (*RobotLaneChangeDistance)
|
||
|
|
/ (DHRougheningGetSpeed(DHRougheningContrller))) //传输距离除以速度
|
||
|
|
{
|
||
|
|
*LaneChangeCmd += 1; //
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
{
|
||
|
|
if (abs(GV.Robot_Angle - CV.RobotVerticalDirectionAngle)
|
||
|
|
>= 10 * 100) //45度
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Head_To_UP_Enum; //转到左边,前进
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
*LaneChangeCmd += 1; //
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_HALT; //转到左边,前进
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void Horizontal_Up_Down_Lane_Change_Control(int *LaneChangeCmd, int up_or_down,
|
||
|
|
int head_to_left_or_right)
|
||
|
|
{
|
||
|
|
//1. 转到方向朝左,2. 前进距离,3.方向朝上
|
||
|
|
switch (*LaneChangeCmd)
|
||
|
|
{
|
||
|
|
case 1:
|
||
|
|
|
||
|
|
if (abs(GV.Robot_Angle - CV.RobotVerticalDirectionAngle)
|
||
|
|
>= 20 * 100)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Head_To_UP_Enum; //
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
//开始计时
|
||
|
|
timeCount = 0;
|
||
|
|
*LaneChangeCmd += 1; //
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
{
|
||
|
|
|
||
|
|
if (up_or_down == 0)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Vertical_Task_Forwards;
|
||
|
|
}
|
||
|
|
else if (up_or_down == 1)
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Vertical_Task_Backwards;
|
||
|
|
}
|
||
|
|
timeCount++;
|
||
|
|
if (timeCount
|
||
|
|
>= 60 * (*RobotLaneChangeDistance)
|
||
|
|
/ (DHRougheningGetSpeed(DHRougheningContrller))) //传输距离除以速度
|
||
|
|
{
|
||
|
|
*LaneChangeCmd += 1; //
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
{
|
||
|
|
|
||
|
|
if (head_to_left_or_right == 0) //head to left
|
||
|
|
{
|
||
|
|
if (abs(GV.Robot_Angle - CV.RobotHorizontalDirectionAngle)
|
||
|
|
>= 10 * 100) //45度
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Head_To_Left_Enum; //转到左边,前进
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
*LaneChangeCmd += 1; //
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
else if (head_to_left_or_right == 1)
|
||
|
|
{
|
||
|
|
if (abs(GV.Robot_Angle - CV.RobotHorizontalOppositeDirectionAngle)
|
||
|
|
>= 10 * 100) //45度
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_Head_To_Right_Enum; //转到左边,前进
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
*LaneChangeCmd += 1; //
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
{
|
||
|
|
CurrentMoveState = Move_HALT; //转到左边,前进
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|