IMU的数学模型与误差标定问题

IMU数学模型

加速度计

首先,对于世界坐标系,一般我们会使用最常见的东北天(ENU)坐标系G(无关远点位置,只与姿态有关)。

在这个坐标系中,重力加速度

此时,假设IMU坐标系就是ENU坐标系,则,静止时有(其中是测量值):

所以,不静止时:(此处对ag符号不做区分标记,因为假设body系Global系一样)

由上可知,其实在物体做自由落体时imu测量的加速度才是0静止时反而是,这个是由加速度计的测量原理决定的。

上面讲的是在IMU坐标系也是ENU坐标系时的情况(此时位置无关,只关乎姿态)。大多数实际应用中,IMU坐标系(Body)一般是与ENU坐标系有一个姿态的变化的。此时,得到的理论测量值为:

此处是将Global坐标转换到Body坐标姿态的旋转矩阵。此处可以看出,global坐标系的位置与body坐标系的位置与在两个系下测量的加速度大小无关。但是,与姿态有关

陀螺仪

相比较于加速度计,陀螺仪相对简单。如果不考虑误差,则

我们会发现此处并没有像加速度计一样,将global坐标系下的角速度转换到陀螺仪的测量值,而是直接使用body系下的角速度。这是因为旋转叠加时(比如四元数和旋转矩阵表示姿态时),全局姿态是直接乘以body系下的更新量的就可以得到新的全局姿态的。

恢复运动轨迹

imu最后输出的是一个离散的加速度、角速度序列。我们想做的是利用这些恢复出运动的轨迹(也就是一个位姿的序列)。

下面会介绍两种离散积分的方法。欧拉法与中值法

这两种方法,都是已知了时刻的位姿,时刻与时刻的测量值(加速度与角速度)。目的是求得时刻的位姿。

欧拉法

欧拉法,是直接使用时刻的测量值来积分。

其中

中值法

中值法,使用两个相邻时刻的位姿是用两个时刻的测量值的平均值来离散积分。

其中

代码

 for (int i = 0; i < imudata.size()-1; ++i) {

        MotionData imupose = imudata[i];
        MotionData imupose1 = imudata[i+1];
/*
        // 欧拉积分
        //delta_q = [1 , 1/2 * thetax , 1/2 * theta_y, 1/2 * theta_z]
        Eigen::Quaterniond dq;
        Eigen::Vector3d dtheta_half =  imupose.imu_gyro * dt /2.0;
        dq.w() = 1;
        dq.x() = dtheta_half.x();
        dq.y() = dtheta_half.y();
        dq.z() = dtheta_half.z();
        Eigen::Vector3d acc_w = Qwb * (imupose.imu_acc) + gw;
        Pwb = Pwb + Vw * dt + 0.5 * dt * dt * acc_w;
        Vw = acc_w * dt + Vw;
        Qwb = Qwb * dq;
        Qwb.normalize();
*/

        /// 中值积分
        Eigen::Quaterniond dq;
        Eigen::Vector3d dtheta_half = (imupose.imu_gyro + imupose1.imu_gyro)*dt/4.0;
        dq.w() = 1;
        dq.x() = dtheta_half.x();
        dq.y() = dtheta_half.y();
        dq.z() = dtheta_half.z();
        Eigen::Quaterniond Qwb1 = Qwb * dq;
        Qwb1.normalize();
        Eigen::Vector3d acc_w = (Qwb * imupose.imu_acc + Qwb1 * imupose1.imu_acc)*0.5 + gw;
        Pwb = Pwb + Vw * dt + 0.5 * dt * dt * acc_w;
        Vw = acc_w * dt + Vw;  
        Qwb = Qwb1;

        //存储位姿
        save_points<<imupose.timestamp<<" "
                   <<Qwb.w()<<" "
                   <<Qwb.x()<<" "
                   <<Qwb.y()<<" "
                   <<Qwb.z()<<" "
                   <<Pwb(0)<<" "
                   <<Pwb(1)<<" "
                   <<Pwb(2)<<" "
                   <<std::endl;
    }

此处推荐一个生成imu数据、加噪声与测试的工具,这里中值积分与欧拉积分可以参考上面的我的代码,因为工具里可能不一定提供了。

旋转积分

上面恢复姿态轨迹的积分用了四元数的形式,下面我想多介绍几个

此处是imu的测量结果,也就是局部角速度。因为这个旋转积分的结果是姿态,因此下面会分别介绍使用四元数、SO3还有欧拉角下的积分方式。

  • 四元数的形式:

  • 形式:

  • 欧拉角形式:

我们可以发现,这三种方法,对于全局姿态的变化旋转矩阵四元数都是直接使用imu的测量(也就是局部角速度)进行更新的。只有在欧拉角的形式里,表示将IMU body坐标系下的角速度转化成欧拉角速度。此处可以推导出,这个是三种方法中唯一一个需要转换的地方。原因的话,我觉得这是因为累加与累乘的区别,欧拉角不支持乘法。如果使用角度来表示旋转矩阵与四元数,此时对角度的更新也得使用加法(原来角度加上角速度与时间的积即为新的角度),但是四元数与旋转矩阵本身是只支持乘法的,它们是直接乘以局部扰动即可

欧拉角速度到imu输出角速度

这个挺有必要的,因为用欧拉角来表示姿态还是很方便的。

  • step1:绕着惯性坐标系的z轴旋转,得到新的坐标系

  • step2:绕着新坐标系y轴旋转得到坐标系

  • step3:绕着新坐标系x轴旋转得到坐标系就是我们的body坐标系

欧拉角速度到body角速度:

上面取逆就得到,如下body到欧拉角的变换:

误差与标定

加速度计和陀螺仪的误差可以分为确定性误差随机误差

确定性误差

确定性误差可以事先标定确定,包括:bias,scale …

bias

理论上,当没有外部作用时,IMU传感器的输出应该为0。但是,实际上数据存在一个偏置b

scale

scale可以看成是实际数值传感器输出值之间的比值。

Nonorthogonality/Misalignment Errors

在多轴IMU传感器制作的时候,由于制作工艺的问题的问题,会使得xyzxyz轴可能不垂直,这个也叫轴间误差

轴间误差使得本来x轴的分量会对测量到的y轴与z轴的分量有影响。将其与scale误差相结合,会得到如下的测量与实际的对应关系。

其他确定性误差

bias与scale的误差是会受温度影响的,并且在运行中也许也会改变。


 

确定新误差的标定(六面法)

以加速度计为例,陀螺仪同理

指将加速度计的3个轴分别朝上或者朝下水平放置一段时间(对于陀螺仪就是在三个旋转轴上正反旋转,不过需要高精度转台),采集六个面的数据完成标定。

3个轴都是正交时

其中,为加速度计某个轴测量值为当地的重力加速度

当具有轴间误差时

此时实际加速度和测量值之间的关系为:

水平静止放置6面的时候,加速度的理论值为:

对应的测量值矩阵L:

利用最小二乘就能够把12个变量求出来。

随机误差

随机误差主要有两部分,一个是高斯白噪声,一个是bias随机游走。

高斯白噪声

IMU数据连续时间上受到一个均值为0,方差为,各时刻之间相互独立的高斯过程:

其中表示狄拉克函数。

不过需要说明的是,实际上,IMU传感器获取的数据为离散采样,离散和连续高斯白噪声的方差之间存在如下转换关系:

离散的序列的方差连续方差倍(传感器的采样时间)。

bias随机游走

通常使用维纳过程来建模bias随时间连续变化的过程,离散时间下称之为随机游走

bias的变化的导数是其中是方差为1的白噪声

同样,离散和连续之间的转换为:

bias随机游走的噪声方差离散的序列比连续的大倍(传感器的采样时间)。

随机误差的标定(艾伦方差标定)

Allan方差法是20世纪60年代由美国国家标准局的David Allan提出的,它是一种基于时域的分析方法。具体流程如下:

  1. 保持传感器绝对静止获取数据

  2. 对数据进行分段,设置时间段的时长,如下图所示。

  3. 将传感器数据按照时间段进行平均。

  4. 计算方差,绘制艾伦曲线

  • 此处的艾伦方差的计算公式如下(将每个时间段长度作为一个变量,将每个时间段的数据求均值,计算方差):

  • 忽略其他噪声的影响,Allan方差可以近似为各种噪声的和,化简为:

其中,Q:量化噪声误差系数;N:角速度随机游走误差系数;B:零偏不稳定性误差系数;K:速率随机游走误差系数;R:速率斜坡误差系数

(ps:其中表格中B那一项是乘法不是除法,写错了)

这里,绘制出来的艾伦曲线如下图所示:

其中t=1,斜率为-0.5处纵坐标的值为高斯白噪声方差,斜率为0.5,t=3处的纵坐标的值为随机游走方差

下面给出两个github上的比较好用的标定工具。

  1. imu_utils,额注意,这个工具的结果关于bias那一项输出的是bias稳定性的方差,不是随机游走的方差,因此,我们需要此工具生成的艾伦方差曲线自行完成bias随机游走方差的获得。。

  2. kalibr_allan

加上误差模型后的理论测量值

  • 加速度计

  • 陀螺仪

  • 低端传感器,可能会出现加速度影响陀螺仪的值的情况,也就是下面的第二项

 

 

 

 

 

 

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Velodyne VLP16与IMU标定是指将Velodyne VLP16激光雷达和惯性测单元(IMU)的数据进行配准,以获得更准确的定位和姿态信息。标定过程需要使用特定的软件和硬件设备,通过收集和处理数据来确定两个设备之间的相对位置和方向关系。标定完成后,可以将Velodyne VLP16和IMU的数据进行融合,以提高机器人、自动驾驶车辆等应用的精度和可靠性。 ### 回答2: Velodyne VLP16是一款常用于自动驾驶领域中的激光雷达设备,可以获取精准的点云数据来实现环境建图、障碍物检测等功能。而IMU(Inertial Measurement Unit)是一种惯性测单元,可以用来测车辆或者机器人的运动状态,包括速度、加速度、角速度等。在实际的自动驾驶应用中,将Velodyne VLP16与IMU进行标定可以提高系统的准确性和稳定性。 标定的过程主要包括两个部分:外部标定和内部标定。 外部标定指的是在车辆或者机器人上安装Velodyne VLP16和IMU,并测它们之间的相对位姿,包括旋转和平移。这个过程可以通过多种方法实现,比如在车辆上安装相机或者其它传感器来测它们之间的距离和方向。内部标定则是指对Velodyne VLP16和IMU本身的特性建立模型,比如测它们的噪声、误差等,以便对它们的数据进行校正。 在实际的应用中,标定的精度和速度都很重要。一般来说,标定的精度可以通过多次测来提高,也可以采用更精确的传感器或者算法来实现。而标定的速度则可以通过优化算法和硬件来提高,比如采用高速的数据传输方式或者使用更高效的标定算法。 需要注意的是,Velodyne VLP16和IMU标定是一个相互依存的过程,也就是说,在进行Velodyne VLP16的标定时需要同时进行IMU标定,反之亦然。只有在两个设备的数据都经过了准确的校正之后,才能实现更精确和可靠的自动驾驶功能。 总之,Velodyne VLP16与IMU标定是实现自动驾驶功能必不可少的步骤。通过精确的标定可以提高系统准确性和稳定性,从而实现更安全和高效的自动驾驶应用。 ### 回答3: Velodyne VLP16是一款激光雷达设备,它可以生成3D点云数据,用于地面上所有的三维感知任务。每个点云数据都可以看作是一组多个二维扫描仪捕获的距离和角度测数据。因此,当实际使用该激光雷达系统时,需要对它进行校准,以确保生成的点云具有高精度的地面位置和角度。 与Velodyne VLP16配合使用的另一个设备是IMU(惯性测单元),它包含陀螺仪和加速度计,可以确定车辆的旋转角度和加速度。在实时求解地面位置时,由于地面不是平整的,而是存在各种类型的高度和坡度变化,这些变化对于汽车导航和自动驾驶技术非常重要。IMU的数据可以帮助激光雷达根据车辆所处的位置和方向来矫正点云数据,从而可以更准确地确定车辆所在位置。 因此,Velodyne VLP16与IMU标定非常重要。IMU仅提供旋转角度和加速度信息,而Velodyne VLP16则可以提供更多信息,如距离信息。这个过程包括在地面上放置一个被称为“栅格”的平测试板,然后使用Velodyne VLP16扫描此板。该设备记录了与车辆IMU相关的所有数据,然后此数据与记录Velodyne VLP16生成的点云数据相关的组成部分进行比较。 通过Velodyne VLP16与IMU标定,可以实现车辆超精度的三维感知,这对于完善汽车自动导航和自动驾驶技术来说非常重要。同时,这个过程也可以优化Velodyne VLP16和IMU组成的设备,使其具有更高的精度和可靠性,为自动驾驶汽车的实现提供支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值