less than 1 minute read

分布式多机SLAM

1. 项目基本信息

  • 系统:Ubuntu 20.04
  • ROS 版本:Noetic
  • 项目地址旧的地址 新的地址
  • 依赖:pcl:1.10 gtsam:4.03
  • 这是我的复现过程记录,并非教程,因此会有一些不必要的操作

2. 复现过程

catkin build dcl_lio_sam 报错

catkin build dcl_lio_sam结果

  • 定位错误,原因:由于github连接不稳定,导致对应压缩包无法下载,metis_catkin 和 gflags_catkin 构建失败 catkin build dcl_lio_sam结果 catkin build dcl_lio_sam结果

  • 解决办法:选择更稳定的网络,热点换校园网有时可以解决 或者 选择手动下载压缩包
  • 手动下载压缩包:进入src/metis_catkin/CMakeLists.txt 中可以看到对应的网址,手动下载,然后修改CMakeLists.txt文件,注释掉原来的:
#set(METIS_URL https://github.com/ethz-asl/thirdparty_library_binaries/raw/master/metis-5.1.0.tar.gz)#原来的
set(METIS_URL file:///home/ubuntu2004/DCL_SLAM/src/metis_catkin/metis-5.1.0.tar.gz)#采用本地下载的文件 file://后跟着安装包的路径

同理src/gflags_catkin/CMakeLists.txt,中下载压缩包并修改文件内容为:

#URL https://github.com/gflags/gflags/archive/v2.2.1.zip #原来的
URL file:///home/ubuntu2004/DCL_SLAM/src/gflags_catkin/gflags-2.2.1.zip  # 使用 file:// 协议引用本地文件

build成功 catkin build dcl_lio_sam结果

catkin build dcl_fast_lio 报错

catkin build dcl_fast_lio结果

  • 原因好像是livox_ros_driver没有成功编译,选择手动编译 参考官方网址:https://github.com/Livox-SDK/livox_ros_driver.git按照对应教程手动编译,选一个目录下载源码,进行编译,后续进行替换后这个文件可以删除
    git clone https://github.com/Livox-SDK/livox_ros_driver.git ws_livox/src
    cd ws_livox
    catkin_make
    

    将上面编译的文件ws_livox/src中的livox_ros_driver 全部复制或移动到DCL_SLAM对应的 src/livox_ros_driver/ 目录下,替换原来的livox_ros_driver

  • 继续catkin build dcl_fast_lio,报错: catkin build dcl_fast_lio结果 解决办法:src/DCL-FAST-LIO/CMakeLists.txt 中注释掉 find_package() 中的 pcl_catkin
  • catkin build dcl_fast_lio成功

roslaunch dcl_slam run.launch 报错

roslaunch dcl_slam run.launch结果

source一下对应的devel/setup.bash,没有解决,继续roslaunch报错 roslaunch dcl_slam run.launch结果

分析错误

  • 第一个错误是回环问题,在/src/DCL-SLAM/CMakeLists.txt末尾添加:
add_executable(${PROJECT_NAME}_loopVisualizationNode src/loopVisualizationNode.cpp)
add_dependencies(${PROJECT_NAME}_loopVisualizationNode ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_generate_messages_cpp)
target_compile_options(${PROJECT_NAME}_loopVisualizationNode PRIVATE ${OpenMP_CXX_FLAGS})
target_link_libraries(${PROJECT_NAME}_loopVisualizationNode ${catkin_LIBRARIES} ${PCL_LIBRARIES} ${OpenCV_LIBRARIES} ${OpenMP_CXX_FLAGS} ${libnabo_LIBRARIES})

并在对应目录下新建文件:mkdir dcl_output log , 具体目录可以看:src/distributed_mapper/src/pairwise_consistency_maximization/global_map/global_map.cpp中的代码,通过这个文件来接受到回环配对的输出

  • 第二个问题是数据包问题,需要修改对应的 src/DCL-SLAM/launch/run.launch 文件 launch文件修改

运行过程中出现问题

process die问题 只有a机器人的优化有问题,解决办法:参考 https://github.com/BigMoWangying/LiDAR-Iris/issues/8#issuecomment-1519928857 在src/DCL-SLAM/src/lidarIrisDescriptor.cpp文件中inline cv::Mat lidar_iris_descriptor::circColShift(函数中加:

	if (n == src.cols) return src.clone();     

大概第130多行,修改之后注意重新编译 process die修改

dcl-slam在rviz中全局地图显示不完全

全局地图显示不全

解决办法: 在src/DCL-SLAM/src/distributedMappingVisualization.cpp文件中注释掉之前的,改用:

	std::vector<int> indices;
	indices.resize(poses_6d_cloud_copy->size());
	std::iota(indices.begin(), indices.end(), 0);  // 0 到 N-1

如下图: 全局地图显示不全修改

最终输出

可视化结果

dcl-slam的轨迹为 /a/lio_sam/mapping/odometry fast-lio的为/a/Odometry话题

ros2的数据集转化为ros1的bag,参考这个网址https://ternaris.gitlab.io/rosbags/topics/convert.html

rosbags-convert S3E_Campus_Road_1  #转换对应的文件