ARTICLE DETAIL

资讯详情

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

Ubuntu 20.04下RealSense相机SDK与ROS功能包安装详解

Ubuntu 20.04下RealSense相机SDK与ROS功能包安装详解 1. 装之前先弄明白这两条安装线的关系很多刚接触RealSense的朋友一上来就在Ubuntu 20.04里猛敲命令行结果装到一半发现搞不清自己在装什么到最后viewer打不开、ROS话题出不来一团乱麻。我先把这个事情拆明白。在Ubuntu 20.04下做RealSense的开发实际上有两条线要分别打通第一是librealsense SDK它负责让系统识别D435/D435i/L515这些深度相机硬件并提供realsense-viewer这个图形化查看工具来预览画面、调节参数、升级固件第二是realsense-ros它才是把相机数据以ROS话题形式发出去的“翻译官”让机器人导航、SLAM建图、目标检测这些上层应用能拿到深度图和点云。这两者之间有明确的依赖关系realsense-ros是架在librealsense之上的ROS功能包底层SDK装不好ROS包编译得再漂亮也是白搭。这就像你先把摄像头驱动装好了Windows才能看到画面然后再装一个专门的采集软件才能把画面变成文件一样缺了哪一层都不行。这篇文章按照实际开发流程来写从依赖处理、SDK安装、viewer验证到ROS功能包编译、话题调试、RViz显示一条线走完。适合正在做机器人、SLAM、视觉识别项目需要把RealSense相机真正用起来的开发者参考Ubuntu 20.04加ROS Noetic的组合也是当前非常主流的环境照着做基本不会踩坑。我调试D435i这套环境前前后后快两年了中间重装过系统、换过SDK版本、被USB带宽问题折磨过下面这些内容是实打实趟出来的经验。2. 环境准备与基础依赖处理2.1 先确认系统环境和硬件连接动手安装之前把环境确认一遍能省掉后面一大堆排查时间。系统这边我是用Ubuntu 20.04.6 LTS内核版本5.1520.04后续版本会自动更新内核5.4、5.13、5.15都试过RealSense的支持都没问题。ROS装的是Noetic如果用Melodic的话部分依赖包名会不一样后文会专门说明差异。相机方面我用的是Intel RealSense D435i这块带IMU的深度相机在VINS-Fusion、ORB-SLAM3这类惯性视觉SLAM里用得特别多。D435、L515的处理方式完全一样只是L515在部分旧固件上有兼容性问题如果你用的是L515建议先把固件升到最新。接着把相机插到电脑上建议直接用Type-C线连主板原生USB 3.0接口别用USB Hub也别插前置面板。RealSense的深度数据带宽很高USB 2.0根本跑不动插到3.0接口上才能正常出图。我之前用笔记本的扩展坞接过相机画面能出来但帧率忽高忽低还时不时断流换成直连接口后问题马上消失。然后执行lsusb正常情况下能看到一行Intel Corp. RealSense D435i。如果没看到先换线、换接口试试确认是相机本身的问题再考虑送修。2.2 安装编译工具链和基础依赖这一步的内容在官方文档里是一句带过的但实际执行时经常出问题我把完整命令贴出来sudo apt update sudo apt install -y git cmake build-essential libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev逐个说一下这几个包是干嘛用的。build-essential提供gcc、g、make这些基础编译工具cmake负责构建librealsense的工程。libusb-1.0-0-dev是USB通信库RealSense通过USB接口和主机通信这个必须要有。libgtk-3-dev和libglfw3-dev是GUI相关依赖编译realsense-viewer时要用到。libgl1-mesa-dev和libglu1-mesa-dev是OpenGL相关的开发库viewer里要渲染3D点云没有这两个库会编译失败。如果后面编译时报缺什么包不要慌看错误信息末尾的undefined reference或者fatal error: xxx.h: No such file or directory缺哪个头文件就apt search找对应名字带-dev的包装上这是非常常见的情况。2.3 处理udev规则和权限问题Linux下访问USB设备需要权限RealSense官方提供了一套udev规则文件装上之后普通用户也能直接访问相机不用每次开头都加sudo。下载规则文件并安装cd /etc/udev/rules.d/ sudo wget https://raw.githubusercontent.com/IntelRealSense/librealsense/master/scripts/99-realsense-libusb.rules如果wget下载失败大概率是网络问题可以手动打开这个URL复制内容然后用sudo vim /etc/udev/rules.d/99-realsense-libusb.rules把内容粘贴进去保存。重新加载规则sudo udevadm control --reload-rules sudo udevadm trigger装完这一步拔插一下相机再执行lsusb检查。注意插上之后如果发现识别不到了重新插拔一般能解决。提示规则文件必须在安装SDK之前弄好因为SDK安装过程中会启动udev相关的检查如果规则不对后面打开viewer时会提示权限不足找不到设备。3. RealSense SDKlibrealsense完整安装过程3.1 两种安装方式怎么选librealsense提供二进制包和源码编译两种安装方式。二进制包用apt直接装省时间升级也方便但它不提供内核补丁模块在部分内核版本上深度图可能不正常。源码编译多一步编译时间但可控性最强可以指定版本、打补丁、自定义功能后续在ROS包中排错时也更容易定位问题。我的建议是如果是做正经开发项目直接用源码编译方式如果只是临时看看效果apt装二进制包就够了。我本人一直用源码编译方式理由有四一是可以固定SDK版本防止apt升级引入不兼容的API变更二是方便打内核补丁确保深度流稳定三是realsense-ros的版本需要和librealsense版本匹配源码编译能精确控制这个版本关系四是你能完整看到编译日志出问题时好排查。3.2 内核补丁什么时候需要打什么时候不用这是最容易让人困惑的一个环节。librealsense的源码里有个scripts/patch-realsense-ubuntu-series.sh脚本它的作用是给Linux内核打补丁把RealSense相机涉及的一些UVC协议扩展和帧格式支持模块补上。我开始也按照教程去打了补丁结果脚本提示补丁已经应用过其实是白费功夫。后来查文档才发现从Ubuntu 20.04开始官方内核已经包含RealSense所需的UVC补丁不需要再手动打。如果你用的是Ubuntu 18.04或更老的版本那才需要跑这个脚本。也就是说Ubuntu 20.04下直接跳过打补丁这一步。3.3 源码编译安装librealsense含详细步骤先确保依赖都装齐了参考2.2节然后开始拉代码。建议用--branch指定版本号我目前用的是v2.54.2这个版本在ROS Noetic和Ubuntu 20.04下表现稳定。cd ~ git clone https://github.com/IntelRealSense/librealsense.git cd librealsense git checkout v2.54.2 mkdir build cd build这里有个容易忽略的点cmake配置最好不要用默认参数建议加上-DCMAKE_BUILD_TYPERelease和-DFORCE_RSUSB_BACKENDON。解释一下这两个选项CMAKE_BUILD_TYPERelease表示编译Release版本优化性能。如果忘记加默认是空字符串编译出来的是未经优化的版本viewer打开时会有明显卡顿。FORCE_RSUSB_BACKENDON表示强制使用libusb后端而不是内核UVC驱动。这个选项在打补丁不方便的场景下特别有用直接绕过内核的V4L2驱动通过用户态的libusb和相机通信。它的一大优势是不会因为内核升级导致驱动失效但代价是CPU占用会稍微高一点因为少了内核驱动的零拷贝优化。执行配置cmake .. -DCMAKE_BUILD_TYPERelease -DFORCE_RSUSB_BACKENDON -DBUILD_EXAMPLEStrue-DBUILD_EXAMPLEStrue这个参数很重要它会编译出realsense-viewer和realsense-camera-config这两个工具。如果设成false后面你想看画面、调参数还得自己写程序非常麻烦。然后编译这一步时间比较长根据机器配置大概需要10-30分钟make -j$(nproc)如果你的机器内存小于16G建议用make -j4而不是nproc因为RealSense的CUDA模块和示例程序同时编译时内存占用很容易超过8G机器会直接卡死或者OOM别问我是怎么知道的。编译完成后安装sudo make install sudo ldconfigldconfig这步不能漏它会让动态链接库的缓存更新否则运行时系统找不到librealsense2.so这个库。验证SDK安装是否成功realsense-viewer如果能看到一个图形窗口并且识别出了相机的序列号和固件版本说明SDK这层已经通了。此时可以打开深度流看到画面之后再往下走ROS的部分。4. realsense-ros功能包安装与编译4.1 版本匹配问题最容易踩的坑realsense-ros必须和librealsense版本匹配。官网的ROS 1 Support里面有详细的版本对应表版本不匹配时编译不会报错但运行时会出现各种诡异问题比如话题没数据、点云错位、程序崩溃排查起来非常头痛。我目前的做法是librealsense装v2.54.2realsense-ros就用ros1-development分支的最新版本这个分支是针对ROS 1持续维护的对D435i的支持很好。如果你用的是老版本SDK比如v2.50.0可以去GitHub的releases页面找到对应tag签出。4.2 准备工作空间与源码编译假设你已经装好了ROS Noetic并且source /opt/ros/noetic/setup.bash能正常执行。创建一个catkin工作空间mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b ros1-development https://github.com/IntelRealSense/realsense-ros.git这里有个依赖项要注意realsense-ros依赖ddynamic_reconfigure这个包用来动态调整相机参数。如果你是从零开始装的ROS需要单独安装sudo apt install -y ros-noetic-ddynamic-reconfigure这个包如果没装编译时会直接报错找不到ddynamic_reconfigure。装好之后就可以开始编译了cd ~/catkin_ws catkin_make clean catkin_make -DCATKIN_ENABLE_TESTINGFalse -DCMAKE_BUILD_TYPERelease这里有个技巧如果之前编译过其他功能包最好把build和devel目录删掉再编译否则老版本的CMake缓存文件可能干扰新包编译报一些莫名其妙的错误。我在这上面浪费过一个下午。编译完成后记得echo source ~/catkin_ws/devel/setup.bash ~/.bashrc source ~/.bashrc这步不执行你后面的roslaunch realsense2_camera rs_camera.launch就找不到环境变量会提示command not found或者package not found。4.3 运行相机节点并验证话题先开roscoreroslaunch会自动开但手动开更直观方便观察日志roscore另开一个终端启动RealSense节点roslaunch realsense2_camera rs_camera.launch如果一切正常日志会输出相机型号、序列号、固件版本并提示加载了哪些模块。等几秒让节点完成初始化然后新开终端查看话题列表rostopic list正常情况下能看到以下话题部分列举/camera/color/image_raw彩色图原始话题/camera/depth/image_rect_raw深度图话题/camera/color/camera_info彩色相机内参/camera/depth/camera_info深度相机内参/camera/pointcloud/points点云话题需要在launch中开启把深度图和彩色图分别可视化一下rqt_image_view /camera/color/image_raw rqt_image_view /camera/depth/image_rect_raw看到画面就说明整条链路已经通了。接下来是可以进一步提升的调试部分。4.4 用launch文件调参数频率、分辨率和点云很多人在这个阶段就认为安装完成了但实际上launch文件的参数配置才是决定项目能不能跑好的关键。rs_camera.launch里面有很多可调参数我列几个最核心的分辨率与帧率arg namergb_width default640 / arg namergb_height default480 / arg namergb_fps default30 /深度流和彩色流的参数需要对应设置否则图像尺寸不一致下游算法处理起来会出问题。在做SLAM时我一般用640x48030fps既保证精度又控制算力消耗。如果做高精度重建可以开到1280x720但帧率要降到15fps否则USB带宽不够会出现丢帧。点云开关arg nameenable_pointcloud defaulttrue /默认是false不开的话/camera/pointcloud/points话题是不存在的点云数据看不到。做三维重建、SLAM或者抓取应用时记得打开。IMUD435i独有arg nameenable_imu defaulttrue / arg nameunite_imu_method default1 /unite_imu_method设为1表示把IMU的加速度计和陀螺仪数据合并成一个话题/camera/imu方便VINS这类算法订阅。默认是2会分成两个话题各发各的用起来比较麻烦。修改launch文件后不需要重新编译重启roslaunch即可生效。5. 联合调试从viewer到RViz的完整链路5.1 用RViz显示点云和图像RealSense的深度数据只有放到RViz里实际用起来才能体现价值。输入以下命令打开RVizrosrun rviz rviz然后在RViz左侧的Displays面板中点击Add依次添加以下内容选择By topic标签页双击/camera/pointcloud/points添加PointCloud2显示双击/camera/depth/image_rect_raw添加Image显示双击/camera/color/image_raw添加Image显示如果没出现先确保launch已开启彩色流将PointCloud2的Fixed Frame设置为camera_linkRViz左上角Global Options里设置点云就会以彩色三维形式展示出来这个画面看起来很爽同时也验证了相机内外参和话题都正常。如果你有自己的地盘、TF树或者别的传感器可以把相机放到实际坐标系里这里就不展开了。5.2 查看相机内参这个信息SLAM里必须用相机内参在后续的VINS-Fusion、ORB-SLAM3、RTAB-Map里都是必须的。查看方式rostopic echo /camera/color/camera_info输出中K矩阵就是内参矩阵长这样K: [616.5, 0.0, 322.6, 0.0, 616.5, 238.7, 0.0, 0.0, 1.0]这个矩阵里的前两个数fx, fy是焦距第三、五个数cx, cy是光心坐标。在做相机标定或者手写PnP程序时会频繁用到。第一次运行的时候建议把camera_info和图像话题的时间戳对比一下确认时间戳对得上这关系到SLAM系统能否正确融合多传感器数据。5.3 录包与回放调试过程中经常需要离线分析rosbag记录和回放是ROS的基本功。录制相机数据我一般在数据集采集时只录我需要的topic不多录rosbag record -O camera_data.bag /camera/color/image_raw /camera/depth/image_rect_raw /camera/pointcloud/points /camera/imu回放rosbag play camera_data.bag录包时注意磁盘空间点云数据比较大录一分钟可能就几百兆。录制前df -h看一下磁盘别录到一半系统盘满了。5.4 多机通信调试如果你是在机器人的主控比如NUC或树莓派上跑相机另一台电脑上看RViz需要设置ROS_MASTER_URI。假设主控IP是192.168.1.100看图的电脑是192.168.1.101主控端跑roslaunch的那台export ROS_MASTER_URIhttp://192.168.1.100:11311 export ROS_IP192.168.1.100看图的电脑上export ROS_MASTER_URIhttp://192.168.1.100:11311 export ROS_IP192.168.1.101然后在这台电脑上启动RViz就能远程看到画面。这里有一个需要注意的点ROS的通信不加密多机通信前一定要确认两台机器在同一局域网并且防火墙放行了11311端口不然会一直超时。6. 常见问题与排查技巧实录6.1 “No devices found”或者viewer打开看不到相机这是我被问到最多的问题出现次数超过其他所有问题之和。排查顺序如下lsusb看有没有Intel Corp.的设备。如果没有换线、换接口、换电脑逐项排除多数情况是线的问题USB 3.0延长线质量差也会导致识别不到。再看权限sudo realsense-viewer如果加sudo之后就能看到相机说明udev规则没有生效。重新执行一遍2.3节的命令重点检查规则文件内容是否为空。最后一个大招是检查模块是否加载modprobe uvcvideo有些精简过的Ubuntu安装没有加载UVC模块装上再重新插拔相机。6.2 realsense-ros编译时找不到ddynamic_reconfigure这个问题在4.2节里提过这里把报错信息明确写出来编译时会报Could not find the required component ddynamic_reconfigure。解决办法就是装包sudo apt install ros-noetic-ddynamic-reconfigure如果你用的是MelodicUbuntu 18.04把包名改成ros-melodic-ddynamic-reconfigure。6.3 彩色图有画面深度图全黑或者全是噪点深度图黑屏大概率是深度流没有启动成功。先看launch日志有没有报错然后确认/camera/depth/image_rect_raw话题有数据rostopic hz /camera/depth/image_rect_raw如果话题频率为0把深度流的分辨率降到640x480试试。在弱供电的USB Hub上深度流经常起不来换直连接口基本能解决。如果画面全是雪花噪点可能是环境光干扰太强的问题RealSense的红外投影在强光下效果会变差关掉灯光再试一次。还有一个更隐蔽的原因是USB带宽不足特别是在同一个USB控制器下面挂了多个设备时。解决方法是设备直连主板的两个不同USB控制器接口或者降低帧率和分辨率。6.4 点云出现“锯齿”严重或者点云断层的现象打开realsense-viewer把Preset从默认改成High Accuracy模式或者把深度流的分辨率调高到1280x720。这种情况通常是因为深度图的分辨率太低边缘细节丢失导致3D重建时产生断层。如果是在ROS里运行在launch文件中加arg namedepth_width default1280 / arg namedepth_height default720 / arg namedepth_fps default15 /然后重启相机节点点云质量会有明显提升帧率降低换来的是数据稳定性做重建项目时比较划算。6.5 运行roslaunch时报[FATAL] failed to set power state这个报错一般是USB3.0的连接模式没有协商成功也就是相机降级到USB 2.0的速率在跑。执行lsusb -t看输出中RealSense设备这一行的速率标识正常情况下应该是5000M如果显示480M说明走的是USB 2.0通道。解决办法还是换接口换线RealSense D435i对线材质量的要求比较高劣质USB线会出现这种问题。6.6 D435i的IMU话题没有数据如果你确认launch文件里enable_imu是true了但rostopic echo /camera/imu没有输出先把launch里的unite_imu_method从2改成1arg nameunite_imu_method default1/如果还不行把相机断电重插。IMU的初始化和USB连接状态有关特别是热插拔之后IMU话题偶尔会丢失重插一般能解决。我之前在VINS-Fusion里碰到的IMU数据突变问题最后排查下来的原因就是USB连接不稳定导致数据包丢失换了根粗一点的线就正常了。6.7 动手之后要养成的两个好习惯调试RealSense这套东西后期真正出问题的时候靠的不是上来就重装而是能快速定位。我自己的习惯有两个第一每次修改launch前先记下当前版本和现象这个习惯帮我避免了很多次改了半天不知道改坏了什么的情况第二先验证SDK层是否正常再查ROS层。如果你怀疑是SDK的问题直接运行realsense-viewer看它在不带ROS的情况下能不能正常出图。如果viewer正常而ROS包不正常那问题就在ROS配置层如果viewer也不正常那问题在SDK或硬件层。这种分层定位的思路能帮你节省大量排查时间。7. 版本选型和升级的几条个人建议最后聊一下版本选型我觉得这块的经验值得单独说一下。第一别追新。RealSense的开源生态更新频率不算低但新版本不一定适合你。D435i配合v2.54.2在Ubuntu 20.04下跑了很长时间稳得不行。也有一些新版本在特定内核上会出问题除非你有迫切的性能需求否则固定在一个稳定版本上是最省心的选择。第二锁版本号。无论是librealsense还是realsense-ros我都建议用git checkout指定到具体的tag或分支不要用master。master每天都在变一旦上游改了API你项目的编译环境就崩了到时候追查起来非常痛苦。第三升级之前先备份.bag文件。如果你在项目里录过测试数据升级前把数据备份好因为版本升级之后再用老版本的回放工具可能打不开这个坑我踩过一次心疼坏了。第四把所有命令记录到一个notes文件里。安装过程中用到的每一个命令、改过的每一个launch参数都记下来。下次换新机器、重装系统时照着notes执行能省一个多小时。我现在的做法是把notes放在项目的docs目录下和代码一起用git管理丢失几乎不可能。这套流程走下来从环境准备到viewer出画面再到ROS话题和RViz显示整条链路都是通的。后面不管是做SLAM、跑目标检测、还是做三维重建底层的数据通路已经打好了剩下的就交给上层算法去发挥。
返回列表