Introduction
在无标定目标的环境中,激光雷达-摄像头系统内在和外在参数的联合标定。本文旨在在没有棋盘格的情况下,标定摄像头的内参和激光雷达-摄像头的外参,同时保持与基于标定目标的方法相当的精度。我们的方法仅需要场景中的几块有纹理的平面。由于有纹理的平面在城市环境中普遍存在,因此该方法在各种标定场景中具有广泛的适用性。关于该方法的详细描述,请参阅我们的论文。标定流程概述如下面的图所示
算法实现流程
算法主流程如下:
int main(int argc, char *argv[])
{
ros::init(argc, argv, "calib");
ros::NodeHandle nh;
std::string data_folder_ = "";
nh.param<std::string>("data_folder", data_folder_, "");
Calib calib(data_folder_); // Load raw data and configuration parameters
calib.save_SfM_cloud("init", false, "init"); // Visualize SfM point cloud;
calib.save_LiDAR_BA_cloud(); // Visualize LiDAR point clouds after BA;
std::cout << std::endl;
calib.recover_visual_scale(); // Solve monocular visual scale through hand-eye-calibration
calib.refine_scale_ext(); // Iteratively refine visual scale and extrinsic parameters
std::cout << std::endl;
calib.save_SfM_cloud("before_opt", true, "init"); // Visualize SfM point cloud in the LiDAR frame before optimization;
std::cout << std::endl;
calib.joint_calib(); // Jointly calibrate intrinsic and extrinsic parameters
calib.print_optimized_calibration();
calib.save_opt_calib();
calib.save_SfM_cloud("after_opt", true, "opt"); // Visualize SfM point cloud in the LiDAR frame after optimization;
calib.colorize(); // Colorize point clouds given the calibration
return 0;
}
(1)首先是利用colmap来重建视觉3d,恢复的点云没有尺度信息
(2) 利用激光lidar里程计计算每一帧的lidar位姿
(3)利用手眼标定,恢复出视觉的尺度
(4)恢复尺度的视觉点云和Lidar点云直接,通过最小化视觉点到Lidar点云的平面的距离实现联合优化,优化变量包括视觉的尺度,相机内参,外参等。