Ubuntu20.04下编译安装ORBSLAM2_with_pointcloud_map总结

2023-05-16

与此物大战六个小时,终于解决所有问题,写此短文记录一下。

一、在github上下载源码后,解压缩,如下

  1. 进行g2o_with_orbslam2的编译

(1)报错信息:

ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/types/slam2d/edge_se2_pointxy_bearing.cpp: In member function ‘virtual void g2o::EdgeSE2PointXYBearing::initialEstimate(const VertexSet&, g2o::OptimizableGraph::Vertex*)’:

/home/robot/g2o/g2o/types/slam2d/edge_se2_pointxy_bearing.cpp:50:52: error: no matching function for call to ‘g2o::SE2::setRotation(Eigen::Rotation2D::Scalar)’

t.setRotation(t.rotation().angle()+_measurement);

处理方法:

In g2o/types/slam2d/edge_se2_pointxy_bearing.cpp

change:

t.setRotation(t.rotation().angle()+_measurement);

to

t.setRotation((Eigen::Rotation2Dd)(t.rotation().angle()+_measurement));

(2)报错信息:

/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:32: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY

#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);

处理方法:

打开g2o/solvers/linear_solver_eigen.h,将以下代码:

template

class LinearSolverEigen: public LinearSolver

{

public:

typedef Eigen::SparseMatrix<double, Eigen::ColMajor> SparseMatrix;

typedef Eigen::Triplet Triplet;

typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, SparseMatrix::Index> PermutationMatrix;

改成

template

class LinearSolverEigen: public LinearSolver

{

public:

typedef Eigen::SparseMatrix<double, Eigen::ColMajor> SparseMatrix;

typedef Eigen::Triplet Triplet;

typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, int> PermutationMatrix;

(3)报错信息:

MatrixExponential’ is not a member of ‘Eigen’

处理方法:打开g2o/examples/target/continuous_to_discrete.h

// bigB = expm(bigA)

//Eigen::MatrixExponential me(bigA);

//me.compute(bigB);

bigB = bigA.exp();

前三行代码注释掉,添加最后一行

(4)报错信息:

ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/examples/tutorial_slam2d/simulator.cpp:80:39: required from here

/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:32:40: error: static assertion failed: FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED

#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);

处理方法:

打开g2o/g2o/examples/tutorial_slam2d/simulator.cpp:80行

VectorXd probLimits(MO_NUM_ELEMS);

改为

VectorXd probLimits; probLimits.resize(MO_NUM_ELEMS);

到此,g2o编译完成。

二、接着,进行源码编译,进入ORB_SLAM2_modified文件夹

  1. 我在直接执行build.sh时,出现bug(各种库版本问题,如opencv和pcl,按照我的方法可以解决这些问题),所以自行编译安装了

首先需要在Cmakelist。txt里把opencv版本要求注释掉,在添加位C++14编译,在第四行

由于build.sh始终编译不过,故放弃,选择自己编译

mkdir build
cd build
cmake ..
make
  1. 编译过成中出现诸多错误,一一列举出来

(1)g2o编译出错(在src下Optimizer.cc下有三处错误,错误原因一致,一一修改即可)

如error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType*&)’

解决方法:

(I)

//g2o::BlockSolver_6_3 * solver_ptr = new g2o::BlockSolver_6_3(linearSolver); // line 356

g2o::BlockSolver_6_3 * solver_ptr = new g2o::BlockSolver_6_3(std::unique_ptr<g2o::BlockSolver_6_3::LinearSolverType> (linearSolver));

//g2o::OptimizationAlgorithmLevenberg * solver = new g2o::OptimizationAlgorithmLevenberg(solver_ptr); // line 357

g2o::OptimizationAlgorithmLevenberg * solver = new g2o::OptimizationAlgorithmLevenberg(std::unique_ptr<g2o::BlockSolver_6_3> (solver_ptr));

(II)

//g2o::BlockSolver_7_3 * solver_ptr = new g2o::BlockSolver_7_3(linearSolver); // line 356

g2o::BlockSolver_7_3 * solver_ptr = new g2o::BlockSolver_7_3(std::unique_ptr<g2o::BlockSolver_7_3::LinearSolverType> (linearSolver));

//g2o::OptimizationAlgorithmLevenberg * solver = new g2o::OptimizationAlgorithmLevenberg(solver_ptr); // line 357

g2o::OptimizationAlgorithmLevenberg * solver = new g2o::OptimizationAlgorithmLevenberg(std::unique_ptr<g2o::BlockSolver_7_3> (solver_ptr));

(III)

//g2o::BlockSolverX * solver_ptr = new g2o::BlockSolverX(linearSolver);

g2o::BlockSolverX * solver_ptr = new g2o::BlockSolverX(std::unique_ptr<g2o::BlockSolverX::LinearSolverType> (linearSolver));

//g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg(solver_ptr);

g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg(std::unique_ptr<g2o::BlockSolverX> (solver_ptr));

(2)编译Example下的例程出错,根据提示可知

分别进入各个报错源文件,按照上图所示一一进行修改即可

  1. 到此,编译问题解决,可以直接运行代码看效果了

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt  Examples/RGB-D/TUM1.yaml data1/rgbd_dataset_freiburg1_xyz/ Examples/RGB-D/associations.txt 

(1)发现viewer界面是黑的,由此,修改代码

在ORB_SLAM2_modified/include/Tracking.h添加

    // Current Frame
    Frame mCurrentFrame;
    cv::Mat mImRGB; //添加这行
    cv::Mat mImGray;
    cv::Mat mImDepth;

在ORB_SLAM2_modified/src/Tracking.cc修改2处

cv::Mat Tracking::GrabImageRGBD(const cv::Mat &imRGB,const cv::Mat &imD, const double &timestamp)
{
    mImRGB = imRGB;//添加这行
    mImGray = imRGB;
    mImDepth = imD;

第二处

    // insert Key Frame into point cloud viewer
    //mpPointCloudMapping->insertKeyFrame( pKF, this->mImGray, this->mImDepth );
    mpPointCloudMapping->insertKeyFrame( pKF, this->mImRGB, this->mImDepth ); //修改地方

如果修改这些还不能显示,可以试着滑动鼠标滚轮,把点云缩小,即可显示

(2)保存彩色点云地图

修改ORB_SLAM2_modified/src/pointcloudmapping.cc,在其中调用 PCL 库的pcl::io::savePCDFileBinary函数就可以保存点云地图了

加入头文件

#include <pcl/io/pcd_io.h>

在 void PointCloudMapping::viewer() 函数中( 123 行附近)加入保存地图的命令,最后样式如下:

...
for ( size_t i=lastKeyframeSize; i<N ; i++ )
{
    PointCloud::Ptr p = generatePointCloud( keyframes[i], colorImgs[i], depthImgs[i] );
    *globalMap += *p;
}
pcl::io::savePCDFileBinary("vslam.pcd", *globalMap);   // 只需要加入这一句
...

修改之后重新编译程序

并且安装相应的工具,就可以查看生成的文件

#安装
sudo apt-get install pcl-tools
#查看
pcl_viewer vslam.pcd

大功告成!!!!

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

Ubuntu20.04下编译安装ORBSLAM2_with_pointcloud_map总结 的相关文章

  • STL——map、set等红黑树结构的最后一个元素

    map set等背后由于红黑树的关系 插入元素后便成为 平衡 搜索树了 所以末尾元素默认为最大值 得到该值的方法 1 利用 rbegin 反向迭代器 int main int argc char argv map
  • 正确使用STL-MAP中Erase函数 一切尽在代码中。

    include
  • Kotlin常用的高阶函数(ForEach、Map、Flatmap、Fold、Reduce......)

    一 ForEach 类型于Java的传统的写法 package net println kotlin chapter5 builtins author wangdong description Kotlin常见的高阶函数 fun main
  • vue-cli3.0引入高德3d动画效果方法一:

    前言 因为两个方法代码量都特别大 这里分2个页面详细说一下 这个页面是方法一 包括vue cli3 0中使用和html中使用两种示例 注意 这里有想看另一种方法的童鞋请点入口 https blog csdn net qq 41619796
  • STL:map

    首先包含头文件 include
  • ORB_SLAM2 with XTION的编译问题(1)

    ORB SLAM2 with XTION的编译问题及解决 1 源链接为https github com chaizheng2157 RGBD ORB SLAM2 RT 其中里面有两个包要编译 分别是g2o with orbslam2和ORB
  • JavaScript学习笔记(11) map、reduce

    map map 方法定义在JavaScript的Array中 调用Array的map 方法 传入我们自己的函数 就可以得到结果 来一个例子 use strict function pow x return x x var arr 1 2 3
  • Map 和 Set 使用的区别和联系(建议收藏)

    我是目录 1 搜索 1 概念及场景 2 模型 2 Map 的使用 3 Set 的使用 表现 两个接口 Set 和 Map 接口 1 搜索 1 概念及场景 Map 和 set 是一种专门用来进行 搜索的容器 或者 数据结构 其搜索的效率与其具
  • Python 的 map、列表推导、循环效率比较

    话不多说 直接上代码 1 准备数据 三个列表 import time x x1 x2 for i in range 1000000 x append i x1 append i x2 append i 2 开始表演 2 1 for循环 st
  • 【 C++ 】map、multimap的介绍和使用

    目录 1 map map的介绍 map的定义 insert插入函数 map的迭代器 运算符重载 find查找函数 erase删除函数 其它函数 总结 2 multimap multimap的介绍 multimap的使用 1 map map的
  • LinkedHashMap和LinkedHashSet 转来记录

    LinkedHashMap和LinkedHashSet是JDK 1 4中引入的两个新的集合类 虽然已经过去 年了 但我敢打赌并不是很多人都用过 因为我就没有用过 但这两个类在某些情况下还是非常有用的 过去没有用 现在没有用 都没有关系 但还
  • 微信小程序开发——map地图组件,定位,并手动修改位置偏差。

    环境搭建 注册 获取APPID 没有这个不能真鸡调试 下载微信web开发者工具 挺多bug 将就用 打开微信web开发者工具 扫码登录 新建小程序 输入APPID 勾选创建quick start项目 工程结构 可以看到工程根目录中有个app
  • 理解目标检测当中的mAP

    我们在评价一个目标检测算法的 好坏 程度的时候 往往采用的是pascal voc 2012的评价标准mAP 网上一些资料博客参差不齐 缺乏直观易懂的正确说明 希望这篇博文能够给大家一点帮助 mAP历史 目标检测的mAP计算方式在2010年的
  • C++ auto遍历无法直接修改map的数据

    对于std map 当使用for auto it myMap 这种范围循环形式时 实际上是使用了const迭代器进行遍历 这意味着你无法通过该迭代器直接修改std map中的值 范围循环使用的是容器的begin 和end 函数返回的迭代器
  • 怎样为std::map的自定义key提供比较操作(一)

    stl的关联容器 map set 的key一般要求提供 lt 比较操作 假设我们有一个结构SomeKey struct SomeKey int a b 要想以SomeKey作为std map的key 需要为这个结构提供operator lt
  • 使用cesium给地图实例添加精灵图图标

    前置条件 1 将精灵图存放在本地文件中 2 拿到对应的声明文件 该文件中存放了每一个类型的地图实例对应的图标在精灵图中的位置 我这里是json文件 这是某一个实例模型对应的数据 我的做法是 系统登录之后 就掉接口获取到该json文件 并存储
  • arcgis10.2破解版下载及其详细教程;;;附带10.1-10.6的破解版,没有教程

    1 arcgis10 2破解版 https blog csdn net bigemap article details 81131840 2 arcgis10 1 10 5破解版安装包 https blog csdn net e wsq a
  • TextSymbol使用方法

    private var grapbiaozhu GraphicsLayer new GraphicsLayer grapbiaozhu clear map addLayer grapbiaozhu var gra Graphic new G
  • Babelfish【map函数】

    题目链接 这道题用哈希可以做 但是这道题的输入要求太过于繁琐 所以我直接上map稍微好弄些 这道题讲真更多的考察的是字符串的输入问题 看下代码就会明白的 完整代码 include
  • java Map集合

    目录 一 介绍 二 HashMap 三 TreeMap 四 LinkedHashMap 一 介绍 Java中的Map是一种键值对的集合数据类型 用于存储无序的 不重复的键值对 它提供了快速的查找和访问功能 可以根据键来获取值 常见的Map实

随机推荐

  • error: array has incomplete element type ‘char []‘

    原代码 xff1a void explain input char int char a 报错 xff1a error array has incomplete element type 39 char 39 原因 xff1a 可以用二维数
  • STM32串口接收十六进制数转为十进制数(包含负数)

    外部设备传输给STM32单片机十六进制数 例如0x09c4 代表2500 0xff38 代表 200 xff08 并不是65336 xff0c 因为这是有符号的 xff09 串口接收处理函数 接收到 5A A5 06 83 55 00 01
  • 无人机-3无人机ROS应用与开发

    一 ROS是什么 二 为什么要学习ROS 三 怎么学习ROS https www cnblogs com masbay p 10745170 html TF坐标系指机器人在现实世界会有坐标的变换 xff0c ROS已经将其算成固定的程序 x
  • ROS入门-4.安装ROS系统(ubuntu20.04版本安装ros的noetic版本)

    ubuntu20 04版本安装ros的noetic版本 1 添加软件源2 添加密钥3 更新4 安装ROS5 初始化rosdep6 设置环境变量7 测试ROS安装是否成功 1 添加软件源 2 添加密钥 3 更新 4 安装ROS 5 初始化ro
  • 数学建模-12.预测模型

    灰色预测 灰色系统 GM 1 1 模型 xff1a Grey Model GM 1 1 原理介绍 呢么 xff0c 准指数规律的检验 xff1f 发展系数 a 与预测情形的探究 发展系数越小预测的越精确 GM 1 1 模型的评价 在使用GM
  • 数学建模-数学规划模型

    数学规划模型 一 概述 1 什么是数学规划 xff1f 运筹学的一个分支 xff0c 用来研究在给定条件下 即约束条件 xff0c 如何按照某一衡量指标 xff08 目标函数 xff09 来寻求计划 管理工作中的最优方案 即求目标函数在一定
  • 机器学习西瓜书学习记录-第四章 决策树

    第4章 决策树 4 1基本流程 决策树 xff0c 一类常见机器学习方法 xff0c 希望从给定训练集学得一个模型用以对新示例进行分类 一般 xff0c 一棵决策树包含一个根结点 若干个内部结点和若干个叶结点 xff1b 叶结点对应于决策结
  • 机器学习西瓜书学习记录-第五章 神经网络

    第5章 神经网络 5 1神经元模型 神经网络中最基本的成分是神经元模型 M P神经元模型 xff0c 又称 阈值逻辑单元 在模型中 xff0c 神经元接收到来自n个其他神经元传递过来的输入信号 xff0c 这些输入信号通过带权重的连接进行传
  • 机器学习西瓜书学习记录-第六章 支持向量机

    第6章 支持向量机 移步b站学习 学习贴
  • SurfaceFlinger模块

    SurfaceFlinger是一个系统服务 xff0c 作用就是接受不同layer的buffer数据进行合成 xff0c 然后发送到显示设备进行显示 SurfaceFlinger进程是什么时候起来的 xff1f 在之前的Android低版本
  • STM32-串口通信实验

    一 通信接口背景知识 1 通信的两种方式 xff1a 并行通信 传输原理 数据各个位同时传输 优点 速度快缺点 占用引脚资源多 串行通信 传输原理 数据按位顺序传输 优点 占用引脚资源少缺点 速度相对较慢 2 串行通信 按照数据传送的方向
  • UDP介绍,编程流程

    介绍 xff1a 面向无连接的用户数据报协议 xff0c 不需要建立任何连接 xff0c 目的主机接收后不需要确认 UDP特点 xff1a 相比TCP速度快一些简单的应用程序直接使用 不需要加密对于海量数据不采用UDP广播和多播必须采用UD
  • 数据结构-线性表的链式存储(包含代码实现)

    线性表的链式表示和实现 链式存储结构 结点在存储器中的位置是任意的 xff0c 即逻辑上相邻的数据元素在物理上不一定相邻线性表的链式存储结构又称为非顺序映像或链式映像 用一组物理位置任意的存储单元来存放线性表的数据元素这组存储单元既可以是连
  • Android6.0以上高危权限动态申请

    1 在项目的Manifest xml中添加静态权限 拨打电话 lt uses permission android name 61 34 android permission CALL PHONE 34 gt 发送短信 lt uses pe
  • Linux入学—共享文件夹(保姆教程)

    序言 自从上学期上完课以来就没有用过Linux xff0c 最近因为学习传感器数据上传云端的需要 xff0c 安装了Linux xff0c 在开始装jdk的时候需要下载jdk的压缩包 xff0c 需要通过windows上传到Ubuntu 之
  • Ubuntu下安装java环境及idea

    前言 一 JDK的安装 二 配置环境 1 在 系统中配置java环境 三 idea社区版的安装 前言 提示 xff1a 这里可以添加本文要记录的大概内容 xff1a 由于自己的学习需要 xff0c 这里需要用到在Linux系统下的Java
  • stm32f103 光敏传感器BH1750 实现串口回显

    在制作智能花盆的过程中 xff0c 使用了光敏传感器BH1750 因为在网上找了很多都是关于51的 xff0c 32方面的比较少 xff0c 所以这里记录一下BH750的驱动代码 链接 xff1a https pan baidu com s
  • STM32中HAL库使用-串口接收(一)

    1 中断接收 1 1先看中断接收的流程 xff08 以 USART2 为例 xff09 在启动文件中找到中断向量 USART2 IRQHandler 找到 USART2 IRQHandler 的函数定义 可以看到这里又转到另一个函数里去了
  • STM32中HAL库使用-串口发送(二)

    2 中断发送 2 1发送中断的触发流程 由于在STM32中usart2的入口中断只有一个 xff1a 就是上图的中断向量表中红框标出来的 其他的所有中断其实都是从这里出发的 xff0c 我们再和捋接收一样捋一遍发送 首先是USART2 IR
  • Ubuntu20.04下编译安装ORBSLAM2_with_pointcloud_map总结

    与此物大战六个小时 xff0c 终于解决所有问题 xff0c 写此短文记录一下 一 在github上下载源码后 xff0c 解压缩 xff0c 如下 进行g2o with orbslam2的编译 1 报错信息 xff1a ORBSLAM2