SLAM 算法复现记录:DCL-SLAM
分布式多机SLAM
1. 项目基本信息
2. 复现过程
catkin build dcl_lio_sam 报错

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

- 解决办法:选择更稳定的网络,热点换校园网有时可以解决 或者 选择手动下载压缩包
- 手动下载压缩包:进入
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_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,报错:
解决办法:src/DCL-FAST-LIO/CMakeLists.txt中注释掉find_package()中的pcl_catkin catkin build dcl_fast_lio成功
roslaunch dcl_slam run.launch 报错

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

分析错误
- 第一个错误是回环问题,在/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文件
运行过程中出现问题
只有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多行,修改之后注意重新编译

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 #转换对应的文件