LMI Gocator GoSDK C#开发学习笔记(一)

命名空间Lmi3d.Zen

Zen是一个C/C++库,它为我们使用LMI的技术进行软件开发时提供了一个可移植的基础库。Zen可以识别两种基本的数据类型:值类型(例如k8u8位无符号整数)和引用类型(例如kImage,表示像素的二维集合)。值类型(结构、枚举)是带有公共字段的简单的数据结构,引用类型(类、接口)是带有句柄的、使用函数访问的不透明的数据结构。Zen实现了一个单继承多接口的类的模型,所有的Zen类都继承自kObject基类。一Zen程序集是一个类型的集合,一个程序在使用它的服务之前必须构造程序集,并且应该在程序退出之前销毁程序集,kApiLib.Construct函数用于构造一个Zen核心组件的实例(kApiLib)。基于Zen的库能够定义一个新的程序集,并且在一个程序集中定义的类型能够扩展在另一个程序集中定义的类型。Zen提供了一系列宏作为语法辅助工具。Zen是开源的。

KApiLib类

定义:public class KApiLib : KAssemblyManager, IDisposable

描述:管理函数库的集合,私有了构造函数

公共成员字段Instance

定义:public static KApiLib Instance { get; }

描述:获取KApiLib类的实例

公共成员字段LeaksDetected

定义:public static long LeaksDetected { get; }

描述:报告在使用这个库期间泄露的内存,在调试版本中,Zen跟踪堆内存分配,销毁KApiLib组件后获取这个静态的公共成员字段,确定在操作期间是否发生了内存泄漏。此字段不是线程安全的。返回值为泄露的内存字节数

公共成员方法Construct

定义:public static KApiLib Construct();

描述:构造Zen API类型的程序集,此函数初始化Zen API程序集,并返回代表该程序集的句柄,当不再需要这个程序集时,将这个程序集的句柄传递给KObject类的Destroy函数。这个函数应该比大多数其他的Zen API函数优先调用,多次嵌套调用这个函数,将返回相同的实例,为了确保最终可以清除干净,KObject类的Destroy函数应该在这个句柄上调用相同的次数

            KApiLib k1 = KApiLib.Instance;
            if (k1 == null)
                Console .WriteLine  ("k1=null");
            k1 = KApiLib.Construct();
            Console.WriteLine("k1-" + k1.ToString());
            KApiLib k2 = KApiLib.Instance;
            Console.WriteLine("k2-" + k2.ToString());
            if (k1 == k2)
                Console.WriteLine("k1=k2");
            KApiLib k3 = KApiLib.Construct();
            if (k1 == k3)
                Console.WriteLine("k1=k3");
            Console.ReadLine();

运行结果:

命名空间Lmi3d.GoSDK

核心类型与定义

GoSdkLib类

定义:public class GoSdkLib : KAssemblyManager, IDisposable

描述:Gocator SDK库管理功能,该类私有了构造函数,sensor API的程序集管理器。

公共成员字段Instance

定义:public static GoSdkLib Instance { get; }

描述:获取GoSdkLib类单例实例的引用

公共成员方法Construct

定义:public static GoSdkLib Construct();

描述:构造Gocator SDK库,这个函数应该在调用任何其他Gocator SDK函数之前优先调用,当这个库不在被需要时,在这个函数返回的对象上调用KObject类的Destroy函数,这个函数能够安全的调用多次,为了确保最终可以清除干净,KObject类的Destroy函数应该被调用相同的次数,在固件版本4.0.10.27中被引入

如果GoSdkLib程序集管理器的实例当前不存在,构造方法将创建一个新实例并返回它。如果GoSdkLib程序集管理器的一个实例已存在,构造方法将增加其引用计数并返回现有实例。通过这个方法返回的GoSdkLib实例当不在需要时应该被释放,此方法是线程安全的。

            GoSdkLib g1 = GoSdkLib.Instance;
            if (g1  == null)
                Console .WriteLine  ("g1=null");
            g1  = GoSdkLib.Construct();
            Console.WriteLine("g1-" + g1.ToString());
            GoSdkLib g2 = GoSdkLib.Instance;
            Console.WriteLine("g2-" + g2.ToString());
            if (g1 == g2 )
                Console.WriteLine("g1=g2");
            GoSdkLib g3 = GoSdkLib.Construct();
            if (g1  == g3 )
                Console.WriteLine("g1=g3");
            Console.ReadLine();

运行结果:

公共成员方法Dispose

定义:public override sealed void Dispose();

描述:释放GoSdkLib程序集管理器,此方法递减GoSdkLib引用计数。如果引用计数达到零时,将释放GoSdkLib实例。此方法是线程安全的。

            if (KApiLib .Instance ==null )
                Console .WriteLine ("null");
            KApiLib.Construct();
            if (KApiLib.Instance != null)
                Console.WriteLine("not null");
            KApiLib.Instance.Dispose();
            if (KApiLib.Instance == null)
                Console.WriteLine("null");
            Console.ReadLine();

运行结果

            KApiLib k1 = KApiLib.Construct();
            KApiLib k2 = KApiLib.Construct();
            KApiLib k3 = KApiLib.Construct();
            k1.Dispose();
            if (KApiLib.Instance == null)
                Console.WriteLine(1);
            k2.Dispose();
            if (KApiLib.Instance == null)
                Console.WriteLine(2);
            k3.Dispose();
            if (KApiLib.Instance == null)
                Console.WriteLine(3);
            Console.ReadLine();

 运行结果:3

            KApiLib.Construct();
            GoSdkLib g1 = GoSdkLib.Construct();
            GoSdkLib g2 = GoSdkLib.Construct();
            GoSdkLib g3 = GoSdkLib.Construct();
            g1.Dispose();
            if (GoSdkLib.Instance == null)
                Console.WriteLine(1);
            g2.Dispose();
            if (GoSdkLib.Instance == null)
                Console.WriteLine(2);
            g3.Dispose();
            if (GoSdkLib.Instance == null)
                Console.WriteLine(3);
            KApiLib.Instance.Dispose();
            Console.ReadLine();

运行结果:3

注意事项

以上程序建议添加GoSdk.dll、GoSdkNet.dll、GoSdkNet.xml、kApi.dll、kApiNet.dll、ucrtbased.dll、vcruntime140d.dll七个文件

添加以下两个引用GoSdkNet、kApiNet

添加以下两个命名空间

using Lmi3d.Zen;
using Lmi3d.GoSdk;

如果为64位系统,程序属性中生成的目标平台不能为Any CPU,要改为x64

GoSystem类

定义:public class GoSystem : KObject

描述:表示一个Gocator设备系统,在构造过程中,一个GoSystem对象使用Gocator Discovery协议来定位设备(如果自动发现功能被选择)。随后,使用GoSystem类中的SensorCount属性和GoSystem类中的GetSensor方法访问被检测到的设备列表。构造后,所有的传感器处于在线状态。这个状态指示一个传感器被发现,但是客户端还没有建立到这个传感器的控制链接。传感器的功能在这个状态能够被使用的只有GoSensor类的State属性、GoSensor类的Address方法和GoSensor类的SetAddress方法。因为Gocator Discovery协议可以跨子网工作,但是Gocator Control协议不行,所以一个传感器被成功的检测到但是随后的连接尝试可能会失败。在这种情况下,GoSensor类的SetAddress方法能够被用来重新设置传感器在与客户端相同的子网下运行。如果客户端和设备被设置在同一子网下运行,GoSystem类Connect方法或者GoSensor类的Connect方法能够被用来建立控制链接。注意GoSystem类和其他系统API对象例如GoSensor和GoSetup都不是线程安全的,如果没有正确的使用诸如互斥锁或者事件循环之类的同步技术,他们不应该被多个线程同时访问。一个典型的例子是当一个线程轮询GoSensor类State属性时,另一个线程调用诸如GoSensor类的Connect方法或者GoSystem类的Refresh方法。没有正确的锁定,这样的代码将导致不确定的行为,例如无效的值被返回,甚至程序崩溃。

公共成员字段DataCapacity

定义:public long DataCapacity { get; set; }

描述:报告能够被用于接收数据信息缓存的最大内存数量,在固件4.0.10.27中引入,返回值为数据队列的容量,以字节为单位。接收到的数据消息将排队,直到调用者接受为止。此函数确定排队消息的最大大小(以字节为单位)。默认最大大小为50 MB。

公共成员字段SensorCount

定义:public long SensorCount { get; }

描述:获取系统中传感器数量,在固件4.0.10.27中引入

构造方法

定义:public GoSystem();

描述:空参构造,使用默认的发现提供程序初始化GoSystem类的新实例。在构造过程中,一个GoSystem对象使用传感器发现协议定位传感器,检测到的传感器列表可使用SensorCount和GetSensor方法访问

定义:public GoSystem(bool enableAutoDiscovery);

描述:有参构造,初始化GoSystem类的新实例,而不启用自动Gocator发现,参数enableAutoDiscovery使能自动Discovery协议,使用Gocator发现协议启用或禁用Gocator的自动发现,在构造过程中,GoSystem对象使用Gocator发现协议找到传感器。检测到的传感器列表可使用SensorCount和GetSensor方法访问

            GoSystem gs1 = new GoSystem();
            Console.WriteLine("SensorCount="+gs1.SensorCount);
            GoSystem gs2 = new GoSystem(false );
            Console.WriteLine("SensorCount=" + gs2.SensorCount);
            GoSystem gs3 = new GoSystem(true );
            Console.WriteLine("SensorCount=" + gs3.SensorCount);
            Console.ReadLine();

运行结果:传感器和PC没有设置在同一子网下,空参构造默认使能Discovery协议

公共成员方法SdkVersion

定义:public KVersion SdkVersion();

描述:报告与这个库一起被构建的Gocator固件版本,一个Gocator SDK版本号有一个主要的组成部分和一个次要的组成部分。如果这个库的主要版本和一个传感器设备的主要版本相同,那么通讯能够进行,否则,这个传感器应该升级或者应该获得与这个传感器匹配的库版本。当SDK与固件版本不匹配时,只要协议版本匹配,他们应该是兼容的,在固件4.0.10.27中引入,返回值为与这个库一起构建的固件版本

公共成员方法GetSensor

定义:public GoSensor GetSensor(long index);

描述:获取在指定索引处的传感器对象,在固件4.0.10.27中引入,参数index为传感器索引,返回值为传感器对象。

公共成员方法ProtocolVersion

定义:public KVersion ProtocolVersion();

描述:报告这个库的Gocator协议版本,一个Gocator协议版本号有一个主要的组成部分和一个次要的组成部分。如果这个库的主要版本和一个传感器设备的主要版本相同,那么通讯能够进行,否则,这个传感器应该升级或者应该获得这个库的更新版本。不兼容主版本的传感器在连接后将会报告处于不兼容状态。如果主版本匹配,但是这个库的次要版本比传感器的次要版本更低,那么某些传感器的功能将不能通过这个库访问。如果主要版本匹配,但是这个库的次要版本比传感器实现的次要版本更高,那么这个传感器可能未实现这个库某些发布的功能。这个库是线程安全的。在固件4.0.10.27中引入,返回值为这个库的协议版本

公共成员方法FindSensorById

定义:public GoSensor FindSensorById(uint id);

描述:通过指定的设备id(序列号)获得传感器对象。参数id为设备id,返回值为得到的传感器对象。如果未找到,则抛出KStatus.ErrorNotFound。

公共成员方法FindSensorByIpAddress

定义:public GoSensor FindSensorByIpAddress(KIpAddress address);

描述:通过指定IP地址获取传感器对象,参数address为指向传感器的IP地址,返回值为得到的传感器对象。如果未找到,则抛出KStatus.ErrorNotFound。

            KApiLib.Construct();
            GoSdkLib.Construct();
            GoSystem GocatorSystem = new GoSystem();
            Console.WriteLine("Sersor count=" + GocatorSystem.SensorCount);
            Console.WriteLine("SDK version:V"+GocatorSystem.SdkVersion().Major+"."+GocatorSystem.SdkVersion().Minor +"."+GocatorSystem.SdkVersion().Release +"."+GocatorSystem.SdkVersion().Build  );
            Console.WriteLine("Protocol version:V" + GocatorSystem.ProtocolVersion().Major + "." + GocatorSystem.ProtocolVersion().Minor + "." + GocatorSystem.ProtocolVersion().Release + "." + GocatorSystem.ProtocolVersion().Build);
            GoSensor GocatorSensor1 = GocatorSystem.GetSensor(0);
            GoSensor GocatorSensor2 = GocatorSystem.GetSensor(1);
            Console.WriteLine("Sensor1 id:"+GocatorSensor1.Id);
            Console.WriteLine("Sensor1 model:"+GocatorSensor1.ModelNumber);
            Console.WriteLine("Sensor1 IP:" + GocatorSensor1.Address().Address);
            Console.WriteLine("Sensor2 id:" + GocatorSensor2.Id);
            Console.WriteLine("Sensor2 model:"+GocatorSensor2.ModelNumber);
            Console.WriteLine("Sensor2 IP:" + GocatorSensor2.Address().Address);
            Console.WriteLine("- - - - - - - - - - - - - - - - - - - -");
            GoSensor Sensor3 = GocatorSystem.FindSensorById(69454);
            GoSensor Sensor4 = GocatorSystem.FindSensorById(15541);
            Console.WriteLine("Sensor3 id:" + Sensor3.Id);
            Console.WriteLine("Sensor3 model:" + Sensor3.ModelNumber);
            Console.WriteLine("Sensor3 IP:" + Sensor3.Address().Address);
            Console.WriteLine("Sensor4 id:" + Sensor4.Id);
            Console.WriteLine("Sensor4 model:" + Sensor4.ModelNumber);
            Console.WriteLine("Sensor4 IP:" + Sensor4.Address().Address);
            Console.WriteLine("- - - - - - - - - - - - - - - - - - - -");
            GoSensor Sensor5 = GocatorSystem.FindSensorById(69454);
            GoSensor Sensor6 = GocatorSystem.FindSensorById(15541);
            Console.WriteLine("Sensor5 id:" + Sensor5.Id);
            Console.WriteLine("Sensor5 model:" + Sensor5.ModelNumber);
            Console.WriteLine("Sensor5 IP:" + Sensor5.Address().Address);
            Console.WriteLine("Sensor6 id:" + Sensor6.Id);
            Console.WriteLine("Sensor6 model:" + Sensor6.ModelNumber);
            Console.WriteLine("Sensor6 IP:" + Sensor6.Address().Address);
            Console.ReadLine();

运行结果:传感器1为实体传感器,传感器2为模拟器

            KApiLib.Construct();
            GoSdkLib.Construct();
            GoSystem GocatorSystem = new GoSystem();
            GoSensor GocatorSensor1 = GocatorSystem.GetSensor(0);
            Console.WriteLine("Sensor1 id:"+GocatorSensor1.Id);
            Console.WriteLine("Sensor1 model:"+GocatorSensor1.ModelNumber);
            Console.WriteLine("Sensor1 IP:" + GocatorSensor1.Address().Address);
            GoAddressInfo addressInfo = new GoAddressInfo();
            addressInfo.Address = KIpAddress.Parse("192.168.1.10");
            addressInfo.Gateway = KIpAddress.Parse("192.168.1.1");
            addressInfo.Mask = KIpAddress.Parse("255.255.255.0");
            addressInfo.UseDhcp = false;
            GocatorSensor1 .SetAddress (addressInfo ,true );
            Console.WriteLine("++++++ ++++++ ++++++ ++++++");
            Console .WriteLine ("Sensor1 IP:" + GocatorSensor1.Address().Address);
            Console.ReadLine();

运行结果:

公共成员方法Connect

定义:public void Connect();

描述:建立到所有传感器控制链接。在调用除GoSensor类的State属性、GoSensor类的Address方法和GoSensor类的SetAddress方法以外的任何传感器功能,都需要一个控制链接。在固件4.0.10.27中引入。

公共成员方法Disconnect

定义:public void Disconnect();

描述:断开到所有传感器的控制链接,在固件4.0.10.27中引入。

公共成员方法ClearData

定义:public void ClearData();

描述:清楚所有缓冲数据信息,当停止然后重新启动系统时,可能希望确保没有之前的信息遗留在任何缓冲区中,GoSystem类的ClearData方法关闭任何打开的数据通道,销毁任何接收到的信息,然后重新打开数据通道。在固件4.0.10.27中引入。

公共成员方法Encoder

定义:public long Encoder();

描述:从传感器网络获取当前的编码器数值,在固件4.0.10.27中引入。返回值为接收到的当前编码器数值

公共成员方法Start

定义:public void Start();

描述:启动所有当前处于ready状态的传感器,在固件4.0.10.27中引入。

公共成员方法Stop

定义:public void Stop();

描述:停止所有已连接的传感器,在固件4.0.10.27中引入。

公共成员方法Reset

定义:public void Reset(bool wait);

描述:重启所有已连接的传感器,在固件4.0.10.27中引入。参数wait为true时,等待重启完成,为false时为立即返回。

公共成员方法Refresh

定义:public void Refresh();

描述:更新客户端状态以反应发生在传感器网络中的任何改变,传感器能够进行自主的状态更改,这就需要刷新客户端状态(例如传感器offline),GoSystem类的Refresh方法重新同步客户端状态和传感器网络的当前状态,调用这个方法可以销毁或者修改本地传感器对象,在调用GoSystem类的Refresh方法之前可以使用GoSystem类的HasChanges方法,来确定是否需要刷新。关于修改传感器类的设置这个调用是线程安全的,在固件4.0.10.27中引入。 

公共成员方法EnableData

定义:public void EnableData(bool enable);

描述:建立数据连接到所有当前已连接的处于ready和运行状态的传感器,当传感器控制连接被建立,数据连接不会自动建立,使用这个方法(或者GoSensor类的EnableData方法)使能/禁止数据连接,在调用了GoSystem类的EnableData方法后,SDK应用程序负责处理GoDataSet对象,这些GoDataSet对象保存通过数据连接从传感器中接收到的数据,在固件4.0.10.27中引入。参数enable为true时,使能数据连接,为false时禁止。

公共成员方法SetDataHandler

定义:public void SetDataHandler(GoSystem.DataFx handler);

描述:设置一个callback方法,它能被用于异步接收传感器数据信息,传感器数据信息能够使用GoSystem类的ReceiveData方法同步接收,或者通过注册一个callback方法异步接收,如果一个callback方法被注册,将创建一个后台线程来执行通知,在使用GoSystem类的SetDataHandler方法之后,SDK应用程序负责处理GoDataSet对象,这些GoDataSet对象保存通过数据连接从传感器中接收到的数据,为了注销一个之前注册过的DataHandler,调用这个方法时使用kNULL代替callback方法参数,在固件4.0.10.27中引入。参数handler为data callback方法(或者kNULL注销)

公共成员方法ReceiveData

定义:public GoDataSet ReceiveData(long timeout);

描述:接收一组传感器数据信息,传感器数据信息能够使用这个方法同步接收,或者通过GoSystem类的SetDataHandler方法注册一个callback实现异步接收,注意,通过这个方法接收数据必须在使用后销毁,否则将发生一个内存泄漏,在固件4.0.10.27中引入。参数timeout为等待信息的时间(以微秒为单位),返回值为一组传感器数据信息。

公共成员方法Timestamp

定义:public long Timestamp();

描述:从传感器网络获得当前的时间戳,在固件4.0.10.27中引入。返回值为接收到的当前的时间戳(以微秒为单位)

公共成员方法LockState

定义:public void LockState();

描述:当读取/修改GoSystem类传感器列表时,锁定系统状态确保线程安全,在检索和使用传感器对象句柄之前,调用这个方法以锁定状态,以确保传感器对象不被删除,因为另一个线程有可能刷新系统,使用在多线程SDK应用程序。在固件5.2.18.3中引入

公共成员方法UnlockState

定义:public void UnlockState();

描述:解锁系统状态,允许其他的线程读取/修改GoSystem类传感器列表,使用在多线程SDK应用程序。在固件5.2.18.3中引入

公共成员方法StartAlignment

定义:public void StartAlignment();

描述:执行处于ready状态的传感器的校准,警告!这个操作写入flash存储器,查阅用户手册以了解含义。注意,这个操作会导致传感器在校准期间启动,它能够被取消通过GoSystem类的Stop方法,这个方法的操作状态不符合实际校准结果,为了检索校准结果,你必须在调用这个方法之前使能数据通道,接收一个校准数据信息,然后检查它的状态,在固件4.0.10.27中引入。备注,调用这个方法将导致写入flash存储器操作,如果这个过程因为断电或其他原因被中断,这个传感器可能会进入故障模式。

公共成员方法StartExposureAutoSet

定义:public void StartExposureAutoSet();

描述:为处于ready状态的传感器执行曝光自动设置,注意,这个操作将导致传感器在曝光自动设置期间启动,一个成功的操作状态不会修改设置,你必须检索曝光数值,并配置适当的曝光设置,这涉及到在运行曝光自动设置之前使能数据连接,然后得到一个曝光自动设置信息,你能够使用这些信息查询状态并访问结果值,在固件4.0.10.27中引入。

公共成员方法AddSensor

定义:public GoSensor AddSensor(GoAddressInfo addressInfo, GoPortInfo portInfo);

描述:通过传递自定义地址和端口信息添加传感器,这不需要发现。固件4.8.2.76中引入,addressInfo GoAddressInfo类对象,该对象包含要连接的IP。portInfo包含自定义端口值的GoPortInfo类对象。返回GoSensor对象,表示新创建的传感器。

公共成员方法Cancel

定义:public void Cancel();

描述:中止正在进行的传感器通信。此方法异步中止正在进行的通信;下次任何I/O操作阻塞较长时间时,它将被终止。此方法是线程安全的。要恢复通信,请调用GoSystem类的Refresh方法或GoSystem类的Connect方法。固件4.0.10.27中引入

公共成员方法ClearHealth

定义:public void ClearHealth();

描述:清除所有缓冲的运行状况消息。固件4.0.10.27中引入

公共成员方法DiscoveryCompatibilityEnabled

定义:public bool DiscoveryCompatibilityEnabled();

描述:返回是否启用了兼容模式。固件5.2.18.3中引入,返回兼容性启用标志。如果启用了兼容模式,则为true。

公共成员方法EnableDiscoveryCompatibility

定义:public void EnableDiscoveryCompatibility(bool enable);

描述:启用或禁用发现服务的兼容性模式。兼容模式可以发现较旧的固件(4.2或更早版本)。但是,网络上的发现流量增加了一倍。默认情况下,兼容性模式处于关闭状态。必须显式调用GoSystem类的Refresh()函数,以便在此函数之后更新新的传感器列表。固件5.2.18.3中引入,enable启用或禁用兼容模式。设置为true:允许兼容模式。设置为false:不允许兼容模式。

公共成员方法GetExtendedDiscoveryInfo

定义:public GoDiscoveryExtInfo GetExtendedDiscoveryInfo(uint deviceId);

描述:获取给定设备ID的发现通道信息(如果设备存在,并且支持该命令),deviceId用于检索发现通道信息的设备的ID。传感器的发现信息。

公共成员方法HasChanges

定义:public bool HasChanges();

描述:报告系统是否有需要刷新的更改。传感器可能会经历要求刷新客户端状态的自主状态更改(例如,传感器脱机)。GoSystem类的HasChanges函数可用于确定是否发生了此类更改。GoSystem类的HasChanges函数不执行通信,因此不需要调用方长时间阻塞。如果检测到更改,则可以调用GoSystem类的Refresh函数来解决更改。此方法是线程安全的。固件4.0.10.27中引入,如果系统有更改,则为true。

公共成员方法ReceiveHealth

定义:public GoDataSet ReceiveHealth(long timeout);

描述:接收一组传感器运行状况消息。可以使用此函数同步接收传感器运行状态信息,也可以通过向GoSystem类的SetHealthHandler函数注册回调来异步接收传感器运行状态信息。固件4.0.10.27中引入,timeout等待消息的持续时间,以微秒为单位。返回传感器运行状况消息集。

公共成员方法ScheduledStart

定义:public void ScheduledStart(long value);

描述:按计划值启动当前处于就绪状态的所有传感器。注意:指定的值是要开始的目标值,而不是与当前值的相对偏移。典型的用法是首先获取当前值,向其添加偏移量,然后从该值开始。固件4.1.3.106中引入,value启动传感器的值。

公共成员方法SetAllDiscoveryInterface

定义:public void SetAllDiscoveryInterface(bool enable);

描述:将所有接口设置为允许或不允许Gocator发现协议使用。固件4.6.7.157中引入,enable选择是启用还是禁用接口。设置为true:允许协议使用接口。设置为false:不允许协议使用接口。

公共成员方法SetHealthHandler

定义:public void SetHealthHandler(GoSystem.DataFx handler);

描述:设置可用于异步接收传感器运行状况消息的回调函数。传感器运行状况信息可以使用GoSystem类ReceiveHealth函数同步接收,也可以通过注册回调函数异步接收。如果注册了回调函数,将创建一个后台线程来执行通知。要注销以前注册的运行状况处理程序,请使用kNULL代替callback function参数调用此函数。固件4.0.10.27中引入,handler运行状况回调函数(或kNULL取消注册)。

公共成员方法SetOneDiscoveryInterface

定义:public void SetOneDiscoveryInterface(KIpAddress address, bool enable);

描述:启用或禁用在具有给定地址的指定主机接口上运行Gocator发现协议。固件4.6.7.157中引入,address允许或不允许发现协议在其上运行的接口的IP地址。enable选择是启用还是禁用接口。设置为true:允许协议使用此接口。设置为false:不允许接口使用此协议。

公共成员方法StartDiscovery

定义:public void StartDiscovery();

描述:开始运行Gocator发现协议以发现传感器。协议将在已启用运行协议的接口上运行。固件4.6.7.157中引入

委托DataFx

定义:public delegate void DataFx(GoDataSet dataSet);

描述:定义数据/运行状况处理程序的签名,注意,GoSystem类通过这个方法接收必须在使用后销毁,否则将发生一个内存泄漏

using Lmi3d.Zen;
using Lmi3d.GoSdk;
using Lmi3d.Zen.Io;
using Lmi3d.GoSdk.Messages;
using System.Runtime.InteropServices;
class Program
    {
        static void Main(string[] args)
        {
            KApiLib.Construct();
            GoSdkLib.Construct();
            GoSystem GocatorSystem = new GoSystem();
            GoSensor GocatorSensor = GocatorSystem.FindSensorByIpAddress(KIpAddress.Parse("192.168.1.10"));
            Console.WriteLine("sensor model:" + GocatorSensor.ModelNumber );
            GocatorSensor.Connect();
            GocatorSystem.EnableData(true);
            GocatorSystem.SetDataHandler(SensorCallBack );
            GocatorSensor.Start();
            Console.ReadLine();
            GocatorSensor.Stop ();
            GocatorSensor = null;
            GocatorSystem = null;
        }
        public static  void SensorCallBack(KObject DataCallBack)
        {
            GoDataSet dataCallBack = (GoDataSet)DataCallBack;
            Console.WriteLine("sensor id:"+dataCallBack.SenderId);
            for (int i=0;i <dataCallBack .Count ;i ++)
            {
                var messageCallBack=(GoDataMsg )dataCallBack .Get (i );
                switch (messageCallBack.MessageType  )
                {
                    case GoDataMessageType .Stamp :
                        var stampCallBack =(GoStampMsg )messageCallBack ;
                        var stamp = stampCallBack.Get(0);
                        Console.WriteLine("FrameIndex:"+stamp.FrameIndex);
                        break ;
                    case  GoDataMessageType .Surface :
                        var surface = (GoUniformSurfaceMsg )messageCallBack;
                        long width = surface.Width;
                        long length = surface.Length;
                        long bufferSize = width * length;
                        IntPtr bufferPointer = surface.Data;
                        Console.WriteLine("Buffer width:{0}", width);
                        Console.WriteLine("Buffer length:{0}", length);
                        short[] bufArray = new short[bufferSize];
                        Marshal.Copy(bufferPointer, bufArray, 0, bufArray.Length);
                        break;
                }
            }
        }
    }

运行结果:扫描模式选择点云,触发源选择时间,点云生成类型选择固定长度

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: LMI Gocator 是一款由LMI Technologies 开发的高性能3D视觉传感器,用于进行精确的测量和检测。它可以在工业自动化和机器视觉领域应用广泛。 Gocator 提供了一套强大的软件开发工具包(SDK),称为Gosdk C,用于开发基于Gocator 的自定义应用程序。这个SDK 提供了一系列的函数库和示例代码,能够让开发者轻松地创建自己的应用程序。 使用Gosdk C,开发者可以访问Gocator 的各种功能,包括数据获取、图像处理、测量分析以及结果可视化。通过使用这些功能,开发者可以根据自己的需求设计出适合自己的3D测量和检测应用。 Gosdk C 具有相对较高的灵活性和可扩展性。它支持多种编程语言,比如C++,C#,Python等,使得开发者可以根据自己的喜好和熟悉程度来选择适合自己的编程环境。 总之,LMI Gocator Gosdk C 是一个功能强大的软件开发工具包,为开发者提供了创建自定义3D视觉应用程序的能力。通过使用它,开发者可以充分利用Gocator 的高性能和精确度,实现各种测量和检测任务。 ### 回答2: LMI Gocator是一款高级三维测量传感器,采用了独特的TOF(飞行时间)技术。该传感器可以实时获取目标物体的三维数据,并能够进行精确的测量和分析。 Gocator开放软件开发工具包(GoSDK)是LMI推出的一套用于开发基于Gocator传感器的应用程序的开发工具。GoSDK具有丰富的功能和易于使用的界面,可以帮助开发人员快速构建各种测量、检测和排序应用。 使用GoSDK,您可以通过编写自己的代码来控制和操作Gocator传感器。它提供了丰富的API和示例代码,可以方便地集成到不同的开发环境中,如C ++、C#和Python等。开发人员可以根据具体应用的需要自定义算法和功能,并实时访问传感器的数据和参数。 除了基本的三维测量功能外,GoSDK还提供了一些高级功能,如形状匹配、轮廓测量和机器视觉等。这些功能可以帮助用户进行更复杂的检测和定位任务,并实现自动化和精确性要求更高的应用。 总之,LMI Gocator和GoSDK是一款强大的三维测量和图像处理解决方案的组合。通过使用Gocator传感器和GoSDK开发工具,用户可以轻松地实现各种应用需求,提高生产效率和产品质量。 ### 回答3: LMI Gocator是一款由LMI公司开发的三维视觉传感器产品系列。它使用结构光原理,通过投射激光光线来获取物体的三维信息。Gocator产品系列包括多种型号,可满足不同应用场景下的需求。 Gocator的核心功能是通过GOSDK(Gocator Software Development Kit)来实现的。GOSDK是一个软件开发工具包,提供了一系列API和工具,用于与Gocator系统进行通信和控制。通过GOSDK,用户可以编写自定义的应用程序,实现与Gocator传感器的无缝集成。 GOSDK可以帮助开发人员轻松地创建三维视觉应用程序。它提供了丰富的功能和工具,包括数据获取、图像处理、数据分析和可视化等。开发人员可以利用这些功能,对获取的三维数据进行处理和分析,并将结果展示给用户。 GOSDK还支持多种编程语言,如C++、C#和Python,使开发人员可以选择自己熟悉和喜欢的编程语言来进行开发。它还提供了详细的文档和示例代码,方便开发人员学习和使用。 总之,LMI Gocator与GOSDK是一体的产品和工具组合,能够帮助开发人员轻松地实现三维视觉应用程序的开发和集成。它在工业自动化、机器人导航、物体检测等领域有着广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值