Calibration Tutorial for ORB-SLAM3 v1.0
1.介绍
本文档简要说明了视觉和视觉惯性标定(针对ORB-SLAM3 v1.0版本)。在这个版本中,我们引入了一种新的校准文件格式.
新文件格式的优势:
- 通过一致的命名提高了可读性
- 双目图像矫正选项
- 调整输入图像尺寸选项
可在Examples中找到使用新校准fromat的一些示例。虽然我们建议使用新的文件格式,但为了方便用户,程序兼容以前版本中使用的文件格式,其示例见Examples_old。
2.参考系和外参
外参定义了不同传感器的几何关系。最复杂的情况是双目惯导参数,如图。
- World (W):世界坐标系,一个绝对坐标系,z轴方向是重力g的反方向,平移、偏航(也就是x、y轴方向)由slam自由设定,在系统初始化后固定,需要注意的是在纯视觉slam中,世界坐标系是第一帧左目相机坐标系。
- Body (B):载体坐标系,可优化的imu的坐标系,加速度计和陀螺仪的数据都是基于这个坐标系,载体姿态Twb和速度Vb在世界坐标系的表示是可以优化的量。
- Cameras (C 1 and C 2):相机坐标系,原点为相机光心,z轴沿光轴指向前方,x轴向下,y轴指向右。x、y轴与像素坐标系的u、v轴对齐。
相机系和载体系的关系: 参数说明:Twc1为相机坐标系(c1)中的点转换到世界坐标系(w)的齐次变换矩阵。
参数文件需要提供的参数:
- 双目惯导:TBC1和TC1C2
- 单目惯导: TBC1
- 双目视觉:TC1C2,在双目视觉slam中B系就是左目相机坐标系(C1)
- 单目视觉:不需要外参
如果你的相机或者数据集提供的是校正过的立体图像,那么你的参数文件只需要提供基线长度而不是完整的TC1C2矩阵。 所有的外参都可以通过标定软件来获得,比如kalibr,实例在第四部分。
3.内参
内参数值取决于传感器本身,我们按照惯性传感器内参和相机内参来说明。
3.1相机内参
由于相机的不同我们需要提供不同的校正参数,可以通过opencv或者kalibr来获得,在orbslam3中我们支持三种相机类型
- Pinhole:针孔相机,内参包括:相机焦距(fx、fy)、相主点坐标(cx、cy)、两个或三个径向畸变参数(K1、K2、K3)、两个切向畸变参数(p1、p2) 注:畸变模型:径向-切向畸变模型
- KannalaBrandt8:Kannala-Brandt模式适用于广角和鱼眼镜头。内参包括:相机焦距(fx、fy)、相主点坐标(cx、cy)、四个等距畸变模型参数(k1、k2、k3、k4)。 注:畸变模型:等距畸变模型
- Rectified:已矫正图像模式,这种模式适用于相机或者数据集提供已经矫正的双目相机图像的情况,这种情况只需要相机焦距(fx、fy)、相主点坐标(cx、cy)和相机基线。
对于双目针孔相机,orbslam3使用opencv的stereorectify函数对左右目图像进行矫正。为了防止分辨率和视野的损失KannalaBrandt8不进行矫正。 对于三种相机类型的三种参数文件在下边目录可以找到:
Examples/Stereo-Inertial in files Euroc.yaml (Pinhole),
TUM_VI_512.yaml (Kannal-aBrandt8)
and Realsense_D435i.yaml (Rectified).
3.2imu内参
imu读数(线性加速度和角速度)被观测噪声和偏置影响: 参数说明: a:真实的加速度(重力影响不去除) w:真实的角速度 (参考系为b系)
观测噪声: 假设观测噪声服从中心正态分布 σ a和σ g为噪声密度,反映了imu数据的特征。这两个参数需要填写在参数文件,单位是m/s / Hz 和 rad/s/ Hz 在融合imu观测值,估计观测值的协方差时,使用的噪声密度需要imu采样频率f,因此参数文件需要提供采样频率。程序内部计算σ a,f = σ a / f。
偏置: 假定偏置按照布朗运动演化,给定两个连续的瞬间 i和i+1,特点是 参数文件需要提供imu偏置的随机游走标准差:σ a,rw and σ g,rw 增加imu生产商提供随机游走标准差(比如乘10)是一种减弱未建模的影响并促进imu初始化收敛的常见做法。
4.Realsense D435i相机使用kalibr标定的实例
这里我们展示一个单目惯导标定的例子,使用D435i相机。我们假设realsense库已经安装,使用kalibr进行标定,步骤如下:
- 下载kalibr。
- 标定图案选择推荐的April,可以在之前的下载界面找到模板,打印出来,保证图案只是按比例缩放,比例不变。更新April的配置文件(yaml),可以在下载界面找到详细的说明和参考。
- 记录数据可以使用相机的SDK或者我们提供的数据记录程序,使用方法:
./ Examples / Calibration / r e c o r d e r _ r e a l s e n s e _ D 4 3 5 i ./ Examples /Calibration / recorder
- 使用Python脚本处理IMU数据,同步陀螺仪和加速度计数据保存。
python3 ./ Examples / Calibration / python_scripts / process_imu . py ./Examples / Calibration / recorder /
./ kali br_bagcr eater -- folder / path_to_ ORB_SLAM 3 / Examples /Calibration / recorder /. -- output - bag / path _to_ORB_ SLAM3 / Examples /Calibration / recorder . bag
4.1 视觉标定
计算相机内参和双目相机转换参数。步骤如下
- 采集数据,缓慢移动避免图像模糊、保证光照条件良好降低曝光时间,可以移动标定板不移动相机,但是要确定April没有变形。例子
- April尽可能的大,使得在尽可能远的地方April占满图像,估计相机的焦距。数据的长度没有要求,只需要尝试不同视角并且保证所有的像素点在多个时间点看到April。
- 可以降低图像帧率,来加快kalibr计算速度,不强制要求。
- 标定
./ k a l i b r _ c a l i b r a t e _ c a m e r a s -- bag / p ath_to_O RB_SLAM3 / Examples /
Calibration / recorder . bag -- topics / cam0 / image_raw -- models
pinhole - radtan -- target / path _to_ORB_ SLAM3 / Examples / Calibration /
apr i l _t o _b e _u p d at e d . yaml
对于D435i对比厂家给定参数和我们自己通过kalibr标定的结果,成功标定的典型冲投影误差值均值接近零像素,标准差<0.3. (原文:For our monocular Realsense D435i, we compare Kalibr and factory calibration at table 1. Typical values of reprojection error for a successful visual calibration are those whose mean is close to zero pixels (|μ| < 10 ?4 ) and its standard deviation σ < 0.3.)
4.2惯导标定
视觉参数标定完成开始惯导参数标定。
- 数据采集,设备沿着各轴快速移动,激活加速度计和陀螺仪。尽量保持April大部分在图片内,这样kalibr能够准确的估计相对位姿变换,同时数据April需要保持固定。一个视觉惯导标定例子
- 需要提供噪声密度、偏置随机游走。可以在IMU数据表中找到,也可以采集一段长时间的静止IMU数据来估计。
- 最后标定
./ k a l i b r _ c a l i b r a t e _ i m u _ c a m e r a -- bag / pa th_to_OR B_SLAM3 / Examples /Calibration / recorder . bag -- cam / pa th_to_ORB _SLAM3 / Examples /Calibration / ca mer a_ ca lib ra ti on . yaml -- imu / path_to _ORB_SLA M3 /Examples / Calibration / imu_intrinsics . yaml -- target /path_ to_ORB_S LAM3 / Examples / Calibration / a pr i l_ t o_ b e _u p da t e d . yaml
比较厂家给定参数和使用kalibr标定的参数:
4.3 orbslam3 Launch文件
标定完成后,将参数填入yaml文件(参考5),运行orbslam33程序。
./ Examples / Monocular - Inertial / m o n o _ i n e r t i a l _ r e a l s e n s e _ D 4 3 5 i
Vocabulary / ORBvoc . txt Examples / Monocular - Inertial / RealSense_D435i .
yaml
5.新参数文件参考
本节总结了ORB-SLAM3在任何阶段所需的所有参数,包括内参、外参、ORB提取参数和可视化设置。所有这些配置参数必须在yaml文件中传递给RB-SLAM3。yaml文件数据保存为对组<Key, value>的形式。参数名和值分别编码。我们现在定义orbslam所接受的所有参数,他们的类型和是否是必须的。
5.1常规参数
- File.version = “1.0” [REQUIRED]:指定是否使用新的参数文件格式
- Camera.type (string) [REQUIRED]:指定相机类型,必须为下面三种。
(1)PinHole when using pinhole cameras.针孔相机 (2)KannalaBrandt8 when using fish-eye cameras with a Kannala-Bradt calibra- tion model.鱼眼相机 (3) Rectified when using a stereo rectified pinhole camera.矫正过的数据 - Camera.height, Camera.width (int) [REQUIRED]:输入图像的高、宽
- Camera.newHeight, Camera.newWidth (int) [OPTIONAL]:如果定义了,slam系统会重新调整输入图像的大小到指定的分辨率,根据需要重新计算参数。
- Camera.fps (int) [REQUIRED]:相机帧率
- Camera.RGB (int) [REQUIRED]: 指定图像是否是彩色图像,BGR (0) or RGB,如果是灰度图像则忽略此图像。
- System.thFarPoints (float) [OPTIONAL]:如果定义了,指定了允许的点的最大深度(m),点距离超过最大深度就被忽略。
5.2相机内参
We define the Camera1 as the monocular camera (in monocular SLAM) or the left camera (in stereo SLAM). Its intrinsic parameters correspond to: 我们定义 Camera1 是在单目slam中的相机,双目slam中的左目相机。它的参数对应为:
- Camera1.fx, Camera1.fy, Camera1.cx, Camera1.cy (float) [REQUIRED]: camera1的内参fx、fy为焦距,cx、cy为像主点坐标。如果你的相机模型是针孔相机,就需要指定它。
- Camera1.k1, Camera1.k2 (float) [REQUIRED]: 径向畸变参数
- Camera1.p1, Camera1.p2 (float) [REQUIRED]: 切向畸变参数
- Camera1.k3 (float) [OPTIONAL]: 第三个径向畸变参数,使用语言相机时需要给定这个参数。
- Camera1.k1, Camera1.k2, Camera1.k3, Camera1.k4 (float) [REQUIRED]:Kannala-
Brandt畸变系数
如果使用立体相机,需要指定右目相机参数,除非相机类型是rectified,这种类型相机被假定为具有相同的参数。
5.3 双目(立体)相机参数
在双目相机配置时要求有下面参数
- ×××××疑问×××××× Stereo.ThDepth (float) [REQUIRED]:it is the number of the stereo baselines we use to classify a point as close or far. Close and far points are treated differently in several parts of the stereo SLAM algorithm.
双目基线数量,我们使用它来确定近点、远点。近点、远点在slam算法的一些部分处理方法存在差别。
如果 Camera.type 是 Rectified, 你需要添加如下参数:
- Stereo.b (float) [REQUIRED]:双目基线长度(m)
如果你使用的 Camera.type 不是 Rectified
- Stereo.T_c1_c2 (cv::Mat) [REQUIRED]:两个相机相机坐标系的转换关系
如果你使用的是鱼眼相机(i.e. Camera.type is set to KannalaBrandt8 )你需要指定两张图的重叠面积:
-
Camera1.overlappingBegin, Camera2.overlappingBegin (int) [REQUIRED]:重叠区域的起始列。 -
Camera1.overlappingEnd, Camera2.overlappingEnd (int) [REQUIRED]:重叠区域的结束列。
5.4 Inertial parameters
使用惯导,必须给定下列参数:
- IMU.NoiseGyro (float) [REQUIRED]:陀螺仪观测噪声密度
- IMU.NoiseAcc (float) [REQUIRED]:加速度计观测噪声密度
- IMU.GyroWalk (float) [REQUIRED]:陀螺仪随机游走方差
- IMU.AccWalk (float) [REQUIRED]:加速度计随机游走方差
- IMU.Frequency (float) [REQUIRED]:imu频率
- IMU.T_b_c1 (cv::Mat) [REQUIRED]:imu和相机坐标系的转换关系(takes a point from
Camera1 to IMU) - IMU.InsertKFsWhenLost (int) [OPTIONAL]:Specifies if the system inserts KeyFrames when the visual tracking is lost but the inertial tracking is alive. 指定当视觉跟踪丢失但惯性跟踪激活时,系统是否插入关键帧。
5.5 RGB-D parameters
RGB-D相机要求的参数:
- RGBD.DepthMapFactor (float) [REQUIRED]: factor to transform the depth
map to real units.转换深度图到实际单位的因子。
5.6 ORB parameters
下面参数是相关特征点提取的:
- ORBextractor.nFeatures (int) [REQUIRED]: 每帧的特征点提取数量
- ORBextractor.scaleFactor (float) [REQUIRED]: scale factor between levels in the
image pyramid.图像金字塔中级别之间的比例因子。 - ORBextractor.nLevels (int) [REQUIRED]: number of levels in the image pyramid.图像金字塔中的级别数。
- ORBextractor.iniThFAST (int) [REQUIRED]: initial threshold to detect FAST
corners.检测fast角点的初始阈值。 - ORBextractor.minThFAST (int) [REQUIRED]: if no features are found with the
initial threshold, the system tries a second time with this threshold value.如果未找到满足初始阈值的特征点,系统将使用该阈值再次尝试。
5.7 Atlas parameters
这些参数定义了我们是否从文件加载/保存地图:
- System.LoadAtlasFromFile (string) [OPTIONAL]:file path where the map to load
is located. 加载地图的路径 - System.SaveAtlasToFile (string) [OPTIONAL]: destination file to save the map
generated.保存生成地图的目标文件。
5.8 Viewer parameters
下面是用户界面相关的参数:
- Viewer.KeyFrameSize (float) [REQUIRED]: 在地图查看器中绘制的关键帧大小。
- Viewer.KeyFrameLineWidth (float) [REQUIRED]: 关键帧线宽
- Viewer.GraphLineWidth (float) [REQUIRED]: 共视图线宽
- Viewer.PointSize (float) [REQUIRED]: 地图点大小
- Viewer.CameraSize (float) [REQUIRED]: 当前帧大小
- Viewer.CameraLineWidth (float) [REQUIRED]: 当前帧线宽
- Viewer.ViewpointX, Viewer.ViewpointY, Viewer.ViewpointZ,Viewer.ViewpointF (float) [REQUIRED]: starting view point of the map viewer.地图查看器的起始视点
- Viewer.imageViewScale (float) OPTIONAL: resize factor for the image visualiza-
tion (only for visualization, not used in the SLAM pipeline).可视化调整因子,仅用于显示,不参与slam进程。
|