本文提出并演示了一种以二维光栅为外耦合器的出瞳扩展器(EPE)系统的仿真方法,并给出了优化和公差分析的实例。
在此工作流程中,我们使用 Lumerical 构建光栅模型,并使用 RCWA 求解器模拟其响应。完整的EPE系统内置于OpticStudio中,并动态链接到Lumerical,以集成精确的光栅模型。外耦合器(OC)是一种具有复杂结构的二维光栅,其功能在局部进行了优化。最后,利用optiSLang通过修改光栅模型,对系统级优化进行整体控制,实现整个EPE系统所需的光学性能。
设计具有EPE的AR系统,可以增加眼盒的尺寸,这对系统级的优化来说是一个挑战,因为它需要大量的参数。一种解决方案是使用多个一维光栅来模拟瞳孔,有关详细信息,请参阅《Ansys Lumerical | 采用一维光栅的出瞳扩展器的优化》。在本文中,波导由Lumerical设计的两个光栅组成。内耦合器(IC)是一维斜光栅,外耦合器(OC)是由平行四边形柱组成的二维光栅。这些光栅通过动态链路在OpticStudio光学系统中使用。2D OC光栅被分成几个部分,其中的光栅参数部分可以分别进行调整。
然后,optiSLang 通过 Python 节点处理优化。optiSLang 的使用带来了很大的优势,例如能够在每个优化周期内执行预处理和后处理(例如,使用瞳孔函数对结果进行卷积)。此外,可以通过在 python 代码中定义函数来控制参数,而不是直接使用不同区域中的所有单个光栅特性,从而减少变量总数,从而缩短优化时间。该过程由 Sensitivity 模块启动,以便系统在运行优化时可以识别影响最大的参数。在文章中《Ansys Lumerical | 采用一维光栅的出瞳扩展器的优化》 ,可以学习如何优化一维光栅的最基本特性:高度、占空比和倾斜角度。在文章《Ansys Lumerical|带 1D-2D 光栅的出瞳扩展器》中,介绍了OpticStudio中2D光栅的设计,但由于仅在OpticStudio中执行,因此优化受到限制。在这项工作中,我们演示了如何使用 optiSlang 通过使用 7 个不同的变量来局部控制平行四边形柱子的形状来执行 2D 光栅的复杂优化。
本文分为 4 个主要步骤,如下所示:
在本节中,我们提出了将被优化的光学系统。我们可以在文章《Ansys Lumerical|带 1D-2D 光栅的出瞳扩展器》中找到同一类型的系统。请注意,在最初的设计中,能量不会分布在整个眼盒中,因为大部分光在与折叠光栅和外耦合器进行几次交互后被外耦合。
本文的目的是演示如何使用 optiSlang 来控制使用 Zemax 构建的光学系统的优化。本节介绍将用于优化的参数,以及用作优化目标的指标。
优化已经设置,结果可用。在本节中,我们将提供有关 optiSlang 文件结构的信息,并解释如何可视化来自多次优化运行的结果。
最后一部分是分步指南,用于从不同的运行中选择特定设计,并将相应的参数推送到光学系统。
在Zemax OpticStudio中打开文件EPE_2D_out-coupler.zprj,查看系统设置。
IC是一个倾斜的光栅,被认为已经过优化。该系统的核心是OC,它是一种二维光栅,由以六边形周期结构排列的平行四边形柱组成。
在OpticStudio内置的波导系统中,准直光束入射到IC光栅上,并通过波导传播到OC。二维光栅的六边形周期结构允许光束传播并分布到波导中的大区域,如下图所示。通过这种方式,光线通过OC传播,并在多个位置被提取到眼盒,有效地模拟了瞳孔。
探测器设置为直接在超频光栅的输出端捕获光线。优化的目标是增强朝向眼睛的辐照度图输出的均匀性,同时最大限度地提高总功率。
为了准备优化,OC光栅被分成几个区域,在这些区域中,光栅特性将独立优化。
在optiSLang中打开文件[[EPE_2D_out-coupler.opf]]以检查优化设置。
双击 Python 图标“EPE_2D_for_OptiSlang.py”以可视化代码。
这种优化不会只调整高度和占空比等最基本的参数,而是会使用2D光栅提供的七个参数作为自变量,这些参数将用作变量,因此可以优化柱子本身的形状,如下图所示。
为了进行优化,超频光栅被划分为几个区域,在这些区域内,光栅特性将独立优化。不是在每个区域单独设置所有这些参数,而是通过定义如下的参数函数来控制跨 OC 多个区域的光栅参数:
V代表这些变量(dC,dR,dL,θC,θR,θL,h)中的任意一个。n代表1,2,3,4中的任意一个数字,对应于 4 个角的部分。由这个方程可知,每个部分的 7 个光栅参数可以通过 4 个角的参数和wn和非线性功率p来进行一些加权来控制。请注意,对称性也被用于减少系统的大小和变量的数量。
在随附的文件夹中,准备了一个python文件EPE_2D_for_OptiSlang.py,用于将optiSLang链接到OpticStudio。有关如何设置此类文件的更多详细信息,请参阅文章《Ansys Lumerical | 采用一维光栅的出瞳扩展器的优化》的附录。
光栅参数按照预定义的优化算法(例如进化算法)通过optiSlang进行变化。不同的参数值被设置到python代码中,并将其向下传输到OpticStudio中的每个光栅部分。在这个过程中,Python代码在OpticStudio中将这些变量转换为确切的参数。只有当我们使用optiSLang而不是OpticStudio中的内置优化器来优化系统时,才能使用Python中定义的函数进行这种预数据处理。通过这种方式,optiSLang可以基于一些在OpticStudio UI中没有直接公开的虚拟或高级变量来优化系统。
设置好参数后,代码的其余部分包括调用OpticStudio来追踪光线并从探测器收集结果。使用 optiSLang 优化系统的另一个好处是后数据处理。在这个优化过程中,我们不直接优化眼盒上的辐照度分布。取而代之的是,我们首先使用瞳孔函数对辐照度分布进行卷积,然后根据这个卷积结果设置优化目标。在此示例中,优化目标是对比度、总功率和均匀性,定义如下:
Python 代码的最后一部分是绘制眼框处的辐照度结果,以及其卷积结果,然后导出图片。这对于用户直接在optiSLang后处理中检查每个优化系统的辐照度很有用。
双击后处理 (1) 图标以可视化优化结果。
优化开始时,首先执行灵敏度分析以确定最重要的参数。使用此输入,进化算法运行并生成一系列结果。这些结果可以直接在帕累托图中的optiSLang中可视化。
下图中红色标记的设计称为帕累托前。帕累托前沿说明了多个目标之间的权衡,其中没有一个设计在性能方面主导另一个目标。这意味着所有这些设计都显示了多个标准(例如均匀性与总功率)的不同平衡。我们收集了 3 个结果并在下面显示它们。对于每个设计点,对应一对图,分别显示眼框内的对比度和均匀性。
将“敏感度”块复 制/粘贴到页面中,然后双击块标题“AMOP (1)”进行编辑。
在“适配”选项卡中,选中“显示高级设置”选项,然后选中“仅使用启动设计”。
在“其他”选项卡中,选中“评估设置”菜单中的“再次求解开始设计”选项。
在“开始设计”选项卡中,选择“从系统导入起始值”选项,然后选择在帕累托图上确定的所需设计(例如#986)。
在OpticsStudio中,点击编程选项卡中的“交互式扩展”按钮,然后运行OptiSlang仿真。
优化已经在附件中完成,打开文件时可以可视化优化结果。有时,我们可能想选择一个优化的设计,并在OpticStudio中进行研究。但是,optiSLang 仅将输入参数保存在表格中。我们不保留OpticStudio系统。为了在optiSLang中选择特定的设计,并将参数推送到OpticStudio的光学系统中,我们可以复 制灵敏度模块,并将其起点定义为所需的设计。通过禁用动态采样,运行该模块将简单地从所选设计中读取参数值,并将相应的数据推送到OpticStudio中。然后,用户可以手动将新系统保存为其他名称。在optiSLang中获取具有任何设计设计的OpticStudio系统的另一种选择是在python代码中添加一个命令,以便在optiSLang中运行优化时直接将系统保存为.zmx文件(例如TheSystem.SaveAs('design_optimized.zmx)。请注意,第二种方法仅在我们在 optiSLang 中运行优化之前在 Python 中进行更改时才有效。
由于系统依赖于 Python 代码,因此假定已安装 Python 以及脚本中调用的所有其他模块。
确保为所有光栅表面选择了正确版本的动态链接。
在optiSLang中运行任何内容之前,确保“交互式扩展”在OpticStudio(编程选项卡)中处于活动状态非常重要。
在本文中,我们演示了optiSlang可用于处理具有许多参数的复杂优化问题,但需要注意的是,在可能的情况下,依靠系统的对称性始终是简化优化的最佳方法。
本例中的光学系统呈现的是具有两个一维光栅的 EPE,这些光栅分为几个部分。由用户自定义光栅的形状、性质和位置。这些部分的形状和数量也可以直接在光学系统中定制。
变量和优化目标在设置 optiSLang 时定义,并且可以自定义。有关如何在optiSLang中设置优化模型的更多详细信息,请参阅文章《Ansys Lumerical | 采用一维光栅的出瞳扩展器的优化》一文的附录。
在本文中,变量是使用函数间接定义的。在示例的 Python 代码中,它的名称为“linsp”。任何自定义函数也可以由用户使用,定义可以简单地在Python代码中更新。
在这个演示中,我们只考虑中心场,即通常入射到波导上的准直光束。为了进行更全面的优化,可以添加更多视场以覆盖全视场的均匀性。
同样,该系统仅针对单个波长而设计。根据系统设计,优化可以包括多个波长。
一些辐照度分布看起来更均匀,但会导致更高的对比度。可以通过修改 Python 代码来改进标准。
另一个需要优化的维度是晶格角。在所展示的系统中,柱子以六边形结构排列,但Lumerical支持不同的排列,可以带来更多的可能性。