1. 快速部署先解决定位问题:dabai是一台深度相机,不是摄像头
接到ROS环境下的视觉需求,我最怕的不是写算法,而是花一个下午解决驱动安装。上次用奥比中光dabai相机做点云可视化,从拆包装到RViz里看到彩色点云,实际只花了一下午,大部分时间还不是花在编译上,而是花在搞清楚它和普通USB摄像头的区别上。这篇就按我当时的操作顺序来写,把快速部署的路径、参数和坑都过一遍。如果你正在研究机械臂抓取、近距离三维重建,或者单纯想把深度相机的点云接进ROS,这些内容应该能帮你少走不少弯路。
如果你手里已经有了一台dabai,建议别急着clone代码。先想清楚你要的是二维图像还是三维结构。dabai是结构光深度相机,它的核心输出是深度图,点云只是深度图的另一种表达。普通摄像头拍一张RGB图,你看到的是颜色;dabai拍一张深度图,你看到的是每个像素离相机有多远。点云可视化这个需求,本质上就是在消费深度信息,所以后面所有操作都要围绕"深度流能不能稳定出来"这件事展开。
1.1 结构光深度相机和普通摄像头的本质差异
结构光的思路并不难理解:相机内部有一个红外投影器,它会向场景投射特定的编码图案,同时相机自己拍摄被物体表面调制后的红外图。因为投影图案和拍摄图案之间存在视差,算法可以逐像素算出深度。dabai就是这套方案的典型产品。这也是为什么它和普通摄像头在部署上有完全不同的要求:工作距离不能太远,太远误差会变大;环境光不能太强,太强会干扰红外图案的识别;被测物体的表面也不能太黑、太透明或者高反光,否则深度会出现空洞。
很多人第一次部署失败,不是驱动有问题,而是拿它怼着两三米外的窗户拍,自然看不到理想点云。我自己的经验是,dabai这类结构光相机更适合桌面级场景,典型工作范围在几十厘米到一米出头。如果你要做的项目是机械臂抓取、人脸识别、手势控制、近距离三维重建,那它非常合适;如果要做室外SLAM或者大场景扫描,那应该换激光雷达或双目方案,不要在结构光上浪费时间。
1.2 快速做一次选型自检
接触过的团队里,因为选错了相机而白白折腾一周的情况不少。这里列一个简单的自查表,部署之前先过一遍。表和后面内容是一套组合,别觉得这是多余动作,结构光相机的适应面没有普通摄像头那么广,它擅长的是室内近距离开放场景,一旦环境条件不对,后面SDK调得再顺也拿不到好看的点云。
| 判断维度 | 适合用dabai | 不适合用dabai |
|---|---|---|
| 工作距离 | 0.2m ~ 1m级别,桌面/近场 | 超过数米的室外场景 |
| 光照条件 | 室内可控光 | 强烈阳光或复杂反光 |
| 被测物体 | 漫反射表面 | 玻璃、镜面、纯黑吸光材质 |
| 输出需求 | 深度图、点云、近距离感知 | 只想要二维图像做视觉识别,深度非必须 |
如果看完表格,你确认"我就是要深度点云,而且场景在室内近距离",那就可以继续往下走。如果只是想在ROS里拿到一张普通画面,那用普通USB摄像头加一个ROS驱动更简单,没必要把结构光相机的复杂度引进来。选型这一步看似和"快速部署"无关,实际上最大的时间浪费都发生在这里。
2. 把Ubuntu、ROS、SDK三者的版本关系先钉死,后面才不返工
dabai的驱动并不是一个纯硬件驱动,它依赖一个底层SDK把深度数据算出来,再由ROS的wrapper封装成话题。所以你的Ubuntu版本、ROS发行版、SDK或者wrapper的版本,必须在一个能互相兼容的范围内。很多人一上来就clone最新代码,结果编译报错或者运行报错,最后才发现是版本不匹配。我不太建议把"最新版"和"能用"画等号,做机器人项目,稳定压倒一切,尤其是驱动这种底层组件。
2.1 我推荐的组合
不同时期官方支持的侧重点不一样,这里给两套我自己验证过的组合,二选一即可。如果你已经有现成项目,不要轻易为了相机驱动升级系统;如果你是空环境起新项目,那就直接选第二套ROS2方案,省得以后迁移。
| 场景 | ROS1旧项目 | ROS2新项目 |
|---|---|---|
| Ubuntu | 20.04 | 22.04 |
| ROS | Noetic | Humble |
| 相机wrapper | ROS1版本wrapper | 官方ROS2版本的wrapper |
| 编译工具 | catkin_make / catkin build | colcon |
| 图形工具 | rviz | rviz2 |
如果你是从零开始,我建议直接走ROS2 Humble这条线。原因很简单:ROS1 Noetic已经是老一代产品,新工具链和第三方库都在往ROS2迁移。dabai的官方SDK对ROS2的支持这些年也越来越完善,没有必要在旧环境里给自己埋坑。只有当你项目里已经有一堆ROS1功能包、短期内迁移成本太高,才老老实实走Noetic。
2.2 安装ROS时的三个提醒
安装ROS这部分网上教程很多,我不重复贴一大段指令。只提醒三件容易被忽略的事,这几点恰恰是dabai相机能不能顺畅工作的关键。很多人的驱动装不上,源头都在ROS安装这一步,所以别觉得基础就跳过。
第一,系统尽量装原生Ubuntu,而不是在虚拟机里插USB相机。相机数据传输对USB带宽和实时性敏感,虚拟机虽然偶尔能识别设备,但深度数据流的稳定性很可能出问题。真要在虚拟机上验证,也要把USB控制器直通配好,否则后续帧率、同步问题会绕得你头疼。我之前见过一个同事,在虚拟机里调了三天,换了物理机之后半个小时全部跑通,这个教训花的时间可真不少。
第二,社区里有不少一键安装ROS的脚本,我自己也用过,确实省时间。但无论用谁的脚本,执行之前花两分钟看一遍内容,确认它到底往系统里放了什么。安全起见,不要盲目复制粘贴来自不可信来源的命令。脚本能帮你解决的是ROS本体安装,后面相机驱动仍然要自己编译,所以没必要把这一步当成完全不需要理解的黑盒。
第三,装完ROS后先确认环境变量能正常加载,终端里执行echo $ROS_DISTRO,能输出版本号再继续。这一步只要十秒钟,可以避免后面工作空间编译时找不到rosdep或者colcon的尴尬。我遇到过不少环境问题,最后发现是终端.bashrc没生效,source手动执行之后看起来好了,新开一个终端又打回原形。
2.3 装完ROS后的环境验证
我习惯在clone驱动前先做一次快速自检,保证ROS基础环境是干净的。这里给两条命令,分别在ROS2和ROS1环境下执行,看看你能不能得到预期输出。如果在第一步就卡住,后面的编译大概率也会出问题,不如先把地基打牢。
# ROS2 Humble source /opt/ros/humble/setup.bash echo $ROS_DISTRO # 期望输出:humble # ROS1 Noetic source /opt/ros/noetic/setup.bash echo $ROS_DISTRO # 期望输出:noetic还要确认几个编译命令在不在:catkin_make,colcon,rosdep。缺哪个补哪个。ROS2 Humble通常自带colcon,但如果你用的镜像很精简,可能需要单独安装。这一段看着基础,但我在实际部署时确实遇到过因为rosdep没初始化,导致后面依赖安装卡住的情况。版本组合这一步钉死了,后面clone代码、编译、启动,每一步都不会乱。
3. 驱动和ROS插件安装:先处理USB权限,再谈编译
驱动安装本身不复杂,但顺序很重要。我见过不少人上来就git clone然后colcon build,编译完一插相机,节点报"Device not found",然后又去翻权限设置,来回折腾。正确顺序是:先拿到底层SDK和wrapper,把USB设备规则装上,再编译,最后插上相机验证。这套顺序看着不起眼,实际能帮你省掉大量定位问题的时间。
3.1 获取驱动源码
首先建一个专门的工作空间,不要混进项目功能包,避免后续依赖混乱。我习惯把驱动单独放在orbbec_ws里,后面做算法包时再建一个项目工作空间,两者互不干扰。这样带来的好处是:相机驱动一旦编译好,基本不需要再动,项目代码怎么折腾都不影响底层数据源。
mkdir -p ~/orbbec_ws/src cd ~/orbbec_ws/src然后从官方地址获取对应ROS版本的wrapper。ROS2环境下,我使用的是OrbbecSDK_ROS2这个仓库;ROS1环境下则使用orbbec_ros。具体URL以官方文档为准,clone下来之后先看一眼README,里面通常写了当前版本适配的Ubuntu和ROS发行版,以及有没有需要切换的分支。不要小看这一步,官方仓库的默认分支不一定适配你的ROS版本。
# ROS2示例 git clone https://github.com/orbbec/OrbbecSDK_ROS2.git # ROS1示例 git clone https://github.com/orbbec/orbbec_ros.gitclone完成后,不要急着编译。先确认仓库里的launch目录和scripts目录是否存在。scripts目录里往往放着USB设备规则文件,launch目录里则是可选的启动文件。这两个目录在后面都会用到。如果发现源码里没有规则文件,也不要慌,先去官方SDK包里找,通常SDK包附带的内容比wrapper更完整。
3.2 编译前先装udev规则
Linux下非root用户访问USB设备,靠的是udev规则。奥比中光的wrapper源码里一般会带一个规则文件,名字通常是99-orbbec-usb.rules。它的作用是把设备的访问权限开放给普通用户,否则每次插相机都要用root启动ROS节点,或者不停加sudo,非常难受。这是最容易踩的坑之一,很多人觉得编译完就万事大吉,结果卡在这里。
# 先找到规则文件,不同版本路径可能不一样 find ~/orbbec_ws/src -iname "*orbbec*.rules" -o -iname "*.rules" | grep -i orbbec # 拷贝到udev规则目录 sudo cp <找到的规则文件路径> /etc/udev/rules.d/ # 重新加载规则并触发 sudo udevadm control --reload-rules sudo udevadm trigger执行完之后,把相机重新插拔一次,让系统按新规则重新识别设备。这一步做完,后面启动节点时的很多权限报错就能提前规避。如果你用的是自己编译的SDK而不是wrapper,规则文件也可能放在SDK根目录的scripts里。总之,先找规则、再装规则,这步优先级高于编译。
3.3 编译与自检
权限规则装好后,再编译就顺理成章了。ROS2和ROS1的编译命令不一样,但思路一致:先source对应ROS环境,然后rosdep install安装依赖,最后编译。编译环境不干净时,rosdep install报错是最常见的,所以前面环境验证那一步千万别跳。
# ROS2 Humble cd ~/orbbec_ws source /opt/ros/humble/setup.bash rosdep install --from-paths src --ignore-src -r -y colcon build --symlink-install source install/setup.bash# ROS1 Noetic cd ~/orbbec_ws source /opt/ros/noetic/setup.bash rosdep install --from-paths src --ignore-src -r -y catkin_make source devel/setup.bash如果rosdep install在下载依赖时因为网络问题卡住,也不要硬等。看一下它卡在哪个包,然后手动用apt install把对应依赖装上,再重新执行后续命令。编译过程中出现红色报错时,先看错误里的package名称,多半是系统缺了某个依赖库,补装后重新编译就行。我自己的原则是:不要追求一次编译通过,报错信息是给排错用的,逐条看反而更快。
编译完成后,插上相机,执行lsusb | grep -i orbbec看能不能找到设备。能识别到Orbbec字样,说明USB枚举已经成功,可以进入启动环节。识别不到也不要急,先换个USB口,最好用主机后置的USB 3.0口,扩展坞和前置面板的供电稳定性都可能影响识别。
4. 相机上电后的验收:打开launch,查话题,确认帧率
驱动编译通过,只是第一步。真正能说明部署成功的是:launch文件能正常拉起来,相机话题里有数据,帧率稳定。这一节我会按启动、查话题、看帧率三步走,每步都有明确判断标准。如果你在命令行里看到一堆日志,不要只顾着兴奋,先做一遍这套验收流程。
4.1 启动launch文件
wrapper包里通常带现成的launch文件。ROS2环境下常见的是orbbec_camera.launch.py,ROS1环境下常见的是按相机型号命名的dabai.launch。为了不背错名字,建议先看一眼launch目录里有什么,再决定启动哪个。这里要特别注意,不同小版本之间的launch文件名可能不一样,直接记住一个名字总有一天会坑到你。
# 先查看launch文件 ls ~/orbbec_ws/src/orbbec_ros/launch # 或 ls ~/orbbec_ws/src/OrbbecSDK_ROS2/launch # ROS2启动示例 ros2 launch orbbec_camera orbbec_camera.launch.py # ROS1启动示例 roslaunch orbbec_camera dabai.launch启动后,终端会打印SDK版本、相机型号、序列号等信息。看到类似Device connected或Camera opened的日志,就说明节点已经和相机通信成功。如果提示找不到设备,大概率是udev规则没生效或者USB没枚举成功,回到上一节处理。这里我不建议反复重启launch,每次失败都有日志,先看日志再行动。
4.2 认识话题和坐标系
启动完成后,另开一个终端,用ros2 topic list查一下当前有哪些和camera相关的话题。很多教程喜欢直接背话题名,但我更推荐你学会这一条命令,因为不同SDK版本的话题命名多少会有差异,靠打印出来看起来最准确。
ros2 topic list | grep camera正常情况下,你会看到彩色图、深度图、相机内参、点云等几个核心话题。每个版本的命名可能略有差异,但大致会包含这些:
| 话题 | 内容 | 对点云可视化的作用 |
|---|---|---|
/camera/color/image_raw | 彩色图像 | 提供颜色信息,可叠加到点云 |
/camera/depth/image_raw | 深度图像 | 点云的数据源 |
/camera/depth/camera_info | 深度相机内参 | 深度图转点云的投影依据 |
/camera/color/camera_info | 彩色相机内参 | 彩色图对齐与投影 |
/camera/depth/points | 深度点云 | RViz里添加这个话题 |
看到这些话题后,还要确认点云的坐标系。在RViz里做可视化时,Fixed Frame必须和点云数据里的frame_id对得上,否则画面会空或者飘。执行下面的命令查看点云的frame_id:
ros2 topic echo /camera/depth/points --once | head -n 10ROS1对应命令是rostopic echo -n1 /camera/depth/points | head -n 10。记下输出的frame_id,后面配置RViz时直接填这个值。我之前见过很多人不看frame_id,硬在RViz里试各种固定坐标系,试了十分钟才发现答在数据上。
4.3 用帧率判断数据流是否健康
话题有内容不代表数据就是健康的。点云可视化最怕帧率低或者帧间隔不稳定,看起来就像画面在卡顿。我每次部署完都会用hz命令盯一下频率,这是我验收流程里必不可少的一步。检查帧率没什么技术含量,但它能暴露很多隐藏问题,比如USB供电不足、带宽被占用、相机发热降频。
ros2 topic hz /camera/depth/image_raw ros2 topic hz /camera/depth/points如果频率稳定在标称值附近,说明深度流和点云流都正常。如果出现大量dropped字样,或者频率只有个位数,那就要进入后面的排查章节,重点看USB带宽和相机参数。帧率这一关过了,整个部署流程就等于走通了一大半,接下来就是在RViz里把这个数据变得可读。
5. RViz里的四项设置,决定你看到的是点云还是一团马赛克
很多人在命令行里看到话题有数据,觉得很成功,一打开RViz却发现什么都没有,或者只有一片乱飞的噪点。这不是数据问题,绝大多数是显示配置问题。这节我讲四件必须确认的事。顺序很重要,先确认坐标系,再添加话题,然后调渲染参数,最后把配置保存下来。
5.1 Fixed Frame选对了吗
RViz里面最重要的一个概念是Fixed Frame,它决定了整个可视化窗口使用哪个坐标系。如果点云话题的frame_id是camera_depth_optical_frame,而RViz里的Fixed Frame还留空,或者默认是map,那点云就可能被显示到很远的地方,甚至直接看不到。
正确做法是:打开RViz左侧的面板,展开Global Options,把Fixed Frame改成点云话题里查到的frame_id。如果点云仍然不显示,就把Displays面板里的Add打开,选择By topic,再选/camera/depth/points,而不是手动加一个空的PointCloud2之后再去填话题名。用By topic方式添加,RViz会自动匹配数据类型和显示插件,出错概率小很多。
5.2 点云渲染参数怎么调
添加PointCloud2显示后,还需要调几个参数,否则点云可能显示成一片密集的白点,看不出结构。在Displays面板里选中PointCloud2,展开它的属性:
Style建议选Points,点比较轻量;机器配置不差可以选Boxes或Spheres,视觉效果更立体。Size控制点的大小,单位是米。我一般从0.01开始调,点太密就调小,点太稀疏就调大。Color Transformer如果点云带RGB字段,可以选RGB8;如果只想要一个统一颜色来看深度结构,选FlatColor,然后在Color里手动指定。Alpha控制透明度,排查遮挡关系时可以调到0.5左右看穿透效果。
这些参数没有绝对标准,和你的相机距离、物体大小都有关系。我在机械臂抓取项目里习惯把点调小一点,因为要观察物体表面细节;展示场景的demo里反而会把点调大,让观众一眼能看出轮廓。建议你调完之后把合适的参数固定下来,不要每次启动都重新调一遍。
5.3 彩色点云和深度图叠加显示
如果点云话题里已经带了RGB字段,用RGB8颜色变换器就能看到彩色点云。但我见过不少相机wrapper默认发布的是不带颜色的点云,这时候要做两件事:第一,确认彩色图话题/camera/color/image_raw有没有数据;第二,看wrapper是否支持发布带颜色的点云话题。
实在没有彩色点云,也不要卡在这。先用DepthCloud或单独添加Image显示,把深度图和彩色图放在RViz的辅助视图里看。深度图是一张灰度图,越近越亮;彩色图则是正常RGB画面。两个视图叠在一起,可以帮你确认当前场景和点云结构是否对齐。对齐这一步存在偏差时,优先检查camera_info是不是对应上了,而不是去怀疑硬件。
5.4 把配置存成文件
RViz的配置是可以保存的。调整好点云的显示参数后,File -> Save Config As,把后缀为.rviz的文件放到项目目录里。下次启动直接执行:
rviz2 -d ~/orbbec_ws/rviz/dabai_pointcloud.rvizROS1环境则是rviz -d。这样不仅省去重复配置时间,还可以保证团队里每个人看到的画面一致,排查问题的时候对参数有共同语言。我自己的习惯是把RViz配置和launch文件放同一个目录,换电脑时一起拷走,别人拿到也能直接复现。
6. 高频故障排查:USB带宽、空洞、权限和换机问题
部署过程中真正耗时间的,往往不是正常路径,而是各种"看起来能用但没有完全用好"的奇怪现象。这里整理四个我实际遇到最多的场景,每个都按"现象-原因-处理"来写。排错这件事,最怕的就是没有章法地乱试,所以我建议每次都先把现象描述清楚,再看根因。
6.1 帧率掉到个位数或频繁丢帧
现象是终端里hz输出的频率一会在15,一会在8,还伴随大量丢帧提示。大多数情况下这不是相机坏了,而是USB带宽不足。深度相机的数据量远大于普通摄像头,彩色流加深度流一起跑,对USB 3.0的带宽占用很高。尤其当你在笔记本上使用扩展坞时,这个问题会更明显。
处理方法:优先把相机插在主机背面的USB 3.0口,主板直出的口供电和信号质量最好。不要通过USB Hub,尤其是未供电的Hub;尽量使用原装数据线,延长线越短越好。如果条件限制必须用扩展坞,选支持USB 3.0且带独立供电的型号。换口之后再重新测hz,通常能恢复正常。如果仍然掉帧,再考虑降低分辨率或关闭不需要的数据流。
6.2 点云断层和大面积空洞
现象是画面里有些物体就是没有点,形成空洞。结构光相机对物体表面材质很敏感,黑色吸光表面、透明玻璃、高反光金属都会导致红外图案无法被正常解读,这些区域在深度图里就直接是无数据。所以看到空洞先别急着怀疑相机故障,先看空洞出现在什么物体上。
另一种情况是距离超出范围。dabai这种近场相机,太近会小于最小工作距离,太远则深度误差爆发,点云会变得稀疏甚至完全消失。处理时先把物体放到厂家标称的工作范围内,再检查环境光。如果环境里有强光或者直射阳光,拉上窗帘或者改变相机朝向。做完这两步,大部分空洞问题都能缓解。
6.3 权限相关报错
现象是launch后日志里出现类似open device failed、permission denied、no device found之一。这通常就是udev规则没生效,或者规则文件放进去后没重载。重新执行一下规则重载命令,再插拔相机。如果还不行,看一下规则文件里的USB Vendor ID是否匹配你的设备;有些老版本规则只覆盖了部分型号,需要手动补充。
sudo udevadm control --reload-rules sudo udevadm trigger lsusb | grep -i orbbec另外有一种情况是之前用root启动过节点,产生了权限残留。把相机重新插拔一次,所有终端关掉重新开,再试一次,一般也能解决。这里我不建议为了省事直接sudo ros2 launch,因为后面做机器人系统时,权限管理只会越来越复杂,最好从一开始就按规则走。
6.4 换一台机器就识别不到
这个坑很典型:相机在一台机器上跑得好好的,拔下来换到另一台,结果节点报找不到设备。原因是新机器上没有安装udev规则。很多人把规则文件放在源码目录里,换机器时只拷贝了编译后的工作空间,没拷贝规则文件。于是新机器上节点能跑,但设备权限不对,自然打开失败。
处理方式只有一个:把udev规则纳入部署清单,每台机器都要执行一遍。最好的做法是写一个简单的部署脚本,把源码下载、规则安装、依赖安装、编译全部串起来。这样不管是同事换电脑还是拿到现场部署,都能保证环境一致,避免在"看起来一样"的机器上浪费半天时间。
7. 从点云可视化继续往前走:记录数据、调参数和后续扩展
点云能在RViz里正常显示,只是快速部署的终点,但往往是真正应用的起点。我建议花点时间把数据保存、参数调整和后续扩展的路径也顺手准备好,后面做算法时你会感谢当时的自己。很多人在可视化成功后就停下来,等到需要训练数据或者标定时才想起来,又要重新熟悉一遍流程。
7.1 用ros2 bag把点云和图像一起存下来
实际开发中,不可能每次都现场调试。把数据录成bag,带回工位慢慢分析,是最常见的做法。ROS2里直接用ros2 bag record就能完成。录制前先创建一个目录,避免bag文件散落在工作空间里,后面整理会很麻烦。
mkdir -p ~/bagfiles ros2 bag record -o dabai_demo \ /camera/color/image_raw \ /camera/color/camera_info \ /camera/depth/image_raw \ /camera/depth/camera_info \ /camera/depth/points录制完成后,用ros2 bag play dabai_demo回放,再到RViz里添加话题查看。这样即使相机不在手边,也能验证算法和显示效果。需要说明的是,点云话题数据量比较大,bag文件会膨胀得很快,录制前最好先确认磁盘空间。如果只是调试算法,可以只录深度图和相机内参,不一定每次都把点云也录进来。
7.2 分辨率与曝光等参数的调整思路
相机launch起来后的默认参数,不一定适合你的实际场景。我处理过不少"点云能看但不好用"的情况,最后都是通过参数调整解决的。在ROS2里先查一下当前节点支持哪些参数:
ros2 param list /camera列表里会有曝光、增益、分辨率、帧率等参数。改参数的方式有两种:临时用ros2 param set现场调试,试出合适值后再写进launch文件,保证每次启动都是同一套配置。结构光相机对曝光尤其敏感:曝光太低,深度图像太暗,许多像素算不出深度;曝光太高,场景亮度高,红外图案反而被淹没。调曝光时不要只看彩色画面,要盯着深度图和点云空洞的比例,找到一个让有效深度点最多的值。
7.3 可视化之后值得做的三件小事
第一,做点云滤波。原始点云通常包含大量离群点和背景噪点,直接用会很吵。可以沿用PCL的思路,先做直通滤波切出感兴趣区域,再做体素网格降采样减少点数量。这些操作在ROS里都有现成节点,不需要自己从零写。点云滤波不是可有可无的优化,它直接影响后续坐标提取和识别的稳定性。
第二,做手眼标定。如果相机是装在机械臂上用于抓取,相机坐标和机械臂坐标系之间的关系必须标定。用现成的手眼标定工具,配合标定板,能比较快地得到变换矩阵。没有这一步,点云显示得再漂亮,机械臂也没法准确抓。标定一次可能要花点时间,但标完之后的坐标转换就一劳永逸了。
第三,把彩色图上的检测结果投影到点云。先用YOLO这类检测算法在彩色图上找到目标框,再结合深度图提取目标区域的三维点,就能得到目标在相机坐标系下的位置。这也是结构光相机在机械臂场景里最常用的落地方式,比单纯可视化有价值得多。整个过程配合camera_info里的内参矩阵,代码量并不大,却能让你的系统真正具备感知能力。
我自己的习惯是,部署完相机后马上把RViz配置、launch参数、udev规则和部署脚本一起放进项目仓库。这样下次换机器或者换同事接手,只需要clone、编译、跑脚本,半小时内又能看到同一套稳定点云,而不是每次都要从零开始重新踩一遍坑。