依赖与架构准备

This commit is contained in:
2026-03-22 19:42:38 +08:00
commit 338ca9d2b7
18 changed files with 7304 additions and 0 deletions

310
docs/IMU/command.md Normal file
View File

@@ -0,0 +1,310 @@
# FDILink指令配置示例
## 进入配置模式
```uart
#fconfig\r\n
```
## 滤波器开关配置示例——将3D磁力计的融合开关打开
```uart
#fconfig\r\n // 1. 进入配置模式
#fparam get AID_MAG_V_MAGNETIC\r\n // 2. 获取当前滤波器状态
#fparam set AID_MAG_V_MAGNETIC 1\r\n // 3. 设置3D磁辅助为打开状态
#fsave\r\n // 4. 保存设置
#freboot\r\n // 5. 重启设备
```
## 将COM2 改成NMEA(OUT) 协议
```uart
#fparam get AID_GNSS_VEL_UPDATE\r\n
#fparam get MAG_GEOMAGFIELD_B\r\n
#fconfig\r\n
#fdeconfig\r\n
#fsave\r\n
#freboot\r\n
y\r\n
#fconfig\r\n
```
## 设置端口1的类型为MAIN
```uart
#fparam set COMM_STREAM_TYP1 1\r\n
```
## 设置端口4的类型为NONE
```uart
#fparam set COMM_STREAM_TYP4 0\r\n
```
## 波特率修改配置
```uart
#fimucal_gyro\r\n
#fmagcal3d\r\n
#faxis\r\n
#fmsg 40 100\r\n
#fmsg\r\n
#fante\r\n
```
```c
Stream_TxBlock(stream, "UNLOG\r\n", strlen("UNLOG\r\n"));
// Stream_TxBlock(stream, "GPGGA 1\r\n", strlen("GPGGA 1\r\n")); //增加NMEA解析数据会有2-3s延迟 字符形式解析慢
Stream_TxBlock(stream, "AGRICB 0.1\r\n", strlen("AGRICB 0.1\r\n"));
Stream_TxBlock(stream, "LOG PSRDOPB ONCHANGED\r\n", strlen("LOG PSRDOPB ONCHANGED\r\n"));
Stream_TxBlock(stream, "LOG PSRVELB ONTIME 0.1\r\n", strlen("LOG PSRVELB ONTIME 0.1\r\n"));
// Stream_TxBlock(stream, "LOG PSRPOSB ONTIME 0.1\r\n", strlen("LOG PSRPOSB ONTIME 0.1\r\n"));
Stream_TxBlock(stream, "LOG HEADINGB ONTIME 0.1\r\n", strlen("LOG HEADINGB ONTIME 0.1\r\n"));
// Stream_TxBlock(stream, "LOG BESTXYZB ONTIME 0.1\r\n", strlen("LOG BESTXYZB ONTIME 0.1\r\n"));
```
## fconfig指令
| 属性 | 内容 |
|:---|:---|
| **命令** | **#fconfig** |
| 说明 | 使导航设备由导航模式进入配置模式,配置模式下设备不再进行导航也不输出数据。所有配置命令仅在配置模式下有效。配置完成后请保存,否则已配置项不会保存和生效 |
| 格式 | `#fconfig<CR><LF>` |
| 需要确认 | 否 |
| 重启生效 | 否 |
| 示例 | 输入:`#fconfig` — 导航设备停止输出导航结果,并输出: `#OK` |
## fdeconfig指令
| 属性 | 内容 |
|:---|:---|
| **命令** | **#fdeconfig** |
| 说明 | 使导航设备由配置模式恢复导航模式 |
| 格式1 | `#fdeconfig<CR><LF>` |
| 需要确认 | 否 |
| 重启生效 | 否 |
| 示例 | 输入:`#fdeconfig` — 导航设备重新输出导航数据 |
| 回复 | `*#OK` — 成功进入导航模式 |
## freboot
| 属性 | 内容 |
|:---|:---|
| **命令** | **#freboot** |
| 说明 | 重新热启动设备 |
| 格式 | `#freboot` |
| 需要确认 | 是 |
| 重启生效 | 否 |
| 示例 | 输入`#freboot`,设备重新热启动 |
| 备注 | 重新启动时所有未保存的设置将不会保存,也不会生效。重新启动命令不会重启 gnss 模组 |
## freset
| 属性 | 内容 |
|:---|:---|
| **命令** | **#freset** |
| 说明 | 将配置恢复到出厂初始值,恢复出厂配置后用户配置将全部清除,固件版本保持不变 |
| 格式 | `#freset` |
| 需要确认 | 是 |
| 重启生效 | 否 |
| 示例 | `#freset` |
| 备注 | 通过上位机的参数导出按钮可以将重置之前的用户配置保存下来 |
## fsave
| 属性 | 内容 |
|:---|:---|
| **命令** | **#fsave** |
| 说明 | 配置保存 |
| 格式 | `#fsave` |
| 需要确认 | 否 |
| 重启生效 | 否 |
| 示例 | `#fsave` |
| 备注 | 几乎所有的配置更改后都需要执行配置保存操作,这样重启后才能保证配置生效 |
## fante
| 属性 | 内容 |
|:---|:---|
| **命令** | **#fante** |
| 说明 | 配置双天线航向与载体前向夹角 |
| 格式1 | `#fante<CR><LF>` — 查询GNSS天线配置信息双天线航向偏角、双天线基线长度、天线杆臂 |
| 格式2 | `#fanteheadbias angle<CR><LF>` — 其中 angle 为角度值,值域在 0 至 360°间 |
| 格式3 | `#fantebaseline length<CR><LF>` — 配置双天线之间基线的长度length单位为米m |
| 格式4 | `#fantearm x y z<CR><LF>` — 配置GNSS主天线到IMU的杆臂命令 |
| 示例 | 将双天线航向与载体前向夹角设置为 270 度:<br>输入:`#fanteheadbias 270.0`<br>输出:`*#OK` |
| 备注 | 定义主天线到从天线为基线矢量正方向从IMU正上方看去顺时针为天线航向偏角的正方向 |
## fimucal
| 属性 | 内容 |
|:---|:---|
| **命令** | **#fimucal** |
| 说明 | 校准陀螺仪、加表的常值零偏以及调平 |
| 格式1 | `#fimucal_level<CR><LF>` — 将IMU坐标系调平至水平面不改变陀螺和加表零偏 |
| 格式2 | `#fimucal_acce<CR><LF>` — 执行加速度计零偏校准 |
| 格式3 | `#fimucal_gyro<CR><LF>` — 执行陀螺仪零偏校准 |
| 需要确认 | 否 |
| 重启生效 | 是 |
| 示例 | 输入`#fimucal_level`IMU调平校准 |
| 备注 | **注意!** 格式1和格式2需要在水平静止状态下执行该命令格式3只需要模块保持静止 |
## fmsg
| 属性 | 内容 |
|:---|:---|
| **命令** | **#fmsg** |
| 说明 | 配置发送的数据内容 |
| 格式1 | `#fmsg` — 查询当前数据包信息。显示内容包括所有支持的数据包以及数据包ID以及其发送频率 |
| 格式2 | `#fmsg msg freq` — msg为2位十六进制数字表示数据包IDfreq为设置指定数据包的发送频率 |
| 需要确认 | 否 |
| 重启生效 | 是 |
| 示例 | 输入:`#fmsg 40 100`表示IMU数据以100Hz的频率发送<br>输出:`IMU [40] 100.0Hz`表示IMU数据已经设置为100Hz的发送频率 |
## fparam
| 属性 | 内容 |
|:---|:---|
| **命令** | **#fparam** |
| 说明 | 读取或配置参数 |
| 格式1 | `#fparam get paramName` — paramName 需要获取的参数名称 |
| 格式2 | `#fparam set paramName paramValue` — paramName需要设置的参数名称paramValue参数的数值十进制 |
| 需要确认 | 否 |
| 重启生效 | 是 |
| **配置说明1串口波特率配置** | paramName的值和paramValue的值见表1 (DETA系列) 和表2 (EPSILON系列)默认配置中COMM_BAUD1 (端口1) 的波特率被设置为921600bps |
| **示例1** | 输入:`#fparam get COMM_BAUD2\r\n`<br>输出:`COMM_BAUD2=5`表示现在端口2为 115200bps<br>输入:`#fparam set COMM_BAUD2 8\r\n`<br>输出:`*#OK`表示成功将端口2改为921600bps |
| **备注1** | 默认端口1配置为Main协议若端口1配置为其它波特率则保存重启后波特率也需要重新选择同时**强烈不建议**将Main协议端口的波特率设置在115200bps以下 |
| **配置说明2滤波开关配置** | 除了在上位机配置滤波器开关外用户同样可以使用串口指令进行配置paramName的值可见表3相应的paramValue为0或者10表示关闭1表示打开 |
| **示例2** | 输入:`#fparam get AID_MAG_2D_MAGNETIC\r\n`<br>输出:`AID_MAG_2D_MAGNETIC=1`表示磁力计2D辅助开关是打开的<br>输入:`#fparam set AID_MAG_2D_MAGNETIC 0\r\n`<br>输出:`*#OK`,表示不使用磁力计进行融合 |
| **备注2** | 滤波开关的配置最好在测试前进行,测试中对滤波开关进行配置可能会破坏滤波器的稳定,容易导致位姿的突变与发散 |
| **配置说明3传感器参数修改** | 用户可以使用串口指令查看或者修改位于上位机 Onboard Parameters里的所有传感器参数包含imu参数、GNSS参数、DEBUG参数等等 |
| **示例3** | 输入:`#fparam get IMU_ACC_AVG\r\n`<br>输出:`IMU_ACC_AVG=9.794700`表示当地重力加速度计为9.794700m/s²<br>输入:`#fparam get GNSS_MIN_VACC\r\n`<br>输出:`GNSS_MIN_VACC=2.500000`表示当GNSS垂直方向的精度小于2.5m这个阈值时才会使用GNSS进行组合导航<br>输入:`#fparam set GNSS_MIN_VACC 0.1\r\n`<br>输出:`*#OK`表示成功将GNSS垂直方向的阈值设置为0.1m这在客户使用RTK高精度组合导航时是有用的可以防止在GNSS信号变差时对系统造成一定的负面影响 |
| **备注3** | 传感器参数的修改一般只用于FDISYSTEMS研发人员的调试阶段除非用户对该领域很熟悉否则不建议自行修改 |
| **配置说明4端口协议配置** | 端口协议除了在上位机配置外还能使用串口指令进行配置端口协议见表4常用的端口协议为Main、NAV、RTCM、NMEA和Ublox |
| **示例4** | 输入:`#fparam get COMM_STREAM_TYP1\r\n`<br>输出:`COMM_STREAM_TYP1=1`表示端口1配置为Main协议<br>输入:`#fparam set COMM_STREAM_TYP2 2\r\n`<br>输出:`*#OK`表示将端口2配置为NAV协议即可以通过端口2获取FDILink协议的数据此时用户通过端口1或端口2均能获取数据此外端口1还能连接上位机便于实时调试<br>输入:`#fparam set COMM_STREAM_TYP3 6\r\n`<br>输出:`*#OK`表示将端口3配置为Ublox模式如果端口3有接收到Ublox类型的数据保存重启后即可实现GPS/INS组合导航 |
| **备注4** | 上述所有配置内容都需要`#fsave`保存,否则重新上电后失效;<br>此外所有端口中必须有一个配置为Main协议只有该端口可以连接上位机 |
## fmagcal2d
| 属性 | 内容 |
|:---|:---|
| **命令** | **#fmagcal2d** |
| 说明 | 磁力计2d校准指令输入完成后用户在平面上沿模块中心缓慢旋转一周后完成校准完成后自动保存校准数据并退出当前的配置模式 |
| 格式1 | `#fmagcal2d` |
| 需要确认 | 否 |
| 重启生效 | 是 |
| 示例 | 输入:`#fmagcal2d\r\n`<br>输出:`*#OK`表示可以开始进行2d校准<br>输出:`This is a magnetometer 2D calibration. Please wait until the magnetometer progress bar reaches 100 percent Now: 0 percent`<br>表示2D校准的实时进度刷新频率为1HZ。当进度到达100 percent表示校准成功系统将立即退出当前配置模式重新发送FDILink数据 |
## fmagcal3d — 3D磁校准指令
| 属性 | 内容 |
|:---|:---|
| **命令** | **#fmagcal3d** |
| 说明 | 磁力计3d校准指令输入完成后用户在空中缓慢画8字进行校准完成后自动保存校准数据退出当前的配置模式 |
| 格式1 | `#fmagcal3d` |
| 需要确认 | 否 |
| 重启生效 | 是 |
| 示例 | 输入:`#fmagcal3d\r\n`<br>输出:`*#OK`表示可以开始进行3d校准<br>输出:<br>`This is a magnetometer 3D calibration.`<br>`The fitting error of the current calculation: xxx`<br>`Calibration Algorithm: xxx`<br>表示3D校准的实时状态刷新频率为1HZ。"The fitting error of the current calculation : xxx"表示当前计算的拟合误差,参数类型为单精度浮点数类型。"Calibration Algorithm: xxx"表示的是校准算法等级参数等级分为Low, Mid, High三种。当计算的拟合误差小于3.000f并算法等级等于High时表示校准成功系统将立即退出当前配置模式即重新发送FDILink数据 |
## fdgnss
| 属性 | 内容 |
|:---|:---|
| **命令** | **#fdgnss** |
| 说明 | 读取或配置上位机DGNSS栏参数 |
| 格式1 | `#fdgnss get gnssName`<br>gnssName 需要获取的参数名称,包含:<br>`RTCM_TYPE` — 发送或接收RTCM的方式<br>`NET_INFO_IMEI` — SIM卡的IMEI信息无法配置<br>`NET_INFO_CCID` — SIM卡的CCID信息无法配置<br>`NTRIP_SVR_DOMAIN` — Ntrip的IP地址<br>`NTRIP_SVR_PORT` — Ntrip的IP端口<br>`NTRIP_MOUNT` — Ntrip的挂载点<br>`NTRIP_ACCOUNT` — Ntrip账号<br>`NTRIP_PASSWORD` — Ntrip密码<br>`FDI_AUTH` — FDI云鉴权码 |
| 格式2 | `#fdgnss set gnssName gnssValue`<br>gnssName 需要设置的参数名称<br>gnssValue 参数的数值,十进制<br><br>**RTCM_TYPE参数特殊定义**<br>• 0 — Radio<br>• 1 — 千寻位置SDK<br>• 2 — Ntrip配置<br>• 3 — FDI云<br><br>其余gnssValue无特殊定义 |
| 需要确认 | 否 |
| 重启生效 | 是 |
| 示例1 | 输入:`#fdgnss get NTRIP_SVR_PORT\r\n`<br>输出:`NTRIP_SVR_PORT8002`表示Ntrip的IP端口为8002 |
| 示例2 | **完整配置NTRIP账号过程**<br>1. 输入:`#fdgnss set RTCM_TYPE 3\r\n` → 输出:`*#OK`切换为NTRIP配置<br>2. 输入:`#fdgnss set NTRIP_SVR_DOMAIN xxx.xxx.xx.xxx\r\n` → 输出:`*#OK`IP配置成功<br>3. 输入:`#fdgnss set NTRIP_SVR_PORT 8002\r\n` → 输出:`*#OK`端口配置为8002<br>4. 输入:`#fdgnss set NTRIP_MOUNT RTCM32_GGB\r\n` → 输出:`*#OK`挂载点配置为RTCM32_GGB<br>5. 输入:`#fdgnss set NTRIP_ACCOUNT qxx1234\r\n` → 输出:`*#OK`账号配置为qxx1234<br>6. 输入:`#fdgnss set NTRIP_PASSWORD 12345678\r\n` → 输出:`*#OK`密码配置为12345678 |
| 备注 | 上述所有配置内容都需要`#fsave`保存,否则重新上电后失效 |
## 附录表格
### 表1DETA 系列v2端口波特率配置说明
| paramName | 端口说明 | paramValue | 对应波特率 |
|:---|:---|:---:|:---|
| COMM_BAUD1 | UART, TTL电平, 设置范围9600bps-921600bps | 1 | 9600bps |
| | | 2 | 19200bps |
| | | 3 | 38400bps |
| COMM_BAUD2 | UART, TTL电平, 设置范围9600bps-921600bps | 4 | 76800bps |
| | | 5 | 115200bps |
| | | 6 | 230400bps |
| COMM_BAUD3 | UART, TTL电平, 设置范围9600bps-921600bps | 7 | 460800bps |
| | | 8 | 921600bps |
| | | 9 | 2625000bps |
| COMM_BAUD4 | UART, TTL电平, 设置范围9600bps-921600bps | 10 | 5250000bps |
| | | 11 | 10500000bps |
| | | 12 | 100000bps |
| COMM_BAUD5 | CAN, 可设置波特率为250000bps、500000bps、1000000bps | 13 | 250000bps |
| | | 14 | 500000bps |
| | | 15 | 1000000bps |
### 表2EPSILON系列端口波特率配置说明
| paramName | 端口说明 | paramValue | 对应波特率 |
|:---|:---|:---:|:---|
| COMM_BAUD1 | RS232设置范围9600bps-921600bps | 1 | 9600bps |
| | | 2 | 19200bps |
| | | 3 | 38400bps |
| COMM_BAUD2 | RS232设置范围9600bps-921600bps | 4 | 76800bps |
| | | 5 | 115200bps |
| | | 6 | 230400bps |
| COMM_BAUD3 | RS422设置范围9600bps-921600bps | 7 | 460800bps |
| | | 8 | 921600bps |
| | | 9 | 2625000bps |
| COMM_BAUD4 | GPIO TTL设置范围9600bps-921600bps | 10 | 5250000bps |
| | | 11 | 10500000bps |
| | | 12 | 100000bps |
| COMM_BAUD5 | CAN可设置波特率为250000bps、500000bps、1000000bps | 13 | 250000bps |
| | | 14 | 500000bps |
| | | 15 | 1000000bps |
### 表3SPKF融合开关说明
| paramName | 说明 |
|:---|:---|
| AID_ACCEL_GRAVITY | 加速度计融合开关 |
| AID_BRO_ALT_UPDATE | 气压计融合开关 |
| AID_CAR_CENT_ACCEL_NHC_ENABLED | 汽车向心加速度补偿开关 |
| AID_CAR_YZ_ZERO_VEL_NHC_ENABLED | 汽车零速更新开关 |
| AID_EXT_HEADING_UPDATE | 外部航向输入开关 |
| AID_GNSS_POS_UPDATE | GNSS 位置融合开关 |
| AID_GNSS_TRACK_HEADING_UPDATE | GNSS 航迹角融合开关 |
| AID_GNSS_VEL_UPDATE | GNSS 速度融合开关 |
| AID_GYO_TURN_ON_TARE_ENABLED | 开机时静态陀螺零偏估计开关 |
| AID_INIT_YAW_USE_MAG | 磁力计初始化航向角开关 |
| AID_MAG_2D_MAGNETIC | 磁航向融合开关 |
| AID_MAG_3D_MAGNETIC | 磁矢量融合开关 |
| AID_ODOMETER_VEL_UPDATE | 里程计融合开关 |
| AID_OPTICFLOW_UPDATE | 光流计融合开关 |
| AID_ZERO_POS_UPDATE | 零位置更新开关 |
| AID_ZERO_RATE_UPDATE | 零角速度更新开关 |
| AID_ZERO_VEL_UPDATE | 零速度更新 |
### 表4端口协议类型与说明
| paramName | 端口协议 | 说明 | paramValue |
|:---|:---|:---|:---:|
| **COMM_STREAM_TYP(1-5)** | **None** | 空 | 0 |
| | **Main** | 主协议导航数据收发和连接上位机通过0xF0切换模式 | 1 |
| | **NAV** | 导航模式,收发 | 2 |
| | **RTCM** | 接收差分修正数据v3版D3 00开头 | 3 |
| | **NMEA** | 接收NMEA格式数据 | 4 |
| | **NMEA(OUT)** | 导航输出NMEA格式数据 | 5 |
| | **Ublox** | 接收UBX格式数据 | 6 |
| | **External Position** | 接收外部位置数据 | 7 |
| | **External Velocity** | 接收外部速度数据 | 8 |
| | **External Position&Velocity** | 接收外部位置和速度数据 | 9 |
| | **External Attitude angle** | 接收外部姿态数据 | 10 |
| | **External Time** | 接收外部时间数据 | 11 |
| | **External Heading** | 接收外部航向数据 | 12 |
| | **External Depth** | 接收外部深度数据 | 13 |
| | **External SLAM1** | 接收外部slam1数据 | 14 |
| | **External SLAM2** | 接收外部slam2数据 | 15 |
| | **External Pitot Pressure** | 接收外部气压计数据 | 16 |
| | **External Air speed** | 接收外部空速数据 | 17 |
| | **External Odom** | 接收外部里程计数据 | 18 |
| | **External LIDAR** | 接收外部雷达数据 | 19 |

81
docs/IMU/packet.md Normal file
View File

@@ -0,0 +1,81 @@
# Data Packets
FDILink 数据包提供广泛的功能。fdilink 主要数据包包含两类 **State Packets** 可以读取相关的系统状态以及导航数据。
这些包可以通过上位机配置后让导航系统按照一定频率主动发送,也可以通过 **Request Packets** 请求发送对应的 State Packets。
## State Packets
| Packet ID | Name | Description | Length | R/W |
|--- |--- |--- |--- |--- |
| 39 | MSG_VERSION | 版本信息 | 26 | R |
| 40 | MSG_IMU | IMU传感器数据 | 56 | R |
| 41 | MSG_AHRS | 航姿参考系统数据 | 48 | R |
| 42 | MSG_INS_GPS | 组合导航输出数据 | 72 | R |
| 50 | MSG_SYS_STATE | 组合导航系统数据 | 100 | R |
| 51 | MSG_UNIX_TIME | 系统UNIX时间 | 8 | R |
| 52 | MSG_FORMAT_TIME | 系统格式时间 | 14 | R |
| 53 | MSG_STATUS | 系统状态和滤波器状态 | 4 | R |
| 54 | MSG_POS_STD_DEV | 卡尔曼滤波P矩阵的位置标准差 | 12 | R |
| 55 | MSG_VEL_STD_DEV | 卡尔曼滤波P矩阵的速度标准差 | 12 | R |
| 56 | MSG_EULER_ORIEN_STD_DEV | 卡尔曼滤波P矩阵的姿态角标准差 | 12 | R |
| 57 | MSG_QUAT_ORIEN_STD_DEV | 卡尔曼滤波P矩阵的四元数标准差 | 16 | R |
| 58 | MSG_RAW_SENSORS | 原始IMU传感器数据 | 48 | R |
| 59 | MSG_RAW_GNSS | 原始GNSS数据 | 74 | R |
| 5A | MSG_SATELLITE | 卫星简要信息 | 9 | R |
| 5B | MSG_DETAILED_SATELLITE | 卫星详细信息 | X | R |
| 5C | MSG_GEODETIC_POS | 卡尔曼滤波融合的经纬高数据 | 32 | R |
| 5D | MSG_ECEF_POS | 卡尔曼滤波融合的ECEF系坐标数据 | 24 | R |
| 5E | MSG_UTM_POS | 卡尔曼滤波融合的UTM坐标数据 | 14 | R |
| 5F | MSG_NED_VEL | 卡尔曼滤波融合的北东地速度 | 12 | R |
| 60 | MSG_BODY_VEL | 卡尔曼滤波融合的机体系XYZ速度 | 12 | R |
| 61 | MSG_ACCELERATION | 滤波修正后的机体系加速度 | 12 | R |
| 62 | MSG_BODY_ACCELERATION | 滤波修正后的机体系加速度-不含重力 | 16 | R |
| 63 | MSG_EULER_ORIEN | 卡尔曼滤波融合的欧拉角 | 12 | R |
| 64 | MSG_QUAT_ORIEN | 卡尔曼滤波融合的四元数 | 16 | R |
| 65 | MSG_DCM_ORIEN | 方向余弦矩阵 | 36 | R |
| 66 | MSG_ANGULAR_VEL | 滤波修正后的IMU角速度数据 | 12 | R |
| 67 | MSG_ANGULAR_ACC | 卡尔曼滤波估计的IMU角加速度 | 12 | R |
| 6D | MSG_RUNNING_TIME | 系统运行时长 | 8 | R |
| 6E | MSG_LOCAL_MAG_FIELD | 磁传感器相关数据 | 24 | R |
| 6F | MSG_ODOMETER_STATE | 系统解算后里程计相关数据 | 18 | R |
| 72 | MSG_GEOID_HEIGHT | 卡尔曼滤波融合的大地高度 | 4 | R |
| 75 | MSG_WIND | 系统解算后的风速 | 12 | R |
| 76 | MSG_HEAVE | 船舶海浪升沉相关数据 | 16 | R |
| 77 | MSG_RAW_SATELLITE | 原始星历数据 | X | R |
| 78 | MSG_GNSS_DUAL_ANT | GNSS双天线原始数据 | 134 | R |
| 7A | MSG_GIMBAL_STATE | 云台数据 | 8 | R |
| 7B | MSG_AUTOMOTIVE | 车载相关数据 | 24 | R |
| 80 | MSG_INSTALL_ALIGN | 系统安装偏移数据 | 45 | R |
| 81 | MSG_FILTER_OPTIONS | 卡尔曼滤波器使能状态 | 12 | R |
| 82 | MSG_GPIO_CONFIG | GPIO配置状态 | 5 | R |
| 83 | MSG_MAG_CALI_VALUES | 磁力计校准参数 | 49 | R |
| 84 | MSG_MAG_CALI_CONFIG | 磁校准方式 | 1 | R |
| 85 | MSG_MAG_CALI_STATUS | 磁校准状态 | 3 | R |
| 88 | MSG_REF_POINT_OFFSET | 船载参考点映射偏移量 | 49 | R |
| A0 | MSG_BAUD_RATES | 端口的波特率配置状态 | 25 | R |
| A1 | MSG_SENSOR_RANGES | 传感器量程 | 6 | R |
### 外部可写入指令数据帧
| Packet ID | Name | Description | Length | R/W |
|--- |--- |--- |--- |--- |
| 68 | MSG_EXT_PV | 外部输入速度和位置数据 | 60 | W |
| 69 | MSG_EXT_POS | 外部输入位置数据 | 36 | W |
| 6A | MSG_EXT_VEL | 外部输入NED速度数据 | 24 | W |
| 6B | MSG_EXT_BODY_VEL | 外部输入机体系速度数据 | 24 | W |
| 6C | MSG_EXT_HEADING | 外部输入航向数据 | 8 | W |
| 70 | MSG_EXT_TIME | 外部输入时钟数据 | 8 | W |
| 71 | MSG_EXT_DEPTH | 外部输入深度数据 | 8 | W |
| 73 | MSG_RTCM_CORRECTIONS | 外部输入RTCM校准数据流 | X | W |
| 74 | MSG_EXT_PITOT_PRESS | 外部输入皮托管气压数据 | 8 | W |
| 79 | MSG_EXT_AIR | 外部输入空速数据 | 25 | W |
| 90 | MSG_EXT_ODOM | 外部输入里程计数据 | 21 | W |
| 91 | MSG_EXT_SLAM1 | 外部输入SLAM1格式数据 | 72 | W |
| 94 | MSG_EXT_DVL | 外部输入多普勒计程仪数据 | 29 | W |
## Request Packets
| Packet ID | Name | Description | Length | R/W |
|--- |--- |--- |--- |--- |
| A0 | MSG_REQUEST_PACKET | 数据帧请求格式 | X | W |

140
docs/IMU/protocol.md Normal file
View File

@@ -0,0 +1,140 @@
# 数据类型
有以下数据类型被在通信协议中使用。 协议中的数据类型都是 **小端序**
## 数据帧组成
| | 帧头 | 帧头 | 帧头 | 帧头 | 帧头 | 数据区 | 数据区 | 帧尾 |
|--- |--- |--- |--- |--- |--- |--- |--- |--- |
| | 起始 | 指令类别 | 数据长度 | 流水序号 | 帧头CRC8 | 数据CRC16 | 载荷 | 结束 |
| 字节数 | 1 | 1 | 1 | 1 | 1 | 2 | 1-255 | 1 |
| 数值 | 0xFC | **A** | **B** | **C** | **D** | 高字节(E), 低字节(E) || 0xFD |
- **A**: 指令的类别,如下表所示
| 指令类别 | | |
|---|---|---|
| 0x40 | 经过校准的IMU数据 | MSG_IMU |
| 0x41 | AHRS数据 | MSG_AHRS |
| 0x42 | INS/GPS数据 | MSG_INS/GPS |
| 0x58 | 传感器原始数据 | MSG_RAW_GNSS |
- **B**: 载荷的字节数
- **C**: 流水号,每发送一个数据帧数值加一,用于检测数据帧丢包
- **D**: 帧头CRC8校验计算帧头部分起始标志 + 指令类别 + 数据长度 + 流水序号)
- **E**: 数据CRC16校验计算载荷数据的CRC16校验
- **F**: 0xF0 是上位机心跳请求
## CRC8校验
CRC 8校验位标志位 + 指令类别 + 数据长度 + 流水序号
CRC 8校验程序如下
```c
static const uint8_t CRC8Table[] = {
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
};
uint8_t CRC8_Table(uint8_t* p, uint8_t counter)
{
uint8_t crc8 = 0;
for (int i = 0; i < counter; i++)
{
uint8_t value = p[i];
uint8_t new_index = crc8 ^ value;
crc8 = CRC8Table[new_index];
}
return (crc8);
}
```
CRC8 校验程序调用举例:
```c
uint8_t CRC8 = CRC8_Table(data, data_len);
```
## CRC16校验
CRC 16校验载荷
CRC 16校验程序如下
```c
static const uint16_t CRC16Table[256] =
{
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
};
uint16_t CRC16_Table(uint8_t* p, uint8_t counter)
{
uint16_t crc16 = 0;
for (int i = 0; i < counter; i++)
{
uint8_t value = p[i];
crc16 = CRC16Table[((crc16 >> 8) ^ value) & 0xff] ^ (crc16 << 8);
}
return (crc16);
}
```
CRC16 校验程序调用举例:
```c
uint16_t CRC16 = CRC16_Table(payload, length);
```
## AN数据帧定义与自定义CAN_ID
打开 FDIGroundStation 上位机,连接设备后将 COMM 板块的 CAN 数据输出口设置为 **NAV** 选项后用户即可通过CAN获取数据输出数据帧定义与FDILink协议一致如下表所示。
| | 帧头 | 帧头 | 帧头 | 帧头 | 帧头 | 数据区 | 数据区 | 帧尾 |
|--- |--- |--- |--- |--- |--- |--- |--- |--- |
| | 起始 | 指令类别 | 数据长度 | 流水序号 | 帧头CRC8 | 数据CRC16 | 载荷 | 结束 |
| 字节数 | 1 | 1 | 1 | 1 | 1 | 2 | 1-255 | 1 |
| 数值 | 0xFC | **A** | **B** | **C** | **D** | 高字节(E), 低字节(E) || 0xFD |

91
docs/RefreeSys/packet.md Normal file
View File

@@ -0,0 +1,91 @@
# RoboMaster 2026 机甲大师高校系列赛通信协议
**版本**: V1.2.0
**发布日期**: 2026年02月
---
## 1. 串口协议
### 1.1 串口协议格式
通信方式为串口,配置为:
- **常规链路波特率**: 115200
- **图传链路波特率**: 921600
- **数据位**: 8位
- **停止位**: 1位
- **硬件流控**: 无
- **校验位**: 无
#### 表 1-1 通信协议格式
| 字段 | 长度 | 说明 |
|:---|:---:|:---|
| frame_header | 5-byte | 帧头 |
| cmd_id | 2-byte | 命令码 |
| data | n-byte | 数据 |
| frame_tail | 2-byte | CRC16 整包校验 |
#### 表 1-2 frame_header 格式
| 字段 | 长度 | 说明 |
|:---|:---:|:---|
| SOF | 1-byte | 起始字节 |
| data_length | 2-byte | 数据长度 |
| seq | 1-byte | 包序号 |
| CRC8 | 1-byte | 帧头 CRC8 校验 |
#### 表 1-3 帧头详细定义
| 域 | 偏移位置 | 大小(字节) | 详细描述 |
|:---|:---:|:---:|:---|
| SOF | 0 | 1 | 数据帧起始字节,固定值为 0xA5 |
| data_length | 1 | 2 | 数据帧中 data 的长度 |
| seq | 3 | 1 | 包序号 |
| CRC8 | 4 | 1 | 帧头 CRC8 校验 |
> **数据链路说明**: 裁判系统串口数据链路有三种:**常规链路**、**图传链路**、**雷达无线链路**。
---
### 1.2 命令码 ID 和常规链路数据说明
#### 表 1-4 命令码 ID 一览
| 命令码 | 数据段长度 | 说明 | 发送方/接收方 | 所属数据链路 |
|:---|:---:|:---|:---|:---:|
| 0x0001 | 11 | 比赛状态数据,固定以 1Hz 频率发送 | 服务器→全体机器人 | 常规链路 |
| 0x0002 | 1 | 比赛结果数据,比赛结束触发发送 | 服务器→全体机器人 | 常规链路 |
| 0x0003 | 16 | 机器人血量数据,固定以 3Hz 频率发送 | 服务器→全体机器人 | 常规链路 |
| 0x0101 | 4 | 场地事件数据,固定以 1Hz 频率发送 | 服务器→己方全体机器人 | 常规链路 |
| 0x0104 | 3 | 裁判警告数据,己方判罚/判负时触发发送,其余时间以 1Hz 频率发送 | 服务器→被判罚方全体机器人 | 常规链路 |
| 0x0105 | 3 | 飞镖发射相关数据,固定以 1Hz 频率发送 | 服务器→己方全体机器人 | 常规链路 |
| 0x0201 | 13 | 机器人性能体系数据,固定以 10Hz 频率发送 | 主控模块→对应机器人 | 常规链路 |
| 0x0202 | 14 | 实时底盘缓冲能量和射击热量数据,固定以 10Hz 频率发送 | 主控模块→对应机器人 | 常规链路 |
| 0x0203 | 16 | 机器人位置数据,固定以 1Hz 频率发送 | 主控模块→对应机器人 | 常规链路 |
| 0x0204 | 8 | 机器人增益和底盘能量数据,固定以 3Hz 频率发送 | 服务器→对应机器人 | 常规链路 |
| 0x0206 | 1 | 伤害状态数据,伤害发生后发送 | 主控模块→对应机器人 | 常规链路 |
| 0x0207 | 7 | 实时射击数据,弹丸发射后发送 | 主控模块→对应机器人 | 常规链路 |
| 0x0208 | 6 | 允许发弹量,固定以 10Hz 频率发送 | 服务器→己方英雄、步兵、哨兵、空中机器人 | 常规链路 |
| 0x0209 | 5 | 机器人 RFID 模块状态,固定以 3Hz 频率发送 | 服务器→己方装有 RFID 模块的机器人 | 常规链路 |
| 0x020A | 6 | 飞镖选手端指令数据,固定以 3Hz 频率发送 | 服务器→己方飞镖机器人 | 常规链路 |
| 0x020B | 40 | 地面机器人位置数据,固定以 1Hz 频率发送 | 服务器→己方哨兵机器人 | 常规链路 |
| 0x020C | 2 | 雷达标记进度数据,固定以 1Hz 频率发送 | 服务器→己方雷达机器人 | 常规链路 |
| 0x020D | 6 | 哨兵自主决策信息同步,固定以 1Hz 频率发送 | 服务器→己方哨兵机器人 | 常规链路 |
| 0x020E | 1 | 雷达自主决策信息同步,固定以 1Hz 频率发送 | 服务器→己方雷达机器人 | 常规链路 |
| 0x0301 | 118 | 机器人交互数据,发送方触发发送,频率上限为 30Hz | - | 常规链路 |
| 0x0302 | 30 | 自定义控制器与机器人交互数据,发送方触发发送,频率上限为 30Hz | 自定义控制器→选手端图传连接的机器人 | 图传链路 |
| 0x0303 | 15 | 选手端小地图交互数据,选手端触发发送 | 选手端点击→服务器→发送方选择的己方机器人 | 常规链路 |
| 0x0305 | 24 | 选手端小地图接收雷达数据,频率上限为 5Hz | 雷达→服务器→己方所有选手端 | 常规链路 |
| 0x0306 | 8 | 自定义控制器与选手端交互数据,发送方触发发送,频率上限为 30Hz | 自定义控制器→选手端 | - |
| 0x0307 | 103 | 选手端小地图接收路径数据,频率上限为 1Hz | 哨兵/半自动控制机器人→对应操作手选手端 | 常规链路 |
| 0x0308 | 34 | 选手端小地图接收机器人数据,频率上限为 3Hz | 己方机器人→己方选手端 | 常规链路 |
| 0x0309 | 30 | 自定义控制器接收机器人数据,频率上限为 10Hz | 己方机器人→对应操作手选手端连接的自定义控制器 | 图传链路 |
| 0x0310 | 300 | 机器人发送给自定义客户端的数据,频率上限为 50Hz | 己方机器人→图传链路→对应操作手选手端连接的自定义客户端 | 图传链路 |
| 0x0311 | 30 | 自定义客户端发送给机器人的自定义指令,频率上限为 75Hz | 对应操作手选手端连接的自定义客户端→图传链路→己方机器人 | 图传链路 |
| 0x0A01 | 24 | 对方机器人的位置坐标,频率上限为 10Hz | 信号发射源→雷达 | 雷达无线链路 |
| 0x0A02 | 12 | 对方机器人的血量信息,频率上限为 10Hz | 信号发射源→雷达 | 雷达无线链路 |
| 0x0A03 | 10 | 对方机器人的剩余发弹量信息,频率上限为 10Hz | 信号发射源→雷达 | 雷达无线链路 |
| 0x0A04 | 8 | 对方队伍的宏观状态信息,频率上限为 10Hz | 信号发射源→雷达 | 雷达无线链路 |
| 0x0A05 | 36 | 对方各机器人当前增益效果,频率上限为 10Hz | 信号发射源→雷达 | 雷达无线链路 |
| 0x0A06 | 6 | 对方干扰波密钥,频率上限为 10Hz | 信号发射源→雷达 | 雷达无线链路 |

View File

@@ -0,0 +1,27 @@
# 控制指令的发送说明
在主机外接收的控制板中的控制代码的实现是:
```c
// CAN 速率 1000kbps
void CToC_CANDataProcess(unit32_t ID, uint8_t *Data)
{
// 以下所有变量有效范围为 [-660,660]
if(ID == 0x149) // 运动控制
{
Remote_RxData.Remote_R_RL =(int16_t)((uint16_t)Data[0]<<8 | Data[1]); // 平动 X 轴(左右)
Remote_RxData.Remote_R_UD =(int16_t)((uint16_t)Data[2]<<8 | Data[3]); // 平动 Y 轴(前后)
Remote_RxData.Remote_L_RL =(int16_t)((uint16_t)Data[4]<<8 | Data[5]); // 云台偏航 (左右)
Remote_RxData.Remote_L_UD =(int16_t)((uint16_t)Data[6]<<8 | Data[7]); // 云台俯仰 (上下)
}
else if(ID == 0x189) // 攻击控制
{
Remote_RxData.Remote_ThumbWheel =(int16_t)((uint16_t)Data[0]<<8 | Data[1]); // 拨弹盘(进弹/退弹660 为进弹0 为关闭,-660 为退弹
Remote_RxData.Remote_RS =(int16_t)((uint16_t)Data[2]<<8 | Data[3]); // 小陀螺(反自瞄)开关,置 660 为开启0 为关闭
Remote_RxData.Remote_LS =(int16_t)((uint16_t)Data[4]<<8 | Data[5]); // 摩擦轮开关, 置 660 为开启0 为关闭
}
}
```
两个 ID 分别是云台和底盘的控制板,在处于进点/回家状态时不应开启小陀螺,发射弹丸需要**打开摩擦轮 同时 进弹**,因此只有在处于攻击状态时开启摩擦轮,此时可以将进弹视为扳机。