LoginSignup
35
31

More than 3 years have passed since last update.

カメラ好きのためにレンズ設計シミュレーションの紹介

Last updated at Posted at 2019-03-23

はじめに

カメクラ+プログラマー->光学シミュレーション
ってことでオープンソースの光学シミュレーションライブラリopticspyの紹介です。
http://opticspy.org/
光学シミュレーションは、ZEMAX OpticStudio等の有料のものはありますが無料のものは珍しいみたいですね。

レンズ構成図

スポットダイアグラム1

収差図2

なんかが作れます。

他にも光学系の計算に使用するゼルニケ多項式や波長や位相差を測定する干渉計が使える模様(光学に関してド素人なのでそっちは触ってません)。

環境

  • Python3.6
  • Jupyter Notebook

導入

PyPIからだと2.x用がインストールされてしまうので
github Sterncat/opticspy から3.x用をクローン

# pip install git+git://github.com/Sterncat/opticspy.git@master

としたいところですが今回のチュートリアルが完了できないバグがあります。
修正してプルリクエスト済みですが、マージされるまでは以下を使ってください。
github HijiriIshi/opticspy

Jupyter Notebookrootで起動しないとダメ。

# jupyter notebook --allow-root

glass_databaseに関して

ガラス素材の材質をymlで定義することができます。
基本的な材質はglass_databaseに用意されています。

しかしながら、執筆時点でSterncat/opticspyだとinstallパッケージにglass_databaseは含まれません。
https://github.com/Sterncat/opticspy/tree/master/opticspy/ray_tracing/glass_database

そのためチュートリアルを行うにはリポジトリからフォルダをコピーする必要があります。
場所はパッケージインストール先のopticspy/ray_tracing/glass_databaseです。

# pip show opticspy
Name: opticspy
Version: 0.2.1
Summary: Python optics module
Home-page: http://opticspy.org
Author: Xing Fan
Author-email: marvin.fanxing@gmail.com
License: MIT License
Location: /usr/lib/python3.6/site-packages
Requires: numpy, matplotlib, unwrap
Required-by:

上記の場合は/usr/lib/python3.6/site-packages/opticspy/ray_tracing/glass_databaseとなります。

この位置やめたほうが良くない?とは思いますが、参照先を定義しているopticspy\opticspy\ray_tracing\glass_function\refractiveIndex.pyが修正途中のようなのでノータッチ。

パッケージに含めることの是非はおいといてHijiriIshi/opticspyではglass_databaseを含めています。

レンズデザインのチュートリアル

チュートリアルが公式サイトに用意されています。
光学専門用語が含まれるので取っつきやすいようにReal ray tracing and Lens DesignよりExample 1: Basic functions introductionの冒頭部分と見出しを和訳しました。

Opticspyは解析だけではなくレイトレーシングモジュール、単焦点レンズ設計モジュールを提供します。
1. レンズ面、波長、フィールドを追加してレンズ系を構築する
2. 光線追跡、レンズ系の描画
3. レンズ系の解析:スポットダイアグラムと収差図(レイファンプロットダイアグラム)
4. システムを通したレイトレーシング
5. ABCD行列モジュールによるLens paraxial information(収差を出さない理想レンズ? 直訳: レンズ近軸情報)の計算

次に示すのが、opticspyのレイトレーシングモジュールを使用して最大視野角20度のF/5トリプレット3を構築する例です。レンズ系のスポットダイアグラムと収差図が表示されます。
1. 表面、波長、フィールドを追加することにより、レンズ系を構築する。
2. レイトレーシングを行いレンズ系を描画する(最初にrefresh_paraxial関数で入射瞳位置4を見つける)
3. レンズ系解析:スポットダイアグラムと収差図
Opticspyは3種類のトレーシンググリッドを提供します
* 格子状: n本の光線が軸に沿った配置で入射瞳を通過します
* 円形状: n本の光線が円環を描いた配置で入射瞳を通過します
* ランダム: n本の光線がランダムな配置で入射瞳を通過します
4. システムを介したレイトレーシング:ユーザはレイトレーシングを行うにあたり(入射瞳に対する)光線の位置、視野および波長を指定することができる。ユーザは、出力形式を選択することができ、また、線位置出力X、Y、Z及び光線方向出力K、M、L、ならびに開始および終了面を指定することができる。
5. ABCDマトリックスモジュールによるレンズ近軸情報の計算:像位置、有効焦点距離、後側焦点距離、入射瞳位置と直径、射出瞳位置、面xからyまでの焦点距離、2面間の厚さなど。

おわりに

Real ray tracing and Lens Designの他のチュートリアルに関して触れると、
* Example 2: A double gauss lens example : Example 1のダブルガウス版
* Example 3: Build a Petzval lens with codev seq file : レンズ構成を定義した.seqファイルの読込
* Example 4: Build a microscope lens with codev seq file : Example 3のマイクロスコープ版
チュートリアルで使用する
.seqファイルはこちらにあります。

参考リンクに有名なレンズ構成が紹介されているサイトや、光学の基礎が学べるサイトへのリンクを載せました。
いろんなレンズを作って遊ぼう!

参考リンク


  1. 光源から像面まで多数の光線追跡を行い、像面上の光線到達位置をプロットしたものがスポットダイアグラムです。集光度合いや収差の幾何光学的な振る舞いを視覚的に把握するのに適しています。(スポットダイアグラム:光学総合サイト:サイバネット) 

  2. 収差図を見るとレンズの性能だけでなくボケの味などもおおざっぱに分かるようになります。(・球面収差と縦収差図の見かた:虹色の旋律) 

  3. 3群3枚の写真レンズの構成様式 

  4. 開口絞り(絞り面参照)より物体側の光学系で結像された開口絞りの像を入射瞳と呼びます。また、物体空間上での主光線をそのまま延長し、光軸と交わる位置が入射瞳位置になります。(入射瞳:光学総合サイト:サイバネット) 

35
31
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
31