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.

252 lines
5.6 KiB

3 months ago
/*
* fsm.c
*
* Created on: Oct 18, 2024
* Author: akeguo
*/
#include "fsm.h"
#include "BHBF_ROBOT.h"
#include "bsp_include.h"
#include "robot_state.h"
#include "msp_Steering_Engine.h"
int32_t *RobotSpeed;
//int32_t *JontSwingSpeed;
//int32_t *JontTiltSpeed;
#define M_PI 3.14159265358979323846
void action_perfrom(transition_t transitions[], int length, int state);
void GF_Dispatch();
void action_perfrom();
MoveSTATE_t CurrentMoveState;
SwingSTATE_t CurrentSwingState;
TiltSTATE_t CurrentTiltState; //点头,抬头
int index_counter = 0;
int32_t speed_selection;
uint32_t rotational_speed = 5;//°/s
//手动下 机器人运动
transition_t MoveTransitions[] =
{
{ Manual_State, Manual_State_Do },
{ Move_HALT, HALT_State_Do },
{ Auto_Back_State,Auto_Back_State_Do}
};
transition_t SwingTransitions[] =
{
{ SwingHALT, SwingHALT_State_Do },
{ SwingAuto, SwingAuto_Do },
{ SwingManual, SwingManual_Do },
{ SwingHome, SwingHome_Do}
};
transition_t TiltTransitions[] =
{
{ TiltHALT, TiltHalt_Do },
{ TiltAuto, TiltAuto_Do },
{ TiltManual, TiltManual_Do },
{ TiltHome,TiltHome_Do}
};
void Fsm_Init()
{
GF_BSP_Interrupt_Add_CallBack(
DF_BSP_InterCall_TIM8_2ms_PeriodElapsedCallback, GF_Dispatch);
}
void GF_Dispatch()
{
if(GV.MK32_Key.CH4_SA == -1000) //SA上拨
{
Steering_0_Damping_1_working();
}
else if(GV.MK32_Key.CH4_SA == 1000) //SA下拨
{
Steering_0_working_1_Damping();
}
else {
Steering_0_working_1_working(); //1、2舵机负责行驶,3、4舵机负责转向
}
IV.Robot_Move_Speed = speed_selection*32*3.14/3/1000;
IV.Steer_Angle = abs(GV.Steering_Real_Angle_3 - 93);
IV.Steer_Angle_back = abs(GV.Steering_Real_Angle_4 - 93);
action_perfrom(MoveTransitions,sizeof(MoveTransitions) / sizeof(transition_t), CurrentMoveState);
action_perfrom(SwingTransitions,sizeof(SwingTransitions) / sizeof(transition_t), CurrentSwingState);
action_perfrom(TiltTransitions,sizeof(TiltTransitions) / sizeof(transition_t), CurrentTiltState);
}
void Steering_0_working_1_Damping()
{
speed_selection = (GV.MK32_Key.CH10_LD1 + 1000) / 20; //最快速度100°/s
int angle;
angle = atan2(P_MK32->CH2_LY_V, P_MK32->CH3_LY_H) * 180 / M_PI;
if((angle >= 45) && (angle <= 135)) //前进
{
GV.Servo_Speed_1 = speed_selection;
GV.Servo_Speed_2 = 0;
GV.Servo_Power_2 = 10;
return;
}
else if(P_MK32->CH3_LY_H > 100)
{
if((angle >= -45) && (angle <=45)) //右转
{
GV.Servo_Speed_4 = -rotational_speed;
return;
}
}
else if((angle >= -135) && (angle < -45)) //后退
{
GV.Servo_Speed_1 = -speed_selection;
GV.Servo_Speed_2 = 0;
GV.Servo_Power_2 = 10;
return;
}
else if(((angle > 135) && (angle <= 180))
|| (angle < -135) && (angle >= -179)) //左转
{
GV.Servo_Speed_4 = rotational_speed;
return;
}
else {
GV.Servo_Speed_1 = 0;
GV.Servo_Power_1 = 1000;
GV.Servo_Speed_2 = 0;
GV.Servo_Power_2 = 10;
GV.Servo_Speed_4 = 0;
// update_steering_state();
}
}
void Steering_0_Damping_1_working()
{
speed_selection = (GV.MK32_Key.CH10_LD1 + 1000) / 20; //最快速度100°/s
int angle;
angle = atan2(P_MK32->CH2_LY_V, P_MK32->CH3_LY_H) * 180 / M_PI;
if((angle >= 45) && (angle <= 135)) //前进
{
GV.Servo_Speed_2 = speed_selection;
GV.Servo_Speed_1 = 0;
GV.Servo_Power_1 = 10;
return;
}
else if(P_MK32->CH3_LY_H > 100)
{
if((angle >= -45) && (angle <=45)) //右转
{
GV.Servo_Speed_3 = -rotational_speed;
return;
}
}
else if((angle >= -135) && (angle < -45)) //后退
{
GV.Servo_Speed_2 = -speed_selection;
GV.Servo_Speed_1 = 0;
GV.Servo_Power_1 = 10;
return;
}
else if(((angle > 135) && (angle <= 180))
|| (angle < -135) && (angle >= -179)) //左转
{
GV.Servo_Speed_3 = rotational_speed;
return;
}
else {
GV.Servo_Speed_2 = 0;
GV.Servo_Power_2 = 1000;
GV.Servo_Speed_1 = 0;
GV.Servo_Power_1 = 10;
GV.Servo_Speed_3 = 0;
// update_steering_state();
}
}
void Steering_0_working_1_working()
{
speed_selection = (GV.MK32_Key.CH10_LD1 + 1000) / 20; //最快速度100°/s
int angle;
angle = atan2(P_MK32->CH2_LY_V, P_MK32->CH3_LY_H) * 180 / M_PI;
if((angle >= 45) && (angle <= 135)) //前进
{
GV.Servo_Speed_1 = speed_selection;
GV.Servo_Speed_2 = speed_selection;
return;
}
else if(P_MK32->CH3_LY_H > 100)
{
if((angle >= -45) && (angle <=45)) //右转
{
GV.Servo_Speed_3 = -rotational_speed;
GV.Servo_Speed_4 = -rotational_speed;
return;
}
}
else if((angle >= -135) && (angle < -45)) //后退
{
GV.Servo_Speed_1 = -speed_selection;
GV.Servo_Speed_2 = -speed_selection;
return;
}
else if(((angle > 135) && (angle <= 180))
|| (angle < -135) && (angle >= -179)) //左转
{
GV.Servo_Speed_3 = rotational_speed;
GV.Servo_Speed_4 = rotational_speed;
return;
}
else {
GV.Servo_Speed_1 = 0;
GV.Servo_Speed_2 = 0;
GV.Servo_Speed_3 = 0;
GV.Servo_Speed_4 = 0;
GV.Servo_Power_1 = 1000;
GV.Servo_Power_2 = 1000;
// update_steering_state();
}
}
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;
}
}
}