Files
bf_original_balance_chassis/application/robot_def.h

257 lines
7.8 KiB
C
Raw Normal View History

2022-12-02 23:10:36 +08:00
/**
* @file robot_def.h
* @author NeoZeng neozng1@hnu.edu.cn
* @author Even
* @version 0.1
* @date 2022-12-02
*
2022-12-02 23:10:36 +08:00
* @copyright Copyright (c) HNU YueLu EC 2022 all rights reserved
*
2022-12-02 23:10:36 +08:00
*/
#pragma once // 可以用#pragma once代替#ifndef ROBOT_DEF_H(header guard)
#ifndef ROBOT_DEF_H
#define ROBOT_DEF_H
2022-12-02 22:17:10 +08:00
#include "ins_task.h"
#include "master_process.h"
2022-12-12 22:29:51 +08:00
#include "stdint.h"
2022-12-02 22:17:10 +08:00
/* 开发板类型定义,烧录时注意不要弄错对应功能;修改定义后需要重新编译,只能存在一个定义! */
2024-01-14 21:22:34 +08:00
// #define ONE_BOARD // 单板控制整车
2026-04-10 21:36:02 +08:00
#define CHASSIS_BOARD //底盘板
// #define GIMBAL_BOARD //云台板
2022-12-02 22:17:10 +08:00
#define VISION_USE_VCP // 使用虚拟串口发送视觉数据
// #define VISION_USE_UART // 使用串口发送视觉数据
/* 机器人重要参数定义,注意根据不同机器人进行修改,浮点数需要以.0或f结尾,无符号以u结尾 */
2022-12-05 15:03:45 +08:00
// 云台参数
2024-05-20 22:22:24 +08:00
#define YAW_CHASSIS_ALIGN_ECD 2716 // 云台和底盘对齐指向相同方向时的电机编码器值,若对云台有机械改动需要修改
2024-05-23 13:41:20 +08:00
#define YAW_CHASSIS_SIDE_ECD 716 // 云台和底盘侧面对齐时的电机编码器值,若对云台有机械改动需要修改
2023-01-01 17:32:22 +08:00
#define YAW_ECD_GREATER_THAN_4096 0 // ALIGN_ECD值是否大于4096,是为1,否为0;用于计算云台偏转角度
#define PITCH_HORIZON_ECD 3412 // 云台处于水平位置时编码器值,若对云台有机械改动需要修改
2024-05-23 16:27:59 +08:00
#define PITCH_MAX_ANGLE (30.0f) // 云台竖直方向最大角度 (注意反馈如果是陀螺仪,则填写陀螺仪的角度)
#define PITCH_MIN_ANGLE (-30.0f) // 云台竖直方向最小角度 (注意反馈如果是陀螺仪,则填写陀螺仪的角度)
2024-01-14 21:22:34 +08:00
2022-12-05 15:03:45 +08:00
// 发射参数
2024-06-01 00:11:37 +08:00
#define ONE_BULLET_DELTA_ANGLE 30 // 发射一发弹丸拨盘转动的距离,由机械设计图纸给出
2024-05-23 23:22:49 +08:00
#define REDUCTION_RATIO_LOADER 36.0f // 拨盘电机的减速比,英雄需要修改为3508的19.0f
2024-05-20 22:22:24 +08:00
#define NUM_PER_CIRCLE 12 // 拨盘一圈的装载量
2024-05-23 23:22:49 +08:00
#define LOAD_RATIO 2.5f // 中心供弹需要机械减速比
2022-12-05 15:03:45 +08:00
#define GYRO2GIMBAL_DIR_YAW 1 // 陀螺仪数据相较于云台的yaw的方向,1为相同,-1为相反
#define GYRO2GIMBAL_DIR_PITCH 1 // 陀螺仪数据相较于云台的pitch的方向,1为相同,-1为相反
#define GYRO2GIMBAL_DIR_ROLL 1 // 陀螺仪数据相较于云台的roll的方向,1为相同,-1为相反
2024-05-23 16:27:59 +08:00
#define BALANCE_MAX_SPEED 2.0f // 底盘最大速度,单位m/s
// 检查是否出现主控板定义冲突,只允许一个开发板定义存在,否则编译会自动报错
2022-12-02 22:17:10 +08:00
#if (defined(ONE_BOARD) && defined(CHASSIS_BOARD)) || \
(defined(ONE_BOARD) && defined(GIMBAL_BOARD)) || \
(defined(CHASSIS_BOARD) && defined(GIMBAL_BOARD))
2023-01-02 23:50:04 +08:00
#error Conflict board definition! You can only define one board type.
#endif
2022-12-02 22:17:10 +08:00
#pragma pack(1) // 压缩结构体,取消字节对齐,下面的数据都可能被传输
2022-12-02 22:17:10 +08:00
/* -------------------------基本控制模式和数据类型定义-------------------------*/
/**
* @brief CMD控制数据和各应用的反馈数据的一部分
*
*/
// 机器人状态
typedef enum
{
2023-01-01 17:32:22 +08:00
ROBOT_STOP = 0,
ROBOT_READY,
} Robot_Status_e;
2022-12-02 22:17:10 +08:00
// 应用状态
typedef enum
{
2023-01-01 17:32:22 +08:00
APP_OFFLINE = 0,
2022-12-02 22:17:10 +08:00
APP_ONLINE,
APP_ERROR,
} App_Status_e;
2024-05-24 20:49:07 +08:00
// UI模式设置
typedef enum
{
UI_KEEP = 0,
UI_REFRESH,
} ui_mode_e;
2022-12-02 22:17:10 +08:00
// 底盘模式设置
/**
* @brief ,,.
*
*/
2022-12-02 22:17:10 +08:00
typedef enum
{
2023-01-01 17:32:22 +08:00
CHASSIS_ZERO_FORCE = 0, // 电流零输入
2022-12-02 22:17:10 +08:00
CHASSIS_ROTATE, // 小陀螺模式
CHASSIS_FOLLOW_GIMBAL_YAW, // 跟随模式,底盘叠加角度环控制
2024-01-14 21:22:34 +08:00
CHASSIS_RESET, // 底盘重置,双腿缩回
CHASSIS_FREE_DEBUG, // 底盘单独调试模式
CHASSIS_ROTATE_REVERSE,
2022-12-02 22:17:10 +08:00
} chassis_mode_e;
2022-12-02 22:17:10 +08:00
// 云台模式设置
typedef enum
{
2023-01-01 17:32:22 +08:00
GIMBAL_ZERO_FORCE = 0, // 电流零输入
GIMBAL_FREE_MODE, // 云台自由运动模式,即与底盘分离(底盘此时应为NO_FOLLOW)反馈值为电机total_angle;似乎可以改为全部用IMU数据?
GIMBAL_GYRO_MODE, // 云台陀螺仪反馈模式,反馈值为陀螺仪pitch,total_yaw_angle,底盘可以为小陀螺和跟随模式
2022-12-02 22:17:10 +08:00
} gimbal_mode_e;
// 发射模式设置
typedef enum
{
SHOOT_OFF = 0,
SHOOT_ON,
} shoot_mode_e;
typedef enum
2022-12-02 22:17:10 +08:00
{
2023-01-01 17:32:22 +08:00
FRICTION_OFF = 0, // 摩擦轮关闭
FRICTION_ON, // 摩擦轮开启
} friction_mode_e;
2022-12-02 22:17:10 +08:00
typedef enum
{
2023-01-01 17:32:22 +08:00
LID_OPEN = 0, // 弹舱盖打开
LID_CLOSE, // 弹舱盖关闭
2022-12-02 22:17:10 +08:00
} lid_mode_e;
typedef enum
{
2023-01-01 17:32:22 +08:00
LOAD_STOP = 0, // 停止发射
2022-12-02 22:17:10 +08:00
LOAD_REVERSE, // 反转
LOAD_1_BULLET, // 单发
LOAD_3_BULLET, // 三发
LOAD_BURSTFIRE, // 连发
} loader_mode_e;
2024-05-24 20:49:07 +08:00
typedef enum
{
UNLOCK = 0, // 未开启自瞄或视觉未锁定
CONVERGE, // 视觉锁定过程中,正在校准
LOCK, // 视觉锁定, 可以开火
} vision_mode_e;
// 功率限制,从裁判系统获取,是否有必要保留?
2022-12-02 22:17:10 +08:00
typedef struct
{ // 功率控制
2023-03-27 22:03:35 +08:00
float chassis_power_mx;
} Chassis_Power_Data_s;
2024-01-14 21:22:34 +08:00
typedef enum
{
CHASSIS_ALIGN = 0,
CHASSIS_SIDLE,
2024-01-14 21:22:34 +08:00
} chassis_direction_e;
/* ----------------CMD应用发布的控制数据,应当由gimbal/chassis/shoot订阅---------------- */
2022-12-02 22:17:10 +08:00
/**
* @brief ,pc在云台,
2022-12-02 22:17:10 +08:00
*
*/
// cmd发布的底盘控制数据,由chassis订阅
2022-12-02 22:17:10 +08:00
typedef struct
{
// 控制部分
2022-12-02 22:17:10 +08:00
float vx; // 前进方向速度
2024-06-01 00:11:37 +08:00
int8_t rotate_w; // 旋转速度, 目前仅在复位模式下使用
int8_t delta_leglen; // 腿长
2022-12-02 22:17:10 +08:00
float offset_angle; // 底盘和归中位置的夹角
chassis_mode_e chassis_mode;
2024-01-14 21:22:34 +08:00
chassis_direction_e direction;
// UI部分
2024-05-24 20:49:07 +08:00
Chassis_Power_Data_s super_cap; // 超级电容
friction_mode_e friction_mode; // 摩擦轮状态
vision_mode_e vision_mode; // 视觉状态
ui_mode_e ui_mode; // UI状态
loader_mode_e loader_mode; // 拨盘状态
2022-12-02 22:17:10 +08:00
} Chassis_Ctrl_Cmd_s;
2024-06-01 00:11:37 +08:00
typedef union
{
struct // 用于访问键盘状态
{
uint16_t chassis_mode : 3;
uint16_t chassis_direction_e : 1;
uint16_t friction_mode_e : 1;
uint16_t vision_mode : 2;
uint16_t ui_mode : 1;
uint16_t loader_mode : 3;
uint16_t w_speed_buf : 2;
};
uint16_t can_com;
} Can_Comm_s;
typedef struct
{
float vx ;
int8_t delta_leglen;
int16_t offset_angle;
Can_Comm_s can_comm;
}Chassis_Can_Comm;
2022-12-02 22:17:10 +08:00
// cmd发布的云台控制数据,由gimbal订阅
2022-12-02 22:17:10 +08:00
typedef struct
{ // 云台角度控制
float yaw;
float pitch;
float chassis_rotate_wz;
gimbal_mode_e gimbal_mode;
} Gimbal_Ctrl_Cmd_s;
// cmd发布的发射控制数据,由shoot订阅
2022-12-02 22:17:10 +08:00
typedef struct
2022-12-05 15:03:45 +08:00
{
shoot_mode_e shoot_mode;
2022-12-02 22:17:10 +08:00
loader_mode_e load_mode;
lid_mode_e lid_mode;
friction_mode_e friction_mode;
Bullet_Speed_e bullet_speed; // 弹速枚举
2022-12-02 22:17:10 +08:00
uint8_t rest_heat;
2022-12-05 15:03:45 +08:00
float shoot_rate; // 连续发射的射频,unit per s,发/秒
2022-12-02 22:17:10 +08:00
} Shoot_Ctrl_Cmd_s;
/* ----------------gimbal/shoot/chassis发布的反馈数据----------------*/
/**
* @brief cmd订阅,.
*
*/
typedef struct
{
#if defined(CHASSIS_BOARD) || defined(GIMBAL_BOARD) // 非单板的时候底盘还将imu数据回传(若有必要)
// attitude_t chassis_imu_data;
#endif
// 后续增加底盘的真实速度
// float real_vx;
// float real_vy;
// float real_wz;
2024-01-14 21:22:34 +08:00
float yaw_w; // 底盘当前转速
uint8_t rest_heat; // 剩余枪口热量
Bullet_Speed_e bullet_speed; // 弹速限制
Enemy_Color_e enemy_color; // 0 for blue, 1 for red
2022-12-02 22:17:10 +08:00
} Chassis_Upload_Data_s;
2022-12-02 22:17:10 +08:00
typedef struct
{
2024-05-20 22:22:24 +08:00
INS_t gimbal_imu_data;
2022-12-05 15:03:45 +08:00
uint16_t yaw_motor_single_round_angle;
2022-12-02 22:17:10 +08:00
} Gimbal_Upload_Data_s;
2022-12-02 22:17:10 +08:00
typedef struct
{
// code to go here
// ...
} Shoot_Upload_Data_s;
#pragma pack() // 开启字节对齐,结束前面的#pragma pack(1)
#endif // !ROBOT_DEF_H