使用流程
本章介绍使用Mech-Eye API控制轮廓测量仪的基本流程。本章图片及描述中使用C++ Mech-Eye API的类和方法名称,不同语言的对应名称详见代码示例。
发现
调用Profiler
类中的discoverProfilers()
方法枚举当前可连接的全部轮廓测量仪,并获取各个轮廓测量仪的信息。
-
C++
-
C#
std::vector<mmind::eye::ProfilerInfo> profilerInfoList = mmind::eye::Profiler::discoverProfilers();
var profilerInfoList = Profiler.DiscoverProfilers();
连接
实例化Profiler
类后,调用该类中的connect()
方法,通过IP地址或由discoverProfilers()
方法获取的设备信息连接对应的轮廓测量仪。
-
C++
-
C#
mmind::eye::Profiler profiler;
mmind::eye::ErrorStatus status = profiler.connect(profilerInfoList[inputIndex]);
mmind::eye::Profiler profiler;
mmind::eye::ErrorStatus status = profiler.connect("192.168.0.10");
var profiler = new Profiler();
var status = profiler.Connect(profilerInfoList[inputIndex]);
var profiler = new Profiler();
var status = profiler.Connect("192.168.0.10");
配置
调用UserSetManager
类和UserSet
类中的方法,选择轮廓测量仪的参数组并调节参数。
-
调用
UserSetManager
类中的selectUserSet
方法选择需使用的参数组。可通过该类中的 getAllUserSetNames()
方法获取轮廓测量仪所有可用参数组。-
C++
-
C#
mmind::eye::UserSetManager userSetManager = profiler.userSetManager(); std::vector<std::string> userSets; auto status = userSetManager.getAllUserSetNames(userSets); status = userSetManager.selectUserSet(userSets.front());
var userSetManager = profiler.UserSetManager(); List<string> userSets = new List<string>(); var status = userSetManager.GetAllUserSetNames(ref userSets); status = userSetManager.SelectUserSet(userSets[0]);
-
-
调用
UserSet
类中的getAvailableParameters()
方法获取当前参数组中的全部参数信息,并确认各个参数的数据类型。-
C++
-
C#
mmind::eye::UserSet currentUserSet = profiler.currentUserSet(); std::vector<Parameter*> parameters = currentUserSet.getAvailableParameters();
var currentUserSet = profiler.CurrentUserSet(); var parameters = currentUserSet.GetAvailableParameters();
-
-
调用
UserSet
类中的getIntValue()
及类似方法,获取某一参数当前的值。-
C++
-
C#
int exposureTime = 0; auto status = currentUserSet.getIntValue(mmind::eye::brightness_settings::ExposureTime::name, exposureTime);
int exposureTime = 0; var status = currentUserSet.GetIntValue(MMind.Eye.BrightnessSettings.ExposureTime.Name, ref exposureTime);
-
-
调用
UserSet
类中的setIntValue()
及类似方法,设置某一参数的值。-
C++
-
C#
auto status = currentUserSet.setIntValue(mmind::eye::brightness_settings::ExposureTime::name, 20);
var status = currentUserSet.SetIntValue(MMind.Eye.BrightnessSettings.ExposureTime.Name, 20);
-
-
调用
UserSet
类中的saveAllParametersToDevice()
方法,将设置的参数值保存至轮廓测量仪中。-
C++
-
C#
auto status = currentUserSet.SaveAllParametersToDevice();
var status = currentUserSet.SaveAllParametersToDevice();
-
开始采集
调用Profiler
类中的startAcquisition()
方法,使轮廓测量仪进入可接收扫描触发信号的采集就绪状态。
-
如由外部输入信号触发数据采集,轮廓测量仪接收到信号后即开始扫描。
-
C++
-
C#
const auto status = currentUserSet.setEnumValue( mmind::eye::trigger_settings::DataAcquisitionTriggerSource::name, static_cast<int>(mmind::eye::trigger_settings::DataAcquisitionTriggerSource::Value::External)); auto status = profiler.startAcquisition();
var status = currentUserSet.SetEnumValue( MMind.Eye.TriggerSettings.DataAcquisitionTriggerSource.Name, (int)MMind.Eye.TriggerSettings.DataAcquisitionTriggerSource.Value.External); var status = profiler.StartAcquisition();
-
-
如使用软触发方式触发数据采集,则需调用
Profiler
类中的triggerSoftware()
方法触发扫描。-
C++
-
C#
const auto status = currentUserSet.setEnumValue( mmind::eye::trigger_settings::DataAcquisitionTriggerSource::name, static_cast<int>(mmind::eye::trigger_settings::DataAcquisitionTriggerSource::Value::Software)); auto status = profiler.startAcquisition(); status = profiler.triggerSoftware();
var status = currentUserSet.SetEnumValue( MMind.Eye.TriggerSettings.DataAcquisitionTriggerSource.Name, (int)MMind.Eye.TriggerSettings.DataAcquisitionTriggerSource.Value.Software); var status = profiler.StartAcquisition(); status = profiler.TriggerSoftware();
-
获取数据
轮廓测量仪进行一轮数据采集所获取的数据将分批次(batch)返回。需先获取全部批次的数据,再生成强度图和深度图。
可通过两种方式从轮廓测量仪获取数据:
-
调用
Profiler
类中的retrieveBatchData()
方法,调用一次可获取一个批次的数据; -
定义回调函数,并调用
Profiler
类中的registerAcquisitionCallBack()
方法注册回调函数。须在调用 startAcquisition()
方法前定义及注册回调函数。
以下为两种数据获取方式的示例代码。
-
调用
Profiler
类中的retrieveBatchData()
方法:-
C++
-
C#
int dataWidth = 0; auto status = currentUserSet.getIntValue(mmind::eye::scan_settings::DataPointsPerProfile::name, dataWidth); mmind::eye::ProfileBatch batch(dataWidth); status = profiler.retrieveBatchData(batch);
int dataWidth = 0; var status = currentUserSet.GetIntValue(MMind.Eye.ScanSettings.DataPointsPerProfile.Name, ref dataWidth); var batch = new ProfileBatch((ulong)dataWidth); MMind.Eye.ErrorStatus status = profiler.RetrieveBatchData(ref batch);
-
-
使用回调函数:
-
C++
-
C#
namespace{ std::mutex kMutex; void callbackFunc(const mmind::eye::ProfileBatch& batch, void* pUser) { std::unique_lock<std::mutex> lock(kMutex); auto* outPutBatch = static_cast<mmind::eye::ProfileBatch*>(pUser); outPutBatch->append(batch); } } int dataPoints = 0; showError(currentUserSet.getIntValue(mmind::eye::scan_settings::DataPointsPerProfile::name, dataPoints)); mmind::eye::ProfileBatch profileBatch(dataPoints); profiler.registerAcquisitionCallback(callbackFunc, &profileBatch);
private static readonly Mutex mut = new Mutex(); private static void CallbackFunc(ref ProfileBatch batch, IntPtr pUser) { mut.WaitOne(); GCHandle handle = GCHandle.FromIntPtr(pUser); var outputBatch = (handle.Target as ProfileBatch); outputBatch.Append(batch); mut.ReleaseMutex(); } int dataPoints = 0; Utils.ShowError(currentUserSet.GetIntValue(MMind.Eye.ScanSettings.DataPointsPerProfile.Name, ref dataPoints)); var profileBatch = new ProfileBatch((ulong)dataPoints); GCHandle handle = GCHandle.Alloc(profileBatch); IntPtr param = (IntPtr)handle; profiler.RegisterAcquisitionCallback(CallbackFunc, param);
-