IMU陀螺仪和加速度计的时间同步理解

关于IMU

IMU是指六轴传感器,包含陀螺仪和加速度计。MARG 是指九轴传感器,在 IMU 的基础上添加了磁力计,磁力计可以测量角速度变化,优化陀螺仪的输出。在 IMU 受力平衡状态下,陀螺仪是内部传感器,加速度计(在重力场下)和磁力计(在地磁场下)是外部传感器。

IMU陀螺仪和加速度计时的间同步

目前大多数基于VI的SLAM算法如ROVIO、MSCKF、OKVIS、VINS-MONO等融合IMU数据都假设陀螺仪和加速度计以固定速率“同步”,在数学上使得SLAM更为简单。
上述大多数SLAM算法都假设IMU中陀螺仪和加速度计之间的延迟随时间变化是恒定的,imu校准工具箱Kalibr也认为,不希望在状态向量中估计一个可变的时延,这只会增加算法的复杂度。

“复制”方法

对于Realsense相机在运行roslaunch realsense2_camera rs_camera.launch 时,其中unite_imu_method = “copy” ,为每个传入的陀螺仪或加速度信息创建一个统一的消息 ,输出速率约为200+250大约为450Hz,比如实际 gyro为250 Hz, accel为 200 Hz ,最终约为448Hz,。

“插值”方法:

陀螺仪的帧率一般高于加速度计的帧率,也有些传感器是相反,下面画出了一个IMU信息序列;

  • A messages表示采样较慢的传感器的(如加速度计)信息
  • B messages表示采样较快的传感器的(如陀螺仪)信息
	A   messages:  A1............A3................A6.......A8..........A10
	B   messages:  B1......B2.......B4......B5.......B7.....B8......B9
	------------------------------------------------------------------------
	Arrived time:  t1......t2....t3.t4......t5.....t6.......t8......t9..t10...

Arrived time 是每个时间戳的联合消息的内容,使用插值方法计算在统一时间戳处的陀螺仪或加速度值,然后打包发送:

  • t3:在t3处计算(A3, A1)在t2时间处插值的结果,然后和B2打包发送,时间戳为t2。

  • t4:在t4处计算(B4, B2)在t3时间处插值的结果,然后和A3打包发送,时间戳为t3。

  • t5:在t4,t5中没有数据更新,不计算插值。

  • t6:在t6处计算(A6,A3)在t5时间处插值的结果,然后和B5打包发送,时间戳为t5。

同一类型的消息(B)在同一类型的消息(B)之间不会生成相同类型的消息。因此,联合消息的速率预期约为较低帧速率的两倍(比如 2×200=400hz)。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
陀螺仪加速度计是常见的惯性测量单元(IMU),用于感知物体的角速度和加速度等信息。 在Arduino中,可以通过使用GY-521模块来读取陀螺仪加速度计数据。以下是一个示例代码: ``` #include<Wire.h> const int MPU_addr=0x68; // I2C address of the MPU-6050 int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up the MPU-6050) Wire.endTransmission(true); Serial.begin(9600); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L) Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L) GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L) GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L) GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L) Serial.print("AcX = "); Serial.print(AcX); Serial.print(" | AcY = "); Serial.print(AcY); Serial.print(" | AcZ = "); Serial.print(AcZ); Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53); // temperature in degrees Celsius Serial.print(" | GyX = "); Serial.print(GyX); Serial.print(" | GyY = "); Serial.print(GyY); Serial.print(" | GyZ = "); Serial.println(GyZ); delay(100); } ``` 在代码中,首先通过Wire库来初始化I2C通信,然后通过写入PWR_MGMT_1寄存器来唤醒MPU-6050。接着,在循环中使用Wire库来读取14个寄存器中的数据,并将读取到的数据保存到变量中。最后,将变量输出到串口上,以便观察陀螺仪加速度计数据。 需要注意的是,读取陀螺仪加速度计数据需要进行数据处理和校准,以保证数据的准确性。同时,陀螺仪加速度计的量程和灵敏度也需要进行设置和调整,以适配不同的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值