-
Notifications
You must be signed in to change notification settings - Fork 17
Home
Welcome to the LF-VIO wiki! Our wiki is constantly updated......
For large FoV cameras, there are already many models. The MEI camera model and the Scaramuzza camera model are currently supported in our program.
Scaramuzza camera model calibration tool: OCamCalib
MEI camera model calibration tool:Omnidirectional Calibration Toolbox
...
Indoors datasets are open sourced as follows:
ID01, ID06, ID10: Google Drive
ID01~ID10: Baidu Yun, Code: d7wq
IDL01~IDL02: Baidu Yun, Code: khw2
Problem formulation:
let
One pair of points corresponds to one equation.
Due to the lack of scale constraints, at least eight pairs of points are required. We use the SVD method to solve this problem.
Code:
Eigen::Matrix3d InitialEXRotation::compute_E_21(vector<Eigen::Vector3d> &bearings_1, vector<Eigen::Vector3d> &bearings_2)
Input: bearings_1 and bearings_2
Output: best_E
Solve
Since
Then, we have
If
and if
At this point,
Solve
At this point,
In summary, a total of four corresponding situations are shown in the above figure.
In our paper, yo select the correct solution, we use a method that chooses the
Code:
int MotionEstimator::recoverPose(Eigen::Matrix3d E, vector<Eigen::Vector3d> _points1, vector<Eigen::Vector3d> _points2,
Matrix3d _R, Vector3d _t, vector<uchar> _mask)
Input: E, _points1, _points2
Output: _R, _t, mask(1:inlier 0:outlier)
let
Therefore, there are four equations in the two-point triangulation process, and we use the SVD method to solve the three-dimensional coordinates to solve the
Code:
void MotionEstimator::triangulatePoint(Eigen::Matrix<double, 3, 4> &Pose0, Eigen::Matrix<double, 3, 4> &Pose1,
const Vector3d &point0, const Vector3d &point1, Vector3d &point_3d)
Input: Pose0, Pose1, point0, point1
Output: point_3d
Input:
Output:
In our paper, we use EPnP method to slove PnP problem.
Code:
double PnpSolver::compute_pose(Eigen::Matrix3d &R, Eigen::Vector3d &T)
Problem formulation:
Code:
void solveGyroscopeBias(map<double, ImageFrame> &all_image_frame, Vector3d* Bgs)
Code:
bool GlobalSFM::construct(int frame_num, Quaterniond *q, Vector3d *T, int l,
const Matrix3d relative_R, const Vector3d relative_T,
vector<SFMFeature> &sfm_f, map<int, Vector3d> &sfm_tracked_points)
Code without
ProjectionFactor::ProjectionFactor(const Eigen::Vector3d &_pts_i, const Eigen::Vector3d &_pts_j) : pts_i(_pts_i), pts_j(_pts_j)
Code with
ProjectionTdFactor::ProjectionTdFactor(const Eigen::Vector3d &_pts_i, const Eigen::Vector3d &_pts_j,
const Eigen::Vector3d &_velocity_i, const Eigen::Vector3d &_velocity_j,
const double _td_i, const double _td_j, const double _row_i, const double _row_j, int _track_size) : pts_i(_pts_i), pts_j(_pts_j),
td_i(_td_i), td_j(_td_j), track_size(_track_size)
Code:
IntegrationBase(const Eigen::Vector3d &_acc_0, const Eigen::Vector3d &_gyr_0,
const Eigen::Vector3d &_linearized_ba, const Eigen::Vector3d &_linearized_bg)
: acc_0{_acc_0}, gyr_0{_gyr_0}, linearized_acc{_acc_0}, linearized_gyr{_gyr_0},
linearized_ba{_linearized_ba}, linearized_bg{_linearized_bg},
jacobian{Eigen::Matrix<double, 15, 15>::Identity()}, covariance{Eigen::Matrix<double, 15, 15>::Zero()},
sum_dt{0.0}, delta_p{Eigen::Vector3d::Zero()}, delta_q{Eigen::Quaterniond::Identity()}, delta_v{Eigen::Vector3d::Zero()}
Code:
void MarginalizationInfo::addResidualBlockInfo(ResidualBlockInfo *residual_block_info)