ZEMAX | 使用API模擬旋轉(zhuǎn)對(duì)稱不規(guī)則性(RSI)
繼上次的內(nèi)容《ZEMAX | 旋轉(zhuǎn)對(duì)稱不規(guī)則性(RSI)簡(jiǎn)介》,在這篇文章中,我們將展示 Zemax 應(yīng)用程序編程接口(ZOS-API)與 Matlab 的強(qiáng)大功能如何用于模擬關(guān)鍵制造缺陷,例如拋物面鏡上的旋轉(zhuǎn)對(duì)稱不規(guī)則性(RSI)。

旋轉(zhuǎn)對(duì)稱不規(guī)則性(RSI)?是指光學(xué)表面形狀中的一組旋轉(zhuǎn)對(duì)稱誤差。誤差由 Zernike 多項(xiàng)式表示,具有三階球差和高階球差的形式。
拋物面鏡示例
我們將演示如何向拋物面鏡添加 RSI 和總不規(guī)則性。示例為F/3,有效焦距為150 mm的反射鏡。


為了演示,我們將根據(jù)以下規(guī)范在表面上添加總不規(guī)則性和 RSI :

關(guān)于此規(guī)范的更多信息請(qǐng)查看,旋轉(zhuǎn)對(duì)稱不規(guī)則性(RSI)簡(jiǎn)介。
這將在表面上放置1個(gè)完全不規(guī)則的P-V波,以及0.3個(gè)P-V波的PSI。以納米為單位,這將是500 nm的總表面不規(guī)則性和150 nm的RSI。
代碼結(jié)構(gòu)
我們創(chuàng)建了示例 Matlab 代碼來(lái)對(duì) RSI 進(jìn)行建模。此代碼包括與建模不規(guī)則性和RSI 相關(guān)的函數(shù)。函數(shù) prepare surface 將標(biāo)準(zhǔn)或均勻非球面表面更改為 Zernike ?標(biāo)準(zhǔn)凹陷表面。還包括幾個(gè)基本的支持功能,例如用于顯示來(lái)自.ZMX文件的鏡頭數(shù)據(jù)編輯器 (LDE) 信息的顯示LDE。
最重要的函數(shù)是 AddBC(表面數(shù),波長(zhǎng),B,C),其中B是最大總表面不規(guī)則度,C是最大允許 RSI。AddBC 函數(shù)的工作原理如下:
為RSI項(xiàng)分配隨機(jī)值:Z11、Z22、Z37和Z56。
檢查RMS表面誤差。
縮放以達(dá)到C的正確值。
這僅需要一次縮放,因?yàn)閷⒚總€(gè)Zernike系數(shù)縮放一個(gè)常數(shù)會(huì)使RMS縮放相同的常數(shù)。
將隨機(jī)值分配給模型B的其他Zernike多項(xiàng)式,完全不規(guī)則。
在不干擾RSI項(xiàng)的值的情況下使用:Z11、Z22、Z37和Z56。
使用Z5 – Z37模擬總不規(guī)則性。
迭代縮放Zernike項(xiàng)以達(dá)到正確的總不規(guī)則性。
在交互模式下運(yùn)行Matlab示例代碼
與Matlab的API交互模式很方便,因?yàn)槟梢允褂?Matlab 命令行控制 API。這使您可以即時(shí)嘗試新命令和更改命令。
您可以從編程選項(xiàng)卡中選擇 Matlab,然后選擇交互式擴(kuò)展,以交互模式進(jìn)行連接,如下所示:

連接代碼將自動(dòng)打開:

回到 OpticStudio,單擊變成選項(xiàng)卡上的“交互式擴(kuò)展”將使 OpticStudio 進(jìn)入“偵聽”模式。

在 Matlab 中,現(xiàn)在可以使用以下命令進(jìn)行連接:
>> TheApplication = MATLABZOSConnection9(7)
請(qǐng)注意,您的 MATLABZOSConnection 編號(hào)和實(shí)例可能與此處給出的不同。例如,如果這是您第一次連接,您可能有 MATLABZOSConnection(1)。

使用Matlab模擬RSI
建立連接后,我們可以從 Matlab 命令行加載 .ZMX 文件并從文件中收集信息,如下所示:
>> primary system = TheApplication.PrimarySystem
>> theLDE = primarySystem.LDE
>> theMFE = primarySystem.MFE
>> systemData = primarySystem.SystemData
>> savefilename = System.String.Concat
(pwd,'\LensFileForTesting.zmx')
>> primarySystem.SaveAs(savefilename)
所有必需的函數(shù)都包含在文件 ErinsABCFunctions.m 中。通過(guò)在 Matlab 中打開它,我們可以加載各個(gè)函數(shù)。
>> abc = ErinsABCFunctions
我們通過(guò)將其更改為 Zernike 標(biāo)準(zhǔn)凹陷表面來(lái)預(yù)設(shè)表面。
>> ldetable = abc.displayLDE(primarySystem); disp(ldetable);
>> surfacetable = abc.prepareSurface(primarySystem,3);
disp(surfacetable);
上述兩個(gè)命令的輸出如下所示:


稍后,我們將設(shè)定鏡面的起始缺陷。
>> startingsag = abc.getSag(primarySystem,3);
>> figure(); imagesc(startingsag); axis square;

現(xiàn)在我們可以使用 AddBC 添加 B和C 的表面不規(guī)則性。
>> bctable = abc.AddBC( primarySystem, 3, 500.0, 1, 0.3);
>> disp( bctable);

請(qǐng)注意,此時(shí),如果我們正在運(yùn)行公差,我們可以在調(diào)用 AddBC 時(shí)為 B和C 選擇隨機(jī)值。收集鏡子的擾動(dòng)缺陷,并減去起始缺陷,使表面誤差擾動(dòng)可見。
>> bcsag = abc.getSag( primarySystem, 3);
>> sagdiff = bcsag-startingsag;
>> figure(); imagesc( sagdiff ); axis square;

我們也可以檢查這些表面誤差的最終P-V。
>> abs(max( sagdiff(:))-min( sagdiff(:))?
/ (500*10^-6))
該值為0.995,而不是我們要求的B = 1.000。這是與縮放 Zernikes 的迭代期間使用的精度設(shè)置有關(guān)。更嚴(yán)格的精度設(shè)置將返回更接近1.000的結(jié)果,但計(jì)算時(shí)間會(huì)更長(zhǎng)。
完成模擬后,我們關(guān)閉交互模式。
>> TheApplication.CloseApplication()