☰
Optiland端到端案例实战:从需求到处方报告,完整设计一枚双胶合透镜
2026/10/16 6:19:48 网站建设 项目流程

【免费下载链接】optiland

Comprehensive optical design, optimization, and analysis in Python, including GPU-accelerated and differentiable ray tracing via PyTorch.

项目地址:https://gitcode.com/gh_mirrors/op/optiland
点击查看免费下载

Optiland 是一款用 Python 编写的开源光学设计、优化与分析工具。本文以官方端到端案例 “Design a Doublet, End to End” 为主线,带你走通无色散双胶合透镜(achromatic doublet)从需求定义到处方报告生成的完整设计流程——不需要切换任何商业软件,一个 Python 环境即可闭环。

为什么选双胶合透镜?它是最简单的“值得认真设计”的镜头:单片透镜无法消除轴向色差,而双胶合结构恰好是能校正色差的最小系统。本文的需求 → 一阶布局 → 分析 → 优化 → 公差分析 → 处方报告闭环,正是光学工程师的完整工作流程,官方案例见 Tutorial_1e_Design_a_Doublet_End_to_End.ipynb。

先安装环境:

pip install optiland

📋 第一步:写下设计需求,确定“好”的量化标准

光学设计永远从一张需求表开始。本案例的双胶合透镜规格如下:

需求项数值
有效焦距 EFL100 mm
入瞳直径 EPD20 mm(即 f/5)
半视场角±2°
波带可见光 F (0.4861 µm)、d (0.5876 µm)、C (0.6563 µm)
目标近轴接近衍射极限,全波段色差小

在设计任何面型之前,先算两个基准数字:f/5 下可见光的Airy 半径约 1.22·λ·(f/#) ≈ 3.6 µm,目标像元尺寸约 5 µm。因此RMS 光斑半径在个位数微米就算合格,几十微米就是失败——这就是后文评判每步结果的标尺。

GUI 的 System Properties 面板中的波长表与本案例需求完全一致:F、d、C 三条可见光波长,d 线为主波长(Primary = Yes)。

📐 第二步:一阶布局,用单片透镜做基线

在选玻璃、斗像差之前,先做“一阶”系统:用一片正透镜满足焦距和口径要求。一块 R₁ ≈ 51.7 mm 的平凸 N-BK7 透镜即可给出约 100 mm 焦距。

import numpy as np from optiland.optic import Optic from optiland.diagnostics import check_system singlet = Optic(name="f/5 Singlet (baseline)") singlet.surfaces.add(index=0, thickness=np.inf) # 物面(无穷远) singlet.surfaces.add(index=1, radius=51.68, thickness=8.0, material="N-BK7", is_stop=True) # 前表面 singlet.surfaces.add(index=2, radius=np.inf, thickness=95.0) # 后表面 singlet.surfaces.add(index=3) # 像面 singlet.set_aperture(aperture_type="EPD", value=20.0) # f/5 singlet.fields.set_type("angle") singlet.fields.add(y=0.0) singlet.wavelengths.add(value=0.5876, is_primary=True) check_system(singlet) # 光路完整性检查,确保系统描述无遗漏 singlet.updater.image_solve() # 将像面移到近轴焦点

💡 Optiland 遵循 “after” 约定:thickness和material描述的是该表面之后的空间,而非表面本身。规则细节见 docs/conventions.rst。

结果如何?近轴 RMS 光斑半径约85 µm——超过 Airy 半径二十倍。一阶需求(焦距、口径)达标了,成像质量彻底失败。看三波长点列图就明白了:三个波长落在三个不同的焦面上,这就是轴向色差,靠怎么“弯”单片透镜都无法消除——这正是双胶合结构存在的理由。

调用lens.draw3D()可以随时获得这样的 3D 视图(基于 VTK),直观核对光路。

🔬 第三步:换结构——胶合双片校正色差

无色散双胶合透镜把一片正火石镜和一片负密晶镜胶合在一起。两种玻璃色散不同,组合起来可以让 F 光和 C 光聚焦到同一点,同时保持净正光焦度。本案例选用 N-BK7(冕牌玻璃)+ N-SF5(火石玻璃):

lens = Optic(name="Achromatic Doublet, f/5, EFL 100 mm") lens.surfaces.add(index=0, thickness=np.inf) # 物面 lens.surfaces.add(index=1, radius=61.0, thickness=8.0, material="N-BK7", is_stop=True) # 冕牌前表面 lens.surfaces.add(index=2, radius=-44.0, thickness=3.0, material="N-SF5") # 胶合面 lens.surfaces.add(index=3, radius=-129.0, thickness=95.0) # 火石后表面 lens.surfaces.add(index=4) # 像面 lens.updater.image_solve()

三个曲率半径定义了整个结构:冕牌前表面、胶合面、火石后表面。仅更换结构,近轴 RMS 光斑就从 ~85 µm 降到几微米——与 Airy 半径相当。全视场仍不够好,剩下的误差交给分析与优化处理。

📊 第四步:像差分析,点列图与光线扇形图定位残余误差

点列图(SpotDiagram)告诉你模糊有多大,光线扇形图(RayFan)告诉你是什么像差:曲线形状对应像差类型,不同波长曲线的分离程度对应该差含量。

from optiland.analysis import SpotDiagram, RayFan, RmsSpotSizeVsField SpotDiagram(lens).view() # 像点弥散程度 RayFan(lens).view() # 识别像差类型 RmsSpotSizeVsField(lens, num_fields=16).view() # RMS 光斑随视场变化

本案例的解读:近轴曲线近乎平坦、略带 S 形——残余球差加少量二级光谱;离轴曲线倾斜且相互分离——彗差与像面弯曲,且随视场角增大。分析框架完整实现在 optiland/analysis/ 目录。

🎯 第五步:透镜优化,三个曲率半径做变量、焦距做硬约束

Optiland 的优化永远是同三步:声明变量 → 声明操作数(“好”的定义)→ 交给优化器。焦距是需求不是偏好,所以给f2操作数高权重:

from optiland.optimization import OptimizationProblem, OptimizerGeneric problem = OptimizationProblem() # 1. 变量:三个自由曲率半径 for surface_number in (1, 2, 3): problem.add_variable(lens, "radius", surface_number=surface_number) # 2. 操作数:锁住焦距(硬约束,高权重) problem.add_operand("f2", target=100.0, weight=10.0, input_data={"optic": lens}) # 3 个视场 × 3 个波长的 RMS 光斑,目标为 0 for Hy in (0.0, 0.7, 1.0): for wl in (0.4861, 0.5876, 0.6563): problem.add_operand("rms_spot_size", target=0.0, weight=1.0, input_data={"optic": lens, "Hx": 0.0, "Hy": Hy, "wavelength": wl, "num_rings": 6, "surface_number": -1}) # 3. 交给优化器 OptimizerGeneric(problem).optimize(maxiter=200) lens.updater.image_solve() # 优化移动了焦点,重新对焦

优化后每个视场的光斑都比初始值更小。收益不算巨大——固定玻璃对的胶合双片自由度极少,知道什么时候一种结构已“榨干”本身就是设计功力。想更好就要换结构:拆开胶合面留空气间隔,或更换玻璃对(见 Glass Expert 案例 Tutorial_3e_Glass_Expert_Categorical_Optimization.ipynb)。优化框架源码在 optiland/optimization/。

🏭 第六步:公差分析,验证设计能经得起制造

只在标称参数下工作的设计不是设计。公差分析回答:当曲率半径、厚度、装调落在真实制造带宽内时,性能掉多少?

  • 灵敏度分析(Sensitivity):每次只扰动一个参数,找出最敏感的项——它决定你要给厂商提多严的公差;
  • 蒙特卡洛(Monte Carlo):从真实分布中同时扰动所有参数跑几百次,看结果分布。90 分位 RMS 光斑仍落在预算内,设计才可制造,该分布本身就是交付物。
from optiland.tolerancing import Tolerancing, SensitivityAnalysis tolerancing = Tolerancing(lens) # 示例:半径 ±0.5 mm 扫描(21 步)、厚度 7.9~8.1 mm、倾斜 ±0.002 rad # ... add_perturbation(...) 若干次 ... sensitivity = SensitivityAnalysis(tolerancing) sensitivity.run() sensitivity.view()

蒙特卡洛部分使用高斯分布(半径 1σ = 0.1% 标称值,倾斜 1σ ≈ 1 角分)跑 100 次,mc.view_histogram()直接出直方图。模块位于 optiland/tolerancing/。

📄 第七步:处方报告,一行代码生成完整交付文档

最后一步是生成可以交给同事或厂商的文档:每个面、每种材料、一阶参数、残余像差,一应俱全。

from optiland.prescription import Prescription Prescription(lens).view() # 控制台打印 Prescription(lens).save("report.pdf") # 保存为 PDF(其他扩展名导出纯文本)

Prescription默认包含 5 个 Section:

Section内容
SystemOverview系统总览:名称、口径、波长、视场
FirstOrder一阶性质:EFL、F 数、后截距等
SurfaceGeometryTable各面曲率半径与厚度表
SurfaceMaterialTable各面材料表
SeidelAberrationSectionSeidel 像差系数

核心实现在 optiland/prescription/prescription.py,各 Section 在 optiland/prescription/sections/,console / plain text / PDF 三种渲染器在 optiland/prescription/renderers/。需要定制报告时,传入自定义 Section 列表即可。

🖥️ 替代方案:用 GUI 走通同样的双胶合设计流程

不想写代码?Optiland 自带完整 GUI,同一个双胶合设计可以全程鼠标操作:Lens Data Editor 编辑面数据、System Properties 配置波长与口径、Analysis 窗口跑点列图,左侧栏还有 Optimization 与 Tolerancing 专用面板。

GUI 快速上手指南见 docs/gui_quickstart.rst。

🚀 下一步:从双胶合走向多片复杂系统

完成这个案例后,你已经拥有了完整的光学设计闭环。沿着官方案例继续走:

  • Tutorial_2c_Aberration_Analyses.ipynb——Seidel 系数、波像差,学会“读懂”像差;
  • Tutorial_2d_OPD_PSF_and_MTF_Calculations.ipynb——衍射级的 MTF/PSF,多数规格书真正使用的指标;
  • Tutorial_3d_Optimization_Case_Study_Cooke_Triplet.ipynb——把双片思路扩展到四片 Cooke 结构;
  • 完整学习路线图见 docs/learning_guide.rst 与任务式索引 docs/how_do_i.rst。

📁 附录:案例相关文件速查

文件 / 目录说明
docs/examples/Tutorial_1e_Design_a_Doublet_End_to_End.ipynb本文对应的完整端到端案例
optiland/prescription/处方报告生成模块
optiland/optimization/优化问题、操作数与优化器
optiland/analysis/点列图、光线扇形图等分析框架
optiland/tolerancing/灵敏度分析与蒙特卡洛公差
docs/quickstart.rst5 分钟快速上手
docs/conventions.rst面参数“after”约定详解

【免费下载链接】optiland

Comprehensive optical design, optimization, and analysis in Python, including GPU-accelerated and differentiable ray tracing via PyTorch.

项目地址:https://gitcode.com/gh_mirrors/op/optiland
点击查看免费下载

相关推荐

上一篇:使用 CAMEL Loong Cookbooks 构建 LLM 强化学习环境:单步环境、批量评估与多步博弈实战
下一篇:Zola 快速上手:用单个二进制静态站点生成器从零搭建博客

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询