kalibr标定鱼眼摄像头

usb_cam

安装 ROS 外部 Package usb_cam 采集图像

mkdir -p usb_cam_ws/src
cd usb_cam_ws/src
git clone https://github.com/ros-drivers/usb_cam.git
cd usb_cam_ws/
catkin_make

检验一下是否安装成功

cd usb_cam_ws/
打开一个终端
source devel/setup.bash 
roslaunch usb_cam usb_cam-test.launch

在这里插入图片描述
如果是外接的摄像头需要做如下更改

gedit /usb_cam_ws/src/usb_cam/launch/usb_cam-test.launch
<param name="video_device" value="/dev/video1" />	
数字 “0” “1” 代表摄像头编号依次尝试更改编号就可以打开指定的摄像头

其他语句含义如下
在这里插入图片描述更多launch文件内容请参考
ROS 启动 Launch 文件语法和例子详细讲解

摄像头标定的三种方法

  1. Opencv
  2. ROS camera_calibration
    单目:http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration
    双目:http://wiki.ros.org/camera_calibration/Tutorials/StereoCalibration
    参考:https://blog.csdn.net/heyijia0327/article/details/43538695
  3. Kalibr
    Multiple camera calibration
    Camera-IMU calibration
  4. PTAM Calibration ( ATAN / FOV camera model )
  5. OCamCalib toolbox
  6. Camera Calibration & Rectification

标定 IMU

imu_utils: A ROS package tool to analyze the IMU performance, C++ version of Allan Variance Tool.

标定 Camera-IMU

Kalibr

安装 kalibr

mkdir -p kalibr_ws/src
cd usb_cam_ws/src
git clone https://github.com/ethz-asl/kalibr.git
cd usb_cam_ws
catkin_make

可能遇到的问题以以及解决方法

ImportError: No module named pyx
sudo apt-get install python-pyx
eta 1m 52s c++: internal compiler error: 已杀死 (program cc1plus)
增加交换空间大小重新编译

如何在Ubuntu 16.04上添加交换空间

鱼眼fisheye单目标定

下载标定板

标定版介绍

关注公众号"小秋SLAM笔记"回复“fisheye”获取下载好的文件
在这里插入图片描述也可以终端生成

kalibr_create_target_pdf --type apriltag --nx [NUM_COLS] --ny [NUM_ROWS] --tsize [TAG_WIDTH_M] --tspace [TAG_SPACING_PERCENT]

根据你实际标定版的格式,更改下面参数。
在这里插入图片描述

yaml文件

# aprilgrid.yaml
target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
#tagSize: 0.088           #size of apriltag, edge to edge [m]
tagSize: 0.024
#tagSpacing: 0.3          #ratio of space between tags to tagSize
                         #example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25[-]
tagSpacing: 0.2917

准备用于标定的ros bag数据

rostopic list 

可以查看发布了那些话题
在这里插入图片描述

rosbag record -O fisheye_data /usb_cam/image_raw

-O参数将数据保存到名为fisheye_data.bag的文件中
rosbag record录制/usb_cam/image_raw话题
Ctrl+C退出rosbag record录制命令

查看录制数据包的信息

rosbag info fisheye_data.bag  

在这里插入图片描述
播放录制好的数据包

rosbag play fisheye_data.bag

暂停数据集播放

rosbag play  --pause

开始运行bag时不发布数据,直到你按下空格键它才开始发布,同样你再按空格键rosbag又会暂停发布
在这里插入图片描述
此时打开rviz添加图像,选择话题可以看到录制的图像,录制标定数据的时候不要快速移动,让标定版尽可能在图像当中,上下左右缓慢移动。

标定命令

cd kalibr_ws
source devel/setup.bash 
kalibr_calibrate_cameras --bag /home/q/packages/usb_cam_ws/2020-07-21-14-11-52.bag --models eucm-none --topics /usb_cam/image_raw --target /home/q/packages/usb_cam_ws/aprilgrid.yaml

在这里插入图片描述开始标定了…
在这里插入图片描述标定结果各个参数含义

Multiple camera calibration

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

Supported models

pinhole是针孔相机模型,radtan径向畸变,
在这里插入图片描述在这里插入图片描述在这里插入图片描述A Generic Camera Model and Calibration Method for Conventional, Wide-Angle, and Fish-Eye Lenses.
关注公众号"小秋SLAM笔记"获取

可能出现的问题

packages/kalibr_ros/src/kalibr/Schweizer-Messer/sm_python/python/sm/PlotCollection.py:from matplotlib.backends.backend_wxagg import NavigationToolbar2Wx as Toolbar

ImportError: cannot import name NavigationToolbar2Wx 然后找来专门写python的人 找下 发现 matplotlib 中没有NavigationToolbar2Wx 而是换成了NavigationToolbar2WxAgg 所以修改源码 还害怕下面用了该库中的函数,先试试
结果通过,可能是该库随着时间更新了,老版本不用了。

ImportError: No module named igraph

sudo apt-get install python2.7-igraph

[ WARN] [1594103515.384115]: getTargetPoseGuess: solvePnP failed with solution: <sm.libsm_python.Transformation object at 0x7f69e359e320>
The quaternion must be a unit vector to represent a rotation

这个问题可能是偶尔出现的,第二次运行就没有出现了,暂时忽略

单目鱼眼fisheye标定结果

在这里插入图片描述不用操作就可以,自动保存三个文件
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述标定评估

重投影误差在 0.1~0.2 以内,标定结果较好,如下所示。

在这里插入图片描述在这里插入图片描述

Kalibr 双目内外参数的标定

https://blog.csdn.net/heyijia0327/article/details/83583360

Kalibr camera+IMU标定

在估计出内参之后,会进行优化迭代操作。
如果是多相机标定,在完成内参标定的同时,也会完成具有交叉视野相机外参的的标定。初始估计步骤也会进行多相机基线距离的估计,用作后续的迭代优化。
如果某一时刻有多个相机同时观测靶标,则先求取视野内看见角点最多的那个相机的外参,然后根据预估计出的基线距离得到靶标到第一个相机的变换矩阵。

然后计算第一个相机的重投影误差,构造优化函数。

我们进行camera-IMU标定的目的是为了得到IMU和相机坐标系的相对位姿矩阵T和相对时间延时t_shift(t_imu=t_cam + t_shift)。

我们进行camera-IMU标定的目的是为了得到IMU和相机坐标系的相对位姿矩阵T和相对时间延时t_shift(t_imu=t_cam + t_shift)。
需要的文件
三camera-IMU标定需要输入的四个文件:

一个标定的例子:

它们分别是:包含图形和imu数据的bag文件、相机参数文件、IMU参数文件和标定板参数文件。

1、.bag:包含有图片信息和IMU数据的ROS包
2、camchain.yaml: 包含相机的内参、畸变参数的文件,如果是双目的话,还包含两个相机的位置转换矩阵;
3、IMU.yaml: 包含IMU的噪声密度、随机游走;

4、target.yaml:标定目标板的参数

所以在进行camera-IMU 标定前,我们分别要对camera内参和IMU进行标定得到相应的camchain.yaml和IMU.yaml文件
输出的结果

IMU和相机坐标系的相对位姿矩阵T和重投影误差(或者像素误差,Pixel Error(像素误差)指的是the standard deviation of the reprojection error (in Pixel) in both x and y directions respectivly(在x和y方向上以像素为单位的重投影误差的标准差。根据优化的准则我们知道重投影误差越小,就说相机标定的精度越高)。
准备工作

提前准备好camchain.yaml(包含相机的内参、畸变参数的文件,如果是双目的话,还包含两个相机的位置转换矩阵)、IMU.yaml(包含IMU的噪声密度、随机游走)、target.yaml(标定目标板的参数),并制作.bag文件。

猜你喜欢

转载自blog.csdn.net/qq_21950671/article/details/106936801