计算光学成像(COI)实验室技能——matlab控制thorlabs位移平台(ActiveX控件)

本文详细介绍了如何使用MATLAB代码控制Thorlabs位移平台,实现计算光学成像实验的自动化。通过步骤解析、示例代码展示,读者可以学习到从位移平台的初始化、运动控制到状态判断的全过程,并了解如何结合相机进行图像采集。此外,还提供了一个应用实例,展示了如何在不同位置自动采集图像。
摘要由CSDN通过智能技术生成

计算光学成像(COI)实验室技能——matlab控制thorlabs位移平台

  本文将介绍如何用matlab代码控制thorlabs位移平台(其他支持ActiveX控件的硬件实现方法类似)。通过代码控制位移平台可以实验采集任务的自动化,极大地提高实验效率和保证精度。本文介绍的内容包括:实验装置, 软件控制方法, matlab控制位移平台,以及使用示例。
在这里插入图片描述
  这个gif图展示了示例的结果,利用matlab控制位移平台(搭载了相机)在光轴方向上移动,而相机则在位移平台移动到指定位置时拍摄图片。下面将系统地介绍如何掌握这一技能。


  首先查阅了国内相关资源,没找到这项技术的全面介绍,这也是推动笔者想撰写此博客的原因,希望能帮助到更多的人。经过多方查阅,终于逐步地调试出了MATLAB控制位移平台的方法。整理了如下可参考资料:

  掌握了多项技术之后,不得不佩服国外大公司的生态系统做的好,提供的产品背后有完善的技术支持,拓展应用提供的很多。希望我们国家的技术、产品做得越来越好,基础和底层支持做得越来越完善。话不多说,上干货!

1. 位移平台(thorlabs)简介

在这里插入图片描述
  位移平台是实验中经常用到的仪器,它可以帮助我们精确地控制目标物、相机或其它设备的位移。这种位移功能在计算光学成像领域中有很多用处,比如强度传输方程(TIE)做相位恢复、基于不同衍射距离的GS相位恢复算法、基于位姿的多视点图像融合等,都需要位移平台控制相机在不同位置拍照。
  这款位移平台支持多种控制方法——硬件自身按键、自身控制软件、第三方软件控制。接上电后,设备侧面的按键可以直接控制位移平台的前后移动。

自身控制软件(Kinesis)

  软件安装包可直接在官网下载,安装时需要连接上位移平台,然后基本上一直“下一步”即可安装完成。其软件界面如下:
在这里插入图片描述
  打开软件后,点击连接按键连接位移平台。需要注意的界面按键已用红框标注。我们可以通过输入位置调节平台移动到某一确定位置,也可以按前后按钮进行调节。点击setting图标可以设置位移平台的运动参数(最大速度、加速度等等),操作起来很简单。

2. matlab控制thorlabs位移平台

本节将介绍如何解决以下问题:

  (1) 使用MATLAB代码初始化位移平台;
  (2) 使用MATLAB代码控制位移平台运动;
  (3) 判断运动是否结束;

  首先需要给电脑安装高级封装工具包(APT)。然后打开MATLAB执行下述脚本文件,其实现方法的基本流程为:创建全局变量 -> 创建figure,加载ActiveX控件 -> 初始化设备 -> 控制位移平台。
在这里插入图片描述
  安装完APT工具箱后,修改代码中产品序列号(可在kinesis界面查到),之后就可以运行下面代码控制位移平台了。

%% matlab控制位移平台

clc,clear;
close all; 

global h; % 创建一个可以在main函数之外使用的变量
          % Useful when you do event handling and sequential

%% 创建一个MATLAB的figure,用于加载ActiveX控件
fpos    = get(0,'DefaultFigurePosition'); % figure default position
fpos(3) = 650; % figure window size;Width
fpos(4) = 450; % Height
 
f = figure('Position', fpos,...
           'Menu','None',...
           'Name','APT GUI');

%% 创建ActiveX控制器
h = actxcontrol('MGMOTOR.MGMotorCtrl.1',[20 20 600 400 ], f);

%% 初始化
% 启动控制
h.StartCtrl;
 
% 加载产品序列号(可在自身软件界面查看)
SN = 45822682; % put in the serial number of the hardware
set(h,'HWSerialNum', SN);
 
% 识别设备
h.Identify;
pause(5); % 等待GUI加载完毕

% 创建事件句柄(位移完成后在命令行窗口打印“move completed!”)
h.registerevent({'MoveComplete' 'MoveCompleteHandler'});

%% 控制位移平台
% 位置归零
h.MoveHome(0,0); % 第一个0是设备标识,不同的ID可用于控制不同位移平台;
                 % 第二个0标识立即执行此命令;
h.SetAbsMovePos(0,150);	% 设置位移平台移动到150mm位置处,只运行此命令不会移动
h.MoveAbsolute(0,0);	% 使设备0立即位移到150mm的位置;

% 判断位移平台是否移动完毕
s = h.GetStatusBits_Bits(0);	% 获取硬件的状态信息
while IsMoving(s)	% 判定位移平台是否正在移动,是则返回1
	pause(0.1)
	s = h.GetStatusBits_Bits(0);
end
% 主程序结束,脚本中用到了两个函数,其定义如下:

在主程序的当前路径下,需要定义两个调用函数:

  1. 完成移动事件之后运行的函数
function MoveCompleteHandler(varargin)
	pause(0.5); %dummy program
	disp('Move Completed!');
  1. 判断位移平台移动状态的函数
function r = IsMoving(StatusBits)
% Read StatusBits returned by GetStatusBits_Bits method and determine if
% the motor shaft is moving; Return 1 if moving, return 0 if stationary
r = bitget(abs(StatusBits),5)||bitget(abs(StatusBits),6);

3. 应用实例:自动化采集不同位置的图像

  本节将介绍一个结合“MATLAB控制位移平台”和“MATLAB控制相机”的示例,它实现了自动采集不同位置图像的功能。
  代码实现流程:初始化位移平台 -> 初始化相机 -> 控制位移平台移动到指定位置 -> 控制相机采集图像 -> 按特定名称格式保存图片。实现结果如下:
在这里插入图片描述

clc, clear
close all

%% 位移平台初始化
global h;

% 创建图像窗口加载ActiveX控件
fpos = get(0,'DefaultFigurePosition');
fpos(3) = 650;
fpos(4) = 450;

f = figure( 'Position', fpos, 'Menu','None', 'Name', 'APT_GUI');

% 初始化位移平台
h = actxcontrol('MGMOTOR.MGMotorCtrl.1',[20 20 600 400],f);
h.StartCtrl;
SN = 45856286;
set(h, 'HWSerialNum', SN);
h.Identify;
h.registerevent({'MoveComplete' 'MoveCompleteHandler'});
pause(2);

%% 相机初始化
% get source
vid = videoinput('pcocameraadaptor_r2020a',0,'USB 3.0');
src = getselectedsource(vid);

% setting camera property
vid.FramesPerTrigger = 1;
exposure_time = 1000;   
src.E1ExposureTime_unit = 'us';
src.E2ExposureTime = exposure_time;

%% 开始采集
% 流程:设置位置 -> 拍照 -> 保存图片 -> 设置位置 -> 拍照 -> ...
for i = 1:300
    % setting position
    h.SetAbsMovePos(0,i);
    h.MoveAbsolute(0,0);
    while IsMoving(h.GetStatusBits_Bits(0))	% 判定
    end
    
    % capture image
    start(vid);
%     pause(max(exposure_time,25000)/1000000);    % 预留拍照时间
    img = getdata(vid);

	% save img
    imwrite(img,['./data/', num2str(i),'mm.tif']);
end

% 断开相机对象
delete(vid)

  在此代码的采集模块中,只展示了简单的拍照任务,如果读者有其他任务需求就可以在此基础上添加自己的算法。
  最后,欢迎各位读者学习交流,指出不足!本文由中国科学院上海光学精密机械研究所-计算光学成像实验室(司徒国海课题组)出品,是COI实验室基础技能专栏的系列文章之一。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

山颠海涯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值