本文阐述安卓手机标定相机IMU外参过程,包括以下主要流程:
1. 制作标定板
2. 单独标定单目相机的外参
3. 单独标定IMU的外参
4. 相机IMU的联合标定
在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。
【1】进行摄像机标定的目的:求出相机的内、外参数,以及畸变参数。
【2】标定相机后通常是想做两件事:一个是由于每个镜头的畸变程度各不相同,通过相机标定可以校正这种镜头畸变矫正畸变,生成矫正后的图像;另一个是根据获得的图像重构三维场景。
摄像机标定过程,简单的可以简单的描述为通过标定板,如下图,可以得到n个对应的世界坐标三维点Xi和对应的图像坐标二维点xi,这些三维点到二维点的转换都可以通过上面提到的相机内参K,相机外参R和t,以及畸变参数D,经过一系列的矩阵变换得到。
无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。
常用术语
内参矩阵: Intrinsic Matrix
焦距: Focal Length
主点: Principal Point
径向畸变: Radial Distortion
切向畸变: Tangential Distortion
旋转矩阵: Rotation Matrices
平移向量: Translation Vectors
平均重投影误差: Mean Reprojection Error
重投影误差: Reprojection Errors
重投影点: Reprojected Points
标定棋盘分为checkboard和april两种类型。对于的棋盘PDF文件可去官网下载
https://github.com/ethz-asl/kalibr/wiki/downloads#calibration-targets
提示:谷歌网盘的内容国内已不能进行下载,现在只能进行第三方下载
Checkboard棋盘格标定板PDF格式下载地址:
链接:https://pan.baidu.com/s/1Y79x9o9siHOZ5gQXUBdwjA 提取码:nxy7
April下载地址:
https://download.csdn.net/download/u013595260/12822190
有些人将这个棋盘格PDF打印在了A4纸上并贴在平整的板子上,完成了标定工作,也有些人认为A4纸不够大,应该打印在至少是A3大小的纸上。标定板选择暗色调 不反光的介质或背景
标定相机移动过程保持平稳移动,稍慢点。
sudo apt-get install ros-melodic-camera-calibration # kinect
据说这个包是Open-CV自带的,但是没有启动,所以又自己手动装了一下
路径:/opt/ros/melodic/lib/python2.7/dist-packages/camera_calibration/camera_calibrator.py
sudo apt-get install ros-melodic-freenect-*
roscore
启动相机
如果是usb相机为:
roslaunch usb_cam usb_cam.launch
#视图查看
roslaunch freenect_launch freenect.launch
rosrun rqt_image_view rqt_image_view
②符号含义:
x:表示标定板在视野中的左右位置,左右移动使绿色条变满
y:表示标定板在视野中的前后的位置,前后移动使绿色条变满
size:标定板在占视野的尺寸大小,也可以理解为标定板离摄像头的远近,上下移动使黄色条变满
skew:标定板在视野中的倾斜位置,不断旋转标定板使黄色条变满
#启动标定包
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0245 image:=/usb_cam/image_raw camera:=/usb_cam
如果是intel D435i相机双目 需要关闭ir结构光
rosrun camera_calibration cameracalibrator.py --approximate 0.1 --size 8x6 --square 0.035 left:=/camera/infra1/image_rect_raw right:=/camera/infra2/image_rect_raw right_camera:=/camera/right left_camera:=/camera/left --no-service-check
得到以下标定文件
image_width: 640
image_height: 480
camera_name: narrow_stereo
camera_matrix:
rows: 3
cols: 3
data: [ 826.49937, 0. , 300.44314,
0. , 828.03016, 250.58026,
0. , 0. , 1. ]
camera_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [0.055982, 0.173155, 0.005467, -0.010133, 0.000000]
rectification_matrix:
rows: 3
cols: 3
data: [ 1., 0., 0.,
0., 1., 0.,
0., 0., 1.]
projection_matrix:
rows: 3
cols: 4
data: [ 844.57556, 0. , 297.11471, 0. ,
0. , 849.06158, 251.97333, 0. ,
0. , 0. , 1. , 0. ]
4.IMU的标定
参考博文
https://blog.csdn.net/weixin_44401286/article/details/103143156
https://blog.csdn.net/mppcasc/article/details/120239157
https://blog.csdn.net/weixin_44401286/article/details/109641268
2.安装依赖
sudo apt-get install python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen libopencv-dev ros-melodic-vision-opencv ros-melodic-image-transport-plugins ros-melodic-cmake-modules
sudo apt-get install software-properties-common libpoco-dev python-matplotlib python-scipy python-git python-pip ipython libtbb-dev libblas-dev liblapack-dev python-catkin-tools libv4l-dev
sudo pip install python-igraph --upgrade
其中 python-igraph需要下载源码包手动编译
https://github.com/igraph/python-igraph/releases?page=2 0.7.1.post6
3.创建工作区间
mkdir -p kalibr_ws/src
cd kalibr_ws
source /opt/ros/kinetic/setup.bash
catkin init
catkin config --extend /opt/ros/kinetic
catkin config --merge-devel
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
Clone the source repo into your catkin workspace src folder
cd ~/kalibr_workspace/src
git clone https://github.com/ethz-asl/Kalibr.git
cd kalibr_ws
catkin build -DCMAKE_BUILD_TYPE=Release -j4
source /ros/kalibr_ws/devel/setup.bash
6、利用官方的标定bag文件进行标定测试
https://github.com/ethz-asl/kalibr/wiki/downloads 下载对应文件
权限问题无法访问谷歌网盘
另一种方式:
https://github.com/ethz-asl/kalibr/issues/467
https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
7.测试Multiple camera calibration文件 这里是自己的数据 path:D:\a_document\学习ROS备份资料
april_6x6.yaml / cam_april.bag文件
source /ros/kalibr_ws/devel/setup.bash
kalibr_calibrate_cameras --target /ros/kalibr_ws/src/bagdata/april_6x6.yaml --bag /ros/kalibr_ws/src/bagdata/cam_april.bag --models pinhole-equi pinhole-equi --topics /cam0/image_raw /cam1/image_raw
备注:pinhole-radtan’, ‘pinhole-equi’, 'omni-radtan
针孔相机模型(针孔) 畸变模型 全向相机模型
无需运行rosbag play 数据集
结果保存在Kalibr的当前目录下
4.录制数据
rosbag record -O inu_kalib_data_vga.bag /sensor_msgs/Imu2 /sensor_msgs/Image/Video/left/image2 /sensor_msgs/Image/Video/right/image2
#左目鱼眼
rosbag record -O inu_fish_left_kalib_data_vga.bag /sensor_msgs/Imu2 /sensor_msgs/Image/Fisheye2
10.开始相机标定
棋盘图 A3纸板
mycheckboard.yaml
target_type: 'checkerboard' #gridtype
targetCols: 8 #number of internal chessboard corners
targetRows: 6 #number of internal chessboard corners
rowSpacingMeters: 0.035 #size of one chessboard square [m]
colSpacingMeters: 0.035 #size of one chessboard square [m]
11.执行标定:
单目情况
kalibr_calibrate_cameras --bag /ros/kalibr_ws/src/bagdata/inu_kalib_data_vga.bag --topics /camera/color/image_raw --models pinhole-radtan --target /ros/kalibr_ws/src/bagdata/mycheckboard.yaml --bag-from-to 1 45 --show-extraction --approx-sync 0.04
双目情况:
kalibr_calibrate_cameras --bag /ros/kalibr_ws/src/bagdata/inu_kalib_data_vga.bag --topics /sensor_msgs/Image/Video/left/image2 /sensor_msgs/Image/Video/right/image2 --models pinhole-radtan pinhole-radtan --target /ros/kalibr_ws/src/bagdata/mycheckboard.yaml --bag-from-to 1 140 --show-extraction --approx-sync 0.04
左目鱼眼情况:
kalibr_calibrate_cameras --bag /ros/kalibr_ws/src/bagdata/inu_fish_left_kalib_data_vga.bag --topics /sensor_msgs/Image/Fisheye2 --models omni-radtan --target /ros/kalibr_ws/src/bagdata/mycheckboard.yaml --bag-from-to 5 180 --show-extraction --approx-sync 0.04
联合标定:
可能报错之类的
标定之前需要IMU参数标定 需要安装imu_tils
单独录制IMU数据,数据包录制我录制了两个多小时,录制过程中必须保持相机静止不动。
rosbag record -O imu_calibration /sensor_msgs/Imu
根据imu_utils文件夹里面的A3.launch改写Inu标定启动文件
启动标定:
roslaunch imu_utils inu_A3.launch.launch
回访数据包,以200Hz的速率回放:
rosbag play -r 200 imu_calibration.bag
最后可以得到标定结果文件:
~/imu_utils/data/inu_imu_param.yaml
执行相机+IMU联合标定
准备cam.yaml及imu.yaml文件,cam.yaml为单双目输出的标定文件,本次标定仅对左目标定 ,实际使用改为双目左右眼的具体的,使用如下:
cam0:
cam_overlaps: []
camera_model: pinhole
distortion_coeffs: [-0.04146142113155779, 0.040207379741452436, 0.00058191919155336,
2.6184399452903757e-05]
distortion_model: radtan
intrinsics: [264.1544476767924, 265.6303085861438, 357.12188690735223, 167.47999407549506]
resolution: [640, 480]
rostopic: /zed2/zed_node/left/image_rect_color2
imu.yaml信息由步骤4中的IMU标定结果得出,取标定结果Acc及Gyr的平均值填入imu.yaml文件,得如下内容:
#Accelerometers
accelerometer_noise_density: 1.96e-02 #Noise density (continuous-time)
accelerometer_random_walk: 5.29e-04 #Bias random walk
#Gyroscopes
gyroscope_noise_density: 1.82e-03 #Noise density (continuous-time)
gyroscope_random_walk: 3.71e-05 #Bias random walk
rostopic: /zed2/zed_node/imu/data_raw2 #the IMU ROS topic
update_rate: 200.0 #Hz (for discretization of the values above)
执行联合标定:
kalibr_calibrate_imu_camera \
--target /ros/kilibr_ws/src/bagdata/mycheckboard.yaml \
--bag /ros/kilibr_ws/src/bagdata/inu_kalib_data_vga.bag \
--bag-from-to 1 130 \
--cam /ros/kilibr_ws/src/bagdata/cam.yaml \
--imu /ros/kilibr_ws/src/bagdata/imu.yaml \
--imu-models scale-misalignment \
--timeoffset-padding 0.1