[TSG開發]法如掃描器SDK探幽-1.舊版SDK採集流程、問題解析、常見引數

2023-05-31 12:00:21

做什麼

法如掃描器是一個三維的鐳射掃描器,可以通過特定的作業模式將空間以三維鐳射點雲的形式儲存下來,並且通過特定的演演算法得出一些想要的具體引數。

這個SDK探幽紀錄檔主要是對目前SDK開發中遇到的一些問題做個記錄,以及對未來開發的一些指導,只是在業餘時間簡單寫寫,之後還會深入探索與合作。算是一個把FARO官方檔案吃進去再吐出來的一個過程。

簡單看了一下官方檔案,稍微記錄一下FARO舊版SDK的開發指南。

首先我們要知道法如的SDK是什麼東西,我們可以看一下官方範例:

我們可以看到,法如執行一次掃描任務,程式碼量並不大,但是這到底是個什麼鬼?

沒錯,就是在C++上的#import命令,看上去很奇葩,而且不需要#include 一個標頭檔案,為什麼就突然多一個類出來了?我們來巨硬的官方檔案看看,這是什麼意思?

#import 指令 (C++)

#imprtC++:專用。過去一直合併型別庫中的資訊。 型別庫的內容將轉換為 C++ 類,主要描述 COM 介面。

我們可以簡單看一下FARO的官方檔案

如上很明顯可以看出FARO的SDK實際上就是通過註冊COM元件的形式將自己的DLL註冊進了window系統內,這也難怪FARO一直沒有開發linux下的SDK。。。。畢竟這是要推倒重做的事,不過最近又出了新的API,之後需要參考一下這個API。.

怎麼做

從目前的程式碼出發,我會簡單聊聊FARO掃描器的螺旋CAN式掃描器的用法及流程。

實際上從目前的作業流程來說,和官方檔案給出的範例檔案差別不大,大概流程:

1.初始化法如SDK,獲取COM物件

2.設定IP,證書,金鑰等資訊,呼叫介面連線至法如掃描器

3.設定掃描引數

4.啟動法如掃描器預熱,開始旋轉

5.準備完畢後讓法如掃描器進入資料記錄狀態,這個時候才開始生成資料:

6.採集完畢,停止掃描器

7.脫離控制,當然了也可以直接退出程序,COM元件消失後就自動放開控制。

sdk中常用介面及其作用見下表,更完整請看官方檔案:

CoInitialize(NULL)	初始化SDK服務
BSTR licenseCode = ... /* FARO LS license code */;	插入掃描器的祕鑰
IiQLibIfPtr libRef = static_cast<IiQLibIfPtr>(liPtr);	拿到提供服務的指標
scanCtrl->ScannerIP = L"132.154.24.13";	設定掃描器ip
connect()	與掃描器建立連線
syncParam()	設定完引數後用於同步引數至掃描器
startScan()	啟動鏡頭(鏡頭旋轉,但沒正式記錄)
recordScan()	開始記錄資料
pauseScan()	暫停資料記錄,鏡頭保持旋轉
stopScan()	停止記錄,停止鏡頭
CoUninitialize()	解除安裝服務

sdk中常用引數及其含義見下表,更完整請看官方檔案:

ScanMode	列舉值。移動式掃描一般使用HelicalCANGrey,架站式可選StationaryGrey、StationaryColor。
StorageMode	列舉值。SMLocal:資料儲存在掃描器的sd卡中或是內建硬碟;SMRemote:資料儲存在於掃描器建立連線的遠端電腦;SMAuto:自動選擇儲存位置,優先儲存在連線的遠端電腦。
ScanFileNumber	設定掃描檔案的起始檔名。e.g.設定為1,則以後的檔案會自動命名為2、3、4...
ScanBaseName	設定掃描檔案的檔名字首。e.g.設定為Test,則掃描檔名會變成Test001.fls、Test002.fls、Test003.fls...
RemoteScanStoragePath	若選擇了將資料儲存在遠端電腦,此屬性就是設定具體儲存的資料夾路徑
Resolution	設定掃描解析度,有多個檔位設定,此值與最終掃描成果的精度有關
MeasurementRate	設定測量速率,有多個檔位設定,此值與最終掃描成果的精度有關
NoiseCompression	設定噪聲壓縮,有多個檔位設定,一般設定為1,即不壓縮
VerticalAngleMax	豎直方向最大角度,一般為90
VerticalAngleMin	豎直方向最小角度,一般為-60
NumCols	最大掃描線數,當掃描過程達到此值,會自動結束掃描,一般設為2000000
SplitAfterLines	分塊線數,掃描檔案中的線數達到此值,會自動將資料儲存在下一個檔案。可理解為單檔案最大容量屬性。一般設定為5000

什麼問題?

目前最嚴重的問題就是,法如提供的這幾個COM介面的返回值並不可靠,就比如說,我呼叫了startScan()之後,可能上方的燈閃爍,但是並不會開始旋轉,但是這個時候COM口返回給我的值卻沒有任何問題,這是非常奇怪的,但是也有辦法可以解決。幾個比較常見的問題解決方案如下:

1.無法從connect()函數返回值判斷掃描器是否完成連線

答:需要通過查詢Connected屬性(bool型別)判斷,當然了最簡單的方法是直接看法如掃描器上的介面,但是這顯然是不合適的,怎麼還能讓使用者親自去看Connected屬性,這不是開玩笑嗎?

2.無法從startScan()函數返回值判斷掃描器鏡頭是否啟動成功,燈閃藍燈了,但是沒有轉起來?

以下回答顯然是不可接受的,但是目前沒有好辦法解決,之後深入研究SDK後需要解決這個問題

答:1.人工觀察掃描器頂部的燈由藍色常數變為紅色閃爍,即鏡頭啟動成功。2.據說還有一種方式,鏡頭啟動之後(電子組)能從掃描器的CAN口獲取到鏡頭啟動資訊,具體的訊息形式可找他們探討一下,確定可用的話,軟體這邊從串列埠獲取訊息即可。

3.無法從stopScan()函數返回值判斷掃描器是否已正式結束記錄

答:當拿到返回值之後直接解除安裝服務,會出現最後一個檔案損壞的情況。據觀察,stopScan之後要過一會才會將檔案的最後一部分完整寫入。可通過ScanProgress屬性來查詢掃描進度,當返回值是0時,一般就正式結束了。

4.開始記錄資料後,資料有可能不生成

答:這個原因很複雜,但是主要出現這個問題的原因就是目前VTM軟體的程式碼有問題,開始任務後掃描器不一定真啟動了,可能沒有呼叫記錄資料的這個介面。

實際上可以通過法如的SDK呼叫他們讀取fls檔案的介面,可以檢查是否有資料生成,如果沒有資料生成再報錯。