vio第二章-中值积分修改

1、安装库
安装sophus
因之前安装的是eigen3.2.29,重新源码安装了eigen3.3.4
编译sophus还是报错,参考:https://www.it610.com/article/1290749043999318016.htm 这篇文章。

其他可以参考:https://www.it610.com/article/1281501671595196416.htm。

安装ceres
由于上面安装的是eigen3.3版本,因此在ceres下载最新的版本的,进行编译。

sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.4 libgflags-dev
sudo apt-get install libgoogle-glog-dev libgtest-dev

//下载最小的ceres
git clone https://github.com/ceres-solver/ceres-solver

由于我的glog问题,我在编译时,指定了MINIGLOG

cmake  -DMINIGLOG=ON ..
make -j4
sudo make install

2、欧拉积分改为中值积分看效果
先做个小总结:
imu可以给出采样时刻的基于本体坐标系的角速度、加速度,而我们需要的是这个imu现在在W坐标系下的姿态情况,包括速度、旋转矩阵、位置。
怎么进行处理?
首先imu得到的角速度、加速度有关联吗?为什么要得到角速度和加速度,只有加速度行吗?只有角速度行吗?角速度和磁力计结合行吗?
这个角速度和加速度是很有必要的一对数据,加速度是需要依赖角速度才能转换到W坐标系下的。
通过角速度对时间积分,可以得到一段时间内的旋转了多少度(三个轴的),与上一时刻的旋转矩阵相乘,就可以得到当前时刻imu坐标系相对于W坐标系的旋转情况Rwb,有了这个Rwb,就可以把采样到的imu坐标系下的加速度转换到W坐标系下,从而积分出速度、位移。
刚才说的旋转角度对时间积分,说的是理想的已知角速度变化曲线情况下的积分,当然是很精准的可以知道一段时间的实际旋转角度。但实际上,我们并不知道imu会怎么旋转,所以也就无从知道这个imu旋转角度曲线公式(除非是自己造数据,指定了路径),拿到都是一个个离散的,当前测量到的旋转速度(角速度)。如何能把上一时刻到当前时刻这段时间的旋转角度计算的更准确些?一个粗暴的做法就是直接认为从上一时刻起,其角速度都保持与当前得到的角速度一样的值,这个就是欧拉积分的做法。可想而知除非真是匀转速情况,否则是不准确的。另一种,就是认为上一时刻到当前时刻,其角速度变化是线性的,取中间值来代替。这个确实可以更准确些。
要想更准确,可以让采样周期更短。

下面是欧拉积分改为中值积分的代码:

//delta_q = [1 , 1/2 * thetax , 1/2 * theta_y, 1/2 * theta_z]
        Eigen::Quaterniond dq;
        #ifdef Eura_method
        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();
        dq.normalize();
        
        // imu 动力学模型 欧拉积分
        Eigen::Vector3d acc_w = Qwb * (imupose.imu_acc) + gw;  // aw = Rwb * ( acc_body - acc_bias ) + gw
        Qwb = Qwb * dq;
        Pwb = Pwb + Vw * dt + 0.5 * dt * dt * acc_w;
        Vw = Vw + acc_w * dt;
        
        #else
        /// 中值积分
        Eigen::Vector3d dtheta_half =  (imupose.imu_gyro+imudata[i-1].imu_gyro)/2 * dt /2.0;
        dq.w() = 1;
        dq.x() = dtheta_half.x();
        dq.y() = dtheta_half.y();
        dq.z() = dtheta_half.z();
        dq.normalize();

		Qwb = Qwb * dq;
        Eigen::Vector3d acc_w=(Qwb*(imupose.imu_acc)+gw+pre_Qwb*(imudata[i-1].imu_acc)+gw)/2;
        Pwb = Pwb + Vw * dt + 0.5 * dt * dt * acc_w;
        Vw = Vw + acc_w * dt;
        #endif

原来的采样频率为200,基本上看不出中值积分与真值的差别,欧拉积分的差别是很明显的,将频率改为50,看看:

欧拉积分:
在这里插入图片描述

中值积分:
在这里插入图片描述
差距很明显。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值