2 用D435i运行VINS-fusion

2023-05-16

文章目录

  • 1 VINS-fusion的安装
    • 1.1 环境和依赖的安装
    • 1.2 编译VINS-Fusion
    • 1.3 编译错误解决方法
  • 2 VINS-Fusion跑数据集
  • 3 用相机运行VINS-Fusion

环境:Ubuntu20.04 + ROS-Noetic

1 VINS-fusion的安装

1.1 环境和依赖的安装

编译VINS需要ROS,Ceres和Eigen,Ceres需要依赖Eigen,所以先安Eigen才能安装Ceres,但是由于安装ROS-noetic也自动通过apt安装了Eigen3.3.7版(这个版本还行,如果想安装其他版本可以通过源码方式安装),所以安装完ROS可以直接安装Ceres,Ceres安装1.14版即可,安装最新2.x版本会报错。

  1. 安装ros-noetic

可以搜索鱼香ROS一键安装,很方便。

  1. 安装Ceres1.14

开头说了Ceres的依赖Eigen已经在安装ros时通过apt安装了,但是我是通过源码安装了Eigen,因为上过SLAM十四讲的都会把一堆第三方库通过源码安装,能更好滴管理库的版本,用apt安装的大都是很新的版本,但是新的不一定稳定,可能会报一堆错,所以会选择源码的方式安装稳定版本的第三方库,那既然说到这了,就写一下用源码安装Eigen的过程,做不做这步你们随意。
安装Eigen3.3.9
进入官网下载界面下载Eigen3.3.9的Source code(zip),并解压,可以保存在一个文件夹里便于查看以及误删后的再次安装。
安装命令:

1 右键点击文件夹,选在终端打开
mkdir build && cd build
2 在build路径下输入
cmake ..
3 安装
sudo make install

简简单单就安装成功了,由于Eigen是由纯头文件组成的库,所以可以在/usr/local/include/eigen3/目录下看到。
由于有多个版本(多版本管理请自行查找),可以用命令行查看当前使用的Eigen版本,
pkg-config --modversion eigen3,结果如下,
image.png

安装Ceres1.14
进入官网下载界面下载Ceres1.14的源码并解压,如果不能进入github可以上gittee上搜一搜。
首先需要安装一些依赖:

# google-glog + gflags
sudo apt install libgoogle-glog-dev libgflags-dev

# Use ATLAS for BLAS & LAPACK
sudo apt install libatlas-base-dev

# SuiteSparse and CXSparse (optional)
sudo apt install libsuitesparse-dev

安装命令:

1 右键点击文件夹,选在终端打开
mkdir build && cd build
2 在build路径下输入
cmake ..
3 编译一下
make -j4
4 测试
make test
5 安装
sudo make install

至此Ceres也安装完成了,VINS-fusion的环境准备工作结束了。

1.2 编译VINS-Fusion

首先创建一个ros工作空间,可以和上篇文章Ubuntu20.04安装D435i相机驱动中的realsense-ros工作空间catkin_ws放在一起,这样后面用相机运行VINS就不用source两遍了。

cd ~/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
cd ..
catkin_make

此时就会报一堆由OpenCV版本引起的错误。

1.3 编译错误解决方法

由于ROS-noetic安装时自动安装了OpenCV4.2,而VINS运行需要的是OpenCV3,主要在文件夹camera_model中两个文件添加缺失的头文件即可。
在下图两个文件中分别添加78两行头文件,
image.png
image.png代码如下,可直接复制

#include <opencv2/imgproc/types_c.h>
#include <opencv2/imgproc/imgproc_c.h>

#include <opencv2/imgproc/types_c.h>
#include <opencv2/calib3d/calib3d_c.h>

接下来还会遇到几个not declared的错误,按下面方法对报错文件逐一进行修改即可。

  1. error: ‘CV_FONT_HERSHEY_SIMPLEX’was not declared in this scope

将所有报这个错的文件中CV_FONT_HERSHEY_SIMPLEX 参数改为 cv::FONT_HERSHEY_SIMPLEX

  1. error: ‘CV_LOAD_IMAGE_GRAYSCALE’ was not declared in this scope

将所有报这个错的文件中CV_LOAD_IMAGE_GRAYSCALE 参数改为 cv::IMREAD_GRAYSCALE

  1. error: ‘CV_RGB2GRAY’ was not declared in this scope

将所有报这个错的文件中添加#include <opencv2/imgproc/types_c.h>

都修改完成之后就可以编译成功了。

2 VINS-Fusion跑数据集

以EuRoC数据集为例,这个数据集是ETH大学用无人机录制的,数据集可去官网下载(如果你现在还不能科学上网,你应该知道科学上网的重要性了),下载MH_01_easy.bag文件就行。
输入下列命令运行双目+IMU:

roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml 
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml  
rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag

不带回环检测的命令及结果如下所示,
image.png
image.png下面就可以用相机运行VINS-Fusion了,和跑数据集唯一的不同就是用相机的发布到话题的数据代替了ros bag记录的数据的播放。

3 用相机运行VINS-Fusion

修改文件realsense-ros中的rs_camera.launch文件,可以复制一个命名为rs_camera_vins.launch能保留原文件。直接复制下面代码就行,

<launch>
  <arg name="serial_no"           default=""/>
  <arg name="usb_port_id"         default=""/>
  <arg name="device_type"         default=""/>
  <arg name="json_file_path"      default=""/>
  <arg name="camera"              default="camera"/>
  <arg name="tf_prefix"           default="$(arg camera)"/>
  <arg name="external_manager"    default="false"/>
  <arg name="manager"             default="realsense2_camera_manager"/>

  <arg name="fisheye_width"       default="640"/>
  <arg name="fisheye_height"      default="480"/>
  <arg name="enable_fisheye"      default="false"/>

  <arg name="depth_width"         default="640"/>
  <arg name="depth_height"        default="480"/>
  <arg name="enable_depth"        default="true"/>

  <arg name="infra_width"        default="640"/>
  <arg name="infra_height"       default="480"/>
  <arg name="enable_infra1"       default="true"/>
  <arg name="enable_infra2"       default="true"/>

  <arg name="color_width"         default="640"/>
  <arg name="color_height"        default="480"/>
  <arg name="enable_color"        default="true"/>

  <arg name="fisheye_fps"         default="30"/>
  <arg name="depth_fps"           default="30"/>
  <arg name="infra_fps"           default="30"/>
  <arg name="color_fps"           default="30"/>
  <arg name="gyro_fps"            default="200"/>
  <arg name="accel_fps"           default="250"/>
  <arg name="enable_gyro"         default="true"/>
  <arg name="enable_accel"        default="true"/>

  <arg name="enable_pointcloud"         default="false"/>
  <arg name="pointcloud_texture_stream" default="RS2_STREAM_COLOR"/>
  <arg name="pointcloud_texture_index"  default="0"/>

  <arg name="enable_sync"               default="true"/>
  <arg name="align_depth"               default="true"/>

  <arg name="publish_tf"                default="true"/>
  <arg name="tf_publish_rate"           default="0"/>

  <arg name="filters"                   default=""/>
  <arg name="clip_distance"             default="-2"/>
  <arg name="linear_accel_cov"          default="0.01"/>
  <arg name="initial_reset"             default="false"/>
  <arg name="unite_imu_method"          default="linear_interpolation"/>
  <arg name="topic_odom_in"             default="odom_in"/>
  <arg name="calib_odom_file"           default=""/>
  <arg name="publish_odom_tf"           default="true"/>
  <arg name="allow_no_texture_points"   default="false"/>
  <arg name="emitter_enable"   		default="false"/>

<!-- rosparam set /camera/stereo_module/emitter_enabled false -->
<rosparam>
  /camera/stereo_module/emitter_enabled: 0
</rosparam>

<rosparam if="$(arg emitter_enable)">
  /camera/stereo_module/emitter_enabled: 1
</rosparam>

  <group ns="$(arg camera)">
    <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml">
      <arg name="tf_prefix"                value="$(arg tf_prefix)"/>
      <arg name="external_manager"         value="$(arg external_manager)"/>
      <arg name="manager"                  value="$(arg manager)"/>
      <arg name="serial_no"                value="$(arg serial_no)"/>
      <arg name="usb_port_id"              value="$(arg usb_port_id)"/>
      <arg name="device_type"              value="$(arg device_type)"/>
      <arg name="json_file_path"           value="$(arg json_file_path)"/>

      <arg name="enable_pointcloud"        value="$(arg enable_pointcloud)"/>
      <arg name="pointcloud_texture_stream" value="$(arg pointcloud_texture_stream)"/>
      <arg name="pointcloud_texture_index"  value="$(arg pointcloud_texture_index)"/>
      <arg name="enable_sync"              value="$(arg enable_sync)"/>
      <arg name="align_depth"              value="$(arg align_depth)"/>

      <arg name="fisheye_width"            value="$(arg fisheye_width)"/>
      <arg name="fisheye_height"           value="$(arg fisheye_height)"/>
      <arg name="enable_fisheye"           value="$(arg enable_fisheye)"/>

      <arg name="depth_width"              value="$(arg depth_width)"/>
      <arg name="depth_height"             value="$(arg depth_height)"/>
      <arg name="enable_depth"             value="$(arg enable_depth)"/>

      <arg name="color_width"              value="$(arg color_width)"/>
      <arg name="color_height"             value="$(arg color_height)"/>
      <arg name="enable_color"             value="$(arg enable_color)"/>

      <arg name="infra_width"              value="$(arg infra_width)"/>
      <arg name="infra_height"             value="$(arg infra_height)"/>
      <arg name="enable_infra1"            value="$(arg enable_infra1)"/>
      <arg name="enable_infra2"            value="$(arg enable_infra2)"/>

      <arg name="fisheye_fps"              value="$(arg fisheye_fps)"/>
      <arg name="depth_fps"                value="$(arg depth_fps)"/>
      <arg name="infra_fps"                value="$(arg infra_fps)"/>
      <arg name="color_fps"                value="$(arg color_fps)"/>
      <arg name="gyro_fps"                 value="$(arg gyro_fps)"/>
      <arg name="accel_fps"                value="$(arg accel_fps)"/>
      <arg name="enable_gyro"              value="$(arg enable_gyro)"/>
      <arg name="enable_accel"             value="$(arg enable_accel)"/>

      <arg name="publish_tf"               value="$(arg publish_tf)"/>
      <arg name="tf_publish_rate"          value="$(arg tf_publish_rate)"/>

      <arg name="filters"                  value="$(arg filters)"/>
      <arg name="clip_distance"            value="$(arg clip_distance)"/>
      <arg name="linear_accel_cov"         value="$(arg linear_accel_cov)"/>
      <arg name="initial_reset"            value="$(arg initial_reset)"/>
      <arg name="unite_imu_method"         value="$(arg unite_imu_method)"/>
      <arg name="topic_odom_in"            value="$(arg topic_odom_in)"/>
      <arg name="calib_odom_file"          value="$(arg calib_odom_file)"/>
      <arg name="publish_odom_tf"          value="$(arg publish_odom_tf)"/>
      <arg name="allow_no_texture_points"  value="$(arg allow_no_texture_points)"/>
    </include>
  </group>
</launch>

主要改变就是把角速度和加速度话题合并成IMU话题,这样vins能接收到,还有一些改变可查看realsense-ros的readme查看具体意思。
接下来可以运行了,输入下列命令,

roslaunch vins vins_rviz.launch 
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml
roslaunch realsense2_camera rs_camera_vins.launch 

image.png这三条命令需要特别注意第二条命令,我们可以看到yaml存在的路径很长,所以自然想到可以先进入到~/catkin_ws/src/VINS-Fusion/config/realsense_d435i目录下运行rosrun vins vins_node realsense_stereo_imu_config.yaml,但是这会报一个惊天大错,Assertion “!px=0” failed,如下图所示,
image.png这是一个智能指针错误,我一直以为和库的环境有关系,主要是被issue里一个大哥误导了,他说他重新安装了一个稳定的Eigen和Ceres就好了,但是我换了好几次有时候好使有时候不好使,卡了我两三天最后终于找到了这篇博客,大家可以点进去看看,在parameter.cpp中它规定的路径格式就是得带一个"/",所以前边至少带一个上级目录,这样就不会报错了,当然像这篇博客中把configpath和/删掉之后就可以直接运行rosrun vins vins_node realsense_stereo_imu_config.yaml了。
我们可以看到图中定位已经飞了,所以需要对相机进行标定,下篇进入相机标定。

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

2 用D435i运行VINS-fusion 的相关文章

  • Intel RealSense D435i 深度相机介绍

    参考 xff1a https www sohu com a 340984033 715754https www chiphell com thread 1945054 1 1 htmlhttps blog csdn net cherry y
  • 树莓派Raspberry Pi上安装intel realsense 深度摄像头D435i

    全部按照官方 xff1a https github com IntelRealSense librealsense blob master doc installation raspbian md 更新系统到最新 xff0c 然后再启动 x
  • realsense435i运行vins-mono,标定部分

    相机标定 1 安装kalibr xff1b 参考 xff1a https blog csdn net wangbaodong070411209 article details 112248834 https blog csdn net we
  • VINS-Mono跑Kitti数据集

    参考文章 xff1a VINS Mono KITT00 测试 知乎 如何在kitti raw data上跑起vins mono 知乎 实际上我参考的是LIO SAM里将KITTI转化为bag的方法 Debug https blog csdn
  • ubuntu20.04跑PL-VINS

    PL VINS源码 xff1a https github com cnqiangfu PL VINS 编译时报错 catkin make Ceres报错 报错信息 CMake Error at usr local lib cmake Cer
  • 在ubuntu20.04上配置VINS_Fusion(亲测有效,一应俱全)

    最近在做科研训练的时候配置了HKUST Aerial Robotics实验室的VINS Fusion代码项目 xff0c 经历了一些编译报错的问题 xff0c 在网上查找的时候博客内容良莠不齐 xff0c 且实质针对性意见不多 xff0c
  • VINS-MONO实践

    1 配置ros xff08 运行VINS需要 xff0c 记得换源 xff0c 会快一些 xff09 sudo apt get install ros melodic cv bridge ros melodic tf ros melodic
  • VINS-FUSION-GPU在jetson nx上的实现

    需要安装经过修改的Ubuntu18系统 https span class token operator span span class token comment developer nvidia com zh cn embedded do
  • TX2上布置vins_fusion_gpu指南

    1 参考链接 如果初次安装 xff0c 新的TX2环境 xff0c 请参考文档 https github com arjunskumar vins fusion gpu tx2 nano 2 问题记录 1 xff0c 自己的环境情况 我的环
  • 在TUMVI数据集上测试VINS-Fusion算法

    VINS Fusion算法是一个非常优秀的视觉惯性里程计 但原版VINS Fusion并没有提供与TUM数据集相应的配置文件 因此需要自己进行写yaml文件 修改配置文件 tum mono yaml span class token dir
  • RealSenseD435i (四):运行 VINS-mono代码

    一 必读博客 nbsp https blog csdn net hltt3838 article details 120691764 nbsp nbsp nbsp 一 https blog csdn net hltt3838 article
  • VINS-mono 解析 新特征

    在17 12 29 xff0c VINS更新了代码加入了新的特征 xff0c 包括map merge 地图合并 pose graph reuse 位姿图重利用 online temporal calibration function 在线时
  • VINS-Mono论文笔记(中)

    VINS Mono论文笔记 中 前言1 初始化过程1 1 视觉重构1 2 视觉惯性联合 2 紧耦合的单目VIO系统2 1 公式2 2 imu残差2 3 视觉残差2 4 边缘化残差2 5 针对相机实时帧率的纯运动视觉惯性状态估计器2 6 im
  • VINS记录

    euroc launch lt launch gt lt arg name 61 34 config path 34 default 61 34 find feature tracker config euroc euroc config
  • VINS-Mono学习(二)——松耦合初始化

    初始化 xff1a 如何当好一个红娘 xff1f 图解SfM 视觉和IMU的羁绊 怎么知道发生了闭环 xff1f 位姿图优化与滑窗优化都为哪般 xff1f 闭环优化 xff1a 拉扯橡皮条 整体初始化流程如下 xff1a 1 SFM纯视觉估
  • 【VINS论文翻译】VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator

    回到目录 写在前面 港科大的VINS Mono作为目前state of the art的开源VIO项目 xff0c 是研究视觉与IMU紧耦合的必读算法 xff0c 网上的论文解读与代码实现也非常丰富 xff08 感谢 xff01 xff09
  • Fusion Log Viewer 的替代品?

    除了 Fuslogvw exe 之外 是否还有其他 Fusion 日志查看器程序 或者将 Fusion 日志输出定向到您自己的目录 然后手动检查大量 HTM 文件 我的两个主要抱怨是 我想要一个概述 显示哪些程序集加载成功 哪些失败 我不确
  • CLR 何时尝试加载引用的程序集?

    我想编写一个小型安装程序应用程序来安装网站并创建 IIS 虚拟目录 该应用程序应在 Windows XP Server 2003 IIS 6 以及 Vista 2008 IIS 7 上运行 问题是 对于 IIS 6 我们通过调用 WMI M
  • 从 .Net v4.0 程序集链接到 .Net v2.0 程序集似乎也链接(和别名)mscorlib v2.0。为什么?

    我有一个 Net 程序集 它导入与 v2 0 运行时链接的程序集 我遇到的问题是 当我尝试在程序集上运行一些测试时 Fusion 尝试加载依赖程序集的错误版本 查看程序集清单后 我明白了原因 错误的版本FSharp Core已连接 在我的构
  • Java 流惰性 vs 融合 vs 短路

    我试图对 Java 流 API 中惰性求值的应用形成一个简洁而连贯的理解 目前我的理解是这样的 元素仅在需要时才被消耗 即流是惰性的 并且中间操作是惰性的 例如过滤器 仅在需要时进行过滤 中间操作可以融合在一起 如果它们是无状态的 短路操作

随机推荐

  • Github Clone: Connection closed by remote host

    现象 尝试克隆 Github 仓库时遇到了的报措 kex exchange identification Connection closed by remote host fatal Could not read from remote r
  • Git客户端的安装

    1 概述 Git有自带的命名行客户端 xff0c 也有自己的图形化客户端 xff0c 这个就是git exe 此外还有TortoiseGit 在这之上又封装了一层 xff0c 使我们用起来更加的方便 xff0c 这个跟TortoiseSVN
  • 13.查看docker容器状态

    1 docker下查看所有容器状态 xff1b docker ps a
  • 进入docker容器带特权(即可使用systemctl命令)

    1 进入docker容器带特权 xff08 即可使用systemctl命令 xff09 创建docker容器时即带特权参数 xff0c 例如 xff1a docker run itd name 61 nginx privileged 61
  • docker中拉取指定版本的镜像

    比如 xff1a docker pull mongo 3 2 4 dockre pull redis 3 2
  • H3C路由器命令查看arp表(mac与ip对应关系)

    用户模式或者全局模式下 命令 xff1a dis arp
  • kvm虚拟机利用virsh查看ip

    1 virsh dumpxml win7 grep mac 查看win7虚拟机mac 2 arp a 显示mac与ip对应关系 示例 xff1a root 64 localhost virsh dumpxml ubuntu yusen gr
  • python取文本中含有指定关键词的行

    python取文本中含有指定关键词的行 脚本内容 xff1a f 61 open 39 home py 9 txt 39 39 r 39 lines 61 f readlines for lines in lines if 34 EIPId
  • VSCode 快捷键

    VsCode可以通过以下快捷键 格式化代码 xff1a On Windows Shift 43 Alt 43 F 巨好用 xff01 有木有 xff01 QAQ xff09 On Mac Shift 43 Option 43 F 1 向上
  • 查看容器暴露的端口

    docker ps 查看运行中的容器 docker port c5b 查看容器c5b的端口状态 27017是容器端口 xff1b 0 0 0 0 37017是27017映射到宿主机上的端口
  • python元组实例

    脚本 xff1a usr bin python coding utf 8 names 61 34 kevin 34 34 liqunxing 34 34 chenxianan 34 print names 0 names 1 names 2
  • 机房温度告警

    https blog csdn net ot512csdn article details 80175323
  • k8s部署教程

    https mp weixin qq com s biz 61 MzI5MjA5Mjg5OA 61 61 amp mid 61 2247484395 amp idx 61 1 amp sn 61 0767cc24ec99ce818e41f7
  • Win10笔记本用雷电3接口外接显卡加速tensorflow深度学习步骤

    简介 xff1a 最近入手了一块rtx3060 xff0c 但自己的主力设备是笔记本 xff0c 于是萌生了通过外接显卡来加速深度学习的想法 xff0c 配置过程中遇到一些小问题 xff0c 经过调试最后解决了 xff0c 现在简单把整个过
  • 使用GitHub和DockerHub自动构建并发布镜像

    要使用自动构建 xff0c 必须在 Docker Hub 和GitHub上拥有一个帐户 首先登录您的Docker Hub账号 xff0c 创建一个Repository xff0c 创建类似如下页面 点击创建的Repository xff0c
  • 三 机器人仿真软件Gazebo介绍

    ROS教程 这是小弟的学习笔记 xff0c 有错求请拍 xff0c 多指教 xff0c 谢谢 三 机器人仿真软件Gazebo介绍 Gazebo功能 1 构建机器人运动仿真模型 在Gazebo里 xff0c 提供了最基础的三个物体 xff0c
  • Protobuf生成Go代码指南

    这个教程中将会描述protocol buffer编译器通过给定的 proto会编译生成什么Go代码 教程针对的是proto3版本的protobuf 在阅读之前确保你已经阅读过Protobuf语言指南 编译器调用 Protobuf核心的工具集
  • ROS sensor_msgs/LaserScan Message简单说明

    std msgs Header header float32 angle min 开始扫描角度 float32 angle max 结束扫描角度 float32 angle increment 每次扫描增加的角度 xff08 角度分辨率 x
  • 双系统Ubuntu分区

    假设整个空闲空间有200G xff0c 主要分4个区 xff1a 1 给系统分区EFI xff1a 在唯一的一个空闲分区上添加 xff0c 大小200M xff0c 逻辑分区 xff0c 空间起始位置 xff0c 用于efi xff1b 这
  • 2 用D435i运行VINS-fusion

    文章目录 1 VINS fusion的安装1 1 环境和依赖的安装1 2 编译VINS Fusion1 3 编译错误解决方法 2 VINS Fusion跑数据集3 用相机运行VINS Fusion 环境 xff1a Ubuntu20 04