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
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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|