A-LOAM安装与配置

news2024/12/22 23:52:54

GitHub

https://github.com/HKUST-Aerial-Robotics/A-LOAM

依赖项

需要安装Ceres Slover和PCL

在这里插入图片描述

PLC之前已经安装过,因此只需要安装Ceres Solver

编译安装Ceres Slover报错

官方的安装指南

http://ceres-solver.org/installation.html

一开始是git下来的最新版本的Ceres Solver,即2.1版本,编译时报错

/usr/local/include/eigen3/Eigen/src/Core/util/XprHelper.h:78:8: error: no type named ‘Literal’ in ‘struct Eigen::NumTraits<ceres::Jet<double, 9> >

网上搜索说是Ceres Solver版本与Eigen版本不兼容

查看Eigen版本,发现是3.3.9版本

pkg-config --modversion eigen3

官方要求Eigen 3.3及以上,照理来说应该是没问题的

在这里插入图片描述

于是更换Ceres Slover的版本,用的高翔博士视觉SLAM十四讲3rd_party下的Ceres Slover

用下述命令卸载原来安装的Ceres Slover

sudo rm /usr/local/lib/libceres*
sudo rm -rf /usr/local/include/ceres
sudo rm -rf /usr/include/ceres
sudo rm -rf /usr/local/lib/cmake/Ceres
sudo rm -rf /var/lib/dpkg/info/libceres*
sudo rm -rf /usr/share/doc/libceres*

卸载Eigen 3.3.9,安装Eigen 3.2.9,用下述命令卸载

sudo rm -rf /usr/include/eigen3
sudo rm -rf /usr/lib/cmake/eigen3
sudo rm -rf /usr/local/include/eigen3
sudo rm -rf /usr/share/doc/libeigen3-dev 
sudo rm -rf /usr/local/share/pkgconfig/eigen3.pc /usr/share/pkgconfig/eigen3.pc /var/lib/dpkg/info/libeigen3-dev.list /var/lib/dpkg/info/libeigen3-dev.md5sums
sudo rm -rf /usr/local/lib/pkgconfig/eigen3.pc
sudo rm -rf /usr/local/share/eigen3

catkin_make aloam_velodyne报错

更换完版本后Ceres Slover可以正常编译,但是执行catkin_make命令时又会报错

find_package Error reading CMake code from "/usr/local/lib/cmake/Ceres/CeresConfig.cmake"

查询资料说是没有有效安装,并且当前Ceres Slover的版本号也不清楚,于是我又在网上搜索其它较稳定版本的Ceres Slover,选择1.14.0版本,下面是下载链接

https://ceres-solver.googlesource.com/ceres-solver/+/refs/tags/1.14.0/

此时并未更换Eigen版本

更换Ceres Slover后再次catkin_make,报了新错误

Failed to find Ceres - Missing required Ceres dependency: Eigen version 3.2.9, please set EIGEN_INCLUDE_DIR

这个报错来自CeresConfig.cmake文件,查看这个文件后发现错误输出来自下面的程序段

# Eigen.
# Flag set during configuration and build of Ceres.
set(CERES_EIGEN_VERSION 3.2.9)
set(Eigen_INCLUDE_DIRS "/usr/include/eigen3")
set(EIGEN_WAS_BUILT_WITH_CMAKE TRUE)
# Append the locations of Eigen when Ceres was built to the search path hints.
if (EIGEN_WAS_BUILT_WITH_CMAKE)
  set(Eigen3_DIR "/usr/include/eigen3")
  set(EIGEN_PREFER_EXPORTED_EIGEN_CMAKE_CONFIGURATION TRUE)
else()
  list(APPEND EIGEN_INCLUDE_DIR_HINTS )
endif()
# Search quietly to control the timing of the error message if not found. The
# search should be for an exact match, but for usability reasons do a soft
# match and reject with an explanation below.
find_package(Eigen ${CERES_EIGEN_VERSION} QUIET)
if (EIGEN_FOUND)
  if (NOT EIGEN_VERSION VERSION_EQUAL CERES_EIGEN_VERSION)
    # CMake's VERSION check in FIND_PACKAGE() will accept any version >= the
    # specified version. However, only version = is supported. Improve
    # usability by explaining why we don't accept non-exact version matching.
    ceres_report_not_found("Found Eigen dependency, but the version of Eigen "
      "found (${EIGEN_VERSION}) does not exactly match the version of Eigen "
      "Ceres was compiled with (${CERES_EIGEN_VERSION}). This can cause subtle "
      "bugs by triggering violations of the One Definition Rule. See the "
      "Wikipedia article http://en.wikipedia.org/wiki/One_Definition_Rule "
      "for more details")
  endif ()
  message(STATUS "Found required Ceres dependency: "
    "Eigen version ${CERES_EIGEN_VERSION} in ${EIGEN_INCLUDE_DIRS}")
else (EIGEN_FOUND)
  ceres_report_not_found("Missing required Ceres "
    "dependency: Eigen version ${CERES_EIGEN_VERSION}, please set "
    "EIGEN_INCLUDE_DIR.")
endif (EIGEN_FOUND)
list(APPEND CERES_INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS})

还是Eigen的问题,上述文件已经做了部分修改,有下面几处,感兴趣可以对比原文件看下

set(CERES_EIGEN_VERSION 3.2.9)
set(Eigen_INCLUDE_DIRS "/usr/include/eigen3")
set(EIGEN_WAS_BUILT_WITH_CMAKE TRUE)

set(Eigen3_DIR "/usr/include/eigen3")

这个报错的意思是没有找到Eigen的依赖,有两种解决思路

方法一

极其简单粗暴,这一段代码的最终目的是确定EIGEN_INCLUDE_DIRS,那么直接set这个变量值应该就可行,更改如下:

# Eigen.
# Flag set during configuration and build of Ceres.
set(CERES_EIGEN_VERSION 3.2.9)
set(Eigen_INCLUDE_DIRS "/usr/include/eigen3")
# set(EIGEN_WAS_BUILT_WITH_CMAKE TRUE)
# # Append the locations of Eigen when Ceres was built to the search path hints.
# if (EIGEN_WAS_BUILT_WITH_CMAKE)
#   set(Eigen3_DIR "/usr/include/eigen3")
#   set(EIGEN_PREFER_EXPORTED_EIGEN_CMAKE_CONFIGURATION TRUE)
# else()
#   list(APPEND EIGEN_INCLUDE_DIR_HINTS )
# endif()
# # Search quietly to control the timing of the error message if not found. The
# # search should be for an exact match, but for usability reasons do a soft
# # match and reject with an explanation below.
# find_package(Eigen ${CERES_EIGEN_VERSION} QUIET)
# if (EIGEN_FOUND)
#   if (NOT EIGEN_VERSION VERSION_EQUAL CERES_EIGEN_VERSION)
#     # CMake's VERSION check in FIND_PACKAGE() will accept any version >= the
#     # specified version. However, only version = is supported. Improve
#     # usability by explaining why we don't accept non-exact version matching.
#     ceres_report_not_found("Found Eigen dependency, but the version of Eigen "
#       "found (${EIGEN_VERSION}) does not exactly match the version of Eigen "
#       "Ceres was compiled with (${CERES_EIGEN_VERSION}). This can cause subtle "
#       "bugs by triggering violations of the One Definition Rule. See the "
#       "Wikipedia article http://en.wikipedia.org/wiki/One_Definition_Rule "
#       "for more details")
#   endif ()
#   message(STATUS "Found required Ceres dependency: "
#     "Eigen version ${CERES_EIGEN_VERSION} in ${EIGEN_INCLUDE_DIRS}")
# else (EIGEN_FOUND)
#   ceres_report_not_found("Missing required Ceres "
#     "dependency: Eigen version ${CERES_EIGEN_VERSION}, please set "
#     "EIGEN_INCLUDE_DIR.")
# endif (EIGEN_FOUND)
list(APPEND CERES_INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS})

再次catkin_make aloam_velodyne,编译成功

方法二

上述方法过于笨拙,不够优雅,并且没有发现问题的本质

查找资料发现如果要通过find_package(Eigen XXX)找到Eigen库,则应在/usr/lib/cmake和/usr/local/lib/cmake存在eigen3的cmake文件,然而我的笔记本上并没有(可能由于多次重装Eigen导致),所以这才是上述错误的真正原因

虚拟机上有eigen3的cmake文件,找了一个用到Eigen的文件,更改其CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(useEigen)

set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3")

# 添加Eigen头文件
# include_directories("/usr/include/eigen3")
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIRS})

add_executable(eigenMatrix eigenMatrix.cpp)

再次编译,报错

CMake Error at CMakeLists.txt:9 (find_package):
  By not providing "FindEigen3.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "Eigen3", but
  CMake did not find one.

  Could not find a package configuration file provided by "Eigen3" with any
  of the following names:

    Eigen3Config.cmake
    eigen3-config.cmake

  Add the installation prefix of "Eigen3" to CMAKE_PREFIX_PATH or set
  "Eigen3_DIR" to a directory containing one of the above files.  If "Eigen3"
  provides a separate development package or SDK, be sure it has been
  installed.

将eigen3的cmake文件还原回去,则可顺利编译,验证之前的分析正确

因此将虚拟机中的eigen3的cmake文件复制到双系统中应该就可以解决问题,但是要注意版本问题,统一将cmake文件中出现版本号的地方更改为双系统中的Eigen版本,比如

# This file exports the Eigen3::Eigen CMake target which should be passed to the
# target_link_libraries command.

####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
####### Any changes to this file will be overwritten by the next CMake run ####
####### The input file was Eigen3Config.cmake.in                            ########

get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)

# Use original install prefix when loaded through a "/usr move"
# cross-prefix symbolic link such as /lib -> /usr/lib.
get_filename_component(_realCurr "${CMAKE_CURRENT_LIST_DIR}" REALPATH)
get_filename_component(_realOrig "/usr/lib/cmake/eigen3" REALPATH)
if(_realCurr STREQUAL _realOrig)
  set(PACKAGE_PREFIX_DIR "/usr")
endif()
unset(_realOrig)
unset(_realCurr)

macro(set_and_check _var _file)
  set(${_var} "${_file}")
  if(NOT EXISTS "${_file}")
    message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
  endif()
endmacro()

####################################################################################

include ("${CMAKE_CURRENT_LIST_DIR}/Eigen3Targets.cmake")

# Legacy variables, do *not* use. May be removed in the future.

set (EIGEN3_FOUND 1)
set (EIGEN3_USE_FILE    "${CMAKE_CURRENT_LIST_DIR}/UseEigen3.cmake")

set (EIGEN3_DEFINITIONS  "")
set (EIGEN3_INCLUDE_DIR  "${PACKAGE_PREFIX_DIR}/include/eigen3")
set (EIGEN3_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/include/eigen3")
set (EIGEN3_ROOT_DIR     "${PACKAGE_PREFIX_DIR}")

set (EIGEN3_VERSION_STRING "3.3.4")
set (EIGEN3_VERSION_MAJOR  "3")
set (EIGEN3_VERSION_MINOR  "3")
set (EIGEN3_VERSION_PATCH  "4")

有3.3.4的地方都要改成3.2.9,再次catkin_make aloam_velodyne,编译成功,看到输出

-- Found installed version of Eigen: /usr/local/lib/eigen3
-- Found required Ceres dependency: Eigen version 3.2.9 in /usr/include/eigen3

测试运行

下载数据集,下面是网盘链接

链接:https://pan.baidu.com/s/1b_M-Vs-524TTGNOAxu1gQA
提取码:xkqd

roslaunch aloam_velodyne aloam_velodyne_VLP_16.launch
rosbag play YOUR_DATASET_FOLDER/nsh_indoor_outdoor.bag

实际效果如下图所示

在这里插入图片描述

说明安装配置成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/828771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

r一个高性能、无侵入的 Java 性能监控和统计工具

背景 随着所在公司的发展&#xff0c;应用服务的规模不断扩大&#xff0c;原有的垂直应用架构已无法满足产品的发展&#xff0c;几十个工程师在一个项目里并行开发不同的功能&#xff0c;开发效率不断降低。 于是公司开始全面推进服务化进程&#xff0c;把团队内的大部分工程…

官网下载历史版本Android studio

有时我们个更新到了最新版本的AndroidStudio&#xff0c;但发现最新版的有一些bug影响使用&#xff0c;这时我们需要将新版卸载安装到旧版本&#xff0c;本文便是记录如何在官网下载旧版本的android studio。 下载地址 1、查看Release notes 2、查看过往版本 3、点击下载旧版…

Jenkins持续集成实现过程(简易版)

我就用一台服务器模拟&#xff0c;gitlab用公司现成的&#xff0c;jenkins安装发版都是在同一台服务器上 安装Jenkins&#xff08;Docker&#xff09; 宿主机上创建数据映射目录 mkdir /data/jenkins给映射目录权限&#xff0c;不然jenkins用不了 chmod -R 777 /data/jenkin…

【es6】Promise实现

友情链接 关于promise的介绍&#xff0c;请看此篇水文 本篇文章只是介绍实现promise以及promise常用方法。 正文 Promise使用 let promise new Promise((resolve,reject)>{resolve(success); //这里如果是reject(fail) }); promise.then((res)>{console.log(res); …

企业AD域管理:ADManager Plus助您轻松掌控全局

在现代企业中&#xff0c;Active Directory&#xff08;AD&#xff09;域是一个至关重要的组成部分。它作为一种身份验证和授权机制&#xff0c;管理着企业网络中的用户、计算机、组和其他资源。然而&#xff0c;随着企业规模和复杂性的不断增长&#xff0c;AD域的管理变得越来…

深入挖掘地核和地幔之间的相互作用

一本新书介绍了我们在理解地核-地幔相互作用和共同进化方面的重大进展&#xff0c;并展示了提高我们对地球深层过程的洞察力的技术发展。 与地核-地幔共同演化相关的地球深层结构和动力学的图示。图片来源&#xff1a;白石千寻 Editors Vox是 AGU 出版部的博客。 地球深层内部很…

螺杆支撑座使用深沟球轴承和角接触球轴承的区别?

螺杆支撑座是连接丝杆和电机的轴承固定座&#xff0c;与滚珠螺杆搭配使用&#xff0c;能够获得高刚性、高精度的稳定的回转性能&#xff0c;因此被广泛应用在各行各业中。 使用螺杆支撑座之所以能够获得稳定的回转性能&#xff0c;主要是因为最佳轴承的使用&#xff0c;通俗点说…

IDEA中怎么将代码提交代码到远程仓库

假设代码已经写好,现在准备提交到远程仓库 git会自动帮我们在远程托管平台中创建一个仓库这里我选用的是gitee 如果还没有注册gitee 请先去注册,第一次使用需要登录gitee账号 登录我们自己的gitee账号,会发现git自动创建了一个仓库 如果我们又修改了 代码,想重新提交到远程仓库…

DreamBooth为何有能力让第一个应用创建者年赚2500万美金?

DreamBooth 是一种个性化的文本到图像生成模型&#xff0c;它可以通过向扩散模型&#xff08;比如Stable Diffusion&#xff09;中注入少量主体对象&#xff0c;从而达到对基础模型的微调。使用微调后的模型可以生成在不同的场景、姿势和视角中的该主体上下文图像。 Dreamboot…

单通道 6GSPS 16位采样DAC子卡模块--【资料下载】

FMC147是一款单通道6.4GSPS&#xff08;或者配置成2通道3.2GSPS&#xff09;采样率的12位AD采集、单通道6GSPS&#xff08;或配置成2通道3GSPS&#xff09;采样率16位DA输出子卡模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.4规范&#xff0c;该模块可以作为一个理想…

如何通过sqlplus连接oracle数据库

本文介绍如果通过sqlplus连接oracle数据库。如果用SQL Developer连接数据库服务器端&#xff0c;需要本地安装oracle客户端&#xff0c;而oracle客户端安装包比较大&#xff0c;安装配置也比较繁琐。这里推荐安装使用oracle的Instant Client。Instant Client是Oracle发布的轻量…

iMX6ULL驱动开发 | 让imx6ull开发板支持usb接口FC游戏手柄

手边有一闲置的linux开发板iMX6ULL一直在吃灰&#xff0c;不用来搞点事情&#xff0c;总觉得对不住它。业余打发时间就玩起来吧&#xff0c;总比刷某音强。从某多多上8块儿大洋买来一个usb接口的游戏手柄&#xff0c;让开发板支持以下它&#xff0c;后续就可以接着在上面玩童年…

JAVA 反编译工具

Releases deathmarine/Luyten GitHub 安装exe 打开拖入文件即可

【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)

深入探索和分析MySQL数据库的数据备份和恢复实战开发指南&#xff08;8.0版本升级篇&#xff09; 项目目标官方升级地址 向前兼容性问题任务拆分调整项目前提工作应用服务改造驱动器改造&#xff08;p0&#xff09;改造范围解决问题 客户端连接配置&#xff08;p0&#xff09;改…

卖菜大妈都能听懂:告诉你什么是信息化,数字化,智能化

最近两年&#xff0c;数字化成为了新的流行趋势&#xff0c;网上充斥着大量关于数字化的文章。然而&#xff0c;仔细阅读这些文章会发现&#xff0c;其中大多数只是将信息化一词替换成了数字化&#xff0c;而内容并没有实质性的改变。而且&#xff0c;一些文章还在混淆术语&…

NSS刷web3

[HDCTF 2023]SearchMaster [天翼杯 2021]esay_eval 这题会匹配A或B类 如 "A":1: 绕不过去 可以考虑快速析构 <?php class A{public $code "";function __call($method,$args){eval($this->code);}function __wakeup(){$this->code "&q…

Emacs之将.el编译成bin(一百二十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Wireshark抓包分析TCP协议:三次握手和四次挥手

01、前言 面试中我们经常会被问到TCP协议的三次握手和四次挥手的过程&#xff0c;为什么总喜欢问这个问题呢&#xff1f; 其实我们平时使用的很多协议都是应用层协议&#xff0c;比如HTTP协议&#xff0c;https协议&#xff0c;DNS协议&#xff0c;FTP协议等&#xff1b;而应…

工作流与状态机

引言与动机&#xff1a;世界是那么的广阔无垠&#xff0c;姿态万千&#xff0c;我们梦想着计算设备的多元化&#xff0c;而如今我们已经梦想成真&#xff0c;但同时业务模型同样变得纷繁复杂。如果不考虑我们拥有的繁杂的业务模型&#xff0c;就很难谈得上去探索行业发展的方向…

NSX多租户之旅

从多租户数据面到完整的多租户框架 我们很高兴地宣布NSX中的Projects这一项新功能&#xff0c;可以对NSX部署的多个租户进行细粒度的资源管理。 Projects提供灵活的资源分配和管理&#xff0c;将NSX的多租户支持提升到新的水平。企业管理员可以将平台划分为不同Projects&…