1. 项目背景与需求解析
在边缘计算领域,NVIDIA Jetson Orin系列凭借其强大的AI算力和能效比,已成为机器人、自动驾驶等实时性要求高的场景首选平台。而FastLivo2作为轻量级激光雷达-视觉惯性里程计(LVI-SLAM)方案,因其计算效率高、资源占用少的特点,特别适合部署在Jetson这类嵌入式设备上。
我在最近一个服务机器人项目中,需要在Jetson Orin NX上部署FastLivo2实现室内定位建图。原以为按照GitHub文档就能轻松搞定,结果从环境配置到实时优化踩了无数坑。这篇记录既是对自己工作的总结,也希望能帮后来者少走弯路。
2. 环境准备与依赖安装
2.1 系统基础环境配置
Jetson Orin出厂预装的是Ubuntu 20.04和JetPack 5.1.1,这个组合本身没有问题。但默认的交换空间(swap)只有4GB,编译大型项目时容易爆内存。建议先扩展交换空间:
bash复制sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 永久生效
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
另一个关键点是CUDA环境。JetPack虽然已经安装了CUDA,但需要手动配置环境变量。在~/.bashrc中添加:
bash复制export CUDA_HOME=/usr/local/cuda
export PATH=${CUDA_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH}
注意:Jetson的CUDA版本是特制的,不要尝试自行安装其他版本CUDA,会导致系统不稳定。
2.2 第三方依赖项处理
FastLivo2依赖的Eigen、PCL、OpenCV等库虽然可以通过apt安装,但版本可能不匹配。我的经验是:
- Eigen必须源码安装最新版(至少3.4.0),因为apt提供的3.3.7缺少关键特性:
bash复制git clone https://gitlab.com/libeigen/eigen.git
mkdir eigen_build && cd eigen_build
cmake ../eigen && make -j$(nproc)
sudo make install
- PCL需要1.12以上版本,但Ubuntu 20.04官方源只有1.10。解决方案是添加PPA:
bash复制sudo add-apt-repository ppa:bernd-pfrommer/pcl
sudo apt update
sudo apt install libpcl-dev
- Sophus库必须使用特定分支:
bash复制git clone https://github.com/strasdat/Sophus.git
cd Sophus && git checkout a621ff
mkdir build && cd build
cmake .. && make -j$(nproc)
sudo make install
3. FastLivo2源码编译优化
3.1 源码获取与初步编译
直接从GitHub克隆最新代码:
bash复制git clone https://github.com/hku-mars/FAST_LIVO.git
cd FAST_LIVO && mkdir build && cd build
首次编译建议先关闭CUDA加速,验证基础功能:
bash复制cmake .. -DUSE_CUDA=OFF
make -j$(nproc)
这个阶段常见错误是找不到Sophus或Eigen,通常是因为CMake搜索路径问题。可以手动指定路径:
bash复制cmake .. -DSophus_DIR=/usr/local/share/Sophus/cmake -DEigen3_DIR=/usr/local/share/eigen3/cmake
3.2 CUDA加速编译技巧
启用CUDA后编译会复杂很多,主要因为Jetson的ARM架构与x86差异。关键配置:
- 修改CMakeLists.txt:
cmake复制if(USE_CUDA)
set(CUDA_ARCH_BIN "8.7") # Orin的Compute Capability
set(CUDA_TOOLKIT_ROOT_DIR "/usr/local/cuda")
find_package(CUDA REQUIRED)
endif()
- 遇到"undefined reference to `__atomic_load'"错误时,需要在target_link_libraries中添加atomic:
cmake复制target_link_libraries(your_target PRIVATE atomic)
- 内存不足导致编译失败时,可以临时降低并行度:
bash复制make -j2 # 只使用2个核心
4. 实时运行性能调优
4.1 参数配置文件调整
FastLivo2的配置主要在config.yaml中,针对Jetson Orin需要调整:
yaml复制preprocess:
lidar_min_range: 0.5 # 减少近距点云处理
lidar_max_range: 30.0 # 根据实际场景调整
feature_extraction:
max_features: 100 # 减少特征点数量
min_distance: 10.0 # 特征点最小间隔
mapping:
voxel_size: 0.1 # 增大体素滤波尺寸
max_points_per_voxel: 5
4.2 线程绑定与CPU调度
Jetson Orin有6个Cortex-A78核心和4个Cortex-A55核心,通过taskset可以绑定大核:
bash复制taskset -c 0-5 ./fast_livo \
-bag /path/to/your.bag \
-config ./config.yaml
还可以使用jetson_clocks脚本提升性能:
bash复制sudo jetson_clocks
4.3 内存与显存管理
通过conky实时监控资源使用:
bash复制sudo apt install conky
conky -c /etc/conky/conky.conf
发现显存不足时,可以降低图像分辨率:
yaml复制camera:
image_width: 640
image_height: 480
5. 典型问题排查实录
5.1 点云与图像不同步
症状:建图出现重影或断裂。解决方法:
- 检查bag时间戳同步:
bash复制rosbag info your.bag | grep -A 10 "topics"
- 在config.yaml中调整时间偏移:
yaml复制sync:
lidar_offset: 0.0
image_offset: -0.05 # 单位:秒
5.2 初始化失败
常见报错:"Failed to initialize IMU"。检查步骤:
- 确认IMU话题名称匹配:
yaml复制imu_topic: "/imu/data"
- 检查IMU数据频率:
bash复制rostopic hz /imu/data
建议频率≥200Hz,过低会导致运动估计不准。
5.3 轨迹漂移严重
可能原因及对策:
- 特征点不足 → 降低min_distance参数
- 运动过快 → 限制最大角速度:
yaml复制mapping:
max_angular_vel: 1.0 # rad/s
- 点云质量差 → 增加lidar_min_range
6. 实际部署经验分享
6.1 温度控制策略
长期运行需要防止过热降频:
bash复制sudo apt install lm-sensors
watch -n 1 sensors
建议安装散热风扇,或通过脚本限制频率:
bash复制echo 1200000 | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
6.2 电源管理技巧
使用高质量PD电源(至少45W),避免电压不稳导致崩溃。检测电源状态:
bash复制tegrastats | grep 'VDD_CPU'
正常值应在3.3V左右,低于3.0V可能引发问题。
6.3 长期运行稳定性
建议每日重启一次,防止内存泄漏累积。可以设置cron任务:
bash复制0 3 * * * /sbin/reboot
对于关键任务,建议使用watchdog监控进程:
bash复制sudo apt install watchdog
sudo systemctl enable watchdog
