Realsense D435i单目跑ORB_SLAM2(无ROS版)

2023-05-16

主要参考mono_euroc这个文件修改,把数据源改成realsense的就可以了。如何获取realsense数据,在之前的博客也阐述过。
Realsense D435i +Opencv 获取彩色、深度、IMU数据并对齐

首先先修改配置,在Example/Monocular下面创建一个D435i.yaml,把相机自身的内参写进去,格式可以参考Monocular文件夹里其他的yaml文件。

%YAML:1.0

#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------

# Camera calibration and distortion parameters (OpenCV) 
Camera.fx: 610.973
Camera.fy: 610.508
Camera.cx: 326.195
Camera.cy: 242.118

Camera.k1: 0.13200119
Camera.k2: -0.27231803
Camera.p1: 0.00148674
Camera.p2: -0.00158623

# Camera frames per second 
Camera.fps: 20.0

# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 1

#--------------------------------------------------------------------------------------------
# ORB Parameters
#--------------------------------------------------------------------------------------------

# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 1000

# ORB Extractor: Scale factor between levels in the scale pyramid 	
ORBextractor.scaleFactor: 1.2

# ORB Extractor: Number of levels in the scale pyramid	
ORBextractor.nLevels: 8

# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast			
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7

#--------------------------------------------------------------------------------------------
# Viewer Parameters
#---------------------------------------------------------------------------------------------
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1
Viewer.GraphLineWidth: 0.9
Viewer.PointSize:2
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
Viewer.ViewpointF: 500

然后再新建一个mono_d435i.cc文件。


#include<iostream>
#include<chrono>

#include <librealsense2/rs.hpp>
#include<opencv2/core/core.hpp>
#include<System.h>

using namespace std;
using namespace cv;

#define width 640
#define height 480
#define fps 30

bool SLAM_state  = false;


void enable_stream_init(rs2::config cfg)
{
    //Add desired streams to configuration
    cfg.enable_stream(RS2_STREAM_COLOR, width, height, RS2_FORMAT_BGR8, fps);//向配置添加所需的流
    cfg.enable_stream(RS2_STREAM_DEPTH, width, height, RS2_FORMAT_Z16,fps);
    cfg.enable_stream(RS2_STREAM_INFRARED, 1, width, height, RS2_FORMAT_Y8, fps);
    cfg.enable_stream(RS2_STREAM_INFRARED, 2, width, height, RS2_FORMAT_Y8, fps);
    cfg.enable_stream(RS2_STREAM_ACCEL, RS2_FORMAT_MOTION_XYZ32F);
    cfg.enable_stream(RS2_STREAM_GYRO, RS2_FORMAT_MOTION_XYZ32F);
}

//按下s结束
void Stop_thread()
{
    while(1)
    {
        char c = getchar();
        if (c == 's')
        {
            SLAM_state = false;
        }
        std::chrono::milliseconds dura(5);
        std::this_thread::sleep_for(dura);
    }
}


//字典 内参
int main(int argc, char **argv)
{
    if(argc != 3)
    {
        cerr << endl << "Usage: ./mono_tran path_to_vocabulary path_to_settings " << endl;
        return 1;
    }
    //vector<double> vTimestamps;

    // Create SLAM system. It initializes all system threads and gets ready to process frames.
    ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true);

    SLAM_state = true;

    //配置realsense
    rs2::context ctx;
    auto list = ctx.query_devices(); // Get a snapshot of currently connected devices
    if (list.size() == 0)
        throw std::runtime_error("No device detected. Is it plugged in?");
    rs2::device dev = list.front();

    rs2::frameset frames;
    //Contruct a pipeline which abstracts the device
    rs2::pipeline pipe;//创建一个通信管道//https://baike.so.com/doc/1559953-1649001.html pipeline的解释
    //Create a configuration for configuring the pipeline with a non default profile
    rs2::config cfg;//创建一个以非默认配置的配置用来配置管道
    enable_stream_init(cfg);
    // start stream
    pipe.start(cfg);//指示管道使用所请求的配置启动流
    for( int i = 0; i < 30 ; i ++)
    {
        frames = pipe.wait_for_frames();
    }

    cout << endl << "-------" << endl;
    cout << "Start processing sequence ..." << endl;

    thread stop_thread(Stop_thread);

    while(SLAM_state)
    {
        frames = pipe.wait_for_frames();//等待所有配置的流生成框架
        //   Align to color
        rs2::align align_to_color(RS2_STREAM_COLOR);
        frames = align_to_color.process(frames);
        // Get imu data
        //Get_imu_data(frames);

        //Get each frame
        rs2::frame color_frame = frames.get_color_frame();
        //rs2::depth_frame depth_frame = frames.get_depth_frame();
        //rs2::video_frame ir_frame_left = frames.get_infrared_frame(1);
       // rs2::video_frame ir_frame_right = frames.get_infrared_frame(2);

        // Creating OpenCV Matrix from a color image
        Mat color(Size(width, height), CV_8UC3, (void*)color_frame.get_data(), Mat::AUTO_STEP);
        double tframe = color_frame.get_timestamp();
        //Mat pic_right(Size(width,height), CV_8UC1, (void*)ir_frame_right.get_data());
        //Mat pic_left(Size(width,height), CV_8UC1, (void*)ir_frame_left.get_data());
        //Mat pic_depth(Size(width,height), CV_16U, (void*)depth_frame.get_data(), Mat::AUTO_STEP);
        //namedWindow("Display Image", WINDOW_AUTOSIZE );
        //imshow("Display Image", color);


#ifdef COMPILEDWITHC11
        std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
#else
        std::chrono::monotonic_clock::time_point t1 = std::chrono::monotonic_clock::now();
#endif
        SLAM.TrackMonocular(color,tframe);

        if(color.empty())
        {
            cerr << endl << "Failed to load image at: "
                 <<  tframe << endl;
            return 1;
        }

#ifdef COMPILEDWITHC11
        std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now();
#else
        std::chrono::monotonic_clock::time_point t2 = std::chrono::monotonic_clock::now();
#endif
        double ttrack= std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count();

        //TODO:检测跟踪时间
    }

    // Stop all threads
    SLAM.Shutdown();
    cout << "-------" << endl << endl;
    SLAM.SaveKeyFrameTrajectoryTUM("KeyFrameTrajectory.txt");

    return 0;
}

最后配置CMakeLists.txt。

找到这句话:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/Monocular)

在下面增加:

add_executable(mono_D435i
        Examples/Monocular/mono_D435i.cc)
target_link_libraries(mono_D435i ${PROJECT_NAME})

在上面增加:

find_package(realsense2 REQUIRED)   # 新增

在include_directories里增加:

${realsense2_INCLUDE_DIRS}

在target_link_libraries增加:

${realsense2_LIBRARY}

运行./bulid.sh

运行:

./Examples/Monocular/mono_D435i Vocabulary/ORBvoc.txt Examples/Monocular/Remote.yaml

实验效果:
在这里插入图片描述

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

Realsense D435i单目跑ORB_SLAM2(无ROS版) 的相关文章

  • gitbash执行不了npm scripts命令

    git bash执行npm scripts中的命令会直接报错 node 不是内部或外部命令 xff0c 也不是可运行的程序 我的解决办法是执行以下命令即可 xff1a npm config set script span class tok
  • vue/multi-word-component-names

    解决方法一 xff1a vue config js中添加一行 xff08 这种方式试完还是有报错显示 xff0c 但是项目可以运行 xff09 span class token keyword const span span class t
  • 将sql文件导入数据库时,报错Data truncated for column

    解决办法 打开my span class token operator span ini配置文件 将sql model中的 span class token constant STRICT TRANS TABLES span 去掉
  • HTTP响应码&接口定义

    span class token number 100 span span class token operator 61 span span class token operator gt span 39 span class token
  • 3.1AP_HAL(APM的硬件抽象层)

    前言 前段时间梳理了PX4IO以及PX4FMU的类 xff0c 但是还是没真正上去梳理到硬件框架上去 xff0c 这次直接开始梳理AP HAL框架 xff0c 从根本上去认识pixhawk在硬件框架上的实现 xff1b namespace
  • vue-element-admin执行npm install时的一些报错。

    文章目录 1 首先在gitee上拉取的中文版2 执行npm install的一些报错3 参考文章 1 首先在gitee上拉取的中文版 git clone b i18n https gitee com panjiachen vue eleme
  • vue-element-admin 代码格式化问题

    本地clone了vue element admin项目 xff0c 但是前端两个空格的缩进看着很不爽 xff0c 为了解决这个问题 xff0c 可以进行如下操作 首先我本地vscode使用的是prettier格式化 xff0c pretti
  • MySQL批量插入指定位数的随机数并且可以指定条数。

    SQL脚本 xff1a span class token comment 首先创建一个生成随机位数的函数 span span class token keyword DELIMITER span span class token keywo
  • php usort函数解析

    语法 usort array amp array callable cmp function bool 执行过程 usort函数调用自定义的排序函数对数组进行排序 排序函数会比较数组中的两个元素 xff0c 并返回它们的大小关系 usort
  • 如何在一台windows主机上搭建mysql主从配置

    转自 xff1a http www cnblogs com yuechaotian archive 2013 05 15 3080056 html 1 首先要在本地建立两个mysql服务 xff08 首先正常使用安装包安装第一个 xff0c
  • php设计模式

    php 设计模式 转自 https www cnblogs com siqi archive 2012 09 09 2667562 html 1 单例模式 单例模式顾名思义 xff0c 就是只有一个实例 作为对象的创建模式 xff0c 单例
  • PHP八大设计模式

    PHP命名空间 转自http blog csdn net flitrue article details 52614599 reload 可以更好地组织代码 xff0c 与Java中的包类似 Test1 php span class php
  • DataTables 详细设置(1)

    转自http blog csdn net arsiya jerry article details 50505294 并不是所有的后台开发都有美工和前端工程师来配合做页面 xff0c 为了显示数据并有一定的美感 xff0c jQuery的D
  • dataTables-使用详细说明整理

    转自 http blog csdn net mickey miki article details 8240477 本文共四部分 xff1a 官网 基本使用 遇到的问题 属性表 一 xff1a 官方网站 xff1a http www dat
  • 关于Xshell过期,需要采购问题

    1 卸载电脑中过期的xshell 2 http www netsarang com download free license html 去官网下载免费版 Home amp School 家庭和学校版本 注意邮箱要填写正确 填写完提交后会收
  • genromfs的使用及nuttx下romfs制作

    61 61 61 61 61 gt 我的博客目录导航 前言 这篇文章仅仅是为了记录如何使用genromfs制作romfs然后在nuttx上直接应用 xff0c 不会去详细介绍romfs的一系列特性 genromfs 首先去下载genromf
  • STM32智能小车系列教程(一)小车介绍及基本搭建

    大家收到小车包裹后 xff0c 想必都已经跃跃欲试了 xff0c 接下来关注我们的系列教程 xff0c 教你从零搭建一辆STM32F103智能小车 xff0c 本教程面向零基础 xff08 当然基本的单片机知识和C语言知识还是需要具备的 x
  • PHP上传图片 (从html到JS再到php onclick方式提交)

    1 首先form表单必须是post方式提交 xff0c 并且含有enctype 61 34 multipart form data 34 属性 如图 2 JS代码 利用formdata接收html中form表单的数据 利用append将其他
  • MongoDB Windows系统各个64位版本下载地址: http://dl.mongodb.org/dl/win32/x86_64

    MongoDB Windows系统各个64位版本下载地址 xff1a http dl mongodb org dl win32 x86 64
  • PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系

    看PostgreSQL9的官方文档 xff0c 我越看越迷糊 xff0c 这表空间 xff0c 数据库 xff0c 模式 xff0c 表 xff0c 用户 xff0c 角色之间的关系怎么在PostgreSQL里这么混乱呢 xff1f 经过中

随机推荐

  • 关于phpExcel的使用

    execl数据导出 应用场景 xff1a 订单导出 64 param string title 模型名 xff08 如Member xff09 xff0c 用于导出生成文件名的前缀 64 param array cellName 表头及字段
  • phpExcel的使用方法以及导入导出实例【转载】

    一 下载PHPExcel 下载地址 xff1a https github com PHPOffice PHPExcel 二 读取Excel文件内容插入数据库 lt php require once 39 Classes PHPExcel p
  • 关于git 、初识git (fatal: Not a valid object name: 'master'.)

    主要错误原因是因为没有master分支 必须要commit一次 才可以有master分支 才可以创建别的分支 具体步骤 1 打开命令行 git add index html 2 git commit m 34 this is a test
  • 关于git的使用

    查看https blog csdn net qq 42072311 article details 80696886 https blog csdn net kevindgk article details 51606925 查看这两个博客
  • php使用upload封装类上传文件

    原文https blog csdn net navioo article details 51777799
  • phpStorm2018安装与破解(免安装打包版)

    首先将我为大家事先准备好的打包文件拷贝至软件安装盘 xff0c 本人安装于D盘 xff0c 所以这里已本人安装破解的过程进行讲述 1 gt phpStorm2018 2 2下载请转至链接 https pan baidu com s 1Kno
  • 最简洁的麦克纳姆轮原理与控制方法

    最简洁的麦克纳姆轮控制原理与控制方法 0 写在前面 对于第一次接触麦轮的小伙伴们肯定是没办法十分清晰地想象出麦轮底盘的各种运动该如何控制的 而在实际使用中 xff0c 麦轮的运动灵活性与控制难度之比又非常高 xff0c 可以说是在比较平整的
  • Nuttx下移植uorb笔记

    Nuttx下移植uorb笔记 之前接触过ros下的消息机制 xff08 生产者 消费者 xff09 模型 xff0c 第一感觉是灵活好用 xff0c 但是在资源有限的嵌入式环境里面 xff0c 邮箱 消息 显得就有点不那么灵活 xff0c
  • 关于ADRC算法以及参数整定(调参)的一些心得体会

    关于ADRC算法以及参数整定 xff08 调参 xff09 的一些心得体会 ADRC xff0c 全称叫做Active Disturbance Rejection Control xff0c 中文名是自抗扰控制技术 这项控制算法是由中科院的
  • boa-0.94.13:CGI中文问题

    为什么中文乱码 用win7 自带的浏览器ie 打开服务器的cgi form html xff0c 在Name 输入框输入 汉字 两个字 xff0c 提交服务器 如图1 图1 返回的是结果为 xff1a Server Got you para
  • 跑通VINS-Fusion全流程

    跑通VINS Fusion全流程 常规安装步骤详见官方1 ROS安装2 ceres solver安装3 VINS Fusion安装4 KITTI数据集下载5 跑通KITTI数据集 常规安装步骤详见官方 https github com HK
  • 带GPS的SLAM数据集汇总

    1 带GPS的相关SLAM数据集 Kitti 部分带部分不带 xff0c 看网站写的很详细 xff0c 数据集很常用 http www cvlibs net datasets kitti eval odometry php CMU Visu
  • 跑通GVINS——港科大新作

    跑通GVINS 港科大新作 0 简介1 环境2 跑通GVINS3 数据集4 相关资料打包下载 xff08 不包括数据集 xff09 6 泡泡机器人解读 港科大又一力作 xff01 vins mono以及vins fusion升级版GVINS
  • GVINS文章暴力翻译(仅供自学)

    GVINS文章暴力翻译 xff08 仅供自学 xff09 摘要1 介绍2 相关工作3 符号和定义A 框架b 状态 4 GNSS基本介绍A GNSS 概述B 伪距测量C 多普勒测量D SPP算法 5 系统概述6 概率公式A 地图估计B 惯性因
  • Vins-fusion用到的kitti数据集轨迹对不齐,使用evo -a转换

    kitti数据集基准问题 下面两个图一个是转换前 xff0c 一个是evo a 转换后的 问题描述 xff1a 现在遇到的问题是groundtruth和估计的位姿没有在一个坐标系中 xff0c 生成的轨迹对不齐 xff0c 需要首先根据位姿
  • 怎样用美图秀秀制作一寸照片

    有些时候 xff0c 老是会埋怨自己的http jingyan baidu com article 73c3ce28c852b7e50243d945 html证件照很难看 xff0c 自己拍的照片又不合格 xff0c 该怎么办呢 这里和大家
  • Realsense D435i关闭IR结构光

    Realsense D435i 关闭IR光 前言环境一次性关闭IR光从源码修改 前言 由于要做Realsense D435i的双目结构光相机标定 xff0c 其中用到了ROS来录制数据包 xff0c 但是结构光会影响标定 xff0c 所以得
  • vins-mono保存、重载地图、evo工具测试

    vins mono保存 重载地图 evo工具测试 地图保存与加载先跑起来修改地图保存的路径保存地图重载地图 evo测评evo工具修改数据格式使用evo绘制轨迹与双目ORB SLAM2进行对比 下面咱们来对vins mono地图进行简单测试
  • C++11新特性简介

    目录 功能扩展与增强 右值概念 类中右值扩展 标准库中右值扩展 内联命名空间 初始化 initialzier list 原始字符串 自定义字面值 类型自动推导 auto decltype 常量表达式函数constexpr 变长模板 空指针n
  • Realsense D435i单目跑ORB_SLAM2(无ROS版)

    主要参考mono euroc这个文件修改 xff0c 把数据源改成realsense的就可以了 如何获取realsense数据 xff0c 在之前的博客也阐述过 Realsense D435i 43 Opencv 获取彩色 深度 IMU数据