SMS(同步多表面光学设计)

设计准备:

实验工具

MATLAB 2021b ; solidworks 2021 ; TracePro;

设计要求

同步设计一个透镜,使得光源的光经过透镜能够在接受面形成光斑。

设计原理

矢量形式的反射定律

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f2QhXmeE-1652974515500)(imgs/示意图.png)]{#fig:
width=“0.8\linewidth”}

A 0 A_0 A0, A ′ A' A N N N分别为沿着入射光线、折射光线和法线的单位矢量。根据折射定律有
n ′ ( A 0 ′ × N ) = n ( A 0 × N ) n ' ( A ' _ { 0 } \times N ) = n ( A _ { 0 } \times N ) n(A0×N)=n(A0×N)

A A A记为 n A 0 nA_0 nA0, A ′ A^{'} A记为 n A 0 ′ nA_0^{'} nA0,则可得 A ′ × N = A × N ( A ′ − A ) × N = 0 \begin{array}{l} A^{\prime} \times N=A \times N \\ \left(A^{\prime}-A\right) \times N=0 \end{array} A×N=A×N(AA)×N=0 故可得

A ′ − A = p N A ' - A = p N AA=pN
则根据此公式可以利用折射光线,入射光线的光学动量求解出法线的向量。

P = N ⋅ A ′ − N ⋅ A = n ′ cos ⁡ I ′ − n c o s I P=N \cdot A^{\prime}-N \cdot A=n^{\prime} \cos I^{\prime}-n c o s I P=NANA=ncosIncosI

P = N ⋅ A ′ − N ⋅ A = n ′ cos ⁡ I ′ − n cos ⁡ I P = N \cdot A ' - N \cdot A = n ' \cos I ' - n \cos I P=NANA=ncosIncosI

P = n ′ 2 − n 2 + n 2 cos ⁡ 2 I − n cos ⁡ I = n ′ 2 − n 2 + ( N ∙ A ) 2 − N ∙ A P = \sqrt { n ^ {' 2 } - n ^ { 2 } + n ^ { 2 } \cos ^ { 2 } I } - n \cos I =\sqrt { n ^ { '2 } - n ^ { 2 } + ( N \bullet A ) ^ { 2 } } - N \bullet A P=n2n2+n2cos2I ncosI=n2n2+(NA)2 NA

A ′ = A + p N A^{'}=A+pN A=A+pN 故可以根据入射光线和法线可以求解折射光线。

多表面同步

根据透镜的上顶点,以及光线经上顶点后在透镜的路程,根据折射定律可以确定光线在透镜下表面的折射点以及法线方向。

再根据等光程的原则,从接受面的另一侧为光线的起点,透镜下表面的折射点为折射点,可以求解出透镜上表面的另一个点。不断反复上述的操作,可以确定几个透镜的关键节点。

透镜的生成需要更多的数据,所以需要根据这些节点生成更多的透镜表面的点。常见的方法有多项式拟合(不过效果不好);根据法线方向以及节点的位置NURBS
方法来拟合透镜的表面;
根据透镜下表面的第一个点的位置即法线方向,采用圆弧来作为透镜下表面,跟这些点,再根据等光程计算出采用和关键节点一样的方法计算出透镜的表面。

本文采用了第三种方法。

等光程

在确定光线从透镜上顶点经过透镜,再经折射射到接受面的边缘,可以计算出整个过程的光程。sms的一个重要原则就是等光程,后面光线的计算,如光线在透镜中的光程,光线的在另一个表面的折射点等都需要经过等光程来计算。

O P L = [ B P 0 ] + n [ P 0 Q 1 ] + Q 1 E ] = [ F Q ] + n [ Q 1 ] + [ P i A ] = [ B P 1 ] + n [ P P 0 ] + [ Q . t ] \begin{aligned} O P L &=[B P_0]+n\left[P_{0 } Q_1\right]+Q_1 E] \\ &=[F Q]+n \left[Q_{1}\right]+\left[P_{i A}\right] \\ &=\left[B P_{1}\right]+n\left[P P_{0}\right]+[Q . t] \end{aligned} OPL=[BP0]+n[P0Q1]+Q1E]=[FQ]+n[Q1]+[PiA]=[BP1]+n[PP0]+[Q.t]

在这里插入图片描述

操作步骤:

本实验的操作步骤如下:

1 、根据sms的基本原理, 利用设计方法生成几个关键的节点。

2、
根据关键节点,在对下表面进行圆弧拟合,再利用圆弧上的点,根据等光程原则,继续计算其他点,得到更多的透镜节点。

3 、利用MATLAB编程求解反射面的光学母线数据。

4、将上一步所得到的光学母线导入到solidworks中,进行三维建模得到反射面。将三维模型保存为sat文件。

5 、将sat文件导入到TracePro,添加 0.5mm 乘以05
mm大小的LED光源(光源类型为朗伯型),接收面。

6、进行光学仿真

7、优化分析,根据合理的方法确定透镜上表面顶点位置,以及光线在该点折射后在透镜的光程这两个参数。可以采用智能算法来求解。

::: appendix

主程序

%sms主程序
%利用智能算法找出最优的初值
clc;
clear ;
close all;

a=250;
b=500;
H=1000;
% p0=[0,-H*(1-0.7653)];
p0=[0,-H*0.2447];
len=H*0.18;
% p0=[0,-H*0.2547];
% len=H*0.18;
[m_total,site_all_p,N_all_p,optical_path]=principal_dot(a,b,H,p0,len);
plot(site_all_p(1:2:end-1,1),site_all_p(1:2:end-1,2))
hold on
plot(site_all_p(2:2:end-1,1),site_all_p(2:2:end-1,2))






子程序:principal_dot.m

%已知第一个折射点,法线方向
%根据sms 确定所有的关键节点
%p0 :表示入射光在上表面所在的点
%Len:表示光线在透镜的长度

%h:透镜上顶点到光源的距离
%H:透镜到接受面的距离
%a:表示光源的半径
%b:接受面的半径
%该函数以竖直向上为y轴正方向
%以水平向右为x轴正方向
%该光线均在x轴下

%输出参数
%m_total:记录所寻找到的点的总个数
%site_all:透镜表面所有点的坐标
%N_all:透镜表面所有点的法向量
function [m_total,site_all,N_all,optical_path]=principal_dot(a,b,H,p0,len)
%%空气与介质的折射率

n=1;
n_prime=1.5;
site_a_l=[-b,-H];
%% 光线入射透镜的上表面的中点的折射
%(折射定律的矢量形式(公式见工程光学(郁道银、谈恒英)第一章))
%A_prime 表示折射光线(长度为n'的矢量)
%A:表示入射光线的向量(长度为n 的矢量)
%:N:表示法矢量
N=[0,-1];
%入射光线的矢量形式
A=p0-[a,0];%[a,0]光源右边缘的点
A=A/norm(A)*n;
P=sqrt(n_prime^2-n^2+(N*A')^2) -N*A';
%A_u_prime 上表面折射光线的单位矢量
A_u_prime=A+P*N;

%% 根据长度计算下表面的折射光线,以及折射的法矢量
%计算下表面的折射点
%q1:下表面的折射点
q1=p0+A_u_prime*len/n_prime;%由于光线的矢量的模(即长度)
% 为折射率,所以需除以折射率

%A_d_prime下表面折射光线的矢量形式
A_d_prime=(site_a_l-q1);%接受面左边的点
A_d_prime=A_d_prime/norm(A_d_prime)*n;


%计算q1的法矢量,法矢量的计算公式见工程光学(郁道银、谈恒英)第一章)
%
N_q1=-(A_d_prime-A_u_prime);%上表面的折射光线,即为下表面的入射光线
N_q1=N_q1/norm(N_q1);%归一化

%记录透镜上表面的点集合
Site_p=p0;
%记录透镜下表面点的集合
Site_q=q1;

%计算光程
optical_path=norm(q1-site_a_l)*n+len*n_prime +n*norm(p0-[a,0]);

%% 根据等光程,求解其余的点
%光源,接受面的边缘点坐标矩阵Site
%为了方便,按接受面右边界的点,光源右边界的点
% ,光源左边界的点,接受面左边界的点  排序
Site=[b,-H;-a,0;a,0;-b,-H;];
%N_s_all:随后计算的所有点的法向量
%site_s_all:随后计算的所有点的坐标
[N_s_all,site_s_all] = subsequent_dot(Site,q1,N_q1,optical_path);

[m,~]=size(N_s_all);
m_total=m+1;
%N_all:所有点的法向量
%site_all :所有点的坐标
N_all=[[0,-1];N_q1;N_s_all];
site_all=[p0;q1;site_s_all];
return

子程序:subsequent_dot.m

%已知光程,折射点,及其法向量,计算所有的点
%根据等光程,求解其余的点
%光源,接受面的边缘点坐标矩阵Site
%Site 按照一定的顺序排列
%site_p1 折射点(光线引出点发生的第一次折射所在的点为p1_temp)坐标
% N_p1:折射点的法线方向
%m 迭代次数

function [N_all,site_all]=subsequent_dot(Site,site_p1,N_p1 ,optical_path,m)
if nargin==4
    Iteration_num=50;
else
    Iteration_num=m;
end
%透镜和空气的折射率
n_prime=1.5;
n=1;

% %Criteria:判断是否循环是否继续
% Criteria =1;
N1_temp=-N_p1;%因为每次光线入射时,入射光线的方向会变化
%p_temp :每次循环第一个折射点
p1_temp=site_p1;
% ,所以相较于前一次,法向量的方向相反
%k:site涉及到点的选取
k=0;
%记录坐标,法向量的矩阵初始化
site_all=[];
N_all=[];

while 1

    %(折射定律的矢量形式(公式见工程光学(郁道银、谈恒英)第一章))
    %A_temp_f 表示折射光线(长度为n'的矢量),即光学动量
    %A_temp:表示入射光线的向量(长度为n 的矢量),即光学动量
    % A_temp_s 表示第二次折射光线的向量(长度为n 的矢量),即光学动量
    %光线结束的起始点p_start
    p_start=Site(k*2+1,:);

    %光线结束的终点p_end
    p_end=Site(k*2+2,:);

    %入射光线的矢量形式
    A_temp=p1_temp-p_start;%
    A_temp=A_temp/norm(A_temp)*n;

    P=sqrt(n_prime^2-n^2+(N1_temp*A_temp')^2) -N1_temp*A_temp';
    %A_temp_f 光线在第一次折射时,折射光线的单位矢量
    A_temp_f=A_temp+P*N1_temp;

    %% 根据等光程求解第二次折射的折射方向,在透镜中的路程

    %% 用A_temp_f,p1_temp,N1_temp,optical_path
    %求解下一个折射点p2_temp,N2_temp
    % 判断是否有解,如有解则继续,反之,推出循环

    %len p2_temp到p1_temp的长度,即光在透镜的传播距离

    %A_temp_f 的长度即为折射率,所以该向量乘以光在透镜中的传播长度
    % 的向量的模长就等价于光程

    eqn =@(len) norm(len*A_temp_f)+ norm(p1_temp-p_start)+...
        norm(p_end-(p1_temp+len*A_temp_f/n_prime) ) -optical_path;
    [s_len,~,exitflag] = fsolve(eqn,200);
    
    %%m_temp 读取点的个数
    [m_temp,~]=size(site_all);

    %判断是否有实数解
    if (exitflag <=0 || m_temp >Iteration_num )
        break
    end



    %% 计算法向量
    %p2_temp 第二个折射点的求解
    p2_temp= A_temp_f*s_len/n_prime+p1_temp;

    %第二次折射的折射光的光学动量
    A_temp_s=p_end-p2_temp;
    %归一化,并计算光学动量
    %空气的折射率为1,所以n可以不乘
    A_temp_s=A_temp_s/norm(A_temp_s)*n ;
    %根据矢量形式的折射定律,求解法矢量
    N2_temp=-(A_temp_s-A_temp_f);
    %归一化
    N2_temp=N2_temp/norm(N2_temp);
    %% 法向量,折射点坐标记录
    site_all=[site_all;p2_temp];
    N_all=[N_all;N2_temp];

    %% 更新下次循环的折射点,法线方向
    p1_temp=p2_temp;
    N1_temp=-N2_temp; %光线方向不同,每次法线方向需改变方向
    %% k取反,使得取另一个起点,终点
    k=~k;

end

:::
_s=A_temp_s/norm(A_temp_s)*n ;
%根据矢量形式的折射定律,求解法矢量
N2_temp=-(A_temp_s-A_temp_f);
%归一化
N2_temp=N2_temp/norm(N2_temp);
%% 法向量,折射点坐标记录
site_all=[site_all;p2_temp];
N_all=[N_all;N2_temp];

%% 更新下次循环的折射点,法线方向
p1_temp=p2_temp;
N1_temp=-N2_temp; %光线方向不同,每次法线方向需改变方向
%% k取反,使得取另一个起点,终点
k=~k;

end

:::
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在追逐路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值