中国建筑集团有限公司官网招聘,广告seo是什么意思,进口商品代理平台,wordpress 建资源县好不好1. 环境准备#xff1a;为你的Jetson Orin NX搭建坚实的地基 大家好#xff0c;我是老张#xff0c;一个在AI和机器人领域折腾了十多年的工程师。最近有不少朋友拿到了英伟达的Jetson Orin NX这块性能强劲的边缘计算板卡#xff0c;想用它来跑视觉SLAM#xff0c;特别是搭…1. 环境准备为你的Jetson Orin NX搭建坚实的地基大家好我是老张一个在AI和机器人领域折腾了十多年的工程师。最近有不少朋友拿到了英伟达的Jetson Orin NX这块性能强劲的边缘计算板卡想用它来跑视觉SLAM特别是搭配Intel的RealSense D455深度相机。这个组合确实很香Orin NX的算力足够D455又能提供高质量的深度和彩色图像是构建移动机器人、AR/VR应用的理想起点。今天我就来手把手带你在Ubuntu 20.04系统上把目前非常强大的ORB-SLAM3给部署起来并且把我在实战中踩过的坑、调优的经验都分享给你目标是让你看完就能跑通。首先别急着下载代码。在Jetson Orin NX上干活和在我们常用的x86电脑上有点不一样。它用的是ARM架构虽然Ubuntu用起来感觉差不多但一些库的编译和安装可能会有“惊喜”。所以第一步是确保你的系统是干净、准备好的。我强烈建议你给Orin NX刷一个纯净的Ubuntu 20.04 JetPack系统镜像NVIDIA官网有提供用SD卡或者直接刷机都行。装好系统后第一件事就是更新软件源和升级已有的包打开终端输入下面这两条命令喝杯咖啡等它完成。这个步骤能避免很多因版本过旧导致的依赖问题。sudo apt update sudo apt upgrade -y接下来我们需要安装一系列编译ORB-SLAM3所必需的底层工具和库。这些就像是盖房子需要的水泥、砖头和钢筋缺一不可。你可以一次性安装它们。这里面的build-essential、cmake、git是编译工具libeigen3-dev是线性代数库SLAM的数学基础libboost-all-dev提供了很多C扩展功能。特别要注意python3-dev和python3-numpyORB-SLAM3的一些脚本和Pangolin可视化工具会用到它们。在ARM平台上从源码编译东西比较耗时所以能用apt直接安装的我们就尽量用省时省力。sudo apt install -y build-essential cmake git libeigen3-dev libboost-all-dev libssl-dev libsuitesparse-dev libglew-dev libglfw3-dev libglm-dev libgtest-dev libgoogle-glog-dev libgflags-dev libatlas-base-dev libprotobuf-dev protobuf-compiler python3-dev python3-pip python3-numpy2. 核心依赖库的编译与安装基础工具装好了现在我们来搞定三个重量级的依赖OpenCV、Pangolin和g2o。为什么非要自己编译因为apt仓库里的版本可能不符合ORB-SLAM3的要求或者没有包含我们需要的特定功能模块。自己编译虽然慢点但最稳妥。2.1 编译安装OpenCV 4.5ORB-SLAM3官方推荐使用OpenCV 4。在Jetson Orin NX上我建议安装OpenCV 4.5.0或更高版本兼容性更好。首先我们去下载源码。我习惯在家目录下创建一个libs文件夹专门存放这些自己编译的库方便管理。cd ~ mkdir -p libs cd libs然后下载并解压OpenCV。这里我们同时下载opencv和opencv_contrib后者包含了很多额外的、有用的模块。wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.5.zip wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.5.zip unzip opencv.zip unzip opencv_contrib.zip mv opencv-4.5.5 opencv mv opencv_contrib-4.5.5 opencv_contrib编译前的配置是关键一步。我们进入OpenCV的源码目录创建一个build文件夹然后用cmake进行配置。这里的参数需要仔细看-D OPENCV_EXTRA_MODULES_PATH指定了贡献模块的路径-D WITH_CUDAON和-D WITH_CUDNNON是为了开启CUDA加速这对于拥有强大GPU的Orin NX至关重要能极大提升图像处理速度-D CUDA_ARCH_BIN8.7是指定Orin NX的GPU计算能力Compute Capability这个值一定要查准否则CUDA加速可能无效或报错。-D CMAKE_INSTALL_PREFIX/usr/local是设定安装路径。cd opencv mkdir build cd build cmake -D CMAKE_BUILD_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D OPENCV_EXTRA_MODULES_PATH../../opencv_contrib/modules \ -D WITH_CUDAON \ -D WITH_CUDNNON \ -D OPENCV_DNN_CUDAON \ -D CUDA_ARCH_BIN8.7 \ -D ENABLE_FAST_MATHON \ -D CUDA_FAST_MATHON \ -D WITH_CUBLASON \ -D WITH_LIBV4LON \ -D WITH_GSTREAMERON \ -D WITH_GTKON \ -D BUILD_opencv_python3ON \ -D BUILD_TESTSOFF \ -D BUILD_PERF_TESTSOFF \ -D BUILD_EXAMPLESOFF ..配置完成后如果看到CUDA和cuDNN被正确识别就可以开始编译了。使用make -j$(nproc)命令$(nproc)会自动获取你CPU的核心数进行并行编译以加快速度。Orin NX的CPU核心数不少这个过程大概需要30分钟到1小时。编译完成后执行sudo make install安装然后更新一下系统的库链接。make -j$(nproc) sudo make install sudo ldconfig最后验证一下安装是否成功以及CUDA支持是否开启。打开Python3导入cv2并打印版本和构建信息。python3 -c import cv2; print(cv2.__version__); print(cv2.getBuildInformation())你应该能看到版本号是4.5.5并且在输出信息中找到CUDA相关的字样比如“CUDA: YES”。2.2 编译安装PangolinPangolin是一个轻量级的OpenGL显示和交互库ORB-SLAM3用它来实时显示相机轨迹和地图点。它的编译相对简单。同样我们在libs目录下操作。cd ~/libs git clone --recursive https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build cd build配置CMake时注意关闭一些我们用不到的功能比如BUILD_PANGOLIN_PYTHON可以加快编译速度减少不必要的依赖。cmake -D CMAKE_BUILD_TYPERelease \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D BUILD_PANGOLIN_PYSONOFF \ -D BUILD_PANGOLIN_LIBJPEGOFF \ -D BUILD_PANGOLIN_LIBOPENEXROFF .. make -j$(nproc) sudo make install2.3 编译安装g2og2o是一个用于优化图模型的通用C框架是SLAM后端优化的核心。ORB-SLAM3使用了一个特定修改版的g2o已经包含在其Thirdparty目录下了。所以我们通常不需要单独安装一个系统级的g2o。ORB-SLAM3在编译时会自动编译它自带的那个g2o。这一点非常重要可以避免版本冲突。你只需要确保之前安装好了g2o的依赖项比如libsuitesparse-dev和libeigen3-dev我们在第一步已经做过了。因此这一步你可以跳过直接进入ORB-SLAM3的编译。3. ORB-SLAM3的获取、修改与编译万事俱备只欠东风。现在我们来处理主角ORB-SLAM3。3.1 获取源代码与关键修改创建一个工作空间克隆官方仓库。我建议使用--recursive参数确保子模块比如DBoW2也一并下载。cd ~ mkdir -p orb_ws cd orb_ws git clone --recursive https://github.com/UZ-SLAMLab/ORB_SLAM3.git代码下载好后不要急着编译。有几个地方必须根据我们的环境进行修改否则百分百会报错。第一个要改的就是项目根目录下的CMakeLists.txt文件。用你喜欢的文本编辑器打开它。gedit ORB_SLAM3/CMakeLists.txt找到查找OpenCV的那一行通常是find_package(OpenCV 4.0 QUIET)。因为我们自己编译了OpenCV 4.5.5且安装到了/usr/local所以需要明确告诉CMake去哪里找。在这行前面添加一句指定OpenCV的配置路径。修改后的片段看起来像这样# 在 find_package(OpenCV ...) 前面添加 set(OpenCV_DIR /usr/local/lib/cmake/opencv4) find_package(OpenCV 4.0 QUIET) if(NOT OpenCV_FOUND) find_package(OpenCV 3.0 QUIET) if(NOT OpenCV_FOUND) message(FATAL_ERROR OpenCV 2.4.3 not found.) endif() endif()这个修改至关重要它指引CMake去我们安装OpenCV 4的位置查找而不是去系统默认路径找可能存在的旧版本。3.2 执行编译修改保存后就可以开始编译了。ORB-SLAM3提供了非常方便的编译脚本。首先给脚本添加执行权限然后运行它。cd ORB_SLAM3 chmod x build.sh ./build.sh这个build.sh脚本会依次编译Thirdparty目录下的DBoW2和g2o最后编译ORB-SLAM3本体。整个过程在Orin NX上可能需要10-20分钟。如果一切顺利你会在lib目录下看到生成的libORB_SLAM3.so动态库文件在Examples目录下看到各种可执行文件如mono_euroc,stereo_inertial_euroc等。编译成功是万里长征的第一步接下来我们要让它真正“跑”起来而且是跑在我们自己的D455相机上。4. 连接RealSense D455并运行单目示例现在进入实战环节让ORB-SLAM3“看见”世界。首先确保你的D455相机已经通过USB 3.0接口最好是Type-C口连接到Orin NX上。然后需要安装Intel RealSense的SDK——librealsense以及它的ROS包装虽然我们可能不用ROS版本但SDK是必须的。4.1 安装Librealsense SDK在Ubuntu 20.04上我们可以通过PPA源来安装稳定的版本。依次执行以下命令sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE sudo add-apt-repository deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main -u sudo apt update sudo apt install -y librealsense2-dkms librealsense2-utils librealsense2-dev librealsense2-dbg安装完成后运行realsense-viewer命令应该能弹出一个图形界面看到相机的彩色、深度、红外等图像流。这说明驱动和SDK安装成功。请在这个界面里检查一下相机的固件版本如果不是最新的建议按照提示升级一下能解决很多兼容性问题。4.2 尝试运行与首次报错解决ORB-SLAM3的源码里自带了对RealSense D435i相机的例子。D455和D435i在数据接口上类似我们可以先借用它的配置文件试试。进入ORB_SLAM3目录尝试运行单目惯性例子./Examples/Monocular-Inertial/mono_inertial_realsense_D435i Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/RealSense_D435i.yaml十有八九你会立刻遇到一个报错大概意思是“不支持的选项”或者“AUTO_EXPOSURE错误”。这是因为ORB-SLAM3源码中试图设置相机的自动曝光模式但不同型号、不同固件的RealSense相机对此支持程度不同D455可能就不支持那个特定的设置选项。解决方法就是注释掉相关的代码行。用编辑器打开这个源文件gedit ./Examples/Monocular-Inertial/mono_inertial_realsense_D435i.cc找到设置相机参数的部分大概在60-80行左右你会看到类似cfg.enable_stream(RS2_STREAM_INFRARED, 1, width, height, RS2_FORMAT_Y8, fps);和cfg.enable_stream(RS2_STREAM_INFRARED, 2, width, height, RS2_FORMAT_Y8, fps);的语句。在这附近寻找包含AUTO_EXPOSURE字样的行通常长这样// sensor.set_option(RS2_OPTION_ENABLE_AUTO_EXPOSURE, 1); // sensor.set_option(RS2_OPTION_ENABLE_AUTO_WHITE_BALANCE, 1);用//把这两行注释掉如果它们没有被注释的话。保存文件。注意修改了源代码必须重新编译ORB-SLAM3./build.sh再次运行上面的命令这次你应该能看到一个Pangolin窗口弹出来左边是相机看到的图像右边是三维地图和相机轨迹。恭喜你ORB-SLAM3已经成功从你的D455相机读取图像并开始初始化了不过你可能会发现跟踪不太稳定或者初始化很慢甚至失败。这是因为我们还在用D435i的相机参数这和D455的实际内参焦距、光心相差很大。5. 为D455相机标定与参数调优用别人的眼镜看世界总是模糊的。要想让ORB-SLAM3在D455上表现优异我们必须使用D455相机真实的、标定好的参数。5.1 获取D455相机内参有两种方法。第一种是使用官方出厂参数。Intel为每个型号的相机提供了“典型”的内参你可以在RealSense Viewer里查看连接相机后在左侧设备信息栏找到“深度传感器”或“彩色传感器”点开“ intrinsics”就能看到fx,fy,cx,cy这些值。把它们记下来。但出厂参数是“平均”值和你手上这台相机可能有细微偏差。第二种也是我强烈推荐的是自己进行相机标定。这能获得最准确的参数。你可以使用ROS里的camera_calibration包或者更通用的OpenCV标定工具。这里我简要提一下用棋盘格和OpenCV标定的思路打印一张标准的棋盘格标定板用D455相机从不同角度、不同距离拍摄十几到二十张清晰的棋盘格照片。然后写一个Python脚本调用OpenCV的findChessboardCorners和calibrateCamera函数来计算相机的内参矩阵和畸变系数。这个过程网上教程很多我就不展开代码了。标定完成后你会得到一组属于你自己相机的“黄金参数”。5.2 修改YAML配置文件拿到内参后我们需要创建一个D455专属的配置文件。复制D435i的配置文件作为模板cp ./Examples/Monocular-Inertial/RealSense_D435i.yaml ./Examples/Monocular-Inertial/RealSense_D455.yaml然后用编辑器打开这个新的RealSense_D455.yaml文件。你需要修改以下几个关键部分相机参数 (Camera.*):fx,fy,cx,cy: 用你标定得到的内参替换。k1,k2,p1,p2: 畸变系数。如果标定时得到了就替换如果没标定畸变而相机图像畸变又很小可以暂时设为0。相机设置 (Camera.*续):fps: 建议设为30。D455支持更高但30fps对SLAM来说足够稳定。RGB和Depth的Width和Height: 根据你的需求设置。例如为了平衡性能和精度彩色图像可以用848x480深度图像用848x480。分辨率太高会加重Orin NX的负担。ORB特征参数 (ORB Extractor.*):nFeatures: ORB特征点数量。Orin NX算力强可以适当调高比如从1000调到1500或2000让特征更丰富。scaleFactor: 图像金字塔尺度因子默认1.2一般不用动。nLevels: 金字塔层数默认8可以保持。IMU参数 (IMU.*):D455内置了IMU。这些参数噪声密度、随机游走等非常关键且难以精确获取。最省事的方法是直接使用ORB-SLAM3项目中Examples文件夹下其他IMU配置文件如EuRoC.yaml里的IMU参数值。它们是基于特定IMU型号标定的虽然不完全匹配D455的IMU但通常比乱猜要好得多能让系统先跑起来。你可以把EuRoC.yaml中IMU.*开头的参数整段复制过来替换。修改完成后用新的配置文件运行./Examples/Monocular-Inertial/mono_inertial_realsense_D435i Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/RealSense_D455.yaml5.3 实战调优与性能观察使用了正确的相机参数后你会发现SLAM系统的表现有质的提升初始化更快、更鲁棒跟踪丢失的情况减少。但可能还会遇到其他问题比如轨迹尺度漂移或累计误差较大。这时可以进一步调优关键帧和地图点管理在RealSense_D455.yaml里可以调整ORB Extractor.nFeatures和ThDepth深度阈值等。在动态场景中可以尝试在代码中提高创建关键帧的阈值避免地图过于稠密。IMU融合权重如果你对IMU参数进行了粗略标定可以在IMU部分微调NoiseGyro和NoiseAcc等值。增大这些值相当于告诉系统“我更不相信IMU数据”会让系统更依赖视觉。利用Orin NX的GPU确保ORB-SLAM3在提取ORB特征时是否使用了GPU加速。默认的ORB提取是CPU版本的。你可以搜索一下如何集成CUDA加速的ORB特征提取器比如使用OpenCV的CUDA模块这能显著提升处理速度尤其是在高分辨率图像下。在调优过程中多观察Pangolin窗口。绿色的点是地图点红色的线是相机轨迹。如果地图点很稳定轨迹平滑说明系统状态良好。如果地图点闪烁严重或轨迹跳动就需要回头检查参数或者看看环境是不是太暗、太单调缺乏纹理。最后记得在光照良好、纹理丰富的环境下进行测试。SLAM是“视觉”SLAM它依赖图像特征。面对白墙、纯色桌面或者昏暗的环境再好的算法和硬件也无力回天。我的经验是在办公室或者家里有桌椅、书本、植物这些丰富纹理的场景下D455 ORB-SLAM3在Orin NX上能够跑出非常稳定、实时的效果完全能满足大多数机器人定位和建图的初步需求。希望这份超详细的指南能帮你少走弯路顺利搭起这个强大的SLAM系统。如果在实际操作中遇到新的问题不妨去ORB-SLAM3的GitHub Issues页面看看很多坑已经有前辈填过了。