1. Jetson Orin Nano + D455深度相机VINS-Fusion环境搭建全记录
作为一名长期从事无人机视觉定位开发的工程师,最近在Jetson Orin Nano上配置VINS-Fusion和RealSense D455深度相机的过程中踩了不少坑。相比之前使用的T265+D435i方案,这次尝试用单深度相机同时完成定位和识别任务,在环境配置环节就遇到了诸多挑战。本文将详细记录整个搭建过程,特别是那些官方文档没有提及的"坑点"。
1.1 硬件与基础环境配置
核心硬件配置:
- 主控平台:Jetson Orin Nano Developer Kit (8GB版本)
- 深度相机:Intel RealSense D455f(带IMU版本)
- 辅助工具:USB3.0高速数据线、散热风扇(持续高负载运行时必备)
软件环境基线:
- 系统镜像:JetPack 6.2.1(rev1)
- 操作系统:Ubuntu 22.04 LTS
- L4T版本:36.4.7
- 关键依赖:
- Ceres Solver 2.1.0
- OpenCV 4.10(带CUDA加速)
- cv_bridge 4.10
- ROS2 Humble
- librealsense(Native Backend编译)
实测发现,JetPack 6.2默认安装的OpenCV 4.8.0不带CUDA支持,且版本过低会导致后续VINS-Fusion编译报错。建议在安装ROS2前先处理好OpenCV的版本问题。
1.2 OpenCV 4.10 + CUDA编译指南
为什么需要手动编译OpenCV?
- JetPack预装的OpenCV缺少CUDA加速模块
- VINS-Fusion需要OpenCV的nonfree模块(如SIFT特征)
- 版本兼容性要求(至少4.10以上)
编译前的准备工作:
- 检查交换空间(至少4GB):
bash复制free -h sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile - 卸载预装OpenCV:
bash复制sudo apt-get purge libopencv* sudo apt autoremove
关键编译参数解析:
bash复制cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_cuda/opencv_contrib-4.10.0/modules \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D ENABLE_FAST_MATH=ON \
-D CUDA_FAST_MATH=ON \
-D WITH_CUBLAS=ON \
-D WITH_LIBV4L=ON \
-D WITH_GSTREAMER=ON \
-D WITH_OPENGL=ON \
-D WITH_TBB=ON \
-D BUILD_TIFF=ON \
-D BUILD_EXAMPLES=OFF \
-D BUILD_opencv_python3=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D CUDA_ARCH_BIN="8.7" \ # Orin系列的统一计算能力
-D CUDA_ARCH_PTX="" \
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
..
编译注意事项:
- 使用
make -j$(nproc --ignore=1)控制编译线程数,避免内存耗尽 - 安装后验证CUDA支持:
bash复制jtop # 查看OpenCV版本和CUDA状态 - 如果遇到Python绑定问题,检查
/usr/local/python/cv2目录权限
1.3 Ceres Solver 2.1.0编译安装
版本选择考量:
- VINS-Fusion原始版本依赖Ceres 1.4(已过时)
- Ceres 2.0缺少CUDA支持
- Ceres 2.2删除了旧接口导致兼容性问题
- 折中选择2.1.0版本
安装步骤:
bash复制# 卸载可能存在的旧版本
sudo apt-get purge libgoogle-ceres-dev
# 安装依赖
sudo apt-get install -y libgoogle-glog-dev libgflags-dev libsuitesparse-dev libatlas-base-dev
# 从源码编译
git clone https://github.com/ceres-solver/ceres-solver.git
cd ceres-solver
git checkout 2.1.0
mkdir build && cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DBUILD_EXAMPLES=OFF \
-DBUILD_TESTING=OFF
make -j6
sudo make install
验证安装:
bash复制ls /usr/local/include/ceres/ceres.h # 检查头文件
ls /usr/local/lib/libceres.so # 检查库文件
2. RealSense D455深度相机配置全攻略
2.1 ROS2 Humble安装优化
由于清华大学源已停止对Ubuntu 22.04的支持,建议改用中科大源:
bash复制sudo sh -c '. /etc/lsb-release && echo "deb https://mirrors.ustc.edu.cn/ros2/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros2.list'
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
sudo apt install ros-humble-desktop
ARM架构特别提示:
- 在
/etc/apt/sources.list中启用ubuntu-ports源 - 安装后务必执行:
bash复制sudo rosdep init rosdep update
2.2 RealSense SDK三种安装方式对比
| 安装方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Debian包安装 | 快速验证相机功能 | 一键安装,无需编译 | 不支持IMU元数据同步 |
| RSUSB后端 | 用户态开发,CUDA加速 | 不依赖内核版本 | 实时性较差 |
| Native后端 | SLAM等需要精确时间同步的场景 | 最佳性能,完整功能 | 需要内核补丁,过程复杂 |
为什么选择Native后端?
- VINS-Fusion依赖精确的IMU数据时间同步
- 需要直接访问相机硬件时钟
- 避免用户态到内核态的数据拷贝开销
2.3 内核补丁实战记录
步骤1:准备内核源码
- 从NVIDIA开发者网站下载对应JetPack版本的
public_sources.tbz2 - 解压获取内核源码:
bash复制tar -xvf public_sources.tbz2 cd Linux_for_Tegra/source/public tar -xvf kernel_src.tbz2 mv kernel ~/librealsense/Tegra/kernel/kernel-jammy-src
步骤2:修改补丁脚本
定位到patch-realsense-ubuntu-L4T.sh,在case语句中添加36.4.7版本支持:
bash复制"36.4.7")
PATCHES_REV="6.0"
KERNEL_RELEASE="5.15"
;;
步骤3:解决Git仓库问题
创建fix_tags.sh脚本自动修复标签检查:
bash复制#!/bin/bash
BASE_DIR="$HOME/librealsense/Tegra"
TAG_NAME="jetson_36.4.7"
TARGET_DIRS=(
"nvgpu" "nvidia-oot" "hwpm"
"nvethernetrm" "nvdisplay"
"hardware/nvidia/t23x/nv-public"
"hardware/nvidia/tegra/nv-public"
)
for dir in "${TARGET_DIRS[@]}"; do
cd "$BASE_DIR/$dir" || continue
rm -rf .git
git init > /dev/null
touch .tag_bypass
git add . > /dev/null
git commit -m "Force fix" > /dev/null
git tag "$TAG_NAME"
done
步骤4:编译安装librealsense
bash复制./scripts/setup_udev_rules.sh
mkdir build && cd build
cmake .. -DBUILD_EXAMPLES=true \
-DCMAKE_BUILD_TYPE=release \
-DFORCE_RSUSB_BACKEND=false \
-DBUILD_WITH_CUDA=true
make -j$(($(nproc)-1))
sudo make install
验证安装:
bash复制realsense-viewer
# 检查IMU数据流是否正常(即使有motion failure警告也可继续)
2.4 realsense-ros ROS2封装安装
重要提醒:
- 绝对不要使用
apt安装(会覆盖手动编译的SDK) - 必须从源码编译ROS2 wrapper
bash复制mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src/
git clone https://github.com/IntelRealSense/realsense-ros.git -b ros2-master
cd ~/ros2_ws
rosdep install -i --from-path src --rosdistro $ROS_DISTRO --skip-keys=librealsense2 -y
colcon build
启动相机测试:
bash复制ros2 launch realsense2_camera rs_launch.py \
enable_accel:=true \
enable_gyro:=true \
unite_imu_method:=2 \
align_depth.enable:=true \
enable_sync:=true
检查IMU数据:
bash复制ros2 topic echo /camera/imu
# 确认线性加速度和角速度数据持续更新
3. VINS-Fusion ROS2版本编译与配置
3.1 源码获取与依赖检查
bash复制cd ~/ros2_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git -b ros2-humble-arm
关键依赖验证:
-
OpenCV版本:
bash复制
pkg-config --modversion opencv4应输出
4.10.0 -
Ceres版本检查:
bash复制cat /usr/local/include/ceres/version.h | grep CERES_VERSION_STRING应显示
2.1.0
3.2 编译参数调整
修改VINS-Fusion/CMakeLists.txt:
cmake复制find_package(OpenCV 4.10 REQUIRED)
find_package(Ceres 2.1 REQUIRED)
针对Jetson的优化编译:
bash复制cd ~/ros2_ws
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
3.3 配置文件适配D455
修改config/realsense_d455_config.yaml:
yaml复制imu_topic: "/camera/imu"
image0_topic: "/camera/infra1/image_rect_raw"
image1_topic: "/camera/infra2/image_rect_raw"
# 相机内参(需根据实际校准结果调整)
image_width: 640
image_height: 480
distortion_parameters:
k1: 0.0
k2: 0.0
p1: 0.0
p2: 0.0
IMU-相机外参标定建议:
- 使用
kalibr工具进行联合标定 - 至少采集3组不同姿态的标定板数据
- 标定环境光线充足,避免运动模糊
4. 实战问题排查与性能优化
4.1 常见错误解决方案
问题1:IMU数据断续
- 现象:VINS报"IMU data discontinuity"
- 解决方案:
bash复制# 修改realsense-ros启动参数 unite_imu_method:=1 # 改为线性插值 enable_sync:=true # 强制硬件同步
问题2:特征跟踪不稳定
- 现象:跟踪特征点快速流失
- 优化方法:
yaml复制# 调整VINS参数 max_cnt: 150 # 增加特征点数 min_dist: 30 # 提高特征点间距 freq: 20 # 降低处理频率
4.2 Jetson Orin专属优化
电源模式设置:
bash复制sudo nvpmodel -m 0 # 切换到MAXN模式
sudo jetson_clocks # 锁定最高频率
内存管理技巧:
bash复制# 增加zram交换空间
sudo apt install zram-config
sudo systemctl restart zram-config
4.3 实际测试数据
| 配置项 | 优化前 | 优化后 |
|---|---|---|
| 处理延迟 | 120ms | 65ms |
| CPU占用率 | 85% | 60% |
| 内存占用 | 3.2GB | 2.4GB |
| 轨迹误差(RMSE) | 0.38m | 0.21m |
经过完整优化后,系统能够在15W功耗下稳定运行VINS-Fusion,满足无人机实时定位的需求。后续可结合YOLOv5等检测算法实现完整的视觉导航系统。