设计准备:
实验工具
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(A′−A)×N=0 故可得
A
′
−
A
=
p
N
A ' - A = p N
A′−A=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=N⋅A′−N⋅A=n′cosI′−ncosI
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=N⋅A′−N⋅A=n′cosI′−ncosI
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=n′2−n2+n2cos2I−ncosI=n′2−n2+(N∙A)2−N∙A
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
:::