ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Astra Pro + ORB-SLAM2实现实时RGB-D建图完整指南

Astra Pro + ORB-SLAM2实现实时RGB-D建图完整指南 把奥比中光Astra Pro和ORB-SLAM2串起来做成实时3D建图这个组合我在实验室里前前后后折腾了快两周才跑顺。网上关于单目和双目ORB-SLAM2的资料一抓一大把但到了RGB-D深度相机这块尤其是Astra Pro这款国产深度相机能照着一步步做完的完整教程真不多。这篇文章就是把我的完整踩坑过程整理出来从环境搭建、相机驱动、参数标定到最终跑通实时建图把每一步为什么这么做、遇到问题怎么排查都写清楚。不管你是刚接触SLAM的学生还是想把深度相机接入ROS做机器人感知的工程师这份指南都能帮你少走不少弯路。1. 项目整体设计与思路拆解1.1 为什么选Astra Pro ROS ORB-SLAM2这套组合先说结论这套组合的最大价值在于用千元级深度相机实现了接近激光雷达建图效果的实时三维重建。奥比中光Astra Pro是一款结构光深度相机它和Kinect v1的原理类似通过红外投影仪投射编码光斑再用红外相机拍摄被物体调制后的光斑图案经过芯片计算得到深度图。这款相机在2018年前后大量出货二手价格非常友好而且官方对Linux的支持比较完善有现成的ROS驱动包这是它在SLAM开发场景里特别受欢迎的核心原因。ORB-SLAM2是西班牙萨拉戈萨大学Raul Mur-Artal团队开源的视觉SLAM系统支持单目、双目、RGB-D三种传感器模式。它最大的特点是不需要GPU加速纯CPU就能跑到实时帧率这点对入门玩家太友好了。它的整体架构分三线程并行跟踪线程实时计算相机位姿局部建图线程维护地图点回环检测线程消除累积漂移。ROS在这里扮演的是数据高速公路的角色。Astra Pro的ROS驱动把彩色图和深度图发布到话题topic上ORB-SLAM2的ROS节点订阅这些话题完成一帧帧的位姿估计和地图构建。整个系统解耦成独立模块后续你想换算法、换相机只需要改话题接口就行。1.2 为什么这种方案能实现实时很多人对实时两个字有误解。实时不是指画面刷新快到什么程度而是在下一帧数据到来之前算法能完成对当前帧的处理。ORB-SLAM2的RGB-D模式对640x480分辨率的图像在i5级别的CPU上单帧处理时间大约在30~50毫秒也就是20~30FPS的帧率刚好卡在实时处理的窗口内。CLI可预期的数据流是这样的Astra Pro输出30FPS的彩色图和深度图 —— ROS驱动把它们封装成消息发布 —— ORB-SLAM2节点按消息的时间戳逐帧处理 —— 跟踪线程提取ORB特征点、匹配上一帧、求解位姿 —— 地图点更新 —— 可视化成稀疏点云。每一步的耗时叠加起来不超过50毫秒这就构成了实时闭环。需要注意ORB-SLAM2建出来的地图是稀疏特征点地图不是你在淘宝上看到的3D扫描仪那种稠密网格模型。它解决的是我在哪和周围环境长什么样的位姿估计问题适合导航定位如果你要做完整的稠密建模得在它后面再接点云拼接的步骤这个我在第4.4节会展开讲。2. 环境准备Ubuntu与ROS工具链搭建2.1 Ubuntu版本选型与ROS发行版匹配版本选对事半功倍。我踩过的最大坑就是在Ubuntu 20.04上强行编译ROS Kinetic时代的旧包结果各种依赖冲突。建议如下组合项目推荐版本说明Ubuntu18.04 或 20.04两个版本对应的ROS生态最稳定ROSMelodic18.04或 Noetic20.04Noetic是ROS1最后一个版本支持到2025年OpenCV3.2 / 4.2系统自带即可ORB-SLAM2需要OpenCV 3.x以上Pangolin0.6或最新master用于可视化窗口下文会讲编译坑Eigen3.3.x线性代数库g2o依赖我最终用的是Ubuntu 18.04 ROS Melodic。倒不是因为18.04比20.04好而是Astra Pro的SDK对老版本系统的兼容性验证更充分比如它自带的uvc摄像头驱动在18.04内核下几乎免配。如果你手头已经是20.04 Noetic也没问题下面步骤同样适用只是个别依赖包的安装命令略有差异。2.2 ROS安装从换源到一键安装ROS的完整安装流程官方Wiki写得很规范但新人最容易卡在国内网络环境下软件源更新极慢这个环节。这里推荐两个办法第一个是官方流程配国内镜像源。在Ubuntu 18.04上装Melodic核心步骤就是设置软件源、添加ROS密钥、然后sudo apt install ros-melodic-desktop-full。桌面完整版会把rqt、rviz、gazebo这些常用工具一并装好虽然体积大一些大约3~4GB但对后面调试方便很多。第二个是很多同学现在都在用的鱼香ROS一键安装。这个脚本把换源、安装、初始化rosdep全部自动化了执行一条命令就能装好ROS。我在给同事配环境时用过几次稳定性确实做得越来越好尤其是rosdep update这一步一键脚本会自动处理网络重试的问题对新手极为友好。具体用法是到鱼香ROS官方文档页面复制对应发行版的安装命令在终端执行后按提示等待即可。C编不过、rosdep初始化失败、rviz打开闪退这些问题90%都出在环境配置不完整。装完ROS后务必执行echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc rosdep init rosdep update2.3 编译ORB-SLAM2的依赖库Pangolin、OpenCV与EigenORB-SLAM2的官方README里会要求你先装好Pangolin、OpenCV、Eigen、g2o、DBoW2。后面两个在仓库源码里已经打包好了编译ORB-SLAM2时会一并构建不需要单独装。你需要手动处理的是前面三个。Pangolin是可视化库ORB-SLAM2运行时的地图窗口就是用它画的。编译它需要依赖libglew-dev、libpython3-dev、libxkbcommon-dev等先装好再编译sudo apt install libglew-dev libpython3-dev libxkbcommon-dev git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build cd build cmake .. make -j$(nproc) sudo make install这里有个小坑Pangolin更新到0.6版本之后对OpenGL版本有要求如果你的显卡驱动太老编译可能报EGL not found这时候检查libegl1-mesa-dev是否安装。OpenCV方面Ubuntu 18.04自带3.2版本对ORB-SLAM2已经够用。不用自己编译OpenCV 4.x替代除非你要跑其他依赖新版本OpenCV的算法。系统自带版本的好处是和ROS的图像消息接口cv_bridge天然兼容省掉一长串版本冲突问题。Eigen直接apt安装就行sudo apt install libeigen3-dev装完后/usr/include/eigen3就是头文件路径ORB-SLAM2的CMakeLists.txt默认找这个路径不用额外配置。3. Astra Pro相机驱动与数据获取3.1 Astra Pro驱动安装与ROS wrapper部署Astra Pro在ROS下有两种使用方式一种是官方SDK配合astras_wrapper另一种是开源社区的libuvc_astra。我推荐用astras_wrapper它是奥比中光官方维护的ROS包和SDK同源稳定性最好。安装步骤# 下载SDK和ROS wrapper放到catkin工作空间 cd ~/catkin_ws/src git clone https://github.com/orbbec/ros_astra_camera.git git clone https://github.com/orbbec/ros_astra_launch.git # 把SDK放到ros_astra_camera的depend目录下 # 注意SDK的linux/文件夹需与驱动源码的lib目录对应 cd ~/catkin_ws catkin_make source ~/catkin_ws/devel/setup.bash然后给udev规则加权限这一步忘了的话插上相机肯定报device not foundcd ~/catkin_ws/src/ros_astra_camera/scripts sudo bash create_udev_rules.sh # 重新插拔USB确认/dev下有对应设备节点最后启动相机roslaunch astra_launch astrapro.launch启动成功后ROS里会出现以下关键话题/camera/rgb/image_raw # 640x480 彩色图 /camera/depth/image_raw # 640x480 深度图单位毫米 /camera/rgb/camera_info # 彩色相机内参 /camera/depth/camera_info # 深度相机内参3.2 数据可视化与相机工作状态确认相机启动后不要急着接ORB-SLAM2先确认数据质量。用rqt_image_view看图像rqt_image_view /camera/rgb/image_raw rqt_image_view /camera/depth/image_raw深度图在rqt里默认显示为灰度图离相机近的物体偏亮远处偏暗。如果整张图漆黑一片或者花屏九成是红外发射窗口被遮挡或者物体距离太近。用命令行工具看话题信息rostopic hz /camera/depth/image_raw正常情况下深度频率应该在30Hz上下浮动如果只有几帧或者时断时续要么是USB带宽不足务必用USB 3.0接口Astra Pro在USB 2.0下传输高分辨率深度流非常吃力要么是CPU处理不过来。3.3 相机标定为什么不能跳过IR相机标定Astra Pro出厂时彩色相机和深度相机各自有一份内参分别打在/camera/rgb/camera_info和/camera/depth/camera_info话题里。但光学镜头有制造公差彩图和深度图在空间上并不是像素级对齐的。ORB-SLAM2的RGB-D模式要求彩色图和深度图坐标系对齐否则特征点的深度值会错位表现为建图时墙会糊掉或者点云出现两层重影。ORB-SLAM2官方建议对整个RGB-D相机做一次联合标定最方便的是用camera_calibration功能包sudo apt install ros-melodic-camera-calibration # Noetic对应改noetic # 启动标定程序订阅彩色图话题 rosrun camera_calibration cameracalibrator.py \ image:/camera/rgb/image_raw \ camera:/camera/rgb \ size:8x6 \ square:0.024跑标定的过程说起来只有一句话拿着棋盘格在镜头前上下左右前后倾斜移动让程序收集到足够多的角点样本。实际操作中要让棋盘格覆盖画面四角和中心距离从近到远都要有样本。当页面上的X、Y、Size、Skew四个进度条都变绿后点击Calibrate然后Save。标定结果会以yaml文件形式存到/tmp/calibrationdata.tar.gz里解压后就是你的相机内参文件。这里有个容易忽略的点标定RGB-D相机时深度图的对齐同样重要。Astra Pro的ROS驱动里有一个depth_registration参数默认开启后驱动内部会利用深度相机内参和外参把深度图重投影到彩色相机坐标系这样在话题里拿到的深度图已经和彩色图对齐了。在astrapro.launch里找到这一行确认是trueparam namedepth_registration valuetrue/单一目的、一整段的深度对齐在ORB-SLAM2里直接决定建图质量。4. ORB-SLAM2编译与实战运行4.1 源码编译三步走但坑不少ORB-SLAM2源码克隆下来后先修改CMakeLists.txt里OpenCV版本相关的配置。官方代码写的是find_package(OpenCV 3.0 REQUIRED)Ubuntu 18.04自带3.2可以直接过如果你系统装了4.x这里建议改成find_package(OpenCV 3.4 REQUIRED)或者直接用系统自带版本。然后执行cd ~/ORB_SLAM2 chmod x build.sh ./build.sh这个脚本会依次编译第三方库DBoW2、g2o、构建ORB-SLAM2主库、最后编译可执行文件。整个编译过程大概10分钟左右取决于CPU性能。编译完成后再单独编译ROS接口export ROS_PACKAGE_PATH${ROS_PACKAGE_PATH}:~/ORB_SLAM2/Examples/ROS cd ~/ORB_SLAM2 chmod x build_ros.sh ./build_ros.sh这一步我经常遇到usleep未定义的编译错误这是因为较新版本的GCC把usleep从全局命名空间移到了unistd.h里需要在Examples/ROS/ORB_SLAM2/src/ros_rgbd.cc文件头部加上#include unistd.h然后把usleep改成std::this_thread::sleep_for(std::chrono::milliseconds(10))或者直接保留原样加头文件也能过。4.2 相机参数文件编写把焦距和主点填对这是整个过程中最容易出错的环节。ORB-SLAM2在ROS模式下不需要单独写参数文件——它直接从ROS话题里读取相机的camera_info消息。如果你的相机驱动正确发布了/camera/rgb/camera_info那么ORB-SLAM2会自动拿到内参矩阵。但为了保险我还是建议手动核对一下内参用rostopic echo查看/camera/rgb/camera_info里的K矩阵这个3x3矩阵就是fx 0 cx 0 fy cy 0 0 1如果驱动发布的内参明显不对比如fx只有几十说明相机节点没正确读取出厂标定数据需要手动写入。比较简单的方式是在astras_wrapper的launch文件里直接指定param namefx value570.342/ param namefy value570.342/ param namecx value319.982/ param namecy value239.841/这些数值可以从相机的出厂说明书或者camera_info的原始输出里读出来。有了正确的内参ORB-SLAM2才能把像素坐标转换成空间坐标所以这一步务必确认准确。如果你不想依赖ROS话题想离线测试数据集ORB-SLAM2的Examples/RGB-D目录下也有一个TUM1.yaml模板直接改里面的Camera.fx、Camera.fy、Camera.cx、Camera.cy四组参数即可。4.3 实时RGB-D建图运行步骤一切都准备好之后正式运行只需要三步。第一个终端启动相机roslaunch astra_launch astrapro.launch第二个终端启动ORB-SLAM2的ROS节点。注意先设置ROS包路径export ROS_PACKAGE_PATH${ROS_PACKAGE_PATH}:~/ORB_SLAM2/Examples/ROS rosrun ORB_SLAM2 RGBD \ /home/yourname/ORB_SLAM2/Vocabulary/ORBvoc.txt \ /home/yourname/ORB_SLAM2/Examples/RGB-D/TUM1.yaml \ /camera/rgb/image_raw \ /camera/depth/image_raw第三个终端打开rviz可视化可选rviz启动后你会看到一个Pangolin窗口里面显示当前帧的特征点和相机轨迹。正常情况下你端着相机在房间里走动窗口左上角会出现当前跟踪状态OK并不断有绿色的小点加入地图。如果界面一直显示LOST通常是初始化没有成功需要让相机先多做平移运动不要原地旋转。启动ORB-SLAM2节点后你会发现提示Waiting for bgr image and depth image...这时候确认彩色话题发布的是bgr八位三通道图像。Astra Pro驱动默认发布的是rgb格式但OpenCV里图像通道顺序是BGRORB-SLAM2的ROS代码内部有做转换如果出现颜色怪异、特征匹配失败检查驱动里有没有color_order参数需要切换。4.4 参数调优与建图效果优化跑通只是第一步想让建图效果更稳定必须动这几个参数。ORB-SLAM2的RGB-D模式有两个核心参数ThDepth和DepthMapFactor。ThDepth控制深度误差放大倍数默认值是40如果深度噪声大、暗处多调低到30会更保守。DepthMapFactor控制深度值缩放系数Astra Pro的深度单位是毫米ORB-SLAM2默认的1000正好对应1米1000毫米不需要改。特征点数量ORBextractor.nFeatures默认是2000如果场景纹理稀疏调成3000~4000能提高鲁棒性但帧处理时间也会相应增加。我试过在纹理很弱的白墙房间把nFeatures调到5000以后跟踪不再频繁丢失。还有一个容易被忽略的参数是Viewer.KeyFrameSize、Viewer.KeyFrameLineWidth这些可视化参数它们只影响显示效果不影响算法精度新手不必纠结。如果你需要稠密点云而不是稀疏特征点可以再接一个点云拼接节点订阅相机位姿和深度图把每一帧深度图通过位姿变换投影到全局坐标系累积成稠密点云。开源社区里比较常用的方案是rtabmap_ros它可以直接订阅ORB-SLAM2的位姿话题也可以自己做一个简单的点云累积器。我做过一个简化版用PCL的pcl::PointCloudpcl::PointXYZRGB把每一帧点云按位姿变换到全局再体素滤波降采样效果基本够用。5. 常见问题与排查技巧实录5.1 相机连不上、没图像、帧率异常这三大新手问题按概率从高到低排序没有设备权限。插上相机后执行ls /dev/video*如果看到video0、video1这类设备节点但启动launch时报open device failed基本是udev规则没生效。重新执行一遍create_udev_rules.sh或者临时用sudo chmod 666 /dev/video*测试一帧。USB带宽不足。把相机插在主机背面的USB 3.0接口蓝色内舌不要插USB Hub。用lsusb -t查看设备连接速度显示5000M才是USB 3.0速率。我的经验是Astra Pro在USB 2.0下深度图帧率会掉到5FPS以下完全没法做实时SLAM。IR发射器被遮挡。Astra Pro的深度计算依赖红外投影光斑如果红外窗口被贴纸、手指或者其他遮挡物挡住深度图就是空的。检查时对着相机看红外窗口有没有微弱的红色光斑——看不出的话用手机摄像头照能看到明显的红外光点。5.2 ORB-SLAM2跟踪频繁丢失怎么办跟踪丢失的第一反应不应该是调参数而是检查数据源确认深度图和彩色图的时间戳同步性。ORB-SLAM2在ROS模式下会用消息的时间戳把彩色图和深度图配对如果驱动发布的两个话题时间戳不一致可能差了几十毫秒算法在快速运动时就会出现明显的深度错位表现为跟踪直接丢失。检查方式rostopic echo /camera/rgb/image_raw/header/stamp rostopic echo /camera/depth/image_raw/header/stamp逐帧对比正常情况下差值应该在5毫秒以内。Astra Pro的驱动是同步发布彩图和深度的一般不会出问题如果你用的是其他深度相机这一步必须检查。其次是运动方式。ORB-SLAM2初始化需要视差也就是相机要有明显的平移运动。启动后不要原地转圈先左右平移让系统稳定初始化再正常走动。这听起来很基础但真到现场很多人忘了这一条在原地旋转半天系统始终处于LOST状态。最后才是调参数。把ORBextractor.nFeatures从2000提到4000把ORBextractor.nScaleLevels从8改到12这些操作能把特征匹配的鲁棒性提升一截但代价是每帧处理时间大约多10毫秒。5.3 建图漂移与深度噪声处理漂移问题的本质是误差累积。ORB-SLAM2靠回环检测来修正漂移但它能检测到回环的前提是场景中出现了之前见过的地方。如果你在一个没有明显特征的长走廊里走一圈回环检测几乎无效位姿误差会持续累积点云逐渐歪掉。处理办法有两个方向。一是增加场景特征在墙上贴一些有明显角点的海报让特征匹配有据可依。二是频繁让相机回到起始位置主动创造回环条件。深度噪声方面结构光相机在黑色物体、高反光表面、阳光直射区域上深度值会失效或跳动表现为点云里出现飞点。ORB-SLAM2的RGB-D模式对深度值有范围限制ThDepth参数范围之外的深度会被舍弃但对付不了局部的空洞。我实测下来Astra Pro在0.4米到4米范围内的深度精度大概是1%~3%超过4米就开始明显发散。建议建图时保持物体在这个范围内太近太远都会影响效果。5.4 性能优化实时性从哪里挤如果你的CPU比较老处理速度跟不上30FPS的视频流先不要急着换电脑按这个顺序优化把相机输出分辨率降到320x240。Astra Pro驱动支持/camera/rgb/image_raw和/camera/depth/image_raw的降分辨率launch文件里rgb_width和rgb_height参数改为320和240ORB-SLAM2处理时间能下降40%左右代价是远距离的特征点变少。把ORB-SLAM2的ORBextractor.nFeatures调低到1000。特征点少了提取和匹配的时间都会减少适合特征本来就够多的场景。关闭Pangolin的可视化窗口。可视化本身要占用不少CPU如果你只需要最终的轨迹数据而不需要实时看界面在ros_rgbd.cc里把Viewer线程注释掉再重新编译处理帧率能提高5~10FPS。我实测的数据可以参考i5-8250U低功耗CPU640x480分辨率nFeatures2000Pangolin开启状态帧处理时间大约45毫秒关闭可视化后降到32毫秒。对SLAM来说这就是能不能在移动平台上跑的区别。6. 写在最后的实操心得这套环境我前后搭了两次第一次是在大学实验室的台式机上第二次是在自己的轻薄本上虚拟机上跑。第二次踩的坑尤其多——虚拟机里USB设备直通VMware的USB passthrough对相机这种高带宽设备来说不稳定是常态建议尽量用物理机跑。如果真的只能用虚拟机务必给虚拟机分配足够的内存至少4GB并且把USB控制器版本设置为3.1。另一个让我印象深刻的教训是先让相机和ORB-SLAM2分别单独跑通再让它们协同工作。第一次我图省事把两个节点一起启动出了问题根本不知道是相机数据不对还是算法参数不对。后来花了一个下午把相机数据用rosbag record录下来离线播放给ORB-SLAM2跑才定位到是相机驱动里depth_registration参数没打开导致深度图没对齐。最后建议新手先用官方数据集比如TUM RGB-D dataset把ORB-SLAM2的流程跑通再切换到Astra Pro实时图像。这样你能把算法本身的问题和相机接入的问题分开排查排错效率能翻倍。我自己最后是在TUM数据集上确认了ORB-SLAM2安装无误后直接切到Astra Pro上跑通的全程没有遇到特别玄学的问题。希望这份指南能让你在同样的路上走得更快一点。
返回列表