问题描述
闲来无事,跑个VINS-Mono玩玩,按照github给的步骤,一步步进行,没有报错,编译完美结束。但是在运行的时候:
IMU excitation not enouth!
Not enough features or parallax; Move device around
我这跑得是数据集啊,不可能存在没有数据的情况。
解决办法
仔细想想肯定是自己的问题,根据之前的经验,大概率是库的版本的问题,因为原程序用的是ROS里的eigen库,于是卸载了自己安装的eigen库,完美解决。
其它原因分析
看文章的代码,这个报错是出现在初始化部分的,那么我们定位到这个ROS_INFO的位置,看一下代码,代码位置:Estimator::initialStructure()
{
map<double, ImageFrame>::iterator frame_it;
Vector3d sum_g;
//遍历除了第一帧之外的所有图像帧
for (frame_it = all_image_frame.begin(), frame_it++; frame_it != all_image_frame.end(); frame_it++)
{
double dt = frame_it->second.pre_integration->sum_dt;
//计算每一帧图像对应的加速度
Vector3d tmp_g = frame_it->second.pre_integration->delta_v / dt;
//图像的加速度累加
sum_g += tmp_g;
}
Vector3d aver_g;
//计算平均加速度
aver_g = sum_g * 1.0 / ((int)all_image_frame.size() - 1);
double var = 0;
for (frame_it = all_image_frame.begin(), frame_it++; frame_it != all_image_frame.end(); frame_it++)
{
double dt = frame_it->second.pre_integration->sum_dt;
Vector3d tmp_g = frame_it->second.pre_integration->delta_v / dt;
//加速度 减去 平均加速度 的 差值的 平方的 累加
var += (tmp_g - aver_g).transpose() * (tmp_g - aver_g);
//cout << "frame g " << tmp_g.transpose() << endl;
}
/**
* 简单来说,标准差是一组数值自平均值分散程度的一种测量观念
* 较大的标准差,说明大部分的数值和其平均值差异较大; 较小的标注差,说明这些数值和均值比较接近
* 方差公式:s^2 = [(x1 - x)^2 + (x2 - x)^2 + ... + (xn - x)^2]/n
* 标准差: s = sqrt(s^2)
*/
var = sqrt(var / ((int)all_image_frame.size() - 1));
//ROS_WARN("IMU variation %f!", var);
//通过加速度标准差判断IMU是否由充分运动,标准差必须大于等于0.25
if(var < 0.25)
{
ROS_INFO("IMU excitation not enouth!");
//return false;
}
}
代码的注释已经很全了,具体就不啰嗦了。
解决办法
跑自己的数据集或者用自己的相机在线跑的时候,出现这个报错,就是要让IMU的运动更剧烈一些。