法如掃描器是一個三維的鐳射掃描器,可以通過特定的作業模式將空間以三維鐳射點雲的形式儲存下來,並且通過特定的演演算法得出一些想要的具體引數。
這個SDK探幽紀錄檔主要是對目前SDK開發中遇到的一些問題做個記錄,以及對未來開發的一些指導,只是在業餘時間簡單寫寫,之後還會深入探索與合作。算是一個把FARO官方檔案吃進去再吐出來的一個過程。
簡單看了一下官方檔案,稍微記錄一下FARO舊版SDK的開發指南。
首先我們要知道法如的SDK是什麼東西,我們可以看一下官方範例:
我們可以看到,法如執行一次掃描任務,程式碼量並不大,但是這到底是個什麼鬼?
沒錯,就是在C++上的#import命令,看上去很奇葩,而且不需要#include 一個標頭檔案,為什麼就突然多一個類出來了?我們來巨硬的官方檔案看看,這是什麼意思?
#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口返回給我的值卻沒有任何問題,這是非常奇怪的,但是也有辦法可以解決。幾個比較常見的問題解決方案如下:
答:需要通過查詢Connected屬性(bool型別)判斷,當然了最簡單的方法是直接看法如掃描器上的介面,但是這顯然是不合適的,怎麼還能讓使用者親自去看Connected屬性,這不是開玩笑嗎?
答:1.人工觀察掃描器頂部的燈由藍色常數變為紅色閃爍,即鏡頭啟動成功。2.據說還有一種方式,鏡頭啟動之後(電子組)能從掃描器的CAN口獲取到鏡頭啟動資訊,具體的訊息形式可找他們探討一下,確定可用的話,軟體這邊從串列埠獲取訊息即可。
答:當拿到返回值之後直接解除安裝服務,會出現最後一個檔案損壞的情況。據觀察,stopScan之後要過一會才會將檔案的最後一部分完整寫入。可通過ScanProgress屬性來查詢掃描進度,當返回值是0時,一般就正式結束了。
答:這個原因很複雜,但是主要出現這個問題的原因就是目前VTM軟體的程式碼有問題,開始任務後掃描器不一定真啟動了,可能沒有呼叫記錄資料的這個介面。
實際上可以通過法如的SDK呼叫他們讀取fls檔案的介面,可以檢查是否有資料生成,如果沒有資料生成再報錯。