使用Kalibr标定zed mini双目相机

本文介绍了如何使用开源库Kalibr对zedmini双目相机进行内外参数标定,包括Kalibr的安装、Aprilgrid标定板的下载打印、无GPU环境下ZED相机的图像获取,以及利用rosbag录制数据和Kalibr进行双目标定的步骤。在标定过程中,还解决了遇到的“ImportError:Nomodulenameddigraph”的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章介绍采用开源库Kalibr对zed  mini双目相机的内外参进行标定,Kalibr在SLAM领域非常流行,因为他可以非常方便的对相机,IMU等传感器的内外参进行标定

1 Kalibr安装

Kalibr的官网:https://github.com/ethz-asl/kalibr

Kalibr是一个ros功能包,所以需要先安装ros

1.1 依赖安装

sudo apt-get install -y \
    git wget autoconf automake nano \
    libeigen3-dev libboost-all-dev libsuitesparse-dev \
    doxygen libopencv-dev \
    libpoco-dev libtbb-dev libblas-dev liblapack-dev libv4l-dev

1.2 创建一个工作空间,下载Kalibr源码

mkdir -p ~/kalibr_workspace/src
cd ~/kalibr_workspace
git clone https://github.com/ethz-asl/kalibr.git

1.3 编译

cd ../
catkin_make

2 标定板下载打印

标定板下载网址:Downloads · ethz-asl/kalibr Wiki · GitHub

这里采用Aprilgrid,因为他比checkboard具有更多的优势,标定结果更准确,同时在下载页面,也只有Aprilgrid可以下载。

下载下来的Aprilgrid如下图所示,是A0大小,但是我们也可以采用更小的纸来打印,比如采用A4大小的纸张。

打印的Aprilgrid最好粘贴在一个硬平面上,方便后续的标定过程。

下载Aprilgrid的同时,也需要把Aprilgrid的配置文件下载下来,文件名一般是:

april_6x6_80x80cm.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]
tagSpacing: 0.3          #ratio of space between tags to tagSize
codeOffset: 0            #code offset for the first tag in the aprilboard

其中:

  • target_type:标定板的类型,这里是aprilgrid
  • tagCols: apriltags的列数
  • tagRows:apriltags的行数
  • tagSize: 每个apriltags的边长,单位m
  • tagSpacing: 介绍如下图所示

 用A4纸打印的Aprilgrid量出来的tagSize=0.021m, tagSpacing=0.285714.

3 标定数据的录制

ZED双目相机的SDK是需要英伟达的GPU支持的,但是因为穷,买不起GPU,所以只能在CPU上使用ZED双目相机。幸运的是ZED是一个UVC标准的摄像头,使用Opencv即可读取图像。这里安装一个ros功能包zed_cpu_ros

虽然我们没有CUDA,但是我们还是需要安装ZED的SDK,可以在stereo公司官网下载(需要魔法)。安装好SDK后,我们需要从/usr/local/zed/settings中将zed相机的标定文件.conf复制到zed_cpu_ros/config。.conf包含zed相机的内参,畸变系数,基线长度,双目矫正矩阵(以旋转适量的形式提供)等信息。zed_cpu_ros功能包会读取这个配置文件,然后将左右图像的相机信息发布出去。至此,我们就可以在CPU上使用ZED相机了。

将ZED相机通过USB3.0(只能是3.0接口,2.0根本识别不出来)接口连接到电脑后,在终端运行如下命令,读取和发布ZED的图像:

roslaunch zed_cpu_ros zed_cpu_ros.launch

如果不出意外的话,肯定会发生意外

我们在运行zed_cpu_ros.launch之前还是需要看看他里面到底有啥

<launch>
<arg name="config_file_location" default="$(find zed_cpu_ros)/config/SN1267.conf"/>
<arg name="camera_namespace" default="camera"/>
<!-- to find your device name, use ls /dev/ and look for the name begin with video -->
<arg name="device_name" value="/dev/video003"/>
<arg name="resolution" default="1"/>
<arg name="frame_rate" default="30"/>
<arg name="show_image" default="false"/>
<arg name="encoding" default="bgr8"/>
<arg name="use_zed_config" default="true"/>

<node pkg="zed_cpu_ros" type="zed_cpu_ros" name="zed_cpu_ros_node" output="screen" ns="$(arg camera_namespace)" required="true">
	<param name="resolution" value="$(arg resolution)" unless="$(eval resolution>3)"/>
	<param name="frame_rate" value="$(arg frame_rate)"/>
	<param name="config_file_location" value="$(arg config_file_location)"/>
	<param name="show_image" value="$(arg show_image)"/>
	<param name="left_frame_id" value="left_frame"/>
	<param name="right_frame_id" value="right_frame"/>
	<param name="use_zed_config" value="$(arg use_zed_config)"/>
	<param name="device_name" value="$(arg device_name)"/>
	<param name="encoding" value="$(arg encoding)"/>
</node>

<!-- <node pkg="tf" type="static_transform_publisher" name="static_tf_1" args="0.25 0 0.4 0 0 0 1 base_link left_frame 30"/> -->
<!-- <node pkg="tf" type="static_transform_publisher" name="static_tf_2" args="0 0.120 0 0 0 0 1 left_frame right_frame 30"/> -->

</launch>

这个文件里右几个参数需要设置。

  • config_file_location: ZED相机配置文件
  • device_name: 连接ZED后,通过命令:ls /dev/video*查看
  • resolution: 图像分辨率,有4个等级
  • frame_rate: 帧率,这里需要注意,因为Kalibr标定要求图像帧率不能太高,否则计算时间很长,推荐是4Hz。

设置好之后,再运行zed_cpu_ros.launch,即可用rviz查看发布的图像。

下面可以开始录制标定bag文件,固定相机,移动标定板。终端运行:

rosbag record -O Kalib_data_vga.bag /camera/left/image_raw /camera/right/image_raw

标定板移动可以参考https://youtu.be/puNXsnrYWTY?t=57

录制结束后会得到一个Kalib_data_vga.bag文件。

4 双目标定

rosrun kalibr kalibr_calibrate_cameras --bag Kalib_data_vga.bag --topics /camera/left/image_raw /camera/right/image_raw --models pinhole-radtan pinhole-radtan --target april.yaml 

可添加–show-extraction,在标定过程中可以可视化角点检测情况是否良好。

标定完成后,会生成三个文件

  • .yaml:保存着左右相机的内参,以及左相机到右相机的变换矩阵
  • .pdf:保存着各种图,比如重投影误差图
  • .txt:含有相机内参以及重投影误差

至此双目标定就结束了,可以将标定结果与ZED自带的标定做对比,评估标定的效果。后续就可以利用标定结果开展后续更有意思的工作了

5 错误记录

使用kalibr做相机内参标定时,报错:“ImportError: No module named igraph”

1、sudo apt-get install -y libigraph0-dev

2、pip install python-igraph==0.7.1.post6

(python2只支持0.8X以前的版本)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值