diff --git a/README.md b/README.md index 9f8037a..6be3daf 100644 --- a/README.md +++ b/README.md @@ -135,3 +135,107 @@ make -C build/ -j$(nproc) ```bash ls -l /dev/gimbal ``` + +## 通信协议 + +### 1. CBoard 协议(CAN 总线) + +通过 SocketCAN 与 RoboMaster C 型开发板通信,CAN ID 由 yaml 配置。 + +**发送帧 — 控制命令(CAN ID: 0xff)** + +``` +8 bytes, Big-Endian +[0] : control (uint8) 0=不控制, 1=控制 +[1] : shoot (uint8) 0=不射击, 1=射击 +[2-3] : yaw (int16) 缩放 1e4, 单位 rad +[4-5] : pitch (int16) 缩放 1e4, 单位 rad +[6-7] : horizon_distance (int16) 缩放 1e4(无人机专有) +``` + +**接收帧1 — 四元数(CAN ID: 0x100 / 0x01)** + +``` +8 bytes, Big-Endian +[0-1] : x (int16) 缩放 1e4 +[2-3] : y (int16) 缩放 1e4 +[4-5] : z (int16) 缩放 1e4 +[6-7] : w (int16) 缩放 1e4 +四元数顺序: wxyz,验证 x²+y²+z²+w² ≈ 1 +``` + +**接收帧2 — 子弹速度和模式(CAN ID: 0x101 / 0x110)** + +``` +8 bytes, Big-Endian +[0-1] : bullet_speed (int16) 缩放 1e2, 单位 m/s +[2] : mode (uint8) 0=idle, 1=auto_aim, 2=small_buff, 3=big_buff, 4=outpost +[3] : shoot_mode (uint8) 0=left, 1=right, 2=both(哨兵专有) +[4-5] : ft_angle (int16) 缩放 1e4, 单位 rad(无人机专有) +``` + +### 2. Gimbal 协议(串口) + +通过 USB 串口与达妙 MC02 通信,帧头 `{'S', 'P'}`,CRC16 校验。 + +**发送帧 — VisionToGimbal(29 bytes, packed)** + +``` +[0-1] : head (uint8[2]) = {'S', 'P'} +[2] : mode (uint8) 0=不控制, 1=控制不开火, 2=控制且开火 +[3-6] : yaw (float) rad +[7-10] : yaw_vel (float) rad/s +[11-14] : yaw_acc (float) rad/s² +[15-18] : pitch (float) rad +[19-22] : pitch_vel (float) rad/s +[23-26] : pitch_acc (float) rad/s² +[27-28] : crc16 (uint16) Little-Endian +``` + +**接收帧 — GimbalToVision(43 bytes, packed)** + +``` +[0-1] : head (uint8[2]) = {'S', 'P'} +[2] : mode (uint8) 0=IDLE, 1=AUTO_AIM, 2=SMALL_BUFF, 3=BIG_BUFF +[3-6] : q[0] (float) 四元数 w +[7-10] : q[1] (float) 四元数 x +[11-14] : q[2] (float) 四元数 y +[15-18] : q[3] (float) 四元数 z +[19-22] : yaw (float) rad +[23-26] : yaw_vel (float) rad/s +[27-30] : pitch (float) rad +[31-34] : pitch_vel (float) rad/s +[35-38] : bullet_speed (float) m/s +[39-40] : bullet_count (uint16) 子弹累计发射次数 +[41-42] : crc16 (uint16) Little-Endian +``` + +### 3. DM IMU 协议(串口) + +达妙 IMU,串口 921600 bps,Modbus RTU 格式,57 bytes 三帧合一。 + +``` +帧1 [0-18] : 加速度 (accx, accy, accz) float, CRC16 +帧2 [19-37] : 角速度 (gyrox, gyroy, gyroz) float, CRC16 +帧3 [38-56] : 欧拉角 (roll, pitch, yaw) float, 单位°, CRC16 + +每帧结构: 帧头(0x55 0xAA) + slave_id(0x01) + reg + 3×float(uint32) + crc16 + 帧尾 +四元数由 ZYX 欧拉角生成: q = Rz(yaw) * Ry(pitch) * Rx(roll) +``` + +### 4. ROS2 通信(哨兵专有) + +| 方向 | 话题 | 消息类型 | 内容 | +|------|------|----------|------| +| 发布 | `auto_aim_target_pos` | `std_msgs/String` | CSV: "x,y,z,w" | +| 订阅 | `enemy_status` | `sp_msgs/EnemyStatusMsg` | 无敌敌人 ID 列表 | +| 订阅 | `autoaim_target` | `sp_msgs/AutoaimTargetMsg` | 目标敌人 ID 列表 | + +### 5. 协议总览 + +| 协议 | 接口 | 速率 | 帧长 | 校验 | 适用设备 | +|------|------|------|------|------|----------| +| CBoard | CAN | 1Mbps | 8B | — | C 板 (STM32F407) | +| Gimbal | 串口 | 可配置 | 29/43B | CRC16 | 达妙 MC02 (STM32H7) | +| DM IMU | 串口 | 921600 | 57B | CRC16 | 达妙 IMU | +| ROS2 | TCP/IP | — | 可变 | — | 导航系统 |