4 minute read

MR-SLAM:一个模块化的多机SLAM

1. 项目基本信息

2. docker复现

2.1 Quick Demo 无法可视化(未解决)

docker pull maverickp/mrslam:noetic

每次退出停止容器后再进入想可视化均要运行 xhost +local:root 挂载数据集目录,根据自己具体的路径来,最后面是镜像ID

docker run -it --gpus all --network host -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/sd10/Downloads/mrslam:/home/dataset --name mrslam e835fa747c57
# 按道理 进去应该是/目录
cd home

新开终端时可以:docker exec -it -w /home mrslam bash

如果直接按照 mr-slam 中 Quick Demo 的教程运行的话,我这里的rviz无法显示,一片空白:

Quick Demo的结果

2.2 选择 Full Usage

roscore
rosbag play ./dataset/3_dog.bag --clock –pause  #数据集的路径可以自己设置,我是根据之前挂载的路径设置的
# 新开终端 选一个里程计:
cd Localization && source devel/setup.bash
roslaunch fast_lio robot_1.launch
roslaunch fast_lio robot_2.launch
roslaunch fast_lio robot_3.launch

# 新开终端 评估地图节点:
cd Mapping && source devel/setup.bash
roslaunch elevation_mapping_demos robot_1.launch
roslaunch elevation_mapping_demos robot_2.launch
roslaunch elevation_mapping_demos robot_3.launch   
#preprocess tools 这个工具我没运行
# 新开终端  回环检测模块
cd LoopDetection && source devel/setup.bash
# 我之前安装的是Python3 运行ring++时使用python3
cd src/RING_ros
python3 main_RINGplusplus.py

# 新开终端 地图管理:
cd Mapping && source devel/setup.bash
roslaunch global_manager global_manager.launch
# 新开终端 运行costmap converter
cd Costmap && source devel/setup.bash
roslaunch costmap_converter create_costmap.launch
# 新开终端 可视化:
rviz -d Visualization/vis.rviz

执行 rviz -d Visualization/vis.rviz 时报错

rviz -d Visualization/vis.rviz结果

  • 解决办法:在docker run中添加 --privileged 参数, 去掉 --network host 参数

如果修改代码需要尝试重新编译,在编译Loop时,出现python的问题,先which python3.8找到位置,然后cmake,用官方的miniconda我这里会报错 我这里是采用

catkin_make --cmake-args \
-DCMAKE_BUILD_TYPE=Release \
-DPYTHON_EXECUTABLE=/usr/bin/python3.8 \
-DPYTHON_INCLUDE_DIR=/usr/include/python3.8 \
-DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.8.so \
-DBUILD_PYTHON_BINDINGS=ON

成功,可视化为

可视化结果 可视化结果

3. 本地复现

3.1 CUDA安装

  • 下载地址: https://developer.nvidia.com/cuda-toolkit-archive
  • 选择好对应的版本,选择runfile,出现安装的命令语句:
    wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run
    sudo sh cuda_11.1.0_455.23.05_linux.run
    

    进入安装界面,按上下键盘移动光标,空格取消选择,我之前安装过驱动就取消了cuda自带的驱动,网上也有相关的cuda的安装教程 CUDA安装 CUDA安装 CUDA安装 安装完毕显示: CUDA安装

~/.bashrc 文件中添加如下环境变量

export PATH=/usr/local/cuda-11.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

这两句有时无法加入到那个文件,可以手动复制粘贴的那个文件末尾,通过 nvcc -V 验证是否安装成功

CUDA安装

之后按照教程即可

3.3 安装Grid Map

在安装Grid Map时, sudo apt install ros-$ROS_DISTRO-grid-map* ,如果电脑中有多个ROS,选择ROS tested on kinetic, melodic and noetic这几个,同时若安装时出现E:的错误,可以尝试先运行 sudo apt-get update

3.4 安装对应版本的pytorch

在官方网站可以看到对应的命令:https://pytorch.org/get-started/previous-versions/

pip install torch==1.10.1+cu111 torchvision==0.11.2+cu111 torchaudio==0.10.1 -f https://download.pytorch.org/whl/cu111/torch_stable.html

验证: pytorch安装

由于我的显卡驱动版本显示:

sd10@sd10-MS-7D76:~$ nvidia-smi
NVIDIA-SMI 535.216.03             Driver Version: 535.216.03   CUDA Version: 12.2 

我的 显卡驱动和CUDA 并不适配,并不确定是否能实现这个项目,先尝试一下

3.5 Mapping 编译

cd Mapping && catkin_make -DBUILD_PYTHON_BINDINGS=ON

会报错,如下图: Mapping编译

解决办法:

3.5.1 安装Kindr

通过git clone 源码或者直接下载release , 按照官网教程安装即可。 记录位置(没什么必要):cmake .. -DUSE_CMAKE=true 的结果位置 -- Build files have been written to: /home/sd10/slam/mr_slam/MR_SLAM/kindr/build

sudo make install 的安装位置:

-- Installing: /usr/local/include/kindr
-- Installing: /usr/local/share/kindr

安装之后仍报错:Kindr编译

解决办法(问的ai):

# 手动创建 kindr.pc 文件,既然 locate kindr.pc 没有找到 .pc 文件,我们需要手动创建一个:

sudo mkdir -p /usr/local/lib/pkgconfig
sudo vim /usr/local/lib/pkgconfig/kindr.pc

# 打开后 在编辑器中,添加以下内容(如果安装路径不同,请根据实际情况修改):

prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${prefix}/lib

Name: kindr
Description: Kinematics and Dynamics Library
Version: 1.0
Cflags: -I${includedir}/kindr
Libs: -L${libdir} -lkindr

# 保存并退出

# 更新 PKG_CONFIG_PATH 环境变量 ,让 pkg-config 能找到新建的 .pc 文件:

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

# 验证 pkg-config 是否找到 kindr: 
pkg-config --modversion kindr

# 下面这步我没执行,我觉得编译完就完事了,我应该不会多次编译,就没执行
# 为了每次开机自动生效,编辑 ~/.bashrc 文件:
echo 'export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig' >> ~/.bashrc
source ~/.bashrc

继续make,然后仍然报错: Mapping编译

解决办法:参考: https://github.com/MaverickPeter/MR_SLAM/issues/17 ,需要安装依赖:https://www.fftw.org/

3.5.2 安装fftw

下载压缩包或者去github下载源码,然后

mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc)  # 使用多核编译加速
sudo make install

上面步骤是参考: https://github.com/MaverickPeter/MR_SLAM/issues/17 如果按照官方教程会出现问题 https://github.com/FFTW/fftw3/blob/master/README ,如下图 安装fftw

继续 catkin_make -DBUILD_PYTHON_BINDINGS=ON 后还会报错 Mapping编译

解决办法:在 MR_SLAM/Mapping/src/elevation_mapping_periodical/elevation_mapping/CMakeLists.txt 中 注释掉 find_packagecatkin_package 中的 kindr , 在 include_directories 添加 /usr/local/include/kindr , 然后编译不成功的话可以清理旧的工作空间 rm -rf build devel 重新编译

报错: Mapping编译

解决办法:

3.5.3 安装 octomap

安装对应的: sudo apt install ros-$ROS_DISTRO-octomap*

3.6 Localization 编译

cd Localization && catkin_make

我之前没安装ceres库,会报缺失: Localization编译

3.6.1 ceres 安装

安装:下载压缩包,参考安装步骤: http://ceres-solver.org/installation.html#linux , 安装时可能需要sudo权限 , 回到 catki_make 报错 Localization编译

原因: ceres版本不匹配,我安装的2.2的ceres,可以尝试安装低版本的,或者修改源代码,我选择修改源代码(参考:https://github.com/HKUST-Aerial-Robotics/A-LOAM/issues/60

把ALOAM的src源代码中的

ceres::LocalParameterization *q_parameterization = new ceres::EigenQuaternionParameterization();

to :修改为

ceres::Manifold *q_parameterization = new ceres::EigenQuaternionManifold();

继续catkin_make报错 Localization编译

这个好像也是ceres版本带来的问题,低版本可能没有这些问题(没试过) 解决办法:参考:https://github.com/HKUST-Aerial-Robotics/A-LOAM/issues/65 将下面这段。粘贴到 Localization/src/A-LOAM/CMakeLists.txt的set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g") 语句下

option(USE_CUDA "Enable use of CUDA linear algebra solvers." ON)
if (USE_CUDA)
if (CMAKE_VERSION VERSION_LESS 3.17)
# On older versions of CMake (20.04 default is 3.16) FindCUDAToolkit was
# not available, but FindCUDA was deprecated. To avoid special-case handling
# elsewhere, emulate the effects of FindCUDAToolkit locally in terms of the
# expected CMake imported targets and defined variables. This can be removed
# from as soon as the min CMake version is >= 3.17.
find_package(CUDA QUIET)
if (CUDA_FOUND)
message("-- Found CUDA version ${CUDA_VERSION} installed in: "
"${CUDA_TOOLKIT_ROOT_DIR} via legacy (< 3.17) CMake module. "
"Using the legacy CMake module means that any installation of "
"Ceres will require that the CUDA libraries be installed in a "
"location included in the LD_LIBRARY_PATH.")
enable_language(CUDA)
macro(DECLARE_IMPORTED_CUDA_TARGET COMPONENT)
    add_library(CUDA::${COMPONENT} INTERFACE IMPORTED)
    target_include_directories(
    CUDA::${COMPONENT} INTERFACE ${CUDA_INCLUDE_DIRS})
    target_link_libraries(
    CUDA::${COMPONENT} INTERFACE ${CUDA_${COMPONENT}_LIBRARY} ${ARGN})
endmacro()

declare_imported_cuda_target(cublas)
declare_imported_cuda_target(cusolver)
declare_imported_cuda_target(cusparse)
declare_imported_cuda_target(cudart ${CUDA_LIBRARIES})

set(CUDAToolkit_BIN_DIR ${CUDA_TOOLKIT_ROOT_DIR}/bin)

else (CUDA_FOUND)
message("-- Did not find CUDA, disabling CUDA support.")
update_cache_variable(USE_CUDA OFF)
endif (CUDA_FOUND)
else (CMAKE_VERSION VERSION_LESS 3.17)
find_package(CUDAToolkit QUIET)
if (CUDAToolkit_FOUND)
message("-- Found CUDA version ${CUDAToolkit_VERSION} installed in: "
"${CUDAToolkit_TARGET_DIR}")
set(CUDAToolkit_DEPENDENCY
"find_dependency(CUDAToolkit ${CUDAToolkit_VERSION})")
enable_language(CUDA)
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.18")
# Support Maxwell, Pascal, Volta, Turing, and Ampere GPUs.
set(CMAKE_CUDA_ARCHITECTURES "50;60;70;80")
message("-- Setting CUDA Architecture to ${CMAKE_CUDA_ARCHITECTURES}")
endif()
list(APPEND CERES_CUDA_LIBRARIES
CUDA::cublas
CUDA::cudart
CUDA::cusolver
CUDA::cusparse)
set(CMAKE_CUDA_RUNTIME_LIBRARY NONE)
else (CUDAToolkit_FOUND)
message("-- Did not find CUDA, disabling CUDA support.")
update_cache_variable(USE_CUDA OFF)
endif (CUDAToolkit_FOUND)
endif (CMAKE_VERSION VERSION_LESS 3.17)
endif (USE_CUDA)

成功

3.7 Costmap 编译

cd Costmap && catkin_make

报错: Costmap编译 Costmap编译

在costmap 的 src的cmakelists文件中添加:

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON),添加后保存

保存时有时会需要sudo权限

3.8 LoopDetection 编译

cd LoopDetection && catkin_make -DBUILD_PYTHON_BINDINGS=ON

成功

3.9 运行

3.9.1 运行 rosrun disco_ros main.py 时报错

main.py运行

解决办法,参考: https://github.com/MaverickPeter/MR_SLAM/issues/17 https://github.com/MaverickPeter/MR_SLAM/issues/6

这几个issue中叙述 You need to follow the README in disco/tools and build gputransform ,在tools里把cpu或者gpu运行 python3 setup.py build_ext –inplace 我选择在cpu里进行,会生成:gputransform.cpython-38-x86_64-linux-gnu.so 文件,复制粘贴到 main dir of disco_ros. , 即 LoopDetection/src/disco_ros/ 下,然后还报错: main.py运行

解决办法:

3.9.2 Fast GICP 问题

参考对应文件的README: https://github.com/MaverickPeter/MR_SLAM/issues/4 在git克隆的文件mrslam下执行:

git submodule sync
git submodule update --init --recursive

# 执行
cd /Mapping/src/fast_gicp
python3 setup.py install –user

3.9.3 继续运行disco的话还会报open3d的错误:

disco的main.py运行

解决办法: 直接安装:pip install open3d 然后运行,成功: disco的main.py运行

3.9.4 尝试SC描述子,报错:

main_SC.py运行

同样的解决办法,参考对应文件的README, 参考:https://github.com/MaverickPeter/MR_SLAM/tree/main/LoopDetection/src/RING_ros 在对应目录下执行:

sd10@sd10-MS-7D76:~/slam/mr_slam/MR_SLAM/MR_SLAM/LoopDetection/generate_bev_cython_binary$ python3 setup.py install –user

sd10@sd10-MS-7D76:~/slam/mr_slam/MR_SLAM/MR_SLAM/LoopDetection/generate_bev_pointfeat_cython$ python3 setup.py install --user

3.9.5 torch_radon的问题,

同样的问题:LoopDetection/src/RING_ros/README.md中有写安装办法

cd torch-radon
python setup.py install
# python不行使用python3,没有权限加上 --user

3.9.6 缺失库

main_SC.py运行

解决办法: 安装时 pip3 install -U scikit-image 报错: main_SC.py运行

这个我这是由于pip3的版本太老了,升级一下,有时电脑中会有多个pip,旧版本的会干扰系统,需要先卸载再更新,更新后

pip3 install --user -U scikit-image
python3 main_SC.py   #成功

尝试ring和ring++均成功

3.9.7 create_costmap.launch 报错

create_costmap.launch运行

但是不影响可视化:

3.9.10 可视化

可视化