[TSG开发]法如扫描仪SDK探幽 您所在的位置:网站首页 法如350扫描仪 [TSG开发]法如扫描仪SDK探幽

[TSG开发]法如扫描仪SDK探幽

2023-12-13 04:26| 来源: 网络整理| 查看: 265

做什么

法如扫描仪是一个三维的激光扫描仪,可以通过特定的作业模式将空间以三维激光点云的形式保存下来,并且通过特定的算法得出一些想要的具体参数。

这个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(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文件的接口,可以检查是否有数据生成,如果没有数据生成再报错。

配上一段Faro SDK读取fls文件的代码

define _SCL_SECURE_NO_WARNINGS define _CRT_SECURE_NO_WARNINGS include

//#include //#include //#include

include include include

using namespace std; typedef pcl::PointXYZRGBA PointT; typedef pcl::PointCloud PointCloudT;

ifdef _WIN64

// Yes - type is 'win32' even on WIN64!

pragma comment(linker, ""/manifestdependency:type='win32' name='FARO.LS' version='1.1.701.2' processorArchitecture='amd64' publicKeyToken='1d23f5635ba800ab'"") else pragma comment(linker, ""/manifestdependency:type='win32' name='FARO.LS' version='1.1.701.2' processorArchitecture='amd64' publicKeyToken='1d23f5635ba800ab'"") endif

// These imports just defines the types - they don't determine which DLLs are actually loaded! // You can choose whatever version you have installed on your system - as long as the interface is compatible

import "C:\Windows\WinSxS\amd64_faro.ls_1d23f5635ba800ab_1.1.701.2_none_3592adf9356a0308\iQopen.dll" no_namespace

//...

int main() { CoInitialize(NULL); //应用程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库 // FARO LS Licensing // Please note: The cryptic key is only a part of the complete license // string you need to unlock the interface. Please // follow the instructions in the 2nd line below

BSTR licenseCode = L"FARO Open Runtime License\n" //#include "../FAROOpenLicense" // Delete this line, uncomment the following line, and enter your own license key here: L"Key:39CELNPKTCTXXJ7TN3ZYSPVPL\n" L"\n" L"The software is the registered property of FARO Scanner Production GmbH, Stuttgart, Germany.\n" L"All rights reserved.\n" L"This software may only be used with written permission of FARO Scanner Production GmbH, Stuttgart, Germany."; IiQLicensedInterfaceIfPtr liPtr(__uuidof(iQLibIf)); liPtr->License = licenseCode; IiQLibIfPtr libRef = static_cast(liPtr); if (libRef->load("C:\\Users\\18148\\Desktop\\Scan_az001.fls\\Scan_az001.fls") != 0) //读取文件的全路径 切记 { std::cout setAttribute("#app/ScanLoadColor", "2"); //设置为彩色 Load grey information instead of color cout getScanNumRows(0); int numCOls = libRef->getScanNumCols(0); std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有