快速开始
手机开着 iMuninn,PC 装好 imuninn(见安装),五行代码拿到位姿:
import imuninn
with imuninn.connect() as dev: # 第一台找到的手机;或 "iPhone" / "10.0.0.5" / "10.0.0.5:7420" dev.start() # 开始采集(也可以在手机上点) for pose in dev.iter("ar_pose"): # 阻塞迭代;"imu" / "rgb" / "depth" / "health" 同理 print(pose.position, pose.intrinsics.fx)全部是同步调用,不需要懂 asyncio。
for p in imuninn.discover(): # Bonjour,约 2 秒 print(p.name, p.address, p.protocol_version)
dev = imuninn.connect("iPhone") # 名字dev = imuninn.connect("10.0.0.5:7420") # 地址(企业 Wi‑Fi 屏蔽 mDNS 时)dev.close()connect() 做完握手、时钟同步、订阅全部流后返回。插着 USB 时手机还有一个 169.254.x.x 的直连地址,延迟更低(往返约 1.5 ms 对 8 ms),imuninn list 会一起列出来。
r = dev.set("imu.rate_hz", 200) # 返回 ConfigResultfor f in r.fields: print(f.key, f.status, f.reason) # applied / clamped / rejecteddev.set("rgb.exposure_mode", "locked")dev.set("depth.enabled", True) # 重启采集会话,约 1 sdev.apply_profile("calibration") # 内置 YAML 预设,一次下发参数是自描述的:dev.capabilities 列出每个流的每个参数,带类型、范围、可选值和「即时 / 重启会话」。完整规则见概念。
# 迭代器:一个流for imu in dev.iter("imu"): print(imu.header.device_time_ns, imu.accel, imu.gyro)
# 迭代器:所有流,(stream, sample) 元组for stream, sample in dev.iter(): ...
# 回调:在客户端线程上执行,要快dev.on("rgb", lambda frame: q.put(frame))dev.on("*", lambda stream, sample: ...)dev.on("__event__", print) # "connected" / "config" / "lease" / "disconnected"dev.stats 给每个流的计数、按 seq 算的丢包和速率;dev.health 是手机最近一次的热状态 / 电量。
每条样本的 header.device_time_ns 是手机单调时钟。dev.to_pc_time(ns) 用握手时 NTP 式测得的偏移转成 PC 墙钟(秒);USB 下误差约 1 ms,Wi‑Fi 下约 4 ms。
imuninn watch --start # 同样的事,打印成文本imuninn rerun --start --depth # 可视化imuninn record -o run1.mcap # 录制全部命令见 CLI 参考。