资讯详情

Astra Pro + ROS Noetic + ORB_SLAM2 从零搭建RGB-D稠密SLAM全流程

📅 2026/10/6 7:00:20 | 华诺云谱 👁 阅读
Astra Pro + ROS Noetic + ORB_SLAM2 从零搭建RGB-D稠密SLAM全流程
玩视觉SLAM的同学大概率迟早会碰上一台奥比中光Astra Pro。这相机二手便宜、深度效果在同价位里算能打搭配ROS和ORB_SLAM2几乎成了我身边很多人入门RGB-D SLAM的标准配置。但说句实话这套组合的坑一点都不少驱动编译报错、USB带宽不够导致画面卡顿、ORB_SLAM2在OpenCV 4下的兼容性问题、相机参数文件配错导致轨迹漂移……每一步都能劝退一批人。这篇文章就记录我从零开始在一台Ubuntu 20.04 ROS Noetic环境的电脑上把Astra Pro驱动跑起来并让ORB_SLAM2实时出稠密地图的完整过程。适合刚接触深度相机和SLAM的同学参考如果你是已经在跑其他相机、想换到Astra Pro的老手直接跳到第3节看驱动细节和第4节看编译坑即可。1. 这套组合的定位与整体路线选择1.1 为什么是Astra Pro ROS1 ORB_SLAM2先说结论在“低成本入门RGB-D SLAM”这件事上Astra Pro ROS1 Noetic ORB_SLAM2仍然是最省心的组合没有之一。Astra Pro用的结构光方案在室内环境下深度数据比入门级双目相机稳定得多。它的深度分辨率最高支持640x48030fps彩色图最高1280x72030fps测量范围在0.6米到8米之间。这个参数看起来不算惊艳但对跑ORB_SLAM2来说完全够用因为ORB_SLAM2的RGB-D模式本身就对深度图分辨率不敏感。更重要的是Astra Pro的ROS驱动已经相当成熟USB接口即插即用不需要额外的采集卡。至于为什么强调ROS1而不是ROS2核心原因是生态。ORB_SLAM2官方仓库只支持ROS1Astra Pro的ROS1驱动astra_camera也是维护最完善的版本。虽然社区里有人做了ORB_SLAM2的ROS2移植版但那些版本大多需要自己改编译配置、处理依赖版本冲突对新手的排查能力要求太高。如果为了用ROS2而选择ORB_SLAM3学习曲线又会陡很多。所以我的建议很直接老老实实用Ubuntu 20.04 ROS Noetic这是目前资料最多、坑最浅的路线。另外要泼一盆冷水不建议在虚拟机里跑这套组合。我看到很多同学为了不折腾双系统选择VMware装Ubuntu然后把USB相机直通给虚拟机。Astra Pro虽然能识别但虚拟机的USB带宽和实时性都打折扣跑SLAM时深度图和彩色图的帧率一波动ORB_SLAM2就会疯狂丢帧你根本分不清是驱动问题还是虚拟机问题。物理机装双系统或者直接找一台旧电脑装Ubuntu比什么都强。1.2 硬件与系统的真实要求很多人问我这套组合对硬件要求高不高。我的实测感受是CPU单核性能比内存大小更重要内存8GB以上就行但CPU最好别太老否则特征提取会拖后腿。ORB_SLAM2的实时性瓶颈主要在ORB特征提取和词袋匹配这两块目前还是单线程为主。我试过在一台i5-7500的机器上跑640x480分辨率下CPU占用大概在60%到80%之间基本能稳住30帧。换成i3-4130这种老U帧率就会掉到15帧左右但勉强还能跑。所以只要你手上的电脑不是十年前的酷睿2问题都不大。系统方面优先Ubuntu 20.04。它对应的ROS版本是Noetic这也是ROS1最后一个长期支持版本。Ubuntu 22.04虽然也能装ROS1需要加源编译但Astra Pro的驱动和ORB_SLAM2的依赖在这种组合下容易出现预期外的兼容问题我不推荐新手尝试。还有个细节安装Ubuntu时分区尽量给大点ROS本体加编译缓存加数据集40GB起步比较稳妥如果还要存Pangolin和OpenCV的源码编译产物建议直接给到60GB。2. 环境部署ROS版本选型与一键安装实操2.1 Ubuntu版本与ROS版本怎么选才少踩坑我知道很多人装系统前会纠结Ubuntu 20.04和22.04有什么区别ROS Noetic和Humble哪个好这里直接给结论除非你有明确理由必须用ROS2否则现阶段入门Astra Pro ORB_SLAM2就用Ubuntu 20.04 ROS Noetic。原因是三个第一astra_camera驱动在Noetic下有现成的apt二进制包装起来极快第二ORB_SLAM2官方代码适配的是OpenCV 3.x和4.x的旧接口Noetic自带的OpenCV 4.2虽然需要小补丁但基本能用第三网上已有的教程、博客、问答几乎全是以这个组合为背景的你遇到任何报错都能搜到解决方案。如果你电脑上已经装好了Ubuntu 22.04也不是不能用但你要走的路会更长需要手动安装ROS Noetic官方源不支持22.04得用第三方源还要处理OpenCV 4.5以上版本带来的更多编译错误。我个人建议别折腾直接重装20.04半天时间比花两三天排错划算多了。安装Ubuntu 20.04之后先做两件事更新软件源安装基础工具。命令如下sudo apt update sudo apt upgrade -y sudo apt install -y git cmake build-essential net-tools htop这里有个小经验如果你用的是笔记本电脑注意在BIOS里把安全启动Secure Boot关掉否则后面装的一些内核模块和驱动可能会出现莫名奇妙的权限问题。2.2 鱼香ROS一键安装脚本实战ROS的安装方式有两种按官方文档一步步配置源、添加密钥、然后逐行执行安装命令或者直接用鱼香ROS的一键安装脚本。我在多台机器上都实测过鱼香ROS脚本稳定性和效率都很不错省去了手动配置源的麻烦。执行命令如下wget http://fishros.com/install -O fishros . fishros脚本运行后会弹出交互式菜单选择“一键安装ROS”然后选择ROS版本Noetic对应Ubuntu 20.04即可。整个安装过程大概十分钟左右脚本会自动配置软件源、添加ROS密钥、安装ros-noetic-desktop-full还会顺手帮你配置好rosdep。安装完成后务必执行一次环境变量配置echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc这里有几个容易忽略的细节。第一fishros脚本执行完毕后当前终端可能不会立即生效你最好重新开一个终端或者手动source一下。第二脚本装的rosdep默认源是github的在国内网络环境下经常超时fishros会帮你换成gitee镜像但如果后续编译功能包时rosdep还是报错可以再跑一次脚本选择“配置rosdep”选项做个修复。第三装完ROS后建议顺手装一下常用的可视化工具后面标定和调试都用得上sudo apt install -y ros-noetic-rviz ros-noetic-image-view ros-noetic-camera-calibration ros-noetic-rosbag2.3 环境验证roscore与工作空间预检ROS装完别急着装驱动先花五分钟验证环境是否健康这一步能帮你把后面可能出现的环境问题和代码问题区分开。开一个终端输入roscore看到started core service类似输出说明ROS核心正常。再开一个新终端输入rosnode list如果能看到/rosout节点说明ROS节点通信正常。接下来创建工作空间。这里有个建议工作空间名字不要用中文路径里也不要有空格。我的习惯是放在用户目录下mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make首次catkin_make会生成devel和build目录。这里说一下如果你后面的功能包很多我更推荐用catkin build但需要先安装sudo apt install -y python3-catkin-tools不装也行astra_camera和ORB_SLAM2用catkin_make完全够用。重点是把source ~/catkin_ws/devel/setup.bash加进.bashrc否则每次新开终端都找不到工作空间的依赖。实际操作中我发现很多人卡在这一步总以为功能包没编译其实就是环境变量没生效。还有一个预检项目是Python版本。Noetic用的是Python3如果你以前用过ROS MelodicPython2时代要确认自己敲的命令和功能包都是Python3的避免新旧混用。检查命令python3 --version3. Astra Pro驱动安装与相机标定3.1 驱动包选型apt安装还是源码编译Astra Pro在ROS下的驱动主要有两个来源一个是官方维护的astra_camera另一个是社区维护的ros_astra_camera。对于Noetic用户最简单的方式是直接装apt包sudo apt install -y ros-noetic-astra-camera这个包在ROS官方软件源里就有装上之后launch文件、节点、配置文件全给你安排好了。但要注意apt包版本有时候会比GitHub上的源码旧如果你买的是较新的Astra Pro硬件版本比如带新固件的批次apt包可能识别不到设备。这种情况就要用源码编译。源码编译的话需要先从GitHub拉取驱动代码cd ~/catkin_ws/src git clone https://github.com/orbbec/ros_astra_camera.git cd ~/catkin_ws catkin_make编译过程中如果报错缺依赖用rosdep统一解决cd ~/catkin_ws rosdep install --from-paths src --ignore-src -r -y这里我想多提醒一句源码版本的驱动对OpenNI库的依赖比较敏感如果你系统里装过其他深度相机的驱动比如Kinect的openni2可能会产生库冲突。遇到这种问题检查一下/usr/lib下有没有多个版本的libOpenNI2.so有的话先卸载不用的再编译。3.2 源码编译驱动与设备权限处理无论用apt还是源码装完之后都要处理USB设备权限否则运行launch时会出现device not found或者permission denied。Astra Pro在Linux下通常会被识别为/dev/bus/usb/xxx/xxx。把当前用户加入dialout组是最快的权限解决方案sudo usermod -a -G dialout $USER然后重新登录一次。如果你用的是Ubuntu桌面版也可以直接写udev规则一劳永逸echo SUBSYSTEMusb, ATTR{idVendor}2bc5, MODE0666, GROUPplugdev | sudo tee /etc/udev/rules.d/99-astra.rules sudo udevadm control --reload-rulesAstra Pro的Vendor ID有两个常见值2bc5是Orbbec的通用ID部分早期批次是1c28。如果规则写了还是不识别用lsusb看一下具体ID再改规则。环境就绪后启动相机roslaunch astra_camera astrapro.launch正常的话终端会输出相机序列号和固件版本然后开始发布话题。此时新开终端查看话题列表rostopic list应该能看到/camera/rgb/image_raw、/camera/depth/image_raw、/camera/rgb/camera_info、/camera/depth/camera_info等话题。再用rostopic hz检查帧率rostopic hz /camera/rgb/image_raw rostopic hz /camera/depth/image_raw彩色图一般是30Hz深度图也是30Hz。如果帧率忽高忽低或者只有10Hz大概率是USB带宽不足。解决办法换一根质量好的USB 3.0数据线插到主板原生USB 3.0口不要用前置面板或者USB Hub。3.3 相机标定与图像配准设置Astra Pro出厂时深度相机是有内参的但彩色相机的内参每台机器略有差异强烈建议自己做一次标定否则ORB_SLAM2跑出来的轨迹会带有系统性偏差。标定使用ROS自带的camera_calibration工具。先打印一张8x6棋盘格格子边长建议25mmA4纸打印后贴在硬纸板上。然后启动相机和标定程序roslaunch astra_camera astrapro.launch rosrun camera_calibration cameracalibrator.py image:/camera/rgb/image_raw camera:/camera/rgb --size 8x6 --square 0.025出现标定窗口后手持棋盘格在相机前缓慢移动覆盖画面的四角、中心和边缘位置。注意不要离得太近棋盘格要完整出现在画面里倾斜角度别太大否则角点检测容易失败。当界面上的CALIBRATE按钮变亮后点击等待计算完成即可。标定结果会生成一个包含fx、fy、cx、cy和畸变系数的yaml文件。我标定过两台Astra Pro640x480分辨率下的fx、fy通常在550到580之间cx、cy接近320和240。这个数据后面写ORB_SLAM2相机参数文件时会用到。关于图像配准astra_camera的launch里有一个depth_registration参数。开启后驱动会发布/camera/depth_registered/image_raw也就是把深度图对齐到彩色相机坐标系。Astra Pro的彩色镜头和深度镜头在物理位置上有几厘米的偏移如果不配准深度图和彩色图的像素点不对应ORB_SLAM2重建出来的点云会出现明显的边缘错位。所以强烈建议开启配准launch node pkgastra_camera typeastra_camera_node nameastra_camera_node outputscreen param namedepth_registration valuetrue/ /node /launch不过ORB_SLAM2默认订阅的深度话题是/camera/depth/image_raw开了配准后会发布的是/camera/depth_registered/image_raw所以后面运行ORB_SLAM2时需要做个话题重映射这个在第5节会说。4. ORB_SLAM2编译与配置排错4.1 依赖安装Pangolin、OpenCV、Eigen3的版本控制ORB_SLAM2的编译依赖看着简单但版本上全是坑Pangolin、OpenCV、Eigen3这三个库版本太新或太旧都会导致编译失败。先说我的推荐版本组合Pangolinv0.5或v0.6不要用v0.8以上API改动太大OpenCVUbuntu 20.04自带的4.2即可不要额外升级到4.7以上Eigen3Ubuntu 20.04自带的3.3.7即可不要手动装3.4以上先装依赖库sudo apt install -y libeigen3-dev libopencv-dev libboost-all-dev libglew-dev libssl-dev python3-dev pybind11-dev然后手动编译Pangolin。这里有个技巧直接指定v0.6分支避免master分支的API不兼容git clone -b v0.6 https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build cd build cmake .. make -j4 sudo make install如果你不小心装了Pangolin v0.9编译ORB_SLAM2时会出现PangolinViewer相关的接口报错处理起来比较麻烦多数人最后都是重装旧版。所以安装前务必确认分支。4.2 编译报错实录与修复对照表ORB_SLAM2的编译过程我前前后后跑过不下五遍几乎每次都能遇到新报错。这里把最常见的几个问题和修复方法整理成表格方便你对着排查报错现象原因修复方法error: USAC_FAST is not a member of cvOpenCV 4.4之后移除了USAC_FAST枚举全局替换cv::USAC_FAST为cv::USAC_DEFAULTfatal error: opencv2/xfeatures2d.hpp: No such file or directory缺少OpenCV contrib模块安装libopencv-contrib-dev或者注释掉相关includeerror: CV_LOAD_IMAGE_UNCHANGED was not declaredOpenCV 4.x移除了旧宏定义全局替换CV_LOAD_IMAGE_UNCHANGED为cv::IMREAD_UNCHANGEDPangolin编译时报undefined reference tostd::...GCC版本与Pangolin版本不匹配换成Pangolin v0.6重新编译find_package(OpenCV 3.0 QUIET)找不到OpenCVCMake缓存问题删除build目录重新cmake其中USAC_FAST这个问题是最常见的因为Ubuntu 20.04的OpenCV 4.2还能编译通过但如果你用Ubuntu 22.04或者手动升级了OpenCV这个错误就一定会出现。网上有个通用的修复补丁原理就是把ORB_SLAM2源码src目录下所有文件中的cv::USAC_FAST统一改为cv::USAC_DEFAULT。实操上我用一行命令搞定cd ~/ORB_SLAM2/src sed -i s/cv::USAC_FAST/cv::USAC_DEFAULT/g *.cc另外还有一个容易被忽视的坑DBoW2和g2o这两个第三方库是跟随ORB_SLAM2源码一起发布的在Thirdparty目录下。编译时build.sh会自动编译它们但如果你系统里恰好装了新版本的Eigeng2o就会编译失败。这也是我前面强调要用3.3.7版Eigen的原因。如果你已经装了高版本Eigen卸载重装比较麻烦可以试试在g2o的CMakeLists里强制指定老版本Eigen但我不推荐这个路。4.3 相机参数文件的正确写法编译通过之后需要为Astra Pro写一个相机参数文件。ORB_SLAM2的RGB-D例程会读取一个yaml文件里面的参数直接决定SLAM的精度。在ORB_SLAM2/Examples/RGB-D/目录下新建一个Astra.yaml参考下面这个模板%YAML:1.0 Camera.fx: 554.3827 Camera.fy: 554.3827 Camera.cx: 320.0 Camera.cy: 240.0 Camera.k1: 0.0 Camera.k2: 0.0 Camera.p1: 0.0 Camera.p2: 0.0 Camera.k3: 0.0 Camera.width: 640 Camera.height: 480 Camera.fps: 30 Camera.bf: 40.0 Camera.RGB: 0 ThDepth: 3.5 DepthMapFactor: 1000这里面的fx、fy、cx、cy要把你第3节标定得到的值替换进去。两个容易出错的点第一Camera.RGB这个参数代表输入图像的通道顺序。Astra Pro驱动发布的彩色图像是BGR顺序所以填0。如果你设置成1SLAM看到的颜色会红蓝互换虽然不影响定位精度但显示效果很别扭。第二DepthMapFactor代表深度值转换为米的缩放因子。Astra Pro深度图的像素值单位是毫米所以填1000。但这里我强烈建议你做一次实测确认运行rostopic echo /camera/depth/image_raw看相机前面0.5米处一个平面物体的深度值。如果输出的是500左右说明单位是毫米填1000没错如果输出的是0.5左右说明单位已经是米就要填1。这个参数错了SLAM跑起来后地图里的物体尺寸会离谱地膨胀或缩小。5. 实时运行从话题检查到轨迹输出5.1 启动顺序与话题自检清单所有前置工作完成后就可以跑起来了。我建议严格按照下面的顺序操作避免在启动阶段出现各种诡异的连接问题。第一步启动相机驱动roslaunch astra_camera astrapro.launch第二步验证所有话题正常发布。新开终端逐条执行rostopic hz /camera/rgb/image_raw rostopic hz /camera/depth_registered/image_raw rostopic hz /camera/rgb/camera_info rostopic hz /camera/depth/camera_info如果depth_registered话题不存在说明launch里没开启配准参数回第3.3节重新配置。第三步启动ORB_SLAM2。由于ORB_SLAM2默认订阅的是/camera/depth/image_raw而我们用的是配准后的/camera/depth_registered/image_raw所以需要重映射cd ~/ORB_SLAM2 rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/RGB-D/Astra.yaml /camera/depth/image_raw:/camera/depth_registered/image_raw看到终端输出Map initialized或者System started之类的日志后把相机对准室内场景慢慢移动很快就能看到Rviz里出现稀疏特征点和轨迹线。这里有个小tip如果一开始画面很暗或者全是黑色先检查彩色图像有没有发布如果彩色图正常但深度图一片黑大概率是深度相机观察范围的问题——Astra Pro最短工作距离是0.6米你把物体怼得太近深度图当然全黑。5.2 运行时调优特征点、时间同步与性能ORB_SLAM2跑起来和跑得顺是两码事。我遇到最多的性能问题是CPU占用过高和帧率下降明显。如果你的CPU性能一般建议从以下三个方向调优。第一降低特征点数量。打开Astra.yaml找到ORBextractor.nFeatures默认是1500可以降到1000甚至800。特征点少一点特征提取和匹配的开销都会下降对于室内环境来说800到1000个特征点完全够用。同理ORBextractor.nLevels可以从8降到6金字塔层数减少也能省CPU。第二确认时间同步是否正常。ORB_SLAM2的RGB-D例程使用message_filters来近似同步彩色图和深度图如果两个话题的发布频率差异太大同步器会丢帧。检查一下两个话题的hz是否都稳定在30附近。如果你发现深度图和彩色图的帧率差别很大优先检查USB带宽问题。我遇到过的情况是相机插在USB 3.0口上但系统把它识别成了USB 2.0设备导致深度图只有15Hz。这个问题在dmesg日志里能看到提示。第三调整线程调度。ORB_SLAM2没有提供设置线程亲和性的接口但你可以通过降低GUI刷新率来减少显示开销。如果你不需要实时看Rviz画面可以直接不用RvizORB_SLAM2自带的Pangolin Viewer也足够。Pangolin窗口的刷新率在代码里固定为30fps如果觉得卡可以用环境变量DISPLAY相关设置降低屏幕刷新但这招治标不治本核心还是CPU性能。5.3 效果验证如何快速判断SLAM是否正常SLAM跑起来之后怎么判断它到底行不行我的做法是三个指标轨迹是否闭环、地图点是否稳定、定位是否漂移。先看轨迹。拿着相机在房间里走一圈最后回到起点。如果ORB_SLAM2检测到了闭环Pangolin Viewer里会出现一条明显的闭合回环线同时全局轨迹会被拉回原点附近。如果你走了一大圈都没触发闭环可能是环境纹理太少或者重复度过高换个桌子多一点、墙面有海报的场景再试。再看地图点。稳定情况下地图点会密集分布在物体表面形成明显的轮廓。如果你看到地图点在抖动或者出现大量漂浮的点说明深度图和彩色图的对齐有问题回到第3.3节检查配准是否开启或者检查DepthMapFactor是否设置正确。最后看定位漂移。盯着轨迹线的起点如果即使相机静止不动轨迹也在缓慢漂移说明相机内参标定不够准。这种情况下重新做一次标定或者检查Camera.RGB参数是否设反了。我在实际测试中踩过一个坑标定时用的是A4纸棋盘格但纸没有完全压平导致标定出的fx偏小跑SLAM时距离估计一直有偏差后来重新用硬纸板贴平后再标定就好了。6. 高频问题速查表与经验总结6.1 故障排查对照表最后把这些年折腾Astra Pro过程中遇到的高频问题整理成一个速查表方便你直接对号入座现象可能原因排查顺序roslaunch启动失败提示device not found设备权限不足、USB线材问题先lsusb确认设备是否被识别再看/dev权限最后换线彩色图正常深度图全黑或花屏USB带宽不足、深度工作距离过近换USB 3.0口确认物体距离在0.6米以上深度图和彩色图内容不对应未开启深度配准launch中加入depth_registrationtrueORB_SLAM2启动后瞬间退出相机参数文件里width/height与实际不符检查图像分辨率是否为640x480SLAM跑起来但地图点漂浮DepthMapFactor设置错误用rostopic echo确认深度单位轨迹严重漂移闭环检测不到内参标定不准、环境纹理不足重新标定换场景CPU占用100%帧率跌到个位数特征点数过多、老CPU降低nFeatures关闭Rviz6.2 我的一些实操体会整套流程跑通之后回头看最花时间的其实不是编译本身而是排查各种环境层面的问题。ROS的报错信息有时候很误导人比如device not found可能根本不是设备问题而是udev规则没写对USAC_FAST编译报错看起来是语法问题本质是OpenCV版本兼容性。我个人的建议是在开始之前就把环境固定好严格按Ubuntu 20.04 ROS Noetic OpenCV 4.2 Pangolin v0.6这套组合来。不要想着装最新版SLAM和学习场景下稳定复现比新功能重要得多。另外一个小技巧是每次运行完相机驱动后如果相机异常断开记得重启一下相机节点或者拔插一次USB线Astra Pro在异常断开后偶尔会进入一种假死状态不重新枚举设备就一言不发。这个问题各种文档里没写过省得你花半天查日志。最后再分享一个以后可能会用到的小经验Astra Pro这套驱动和SLAM流程跑通之后如果你想换Kinect或者Intel RealSense配置思路其实是通用的——先确认驱动发布的话题名和数据类型再确认深度图的单位最后把相机参数填进SLAM配置文件。换任何相机都跑不出这三个步骤理解了这层逻辑你以后换硬件就不会再从头踩一遍坑了。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑