ORBSLAM3初始化对配置文件里的IMU标定参数(噪声和随机游走)这么敏感,是拿那些参数参与实际的IMU预积分运算了,vins里面那些参数只是影响IMU预积分权重。
可以看到IMU预积分函数传入的参数有IMU偏置和IMU标定参数 ORB_SLAM3/src/Tracking.cc
const float sf = sqrt(freq); cout << endl; cout << "IMU frequency: " << freq << " Hz" << endl; cout << "IMU gyro noise: " << Ng << " rad/s/sqrt(Hz)" << endl; cout << "IMU gyro walk: " << Ngw << " rad/s^2/sqrt(Hz)" << endl; cout << "IMU accelerometer noise: " << Na << " m/s^2/sqrt(Hz)" << endl; cout << "IMU accelerometer walk: " << Naw << " m/s^3/sqrt(Hz)" << endl; mpImuCalib = new IMU::Calib(Tbc,Ng*sf,Na*sf,Ngw/sf,Naw/sf); mpImuPreintegratedFromLastKF = new IMU::Preintegrated(IMU::Bias(),*mpImuCalib);
ORB_SLAM3/src/ImuTypes.cc
/** * @brief 预积分类构造函数,根据输入的偏置初始化预积分参数 * @param b_ 偏置 * @param calib imu标定参数的类 */ Preintegrated::Preintegrated(const Bias &b_, const Calib &calib) { Nga = calib.Cov; NgaWalk = calib.CovWalk; Initialize(b_); }
Nga 和NgaWalk 有在Preintegrated::IntegrateNewMeasurement函数里更新协方差的时候用到,协方差也就是信息矩阵,程小六的书里有讲(这感觉跟vins里面影响IMU预积分权重类似啊 ),Preintegrated::IntegrateNewMeasurement函数就是预积分计算函数(可以看这里的注释 https://github.com/electech6/ORB_SLAM3_detailed_comments/blob/master/src/ImuTypes.cc#L247 ) ORB_SLAM3/src/ImuTypes.cc
// Update covariance C.rowRange(0,9).colRange(0,9) = A*C.rowRange(0,9).colRange(0,9)*A.t() + B*Nga*B.t(); C.rowRange(9,15).colRange(9,15) = C.rowRange(9,15).colRange(9,15) + NgaWalk;
之所以传入这两个参数也是有道理的
https://blog.csdn.net/qq_44530706/article/details/129780079