当前位置: 首页 > article >正文

ubuntu20.04适配LTAOM并运行

一、主要贡献:

  1. LTA-OM:一种高效、稳健和准确的SLAM系统。我们将FAST-LIO2、STD-LCD和循环优化集成到系统中。通过广泛的基准实验,包括城市、校园和非人工环境,以及相同或相反方向、小重叠重访和不同时间持续性(8∼112分钟)或行驶距离(1.1∼7.5公里),证明了LTA-OM的效率和准确性优于最先进的激光雷达系统。我们还将我们的系统与一个结构相似的场景进行了测试——一个具有不同层次的类似走廊的多层建筑,我们的系统仍然可以正常运行并构建出一个良好的地图。
  2. 实时长期关联。我们的工作利用历史地图点在重访地点对LIO的在线定位和建图进行全局约束。当循环优化完成后,我们使用循环优化结果来校正FAST-LIO2的姿态状态,并动态从历史地图中重新加载地图点到实时地图中进行在线LIO。通过这种方式,LIO的地图构建变得全局一致,由于使用了校正后的历史地图,LIO的定位变得无漂移。此外,姿态校正和实时地图更新的机制经过精心设计,以实现实时性能并避免长时间的LIO延迟。
  3. 多会话模式。我们的SLAM系统中的长期关联自然地扩展到多会话模式,用户可以将LTA-OM的地图存储在上一个会话中,并在当前会话中加载它进行重定位。具体而言,在这种模式下,系统首先使用LTA-OM的循环检测模块在预存储的地图中重新定位。然后,LTA-OM的LIO模块动态加载预存储的地图到当前会话中构建的实时地图,以约束在线定位和建图。结果,预存储的地图和实时地图自然地拼接在一起,LIO的姿态在预存储的地图上变得无漂移。当机器人进入预存储地图中未探索的区域时,LTA-OM会将新的点追加到拼接地图中,从而自动扩展地图而无需进一步合并。

二、 主要框架

我们系统的流程如图2所示。我们的系统由四个核心模块组成:LiDAR-IMU里程计(LIO)、回环检测、回环优化和回环校正。 流程工作流程简要说明如下。LIO模块是FAST-LIO2的一种变体,它包含了长期关联,提供了注册的扫描和估计的里程计给回环检测模块。回环检测模块STD-LCD提取关键点并检测回环闭合以供回环优化后端使用。然后,回环优化利用提供的里程计、关键点和回环闭合信息构建和维护一个位姿图,然后在检测到回环闭合时对位姿图进行优化。一旦成功完成回环优化,回环校正就利用优化后的里程计来校正位姿状态并替换LIO模块的地图(即ikd-Tree)
在这里插入图片描述
参考:https://www.guyuehome.com/detail?id=1825502911207895041

算法开源代码:https://github.com/hku-mars/LTAOM/tree/main

三、适配环境

安装LTAOM作者说明进行环境适配,以下:
注意代码livox_ros_dirver需要增加CMakeLists.txt文件,即在ws_LTAOM/src/LTAOM/livox_ros_driver-master/livox_ros_dirver文件夹下添加CMakeLists.txt文件:

# Copyright(c) 2019 livoxtech limited.

cmake_minimum_required(VERSION 3.0)


#---------------------------------------------------------------------------------------
# Start livox_ros_driver project
#---------------------------------------------------------------------------------------
include(cmake/version.cmake)
project(livox_ros_driver VERSION ${LIVOX_ROS_DRIVER_VERSION} LANGUAGES CXX)
message(STATUS "livox_ros_driver version: ${LIVOX_ROS_DRIVER_VERSION}")

#---------------------------------------------------------------------------------------
# find package and the dependecy
#---------------------------------------------------------------------------------------
find_package(Boost 1.54 REQUIRED COMPONENTS
	system
	thread
	chrono
	)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
	roscpp
	rospy
	sensor_msgs
	std_msgs
	message_generation
	rosbag
	pcl_ros
	)

## Find pcl lib
find_package(PCL REQUIRED)

## Generate messages in the 'msg' folder
add_message_files(FILES
	CustomPoint.msg
	CustomMsg.msg
#   Message2.msg
	)

## Generate added messages and services with any dependencies listed here
generate_messages(DEPENDENCIES
	std_msgs
	)

find_package(PkgConfig)
pkg_check_modules(APR apr-1)
if (APR_FOUND)
	message(${APR_INCLUDE_DIRS})
	message(${APR_LIBRARIES})
endif (APR_FOUND)

###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects als    o need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also n    eed
catkin_package(CATKIN_DEPENDS
	roscpp rospy std_msgs message_runtime
	pcl_ros
	)

#---------------------------------------------------------------------------------------
# Set default build to release
#---------------------------------------------------------------------------------------
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose Release or Debug" FORCE)
endif()

#---------------------------------------------------------------------------------------
# Compiler config
#---------------------------------------------------------------------------------------
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

## make sure the livox_sdk_static library is installed
find_library(LIVOX_SDK_LIBRARY liblivox_sdk_static.a /usr/local/lib)
	include_directories(
		./
		${CMAKE_CURRENT_SOURCE_DIR}/Livox-SDK/sdk_core/include
	)

	link_directories(
		./
		${CMAKE_CURRENT_SOURCE_DIR}/Livox-SDK/build/sdk_core
	)

#else()
#	message("find livox sdk library success")
#endif()

## PCL library
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

#---------------------------------------------------------------------------------------
# generate excutable and add libraries
#---------------------------------------------------------------------------------------
add_executable(${PROJECT_NAME}_node
    ""
    )

#---------------------------------------------------------------------------------------
# precompile macro and compile option
#---------------------------------------------------------------------------------------
target_compile_options(${PROJECT_NAME}_node
    PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wall>
    )

#---------------------------------------------------------------------------------------
# add projects that depend on
#---------------------------------------------------------------------------------------
add_dependencies(${PROJECT_NAME}_node ${PROJECT_NAME}_generate_messages_cpp)

#---------------------------------------------------------------------------------------
# source file
#---------------------------------------------------------------------------------------
target_sources(${PROJECT_NAME}_node
	PRIVATE
	livox_ros_driver/lvx_file.cpp
	livox_ros_driver/ldq.cpp
	livox_ros_driver/lds.cpp
	livox_ros_driver/lds_lvx.cpp
	livox_ros_driver/lds_lidar.cpp
	livox_ros_driver/lds_hub.cpp
	livox_ros_driver/lddc.cpp
	livox_ros_driver/livox_ros_driver.cpp
	timesync/timesync.cpp
	timesync/user_uart/user_uart.cpp
	common/comm/comm_protocol.cpp
	common/comm/sdk_protocol.cpp
	common/comm/gps_protocol.cpp
	)

#---------------------------------------------------------------------------------------
# include file
#---------------------------------------------------------------------------------------
target_include_directories(${PROJECT_NAME}_node
    PUBLIC
    ${catkin_INCLUDE_DIRS}
    ${PCL_INCLUDE_DIRS}
    ${APR_INCLUDE_DIRS}
    common
    common/rapidjson
    comon/rapdidxml
    common/comm
    timesync
    timesync/user_uart
    livox_ros_driver
    )

#---------------------------------------------------------------------------------------
# link libraries
#---------------------------------------------------------------------------------------
target_link_libraries(${PROJECT_NAME}_node
	livox_sdk_static.a
	${Boost_LIBRARY}
	${catkin_LIBRARIES}
	${PCL_LIBRARIES}
	${APR_LIBRARIES}
	)


#---------------------------------------------------------------------------------------
# Install
#---------------------------------------------------------------------------------------

install(TARGETS ${PROJECT_NAME}_node
	ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
	LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
	RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
	)

install(DIRECTORY
  launch
  config
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
	)

#---------------------------------------------------------------------------------------
# end of CMakeList.txt
#---------------------------------------------------------------------------------------

2.0 Ubuntu
作者的运行环境是 Ubuntu 18.04,我们这里是ubuntu20.04,都可以。

2.1 ROS
确认本机的ros版本,我这里是noetic

2.2 gtsam
gtsam version is gtsam-4.0.3.
Note that: you need to add some functions to original gtsam code before compiling, please see the note at the end of this Readme.
注意安装作者的Note进行代码修改,并重新编译和安装。
gtsam的安装参考:
https://blog.csdn.net/weixin_40324045/article/details/121284253

#!bash
$ cd gtsam-1.X.X #替换成自己的目录
$ mkdir build
$ cd build
$ cmake ..
$ make check
$ sudo make install

2.3 ceres
Our ceres version is ceres-solver-1.14.0.

2.4 PCL
Our pcl version is pcl-1.9.

2.5 gcc/g++
Our gcc/g++ version is gcc/g++ -7.

2.6 Eigen3

2.7 TBB
Our tbb: Threading Building Blocks 2019 Update 9
Download it from github and build it in a folder. Link it using hard directory in STD Cmakelist.txt.
注意这里的TBB安装版本是 2019 Update 9。
安装参考:https://blog.csdn.net/qq_39779233/article/details/126284595
在参考连接中,注意版本,修改其中的版本连接内容:

sudo mkdir /usr/local/tbb-2019_U9

sudo cp -r oneTBB-2019_U9/include /usr/local/tbb-2019_U9/include
# 建立新安装tbb版本的符号链接
sudo ln -s /usr/local/tbb-2019_U9/include/tbb /usr/local/include/tbb

#将oneTBB-2019_U9/build/my_tbb_build_release 文件夹内的文件拷贝到 /usr/local/tbb-2019_U9/lib 文件夹下
sudo cp -r oneTBB-2019_U9/build/my_tbb_build_release /usr/local/tbb-2019_U9/lib
# 建立新安装tbb版本的符号链接
sudo ln -s /usr/local/tbb-2019_U9/lib/libtbb.so.2 /usr/local/lib/libtbb.so
sudo ln -s /usr/local/tbb-2019_U9/lib/libtbbmalloc.so.2 /usr/local/lib/libtbbmalloc.so
sudo ln -s /usr/local/tbb-2019_U9/lib/libtbbmalloc_proxy.so.2 /usr/local/lib/libtbbmalloc_proxy.so

echo 'export LD_LIBRARY_PATH=/usr/local/tbb-2019_U9/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

最后注意代码中出现的其他编译报错,根据报错信息进行修改:
common_lib.hpp修改:

void Pose6DToEigenRT(const Pose6D& p, gtsam::Matrix3 &R, gtsam::Vector3 &t)
{
  R = gtsam::Rot3::RzRyRx(p.roll, p.pitch, p.yaw).matrix();
  // t = gtsam::Point3(p.x, p.y, p.z).vector();
  t = gtsam::Point3(p.x, p.y, p.z);
}


四、下载开源数据并运行

数据下载

数据集地址:https://sites.google.com/view/mulran-pr/home

下载数据并按照相关数据文件结构进行存放数据,参考连接:https://blog.csdn.net/qq_40268190/article/details/110986161?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_utm_term%7ECtr-1-110986161-blog-111030936.235%5Ev43%5Epc_blog_bottom_relevance_base8&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_utm_term%7ECtr-1-110986161-blog-111030936.235%5Ev43%5Epc_blog_bottom_relevance_base8&utm_relevant_index=1

数据播放

数据集是MulRan ,其中的激光雷达数据是bin格式保存的,播放数据需要使用工具进行。
工具连接:https://github.com/RPM-Robotics-Lab/file_player_mulran
安装连接中readme.md文件进行编译和运行,实现数据播放。

总结

经过以上步骤,就可以在本机上运行开源代码和开源数据集,复现作者的效果。注意建图的默认模式是稀疏建图,如果使用稠密建图可以按照作者的说明进行代码设置。

 解开注释 "//#define save_for_mapconsistency_eva" in laserMapping.cpp.

重新编译就可以实现稠密建图,但是稠密建图占用的内存消耗非常大,需要在工作站运行。


http://www.kler.cn/a/542234.html

相关文章:

  • iOS主要知识点梳理回顾-3-运行时消息机制
  • 代码随想录day11
  • MYSQL利用PXC实现高可用
  • Maven 在 Eclipse 中的使用指南
  • Maven 版本管理与 SNAPSHOT 详解
  • 【Docker】
  • java项目之在线心理评测与咨询管理系统(源码+文档)
  • XZ_Mac电脑上本地化部署DeepSeek的详细步骤
  • 网格生成(meshing)
  • 系统思考—双环学习
  • 高效利用Python爬虫获取淘宝店铺详情:电商数据挖掘
  • [前端] axios网络请求二次封装
  • Jenkins+gitee 搭建自动化部署
  • LLaMA-Factory 安装linux部署conda笔记
  • 洛谷P9584 「MXOI Round 1」城市
  • 【人工智能】deepseek R1模型在蓝耘智算平台的搭建与机器学习的探索
  • FPGA实现UltraScale GTH光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供2套工程源码和技术支持
  • Moretl 增量文件采集工具
  • MybatisPlusCRUD接口使用
  • 借助 ListWise 提升推荐系统精排效能:技术、案例与优化策略
  • Baumer工业相机堡盟工业相机使用不同内外同轴光源进行检测的不同效果
  • 电脑变慢、游戏卡顿,你的SSD固态可能快坏了!
  • MySql --- 作业
  • 使用DeepSeek和Kimi快速自动生成PPT
  • MySQL InnoDB引擎 有哪些锁
  • AI工具发展全景分析与战略展望