事件相机的选型、标定和使用

本文最后更新于 2024年7月19日 下午

本文主要记录了自己对事件相机进行选型、标定和使用的过程。型号为双目DAVIS346 Color。另外,普通相机也可以参考其中使用Kalibr进行标定的过程。

选型

主流事件相机厂家信息

此处主要摘自参考链接

iniVation

其他说明:

  1. 进出口关税等原因,国内售价高出全球销售的售价不少,参考预算时不要按照全球销售的网站计算。
  2. 货源来自国外,发货时间是附全款后两周。
  3. 用于科研的话是按照学术价格(academic)购买,会便宜不少。提供相应证明资料即可。

CeleX

其他说明:

  1. 公司原名是“上海芯仑光电科技有限公司”,官网是http://www.celepixel.com。公司改名成了现在的“豪威芯仑”,但产品没有任何变化。
  2. 购买时,销售会提供销售合同。签完合同并付款后,公司基本上当天就能够从上海发出产品,感觉货源较为充足。
  3. 官方的github包括了完整的软件、说明书和代码。

Prophesee

  • 官方资讯链接:https://www.prophesee.ai/contact-us/
  • 在售产品与参考售价:EVKV1(4.5w) / EVKV2(6.3w) / VGA EVK(3w) 等。
  • 购买方式:官网提交咨询表单,官方会转给中国区负责人进行联系;或关注国内的公众号:Prophesee,在公众号内寻找联系方式咨询。
  • 官方资料:购买完成后,签署NDA后开放对应资料。

其他说明:

  1. Prophesee官方还能够提供公司开发的代码源码,但购买费用较高,大概要10w+,如有需求可以咨询。
  2. 购买后记得索要资料。
  3. 货源也是来自国外,合同上发货时间是附全款后三周。
  4. 如需开具发票要注意,prophesee的发票项目名称是不能够修改的,单位如果对采购项目名称有要求,需提前确认发票名称是否可以走账报销。

事件相机的关键参数

iniVation提供的白皮书:本白皮书涉及了解基于神经形态事件的视觉传感器的性能,特别是时间分辨率、同步与异步读出、动态范围和低光性能。

下面的结果由GPT-4生成。

购买事件相机(Event Camera)时,您需要关注以下关键参数以确保选购的设备最适合您的应用需求:

  1. 时间分辨率(Temporal Resolution):事件相机的时间分辨率通常非常高,能够达到微秒级(μs)甚至更高,这决定了相机捕捉场景变化的能力。高时间分辨率意味着相机能够记录更加细腻和快速的场景变动。

    事件相机的时间分辨率决定了相机捕捉场景变化的精细程度,即相机能够在多短的时间内检测到光线变化。具体到1微秒(1us)和200微秒(200us)的时间分辨率,1us的时间分辨率明显更高,意味着相机能够更精细地、在更短的时间内捕捉到光线的变化,对于动态场景的捕捉能力更强。

  2. 对比度灵敏度(Contrast Sensitivity):事件相机是基于像素检测亮度变化的,对比度灵敏度是指相机能够检测到的最小亮度变化阈值。更高的对比度灵敏度意味着相机能够在更低的亮度变化下触发事件,捕捉更微小的场景变化。

  3. 动态范围(Dynamic Range):动态范围是指相机能够同时捕捉到的最亮和最暗区域的比率,单位通常为dB。事件相机的动态范围非常高,可以超过130dB,使其能够在极端光照条件下仍然保持性能,这对于户外应用或光照条件快速变化的场景非常关键。

    因此,如果比较13%的对比度灵敏度和20%的对比度灵敏度,20%的对比度灵敏度更好。这是因为它表明相机能够在更细微的亮度变化下触发事件,从而捕捉到更多的场景细节和动态信息。

  4. 空间分辨率(Spatial Resolution):这指的是相机的像素数目,即相机能够捕捉到的细节程度。虽然事件相机的空间分辨率通常不如传统相机,但对于许多应用来说仍然足够。

  5. 事件相机的最大吞吐量是指相机在单位时间内能够处理和输出的最大事件数量。这个参数直接影响到事件相机的性能,尤其是在光照条件变化剧烈或场景动态变化快速时的表现。

iniVation

实验室考虑购进iniVation公司的事件相机。

公司简介

公司官网

中国分公司官网

iniVation起源于瑞士苏黎世大学(University of Zurich)和苏黎世联邦理工学院(ETH Zurich),目前作为基于事件的动态视觉传感器(DVS)技术的市场引领者之一,服务了全球超过250个组织和团队,客户覆盖全球五大洲,应用领域包括汽车、消费电子、机器人、工业视觉和航空航天等领域。上海再度科技有限公司作为中国区独家总代理,负责其产品在中国区的产品销售、市场营销和客户支持。

产品细节

经调研和经销商交流,iniVation公司的事件相机具体产品细节如下:

  • 官方规格书在 https://inivation.com/buy/ 下的SPECIFICATIONS按钮处,因为考虑到官方的PDF链接后续可能会发生改变,所以这里给出了找规格书的位置,而没有直接给出PDF链接。
  • 或者在此处查看网页版的规格书。
  1. 官方报价是在 https://shop.inivation.com/collections 下找到的学术价格(截止2024年5月14日)。
  2. 人民币和欧元汇率按照7.81 : 1计算。实际大陆报价还要含超过10%税。
  3. 大陆的报价不知道方不方便给出,就不在这里给出了。可以在 https://inivation.cn/?list=24 下加微信咨询中国经销商。
  4. 双目版本就是两个单目相机通过支架连在一起。双目的价格是单目的2倍。

售后

经销商给出的回答是:

  1. 国内有工程师,使用问题可以咨询我们。
  2. 如果有深入问题,我们会联系国外工程师提供解答。

驱动安装及相机可视化

实验室购进的两台DAVIS346 Color到了,可以先安装一下驱动来简单查看一下相机的可视化效果。

如果相机可视化全是噪点,旋转下三个镜头试试,尤其是中间的光圈。

下述项目按需编译,可以先看自己要做的工作需要用到哪个项目。

支持文档

官方支持文档

  • 重点:

    • DV 是我们的主要软件解决方案,其设计宗旨是用户友好且易于使用。它由两个主要组件组成:

      • dv-gui,允许用户轻松与我们的相机交互,处理和可视化他们的数据。

      • dv-runtimedv-gui 的后端,负责所有处理逻辑。它通过 GUI 进行控制。

    • DV-Processing 是一个用于通用处理算法的 C++/Python 库。

    • dv-ros 项目提供 iniVation 事件相机与 ROS 的集成。通过使用 DV-Processing 实现 ROS 节点来执行集成。 dv-ros 还提供了几种封装在 ROS 节点中的事件数据处理算法,可立即用于具有事件相机和 ROS 的计算机视觉应用程序。

  • 了解即可:

    • dv-runtime 是我们提供的运行时系统。它是托管模块并负责线程、内存分配和模块之间的数据交换的环境。

    • dv-sdk 是我们提供的库,用于扩展DV软件提供的功能或将其他算法集成到其中。它用于创建新模块,以实现新的处理功能或集成现有算法。

dv-gui及USB驱动

安装

安装dv-gui:

1
2
3
4
5
6
7
8
9
10
# Bionic (18.04 LTS) on the x86_64, x86, arm64 and armhf architectures
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo add-apt-repository ppa:inivation-ppa/inivation-bionic
sudo apt-get update
sudo apt-get install dv-gui # 会同时安装dv-runtime

# Focal (20.04 LTS) and Jammy (22.04 LTS) on the x86_64, arm64 and armhf architectures
sudo add-apt-repository ppa:inivation-ppa/inivation
sudo apt-get update
sudo apt-get install dv-gui # 会同时安装dv-runtime

如果您计划开发自己的模块,请安装以下附加软件包:

1
sudo apt-get install dv-runtime-dev

在 ARM 上,你可能需要使用以下环境变量来启动 dv 运行时:UNW_ARM_UNWIND_METHOD=4

安装libcaer:

1
sudo apt-get install libcaer-dev

我们的大多数设备都使用 USB 与主机系统通信。为了确保我们的软件可以识别它们并与它们交互,必须安装正确的驱动程序并授予正确的权限,具体取决于所使用的操作系统。

Linux 下对 USB 设备的访问是由标准内核 USB 驱动程序和 libusb 库提供的。必须正确配置运行我们软件的用户的权限才能访问设备。您必须授予用户对 USB 设备的访问权限。

必须安装适当的 udev 文件。我们的 Arch、Fedora、Ubuntu 和 Gentoo 的 libcaer 软件包已经自动提供了这些文件,并且从源代码编译的 libcaer 也会尝试将它们安装到 /lib/udev/rules.d/ 的适当位置。

其它USB驱动安装方式,略。

更新完成后,如果此时已经插着相机,拔下相机插头并将其重新插入计算机。

运行/可视化

1
dv-gui  # 或者在应用程序界面直接点击运行 DV

运行dv-gui报错:Could not find a dv-runtime executable on the system. Is dv-runtime installed?

怀疑是自己之前卸载过dv-runtime,但是没有卸载干净。系统以为还有dv-runtime

1
2
3
4
5
6
7
sudo find / -name *dv-gui* 2>/dev/null  # /usr/bin/dv-gui
sudo find / -name *dv-runtime* 2>/dev/null # /usr/bin/dv-runtime
# 卸载重装
apt list --installed | grep -i dv-runtime # 模糊搜索
sudo apt remove dv-runtime # 卸载软件,会同时卸载掉dv-gui
sudo apt-get purge dv-runtime # 清除配置
# 然后重新安装dv-dui

效果如下:

高级用法

详细的GUI界面介绍请见Getting Started,这里只列出几个个人认为重要的点。

  1. DV 的左侧,有 Project Bar ,您可以在其中选择现有或已保存的项目。这些项目是 .xml 文件,用于存储“输出”选项卡和“结构”选项卡的状态。
  2. “DAVIS”实际上代表“动态和主动像素视觉传感器” - 换句话说,它是 DVS 和 APS 电路的融合,能够使用相同的光电二极管产生动态事件和拍照。“APS”代表“主动像素传感器”。这是标准 CMOS 图像传感器的术语,其中像素中的晶体管主动传输与曝光期间读取的光强度相关的值。
  3. DV ModulesDV 中的 modules 是设计用于对某些数据执行特定操作的逻辑块。在dv-gui,点击中间上面的Structure选项,选中模块,点击上面的Remove module可以删除模块;点击Add module可以增加模块;使用鼠标可以在两个模块之间进行连线。
  4. 录制与回放

rpg_dvs_ros

项目地址

ROS DVS 包为动态视觉传感器 (DVS/DAVIS) 提供 C++ 驱动程序。即使您没有 DAVS 或 DAVIS 设备,您仍然可以使用此驱动程序读取预先记录的事件数据文件。该软件包还提供了用于固有校准和立体校准的校准工具。

安装依赖项

  • Eigen >= 3.3.0

  • gcc/g++ >= 5.5.0

  • OpenCV >= 3.2.0

    • OpenCV的安装与版本管理

    • 查看当前版本:

      1
      2
      3
      4
      pkg-config --modversion opencv  # 查询版本
      pkg-config --cflags opencv # 得到opencv的安装路径
      # -> -I/usr/local/include/opencv -I/usr/local/include
      pkg-config --cflags opencv4 # 附加:得到opencv4的安装路径

DV软件库

ROS的安装与卸载

将下面提到的ROS版本替换为你自己的版本。

  1. 安装ROS依赖项:

    1
    2
    3
    # melodic/kinetic/Noetic
    sudo apt-get install ros-melodic-camera-info-manager
    sudo apt-get install ros-melodic-image-view
  2. 安装libcaer。

    1. 首先根据下面的网站iniVation documentation添加存储库:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # Bionic (18.04 LTS) on the x86_64, x86, arm64 and armhf architectures
      sudo add-apt-repository ppa:ubuntu-toolchain-r/test
      sudo add-apt-repository ppa:inivation-ppa/inivation-bionic
      sudo apt-get update
      sudo apt-get install dv-gui

      # Focal (20.04 LTS) and Jammy (22.04 LTS) on the x86_64, arm64 and armhf architectures
      sudo add-apt-repository ppa:inivation-ppa/inivation
      sudo apt-get update
      sudo apt-get install dv-gui

      如果您计划开发自己的模块,请安装以下附加软件包:

      1
      sudo apt-get install dv-runtime-dev

      在 ARM 上,你可能需要使用以下环境变量来启动 dv 运行时:UNW_ARM_UNWIND_METHOD=4

    2. 安装libcaer:

      1
      sudo apt-get install libcaer-dev
  3. 安装catkin tools:

    1
    sudo apt-get install python-catkin-tools

ROS编译

ROS的安装与卸载

  1. 创建一个catkin工作区:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    cd yourfolder
    mkdir -p catkin_ws/src
    cd catkin_ws
    catkin config --init --mkdirs --extend /opt/ros/melodic --merge-devel --cmake-args -DCMAKE_BUILD_TYPE=Release

    cd catkin_ws/src
    catkin_init_workspace
    cd ..
    catkin build
  2. 克隆catkin_simple包,它将用于构建 DVS/DAVIS 驱动程序包:

    1
    2
    cd yourfolder/catkin_ws/src
    git clone https://github.com/catkin/catkin_simple.git
  3. 克隆 rpg_dvs_ros 的存储库:

    1
    2
    cd yourfolder/catkin_ws/src
    git clone https://github.com/uzh-rpg/rpg_dvs_ros.git
  4. (可选)指定项目编译使用的OpenCV版本。在项目中所有CMakeLists.txt文件出现指定OpenCV的地方:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    set(OpenCV_DIR /usr/local/opencv/opencv345/share/OpenCV)  # 新增
    find_package(OpenCV REQUIRED)
    # find_package(cv_bridge) # 如果find_package(OpenCV REQUIRED)报错
    include_directories(${OpenCV_INCLUDE_DIRS}) # 新增
    # 新增
    message(STATUS "opencv version: ${OpenCV_VERSION}")
    message(STATUS "opencv lib: ${OpenCV_LIBS}")
    message(STATUS "opencv include dir: ${OpenCV_INCLUDE_DIRS}")
    message(STATUS "opencv config path: ${openCV_CONFIG_PATH}")
  5. 编译驱动器:

    1
    2
    3
    4
    5
    6
    cd yourfolder/catkin_ws
    catkin build dvs_ros_driver # if you are using the DVS128
    catkin build davis_ros_driver # if you are using the DAVIS
    catkin build dvxplorer_ros_driver # if you are using the DVXplorercd yourfolder/catkin_ws
    # 编译完成后,在代码运行前,须使用source命令刷新一下工作空间的环境。否则会出现找不到“package XXX not found” 的问题。
    source ./catkin_ws/devel/setup.bash

    如果编译报错:catkin clean相当于rm -r ${build} ${devel},但是避免了rm -r这种危险的操作!

  6. 编译渲染器:

    1
    2
    3
    4
    cd yourfolder/catkin_ws
    catkin build dvs_renderer
    # 编译完成后,在代码运行前,须使用source命令刷新一下工作空间的环境。否则会出现找不到“package XXX not found” 的问题。
    source ./devel/setup.bash

    如果OpenCV报错,可以尝试对照OpenCV的安装与版本管理更换版本管理方法。

  7. 添加环境变量(可选)。

    代码编译完成,后面需要运行ros命令,为了避免每次打开新的shell都需要source,我们将其添加到bash配置文件中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 方法一,使用gedit
    echosource youfolder/catkin_ws/devel/setup.bash” >> ~/.bashrc
    gedit ~/.bashrc # 注:用gedit打开文件,查看是否加入

    # 方法二,使用vim
    sudo vi ~/.bashrc # 注:打开.bashrc文件
    # 最后一行添加:
    source youfolder/catkin_ws/devel/setup.bash
    # 注:点击键盘“E”,进入编辑(edit)模式,用“delete”键删除添加的路径

    注,vim按键:

    1
    2
    3
    4
    5
    6
    7
    8
    按Esc。输入 :wq!,保存并退出。
    注:ESC”键退出编辑模式,并输入以下命令:
    :wq 保存后退出vi,若为:wq!则为强制存储后退出
    :w 保存但不退出
    :w! 若文件属性为【只读】,强制写入该档案
    :q 离开vi
    :q! 若曾经修改过档案,又不想存储,使用!为强制离开不存储档案
    :e! 将档案还原到最原始状态!

验证编译/可视化

您可以通过运行提供的启动文件来测试安装。它启动驱动程序(DVS 或 DAVIS)和渲染器(图像查看器)。

  • 启动实机:

    1
    2
    3
    4
    5
    6
    7
    cd yourfolder/catkin_ws
    source ./devel/setup.bash && roslaunch dvs_renderer dvs_mono.launch # if you are using the DVS128

    source ./devel/setup.bash && roslaunch dvs_renderer davis_mono.launch # if you are using the DAVIS
    source ./devel/setup.bash && roslaunch dvs_renderer davis_color.launch

    source ./devel/setup.bash && roslaunch dvs_renderer dvxplorer_mono.launch # if you are using the DVXplorer

    得到实时可视化结果。效果如下:

    勾选参数配置界面的“autoexposure_enabled”以开启自动曝光,否则场景太亮的光源图像帧会可视化不到其它东西。

  • 如果您没有 DAVIS,您仍然可以使用此驱动程序读取记录的文件。示例:

    1. 下载数据集的序列,如slider_deep.bag

    2. 打开第一个终端,启动roscore:

      1
      roscore
    3. 在第二个终端,播放bag包:

      1
      rosbag play -l path-to-file/slider_depth.bag

      报错:/opt/ros/melodic/lib/rosbag/play: error while loading shared libraries: librosbag.so: cannot open shared object file: No such file or directory

      解决:

      1
      2
      sudo gedit ~/.zshrc
      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ros/melodic/lib
    4. 在第三个终端中,启动 DVS/DAVIS 渲染器:

      1
      2
      source ./devel/setup.zsh && roslaunch dvs_renderer renderer_mono.launch
      # 如果没有刷新环境变量,会报错 RLException: [xx.launch] is neither a launch file in package [x] nor is [x] a launch file name

      如果要播放其他的rosbag数据集.bag文件,注意提前使用rosbag info BagFileName.bag命令,查看.bag文件的topics,修改./catkin_ws/src/rpg_dvs_ros/dvs_renderer/launch文件夹里,.launch文件里,eventsimage等参数指向的路径。

    5. 你可以看到连续图像的播放。

参数配置

对于来自 DAVIS 的实时数据流(即,不是记录的文件) ,您可以使用动态重新配置 GUI 根据需要调整 DVS/DAVIS 参数。运行:

1
2
3
4
# 第一个终端
roscore
# 第二个终端
source ./devel/setup.zsh && rosrun rqt_reconfigure rqt_reconfigure

一个窗口将会出现。选择 davis_ros_Driver(在左侧面板中),您应该会得到 GUI,它允许您修改传感器的参数。

其实在roslaunch dvs_renderer renderer_mono.launch时会自动打开该参数配置界面。

dv-ros

项目地址

用于 iniVation 相机和 DV 软件基础设施的 ROS 驱动程序和示例节点。

兼容性

事件的消息类型被设计为与 rpg_dvs_ros 存储库中可用的类型兼容,因此可以与使用这些事件消息类型(Event 和 EventArray)开发的所有节点进行通信。 capture_node 被设计为一个更通用的节点,替换每种类型的 iniVation 相机的各个节点( davis_ros_driverdvs_ros_driverdvxplorer_ros_driver )。

存储库结构

该存储库包含多个项目:

  • dv_ros_msgs - 相机的基本数据类型
  • dv_ros_messaging - 在 ROS 节点中使用 dv-processing 所需的 C++ 标头
  • dv_ros_capture - 相机驱动程序节点(支持实时相机数据流和 aedat4 文件播放)
  • dv_ros_accumulation - 事件流到帧累积
  • dv_ros_aedat4 - 将 aedat4 文件转换为 rosbags
  • dv_ros_runtime_modules - 用于与 ROS 集成的 DV 运行时模块
  • dv_ros_visualization - 事件的简单可视化
  • dv_ros_tracker- 用于事件和图像流的 Lucas-Kanade 特征跟踪器(包含运动补偿)

安装依赖项

  • Eigen >= 3.4.0

  • gcc/g++ >= 10.0.0

  • OpenCV >= 4.2.0

    • OpenCV的安装与版本管理

      这里不需要把系统指定的OpenCV的版本指定为4.2.0及以上的版本,可以保持OpenCV3的版本。只要保证将OpenCV4安装好就可以了,后续可以在编译dv-ros时指定其使用到的OpenCV版本(路径)。

    • 查看当前版本:

      1
      2
      3
      4
      pkg-config --modversion opencv  # 查询版本
      pkg-config --cflags opencv # 得到opencv的安装路径
      # -> -I/usr/local/include/opencv -I/usr/local/include
      pkg-config --cflags opencv4 # 附加:得到opencv4的安装路径

DV软件库

该代码依赖于DV软件库,需要安装这些库以便ROS节点进行编译。根据您的 Ubuntu 发行版启用适当的 iniVation PPA:

  • Ubuntu 18.04:

    1
    2
    3
    4
    sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    sudo add-apt-repository ppa:inivation-ppa/inivation-bionic
    sudo apt update
    sudo apt install dv-processing dv-runtime-dev gcc-10 g++-10
  • Ubuntu 20.04:

    1
    2
    3
    sudo add-apt-repository ppa:inivation-ppa/inivation
    sudo apt update
    sudo apt install dv-processing dv-runtime-dev gcc-10 g++-10

如果之前手动在Linux系统中编译安装过源文件,例如dv-runtime-1.2.5,要先卸载掉再安装新版:

1
2
3
4
5
6
cd dv-runtime-1.2.5/build
cat install_manifest.txt | sudo xargs rm # 删除掉安装在系统中的文件
sudo make uninstall
sudo make clean # 清除上一次make命令生成的文件
sudo make distclean # 清除上一次make以及configure命令生成的文件
sudo rm -r build

可能还需要一些额外的 ROS 依赖项:

1
2
3
4
# Example for ROS Noetic on Ubuntu 18.04
sudo apt install python3-catkin python3-catkin-tools ros-melodic-catkin ros-melodic-camera-info-manager
# Example for ROS Noetic on Ubuntu 20.04
sudo apt install python3-catkin python3-catkin-tools ros-noetic-catkin ros-noetic-camera-info-manager

ROS编译

ROS的安装与卸载

  1. 新建工作区:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cd youfolder/
    mkdir -p catkin_ws/src # catkin_ws可改名

    cd catkin_ws
    catkin config --init --mkdirs --extend /opt/ros/melodic --merge-devel --cmake-args -DCMAKE_BUILD_TYPE=Release

    cd src
    catkin_init_workspace # 创建顶层CMakeLists.txt文件,CLion利用此文件打开项目

    cd ..
    catkin build # 编译生成完整工作区

    此时,./catkin_ws文件夹下有builddevellogssrc四个文件夹。

  2. 下载代码:

    1
    2
    3
    cd src
    # 把代码总放在src文件夹下
    git clone https://gitlab.com/inivation/dv/dv-ros.git
  3. 下载第三方库:

    1. 下载CLI11 @ 10f3ab90./catkin_ws/src/dv-ros-master/dv_ros_aedat4/thirdparty解压并重命名为CLI11
  4. (可选)把dv-ros/dv_ros_aedat4/src/convert_aedat4.cpp中第43行改为:

    1
    2
    // app.add_flag("-n,--namespace", topicNamespace, "Topic namespace");
    app.add_option("-n,--namespace", topicNamespace, "Topic namespace");

    -n参数应该读入的是字符串,而不是一个标志。这在使用该功能包convert_aedat4*.aedat4格式转换为*.bag格式时会用到。

  5. (可选)指定项目编译使用的OpenCV版本。在项目中所有CMakeLists.txt文件出现指定OpenCV的地方:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    set(OpenCV_DIR /usr/local/opencv/opencv452/share/OpenCV)  # 新增
    find_package(OpenCV REQUIRED)
    # find_package(cv_bridge) # 如果find_package(OpenCV REQUIRED)报错
    include_directories(${OpenCV_INCLUDE_DIRS}) # 新增
    # 新增
    message(STATUS "opencv version: ${OpenCV_VERSION}")
    message(STATUS "opencv lib: ${OpenCV_LIBS}")
    message(STATUS "opencv include dir: ${OpenCV_INCLUDE_DIRS}")
    message(STATUS "opencv config path: ${openCV_CONFIG_PATH}")
  6. 编译代码:

    1
    2
    3
    4
    5
    cd ../  # 退回到catkin_ws文件夹
    # catkin build dv_ros_accumulation dv_ros_capture dv_ros_imu_bias dv_ros_messaging dv_ros_runtime_modules dv_ros_tracker dv_ros_visualization -DCMAKE_BUILD_TYPE=Release --cmake-args -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10
    catkin build -DCMAKE_BUILD_TYPE=Release --cmake-args -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 # 或 catkin_make。相当于cmake+make
    # 编译完成后,在代码运行前,须使用source命令刷新一下工作空间的环境。否则会出现找不到“package XXX not found” 的问题。
    source ./catkin_ws/devel/setup.bash

    加速编译:

    1. catkin build命令会自动执行多线程,使用最快的编译速度。

    2. catkin_make -j2 -l2 :

      • -j2,j 是 job 的意思,代表允许 2 个编译命令同时进行,一般是以 CPU的核心数目的两倍为。
      • -l2,l 是 load-average 的意思,代表系统加载的任务数,数目一般与-j的数目保持一致。

      注意,此处不仅限于2,可以是2,4,8,这取决于你是几核CPU。

    如果编译报错:catkin clean相当于rm -r ${build} ${devel},但是避免了rm -r这种危险的操作!

    报错:

    1. CMake Error at /usr/lib/x86_64-linux-gnu/cmake/dv-processing/dv-processing-config.cmake:40 (MESSAGE): Cannot find OpenCV 4.2.0 or newer.

      1
      2
      3
      sudo gedit /usr/lib/x86_64-linux-gnu/cmake/dv-processing/dv-processing-config.cmake
      # Line 38
      SET(OpenCV_DIR /usr/local/opencv/opencv452/lib/cmake/opencv4)
    2. error: ‘Vector3’ in namespace ‘Eigen’ does not name a template type; did you mean ‘Vector3d’?

      使用Eigen >= 3.4.0,3.3.0版本不行。就算将Eigen::Vector3<double>改为Eigen::Vector3d也不能根治,后面还会有其他牵连到的报错。使用Eigen 3.4.0 一劳永逸。

  7. 添加环境变量(可选)。

    代码编译完成,后面需要运行ros命令,为了避免每次打开新的shell都需要source,我们将其添加到bash配置文件中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 方法一,使用gedit
    echosource youfolder/catkin_ws/devel/setup.bash” >> ~/.bashrc
    gedit ~/.bashrc # 注:用gedit打开文件,查看是否加入

    # 方法二,使用vim
    sudo vi ~/.bashrc # 注:打开.bashrc文件
    # 最后一行添加:
    source youfolder/catkin_ws/devel/setup.bash
    # 注:点击键盘“E”,进入编辑(edit)模式,用“delete”键删除添加的路径

    注,vim按键:

    1
    2
    3
    4
    5
    6
    7
    8
    按Esc。输入 :wq!,保存并退出。
    注:ESC”键退出编辑模式,并输入以下命令:
    :wq 保存后退出vi,若为:wq!则为强制存储后退出
    :w 保存但不退出
    :w! 若文件属性为【只读】,强制写入该档案
    :q 离开vi
    :q! 若曾经修改过档案,又不想存储,使用!为强制离开不存储档案
    :e! 将档案还原到最原始状态!

验证编译/可视化

编译后,获取您的环境以加载有关新包的信息,将相机连接到计算机并通过运行可视化示例来验证编译:

1
source ./devel/setup.zsh && roslaunch dv_ros_visualization event_visualization.launch

您应该会看到来自连接到计算机的 iniVation 摄像头的事件预览。效果如下:

imu_utils

项目地址

该项目是用于标定IMU,用于分析IMU性能的ROS封装工具。

安装依赖项

ROS编译

  1. 安装依赖项:

    1
    sudo apt-get install libdw-dev
  2. 创建catkin工作区并克隆项目:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 首先我们可以创建一个工作区。
    cd yourfloder
    mkdir -p catkin_ws/src
    cd catkin_ws
    source /opt/ros/melodic/setup.bash # kinetic=16.04, melodic=18.04, noetic=20.04
    catkin init
    catkin config --extend /opt/ros/melodic
    catkin config --merge-devel # Necessary for catkin_tools >= 0.4.
    catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release # 将其配置为以发布模式构建非常重要,否则优化将会很慢。
    # 然后我们可以克隆该项目:
    cd src
    git clone https://github.com/gaowenliang/code_utils.git
    git clone https://github.com/gaowenliang/imu_utils.git
  3. (可选)指定项目编译使用的OpenCV版本。在项目中所有CMakeLists.txt文件出现指定OpenCV的地方:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    set(OpenCV_DIR /usr/local/opencv/opencv345/share/OpenCV)  # 新增
    find_package(OpenCV REQUIRED)
    # find_package(cv_bridge) # 如果find_package(OpenCV REQUIRED)报错
    include_directories(${OpenCV_INCLUDE_DIRS}) # 新增
    # 新增
    message(STATUS "opencv version: ${OpenCV_VERSION}")
    message(STATUS "opencv lib: ${OpenCV_LIBS}")
    message(STATUS "opencv include dir: ${OpenCV_INCLUDE_DIRS}")
    message(STATUS "opencv config path: ${openCV_CONFIG_PATH}")
  4. 使用Release配置构建代码。

    1
    2
    3
    4
    5
    cd yourfloder/catkin_ws/
    # 不能直接使用 catkin build 同时编译 code_utils 和 imu_utils
    # imu_utils 会报错找不到 code_utils
    catkin build code_utils -DCMAKE_BUILD_TYPE=Release
    catkin build imu_utils -DCMAKE_BUILD_TYPE=Release

    如果编译报错:catkin clean相当于rm -r ${build} ${devel},但是避免了rm -r这种危险的操作!

    报错:

    1. code_utils/src/sumpixel_test.cpp报错backward.hpp没有找到

      1
      2
      3
      4
      // code_utils/src/sumpixel_test.cpp

      // #include "backward.hpp"
      #include "code_utils/backward.hpp"
  5. 构建完成后,刷新环境:

    1
    2
    cd yourfloder/catkin_ws/
    source ./devel/setup.bash

Kalibr

编译Kalibr主要是为了后面标定相机内参和视觉惯性联合标定。

项目地址

Kalibr 是一个解决以下校准问题的工具箱:

  • 多相机校准:具有非全局共享重叠视场的相机系统的内在和外在校准,支持多种相机型号
  • 视觉惯性校准 (CAM-IMU):IMU 与相机系统以及 IMU 内在参数的空间和时间校准。
  • 多惯性校准 (IMU-IMU):使用基础惯性传感器以及 IMU 内在参数对 IMU 进行空间和时间校准(需要 1 个辅助相机传感器)。
  • 卷帘快门相机校准:卷帘快门相机的全面内在校准(投影、失真和快门参数)。

官方安装和使用教程

使用Docker镜像

略。官方文档

ROS编译

ROS的安装与卸载

OpenCV的安装与版本管理

  1. 安装依赖项:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 安装 catkin 工具
    sudo apt-get install python-catkin-tools # ubuntu 16.04, 18.04
    sudo apt-get install python3-catkin-tools python3-osrf-pycommon # ubuntu 20.04

    # 所有 Ubuntu 版本的通用要求如下
    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

    # 然后由于Python版本不同,需要安装以下内容:
    # Ubuntu 16.04
    sudo apt-get install -y python2.7-dev python-pip python-scipy \
    python-matplotlib ipython python-wxgtk3.0 python-tk python-igraph python-pyx
    # Ubuntu 18.04
    sudo apt-get install -y python3-dev python-pip python-scipy \
    python-matplotlib ipython python-wxgtk4.0 python-tk python-igraph python-pyx
    # Ubuntu 20.04
    sudo apt-get install -y python3-dev python3-pip python3-scipy \
    python3-matplotlib ipython3 python3-wxgtk4.0 python3-tk python3-igraph python3-pyx
  2. 创建catkin工作区并克隆项目:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 首先我们可以创建一个工作区。
    cd yourfloder
    mkdir -p kalibr_workspace/src
    cd kalibr_workspace
    source /opt/ros/melodic/setup.bash # kinetic=16.04, melodic=18.04, noetic=20.04
    catkin init
    catkin config --extend /opt/ros/melodic
    catkin config --merge-devel # Necessary for catkin_tools >= 0.4.
    catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release # 将其配置为以发布模式构建非常重要,否则优化将会很慢。
    # 然后我们可以克隆该项目:
    cd src
    git clone https://github.com/ethz-asl/kalibr.git
  3. (可选)指定项目编译使用的OpenCV版本。在项目中所有CMakeLists.txt文件出现指定OpenCV的地方:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    set(OpenCV_DIR /usr/local/opencv/opencv345/share/OpenCV)  # 新增
    find_package(OpenCV REQUIRED)
    # find_package(cv_bridge) # 如果find_package(OpenCV REQUIRED)报错
    include_directories(${OpenCV_INCLUDE_DIRS}) # 新增
    # 新增
    message(STATUS "opencv version: ${OpenCV_VERSION}")
    message(STATUS "opencv lib: ${OpenCV_LIBS}")
    message(STATUS "opencv include dir: ${OpenCV_INCLUDE_DIRS}")
    message(STATUS "opencv config path: ${openCV_CONFIG_PATH}")
  4. 使用Release配置构建代码:

    1
    2
    cd yourfloder/kalibr_workspace/
    catkin build -DCMAKE_BUILD_TYPE=Release

    如果编译报错:catkin clean相当于rm -r ${build} ${devel},但是避免了rm -r这种危险的操作!

  5. 构建完成后,您必须获取 catkin 工作区设置以使用 Kalibr :

    1
    2
    3
    4
    # source yourfloder/kalibr_workspace/devel/setup.bash
    cd yourfloder/kalibr_workspace/
    source ./devel/setup.bash
    # rosrun kalibr <command_you_want_to_run_here>

高级用法

固件更新

相机上运行的软件可以按如下方式更新:

  1. 打开DV:

    1
    dv-gui
  2. 选择Maintenance -> Update camera firmware

  3. 等待固件更新窗口出现

  4. 如果有可用更新,该工具将显示该更新。如果未列出最新固件版本,您可能需要更新 DV

  5. 如果可用,请单击 Update firmwareUpdate logic

  6. 拔下并重新插入相机

(单目)校准/标定

我最终标定使用的是使用Kalibr标定相机内参得到的相机内参和使用imu_utils标定IMU后放大5-10倍的IMU参数来使用Kalibr进行视惯联合标定得到的相机-IMU参数。因此,整合到VINS-Mono配置文件里的参数要与这几个参数相对应,例如,而不使用使用DV标定相机内参得到的相机内参。

简单来说,最后看使用Kalibr进行视惯联合标定的结果文件*.yaml就可以了。

相机参数

DAVIS346提供了变焦 C 接口镜头(数据表)。

相机镜头上面有3个可调的圈:

  1. N-F:这是聚焦(Focus)环。N 表示近焦距(Near),F 表示远焦距(Far)。通过调整这个环,你可以控制镜头的对焦距离,从而使主体在近距离或远距离处保持清晰。

    聚焦 (Focus): 聚焦是指调整相机镜头的设定,使得图像中的特定区域变得清晰。聚焦可以是自动的(如自动对焦,AF),也可以是手动的(如手动对焦,MF)。通过调整镜头使光线正确地汇集在感光元件上,图像的某一部分(或全部)会更为清晰。聚焦对于控制观看者的注意力非常重要,因为人们通常会首先注意到图像中最清晰的部分。

  2. W-T:这是变焦(Zoom)环。W 表示广角端(Wide Angle),T 表示长焦端(Telephoto)。通过旋转这个环,你可以在广角和长焦之间切换,改变镜头的视场范围。

    变焦 (Zoom): 变倍功能通过调整镜头来改变视角的宽窄,即用来控制画面的放大程度。变倍可以是光学的或是数字的。光学变倍通过物理移动镜头元素来放大图像,保持图像质量不受损失。数字变倍则是通过软件放大图像的一部分,这通常会降低图像质量。变倍功能使得摄影师可以在不改变位置的情况下,拍摄不同大小和距离的对象。

  3. O-C:这是光圈(Aperture)环。O 表示开放(Open),C 表示关闭(Close)。光圈控制镜头的光线进入量,从而影响曝光和景深。开放光圈(较大光圈)适用于低光条件和浅景深,而关闭光圈(较小光圈)适用于明亮环境和深景深。

    光圈 (Aperture): 光圈是镜头中用来控制透过镜头到达感光元件的光线量的部件。光圈大小用f数(如f/2.8, f/8等)来表示,数字越小,光圈开得越大,进光量就越多,反之亦然。光圈不仅影响到照片的曝光量,也影响到画面的景深(即图像中清晰显示的范围),光圈越大(数值越小),景深越浅,背景越模糊,这样可以让主体更加突出。

相机镜头上标注的参数“4-12mm,1/2'',IR”表示了镜头的几个关键特性:

  1. 4-12mm:这是镜头的焦距范围。焦距是从镜头到焦点(成像平面上形成清晰图像的地方)的距离。4-12mm 表示这是一个变焦镜头,可以调整焦距,通常用于可变放大图像的能力。焦距越短,视场越广;焦距越长,可以看到更远的细节。
  2. 1/2'':这表示镜头的格式大小,是指成像传感器的物理尺寸。1/2英寸大小的传感器是指传感器的对角线长度大约为1/2英寸,这会影响到镜头的视场和成像质量。传感器越大,通常能够捕获更多的光线和详情,提高图像质量。
  3. IR:这代表镜头支持红外摄影。IR即红外线,这种镜头可以在红外光照下工作,适用于低光或无光照条件下的拍摄,如夜视设备。

综上所述,这些参数主要涉及到镜头的焦距(聚焦和变焦能力)和支持的传感器大小(影响成像质量和视场),以及适用于特定光线环境(红外摄影)。

相机调节顺序

GPT是这样说的:

在使用相机时,正确的设置顺序可以帮助你获得最佳的图像质量。通常,调节相机的聚焦、变倍和光圈的顺序如下:

  1. 聚焦 (Focus): 首先确定焦点。这是因为变倍和光圈的调整可能会影响焦点的准确性。确保主题清晰锐利是获得高质量照片的关键。
  2. 变焦 (Zoom): 在调整好焦点之后,你可以根据需要调整镜头的变倍,以确定拍摄的构图。调整变倍之后,可能需要微调聚焦。
  3. 光圈 (Aperture): 最后调整光圈,因为它会影响图像的曝光和景深。调整光圈可以帮助你控制背景的模糊程度和图像的光线量。

每次改变这些设置后,检查图像是否符合你的预期,必要时进行微调。这样可以确保每个组件都精确地协同工作,以产生最佳的图像效果。

但是在实际使用dv-gui中(在室内),我注意到图像帧的帧率只有几fps(把鼠标放在图像帧上,图像顶部就显示帧率了),而产品细节上则标明DAVIS346的图像帧帧率可以达到40fps。于是我将dv-gui右侧工具栏的Aps选项下的FRAME INTERVAL参数设置成了25000,以希望获得40fps(1/25000us)的图像帧输出,无果。

而当我把相机镜头对准室外几秒后,图像帧的帧率就可以达到30fps以上了。然后,我注意到dv-gui默认勾选了Aps选项下的AUTO EXPOSURE。在室内,Aps下的曝光值为接近300000;在室外,曝光值自动调节到了6000左右。

现在看来,可能是因为我桌子上的灯太亮了,导致相机“误判”了曝光值,使得室内和室外的曝光值差距很大。

于是,可以得出结论,图像帧的帧率是跟曝光值有关。

那想要在室内(曝光值很大的地方)获得高帧率(40fps)的图像帧,应该怎么办?

经试验,取消勾选Aps选项下的AUTO EXPOSURE,手动设置Exposure参数值为6000(较小的值),需要调大相机光圈才能显示出室内物体(否则一片黑)。那么,反过来,易知相机光圈越大,曝光值就可以设置的越小(dv-gui自动调节的曝光值也会减小),这样,就可以取得更高的图像帧帧率了。当然,大的光圈会减少传感器接收到的光量,应该会对事件相机采集的数据有影响。

因此,需要调节事件相机(比如说下面的对焦过程),但又想要图像帧保持高帧率,我认为可行的调节顺序是:

  • 对于室内环境:
    1. 取消勾选dv-gui右侧工具栏的Aps选项下的AUTO EXPOSURE,手动设置Exposure参数值为6000(较小的值)。
    2. FRAME INTERVAL参数设置为25000(以使图像帧输出帧率可以达到40fps)。
    3. 将相机的聚焦环、光圈和变焦环初始旋转依次固定在N C W端。此时,dv-gui中间的noiseFliter/events界面是一片黑,上边跳动的是噪点;capture/frames界面是一片黑。
    4. 首先旋转光圈,直到dv-gui中间的capture/frames界面由一片黑变得可以看清物体。
      • 在光圈旋转过程中,noiseFliter/events界面首先出现图像,然后再是capture/frames界面。
      • 光圈尽量不要旋转太大,capture/frames界面由一片黑变得可以能看清物体就行。大的光圈会减少传感器接收到的光量,应该会对事件相机采集的数据有影响。
    5. 然后旋转聚焦环,旋转过程中应该有个临界点,在临界点处noiseFliter/events界面图像边缘最清晰,在临界点处左右转图像都会变模糊。
    6. 最后旋转变焦环,使noiseFliter/events界面图像边缘更清晰。同样存在临界点。
    7. 此时,noiseFliter/events界面图像边缘最清晰,capture/frames界面也有图像且帧率很高。
    8. 拧紧聚焦环和变焦环上的螺丝,防止镜头发生滑动。
    9. (可选)点击dv-gui上方工具栏的Flie-save project as,将当前的配置保存为.xml文件,方便后续直接调用。
    10. (可选)勾选回dv-gui右侧工具栏的Aps选项下的AUTO EXPOSURE,此时capture/frames界面的图像帧帧率会减少,但也不至于会减少到只有几帧了。
  • 对于室外环境,可以不取消勾选dv-gui右侧工具栏的Aps选项下的AUTO EXPOSURE(室外环境就算是自动调节也不会把曝光值调得很高,导致图像帧帧率很低),按照上述光圈、聚焦环、变焦环的顺序依次调节即可。

有时候开启了自动曝光,但是曝光值还是不随环境变化,这时候关闭自动曝光,手动改变一下曝光值,再开始自动曝光就可以了。

20240521更新:

在夜晚室内测试时,我发现就算开着灯,曝光值也需要调大很大图像帧才能看清物体,而此时图像帧的帧率就会很低。参考博客里的说法,应该把中间的光圈调大最大(尽可能降低曝光值),把最外面的聚焦环调到最远,然后再调节最里面的变焦环进行对焦。如果变焦环调到最大相机还是没有对焦,就回调提下聚焦环。

相机对焦

DAVIS346因为事件帧和图像帧共用的是一个镜头,所以可以直接通过标定图像帧来同时确定事件帧和图像帧的内参及视惯联合标定。

因此,更推荐直接对焦图像帧(方便接下来使用Kalibr进行标定过程中角点的提取,图像帧太模糊的话效果不好)(简单操作的话,直接对焦接下来使用Kalibr的标定板,使相机能看清标定板即可),而不是对焦事件数据。(图像帧对焦好了,事件数据的对焦也不会太差?因为二者共用的一个镜头。)

使用DV对焦事件数据

对于任何相机来说,对焦都可能很棘手,但如果您没有正常的框架,那就更难了。在这个小教程中,您将学习如何正确对焦仅事件相机。

聚焦事件专用摄像机的最简单方法是使用 Siemens Star。

要对事件摄像机进行对焦,您可以按照以下步骤操作:

  1. 使用高分辨率显示器显示旋转的西门子之星,如上所示。或者,将西门子之星 (PDF) 打印在纸上。将相机放置在远离西门子之星的位置,即您想要对焦的距离处。星星应该在画面中央清晰可见。

  2. 启动 DV 软件来可视化相机。

  3. (开始按照相机调节顺序进行调节,下面的过程是官网提供的过程,可以作为参考和补充)

  4. 放大事件输出可视化工具或通过单击专用按钮使其全屏显示。

  5. 旋转镜头上的聚焦环。如果您有西门子星的纸质打印件,请通过稍微摇动相机或图案来继续生成事件。首先,如果相机失焦,您可能会看到如下图所示的内容。

  6. 调整聚焦环,直到图案的中心清晰可见。下面是使用聚焦相机的输出示例。

    要获得更大的景深(对焦范围),您需要更高的 f 值,这也会减少传感器接收到的光量。

使用Kalibr进行对焦

将相机对准具有高频成分的场景(例如西门子星形、棋盘格)并调整焦点,同时尝试最小化计算出的焦点测量值。

该工具可以通过以下方式启动:

1
kalibr_camera_focus --topic [IMAGE_TOPIC]  # 该工具订阅相机的图像主题并显示实时图像以及焦点测量值

标定相机内参

使用DV标定相机内参

官方视频教程

在对完焦,拧上螺丝,保证相机镜头不变后,就可以标定相机内参了。

同样的,如果重新旋转了相机镜头,就需要重新标定一遍相机内参了。

DAVIS346因为事件帧和图像帧共用的是一个镜头,所以可以直接通过标定图像帧来同时确定事件帧和图像帧的内参及视惯联合标定。如果是DVXplorer相机,就会更麻烦一些,需要使用到事件累加器等功能。目前还没有用到DVXplorer,暂收不提。

  1. 可用的校准图案包括:标准棋盘(下载 PDF)、圆形网格(下载 PDF)和不对称圆形网格(下载 PDF)。将校准图案打印到A4纸上。在本教程中,使用正方形尺寸为 30 毫米的 6 x 9 棋盘。

    注意打印的时候选择打印实际大小,而不是让默认的打印机自己调整到合适的大小(会小于30mm)。尽可能保证数据的准确性。

  2. 打开dv-gui,点击中间上面的Structure选项,开始将系统结构从可视化结构搭建到标定结构。

  3. 选中模块,点击上面的Remove module可以删除模块;点击Add module可以增加模块;使用鼠标可以在两个模块之间进行连线。最终,将系统结构搭建为如下所示:

  4. 应当注意的是,正方形尺寸可以用任何长度尺度来表示。

  5. 点击dv-gui右侧Calibration旁的+号,展开Calibration的详细参数配置。

    1. 必须根据校准图案设置以下参数:板的高度(board height)和宽度(board width)、方块尺寸(square size)和图案类型(pattern type)。在本教程中,使用正方形尺寸为 30 毫米的 6 x 9 棋盘。所以宽度应设置为9,高度设置为6,正方形大小设置为30mm;这些已经是默认值。
    2. 找到OUTPUT CALBRATION DIRECTORY选项,确定标定结果的输出路径。
    3. (可选)配置最小检测数(Min Detections),默认为30。
  6. 开始校准。点击dv-gui中间上面的Output选项,回到可视化界面。

  7. 依次点击dv-gui右侧CaptureCalibration栏下方的开始播放按钮。

  8. 开始在相机前面开始缓慢移动校准图案。如果检测到图案,它将绘制在输出图像上。该模块收集一定数量(上方设置的最小检测数)的图像用于实际校准。一旦在一定数量的帧上一致检测到图案,图像就会添加到集合中,(可在“Consec Detects”下进行配置)。添加图像后,将出现一条日志消息。

  9. 找到并添加图案的区域将变成浅绿色。为了获得良好的校准结果,应该用均匀的绿色阴影覆盖整个图像。可以通过取消选中突出显示区域选项来关闭此功能。

  10. 一旦收集到足够的图像,如果勾选“Check Images”,用户就可以验证它们。将依次显示保存的图像和检测到的图案。用户可以通过按配置面板中的相应按钮来选择保留(Keep)或丢弃(Discard)它们。

    为了获得良好的校准结果,重要的是丢弃图像,尽管已检测到图案,但某些点放置不准确或与其他点未对准,或者在图像的子区域中收集了太多图像。

  11. 收集新图像来替换丢弃的图像,一旦全部通过检查(至少点击了Min DetectionsKeep),校准计算就开始。计算过程中可能会有一些延迟,具体取决于硬件和使用的图像数量。

    有两个误差指标:最大允许误差(maximum allowable error)可以在最大重投影误差(Max Reprojection Error)下设置;极线误差(epipolar line error)计算为所有收集的图像对中每个点的平均极线误差。

  12. 如果校准足够准确,则会将其保存在输出目录中,并显示相机的未失真输出。还可以选择“保存图像(Save Images)”选项,以 *.png 格式保存校准过程中使用的图像。

  13. 如果校准不成功,则应使用增加的图像数量重新启动。要在不存储图像的情况下从头开始重新启动,只需停止并再次启动模块即可。

  14. 最后,按不同运动方向多标定几次,选calibration_error最小的那个。

  15. (可选)点击dv-gui上方工具栏的File-Save project as,将当前的配置(Output参数和Struture结构)保存为*.xml文件,方便下次直接导入使用。

标定输出的*.xml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0"?>
<opencv_storage>
<DAVIS346_00001043>
<camera_matrix type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
1.8202117774560909e+02 0. 1.5745352808080008e+02 0.
1.8212804158992162e+02 1.1349927340700411e+02 0. 0. 1.</data></camera_matrix>
<distortion_coefficients type_id="opencv-matrix">
<rows>5</rows>
<cols>1</cols>
<dt>d</dt>
<data>
-2.3109837702623912e-01 7.9035977463110155e-02
1.2918986417452307e-02 4.8632341326678872e-03
-1.1962406017180151e-02</data></distortion_coefficients>
<image_width>346</image_width>
<image_height>260</image_height></DAVIS346_00001043>
<use_fisheye_model>0</use_fisheye_model>
<type>camera</type>
<pattern_width>8</pattern_width>
<pattern_height>5</pattern_height>
<pattern_type>chessboard</pattern_type>
<board_width>9</board_width>
<board_height>6</board_height>
<square_size>30.</square_size>
<calibration_error>4.1753813020464015e-01</calibration_error>
<calibration_time>"Thu May 16 16:50:52 2024"</calibration_time>
</opencv_storage>

转化为VINS-Mono的相机配置文件*.yaml格式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%YAML:1.0
---
model_type: PINHOLE
camera_name: camera
image_width: 346
image_height: 260
distortion_parameters:
k1: -0.23109837702623912
k2: 0.07903597746311016
p1: 0.012918986417452307
p2: 0.004863234132667887
k3: -0.011962406017180152
projection_parameters:
fx: 182.02117774560909
fy: 182.12804158992162
cx: 157.45352808080008
cy: 113.49927340700411

使用rpg_dvs_ros标定相机内参(TODO)

https://github.com/uzh-rpg/rpg_dvs_ros/blob/master/dvs_calibration/README.md

使用Kalibr标定相机内参

官方视频教程-1:图像帧帧率20Hz,IMU帧率200Hz。相机实操+程序运行。没有限制频率。

官方视频教程-2:图像帧帧率30Hz,IMU帧率400Hz。原理讲解+程序运行。执行标定命令时指定参数--bag-freq 10.0

官方视频教程-3:图像帧帧率30Hz,IMU帧率200Hz。原理讲解+相机实操+程序运行。执行标定命令时指定参数--bag-freq 10.0

  1. 准备标定板。推荐使用Aprilgrid 6x6 0.8x0.8 m (A0 page),配置文件下载链接

    1. 使用A0纸打印Aprilgrid,如果没有A0大小的纸,将标定板缩放到A4大小打印出来也行?

      在最小校准目标周围保留白色边框,一个网格元素的大小(否则在某些光照条件下检测可能不成功)。

    2. 编写标定板的配置文件,内容示例:

      april_A0.yaml

      1
      2
      3
      4
      5
      6
      7
      8
      target_type: 'aprilgrid' #gridtype
      # 内侧角点的数量,不是格子数量
      tagCols: 6 #number of apriltags
      tagRows: 6 #number of apriltags
      tagSize: 0.088 #size of apriltag, edge to edge [m] 上面截图中为 0.02m
      tagSpacing: 0.3 #ratio of space between tags to tagSize
      #example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25[-]
      codeOffset: 0 #code offset for the first tag in the aprilboard

      april_A4.yaml

      1
      2
      3
      4
      5
      6
      target_type: 'aprilgrid' #gridtype
      tagCols: 6 #number of apriltags
      tagRows: 6 #number of apriltags
      tagSize: 0.024 #size of apriltag, edge to edge [m] 上面截图中为 0.02m
      tagSpacing: 0.3125 #ratio of space between tags to tagSize
      codeOffset: 0 #code offset for the first tag in the aprilboard

      大多数打印机会在打印过程中缩放目标。确保重新测量重要尺寸并相应调整目标配置。

  2. 录制rosbag包。使用dv-gui录制生成*.aedat4文件,然后将其转化*.bag文件;也可以直接使用ROS命令进行录制

    该录制的bag包同样可以供使用Kalibr进行视惯联合标定过程使用。

    录制要求:

    • 建议在捕获校准数据时将相机流的频率降低至 4 Hz 左右。这减少了数据集中的冗余信息,从而缩短了校准的运行时间。

      官方视频教程-1中图像帧帧率20Hz,IMU帧率200Hz,没有做降频处理,直接运行的标定命令。

      官方视频教程-2中图像帧的频率是30Hz(通过rosbag info命令得到bag的录制时间是35.4s,期间一共有1024个图像消息),在下面执行标定命令时指定参数--bag-freq 10.0

      官方视频教程-2中图像帧的频率是30Hz,在下面执行标定命令时指定参数--bag-freq 10.0

      当然,bag包主题的频率也可以使用ROS命令进行修改。

      实测这两种降频结果差距不大?主要还是标定过程录制的bag包质量要尽可能高。

    • 确保您的传感器处于焦点。使用DV进行对焦使用Kalibr进行对焦

    • 通过减少曝光时间来限制运动模糊。

    • 相机系统固定,标定目标(板)在相机前面移动以获得标定图像。

      官方wiki教程上是这么说的,但是官方视频教程-1官方视频教程-2里是固定标定板,运行相机。

    • 确保覆盖相机的整个视野,确保从不同方向、距离以及图像平面的每个部分都可以看到校准板。

      • 争取把标定板晃动到过相机像素平面的每个地方。
    • 使用倾斜视图和到校准目标的不同距离。

    • 相机不能离标定板太远,太远执行标定过程中就检测不到角点了。

    • 运动幅度尽量大一点,保证激励IMU。

    实施步骤:

    • 注意运动平滑,速度不要太快。
    • 标定板始终在相机视野内。
    • 持续1分钟以上以获得足够的数据。
    1. 相机纵向俯仰绕标定板来回旋转3次。
    2. 相机横向偏航绕标定板来回旋转3次。
    3. 相机自身(对准标定板)上下旋转3次。
    4. 相机左右水平来回运动3次。
    5. 相机上下水平来回运动3次。
    6. 相机前后水平来回运动3次。
    7. 相机随机运动。
  3. 执行标定。

    必选参数:

    • --bag filename.bag:包含图像数据的 ROS 包

    • -topics TOPIC_0 ... TOPIC_N:包中所有相机主题的列表。匹配 --models 的顺序

    • --models MODEL_0 ... MODEL_N:要安装的相机/畸变模型列表。与 --topics 的顺序匹配(请参阅支持的型号

    • --target target.yaml:标定目标(板)的配置文件

    可选参数:

    • --show-extraction:可视化校准目标提取过程。这可能有助于发现目标配置和提取的问题。

    运行示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # kalibr_calibrate_cameras --bag [filename.bag] --topics [TOPIC_0 ... TOPIC_N] --models [MODEL_0 ... MODEL_N] --target [target.yaml] --show-extraction

    cd yourfloder/kalibr_workspace
    roscore
    source ./devel/setup.bash && rosrun kalibr kalibr_calibrate_cameras \
    --target april_6x6.yaml \
    --models pinhole-radtan pinhole-radtan \
    --topics /cam0/image_raw /cam1/image_raw \
    --bag cam_april.bag \
    --bag-freq 10.0 \ # 提取特征的频率/Hz。根据指定频率向下采样,删除多余的图片。
    --bag-from-to 10 100 \ # 处理bag中10-100秒的数据
    --show-extraction

    由于对焦距的初始猜测错误,在处理前几张图像后,优化可能会出现偏差。在这种情况下,只需尝试重新启动校准,因为初始猜测是基于随机选择的图像。

    使用 help 参数可以获得有关选项的更多信息:

    1
    kalibr_calibrate_cameras --h
  4. 输出。校准将在*.bag路径下产生以下输出:

    • report-cam-%BAGNAME%.pdf:PDF 格式的报告。包含文档的所有图。
    • results-cam-%BAGNAME%.txt:结果摘要作为文本文件。
    • camchain-%BAGNAME%.yaml:YAML格式的结果。该文件可用作视惯联合标定的输入。Kalibr的输出文件格式
  5. 结果检验。

    • report-cam-%BAGNAME%.pdf报告第1页的重投影误差(reprojection error) < 0.2-0.5 。

    • 检查结果图,如良好的校准具有小于 < 0.2-0.5 像素重投影误差(report-cam-%BAGNAME%.pdf报告第5页)。如果您计划对相机进行在线校准,则可能可以接受较大的值(例如 1 像素),但始终首选更准确的离线校准。

    • 验证实时图像流的校准。

  6. 可选的实时验证(仅限 ROS)。验证工具提取 ROS 图像流上的校准目标,并显示与提取的角点的重投影重叠的图像。此外,计算并显示单相机和相机间重投影误差的重投影误差统计数据。该工具必须提供相机系统校准文件和校准目标的配置。多相机校准器的输出 YAML 可以用作相机系统配置。用法如下:

    1
    2
    3
    cd yourfloder/kalibr_workspace
    roscore
    source ./devel/setup.bash && rosrun kalibr kalibr_camera_validator --cam camchain-%BAGNAME%.yaml --target april_6x6.yaml

    运行时报错:

    Traceback (most recent call last):
    File "/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_camera_validator", line 500, in
    chain_validator = CameraChainValidator(camchain, targetConfig)
    File "/kalibr_workspace/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_camera_validator", line 78, in init
    cv2.resizeWindow(monovalidator.windowName, (640, 480))
    TypeError: an integer is required

    结果示例:

    • 单目相机结果:

    • 双目相机结果:

标定IMU

IMU参数

Parameter YAML element Symbol Units
陀螺仪“白噪声” gyr_n
加速度计“白噪声” acc_n
陀螺仪“偏置不稳定” gyr_w
加速度计“偏置不稳定性” acc_w
  • 白噪声是在 tau=1 时;
  • 偏置不稳定性在最小值附近。

旋转外参对齐

举例

摘自参考链接

  • Between ROS standard body(IMU) and camera.

  • Left view : Between ROS standard body(IMU) and down-pitched (look downward) camera

实物

为了能够将IMU数据与基于图像的运动估计相结合,需要图像传感器和 IMU 之间的相对位置和方向。下图显示了相机轴和正角速度的旋转方向:

图像传感器采用标准格式:从背面看相机,X轴指向右侧,Y轴指向上方,Z轴指向镜头。此外,IMU 轴与相机轴对齐。

对于所有三个轴,陀螺仪的旋转都是沿着增加轴逆时针旋转。请注意,这不遵循右手定则。

使用imu_utils标定IMU

  1. 首先需要静止放置IMU持续两个小时以上,并在此期间记录IMU的数据。

    也可以直接使用ROS命令进行录制

    1. 打开dv-gui,使用其录制功能,具体录制步骤如录制小节所述。这里使用到的Structure为:

      当然,你也可以直接使用dv-gui默认的录制结构,这会同时记录事件、图像、IMU和触发数据。经过测试,这样录制1min会大概存储400MB的数据(也有我把图像帧帧率设为了40Hz的原因吧)。而只保留IMU数据的话,是3-4MB/min。且把450MB的aedat4格式文件转为rosbag格式,变成了3.4GB。

    2. (可选)录制结束后,可以使用dv-gui回放功能可视化*.aedat4文件。

    3. *.aedat4文件转化为*.bag文件。转为bag包格式

  2. 使用imu_utils标定IMU。

    1. catkin_ws/src/imu_utils/launch文件夹下定义DAVIS346.launch,内容示例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
       <launch>
      <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
      <param name="imu_topic" type="string" value= "/DAVIS346/imu"/>
      <param name="imu_name" type="string" value= "DAVIS"/>
      <param name="data_save_path" type="string" value= "$(find imu_utils)/data/DAVIS346/"/>
      <param name="max_time_min" type="int" value= "120"/>
      <param name="max_cluster" type="int" value= "100"/>
      </node>
      </launch>
      • imu_topic可以通过rosbag info xxx.bag命令来查看。

      • imu_name自定义即可。

      • data_save_path:程序会生成很多文件,因此建议在catkin_ws/src/imu_utils/data目录下新建文件夹。且需要提前新建文件夹。

      • max_time_min以分钟为单位,至少要大于120分钟,小于*.bag文件的录制时间(可以通过rosbag info xxx.bag命令来查看)。

      • max_cluster的主要作用是控制在计算陀螺仪和加速度计的Allan方差时,用于分割数据的时间段的数量。

        max_cluster的值取决于您的具体需求和数据集的大小。这个值决定了在计算陀螺仪和加速度计的Allan方差时,用于分割数据的时间段的数量。如果您的数据集非常大,您可能需要更多的时间段来更精确地计算Allan方差。然而,如果您的数据集较小,设置一个较大的max_cluster值可能会导致计算过程中的错误,因为每个时间段可能没有足够的数据。

        一般来说,您可以从一个较小的值开始(例如10或100),然后根据需要逐渐增加。您也可以通过实验来确定最佳的max_cluster值,例如,您可以尝试不同的max_cluster值,然后选择使得Allan方差计算结果最稳定的值。

        请注意,设置max_cluster的值并不是一个精确的科学,而是需要根据您的具体情况进行调整。

    2. 执行标定:

      1
      2
      3
      4
      cd catkin_ws
      source ./devel/setup.zsh && roslaunch imu_utils DAVIS346.launch
      rosbag play /yourfolder/xxx.bag
      # rosbag play -r 200 /yourfolder/xxx.bag # 使用200倍率加速播放bag包。加速播放后的结果与不加速的结果存在些许差异,不加速的结果要更准确些?

      在bag包播放期间会一直显示wait for imu data,不用担心。bag包播放完成后会自动开始计算。

    3. 程序执行完后,会在你*.launch中定义的data_save_path下生成很多*.txt文件,这些文件是按照max_cluster分段计算的数据。最终的结果文件是DAVIS1043_imu_param.yaml,内容示例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      %YAML:1.0
      ---
      type: IMU
      name: DAVIS1043
      Gyr:
      unit: " rad/s"
      avg-axis:
      gyr_n: 3.5384520281682686e-03
      gyr_w: 4.0272140518453810e-05
      x-axis:
      gyr_n: 3.4408169287573438e-03
      gyr_w: 3.2414703166302208e-05
      y-axis:
      gyr_n: 3.9601252212234988e-03
      gyr_w: 3.8751159163201969e-05
      z-axis:
      gyr_n: 3.2144139345239632e-03
      gyr_w: 4.9650559225857252e-05
      Acc:
      unit: " m/s^2"
      avg-axis:
      acc_n: 4.3575299381088319e-02
      acc_w: 6.5383798561067846e-04
      x-axis:
      acc_n: 3.7100312938203754e-02
      acc_w: 6.5120320157541472e-04
      y-axis:
      acc_n: 3.6796771423116353e-02
      acc_w: 5.6544592980328930e-04
      z-axis:
      acc_n: 5.6828813781944834e-02
      acc_w: 7.4486482545333115e-04
    4. (可选)后续在使用Kalibr进行视惯联合标定时。需要将IMU数据转换成其规定的文件格式,内容示例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      #Accelerometers
      accelerometer_noise_density: 4.3575299381088319e-02 #Noise density (continuous-time)
      accelerometer_random_walk: 6.5383798561067846e-04 #Bias random walk

      #Gyroscopes
      gyroscope_noise_density: 3.5384520281682686e-03 #Noise density (continuous-time)
      gyroscope_random_walk: 4.0272140518453810e-05 #Bias random walk

      rostopic: /DAVIS346/imu #the IMU ROS topic
      update_rate: 1000.0 #Hz (for discretization of the values above) 后续根据实际ROS包的速率进行修改
    5. (可选)在官方视频教程-2的“IMU noise recovery“小节,作者将noise_density放大5倍,将random_walk放大10倍,理由是:为了考虑未完全建模的额外噪声。特别是如果您将此传感器安装在移动机器人上,则会产生额外的振动和温度影响。

      直接在 https://www.google.com 输入 “4.3575299381088319e-02 * 5” 即可进行计算。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      #Accelerometers
      accelerometer_noise_density: 0.2178764969 #Noise density (continuous-time) * 5
      accelerometer_random_walk: 6.5383798561067846e-03 #Bias random walk * 10

      #Gyroscopes
      gyroscope_noise_density: 0.01769226014 #Noise density (continuous-time) * 5
      gyroscope_random_walk: 4.0272140518453810e-04 #Bias random walk * 10

      rostopic: /DAVIS346/imu #the IMU ROS topic
      update_rate: 1000.0 #Hz (for discretization of the values above) 后续根据实际ROS包的速率进行修改

视惯联合标定

使用Kalibr进行视惯联合标定

在视觉惯性联合标定之前,需要先标定相机内参IMU

官方视频教程-1:图像帧帧率20Hz,IMU帧率200Hz。相机实操+程序运行。

官方视频教程-2:图像帧帧率30Hz,IMU帧率400Hz。原理讲解+程序运行。

官方视频教程-3:图像帧帧率30Hz,IMU帧率200Hz。原理讲解+相机实操+程序运行。

  1. 准备标定板。推荐使用Aprilgrid 6x6 0.8x0.8 m (A0 page),配置文件下载链接

    如果您使用具有对称性的校准目标(棋盘格、圆网格),则必须避免可能导致目标姿态估计翻转的移动。建议使用 Aprilgrid 来完全避免此问题。

    1. 使用A0纸打印Aprilgrid,如果没有A0大小的纸,将标定板缩放到A4大小打印出来也行?

      在最小校准目标周围保留白色边框,一个网格元素的大小(否则在某些光照条件下检测可能不成功)。

    2. 编写标定板的配置文件,内容示例:

      april_A0.yaml

      1
      2
      3
      4
      5
      6
      7
      8
      target_type: 'aprilgrid' #gridtype
      # 内侧角点的数量,不是格子数量
      tagCols: 6 #number of apriltags
      tagRows: 6 #number of apriltags
      tagSize: 0.088 #size of apriltag, edge to edge [m] 上面截图中为 0.02m
      tagSpacing: 0.3 #ratio of space between tags to tagSize
      #example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25[-]
      codeOffset: 0 #code offset for the first tag in the aprilboard

      april_A4.yaml

      1
      2
      3
      4
      5
      6
      target_type: 'aprilgrid' #gridtype
      tagCols: 6 #number of apriltags
      tagRows: 6 #number of apriltags
      tagSize: 0.024 #size of apriltag, edge to edge [m] 上面截图中为 0.02m
      tagSpacing: 0.3125 #ratio of space between tags to tagSize
      codeOffset: 0 #code offset for the first tag in the aprilboard

      大多数打印机会在打印过程中缩放目标。确保重新测量重要尺寸并相应调整目标配置。

  2. 录制rosbag包。使用dv-gui录制生成*.aedat4文件,然后将其转化*.bag文件;也可以直接使用ROS命令进行录制

    可以直接使用使用Kalibr标定相机内参里录制的bag包。

    录制要求:

    • 使用 20-30 Hz 的相机速率和 200-500 Hz 的 IMU 速率获得了良好的结果。
    • 确保您的传感器处于焦点。使用DV进行对焦使用Kalibr进行对焦
    • 避免震动,尤其是在拿起传感器的开始/结束时。
    • 本次标定中标定目标(板)是固定的,相机-imu系统移动到目标前面并激励所有IMU轴(旋转轴和加速轴)。
    • 需要至少进行一次平移运动以及两度方向变化,建议尽可能多地改变方向,以确保后续校准过程收敛。
    • 确保校准目标尽可能平坦。最好的方法是将其粘在硬板上,例如铝或丙烯酸玻璃。
    • 确保可以从不同方向、距离且大部分位于图像中心看到校准板。您应该以平滑、不急促的运动移动,其轨迹应同时激发尽可能多的定向和平移方向。
      • 收集数据时需要避免退化方向(例如平面运动)。以非恒定加速度激发两轴运动至关重要。
      • 争取把标定板晃动到过相机像素平面的每个地方。
    • 保持低运动模糊:低曝光时间、低快门时间、照明良好。
    • 确保同一时钟内的低抖动时间戳。
    • 30-60 秒的数据集通常足以进行校准。
    • 相机不能离标定板太远,太远执行标定过程中就检测不到角点了。
    • 运动幅度尽量大一点,保证激励IMU。

    实施步骤:

    • 注意运动平滑,速度不要太快。
    • 标定板始终在相机视野内。
    • 持续1分钟以上以获得足够的数据。
    1. 相机纵向俯仰绕标定板来回旋转3次。
    2. 相机横向偏航绕标定板来回旋转3次。
    3. 相机自身(对准标定板)上下旋转3次。
    4. 相机左右水平来回运动3次。
    5. 相机上下水平来回运动3次。
    6. 相机前后水平来回运动3次。
    7. 相机随机运动。
  3. 执行标定。

    必选参数:

    • --bag filename.bag:包含图像和 IMU 数据的 ROS 包

    • --cam camchain.yaml:相机系统的内在和外在标定参数。使用Kalibr标定相机内参的结果文件之一

    • --imu imu.yaml:包含 IMU 统计信息和 IMU 主题。使用imu_utils标定IMU的结果文件

    • --target target.yaml:标定目标(板)的配置文件

    可选参数:

    • --show-extraction:可视化校准目标提取过程。这可能有助于发现目标配置和提取的问题。

    运行示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # kalibr_calibrate_imu_camera --bag [filename.bag] --cam [camchain.yaml] --imu [imu.yaml] --target [target.yaml]  # 时间校准默认打开,可以使用 --no-time-calibration 参数禁用。

    cd yourfloder/kalibr_workspace
    roscore
    source ./devel/setup.bash && rosrun kalibr kalibr_calibrate_imu_camera \
    --target april_6x6.yaml \
    --imu imu_adis16448.yaml \ # 里面指定了使用的IMU主题
    --imu-models calibrated \
    --cam cam_april-camchain.yaml \ # 里面指定了使用的image主题
    --bag imu_april.bag \
    # --bag-freq 10.0 \ # 提取特征的频率/Hz。根据指定频率向下采样,删除多余的图片。
    --bag-from-to 10 100 \ # 处理bag中10-100秒的数据
    --show-extraction

    使用 help 参数可以获得有关选项的更多信息:

    1
    kalibr_calibrate_imu_camera --h
  4. 输出。校准将在*.bag路径下产生以下输出文件:

    • report-imucam-%BAGNAME%.pdf:PDF 格式的报告。包含文档的所有图。

      应确保检查 IMU 时间戳 DT。例如,以下 IMU 具有不正确的时间戳,其中 IMU 突发以 1 毫秒的速率发送,间隔为 6 毫秒:

      如果你有这个,那么你的硬件很可能会被搞乱,并且你会遇到校准问题。您将需要纠正时间戳问题。

      一个“好的”时间戳应该具有固定的速率(除了传感器下降),例如读数之间有固定的 5 毫秒(200Hz)的时间戳:

      而其他 IMU 可能会出现“抖动”,其中交替读数在固定频率附近有小误差。这并不是什么大问题,但却是误差的根源(不像第一个示例那么糟糕):

    • results-imucam-%BAGNAME%.txt:结果摘要作为文本文件。

    • camchain-imucam-%BAGNAME%.yaml:YAML 格式的结果。该文件基于输入 camchain.yaml,并为所有相机添加了与 IMU 相关的转换(以及可选的时移)。Kalibr的输出文件格式

  5. 结果检验。

    • report-imucam-%BAGNAME%.pdf报告第1页的重投影误差(Reprojection error) < 0.2-0.5 。

    • 确保预测的加速度和角速度符合 IMU 测量值。您需要确保适合惯性读数的样条线已正确安装。您的加速度计和陀螺仪误差在 3-sigma 范围内(如果不在范围内,则您的 IMU 噪声或数据集不正确)。如果它们确实超出范围,那么您的轨迹过于动态,或者您的噪声值不好。使用手动测量值来合理检查您的最终旋转和平移。

      下图的边界代表的是 3-sigma 范围。

    • 检查结果图,如良好的校准具有小于 < 0.2-0.5 像素重投影误差。如果您计划对相机进行在线校准,则可能可以接受较大的值(例如 1 像素),但始终首选更准确的离线校准。

使用DV进行视惯联合标定(TODO)

https://docs.inivation.com/software/software-advanced-usage/camera-calibration.html

https://inivation.com/developer/tutorials/

Kalibr的输出文件格式

camchain.yaml文件中存储了相机内在和外在参数的校准以及IMU相对于相机的空间和时间校准参数。每个相机都有以下参数:

  • camera_model 相机型号
    camera projection type (pinhole / omni) 相机投影类型(针孔/全向)

  • **intrinsics **内参
    vector containing the intrinsic parameters for the given projection type. elements are as follows:

    包含给定投影类型的内参的向量。元素如下:

    pinhole: [fu fv pu pv]
    omni: [xi fu fv pu pv]
    ds: [xi alpha fu fv pu pv]
    eucm: [alpha beta fu fv pu pv]
    see Supported models for more information

  • **distortion_model **畸变模型
    lens distortion type (radtan / equidistant) 镜头畸变类型(radtan/等距)

  • distortion_coeffs 畸变系数
    parameter vector for the distortion model 畸变模型的参数向量
    see Supported models for more information

    radial-tangential (radtan)(distortion_coeffs: [k1 k2 r1 r2])

    equidistant (equi)(distortion_coeffs: [k1 k2 k3 k4])

    fov (fov)(distortion_coeffs: [w])

    none (none)(distortion_coeffs: [])

  • T_cn_cnm1
    camera extrinsic transformation, always with respect to the last camera in the chain
    (e.g. cam1: T_cn_cnm1 = T_c1_c0, takes cam0 to cam1 coordinates)

    相机外部变换,始终相对于链中的最后一个相机

    (例如 cam1: T_cn_cnm1 = T_c1_c0,将cam0坐标转换为cam1坐标)

  • T_cam_imu
    IMU extrinsics: transformation from IMU to camera coordinates (T_c_i) 从 IMU 到相机坐标的转换

  • timeshift_cam_imu
    timeshift between camera and IMU timestamps in seconds (t_imu = t_cam + shift) 相机和 IMU 时间戳之间的时移(以秒为单位)

  • rostopic
    topic of the camera's image stream 相机图像流的主题

  • resolution
    camera resolution [width,height] 相机分辨率[宽度,高度]

内容示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
cam0:
camera_model: pinhole
intrinsics: [461.629, 460.152, 362.680, 246.049]
distortion_model: radtan
distortion_coeffs: [-0.27695497, 0.06712482, 0.00087538, 0.00011556]
T_cam_imu:
- [0.01779318, 0.99967549,-0.01822936, 0.07008565]
- [-0.9998017, 0.01795239, 0.00860714,-0.01771023]
- [0.00893160, 0.01807260, 0.99979678, 0.00399246]
- [0.0, 0.0, 0.0, 1.0]
timeshift_cam_imu: -8.121e-05
rostopic: /cam0/image_raw
resolution: [752, 480]
cam1:
camera_model: omni
intrinsics: [0.80065662, 833.006, 830.345, 373.850, 253.749]
distortion_model: radtan
distortion_coeffs: [-0.33518750, 0.13211436, 0.00055967, 0.00057686]
T_cn_cnm1:
- [ 0.99998854, 0.00216014, 0.00427195,-0.11003785]
- [-0.00221074, 0.99992702, 0.01187697, 0.00045792]
- [-0.00424598,-0.01188627, 0.99992034,-0.00064487]
- [0.0, 0.0, 0.0, 1.0]
T_cam_imu:
- [ 0.01567142, 0.99978002,-0.01393948,-0.03997419]
- [-0.99966203, 0.01595569, 0.02052137,-0.01735854]
- [ 0.02073927, 0.01361317, 0.99969223, 0.00326019]
- [0.0, 0.0, 0.0, 1.0]
timeshift_cam_imu: -8.681e-05
rostopic: /cam1/image_raw
resolution: [752, 480]

其它标定方法

标定事件相机内参:

标定IMU:

参考链接

录制、回放与转为bag包格式

使用dv-gui进行录制与回放

录制

  1. 在 DV 左侧栏中选择“Record”配置。当前配置将替换为标准录制配置(可改为自定义配置,用来只录制自己感兴趣的数据)。默认记录配置记录来自连接的 DVS / Davis 摄像机的所有事件、帧、imu 和触发数据。
  2. 选择中间顶部的“Output”选项卡以可视化实时录制。
  3. 从右侧“Capture”设置中的“Input Selection”下选择要记录的摄像机输入。
  4. (可选)在右侧Recorder-DIRECTORY下自定义文件保存路径。
  5. 单击红色圆圈按钮即可开始录制。所有数据均以 aedat 4.0 格式记录。

回放

如果您想要可视化 AEDAT4 格式的播放数据:

  1. 请在 DV 左侧栏中选择“Visualize”配置。
  2. 从右侧“Capture”设置中的“Input Selection”下选择“File”选项,然后选择要打开的文件。
  3. 一旦您选择了正确的文件,可视化就会开始。

转为bag包格式

此处使用的是dv-ros中提供的功能包dv_ros_aedat4,因此,需要提前编译dv-ros

根据dv_ros_aedat4README.md的说明,可选参数包括:

1
2
3
4
5
6
7
8
9
10
11
Usage: ./devel/lib/dv_ros_aedat4/convert_aedat4 [OPTIONS]

Options:
-h,--help Print this help message and exit
-i,--input TEXT:FILE REQUIRED 必需项,yourfolder/xxx.aedat4
Input aedat4 file
-o,--output TEXT Output aedat4 file 如果不填,默认在输入路径生成同名的.bag文件
-n,--namespace [/recording]
Topic namespace
-f,--force-overwrite 如果输出路径存在重命文件,则强制覆盖,不再生成提示
-v,--verbose 显示文件转换进度

执行方法举例:

1
2
cd yourfolder/catkin_ws
./devel/lib/dv_ros_aedat4/convert_aedat4 -i yourfile/xxx.aedat4 -n /DAVIS346 -f -v

这里面用到的路径有相对路径和绝对路径,看你的终端处在哪个文件夹里了。

如果运行时报错:The following argument was not expected: /DAVIS346。

则把dv-ros/dv_ros_aedat4/src/convert_aedat4.cpp中第43行改为:

1
2
// app.add_flag("-n,--namespace", topicNamespace, "Topic namespace");
app.add_option("-n,--namespace", topicNamespace, "Topic namespace");

-n参数应该读入的是字符串,而不是一个标志。

然后,重新编译dv_ros_aedat4功能包即可:

1
catkin build dv_ros_aedat4

转化完成后,

1
2
3
4
5
6
rosbag info xxx.bag  # 命令来查看转化成的bag包的信息

roscore
rostopic list # 查看消息列表
rostopic echo /DAVIS346/imu # 查看IMU数据
rostopic hz /DAVIS346/imu # 查看IMU的频率

更多关于rosbag的ROS命令:ROS知识-rosbag

使用ROS命令进行录制

也可以直接使用rosbag record TOPIC1 [TOPIC2 TOPIC3 ...]命令订阅主题并写入一个*.bag文件,具体的参数说明

具体步骤为:

  1. 使用rpg_dvs_rosdv-ros进行可视化。期间可以通过修改*.launch文件的方式自定义topic名称。
  2. 使用rostopic list命令查询当前正在使用的topic名称。
  3. 使用rosbag record TOPIC1 [TOPIC2 TOPIC3 ...]命令订阅主题并写入一个*.bag文件。

双目

相关知识

外部输入触发

此功能允许使用 INPUT_SIGNAL 和 OUTPUT_SIGNAL 端口与第三方摄像机和系统进行有限形式的交互。

INPUT_SIGNAL 端口可以配置为检测来自另一个相机或电子系统的上升沿、下降沿和脉冲,当它检测到这种情况时,一个特殊的数据点会插入到来自 iniVation 相机的数据流中,精确的时间戳,允许将来自相机的数据与外部发生的事件相关联。

此功能可以检测理论最大频率为 1 MHz 的信号。对于方波输入,我们建议仅检测上升沿,频率不要超过 100 KHz,以获得可靠的结果。不尝试去抖或信号清除。

最好的情况是在外部摄像头捕获帧时仅发送脉冲,以便您可以将两者关联起来。许多机器视觉相机都支持这种触发器,例如外部 LED 灯闪烁。

这不会改变 iniVation 摄像机本身的操作方式,因此无法使用此功能在 DAVIS 上启动/停止录制、配置摄像机或触发帧捕获。

默认情况下,OUTPUT_SIGNAL 端口仅中继 INPUT_SIGNAL 端口,从而允许以菊花链方式连接此检测功能。一些 iniVation 相机还支持在此端口上生成类似 PWM 的信号作为可配置选项。

信号输出与相机操作没有直接关系;它不会发出相机状态变化的信号,例如开始/停止记录或数据采集。下表列出了支持此额外功能的所有相机。

所有这些都必须使用我们的软件进行配置和启用,这些选项通常称为“外部输入检测器”(用于 INPUT_SIGNAL 端口上的检测部分)和“外部输入发生器”(用于在 OUTPUT_SIGNAL 端口上生成可选 PWM 信号)。

时钟同步

时钟同步功能允许多个连接的摄像机使用 INPUT_CLOCK 和 OUTPUT_CLOCK 端口保持微秒精度时间戳彼此同步。

摄像机以菊花链方式连接,一旦通过电缆建立物理连接,它们就会自动同步。该系列中的第一台相机(INPUT_CLOCK 上没有信号的相机)称为主相机,并且其主 LED 会打开。其他摄像机的 LED 灯将关闭。还可以在我们的软件中检查同步状态,其中“deviceIsMaster”选项通常会通知用户相机的状态。

所有摄像机硬件同步后,您只需重置主摄像机的时间戳,然后主摄像机也会重置所有下游设备,确保所有摄像机具有相同的开始时间点。这是通过软件完成的,可以通过选择“Reset Timestamps”选项手动完成,也可以使用 dv-processing 的 Stereo 类自动完成此操作。

硬件连接

以左目相机为主相机,右目相机为副相机。同步线从右目相机的IN口出,到左目相机的OUT口进。两个相机都使用USB线连接到电脑上。

进行可视化(数据传输)时,左目相机MASTER灯和DATA灯亮,右目相机DATA灯亮。

可视化

dv-gui

运行dv-gui后,即可在右侧工具栏的Capture-INPUT SELECTION中选择两个相机之一。当然,也可以通过搭建Structure的方式同时可视化两个相机。

rpg_dvs_ros

1
source ./devel/setup.zsh && roslaunch dvs_renderer stereo_davis.launch

dv-ros(TODO)

标定

步骤与单目相机类似:

  1. 相机对焦
  2. 使用Kalibr标定相机内参,无非是在执行标定命令时比单目多指定一个topic。
  3. 使用Kalibr进行视惯联合标定,无非是在执行标定命令时比单目多指定一个topic。

参考链接


事件相机的选型、标定和使用
http://zeyulong.com/posts/9d7fd48f/
作者
龙泽雨
发布于
2024年4月20日
许可协议