【免费下载链接】optiland
Comprehensive optical design, optimization, and analysis in Python, including GPU-accelerated and differentiable ray tracing via PyTorch.
Optiland 是一款用 Python 编写的开源光学设计、优化与分析工具。本文以官方端到端案例 “Design a Doublet, End to End” 为主线,带你走通无色散双胶合透镜(achromatic doublet)从需求定义到处方报告生成的完整设计流程——不需要切换任何商业软件,一个 Python 环境即可闭环。
为什么选双胶合透镜?它是最简单的“值得认真设计”的镜头:单片透镜无法消除轴向色差,而双胶合结构恰好是能校正色差的最小系统。本文的需求 → 一阶布局 → 分析 → 优化 → 公差分析 → 处方报告闭环,正是光学工程师的完整工作流程,官方案例见 Tutorial_1e_Design_a_Doublet_End_to_End.ipynb。
先安装环境:
pip install optiland📋 第一步:写下设计需求,确定“好”的量化标准
光学设计永远从一张需求表开始。本案例的双胶合透镜规格如下:
| 需求项 | 数值 |
|---|---|
| 有效焦距 EFL | 100 mm |
| 入瞳直径 EPD | 20 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 | 各面材料表 |
| SeidelAberrationSection | Seidel 像差系数 |
核心实现在 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.rst | 5 分钟快速上手 |
| docs/conventions.rst | 面参数“after”约定详解 |
【免费下载链接】optiland
Comprehensive optical design, optimization, and analysis in Python, including GPU-accelerated and differentiable ray tracing via PyTorch.
相关推荐
Optiland透镜属性与处方报告指南:如何读取一阶光学特性并生成专业设计报告
Optiland透镜属性与处方报告指南:如何读取一阶光学特性并生成专业设计报告 Optiland 是一个用 Python 实现的光学设计、优化与分析库(支持 P
如何永久保存微信聊天记录:WeChatMsg本地化数据守护完整指南
如何永久保存微信聊天记录:WeChatMsg本地化数据守护完整指南 你是否曾经因为手机更换、系统升级或意外删除而丢失了珍贵的微信聊天记录?那些与家人朋友的温馨对
CCG Workflow 的 ui-ux-designer 子智能体:从需求到可实施前端设计方案的完整实战指南
CCG Workflow 的 ui ux designer 子智能体:从需求到可实施前端设计方案的完整实战指南 导读 本文讲解 CCG Workflow 多模型
人工智能AI 应用AI Agent多智能体Agent 工作流开发工具CLIdsh-plugin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考