Kalibr标定Intel D435i相机

2023-05-16

Kalibr标定Intel D435i相机

文章目录

  • Kalibr标定Intel D435i相机
    • 1、相机标定
    • 2、IMU标定
    • 3、相机+IMU联合标定
    • 4、标定结果评价

系统环境:ubuntu16.04+roskinetic

需要的基础知识基础:ROS基本知识(如何使当前终端生效,roslaunch文件的编写)

源码安装:kalibr https://github.com/ethz-asl/kalibr.git

Realsense SDK: https://github.com/IntelRealSense/librealsense.git

realsense-ROS: https://github.com/IntelRealSense/realsense-ros.git

1、相机标定

(1)realsense d435i可以直接读取相机的内参

roslaunch realsense2_camera rs_camera.launch //打开相机节点
rostopic echo /camera/color/camera_info //查看相机内参

在这里插入图片描述

可以根据官网提供的相机内参验证自己的标定结果。

具体标定流程:

a、准备标定板和标定板的参数文件(以棋盘格标定为例)

具体可参考https://github.com/ethz-asl/kalibr/wiki/downloads

下载Checkerboard 7×6 0.5×0.5m(unscaled)的pdf以及yaml文件。

b、录制camera标定数据:rosbag

为了查看录制照片的好坏,可以通过ROS中的Rviz界面查看具体命令如下:分别在两个终端实现。

roslaunch realsense2_camera rs_camera.launch//打开相机节点
rviz,选camera_link,add topic->camera->color->image_raw//打开可视化窗口

将图像频率降低为4HZ,这里可以用throttle方法,不会出错,并发布新的topic,不会修改原topic:

rosrun topic_tools throttle messages /camera/color/image_raw 4.0 /color

开始录制rosbag包,最好新建一个文件夹,然后在当前终端输入以下命令:

mkdir bagfiles
cd bagfiles
rosbag record -O camd435i /color

其中-O表示设置的bag包名字,/color为录制的话题的名称。

ctrl+c结束录制,bag文件会自动保存到录制时所在的目录。

c、标定相机

注意:在使用之前对kalibr_workspace source一下,就是之前我提到的需要的基础知识。

单个相机标定(测试成功)

kalibr_calibrate_cameras --target /home/sunshine/d435ibagfiles/checkerboard_7x6_50x50cm.yaml --bag /home/sunshine/d435ibagfiles/camd435i.bag --bag-from-to 26 100 --models pinhole-radtan --topics /color --show-extraction

具体参数解释:

--target   //棋盘格yaml参数文件路径
--bag      //录制rosbag包路径
--models   //相机模型
--topics   //话题名称

多个相机联合标定(没有测试)

kalibr_calibrate_cameras --target src/kalibr/checkerboard.yaml --bag src/kalibr/bag/fisheye_2019-07-15-21-52-12.bag --models pinhole-radtan pinhole-radtan --topics /image_raw1_th /image_raw2_th

可能遇到的问题,在启动这个命令的时候可能遇到缺少一些库,具体要把这些依赖项都安装好,如果你之前就按照官方提供的安装说明应该就没问题。ROS系统是kinetic的话要把下面的indigo改为kinetic.

sudo apt-get install python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen libopencv-dev ros-indigo-vision-opencv ros-indigo-image-transport-plugins ros-indigo-cmake-modules python-software-properties 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

标定结果保存在kalibr_workspace目录下,生成了三个文件

camchain-homesunshined435ibagfilescamd435i.yaml   //主要作用为了后期imu+相机联合标定
report-cam-homesunshined435ibagfilescamd435i.pdf  //以图的方式显示效果
results-cam-homesunshined435ibagfilescamd435i.txt //含有相机的内参以及重投影误差

results-cam-homesunshined435ibagfilescamd435i.txt具体内容

Calibration results 
====================
Camera-system parameters:
	cam0 (/color):
	 type: <class 'aslam_cv.libaslam_cv_python.DistortedPinholeCameraGeometry'>
	 distortion: [ 0.10680349  0.23330173  0.0007527  -0.01424711] +- [0.06332829 0.36042001 0.00826051 0.00888244]
	 projection: [636.2812933  633.32021    301.51496978 244.06377452] +- [ 1.43331881  3.59650713 15.12620104 14.66812844]
	 reprojection error: [0.000011, 0.000030] +- [0.128319, 0.113157]
Target configuration
====================

  Type: checkerboard
  Rows
    Count: 7
    Distance: 0.05 [m]
  Cols
    Count: 6
    Distance: 0.05 [m]

2、IMU标定

1、配置realsense的launch文件,在realsense-ros/realsense2_camera/launch文件夹下,复制rs_camera.launch文件,重命名为rs_imu_calibration.launch文件。修改配置参数

 <arg name="enable_sync"               default="true"/>
 <arg name="unite_imu_method"         value="linear_interpolation"/>   //也可以把“linear_interpolation”修改成"copy"

参考博客:https://blog.csdn.net/qq_41839222/article/details/86552367

https://blog.csdn.net/u012177641/article/details/92824014#commentBox

2、标定imu时需要配置imu_utils和code_utils,下载链接为:

https://github.com/gaowenliang/imu_utils

https://github.com/gaowenliang/code_utils

mkdir catkin_imu_utils
cd catkin_imu_utils
mkdir src
git clone https://github.com/gaowenliang/imu_utils.git
git clone https://github.com/gaowenliang/code_utils.git
cd ..
catkin_make
source devel/setup.bash

可能遇到的问题

code_utils-master/src/sumpixel_test.cpp:2:24: fatal error: backward.hpp: 没有那个文件或目录 compilation terminated.
这个sumpixel_test.hpp 里可以直接换成:
#include "code_utils/backward.hpp"

3、编写d435i_imu_calibration.launch文件,在imu_utils/launch文件夹下

<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value= "/camera/imu"/>
        <param name="imu_name" type="string" value= "d435i_imu_calibration"/>
        <param name="data_save_path" type="string" value= "$(find imu_utils)/data/"/>
        <param name="max_time_min" type="int" value= "10"/>
        <param name="max_cluster" type="int" value= "100"/>
    </node>
</launch>

具体参数注意

标定imu时的launch文件记得修改max_time_min对应的参数,默认是120,意味着两个小时,要是你的ros包里的imu数据长度没有两个小时,就进行不下去,始终停留在wait for imu data这里。
标定结果保存在 imu_utils/data/文件夹下

4、具体步骤

step1:进入realsense-ros包,开启d435i,发布IMU话题
step2:  录制imu数据包 rosbag record -O imu_calibration /camera/imu
step3: 运行校准程序    roslaunch imu_utils d435i_imu_calibration.launch
step4: 回放数据包      rosbag play -r 20 imu_calibration.bag

可以直接step1->step3在线标定

5、标定结果

在imu_utils/data/d435i_imu_calibration_imu_param.yaml

%YAML:1.0
---
type: IMU
name: d435i_imu_calibration
Gyr:
   unit: " rad/s"
   avg-axis:
      gyr_n: 5.7641536836437718e-02
      gyr_w: 1.6660473467600197e-03
   x-axis:
      gyr_n: 1.6392774317631395e-01
      gyr_w: 4.8477797168896648e-03
   y-axis:
      gyr_n: 6.1062818273645578e-03
      gyr_w: 1.2128782830293989e-04
   z-axis:
      gyr_n: 2.8905855056346572e-03
      gyr_w: 2.9074495087454760e-05
Acc:
   unit: " m/s^2"
   avg-axis:
      acc_n: 1.6327198936085560e-01
      acc_w: 4.5072862611306866e-03
   x-axis:
      acc_n: 5.0218265479090460e-02
      acc_w: 5.9343436346130033e-04
   y-axis:
      acc_n: 6.4732875717275387e-02
      acc_w: 9.4211033888535437e-04
   z-axis:
      acc_n: 3.7486482688620093e-01
      acc_w: 1.1986314081045406e-02

然后将Acc和Gyr的第一组平均数据拷贝到kalibr对应的imu.yml文件中,

rostopic: /camera/imu
update_rate: 200.0 #Hz
 
accelerometer_noise_density: 2.89e-01 #continous
accelerometer_random_walk: 4.55e-04 
gyroscope_noise_density: 3.02e-03 #continous
gyroscope_random_walk: 2.29e-05

3、相机+IMU联合标定

3.1准备条件:根据自己标定的camera结果替换下面的数值,建立camchain.yaml文件

cam0:
  camera_model: pinhole
  intrinsics: [632.9640658678117, 638.2668942402212, 339.9807921782614, 243.68020465500277]
  distortion_model: equidistant
  distortion_coeffs: [0.366041713382057, 1.1433178097591097, -3.008125411486294, -3.1186836086733227]
  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: /color
  resolution: [640, 480]

imu.yaml文件

rostopic: /imu
update_rate: 200.0 #Hz
 
accelerometer_noise_density: 0.01 #continous
accelerometer_random_walk: 0.0002 
gyroscope_noise_density: 0.005 #continous
gyroscope_random_walk: 4.0e-06

3.2标定步骤

1、将图像频率降低为20HZ,imu频率设置为200Hz,这里可以用throttle方法,不会出错,并发布新的topic,不会修改原topic:

rosrun topic_tools throttle messages /camera/color/image_raw 20.0 /color
rosrun topic_tools throttle messages /camera/gyro/image_info 200.0 /imu

2、录制rosbag包

rosbag record -O dynamic /color /imu

3、标定

kalibr_calibrate_imu_camera --target ~/bagfiles/checkerboard.yaml --cam ~/bagfiles/camchain.yaml --imu ~/bagfiles/imu.yaml --bag ~/bagfiles/dynamic.bag --bag-from-to 5 45 --show-extraction

4、标定结果评价

4.1 多目标定评估

kalibr标定多目后会生成标定报告以及标定出的外参值,标定报告会直接给出相机坐标的空间位置示意图,结合标定结果和实际位置比较可以较为直观的判断结果是否可靠;另外就是看重投影误差,这个值越小越好,我的在0.15以下已经是很好的了。内参数的话也可以关注一下,我使用的d435i,标定后双面的内参基本一样,不过和自带/camera_info还是有所区别的,但是不是很大。

4.2 IMU+相机联合标定评估

Normalized Residuals
----------------------------
Reprojection error (cam0): mean 0.116388852487, median 0.100494263466, std: 0.115779726566
Reprojection error (cam1): mean 0.118837162459, median 0.102707273927, std: 0.118032053496
Gyroscope error (imu0): mean 0.566382365906, median 0.424566309149, std: 0.541174462645
Accelerometer error (imu0): mean 0.303879126638, median 0.257914882481, std: 0.20381924896
Residuals
----------------------------
Reprojection error (cam0) [px]: mean 0.116388852487, median 0.100494263466, std: 0.115779726566
Reprojection error (cam1) [px]: mean 0.118837162459, median 0.102707273927, std: 0.118032053496
Gyroscope error (imu0) [rad/s]: mean 0.0221873017669, median 0.016631839881, std: 0.0211998145317
Accelerometer error (imu0) [m/s^2]: mean 0.128924994664, median 0.109424017423, std: 0.0864731838454

         而kalibr提供的例程是:

Normalized Residuals
----------------------------
Reprojection error (cam0):     mean 0.142975755445, median 0.130686487357, std: 0.0817972217348
Reprojection error (cam1):     mean 0.139113383779, median 0.129061976876, std: 0.0768758604603
Gyroscope error (imu0):        mean 0.0947751091434, median 0.082773649866, std: 0.0609365033876
Accelerometer error (imu0):    mean 0.363001590633, median 0.285683155402, std: 0.341485432021

Residuals
----------------------------
Reprojection error (cam0) [px]:     mean 0.142975755445, median 0.130686487357, std: 0.0817972217348
Reprojection error (cam1) [px]:     mean 0.139113383779, median 0.129061976876, std: 0.0768758604603
Gyroscope error (imu0) [rad/s]:     mean 0.0067016122363, median 0.00585298091238, std: 0.00430886147672
Accelerometer error (imu0) [m/s^2]: mean 0.0513361772636, median 0.0404016992912, std: 0.0482933329317

参考博客:https://blog.csdn.net/u012177641/article/details/92824014#commentBox

https://blog.csdn.net/kongdaqing1290/article/details/97524087

https://blog.csdn.net/u012177641/article/details/92824014

https://cloud.tencent.com/developer/article/1438368

https://blog.csdn.net/qq_41839222/article/details/86552367

https://blog.csdn.net/weixin_40628128/article/details/95945945

https://blog.csdn.net/weixin_40830684/article/details/88768225

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kalibr标定Intel D435i相机 的相关文章

  • 'instCount' Pin 工具计数什么指令?

    我在主函数内使用空主体的基本 C 程序上运行 pintool instCount int main 当我在这个可执行程序上运行 instCount 时 它显示大约 86000 条指令 即使程序很小 为什么会生成这么多指令 有什么想法吗 谢谢
  • 逻辑 CPU 计数返回 16 而不是 4

    我有一个 Intel Core i5 2450m 2 个物理处理器和 4 个逻辑处理器 我想找到一种方法来计算 AMD 和 Intel CPU 上的逻辑和物理核心 但是 经过一番搜索 我发现了一些奇怪的事情 我的代码没有返回 4 个逻辑单元
  • 组装为什么lea快?

    我和我的教授交谈过 他说 leaq rax rax 8 比以下速度更快 imulq 9 rax 我问他为什么 在这两种情况下 我们都用几乎相同的数字进行乘法 他说我们不会讨论这个 有人可以帮助我简单地理解为什么 leaq 总体上很快吗 评论
  • Intel MSR 每线程频率缩放

    我正在扩展 Linux 内核 以便控制某些线程的频率 当它们被调度到核心 任何核心 时 通过将正确的 p 状态写入寄存器来更改核心的频率IA32 PERF CTL 如英特尔手册中建议的那样 但是 当调度具有不同 自定义 频率的不同线程时 似
  • 为什么需要对 μop 进行分层?

    In Intel CPU 中的 MicroFusion 作者 丹尼斯 巴赫瓦洛夫 https easyperf net blog 2018 02 15 MicroFusion in Intel CPUs 他说 Unlamination fo
  • x86-64 CPU 寄存器是否在多个内核之间共享? [复制]

    这个问题在这里已经有答案了 我正在尝试阅读有关 CPU 寄存器的英特尔文档 但出现了我似乎找不到答案的问题 比如说 所有可用的寄存器 GPR 通用寄存器 控制寄存器 RIP EFLAGS CR0 CR15 EFER MSR 等 GDTR I
  • 是否可以暂时抑制单个 ret 指令的英特尔 CET,或者以其他方式使用 retpolines?

    英特尔 CET 控制流执行技术 由两部分组成 SS 影子堆栈 和 IBT 间接分支跟踪 如果您需要间接分支到您无法放置的某个地方endbr64由于某种原因 您可以抑制 IBT 一次jmp or call指令与notrack 有没有等效的方法
  • 运行任何英特尔 AVX 函数后,数学函数需要更多周期[重复]

    这个问题在这里已经有答案了 我注意到数学函数 如 ceil round 等 在运行任何 intel AVX 函数后会占用更多 CPU 周期 请参阅以下示例 include
  • 如何从 C 文件中获取完整的汇编代码?

    我目前正在尝试找出从相应的 C 源文件生成等效汇编代码的方法 我使用 C 语言已经好几年了 但对汇编语言的经验很少 我能够使用以下命令输出汇编代码 S海湾合作委员会中的选项 然而 生成的汇编代码包含调用指令 这些指令又跳转到另一个函数 例如
  • 为什么循环指令很慢?英特尔就不能有效地实施它吗?

    LOOP 英特尔参考手册条目 http felixcloutier com x86 LOOP LOOPcc html 减少 ecx rcx 如果非零则跳转 https stackoverflow com questions 46881279
  • Intel芯片上的半精度浮点运算

    Intel芯片上可以进行半精度浮点运算吗 我知道如何加载 存储 转换半精度浮点数 1 但我不知道如何在不转换为单精度浮点数的情况下对它们进行加 乘 1 https software intel com en us articles perf
  • 从 C 调用 Intel 8086 汇编程序

    我需要为汇编语言开发一个过程 并从 C 语言调用该过程 传递一个字符串并返回一个整数值 我的组装程序 独立 运行良好 我需要帮助将它们连接在一起 程序应该在 Intel 8086 上运行 我需要使用 MASM 或 emu8086 作为汇编器
  • lldb 可以与 fortran 一起使用吗?

    我正在尝试对 Fortran 程序设置断点lldb在 Mac OS 10 12 5 系统上 我有 program badcall integer a b a 2 b 3 write a b end I have to 使用英特尔编译器进行编
  • 为什么 Numpy 和 Ryzen Threadripper 比 Xeon 慢这么多?

    我知道 Numpy 可以使用不同的后端 例如 OpenBLAS 或 MKL 我还读到 MKL 针对 Intel 进行了深度优化 所以通常人们建议在 AMD 上使用 OpenBLAS 对吗 我使用以下测试代码 import numpy as
  • 英特尔编译器值得吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 非常简单 是英特尔编译器 http software intel com en us intel compilers 值得入手吗 我主要从事系统
  • Skylake 中干净缓存行的写回?

    我观察到 Skylake SP 在真实硬件上对干净的缓存行进行写回 Leeor 对这篇文章的回答对于 Intel Core i3 i7 数据从缓存集中逐出后的去向 https stackoverflow com questions 1941
  • Haswell 微架构在性能中没有停滞周期后端

    我在 Haswell CPU Intel Core i7 4790 上安装了 perf 但 性能列表 不包括 stalled cycles frontend 或 stalled cycles backend 我检查了http www int
  • 英特尔 SGX 开发者许可和开源软件

    是否可以获得许可的开发人员证书 用于在生产模式下签署经过安全审查 社区开发的开源 SGX 软件二进制文件 并将其发布到 apt 或 rpm 等开源存储库上 我刚刚询问了Intel SGX团队 他们说只有经过验证的供应商才能获得证书并在生产模
  • BOOST_LIKELY 和 __builtin_expect 仍然相关吗?

    我明白所解释的内容here https stackoverflow com questions 7346929 why do we use builtin expect when a straightforward way is to us
  • 安装apk时INSTALL_FAILED_NO_MATCHING_ABIS

    我尝试将我的应用程序安装到 Android L Preview Intel Atom 虚拟设备中 但失败并出现错误 INSTALL FAILED NO MATCHING ABIS 这是什么意思 INSTALL FAILED NO MATCH

随机推荐

  • vue3源码分析(三)—— 响应式系统(reactivity)

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言一 定义响应式数据1 reactive target 2 createReactiveObject2 1 入参2 2 响应式创建过程2 3 proxy
  • vue3源码分析(四)—— shared工具函数

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言1 数组中移除某元素2 字符串转数字3 转为字符串4 判定值是否发生改变5 判定数据类型5 1 数组5 2 Map5 3 Set5 4 Date5 5
  • 如何将两个rosbag包合并或者提取rosbag包中某些话题到一个rosbag里

    代码叫做merge bag py 运行的时候 python merge bag py v 1028msf bag msf bag vinReNoOutlier bag 就把msf bag和vinReNoOutlier bag完全合并在一起了
  • 解决 vscode中js变量 文件不能自动跳转问题~

    项目场景 xff1a 在项目开发中 xff0c 为了便于理解js代码逻辑和调试 xff0c 通常会使用快捷键自动定位到变量原始定义的文件位置 mac中快捷键 xff1a command 43 鼠标点击 但在vue项目开发中 xff0c 发现
  • vue3源码分析(二)—— 初始化流程

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言一 createApp在项目中的使用二 createApp源码追溯1 创建app实例1 1 ensureRenderer1 2 ensureRende
  • JS基础 ——解释执行

    文章目录 前言一 词法分析二 预编译创建全局作用域GO对象创建局部作用域AO对象 三 代码执行总结 前言 大家都知道 xff0c JS是一种不需要编译的解释型语言 但其实在浏览器执行JS代码前 xff0c 也有一个词法分析和预编译过程 xf
  • vue 项目中引入字体文件的正确方式~

    文章目录 前言一 开发中需要什么样的字体1 字体图标2 特殊字体 二 项目中引入字体文件1 字体文件2 css文件3 项目使用该字体 总结 前言 在UI设计稿中 xff0c 可能会有一些特殊字体 xff0c 或者是一些字体图标 对于特殊字体
  • vue3 使用 swiper轮播库

    文章目录 前言一 Swiper引入方式1 HTML标签引入方式2 CommonJs引入方式3 ES引入方式 xff08 采用 xff09 二 使用Swiper总结 前言 轮播图在前端开发中 xff0c 是常见需求 而Swiper库是最受前端
  • vue-cli2 老项目webpack3升级webpack5过程总结

    文章目录 背景一 webpack5环境要求二 升级步骤1 脚手架webpack cli2 升级webpack包3 更新webpack相关插件3 1 不推荐或被移除的插件3 2 升级babel到7版本3 3 更新插件 4 修改配置4 1 新增
  • 前端下载文件

    文章目录 前言二进制流前端核心实现下载功能有 xff1a 一 a标签 43 download属性二 window open url 34 blank 34 三 form表单四 接口请求 43 blob 43 a标签 43 download属
  • 前端JS 云打印 LODOP实践

    文章目录 前言一 Lodop是什么 xff1f 二 如何使用Lodop1 下载打印插件2 配置打印机3 html中植入打印控件4 调用Lodop对应的JS相关方法接口实现打印功能 三 Lodop主要方法接口三 注意点总结 前言 一般B S系
  • axios源码——工具函数utils.js

    文章目录 前言一 工具函数所在目录二 判定数据类型的函数1 isArray 判定数组 2 isString 判定字符串 3 isNumber 判定数值 4 isObject 判定对象 5 isPlainObject 判定纯对象 6 isUn
  • 源码阅读——validate-npm-package-name

    文章目录 前言一 源码阅读工具二 阅读源码1 目录结构2 package json3 index js 三 使用该包1 vue cli中使用2 create react app 中使用 总结 前言 validate npm package
  • 学习rtklib

    数据下载 日期转换和一些常用数据下载 http www gnsscalendar com index html year 61 2019 多系统精密星历和精密钟差下载 2021年10月25日更新 xff1a 单GPS精密星历文件要在这里下载
  • echarts 绘制多条折线图(横坐标,折线图条数不确定)

    项目场景 xff1a 使用echarts做业务图表统计 xff0c 记录一下在项目中图表接口返回的数据处理问题 需求描述 1 一个统计图中实现多条折现图的显示 xff0c 如下图所示 2 后台返回的数据结构 span class token
  • 线性二次型调节器(LQR)原理详解

    文章目录 前言算法解释代价函数的意义 推导过程可控性LQR控制实例参考资料 前言 LQR Linaer Quadratic Regulator xff0c 即线性二次型调节器 xff0c 是一种现代控制理论中设计状态反馈控制器 State
  • 嵌入式软件工程师常见面试问题

    嵌入式软件工程师面试题 1 stm32启动方式 xff1f 有三种 xff1a 从Flash启动 xff0c 将Flash地址0x0800 0000映射到0x00000000 这样启动以后就相当于从0x0800 0000开始的 xff0c
  • 使用python爬虫把自己的CSDN文章爬取下来并保存到MD文件

    导言 爬虫作为一个敏感技术 xff0c 千万要把握好 xff0c 如果人家不让爬那就不要头铁去试了 如何确定某个网站是否允许爬虫 在域名后面加上 robots txt查看即可 xff0c 例如 xff1a https blog csdn n
  • 寻找矩阵中的指定路径

    给定一个矩阵和一个要找的字符串 xff0c 如果有的话找出矩阵中的字符串路径 测试用例 功能测试 xff1a 在多行多列的矩阵中存在或者不存在路径 边界值测试 xff1a 矩阵只有一行或一列 xff1b 矩阵和路径中的所有字母都是相同的 特
  • Kalibr标定Intel D435i相机

    Kalibr标定Intel D435i相机 文章目录 Kalibr标定Intel D435i相机1 相机标定2 IMU标定3 相机 43 IMU联合标定4 标定结果评价 系统环境 xff1a ubuntu16 04 43 roskineti