【Zed2】从零开始学习使用ZED2:个人学习笔记

一些前言

购买考虑

一开始在zed2i和zedmini之间考虑了很久。

  1. 硬件差异
    ZED2i:ZED2i配备了更强大的硬件,支持更高的分辨率和更远的深度感知范围。它使用更先进的传感器,能够提供更准确的深度映射和立体视觉效果,适用于更复杂的应用场景,如自动驾驶、机器人导航等。
    ZED Mini:ZED Mini则是一款更紧凑的版本,专为增强现实(AR)和虚拟现实(VR)等应用设计。它体积更小,适合集成到头戴设备或更小型的设备中,虽然深度感知性能比ZED2i略逊一筹,但仍然能够提供高质量的空间映射和定位功能。
  1. 流媒体传输
    ZED2i:它可以通过ZED SDK进行流媒体传输,这意味着它依赖于Stereolabs的ZED SDK来处理视频和深度数据的传输。ZED SDK提供了一套强大的工具,用于捕捉、处理和流式传输数据,支持深度图、点云、轨迹等多种数据格式,并且能够在计算机端进行实时处理。
    ZED Mini:ZED Mini则支持通过IP直接流式传输数据(“Stream anywhere over IP”),这意味着它可以通过网络将数据发送到远程设备,而不依赖ZED SDK。这种方式简化了连接和数据传输的复杂度,适合需要远程访问或在分布式系统中使用的场景。
  1. 应用场景
    ZED2i:由于其强大的深度感知能力和更大的视场,它适用于复杂的机器人、自动驾驶系统和需要精确空间感知的工业应用。
    ZED Mini:更适用于移动设备或增强现实的应用场景,如AR眼镜、VR头显等设备。它的体积小且轻便,适合对尺寸有严格要求的应用。
    简而言之,ZED2i适合需要高性能深度感知和计算能力的场景,而ZED Mini则更适合便携性和增强现实、虚拟现实等轻量级应用。而关于流媒体传输的区别,ZED2i依赖于ZED SDK来管理和传输数据,而ZED Mini则可以通过IP直接进行流媒体传输,给用户更多灵活性。

最后因为需要防水加使用场景比较复杂选择了zed2i。

Setup ZED2

安装coda
安装zedsdk

将zed sdk导入Unity

使用 ZED 在 Unity 中开发应用程序,需要满足以下条件:
(1)下载并安装最新的 ZED SDK。
(2)通过 Unity 的包管理器安装 ZED SDK 插件:
导航到 Editor 中的 Window -> Package Manager
点击左上角的 “+” 按钮,然后选择 “Add package from git URL…”
将此 URL 复制到字段中,然后单击 Add:
https://github.com/stereolabs/zed-unity.git?path=/ZEDCamera/Assets

注意:国内不要使用这个方法,我尝试了三个小时,就算是vpn也下载超时
建议更换为:
下载zip文件,解压,然后从本地电脑添加package:选择package.json
在这里插入图片描述
然后就大概率成功了。

之后大概率/随机会出现这个warning:
在这里插入图片描述
虽然官方建议是:
在这里插入图片描述
但是亲测这个解决方案没有用。建议先在package manager中确认一下是否安装了universal RP。
如果安装了,那就重开一下项目,如果还有就无视他吧。
我搏斗了两个小时,完全无法解决,询问了一下大佬,大佬说这个算是unity日常抽风。
果然,在我重启了一次电脑,接完了一杯水后,莫名其妙就不报这个错误了。

关于分辨率

zed2i输出的是4416*1242分辨率的视频,是双目摄像头的常见格式。因为是sidebyside格式,每只眼睛的分辨率为 2208×1242(左右各一半)。按横向比例来看,这比标准的 1080p(1920x1080)稍高一点,属于超宽屏,分辨率略高于 1080p。严格来说,2208×1242 并不完全符合标准 2K 的定义,但接近 2K 的范畴 。常见 16:9 的 2K 分辨率(QHD)为 2560×1440,这是常见的“2K”分辨率之一,主要用于显示器和高分辨率设备。而 2208 像素,超出了 DCI 2K 的 2048 水平分辨率,但是1242 像素,高于 1080,但低于 1440。如果把 2K 理解为横向分辨率大约 2000 像素,那么 2208×1242 可以算是 “超 2K 分辨率”。严格标准下,它不完全符合 DCI 2K 或 QHD 的定义,但在实际应用中,多数人会认为它已经达到或超过 2K 清晰度。(PS:我尝试在vive中打开这个视频,我感觉完全没有达到1080p的清晰程度,暂时不知道为什么)

simple AR示例程序

遇到的第一个问题是:运行后显示"Unable to open camera"

显示unable to open camera后,在相机软件中可以看到zed相机连接很不稳定,一直在断联重新连接,我原本以为是线接触不良。但是重启后是正常的,运行程序后才又开始了。最后通过修改resolution解决了-————————改为1080p 30fps。
在这里插入图片描述猜测可能的原因是
1.带宽限制
高分辨率(例如 2K 或更高)的视频流需要更高的 USB 带宽。如果你的电脑的 USB 接口带宽不足,可能会导致相机数据传输不稳定,从而引发“接触不良”或断开的问题。

2.硬件性能瓶颈
高分辨率和帧率会对电脑的 CPU 和 GPU 造成更大的压力,尤其是在实时处理立体图像时。如果硬件性能不足,可能会导致驱动或程序无法稳定运行。

3.ZED 相机的功耗
高分辨率模式会让 ZED 相机工作在更高的功耗状态。如果电源供给不足,可能会出现设备连接不稳定的问题。==

目前仍然未知怎么使用2k 30fps。
如果有大佬知道请告诉我,球球了。

遇到的第二个问题:运行没有报错,但是显示不出摄像头传回来的视频

在这里插入图片描述

确定摄像头绑定的纹理能传回来了

Mat_ZED_Forward_Lighting_URP 应该实时绑定 ZED 摄像头的输出画面纹理:

  1. 在运行时选中相机stereo中的 frame canvas 对象,查看 Inspector 面板。
  2. 检查 Mat_ZED_Forward_Lighting_URP 的材质属性,确保 主纹理(Main Texture) 是否动态更新。
  3. 正常情况下,主纹理会显示 ZED 摄像头的实时画面。如果纹理为空或静态,则可能是绑定未正确完成。

如果能传回实时摄像头的纹理,那应该就是URP渲染的问题。

彻底解决这个问题:使用3D (Built-In Render Pipeline)项目模板。

Scene中的物体材质是不是粉色的

  1. Window > Rendering > Render Pipeline Converter
  2. 确保 Scriptable Render Pipeline Settings 中已设置为 URP。
  3. 勾选全部点击 Initialize Converter
  4. 在可用的转换器列表中选择 Built-in to URP。
  5. 点击 Convert Assets 按钮。

遇到的第三个问题:我想在电脑端察看左右两个摄像头回传的视频,但是永远都只能看到左边摄像头的视频

我原来以为zed提供的这个相机的预制件不允许电脑端查看左右两个摄像头的视频,因为教程里面写了在非AR直通模式下ZED_Rig_Stereo也可以工作,但第二个未使用的 Unity 摄像机将降低性能。但是我搜到这个youtube视频电脑是可以看到sidebyside格式的:https://www.youtube.com/watch?v=9nWCCf6WCFc

我尝试的第一个方案是:
创建好左右两个RenderTexture;并绑定了左右RenderTexture 到左右摄像头LeftEyeCamera;并且创建了材质Material,绑定了RenderTexture到Material;最后我将左右两个摄像头底下的Frame中的对象quad的mesh 的材质设置为我创建的Material。

  1. 创建 RenderTexture
    在 Project 窗口创建 RenderTexture:
    在 Unity 的 Project 窗口中,右键点击空白处,选择: Create > Render Texture(创建一个渲染纹理)。
    为创建的渲染纹理命名,例如:
    LeftRenderTexture
    RightRenderTexture
    设置 RenderTexture 的分辨率:
    选中 LeftRenderTexture 或 RightRenderTexture,在 Inspector 面板中设置其属性。
    Width 和 Height:建议设置为与目标分辨率一致(例如 1920x1080 或 1280x720)。
    Depth Buffer:一般可以设置为默认值 16 位(适合大多数 3D 场景)。
    其他属性可以保持默认。
  2. 绑定 RenderTexture 到摄像头
    选中左眼和右眼的摄像头:
    在 Hierarchy 面板中找到你的左眼摄像头(例如 LeftEyeCamera)和右眼摄像头(例如 RightEyeCamera)。
    点击摄像头,查看 Inspector 面板中的属性。
    设置摄像头的 Target Texture:
    在 Inspector 面板中找到 Target Texture 属性。
    将 LeftRenderTexture 拖动到左眼摄像头的 Target Texture 属性框中。
    将 RightRenderTexture 拖动到右眼摄像头的 Target Texture 属性框中。
    说明: 当你将 RenderTexture 绑定到摄像头时,该摄像头的渲染内容将不再直接显示在屏幕上,而是会被输出到指定的 RenderTexture 中。
  3. 应用 RenderTexture 到材质
    创建用于显示的材质:
    在 Project 窗口中右键点击空白处,选择: Create > Material(创建材质)。
    分别命名材质,例如:
    LeftMaterial
    RightMaterial
    绑定 RenderTexture 到材质:
    选中 LeftMaterial,在 Inspector 面板中:
    找到 Main Texture 属性,将 LeftRenderTexture 拖放到这里。
    对 RightMaterial 做同样的操作,将 RightRenderTexture 绑定到它的 Main Texture 属性。
    应用材质到 Frame:
    选中 LeftFrame(或 Frame 对象中的 Quad),找到其 Mesh Renderer 组件。
    在 Materials 中,将 LeftMaterial 设置为其材质。
    对右眼的 Frame 做相同操作,将 RightMaterial 应用到右眼的 Frame 上。

但是最后运行结果是No camera rendering。

后面我有注意到youtube视频里面有canvas,修改为第二个方案:

创建好左右两个RenderTexture,并绑定了左右RenderTexture 到左右摄像头LeftEyeCamera,再创建了一个canvas,在canvas中新建两个raw image,每个raw image的texture贴上我之前创建的RenderTexture,最后在创建一个Culling Mask为nothing的摄像头。(因为如果不创建一个Culling Mask为nothing的摄像头,虽然能看到两个摄像头传来的视频,但是还是会显示No camera rendering。)

我推测的原因可能是:ZED 提供的 Unity 插件可能包含自定义的渲染流程,例如quad 本身可能被设计成一种中间层,用来接收数据而不直接输出到屏幕。或者ZED 的双目渲染可能是为虚拟现实(VR)或增强现实(AR)优化的,其中 quad 的用途可能是为了投射到特定设备上,而不是直接在普通屏幕上显示。

根据 Stereolabs 官方文档的说明,ZED Unity 插件中的 Frame 对象 是位于摄像机前方的四边形(Quad),其主要功能是显示来自 ZED 实时摄像头的视频。 这些 Frame 对象使用特定的材质进行渲染,该材质会根据 ZED SDK 计算的每个像素的深度进行偏移,从而实现实时的遮挡和光照效果。在 ZED_Rig_Mono 预制件中,Frame 对象位于单个摄像机前方;而在 ZED_Rig_Stereo 预制件中,每个眼睛(左眼和右眼)都有各自的 Frame 对象,分别位于对应的摄像机前方。这些 Frame 对象的设计初衷是用于增强现实(AR)或虚拟现实(VR)应用,其中需要将现实世界的视频与虚拟内容进行融合。
因此,Frame 对象中的 Quad 主要用于在特定设备(如 VR 头显)上显示视频内容,而在普通屏幕上可能不会直接渲染。如果您希望在 Unity 的普通视口中显示 ZED 摄像头的实时视频,建议使用 RenderTexture 将摄像头的输出绑定到 UI 元素(如 Raw Image)上进行显示。
这种方法可以确保在非 VR 环境中正确显示视频内容。

以下是来自chatgpt的总结

整体逻辑回顾
ZED Rig Stereo 的预制件:
ZED SDK 提供了 ZED_Rig_Stereo 预制件,包含左右两个摄像头(Left Camera 和 Right Camera),分别模拟人眼立体视觉。
我们为左右眼创建对应的 RenderTexture,并将它们绑定到 Left Camera 和 Right Camera。
Raw Image 显示视频流:
在 Canvas 中,通过两个 Raw Image 显示左右眼的 RenderTexture。
每个 Raw Image 分别映射到左右眼的视频流,确保画面内容分离且对应。
解决 No Camera Rendering 问题:
Unity的默认行为要求场景中至少有一个有效的主相机进行渲染。
为了解决 No Camera Rendering 提示,需要添加一个 Culling Mask 设置为 Nothing 的额外摄像头,这个摄像头可以避免干扰你的 ZED_Rig_Stereo 的渲染逻辑。
优化和实现步骤

  1. 准备左右眼的 RenderTexture
    创建两个 RenderTexture:
    左眼的 RenderTexture_Left:
    分辨率建议根据 ZED 相机的输出调整(如 1920x1080 或更高)。
    右眼的 RenderTexture_Right:
    保持与左眼分辨率一致。
    绑定到 ZED_Rig_Stereo 的左右摄像头:
    在 Left Camera 上设置 Target Texture 为 RenderTexture_Left。
    在 Right Camera 上设置 Target Texture 为 RenderTexture_Right。
  2. 配置 Canvas 和 Raw Image
    在场景中创建一个 Canvas,设置为世界空间模式:
    Canvas 的 Render Mode 设置为 World Space。
    调整 Canvas 的大小和位置,使其与场景的视野相符。
    在 Canvas 中创建两个 Raw Image:
    左眼 Raw Image:
    将 Texture 设置为 RenderTexture_Left。
    调整位置,使其处于左眼显示区域。
    右眼 Raw Image:
    将 Texture 设置为 RenderTexture_Right。
    调整位置,使其处于右眼显示区域。
    设置 Raw Image 的 Aspect Ratio 和 Anchor:
    确保 Raw Image 的宽高比与 RenderTexture 一致,避免拉伸或变形。
  3. 添加辅助摄像头
    为了解决 No Camera Rendering 的问题,添加一个辅助摄像头,设置如下:
    创建辅助摄像头:
    新建一个摄像头(命名为 BackgroundCamera)。
    在 Camera 组件中设置:
    Culling Mask:选择 Nothing,这样它不会干扰场景中的任何其他对象。
    Clear Flags:设置为 Solid Color 或 Depth Only。
    Depth:确保其渲染顺序低于 ZED_Rig_Stereo 的摄像头(设置为 -1)。
    调整性能影响:
    辅助摄像头只需要满足 Unity 的最低渲染需求,不会消耗实际性能。
    如果需要进一步优化,可以禁用辅助摄像头的光照和后处理。

但是在zed文档中有写这么一句话:

With VR enabled in the Player settings, you can just drag the camera into the scene and run it. When a headset is detected, the prefab will position Camera_eyes using Unity’s built-in VR/XR functions. As such, you do not need any other plugins to use pass-through AR unless you want to add controller support.Key Concepts & Scripts

所以我倾向于觉得如果直接连接hololens应该可以直接启动AR直通模式。(1.10待验证)

使用DJI倾斜摄影进行3d建模

【建模】使用无人机扫描建筑建模https://bbs.dji.com/pro/detail?tid=308276
【建模】使用无人机扫描建筑建模(摄影测量)https://www.bilibili.com/video/BV1B34y1Y7f6/?vd_source=d73bcadcbd9e57a79d4f2d6f16be5b41&spm_id_from=333.788.player.switch

使用zed2i相机,您可以按照以下步骤进行设置和操作: 1. 首先,确保您已经启动了ZED节点。使用以下命令之一启动ZED节点: - 对于ZED相机:`roslaunch zed_wrapper zed.launch` - 对于ZED Mini相机:`roslaunch zed_wrapper zedm.launch` - 对于ZED 2相机:`roslaunch zed_wrapper zed2.launch` - 对于ZED 2i相机:`roslaunch zed_wrapper zed2i.launch` 2. 要设置相机参数,您可以修改`param/common.yaml`(所有相机通用参数)和`param/zed2.yaml`文件。在这些文件中,您可以调整各种参数以满足您的需求。有关可用参数的详细信息,请参阅官方文档的参数调整部分。 3. 如果您想尝试教程,请进入`tutorials`文件夹,然后进入`tutorial 1 - hello ZED\csharp`文件夹。在此文件夹中,您可以找到用于C#编程的示例代码。然后,创建一个名为`build`的新文件夹,用于构建代码。 请注意,以上是zed2i相机的基本使用教程。如果您需要更详细的操作指南或进一步的说明,请参考官方文档或相关教程资源。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ZED2相机使用及检测目标功能](https://blog.csdn.net/SKGLZ/article/details/126279712)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [ZED2i相机使用环境搭建(Windows 环境下 C#API)](https://blog.csdn.net/sunsoldeir1/article/details/128379438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值