正在查找概念文档?
有关传感器系列、输出语义、参考系、工厂校准和噪声特性,请参阅 IMU 硬件参考。有关实际用法,请参阅下面的 IMU 示例。
如何放置它
Python
Python
1pipeline = dai.Pipeline()
2imu = pipeline.create(dai.node.IMU)输入和输出
Pipeline 流
- 创建
dai::node::IMU - 以请求的速率启用一个或多个
IMUSensor报告 - 使用
setBatchReportThreshold()和setMaxBatchReports()配置批处理 - 从主机输出队列中消耗
IMUData数据包
限制
- 在使用 BNO08X 的 RVC2 设备上,由于传感器硬件限制,陀螺仪频率高于 400 Hz 可能会产生偶尔的抖动。
请求的报告速率
imu.enableIMUSensor(..., reportRate) 接受以 Hz 为单位的请求报告速率。实际运行时行为取决于 IMU 和平台:- 在使用 BNO08X 的 RVC2 设备上,请求的速率会向上舍入到下一个支持的速率。
- 在使用 BMI270 的 RVC2 设备上,请求的速率会向下舍入到下一个支持的速率。高于 400 Hz 的请求目前最高约为 250 Hz。
- 在使用 LSM6DSV + AK09919 的 RVC4 设备上,请将已验证的运行时速率视为特定 于平台的,而不是假设芯片的最大 ODR 直接映射到主机流速率。
示例中使用的高速率原始流
depthai-core IMU 示例和测试使用以下原始流速率进行高速捕获:ACCELEROMETER_RAW,速率为480 HzGYROSCOPE_RAW,速率为400 Hz
批处理
setBatchReportThreshold(N)设置设备允许发送批次所需的最小 IMU 数据包数量setMaxBatchReports(M)设置一个批次中包含的最大数据包数量
数据包字段和报告语义
IMUData 消息包含一个或多个 IMUPacket 条目。每个数据包仅包含在节点配置中启用的报告的字段。典型字段包括:acceleroMetergyroscopemagneticFieldrotationVector
*_RAW:传感器原生坐标系中的直接传感器输出*_UNCALIBRATED:使用imuExtrinsics旋转到 Luxonis RDF 坐标系中,未应用 IMU 校准参数*_CALIBRATED:旋转到 Luxonis RDF 坐标系中,并使用 IMU 校准参数进行校正- 融合输出,如
ROTATION_VECTOR和GAME_ROTATION_VECTOR:从传感器的内部处理路径转发
用法
Python
Python
1pipeline = dai.Pipeline()
2imu = pipeline.create(dai.node.IMU)
3
4# 以 100 Hz 的速率启用 ACCELEROMETER_RAW 和 GYROSCOPE_RAW
5imu.enableIMUSensor([dai.IMUSensor.ACCELEROMETER_RAW, dai.IMUSensor.GYROSCOPE_RAW], 100)
6# 达到此阈值后,如果主机未被阻塞且 USB 带宽可用,数据包将以 X 的批次发送
7imu.setBatchReportThreshold(1)
8# 一个批次中的最大 IMU 数据包数量,如果达到此数量,设备将阻止发送,直到主机可以接收它
9# 如果低于或等于 batchReportThreshold,则发送将始终在设备端阻塞
10# 有助于减少设备 CPU 负载和丢失的数据包数量,如果设备端由于多个节点导致 CPU 负载很高
11imu.setMaxBatchReports(10)按硬件报告可用性
当前公共 API 范围
当前的
depthai-core IMU 枚举和文档字符串仍以 BNO08X 为导向。在绑定中,该节点仍被记录为 IMU node for BNO08X,因此融合和处理后的报告覆盖范围应与硬件文档一起阅读,并在传感器路径不是 BNO08X 时在目标设备上进行验证。| 报告系 列 | IMUSensor 值 | BNO08X | BMI270 | LSM6DSV | AK09919 | 备注 |
|---|---|---|---|---|---|---|
| 原始加速度 | ACCELEROMETER_RAW | 是 | 是 | 是 | 否 | 原始加速度流 |
| Luxonis 坐标系下的加速度计(无 IMU 校准参数) | ACCELEROMETER_UNCALIBRATED | 是 | 是 | 是 | 否 | RAW -> UNCALIBRATED 应用 imuExtrinsics。这是统一的 IMU 坐标系加速度计路径。 |
| Luxonis 坐标系下的加速度计(有 IMU 校准参数) | ACCELEROMETER_CALIBRATED | 是 | 是 | 是 | 否 | 需要在运行时校准负载中存在 IMU 校准参数。 |
| 原始角速度 | GYROSCOPE_RAW | 是 | 是 | 是 | 否 | 原始陀螺仪流 |
| Luxonis 坐标系下的陀螺仪(无 IMU 校准参数) | GYROSCOPE_UNCALIBRATED | 是 | 是 | 是 | 否 | RAW -> UNCALIBRATED 应用 imuExtrinsics。在旧设备上,这应该可以开箱即用。 |
| Luxonis 坐标系下的陀螺仪(有 IMU 校准参数) | GYROSCOPE_CALIBRATED | 是 | 是 | 是 | 否 | 需要在运行时校准负载中存在 IMU 校准参数。 |
| 原始磁场 | MAGNETOMETER_RAW | 是 | 否 | 否 | 是 | 在 RVC4 上,原始磁力计数据来自 AK09919 伴随传感器。 |
| 处理后的磁场 | MAGNETOMETER_CALIBRATED, MAGNETOMETER_UNCALIBRATED | 是 | 否 | 否 | 在目标硬件上验证 | 公共枚举/文档字符串对于处理后的磁力计输出仍然是 BNO08X 形状的。 |
| 派生加速度输出 | LINEAR_ACCELERATION, GRAVITY | 是 | 否 | 在目标硬件上验证 | 否 | BNO08X 直接公开这些。对于非 BNO 路径,请在目标设备上验证可用性并进行分支。 |
| 融合方向输出 | ROTATION_VECTOR, GAME_ROTATION_VECTOR, GEOMAGNETIC_ROTATION_VECTOR, ARVR_STABILIZED_ROTATION_VECTOR, ARVR_STABILIZED_GAME_ROTATION_VECTOR | 是 | 否 | 在目标硬件上验证 | 否,独立 | 这些是传感器融合输出,而不是由 IMU 节点在主机端进行的融合。 |
校准和外参
device.readCalibration() 从设备读取出厂校准负载。在使用运行时校准覆盖时,请使用 device.getCalibration() 和 device.setCalibration()。对于处理后的惯性输出,请使用此模型:RAW -> UNCALIBRATED:使用imuExtrinsics将传感器原生坐标系对齐到 Luxonis RDF 坐标系UNCALIBRATED -> CALIBRATED:应用在 IMU 校准参数中设置的加速度计或陀螺仪校准- 因此,
ACCELEROMETER_UNCALIBRATED和GYROSCOPE_UNCALIBRATED共享统一的 IMU 坐标系路径 ACCELEROMETER_CALIBRATED和GYROSCOPE_CALIBRATED在此基础上增加了运行时校准修正
处理后的输出变换
RAW -> UNCALIBRATED
Python
1import depthai as dai
2import numpy as np
3
4with dai.Pipeline() as pipeline:
5 imu = pipeline.create(dai.node.IMU)
6 imu.enableIMUSensor(dai.IMUSensor.ACCELEROMETER_RAW, 100)
7 imu_q = imu.out.createOutputQueue(maxSize=10, blocking=False)
8
9 device = pipeline.getDefaultDevice()
10 calib = device.readCalibration()
11 imu_to_cam = np.array(calib.getImuToCameraExtrinsics(dai.CameraBoardSocket.CAM_A, False))
12 R_imu_to_cam = imu_to_cam[:3, :3]
13
14 pipeline.start()
15 pkt = imu_q.get().packets[0]
16 raw = np.array([pkt.acceleroMeter.x, pkt.acceleroMeter.y, pkt.acceleroMeter.z])
17 uncalibrated = R_imu_to_cam @ raw读取多个 IMU 流
Python
Python
1import depthai as dai
2
3with dai.Pipeline() as pipeline:
4 imu = pipeline.create(dai.node.IMU)
5
6 imu.enableIMUSensor(dai.IMUSensor.ACCELEROMETER_RAW, 100)
7 imu.enableIMUSensor(dai.IMUSensor.GYROSCOPE_RAW, 100)
8 imu.enableIMUSensor(dai.IMUSensor.MAGNETOMETER_RAW, 100)
9
10 imu.setBatchReportThreshold(1)
11 imu.setMaxBatchReports(10)
12
13 imu_q = imu.out.createOutputQueue(maxSize=50, blocking=False)
14
15 pipeline.start()
16 while pipeline.isRunning():
17 imu_data = imu_q.get()
18 for pkt in imu_data.packets:
19 a = pkt.acceleroMeter
20 g = pkt.gyroscope
21 m = pkt.magneticField功能示例
参考
class
dai::node::IMU
variable
variable
function
void enableIMUSensor(IMUSensorConfig sensorConfig)function
void enableIMUSensor(const std::vector< IMUSensorConfig > & sensorConfigs)function
void enableIMUSensor(IMUSensor sensor, uint32_t reportRate)function
void enableIMUSensor(const std::vector< IMUSensor > & sensors, uint32_t reportRate)function
void setBatchReportThreshold(std::int32_t batchReportThreshold)Above this packet threshold data will be sent to host, if queue is not blocked
function
std::int32_t getBatchReportThreshold()Above this packet threshold data will be sent to host, if queue is not blocked
function
void setMaxBatchReports(std::int32_t maxBatchReports)function
std::int32_t getMaxBatchReports()function
void enableFirmwareUpdate(bool enable)Whether to perform firmware update or not. Default value: false.
inline function
DeviceNodeCRTP()inline function
DeviceNodeCRTP(const std::shared_ptr< Device > & device)inline function
DeviceNodeCRTP(std::unique_ptr< Properties > props)inline function
DeviceNodeCRTP(std::unique_ptr< Properties > props, bool confMode)inline function
DeviceNodeCRTP(const std::shared_ptr< Device > & device, std::unique_ptr< Properties > props, bool confMode)需要帮助?
请前往 Discussion Forum 获取技术支持或提出您可能有的任何其他问题。