[TSG开发]法如扫描仪SDK探幽-1.旧版SDK采集流程问题解析常见参数

Posted Human::Singleton()->Leventu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[TSG开发]法如扫描仪SDK探幽-1.旧版SDK采集流程问题解析常见参数相关的知识,希望对你有一定的参考价值。

做什么

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

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

为旧版 Xcode 集成 Facebook SDK 以支持 iOS 5 和 iOS 6

【中文标题】为旧版 Xcode 集成 Facebook SDK 以支持 iOS 5 和 iOS 6【英文标题】:Integrating Facebook SDK for older versions of Xcode to Support both iOS 5 and iOS 6 【发布时间】:2013-03-17 23:28:16 【问题描述】:

我仍在使用 XCode 4.3.2 和 iOS 5.1 基础 SDK。我想要实现的是为 iOS 5.0+ 设备集成 Facebook API。只是基本功能,例如代表发帖和获取基本用户信息。

我假设哪个 Facebook SDK 可以在 iOS 5 上运行,也可以在 iOS 6 上运行,但我不确定。

作为 Facebook 集成的新手,任何人都可以对这个问题有所了解。 (由于我正在做这个项目,升级 XCode 和 iOS SDK 不是一个选项)

我应该研究哪个 iOS SDK? 我可以同时支持 iOS 5 和 6、用基础SDK 5.1和XCode 4.3? 是否有支持两个 iOS 版本的 API? Facebook 集成有什么要求吗?

【问题讨论】:

【参考方案1】:

首先您阅读了 Facebook 开发人员发布的这篇文章

http://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/

在第 1 步中,它也适用于 xcode 4.3

你仔细阅读所有步骤n实施

在第 6 步中,您在 Facebook Btn Pressed 的位置编写如下代码

 - (IBAction)facebookBtnPressed:(id)sender



        // if it is available to us, we will post using the native dialog
        BOOL displayedNativeDialog = [FBNativeDialogs presentShareDialogModallyFrom:self
                                                                        initialText:[NSString stringWithFormat:@"Here U write code which u want to post on facebook"]
                                                                              image:[UIImage imageNamed:@"1.jpg"]
                                                                                url:[NSURL URLWithString:@""]
                                                                            handler:nil];

        if (!displayedNativeDialog)
        
            NSString *shareStr = [NSString stringWithFormat:@"Here U write code which u want to post on facebook"];
            NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                           shareStr,@"description",
                                           @"sharelink", @"link",
                                           @"ImageName", @"picture",
                                           nil];

            [self performPublishAction:^

                [FBRequestConnection startWithGraphPath:@"me/feed" parameters:params HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) 

                    if (error)
                    
                        NSLog(@"error in post");
                    
                    else
                    
                        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Post Successfully" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
                        [alert show];
                    

                ];
            ];
        
    //

    //===set delagate in Viewcontroller.h of mySLComposerSheet
    [mySLComposerSheet setCompletionHandler:^(SLComposeViewControllerResult result) 
        NSString *output;
        switch (result) 
            case SLComposeViewControllerResultCancelled:
                output = @"Action Cancelled";
                break;
            case SLComposeViewControllerResultDone:
                output = @"Post Successfully";
                break;
            default:
                break;
         //check if everything worked properly. Give out a message on the state.
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Facebook" message:output delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
    ];


- (void) performPublishAction:(void (^)(void)) action 
    if ([[FBSession activeSession]isOpen]) 
        /*
         * if the current session has no publish permission we need to reauthorize
         */
        if ([[[FBSession activeSession]permissions]indexOfObject:@"publish_actions"] == NSNotFound) 
            [[FBSession activeSession] reauthorizeWithPublishPermissions:[NSArray arrayWithObject:@"publish_actions"]
                                                         defaultAudience:FBSessionDefaultAudienceOnlyMe
                                                       completionHandler:^(FBSession *session, NSError *error) 
                                                           action();
                                                       ];
        else
            action();
        
    else
        /*
         * open a new session with publish permission
         */
        [FBSession openActiveSessionWithPublishPermissions:[NSArray arrayWithObject:@"publish_actions"]
                                           defaultAudience:FBSessionDefaultAudienceOnlyMe
                                              allowLoginUI:YES
                                         completionHandler:^(FBSession *session, FBSessionState status, NSError *error) 
                                             if (!error && status == FBSessionStateOpen) 
                                                 action();
                                             else
                                                 NSLog(@"error");
                                             
                                         ];
    

【讨论】:

如果您将此代码运行到 'xcode' 4.3 中,则无需添加 Social 和 AdSupport 框架。如果使用 iOS 6,则将这两个框架添加为适用于 iOS 5 的 Optional

以上是关于[TSG开发]法如扫描仪SDK探幽-1.旧版SDK采集流程问题解析常见参数的主要内容,如果未能解决你的问题,请参考以下文章

旧版 Firebase for Unity (Firebase SDK 4.5.0)

为旧版 Xcode 集成 Facebook SDK 以支持 iOS 5 和 iOS 6

为旧版 SDK 部署 iOS 应用程序时,如何对其进行测试?

扫描识别行驶证的技术SDK

手机端车牌识别sdk开发包

在 Windows 10 UWP .NET SDK 中创建旧版 Wifi Direct 软接入点时,我可以指定使用哪个适配器吗?