增加手动,以及ai识别

This commit is contained in:
2026-02-12 21:03:17 +08:00
parent 4ec47d9975
commit b6a63efc9e
185 changed files with 119269 additions and 112462 deletions

View File

@@ -249,7 +249,7 @@ typedef union _UnRemoteControlInput
// 定义接收数据结构体
typedef struct {
uint8_t data[MAX_RECEIVED_DATA_SIZE];
uint16_t length;
uint32_t length;
} ReceivedDataStruct;
@@ -680,6 +680,100 @@ typedef union _UnrLifterOutput
} UnLifterOutput;
// CAN ID 解析联合体形式支持位域和32位直接访问
typedef union _UnCanIdInfo
{
uint32_t raw; // 32位整型直接读写整个CAN ID
struct
{
uint32_t motor_id : 8; // 0-7 bit (电机ID)
uint32_t data : 16; // 8-23 bit (数据字段)
uint32_t mode : 5; // 24-28 bit (模式)
uint32_t res : 3; // 29-31 bit (保留位)
} bits;
} UnCanIdInfo;
// 输出can数据
typedef struct _StrTxCanOutput
{
uint16_t index; // 索引(类似寄存器地址)
uint16_t object_index; // 子索引通常为0x0000
uint32_t data; // 数据字段
} StrTxCanOutput;
// CAN数据区联合体 (8字节严格遵循图片协议大端序数据)
typedef union _UnTxCanData {
StrTxCanOutput bit_data; // 结构化访问
uint8_t arr[sizeof(StrTxCanOutput)]; // 字节数组形式(用于原始数据读写)
} UnTxCanData;
// 接收CAN帧结构体
typedef struct _StrTxCanFrame
{
UnCanIdInfo tx_can_id; // 接收到的29位CAN ID
UnTxCanData tx_can_data; // 接收到的8字节数据区
} StrTxCanFrame;
// CAN ID 解析联合体 (29位扩展帧严格遵循图片协议小端序适配)
typedef union _UnRxCanIdInfo {
uint32_t raw; // 完整的32位值
struct {
// 注意小端序下位域布局从低位到高位Bit0到Bit31
// 编译器通常从低位开始分配位域
// 主机CAN_ID (Bit7~Bit0) - 8位 - 最低字节
uint32_t host_id : 8; // Bit7~0: 主机CAN_ID
// 电机状态与故障信息域 (Bit23~Bit8) - 16位
uint32_t motor_can_id : 8; // Bit15~8: 当前电机CAN ID
uint32_t undervoltage : 1; // Bit16: 欠压故障 (0无1有)
uint32_t overcurrent : 1; // Bit17: 过流 (0无1有)
uint32_t overtemperature : 1; // Bit18: 过温 (0无1有)
uint32_t mag_encoder_fault : 1; // Bit19: 磁编码故障 (0无1有)
uint32_t hall_fault : 1; // Bit20: HALL编码故障 (0无1有)
uint32_t uncalibrated : 1; // Bit21: 未标定 (0无1有)
uint32_t mode_state : 2; // Bit23~22: 模式状态 (0:Reset,1:Cali,2:Motor)
// 协议标识 (Bit28~Bit24) - 5位
uint32_t protocol_id : 5; // Bit28~24: 协议标识图中为2
// 保留位 (Bit31~29) - 3位图片中未使用
uint32_t reserved : 3; // Bit31~29: 保留位应设置为0
} bits;
} UnRxCanIdInfo;
// 输出can数据
typedef struct _StrRxCanOutput
{
uint16_t current_angle; // Byte0~1: 当前角度 [0~65535]对应(-4π~4π)
uint16_t current_velocity; // Byte2~3: 当前角速度 [0~65535]对应(-15rad/s~15rad/s)
uint16_t current_torque; // Byte4~5: 当前力矩 [0~65535]对应(-120Nm~120Nm)
uint16_t temperature; // Byte6~7: 当前温度: Temp(摄氏度)*10
} StrRxCanOutput;
// CAN数据区联合体 (8字节严格遵循图片协议大端序数据)
typedef union _UnRxCanData
{
StrRxCanOutput bit_data; // 结构化访问
uint8_t arr[sizeof(StrRxCanOutput)]; // 字节数组形式(用于原始数据读写)
} UnRxCanData;
// 接收CAN帧结构体
typedef struct _StrRxCanFrame
{
UnRxCanIdInfo rx_can_id; // 接收到的29位CAN ID
UnRxCanData rx_can_data; // 接收到的8字节数据区
} StrRxCanFrame;
//-----以太网-------------------------------------------------------------
// 输出给自主计算机
typedef struct _StrComputerOutput
@@ -912,7 +1006,174 @@ typedef union _UnAutoControlOutput
/* 云台数据流请求完整通信帧结构体 - CMD_ID 0x25 */
#pragma pack(push, 1)
typedef struct {
uint16_t STX; // 帧起始标志固定为0x6655低字节在前实际存储为0x55 0x66
uint8_t CTRL; // 控制位bit0-need_ack(是否需要ack) bit1-ack_pack(是否为ack包) bit2-7-预留
uint16_t Data_len; // 数据域字节长度低字节在前此处固定为2
uint16_t SEQ; // 帧序列(0~65535),低字节在前
uint8_t CMD_ID; // 命令ID此处固定为0x25
// 以下为DATA域对应偏移8开始长度=Data_len=2
uint8_t data_type; // 数据类型1-姿态 2-激光测距 3-磁编码角度 4-电机电压
uint8_t data_freq; // 输出频率0-关闭 1-2Hz 2-4Hz 3-5Hz 4-10Hz 5-20Hz 6-50Hz 7-100Hz
uint16_t CRC16; // 整个数据包的CRC16校验低字节在前
} GimbalStreamRequestFrame;
#pragma pack(pop)
/* 云台数据流请求完整通信帧联合体 - CMD_ID 0x25 */
typedef union {
GimbalStreamRequestFrame frame; // 按结构体访问各字段
uint8_t data[12]; // 按字节数组访问总长度2+1+2+2+1+2+2 = 12字节
} GimbalStreamRequestFrameUnion;
/* 手动变倍自动对焦数据结构体 - CMD_ID 0x05 */
#pragma pack(push, 1)
typedef struct {
uint16_t STX; // 帧起始标志固定为0x6655低字节在前实际存储为0x55 0x66
uint8_t CTRL; // 控制位bit0-need_ack(是否需要ack) bit1-ack_pack(是否为ack包) bit2-7-预留
uint16_t Data_len; // 数据域字节长度低字节在前此处固定为1
uint16_t SEQ; // 帧序列(0~65535),低字节在前
uint8_t CMD_ID; // 命令ID此处固定为0x05
// 以下为DATA域对应偏移8开始长度=Data_len=1
int8_t zoom; // 变倍控制1-放大 0-停止缩放(松手后发送) -1-缩小
uint16_t CRC16; // 整个数据包的CRC16校验低字节在前
} ManualZoomFocusFrame;
#pragma pack(pop)
/* 手动变倍自动对焦完整通信帧联合体 - CMD_ID 0x05 */
typedef union {
ManualZoomFocusFrame frame; // 按结构体访问各字段
uint8_t data[11]; // 按字节数组访问总长度2+1+2+2+1+1+2 = 11字节
} ManualZoomFocusFrameUnion;
/* 拍照录像控制数据结构体 - CMD_ID 0x0C */
#pragma pack(push, 1)
typedef struct {
uint16_t STX; // 帧起始标志固定为0x6655低字节在前实际存储为0x55 0x66
uint8_t CTRL; // 控制位bit0-need_ack(是否需要ack) bit1-ack_pack(是否为ack包) bit2-7-预留
uint16_t Data_len; // 数据域字节长度低字节在前此处固定为1
uint16_t SEQ; // 帧序列(0~65535),低字节在前
uint8_t CMD_ID; // 命令ID此处固定为0x0C
// 以下为DATA域对应偏移8开始长度=Data_len=1
uint8_t func_type; // 功能类型: 0-拍照 2-录像 3-5-运动模式 10-联动变倍等
uint16_t CRC16; // 整个数据包的CRC16校验低字节在前
} PhotoVideoControlFrame;
#pragma pack(pop)
/* 拍照录像控制完整通信帧联合体 - CMD_ID 0x0C */
typedef union {
PhotoVideoControlFrame frame; // 按结构体访问各字段
uint8_t data[11]; // 按字节数组访问总长度2+1+2+2+1+1+2 = 11字节
} PhotoVideoControlFrameUnion;
/* 设置激光测距状态数据结构体 - CMD_ID 0x32 */
#pragma pack(push, 1)
typedef struct {
uint16_t STX; // 帧起始标志固定为0x6655低字节在前实际存储为0x55 0x66
uint8_t CTRL; // 控制位bit0-need_ack(是否需要ack) bit1-ack_pack(是否为ack包) bit2-7-预留
uint16_t Data_len; // 数据域字节长度低字节在前此处固定为1
uint16_t SEQ; // 帧序列(0~65535),低字节在前
uint8_t CMD_ID; // 命令ID此处固定为0x32
// 以下为DATA域对应偏移8开始长度=Data_len=1
uint8_t laser_state; // 激光测距状态1-开启 0-关闭
uint16_t CRC16; // 整个数据包的CRC16校验低字节在前
} SetLaserRangingStatusFrame;
#pragma pack(pop)
/* 设置激光测距状态完整通信帧联合体 - CMD_ID 0x32 */
typedef union {
SetLaserRangingStatusFrame frame; // 按结构体访问各字段
uint8_t data[11]; // 按字节数组访问总长度2+1+2+2+1+1+2 = 11字节
} SetLaserRangingStatusFrameUnion;
/* 设置AI追踪目标坐标信息流状态数据结构体 - CMD_ID 0x51 */
#pragma pack(push, 1)
typedef struct {
uint16_t STX; // 帧起始标志固定为0x6655低字节在前实际存储为0x55 0x66
uint8_t CTRL; // 控制位bit0-need_ack(是否需要ack) bit1-ack_pack(是否为ack包) bit2-7-预留
uint16_t Data_len; // 数据域字节长度低字节在前此处固定为1
uint16_t SEQ; // 帧序列(0~65535),低字节在前
uint8_t CMD_ID; // 命令ID此处固定为0x51
// 以下为DATA域对应偏移8开始长度=Data_len=1
uint8_t track_action; // AI追踪目标坐标信息流状态1-打开输出 0-关闭输出
uint16_t CRC16; // 整个数据包的CRC16校验低字节在前
} SetAiTrackTargetCoordinateStatusFrame;
#pragma pack(pop)
/* 设置AI追踪目标坐标信息流状态完整通信帧联合体 - CMD_ID 0x51 */
typedef union {
SetAiTrackTargetCoordinateStatusFrame frame; // 按结构体访问各字段
uint8_t data[11]; // 按字节数组访问总长度2+1+2+2+1+1+2 = 11字节
} SetAiTrackTargetCoordinateUnion;
/* 设置AI追踪模式数据结构体 - CMD_ID 0x55 */
#pragma pack(push, 1)
typedef struct {
uint16_t STX; // 帧起始标志固定为0x6655低字节在前实际存储为0x55 0x66
uint8_t CTRL; // 控制位bit0-need_ack(是否需要ack) bit1-ack_pack(是否为ack包) bit2-7-预留
uint16_t Data_len; // 数据域字节长度低字节在前此处固定为1
uint16_t SEQ; // 帧序列(0~65535),低字节在前
uint8_t CMD_ID; // 命令ID此处固定为0x55
// 以下为DATA域对应偏移8开始长度=Data_len=1
uint8_t Ai_mode; // AI追踪模式0-关闭 1-开启
uint16_t CRC16; // 整个数据包的CRC16校验低字节在前
} SetAiTrackingModeFrame;
#pragma pack(pop)
/* 设置AI追踪目标坐标信息流状态完整通信帧联合体 - CMD_ID 0x55 */
typedef union {
SetAiTrackingModeFrame frame; // 按结构体访问各字段
uint8_t data[11]; // 按字节数组访问总长度2+1+2+2+1+1+2 = 11字节
} SetAiTrackingModeFrameUnion;
/* 请求当前云台模式数据结构体 - CMD_ID 0x19 */
#pragma pack(push, 1)
typedef struct {
uint16_t STX; // 帧起始标志固定为0x6655低字节在前实际存储为0x55 0x66
uint8_t CTRL; // 控制位bit0-need_ack(是否需要ack) bit1-ack_pack(是否为ack包) bit2-7-预留
uint16_t Data_len; // 数据域字节长度低字节在前此处固定为0无数据域
uint16_t SEQ; // 帧序列(0~65535),低字节在前
uint8_t CMD_ID; // 命令ID此处固定为0x19
// 以下为DATA域对应偏移8开始长度=Data_len=0无数据
uint16_t CRC16; // 整个数据包的CRC16校验低字节在前
} RequestCurrentPodModeFrame;
#pragma pack(pop)
/* 请求当前云台模式完整通信帧联合体 - CMD_ID 0x19 */
typedef union {
RequestCurrentPodModeFrame frame; // 按结构体访问各字段
uint8_t data[10]; // 按字节数组访问总长度2+1+2+2+1+0+2 = 10字节
} RequestCurrentPodModeFrameUnion;
/* 设置AI选择追踪目标数据结构体 - CMD_ID 0x56 */
#pragma pack(push, 1)
typedef struct {
uint16_t STX; // 帧起始标志固定为0x6655低字节在前实际存储为0x55 0x66
uint8_t CTRL; // 控制位bit0-need_ack(是否需要ack) bit1-ack_pack(是否为ack包) bit2-7-预留
uint16_t Data_len; // 数据域字节长度低字节在前此处固定为9
uint16_t SEQ; // 帧序列(0~65535),低字节在前
uint8_t CMD_ID; // 命令ID此处固定为0x51
// 以下为DATA域对应偏移8开始长度=Data_len=9
uint8_t track_action; // 追踪动作1-追踪目标 0-取消追踪
uint16_t touch_lx; // 点选x坐标范围为视频流分辨率的宽大小框选方框左上顶点x坐标
uint16_t touch_ly; // 点选y坐标范围为视频流分辨率的高大小框选方框左上顶点y坐标
uint16_t touch_rx; // 点选0框选方框右下顶点x坐标
uint16_t touch_ry; // 点选0框选方框右下顶点y坐标
uint16_t CRC16; // 整个数据包的CRC16校验低字节在前
} SetAiSelectTrackingTargetFrame;
#pragma pack(pop)
/* 设置AI选择追踪目标完整通信帧联合体 - CMD_ID 0x51 */
typedef union {
SetAiSelectTrackingTargetFrame frame; // 按结构体访问各字段
uint8_t data[19]; // 按字节数组访问总长度2+1+2+2+1+1+2+2+2+2+2 = 19字节
} SetAiSelectTrackingTargetUnion;
//-----IO口---------------------------------------------------------------
// 电压信号输出,到遥控器
@@ -990,9 +1251,28 @@ extern UnSdoOutput un_sdo_output ;//转向电机输出
extern uint8_t test_app[26];
extern ReceivedDataStruct mt11_received_data;
extern ReceivedDataStruct mt11_tx_data;
extern UnCanDebugOutput un_can_debug_output;//调试输出
//转台
extern GimbalStreamRequestFrameUnion gimbal_stream_request_output;//请求云台数据流
extern PhotoVideoControlFrameUnion photo_video_control_output ;//设置FPV模式
extern SetAiTrackingModeFrameUnion ai_track_mode_output ;//追踪模式
extern SetAiTrackTargetCoordinateUnion ai_track_coordinate_output ;//ai追踪信息流
extern RequestCurrentPodModeFrameUnion request_pod_mode_output ;//请求云台状态
extern SetAiSelectTrackingTargetUnion ai_select_track_target_output ;//设置ai追踪目标
extern StrTxCanFrame un_sdo_output1 ;//电机1输出
extern StrTxCanFrame un_sdo_output2 ;//电机2输出
extern StrTxCanFrame un_sdo_output3 ;//电机3输出
extern StrTxCanFrame un_sdo_output4 ;//电机4输出
extern StrTxCanFrame un_sdo_output5 ;//电机5输出
//函数
void canSendAll(void *signal_id);