D435i运行VINS-mono以及Kalib标定

2023-05-16

D435i运行VINS-mono以及Kalib标定

系统说明:Ubuntu 18.04
内核版本:5.4.0

1、运行VINS-mono

参考博客VINS(D435i)测试
问题:
**(1)**下载源码部分:
步骤a:

git clone https://github.com/IntelRealSense/librealsense.git

原作者推荐2.19原因解释在于SDK2.19中包含了步骤3中Ros Wrapper中的ddynamic_reconfigure

但是目前直接git 下来版本为V2.36,需要注意这个SDK版本对应的realsense版本是需要安装ddynamic_reconfigure的,否则编译时候会报错缺少这个东西。
若不对应,会出现https://blog.csdn.net/weixin_38504276/article/details/103010109点击进入中的错误
步骤c

echo 'deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main' | sudo tee /etc/apt/sources.list.d/realsense-public.list

这一步需要注意xenial其实是UBuntu16.04对应的,但是18.04也能用,更建议换成melodic,参考官网linux下安装部分。
***(2)***pip问题
执行igraph时候(按照官方的github),会遇到pip的问题,百度换源
(给pip换源)安装。
(3)安装Kalib的时候,会出现suitparse问题,修改Cmakelists.txt中相应行如下:

DOWNLOAD_COMMAND rm -f SuiteSparse-${VERSION}.tar.gz && wget -O SuiteSparse-${VERSION}.tar.gz "https://github.com/jluttine/suitesparse/archive/v${VERSION}.tar.gz"

其他部分依次执行。

2、标定

补充一个重要问题:相机模型要选择pinhole-radtan,外参标出来才对,对于D435i是这样,不能选pinhole-equi。
较全的参考博客推荐:博主古路标定
问题记录:
**(1)**IMU标定

rs_imu_calibration.launch

该代码直接把rs_camera.launch复制过来就行,前提是在运行VINS中已经修改过参数。
**(2)**运行IMU校准参数时候,复制过来就可以,修改时间参数就行,我在此处将data_save_path修改为自己的参数,但是读取不了。
**(3)**相机标定,需要下载april grid,此处任意放置一个目录就行,后期运行标定命令修改路径。
**(4)**关闭IR发射器:关闭IR,每次重新插拔相机后要再关一次
**(5)**摄像头标定,多角度多位置移动,:参考视频
此处数据集录制不好,在执行标定命令时,会出现以下错误和警告,这三个均为不影响执行的

[ WARN] [1596511223.581216]: BagImageDatasetReader: truncated 1485 / 2834 images.

(Aprilgrid: Tag detection:24719): GLib-GObject-CRITICAL **: 11:32:39.553: g_object_unref: assertion 'G_IS_OBJECT (object)' failed

[TargetViewTable]: Tried to add second view to a given cameraId & timestamp. Maybe try to reduce the approximate syncing tolerance.

我个人标定了四次,有一次数据集在上面第三条命令之后又出现了下面一条错误直接中断,下面这个错误没有花时间去解决,换其他数据集没报错,所以在录制数据集的时候可以多录制几个。其次时间可以限制短一些,本人处理器为i7 10代,时间选10-100处理时间较长,建议选择一半。
导致中止的错误:
[ERROR] [1596519258.700033]: initialization of focal length for cam with topic /infra_right failed
这个错误github上是有解决方案的。
**(6)**多相机标定命令:

kalibr_calibrate_cameras --target /home/april_6x6_80x80cm.yaml --bag /home/multicameras_calibration.bag --models pinhole-equi pinhole-equi pinhole-equi --topics /infra_left /infra_right /color --show-extraction --approx-sync 0.04 --bag-from-to 30 50

其中target命令和bag后面的路径修改成自己的。--approx-sync 0.04开头提出的参考博客中,开始标定命令后面没有这块代码,其后就会出现原博客报错。
**(7)**多相机标定报告生成后,可以和开头博客对比下,有时候重投影误差太大可以重新标一次。
**(8)**联合标定
a.联合标定开始提到的文件是需要自己写的,路径自己定,后面在标定命令中把相应路径填进去就行。
b.该imu.yaml(原博客此处拼写错误)开头topic有误:

rostopic: /camera/imu
update_rate: 200.0 #Hz
 
accelerometer_noise_density: 2.3786845794688424e-02  #白噪声
accelerometer_random_walk: 5.9166889270489845e-04  #偏置
gyroscope_noise_density: 2.1732068912927271e-03 #continous
gyroscope_random_walk: 1.7797900203083191e-05

仅修改第一行为:

rostopic: /imu

因为在后面限制频率后,修改了话题
***c***报错缺少模块:

NO module named scipy.optimize

使用命令:

sudo apt-get install python-scipy

此处试过网上很多命令,都不是很好使。参考帖子:进入
***d***录制数据集
录制数据:建议录制color+imu。多相机加IMU的优化矩阵很大,本人电脑配置优化失败,如果有较好的台式机可以一试。因为最后也只用color的数据,所以没必要多目加IMU标定。
***e***优化报错
尽管录制单目,但是也有可能优化失败:如下

Exception in thread block: Exception in thread block: [aslam::Exception] /home/louis/catkin_ws/src/kalibr/aslam_nonparametric_estimation/aslam_splines/src/BSplineExpressions.cpp:447: toTransformationMatrixImplementation() assert(_bufferTmin <= _time.toScalar() < _bufferTmax) failed [15106.3 <= 15106.3 < 15106.4]: Spline Coefficient Buffer Exceeded. Set larger buffer margins!
[aslam::Exception] /home/louis/catkin_ws/src/kalibr/aslam_nonparametric_estimation/aslam_splines/src/BSplineExpressions.cpp:447: toTransformationMatrixImplementation() assert(_bufferTmin <= _time.toScalar() < _bufferTmax) failed [15118.2 <= 15118.2 < 15118.2]: Spline Coefficient Buffer Exceeded. Set larger buffer margins!
Exception in thread block: [aslam::Exception] /home/louis/catkin_ws/src/kalibr/aslam_nonparametric_estimation/aslam_splines/src/BSplineExpressions.cpp:447: toTransformationMatrixImplementation() assert(_bufferTmin <= _time.toScalar() < _bufferTmax) failed [15094.8 <= 15094.8 < 15094.9]: Spline Coefficient Buffer Exceeded. Set larger buffer margins!
[ERROR] [1454555378.858709]: Optimization failed!

该错误解决方法见github:
github
与此相关的还有问题55,可在上面github的问题中搜索。
修改的文件

/kalib_ws/src/Kalibr/aslam_offline_calibration/kalibr/python/kalibr_imu_camera_calibration/IccCalibrator.py

与问题171中提到的不太一样,但是timeOffsetPadding的确在此处修改,将值改为0.1(原来为0.02)。
然鹅,再一次优化失败,我又修改了数据集的时间长度,将其修改为后20s,才优化成功。

此处记录标定成功中遇到的问题,但是跑VINS效果不好,后续继续。
3、后续结果
经过一段时间标定,外参其实标定出来到一个大致的范围后,这个时候初始化就和一些因素有关。根据自己经验,首先初始化不能大幅度晃动,其次保证足够多的特征点(这一部分验证是通过上面标定的参考博客中有一条可以生成标定版pdf文件的命令,我直接生成150个特征点的,初始化对着它,立马进入后端),所以说环境有点影响。其次在我做完上述调教后,基本可以稳定运行,但是偶尔还是不太稳定,后来怀疑是室内环境问题(所处室内环境为一个玻璃围起来的会议室,白天没有太阳光照进来,都是灯光),因为后面拿去室外,效果立马就好了。而且仔细参考沈老师课题组的环境,可以发现不论室内还是室外,都有相对比较多的特征点,当然以上都是个人经验,仅供参考。下面为效果图:室外效果图下面放一下配置文件外参部分,以及imu部分:

#camera calibration 
model_type: PINHOLE
camera_name: camera
image_width: 640
image_height: 480
distortion_parameters:
   k1: 0.115442075186306
   k2: -0.0715322860987043
   p1: 0.000362396472449387
   p2: 0.0105544503137209
projection_parameters:
   fx: 612.938848329915
   fy: 611.536386289859
   cx: 345.892041589929
   cy: 234.910747444319

# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 0  # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
                        # 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.
                        # 2  Don't know anything about extrinsic parameters. You don't need to give R,T. We will try to calibrate it. Do some rotation movement at beginning.                        
#If you choose 0 or 1, you should write down the following matrix.
#Rotation from camera frame to imu frame, imu^R_cam
extrinsicRotation: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 0.99998638, -0.00511292,-0.00105044,
           0.00512328, 0.99993577, 0.01010986,
           0.00099868, -0.01011511,0.99994834 ]
#Translation from camera frame to imu frame, imu^T_cam
extrinsicTranslation: !!opencv-matrix
   rows: 3
   cols: 1
   dt: d
   data: [-0.03648963, -0.01213669, 0.02434708]
#   data: [0.00030446,-0.00008146, 0.00051927]

#feature traker paprameters
max_cnt: 150            # max feature number in feature tracking
min_dist: 25            # min distance between two features 
freq: 10                # frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image 
F_threshold: 1.0        # ransac threshold (pixel)
show_track: 1           # publish tracking image as topic
equalize: 0             # if image is too dark or light, trun on equalize to find enough features
fisheye: 0              # if using fisheye, trun on it. A circle mask will be loaded to remove edge noisy points

#optimization parameters
max_solver_time: 0.04  # max solver itration time (ms), to guarantee real time
max_num_iterations: 8   # max solver itrations, to guarantee real time
keyframe_parallax: 10.0 # keyframe selection threshold (pixel)

#imu parameters       The more accurate parameters you provide, the better performance
acc_n: 0.0223798934954       # accelerometer measurement noise standard deviation. #0.2
gyr_n: 0.00244184681729       # gyroscope measurement noise standard deviation.     #0.05
acc_w: 5.7300219137827041e-04        # accelerometer bias random work noise standard deviation.  #0.02
gyr_w: 2.77375580866e-05    # gyroscope bias random work noise standard deviation.     #4.0e-5
#acc_n: 0.0450928056481          # accelerometer measurement noise standard deviation. #0.2
#gyr_n: 0.00270640454684         # gyroscope measurement noise standard deviation.     #0.05
#acc_w: 0.00127994636405         # accelerometer bias random work noise standard deviation.  #0.02
#gyr_w: 3.7195573812e-05       # gyroscope bias random work noise standard deviation.     #4.0e-5
g_norm: 9.805       # gravity magnitude

根据理论判断,以及参考博主古路的结果,外参平移参数的y这一项应该可以再小一个量级,但是我们用的打印的在A4纸上的标定板,前后标定很多次,效果没有更好。有条件建议买一块标定板。

ps:最经又跑了一下FUSION,所有都用的原始参数,有一段时间相机启动会丢IMU,所以轨迹直接飘,此处参考高飞教授github提到的,多插拔几次(记得关结构光),就有效果了,而且感觉FUSION相对稳定,没有1初始化就会好很多,但是硬件链接感觉不稳,不知道相机的问题还是电脑的问题(当然确保了是usb3.0),有看到的大佬可以给点意见。在这里插入图片描述上述效果是未标定跑出来的结果,除过上面提到的硬件问题,也没做标定。准备标定下试试,有一部分原因在于多目联合IMU标定,太吃资源,之前做过一次,优化失败。目前也怀疑和数据集的录制有关系,后面标定下效果好再更新。
运行VINS-FUSION命令
在librealsense下面运行

roslaunch realsense2_camera rs_camera.launch

在编译过的VINS-FUSION下面运行,上一条命令就是启动相机,下面三条是运行FUSION相关。

roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D435i运行VINS-mono以及Kalib标定 的相关文章

  • 无法启动 OpenDebug,因为需要 Mono(或 Mono 版本 >= 3.10.0)

    我已在 ubuntu 14 0 lts 中下载并安装 vscode 并包含现有的 node js 项目 首先我认为我与 vscode 相关的是调试我的应用程序 因为我必须去调试 ctrl shift D 惩罚 使用 name 和 progr
  • 无法在 Mono 3 上的 xsp 上运行 asp.net 4.5 应用程序

    我已经从源代码 tarball 构建了 Mono 3 0 2 并从最新的 tarball 和 Github 上的最新版本构建了 XSP 但我无法使用 net 4 5 运行相对简单的 asp net 应用程序 因为它看到 web config
  • 绑定到 MonoDroid/Android 的 MvvmCross 中的路径 ImageView

    在我的案例路径中 MyZooSnap Core component Resources Images i jpg Android 的路径转换方法ImageView 为了在以下绑定中使用它 AssetImagePath Path ImageP
  • Reactive Framework (RX) 可以在 Mono 中使用吗?

    一直在寻找 但我唯一发现的是http evain net blog articles 2009 07 30 rebasing system reactive to the net clr http evain net blog articl
  • 如何为 MAC OS X 安装 libgluezilla

    我正在尝试在具有嵌入式 Web 浏览器控件的 Mac 上运行 Mono 应用程序 程序运行 但现在显示浏览器并输出一条消息 未找到 libgluezilla 要获得网络浏览器支持 您需要安装 libgluezilla 我已经搜索过 但不知道
  • System.Net.WebException:错误:在单声道 Android 应用程序中调用 WCF 服务抛出异常时 NameResolutionFailure

    我正在开发 Mono Android 移动应用程序 我在应用程序中调用 WCF 服务 我使用项目菜单的 gt Add WebRefernce 选项添加了 WCF 服务 我的问题是当我在设备上运行调用 wcf 服务时遇到异常 例外 为您的应用
  • 如何限制 .net / mono 进程的内存大小

    假设您有一个用 C 编写的应用程序 单进程 默认情况下 应用程序分配巨大的虚拟内存 远远超过其需要 例如驻留内存约为 10mb 而虚拟内存约为几 GB 在 Java 中 可以使用一个选项来限制这一点 java mx128m 如何对 net
  • 目前Mono虚拟机的性能如何?

    网络上充斥着不同语言 编译器 虚拟机的各种性能测试 然而 几乎没有任何一个使用真实场景来测试性能 此外 在 Google 上搜索此类基准通常只会产生几年前的基准 因为这些基准有最多的时间来收集它们的链接 你们中有人真正了解不同虚拟机的当前性
  • Gtk Widget 到 Winform

    是否可以使用 System Windows Forms 将 Gtk 小部件嵌入到应用程序中 谢谢 两个工具包都使用自己单独的 UI Mainloop 来处理事件 例如鼠标移动 按钮按下等 因此 将两者混合实际上是不可能的 尽管几年前 Gtk
  • Mac OS X 上的 Mono - 并行 HTTP 下载限制为 2

    我正在使用 Mono 开发一个可以同时下载多个文件的程序 适用于 Mac OS X 和 Debian 然而 尽管我使用了构造函数 但我只能同时下载 2 个文件new RollingDownload 10 我正在使用的代码是这样的 using
  • GTK C# 小部件更改颜色不起作用

    我试图通过使用更改 GTK 中按钮小部件的颜色 button1 ModifyBase Statetype Normal new Gdk Color 1 1 1 这是从另一个按钮单击事件调用的 但小部件颜色未更新 为什么是这样 您可以只使用M
  • 正则表达式匹配未完成

    我曾经有过一次回答了一个问题 https stackoverflow com a 17723854 882200关于将带引号的字符串与转义引号匹配 似乎有些情况会在 NET 上挂起并在 Mono 上崩溃 带有OutOfMemoryExcep
  • .NET CLR 线程池耗尽 - 实现错误?

    我编写了一个简单的基于异步的负载测试库 它还有一个控制台界面可以从命令行进行测试 基本上 它同时运行大量请求 聚合它们 并显示摘要和简单的直方图 没有什么花哨 但我在本地系统中运行了大量测试 因此我想确保测试工具能够使用尽可能少的资源来获得
  • mkbundle 和 GTK#

    我正在尝试使用 mkbundle 以便我可以分发 GTK 应用程序 而无需用户安装 NET Mono 或 GTK 我已经成功捆绑了一个使用 winforms 的应用程序 但由于某种原因 当我对 GTK 应用程序执行相同操作时 它无法工作 这
  • 是否可以使用 Mono 运行 clickonce 应用程序?

    我正在开发 clickonce 应用程序 我可能想在 Mac 平台上分发该应用程序 我知道我可以使用 Mono 编译 Net 应用程序 并且它可以在 Mac 上运行 但是我可以使用 clickonce 作为安装程序吗 thanks 我认为
  • 如何将 Windows 桌面应用程序转换为 Mac 桌面应用程序?

    我需要将 C NET Windows 桌面应用程序转换为 Mac 我读过有关 Qt REAL Studio LiveCode RunRev wxWidgets 和 Mono 的跨平台方面的内容 www mono project com 和h
  • Directory.GetCurrentDirectory() 在 Linux 上不起作用?

    因此 我尝试创建一个需要读取名为 scripts 的子文件夹中的脚本的应用程序 我的代码有问题 string script Console ReadLine string path Directory GetCurrentDirectory
  • C# 中的字符串加密和解密? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 C 中加密和解密字符串 编辑 2013 年 10 月 虽然我随着时间的推移编辑了这个答案以解决缺点 但请参阅jbtule 的回
  • 将程序集安装到 GAC,适用于 mono/.NET

    据我所知 NET 程序集的安装如下 gacutil i nunit framework dll 对于单声道 将目录设置为 MONO PATH 即可完成工作 它是否正确 对于 NET Windows 程序集安装在哪里 运行 gacutil 命
  • 任务返回类型出错 - “x 有错误的返回类型”

    我有一行代码 即 bool stop await Task

随机推荐

  • TCP协议的滑动窗口和流量控制算法(转)

    目录 滑动窗口 流量控制 操作系统缓冲区与滑动窗口的关系 窗口关闭 糊涂窗口综合症 拥塞控制 慢启动 拥塞避免算法 拥塞发生 快速恢复 拥塞算法示意图 引入 窗口概念的原因 我们都知道 TCP 是每发送一个数据 xff0c 都要进行一次确认
  • linux应用中的时间处理

    参考下 xff1a Linux下有关时间的函数 xff1a time times clock gettimeofday等 linux time函数 见牛羊的博客 CSDN博客 下面的代码基本涵盖了获取时间和操作计时的一些函数使用 xff1a
  • 从旋转向量到欧拉角的六种计算方法

    利用SolvePNP解出旋转向量 xff0c 旋转向量通过罗德里格斯公式解出旋转矩阵 xff0c 然后通过下面六种公式计算即可 xff0c 欧拉角有十二种 xff0c 六种是相对于自身参考系 xff0c 六种是相对于惯性参考系 xff0c
  • ROS | 服务通信的编程实现

    ROS 服务通信的编程实现 1 创建功能包2 节点编程与服务数据定义2 1 案例说明2 2 服务数据的定义2 3 创建 cpp文件2 4 客户端编程2 5 服务器编程 3 配置与编译3 1 在CMaKeLists txt中添加编译选项3 2
  • HTTP基础验证

    HTTP 内置基础验证 浏览器收到401状态码响应后 xff0c 弹出要求输入信息的对话框 通过验证则显示内容 xff0c 不通过不显示需要验证身份的内容 1 xff1b 手动HTTP基础验证 xff1a header 39 http 1
  • 位域,段域,联合体,结构体操作寄存器

    include lt stdio h gt typedef int Uint16 struct SCICCR BITS bit description Uint16 SCICHAR 3 2 0 Character length contro
  • C++ 网络编程之使用socket + epoll 模拟http 的请求与响应

    为了更好的理解http协议 xff0c 笔者使用了C 43 43 socket模拟了一个http服务器 xff0c 其中的服务器使用了epoll的方式 xff0c 并针对每一个新的连接开启新线程处理 大致分为三个部分 xff0c 具体代码可
  • 【Nova】nova-scheduler过滤称重

    在上一篇 nova scheduler调度过程分析 中 xff0c 对过滤称重的过程一笔带过了 xff0c 这篇着重介绍一下 首先 xff0c 我们声明一下host为主机 xff0c node为节点 xff0c 在OpenStack中一个h
  • 1.通过tcp从daytime服务器获取时间

    最近愈发觉得在学习源代码或者看书的时候 xff0c 做下读书笔记 xff0c 不仅能加深印象和理解 xff0c 同时也方便日后进行回顾 xff0c 所以就写下UNP UNIX网络编程 卷1的读书笔记 xff0c 涉及到的代码基本都是原作者提
  • 4.IPv4和IPv6地址长度

    IPv4地址的二进制形式长度为32 xff0c 使用我们常用的点分十进制形式进行表示那么最长长度为15 xff0c 例如 255 255 255 255 所以在posix的 lt netinet in h gt 中定义的IPv4地址字符串形
  • 29.Nginx HTTP之请求行解析函数ngx_http_parse_request_line

    Nginx的HTTP模块中使用ngx http parse request line函数来对读取的请求行进行解析 xff0c HTTP请求行的格式不是很复杂 xff0c 但是要注意HTTP 0 9与1 0 1 1之间的区别 xff1b 另外
  • 4. 事务隔离级别之Read Uncommitted

    前面我们说过 xff0c 要获得最高的事务隔离性 xff0c 可以采取序列化 串行的方式 xff0c 代价是严重影响系统处理事务的吞吐量 就好像数据库是个多核CPU xff0c 事务串行后 xff0c 那么意味着我们总是在使用单核 xff0
  • Vision Transformer学习笔记

    Vison Transformer学习笔记 1 前言2 网络结构 amp 设计原理2 1 Linear Projection of Flattened Patches2 2 Transformer Encoder2 2 1 Layer No
  • 5. 事务隔离级别之Read Committed

    这篇我们学习事务隔离级别Read Committed xff0c 顾名思义 xff0c 就是读已提交 xff0c 一个事务只能看到其他并发的已提交事务所作的修改 很显然 xff0c 该级别可以解决Read Uncommitted中出现的 脏
  • 6. 事务隔离级别之Repeatable Read

    接下来我们学习Mysql默认的事务隔离级别Repeatable Read xff0c 顾名思义 xff0c 可重复读 xff0c 也即在一个事务范围内相同的查询会返回相同的数据 延续上面的栗子 xff1a 1 小明很开心自己考了69分 xf
  • 7.事务隔离级别之Serializable

    最后我们学习一下最高的事务隔离级别Serializable xff0c 顾名思义 xff0c 可串行化的 xff0c 也即并发事务串行执行 很显然 xff0c 该级别可以避免前面讲到的所有问题 xff1a 脏读 不可重复读 和 幻读 代价是
  • 6. 消息发送重试

    当连接失败 xff0c Celery会自动重试发送消息 xff0c 我们可以对重试行为进行设置 xff0c 譬如说多久重试一次 最大重试次数或者干脆不重试 xff01 当然这只是官方文档说的 xff0c 我在Windows上进行测试 xff
  • 1. RabbitMQ安装

    RabbitMQ作为消息队列 xff0c 在分布式系统中具有举足轻重的作用 xff0c 能够方便地解耦各个组件 xff1b OpenStack之所以具有高扩展性 xff0c RabbitMQ功不可没 虽然一直都在用 xff0c 但没有进行过
  • 1. Tornado实现聊天室

    Tornado的异步I O机制使其很适合处理长连接的场景 xff0c 在官方提供的Demo中就有一个简单的聊天室实现 xff0c 大致做法如下 xff1a 1 提供一个全局的消息缓存 2 每次获取新消息时 xff0c 如果缓存中没有新消息出
  • D435i运行VINS-mono以及Kalib标定

    D435i运行VINS mono以及Kalib标定 系统说明 xff1a Ubuntu 18 04 内核版本 xff1a 5 4 0 1 运行VINS mono 参考博客VINS xff08 D435i xff09 测试 问题 xff1a