ARTICLE DETAIL

资讯详情

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

香橙派5MAX跑FAST-LIO2:ARM平台激光SLAM实战与优化

香橙派5MAX跑FAST-LIO2:ARM平台激光SLAM实战与优化 去年底我把一套LIVOX Mid-360和香橙派5MAX组合在一起准备跑一把FAST-LIO2。折腾了差不多一个周末加两个晚上最终算是跑通了点云图能出里程计也在更新但真要说体验顶多算“能跑有点吃力”。整个过程从烧Ubuntu 20.04、换官方桌面到装ROS Noetic再到Livox驱动编译和FAST-LIO2调度踩了不少坑也顺手搞清楚了不少原理。今天把整条链路完整记录下来给想在这个价位和功耗下做激光SLAM实验的朋友一个参考。1. 项目概述与整体方案选型1.1 这套组合到底解决了什么问题先说为什么要把这几个东西凑在一起。我当时的实际需求很明确做一个移动机器人平台的前端感知验证需要在设备端完成激光雷达的数据采集、点云处理和实时里程计输出不能把大量原始数据全部回传后台再算那样带宽和时延都受不了。香橙派5MAX用的是RK3588这颗SoC8核ARM架构性能在单板机里边算比较能打的接口也全eMMC、M.2、HDMI、USB都有做激光雷达的数据入口很合适。LIVOX Mid-360则是一个360度混合固态激光雷达非重复扫描内置IMU探测距离够用室内外都能跑对FAST-LIO这种点云IMU紧耦合的算法非常友好。为什么系统非要选Ubuntu 20.04因为Livox的驱动、ROS Noetic、PCL、Eigen这些老牌工具链在20.04上兼容性是最好的。22.04虽然也能装但ROS 1的Noetic在22.04上装起来明显更麻烦而FAST-LIO这类算法大量代码还是基于ROS 1写的与其在依赖地狱里挣扎不如老老实实用20.04。整体技术链路是这样的层级选型说明硬件平台香橙派5MAXRK35888核接口丰富操作系统Ubuntu 20.04 ARM64ROS Noetic官方支持的LTS版本中间件ROS NoeticROS 1最终版本生态最稳雷达LIVOX Mid-360360度混合固态内置IMU驱动Livox SDK2 livox_ros_driver2官方驱动输出点云和IMU话题算法FAST-LIO2点云IMU紧耦合里程计1.2 选型时的关键考虑这套方案里最核心的权衡在于“在ARM板卡上跑紧耦合SLAM算法是否现实”。FAST-LIO2虽然计算量比LOAM、LIO-SAM小不少但它仍然需要做点云配准、ikd-Tree增量更新、卡尔曼增益计算这些在高通骁龙或者x86上很轻松到了ARM板卡上就是另一种体验了。我在选型之前也考虑过树莓派5但那玩意儿算力和香橙派5MAX还是差了一截而且RK3588的内存带宽和CPU多核性能更适合跑这类计算密集任务。实际跑下来也证明香橙派5MAX确实能跑动只是余量不大具体数据放到后面性能实测部分详细说。2. 系统安装Ubuntu 20.04烧录与桌面环境处理2.1 镜像选择与烧录步骤香橙派官方提供过多个系统的镜像我当时需要的是基于Ubuntu 20.04的Arm64版本直接到官网下载好对应镜像然后准备一张质量好一点的TF卡或者直接用eMMC模块。烧录工具我用的是balenaEtcher跨平台、操作简单选镜像、选磁盘、写卡。这里有个关键点容易忽略烧录完成后不要急着拔卡先看下镜像的SHA-256校验值尤其是从网盘拉下来的镜像经常会下到损坏版本导致启动卡死在引导阶段。我之前就因为没校验烧了三遍才怀疑是镜像问题。烧录完成后把TF卡插到板子上接好HDMI显示器和电源开机。第一次启动会比较慢RK3588需要初始化很多东西耐心等两分钟看到登录界面基本就成功了。2.2 首启配置与软件源更换第一次进入系统后第一件事就是把软件源换掉。默认源在20.04上很慢而且Ubuntu 20.04已经进入EOL维护阶段默认源有时候会跳到old-releases速度更感人。直接用sed或者图形界面工具把源改成国内镜像这步能省下后面大量安装时间。修改源之后记得sudo apt update sudo apt upgrade -y如果你只是想要一个最小化系统到这步其实就够了。但考虑到后续要看点云、拉Rviz调试我还是决定把桌面环境装好。2.3 更换成官方GNOME桌面标题里说的“换了官方桌面”这里解释一下。香橙派20.04镜像默认带的桌面是轻量级的LXDE或者类似环境界面很朴素用起来其实也能忍。但我个人习惯了Ubuntu原生的GNOME尤其是调试SLAM的时候要同时开多个Rviz窗口和终端标签页GNOME的多任务体验好得多所以决定换成标准GNOME桌面。安装方式很简单sudo apt install ubuntu-desktop sudo apt install gdm3 sudo dpkg-reconfigure gdm3 sudo reboot这里有个坑系统里如果已经存在LightDM或其他显示管理器安装ubuntu-desktop时会和你抢默认display manager。必须用dpkg-reconfigure把默认登录管理器改成gdm3否则重启后可能还是会进原来的轻量桌面甚至出现登录界面白屏的情况。注意换桌面时如果遇到黑屏或者登录死循环多半是显卡驱动和Wayland会话冲突。我建议登录界面选Xorg而不是WaylandROS的老工具在Xorg下兼容性更好开Rviz也稳定一些。GNOME桌面在RK3588上跑起来还算流畅8核A76A55的组合带桌面没什么压力。但如果后面要跑FAST-LIO这种负载建议跑算法时临时把桌面关了直接用SSH操作桌面进程会占掉不少CPU资源这个后面性能部分再展开。2.4 磁盘分区与启动方式的选择香橙派5MAX可以从TF卡、eMMC、NVMe SSD多种介质启动。如果你打算长期做SLAM实验强烈建议把系统装到NVMe SSD或者eMMC上TF卡的随机读写性能太差雷达数据落盘的时候会出现明显的卡顿。我当时是先把系统烧到TF卡里启动成功后用dd把系统迁移到了NVMe SSD上。性能提升非常明显尤其是在录bag包和回放bag包的时候磁盘IO不再是瓶颈。如果只是临时验证TF卡也能跑但别指望它能稳稳扛住长时间录包。启动优先级方面板子默认大概率是从TF卡启动如果插了NVMe可能会需要手动切换引导顺序。具体在U-Boot阶段处理不同镜像的配置不太一样进不了系统就重新烧卡多试两次就摸清规律了。3. ROS Noetic安装与基础环境3.1 推荐直接用鱼香ROS一键安装ROS Noetic的安装方法网上已经很多了但ARM平台上有不少细节和x86不一样。手动安装的话要处理软件源、密钥、依赖、rosdep初始化任何一个环节出错都会卡住。我这次最后用的是鱼香ROS的一键安装脚本确实是省事拉取脚本后根据提示选择ROS 1、Noetic、Desktop-Full选项脚本会把源、密钥、依赖和rosdep全套搞定。整个过程大概十几分钟比手写命令快得多。脚本安装完成后再手动执行一下sudo rosdep init rosdep update如果rosdep init报错说已经存在就先把/etc/ros/rosdep/sources.list.d/20-default.list删掉再重来。3.2 ARM平台上ROS安装的检查和避坑装完ROS第一件事是验证环境变量是否生效echo $ROS_DISTRO source /opt/ros/noetic/setup.bash如果你每次都懒得source可以把这行加到~/.bashrc里但注意加一行就够了不要重复source多个ROS版本否则环境会乱掉。还有一个常见问题是缺python依赖。Noetic默认用Python 3.8很多ROS工具链需要python3-catkin-pkg、python3-rospkg这些包。用一键脚本一般会处理但偶尔会有遗漏遇到command not found就直接apt补上。3.3 创建工作空间与运行测试工作空间结构建议直接用标准布局mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make第一次catkin_make会提示缺少依赖逐个装就行。为了验证ROS基本功能我把小海龟示例跑了一遍没什么问题。这一步的价值在于确认ROS核心通信正常后续编译Livox驱动和FAST-LIO时能省掉很多排查时间。4. LIVOX Mid-360驱动安装与雷达调试4.1 硬件接线和网络配置Mid-360默认走以太网输出包装里面带的是一根工业级网线直接接到香橙派5MAX的网口上。板子自带的网口通常会被系统识别为eth0但这里有个坑雷达和开发板直连后eth0不能开DHCP客户端等它分配IP因为雷达不是DHCP服务器需要手动配一个静态IP。我的做法是这样把雷达接入的网口配置为192.168.1.50子网掩码255.255.255.0。Mid-360的默认IP在192.168.1.1xx这个段具体看说明书只要在同一网段内Livox的SDK就能扫到它。配置完成后先用Livox Viewer扫一下设备确认雷达能被发现、点云画面正常再继续后面ROS驱动的步骤。注意首次使用雷达需要用Livox Viewer设置目标主机IP也就是告诉雷达“把数据发给192.168.1.50这台设备”。不然驱动起了雷达也不会理你ros话题里干干净净什么都没有。这一步很多人会漏掉。4.2 Livox SDK 2的编译Livox驱动新版基于SDK2需要单独编译安装。直接拉官方仓库git clone https://github.com/Livox-SDK/Livox-SDK2.git cd Livox-SDK2 mkdir build cd build cmake .. make -j4 sudo make installmake -j4在香橙派5MAX上压力不大8核编译大概几分钟就完事了。如果报缺少依赖一般是cmake、g这些基础工具没装apt补上就行。这里不建议make -j8虽然RK3588有8核但编译大项目时开满线程内存容易紧张尤其你是用4GB版本的时候。4.3 livox_ros_driver2的编译与启动SDK装好后编译ROS驱动。在新的工作空间里操作cd ~/catkin_ws/src git clone https://github.com/Livox-SDK/livox_ros_driver2.git cd .. catkin_make编译前需要注意一个问题livox_ros_driver2默认会读取config目录里的json文件里面需要填写你的主机IP。如果你刚才手动设的是192.168.1.50那要把msg_MID360_config.json里的host_ip改成192.168.1.50然后重新编译不然即使SDK能发现雷达ROS话题里也不会有数据。启动驱动source devel/setup.bash roslaunch livox_ros_driver2 msg_MID360.launch如果看到类似“Device online”的日志说明雷达连接成功话题里会输出/livox/lidar和/livox/imu两组数据。前者是200k点频的原始点云自定义消息后者是内置IMU数据200HzFAST-LIO2紧耦合需要的就是它。4.4 Rviz里点云调试与IMU检查驱动起来后先开Rviz看一下点云rosrun rviz rviz添加PointCloud2显示话题选/livox/lidar如果驱动输出的是livox自定义消息可能需要把fixed frame设为livox_frame之类具体看launch参数。看到明显的扫描线就说明链路通了一大半。同时用:rostopic echo /livox/imu/header/stamp确认IMU时间戳是否在递增值是否为NaN。IMU数据异常在FAST-LIO里会导致算法直接发散所以这一步必须提前确认。5. FAST-LIO2编译、配置与实跑5.1 依赖与源码准备FAST-LIO2核心依赖是Eigen3、PCL、yaml-cpp外加Livox的ROS驱动。Ubuntu 20.04的软件源里自带的Eigen 3.3.7够用不需要自己升级到3.4。PCL也要装完整版sudo apt install libeigen3-dev libpcl-dev libyaml-cpp-dev源码直接拉HKU-MARS的官方仓库cd ~/catkin_ws/src git clone https://github.com/hku-mars/FAST_LIO.git cd .. catkin_make这里有个版本兼容性问题要注意。FAST-LIO源码默认适配的驱动接口是livox_ros_driver旧版的自定义消息类型如果你用的是livox_ros_driver2编译时大概率会遇到类型不匹配的报错比如找不到livox_ros_driver/CustomMsg这种头文件。解决方法是把FAST-LIO源码里所有用到CustomMsg的地方改成livox_ros_driver2/CustomMsg并检查对应的头文件路径。提示改源码前先搜索FAST-LIO里所有#include livox_ros_driver/...“统一替换成livox_ros_driver2的版本再在CMakeLists里加一行find_package(livox_ros_driver2 REQUIRED)基本就能编过。这里没有捷径逐个文件改改完重新catkin_make。5.2 编译难点和内存控制在ARM板卡上编译FAST-LIO2最大的风险是内存爆掉。RK3588虽然有8GB或者16GB内存的版本但PCL模板实例化非常吃内存catkin_make默认的并行任务数可能会直接触发OOM。我的经验是强制限制并行数catkin_make -j2虽然编译时间会长一些但稳。实测在香橙派5MAX上用-j4编译会随机崩溃-j2基本能一次通过。也可以设置CATKIN_JOBS环境变量来控制后续编译。如果编译途中报错说找不到Eigen检查一下/usr/include/eigen3/Eigen这个路径是否存在有时候头文件路径不对需要做软链接sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen5.3 launch文件与内外参配置FAST-LIO2的launch配置主要在config文件夹里的mid360.yaml。核心参数包括lid_topic: /livox/lidarimu_topic: /livox/imuextrinsic_est_en: 是否在线估计外参建议第一次先设为false用固定外参跑extrinsic_T和extrinsic_R雷达相对于IMU的平移和旋转point_filter_num抽稀因子地图点云过大时调大这个值Mid-360因为IMU在雷达内部理论上外参很小但不要想当然填单位矩阵。雷达固件和驱动版本不同外参会有细微差异最简单的方法是用官方提供的默认外参然后跑一段数据看轨迹是否明显漂移再决定要不要用在线估计功能。对于室内实验直接把extrinsic_est_en设为true让算法自己收敛也是一个省事的方案不过前提是初始外参不能错得太离谱。5.4 实际跑起来的流程与结果实测流程很简单。先启动雷达驱动roslaunch livox_ros_driver2 msg_MID360.launch再启动FAST-LIOroslaunch fast_lio mapping_mid360.launch我拿着雷达在一个大概20米见方、中间有不少柱子的室内环境走了一圈第一次启动时地图在几秒内就建立起来Rviz里能看到点云地图和里程计轨迹逐渐延伸。但是肉眼能明显感觉到刷新速度比台式机上跑要慢Rviz的帧率大概只有10帧不到移动快的时候画面会有一段一段的跳变感。从终端日志看FAST-LIO2的里程计频率大概在4到6Hz之间跳动达不到理想情况下的10Hz。建图质量本身是能接受的走廊回环处也能看到点云大致对齐但细节处有轻微错位因果关系就是前端处理不及时导致的增量漂移。这和“只能说可以跑”的描述是完全吻合的。6. 性能实测能吃力的原因和优化方向6.1 资源占用实测数据我用htop和mpstat记录了一个完整测试过程的数据结果放在下面指标香橙派5MAX对比i5-12500台式机系统Ubuntu 20.04 ARM64Ubuntu 20.04 x86_64里程计输出频率4-6 Hz偶发10 Hz稳定10 HzCPU占用约300%-400%8线程约120%-150%内存峰值2.5GB左右3.5GB左右运行温度75-80℃55-65℃注意CPU占用的口径htop下面的百分比是把8个核都算进去的400%意味着大概有4个核在干活。FAST-LIO2本身的主要线程可能只有一两个但PCL、ROS通信、点云序列化这些辅助线程都会持续吃CPU。也就是说不光是算法本身整个数据链路在ARM上都有额外开销。6.2 为什么RK3588跑FAST-LIO还是吃力原因可以从几个层面拆开看。第一FAST-LIO2虽然不提取角点和面点但ikd-Tree的最近邻搜索和增量更新在点云规模上涨之后计算量增长很快20万点频下跑纯CPU计算在ARM上压力很大。RK3588的A76大核虽强但和x86桌面处理器比浮点性能还是有明显差距Eigen默认在ARM上开启的NEON优化和相关指令集优化效果远不如x86上的AVX来得猛。第二Mid-360的点频比较激进200k的点密集程度在建图过程中会让ikd-Tree快速膨胀内存占用迅速走高缓存命中率下降进一步拖慢速度。台式机上可以通过大缓存和大内存带宽轻松扛住ARM板卡则受限于功耗和内存带宽处理不过来就只能掉帧。第三GNOME桌面本身也在抢资源。我后来用SSH纯命令行跑算法能明显感觉帧率好一点但差别不是特别大毕竟最大瓶颈在计算密集部分而不是桌面那几个进程。6.3 我试过的优化手段和效果针对性能瓶颈我做了几组对照实验效果如下调整项操作效果抽稀点云mid360.yaml里point_filter_num从1改为4CPU从400%降到250%频率提升到6-8Hz但地图变得稀疏体素滤波增大filter_size_surf从0.4改为0.6地图稍微粗糙里程计抖动增加频率提升不明显关掉桌面跑SSHsystemctl set-default multi-user.target内存占用下降约500MB整体流畅度小幅提升调CPU为性能模式cpufreq-set -g performance短期提升明显温度快速升到80℃风扇全速后维持限制Rviz刷新Rviz里Global Options的帧率改5Hz地图窗口卡顿感下降但算法本身没变化结论很直接这些优化只能在边际上改善体验不能让香橙派5MAX跑出和台式机一样的效果。如果你的场景要求长时间、大场景稳定建图建议把这套板子当成数据采集前端和轻量里程计后端做全局优化或者大范围建图还是交给x86或者Jetson Orin级别的设备。6.4 作为移动底盘主控的工程建议如果打算把香橙派5MAX作为移动机器人的主控有几个工程上的建议可以分享。首先是散热香橙派5MAX在跑FAST-LIO时温度轻松过75℃必须配主动散热风扇和散热片否则CPU降频会比算法瓶颈更影响输出。我实测不加风扇跑十分钟温度冲到85℃性能掉的非常明显。其次是系统服务裁剪。跑算法时把蓝牙、桌面、自动更新这些服务全部关掉能释放不少CPU和内存。用systemd把雷达驱动和FAST-LIO做成开机自启服务比手动开一堆终端靠谱得多。再者是数据落盘策略。如果还要同时录bag包注意磁盘IO会成为新的瓶颈建议用NVMe SSD并设置ROS bag的压缩选项或者只记录里程计结果而不是全部原始点云否则SD卡根本扛不住连续写入。7. 常见问题与排查速查表7.1 系统、网络与apt相关这个问题很多新手都会遇到单独列个表现象原因解决办法apt update很慢或超时默认源访问慢更换国内镜像源apt报“无法定位软件包”包源索引未更新先sudo apt update再装包Ubuntu 20.04源失效已进入EOL维护使用old-releases镜像源或者国内镜像的EOL路径安装nvidia-driver相关包失败ARM平台无NVIDIA驱动不要执行换装Mali相关包或不用独立GPU这里特别想提醒一下网上流行的“ubuntu20.04安装显卡驱动 apt install nvidia-driver-535”之类的帖子那是x86平台的玩法香橙派5MAX用的是ARM架构加Mali-G610 GPU根本不存在这种Linux驱动包。在ARM板子上装nvidia-driver不仅装不上还会把软件源和内核模块搞乱蓝屏不至于但启动异常和依赖冲突是大概率事件。7.2 ROS安装与运行现象原因解决办法rosdep update一直失败网络DNS问题或资源被限多试几次或换网络环境执行roslaunch找不到launch文件环境变量没sourcesource devel/setup.bash后重试老工具在Wayland下显示卡顿会话与GL冲突登录界面选Xorgcatkin_make内存崩溃并行任务过多限制make -j27.3 雷达驱动与FAST-LIO现象原因解决办法Livox Viewer扫描不到设备网段不对或目标主机IP未设置检查静态IP设置目标IProslaunch后无/livox话题json配置里host_ip错误修改并重新编译livox_ros_driver2/livox/imu输出NaN供电不足或网线问题换供电换好网线避免过长的网线FAST-LIO编译时类型不匹配驱动v1和v2消息类型不一致源码中替换为livox_ros_driver2/CustomMsg运行后秒退或核心已转储话题名或外参配置错误检查mid360.yaml的lid_topic和imu_topic轨迹明显漂移发散外参或IMU初始化不准先静态保持雷达让算法初始化再运动7.4 其他我在实测中踩过的坑还有几个地方值得单独记录。一个是Mid-360的网线原装网线质量一般我在现场换上普通超五类网线之后数据偶尔出现断流换回原装或者用屏蔽网线后恢复正常。另一个是雷达和板子直连时不要同时把eth0配置成外网上网口不然路由表会乱建议专门用一个USB网卡给雷达或把板子的无线网卡用于外网雷达独占有线网口。FAST-LIO跑起来之后如果没做初始化就拿着雷达乱晃很容易瞬间发散。正确姿势是把雷达放平固定静止一两秒等算法输出稳定后再开始运动。这个小习惯能省掉很多“为什么轨迹飞了”的排查时间。结尾一点的个人体会这套东西跑通之后我的整体感受是香橙派5MAX加Mid-360这个组合做一个激光SLAM的入门验证平台、算法原型机或者作为大型机器人的轻量感知前端是完全可行的。但如果你指望它在长时间、大范围、高动态环境下稳定跑出和x86指挥级别的效果那期望值还是放低一点。我后来把FAST-LIO的里程计输出接到了后续的路径规划模块上小范围巡检场景还能凑合用。更重的建图任务我最终是把bag包拿到后台PC上做离线优化才满足精度要求。这其实也反映了当前嵌入式SLAM的一个常态板卡负责实时跑通后台负责精修两头分工。最后送一个小技巧如果在香橙派5MAX上跑FAST-LIO卡顿明显先把Rviz关掉用rostopic echo /Odometry去观察里程计是否有输出再回头优化可视化。很多时候算法本身没崩是可视化把资源吃光了给板子减负之后会发现它比想象中能扛。
返回列表