用IMX219-83双目相机和Jetson Nano搭建你的第一个视觉SLAM demo
从零搭建基于IMX219-83双目相机与Jetson Nano的视觉SLAM系统
当我们需要让机器理解周围环境并自主导航时,视觉SLAM技术就像是为机器装上了一双会思考的眼睛。IMX219-83双目相机与Jetson Nano的组合,为开发者提供了一个高性价比的硬件平台,能够快速验证SLAM算法原型。本文将带你完整走过从硬件配置到算法实现的每一步,让你在一天内就能看到自己的SLAM系统实时构建环境地图。
1. 硬件准备与环境配置
在开始之前,我们需要确保所有硬件组件正确连接并正常工作。IMX219-83是一款基于索尼IMX219传感器的双目相机模组,具有800万像素分辨率和83度广角视野,非常适合SLAM应用中对宽视野和高分辨率的需求。
1.1 硬件连接与检测
将IMX219-83双目相机的两条CSI排线插入Jetson Nano的CSI接口,注意排线金属触点朝向散热器方向。连接完成后,启动Jetson Nano并打开终端,输入以下命令检查设备是否被正确识别:
ls /dev/video*如果看到video0和video1两个设备节点,说明双相机已被系统识别。接下来我们可以测试每个相机是否正常工作:
# 测试左相机(video0) DISPLAY=:0.0 gst-launch-1.0 nvarguscamerasrc sensor-id=0 ! 'video/x-raw(memory:NVMM), width=3280, height=2464, format=(string)NV12, framerate=(fraction)20/1' ! nvoverlaysink -e # 测试右相机(video1) DISPLAY=:0.0 gst-launch-1.0 nvarguscamerasrc sensor-id=1 ! 'video/x-raw(memory:NVMM), width=3280, height=2464, format=(string)NV12, framerate=(fraction)20/1' ! nvoverlaysink -e提示:如果看到的图像呈现红色调,可能需要安装相机校正文件。执行以下命令下载并安装校正文件:
wget https://www.waveshare.com/w/upload/e/eb/Camera_overrides.tar.gz tar zxvf Camera_overrides.tar.gz sudo cp camera_overrides.isp /var/nvidia/nvcam/settings/ sudo chmod 664 /var/nvidia/nvcam/settings/camera_overrides.isp sudo chown root:root /var/nvidia/nvcam/settings/camera_overrides.isp1.2 ROS环境安装与配置
视觉SLAM系统通常基于ROS(Robot Operating System)框架开发,我们需要在Jetson Nano上安装ROS Melodic版本(对应Ubuntu 18.04)。以下是安装步骤:
设置软件源:
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 install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update安装完整版ROS:
sudo apt install ros-melodic-desktop-full初始化ROS环境:
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc安装依赖工具:
sudo apt-get install python-pip sudo pip install -U rosdep sudo rosdep init rosdep update创建工作空间:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws catkin_make source ~/catkin_ws/devel/setup.bash
2. 相机驱动与标定
2.1 安装相机ROS驱动
为了让双目相机在ROS中工作,我们需要安装专门的CSI相机驱动。推荐使用jetson_nano_csi_cam_ros驱动:
cd ~/catkin_ws/src git clone https://github.com/rt-net/jetson_nano_csi_cam_ros.git cd ~/catkin_ws catkin_make source ~/catkin_ws/devel/setup.bash驱动安装完成后,可以通过以下命令启动相机节点:
roslaunch jetson_nano_csi_cam jetson_nano_csi_cam.launch2.2 双目相机标定
相机标定是SLAM系统获得准确结果的关键步骤。我们需要分别对左右相机进行内参标定,然后进行双目外参标定。
安装标定工具:
sudo apt-get install ros-melodic-camera-calibration打印标定棋盘格(A4纸打印即可),并测量每个方格的物理尺寸(通常为2-3cm)
左相机标定:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/left/image_raw camera:=/left右相机标定:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/right/image_raw camera:=/right双目相机标定:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 right:=/right/image_raw left:=/left/image_raw right_camera:=/right left_camera:=/left
标定过程中需要移动棋盘格到相机视野的不同位置和角度,直到CALIBRATE按钮变为绿色方可点击计算标定参数。标定完成后,将生成的ost.yaml和ost.txt文件保存备用。
3. SLAM算法选择与部署
3.1 SLAM算法比较
针对Jetson Nano的算力限制,我们需要选择计算效率较高的SLAM算法。以下是几种适合的算法对比:
| 算法名称 | 类型 | 计算需求 | 特点 | 适用场景 |
|---|---|---|---|---|
| ORB-SLAM2 | 特征点法 | 中 | 精度高,回环检测优秀 | 中小规模环境 |
| RTAB-Map | 直接法 | 中高 | 支持RGB-D,建图效果好 | 三维重建 |
| VINS-Fusion | 视觉惯性 | 中 | 支持IMU融合,鲁棒性强 | 动态环境 |
| DROID-SLAM | 深度学习 | 高 | 端到端,无需特征提取 | 复杂光照条件 |
对于初次尝试,推荐从ORB-SLAM2开始,它在精度和性能之间取得了良好平衡。
3.2 安装ORB-SLAM2
安装依赖:
sudo apt-get install libglew-dev libpython2.7-dev libeigen3-dev克隆源码:
cd ~/catkin_ws/src git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2修改编译配置: 由于Jetson Nano使用ARM架构,需要修改
ORB_SLAM2/CMakeLists.txt:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -O3 -march=armv8-a")编译:
cd ORB_SLAM2 chmod +x build.sh ./build.sh下载ORB词袋模型:
wget https://github.com/raulmur/ORB_SLAM2/blob/master/Vocabulary/ORBvoc.txt.tar.gz tar -xvzf ORBvoc.txt.tar.gz
3.3 运行ORB-SLAM2双目版本
创建启动文件
~/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/run_stereo.sh:#!/bin/bash rosrun ORB_SLAM2 Stereo \ /home/$USER/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt \ /home/$USER/catkin_ws/src/ORB_SLAM2/Examples/Stereo/EuRoC.yaml \ false \ /left/image_raw:=/left/image_raw \ /right/image_raw:=/right/image_raw修改相机参数文件
EuRoC.yaml,填入之前标定得到的相机内参和畸变系数赋予执行权限并运行:
chmod +x run_stereo.sh ./run_stereo.sh同时打开另一个终端,启动相机节点:
roslaunch jetson_nano_csi_cam jetson_nano_csi_cam.launch
4. 系统优化与性能调优
4.1 Jetson Nano性能优化
为了在资源有限的Jetson Nano上获得更好的SLAM性能,可以进行以下优化:
启用最大性能模式:
sudo nvpmodel -m 0 sudo jetson_clocks增加交换空间:
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab关闭图形界面(可选):
sudo systemctl set-default multi-user.target sudo reboot
4.2 ORB-SLAM2参数调优
编辑ORB_SLAM2/Examples/Stereo/EuRoC.yaml,调整以下关键参数:
# ORB特征点数量,减少可提升速度 ORBextractor.nFeatures: 1000 # 图像金字塔层数,减少可提升速度 ORBextractor.nLevels: 5 # 特征点提取尺度因子 ORBextractor.scaleFactor: 1.2 # 关键帧插入频率,增大可减少计算量 KeyFrameInsertionFrequency: 2.04.3 可视化与调试
使用RViz可以实时查看SLAM系统的运行状态:
安装RViz:
sudo apt-get install ros-melodic-rviz创建RViz配置文件
orb_slam2.rviz,配置以下显示项:- 相机位姿(TF)
- 特征点云(PointCloud2)
- 关键帧路径(Path)
- 地图点(MarkerArray)
启动RViz:
rosrun rviz rviz -d orb_slam2.rviz
5. 实际应用与扩展
5.1 地图保存与重利用
ORB-SLAM2支持将构建的地图保存到文件,并在后续运行时加载:
# 保存地图 rosservice call /orb_slam2/save_map "map_path: '/home/$USER/map.bin'" # 加载地图运行 rosrun ORB_SLAM2 Stereo \ /home/$USER/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt \ /home/$USER/catkin_ws/src/ORB_SLAM2/Examples/Stereo/EuRoC.yaml \ true \ /left/image_raw:=/left/image_raw \ /right/image_raw:=/right/image_raw \ map_file:=/home/$USER/map.bin5.2 与机器人系统集成
将SLAM系统与机器人控制系统集成,通常需要发布以下ROS话题:
/tf:相机坐标系到世界坐标系的变换/orb_slam2/camera_pose:相机当前位姿/orb_slam2/map_points:稀疏地图点云
可以通过robot_localization包将视觉SLAM位姿与IMU数据进行融合,获得更稳定的定位结果。
5.3 尝试其他SLAM算法
当熟悉了ORB-SLAM2后,可以尝试部署其他SLAM算法:
RTAB-Map:更适合三维重建场景
sudo apt-get install ros-melodic-rtabmap-ros roslaunch rtabmap_ros rtabmap.launch stereo:=trueVINS-Fusion:如果相机带有IMU,可以获得更鲁棒的结果
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
在实际项目中,我发现IMX219-83双目相机在室内环境中表现良好,但在强光直射或极低光照条件下,特征提取会变得困难。这种情况下,可以考虑添加红外补光灯或使用曝光补偿技术来改善图像质量。
