ORB-SLAM2在window下的配置 (7)[END]

2023-05-16

部署ORB-SLAM2


此系列博客终于接近尾声,走过前方配置依赖库的漫漫长路,我们终于要来部署ORB-SLAM2了!

ORB-SLAM2源码下载:https://github.com/raulmur/ORB_SLAM2

这一次,我们不再用CMake配置工程,我们手动新建一个vs工程,就称为ORB-SLAM2吧,将下载好的源码放在同个目录下,然后右键项目->添加现有代码,将头文件和源文件全部添加进来

此时随便打开一个.cpp来查看,include头文件那里都会有错,我们需要配置一下属性表。将之前制作的几个依赖库的属性表(OpenCV、Pangolin、DBoW2、Eigen3、g2o)添加到Release x64文件夹下,顺便将编译模式调为Release x64.别忘了,要将关于g2o和DBoW2的头文件都改掉,用尖括号来使用它们。

如果你还看到你的ORB-SLAM2头文件有错,多半是你没把源文件和头文件放在同个目录下(我也不喜欢这么做),这个时候可以右键项目->属性->VC++目录->包含目录,为其添加头文件目录,建议使用相对路径。

好了,先什么都不做,编译一下看看吧。不出意外的话,没有报依赖库的错误,而有不少ORB-SLAM2的错误:

  1. 表达式必须含有常量值
  2. 不可指定数组类型 float[N][N]
  3. “usleep”找不到标识符
  4. 表达式计算结果不是常数
  5. 无法打开“sys/time.h”
  6. 无法打开“stdint-gcc.h”
  7. std::vector<int,std::allocator<_Ty>>::vector: 对重载函数的调用不明确

我们来逐一解决,首先,错误1、2是同一种问题,就是使用变量去定义一个数组大小,这在C++标准下是不允许的,但gcc编译器对此支持,想必也是做了转换,我们只要将数组定义的时候用new关键字来定义就好了,如:

// float Distances[N][N];
// 改为:
float ** Distances = new float*[N];
for (int i = 0; i < N; i++)
    Distances[i] = new float[N];
// 记得用完之后回收内存
delete[] Distances;

第三个错误,usleep是linux下的函数,参数是微秒数,我们可以用以下语句替换:

#include <thread>
// 设参数为m微秒
std::this_thread::sleep_for(std::chrono::microseconds(m));

第四个错误,用变量初始化const变量,显然不是c++标准,gcc编译器支持它完全从程序员的角度来考虑的,我们将const关键字删除即可。

第五个错误,跳转到那里可以发现该头文件包含语句为_WINDOWS未定义的预处理器块中,该头文件是linux下的,我们不应该使用它。右键项目->属性->C++->预处理器->预处理器定义,新加一变量:_WINDOWS.

第六个错误,该头文件为gcc编译器的,我们这里一样用不到,把它删了就行。

第七个错误暂时不管,我们先编译一下,会发现,这个错误神奇般地消失了。不过出现了个新的棘手错误:C1001,编译器内部错误。。。
问题代码是:

// sparse_block_matrix.hpp,277行,g2o
internal::axpy(*a, srcVec, srcOffset, destVec, destOffset);
if (destOffset < srcOffset)
   internal::atxpy(*a, srcVec, destOffset, destVec, srcOffset);

好吧,又是你这个该死的函数。vs表示看不懂,我们只能进一步给它解释,将代码改成如下所示:

internal::template axpy<typename SparseBlockMatrix<MatrixType>::SparseMatrixBlock>(*a, srcVec, srcOffset, destVec, destOffset);
if (destOffset < srcOffset)
    internal::template atxpy<typename SparseBlockMatrix<MatrixType>::SparseMatrixBlock>(*a, srcVec, destOffset, destVec, srcOffset);

改完编译一下,不出意外,还有一个地方要改:

// sparse_block_matrix_ccs.h,125行:
// internal::atxpy(*a, srcVec, srcOffset, destVec, destOffset);
// 改成:
internal::template atxpy<SparseMatrixBlock>(*a, srcVec, srcOffset, destVec, destOffset);

再编译,又出错:

// sparse_block_matrix_diagonal.h,97行:
// internal::axpy(A, srcVec, srcOffset, destVec, destOffset);
// 改成:
internal::template axpy<SparseMatrixBlock>(A, srcVec, srcOffset, destVec, destOffset);

其实我们又花了一些力气在修改g2o。再次编译,这一次终于没问题了,终于到了链接这一步,出现了链接错误:

  1. LNK2038 检测到“RuntimeLibrary”的不匹配项
  2. LNK2001 无法解析的外部符号 main

我们一个个解决,首先第一个问题,还记得是谁的锅吗?没错,就是pangolin的,当然如果你生成pangolin的时候已经把代码生成由Mt改为Md,那就没事了,我是保持默认,现在的解决方法是:右键项目->属性->C++->代码生成->运行库,从Md改成Mt.

第二个问题,我们似乎还没写main函数吧,我们可以添加一个main.cpp文件,增加以下代码:

#include "System.h"
using namespace ORB_SLAM2;

int main()
{
    System orbslam("../Run/Vocabulary/ORBvoc.txt", "../Run/Setting/KITTI03.yaml", System::eSensor::STEREO);
    system("pause");
    return 0;
}

注意到,头文件设置因人而异,我已经把头文件所在的目录加在了项目VC++目录中,所以这写就没问题。字典和设置文件的放置我们也会有所不同,代码仅供参考,不可照搬。

好了,现在再编译一遍,惊喜地发现,已经生成exe了!现在为其配置运行环境,右键项目->属性->调试->调试,给它如下的值(仅供参考)

path=D:/Packages/DBoW2/lib/;D:/Packages/g2o_orbslam/lib/;D:/Packages/Pangolin/lib/;D:/Packages/OpenCV3_1/opencv/build/x64/vc14/bin/;

运行一下,期盼已久的界面终于出现了!
成功

好了,我的第一个系列的博客到此结束,希望大家多多指教,如果有更加方便的配置方法,敬请留言相告,多谢!


补充:我已经把这个系列的完整工程上传到了:http://download.csdn.net/detail/yfic000/9913200
有兴趣的同学可以下载来看看,我已经把所有的第三方库部署在工程目录下,所有的路径全部配置成了相对路径,工程使用vs2017可以直接打开编译。注意的是,opencv本来有debug的库,我为了节省空间,把它删掉了。如果有什么问题,欢迎留言。

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

ORB-SLAM2在window下的配置 (7)[END] 的相关文章

  • 检查窗口是否在后台 Tkinter

    所以 我正在尝试制作一个应用程序tkinter 我刚刚开始学习这个模块的工作原理 在我的应用程序中 我有一个根窗口和一个子 顶级 窗口 并且我将子窗口设置为始终位于顶部 当我最小化根窗口时 子窗口也会最小化 因为我已经定义了该条件 我的问题
  • 当 showdialogwindow 阻止我尝试访问的窗口时,是否有一个事件或我可以使用的东西

    我有 2 个窗户 我们称他们为 A 和 B A 使用 ShowDialog 打开 B 所以我正在打开 B 当用户最小化 B 或以某种方式将其放入后面并尝试再次单击窗口 A 时 它会被阻止 应该如此 但是当发生这种情况时 是否有一个我可以赶上
  • X11:列出顶级窗口

    到目前为止我发现了两种方法 对于每个根窗口 默认屏幕 特定屏幕 所有屏幕等 列出每个直接子窗口 递归地搜索每个直接子窗口以查找窗口WM STATE财产 该窗口成为直接子窗口的顶级应用程序窗口 并且所有递归都可以停止 如果直接子级的层次结构中
  • 使用 css 媒体查询触发 jquery

    我在我的项目中使用 css 媒体查询来创建一个适用于任何尺寸屏幕的网站 我希望触发不同的 jquery 函数 就像使用 css 一样 例如 如果浏览器尺寸在1000px到1300px之间 我想调用以下函数 mycarousel jcarou
  • ORB 计算错误:它删除了小图像的所有关键点

    我有一个 50x50 的小图像 我找到 ORB 关键点 请注意 我必须将 patchSize 的默认参数从 31 更改为 14 才能检测到一些关键点 OrbFeatureDetector det 500 1 2f 8 14 0 2 0 14
  • ios 访问主窗口或视图

    我想知道是否有一种简单的方法可以访问 IOS 中的主窗口或视图 类似于 UIScreen mainScreen 谢谢 Try UIWindow frontWindow UIApplication sharedApplication wind
  • 窗口调整大小指令

    我试图在窗口调整大小时调整 div 大小 环顾四周后 似乎使用指令是最好的解决方案 模板 div div 指示 myApp directive elheightresize window function window return lin
  • 如何将 shm pixmap 与 xcb 一起使用?

    我尝试学习如何使用 xcb 库中的共享内存像素图 你们中有人有这方面的经验并想分享示例代码和 或信息吗 这会很有帮助 Thanks 经过一些研究 我发现了如何在 xcb 中使用共享内存像素图 这是我的测试代码 include
  • 为什么我设置xlib窗口背景透明失败?

    我使用以下代码获得透明窗口 但它返回黑色 我出了什么问题 并且 任何人都可以给我一个简单的例子来创建具有透明背景的窗口吗 谢谢 include
  • 在WPF中使用动画改变窗口大小

    我正在寻找一种方法来动画调整窗口大小 假设我有一个高度 300和宽度 300的窗口 我有2个按钮 当我单击第一个按钮时 窗口大小必须更改为高度 600并且宽度 600 当我单击另一个按钮时 窗口大小必须恢复到原始大小 我可以简单地更改高度和
  • WPF 将窗口标题绑定到属性

    我试图绑定从 Window 派生的类 MainWindow 的属性 MyTitle 的值 我创建了一个名为 MyTitleProperty 的依赖属性 实现了 INotifyPropertyChanged 接口并修改了 MyTitle 的
  • 使用 php 创建一个 javascript 警报,其中包含 php 变量?

    我正在制作一个表单 当某些字段未填写或填写正确时 该表单应该创建一个 javascript 警报 我希望能够获取放入 php 变量中的错误消息并将其显示在 javascript 警报窗口中 以下代码不起作用 function died er
  • 每个版本的 IE 在新窗口中打开链接

    我一直在设计一个网站 并使用 Safari 和 Chrome 进行大部分测试 我刚刚尝试测试 Firefox 也很顺利 让 IE 来解决吧 由于某种原因 对于从 IE 6 到 IE 10 的每个版本 每个链接都会打开一个新窗口 在 IE 1
  • 如何在.NET 中获取当前窗口句柄计数和窗口句柄限制?

    我想在C 中获取当前窗口句柄数和系统范围的窗口句柄限制 我该怎么办 如果你读过 Raymond Chen 的帖子 你可能会像我一样觉得它很烦人 您只是 可能做错了什么 因为您正在做 Windows 无法完成的事情 在我的应用程序中 当用户第
  • 如何让编译日志在Emacs中创建一个新窗口?

    如果我在 emacs 中只显示一个窗口并使用 M x 编译 则该窗口会一分为二 我可以轻松查看编译缓冲区 但是 如果我显示更多窗口 编译日志就会接管其他窗口之一 这让我感到恼火 如何让emacs始终分割一个新窗口来显示编译日志 编辑 从我一
  • 来自静态资源的 Wpf 窗口标题

    我正在使用资源字典进行本地化 我在 wpf 中有以下代码
  • 如何正确处理在node-webkit中打开_blank窗口的链接?

    我正在尝试使用new win policy事件来处理打开新窗口的链接点击 https github com rogerwang node webkit wiki Window new win policy https github com
  • screen.availHeight 和 window.height() 之间的区别

    我正在我的浏览器 Firefox 上执行以下 Javascript console debug 屏幕高度 屏幕可用高度 输出770 console debug 窗口高度 窗口 height 输出210 我也在使用 jQuery 两者有什么区
  • 在新选项卡或窗口中打开链接[重复]

    这个问题在这里已经有答案了 是否可以开一个a href链接在新选项卡而不是同一选项卡中 a href http your url here html Link a 您应该添加target blank and rel noopener nor
  • .NET WPF 窗口淡入和淡出动画

    下面是窗口淡入和淡出动画的代码片段 Create the fade in storyboard fadeInStoryboard new Storyboard fadeInStoryboard Completed new EventHand

随机推荐

  • Phaser入门教程

    入门教程 xff0c 我可不会讲什么概念 xff0c 我只会讲一个入门例子 xff0c 通过这个例子 xff0c 你就知道 phaser有多么强大 xff0c 而照着这个例子做 xff0c 你就能知道怎么使用 phaser了 需要说明的是
  • IDEA插件activiti工具actiBPM

    最新的IDEA中Marketplace搜索不到actiBPM xff08 2020 2 xff09 离线安装 下载https plugins jetbrains com 选择版本 导入jar 重启IDEA 验证 右键新建 表明添加成功 使用
  • 【内推找我】阿里社招面试16轮,终于拿到offer(2020年2月更新)

    内推私信我 xff0c 标题党了 xff0c 其实是这么回事 一 背景及原因 个人背景 xff1a 17年普本毕业Java开发 想换工作原因 xff1a 19年7月公司裁员了一波 xff0c 内部较动荡 xff0c 想看看外面机会 xff1
  • MPU6050介绍及姿态解算

    1 介绍 xff1a MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件 xff0c 相较于多组件方案 xff0c 免除了组合陀螺仪与加速器时之轴间差的问题 xff0c 减少了安装空间 xff08 1 x
  • 网络编程——Socket(套接字)

    网络编程 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯 网络编程中 有两个主要的问题 xff0c 一个是如何准确的定位网络上一台或多台主机 xff0c 另一个就是找到主机后 如何可靠高效的进行数据传输 在TCP IP协议
  • 【Linux 驱动】netfilter/iptables (三) 注册和注销Netfilter hook

    继前面介绍了 netfilter hook xff0c 这里我们开始进行简单的实例讲解 xff0c 主要是Netfilter hook的注册与注销 xff1a wqlkp c xff1a span class hljs preprocess
  • Uboot网络设备驱动(一)---两种连接架构

    本系列将针对NXP的s32v234芯片及s32v234evb开发板讲解Uboot中网络相关的设备驱动程序 本文前提是你有基本的计算机网络知识 xff08 TCP IP协议及OSI ISO七层网络协议 xff09 一般BSP工程师涉及的主要工
  • ESP8266物联网远距离控制实现

    ESP8266物联网远距离控制实现 转载请注明出处 xff01 重要的事情放在前面源码在GitHub上面欢迎issue xff0c 如果可以的话Star一下也是表示对作者的支持 有很多不足 xff0c 希望可以得到指教 https gith
  • JACK报错(Ensure Jack server is installed and started)&多用户编译

    目录 报错内容 报错原因 解决方法 备注 报错内容 20 4823 23656 Ensure Jack server is installed and started FAILED bin bash c 34 prebuilts sdk t
  • linux常用命令

    linux常用命令 pwd 查看当前工作目录的绝对路径 cat input txt 查看input txt文件的内容 cat v input txt 查看input txt文件的编码格式 sed
  • UML中类的关系:关联关系、聚合关系、依赖关系、泛化关系、实现关系

    一 关联关系 关联关系是一种结构化的关系 xff0c 指一种对象和另一种对象有联系 给定关联的两个类 xff0c 可以从其中的一个类的对象访问到另一个类的相关对象 在UML图中 xff0c 关联关系用一条实线表示 另外 xff0c 关联可以
  • 互补滤波

    互补滤波 加速度计对小车的加速度比较敏感 xff0c 取瞬时值计算倾角误差比较大 xff1b 而陀螺仪积分得到的角度不受小车加速度的影响 xff0c 但是随着时间的增加积分漂移和温度漂移带来的误差比较大 所以这两个传感器正好可以弥补相互的缺
  • Linux 网络通讯 : smbclient 命令详解

    smbclient命令属于samba套件 xff0c 它提供一种命令行使用交互式方式访问samba服务器的共享资源 语法 smbclient 选项 参数 选项 B lt ip地址 gt xff1a 传送广播数据包时所用的IP地址 xff1b
  • 云计算的三种部署模式:公有云、私有云、混合云

    随着云时代的到来 xff0c 慢慢的演化出了更有针对性的产品服务 xff0c 公有云 xff0c 私有云 xff0c 混合云 那么这三者之间有什么区别呢 xff1f 我们用打比方的方式来说明 例如我们来到一个城市需要睡觉 xff0c 就要去
  • 机器学习之随机森林(sklearn)

    文章目录 1 概述1 1 集成算法的概述1 2 sklearn中的集成算法 2 RandomForestClassfier2 1 重要参数2 1 1 控制基评估器的参数2 1 2 n estimators2 1 3 random state
  • AM5728 高性能计算(并行计算)OpenCL/OpenMP简介及测试

    一 OpenCL OpenMP简介 OpenCL Open Computing Language 是一个为异构平台编写程序的框架 xff0c 属于API xff0c 和OpenGL架构类似 xff0c 此异构平台可由CPU xff0c GP
  • Linux线程调度

    对于一个嵌入式多任务 多线程操作系统 xff0c 所启动的应用进程至少拥有一个线程或多个线程 xff0c 线程在进程中执行代码 一个进程能够 同时 运行多个线程 xff0c 同时 加上引号 xff0c 因为实际上 xff0c 在单处理CPU
  • /usr/bin/xauth: file /.../.Xauthority does not exist

    继我这篇博客解决了x11forwarding问题 xff0c 安装了xorg x11 xauth后 xff0c 又出现了新问题 xff0c Xauthority does not exist xff0c 真是够了 https blog cs
  • ORB-SLAM2在window下的配置 (4)

    配置DBoW2 接下来谈一谈DBoW2的配置 xff0c 难度稍微大一点点 xff0c 它存在于ORB SLAM2的源码中 xff0c 其作者也说了 xff0c 它跟g2o一样都被修改过了 xff0c 所以我们还是直接用ORB SLAM2自
  • ORB-SLAM2在window下的配置 (7)[END]

    部署ORB SLAM2 此系列博客终于接近尾声 xff0c 走过前方配置依赖库的漫漫长路 xff0c 我们终于要来部署ORB SLAM2了 xff01 ORB SLAM2源码下载 xff1a https github com raulmur