Skip to content
FORSENSE

UDP接收-EMF位姿

本文档说明 HumanHand 通过 UDP 发送的 EMF 传感器位姿磁发射源 IMU 协议,供接收端对接。

1. 功能概述

项目说明
输出内容五指 EMF 位姿 + 可选小臂位姿 + 磁发射源 IMU
传输协议UDP 单播,无握手
输出频率默认 120 Hz
协议标识FNIM,版本 2
单包大小240 字节(固定)
手别每包一只手;双手时左右各发一包

软件路径:用户设置 → 数据发送 → 输出格式:线圈位姿+IMU(FNIM v2)

2. 发送配置

参数默认值说明
目标 IP127.0.0.1可在「数据发送」中修改
目标端口15001可在「数据发送」中修改
字节序小端(Little-Endian)所有多字节字段

3. 坐标系说明

EMF 传感器位姿与磁发射源 IMU 均表达在该手的局部坐标系下。

3.1 EMF 传感器位姿(相对本手套磁发射源)

项目说明
原点本手套磁发射源
轴向RFU(右-前-上)
位置单位毫米(mm)
旋转四元数 w, x, y, z

RFU(右-前-上)轴向定义(手局部):

含义
X右(左手小拇指指向大拇指方向,右手大拇指指向小拇指方向)
Y前(指尖方向)
Z上(手心指向手背方向)

左右手均相对各自手套上的磁发射源;双手各自使用上述 RFU 手局部轴。

3.2 磁发射源 IMU

字段单位轴向
accel_mps2m/s²RFU(右-前-上),定义同 §3.1 轴表
gyro_radpsrad/sRFU(右-前-上),定义同 §3.1 轴表

未收到发射源 IMU 时,上述字段为 0

4. 传感器索引

每包 6 个槽位(每槽 32 字节):

索引名称说明
0thumb拇指
1index食指
2middle中指
3ring无名指
4pinky小指
5forearm小臂(可选;未接或未标定时 valid=0

5. 数据包结构

5.1 整体布局

text
偏移 0   : 包头(24 字节)
偏移 24  : 6 个传感器槽(192 字节)
偏移 216 : 磁发射源 IMU(24 字节)
合计     : 240 字节

5.2 包头(24 字节)

偏移大小类型字段说明
04uint32magic0x464E494D"FNIM"
41uint8version2
51uint8flags1=左,2=右,0=无效
62uint16reserved0
84uint32frame_number帧序号
128uint64timestamp_ns主机单调时钟纳秒
204uint32quat_order0x77787A79(表示 wxyz)

5.3 flags

含义
0无效,丢弃
1左手
2右手

5.4 单槽(32 字节,i = 0..5

相对偏移字段类型说明
0position_mm.x/y/zfloat32×3毫米
12quaternion.w/x/y/zfloat32×4wxyz
28validuint81=有效
29reserveduint8[3]0

仅当 valid == 1 时使用该槽位姿。

5.5 磁发射源 IMU(24 字节)

相对偏移字段类型单位
0accel_mps2.x/y/zfloat32×3m/s²
12gyro_radps.x/y/zfloat32×3rad/s

6. 时间戳与帧序号

字段含义
timestamp_ns单调时钟纳秒,适合测间隔与抖动
frame_number丢包 / 乱序检测

默认 120 Hz 时包间隔约 8.33 ms

7. 双手模式

  • 左手包:flags = 1
  • 右手包:flags = 2

同一时刻可能连续收到两包,按 flags 分别处理。

8. 接收端检查清单

  1. 长度 == 240
  2. magic == 0x464E494Dversion == 2
  3. quat_order == 0x77787A79
  4. flags 为 1 或 2
  5. 仅使用 valid == 1 的槽
  6. 使用包尾发射源 IMU;无有效 IMU 时可为全 0

9. C 结构体参考

c
#pragma pack(push, 1)

#define FNIM_MAGIC    0x464E494Du
#define FNIM_VERSION  2u
#define FNIM_PKT_SIZE 240u
#define FNIM_SLOTS    6u   /* 0..4 五指, 5 小臂 */

typedef struct {
    float px, py, pz;     /* mm */
    float qw, qx, qy, qz; /* wxyz */
    uint8_t valid;
    uint8_t reserved[3];
} FnimSlot;

typedef struct {
    uint32_t magic;
    uint8_t  version;
    uint8_t  flags;
    uint16_t reserved;
    uint32_t frame_number;
    uint64_t timestamp_ns;
    uint32_t quat_order;
} FnimHeader;

typedef struct {
    FnimHeader header;
    FnimSlot   slots[FNIM_SLOTS];
    float      accel_mps2[3];  /* 发射源 IMU */
    float      gyro_radps[3];
} FnimPacket;

#pragma pack(pop)

10. 参考实现

站点提供 udp_receiver.py,与关节同一脚本、同一默认端口 15001。上位机选「线圈位姿+IMU」后即可看到 6 路线圈(毫米)和发射源 IMU。

关节位姿协议见UDP接收-关节位姿

11. 与「关节位姿」对比

对比项EMF + 发射源 IMU关节位姿(FSNH)
魔数FNIM 版本 2FSNH 版本 4
包长240 B612 B(腕)/ 640 B(小臂)
内容6 槽位姿 + 发射源 IMU21 或 22 关节/手
位置单位毫米
坐标系磁源跟踪系腕相对(默认左 RFU / 右 LBU)
双手左右各一包左右各一包
时间戳单调时钟纳秒单调时钟纳秒

Copyright © 2026 Forsense. All rights reserved.