【将G2O库使用交叉编译移植到arm平台】

一 准备材料
1.下载好g2o的代码。下载地址:https://github.com/RainerKuemmerle/g2o
如果只是在Ubuntu系统上安装g2o,可以参考代码库中的readme.md。
2.下载suitesparse4.4.6. 选择4.4.6版本是因为我发现ROS系统中使用的是这个版本。即使用sudo apt-get install libsuitesparse-dev命令安装的版本。
3.相应的编译工具make 和cmake 是要有的。
4.安装自己的交叉编译工具链。我这里使用的是arm板厂商提供的编译工具

二 对G2O库的改造
1.将suitesparse文件夹中的CXSParse里的源码替换掉g2o的EXTERNAL文件夹中的csparse。
注意SuiteSparse_config文件夹中的SuiteSparse_config.h也需要拷过去。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
EXTERNAL中的CMakeList.txt里59行需要去掉cs_api.h。因为这个文件已经没有了。
以上步骤主要是将g2o中原来的csparse替换为性能更好的cxsparse。

2.修改g2o的CMakeList.txt。

  1. 按照下面的方式设置交叉编译工具。
SET(CMAKE_SYSTEM_NAME Linux)
SET(TOOLCHAIN_DIR "/home/andrew/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu")set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc)
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR} ${TOOLCHAIN_DIR}/aarch64-linux-gnu/include ${TOOLCHAIN_DIR}/aarch64-linux-gnu/lib)

2)关掉了CHOLMOD,因为我没有使用CHOLMOD的solver。

# For building the CHOLMOD / CSPARSE solvers
option (G2O_USE_CHOLMOD "Build g2o with CHOLMOD support" OFF)

3)使g2o自己编译EXTERNAL中的csparse。

# find_package(CSparse)
# if (G2O_USE_CSPARSE)
#   if(CSPARSE_FOUND)
#     set(BUILD_CSPARSE OFF CACHE BOOL "Build local CSparse library")
#   else(CSPARSE_FOUND)set(BUILD_CSPARSE ON CACHE BOOL "Build local CSparse library")if(BUILD_CSPARSE)set(CSPARSE_FOUND TRUE)endif()
#   endif(CSPARSE_FOUND)
# else(G2O_USE_CSPARSE)
#   set(BUILD_CSPARSE OFF "Build local CSparse library")
# endif(G2O_USE_CSPARSE)

4)注释掉FIND_PACKAGE(OpenMP)一段

# Eigen library parallelise itself, though, presumably due to performance issues
# OPENMP is experimental. We experienced some slowdown with it
# set(G2O_USE_OPENMP OFF CACHE BOOL "Build g2o with OpenMP support (EXPERIMENTAL)")
# if(G2O_USE_OPENMP)
#   find_package(OpenMP)
#   if(OPENMP_FOUND)
#     set (G2O_OPENMP 1)
#     set(g2o_C_FLAGS "${g2o_C_FLAGS} ${OpenMP_C_FLAGS}")
#     set(g2o_CXX_FLAGS "${g2o_CXX_FLAGS} -DEIGEN_DONT_PARALLELIZE ${OpenMP_CXX_FLAGS}")
#     message(STATUS "Compiling with OpenMP support")
#   endif(OPENMP_FOUND)
# endif(G2O_USE_OPENMP)

5)自己设置eigen库的头文件地址。

SET(EIGEN3_INCLUDE_DIR "/home/andrew/compile_eigen3_2/arm_eigen3/install/include/eigen3")
SET(G2O_EIGEN3_INCLUDE ${EIGEN3_INCLUDE_DIR})

6)关掉一些不要编译的东西。
关掉apps编译

# shall we build the core apps using the library
set(G2O_BUILD_APPS OFF CACHE BOOL "Build g2o apps")

关掉examples的编译

# shall we build the examples
set(G2O_BUILD_EXAMPLES OFF CACHE BOOL "Build g2o examples")

在这里插入图片描述
在上面的CMakeLists.txt里注释掉

# Pre-canned types
# add_subdirectory(types)

在solver文件夹里的
在这里插入图片描述

# add_subdirectory(pcg)
# add_subdirectory(dense)
# add_subdirectory(structure_only)# add_subdirectory(slam2d_linear)
# add_subdirectory(eigen)

意味着我们只保留了csparse。

7)注释掉g2o根文件夹中CMakeLists.txt里的这一段

# Start of SSE* autodetect code
# (borrowed from MRPT CMake scripts, BSD)
# option(DO_SSE_AUTODETECT "Enable autodetection of SSE* CPU sets and enable their use in optimized code" ON)
# if(NOT EXISTS "/proc/cpuinfo")
# 	set(DO_SSE_AUTODETECT OFF)
# endif()
# if (DO_SSE_AUTODETECT)
#   file(READ "/proc/cpuinfo" G2O_CPU_INFO)
# endif()# # Macro for each SSE* var: Invoke with name in uppercase:
# macro(DEFINE_SSE_VAR  _setname)
# 	string(TOLOWER ${_setname} _set)
# 	if (DO_SSE_AUTODETECT)
# 		# Automatic detection:
# 		set(CMAKE_G2O_HAS_${_setname} 0)
# 		if (${G2O_CPU_INFO} MATCHES ".*${_set}.*")
# 			set(CMAKE_G2O_HAS_${_setname} 1)
# 		endif()
# 	else (DO_SSE_AUTODETECT)
# 		# Manual:
# 		set("DISABLE_${_setname}" OFF CACHE BOOL "Forces compilation WITHOUT ${_setname} extensions")
# 		mark_as_advanced("DISABLE_${_setname}")
# 		set(CMAKE_G2O_HAS_${_setname} 0)
# 		if (NOT DISABLE_${_setname})
# 			set(CMAKE_G2O_HAS_${_setname} 1)
# 		endif (NOT DISABLE_${_setname})
# 	endif (DO_SSE_AUTODETECT)
# endmacro(DEFINE_SSE_VAR)# # SSE optimizations:
# IF (NOT CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
#   DEFINE_SSE_VAR(SSE2)
#   DEFINE_SSE_VAR(SSE3)
#   DEFINE_SSE_VAR(SSE4_1)
#   DEFINE_SSE_VAR(SSE4_2)
#   DEFINE_SSE_VAR(SSE4_A)
# ENDIF()

三 编译
在g2o根文件夹下执行下面的命令。

mkdir build && cd build
cmake ..
make

编译完后,库会放在lib文件夹下。
在这里插入图片描述
使用g2o时只需链接g2o_ext_csparse g2o_core g2o_csparse_extension g2o_stuff这几个库。

注意:
笔者用g2o来做teb,teb中cmake时要将/home/juchunyu/workspace/Navigation_system/cmake_modules/FindG2O.cmake 的下面几行注释掉。

  #FIND_LIBRARY(G2O_SOLVER_CHOLMOD_LIB   #NAMES g2o_solver_cholmod  g2o_solver_cholmod_rd#PATHS /usr/local /usr ${CMAKE_PREFIX_PATH} #PATH_SUFFIXES lib)

Reference
1. 如何交叉编译G2O

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

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

相关文章

【Vulnhub 靶场】【Looz: 1】【简单】【20210802】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/looz-1,732/ 靶场下载:https://download.vulnhub.com/looz/Looz.zip 靶场难度:简单 发布日期:2021年08月02日 文件大小:2.1 GB 靶场作者:mhz_cyber &…

c语言:输出范围内的质数|练习题

一、题目 输入一个数n,输出n之内的所有质数 如图: 二、思路分析 1、设置一个数num,从2开始,不断作1操作,作为被除数 2、用一个不断自1的数,除以num,如果num不能被整除,则为质数 3、例…

超分之SRGAN

Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network使用生成对抗网络的逼真单图像超分辨率一作:Christian Ledig是Twitter2017年的一篇论文。 文章目录 0. 摘要1. 引言1.1 相关工作1.1.1 介绍了SR技术的发展历程1.1.2 介绍了SR…

算法基础day2

前缀和 #include <iostream> using namespace std; const int N100010; int n,m; int a[N],s[N]; int main() {scanf("%d%d",&n,&m);for(int i1;i<n;i) scanf("%d",&a[i]);for(int i1;i<n;i) s[i]s[i-1]a[i];while(m--){int l,r;s…

模型系列:增益模型Uplift Modeling原理和案例

模型系列&#xff1a;增益模型Uplift Modeling原理和案例 目录 1. 简介1. 第一步2. 指标3. 元学习器 3.1 S-学习器3.2 T-学习器3.3 T-学习器相关模型 简介 Uplift是一种用于用户级别的治疗增量效应估计的预测建模技术。每家公司都希望增加自己的利润&#xff0c;而其中一个…

Python+OpenCV 零基础学习笔记(6):ROI

文章目录 相关链接运行环境前言ROI颜色区域分割颜色通道合并 相关链接 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程 CSDN标题里个括号对应视频的分P OpenCVPython CSDN专栏 Gitee 项目地址 运行环境 Python:3.11.5Anaconda:23.7.4IDE:vscode运行环境&#x…

链表:如何利用“假头,新指针,双指针”解决链表问题

Java学习面试指南&#xff1a;https://javaxiaobear.cn 链表是一种线性数据结构&#xff0c;其中的每个元素实际上是一个单独的对象&#xff0c;而所有对象都通过每个元素中的引用字段链接在一起。 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;其物理结构不能…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第六节 理解垃圾回收GC&#xff0c;提搞程序性能 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基…

【kubernetes】集群网络(一):基础篇

Flannel 1 路由表 & arp & fdb 1.1 路由表 任何网络设备都需要路由表&#xff0c;路由表用来决定&#xff0c;当收到数据包时&#xff0c;该向哪里进行转发。路由表项通常会包含以下几个字段&#xff1a; Destination&#xff1a;目的地Gateway&#xff1a;网关Mas…

12.27重构二叉树,插入排序,队列(股票,模拟),后缀表达式求值,括号匹配,验证栈序列,选择题部分

重构二叉树 误 string in, post; struct node {char a;node* lchild, * rchild;node(char x\0) :a(x), lchild(nullptr), rchild(nullptr) {} }; void so(node* r, int il, int ir, int pl, int pr) {if (il > ir)return;int root;for (root il; root < ir; root) {if…

[AI编程]AI辅助编程助手-亚马逊AI 编程助手 Amazon CodeWhisperer

亚马逊AI 编程助手 Amazon CodeWhisperer 是一种基于人工智能技术的编程辅助工具&#xff0c;旨在帮助开发人员更高效地编写代码。它可以提供实时的代码建议、自动补全和错误检查&#xff0c;帮助优化代码质量和提高编程效率。 Amazon CodeWhisperer 使用了自然语言处理和机器…

OpenChat-3.5:70亿参数下的AI突破

引言 在对话AI的发展史上&#xff0c;OpenChat-3.5标志着一个新纪元的到来。拥有70亿参数的这一模型&#xff0c;不仅是对现有语言学习模型&#xff08;LLMs&#xff09;的重大改进&#xff0c;更是在多模态任务中树立了新的标准。 模型概述 OpenChat-3.5作为一款先进的多模…

Leetcode—1572.矩阵对角线元素的和【简单】

2023每日刷题&#xff08;七十三&#xff09; Leetcode—1572.矩阵对角线元素的和 实现代码 class Solution { public:int diagonalSum(vector<vector<int>>& mat) {int n mat.size();if(n 1) {return mat[0][0];}int sum 0;int i 0, j n - 1;while(i &…

ARM CCA机密计算软件架构之RMI领域管理接口与RSI领域服务接口

领域管理接口 领域管理接口&#xff08;RMI&#xff09;是RMM与正常世界主机之间的接口。 RMI允许正常世界虚拟机监视器向RMM发出指令&#xff0c;以管理领域。 RMI使用来自主机虚拟机监视器的SMC调用&#xff0c;请求RMM的管理控制。 RMI使得对领域管理的控制成为可能&…

自动化测试框架知识总结(超详细整理)

一、什么是自动化测试框架 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架&#xff1f;框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架。前者是从应…

Java多线程常见的成员方法(线程优先级,守护线程,礼让/插入线程)

目录 1.多线程常见的成员方法2.优先级相关的方法3.守护线程&#xff08;备胎线程&#xff09;4.其他线程 1.多线程常见的成员方法 ①如果没有给线程设置名字&#xff0c;线程是有默认名字 的&#xff1a;Thread-X(X序号&#xff0c;从0开始) ②如果要给线程设置名字&#xff0c…

10 分钟了解 nextTick ,并实现简易版的 nextTick

前言 在 Vue.js 中&#xff0c;有一个特殊的方法 nextTick&#xff0c;它在 DOM 更新后执行一段代码&#xff0c;起到等待 DOM 绘制完成的作用。本文会详细介绍 nextTick 的原理和使用方法&#xff0c;并实现一个简易版的 nextTick&#xff0c;加深对它的理解。 一. 什么是 n…

sql优化,内外连接有什么区别

内外连接是啥不必多说&#xff0c;但在做关联查询的时候&#xff0c;二者是有一些区别的&#xff1a; 举例来说&#xff0c;首先是外连接&#xff08;左外连接为例&#xff09;&#xff0c;当两个表都没有索引&#xff0c;就都是全表扫描 EXPLAIN SELECT SQL_NO_CACHE * FROM …

19个Python语法糖和9个内置装饰器

19 个Sweet的 Python Syntax Sugar&#xff0c;用于改善您的编码体验 文章目录 19 个Sweet的 Python Syntax Sugar&#xff0c;用于改善您的编码体验1. 联合运算符Union Operators&#xff1a;合并 Python 字典的最优雅方式2. 类型提示Type Hints&#xff1a;使您的 Python 程序…

EduChat账号密码登录

内测申请&#xff1a;请邮件dan_yhstu.ecnu.edu.cn&#xff0c;以“EduChat内测申请单位”作为邮件标题&#xff0c;邮件内容中写明用途 先去申请个账号和密码&#xff0c;会有一两天延迟吧&#xff0c;挺快的。 拿到账号之后去官网,点一个 官网传送门 就出来用账号密码登录的…