文章目录
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 文件语法和例子详细讲解
摄像头标定的三种方法
- Opencv
- 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 - Kalibr
Multiple camera calibration
Camera-IMU calibration - PTAM Calibration ( ATAN / FOV camera model )
- OCamCalib toolbox
- 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)
增加交换空间大小重新编译
鱼眼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
开始标定了…
标定结果各个参数含义
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文件。