ARTICLE DETAIL

资讯详情

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

Intel RealSense D435i实测:ROS驱动安装到相机标定全指南

Intel RealSense D435i实测:ROS驱动安装到相机标定全指南 入了机器人的坑之后有一个问题几乎天天有人问做视觉方案该买什么深度相机我一般会先反问对方预算、场景和用的什么平台但如果只让我给一个“大概率不会买错”的答案Intel RealSense D435i大概率会出现在前三名。它贵它挑剔光线它偶尔闹点小脾气但胜在驱动成熟、ROS支持完善、社区案例多到能把你淹没。这篇文章记录的就是我这次从拆箱到把D435i真正跑通ROS的完整过程里面包含了环境准备、驱动安装、launch启动、RViz查看、相机标定和一堆排查坑的实录希望能帮你少走点弯路。1. 为什么是D435i拆箱之前你得先想清楚这几件事1.1 它和D435的区别到底在哪D435i和D435表面上长得几乎一样最核心的区别就是多了一颗BMI055六轴IMU。这颗IMU意味着什么它能让相机在纯视觉基础上获得角速度和加速度数据所以移动机器人、无人机、机械臂这类需要做视觉惯性里程计VIO的场景D435i比D435要合适得多。我看过不少人在选型时只盯着深度分辨率却忽略了一个关键点D435i的深度传感器用的是主动红外立体视觉方案和纯ToF相机不一样它需要场景里有可被红外光照射到的特征纹理。在强光下、玻璃表面、纯白墙面前它的深度数据都会变差。D435i从来不是万能相机但它胜在“可预期”——底层的librealsense SDK和上层的realsense-ros驱动已经非常稳定你花在调试上的时间比其他方案少一个数量级。另外D435i的深度最远标称约10米但这个数值在室内环境下比较理想室外强光下实际有效距离会明显缩水。RGB最高支持1920x108030fps深度最高支持1280x72090fpsUSB 3.0带宽下这个组合完全够用。具体的参数很多测评文章都有我不逐条复制只想提醒一个容易忽略的点D435i的彩色摄像头和深度摄像头的视场角不一样后续做点云配准或数据融合时这个差异一定会给你制造麻烦。1.2 包装盒里都有什么拆箱过程比想象中简单。D435i的包装盒很规整里面就是相机本体、一条USB Type-C转Type-A的数据线、一个电源适配器其实相机用USB供电就行适配器通常用不上和一张快速说明书。相机本体重量很轻全塑料外壳前面板是深度模块和RGB模块后面板接口很简洁一个Type-C口、一个三脚架螺丝孔。拿到手第一件事建议先看设备标签上的序列号和固件版本因为不同批次的相机出厂固件可能差很多直接影响你后面装的librealsense版本选择。还有一个细节有些用户反馈买到的相机Type-C接口比较紧插线的时候要格外小心别用蛮力否则接口内部针脚一旦弯了整机基本就废了。我第一次插线的时候也感觉卡得很紧后来发现只要对准角度、均匀用力就可以了。1.3 拆机前先想清楚你的使用场景很多人收到货就直接开干结果跑到一半才发现方案选错了。D435i比较典型的应用场景是这几类移动机器人SLAMD435i的IMU可以辅助视觉里程计配合激光雷达做融合定位效果很好。机械臂抓取利用深度点云做物体识别和位姿估计D435i的近距离精度非常够用。三维重建室内小范围场景重建D435i足够但要注意光照均匀。人机交互/手势识别用RGB图像做检测深度图做距离判断成本可控。如果你的需求是室外大范围导航说实话D435i不一定是最优解但如果你要的是快速原型验证D435i绝对是让你从“没数据”到“有数据”最快的方案。2. 环境准备从零装好Ubuntu 20.04 ROS Noetic2.1 用虚拟机还是双系统很多刚入门的朋友都会纠结这个问题。我的建议很直接如果你只是学习ROS和D435i的基本使用用VMware装一个Ubuntu 20.04虚拟机的完全够用但如果你要跑SLAM、点云处理、深度模型推理这些吃性能的东西一定别折腾虚拟机直接装双系统。D435i的驱动编译和ROS节点运行本身并不算特别吃硬件真正的瓶颈在于USB 3.0设备的虚拟机透传。VMware要把USB设备从宿主机“转发”到虚拟机这一步如果设置不当经常出现相机识别不到、画面帧率很低、时不时断连的情况。我自己的经验是VMware里要给虚拟机设置USB 3.1控制器并且启用3D加速这样D435i基本能跑但帧率还是不如双系统稳定。内存方面虚拟机和编译环境加起来我强烈建议官方推荐的配置宿主机至少16GB内存虚拟机分8GB硬盘至少60GB可用空间。别信“4GB够用”的说法编译librealsense时并行任务一开内存占用很容易冲到5GB以上把系统卡到怀疑人生。2.2 用鱼香ROS脚本一键装ROS的实操记录ROS安装围绕的核心版本是Ubuntu 20.04对应的Noetic。官方安装流程本身不算复杂但对新手来说换源、加密钥、初始化rosdep这几步到处都是坑。社区里很火的鱼香ROS一键安装脚本我记得是出自“鱼香ROS”这个开源项目它把换源、安装ROS、初始化rosdep这些步骤全封装进去了。我这次实际用的是这个命令wget http://fishros.com/install -O fishros . fishros执行后脚本会打印一个菜单让你选择要安装的内容。我当时选的是ROS Noetic基础版。整个过程会自动完成软件源配置、依赖安装、rosdep初始化比手动逐条敲命令省心很多。用一键脚本也有一点不好就是它会默认做比较保守的配置过程不够透明出了问题你不太清楚它到底装到哪里去了。所以我建议装上ROS之后花点时间用rospack find和rosversion去验证一下安装结果比如rospack find roscpp rosversion roslaunch如果这两个命令能正常返回路径和版本号说明ROS核心已经可用。2.3 手动安装ROS Noetic的兜底方案如果你不想用脚本或者脚本下载源超时手动装也是可行的。核心步骤就是配置软件源、添加ROS官方密钥、更新系统、安装ros-noetic-desktop-full、初始化rosdepsudo 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 sudo apt install ros-noetic-desktop-full这里有个很现实的问题默认源在国内下载的速度不稳定有时候几十KB/s尤其ros-noetic-desktop-full依赖特别多。如果遇到下载超时可以把packages.ros.org换成你可以访问的镜像地址具体教程社区里到处都是我这里不赘述了。装完后千万不要忘记初始化rosdepsudo rosdep init rosdep updaterosdep初始化是很多新手卡壳的地方它需要从指定的raw.githubusercontent.com拉取资源。如果这一步失败多试几次或者调整一下网络环境再或者换个时间窗口再试。一通操作之后把环境变量写进~/.bashrcecho source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc以上做完输入roscore能看到ROS master正常启动环境准备就算告一段落。3. RealSense底层驱动librealsense安装与验证3.1 两种安装方式怎么选D435i的底层驱动是Intel的librealsense SDK它是连接相机硬件和上层应用包括ROS驱动的关键层。librealsense有两条主要安装路径一条是用官方预编译的deb仓库安装一条是从源码编译。预编译deb的好处是安装快、依赖处理省心比较适合只要跑通基本功能的场景。但如果你需要自定义相机参数、升级固件工具、跑realsense-viewer里那些高级示例或者想编译最新版本SDK里的IMU标定工具我还是建议用源码编译。我这次采用的是源码编译方式主要考虑是后续要做D435i的IMU标定而且源码编译出来的版本和realsense-ros的兼容性更好控制。版本上我选择了当时比较稳定的v2.50.0它和ROS Noetic、realsense-ros 2.3.2的搭配是很成熟的一套组合。3.2 源码编译完整步骤先装编译依赖这一步千万别跳缺了后面cmake会直接报错sudo apt-get update sudo apt-get install -y \ cmake libusb-1.0-0-dev pkg-config libgtk-3-dev \ libglfw3-dev libssl-dev libudev-dev然后克隆源码并切换到指定版本git clone https://github.com/IntelRealSense/librealsense.git cd librealsense git checkout v2.50.0接下来安装udev规则。这一步至关重要它决定了你的普通用户是否有权限访问USB设备。官网提供了一个脚本./scripts/setup_udev_rules.sh插一下我踩过的坑有几次我忘记执行这个脚本结果相机插上之后realsense-viewer里始终看不到设备提示权限不足。后来执行了脚本并重新插拔USB线问题立刻消失。如果你在某个系统上执行脚本后仍然不行可以直接用root权限跑一次或者手动检查/etc/udev/rules.d/下有没有realsense相关的规则文件。然后创建build目录编译安装mkdir build cd build cmake ../ -DBUILD_EXAMPLEStrue -DCMAKE_BUILD_TYPERelease make -j$(nproc) sudo make install-j$(nproc)会调用系统所有CPU核心并行编译能大幅节省时间。但注意内存小的机器别这么干编译时内存爆炸直接死机我见过不止一次。建议内存8GB以下用-j4就够了。编译完成后还要配置一下动态库路径sudo ldconfig如果一切顺利在终端里输入realsense-viewer就能打开图形化工具。如果这一步正常说明相机已经能被系统识别RGB、深度、红外、IMU四种数据流应该都能看到实时预览。3.3 用realsense-viewer做硬件自检realsense-viewer是我每次拿到新相机必开的工具它有一个“Self-Calibration”的入口但你不需要一上来就做标定先看几个关键信息固件版本视图左上角会显示相机固件号比如5.13.0如果版本太老建议通过工具的“Update Firmware”功能升级。帧率与分辨率在“Stereo Module”和“RGB Camera”里可以调整分辨率和帧率确认相机在1280x720下的深度帧率能达到30fps以上。IMU状态在“Motion Module”里可以看到加速度计和陀螺仪的数据数值会随着你晃动相机而变化说明IMU工作正常。看到这里硬件层面基本确认没问题了。我还习惯在跑ROS之前先在realsense-viewer里开启“Record”录一段bag文件用官方工具验证数据记录是否正常。这段bag后面标定和做算法调试时还能复用一举两得。4. ROS驱动realsense-ros配置与启动4.1 源码编译realsense-rosROS层的驱动叫realsense-ros它本质上是把librealsense的数据流转换成ROS话题方便你用RViz、RQT和下游算法去消费数据。我建议也用源码方式安装因为apt源里的版本往往滞后跟你的librealsense版本可能不匹配。创建一个catkin工作空间然后克隆realsense-ros并切换版本mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/IntelRealSense/realsense-ros.git cd realsense-ros git checkout 2.3.2realsense-ros编译前需要一个动态参数配置库如果你用deb方式安装过ROS可以先搜一下是否已有sudo apt install ros-noetic-ddynamic-reconfigure然后编译cd ~/catkin_ws source /opt/ros/noetic/setup.bash catkin_makecatkin_make完成后把工作空间的环境变量加到.bashrcecho source ~/catkin_ws/devel/setup.bash ~/.bashrc source ~/.bashrc验证驱动是否编译成功rospack find realsense2_camera能返回路径说明ROS已经能找到这个包了。这时候别急着高兴先检查一下realsense-ros的版本和librealsense的版本是否兼容最简单的办法是启动一次launch看看有没有明显报错如果有“API version mismatch”之类的问题大概率是两者版本不配套。4.2 launch文件核心参数解析启动D435i的ROS驱动最常用的命令是roslaunch realsense2_camera rs_camera.launch这个launch文件默认会发布深度、彩色、红外等话题但默认情况下IMU的发布是不完整的。如果想拿到D435i的六轴数据需要手动设置参数roslaunch realsense2_camera rs_camera.launch \ enable_gyro:true \ enable_accel:true \ unite_imu_method:linear_interpolationenable_gyro和enable_accel决定了是否开启陀螺仪和加速度计数据。unite_imu_method把IMU的原始数据融合成一个话题linear_interpolation是用线性插值把加速度和角速度对齐到同一时间戳这对后续VIO非常重要。align_depth是否让深度图对齐到彩色图坐标系后面标定和点云处理经常会用到roslaunch realsense2_camera rs_camera.launch align_depth:true启动后我用rostopic list快速看过一遍话题最常用的是这几个/camera/color/image_rawRGB图像/camera/depth/image_rect_raw原始深度图/camera/depth/color/points彩色对齐的点云/camera/imu融合后的IMU数据/camera/gyro/imu_info、/camera/accel/imu_infoIMU信息如果你买的相机固件比较新launch启动时还会多出一些/camera/infra红外话题对于做双目红外方案的同学来说这些话题就是额外福利。4.3 用RViz查看点云和图像ROS启动正常后另开一个终端运行RVizrosrun rviz rviz在RViz里我用快捷键“Add”添加一个“PointCloud2”显示话题选择/camera/depth/color/points再把Fixed Frame改成camera_link或者camera_color_optical_frame就能看到彩色的点云场景了。这时候把相机对准桌面、墙壁、人体点云效果非常直观。再添加一个“Image”显示话题选/camera/color/image_raw就能看到RGB画面。我习惯把深度图也加上用/camera/depth/image_rect_raw并选择对应的颜色映射这样判断深度数据是否覆盖到位特别方便。如果你发现点云有大量黑色空洞先别怀疑相机坏了大概率是场景光照太强或者距离太远。把相机移近一点、调整到室内环境数据就会正常。点云里缺少彩色信息的区域通常是因为深度FOV比RGB FOV小边缘区域的深度本身就不可靠这是D435i的物理限制后期可以通过对齐和滤波处理。5. 相机标定让D435i的数据更可靠5.1 为什么标定是必须做的一步很多人以为D435i出厂就标定好了拿过来直接用就行。大部分场景下确实可以但一旦你涉及机械臂抓取、SLAM、三维重建这类对精度要求较高的应用就会发现出厂标定只能保证“大致可用”像素点对应的三维坐标仍有很大误差。D435i的出厂标定主要覆盖了深度模块的内参、RGB内参以及两者之间的外参。温度变化、相机摔落、结构应力变化都可能让这些参数产生微小漂移。做标定的目的就是把这些漂移补偿回去让图像坐标系、相机坐标系、机器人坐标系之间的变换关系更准确。另外IMU也需要标定。D435i的IMU在出厂前做过一定校准但不同安装角度、不同温度环境下零偏和比例因子会有差异这会直接影响视觉惯性里程计的精度。5.2 彩色相机内参标定实操ROS自带一个非常好用的标定工具包叫camera_calibration。第一次用之前先打印一张棋盘格最好是高对比度的哑光纸贴在一块平板上。启动D435i驱动后运行rosrun camera_calibration cameracalibrator.py \ --size 8x6 \ --square 0.0245 \ image:/camera/color/image_raw \ camera:/camera/color--size棋盘格内角点的数量8x6表示一个方向上8个内角点另一个方向上6个内角点不是总格子数填错会导致检测失败。--square每个棋盘格的实际边长单位是米需要用游标卡尺或尺子量准确。image指定彩色图像话题。camera指定相机命名空间。标定窗口打开后你要慢慢移动棋盘格让它出现在视野的边缘、中间、远近不同位置并且让它在画面中倾斜一定的角度。工具会实时检测并收集样本当界面上的“X”“Y”“Size”“Skew”四个进度条都变绿之后点击“Calibrate”再点“Save”即可。标定结果会以yaml和ost格式输出内容就是RGB相机的内参矩阵和畸变系数。保存后如果你用的是usb_cam这类驱动可以直接把参数写进launch文件如果用的是realsense-ros要直接把内参写入设备比较麻烦但至少你知道了精度水平对后续的数据处理有底。5.3 深度与彩色对齐、IMU标定实操深度和彩色的对齐在ROS层可以通过align_depth:true实现但这只是“数据流层面的对齐”真正要精确到像素级别仍需要确定深度图和彩色图之间的外参。librealsense提供了一套自动标定工具realsense-viewer里也有“Calibration”入口可以执行“Color and Depth Calibration”。操作时把相机对着一个平面的标定板在几秒钟内保持静止工具会自动计算出最优的外参变换。IMU标定这块我使用的是librealsense里自带的rs-imu-calibration工具。先让相机彻底静止放在桌面上运行工具它会提示你连续采集多组静止数据。采集完成后工具会输出加速度计和陀螺仪的零偏、比例因子、轴间失准角等校准参数。标定完成后的IMU参数如何写回相机固件这个要看具体SDK版本。部分新版本工具可以直接把参数写入设备也有版本只能输出参数文件需要你在自己的算法中加载。如果只是做ROS实验我建议先记下参数文件路径后面做VIO算法时直接用。6. 常见问题与排查技巧实录6.1 一套速查表我把实际操作中遇到过的问题整理成了一张速查表方便大家对照排查故障现象可能原因解决办法相机插上后系统完全没反应USB口不是3.0换USB 3.0蓝色接口直插主板后面板不要用前面的扩展HUBrealsense-viewer里看不到设备udev规则未生效执行./scripts/setup_udev_rules.sh后重新插拔USB线VM虚拟机里识别不到相机USB透传设置不对虚拟机设置改成USB 3.1控制器并在VM菜单中手动连接设备启动launch时报API版本不匹配librealsense和realsense-ros版本不兼容统一版本组合比如librealsense v2.50.0配realsense-ros 2.3.2画面帧率低、深度图一卡一卡USB带宽不足或CPU占用过高降低分辨率到640x480关闭不必要的话题关掉多个RViz窗口没有IMU话题launch参数未开启加enable_gyro:true enable_accel:true点云大量黑斑光照太强或距离过远移到室内均匀光环境调整相机位置到0.3米到3米范围编译librealsense报找不到libusb依赖没装全执行sudo apt install libusb-1.0-0-dev后重装相机温度高导致深度噪声长时间运行或环境温度高让相机预热5-10分钟改善通风必要时降低帧率6.2 虚拟机与主从机场景的补充如果你是在VMware里跑还想做多机器人联调那么“ROS主从机”的话题通常会跟D435i一起被提到。它并不是D435i特有的问题而是ROS网络配置的范畴主机跑roscore和相关节点从机跑自己的节点两者通过ROS_MASTER_URI互联。这个配置我建议放在调通单机之后再碰因为它涉及hostname、IP地址、防火墙等一堆细节配置错了会非常折磨人。先把D435i的数据在单机跑通再考虑多机分发否则问题叠在一起根本没法排查。6.3 三个容易被忽略的细节第一个细节是开机预热。D435i长时间不用之后第一次上电时深度数据会有明显的温漂噪声尤其在刚开机的几十秒内。我的习惯是提前5分钟启动相机让它跑起来稳定之后再干活。这一点在标定和三维重建时特别重要。第二个细节是日志和bag文件。ROS中有个很好用的工具叫rosbag你可以在跑数据的同时录制一段bagrosbag record -O d435i_test.bag /camera/color/image_raw /camera/depth/image_rect_raw /camera/imu录制好bag之后后续调试算法、复现问题、写博客素材都方便。我甚至会把“相机上电后明显异常”的现象录下来然后对照日志排查效率高很多。第三个细节是不要追求最高分辨率。D435i在1280x72030fps下表现很好但如果你把它拉到90fpsUSB带宽和CPU压力都会明显增大很多新手以为是相机坏了其实是系统扛不住。做语义分割、抓取实验这种耗时任务时把分辨率降到640x480反而更稳。结尾这台小相机教给我的事D435i不是那种“插上就好”的设备但它的折腾过程很有价值。我从第一次编译librealsense时到处找依赖包到后来能静下心看CMake输出再到能用realsense-viewer快速判断相机状态、用RViz分析点云质量每一步都是靠实际踩坑堆出来的。如果你也遇到了某个奇怪的编译错误或者意想不到的话题缺失别急着换设备先按照上面的表格逐项排查大多数问题都出在版本匹配、USB带宽和参数配置上。最后再分享一个小习惯每次拿到新相机我都会做一份“硬件体检记录”——记录固件版本、编译的librealsense版本、realsense-ros版本、ROS版本、系统内核以及相机在标准场景下的点云效果截图。这样半年后重新搭环境、换电脑、或者升级依赖时我能准确知道当年哪个组合是能稳定工作的。相信我这套组合早晚会派上用场。
返回列表