安卓手机标定相机IMU外参过程

本文阐述安卓手机标定相机IMU外参过程,包括以下主要流程:

1. 制作标定板
2. 单独标定单目相机的外参
3. 单独标定IMU的外参
4. 相机IMU的联合标定

1.为什么要进行相机标定?

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。

   【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

相机成像原理
在这里插入图片描述

2.标定板的制作:

标定棋盘分为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大小的纸上。标定板选择暗色调 不反光的介质或背景
标定相机移动过程保持平稳移动,稍慢点。

3.ubuntu下进行 camera_calibration 标定

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
相机惯性测量单元(IMU外参标定是一个过程,用于确定相机IMU之间的精确位置、姿态以及两者间的相对变换矩阵。这个标定受到多个因素的影响: 1. **硬件误差**:相机IMU自身的精度是关键,包括传感器噪声、动态范围限制等。如果设备质量不高或校准不准确,会直接影响标定结果。 2. **安装位置和姿态**:初始安装时的误差会影响标定,如两者的轴线对齐偏差、旋转角度误差等。理想的应该是设备在完全静态的情况下进行标定。 3. **运动学模型**:假设的运动模型可能不完美,比如忽略了实际环境中的非刚体运动或外部干扰,这会影响到imu数据的估计和相机位姿的计算。 4. **温度和时间变化**:传感器性能可能会随环境温度和时间的变化而改变,这可能导致标定参数漂移。 5. **环境条件**:光照强度、湿度、磁场等因素可能影响imu的磁力计性能,从而影响定位精度。 6. **标定数据采集**:如何收集imu相机的数据也至关重要。例如,数据采样频率、运动轨迹的多样性都影响标定的质量。 7. **标定算法**:不同标定方法的适用性和计算复杂度也是重要因素。有些方法可能更适应某些特定场景,但效果可能因具体算法而异。 相关问题-- 1. IMU外参标定中的误差来源主要有哪些? 2. 如何减小安装位置和姿态带来的影响? 3. 在实时应用中,如何处理环境因素对IMU外参标定的影响?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值