Skip to content

指令与编程手册

Rev 1.7.1

适用于CH0x0/HI02/04/05/06/14/50/90/70系列共享编程接口

本手册基于固件版本: 1.7.1

具体功能以实际产品型号、固件版本及交付配置为准

手册版本说明(重要)

由于新老固件指令,性能,功能 存在细微差异,请根据产品固件版本选择参考对应的用户手册:

适用于产品的固件版本对应用户手册版本下载地址
1.7.11.7.1本手册
1.5.5 - 1.7.01.3.0imu_cum_cn_150_170.pdf

模块配置简述

在使用产品前,请仔细阅读本章节,结合实际使用需求,判断是否需要进行用户配置。

工作模式配置 - AHRS/9轴模式

⚠️ 警告 在机器人应用及室内环境中,AHRS(9轴)模式容易受到环境磁场或电机产生磁场干扰,导致航向角产生误差。

在空旷且无磁场干扰的环境下(如无人机户外飞行场景),可使用地磁辅助模式。使用前需要:

  1. 将模块配置为地磁辅助模式;
  2. 进行地磁校准(详见“地磁校准”章节)。

同步输入 - SYNC_IN/PPS

模块的同步相关功能依赖于 SYNC_IN/PPS 引脚,主要包括以下两类:

  • SYNC_IN同步数据触发
  • PPS标准秒脉冲接入,用于UTC时间同步

SYNC_IN同步数据触发

部分产品提供同步输入引脚(SYNC_IN/PPS),可用于外部脉冲触发数据输出。不使用时建议悬空或接地。工作原理:当输出协议配置为 ONMARK 触发模式时(详见 LOG 指令),模块在 SYNC_IN 引脚检测到上升沿后输出一帧数据。

应用场景:主要用于接收主控或外部时钟源产生的高精度脉冲,以触发同步输出 IMU 数据。

PPS标准秒脉冲接入

此功能使用(SYNC_IN/PPS)引脚接入GPS的PPS秒脉冲信号,配合串口接收时间消息,为IMU提供精确的UTC时间同步。当模块检测到有效的PPS上升沿,并通过串口接收到匹配的时间消息后,内部时钟将自动对齐至UTC整秒。

1. 时序与信号要求

为确保时间同步可靠,PPS 脉冲与串口时间消息需满足如下横向时序要求:

mermaid
gantt
    title PPS 与串口时间消息时序关系图 (t0-t3)
    dateFormat  X
    axisFormat  %s

    section SYNC_IN/PPS
    t1 (脉宽) :active, p1, 0, 50
    t0 (周期) :p2, 0, 1000

    section 串口时间消息
    t3 (延迟) :crit, d1, 0, 150
    t2 (传输时间) :done, r1, 150, 250

参数说明:

参数描述有效范围推荐值
t0相邻两次秒脉冲上升沿的间隔990 ms ~ 1010 ms1000 ms
t1秒脉冲的高电平时间(脉宽)1 ms ~ 100 ms10 ms ~ 50 ms
t2时间消息的传输时间与波特率相关-
t3时间消息开始发送相对于脉冲上升沿的延迟-200 ms ~ +200 ms0 ms ~ 100 ms

⚠️ 核心要求: 用于对时的时间消息必须在 PPS 上升沿到来前后 200ms 内发出(即 |t3|200ms),否则 IMU 将无法正确匹配 UTC 时间。

2. 硬件与接口配置要求
  • 硬件引脚 (SYNC_IN/PPS)
    • 触发方式:上升沿有效;
    • 电平标准:高电平 ≤ 5V(TTL/CMOS兼容);
  • 串口数据 (RX)
    • 报文频率:1~10 Hz(推荐 1 Hz);
    • 波特率:必须与IMU当前配置的波特率严格一致;
    • 支持协议:仅支持标准 NMEA RMCGGA 消息。
3. 时间消息示例(以GPRMC为例)
text
$GPRMC,235952.00,A,3112.5000,N,12127.5000,E,0.0,0.0,141125,0.0,E,A*3B

时间同步后,数据帧中的时间戳(uint32_t)表示自当日 UTC 00:00:00 起累计的毫秒数。

参数
范围0~86,399,999 ms
对应时间00:00:00.000至23:59:59.999
精度1毫秒

时间戳转换示例与 C 代码

时间戳 (ms)UTC时间
000:00:00.000
366100001:01:01.000
4320000012:00:00.000
8639999923:59:59.999
c
// Time conversion formula:
// Hours = timestamp / 3600000
// Minutes = (timestamp % 3600000) / 60000
// Seconds = (timestamp % 60000) / 1000
// Milliseconds = timestamp % 1000

void ms_to_utc_time(uint32_t total_ms, char *utc_time, int buf_size)
{
    // Calculate hours, minutes, seconds and milliseconds
    uint32_t total_seconds = total_ms / 1000;
    uint32_t ms_part = total_ms % 1000;

    uint8_t hours = (total_seconds / 3600) % 24;
    uint8_t minutes = (total_seconds % 3600) / 60;
    uint8_t seconds = total_seconds % 60;

    // Format as hh:mm:ss.sss
    snprintf(utc_time, buf_size, "%02d:%02d:%02d.%03d",
             hours, minutes, seconds, ms_part);
}

📝 注意事项

  • 时间戳不包含日期信息,仅表示当日UTC时间(自00:00:00起的毫秒数);
  • 不包含时区信息,默认按 UTC+0 解释;如需本地时间,请由主机侧自行叠加时区偏移。

同步输出 - SOUT

SOUT 是模块的同步输出引脚。无数据输出时为低电平(空闲);当一帧数据开始发送前,会先输出一个高脉冲,脉冲结束(下降沿)后紧接数据输出。

SOUT 引脚还支持分频输出,可按设定的分频系数输出同步脉冲,用于触发相机等低速率设备,实现严格时间同步。分频系数配置见“模块配置”章节中的 CONFIG PMUX2 DIV

船舶海浪补偿位移输出 - Heave, Surge, Sway

本产品支持测量海浪引起的船舶周期性运动(垂荡、纵荡、横荡),可提供高精度的实时三轴海浪运动信息:

运动轴描述输出数据
Heave垂直升沉垂直位移、垂直速度、垂直位移周期
Surge纵向涌浪纵向位移、纵向速度、纵向位移周期
Sway横向摇摆横向位移、横向速度、横向位移周期

应用场景:

  • 船舶动态监测与姿态控制
  • 海洋工程作业补偿(起重、对接)
  • 波浪特性研究与统计分析
  • 海上平台稳定性分析
  • 动态定位系统(DP)辅助

使用限制

⚠️ 重要限制

  • 仅适用于周期性往复运动

  • 以下情况通常无法准确测量:

    • 周期过长的运动(>30 s)
    • 单向线性运动
    • 阶跃式位移
  • 零均值假设:算法假设位移的长期平均值为 0

  • 初始化时间:需要稳定的 5~20 个海浪周期作为初始化时间才能获得正确结果

  • 频率响应范围:典型海浪周期 3~20 s,超出此范围精度下降

📝 产品兼容性 仅 HI7x/9x 系列产品支持此功能,详见“产品特性支持表”。

产品特性支持表

下表给出各产品家族的常用功能支持概览。具体功能以实际产品型号、固件版本及交付配置为准。

表中未列项不表示该功能一定支持或默认开放;对于单一型号产品,请结合实际交付说明确认。

型号/指令HI02HI05/06CH0x0, HI04/12/13/14HI50HI7x/9x
地磁辅助/地磁校准
用户姿态校准
IO复用映射(PMUX)
CAN通讯接口
船舶垂荡信息输出
倾角输出

模块配置命令(ASCII)

模块配置采用串口 ASCII 字符串命令格式,每条命令必须以回车换行 \r\n 结束(类似 AT 指令)。

凡涉及参数修改的操作,建议按“发送配置指令 -> 执行 SAVECONFIG -> 复位或重新上电 -> 再次确认”的流程进行。查询类命令以及部分通信控制命令可能在当前通信会话中立即体现,但不改变上述推荐配置流程。

📝 配置语义说明

  • 命令是否立即生效,以各命令说明为准;
  • 需要长期保留的配置,建议执行 SAVECONFIG 后再复位或重新上电确认;
  • 通信参数类命令可能在当前接口上立即切换;
  • 恢复类命令可能自动保存并触发复位。

下表列出常用对外配置命令。对于兼容、调试或定制用途的附加命令,请以实际交付说明为准。

配置命令总览

指令功能备注
REBOOT复位模块和重上电等效
SAVECONFIG保存所有配置参数立即生效
SERIALCONFIG串口波特率设置立即生效
CONFIG配置模块各种参数及模式保存后,复位生效
LOG查询模块信息或配置输出数据立即生效
FRESET恢复出厂设置立即生效

指令详解

REBOOT

复位模块。执行 REBOOT BL 可复位进入 Bootloader 模式。 示例: REBOOTREBOOT BL

SAVECONFIG

保存所有用户配置到 Flash。 示例:SAVECONFIG

SERIALCONFIG

设置当前串口波特率。

格式:SERIALCONFIG <BAUD>

参数说明:

  • BAUD:目标波特率。当前支持值:48009600192003840057600115200230400256000460800921600

示例:

  • SERIALCONFIG 115200 - 设置当前串口为115200波特率

⚠️ 重要提示 该指令立即生效,当执行该指令后,需要切换到新波特率才能和模块继续通讯。

CONFIG

用于配置模块各种参数及工作模式。建议所有需要长期保存的 CONFIG 配置在完成后执行 SAVECONFIG 保存,并在复位或重新上电后确认配置结果。

工作模式配置

工作模式配置:6轴或9轴(地磁辅助)模式,格式:CONFIG ATT MODE <VAL>。以下列出常用模式,其他行业模式或定制模式请以实际交付说明为准。

示例:

  • CONFIG ATT MODE 0 - 配置模块为VRU(6轴)模式
  • CONFIG ATT MODE 1 - 配置模块为AHRS(9轴)模式
  • CONFIG ATT MODE 4 - 人形机器人专用模式
姿态用户校准

用于执行姿态零点相关操作,格式:CONFIG ATT RST <VAL>。执行该命令时,设备应保持静止,否则可能引入较大校准误差。

示例:

  • CONFIG ATT RST 1 - 航向复位:将当前航向角置零
  • CONFIG ATT RST 2 - 设置相对零点:将当前 Pitch、Roll 角度置零
  • CONFIG ATT RST 3 - 自动校平:仅在设备接近水平放置时有效,具体定义如下:
    • 如果当前Pitch/Roll接近0°(水平正面放置),则自动校准到Pitch=0°,Roll=0°;
    • 如果当前Pitch接近0°,Roll接近180°(水平倒放),则自动校准到Pitch=0°,Roll=180°;
    • 判定阈值为Pitch、Roll均小于5°。
  • CONFIG ATT RST 5 - 取消水平校平:清除相对 Pitch、Roll 角度,恢复绝对角度
安装角度设置

用于修改模块安装方向,如水平安装、垂直安装、倒装以及组合导航前向安装等。此类配置建议保存后复位确认,无需每次上电重复发送。

格式:CONFIG IMU URFR <CODE>

参数说明:

  • CODE:2~3 位方向编码,表示用户坐标系相对于传感器坐标系的安装方向。
  • 编码写作 ABC,其中:
    • A 表示用户坐标系 X 轴对应传感器坐标系的哪个方向
    • B 表示用户坐标系 Y 轴对应传感器坐标系的哪个方向
    • C 表示用户坐标系 Z 轴对应传感器坐标系的哪个方向
  • 每一位数字的含义如下:
数字方向
0+X
1-X
2+Y
3-Y
4+Z
5-Z

使用说明:

  • 24 等价于 024,表示用户坐标系 X=+XY=+YZ=+Z。对本产品默认安装方向,可理解为 X 指右,Y 指前,Z 指上
  • 该命令使用空格分隔参数,正确写法为 CONFIG IMU URFR 24,不是 CONFIG IMU URFR=24
  • 当前配置查询结果会以 URFR=<CODE> 的形式显示。
  • 如果用户坐标系定义与机体右、前、上方向一致,则可直接按安装朝向从下表选择对应编码。

完整配置示例(24 种合法右手系):

  • 下表按“等效安装描述”展示(与上位机下拉一致):IMU X/Y/ZBody(B) 中的方向。
  • URFR 本质编码仍是 ABC 三位数字(右手系约束:X × Y = Z);2 位显示值等价于补前导零后的 3 位值(如 24 = 024)。
等效安装描述(IMU 轴在 Body(B) 中)配置命令说明
IMU X 指右,IMU Y 指前,IMU Z 指上CONFIG IMU URFR 24默认水平安装;完整编码为 024
IMU X 指右,IMU Y 指后,IMU Z 指下CONFIG IMU URFR 35相对默认姿态绕 X 轴翻转后的常见倒装;完整编码为 035
IMU X 指右,IMU Y 指下,IMU Z 指前CONFIG IMU URFR 43常见侧装;该组合与上位机“Right + Down”一致。
IMU X 指右,IMU Y 指上,IMU Z 指后CONFIG IMU URFR 52常见侧装;该组合与上位机“Right + Up”一致。
IMU X 指左,IMU Y 指前,IMU Z 指下CONFIG IMU URFR 125X 轴反向且 Z 向下的倒装组合。
IMU X 指左,IMU Y 指后,IMU Z 指上CONFIG IMU URFR 134X/Y 同时反向、Z 向上,常见于朝向对调安装。
IMU X 指左,IMU Y 指上,IMU Z 指前CONFIG IMU URFR 142左向立装组合,Y 轴朝上。
IMU X 指左,IMU Y 指下,IMU Z 指后CONFIG IMU URFR 153左向立装组合,Y 轴朝下。
IMU X 指前,IMU Y 指右,IMU Z 指下CONFIG IMU URFR 205前向安装组合,适合 X 轴沿车头方向布置。
IMU X 指后,IMU Y 指右,IMU Z 指上CONFIG IMU URFR 214后向安装组合,Y 轴保持朝右。
IMU X 指上,IMU Y 指右,IMU Z 指前CONFIG IMU URFR 240立装组合,X 轴朝上、Y 轴朝右。
IMU X 指下,IMU Y 指右,IMU Z 指后CONFIG IMU URFR 251立装组合,X 轴朝下、Y 轴朝右。
IMU X 指前,IMU Y 指左,IMU Z 指上CONFIG IMU URFR 304前向安装组合,Y 轴改为朝左。
IMU X 指后,IMU Y 指左,IMU Z 指下CONFIG IMU URFR 315后向倒装组合,X/Y 均为反向。
IMU X 指下,IMU Y 指左,IMU Z 指前CONFIG IMU URFR 341左向立装组合,X 轴朝下。
IMU X 指上,IMU Y 指左,IMU Z 指后CONFIG IMU URFR 350左向立装组合,X 轴朝上。
IMU X 指前,IMU Y 指上,IMU Z 指右CONFIG IMU URFR 402Y 轴朝上、Z 轴朝右的前向立装。
IMU X 指后,IMU Y 指下,IMU Z 指右CONFIG IMU URFR 413后向立装,Y 轴朝下、Z 轴朝右。
IMU X 指下,IMU Y 指前,IMU Z 指右CONFIG IMU URFR 421立装组合,X 朝下且 Z 朝右。
IMU X 指上,IMU Y 指后,IMU Z 指右CONFIG IMU URFR 430立装组合,X 朝上且 Z 朝右。
IMU X 指前,IMU Y 指下,IMU Z 指左CONFIG IMU URFR 503前向立装,Y 轴朝下、Z 轴朝左。
IMU X 指后,IMU Y 指上,IMU Z 指左CONFIG IMU URFR 512后向立装,Y 轴朝上、Z 轴朝左。
IMU X 指上,IMU Y 指前,IMU Z 指左CONFIG IMU URFR 520常见立装组合,X 轴朝上、Z 朝左。
IMU X 指下,IMU Y 指后,IMU Z 指左CONFIG IMU URFR 531常见立装组合,X 轴朝下、Z 朝左。
多功能IO复用功能配置

模块提供多个多功能引脚(IOx)。每个 IO 引脚具有默认复用功能,也可通过软件重新映射为其他复用功能。格式:CONFIG <PMUX> <IO>

参数说明:

  • PMUX:复用功能编号(PMUX1 ~ PMUX3
  • IO:目标引脚编号(IO1 ~ IO5
功能名称方向说明默认IO
PMUX1SIN/PPSI同步脉冲输入(SIN/PPS):输入引脚,见"同步输入与同步输出"章节IO1
PMUX2SOUTO无数据输出时为低电平(空闲),当一帧数据开始发送前会发送一个高脉冲,高脉冲结束(下降沿)后紧接着输出数据IO2
PMUX3LEDO运行状态指示灯输出IO5

示例:

  • CONFIG PMUX3 IO2 - 将IO2引脚分配为LED(PMUX3)功能
  • CONFIG PMUX2 IO1 - 将IO1引脚分配为同步输出(PMUX2)功能

📝 注意 并非所有 IO 引脚都会在具体产品上实际引出,详细硬件资源请参见对应产品用户手册。

SOUT(PMUX2)同步输出分频设置

SOUT 同步输出支持分频,可用于触发相机等低速率传感器融合设备。格式:CONFIG PMUX2 DIV <N>

参数说明:

  • N:分频系数,范围 1~1000,默认值为 1(不分频)

示例:

  • CONFIG PMUX2 DIV 5 - 设置SOUT分频系数为5,若数据输出速率为100 Hz,则SOUT脉冲输出频率为20 Hz
地磁校准

开始一次手动地磁校准:CONFIG MCAL START。发送该指令后,模块开始地磁校准流程,并根据空间磁场分布自动完成校准,无需再手动发送结束指令。执行过程中应在原地缓慢旋转模块,并确保与模块刚性连接的物体(PCB、外壳、机器人等)相对位置保持不变。详细说明见“地磁校准”章节。

发送开始校准指令后,可通过 LOG MCAL STAT 查询地磁校准状态,返回示例如下:

STAT=1
PROGRESS=8
OK
  • STAT:当前地磁校准状态。0 表示空闲,1 表示校准中,3 表示校准完成,4 表示校准失败
  • PROGRESS:当前校准进度,范围 0~100

📝 重要提示 地磁校准指令要求固件版本 ≥ 1.7.0。

坐标系定义设置

模块默认采用东北天(ENU)坐标系,也可通过以下命令切换世界坐标系定义:

  • CONFIG IMU COORD 0 - 将模块世界坐标系定义为东北天(ENU)坐标系
  • CONFIG IMU COORD 4 - 将模块世界坐标系定义为北西天(NWU)坐标系
用户级陀螺校准

该命令用于手动校准陀螺仪Z轴比例因子。正确执行该指令后,可提升航向角精度(校准后可保证比例因子误差在0.1%以内)。适用于AGV、大型水平移动机器人等,且对长期航向角误差要求高的工况下使用。格式:CONFIG USRCAL START <ANGLE>

参数说明:

  • ANGLE:校准角度,范围 720~1800°(2~5 圈)。旋转圈数越多,统计误差越小,但需确保旋转速度均匀。

示例:

  1. 准备工作:将模块(连同固联设备,如机器人等)放置在水平、平整地面上,确保环境温度稳定,避免强烈振动干扰。
  2. 发送开始命令:如 CONFIG USRCAL START 720 - 开始720°(2圈)校准。
  3. 执行校准动作:按照<ANGLE>设定的角度以20~100 deg/s(约5~20秒转一圈)完成水平旋转,旋转方向任意(顺时针或逆时针),整个旋转(校准)过程需保持速度均匀,避免中途停顿、突然加减速等。
  4. 发送结束命令:当旋转完成后,确保实际旋转角度与ANGLE设定值的误差在±5°以内,发送CONFIG USRCAL STOP指令完成校准。发送指令后,如果校准成功,则返回OK,否则返回ERR

常见校准失败原因:

失败原因说明
旋转操作不规范确保模块放置水平、平稳
操作不当转动太快或太慢,中途停顿
环境干扰避免在有振动的设备附近操作,机器人电机振动过大等
校准后误差依然存在甚至更大最有可能的原因是校准操作不规范。校准是一个精密的过程,假设标定时规定旋转720°,实际却旋转了725°,则比例因子则会错误的标定为5/720 = 0.6%,这已经远超出厂精度

LOG

开/关闭数据输出
  • LOG ENABLE - 全局使能数据帧输出
  • LOG DISABLE - 全局禁止数据帧输出
模块版本信息

LOG VERSION - 查询并打印固件版本信息

显示串口配置信息

LOG COMCONFIG - 打印串口及输出协议配置信息

设置数据帧输出类型及频率

格式: LOG <MSG> <TYPE> <VALUE>

参数说明:

  • MSG:数据帧种类,常用如 HI91HI81HI83GGARMCSXT 等,具体可用项以对应产品和当前串口配置为准
  • TYPE:输出触发方式,支持 ONTIME(定时输出)和 ONMARK(同步脉冲触发或软件触发)
  • VALUE:当 TYPE=ONTIME 时表示输出周期,单位为 s,可选范围:0.001(1 kHz)~ 1(1 Hz),其中 0 表示关闭定时输出;当 TYPE=ONMARK 时,1 表示由 SYNC_IN/PPS 脉冲触发,ONCE 表示手动触发一次输出

示例:

  • LOG HI91 ONTIME 0.01 - 将当前串口的 HI91 数据帧输出周期设置为 0.01 s(100 Hz)
  • LOG HI91 ONTIME 0.05 - 将当前串口的 HI91 数据帧输出周期设置为 0.05 s(20 Hz)
  • LOG HI91 ONTIME 0 - 关闭 HI91 数据帧输出
  • LOG HI91 ONMARK 1 - 将当前串口的 HI91 数据帧配置为 SYNC_IN/PPS 引脚脉冲触发模式
  • LOG HI91 ONMARK ONCE - 手动触发一次 HI91 数据输出,效果与 SYNC_IN/PPS 脉冲触发一次相同
HI83 可变数据帧配置

HI83 是可变长度二进制输出帧,适用于需要同时输出 IMU、姿态、时间、GNSS 或组合导航数据,并希望按需控制帧长的应用。HI83 的数据内容由 data_bitmap 决定,data_bitmap 中每一位对应一种数据段;置 1 表示输出该数据段,置 0 表示不输出。实际数据段在帧内按 bit 从低到高的顺序依次排列。

字段配置格式:LOG HI83 MAP <BITMAP>

  • <BITMAP> 可使用十六进制或十进制形式,例如 0x000000FF
  • data_bitmap 各 bit 的含义见后文“可变类型协议(HI83)”章节;
  • HI83 字段位图默认值为 0x000000FF

常用配置示例:

指令说明
LOG HI83 MAP 0x000000FF配置 HI83 默认字段组合:加速度、角速度、磁场、欧拉角、四元数、系统时间、UTC、气压
LOG HI83 MAP 0x0000001F配置 IMU + 姿态基础字段:加速度、角速度、磁场、欧拉角、四元数
LOG HI83 ONTIME 0.01将当前串口的 HI83 数据帧输出周期设置为 0.01 s(100 Hz)
LOG HI83 ONTIME 0关闭当前串口的 HI83 定时输出

⚠️ 波特率注意事项 当输出帧率设置较高时(如 500 Hz),默认的 115200 波特率可能无法满足输出带宽要求,此时建议将模块波特率提高到更高档位(如 921600),以保证数据能够稳定输出。

FRESET

用于恢复模块默认用户配置。执行后模块会自动保存并复位,请谨慎使用。 部分校准相关参数可能保留,具体以当前固件行为为准。 示例:FRESET

RS-232/TTL/USB 数据协议(二进制)

RS-232、串口 TTL 以及 USB(虚拟串口)均属于流式串行数据接口,这些接口支持超核自定义二进制协议。

数据帧格式

域名称长度(字节)说明
SOF5A A52帧头同步标志
LEN1-40962帧中数据域的长度,LSB(低字节在前)长度表示数据域的长度(不包含帧头、帧类型、长度及CRC)
CRC校验-2对帧头、长度和数据域进行16位CRC校验(不包含CRC字段本身)
数据域-1-4096一帧携带的数据,由若干个子数据段组成。每个子数据段由标签和数据两部分组成,标签决定数据类型及长度

出厂默认输出

出厂默认输出: 浮点型 IMU 数据帧(HI91)

数据域内容

浮点型IMU数据帧(HI91)

数据域共76字节,包含模块ID、温度、IMU的原始数据、地磁、气压、融合后的姿态数据等。

字节偏移名称数据类型大小(Byte)单位比例因子说明
0taguint8_t1--数据标签:0x91
1main_statusuint16_t2--状态字,见 MAIN_STATUS 状态字说明
3temperatureint8_t1°C1模块平均温度
4air_pressurefloat4Pa1气压
8system_timeuint32_t4ms1当 GPS 时间未同步成功时,该字段为本地时间戳,即自系统上电以来累计的毫秒数;当 GPS 时间同步成功时,该字段对齐为 UTC 当日时间戳
12acc_bfloat4×3G1经过出厂校准后的加速度,顺序为:XYZ轴 1G = 1倍标准重力加速度(约9.8 m/s²)
24gyr_bfloat4×3deg/s1经过出厂校准后的角速度,顺序为:XYZ轴
36mag_bfloat4×3μT1磁强度,顺序为:XYZ轴
48rollfloat4deg1横滚角
52pitchfloat4deg1俯仰角
56yawfloat4deg1航向角
60quatfloat4×4--节点四元数集合,顺序为WXYZ

可变类型协议(HI83)

此协议所携带的数据可以配置,可根据 data_bitmap 输出不同的数据组合,协议帧大小也会随配置改变。

字节偏移名称数据类型大小(Byte)单位比例因子说明
0taguint8_t1--数据标签:0x83
1main_statusuint16_t2--状态字,见 MAIN_STATUS 状态字说明
3ins_statusuint8_t1--组合导航解状态(只针对组合导航产品):
0: 解无效:无GNSS信息,无法初始化位置
1:对准中: 位置初始化成功,但需要一定速度来完成组合导航滤波器初始化,从而进入组合导航状态
3:组合导航中: 当前已进入组合导航状态
6:惯性递推中: 当前处于组合导航状态,但GNSS信号丢失,处于纯惯导状态(隧道或地库等)
4data_bitmapuint32_t4--所携带数据段的位图标识 data_bitmap,可配置。每一位对应一种数据类型,后续数据段按位图从低位到高位的顺序依次排列
8--1-512--后续数据内容由 data_bitmap 定义。

data_bitmap位及数据段说明

data_bitmap
名称数据类型大小单位比例因子说明
0acc_bfloat4x3m/s^(2)1IMU载体系, 经出厂校准的加速度,顺序:XYZ
1gyr_bfloat4x3rad/s1IMU载体系. 经出厂校准的角速度,顺序:XYZ
2mag_bfloat4x3μT1IMU载体系. 经校准的磁场强度,顺序:XYZ
3rpyfloat4x3deg1姿态角(欧拉角) 顺序为
横滚角roll, 范围:180 - 180
俯仰角pitch, 范围: -90 - 90
航向角yaw, 范围:-180 - 180, 逆时针为正
4quatfloat4x4-1节点四元数集合,顺序为WXYZ
5system_time_usuint64_t8us1该字段为本地高分辨率时间戳,即自系统上电以来累计的微秒数,每 1 us 递增 1
6utc-8--UTC 时间,共 8 字节:
年:1字节,如 24 表示 2024 年
月:1字节
日:1字节
时:1字节
分:1字节
秒:2字节,单位为 1 ms,例如 12 s 表示为 12000
保留:1字节
7air_pressurefloat4Pa1气压
8temperaturefloat41模块平均温度
9inclinationfloat4x3deg1倾角仪输出, 顺序: 饶X轴, 饶Y轴, 饶Z轴
10heave_surge_swayfloat4x3m1船舶升沉位移信息,顺序: 垂荡(heave)、纵荡(surge)、横荡(sway)
11heave_surge_sway_frqfloat4x3Hz1船舶升沉频率信息,顺序: 垂荡(heave)、纵荡(surge)、横荡(sway)
12vel_enufloat4x3m/s1导航系下东北天速度, 组合导航解算输出
13acc_enufloat4x3m/s^(2)1导航系下东北天加速度, 组合导航解算输出
14ins_lon_lat_msldouble8x3-1组合导航融合后的经纬度, 顺序: 经度(deg), 纬度(deg),海拔高度(m)
15gnss_quality_nv-4--GNSS解状态组,共4字节, 顺序依次为
solq_pos: 1字节, 位置解状态
nv_pos: 1字节, 位置解使用卫星数
solq_heading: 1字节, 航向解状态
nv_heading: 1字节, 航向解使用卫星数
16od_speedfloat4m/s-外接里程计传感器速度
17undulationfloat4m高程异常值
18diff_agefloat4sRTK差分龄期
19node_info-4-设备版本及 ID 信息:
node_id:1 字节,节点 ID 与 CAN ID 相同,范围 1~127
保留:3 字节
20-24保留
25event_counteruint32_t4x16-1内部量测事件计数器。常用顺序包括 gravity、mag、gnss_pos、gnss_vel、dual_heading、nhc、zupt、zaru、zihr、od,其余保留
26kf_acc_biasfloat4x3m/s^(2)1组合导航 KF 估计的加速度零偏,顺序:XYZ
27kf_gyr_biasfloat4x3rad/s1组合导航 KF 估计的陀螺零偏,顺序:XYZ
28gnss_stdfloat4x3-1GNSS 精度信息,顺序:位置标准差范数、速度标准差范数、保留
29gnss_heading_infofloat4x3-1双天线 GNSS 航向信息,顺序:基线长度(m)、俯仰角(deg)、航向角(deg)
30gnss_lon_lat_msldouble8x3-1GNSS 原始经纬高,顺序:经度(deg)、纬度(deg)、海拔高度(m)
31gnss_velfloat4x3m/s1GNSS 东北天速度,顺序:E、N、U

MAIN_STATUS状态字说明

名称描述
0-2保留-
3WB_CONV零偏收敛状态报警 1:当前零偏估计收敛精度差,建议将模块静止3~5 s以提高航向角精度 0:当前零偏收敛良好
4MAG_DIST磁场异常检测报警: 1:检测到当前环境磁场有干扰,或磁传感器未进行校准,或硬磁环境已经变化,9轴模式下航向角误差可能大 0:当前地磁环境良好,磁航向精度收敛,或系统处于6轴模式
5ACC_SAT加速度计量程饱和报警 1:当前或最近 2 s 内检测到加速度计量程饱和 0:当前未检测到加速度计量程饱和,且已连续 2 s 无饱和事件
6GYR_SAT陀螺仪量程饱和报警 1:当前或最近 2 s 内检测到陀螺仪量程饱和 0:当前未检测到陀螺仪量程饱和,且已连续 2 s 无饱和事件
7ATT_CONV姿态精度指示 1:当前姿态精度较差,AHRS姿态KF协方差较大,建议保持静止片刻以等待姿态精度恢复 0:当前姿态精度正常
8-9保留-
10MAG_AIDING磁参与姿态解算标志: 1:磁传感器正在参与航向计算(9轴模式) 0:磁传感器不参与航向计算(6轴模式)
11UTC_SYNCED时间同步标志:1 表示未完成时间同步,此时 system_time 为本地时间;0 表示 UTC 时间同步成功,此时 HI91 中的 system_time 已对齐为当日 UTC 毫秒计数
12SOUT_PULSESOUT脉冲输出标志,用于与低速传感器(摄像头、LiDAR 等)进行时间同步:1 表示当前数据帧对应 SOUT 脉冲输出;0 表示当前数据帧不对应 SOUT 脉冲输出
13-15保留-

📝 兼容性说明MAIN_STATUS 状态字仅适用于产品固件版本 ≥ 1.7.0。

CRC校验

CRC校验采用 CRC-16/CCITT格式,C语言实现示例如下:

/*
	currectCrc: previous crc value, set 0 if it's first section
	src: source stream data
	lengthInBytes: length
*/
static void crc16_update(uint16_t *currectCrc, const uint8_t *src, uint32_t lengthInBytes)
{
    uint32_t crc = *currectCrc;
    uint32_t j;
    for (j=0; j < lengthInBytes; ++j)
    {
        uint32_t i;
        uint32_t byte = src[j];
        crc ^= byte << 8;
        for (i = 0; i < 8; ++i)
        {
            uint32_t temp = crc << 1;
            if (crc & 0x8000)
            {
                temp ^= 0x1021;
            }
            crc = temp;
        }
    }
    *currectCrc = crc;
}

数据帧结构示例(以HI91为例)

使用串口助手采样一帧数据(HI91数据帧),共82字节,前6字节为帧头、长度和CRC校验值,剩余76字节为数据域。假设数据接收到C语言数组buf中,如下所示:

5A A5 4C 00 14 BB 91 08 15 23 09 A2 C4 47 08 15 1C 00 CC E8 61 BE 9A 35 56 3E 65 EA 72 3F 31 D0 7C BD 75 DD C5 BB 6B D7 24 BC 89 88 FC 40 01 00 6A 41 AB 2A 70 C2 96 D4 50 41 ED 03 43 41 41 F4 F4 C2 CC CA F8 BE 73 6A 19 BE F0 00 1C 3D 8D 37 5C 3F

数据解析表:

字段名称类型原始值解析值描述
帧头-5A A5-帧头
数据域长度-4C 000x004C = 76数据域长度=76字节
CRC-14 BB0xBB14CRC校验值
tag-910x910x91 子数据段标签(从此字段开始为 payload 数据域)
main_statusuint16_t08 150x1508状态字
temperatureint8_t230x23 = 35温度:°C
air_pressurefloat09 A2 C4 47100676气压,Pa
system_timeuint32_t08 15 1C 000x001C1508 = 1840392时间戳,ms
acc_b_xfloatCC E8 61 BE-0.220615加速度X轴,G
acc_b_yfloat9A 35 56 3E0.209189加速度Y轴,G
acc_b_zfloat65 EA 72 3F0.948889加速度Z轴,G
gyr_b_xfloat31 D0 7C BD-0.061722角速度X轴,deg/s
gyr_b_yfloat75 DD C5 BB-0.00603836角速度Y轴,deg/s
gyr_b_zfloat6B D7 24 BC-0.0100611角速度Z轴,deg/s
mag_b_xfloat89 88 FC 407.89167磁场X轴,μT
mag_b_yfloat01 00 6A 4114.625磁场Y轴,μT
mag_b_zfloatAB 2A 70 C2-60.0417磁场Z轴,μT
rollfloat96 D4 50 4113.0519横滚角,deg
pitchfloatED 03 43 4112.1885俯仰角,deg
yawfloat41 F4 F4 C2-122.477航向角,deg
q_wfloatCC CA F8 BE-0.485922四元数W
q_xfloat73 6A 19 BE-0.14982四元数X
q_yfloatF0 00 1C 3D0.0380868四元数Y
q_zfloat8D 37 5C 3F0.860223四元数Z

C语言解析代码示例(以HI91为例)

以下示例给出常用的 C 语言解析片段:

校验CRC

c
int16_t payload_len;
uint16_t crc;
crc = 0;
payload_len = buf[2] + (buf[3] << 8);

/* Calculate 5A A5 and LEN field crc */
crc16_update(&crc, buf, 4);

/* Calculate payload crc */
crc16_update(&crc, buf + 6, payload_len);

计算得到的CRC值为0xBB14,与数据帧中的CRC字段值相同,CRC校验通过。

定义数据接收结构

0x91 开始为该子数据段的数据域,下面给出示例数据结构体和常用转换宏:

c
#include "stdio.h"
#include "string.h"

/* Common type conversion */
#define U1(p) (*((uint8_t *)(p)))
#define I1(p) (*((int8_t  *)(p)))
#define I2(p) (*((int16_t  *)(p)))

static uint16_t U2(uint8_t *p) {uint16_t u; memcpy(&u,p,2); return u;}
static uint32_t U4(uint8_t *p) {uint32_t u; memcpy(&u,p,4); return u;}
static int32_t  I4(uint8_t *p) {int32_t  u; memcpy(&u,p,4); return u;}
static float    R4(uint8_t *p) {float    r; memcpy(&r,p,4); return r;}

typedef struct
{
    uint8_t     tag;              /* Item tag: 0x91        */
    float       acc[3];           /* Acceleration          */
    float       gyr[3];           /* Angular velocity      */
    float       mag[3];           /* Magnetic field        */
    float       eul[3];           /* Attitude: Euler angle */
    float       quat[4];          /* Attitude: quaternion  */
    float       pressure;         /* Air pressure          */
    uint32_t    timestamp;        /* Timestamp             */
}imu_data_t;

接收数据

从buf[6]=0x91开始为payload部分:

c
imu_data_t i0x91 = {0};
int offset = 6; /* Payload start at buf[6] */

i0x91.tag =             U1(buf+offset+0);
i0x91.pressure =        R4(buf+offset+4);
i0x91.timestamp =       U4(buf+offset+8);
i0x91.acc[0] =          R4(buf+offset+12);
i0x91.acc[1] =          R4(buf+offset+16);
i0x91.acc[2] =          R4(buf+offset+20);
i0x91.gyr[0] =          R4(buf+offset+24);
i0x91.gyr[1] =          R4(buf+offset+28);
i0x91.gyr[2] =          R4(buf+offset+32);
i0x91.mag[0] =          R4(buf+offset+36);
i0x91.mag[1] =          R4(buf+offset+40);
i0x91.mag[2] =          R4(buf+offset+44);
i0x91.eul[0] =          R4(buf+offset+48);
i0x91.eul[1] =          R4(buf+offset+52);
i0x91.eul[2] =          R4(buf+offset+56);
i0x91.quat[0] =         R4(buf+offset+60);
i0x91.quat[1] =         R4(buf+offset+64);
i0x91.quat[2] =         R4(buf+offset+68);
i0x91.quat[3] =         R4(buf+offset+72);

打印接收到的数据

c
printf("%-16s0x%X\r\n",                 "tag:",           i0x91.tag);
printf("%-16s%8.4f %8.4f %8.4f\r\n",    "acc(G):",        i0x91.acc[0], i0x91.acc[1],  i0x91.acc[2]);
printf("%-16s%8.3f %8.3f %8.3f\r\n",    "gyr(deg/s):",    i0x91.gyr[0], i0x91.gyr[1],  i0x91.gyr[2]);
printf("%-16s%8.3f %8.3f %8.3f\r\n",    "mag(uT):",       i0x91.mag[0], i0x91.mag[1],  i0x91.mag[2]);
printf("%-16s%8.3f %8.3f %8.3f\r\n",    "eul(deg):",      i0x91.eul[0], i0x91.eul[1],  i0x91.eul[2]);
printf("%-16s%8.3f %8.3f %8.3f %8.3f\r\n",  "quat:",      i0x91.quat[0], i0x91.quat[1], i0x91.quat[2], i0x91.quat[3]);
printf("%-16s%8.3f\r\n",                    "pressure(pa):", i0x91.pressure);
printf("%-16s%d\r\n",                       "timestamp(ms):", i0x91.timestamp);

最大传输速率

协议字节数9600bps115200bps230400bps256000bps460800bps921600bps
HI917610Hz100Hz250Hz250Hz500Hz1000Hz

RS-485输出协议(Modbus)

Modbus 协议是工业自动化领域常用的通用协议,可运行于 RS485 或以太网接口。带有 RS485 或以太网接口的相关产品通常支持 Modbus,具体以实际产品型号和交付配置为准。

当前固件默认将 Modbus 从站挂载在 COM1 对应的 RS485 通道上。若产品存在多接口或定制通信映射,请以实际交付配置为准。

Modbus指令说明

RS485通讯协议遵循Modbus RTU协议规范,数据以寄存器为单位进行发送和接收,每个寄存器占用2个字节,采用大端模式(高字节在前)。采用标准Modbus CRC校验。

支持的功能码:

  • 0x06(Write Single Register):写单个寄存器(每个Modbus寄存器为2个字节)
  • 0x03(Read Holding Registers):读取单个或多个寄存器数据
  • 0x50(自定义功能码):用于 Modbus ID 自动分配等场景,便于量产部署和固件升级

出厂默认节点 ID: 80 (0x50)

数据帧格式

读寄存器(0x03)

主机发送:

域名称说明
ID1-0xFFModbus 节点ID
FUN_CODE0x03命令码
ADDR_H-要读取的寄存器地址高8位
ADDR_L-要读取的寄存器地址低8位
LEN_H-要读取寄存器长度高8位(以寄存器个数为单位)
LEN_L-要读取寄存器长度低8位(以寄存器个数为单位)
CRC_L-CRC低8位
CRC_H-CRC高8位

从机(模块)返回:

域名称说明
ID1-0xFFModbus 节点ID
FUN_CODE0x03命令码
LEN-返回寄存器数据的长度(不算ID,FUN_CODE,LEN,CRC字段)以字节为单位
DATAH-返回数据高8位
DATAL-返回数据低8位
...-更多返回数据
CRC_L-CRC低8位
CRC_H-CRC高8位

写寄存器(0x06)

主机发送:

域名称说明
ID1-0xFFModbus 节点ID
FUN_CODE0x06命令码
ADDR_H-寄存器地址高8位
ADDR_L-寄存器地址低8位
DATA_H-写入数据高8位
DATA_L-写入数据低8位
CRC_L-CRC低8位
CRC_H-CRC高8位

从机返回:

域名称说明
ID1-0xFFModbus 节点ID
FUN_CODE0x06命令码
ADDR_H-寄存器地址高8位
ADDR_L-寄存器地址低8位
DATA_H-写入数据高8位
DATA_L-写入数据低8位
CRC_L-CRC低8位
CRC_H-CRC高8位

寄存器列表

地址(Hex)地址(Dec)名称类型功能R/W说明
0x000CTRLu16控制W参见控制寄存器说明
0x044UART1_BAUDu16波特率R/W串口波特率
0x055MD_IDu16Modbus IDR/WModbus ID: 有效范围: 1-128
0x066HEADING_MODEu16航向角模式R/W0: 6轴模式(相对航向,航向角上电为0). 1:9轴模式(地磁融合,绝对航向)
0x3452ACCXi16加速度XR单位:G(1G = 1×重力加速度), 比例因子:0.00048828
0x3553ACCYi16加速度YR单位:G(1G = 1×重力加速度), 比例因子:0.00048828
0x3654ACCZi16加速度ZR单位:G(1G = 1×重力加速度), 比例因子:0.00048828
0x3755GYRXi16角速度XR单位deg/s, 比例因子:0.061035
0x3856GYRYi16角速度YR单位deg/s, 比例因子:0.061035
0x3957GYRZi16角速度ZR单位deg/s, 比例因子:0.061035
0x3A58MAGXi16磁强度XR单位uT, 比例因子: 0.030517
0x3B59MAGYi16磁强度YR单位uT, 比例因子: 0.030517
0x3C60MAGZi16磁强度ZR单位uT, 比例因子: 0.030517
0x3D61R_Hi32横滚角高16位R单位deg, 比例因子:0.001
0x3E62R_L-横滚角低16位R单位deg, 比例因子:0.001
0x3F63P_Hi32俯仰角高16位R单位deg, 比例因子:0.001
0x4064P_L-俯仰角低16位R单位deg, 比例因子:0.001
0x4165Y_Hi32航向角高16位R单位deg, 比例因子:0.001
0x4266Y_L-航向角低16位R单位deg, 比例因子:0.001
0x4367TEMPi16温度R单位℃, 比例因子:0.01
0x4468PRS_Hi32气压高16位R单位Pa, 比例因子:0.01
0x4569PRS_L-气压低16位R单位Pa, 比例因子:0.01
0x4670Q0u16四元数QWR四元数,比例因子: 0.0001
0x4771Q1u16四元数QXR四元数,比例因子: 0.0001
0x4872Q2u16四元数QYR四元数,比例因子: 0.0001
0x4973Q3u16四元数QZR四元数,比例因子: 0.0001
0x4A74INCLI_Xi16倾角仪X轴角度R双轴倾角仪产品:X角度, ±180,单位deg, 比例因子: 0.011
单轴倾角仪产品:X角度, 0-360, 单位deg, 比例因子: 0.011
0x4B75INCLI_Yi16倾角仪Y轴角度R双轴倾角仪Y角度: ±90, 单位deg,比例因子: 0.011
单轴倾角仪: 此寄存器保留
0x4E78HEVAEi16船舶垂荡R船舶垂荡位移输出, 单位 m, 比例因子 0.01
0x5181HEAVE_PERIODi16船舶垂荡周期R船舶垂荡位移周期, 单位s, 比例因子 0.001
0x70-0x77112-119PNAMEu16设备名R设备名字符串, ASCII码,共占8个寄存器
0x78120SW_VERSIONu16软件版本R软件版本
0x79121BL_VERSIONu16BL版本RBL版本
0x7F-0x82127-130SNu16产品唯一序列号R产品唯一序列号, 占4寄存器
0xA5165ATT_RSTu16自动校平W3: 执行一次自动调平: 如果当前俯仰角/横滚角接近0°,0°(水平正面放置), 则自动校准到0,0. 前如果当前俯仰角/横滚角接近0° 或 180°(水平倒放),则自动校准到 0°,180° 适用于机器人安装环境。 其中,“接近”定义为 Pitch Roll均小于15°
5: 取消自动调平,恢复绝对测量角度
其他值: 无效

控制寄存器说明(寄存器地址: 0x00)

命令CTL寄存器写入值
保存所有配置参数到 Flash0x0000
恢复出厂设置0x0001
复位0x00FF

常用配置

📝 注意 以下所有配置示例均以 Modbus 地址 0x50(出厂默认)为例。若用户已修改 Modbus ID,则需要同步修改报文中的 ID 字段和 CRC。

保存配置到 Flash

50 06 00 00 00 00 84 4B

恢复出厂设置

50 06 00 00 00 01 45 8B

⚠️ 执行后将恢复模块默认用户配置,并自动保存后复位。部分校准相关参数可能保留。

复位

50 06 00 00 00 FF C4 0B

配置波特率(0x04)

配置目标波特率指令(Hex)ID=0x50(出厂默认)
480050 06 00 04 00 00 C5 8A
960050 06 00 04 00 01 04 4A
1920050 06 00 04 00 02 44 4B
3840050 06 00 04 00 03 85 8B
5760050 06 00 04 00 04 C4 49
11520050 06 00 04 00 05 05 89
23040050 06 00 04 00 06 45 88
46080050 06 00 04 00 07 84 48
92160050 06 00 04 00 08 C4 4C

配置节点 ID(0x05)

格式:[CURRENT_ID] 06 00 05 00 [NEW_ID] CRC(2字节)

参数说明:

  • CURRENT_ID:当前 Modbus 节点 ID
  • NEW_ID:新的目标 Modbus 节点 ID

示例(当前节点 ID = 0x50):

  • 设置 NEW_ID=0x5050 06 00 05 00 50 94 76
  • 设置 NEW_ID=0x5150 06 00 05 00 51 55 B6
  • 设置 NEW_ID=0x5250 06 00 05 00 52 15 B7
  • 设置 NEW_ID=0x5350 06 00 05 00 53 D4 77

⚠️ 重要提示 修改成功后,Modbus 地址会立即生效。主机侧后续发送时,需要将 CURRENT_ID 切换为新的节点 ID。若不熟悉 Modbus 报文构造,建议使用上位机工具完成配置。

设置安装方式(0xA6)

配置目标安装方式指令(Hex)ID=0x50(出厂默认)
水平,Z轴朝上安装(默认值)50 06 00 A6 00 18 64 62
绕X轴旋转-90°(Y轴正方向朝下的垂直安装)50 06 00 A6 00 2B 24 77
绕X轴旋转90°(Y轴正方向朝上的垂直安装)50 06 00 A6 00 34 65 BF
绕Y轴旋转90°(X轴正方向朝上的垂直安装)50 06 00 A6 02 08 64 CE
绕Y轴旋转-90°(X轴正方向朝下垂直安装)50 06 00 A6 01 A5 A5 83

设置水平校准(0xA5)

  • 启动自动水平校平: 50 06 00 A5 00 02 15 A9
  • 取消自动水平校平: 50 06 00 A5 00 05 54 6B

设置6轴或9轴模式(0x06)

  • 设置为6轴模式:50 06 00 06 00 00 64 4A
  • 设置为9轴模式:50 06 00 06 00 01 A5 8A

读取模块版本信息(0x70-0x82)

读取模块产品名、软件版本及SN号:请求帧: 50 03 00 70 00 14 49 9F

字段说明
Modbus节点ID0x50Modbus节点ID
功能码0x03读保持寄存器
起始地址0x0070产品信息起始地址
读取长度0x0014读取20个寄存器
CRC校验0x9F49-

响应帧: 50 03 28 48 49 31 34 52 32 4E 2D 34 38 35 2D 30 30 30 00 00 98 00 6B 00 00 00 00 00 00 00 00 00 00 04 7D 95 5F 8D 2A 17 08 00 00 4D 0C

字段数据说明
Modbus节点ID0x50Modbus节点ID
功能码0x03功能码
数据长度0x28返回40字节数据 ,一共请求读取20个寄存器, 每个寄存器2字节
产品名48 49...30 30CH10x(M)
软件版本0x98V1.52
引导版本0x6BV1.07
序列号047D955F8D2A1708SN码

读取传感器数据(0x34-0x4B)

请求帧: 50 03 00 34 00 18 09 8F

字段说明
Modbus节点ID0x50Modbus节点ID
功能码0x03读保持寄存器
起始地址0x0034传感器数据起始地址
读取长度0x0018读取24个寄存器
CRC校验0x8F09-

响应帧: 50 03 30 FF 01 03 B0 06 50 FC C9 FF 7C 00 91 01 D5 FD DB FD 27 00 00 21 FF 00 00 7F F6 FF FD 73 E7 00 00 00 00 00 00 10 A6 0D 59 DD 4E 86 A8 06 30 17 82 1E CE

数据解析示例:

加速度(单位:G,可取9.8m/s²):

轴向寄存器值(HEX)原始值(DEC)比例因子计算得出物理值
XFF 01-2550.00048828-0.1245
Y03 B09440.000488280.4609
Z06 5016160.000488280.7891

角速度(单位:deg/s):

轴向寄存器值(HEX)原始值(DEC)比例因子计算得出物理值
XFC C9-8230.061035-50.2318
YFF 7C-1320.061035-8.0566
Z00 911450.0610358.8501

磁场(单位:μT):

轴向寄存器值(HEX)原始值(DEC)比例因子计算得出物理值
X01 D54690.03051714.3125
YFD DB-5490.030517-16.7538
ZFD 27-7290.030517-22.2469

欧拉角(单位:deg):

轴向寄存器值(HEX)原始值(DEC)比例因子计算得出物理值
横滚(Roll)00 00 21 FF87030.0018.703
俯仰角(Pitch)00 00 7F F6327580.00132.758
航向角(Yaw)FF FD 73 E7-1669370.001-166.937

CAN数据协议(J1939)

支持 CAN 输出的相关产品通常默认采用 J1939 协议,严格遵循 SAE J1939 国际标准。J1939 是基于 CAN 2.0B 扩展帧格式的高层协议,广泛应用于商用车辆和工业设备的网络通信。有关 J1939 协议的更多细节可参考这里

CAN扩展帧格式

J1939使用CAN 2.0B扩展帧格式,29位标识符结构如下:

位域分布(MSB → LSB):
[28:26] Priority (P)     - 优先级(3位)
[25]    Reserved (R)     - 保留位(1位)
[24]    Data Page (DP)   - 数据页(1位)
[23:16] PDU Format (PF)  - PDU格式(8位)
[15:8]  PDU Specific (PS)- PDU特定(8位)
[7:0]   Source Address   - 源地址(8位)

标识符计算公式:

CAN_ID = (Priority << 26) | (Reserved << 25) | (DataPage << 24) | (PF << 16) | (PS << 8) | SourceAddress

数据字节序(Endianness)

重要说明: J1939协议采用**小端序(Little-Endian)**数据格式:

  • 多字节数据:低位字节在前,高位字节在后

  • 位序:LSB(Least Significant Bit)在低位

  • 示例:32位整数0x12345678在CAN帧中的字节顺序为:78 56 34 12

CANFD 支持

本节描述 CANFD 数据输出的协议格式。具体产品是否支持 CANFD、以及当前固件是否启用 CANFD 功能,以实际产品型号和固件配置为准。

当产品支持并启用 CANFD 输出时,CANFD 帧控制域波特率与经典 CAN 2.0B 模式相同,FD 帧数据域波特率通常配置为 4Mbps,数据长度为 64 字节。

协议参数配置

参数项配置值说明
CAN波特率500Kbps(默认)支持125K/250K/500K/800K/1000K
帧格式CAN 2.0B扩展帧(29位标识符)符合J1939标准
数据长度8字节(经典J1939)经典PGN数据载荷长度,CANFD数据帧请见对应章节
帧优先级3(默认)范围:0-7,0为最高优先级
默认节点地址8可配置范围:1-127, 广播地址:255
PF (PDU Format)0xFF(专有PGN)厂商自定义PGN范围
PS (PDU Specific)数据类型标识区分不同的传感器数据类型
数据格式小端序(LSB优先)多字节数据低位在前
数据类型有符号/无符号整型根据具体PGN定义

PGN消息列表

本产品支持多种传感器数据的J1939 PGN消息,所有PGN均采用厂商自定义格式(PF=0xFF)。大多数经典J1939 PGN包含8字节数据载荷,采用小端序编码;CANFD数据帧请见对应章节。

PGN 65327(0xFF2F)- 时间信息

功能描述: 提供UTC时间信息输出,用于状态查看或上位机解析。

CAN标识符格式: 0x0CFF2F[SA]

  • Priority: 3 (0x0C)
  • PF: 0xFF, PS: 0x2F
  • SA: 源地址(默认0x08)

数据格式:

字节位置字段名称数据类型取值范围单位比例因子说明
0UTC年uint80-99120代表2020年
1UTC月uint80-1211-12表示月份
2UTC日uint80-3111-31表示日期
3UTC时uint80-23124小时制
4UTC分uint80-591分钟
5UTC秒uint80-591
6-7UTC毫秒uint160-999ms1毫秒,小端序存储

输出示例:

CAN ID: 0x0CFF2F08
数据: 18 06 12 0E 1E 2D 58 02
解析: 2024年6月18日 14:30:45.600 UTC

PGN 65332(0xFF34)- 三轴加速度

功能描述: 提供三轴加速度测量数据

CAN标识符格式: 0x0CFF34[SA]

数据格式:

字节位置字段名称数据类型取值范围单位比例因子说明
0-1加速度Xint16±32767G0.00048828X轴加速度,小端序
2-3加速度Yint16±32767G0.00048828Y轴加速度,小端序
4-5加速度Zint16±32767G0.00048828Z轴加速度,小端序
6-7保留uint160--保留字段,固定为0

PGN 65335(0xFF37)- 三轴角速度

功能描述: 提供三轴角速度(陀螺仪)测量数据

CAN标识符格式: 0x0CFF37[SA]

数据格式:

字节位置字段名称数据类型取值范围单位比例因子说明
0-1角速度Xint16±32767deg/s0.061035X轴角速度,小端序
2-3角速度Yint16±32767deg/s0.061035Y轴角速度,小端序
4-5角速度Zint16±32767deg/s0.061035Z轴角速度,小端序
6-7保留uint160--保留字段,固定为0

PGN 65341(0xFF3D)- 俯仰横滚角

功能描述: 提供俯仰角和横滚角姿态信息

CAN标识符格式: 0x0CFF3D[SA]

数据格式:

字节位置字段名称数据类型取值范围单位比例因子说明
0-3横滚角(Roll)int32±180000000deg0.001横滚角,小端序
4-7俯仰角(Pitch)int32±90000000deg0.001俯仰角,小端序

PGN 65345(0xFF41)- 航向角

功能描述: 提供航向角(偏航角)信息,支持两种表示方式

CAN标识符格式: 0x0CFF41[SA]

数据格式:

字节位置字段名称数据类型取值范围单位比例因子说明
0-3航向角(0-360°)uint320-360000000deg0.0010-360°表示,顺时针为正,小端序
4-7航向角(±180°)int32±180000000deg0.001±180°表示,逆时针为正,小端序

PGN 65338(0xFF3A)- 三轴磁场强度

功能描述: 提供三轴磁场强度测量数据

CAN标识符格式: 0x0CFF3A[SA]

数据格式:

字节位置字段名称数据类型取值范围单位比例因子说明
0-1磁场强度Xint16±32767μT0.030517X轴磁场强度,小端序
2-3磁场强度Yint16±32767μT0.030517Y轴磁场强度,小端序
4-5磁场强度Zint16±32767μT0.030517Z轴磁场强度,小端序
6-7保留uint160--保留字段,固定为0

PGN 65350(0xFF46)- 四元数

功能描述: 提供姿态四元数表示

CAN标识符格式: 0x0CFF46[SA]

数据格式:

字节位置字段名称数据类型取值范围单位比例因子说明
0-1四元数 qwint16±32767-0.0001四元数实部,小端序
2-3四元数 qxint16±32767-0.0001四元数i分量,小端序
4-5四元数 qyint16±32767-0.0001四元数j分量,小端序
6-7四元数 qzint16±32767-0.0001四元数k分量,小端序

PGN 65354(0xFF4A)- 倾角仪输出

功能描述: 专用于倾角仪产品的角度输出。

适用范围: 仅适用于启用 J1939 输出的倾角仪产品及固件配置

CAN标识符格式: 0x0CFF4A[SA]

数据格式:

字节位置字段名称数据类型取值范围单位比例因子说明
0-3X轴倾角int320-360000000deg0.001X轴倾角,可配置0-360°或±180°
4-7Y轴倾角int320-360000000deg0.001Y轴倾角,可配置0-360°或±90°

PGN 65370(0xFF5A)- CANFD数据帧0 - IMU数据

功能描述: 当产品支持并启用 CANFD 输出时,可输出 CANFD 数据帧0,包含打包后的 IMU 数据,帧长为 64 字节。

适用范围: 仅适用于支持并启用 CANFD 输出的产品及固件配置

CAN标识符格式: 0x0CFF5A[SA]

数据格式:

数据域共64字节,包含主状态、时间戳、IMU原始数据、姿态角、四元数、温度等信息。

字节偏移名称数据类型大小(Byte)单位比例因子说明
0main_statusuint162--状态字,见 MAIN_STATUS 状态字说明
2reserveduint81--保留
3reserveduint81--保留
4system_timeuint324ms1本地时间戳(系统开机累计ms)
8acc_xint162g0.00048828加速度X
10acc_yint162g0.00048828加速度Y
12acc_zint162g0.00048828加速度Z
14gyr_xint162deg/s0.061035角速度X
16gyr_yint162deg/s0.061035角速度Y
18gyr_zint162deg/s0.061035角速度Z
20mag_xint162uT0.030517磁强度X
22mag_yint162uT0.030517磁强度Y
24mag_zint162uT0.030517磁强度Z
26rollint324deg0.001横滚角
30pitchint324deg0.001俯仰角
34yawint324deg0.001航向角
38qwint162-0.0001四元数w
40qxint162-0.0001四元数x
42qyint162-0.0001四元数y
44qzint162-0.0001四元数z
46tempint1620.01模块平均温度
48reserveduint816--保留

配置协议

协议格式

本产品采用基于 J1939 的配置协议,支持主机对部分设备参数进行读写。配置消息使用专用 PGN,并通过标准 J1939 扩展帧格式传输。

配置帧格式:

  • CAN标识符: 0x0CEF[DA][SA]
  • SA: 源地址,表示发起配置请求的主机地址,可按主机侧规划分配
  • DA: 目的地址,通常为产品节点 ID,也可使用广播地址 255

数据载荷格式:

字节位置字段名称数据类型说明
0-1ADDRuint16寄存器地址,小端序
2CMDuint8命令类型(0x06=写,0x03=读)
3STATUSuint8状态字段(写命令时为0,读响应时为状态)
4-7VALuint32数据值,小端序

寄存器地址映射

见 Modbus 协议章节中的寄存器列表。

配置示例

以下配置示例以出厂默认节点 ID 8 为例。

29'b 拓展帧地址数据描述说明
0x0CEF08xx2F 01 06 00 [VAL]VAL: 4字节PGN:FF2F(UTC时间) 发送间隔,单位ms, 范围:5 - 1000
0x0CEF08xx34 01 06 00 [VAL]VAL: 4字节PGN:FF34(加速度) 发送间隔,单位ms, 范围:5 - 1000
0x0CEF08xx37 01 06 00 [VAL]VAL: 4字节PGN:FF37(角速度) 发送间隔,单位ms, 范围:5 - 1000
0x0CEF08xx3D 01 06 00 [VAL]VAL: 4字节PGN:FF3D(俯仰横滚) 发送间隔,单位ms, 范围:5-1000
0x0CEF08xx41 01 06 00 [VAL]VAL: 4字节PGN:FF41(航向角) 发送间隔,单位ms, 范围:5 -1000
0x0CEF08xx3A 01 06 00 [VAL]VAL: 4字节PGN:FF3A(磁强度) 发送间隔,单位ms, 范围:5 -1000
0x0CEF08xx46 01 06 00 [VAL]VAL: 4字节PGN:FF46(四元数) 发送间隔,单位ms, 范围:5 -1000
0x0CEF08xx4A 01 06 00 [VAL]VAL: 4字节PGN:FF4A(倾角仪输出) 发送间隔,单位ms, 范围:5 -1000
0x0CEF08xx5A 01 06 00 [VAL]VAL: 4字节PGN:FF5A(CANFD帧0) 发送间隔,单位ms, 范围:5 -1000,仅在支持并启用 CANFD 输出时有效
0x0CEF08xx96 00 06 00 [PGN]PGN: 4字节同步触发输出。例如 PGN=0xFF34(加速度)时,发送 96 00 06 00 34 FF 00 00 可触发模块发送一次加速度帧。该请求无响应帧,发送成功后模块直接输出相应数据帧
0x0CEF08xxA5 00 06 00 [VAL]VAL: 4字节VAL=1 航向复位:重置航向角为 0
VAL=2 设置相对零点:将当前 Pitch、Roll 角度设置为零
VAL=3 自动校平:自动校准到水平位置
VAL=5 取消水平校平:清除相对 Pitch、Roll 角度
0x0CEF08xx9D 00 06 00 01 00 00 00-全局使能节点数据输出(默认)
0x0CEF08xx9D 00 06 00 00 00 00 00-全局关闭节点数据输出
0x0CEF08xx00 00 06 00 00 00 00 00-保存所有配置参数到 Flash
0x0CEF08xx00 00 06 00 01 00 00 00-恢复模块默认用户配置,执行后自动保存并复位
0x0CEF08xx00 00 06 00 FF 00 00 00-复位
0x0CEF08xx9A 00 06 00 [VAL]VAL: 4字节配置波特率(保存设置,复位生效): 0:1000K, 1:800K, 2:500K, 3:250K, 4:125K
0x0CEF08xx9C 00 06 00 [VAL]VAL: 4字节设置J1939 节点ID: 1-127
0x0CEF08xx9E 00 06 00 [VAL]VAL: 4字节设置倾角仪X轴正负方向, 0:默认 1:反向
0x0CEF08xx9F 00 06 00 [VAL]VAL: 4字节设置倾角仪Y轴正负方向, 0:默认 1:反向

📋 地址说明

  • 地址域中xx:J1939协议标识符的源地址(SA),可为任意字节
  • 数据域中xx:任意字节

示例: ID=0x0CEF0855,DATA = 37 01 06 00 64 00 00 00:将PGN:FF37(角速度)设置为100ms周期(10Hz)

时间同步

当前固件中,J1939 的 PGN 65327(时间信息)用于输出UTC时间信息,不作为模块内部时钟的对时输入通道。

如需对模块时间进行UTC同步,请使用前文“同步输入 - SYNC_IN/PPS”章节中描述的 PPS + 串口时间消息方案。

使用说明
  • PGN 65327 可用于读取模块当前输出的UTC时间信息;
  • 当前固件不支持通过发送 J1939 时间帧来校准模块内部时钟;
  • 如项目需要高精度时间同步,请参见前文 PPS 接入与串口时间同步配置要求。
输出示例

以下示例表示模块通过 J1939 输出一帧时间信息,供主机解析当前UTC时间:

CAN ID: 0x0CFF2F08
数据: 18 06 12 0E 1E 2D 58 02
解析:
- UTC年: 0x18 = 24 (2024年)
- UTC月: 0x06 = 6 (6月)
- UTC日: 0x12 = 18 (18日)
- UTC时: 0x0E = 14 (14时)
- UTC分: 0x1E = 30 (30分)
- UTC秒: 0x2D = 45 (45秒)
- UTC毫秒: 0x0258 = 600 (600毫秒)

CAN数据协议(CANopen)

支持 CAN 接口的相关产品通常默认采用 J1939 协议栈。部分产品或交付配置支持 CANopen 从站通信,是否启用以实际产品型号和交付配置为准。CANopen 通信使用标准数据帧,常用数据通过 TPDO1/2/3/4/6/7 传输,不使用远程帧和扩展数据帧。默认配置下,TPDO 采用异步定时触发模式;如需同步模式,可参考后文“同步协议”章节。

CANopen 默认设置

以下默认值适用于常规交付配置,具体仍以实际产品型号和交付配置为准。

默认配置
CAN波特率500 kbit/s
节点ID8
初始化状态Operational
TPDO输出速率1Hz - 200Hz(每个TPDO)

CANopen TPDO

通道帧ID数据长度(DLC)传输方式输出频率(Hz)数据说明
TPDO10x180+ID6异步定时(0xFE)100加速度类型:int16,低字节在前,每个轴2字节,共6字节 分别为X、Y、Z轴加速度,单位为mG(0.001G)
TPDO20x280+ID6异步定时(0xFE)100角速度类型:int16,低字节在前,每个轴2字节,共6字节 分别为X、Y、Z轴角速度,单位为0.1deg/s
TPDO30x380+ID6异步定时(0xFE)100欧拉角类型:int16,低字节在前,每个轴2字节,共6字节 顺序分别为横滚角(Roll)、俯仰角(Pitch)、航向角(Yaw),单位为0.01°
TPDO40x480+ID8异步定时(0xFE)100四元数类型:int16,低字节在前,每个元素2字节,共8字节 分别为w,x,y,z,单位四元数扩大10000倍后结果。如四元数为1,0,0,0时,输出10000,0,0,0
TPDO60x680+ID4异步定时(0xFE)20气压类型:int32,共4字节,单位Pa
TPDO70x780+ID8异步定时(0xFE)100倾角仪角度类型:int32,低字节在前,每个轴4字节,共8字节 顺序分别为X轴、Y轴,单位为0.01°

数据解析示例

加速度和角速度数据解析:

加速度CAN帧: ID=0x188,DATA = 4A 00 1F 00 C8 03

  • ID=0x188:ID为8的设备发送的加速度数据帧
  • 加速度X轴 = 0x004A = 74 = 74mG
  • 加速度Y轴 = 0x001F = 31 = 31mG
  • 加速度Z轴 = 0x03C8 = 968 = 968mG

角速度CAN帧: ID=0x288,DATA = 15 00 14 01 34 00

  • ID=0x288:ID为8的设备发送的角速度数据帧
  • 角速度X轴 = 0x0015 = 21 = 2.1deg/s
  • 角速度Y轴 = 0x0114 = 276 = 27.6deg/s
  • 角速度Z轴 = 0x0034 = 52 = 5.2deg/s

上位机连接CAN设备

使用 PCAN-View 配合 PCAN 适配器,可在接收窗口(Rx Message)中查看收到的 CAN 消息及帧率,如下图所示:

配置指令(SDO协议)

本节常用配置指令均采用快速 SDO。若需要掉电保持,请在配置完成后执行保存配置指令,将参数写入 Flash。

SDO(Service Data Object)协议

快速SDO格式:

主机发送SDO命令到从机:

CAN_IDCS命令符(1B)数据字典索引(2B)子索引(1B)数据(4B)
0x600+ID0x23(写4B)低位在前子索引数据,低位在前

从机回复SDO命令到主机:

CAN_IDSDO命令(1B)数据字典索引(2B)子索引(1B)数据(4B)
0x580+ID0x60(写成功应答)低位在前子索引保留

常用配置指令

修改节点 ID(0x209C)

指令: ID=0x608,DATA=23,9C,20,00,[ID],00,00,00

  • ID修改范围:1-127
  • 如需掉电保持,修改后请保存配置到 Flash,并复位(或重新上电)使其生效
保存配置到 Flash(0x2000)

指令: ID=0x608,DATA=23,00,20,00,00,00,00,00

复位(0x2000)

指令: ID=0x608,DATA=23,00,20,00,FF,00,00,00

恢复出厂设置(0x2000)

指令: ID=0x608,DATA=23,00,20,00,01,00,00,00

⚠️ 警告 恢复出厂设置将恢复模块默认用户配置,执行后模块会自动保存并复位。部分校准相关参数可能保留,请谨慎使用。

修改CAN波特率(0x209A)

指令: ID=0x608,DATA=23,9A,20,00,[BAUD_CODE]

如需掉电保持,修改后请保存配置到 Flash,并复位(或重新上电)使其生效。

  • CAN波特率修改为1000 kbit/s:ID=0x608,DATA=23,9A,20,00,00,00,00,00
  • CAN波特率修改为500 kbit/s:ID=0x608,DATA=23,9A,20,00,02,00,00,00
  • CAN波特率修改为250 kbit/s:ID=0x608,DATA=23,9A,20,00,03,00,00,00
  • CAN波特率修改为125 kbit/s:ID=0x608,DATA=23,9A,20,00,04,00,00,00

TPDO配置

以下配置操作均通过快速 SDO 写入对应数据字典,其中 TPDO 通道与参数索引的对应关系如下:

通道帧ID参数索引地址说明
TPDO10x180+ID0x1800加速度
TPDO20x280+ID0x1801角速度
TPDO30x380+ID0x1802欧拉角
TPDO40x480+ID0x1803四元数
TPDO60x680+ID0x1804气压
TPDO70x780+ID0x1805倾角仪输出
修改/关闭/开启数据输出速率(0x1800-0x1805)

📋 配置说明 此项配置写入后立即生效;如需掉电保持,请另行保存配置。

常用配置示例:

  • ID=0x608,DATA=2B,00,18,05,00,00,00,00 — 关闭加速度输出(1800.5=0)
  • ID=0x608,DATA=2B,00,18,05,05,00,00,00 — 加速度200Hz输出(1800.5=5)
  • ID=0x608,DATA=2B,00,18,05,0A,00,00,00 — 加速度100Hz输出(1800.5=10)
  • ID=0x608,DATA=2B,00,18,05,14,00,00,00 — 加速度50Hz输出(1800.5=20)
  • ID=0x608,DATA=2B,00,18,05,32,00,00,00 — 加速度20Hz输出(1800.5=50)
  • ID=0x608,DATA=2B,00,18,05,64,00,00,00 — 加速度10Hz输出(1800.5=100)

角速度配置:

  • ID=0x608,DATA=2B,01,18,05,00,00,00,00 — 关闭角速度输出(1801.5=0)
  • ID=0x608,DATA=2B,01,18,05,05,00,00,00 — 角速度200Hz输出(1801.5=5)
  • ID=0x608,DATA=2B,01,18,05,0A,00,00,00 — 角速度100Hz输出(1801.5=10)
  • ID=0x608,DATA=2B,01,18,05,14,00,00,00 — 角速度50Hz输出(1801.5=20)
  • ID=0x608,DATA=2B,01,18,05,32,00,00,00 — 角速度20Hz输出(1801.5=50)
  • ID=0x608,DATA=2B,01,18,05,64,00,00,00 — 角速度10Hz输出(1801.5=100)

欧拉角配置:

  • ID=0x608,DATA=2B,02,18,05,00,00,00,00 — 关闭欧拉角输出(1802.5=0)
  • ID=0x608,DATA=2B,02,18,05,05,00,00,00 — 欧拉角200Hz输出(1802.5=5)
  • ID=0x608,DATA=2B,02,18,05,0A,00,00,00 — 欧拉角100Hz输出(1802.5=10)
  • ID=0x608,DATA=2B,02,18,05,14,00,00,00 — 欧拉角50Hz输出(1802.5=20)
  • ID=0x608,DATA=2B,02,18,05,32,00,00,00 — 欧拉角20Hz输出(1802.5=50)
  • ID=0x608,DATA=2B,02,18,05,64,00,00,00 — 欧拉角10Hz输出(1802.5=100)

四元数配置:

  • ID=0x608,DATA=2B,03,18,05,00,00,00,00 — 关闭四元数输出(1803.5=0)
  • ID=0x608,DATA=2B,03,18,05,05,00,00,00 — 四元数200Hz输出(1803.5=5)
  • ID=0x608,DATA=2B,03,18,05,0A,00,00,00 — 四元数100Hz输出(1803.5=10)
  • ID=0x608,DATA=2B,03,18,05,14,00,00,00 — 四元数50Hz输出(1803.5=20)
  • ID=0x608,DATA=2B,03,18,05,32,00,00,00 — 四元数20Hz输出(1803.5=50)
  • ID=0x608,DATA=2B,03,18,05,64,00,00,00 — 四元数10Hz输出(1803.5=100)

气压配置:

  • ID=0x608,DATA=2B,04,18,05,00,00,00,00 — 关闭气压输出(1804.5=0)
  • ID=0x608,DATA=2B,04,18,05,05,00,00,00 — 气压200Hz输出(1804.5=5)
  • ID=0x608,DATA=2B,04,18,05,0A,00,00,00 — 气压100Hz输出(1804.5=10)
  • ID=0x608,DATA=2B,04,18,05,14,00,00,00 — 气压50Hz输出(1804.5=20)
  • ID=0x608,DATA=2B,04,18,05,32,00,00,00 — 气压20Hz输出(1804.5=50)
  • ID=0x608,DATA=2B,04,18,05,64,00,00,00 — 气压10Hz输出(1804.5=100)

📋 配置示例说明 以 TPDO1(加速度)输出速率为 100 Hz(每 10 ms 输出一次)为例:0x23 表示 SDO 写入 4 字节,0x00 0x18 对应索引 0x18000x05 为子索引,0x0A 0x00 表示周期值 10(单位 ms),剩余字节补 0

设置倾角仪零点(0x20A5)
  • ID=0x608,DATA=23,A5,20,00,02,00,00,00 — 写入后即设置当前位置为输出零点(X=0,Y=0)
  • ID=0x608,DATA=23,A5,20,00,05,00,00,00 — 写入后取消零点配置,输出真实的X、Y角度(相当于X、Y offset=0)

同步协议

模块支持将各个 TPDO 配置为同步模式。启用后,模块停止异步定时发送,转而等待 CANopen 同步帧;当同步帧到来时,再发送一帧对应的 TPDO 数据。

配置TPDO为同步模式

如需将某个 TPDO 配置为同步模式,可将对应 TPDO 通讯参数字典 [0x180x.2](Transmission type)设置为 0x01。相关字段定义请参考标准 CANopen 协议说明。

以TPDO1(加速度信息)为例:

  • ID=0x608,DATA=2F,00,18,02,01,00,00,00 — 写入 [0x1800.2] = 1,将 TPDO1 通讯模式设置为同步模式
  • ID=0x608,DATA=2F,00,18,02,FF,00,00,00 — 写入 [0x1800.2] = 0xFF,将 TPDO1 通讯模式设置为异步模式(出厂默认)
发送CANopen同步帧

发送 CANopen 同步帧:ID=0x80,DATA 为空

模块接收到同步帧后,所有配置为同步模式的TPDO会发送一帧数据,实现同步。

设置心跳包

心跳包周期通过写入 [0x1017.0] 设置,有效范围 0~65535,单位为 ms。其中 0 表示禁用心跳包。

示例: ID=0x608,DATA=2B,17,10,00,64,00,00,00 — 设置心跳包周期为100ms

地磁校准

地磁校准适用场景

9 轴模式(磁辅助绝对航向角模式)建议在满足以下条件时使用:

  1. 首次使用 9 轴模式前,至少进行一次用户地磁校准
  2. 使用环境中不存在明显空间磁场干扰;建议在室外空旷处校准,室内复杂磁环境下难以保证校准效果
  3. 模块与安装载体(PCB、外壳、机器人等)的相对位置在使用过程中保持固定

地磁校准步骤

当首次使用模块且需要使用 AHRS(9 轴)模式时,应按以下步骤进行校准操作:

1. 模式切换

先将模块切换到 9 轴模式,详见“工作模式配置”章节。

2. 环境检查

常见磁场干扰源: 铁质家具、电脑显示器、电机与变压器、手机充电器、建筑钢筋结构等。

推荐校准环境:

  • 最佳:室外空旷场地,远离建筑物和车辆(距离 > 5m)
  • 可接受:室内远离干扰源的区域(距离 > 30cm)

⚠️ 重要提示

如果模块已安装在产品的PCB上,或产品具有磁性外壳,或已安装在机器人/机械设备上,必须将这些与模块固联的物体视为一个整体进行校准。单独校准模块后再安装到产品中无法达到校准效果。

3. 校准操作

发送校准指令: CONFIG MCAL START(需固件版本 ≥ 1.7.0)

执行校准动作:

  1. 在尽量小的空间范围内保持位置基本不变,仅缓慢旋转模块
  2. 每个轴至少旋转 360°(建议 2~3 圈),速度保持均匀,推荐 20~100 deg/s(约 5~20 秒转一圈),避免中途停顿
  3. 校准时间通常需要 30~60 s

建议旋转方案: 绕X轴旋转2圈 → 绕Y轴旋转2圈 → 绕Z轴旋转2圈,或随机旋转确保每个轴都经历充分的角度变化

4. 校准状态查询

发送指令:LOG MCAL STAT

返回示例:

STAT=1
PROGRESS=8
OK

状态字段STAT

STAT值状态说明操作建议
0当前空闲可以开始新的校准
1正在校准中继续旋转模块,等待校准完成
2正在验证结果保持静止,等待验证完成
3校准已完成校准成功,可以正常使用
4校准失败参考故障排查流程,重新校准

PROGRESS:范围 0~100,表示当前校准进度百分比。当 PROGRESS=100STAT=3 时,表示校准成功。

5. 校准结果验证

  1. 校准完成后,水平放置模块,缓慢旋转一周(360°)
  2. 观察航向角输出:理想情况下应连续变化 0°~360° 且无跳变,可接受误差在 ±5° 以内
  3. 若出现大角度跳变(>10°)或航向角不随旋转变化,请参考下文“校准故障排查流程”

校准故障排查流程

当校准失败(STAT=4)或验证结果异常时,按以下步骤排查:

步骤1:检查环境磁场强度

在校准位置静止放置模块,读取磁场强度(mag_b 字段),计算磁场总强度:B_total = √(Bx² + By² + Bz²)

磁场强度环境评估处理建议
20-60 μT正常可以继续校准
< 20 μT 或 > 60 μT异常检查是否靠近强磁性物体,远离磁场干扰源,必要时更换位置

步骤2:检查旋转动作 - 确保每个轴至少旋转 360°,速度保持在 20~100 deg/s,避免停顿

步骤3:检查空间磁场干扰 - 在同一位置、不同朝向测量磁场强度。若变化 > 10 μT,说明存在空间磁场干扰,需更换位置或改用 6 轴模式

常见问题及解决方案

失败原因典型现象解决方案
环境磁场干扰过大STAT=4或航向角跳变更换校准环境至室外空旷处
旋转动作不规范PROGRESS增长缓慢或停滞确保每个轴充分旋转,速度均匀
旋转时位置移动校准完成但精度差校准时保持位置固定,仅旋转姿态
模块与载体位置变化重新安装后航向角误差增大将模块与载体作为整体重新校准

重要提醒

⚠️ 警告1:室内磁场环境限制 - 室内空间磁场干扰严重且无法通过校准消除,地磁辅助(9轴)模式航向角精度很大程度上取决于室内磁场畸变程度。

⚠️ 警告2:室内使用建议 - 若室内磁场环境较差(电脑机房、实验室、车间、地下车库等),即使校准成功,航向角精度可能仍不如6轴模式,甚至会出现大角度误差(>10°)。建议在室内环境下优先使用6轴模式。

⚠️ 警告3:固定安装要求 - 若安装环境存在磁场干扰,该干扰源必须与模块保持固定相对位置。模块安装在导磁刚体(机器人/机械设备/车辆/船舶/三脚架/PCB板等)之上时,需要将整个系统一起旋转校准。模块在使用过程中不应与被安装体发生相对位移,一旦分离需要重新校准。

⚠️ 警告4:电机振动影响 - 机器人电机运行时产生的振动和磁场干扰可能影响校准效果。建议在电机停止状态下进行校准,或在实际工作状态下校准(将电机磁场视为固定干扰源)。

校准频率与模式选择

校准频率建议:

  • 固定安装且环境稳定时,首次校准 1 次即可;
  • 移动应用在每次更换环境后建议重新校准;
  • 模块与载体相对位置发生变化时应重新校准;
  • 长期使用(>1 年)建议每年校准 1 次;
  • 出现异常航向角误差时应立即重新校准。

模式选择建议:

应用场景推荐模式原因
室外空旷环境(无人机等)9轴模式磁场干扰小,可获得绝对航向角
室内环境(AGV、机器人等)6轴模式室内磁场干扰大,6轴模式更稳定
靠近电机/电磁设备6轴模式电磁干扰无法通过校准消除
需要绝对航向角9轴模式必须确保环境磁场稳定且完成校准
仅需相对航向角6轴模式6轴模式航向角上电为0,适合相对测量

附录1 四元数/欧拉角/旋转矩阵互转

四元数转旋转矩阵

给定四元数[Qb2n=[q0,q1,q2,q3]T],方向余弦矩阵为:

Cb2n=[q02+q12q22q322(q1q2q0q3)2(q1q3+q0q2)2(q1q2+q0q3)q02q12+q22q322(q2q3q0q1)2(q1q3q0q2)2(q2q3+q0q1)q02q12q22+q32]

四元数转欧拉角 - 东北天(ENU)-312(先转Z,然后X轴,最后Y轴)旋转顺序下的欧拉角

给定四元数 Qb2n=[q0,q1,q2,q3]T,其中 q0 为标量部分,[q1,q2,q3] 为矢量部分。Qb2n代表b系到n系的坐标旋转四元数:其中:

  • pitch(θ):绕X轴的旋转角度,范围 [π2,π2]
  • roll(φ):绕Y轴的旋转角度,范围 [π,π]
  • yaw(ψ):绕Z轴的旋转角度,范围 [π,π]

四元数转欧拉角:

pitch=arcsin(2(q0q1+q2q3))roll=arctan2(2(q1q3q0q2),q02q12q22+q32)yaw=arctan2(2(q1q2q0q3),q02q12+q22q32)

欧拉角转四元数:

[q0q1q2q3]=[cos(pitch2)cos(roll2)cos(yaw2)sin(pitch2)sin(roll2)sin(yaw2)cos(roll2)cos(yaw2)sin(pitch2)cos(pitch2)sin(roll2)sin(yaw2)cos(pitch2)cos(yaw2)sin(roll2)+cos(roll2)sin(pitch2)sin(yaw2)cos(pitch2)cos(roll2)sin(yaw2)+sin(pitch2)sin(roll2)cos(yaw2)]

四元数转欧拉角 - 北东地(NED)-321(先转Z轴,然后Y轴,最后X轴)旋转顺序下的欧拉角

给定四元数 Qb2n=[q0,q1,q2,q3]T,其中 q0 为标量部分,[q1,q2,q3] 为矢量部分。Qb2n​代表b系到n系的坐标旋转四元数:其中:

  • pitch(θ):绕Y轴的旋转角度,范围 [π2,π2]
  • roll(φ):绕X轴的旋转角度,范围 [π,π]
  • yaw(ψ):绕Z轴的旋转角度,范围 [π,π]

四元数转欧拉角:

roll=arctan2(2(q0q1+q2q3),12(q12+q22))pitch=arcsin(2(q0q2q1q3))yaw=arctan2(2(q0q3+q1q2),12(q22+q32))

欧拉角转四元数:

[q0q1q2q3]=[cos(roll2)cos(pitch2)cos(yaw2)+sin(roll2)sin(pitch2)sin(yaw2)sin(roll2)cos(pitch2)cos(yaw2)cos(roll2)sin(pitch2)sin(yaw2)cos(roll2)sin(pitch2)cos(yaw2)+sin(roll2)cos(pitch2)sin(yaw2)cos(roll2)cos(pitch2)sin(yaw2)sin(roll2)sin(pitch2)cos(yaw2)]

附录2 固件升级

本产品支持固件升级。请使用 CHCenter 上位机软件按下图步骤进行升级;固件升级文件(.hex)请联系技术支持获取。

附录3 关于磁干扰的更多知识

磁干扰可分为空间磁场干扰与传感器坐标系下的磁场干扰,如下图所示:

磁干扰类型随传感器坐标系的磁场干扰
(硬磁干扰/软磁干扰)
空间磁场干扰
特点干扰源随传感器运动而运动干扰源不随传感器运动而运动
典型干扰源与模块固定在一起的PCB、金属外壳、无人机等家具、家用电器、线缆、房屋内的钢筋结构等
校准可能性可以不可能
抗干扰措施可以通过用户磁校准过程消除无论如何校准都无法消除,会严重影响航向角误差

空间磁场干扰说明 空间磁场干扰是造成室内地磁融合难以稳定使用的主要原因。这类干扰无法通过校准消除,会显著增大航向角误差。在室内环境中,尤其是靠近桌椅、家电等区域时,这类干扰通常更明显。

📋 图例说明 上图展示了典型的室内空间磁场干扰分布:蓝色表示弱干扰区,红色表示强干扰区。

附录5 技术支持

新产品与资料信息可通过官方网站及公众号获取。 微信:

Telegram: