ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

在AutoDL云服务器上从零复现A-LOAM:ROS环境配置与依赖编译全攻略

2026/10/3 13:19:49 拓冰建站 浏览量
在AutoDL云服务器上从零复现A-LOAM:ROS环境配置与依赖编译全攻略 “兄弟A-LOAM又编译不过去了”这估计是很多刚入坑激光SLAM的同学在本地电脑上最真实的写照。Eigen版本冲突、PCL的VTK和Qt不对付、Ceres编译到一半CUDA报错……光是搞定环境就够喝一壶的更别提还要插着雷达或者找数据集跑通整个流程。我这次直接换了个思路把整个复现过程全部挪到了AutoDL云服务器上从零开始一步步把A-LOAM跑通。这篇文章就把我这边的完整操作细节和踩坑记录整理出来包括实例选型、ROS环境配置、依赖编译、数据集运行和轨迹验证照着操作基本能少走一半弯路。1. 项目整体拆解与方案选型1.1 A-LOAM到底在复现什么A-LOAM是港科大秦通博士开源的激光里程计算法全称是Advanced Implementation of LOAM。它是LOAM的改良版本去掉了原版里比较绕的复杂数学推导用Ceres Solver来替代手工求导的优化过程代码结构清爽很多特别适合用来学习激光SLAM的前端里程计算法。这个项目核心包含两个模块一个是基于角点和面点特征提取的scanRegistration节点另一个是做帧间匹配和位姿估计的laserOdometry节点。算法输入是3D激光雷达的点云数据输出是雷达的运动轨迹同时会生成一张用来做帧间配准的特征点云地图。在AutoDL上复现它本质上要做三件事把ROS环境装好、把依赖库编译通过、把示例数据跑起来并看到轨迹与建图效果。听起来简单但实际过程中版本坑非常多我后面会逐一展开。1.2 为什么选AutoDL而不是本地环境本地跑A-LOAM不是不行但有几个很现实的问题。首先是ROS版本和Ubuntu系统的绑定关系比如Ubuntu 20.04对应ROS Noetic18.04对应ROS Melodic一旦系统版本不对很多二进制包装不上就得走源码编译的老路。其次是PCL和Eigen的版本冲突。A-LOAM源码对Eigen的版本要求比较宽松但PCL编译时对Eigen的版本有额外要求本地如果装过其他ROS功能包很容易把Eigen头文件路径搞乱编译的时候一堆redefinition或者undefined reference报错。AutoDL的优势在于它提供干净的云主机环境系统、CUDA、Python环境都是可以自由选择的而且支持保存镜像快照。每次改坏环境直接恢复快照就行完全不心疼。按量计费的模式也很划算我这次跑完整套流程加调试实际使用时间大概五个小时左右费用在十几块钱的级别比自己折腾台式机划算得多。1.3 复现目标与整体流程动手之前先把目标定清楚。我这次复现要达成的标准有三条代码能完整编译通过、ROS节点能正常启动和通信、跑示例bag后能看到对应的点云地图和轨迹输出。达不到这三条就不能算真正复现成功。整体流程分成四步走实例创建与基础环境配置、ROS和依赖库安装、A-LOAM源码编译、数据集运行与结果验证。接下来每步我都会给出实际操作的命令和需要注意的细节。2. AutoDL实例创建与基础环境配置2.1 实例选型的几个关键决策打开AutoDL控制台创建实例有几个选项需要对着自己的需求仔细选。地区我选了北京可用区A因为当时这个区有RTX 2080 Ti的卡价格相对实惠。A-LOAM本身不依赖CUDA计算纯CPU也能跑所以对GPU型号完全不用纠结选最便宜的卡就行。真正影响体验的是内存大小建议至少选16G内存的实例因为编译PCL和Ceres的时候内存很容易冲破8G。镜像这一块是关键。不要选纯Miniconda镜像也不要选TensorFlow镜像直接选PyTorch 2.0 cu118这类的深度学习镜像。原因很简单这类镜像通常自带完整的CUDA驱动和cuDNN而且内置了conda环境后面如果想扩展跑一些基于深度学习的特征提取模块环境基础是现成的。系统版本我选了Ubuntu 20.04对应ROS Noetic。这里有个重要提醒目前AutoDL大部分镜像都是基于Ubuntu 20.04的如果你想装ROS Melodic反而要先确认镜像系统版本不要直接用标准镜像装Melodic会遇到部分依赖包找不到源的问题。2.2 基础环境初始化操作实例开机后通过JupyterLab的终端或者直接SSH连上去第一步先把软件源换成国内的否则apt下载速度会让你怀疑人生。# 备份并修改源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s|http://.*.com|http://mirrors.aliyun.com|g /etc/apt/sources.list sudo apt update这里补充说明一下AutoDL自带的镜像通常已经做过一部分环境优化比如pip源和conda源都会自动指向清华镜像所以pip这一块不用额外操作。apt源如果本身就是aliyun或者其他国内源就省掉上面这步。接下来装一些基础工具后面编译和调试都会用到。sudo apt install -y git vim tmux htop net-tools \ build-essential cmake g \ libgoogle-glog-dev libgflags-devtmux强烈建议装上因为后面跑rosbag播放数据的时候一个终端窗口根本不够用用tmux可以开多个会话同时看节点状态和可视化界面而且SSH断开后任务还能继续跑这个在云服务器上特别有用。2.3 ROS Noetic完整安装ROS的安装是所有依赖里的第一座大山。Noetic的安装流程本身不复杂就是包多有几百个依赖要装好在apt装起来很快。# 添加ROS源 sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list # 添加密钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install -y ros-noetic-desktop-full这里有一个常见的坑如果你用国内的网络环境直接访问packages.ros.org经常会出现连接超时或者下载一半断掉的情况。我建议直接改用ROS的清华镜像源把上面那条添加源的命令替换成sudo sh -c echo deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list安装完ROS后一定要执行环境配置。系统默认的bash配置文件里是不会自动加载ROS环境的每次新开终端不source的话所有ros命令都找不到。echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc基础工具也一并装上方便后面调试。sudo apt install -y python3-catkin-tools python3-osrf-pycommon python3-pip sudo apt install -y ros-noetic-rviz ros-noetic-tf2-geometry-msgs ros-noetic-laser-geometry注意不要用sudo pip install来装ROS相关的Python包Noetic默认基于Python3用apt装的版本和pip装的版本一旦混用很容易出现rosdep或者catkin工具链的版本冲突。3. A-LOAM依赖库编译与代码准备3.1 依赖库的版本选择逻辑A-LOAM的主要依赖有三个Eigen、PCL和Ceres Solver。前两个是ROS Noetic桌面版自带的不需要单独装但版本值得看一下。# 查看已安装的版本 dpkg -l | grep libeigen3-dev dpkg -l | grep libpcl-devROS Noetic自带的Eigen版本是3.3.7PCL版本是1.10这两个组合是没问题的A-LOAM源码本身对Eigen的API调用没有用到特别新的特性3.3版本完全兼容。Ceres Solver是重点因为它直接影响A-LOAM里的优化求解。Noetic的apt源里带的Ceres版本是1.14.0版本比较老虽然也能编译通过但如果你后续想对A-LOAM做二次开发或者集成其他因子图优化模块建议直接源码编译新版本Ceres 2.1.0。# 安装Ceres依赖 sudo apt install -y liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev # 编译Ceres git clone https://github.com/ceres-solver/ceres-solver.git cd ceres-solver git checkout 2.1.0 mkdir build cd build cmake .. make -j$(nproc) sudo make installCeres编译时间大概十分钟左右看CPU性能。这里建议用make -j$(nproc)并行编译AutoDL实例的CPU通常给的还行能明显加快编译速度。3.2 A-LOAM源码获取与目录结构源码直接用Git克隆就行cd ~ mkdir -p a-loam_ws/src cd a-loam_ws/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.git cd .. catkin_make第一次catkin_make会触发对A-LOAM三个包laserMapping、laserOdometry、scanRegistration的编译。这里有一个重要的细节A-LOAM源码里自带了一个/launch目录里面是aloam_velodyne.launch的示例编译后会生成对应的可执行文件但launch文件里默认订阅的雷达topic是/velodyne_points如果你后面用的bag数据topic不是这个需要修改launch文件。编译时大概率会遇到下面这几种报错我直接给出对应的解决办法。3.3 编译错误实战处理错误一找不到pcl/filters/voxel_grid.h头文件这个问题的根源在于PCL的CMake配置没有正确传递给A-LOAM。检查一下CMakeLists.txt里的find_package配置find_package(PCL 1.8 REQUIRED) find_package(OpenCV REQUIRED) find_package(Eigen3 REQUIRED) find_package(Ceres REQUIRED)正常来说PCL 1.10的库路径是能被自动找到的。如果还是报找不到多半是因为Ceres是用源码安装的它的头文件被装到了/usr/local/include而A-LOAM的CMakeLists没有把/usr/local加进include目录。在CMakeLists.txt里补上这句话就能解决include_directories(/usr/local/include)错误二undefined reference to ceres::...这类链接错误这个很典型说明Ceres的库文件没有被正确链接。A-LOAM源码里对Ceres的链接方式是target_link_libraries(laserOdometry ${CERES_LIBRARIES})如果你用的是源码安装的Ceres在Ubuntu 20.04下CMake找到的CERES_LIBRARIES变量可能为空。解决办法是直接把Ceres的库路径写死target_link_libraries(laserOdometry /usr/local/lib/libceres.so)laserMapping和scanRegistration两个target也照此处理。错误三fatal error: Eigen/Core: No such file or directoryEigen头文件路径没对上。Eigen默认装到/usr/include/eigen3而A-LOAM代码里引用的是#include Eigen/Dense需要在CMakeLists里加include_directories(/usr/include/eigen3)这三个是编译阶段最常见的坑处理完基本就能顺利生成三个可执行文件。4. 数据集准备与完整运行流程4.1 数据集选择和下载A-LOAM官方测试数据用的是KITTI的数据集但KITTI原始数据是bin格式要自己转成rosbag对新手来说比较折腾。我这次直接用了nsh_indoor_outdoor这个bag是国外一个研究所采集的室内外混合场景数据话题正好是/velodyne_points和A-LOAM默认配置完全匹配拿来就能跑。下载地址在谷歌云端硬盘上国内环境可能不太好下。我在实际测试中发现可以用代理下载后传到AutoDL或者直接用AutoDL的学术加速功能。这里我多说一句AutoDL控制台自带一个学术资源加速开关在实例列表里点击“学术加速”能明显提升访问GitHub和Google Drive的速度下载数据集前先开启这个开关可以省不少时间。数据集文件大小在1G左右下载到本地后通过scp或者AutoDL自带的文件传输功能上传到~/datasets目录mkdir -p ~/datasets # scp方式上传 scp nsh_indoor_outdoor.bag root你的实例IP:/root/datasets/4.2 修改launch文件适配数据启动前先检查一下launch文件里的参数。A-LOAM的launch文件支持两种雷达输入格式Velodyne格式是/velodyne_pointsOuster格式是/ouster/points我们用的bag是Velodyne格式的所以不需要改topic名称但需要确认launch里注释掉的是不是Ouster那两行。node namelaserMapping pkgaloam_velodyne typelaserMapping outputscreen param namescanPeriod value0.1/ /nodescanPeriod这个参数对于Velodyne VLP-16来说是0.1秒对应10Hz扫描频率。如果你手里的bag是其他频率的雷达数据比如VLP-32是20HzscanPeriod就要改成0.05改错的话地图会明显漂移或变形这个在后期看结果时非常直观。4.3 三步跑通完整流程运行A-LOAM需要三个终端窗口我习惯用tmux开三个session每个session跑一个任务。第一个窗口启动主节点tmux new -s roscore source /opt/ros/noetic/setup.bash source ~/a-loam_ws/devel/setup.bash roslaunch aloam_velodyne aloam_velodyne.launch第二个窗口回放数据tmux new -s bagplay source /opt/ros/noetic/setup.bash rosbag play ~/datasets/nsh_indoor_outdoor.bag --clock第三个窗口开RViz看可视化结果tmux new -s rviz source /opt/ros/noetic/setup.bash rviz在RViz中通过Add添加PointCloud2显示话题选择/laser_cloud_mapping固定坐标系选择camera_init就能看到地图点云在逐步构建的过程了。提示跑bagplay的时候一定记得加--clock参数。A-LOAM对时间戳的连续性比较敏感如果不发布/clock话题ROS的仿真时间会和bag里的时间戳对不上表现为地图建到一半点位突然乱跳。4.4 怎么判断算法是否真的跑对了很多新手看到RViz里有地图出来就觉得成功了其实跑通和跑对是两回事。我从三个维度来判断复现结果是否正常。第一是轨迹是否平滑。RViz里用Path显示/path话题如果轨迹点连续、没有明显跳变说明里程计估计正常。如果轨迹明显发散比如跑出几米后轨迹直接飘掉那就要检查雷达内参或者时间同步。第二是地图是否有重影。A-LOAM建出来的地图点云应当清晰边缘锐利。如果地图有严重的重影和重影飘移说明帧间匹配质量差大概率是scanPeriod设置不对或者外参初值问题。第三是里程计频率。在终端窗口输入rostopic hz /laser_odometry正常应该在10Hz左右如果掉到2-3Hz说明CPU性能跟不上或者Ceres优化迭代次数设置得太多。这三个维度都通过基本就能确认A-LOAM复现成功了。5. 常见问题与排查技巧实录5.1 高频报错速查表整理下我在AutoDL上实操时遇到的高频问题直接做成了表格方便以后复现时秒查报错现象根本原因解决办法catkin_make时找不到CeresCERES_LIBRARIES变量未正确链接在CMakeLists中直接指定/usr/local/lib/libceres.sorviz里看不到点云固定坐标系设置错误Fixed Frame改为camera_initrosbag play后地图不动没有使用--clock参数回放时加上--clock地图明显重影模糊scanPeriod参数与雷达频率不匹配根据雷达频率修改为0.05或0.1编译内存不足被kill实例内存太小换更大内存实例或临时加swaplaunch启动报node not found忘记source devel/setup.bash新终端里先source工作空间再执行launch5.2 排查过程实录第一个值得分享的坑是Ceres库冲突。AutoDL的PyTorch镜像里其实已经装了一个旧版本的Ceres在/opt/conda/lib目录下。如果我源码编译新版Ceres后直接make install新版本会装到/usr/local这样系统里就有了两套Ceres。A-LOAM编译时有可能链接到旧版本导致运行时崩溃。排查方式可以这样操作# 看看链接的是哪个Ceres ldd ~/a-loam_ws/devel/lib/aloam_velodyne/laserOdometry | grep ceres如果是链接到了/opt/conda/lib下的旧版就在编译前把conda的库目录临时排除掉或者用LD_LIBRARY_PATH强制指定/usr/local/lib优先。第二个坑是bag数据回放速度。AutoDL的CPU性能普遍不错rosbag play默认以最大速度回放有时候会超过10倍速导致A-LOAM节点来不及处理每帧点云。这样跑出来的地图会有点稀疏但不会崩溃不过如果你发现地图质量不对用rosbag play -r 1.0把回放速度限制到1倍速再试一次。第三个经验是关于如何快速迭代调试。AutoDL支持保存镜像快照我在环境装好的那一刻也就是A-LOAM编译通过但还没跑bag的时候存了一个快照。后面我把launch文件改坏了或者装依赖把环境搞乱了直接恢复快照五分钟回到干净状态完全不用重新编译。这个习惯强烈推荐每个在云服务器上做复现的人都养成。5.3 一次典型断点调试案例我再分享一个实际调试中遇到的比较隐蔽的问题。当时跑bag时ROS终端没有任何报错RViz里也能看到点云但建出来的地图是一条线完全没有展成平面。我开始排查点云特征话题rostopic hz /laser_cloud_sharp rostopic hz /laser_cloud_flat结果发现/laser_cloud_sharp频率极低几秒钟才来一帧。再用rostopic echo看了下点云数据的内容发现大部分点的曲率都是NaN。问题定位到了代码里对点云法向量计算的地方。检查后确认是PCL版本的问题。Noetic自带的PCL 1.10里计算法向量用的是pcl::NormalEstimation而A-LOAM源码在获取点云坐标时用的是.getVector3fMap()接口这个接口在高版本Eigen中对未对齐内存比较敏感在特定编译器优化级别下会产生未初始化的数据。解决方法是调整编译选项在CMakeLists.txt里加上add_compile_options(-O1)把默认的-O3改成-O1这个问题就消失了。这个坑在不看数据细节的情况下特别难发现因为表面上看节点都在正常通信点云也在持续输出只有打开点云内容检查数值时才看得到问题。学习效率小技巧再分享几个我在AutoDL上反复试出来觉得很有用的习惯。一是每个大阶段都存档。装完ROS存一个快照装完依赖存一个快照编译通过再存一个。虽然AutoDL的镜像存储按容量计费但几个快照的量级很小费用几乎可以忽略。二是善用scp备份bag数据。AutoDL的云盘空间有限我一般不会把多个数据集全放上去。跑完一个数据集后如果暂时不需要了建议先scp回本地备份再删除云端的文件避免占空间。三是日志重定向。跑长时间bag时终端输出会被日志刷屏影响观察。启动节点时可以这样重定向roslaunch aloam_velodyne aloam_velodyne.launch /tmp/aloam.log 21后面想看实时状态就tail -f /tmp/aloam.log既不会漏信息也不刷屏。整体跑下来我在这个环境上用的时间比本地折腾要少得多主要因为出问题后随时可以回滚环境不用担心把系统搞坏。对想快速上手A-LOAM的人来说这套流程完整体验一遍对激光里程计的整个运行链路会有很直观的认识。后面感兴趣的可以在这个基础上继续折腾如何接入自己的雷达驱动或者把A-LOAM的建图模块单独拎出来做定位都是很好的扩展方向。