engineering/application/robot_def.h

227 lines
7.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file robot_def.h
* @author NeoZeng neozng1@hnu.edu.cn
* @author Even
* @version 0.1
* @date 2022-12-02
*
* @copyright Copyright (c) HNU YueLu EC 2022 all rights reserved
*
*/
#pragma once // 可以用#pragma once代替#ifndef ROBOT_DEF_H(header guard)
#ifndef ROBOT_DEF_H
#define ROBOT_DEF_H
#include "ins_task.h"
#include "master_process.h"
#include "stdint.h"
/* 开发板类型定义,烧录时注意不要弄错对应功能;修改定义后需要重新编译,只能存在一个定义! */
#define ONE_BOARD // 单板控制整车
// #define CHASSIS_BOARD //底盘板
// #define GIMBAL_BOARD //云台板
#define VISION_USE_VCP // 使用虚拟串口发送视觉数据
// #define VISION_USE_UART // 使用串口发送视觉数据
/* 机器人重要参数定义,注意根据不同机器人进行修改,浮点数需要以.0或f结尾,无符号以u结尾 */
// 关节限位参数
#define DIFF_PITCH 90 //差动手腕关节
#define DIFF_ROLL 180
#define ROLL 170
#define PITCH_MIN (-174.0f) //注意此处和坐标系是反的
#define PITCH_MAX (40.0F)
#define YAW 60
//龙门架限位
#define UD_MAX 210
#define UD_MIN 0
#define FB_MIN 0
#define FB_MAX 205
// 云台参数
#define YAW_CHASSIS_ALIGN_ECD 0 // 云台和底盘对齐指向相同方向时的电机position值,若对云台有机械改动需要修改
#define YAW_ECD_GREATER_THAN_4096 1 // ALIGN_ECD值是否大于4096,是为1,否为0;用于计算云台偏转角度
#define PITCH_HORIZON_ECD 3412 // 云台处于水平位置时编码器值,若对云台有机械改动需要修改
#define PITCH_MAX_ANGLE 0 // 云台竖直方向最大角度 (注意反馈如果是陀螺仪,则填写陀螺仪的角度)
#define PITCH_MIN_ANGLE 0 // 云台竖直方向最小角度 (注意反馈如果是陀螺仪,则填写陀螺仪的角度)
#define TUCHUAN_MAX_ANGLE 180 // 图传电机最大角度
#define TUCHUAN_MIN_ANGLE 0 // 图传电机最小角度
// 发射参数
#define ONE_BULLET_DELTA_ANGLE 1933.272 // 发射一发弹丸拨盘转动的距离,由机械设计图纸给出
#define REDUCTION_RATIO_LOADER 27.0f // 拨盘电机的减速比,英雄需要修改为3508的19.0f//初始是49增加为27
#define NUM_PER_CIRCLE 5 // 拨盘一圈的装载量
// 机器人底盘修改的参数,单位为mm(毫米)
#define WHEEL_BASE 433.86 // 纵向轴距(前进后退方向)
#define TRACK_WIDTH 463.92 // 横向轮距(左右平移方向)
#define CENTER_GIMBAL_OFFSET_X 0 // 云台旋转中心距底盘几何中心的距离,前后方向,云台位于正中心时默认设为0
#define CENTER_GIMBAL_OFFSET_Y 0 // 云台旋转中心距底盘几何中心的距离,左右方向,云台位于正中心时默认设为0
#define RADIUS_WHEEL 75 // 轮子半径
#define REDUCTION_RATIO_WHEEL 19.0f // 电机减速比,因为编码器量测的是转子的速度而不是输出轴的速度故需进行转换
#define GYRO2GIMBAL_DIR_YAW 1 // 陀螺仪数据相较于云台的yaw的方向,1为相同,-1为相反
#define GYRO2GIMBAL_DIR_PITCH 1 // 陀螺仪数据相较于云台的pitch的方向,1为相同,-1为相反
#define GYRO2GIMBAL_DIR_ROLL 1 // 陀螺仪数据相较于云台的roll的方向,1为相同,-1为相反
// 检查是否出现主控板定义冲突,只允许一个开发板定义存在,否则编译会自动报错
#if (defined(ONE_BOARD) && defined(CHASSIS_BOARD)) || \
(defined(ONE_BOARD) && defined(GIMBAL_BOARD)) || \
(defined(CHASSIS_BOARD) && defined(GIMBAL_BOARD))
#error Conflict board definition! You can only define one board type.
#endif
#pragma pack(1) // 压缩结构体,取消字节对齐,下面的数据都可能被传输
/* -------------------------基本控制模式和数据类型定义-------------------------*/
/**
* @brief 这些枚举类型和结构体会作为CMD控制数据和各应用的反馈数据的一部分
*
*/
// 机器人状态
typedef enum
{
ROBOT_STOP = 0,
ROBOT_READY,
} Robot_Status_e;
// 应用状态
typedef enum
{
APP_OFFLINE = 0,
APP_ONLINE,
APP_ERROR,
} App_Status_e;
// 底盘模式设置
/**
* @brief 后续考虑修改为云台跟随底盘,而不是让底盘去追云台,云台的惯量比底盘小.
*
*/
typedef enum
{
CHASSIS_ZERO_FORCE = 0, // 电流零输入
CHASSIS_ROTATE, // 小陀螺模式
CHASSIS_NO_FOLLOW, // 不跟随,允许全向平移
CHASSIS_FOLLOW_GIMBAL_YAW, // 跟随模式,底盘叠加角度环控制
} chassis_mode_e;
// 云台模式设置
typedef enum
{
GIMBAL_ZERO_FORCE = 0, // 电流零输入
GIMBAL_FREE_MODE, // 云台自由运动模式,即与底盘分离(底盘此时应为NO_FOLLOW)反馈值为电机total_angle;似乎可以改为全部用IMU数据?
GIMBAL_MANUAL_MODE, // 云台陀螺仪反馈模式,反馈值为陀螺仪pitch,total_yaw_angle,底盘可以为小陀螺和跟随模式
GIMBAL_IKINE_MODE, // 机械臂运动学逆解模式输入6d-tof位置
GIMBAL_FLOOR_MODE, // 地矿模式
GIMBAL_SILVER_MODE, // 取银矿模式
GIMBAL_GOLD_MODE, // 取金矿模式
GIMBAL_STORAGE_MODE, // 放入矿石仓
GIMBAL_FETCH_MODE, // 取出矿石
ADJUST_PITCH_MODE, // 调整pitch零点
} gimbal_mode_e;
//气泵模式
typedef enum
{
PUMP_STOP, //关气泵
PUMP_OPEN //开气泵
} pump_mode_e;
// 伸缩模式设置
typedef enum
{
TO_STRETCH_ZERO_FORCE = 0, // 电流零输入
TO_STRETCH_MODE, // 自由伸缩
TO_STRETCH_KEEP, // 保持不动
} to_stretch_mode_e;
/* ----------------CMD应用发布的控制数据,应当由gimbal/chassis/shoot订阅---------------- */
/**
* @brief 对于双板情况,遥控器和pc在云台,裁判系统在底盘
*
*/
// cmd发布的底盘控制数据,由chassis订阅
typedef struct
{
// 控制部分
float vx; // 前进方向速度
float vy; // 横移方向速度
float wz; // 旋转速度
float offset_angle; // 底盘和归中位置的夹角
chassis_mode_e chassis_mode;
int chassis_power_buffer;
uint16_t chassis_power_limit;
// UI部分
// ...
} Chassis_Ctrl_Cmd_s;
// cmd发布的云台控制数据,由gimbal订阅
typedef struct
{ // 云台角度控制
float yaw;
float pitch;
float roll;
float diff_pitch; //差速器pitch
float diff_roll; //差速器roll
float x_add;
float y_add; //末端目标位置增量
float z_add;
float quat[4]; //末端姿态四元数
float rpy[3]; //末端姿态rpy角
float chassis_rotate_wz;
uint8_t MotorEnableFlag;
gimbal_mode_e gimbal_mode;
} Gimbal_Ctrl_Cmd_s;
// cmd发布的伸缩控制数据,由to_stretch订阅
typedef struct
{
float tc;
float ud;
float fb;
to_stretch_mode_e to_stretch_mode;
} To_stretch_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;
float cap_power;
uint8_t rest_heat; // 剩余枪口热量
Enemy_Color_e enemy_color; // 0 for blue, 1 for red
} Chassis_Upload_Data_s;
typedef struct
{
attitude_t gimbal_imu_data;
float diff_pitch_feedback;
} Gimbal_Upload_Data_s;
typedef struct
{
float gravity_feedforward;
float protract_x; //前伸距离
float lift_z; //抬升高度
} To_stretch_Upload_Data_s;
#pragma pack() // 开启字节对齐,结束前面的#pragma pack(1)
#endif // !ROBOT_DEF_H