使用流程

本章介绍使用Mech-Eye API控制轮廓测量仪的基本流程。本章图片及描述中使用C++ Mech-Eye API的类和方法名称,不同语言的对应名称详见代码示例。

operation workflow

发现

调用Profiler类中的discoverProfilers()方法枚举当前可连接的全部轮廓测量仪,并获取各个轮廓测量仪的信息。

  • C++

  • C#

std::vector<mmind::eye::ProfilerInfo> profilerInfoList = mmind::eye::Profiler::discoverProfilers();
var profilerInfoList = Profiler.DiscoverProfilers();
api_util.h头文件中提供了findAndConnect函数,可用于发现并连接轮廓测量仪。该函数可打印当前可连接的全部轮廓测量仪的信息,并可通过键盘输入编号的方式连接指定的轮廓测量仪。

连接

实例化Profiler类后,调用该类中的connect()方法,通过IP地址或由discoverProfilers()方法获取的设备信息连接对应的轮廓测量仪。

  • C++

  • C#

mmind::eye::Profiler profiler;
mmind::eye::ErrorStatusstatus = profiler.connect(profilerInfoList[inputIndex]);
mmind::eye::Profiler profiler;
mmind::eye::ErrorStatusstatus = 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类中的方法,选择轮廓测量仪的参数组并调节参数。

  1. 调用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]);
  2. 调用UserSet类中的getAvailableParameters()方法获取当前参数组中的全部参数信息,并确认各个参数的数据类型。

    • C++

    • C#

    mmind::eye::UserSet currentUserSet = profiler.currentUserSet();
    std::vector<Parameter*> parameters = currentUserSet.getAvailableParameters();
    var currentUserSet = profiler.CurrentUserSet();
    var parameters = currentUserSet.GetAvailableParameters();
  3. 调用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);
  4. 调用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);
  5. 调用UserSet类中的saveAllParametersToDevice()方法,将设置的参数值保存至轮廓测量仪中。

    • C++

    • C#

    auto status = currentUserSet.SaveAllParametersToDevice();
    var status = currentUserSet.SaveAllParametersToDevice();

开始采集

调用Profiler类中的startAcquisition()方法,使轮廓测量仪进入可接收扫描触发信号的数据采集状态。

  • C++

  • C#

auto status = profiler.startAcquisition();
status = profiler.triggerSoftware();
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);

停止采集

调用Profiler类中的stopAcquisition()方法,停止轮廓测量仪的数据采集状态,避免误触发扫描。

  • C++

  • C#

profiler.stopAcquisition();
profiler.StopAcquisition();

断开连接

调用Profiler类中的disconnect()方法,断开与当前轮廓测量仪的连接。

  • C++

  • C#

profiler.disconnect();
profiler.Disconnect();

本章介绍了使用Mech-Eye API控制轮廓测量仪的基本流程。下一章提供Mech-Eye API的参考手册。