[TSG开发]法如扫描仪SDK探幽-1.旧版SDK采集流程、问题解析、常见参数
做什么
法如扫描仪是一个三维的激光扫描仪,可以通过特定的作业模式将空间以三维激光点云的形式保存下来,并且通过特定的算法得出一些想要的具体参数。
这个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口返回给我的值却没有任何问题,这是非常奇怪的,但是也有办法可以解决。几个比较常见的问题解决方案如下:
1.无法从connect()函数返回值判断扫描仪是否完成连接
答:需要通过查询Connected属性(bool类型)判断,当然了最简单的方法是直接看法如扫描仪上的界面,但是这显然是不合适的,怎么还能让用户亲自去看Connected属性,这不是开玩笑吗?
2.无法从startScan()函数返回值判断扫描仪镜头是否启动成功,灯闪蓝灯了,但是没有转起来?
以下回答显然是不可接受的,但是目前没有好办法解决,之后深入研究SDK后需要解决这个问题
答:1.人工观察扫描仪顶部的灯由蓝色常量变为红色闪烁,即镜头启动成功。2.据说还有一种方式,镜头启动之后(电子组)能从扫描仪的CAN口获取到镜头启动信息,具体的消息形式可找他们探讨一下,确定可用的话,软件这边从串口获取消息即可。
3.无法从stopScan()函数返回值判断扫描仪是否已正式结束记录
答:当拿到返回值之后直接卸载服务,会出现最后一个文件损坏的情况。据观察,stopScan之后要过一会才会将文件的最后一部分完整写入。可通过ScanProgress属性来查询扫描进度,当返回值是0时,一般就正式结束了。
4.开始记录数据后,数据有可能不生成
答:这个原因很复杂,但是主要出现这个问题的原因就是目前VTM软件的代码有问题,开始任务后扫描仪不一定真启动了,可能没有调用记录数据的这个接口。
实际上可以通过法如的SDK调用他们读取fls文件的接口,可以检查是否有数据生成,如果没有数据生成再报错。
[TSG开发]法如扫描仪SDK探幽-1.旧版SDK采集流程、问题解析、常见参数的更多相关文章
- 《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述
1.前言 ArcGIS Runtime SDK是一整套用于构建原生及跨平台的地图应用程序的开发包,包括移动设备的Android.iOS.Windows Phone,针对桌面的.Net.Java.OSX ...
- 【Android 应用开发】Android 开发环境下载地址 -- 百度网盘 adt-bundle android-studio sdk adt 下载
19af543b068bdb7f27787c2bc69aba7f Additional Download (32-, 64-bit) Package r10 STL debug info androi ...
- 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo
原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建 ...
- iOS开发——iOS10升级极光推送SDK、友盟分享SDK
前不久升级了Xcode8 ,同时iOS10系统也推送久. 由于公司需要适配iOS 10系统,同时第三方sdk建议升级. 包含替换升级新的SDK和相应的代码修改. 主要分享如何升级极光推送SDK,友盟分 ...
- 【Unity游戏开发】接入UWA_GOT的iOS版SDK以后无法正常出包
一.正文 问: RT,最近有看到UWA_GOT工具新增了iOS版本的支持,于是下载了最新的工具包进行了接入测试.是按照文档直接将UWA_GOTv2.0.1_iOS.unitypackage导入进了Un ...
- 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结
[第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...
- 【Win10 UWP】QQ SDK(一):SDK基本使用方法
每当开发一个应用需要社交分享的应用时,总是心里咯噔一下:到底什么时候分享能加上QQ和微信?除了WP8.0版本的微信SDK,官方似乎从未正面发布过适应时代发展的QQ SDK,就连后台,也没有一个可以创建 ...
- [第二届构建之法论坛] 预培训文档(C++版)
本博客是第二届构建之法论坛暨软件工程培训活动预培训文档中[适用于结对编程部分的C++版本],需要实验者有一部分C++基础. 目录 Part0.背景 Part1.配置环境 Part2.克隆项目 Part ...
- VUE开发请求本地数据的配置,旧版本dev-server.js,新版本webpack.dev.conf.js
VUE开发请求本地数据的配置,早期的vue-lic下面有dev-server.js和dev-client.js两文件,请求本地数据在dev-server.js里配置,最新的vue-webpack-te ...
- 信鸽推送 C#版SDK
信鸽官方sdk没提供C#版的DEMO,考虑到应该有其他.NET的也会用到信鸽,下面是我在使用信鸽过程中写的demo.有什么不对的地方,欢迎各位大牛指导. 使用过程中主要是有2个问题: 1.参数组装,本 ...
随机推荐
- JOI 简单题选做
就是把洛谷上评分为紫的题做了一下(汗) 前两道题没做出来,暴露了自己在 dp 上的短板. イベント巡り 2 一开始想到贪心,但发现我们只要选 \(k\) 个即可,所以可以尝试一些更劣但是编号更小的做法 ...
- day07-SpringBoot接收参数相关注解
SpringBoot接收参数相关注解 1.基本介绍 SpringBoot接收客户端提交数据/参数会使用到相关注解 详解@PathVariable.@RequestHeader.@ModelAttrib ...
- MyBatisPlus 实战字典
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具包,只做增强不做改变,为简化开发工作.提高生产效率而生. 一.Service CRUD 接口 [说明]:[1]通用 Servic ...
- 论文解读(CosFace)《CosFace: Large Margin Cosine Loss for Deep Face Recognition》
论文信息 论文标题:CosFace: Large Margin Cosine Loss for Deep Face Recognition论文作者:H. Wang, Yitong Wang, Zhen ...
- 字符串算法--$\mathcal{KMP,Trie}$树
\(\mathcal{KMP算法}\) 实际上,完全没必要从\(S\)的每一个字符开始,暴力穷举每一种情况,\(Knuth.Morris\)和\(Pratt\)对该算法进行了改进,称为KMP算法. 而 ...
- 使用webpack 优化自己的项目。
一.首先要了解概念:module,chunk 和 bundle 到底是什么? module,chunk 和 bundle 其实就是同一份逻辑代码在不同转换场景下的取了三个名字: 我们直接写出来的是 m ...
- Pause Giant AI Experiments: An Open Letter(暂停大型人工智能实验: 一封公开信)
Pause Giant AI Experiments: An Open Letter(暂停大型人工智能实验: 一封公开信) 前几天在 futureoflife 网站上有一封公开信,呼吁暂停大型人工智能 ...
- CTFSHOW-Reverse-刷题记录
re2 打开初步分析为32位程序,无壳,拖入IDA32分析 找到关键行47-50,分析得出各函数内部的基本作用如图所示 首先进入分析输入后的处理 可以很明显看出,是对输入的字符串进行处理后再操作,因此 ...
- [数据库/ORALCE]导入/导出数据
ORACLE数据导入/导出 工具介绍:EXP/IMP | EXPDP/IMPDP EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序 ...
- odoo 开发入门教程系列-添加修饰
添加修饰 我们的房地产模块现在从商业角度来看是有意义的.我们创建了特定的视图,添加了几个操作按钮和约束.然而,我们的用户界面仍然有点粗糙.我们希望为列表视图添加一些颜色,并使一些字段和按钮有条件地消失 ...