使用deformable mirror 拟合zernike多项式

文章介绍了如何在MATLAB的Object-orientedMATLABAdaptiveOptics(OOMAO)平台上,使用DeformableMirror补偿像差,通过测量响应函数和Zernike系数,实现AO系统对高阶Zernike多项式的拟合,以提高光学系统的波前校正精度。

一、目的:使用DM拟合zernike多项式

Deformable mirror(DM)可以用于补偿哈特曼波前探测器(或者其他探测器)测得的像差,假定该像差为zernike多项式中的某些项,若要补偿掉这部分的像差,则DM就应该拟合出对应的面形。因此,本文将介绍如何在仿真中实现它。

使用工具介绍:MATLAB,Object-oriented Matlab adaptive optics(OOMAO)【GitHub - rconan/OOMAO: Object-Oriented, Matlab & Adaptive Optics

后者是一个adaptive optics (AO)仿真平台,可以完成望远镜系统中的AO校正像差的过程。

二、做法:

1. 测响应函数

       当 DM 表面被驱动器推动时,其实际产生的面形称为其响应函数即单独对一个驱动器施加恒定电压,使其镜面产生相应的形变后,平行光波经镜面反射再由 波特曼波前探测器(SHWFS)测得畸变波前的斜率值或 Zernike 系数。而整个 DM 的响应函数的测量,则通过对所有驱动器重复相同的操作,最终确定出恒定输入(电压值)和输出(斜率值或 Zernike 系数)之间的静态的线性映射。 可以参照【变形镜的Matlab仿真实现】这一篇进行理解。

2.AO 系统的校正原理

步骤1,t 时刻,相位为 φi(x, y, t) 的畸变波前入射到DM上;

步骤2,光束从DM反射并入射到 SHWFS,SHWFS测的波前斜率;

步骤3,在测得的斜率响应矩阵作用下,t时刻的波前斜率测量值 被转换成  施加到DM上的电压值;

步骤4,DM根据电压拟合出对应的面形,来抵消畸变波前中的一部分相位(PID算法),计算当前波前的RMS值。若RMS值 > 某一阈值,则重复 步骤1-2-3-4;

步骤5,RMS值是一种收敛的曲线,且已经达到了最低效果,此时校正完毕。

      使用AO系统拟合zernike多项式的原理也是如此,之所以要拟合zernike多项式的原因是:评价DM用于拟合高阶zernike多项式的品质,即能否保留下高频信息。

3.代码实现

使用21x21的DM,先测响应矩阵函数

clc;clear all ;close all
%{
    目的:用DM拟合zernike多项式;
    先测DM的的响应函数,根据根据哈特曼测得的斜率==> 驱动电压 
        ==> 施加到DM产生补偿面形。
%}
atm = atmosphere(photometry.V,0.15,30,...
    'altitude',[0,4,10]*1e3,...
    'fractionnalR0',[0.7,0.25,0.05],...
    'windSpeed',[5,10,20],...
    'windDirection',[0,pi/4,pi]);

nLenslet = 20;            
nPx      = nLenslet * 10; 
tel      = telescope(3.6,...
            'fieldOfViewInArcMin',2.5,...
            'resolution',nPx,...
            'samplingTime',1/300);
cam      = imager('diameter',tel.D, 'fieldStopSize',20,'nyquistSampling',8); 
ngs      = source('wavelength',photometry.J,'magnitude',5); 
wfs      = shackHartmann(nLenslet,nPx,0.75);
ngs      = ngs.*tel*wfs*cam;
wfs.INIT    
+wfs;
figure(1);imagesc(cam.frame);colormap(jet);colorbar;title('理想PSF')
bif       = influenceFunction('monotonic',50/100); 
nActuator = nLenslet + 1;       % 某一方向上的 驱动器个数 比 子透镜个数多1
dm        = deformableMirror(nActuator,...
                'modes',bif,...
                'resolution',nPx,...
                'validActuator',wfs.validActuator);

name = ['DMIM_',num2str(nActuator),'nActuators','.mat'];
if exist (name,'file') == 0
    fprintf('DM的响应函数不存在,计算中...\n')
    DM_mode = [];
    Sx      = [];
    figure(2)
    for i = 1:length(dm.coefs)
        dm.coefs(i)    = 0.3038*1e-7;
        ngs            = ngs.*tel *dm*wfs*cam; % ngs.*tel *dm*wfs*cam;
        Sx(:,i)        = wfs.slopes;
        DM_mode(:,:,i) = dm.surface;
        dm.coefs(i) = 0;
        ngs         = ngs.*tel *dm*wfs*cam;
    end
    Slope   = Sx / 0.3038 ;
    save(name, 'Slope','DM_mode')
else
    fprintf('响应函数已经存在,不计算\n')
    load(name)
end

figure(5);
subplot(121);imagesc(Slope);colorbar;colormap(jet)
subplot(122);imagesc(pinv(Slope));colorbar;colormap(jet)

再进行拟合实验

DMvot_total     = []; % 拟合多项式需要的电压
modes           = 35;
for j           = 1:35
    zernn       = zernike(2:modes+1,'resolution',nPx);
    C           = zeros(modes,1);
    C(j)        = 0.1 * 1e-6;       % 拟合第i个Zenrike
    zernn.c     = C;                
    ngs         = ngs.* zernn*wfs*cam ; 
    WF_ini      = ngs.meanRmPhase;  
    loopGain    = 0.030;
    row         = 2;
    column      = 3;
    figure(3)
    subplot(row,column,1);imagesc(WF_ini);colorbar;colormap(jet);title('待拟合出的WF,单位rad')
    subplot(row,column,4);imagesc(cam.frame);colormap(jet);colorbar;title('未用AO前的PSF图像')
    RMS_ini = std(WF_ini);
    i           = 1;
    RMS         = [];
    DM_vot      = [];
    flag        = 1;  
    while (flag == 1)
        ngs          = ngs * dm * wfs * cam; 
        dm.coefs     = 0.4*dm.coefs - loopGain* pinv(Slope) * wfs.slopes *1e-6; % 单位 要到um级别
        DM_vot(:,i)  = dm.coefs;

        subplot(row,column,5);imagesc(cam.frame);colormap(jet);colorbar;title('经过AO后校正后的PSF')
        subplot(row,column,2);imagesc(ngs.meanRmPhase);colorbar;colormap(jet);title('经过AO后校正残余波前')
        subplot(row,column,[3,6]);imagesc(WF_ini - ngs.meanRmPhase);colorbar;colormap(jet);title('拟合出的多项式')
        numm = ['第',num2str(i),'次的RMS = ',num2str( std(ngs.meanRmPhase(:)) )]
        RMS(:,i) = std(ngs.meanRmPhase(:));
        if ( i > 30 && (RMS(:,i-1) - RMS(:,i) < 1e-3) )
            flag = 0;
        end
        drawnow;
        pause(0.1)
        i = i+1;
    end
    DMvot_total(:,j) = sum(DM_vot,2) * 1e6 ;
end

三、结果

1. 拟合倾斜模式的情况

2.  拟合离焦模式情况

3. 其他模式,自己从github上下载OOMAO包,使用上述代码即可运行了哦。 

### RT-DETR中的可变形注意力机制 在RT-DETR中,为了增强模型对于不同尺度特征的感受野并提高其灵活性,采用了基于Deformable DETR的改进版本——即引入了可变形注意力机制。这种机制允许每个查询位置自适应地聚焦于输入图像的不同空间区域,从而更好地捕捉目标物体的关键部分。 具体来说,在标准的多头自注意层基础上加入了偏移量参数来调整采样点的位置。这些偏移量通过额外的学习过程获得,并且可以根据具体的任务需求动态变化。这使得即使是在复杂场景下也能更精准地定位和识别对象[^2]。 #### 实现细节 以下是关于如何在RT-DETR框架内集成deformable attention的具体步骤: 1. **定义偏移量生成模块**:创建一个新的子网络用于计算每个多头关注下的相对位移向量; 2. **修改原有的Attention Layer**:将传统固定网格替换为由上述子网输出指导的新坐标系; 3. **训练过程中更新权重**:确保整个系统的梯度能够回传至负责产生offsets的部分,以便优化它们的表现效果。 #### 示例代码 下面给出一段简化版Python伪代码片段展示怎样构建这样一个含有deformable attention组件的Transformer解码器单元: ```python import torch.nn as nn from torchvision.ops import DeformConv2d class DeformableAttnLayer(nn.Module): def __init__(self, d_model=256, nhead=8): super().__init__() self.offset_net = nn.Sequential( nn.Linear(d_model, 49 * 2), # 假设有7x7个采样点,则需预测两个方向上的偏移 nn.Tanh() ) self.deform_attn = MultiHeadedDeformableAttention(nhead=nhead) def forward(self, query, key, value): offsets = self.offset_net(query).view(-1, 49, 2) output = self.deform_attn(query=query, key=key, value=value, offset=offsets) return output def build_transformer_decoder_with_deformable_attention(): decoder_layer = TransformerDecoderLayerWithDeformableAttention(...) transformer_decoder = TransformerDecoder(decoder_layer, num_layers=...) return transformer_decoder ``` 此段代码展示了如何在一个简单的例子中加入deformable attention到现有的transformer架构里去。实际应用时还需要考虑更多因素如性能调优等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值