R1_up/User/module/shoot.hpp
2025-06-24 15:44:28 +08:00

113 lines
2.4 KiB
C++

#ifndef SHOOT_HPP
#define SHOOT_HPP
#include "djiMotor.h"
#include "pid.h"
#include "GO_M8010_6_Driver.h"
#include "nuc.h"
#include "usart.h"
#include "filter.h"
// 定义状态枚举
typedef enum {
SHOOT_IDLE, // 空闲状态
SHOOT_TOP, // 顶部状态
SHOOT_TENSION, // 拉回到设定
SHOOT_READY,
SHOOT_WAIT,
SHOOT_FIRE, // 发射状态
SHOOT_RETURN, // 自动返回状态
//运射配合
GO_TOP,
BAKC
} ShootState_t;
// // 定义状态枚举
// typedef enum {
// BALL_IDLE, // 空闲状态
// BALL_FINISH, // 完成状态
// //持球状态
// BALL_TAKE,
// BALL_LOSE
// } BallState_t;
typedef enum
{
UP1=1,
MIDDLE1,
DOWN1,
SHOOT,
WAIT,
TEST,
VSION
}rc_mode;
// 光电传感器读取宏
#define IS_PHOTOELECTRIC_TRIGGERED() (HAL_GPIO_ReadPin(STOP_GPIO_Port, STOP_Pin) == GPIO_PIN_RESET)
class Shoot
{
public:
Shoot();
void rc_mode();
void trigger_control(void);
void distanceGet(const NUC_t &nuc);
void shoot_control(void);
void shoot_Current(void);
void RemoveError(void);
void ball_receive(void);
int GO_SendData(float pos,float limit);
//go电机
GO_MotorCmd_t go1;
GO_MotorData_t *go1_data;//存放go电机数据
float control_pos; //控制位置
float fire_pos; //发射位置
struct feedback
{
float fd_gopos;
float fd_tpos;
}feedback;
//扳机
float speed_trigger;
int16_t result;
float t_speedSet;
float t_posSet;//扳机位置
float fd_tpos; //扳机反馈位置
motor_measure_t *trigger_Motor;
//滤波器
LowPassFilter2p_t distance_filter; // 用于滤波视觉距离
//==========================公共变量==========================
int16_t rc_key; //遥控器按键
int16_t mode_key;
int16_t trigger_key;
ShootState_t currentState; //状态机
volatile uint32_t shoot_thread;//接收传回的线程通知
fp32 distance; //视觉距离
private:
//扳机2006
static const float M2006_speed_PID[3];
static const float M2006_angle_PID[3];
//电机速度pid结构体
pid_type_def speed_pid;
//位置环pid
pid_type_def angle_pid;
bool is_hooked;// 标记钩子是否已经钩住拉簧
float limit_speed;//go电机限速
};
#endif