SLAM 算法复现记录:MR-SLAM
MR-SLAM:一个模块化的多机SLAM
1. 项目基本信息
- 系统:Ubuntu 20.04
- ROS 版本:Noetic
- 项目地址:https://github.com/MaverickPeter/MR_SLAM
- 这是我的复现过程记录,并非教程,因此会有一些不必要的操作
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无法显示,一片空白:

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 时报错

- 解决办法:在
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的安装教程
安装完毕显示:

在 ~/.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 验证是否安装成功

之后按照教程即可
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
验证:

由于我的显卡驱动版本显示:
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
会报错,如下图:

解决办法:
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
安装之后仍报错:
解决办法(问的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,然后仍然报错:

解决办法:参考: 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 ,如下图

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

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

解决办法:
3.5.3 安装 octomap
安装对应的: sudo apt install ros-$ROS_DISTRO-octomap*
3.6 Localization 编译
cd Localization && catkin_make
我之前没安装ceres库,会报缺失:

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

原因: 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报错

这个好像也是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 的 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 时报错

解决办法,参考: 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/ 下,然后还报错:

解决办法:
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的错误:

解决办法: 直接安装:pip install open3d 然后运行,成功:

3.9.4 尝试SC描述子,报错:

同样的解决办法,参考对应文件的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 缺失库

解决办法: 安装时 pip3 install -U scikit-image
报错:

这个我这是由于pip3的版本太老了,升级一下,有时电脑中会有多个pip,旧版本的会干扰系统,需要先卸载再更新,更新后
pip3 install --user -U scikit-image
python3 main_SC.py #成功
尝试ring和ring++均成功
3.9.7 create_costmap.launch 报错

但是不影响可视化:
3.9.10 可视化
