Skip to content

指令与编程手册

Rev 1.7.2

适用于 HiPNUC IMU / AHRS / MRU 产品的公开指令与数据接口

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

© 2016–2026 北京超核电子科技有限公司 版权所有。文档包含的信息可能在未经通知的情况下发生更改。

文档范围与版本

关于本手册

本手册是 HiPNUC IMU / AHRS / MRU 产品的 指令与编程参考,面向需要直接对接模块、配置参数、解析数据或集成到上层系统的工程师。

适用产品:HiPNUC IMU / AHRS / MRU 标准产品的公开编程接口。具体功能以实际产品型号、固件版本及交付配置为准;未启用的传感器、CAN、RS-485 或 MRU 功能不会产生对应输出。本手册仅涵盖编程与数据接口;引脚定义、机械尺寸、供电与电气规格请参阅对应产品的硬件手册。

适用固件版本:不同固件版本指令略有差异。查看方法:串口发送 LOG VERSION,或在 CHCenter 上位机中查看,然后按下表选择对应手册。

你的硬件固件版本对应手册版本获取
1.7.1及以上Rev 1.7.2本手册(即本文档)
1.7.0及以下Rev 1.3.0imu_cum_cn_150_170.pdf

注意:版本号换算LOG VERSION 返回的 APP_VER 为整数编码,主版本 = APP_VER / 100,次版本 = (APP_VER % 100) / 10,修订号 = APP_VER % 10(以上除法均为整数除法,向下取整)。例如 APP_VER=172 表示固件 1.7.2。CHCenter 直接显示点分版本,两处来源一致。

手册结构

内容适用读者
1文档范围与版本确认产品、固件和阅读路径
2基础约定(坐标系 / 数据类型 / 状态字)解析数据前必读
3产品功能与配置配置模块功能
4地磁校准与磁环境配置 9 轴绝对航向前必读
5ASCII 命令参考命令语法速查
6统一数据字典跨协议物理量语义
7串口二进制协议(HI91 / HI83)解析二进制输出
8Modbus RTU 协议集成 RS-485
9CAN 协议(J1939 / CANopen)集成 CAN
附录A 姿态数学 / B 固件升级 / C 带宽 / D 出厂默认配置 / E 缩略词表 / F 开发资源参考

读者路径

目标先读再读
配置串口、工作模式、安装方向「产品功能与配置」「ASCII 命令参考」、附录「出厂默认配置」
解析 HI91 / HI83 二进制数据「基础约定」、「统一数据字典」「串口二进制协议」
集成 Modbus / J1939 / CANopen「基础约定」、「统一数据字典」「Modbus RTU 协议」「CAN 协议」
使用 9 轴绝对航向「工作模式」「地磁校准与磁环境」
使用 MRU 海浪补偿输出「海浪补偿 / MRU 输出」「统一数据字典」「串口二进制协议」「Modbus RTU 协议」
估算带宽或查默认配置附录「输出带宽与波特率」附录「出厂默认配置」

体例约定:命令关键字、寄存器、十六进制以 等宽字体 标注;提示框使用 警告(误用会导致解析错误、配置损坏或精度/通讯异常)和 注意(补充说明与示例);坐标系、字节序、比例因子统一定义见「基础约定」;常见缩写与术语见附录「缩略词与术语表」。

快速接入流程

首次接入建议按下列顺序完成最小闭环;确认数据正确后,再进入对应协议章节做系统集成。

步骤操作验证
1按硬件手册连接电源、地线和通讯接口上位机或串口工具可打开端口
2串口使用 8N1,默认 115200 bps;发送 LOG VERSION能读到 PNAMESNAPP_VER
3按「统一数据字典」和对应协议章节解析数据静止时加速度模长约 1 G,角速度接近 0

基础约定

本章集中定义全手册通用的坐标系、姿态表示、航向约定、数据类型与字节序、时间戳及状态字。各协议章节均引用本章,不再重复定义。 在解析任何数据前,请先阅读本章。

坐标系与方向约定

模块涉及三个右手坐标系:

坐标系记号定义
传感器坐标系b(载体系)固联于模块,X/Y/Z 轴方向印在外壳/PCB 丝印上。所有 IMU 原始量(加速度、角速度、磁场)在此系下表示。
用户坐标系由安装方向 URFR 将传感器系映射得到(见「安装方向」)。默认 24 时与传感器系一致。
世界坐标系n(世界系)姿态的参考系,默认 东北天 ENU,可切换 北西天 NWUCONFIG IMU COORD)。

东北天(ENU):X 轴指东、Y 轴指北、Z 轴指天。北西天(NWU):X 轴指北、Y 轴指西、Z 轴指天。均为右手系。

旋转正方向遵循右手定则:右手拇指指向轴正向,四指弯曲方向即为该轴正旋转方向。

姿态表示

模块同时输出 欧拉角四元数 两种姿态表示。

  • 欧拉角:横滚 roll、俯仰 pitch、航向 yaw,单位度。默认 ENU 下采用 312 旋转顺序(先绕 Z 转 yaw、再绕 X 转 pitch、最后绕 Y 转 roll)——此约定下 pitch 绕 X 轴、roll 绕 Y 轴(与直觉相反,详见附录 A);切换到 NWU 后改用 321 顺序(绕 Z→Y→X),变为 roll 绕 X 轴、pitch 绕 Y 轴,与 ENU 相反(详见附录 A)。量程:roll ∈ [−180°, 180°],pitch ∈ [−90°, 90°],yaw ∈ [−180°, 180°]。
  • 四元数:顺序 WXYZq0 为标量部分),表示载体系到世界坐标系的旋转 Qb2n

四元数 ↔ 欧拉角 ↔ 旋转矩阵的完整互转公式见“附录 A”。

注意:俯仰 ±90° 奇异点:当 pitch 接近 ±90° 时欧拉角存在万向锁奇异,roll/yaw 不再唯一。对高仰角姿态,建议使用四元数。

航向(yaw)约定

警告:航向是最易混淆之处:模块在不同协议/坐标系下对 yaw 的表示并不统一,请对照下表理解。

输出位置航向表示正方向
HI91 / HI83 / CANopen原始 yaw,范围 ±180°逆时针为正(ENU)
Modbus YAW 寄存器原始 yaw,范围 ±180°逆时针为正
J1939 YAW 报文(前 4 字节)0–360°顺时针为正
J1939 YAW 报文(后 4 字节)±180°逆时针为正

ENU 与 NWU 世界坐标系下,yaw 的零点朝向不同,且 roll/pitch 所绕轴的指派也随之改变(ENU 为 312、NWU 为 321,见「姿态表示」);切换坐标系(CONFIG IMU COORD)后请重新确认航向基准与欧拉角约定。

9 轴 AHRS 模式下,yaw 默认参考磁北;本产品不在手册公开接口中输出真北修正航向。若系统需要真北航向,请主机按使用地点、日期和磁偏角模型进行修正。

数据类型、字节序与比例因子

数据类型:

记号含义字节
u8 / u16 / u32 / u64无符号整型1 / 2 / 4 / 8
i8 / i16 / i32有符号整型(二进制补码)1 / 2 / 4
floatIEEE-754 单精度浮点4
doubleIEEE-754 双精度浮点8

字节序:

协议字节序
HiPNUC 二进制(HI91/HI83)小端(低字节在前)
J1939 / CANopen小端
Modbus RTU大端(每寄存器 2 字节,高字节在前)

位编号约定:本手册所有位字段(如 MAIN_STATUS、HI83 数据位图)均以 bit0 表示最低位(LSB),bitN 为自最低位起第 N 位;故位掩码 0x00000FFF 即 bit0–bit11、0x000000FF 即 bit0–bit7。

比例因子约定:整型协议中以比例因子还原物理量,物理值 = 原始值 × 比例因子。例如 Modbus 加速度原始值 1000,比例因子 0.00048828,物理值 = 0.488 G。浮点协议(HI91/HI83 的 float/double 字段)已是工程单位,比例因子为 1。

警告:同一物理量在不同协议中的类型/比例因子/单位不同,详见「统一数据字典」。

时间与时间戳

数据帧中的 system_time(HI91 为 u32,单位 ms)含义随对时状态变化:

  • 未完成 UTC 对时:为本地单调毫秒计数按 24 h 回绕,范围 0~86,399,999 ms;不含日期,不表示绝对 UTC;
  • 已完成 UTC 对时:为 当日 UTC 毫秒计数(自当日 00:00:00 起,按 24 h 回绕)。

对时状态可由 MAIN_STATUSUTC_UNSYNC 位判断(见「MAIN_STATUS 状态字」)。UTC 对时通过 PPS + 串口时间消息实现,硬件接线与时序要求见「同步功能」。

当日 UTC 毫秒时间戳:

范围0 ~ 86,399,999 ms
对应00:00:00.000 ~ 23:59:59.999
精度1 ms

换算显示时间时可按 hh=system_time/3600000mm=(system_time/60000)%60ss=(system_time/1000)%60ms=system_time%1000 解析。换算示例:

system_time (ms)对应当日 UTC 时间
000:00:00.000
3,661,00001:01:01.000
43,200,00012:00:00.000
86,399,99923:59:59.999

注意:时间戳不含日期与时区信息,默认按 UTC+0 解释;如需本地时间请由主机叠加时区偏移。HI83 另提供 system_time_us(u64,本地高分辨率微秒)与 utc(完整年月日时分秒)两种时间字段;utc 字段是否为有效 UTC 同样以 UTC_UNSYNC 判断。

MAIN_STATUS 状态字

MAIN_STATUS 为 16 位状态字,出现在 HI91、HI83 等输出中,统一定义如下

名称=1 含义=0 含义
0–2保留
3WB_CONV陀螺零偏未收敛,精度较差(建议静止 3~5 s)零偏收敛良好
4MAG_DIST9 轴模式下运行时磁场可信度异常(磁场超范围、尚未完成旋转验证或检测到磁扰),航向角可能退化为惯性保持磁场可信度正常,或处于 6 轴模式
5ACC_SAT当前或最近 2 s 内加速度计量程饱和连续 2 s 无加速度饱和
6GYR_SAT当前或最近 2 s 内陀螺仪量程饱和连续 2 s 无陀螺饱和
7ATT_CONV姿态估计未充分收敛,精度较差(建议静止片刻)姿态精度正常
8保留
9STATIC设备被判定为静止设备未判定为静止
10MAG_AIDING磁辅助模式使能(9 轴模式);实际每周期磁更新仍受磁场可信度与算法降权控制磁辅助模式关闭(6 轴模式)
11UTC_UNSYNCUTC 同步,system_time 为本地 24 h 回绕毫秒计数UTC 已同步,system_time 为当日 UTC 毫秒
12SOUT_PULSE当前数据帧对应一次 SOUT 脉冲输出当前帧不对应 SOUT 脉冲
13保留
14–15保留

注意UTC_UNSYNC 位为“1 表示未同步”,请勿按字面误解为“已同步”。SOUT_PULSE 用于与外部采集设备或主机采样时序做时间同步对齐。

保留位:保留位由固件内部使用,取值不保证为 0;客户端应屏蔽并忽略所有保留位,仅判断本表已定义的位,以保证前向兼容。

产品功能与配置

本章按功能介绍模块的配置项、使用场景与操作流程。具体命令语法见「ASCII 命令参考」,输出数据格式见「统一数据字典」及后续各协议章。

工作模式(姿态 / 航向 Profile)

模块通过 CONFIG ATT MODE(见「CONFIG 配置命令」)选择姿态 / 航向 profile。常用公开 profile 如下:

  • 6 轴(VRU)模式:仅用加速度计 + 陀螺仪,输出 相对航向(上电航向为 0),不受磁场干扰,适合室内、机器人、近电机等磁环境复杂场景。
  • 9 轴(AHRS)模式:融合磁力计,输出 绝对航向(相对地磁北)。需在洁净磁环境使用并完成地磁校准(见「地磁校准与磁环境」)。
  • 专用运动 profile:针对特定载体运动约束优化,如人形机器人、低速地面平台、低动态倾角仪等。具体可选值见「CONFIG ATT MODE」。

警告:室内/机器人慎用 9 轴:室内环境与电机磁场易干扰磁力计,导致航向误差。此类场景建议优先使用 6 轴模式。

安装方向(URFR)

CONFIG IMU URFR <CODE>(见「CONFIG 配置命令」)用于声明模块的安装方向,使输出对齐到用户期望的右-前-上方向。

CODE 写作 ABC 三位数字(2 位时等价于补前导零,如 24 = 024):A/B/C 分别表示用户坐标系 X/Y/Z 轴对应传感器系的哪个方向:

数字方向数字方向
0+X1−X
2+Y3−Y
4+Z5−Z

须满足右手系约束(X × Y = Z)。查表时按模块的物理朝向直接选取对应命令即可,无需手工套用上方“用户轴 → 传感器方向”的编码规则——下表 24 种合法安装中「右 / 前 / 上」指传感器 X / Y / Z 轴在载体(用户)系中的实际指向(与上方编码规则互为逆视角;如需自定义表外方向,请按编码规则从“用户轴”出发推算,勿照搬本表的传感器轴观察方向):

IMU 轴指向(X,Y,Z)命令说明
右,前,上URFR 24默认水平安装(=024)
右,后,下URFR 35绕 X 翻转倒装(=035)
右,下,前URFR 43侧装(Right+Down)
右,上,后URFR 52侧装(Right+Up)
左,前,下URFR 125X 反向、Z 向下倒装
左,后,上URFR 134X/Y 反向、Z 向上
左,上,前URFR 142左向立装,Y 朝上
左,下,后URFR 153左向立装,Y 朝下
前,右,下URFR 205前向安装,X 沿车头
后,右,上URFR 214后向安装,Y 朝右
上,右,前URFR 240立装,X 朝上
下,右,后URFR 251立装,X 朝下
前,左,上URFR 304前向安装,Y 朝左
后,左,下URFR 315后向倒装
下,左,前URFR 341左向立装,X 朝下
上,左,后URFR 350左向立装,X 朝上
前,上,右URFR 402前向立装,Z 朝右
后,下,右URFR 413后向立装
下,前,右URFR 421立装,X 朝下、Z 朝右
上,后,右URFR 430立装,X 朝上、Z 朝右
前,下,左URFR 503前向立装,Z 朝左
后,上,左URFR 512后向立装
上,前,左URFR 520立装,X 朝上、Z 朝左
下,后,左URFR 531立装,X 朝下、Z 朝左

世界坐标系(ENU/NWU)通过 CONFIG IMU COORD 切换,见「CONFIG 配置命令」。

姿态校准

CONFIG ATT RST(见「CONFIG 配置命令」)用于用户姿态零点操作:航向复位、相对零点、自动校平、取消校平。执行时设备须静止;自动校平仅在设备接近水平正放时生效。

CONFIG USRCAL(见「CONFIG 配置命令」)用于用户级陀螺比例校准,标定陀螺 Z 轴比例因子,降低水平旋转载体的长期航向累计误差。该功能适用于 AGV、大型水平移动机器人、转台等可控水平旋转场景;不适合手持随意旋转或无法准确计量旋转角度的场景。操作步骤:

  1. 将模块连同载体放在水平、平整地面,环境温度稳定、无强振动;
  2. 发送 CONFIG USRCAL START <ANGLE>(角度 360°~3600°);
  3. 以 20~100 deg/s 匀速水平旋转设定角度(方向任意,勿停顿、勿突变);
  4. 旋转完成后发送 CONFIG USRCAL STOP,成功返回 OK。建议人工或转台控制实际旋转角度误差不超过 ±5°;若实际角度与设定角度偏差过大,校准会引入新的比例误差。

常见失败原因:旋转不规范(太快、太慢、中途停顿或明显摆动)、环境振动、实际旋转角度与设定值偏差过大。

同步功能

模块的同步功能依赖 SYNC_IN/PPSSOUT 引脚,包含三类用途。下图为逻辑分析仪实测波形,以 SYNC_IN 触发模式为例:SYNC_IN/PPS 上升沿触发该帧输出,模块在数据帧发送前先输出 SOUT 帧前脉冲,脉冲下降沿后紧接数据帧。注意 SOUT 帧前脉冲对每次输出的数据帧都会产生,并不依赖 SYNC_IN 触发(详见「SOUT 同步输出」)。

图:逻辑分析仪实测——SYNC_IN 触发后,SOUT 先输出帧前脉冲,其下降沿紧接串口数据帧(5A A5…)。

SYNC_IN 同步数据触发

通过外部脉冲触发数据输出。模块检测到 SYNC_IN/PPS 引脚上升沿后,输出已配置为同步触发模式的数据帧;该帧不再周期发送。

  • 串口协议:用 LOG <MSG> ONMARK 1 将目标帧配置为脉冲触发(见「LOG 命令」)。
  • J1939:将目标 PGN 的发送周期设为 0x8000(见「J1939 配置协议」)。

不使用该功能时,引脚建议悬空或接地。

PPS 标准秒脉冲对时

使用 SYNC_IN/PPS 引脚接入外部 1PPS 秒脉冲,配合串口接收时间消息,可为启用该功能的交付配置提供精确 UTC 时间同步。模块检测到有效 PPS 上升沿并收到匹配的时间消息后,内部时钟自动对齐到 UTC 整秒。

参数描述有效范围推荐
t0相邻秒脉冲上升沿间隔990~1010 ms1000 ms
t1秒脉冲高电平时间(脉宽)1~100 ms10~50 ms
t2时间消息传输时间与波特率相关
t3时间消息相对最近一次脉冲上升沿的延迟固件配对窗口内0~100 ms

警告:核心要求:用于对时的时间消息必须携带整秒 UTC 时间,并在最近一次 PPS 的配对窗口内到达。工程上建议尽量靠近 PPS 上升沿发送,并保持相位稳定。

硬件与接口要求

  • SYNC_IN/PPS:上升沿有效;高电平 ≤ 5V(TTL/CMOS 兼容)。
  • 串口 RX:时间消息频率 1~10 Hz(推荐 1 Hz);波特率必须与模块当前配置一致;仅支持固件定义的 UTC 时间消息。

模块仅从时间消息中提取 UTC 时间(时/分/秒/毫秒)与日期(年/月/日) 字段用于对时,其余字段忽略。对时成功后 system_time 含义见「时间与时间戳」。该输入消息格式属于交付配置的一部分;如需使用 PPS 对时,请以对应产品交付说明为准。

SOUT 同步输出

SOUT 为同步输出引脚。无数据输出时为低电平;一帧数据开始发送前先输出一个高脉冲,脉冲下降沿后紧接数据。可用于触发相机等设备实现严格时间同步。对应数据帧的 MAIN_STATUSSOUT_PULSE 位(见「MAIN_STATUS 状态字」)置 1。

多功能 IO 复用(PMUX)

模块提供多个多功能引脚(IOx),各引脚有默认复用功能,也可经 CONFIG PMUX<n> IO<m>(如 CONFIG PMUX2 IO3,见「CONFIG 配置命令」)重新映射:

功能名称方向说明默认 IO
PMUX1SYNC_IN/PPS输入同步脉冲输入(见「同步功能」)IO1
PMUX2SOUT输出帧前同步脉冲输出(见「SOUT 同步输出」)IO2
PMUX3LED输出运行状态指示灯IO5

注意:并非所有 IO 引脚都会在具体产品上引出,详见对应产品硬件手册。

产品专属功能

以下功能仅特定型号或特定交付配置支持,其余型号可跳过本节。

倾角仪输出(仅 HI50 等特定型号)

倾角仪将载体相对水平面的倾斜以“倾角”语义输出,适用于平台调平、角度监测、工程机械姿态等场景。倾角由姿态解算得到:

  • X 轴倾角:基于横滚,量程双轴 ±180°、单轴可配 0–360°;
  • Y 轴倾角:基于俯仰,量程 ±90°。

输出位置:HI83(bit9)、Modbus(0x4A / 0x4B)、J1939(PGN 0xFF4A)、CANopen(TPDO7);各协议比例因子见「统一数据字典」。

方向与零点:各轴输出方向可独立反向(0=默认、1=反向,J1939 配置见「J1939 配置协议」);倾角零点通过“姿态相对零点”实现(CONFIG ATT RST 2,见「CONFIG 配置命令」;CANopen 对应「CANopen 配置指令」的 0x20A5)。配置后建议复位或重新上电复核。

海浪补偿 / MRU 输出(Heave / Surge / Sway)

MRU 交付配置用于估计船舶或海上平台的周期性运动,输出三轴位移与主频信息:

运动轴描述输出
Heave升沉 / 垂荡垂向位移、频率
Surge纵荡 / 纵移船首-船尾方向位移、频率
Sway横荡 / 横移左右方向位移、频率

数据通过 HI83(bit10 位移 / bit11 频率)或 Modbus(0x4E–0x50 位移、0x51–0x53 频率)输出,见「统一数据字典」。MRU 输出反映周期运动估计结果,不作为绝对位置或航迹信息使用。

应用场景:船舶动态监测与姿态控制、海洋工程作业补偿(起重、对接)、波浪特性研究、海上平台姿态稳定分析。

使用限制

警告:重要限制

  • 仅适用于周期性往复运动;以下情况通常无法准确测量:周期过长的运动(> 30 s)、单向线性运动、阶跃式位移。
  • 零均值假设:算法假设位移的长期平均值为 0。
  • 初始化时间:需稳定的 5~20 个海浪周期 作为初始化时间才能获得正确结果。
  • 频率响应范围:典型海浪周期 3~20 s,超出此范围精度下降。

地磁校准与磁环境

地磁校准用于消除随模块一起运动的硬磁/软磁干扰,是 9 轴(AHRS / 磁辅助绝对航向)模式 获得可靠航向角的前提。仅使用 6 轴(VRU)模式时无需进行地磁校准。

注意:流程概要:切换到 9 轴模式 → 在洁净磁环境下连同载体整体缓慢旋转各轴 → 用 LOG MCAL STAT 观察进度 → 旋转一周验证航向角连续无跳变。

适用场景

9 轴模式建议在同时满足以下条件时使用:

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

警告:室内环境优先 6 轴:室内空间磁场畸变无法通过校准消除,即使校准成功,9 轴航向角精度也可能不如 6 轴模式。机房、实验室、车间、地下车库等场景建议优先使用 6 轴模式。

运行时可信度判断:

状态位含义主机处理建议
MAIN_STATUS.MAG_AIDING=1磁场参与航向解算绝对航向可用的前提,仍需结合环境判断
MAIN_STATUS.MAG_AIDING=0磁场未参与航向解算yaw 按 6 轴相对航向逻辑处理,长期会漂移
MAIN_STATUS.MAG_DIST=1检测到磁干扰或磁场状态异常绝对航向不可信,优先排查环境或改用 6 轴模式

控制系统不要只根据 yaw 数值判断可靠性,应同时检查 MAIN_STATUS 中的磁辅助与磁干扰状态位。

校准步骤

第 1 步:切换工作模式

先将模块配置为 9 轴模式(CONFIG ATT MODE 1,详见「工作模式」),然后复位或重新上电,再通过 MAIN_STATUS.MAG_AIDING=1 或配置读回确认磁辅助模式已使能。

第 2 步:检查校准环境

常见磁场干扰源:磁铁、扬声器、磁性螺丝、铁质家具、钢制工装、车辆底盘、电脑显示器、电机与变压器、大电流线缆、手机充电器、建筑钢筋结构等。

环境等级要求
最佳室外空旷场地,远离建筑物和车辆(距离 > 5 m)
仅用于临时验证室内远离钢结构、电机、大电流线缆和磁体的区域;量产验收应使用室外空旷场地,或使用已通过 B_total 与航向旋转验证的固定场地

警告:整体校准原则:若模块已焊装在产品 PCB 上、采用磁性外壳,或已安装在机器人/机械设备上,必须将与模块固联的整体一起旋转校准。单独校准模块后再装入产品将失效。

第 3 步:执行校准

发送校准指令:CONFIG MCAL START(需固件版本 ≥ 1.7.0)。模块进入校准流程后会采集旋转过程中的三轴磁场样本,并自动拟合硬磁/软磁补偿参数,无需再发送结束指令。

旋转要领:

  1. 在尽量小的空间范围内保持位置基本不变,仅缓慢旋转模块;若模块已与载体固联,则旋转模块与载体整体;
  2. 覆盖尽可能多的姿态方向;3D 校准建议每个轴至少旋转 360°(建议 2~3 圈),速度均匀,推荐 20~100 deg/s(约 4~18 秒/圈),避免长时间停在同一姿态;
  3. 校准通常需要 30~60 s。

推荐旋转方案:绕 X 轴旋转 2 圈 → 绕 Y 轴旋转 2 圈 → 绕 Z 轴旋转 2 圈;或随机旋转,确保每个轴都经历充分的角度变化,但位置尽量不动。

注意:平面安装(2D)校准:对于运行中基本保持水平、主要绕竖直轴旋转的安装(如 AGV、转台、车辆),可通过命令行 CONFIG MCAL START 2D 启动平面校准,仅需绕竖直轴旋转。标准 CHCenter 校准按钮执行普通 CONFIG MCAL START 流程;如需强制 2D,请使用命令行或交付说明指定的配置方式。2D 校准不会自动识别,必须显式带 2D 参数;它仅更新水平面参数,并保留既有 Z 轴硬磁补偿。若从未做过有效 3D 校准、Z 轴硬磁环境变化,或载体会明显俯仰/横滚,应使用 3D 校准。

第 4 步:查询校准状态

发送 LOG MCAL STAT,返回示例:

text
STAT=3
PROGRESS=100
QUALITY=72
OK
STAT状态操作建议
0当前空闲可开始新的校准
1正在校准中继续旋转模块;若模块已与载体固联,则旋转模块与载体整体
3校准已完成校准成功,可正常使用
4校准失败参考故障排查流程,重新校准

PROGRESS:范围 0~100,表示磁场样本覆盖度,不是时间进度;运行中最高显示 99,只有 STAT=3 后才显示 100。QUALITY:范围 0~100,表示拟合完成后的结果质量,手动校准要求 QUALITY ≥ 50 才判定成功(STAT=3 即已满足),数值越高拟合越好;STAT=1 时不作为本次校准质量判据,可能仍是上一次校准结果。

校准成功后,硬磁/软磁补偿参数会立即应用到 AHRS 解算,并写入掉电保持存储;无需额外执行 SAVECONFIG,也不需要复位才生效。建议复位或重新上电后再做一次航向旋转验证,确认掉电保持后的参数仍适用于当前安装与环境。

第 5 步:验证校准结果

  1. 校准完成后,水平放置模块,缓慢旋转一周(360°);
  2. 观察航向角输出:理想情况下应随旋转连续变化,无非预期跳变;若协议输出范围为 ±180°,允许在 ±180° 边界回绕;若输出范围为 0°~360°,允许在 0/360° 边界回绕;
  3. 若相对参考航向或一周闭合误差超过 ±5°、出现非边界回绕跳变,或航向角不随旋转变化,请参考下文故障排查流程。

故障排查流程

当校准失败(STAT=4)或验证结果异常时,按下表逐项排查,前一项合格后再做下一项(磁场总强度 B_total = √(Bx² + By² + Bz²),由 mag_b 三轴计算):

顺序检查项合格判据不合格时的处理
1静止读取磁场总强度 B_total20–60 μT低于 20 μT(被屏蔽 / 过弱)或高于 60 μT(附近有磁体 / 过强)→ 远离干扰源或更换位置后重新校准
2姿态覆盖是否充分3D:各轴充分覆盖,建议每轴 ≥ 360°;2D:水平面绕竖直轴覆盖一周以上;旋转速度建议 20–100 deg/s覆盖不足或长时间停在同一姿态 → 按要领重做旋转动作后重新校准
3同一位置改变朝向时的 B_total 变化最大值与最小值差值 ≤ 10 μT超过 10 μT(存在空间磁场干扰);不要用单轴 Bx/By/Bz 变化判断 → 更换位置,或改用 6 轴模式
上述三项均合格仍异常在洁净环境重新执行一次校准

常见问题

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

注意事项

警告:室内磁场限制:室内空间磁场干扰无法通过校准消除,9 轴航向角精度取决于实际磁场畸变程度;原理说明见本章「磁干扰类型与校准边界」。

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

警告:电机与电流影响:电机、线缆和驱动器产生的磁场若随负载、电流或转速变化,属于时变干扰,不能通过一次地磁校准消除。建议在电机停止状态下校准;仅当工作状态稳定且磁场相对模块固定时,才可在该工作状态下校准。若工作状态变化明显,应拉开距离或使用 6 轴模式。

校准频率与模式选择

校准频率建议

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

模式选择建议

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

磁干扰类型与校准边界

磁干扰可按“是否随传感器一起运动”分为两大类。只有随传感器运动的干扰才能通过用户磁校准消除;空间磁场干扰无论如何校准都无法消除。

磁干扰类型随传感器运动的干扰空间磁场干扰
特点干扰源随传感器运动而运动干扰源不随传感器运动
包含子类硬磁(固联磁体 / PCB / 金属外壳)、软磁(固联导磁金属)、传感器标定误差空间畸变(钢筋 / 家具 / 电器)、时间畸变(电机 / 电流变化)
典型干扰源与模块固联的 PCB、金属外壳、无人机机架等家具、家电、线缆、房屋钢筋结构等
能否校准可以不可能
抗干扰措施可通过用户磁校准消除校准无法消除,会显著增大航向角误差

ASCII 命令参考

模块配置采用串口 ASCII 字符串命令,每条命令以回车换行 \r\n 结束(类似 AT 指令)。本章是命令的 权威语法参考;功能背景与操作流程见「产品功能与配置」。

命令格式与约定

  • 大小写:命令关键字大写。
  • 分隔:参数以空格分隔,例如 CONFIG IMU URFR 24(不是 URFR=24)。
  • 生效与保存
    • 通信类命令(SERIALCONFIGLOG ENABLE/DISABLELOG <MSG> ONTIME/ONMARK)通常 立即生效
    • 长期配置写入后通常已持久化,但部分配置需复位或重新上电后加载;具体以各命令说明和附录「出厂默认配置」为准;
    • SAVECONFIG 用于保存所有参数到 Flash,建议保留在配置流程末尾以兼容不同固件版本;
    • 恢复类命令(FRESET)自动保存并触发复位。
  • 推荐流程:发送配置 → 必要时复位或重新上电 → 读回确认。

注意:本章列出常用对外命令。兼容或定制命令以实际交付说明为准。

命令总览

命令功能生效
REBOOT复位模块立即
SAVECONFIG保存所有参数到 Flash立即
SERIALCONFIG设置串口波特率立即
FRESET恢复出厂设置立即(自动保存并复位)
CONFIG配置各种参数及工作模式按子命令
LOG查询信息 / 配置数据输出按子命令

系统命令

REBOOT — 复位模块。 示例:REBOOT

SAVECONFIG — 保存所有参数到 Flash。不同固件版本的自动保存策略可能不同,主机配置流程应在参数写入完成后执行一次该命令。

示例:SAVECONFIG

SERIALCONFIG — 设置串口波特率。格式:SERIALCONFIG [<COM>] <BAUD>

  • 省略 <COM> 时配置当前连接的串口;指定时(如 COM2)配置对应串口。
  • BAUD 支持值(共 9 档):4800 9600 19200 38400 57600 115200 230400 460800 921600

示例:SERIALCONFIG 115200SERIALCONFIG COM2 921600

警告:该命令立即生效,执行后须切换主机到新波特率才能继续通讯。

FRESET — 恢复默认用户配置,执行后自动保存并复位,请谨慎使用。 示例:FRESET

CONFIG 配置命令

注意CONFIG 配置的生效时机不同;长期配置写入后已持久化,但通常建议复位或重新上电后读回复核。当前公开配置可用 LOG COMCONFIGLOG USRCONFIGLOG MCAL STAT 读回(见「LOG 命令」)。

ATT RSTIMU URFRPMUXMCAL 等事件型或运行态配置通常立即作用;ATT MODEIMU COORD 等长期配置写入即保存,复位或重新上电后加载。

工作模式 — CONFIG ATT MODE <VAL>

VAL模式
0VRU(6 轴)
1AHRS(9 轴,地磁辅助)
4人形机器人专用
5低速地面平台(割草机 / 农机 / 工程机械等)
7低动态 / 倾角仪

其他交付模式以对应产品说明为准。背景见「工作模式」。

姿态校准 — CONFIG ATT RST <VAL>

执行时设备应静止,否则引入误差。

VAL动作
1航向复位:当前航向角置零
2设置相对零点:当前 Pitch、Roll 置零
3自动校平:仅当 Pitch/Roll 均接近 0°(判定阈值 5°)时,将 Pitch/Roll 校平到 0°,0°;否则命令无效果
5取消水平校平:恢复绝对角度

注意:其他数值为保留或兼容用途,不作为公开接口使用。

安装方向 — CONFIG IMU URFR <CODE>

CODE 为 2~3 位方向编码,表示用户坐标系相对传感器坐标系的安装方向。完整编码表(24 种合法右手系)见「安装方向」。 示例:CONFIG IMU URFR 24(默认水平安装)

世界坐标系 — CONFIG IMU COORD <VAL>

VAL坐标系
0东北天(ENU,默认)
4北西天(NWU)

多功能 IO 复用 — CONFIG PMUX<n> IO<m>

n=1~3 为复用功能,m=1~5 为目标引脚。功能定义见「多功能 IO 复用」。 示例:CONFIG PMUX2 IO1(将 IO1 设为同步输出)

地磁校准 — CONFIG MCAL START [2D]

启动一次手动地磁校准。无 2D 参数为 3D 校准;CONFIG MCAL START 2D 为平面(仅绕竖直轴旋转)校准。状态查询见 LOG MCAL STAT。完整流程见「地磁校准与磁环境」。

用户级陀螺校准 — CONFIG USRCAL START <ANGLE> / CONFIG USRCAL STOP

  • ANGLE:校准角度,单位 ,有效范围 360°~3600°;超出范围返回错误。
  • 旋转完成后发送 CONFIG USRCAL STOP;成功返回 OK,否则返回 ERR(通常表示旋转主轴不明确或比例因子超出允许范围)。
  • 示例:CONFIG USRCAL START 720 → 旋转 2 圈 → CONFIG USRCAL STOP。完整操作步骤与失败排查见「姿态校准」。

警告:USRCAL 是精密校准过程。若设定旋转 720° 实际却转了 725°,比例因子将被错误标定约 0.7%,反而引入额外航向误差、降低长期精度。仅在具备可靠角度基准时使用。

LOG 命令

数据输出开关

  • LOG ENABLE — 全局使能数据帧输出
  • LOG DISABLE — 全局禁止数据帧输出

设置数据帧输出类型及频率 — LOG [<COM>] <MSG> <TYPE> <VALUE>

  • COM(可选):目标串口,如 COM2;省略时配置当前连接的串口。
  • MSG:数据帧种类,常用 HI91HI83 等(以产品与串口配置为准)。
  • TYPEONTIME(定时)或 ONMARK(脉冲/软件触发)。
  • VALUE
    • TYPE=ONTIME:输出周期,单位 s,范围 0.001(1 kHz)~ 1(1 Hz),0 关闭定时输出;
    • TYPE=ONMARK1 由 SYNC_IN/PPS 脉冲触发;ONCE 手动触发一次。

示例:

  • LOG HI91 ONTIME 0.01 — HI91 以 100 Hz 输出(当前串口)
  • LOG COM2 HI91 ONTIME 0.01 — 在 COM2 上以 100 Hz 输出 HI91
  • LOG HI91 ONTIME 0 — 关闭 HI91 输出
  • LOG HI91 ONMARK 1 — HI91 配置为 SYNC_IN/PPS 脉冲触发
  • LOG HI91 ONMARK ONCE — 手动触发一次 HI91 输出

警告:高帧率(如 500 Hz)下默认 115200 波特率可能不足,请提高波特率(如 921600)。带宽估算见附录「输出带宽与波特率」。

HI83 字段配置 — LOG HI83 MAP <BITMAP>

BITMAP 为十六进制或十进制,每位对应一种数据段(位定义见「可变类型数据帧(HI83)」)。默认 0x000000FF

本手册定义的 HI83 字段为 bit0-bit11(字段掩码:0x00000FFF)。其他位未在本手册定义,用户不应置位;MRU 海浪补偿使用 bit10/bit11。

命令说明
LOG HI83 MAP 0x000000FF默认组合:加速度/角速度/磁场/欧拉角/四元数/系统时间/UTC/气压
LOG HI83 MAP 0x0000001FIMU+姿态基础:加速度/角速度/磁场/欧拉角/四元数

注意MAP 仅选择 HI83 输出哪些字段;帧的开关与频率仍由 LOG HI83 ONTIME <周期> 设置(见上)。MAP 写入后会持久化,运行中的 HI83 字段映射需复位或重新上电后按新值加载。

查询子命令

命令输出内容
LOG VERSIONPNAMEBUILDUUIDSNAPP_VERBL_VER
LOG COMCONFIG当前串口配置:波特率、各数据帧的 ONTIME / ONMARK 设置、HI83 MAP
LOG USRCONFIG用户配置:安装方向(URFR)、世界坐标系(COORD
LOG MCAL STAT地磁校准状态:STAT、PROGRESS、QUALITY

命令响应与错误码

ASCII 命令执行后通过同一串口返回结果。成功通常回显 OK(或对应查询内容),失败返回以 ERROR / ERR 开头的提示。常见响应汇总:

来源响应含义
通用配置OK命令已接受
SERIALCONFIGERROR: Unsupported baud波特率不在 9 档支持值内
CONFIG USRCAL STOPOK / ERR陀螺校准成功 / 校验未通过(见「CONFIG 配置命令」)
LOG MCAL STATSTAT=4地磁校准失败(排查见「地磁校准与磁环境」)
CANopen SDOabort 0x06090030数值超出范围
CANopen SDOabort 0x06010000不支持的访问

注意:Modbus / J1939 / CANopen 各总线的错误与应答机制见对应协议章(「Modbus RTU 协议」「CAN 协议」)。

统一数据字典

模块支持多种数据输出协议,覆盖不同的物理接口与上层总线:

协议物理接口特点详见
HiPNUC 二进制(HI91 / HI83)RS-232 / TTL / USB出厂默认;HI91 定长、HI83 位图可配置「串口二进制协议」
Modbus RTURS-485工业标准,寄存器读写「Modbus RTU 协议」
J1939CAN 2.0B车载/工业总线,PGN 周期广播「CAN 协议」J1939
CANopenCAN 2.0B标准从站,TPDO 输出「CAN 协议」CANopen

注意:配置与数据分离:模块维护同一份传感与状态数据,各输出协议只负责按各自帧格式封装。配置由 ASCII 命令负责(见「ASCII 命令参考」),本章及后续各协议章描述数据输出。

本章定义各协议共有物理量的规范语义;每个物理量在此定义一次(SI),各协议章只描述其封帧方式。本章各表为跨协议速查对照;某一协议的权威比例因子与地址,以该协议章的寄存器/字段表为准。 HI83 的完整字段字典见「可变类型数据帧(HI83)」。

警告:跨协议单位差异:同一物理量在不同协议中的数据类型、比例因子、单位并不相同。这是固件的既有事实(非笔误)。请严格按所用协议的列解码,切勿跨协议套用比例因子。比例因子约定见「数据类型、字节序与比例因子」:物理值 = 原始值 × 比例因子

解码陷阱速览

下表仅列跨协议易混淆项;逐项精确解码(地址 / 类型 / 比例 / 单位)见所用协议章的寄存器/字段表。

物理量跨协议陷阱套错后果
加速度4 种解码:HI91 = G(f32)、HI83 = m/s²(f32)、Modbus / J1939 = i16 ×0.00048828 → G(±16 G)、CANopen = mG(×0.001 G)量纲差 9.8×(G ↔ m/s²)或 1000×(G ↔ mG)
航向 yaw一帧双表示:J1939 同帧并存 u32 = CW 0–360 与 i32 = ±180;HI91 / HI83 / Modbus / CANopen 均为 CCW/raw取错字段 → 方向与符号全反
系统时间三种时基:HI91 = 墙钟 ms、HI83 = 开机 μs、Modbus = 开机 ms、J1939 = UTC 打包;CANopen 不输出跨协议相减 → 时间戳无意义
倾角4 种编码:HI83 = f32 deg、Modbus = i16 ×0.011 deg、J1939 = i32 ×0.001 deg、CANopen = i32 ×0.01 deg;HI91 不输出套错比例 / 类型 → 数值错
角速度单位 / 比例多样:HI91 = deg/s(f32)、HI83 = rad/s(f32,差 57.3×)、Modbus / J1939 = i16 ×0.061 → deg/s、CANopen = i16 ×0.1 deg/s(较粗)量纲差 57.3×(deg/s ↔ rad/s)或比例套错
欧拉角CANopen 比例较粗:×0.01 deg(≠ Modbus / J1939 ×0.001 deg;HI91 / HI83 为 f32 deg)精度 / 数值与预期不符
磁场任何 CANopen TPDO 都没有磁场在 CANopen 找不到该量

输出覆盖一览

✓ = 该协议输出此量;— = 不输出。精确地址 / 比例 / 单位见所用协议章的寄存器/字段表。

物理量HI91HI83ModbusJ1939CANopen
加速度
角速度
磁场
横滚 / 俯仰
航向 yaw
四元数
温度
气压
系统时间
倾角
垂荡 / 纵荡 / 横荡

串口二进制协议

RS-232、串口 TTL 以及 USB(虚拟串口)均为流式串行接口,统一使用超核自定义二进制协议输出。该协议为模块出厂默认输出协议。串口参数为 8 数据位、无校验、1 停止位(8N1),出厂默认波特率 115200 bps(见附录「出厂默认配置」)。

帧格式

长度(字节)说明
SOF5A A52帧头同步标志
LEN1–5122数据域长度(小端,不含帧头/长度/CRC)
CRC2对帧头、长度、数据域的 16 位 CRC(不含 CRC 字段本身)
数据域1–512由若干子数据段组成;每个子数据段由标签(tag)和数据两部分构成,标签决定其类型与长度

警告:帧长上限:数据域最大 512 字节(整帧最大 518 字节)。解码器对超过 512 字节的数据域直接拒绝。本手册定义的 HI83 公开字段全部启用时,数据域共 132 字节,仍在上限内。

警告:字节序:所有多字节数值均为 小端(低字节在前)。详见「数据类型、字节序与比例因子」。

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

浮点型 IMU 数据帧(HI91)

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

偏移名称类型大小单位说明
0taguint81数据标签:0x91
1main_statusuint162状态字,见「MAIN_STATUS 状态字」
3temperatureint81°C模块平均温度
4air_pressurefloat4Pa气压
8system_timeuint324ms时间戳,见「时间与时间戳」
12acc_bfloat4×3G加速度,顺序 XYZ;1 G ≈ 9.8 m/s²
24gyr_bfloat4×3deg/s角速度,顺序 XYZ
36mag_bfloat4×3μT磁场强度,顺序 XYZ
48rollfloat4deg横滚角
52pitchfloat4deg俯仰角
56yawfloat4deg航向角
60quatfloat4×4四元数,顺序 WXYZ

警告:单位差异:HI91 的角速度单位为 deg/s;HI83 的 gyr_b 单位为 rad/s(两者相差 57.3 倍)。请按所解析的帧类型选择正确单位。

可变类型数据帧(HI83)

HI83 为可配置变长帧,按 data_bitmap 输出不同的数据组合,帧长随配置改变。适用于需要同时输出 IMU、姿态、时间等数据并希望按需控制带宽的场景。

固定头部(8 字节)后紧跟由 data_bitmap 选择的数据段。数据段排列顺序见下方“数据段排列与偏移计算”,解析器必须按该顺序累加偏移,不可只按 bit 数值推断。

偏移名称类型大小说明
0taguint81数据标签:0x83
1main_statusuint162状态字,见「MAIN_STATUS 状态字」
3status_extuint81状态扩展字节;本手册不定义具体位含义,通用解析器可忽略
4data_bitmapuint324数据段位图,每位对应一种数据段
8变长按下方线序排列的数据段

data_bitmap 位定义(配置方式见「LOG 命令」的 HI83 字段配置)。下表为公开 IMU/AHRS/MRU 字段字典;产品未启用对应功能时,字段可能为 0 或无有效物理意义:

名称类型大小单位说明
0acc_bfloat4×3m/s²载体系加速度,顺序 XYZ
1gyr_bfloat4×3rad/s载体系角速度,顺序 XYZ
2mag_bfloat4×3μT载体系磁场,顺序 XYZ
3rpyfloat4×3deg欧拉角:横滚 −180~180、俯仰 −90~90、航向 −180~180(逆时针为正)
4quatfloat4×4四元数,顺序 WXYZ
5system_time_usuint648μs本地高分辨率时间戳(开机累计微秒,不受对时影响)
6utc8UTC 时间:年偏移(1,year-2000,如 24=2024)、月(1)、日(1)、时(1)、分(1)、秒(2,单位 ms,如 12 s = 12000)、保留(1)
7air_pressurefloat4Pa气压
8temperaturefloat4°C模块平均温度
9inclinationfloat4×3deg倾角仪输出,顺序 inclination_x / inclination_y / yaw;第三个 float 为航向角,不是 Z 轴倾角
10heave_surge_swayfloat4×3mMRU 位移:垂荡、纵荡、横荡
11heave_surge_sway_frqfloat4×3HzMRU 频率:垂荡、纵荡、横荡
12–31扩展交付专用扩展字段,本手册不定义;通用用户不应主动置位

注意:数据段排列与偏移计算:本手册定义的 HI83 公开字段按 bit0–bit11 的顺序拼接,公开字段掩码为 0x00000FFF。bit12 及以上可能启用未公开扩展字段,通用用户不应主动置位;禁止使用 0xFFFFFFFF 等全开配置,否则帧长和字段语义无法仅按本手册解析。未置位字段不出现,整帧相应变短;解析时须按表中字段大小逐项累加偏移。

CRC 校验

采用 CRC-16/XMODEM(部分工具中亦标注为 CRC-16/CCITT):多项式 0x1021,初值 0x0000,无输入/输出反转,无最终异或。校验范围为帧头(2) + 长度(2) + 数据域,不含 CRC 字段本身。

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

帧解析示例(HI91)

一帧 HI91 共 82 字节:前 6 字节为帧头/长度/CRC,其后 76 字节为数据域。示例帧(接收到数组 buf):

text
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 = 7676 字节
CRC14 BB0xBB14校验值
tag910x91payload 起始
main_statusuint1608 150x1508状态字
temperatureint82335°C
air_pressurefloat09 A2 C4 47100676Pa
system_timeuint3208 15 1C 001840392ms
acc_b x/y/zfloat−0.2206 / 0.2092 / 0.9489G
gyr_b x/y/zfloat−0.0617 / −0.0060 / −0.0101deg/s
mag_b x/y/zfloat7.892 / 14.625 / −60.042μT
roll / pitch / yawfloat13.052 / 12.189 / −122.477deg
quat w/x/y/zfloat−0.4859 / −0.1498 / 0.0381 / 0.8602

C 语言解析示例(HI91)

下面示例解析一帧完整 HI91。若处理连续串口字节流,应先完成帧同步和缓存,再把完整帧传入该函数。示例依赖上文的 crc16_update();协议字节序为小端,浮点数按 IEEE-754 单精度编码,不建议把 payload 直接强转为 C 结构体。

c
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>

#define HIPNUC_SOF0          0x5Au
#define HIPNUC_SOF1          0xA5u
#define HIPNUC_MAX_PAYLOAD   512u
#define HI91_TAG             0x91u
#define HI91_PAYLOAD_LEN     76u

typedef struct {
    uint8_t  tag;          /* 0x91 */
    uint16_t main_status;  /* status word */
    int8_t   temperature;  /* deg C */
    float    pressure;     /* Pa */
    uint32_t timestamp;    /* ms */
    float    acc[3];       /* G        */
    float    gyr[3];       /* deg/s    */
    float    mag[3];       /* uT       */
    float    eul[3];       /* deg      */
    float    quat[4];      /* WXYZ     */
} imu_data_t;

static uint8_t U1(const uint8_t *src)
{
    return src[0];
}

static int8_t I1(const uint8_t *src)
{
    return (int8_t)src[0];
}

static uint16_t U2(const uint8_t *src)
{
    return (uint16_t)src[0] | ((uint16_t)src[1] << 8);
}

static uint32_t U4(const uint8_t *src)
{
    return (uint32_t)src[0] |
           ((uint32_t)src[1] << 8) |
           ((uint32_t)src[2] << 16) |
           ((uint32_t)src[3] << 24);
}

static float R4(const uint8_t *src)
{
    uint32_t raw = U4(src);
    float value;
    memcpy(&value, &raw, sizeof(value));
    return value;
}

bool parse_hi91_frame(const uint8_t *buf, size_t len, imu_data_t *out)
{
    if (buf == NULL || out == NULL) {
        return false;
    }
    if (len < 6u) {
        return false;
    }
    if (buf[0] != HIPNUC_SOF0 || buf[1] != HIPNUC_SOF1) {
        return false;
    }

    uint16_t payload_size = U2(buf + 2);
    if (payload_size > HIPNUC_MAX_PAYLOAD || payload_size != HI91_PAYLOAD_LEN) {
        return false;
    }
    if (len != (size_t)payload_size + 6u) {
        return false;
    }

    uint16_t crc = 0;
    crc16_update(&crc, buf, 4);                  /* SOF + LEN */
    crc16_update(&crc, buf + 6, payload_size);   /* payload */
    if (crc != U2(buf + 4)) {
        return false;
    }

    const uint8_t *data = buf + 6;
    if (U1(data) != HI91_TAG) {
        return false;
    }

    imu_data_t decoded = {0};
    decoded.tag         = U1(data + 0);
    decoded.main_status = U2(data + 1);
    decoded.temperature = I1(data + 3);
    decoded.pressure    = R4(data + 4);
    decoded.timestamp   = U4(data + 8);

    for (int i = 0; i < 3; i++) {
        decoded.acc[i] = R4(data + 12 + (size_t)i * 4u);
        decoded.gyr[i] = R4(data + 24 + (size_t)i * 4u);
        decoded.mag[i] = R4(data + 36 + (size_t)i * 4u);
        decoded.eul[i] = R4(data + 48 + (size_t)i * 4u);
    }
    for (int i = 0; i < 4; i++) {
        decoded.quat[i] = R4(data + 60 + (size_t)i * 4u);
    }

    *out = decoded;
    return true;
}

Modbus RTU 协议

Modbus 是工业自动化领域的通用协议。带 RS-485 或以太网接口的产品通常支持 Modbus,具体以实际型号和交付配置为准。当前固件默认将 Modbus 从站挂载在 COM1 对应的 RS-485 通道上。

遵循 Modbus RTU 规范:数据以寄存器为单位收发,每寄存器 2 字节,采用 大端(高字节在前),采用标准 Modbus CRC 校验。

警告:字节序提示:Modbus 寄存器为大端,与二进制/CAN 协议的小端不同。

支持的功能码:

  • 0x03(Read Holding Registers):读取单个或多个寄存器
  • 0x06(Write Single Register):写单个寄存器

出厂默认节点 ID: 800x50)。

帧格式

读寄存器(0x03)— 主机请求:

说明
ID1–247节点 ID
FUN0x03功能码
ADDR_H / ADDR_L起始寄存器地址(高/低 8 位)
LEN_H / LEN_L读取寄存器个数(高/低 8 位)
CRC_L / CRC_HCRC(低/高 8 位)

读寄存器(0x03)— 从机响应: ID, 0x03, LEN(字节数), DATA_H, DATA_L, …, CRC_L, CRC_H

写寄存器(0x06)— 主机请求 / 从机响应(回显相同): ID, 0x06, ADDR_H, ADDR_L, DATA_H, DATA_L, CRC_L, CRC_H

注意:写入越界值(如 Modbus ID 超出 1–247)或对只读寄存器执行 0x06 时,从机仍回显请求帧(不返回异常帧),但该值不会生效;读取未定义地址返回 0。配置关键参数后请回读确认。

寄存器列表

下表列出常用读取与配置寄存器。其余配置项(CAN / 串口 / J1939 周期等)请见对应协议章(「CAN 协议」)及 ASCII 命令(见「ASCII 命令参考」)。

地址名称类型R/W单位 / 比例说明
0x00CTRLu16W控制寄存器,见下
0x04UART1_BAUDu16R/W串口波特率档位
0x05MD_IDu16R/WModbus ID,有效范围 1–247(出厂默认 80)
0x06HEADING_MODEu16R/W工作模式:0=6 轴(相对航向,上电为 0)、1=9 轴(地磁融合,绝对航向);其余专用模式(4/5/7 等)见「CONFIG ATT MODE」
0x34–0x36ACC X/Y/Zi16RG,×0.00048828加速度(1 G ≈ 9.8 m/s²)
0x37–0x39GYR X/Y/Zi16Rdeg/s,×0.061035角速度
0x3A–0x3CMAG X/Y/Zi16RμT,×0.030517磁场强度
0x3D–0x3EROLL (H/L)i32Rdeg,×0.001横滚角(大端 32 位)
0x3F–0x40PITCH (H/L)i32Rdeg,×0.001俯仰角
0x41–0x42YAW (H/L)i32Rdeg,×0.001航向角
0x43TEMPi16R°C,×0.01温度
0x44–0x45PRS (H/L)i32RPa,×0.01气压
0x46–0x49Q0–Q3i16R×0.0001四元数 W/X/Y/Z
0x4AINCLI_Xi16Rdeg,×0.011倾角仪 X:双轴 ±180°;单轴 0–360°
0x4BINCLI_Yi16Rdeg,×0.011倾角仪 Y:双轴 ±90°;单轴产品保留
0x4C–0x4DCPUTIME (H/L)i32Rms系统运行时间(自上电累计毫秒,大端 32 位);始终为本地运行时间,不随对时切换为 UTC,约 24.8 天后溢出。需当日 UTC 毫秒请改用数据帧 system_time(见「时间与时间戳」)
0x4E–0x50HEAVE/SURGE/SWAYi16×3Rm,×0.01MRU 垂荡/纵荡/横荡位移
0x51–0x53HEAVE/SURGE/SWAY_FRQi16×3RHz,×0.01MRU 垂荡/纵荡/横荡频率
0x70–0x77PNAMEu16R设备名(ASCII,8 寄存器)
0x78SW_VERSIONu16R软件版本
0x79BL_VERSIONu16RBootloader 版本
0x7F–0x82SNu16R产品唯一序列号(4 寄存器)
0xA5ATT_RSTu16W姿态控制:1 航向复位 / 2 相对零点 / 3 自动校平 / 5 取消校平(见下)
0xA6URFRu16R/W安装方向编码,见「安装方向」

控制寄存器(0x00)写入值: 0x0000 保存所有参数到 Flash;0x0001 恢复出厂设置;0x00FF 复位。

ATT_RST(0xA5): 1 航向复位(当前航向角置零);2 设置相对零点(当前 Pitch/Roll 置零);3 自动校平——仅当当前 Pitch/Roll 均接近 0°(阈值 5°)时校平到 0°,0°,否则命令无效果;5 取消自动校平,恢复绝对角度。

注意:ATT_RST 其他数值为保留或兼容用途,不作为公开接口使用。

常用配置示例

注意:以下示例均以出厂默认 ID 0x50 为例;若已修改 Modbus ID,需同步修改报文 ID 字段并重算 CRC。

操作报文(Hex)
保存所有参数到 Flash50 06 00 00 00 00 84 4B
恢复出厂设置50 06 00 00 00 01 45 8B
复位50 06 00 00 00 FF C4 0B
设为 6 轴模式(VAL=0)50 06 00 06 00 00 64 4A
设为 9 轴模式(VAL=1)50 06 00 06 00 01 A5 8A
设为低动态/倾角仪模式(VAL=7)50 06 00 06 00 07 25 88
航向复位(当前航向角置零)50 06 00 A5 00 01 55 A8
设置相对零点(Pitch/Roll 置零)50 06 00 A5 00 02 15 A9
启动自动校平50 06 00 A5 00 03 D4 69
取消自动校平50 06 00 A5 00 05 54 6B

注意:工作模式(0x06)DATA = 「CONFIG ATT MODE」的 VAL(公开 0/1/4/5/7);姿态控制(0xA5)DATA = ATT_RST 模式码(1/2/3/5,见上「ATT_RST(0xA5)」)。改 DATA 后需重算 CRC。

配置波特率(0x04):

目标波特率报文(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(2B)

  • NEW_ID=0x5150 06 00 05 00 51 55 B6

警告:节点 ID 修改后立即生效,后续报文需使用新 ID。不熟悉 Modbus 报文构造时,建议使用上位机工具完成配置。

设置安装方式(0xA6):

安装方式报文(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

注意:报文 DATA(第 5–6 字节)= URFR 安装方向编码的十进制值转十六进制(高字节在前),如 24→00 18、520→02 08、421→01 A5;完整 24 种合法安装方向见「安装方向」。改编码后需重算 CRC。

读取版本信息(0x70–0x82)

请求:50 03 00 70 00 14 49 9F(从 0x70 读 20 个寄存器)。

响应(示例):

text
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

数据长度 0x28=40 字节。48 49 31 34 52 32 4E 2D 34 38 35 2D 30 30 30 为产品名 ASCII(HI14R2N-485-000),其后依次为软件版本、Bootloader 版本、序列号。

读取 IMU/AHRS 数据(0x34–0x4B)

请求:50 03 00 34 00 18 09 8F(从 0x34 读 24 个寄存器)。

响应(示例):

text
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 ...

数据长度 0x30=48 字节(24 寄存器)。各物理量按其比例因子换算:

加速度(G,×0.00048828):

寄存器值原始值物理值
XFF 01−255−0.1245
Y03 B09440.4609
Z06 5016160.7891

角速度(deg/s,×0.061035):

寄存器值原始值物理值
XFC C9−823−50.232
YFF 7C−132−8.057
Z00 911458.850

磁场(μT,×0.030517):

寄存器值原始值物理值
X01 D546914.312
YFD DB−549−16.754
ZFD 27−729−22.247

欧拉角(deg,×0.001;i32 大端,每轴占 2 个寄存器 H/L):

寄存器值(H L)原始值(i32)物理值
横滚 Roll00 00 21 FF0x000021FF = 87038.703
俯仰 Pitch00 00 7F F60x00007FF6 = 3275832.758
航向 YawFF FD 73 E70xFFFD73E7 = −166937−166.937

警告:欧拉角字节序:欧拉角为 32 位大端、跨 2 个寄存器(高字在前),是最易出错处——必须先按高字在前拼成完整 i32,再乘比例因子(见上表 Yaw 行:FF FD 73 E70xFFFD73E7 = −166937 → −166.937°)。

读取 MRU 数据(0x4E–0x53)

请求:50 03 00 4E 00 06 A8 5E(从 0x4E 读 6 个寄存器)。

响应数据依次为 HEAVESURGESWAYHEAVE_FRQSURGE_FRQSWAY_FRQ,均为有符号 16 位整数。位移比例因子为 ×0.01 m,频率比例因子为 ×0.01 Hz

CAN 协议

CAN 总线上提供两类高层协议,按交付配置启用其一:J1939(默认,基于 CAN 2.0B 扩展帧)与 CANopen(标准从站,基于 CAN 2.0B 标准帧,TPDO 输出)。支持 CANFD 的产品可在 J1939 下额外输出 CANFD 帧 0。

集成前检查:

检查项J1939CANopen
交付协议确认交付固件启用 J1939确认交付固件启用 CANopen 从站(定制固件)
CAN 波特率默认 500 kbit/s,实际值以产品交付为准默认 500 kbit/s,实际值以产品交付为准
节点 ID / 地址默认 8,推荐 1–126默认 8,推荐 1–126
帧类型CAN 2.0B 扩展帧;CANFD 帧 0 仅支持 CANFD 产品CAN 2.0B 标准帧
默认输出状态数据 PGN 默认周期广播TPDO 默认关闭,需先写入 TPDO 周期
硬件接线终端电阻、屏蔽、线序和收发器电平见硬件手册同左

J1939(CAN)

支持 CAN 输出的产品默认采用 J1939 协议,遵循 SAE J1939 标准(基于 CAN 2.0B 扩展帧的高层协议)。支持 CANFD 的产品可额外输出 CANFD 帧 0。

CAN 扩展帧格式

J1939 使用 29 位扩展标识符:

text
CAN_ID = (P<<26)|(R<<25)|(DP<<24)|(PF<<16)|(PS<<8)|SA

其中 P/R/DP/PF/PS/SA 位域见上图。本产品所有数据 PGN 均为厂商自定义格式(PF=0xFF);各数据 PGN 见「PGN 消息列表」。

警告:字节序:J1939 数据域为 小端(低字节在前)。例如 32 位 0x12345678 在帧中为 78 56 34 12

协议参数

参数默认可选 / 说明
CAN 标称波特率500 kbit/s125K / 250K / 500K / 800K / 1000K,以实际产品为准
帧格式CAN 2.0B 扩展帧(29 位);CANFD 帧 0 仅支持 CANFD 产品符合 J1939
数据长度8 字节;CANFD 帧 0 为 64 字节按帧类型
帧优先级30–7,0 最高
节点地址8公开建议使用 1–126;127 在部分型号中保留。数据 PGN 以广播地址 255 发送,请勿将设备设为 255
数据格式小端多字节低位在前

PGN 消息列表

下表仅列出本手册公开的 IMU/AHRS J1939 经典 CAN 数据 PGN(CAN ID 形如 0x0CFF[PS][SA],优先级 3 → 高位 0x0C)。MRU 位移 / 频率输出见 HI83 或 Modbus;CANFD 帧 0 见下文,且仅存在于支持 CANFD 的产品上。

PGN(hex)PGN(十进制)PS名称适用
0xFF2F653270x2F时间信息(UTC 或本地运行时间)全部
0xFF34653320x34三轴加速度全部
0xFF37653350x37三轴角速度全部
0xFF3A653380x3A三轴磁场强度9 轴产品
0xFF3D653410x3D俯仰/横滚角全部
0xFF41653450x41航向角全部
0xFF46653500x46四元数全部
0xFF4A653540x4A倾角仪输出倾角仪产品
0xFF43653470x43温度全部

各 PGN 数据域(未列字节为保留,固定 0):

0xFF2F 时间信息

字节字段类型单位说明
0–5年/月/日/时/分/秒uint8×6年如 24=2024
6–7毫秒uint16ms小端

示例:CAN ID 0x0CFF2F08,数据 18 06 12 0E 1E 2D 58 02 → 2024-06-18 14:30:45.600 UTC。

完成 UTC 对时后,0xFF2F 输出有效 UTC 年月日时分秒;未完成 UTC 对时时,年/月/日字段为 0,时/分/秒/毫秒来自本地 24 h 回绕时间,不可作为绝对 UTC。同步状态以 MAIN_STATUS.UTC_UNSYNC 判断。

0xFF34 加速度 / 0xFF37 角速度 / 0xFF3A 磁场(结构相同,比例因子不同;满量程:加速度 ±16 G、角速度 ±2000°/s、磁场 ±1000 μT)

字节字段类型比例因子单位
0–1Xint16加速度 0.00048828 / 角速度 0.061035 / 磁场 0.030517G / deg/s / μT
2–3Yint16同上同上
4–5Zint16同上同上

0xFF3D 俯仰/横滚

字节字段类型比例因子单位
0–3横滚 Rollint320.001deg
4–7俯仰 Pitchint320.001deg

0xFF41 航向(一帧两种表示,见「航向(yaw)约定」)

字节字段类型比例因子单位
0–3航向(0–360°,顺时针为正)uint320.001deg
4–7航向(±180°,逆时针为正)int320.001deg

0xFF46 四元数

字节字段类型比例因子
0–1 / 2–3 / 4–5 / 6–7qw / qx / qy / qzint160.0001

0xFF4A 倾角仪(倾角仪产品)

字节字段类型比例因子单位
0–3X 轴倾角(可配 0–360° 或 ±180°)int320.001deg
4–7Y 轴倾角(±90°)int320.001deg

0xFF43 温度

字节字段类型比例因子单位
0–1温度int160.01°C
2–3保留固定 0
4–7保留uint32固定占位值 999;不是气压,请勿解析为 pressure

0xFF5A CANFD 帧 0

CANFD 帧 0 仅存在于支持 CANFD 的产品上,用于在单帧 64 字节数据域中打包常用 IMU/AHRS 状态与姿态数据。经典 CAN 产品不输出该帧;若产品未明确支持 CANFD,请忽略本小节。

偏移字段类型比例因子单位
0–1main_statusuint16见「MAIN_STATUS 状态字」
2–3保留uint16固定 0
4–7system_timeuint321ms
8 / 10 / 12acc x/y/zint160.00048828G
14 / 16 / 18gyr x/y/zint160.061035deg/s
20 / 22 / 24mag x/y/zint160.030517μT
26 / 30 / 34roll / pitch / yawint320.001deg
38 / 40 / 42 / 44qw/qx/qy/qzint160.0001
46–47temperatureint160.01°C
48–63保留

注意:CANFD 帧 0 的 CAN ID、DBC 名称及是否默认输出以支持 CANFD 的产品资料为准。

配置协议

主机通过专用配置 PGN 对设备参数进行读写。

配置帧格式:CAN ID = 0x0CEF[DA][SA](DA=产品节点 ID 或广播 255,SA=主机地址)。数据载荷:

字节字段类型说明
0–1ADDRuint16参数地址(小端),取值见下方配置示例
2CMDuint80x06=写,0x03=读
3保留uint8设备原样回显(不承载状态码);主机写 0
4–7VALuint32数据值(小端)

配置应答规则:

请求类型是否应答应答 CAN ID主机处理方式
点对点写(DA = 具体节点 ID)0x0CEF55[节点ID]写成功时返回请求回显
点对点读(DA = 具体节点 ID)0x0CEF55[节点ID]读成功时返回 ADDR + CMD + VAL
广播写(DA = 255)不等待应答,必要时读回确认
地址非法、数值越界或访问不支持按超时判失败

应答的目标地址为 0x55、源地址为设备节点 ID,如节点 8 的应答 CAN ID 为 0x0CEF5508。为简化接收过滤,建议主机发送配置请求时使用 SA=0x55

PGN 发送周期通过配置帧写入周期参数。仅下表列出的周期参数为公开配置项,未列参数不作为通用用户接口。

常用配置示例(默认节点 ID=8):

[VAL] 均为 4 字节 uint32 小端。100 ms 周期写作 64 00 00 00;SYNC_IN 触发模式写作 00 80 00 00

数据载荷说明
2F 01 06 00 [VAL]PGN 0xFF2F(时间信息)发送周期
34 01 06 00 [VAL]PGN 0xFF34(加速度)发送周期
37 01 06 00 [VAL]PGN 0xFF37(角速度)发送周期
3A 01 06 00 [VAL]PGN 0xFF3A(磁场)发送周期
3D 01 06 00 [VAL]PGN 0xFF3D(俯仰/横滚)发送周期
41 01 06 00 [VAL]PGN 0xFF41(航向)发送周期
46 01 06 00 [VAL]PGN 0xFF46(四元数)发送周期
4A 01 06 00 [VAL]PGN 0xFF4A(倾角仪)发送周期
43 01 06 00 [VAL]PGN 0xFF43(温度)发送周期
5A 01 06 00 [VAL]CANFD 帧 0 发送周期;仅支持 CANFD 的产品有效
A5 00 06 00 [VAL]姿态控制:VAL=1 航向复位 / 2 设置相对零点 / 3 自动校平 / 5 取消校平
9D 00 06 00 01 00 00 00全局使能节点数据输出(默认)
9D 00 06 00 00 00 00 00全局关闭节点数据输出
9A 00 06 00 [VAL]CAN 波特率:0=1000K,1=800K,2=500K,3=250K,4=125K;写入即保存,复位或重新上电后生效
9C 00 06 00 [VAL]J1939 节点 ID:推荐 1–126;127 在部分型号中保留;写入即保存,复位或重新上电后生效
9E 00 06 00 [VAL]倾角仪 X 轴方向:0=默认,1=反向
9F 00 06 00 [VAL]倾角仪 Y 轴方向:0=默认,1=反向
00 00 06 00 00 00 00 00保存所有参数到 Flash
00 00 06 00 01 00 00 00恢复出厂设置(自动保存并复位)
00 00 06 00 FF 00 00 00复位

周期 VAL 说明:0 关闭;5/10/20/50/100/200/500/1000 ms 为推荐周期;0x8000 为 SYNC_IN 触发模式。

警告:周期特殊值 0x8000(SYNC_IN 触发模式):将某 PGN 的发送周期写为 0x8000 后,该 PGN 不再定时发送,改为在外部 SYNC_IN 上升沿 输出一帧。例如把 34 01 06 00 的 VAL 设为 00 80 00 00 即令加速度 PGN 进入 SYNC_IN 触发模式。标准固件已接入该触发路径;客户定制固件是否支持以交付说明为准。

注意:示例:ID=0x0CEF0855,数据 37 01 06 00 64 00 00 00 → 将 PGN 0xFF37(角速度)设为 100 ms 周期(10 Hz)。该例 DA=0x08,SA=0x55;SA 可为任意主机地址。若主机按应答目标地址过滤接收,请固定 SA=0x55。

时间同步

J1939 的 PGN 0xFF2F 仅用于 输出 模块当前时间信息,不作为对时输入。若需对模块内部时钟进行 UTC 同步,请使用「同步功能」中的 PPS + 串口时间消息方案。

CANopen(CAN)

部分产品或交付配置支持 CANopen 从站通信(是否启用以实际型号为准)。CANopen 使用标准数据帧,常用数据通过 TPDO1/2/3/4/6/7 传输,不使用远程帧与扩展帧。TPDO 为异步定时触发;如需同步模式见「TPDO 速率与同步配置」。

默认设置

CAN 标称波特率500 kbit/s
节点 ID8
初始化状态Operational
TPDO 输出周期默认 0 = 不主动输出;需经 SDO 写入各 TPDO 周期后才开始发送(见「TPDO 速率与同步配置」)

警告:出厂默认所有 TPDO 周期为 0(不输出)。CANopen 上电后不会主动发数据,必须先按「TPDO 速率与同步配置」配置所需 TPDO 的输出周期。

TPDO 映射

通道帧 IDDLC数据类型 / 比例 / 单位
TPDO10x180+ID6加速度 X/Y/Zint16,mG(0.001 G)
TPDO20x280+ID6角速度 X/Y/Zint16,0.1 deg/s
TPDO30x380+ID6欧拉角 Roll/Pitch/Yawint16,0.01 deg
TPDO40x480+ID8四元数 W/X/Y/Zint16,raw × 0.0001;raw=10000 → 1.0000
TPDO60x680+ID4气压int32,Pa
TPDO70x780+ID8倾角仪 X/Yint32,0.01 deg

所有多字节字段低字节在前。

警告:比例因子与其他协议不同:CANopen 的加速度为 mG、角速度 0.1 deg/s、欧拉角 0.01 deg,请勿套用 Modbus/J1939 的比例因子(见「统一数据字典」)。

数据解析示例

以下示例假定已按「TPDO 速率与同步配置」打开对应 TPDO 周期。

加速度帧:ID=0x188(节点 8),数据 4A 00 1F 00 C8 03

  • X = 0x004A = 74 → 74 mG;Y = 0x001F = 31 → 31 mG;Z = 0x03C8 = 968 → 968 mG

角速度帧:ID=0x288,数据 15 00 14 01 34 00

  • X = 0x0015 = 21 → 2.1 deg/s;Y = 0x0114 = 276 → 27.6 deg/s;Z = 0x0034 = 52 → 5.2 deg/s

上位机可用 PCAN-View 配合 PCAN 适配器在接收窗口查看:

配置指令(SDO)

采用 CANopen expedited SDO。主机发送 CAN_ID=0x600+ID,从机响应 CAN_ID=0x580+ID。SDO 数据区固定 8 字节:

text
CS | Index_L | Index_H | SubIndex | Data0 | Data1 | Data2 | Data3

其中 IndexData 均为小端。常用 CS 如下:

CS方向含义数据字节
0x23主机→从机写 4 字节4
0x2B主机→从机写 2 字节2
0x2F主机→从机写 1 字节1
0x40主机→从机读请求0
0x60从机→主机写成功响应0
0x43从机→主机读 4 字节响应4
0x4B从机→主机读 2 字节响应2
0x4F从机→主机读 1 字节响应1
0x80从机→主机SDO abort4 字节 abort code

本产品通过厂商对象索引配置常用公开参数。下表仅列出本手册定义的公开对象;未列对象不作为通用用户接口,不要按未列出的厂商对象索引自行推导或访问。写入或读取多字节值时均按小端排列。若设备拒绝访问,返回 0x80 abort 响应;常见 abort code 为 0x06090030(数值超范围)和 0x06010000(不支持访问)。

常用指令(以节点 ID=8,CAN_ID=0x608 为例):

操作数据
修改节点 ID(0x209C,推荐 1–126;127 在部分型号中保留)23 9C 20 00 [ID] 00 00 00
保存所有参数到 Flash(0x2000)23 00 20 00 00 00 00 00
复位(0x2000)23 00 20 00 FF 00 00 00
恢复出厂设置(0x2000)23 00 20 00 01 00 00 00
CAN 波特率 1000K(0x209A)23 9A 20 00 00 00 00 00
CAN 波特率 800K23 9A 20 00 01 00 00 00
CAN 波特率 500K23 9A 20 00 02 00 00 00
CAN 波特率 250K23 9A 20 00 03 00 00 00
CAN 波特率 125K23 9A 20 00 04 00 00 00
姿态相对零点(0x20A5)23 A5 20 00 02 00 00 00
自动校平23 A5 20 00 03 00 00 00
取消校平 / 恢复绝对角度23 A5 20 00 05 00 00 00
读取节点 ID(0x209C)40 9C 20 00 00 00 00 00

注意:CANopen 参数持久化:TPDO 周期(0x180x.5)与心跳(0x1017)写入后立即生效;CAN 波特率(0x209A)与节点 ID(0x209C)写入后需复位(向 0x2000 写 0xFF)后生效,复位后主机也需切到新波特率 / 新节点 ID。为兼容不同固件版本,配置完成后建议向 0x2000 写 0x00 保存所有参数到 Flash。

警告:恢复出厂设置后模块自动保存并复位,请谨慎使用。

TPDO 速率与同步配置

TPDO 通道与参数索引对应:

通道参数索引数据
TPDO10x1800加速度
TPDO20x1801角速度
TPDO30x1802欧拉角
TPDO40x1803四元数
TPDO60x1804气压
TPDO70x1805倾角仪

TPDO5 未使用;为兼容既有产品定义,气压使用 TPDO6,倾角仪使用 TPDO7。

修改输出速率(写子索引 5,单位 ms;0=关闭),以加速度(0x1800)为例:

  • 2B 00 18 05 00 00 00 00 — 关闭(周期=0)
  • 2B 00 18 05 05 00 00 00 — 200 Hz(周期=5 ms)
  • 2B 00 18 05 0A 00 00 00 — 100 Hz(周期=10 ms)
  • 2B 00 18 05 14 00 00 00 — 50 Hz(周期=20 ms)
  • 2B 00 18 05 32 00 00 00 — 20 Hz(周期=50 ms)
  • 2B 00 18 05 64 00 00 00 — 10 Hz(周期=100 ms)

其余通道把索引低字节(帧第 2 字节)改为 01(角速度)/02(欧拉角)/03(四元数)/04(气压)/05(倾角仪) 即可,例如角速度 100 Hz:2B 01 18 05 0A 00 00 00。此项(速率,子索引 5)写入后立即生效并自动持久化(掉电保持),无需额外保存。

同步模式:把某 TPDO 的传输类型 [0x180x.2] 写为 0x01 即转为同步模式(停止异步定时,等待同步帧)。以 TPDO1 为例:

  • 2F 00 18 02 01 00 00 00 — TPDO1 设为同步模式
  • 2F 00 18 02 FF 00 00 00 — TPDO1 恢复异步模式(默认)

发送 CANopen 同步帧:CAN_ID=0x80,数据为空。所有同步模式的 TPDO 各发送一帧,实现同步。

注意:传输类型(同步 / 异步)仅为运行时设置,复位或重新上电后恢复异步默认(0xFF),不掉电保持;TPDO 速率(子索引 5)与心跳周期则掉电保持。

心跳包:写 [0x1017.0] 设置周期(ms,0 禁用)。示例 2B 17 10 00 64 00 00 00 → 100 ms。

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

本附录给出 HiPNUC 产品采用的姿态表示与互转公式。四元数顺序为 WXYZq0 为标量部分),Qb2n 表示载体系(b 系)到世界坐标系(n 系)的旋转。

注意:坐标系说明:模块世界坐标系默认 东北天 ENU,可配置为 北西天 NWUCONFIG IMU COORD,见「坐标系与方向约定」)。下文「东北天(ENU)— 312 旋转顺序」给出 ENU 互转公式(与模块默认输出一致);「北东地(NED)— 321 旋转顺序」给出工程上常用的 NED 外部换算参考,NED 不是本手册定义的设备输出配置。NWU 输出的欧拉角采用与 NED 相同的 321 轴约定(roll 绕 X、pitch 绕 Y、yaw 绕 Z),仅坐标轴指向不同(NWU:X 北 / Y 西 / Z 天);它与 ENU 的欧拉约定不同(ENU 为 312),二者 roll/pitch 所绕轴相反、偏航差并非恒定 90°,不能在 ENU 欧拉角上简单加 90° 偏航得到 NWU。如需换算,应先在四元数层绕天向轴旋转 90°,再按 321 提取欧拉角。

四元数转旋转矩阵

给定四元数 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)

ENU 约定下欧拉角定义:

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

四元数转欧拉角:

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

欧拉角转四元数(记 cp=cos(pitch2)sp=sin(pitch2)cr/srcy/sy 同理):

q0=cpcrcyspsrsyq1=spcrcycpsrsyq2=cpsrcy+spcrsyq3=cpcrsy+spsrcy

北东地(NED)— 321 旋转顺序(先 Z,再 Y,最后 X)

NED 约定下欧拉角定义:

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

四元数转欧拉角:

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

欧拉角转四元数(记 cr=cos(roll2)sr=sin(roll2)cp/spcy/sy 同理):

q0=crcpcy+srspsyq1=srcpcycrspsyq2=crspcy+srcpsyq3=crcpsysrspcy

附录 B — 固件升级

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

注意:升级前请确认固件版本与产品型号匹配(参见「关于本手册」的版本对照表)。升级过程中请勿断电。

附录 C — 输出带宽与波特率

数据帧能否稳定输出取决于 帧长 × 帧率 是否在串口带宽之内。以 8N1(每字节 10 bit)估算:

最大帧率 (Hz)波特率/10单帧字节数

实际应用中建议在上式基础上再预留 10~20% 余量。HI91 单帧共 82 字节(6 字节帧头/长度/CRC + 76 字节数据域),各波特率下的推荐最大输出帧率:

协议单帧字节9600115200230400460800921600
HI918210 Hz100 Hz250 Hz500 Hz1000 Hz

注意:HI83 为变长帧:其单帧字节数随 data_bitmap 配置变化,请按所选字段累加帧长后代入上式估算。例如默认 0x000000FF(bit0–7)单帧约 98 字节(数据域 92 + 6 字节帧头/长度/CRC),100 Hz 约需 98 kbit/s,115200 余量偏紧、建议 230400 及以上。当高帧率与默认 115200 带宽冲突时,请提高波特率(如 921600)。

附录 D — 出厂默认配置

下表为出厂/恢复出厂(FRESET)后的默认配置(以固件 1.7.2 为准;具体以实际交付为准)。「生效时机」列说明修改后何时生效。

配置项默认值可选范围生效时机
串口波特率(COM1–4)1152004800…921600(9 档,见「系统命令」)立即(SERIALCONFIG
默认输出帧HI91 @ 100 Hz(COM1、COM2)立即(LOG
其他帧(HI83 等)关闭立即
工作模式见产品交付(6 轴 / 9 轴)CONFIG ATT MODE写入即保存;复位/重新上电后加载
世界坐标系 COORDENUENU / NWU写入即保存;复位/重新上电后加载
安装方向 URFR24(水平 Z 朝上)见「安装方向」立即(CONFIG IMU URFR
HI83 data_bitmap0x000000FF见「可变类型数据帧(HI83)」写入即保存;复位/重新上电后加载
Modbus 节点 ID801–247立即
CAN 节点 ID8推荐 1–126;127 部分型号保留写入即保存;复位/重新上电
CAN 标称波特率标准固件 500 kbit/s125K…1000K写入即保存;复位/重新上电
J1939 周期输出总开关0 / 1立即
J1939 默认输出 PGN加速度/角速度/俯仰横滚/航向 @ 100 Hz见「J1939 配置协议」立即
CANopen TPDO 周期全部 0(不输出)见「TPDO 速率与同步配置」立即
CANopen 心跳关闭(0)0–65535 ms立即

警告:FRESET 副作用:恢复出厂会重置上述用户配置;请勿依赖 FRESET 保留任何用户写入的参数。详见「系统命令」FRESET

附录 E — 缩略词与术语表

本手册中出现的缩写与专有术语集中说明如下(命令关键字如 LOGCONFIGSAVECONFIGFRESET 见「ASCII 命令参考」)。

缩写 / 术语全称 / 含义
IMUInertial Measurement Unit,惯性测量单元(加速度计 + 陀螺仪,可含磁力计)
AHRSAttitude and Heading Reference System,姿态航向参考系统(9 轴,绝对航向)
VRUVertical Reference Unit,垂直参考单元(6 轴,相对航向)
ENU / NWU / NED东北天 / 北西天 / 北东地;ENU/NWU 为设备配置,NED 为外部换算参考(见「坐标系与方向约定」、附录 A)
URFR安装方向编码,用户坐标系相对传感器系的轴向映射(见「安装方向」)
COORD世界坐标系配置(ENU / NWU,见「坐标系与方向约定」、「CONFIG 配置命令」)
MAIN_STATUS主状态字,16 位(见「MAIN_STATUS 状态字」)
MCALMagnetometer Calibration,地磁校准(见「地磁校准与磁环境」)
USRCAL用户级陀螺校准,标定陀螺 Z 轴比例因子(见「姿态校准」)
PMUXPin Multiplexing,多功能 IO 复用(见「多功能 IO 复用」)
SOUTSync Output,帧前同步输出脉冲(见「SOUT 同步输出」)
SYNC_IN / PPS同步脉冲输入 / 标准秒脉冲,用于触发与对时(见「同步功能」)
HI91 / HI83超核二进制数据帧类型:定长浮点 / 变长位图
SOFStart of Frame,帧头同步标志(5A A5
CRCCyclic Redundancy Check,循环冗余校验
PGNParameter Group Number,参数组编号(J1939)
SA / DASource / Destination Address,源 / 目的地址(J1939)
TPDOTransmit PDO,发送过程数据对象(CANopen 周期输出)
SDOService Data Object,服务数据对象(CANopen 配置读写)
DBCCAN 数据库文件,描述 CAN 信号定义,供 CANoe / BusMaster 等导入(见附录「开发资源与技术支持」)
EDSElectronic Data Sheet,CANopen 电子数据表(对象字典描述文件,见附录「开发资源与技术支持」)
Heave / Surge / Sway垂荡 / 纵荡 / 横荡,船舶三轴周期运动(见「海浪补偿 / MRU 输出」)

附录 F — 开发资源与技术支持

二次开发可用的工具与资料入口如下:

资源用途获取
CHCenter 上位机设备连接、参数配置、数据曲线/姿态可视化、数据记录与回放、固件升级www.hipnuc.com
二进制解析示例C 语言帧解析:收帧、CRC 校验、按字段表解算见「C 语言解析示例(HI91)」
固件升级通过 CHCenter 升级,.hex 文件联系技术支持获取见附录 B
DBC / EDS(CAN)J1939 DBC、CANopen EDS 机器可读文件,便于 CANoe/BusMaster/PLC 导入联系技术支持

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

官网:www.hipnuc.com

微信公众号:

Telegram:

最后更新:

IMU · AHRS · INS · RTK 技术支持中心