ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在AutoDL云端复现A-LOAM:环境搭建、编译运行与可视化全攻略

在AutoDL云端复现A-LOAM:环境搭建、编译运行与可视化全攻略 如果你最近在刷SLAM相关的招聘JD大概率会看到“熟悉LOAM系列算法”这一条。A-LOAM作为LOAM的轻量级Ceres重构版本几乎是国内三维激光SLAM入门的“第一个里程碑”。但很多人卡在第一步本地没有Linux环境或者笔记本上装虚拟机跑ROS太卡又或者不想折腾双系统加一个固态硬盘。我这次换了个思路直接在AutoDL云服务器上把A-LOAM完整复现了一遍从环境搭建、源码编译到数据集回放和可视化全程没有碰本地ROS。先说结论A-LOAM完全用不到GPU而AutoDL的卖点是GPU算力乍看是“杀鸡用牛刀”。但AutoDL真正值钱的不是显卡本身而是给你一个干净的Ubuntu环境、可以随时快照的镜像、按小时计费的低成本试用方式。对于只想快速跑通算法、验证代码、或者临时要一个高性能CPU环境的人来说这比在本地折腾WSL、虚拟机、双系统省心得多。这篇文章我会把从零到出图的过程完整写出来包括镜像怎么选、ROS和Ceres Solver的版本坑、bag数据怎么下载、没显示器怎么用rviz看地图以及最后在云端跑出来的性能表现。1. 为什么在AutoDL上复现A-LOAM平台选择与算力账1.1 本地跑A-LOAM的真实痛点很多同学第一次接触A-LOAM是在Windows笔记本上。你可能会想装个VMware虚拟机装个Ubuntu 18.04然后跑ROS Melodic不就行了理论上可以但实际上非常难受。虚拟机里ROS环境勉强能跑起来但一旦打开rviz再看点云CPU占用直接拉满拖动视角卡成PPT。更麻烦的是如果你用的是笔记本自带摄像头或者外接雷达USB设备直通、驱动识别、串口权限这些问题能把人逼疯。还有人会选择装双系统但这意味着要给硬盘腾出至少100GB空间还要面对NVIDIA驱动、Wi-Fi网卡驱动、声卡不响等一堆破事。A-LOAM本身只是CMake工程但ROS的依赖链太长了Ubuntu版本和ROS版本错一位整个环境就起不来。我在本地上踩过太多次这种坑最后都耗在环境上算法本身反而没怎么研究。1.2 AutoDL对SLAM任务的适配度AutoDL常见的用途是跑深度学习训练但它的本质是“按小时租一台Linux服务器”。对SLAM这类计算密集型任务它有几点很适合第一环境隔离。你可以在上面随便折腾装错包、删了系统库顶多把实例毁了重开十几分钟又是一台干净机器不用重装系统。第二CPU和内存配置比一般笔记本强。A-LOAM虽然不用GPU但Ceres在做非线性优化时非常吃CPU云端多核处理能保证实时性。第三按小时计费。跑一次A-LOAM可能两个小时就结束了扣掉的钱也就几块钱比本地折腾一天划算得多。第四AutoDL有“自定义服务”端口映射功能。这个非常关键后面讲可视化时会用到。它可以把容器内的VNC端口、WebSocket端口映射到公网地址让你远程看到rviz界面。1.3 实例与镜像选择的思路AutoDL的实例类型很多从RTX 2080Ti到A100都有。A-LOAM不需要GPU所以不建议选贵的卡。我的选择是最低档的RTX 2080Ti实例就行CPU给到6核内存30GB跑A-LOAM绰绰有余。如果你手头非常紧也可以试试AutoDL的“无卡模式”但那个模式的CPU核数和内存都偏小跑nsh这个bag大概率会掉帧不推荐。镜像方面我建议直接选Ubuntu 20.04的版本最好带Miniconda那种基础镜像。不用选PyTorch、TensorFlow预装好的镜像因为A-LOAM用不到深度学习框架镜像里多出那些包只会占空间。这里有一个需要注意的点AutoDL镜像基本都是Docker容器形态没有systemd所以不能用systemctl启动服务后面VNC和rosbridge我们都要用命令行手动拉起来。2. 系统镜像与ROS版本匹配为什么是Ubuntu 20.04 Noetic2.1 ROS版本和Ubuntu版本的对应关系ROS版本和Ubuntu版本是严格绑定的不是随便装。A-LOAM官方README写的是Ubuntu 16.04/18.04 ROS Kinetic/Melodic但实测在Ubuntu 20.04 ROS Noetic下也能编译运行只是需要处理几个兼容性问题。Ubuntu版本推荐ROS版本ROS内核16.04ROS KineticROS118.04ROS MelodicROS120.04ROS NoeticROS122.04ROS HumbleROS2Noetic是ROS1的最后一个长期支持版本2025年5月才正式EOL但apt源依然可用。选择20.04 Noetic的另一个原因是AutoDL的基础镜像大量使用Ubuntu 20.04问题少、教程多遇到坑了也好搜。2.2 从零安装ROS Noetic租好实例后用SSH登录或者在AutoDL网页端打开JupyterLab的终端。先更新一下apt源然后配置ROS的软件源。sudo apt update sudo apt upgrade -y sudo sh -c echo deb https://mirrors.ustc.edu.cn/ros/ubuntu/ $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update这里我把ROS源换成了中科大镜像国内访问速度更稳定。如果AutoDL自带源里没有ROS这个命令可以解决。接下来安装ROS本体。sudo apt install -y ros-noetic-desktop-fulldesktop-full包含rviz、tf、pcl-ros等一大堆常用工具虽然A-LOAM只需要其中一部分但一套装齐省得后面缺什么补什么。这个过程在云端大概需要10到20分钟网络好会更快。装完后记得写入环境变量echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc还有一个细节AutoDL的Miniconda镜像会让终端默认进入conda的base环境这会导致后面运行ROS节点时Python路径冲突。建议在.bashrc里关掉conda自动激活或者每次跑ROS前手动conda deactivate。conda config --set auto_activate_base false source ~/.bashrc2.3 安装PCL、Eigen等核心依赖A-LOAM编译时需要PCL、Eigen以及Ceres Solver。Ubuntu 20.04自带的PCL是1.10Eigen是3.3.7这两个版本都能直接满足A-LOAM的要求。用apt安装即可sudo apt install -y libeigen3-dev libpcl-dev pcl-tools libyaml-cpp-devCeres Solver的选择比较讲究后面单独开一节细说。这里先提一句直接sudo apt install -y libceres-dev在Ubuntu 20.04上装的是1.14.0版本刚好够用如果你想省时间可以直接这样装。但如果你怀疑apt源里的Ceres版本有变动稳妥起见还是源码编译。3. 编译链路全解析Ceres、A-LOAM源码与Noetic的兼容性修补3.1 Ceres Solver版本选择的玄学Ceres Solver是A-LOAM里做非线性优化的核心库。很多人栽在这里装了最新版Ceres 2.x结果A-LOAM编译直接报错错误信息里大概率是ceres::LocalParameterization、ceres::QuaternionParameterization这类符号找不到。原因不复杂Ceres 2.0大版本开始把LocalParameterization系列API逐步替换成Manifold在2.1/2.2里旧API虽然还在但已经标记弃用到2.3以后直接移除。而A-LOAM的代码基于Ceres 1.14编写用的全部是旧接口。所以最省事的方案就是固定使用Ceres 1.14.0。在Ubuntu 20.04上libceres-dev这个包的默认版本正好是1.14.0省事。我这次为了演示完整的源码构建流程还是手动编译了一次。编译Ceres 1.14之前先把依赖装齐sudo apt install -y libgoogle-glog-dev libgflags-dev libatlas-base-dev libsuitesparse-devsuitesparse是稀疏线性代数库Ceres求解大规模优化问题时依赖它一定不能省。然后拉源码、切分支、编译安装git clone https://github.com/ceres-solver/ceres-solver.git cd ceres-solver git checkout 1.14.0 mkdir build cd build cmake .. make -j4 sudo make install这里make -j4是考虑到AutoDL实例的CPU核心数和内存如果你确信内存足够可以make -j$(nproc)。编译Ceres大概需要5到10分钟属于正常等待。3.2 下载A-LOAM源码并创建catkin工作区A-LOAM是标准的catkin包需要放到工作区里编译。mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.git cd ~/catkin_ws catkin_make source ~/catkin_ws/devel/setup.bash如果一切顺利你应该会看到几个目标文件的编译信息。但说实话在Noetic下“一次过”的概率不高我自己也碰到过编译报错所以下面专门列一个报错排查表。3.3 编译期经典报错与解决对照表以下是我在复现时遇到过的、以及社区里高频出现的几种报错按严重程度排个序报错场景可能原因解决方法ceres::QuaternionParameterization was not declaredCeres版本太新旧API已移除卸载Ceres 2.x安装1.14.0call of overloaded log(...) is ambiguousEigen的log与全局log冲突在报错处对参数加(double)显式转换或用std::log限定函数名fatal error: pcl_conversions/pcl_conversions.h: No such file or directory缺少PCL的ROS桥接包执行sudo apt install -y ros-noetic-pcl-conversionsCould not find a package configuration file provided by catkin没有source ROS环境或catkin没装好检查source /opt/ros/noetic/setup.bash是否已写入.bashrcundefined reference to ceres::...Ceres库没链接上或头文件和库版本不一致确认编译顺序先装好Ceres再编译A-LOAM必要时catkin_make clean后重来关于那个log歧义问题多说一句。A-LOAM源码是2018年左右写的当时编译器对Eigen表达式的解析比较宽松但Noetic默认的GCC 9配合新版本Eigen会严格很多。遇到这类报错时不用急着改算法逻辑核心思路就一个让编译器知道你想对什么类型做对数运算加显式类型转换基本能解决。另外一个比较隐蔽的坑是AutoDL镜像里如果有conda环境catkin_make可能会误用conda的Python导致编译配置混乱。如果在编译时发现和Python相关的诡异报错先执行conda deactivate或者干脆用/usr/bin/python3显式指定编译用的Python。4. 数据集与launch运行云端跑demo的完整动作4.1 bag数据集的获取策略A-LOAM官方推荐的测试数据是nsh_indoor_outdoor.bag这是一个30秒左右的VLP-16雷达室内外场景数据适合快速验证。但官方给的下载链接是Google Drive国内网络访问经常失败。我自己在AutoDL上试过几种方式总结如下如果开的是AutoDL海外节点直接装gdown拉取就行pip install gdown cd /root/autodl-tmp gdown 1s3yGCT7YYiI1lPXVyOegv9T4XO32CfcW如果开的是AutoDL国内节点Google Drive基本连不上。可以换一个思路从本地电脑用网盘或其它渠道下载好bag然后通过scp传到数据盘。AutoDL默认密码登录用下面这个命令从本地传文件scp -P 6000 nsh_indoor_outdoor.bag rootyour-instance-addr:/root/autodl-tmp/注意AutoDL的SSH端口不是标准22控制台里会给出具体端口号和登录指令。把bag放到/root/autodl-tmp很重要因为这是数据盘空间大实例重启后文件还在。如果你直接放在/root下万一系统盘满了或实例被销毁数据就没了。4.2 启动A-LOAM节点并播放bagA-LOAM根据雷达线数提供了不同的launch文件。nsh_indoor_outdoor.bag是VLP-16也就是16线所以用VLP_16的launch。打开一个终端窗口启动A-LOAMcd ~/catkin_ws source devel/setup.bash roslaunch aloam_velodyne aloam_velodyne_VLP_16.launch再开第二个终端窗口进入bag所在的目录并播放source /opt/ros/noetic/setup.bash cd /root/autodl-tmp rosbag play nsh_indoor_outdoor.bag如果一切正常第一个终端会不断打印当前里程计信息和点云特征数量。A-LOAM不依赖roscore手动启动因为roslaunch会自动拉起核心节点。这里建议用tmux管理会话因为SSH断开时终端进程可能会被杀掉导致跑了一半的建图丢失sudo apt install -y tmux tmux new -s aloam # 在tmux里运行上面的roslaunch # CtrlB 然后按 D 可以脱离会话但进程继续跑 tmux attach -t aloam4.3 无显示器环境下的rviz可视化方案这是云端复现A-LOAM最容易被卡住的一步本地没有显示器rviz启动后窗口显示不出来。这里有三种方案按推荐程度排序Foxglove Studio、VNC桌面、离线保存点云。先说我最推荐的Foxglove方案因为它不用装桌面环境直接在本地浏览器里看3D点云。在云端安装rosbridgesudo apt install -y ros-noetic-rosbridge-suite source /opt/ros/noetic/setup.bash roslaunch rosbridge_server rosbridge_websocket.launch然后在AutoDL控制台的自定义服务里把9090端口映射到公网。本地打开Foxglove Studio桌面版或web版均可新建连接URL填ws://你的节点地址:9090。连接成功后Foxglove会自动发现A-LOAM正在发布的topic其中/laser_cloud_map是全局地图/path是轨迹/laser_cloud_corner和/laser_cloud_surf是角点和面点特征挑几个添加到3D面板里就能看到实时建图效果。Foxglove的好处是渲染效率高而且可以对历史消息回放、查看每个话题的频率调试时非常方便。缺点是需要浏览器能访问到映射出来的公网端口如果你的网络环境限制了非标准端口可能连不上。第二种方案是VNC桌面和本地Linux桌面体验几乎一样。步骤稍多但很稳妥sudo apt update sudo DEBIAN_FRONTENDnoninteractive apt install -y xfce4 xfce4-goodies tigervnc-standalone-server export USERroot vncpasswd vncserver :1 -geometry 1600x1000 -depth 24然后在AutoDL控制台自定义服务里添加5901端口映射。VNC Viewer连接节点地址:5901输入刚才设置的密码就能进入一个完整的xfce4桌面。在桌面里打开终端source ROS环境然后运行source /opt/ros/noetic/setup.bash source ~/catkin_ws/devel/setup.bash rviz -d ~/catkin_ws/src/A-LOAM/rviz_cfg/aloam_velodyne.rviz这样你看到的就是A-LOAM官方预配置好的rviz界面全局地图和特征点都配好了颜色主题。第三种是离线方案。如果只是想要最终地图不需要全程可视化可以运行pcl_ros自带的点云保存工具mkdir -p ~/map_data cd ~/map_data rosrun pcl_ros pointcloud_to_pcd input:/laser_cloud_map它会订阅/laser_cloud_map并保存为一系列PCD文件播放完bag后把这些PCD下载到本地用CloudCompare打开同样能看到完整的建图结果。5. 实测结果与性能CPU占用、内存、实时性与地图效果5.1 性能数据记录我这次用的是AutoDL RTX 2080Ti实例6核CPU、30GB内存。理论上A-LOAM用不到GPU所以nvidia-smi里GPU占用始终是0%。但CPU方面htop显示A-LOAM的节点占了大概200%到350%也就是说大概3到4个线程在满负荷跑。内存占用约1.5GB到2GB不算高。播放nsh_indoor_outdoor.bag时前几秒A-LOAM需要初始化随后进入稳定建图阶段。scanRegistration和laserOdometry几乎同步实时laserMapping偶尔会有几秒滞后但很快能追回来。整体观感是流畅的拖动rviz视角没有明显卡顿。5.2 和本地笔记本的对比我自己有一台i7-8750H的笔记本之前跑同一个bag刚开始也能跟手但时间一长CPU温度冲到95摄氏度风扇声音非常大然后开始降频laserMapping的滞后越来越明显。云端实例没有散热问题满负荷跑多久都稳定在同一个频率这一点在实际建图时很关键——因为掉帧会导致点云畸变、特征匹配精度下降最终地图出现重影。地图效果方面nsh数据是室内外混合场景走廊、房门、桌椅、墙面都能清楚还原。墙角线的结构很锐利说明角点特征提取和Ceres优化都正常工作。长走廊这种退化场景依然会有轻微漂移这是LOAM系算法的通病和运行平台无关。如果你在云端跑的时候发现地图明显模糊或者点云断层优先检查两件事第一实例CPU核心数够不够少于4核建议换高配第二rosbag play是不是因为网络或磁盘IO卡顿导致消息时间戳不均匀。云端通常用的是云盘IO波动偶尔会影响bag回放节奏如果遇到这个问题可以把bag先复制到内存盘/dev/shm再播放cp /root/autodl-tmp/nsh_indoor_outdoor.bag /dev/shm/ rosbag play /dev/shm/nsh_indoor_outdoor.bag6. 踩坑清单与扩展思考从A-LOAM到新一代LOAM系6.1 高频踩坑汇总复现过程中踩过的坑我按出现频率整理一下给后来人省点时间第一rosdep init失败。安装完ROS后执行sudo rosdep init经常因为网络问题失败。其实A-LOAM不依赖rosdep下载额外依赖可以完全跳过不影响编译。第二系统盘被日志和临时文件占满。A-LOAM运行时会往~/.ros/log写入大量日志bag本身又很大。建议定期清理rm -rf ~/.ros/log/*第三AutoDL自定义服务只对TCP有效。如果你映射了VNC端口却连不上先确认VNC服务是不是真的在运行再用netstat -tlnp | grep 5901看端口监听状态。第四AutoDL的流量包问题。下载大体积bag会消耗节点流量国内节点流量包用完后会限速或暂停网络。如果bag特别大建议提前看下自己的流量余额。第五conda环境对ROS的干扰。运行任何ROS命令前确认当前会话不在conda base环境中否则python路径冲突会导致各种奇怪报错。最简单的办法就是把conda自启动关掉。6.2 从A-LOAM继续扩展的方向跑通A-LOAM只是起点。云端这套“干净Ubuntu 固定版本Ceres catkin工作区”的环境完全可以复用到更多激光SLAM项目上。如果你想让建图精度更高可以试F-LOAM它在Ceres求解的基础上做了去畸变加速代码风格和A-LOAM一脉相承。如果你要上固态激光雷达或IMU融合FAST-LIO和LIO-SAM更合适但它们的依赖会更重比如LIO-SAM需要GTSAMFAST-LIO2需要ikd-Tree。在AutoDL上编译这些库有一个好处实例配置高、网络稳定即使编译失败也能快速从快照恢复不用担心把本机环境搞坏。另外如果你之后想用KITTI数据集测试A-LOAM记得用kitti2bag工具把KITTI的bin文件转成rosbag再用HDL_64的launch运行。转换时需要注意KITTI的雷达外参和A-LOAM默认配置不完全一致地图可能会偏转这是正常的不影响验证算法流程。最后分享一个我自己的习惯在AutoDL上编译这类老SLAM项目我会先把Linux发行版、ROS版本、Ceres版本在笔记里固定下来因为这三个版本只要错一个编译报错就能耗掉一下午。这次复现A-LOAM整个流程从租机器到出图我用了一个小时出头其中大半时间花在下载bag和安装ROS上。如果你也想在云端快速跑通LOAM系算法照这篇文章的步骤试一次应该能少走不少弯路。
返回列表