闲来无事,跑个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的运动更剧烈一些。