如果你也是刚把A-LOAM的仓库拉下来,在本地Ubuntu上折腾了一整天,要么被Ceres版本卡住,要么被OpenCV头文件按在地上摩擦,那我建议你直接换个思路:去AutoDL上开一台机器来复现。这不是“偷懒”,而是把有限的精力花在真正该研究的算法上,而不是跟依赖库较劲。
A-LOAM是激光SLAM入门的经典项目,它去掉了原版LOAM里晦涩的非线性优化实现,改用Ceres Solver重新组织,代码结构清晰很多,非常适合用来理解激光里程计和建图的完整链路。这篇文章我从头到尾走一遍在AutoDL上复现A-LOAM的完整流程,包括实例创建、环境配置、源码编译、数据集准备、运行演示,以及我在这条路上踩过的所有坑。适合刚入门激光SLAM、想快速跑通一个真实SLAM系统、又不愿意在本地环境配置上浪费太多时间的同学。
1. 先别急着上手:A-LOAM复现到底是在复现什么
很多人一上来就复制命令,跑通了也不知道自己在跑什么。我建议先花五分钟把A-LOAM的来龙去脉理清楚,后面遇到问题才不至于两眼一抹黑。
1.1 LOAM与A-LOAM的差异:为什么选择A-LOAM入门
LOAM(LiDAR Odometry and Mapping)是Zhang Ji等人提出的激光SLAM算法,港科大沈劭劼团队在开源时做了不少工程化改进,A-LOAM就是其中一个广为人知的版本。A-LOAM保留了LOAM的核心思路:前端做特征提取(角点和平面点),中端做帧间配准得到里程计,后端维护局部地图做优化,最后输出高频低精度的里程计结果和低频高精度的建图结果。
A-LOAM和原版LOAM最大的区别在于,它把后端优化部分从作者自己实现的非线性优化改成了Ceres Solver,代码量更少、结构更清晰,对于想学习算法细节的人来说友好得多。A-LOAM还适配了多种激光雷达型号,提供VLP-16、HDL-64等launch文件,这也是很多人拿它当入门项目的原因。
不过它也有明显的特点:A-LOAM没有后端回环检测,也没有完整的图优化框架,它更像一个“轻量级激光里程计+建图”的演示系统。理解这一点很重要,因为后续你换数据集、改参数,预期要跟实际情况匹配。
1.2 复现所需的技术栈清单
在动手之前,先盘点一下A-LOAM依赖的核心库,这样配置环境的时候才知道每一步在干什么:
- ROS:整个系统的通信框架,A-LOAM的节点通过ROS话题收发点云、位姿和地图。
- Eigen3:矩阵运算库,A-LOAM的位姿解算大量用到Eigen的数据结构。
- Ceres Solver:非线性优化库,A-LOAM的后端优化全依赖它。
- PCL:点云处理库,用于点云滤波、特征提取和可视化。
- OpenCV:A-LOAM在视觉辅助部分用到,比如点云强度图的投影显示。
这里面的核心是ROS和Ceres。ROS不用多说,整个A-LOAM就是几个ROS节点在协作;Ceres则是A-LOAM和原版LOAM差异最大的地方,也是编译时最容易出幺蛾子的环节,后面我会单独讲版本问题。
1.3 为什么在AutoDL上复现,而不是本地虚拟机
我自己在本地踩过不少坑。如果你用的是Windows,得装双系统或虚拟机,虚拟机里跑ROS本身就别扭;如果你用的是Mac,对不起,ROS的体验更糟。就算你本地是Ubuntu,一旦系统里已经装过别的深度学习环境、OpenCV版本冲突,A-LOAM的编译就会一团乱麻。
AutoDL的价值在于:它提供干净的Linux环境、按小时计费、配置可以随时销毁重建,而且有“无卡模式开机”这种省钱机制。A-LOAM本身不需要GPU算力,纯CPU就能跑,但AutoDL的便利性在于环境隔离和快速重置——装坏了就销毁重来,不用像本地环境一样畏首畏尾。另外,AutoDL自带国内访问速度快的源,下载依赖库和数据集都比本地省心。
2. AutoDL算力云实例创建与环境准备
既然决定用AutoDL,第一步就是在平台上创建一台合适的实例。这一步看似简单,但有几个细节直接影响后续效率。
2.1 镜像选择:版本坑从这一步就避开
创建实例时,平台会让你选基础镜像。很多人习惯性选PyTorch、TensorFlow这些带深度学习框架的镜像,但对A-LOAM来说,这些框架完全用不上,反而会带来OpenCV版本冲突的隐患。
我的建议是选“Miniconda”或者不带深度学习框架的基础镜像。为什么?因为A-LOAM需要的ROS、Eigen、PCL、Ceres都是系统级依赖,跟conda环境里的Python包关系不大,选择净净的基础镜像,后续自己装ROS反而更可控。如果你运气好,在社区镜像里能搜到带ROS的镜像,那确实能省不少时间,但我不太推荐——因为你不知道镜像作者用的是什么版本组合,一旦和A-LOAM源码不兼容,排查起来更痛苦。
注意一下镜像对应的Ubuntu版本。A-LOAM是ROS 1时代的老项目,用Ubuntu 20.04搭配ROS Noetic最稳妥。AutoDL大多数基础镜像默认就是Ubuntu 20.04,创建实例前在镜像详情里确认一下即可。
2.2 实例创建与SSH登录关键参数
创建实例时选择一张便宜的GPU卡就行。A-LOAM跑起来连GPU的1%都用不到,本质是CPU密集型任务,选最低配的卡就是为了开机的入场券。如果你只是为了跑通A-LOAM,选择按量计费,用多久算多久,跑完就关机销毁,成本可以控制在几块钱以内。
实例创建成功后会进入“开机中”状态,稍等片刻就能在实例列表看到SSH登录指令,类似这样:
ssh -p 32373 root@connect.xxx.seetacloud.com密码在实例信息页面可以查看。我第一次用时对着这个端口号愣了半天,后来才意识到AutoDL的SSH不是默认22端口,而是每个实例随机分配一个高位端口,连接时一定要把-p参数带上。
登录之后建议先跑一遍系统更新:
apt update && apt upgrade -yAutoDL的apt源默认已经配置成了国内镜像,下载速度相当快,这一步几乎不用等。
2.3 无卡模式与VS Code远程连接的省钱省心技巧
AutoDL有两个功能,我觉得对复现A-LOAM来说比GPU本身更有用:一是“无卡模式开机”,二是“VSCode远程连接”。
无卡模式的意思是,实例开机时不分配GPU,只保留CPU和内存,计费价格低很多。A-LOAM整个流程——装环境、编译、跑数据集——完全不需要GPU,所以我的做法是:先关机,然后勾选“无卡模式开机”,在这个模式下把所有环境配置好、编译通过、跑完数据,再关机销毁。钱花得极少,体验却一点不差。
VS Code远程连接适合需要频繁改代码的人。本地VS Code装好Remote-SSH插件后,用AutoDL实例的SSH信息直接连接,代码在远端跑,本地看日志、改文件都很方便。跑A-LOAM时我经常需要看rviz窗口,用VS Code配合终端和端口转发,比每次都去网页终端敲命令高效很多。
3. 从零手写ROS与核心依赖库配置
环境配置是复现A-LOAM过程中最容易劝退人的部分。我尽量把每一步的命令写完整,并且解释为什么这么做。
3.1 安装ROS Noetic并初始化工作空间
ROS Noetic安装命令比较固定:
sudo apt install -y ros-noetic-desktop-full桌面完整版会带上rviz、tf等可视化工具,A-LOAM的Launch文件依赖这些组件,所以不要装精简版。装完以后配置环境变量:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc紧接着安装一些编译工具:
sudo apt install -y python3-rosdep python3-catkin-tools python3-rosinstall-generator这里有个可以跳过的坑:很多教程让执行sudo rosdep init和rosdep update,但这一步经常因为网络问题卡住,而且A-LOAM编译过程其实不需要rosdep解析依赖,因为它的依赖库我们手动装齐了。我实测下来,跳过rosdep完全没问题,能省不少时间。
最后创建一个catkin工作空间:
mkdir -p ~/aloam_ws/src cd ~/aloam_ws catkin_make第一次跑catkin_make会自动生成build和devel目录,可能报一些缺包的错误,别慌,后面把所有依赖装完再回来编译就不会了。
3.2 Eigen3与PCL的安装与版本验证
Eigen3和PCL直接通过apt安装就行:
sudo apt install -y libeigen3-dev libpcl-devUbuntu 20.04默认的Eigen是3.3.7,PCL是1.10,这两个版本配合A-LOAM源码没有问题。装完之后建议验证一下Eigen版本,因为后面Ceres编译会用到Eigen:
pkg-config --modversion eigen3如果打印出3.3.x,说明没问题。有些镜像里Eigen是3.4甚至更高版本,3.4跟PCL 1.10配合可能出现点类型声明的兼容性报错,一旦遇到,最简单的办法是手动装回Eigen 3.3.7,后面我会在排查章节详说。
3.3 Ceres Solver编译安装:版本坑详解
Ceres是A-LOAM唯一的硬骨头。A-LOAM在CMakeLists里直接写死了Ceres依赖,但它早期的代码是为Ceres 1.x设计的。Ubuntu 20.04用apt默认装的Ceres是1.14.0,这是一个经过验证的稳妥选择:
sudo apt install -y libceres-dev如果你想通过源码安装Ceres,务必锁定1.14.0版本,不要装2.x:
sudo apt install -y libgoogle-glog-dev libgflags-dev libatlas-base-dev git clone https://github.com/ceres-solver/ceres-solver.git cd ceres-solver git checkout 1.14.0 mkdir build && cd build cmake .. make -j$(nproc) sudo make install为什么这么强调版本?因为Ceres 2.x对SPARSE_NORMAL_CHOLESKY等线性求解器的处理做了调整,和A-LOAM源码里的调用方式不兼容,编译阶段就会报错。如果你在用apt装Ceres时报错找不到包,那就走源码安装路线,注意checkout到1.14.0这个tag。
3.4 OpenCV 4.x兼容性修复
Ubuntu 20.04自带的OpenCV是4.2版本。A-LOAM源码里部分文件用的是OpenCV 3时代的头文件和接口,编译时会报两类典型错误:
fatal error: opencv/cv.h: No such file or directoryerror: 'CV_LOAD_IMAGE_COLOR' was not declared in this scope
第一个错误是因为OpenCV 4把一些旧的C接口头文件移除了,第二个是因为读取图像的方式变了。解决办法是手动修改A-LOAM源码中相关文件,打开laserMapping.cpp,把:
#include <opencv/cv.h> #include <opencv/highgui.h>改成:
#include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp>再把代码里所有CV_LOAD_IMAGE_COLOR改成cv::IMREAD_COLOR。修改之后重新编译即可。这也是我为什么强调用AutoDL而不是本地的原因——本地OpenCV版本可能比A-LOAM源码的适应范围更混乱,而AutoDL上一个干净环境里,修改点就那么两处,改完就过。
4. A-LOAM源码编译、数据集准备与运行
环境配好之后,把源码拉下来编译运行,整个复现就算完成大半了。
4.1 拉取源码并编译:完整命令流
A-LOAM的源码位于HKUST-Aerial-Robotics的A-LOAM仓库,在AutoDL终端里执行:
cd ~/aloam_ws/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.git cd ~/aloam_ws catkin_make第一次编译大概率会报错,最常见的还是OpenCV头文件问题,按3.4节的方法改完再重新编译。编译成功后会看到build目录下生成了aloam_velodyne、aloam_utils等可执行节点。编译完成后激活工作空间:
source ~/aloam_ws/devel/setup.bash注意每次新开终端要么重新source一次,要么把这行加到~/.bashrc里。
4.2 数据集准备:两种高效方案
跑A-LOAM需要一份激光雷达录制的rosbag。这里介绍两种方案,按需要选择。
方案一:直接下载别人转好的小bag。最经典的是LOAM作者提供过的室内场景bag——nsh_indoor_outdoor.bag,数据量小、场景简单,几十秒就能跑完,非常适合验证环境是否正确。这个bag文件网上资源很多,AutoDL下载也方便。
方案二:使用KITTI数据集。KITTI是自动驾驶公开数据集,A-LOAM仓库自带的kitti_helper节点就是为此设计的。你需要把KITTI odometry数据集的某个序列下载下来,然后修改kitti_helper.cpp里数据路径的宏定义,重新编译。KITTI的数据是bin格式,kitti_helper节点会负责把bin文件转换成ROS点云话题发布。这种方法更贴近论文实验场景,但KITTI数据下载体积较大,下载速度也看网络。
我第一次跑的时候选的方案一,主要原因是快,能迅速验证整个流程通不通。等环境完全跑通、你开始研究参数对效果的影响时,再上KITTI也不迟。
4.3 启动launch与rviz可视化实操
下载好bag文件后,启动A-LOAM:
roslaunch aloam_velodyne aloam_velodyne_VLP_16.launch接着播放bag:
rosbag play nsh_indoor_outdoor.bag这时终端会刷出大量递帧里程计信息。如果希望慢速播放观察建图过程,可以加一个速率参数:
rosbag play -r 0.5 nsh_indoor_outdoor.bag可视化方面,AutoDL实例默认没有桌面环境,但你可以通过两种方式看到rviz窗口。第一种是通过AutoDL的VNC图形界面功能,在控制台工具里开启VNC后,网页端就能看到远程桌面,然后在远程桌面里运行rviz;第二种是把生成的pcd点云地图文件下载到本地,用CloudCompare打开查看。
A-LOAM运行过程中,rviz里固定坐标系选择camera_init,添加PointCloud2话题/velodyne_cloud_registered和/map,就能看到点云地图逐渐累积的过程。如果你不方便开rviz,也不影响验证——A-LOAM在跑完bag后会把完整地图保存成map.pcd文件,路径在launch文件里配置,默认是当前目录。
4.4 无桌面环境下的结果查看替代方案
如果你不想折腾VNC,我的建议是把点云结果拿到本地看。运行结束后,用scp命令把map.pcd从AutoDL拉回本地:
scp -P 32373 root@connect.xxx.seetacloud.com:~/aloam_ws/map.pcd .本地用CloudCompare或者Open3D打开,旋转视角就能看到完整的建图效果。这个方法虽然少了实时观看的快感,但在验证算法效果上完全够用,而且非常适合自动化批量测试不同数据集。
5. 踩坑记录:编译报错与运行异常的排查速查表
复现A-LOAM,踩坑是必然的。我把高频问题集中整理成一个表格,每个问题都附上解决办法。
5.1 高频编译错误与修复方法
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
| fatal error: opencv/cv.h: No such file or directory | OpenCV 4移除了旧头文件 | 修改laserMapping.cpp中的头文件引用 |
| CV_LOAD_IMAGE_COLOR未声明 | OpenCV 3旧接口 | 替换为cv::IMREAD_COLOR |
| Ceres版本相关模板编译报错 | Ceres 2.x兼容性问题 | 统一使用Ceres 1.14.0 |
| Eigen和PCL类型不兼容 | Eigen版本过高 | 降级Eigen到3.3.7 |
找不到aloam_velodyne包 | 工作空间未source | 执行source ~/aloam_ws/devel/setup.bash |
其中Eigen 3.4的问题比较隐蔽,报错信息可能是一大段模板错误,很多人看到就懵了。遇到这种问题,先跑一下pkg-config --modversion eigen3确认版本,只要是3.4就果断装回3.3.7,不要试图改源码适配,成本完全不成比例。
5.2 节点启动即退出与话题不通的定位思路
A-LOAM启动后如果某个节点秒退,可以先看launch文件里对应的node名字,然后在终端单独运行该节点,看具体报错。比如laserMapping节点启动后不打印任何信息就退出,大概率是依赖的TF树没有建立,这时候要先看看transformMaintenance节点是否正常启动。
话题不通也是常见问题。A-LOAM订阅的点云话题默认是/velodyne_points,如果bag文件里的话题名不是这个,rviz里自然看不到任何点云。排查方法很简单:
rostopic list看bag播放时有没有/velodyne_points这个话题。如果没有,就需要用rosbag info查看实际话题名,然后修改launch文件中的remap参数,把A-LOAM订阅的话题映射到bag的实际话题上。
5.3 时间戳、坐标系与点云坐标系对齐
rviz里看不到点云,除了话题名问题,另一个高频原因是坐标系不对。A-LOAM的规划里,所有点云都变换到camera_init坐标系下,如果rviz的Fixed Frame没设置成camera_init,点云会因为坐标系不存在而不显示。
另外,bag中如果同时包含多个传感器数据,可能出现时间戳不同步的问题。A-LOAM对点云时间戳比较敏感,一旦中间有空白期,算法可能突然跳到错误的位置,现象就是点云地图突然出现巨大跳变。解决方法是降低播放速度:
rosbag play -r 0.3 xxx.bag实在不行可以尝试用rostopic delay工具做时间对齐,但大多数情况下降低播放速度已经够了。
5.4 AutoDL特定问题:端口、存储与镜像复用
AutoDL自身也有几个容易踩的点。第一是SSH端口渐变——实例每次重新开机,SSH端口和地址都可能变化,所以每次开机都要去控制台重新确认连接信息。不要用之前存的连接串硬连,连不上就怀疑平台出问题,其实只是端口变了。
第二是存储空间。A-LOAM本身占用空间不大,但如果用KITTI数据集,几十GB的数据一下就能塞爆系统盘。创建实例时尽量选带数据盘的套餐,KITTI数据放数据盘,不要堆在系统盘里。
第三是镜像复用。AutoDL关机后可以保存镜像,如果你在A-LOAM环境上已经配好了一套完整依赖,跑完一次实验后可以把当前环境保存成自定义镜像,下次要再跑别的SLAM算法时直接基于这个镜像创建实例,能省下重新配环境的时间。不过注意,镜像保存会占用存储费用,不需要的时候及时清理就行。
6. 一轮跑通之后:从复现到二次开发的进阶建议
环境跑通、看到点云地图那一刻,复现任务算是完成了。但如果你觉得就这样结束了,那有点可惜——A-LOAM能教会你的东西远不止“会跑一个demo”。
6.1 理解代码结构与关键节点
A-LOAM有四个核心节点:scanRegistration负责从原始点云中提取角点特征和平面特征,laserOdometry负责帧间配准并输出高频里程计,laserMapping负责维护局部地图做优化,transformMaintenance负责维护TF坐标变换。建议按这个顺序读代码,先读scanRegistration,理解特征点的定义规则;再读laserOdometry,理解帧间配准的代价函数;laserMapping里涉及Ceres的部分,是理解A-LOAM和原版LOAM差异的关键。
我个人的经验是,读完scanRegistration之后,你对“角点特征尽量选在锐利边缘,平面特征尽量选在平滑平面”这个SLAM基本逻辑会有非常直观的理解,这将帮你今后阅读FAST-LIO、LIO-SAM等更复杂的算法时打下基础。
6.2 更换数据集的几个修改点
如果你想把A-LOAM跑在自己录制的数据上,通常要修改launch文件里的这几个参数:
- 点云话题名(remap到你的雷达话题)
- 雷达线数(VLP-16是16线,HDL-64是64线,直接影响特征提取参数)
- 雷达扫描周期(默认0.1秒对应10Hz)
- 点云强度阈值(关系到角点特征提取的过滤条件)
修改后重新编译或直接修改launch文件里的参数即可,A-LOAM这一块做得很灵活,不需要改算法源码。
6.3 从A-LOAM到FAST-LIO的下一步选择
跑通A-LOAM后,如果想继续在激光SLAM方向深入,比较自然的进阶路线是FAST-LIO、FAST-LIO2,再往后是LIO-SAM这类融合了惯性导航和回环检测的完整系统。你会发现,这些系统的核心模块里多少都有A-LOAM的影子:点云特征提取、帧间配准、局部地图维护,这些概念是贯穿整个激光SLAM领域的公共知识,把A-LOAM吃透了再上手别的算法,会轻松很多。
FAST-LIO2同样很适合在AutoDL上复现,因为它对CPU性能有一定要求,AutoDL的机器配置通常比个人电脑好不少,跑起来更流畅。
复现A-LOAM这件事,说难不难,但坑确实不少。我在AutoDL上花了不到半天时间就完成了环境搭建和实跑验证,对比之前在本地虚拟机里折腾的两天,效率高太多了。这里面最大的心得就是:不要把时间浪费在环境配置上,尤其当你只是想理解算法本身时,用AutoDL这种可以快速销毁重建的云端环境,是性价比最高的选择。
最后再分享一个小技巧:把A-LOAM跑通后,先别着急换数据集,把bag播放速度调成0.3倍,盯着rviz里的点云地图看一遍完整的建图过程。盯着点云逐渐累积、墙壁和桌子的轮廓慢慢浮现,你会对激光SLAM在建图时“前一帧是怎么和当前帧对齐的”这个抽象概念,产生非常直观的理解。这个感受,是看任何文档和论文都换不来的。