Skip to content

stARkit for DaystAR

设备版本说明

G2设备系统版本必须是OTA4或以上版本,支持stARkit3.0.

NG2设备支持的版本具体信息如下图:

phoneAR设备系统版本1.5支持stARkit3.5及以上版本, 在1.5版PhoneAR设备中不能运行stARkit3.5以前SDK的应用,但是新应用的基础功能(slam和display)可以运行在旧的PhoneAR版本中,在NG2上旧的功能还是支持的。

stARkit for daystAR SDK目录结构

  • Assets/StARkit在开发AR应用时使用,其中包含:
  1. Assets/stARkit/Lenovo.stARkit.SDK

开发者所要使用和了解的东西都在这个文件夹下,需要开发者认真看看里面的内容。里面包含了Demo,开发需要的接口以及预制体。

  1. Assets/stARkit/Lenovo.stARkit.Toolkit

这里面是整个SDK的核心部分,里面按照功能模块分了文件夹,如果对内部代码感兴趣或者需要深入了解SDK可以去对应的模块查看详细代码。

  1. Assets/stARkit/Plugins

这里面放了SDK在Android上需要的库,这个是不需要开发者管的,如果出现在平台运行时出现找不到库时检查一下对应目录下的库的平台设置是不是正确即可。

  • Assets/stARkit_Service和StreamingAssets/stARkit

    这两个目录,主要是为了支持PhoneAR设备,开发launcher的时候必须在场景中增加StARkitService的预制体,集成此service的应用必须能在后台运行而不被杀死。

  • Assets/srARFrame

    这里是关于控制camera及获取RGB相机图像和位姿的部分,预制体为SRFrameManager

    控制接口:

    //========================================================
    //开启相机
    //========================================================
    public void OpenCamera(Action<string> cb);
    
    //========================================================
    //关闭相机
    //========================================================
    public bool CloseCameraDevice();
    
    数据获取回调:public event Action<SRCameraFrame> FrameReceived;
    主动获取数据:public bool TryGetLatestFrame(out SRCameraFrame cameraFrame)
  • Assets/Recognition

这里是关于物体识别功能的核心部分,该功能可基于单目相机视频流,提供实时三维感知能力,快速精准的识别目标,并估计相机与目标在三维空间中的位姿关系。

开发准备

开发环境

基于stARkit Unity SDK开发应用,需要在本机安装Unity(SDK开发版本是Unity2019.4.28,在使用此SDK开发时建议使用2019.4.28或以上版本)。

安装unity过程中,可以根据需要选择相应的组件,若需要编译Android和iOS应用,请参考下图勾选

建议:请确保勾选Microsoft Visual Studio模块,或自行在本机安装其他版本Visual Studio。

SDK下载

请登录晨星开发者平台后,在顶部菜单“下载”—“SDK下载”页面中,下载stARkit SDK。建议下载最新版本。

开发账号注册

stARkit开发者门户网站——晨星视觉平台提供项目管理、许可证管理等功能。登录晨星视觉平台,通过右上方按钮进行账户注册或登录。登录后在开发者中心—我的项目中新建项目或管理已有项目。

  1. 注册新账号,然后登录使用自己的账号登录
  1. 账号登录成功后选择 开发者中心 我的项目
  1. 进入我的项目后选择右上角的新建项目,根据提示完成操作
  1. 新建完成后点击项目进入完成许可证的配置。
  1. 将许可证的key和secret复制记录下来,在开发时填入场景中的SRApplication中

基于Unity SDK进行应用开发

在stARkit SDK中,提供了一些示例场景,其中Assets/stARkit/Lenovo.stARkit.SDK/Demo/GlassSeeThrough/Scene为最基础的AR场景,可将此场景build出apk安装包,在晨星AR设备上面体验;若需要自己制作场景,请参考以下步骤:

创建工程

运行已安装的Unity软件,选择创建一个新工程。

在①处设置你的工程名,在②处选择工程的存储路径,最好是一个空的文件夹,设置好后点击“创建”按钮,等待工程创建成功后打开。

导入SDK

从菜单栏“Asserts->Import Package->Custom Package..”导入stARkit for daystAR SDK Unity Package为自定义包; 默认导入全部资源。

WARNING

Unity2020以上版本(验证过2020.3.11及以上的一些版本),由于Unity自带,不需要勾选 Common文件夹下的Newtonsoft.Json.dll文件,否则会出现编译错误。

注意: 当出现此错误信息时,需手动删除Common路径下的Newtonsoft.Json.dll文件。

而后在Unity场景层级窗口中,删除Main Camera。

场景配置

在Unity下方的项目窗口中,找到预制体Assets/stARkit/Lenovo.stARkit.ADK/StARkitMixtureGlassSeeThrough.Prefab。

将预制体StARkitMixtureGlassSeeThrough拖入scene(Hierarchy)。或者选择StARkit Tool -> Add to scene with StARkitMixtureGlassSeeThrough快捷按钮。

将许可证预制体SRApplication放入场景(通过StARkit Tool -> Add to scene with StARkitMixtureGlassSeeThrough 快捷键添加的会自动创建预制体,不需要再拖一遍),然后将开发者账号配置的项目许可证填写到预制体的对应参数上,SRApplication必须填写正确,3.5及以后的sdk进入应用必须联网验证。

将预制体SRFrameManager拖入scene (Hierarchy), 要打包PhoneAR必须选择设备类型为D_Starkit。

在scene中创建一个方块。

将方块放到初始显示的正前方1米处,并将方块的长宽高都设置为0.2米。

按快捷键Ctr+S 保存场景,选择保存的路径和场景名。

基于Unity打包和部署应用

  1. 按照上面创建工程的步骤创建一个工程和一个场景。
  2. 打开Build的设置窗口。
  1. 将刚刚保存的scene添加到 "scenes in build"中。
  1. 将build的目标平台切换为Android。
  1. 设置Build Settings -> Build System -> Gradle (unity2019等高版本上不一定有此选项,忽略即可)
  1. 设置apk的名字。
  1. 设置Player setting -> Resolution and Presentation ->Default Orientation ->Landscape Left。
  1. 勾选Player setting -> Other Setting -> Auto Graphics API。(2019以上Unity版本注意勾选)
  1. 设置Player setting -> Other Setting -> Multithreaded Rendering -> false。关闭多线程渲染。
  1. Target API Level不做强制限制,已经验证的有(25,27,29),打包APILevel低于29的时候需要删除AndroidManifest.xml中的 android:requestLegacyExternalStorage="true"。
  2. Build 32位的APK时,设置Player setting -> Configuration -> Scripting backend : Mono; Target Architectures : ARMv7。
  1. Build 64位的APK时,设置Player setting ->; Configuration ->; Scripting backend : IL2CPP; Target Architectures : ARM64。
  1. 设置Player setting -> Configuration -> Write Permission : External(SDCard)。
  1. 打开工程设置窗口。
  1. 设置Anisortropic Texture -> per texture 。

(Edit -> porject settings -> quality -> rendering)

(Edit -> porject settings -> quality -> rendering)

  1. 设置Anti Aliasing -> disabled 。

(Edit -> porject settings -> quality -> rendering)

  1. 设置V Sync Count -> Dont Sync。

(Edit -> porject settings -> quality -> other)

  1. 开始build. 生成apk.

位姿获取

HeadTracking 相关的API

1)命名空间:Lenovo.stARkit.SDK.Features.API。

2)简介:这是slam的控制类,这里面的函数可以开关slam并获取slam的数据。

3)属性:

属性名类型说明
InstanceBaseHeadTrackingAPI这是调用Slam功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。

4)函数:

函数名返回值参数类型参数说明
StartHeadTrackingEStARkitCodeintmode:0表示6dof,1表示3dof。打开6dof/3dof功能。
StopHeadTrackingEStARkitCodeintmode:0表示6dof,1表示3dof。关闭 6dof/3dof功能。
GetHeadPoseEStARkitCodeSTrackingDatapose :用来接收slam数据的结构体根据传入的参数获取对应的SLam数据。
doubletimeStamp:slam的时间戳,应设置为绝对时间或增量时间(单位-毫秒)。option = 1时,时间戳是绝对时间,并返回其附近的姿势;option = 0时,时间戳是增量时间,并获取最新姿势,如果时间戳> 0,则应用运动预测,如果时间戳= 0,则直接返回最新姿势, 如果时间<0, 则返回历史时刻位姿。
Intoption:指示时间戳记是绝对时间还是相对时间,详情见参数timeStamp的介绍。
stringnode:指示目标坐标选择,"camera:rgb":slam坐标转到RGB相机;"camera:tof":slam坐标转到TOF相机;"head":slam坐标转到用户两眼中间;"imu" :slam坐标转到IMU。
Intcoordinate_left:指定数据的左右手系。0为右手系,1为左手系。
GetSlamDataNotestringstringnote:获取数据的节点名。获取slam数据的节点名转换,按照关键字匹配,关键字分别是: "rgb","tof","head","imu",如果都不匹配则默认为"head"。
TransfromPoseEStARkitCodeSTrackingDatafromPose:需要转换的Unity坐标系的位姿将fromNote节点下的Unity位姿转换到显示的Head节点。
STrackingDatatoPose:转化为Unity世界坐标系的位姿
stringfromNode:需要转换的节点("rgb"和"tof"选一个)
doublepredictTime:当前显示模式下的预测时间。(GlassSeeThrough 下是"BaseDisplayAPI.Instance.DisplayGetPredoctedTime" 这个接口获取的预测时间)

BaseCommonAPI

1)命名空间:Lenovo.stARkit.SDK.Features.API。

2)简介:这是一下通用功能的函数集合。

3)属性:

属性名类型说明
InstanceBaseCommonAPI这是调用通用功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。

4)函数:

函数名返回值参数类型参数说明
StARkitGetModuleStatusEStARkitCodeEStARkitModulemodule:需要获得哪个模式的状态。获取各模块的当前状态。
EStARkitStatusstatus:查询的模式当前状态。
RegisterModuleStatusCBEStARkitCodeAction<int, int, int, IntPtr>statusCB:注册状态回调函数,当状态发生改变时会主动回调。回调是另外的线程回调的,使用必须注意不能直接在回调中处理Unity组件。回调的参数:见此表后面的一张表格。注册状态变化的回调函数。主要是slam的状态,但是也包括其他模块。建议使用CommonStatusCallBack中的封装模块,
UnRegisterModuleStatusCBEStARkitCodeAction<int, int, int, IntPtr>statusCB:取消注册回调接口,这个一定要是注册时传入的那个。取消状态回调注册,需和注册成对调用。

Action <int,int,int,IntPtr>状态回调函数:

ModlueEventDescription_lengthDescription
(1)st_MODULE_6DOF0 (PLEASE_MOVE_SLIGHTLY)Description 的字节长度,用来读取IntPtr中的数据的。说明字符串
1 (TEXTURE_NOT_ENOUGH)说明字符串
2 (MOVE_TOO_FAST)说明字符串
3 (INITIAL_SUCCESS)说明字符串
4 (TRACK_LOST)说明字符串
5 (KEYFRAME_COUNTER)关键帧编号计数器(int)
6 (RELOCALIZED)字符串:"lost:relocalized(丢失:重新定位成功)","map:relocalized(地图:重新定位成功)"
7 (TRACKING_QOS)浮点数的跟踪质量值[0-100]
8(MAP_EXPORT)字符串:"success"表示保存map文件成功;"fail:bad path"表示文件路径有问题;"fail:unknow"表示未知错误导致失败。
9(MAP_LOAD)字符串"success"表示保存map文件成功;"fail:bad path"表示文件路径有问题;"fail:bad file"表示文件错误;"fail:unknow"表示未知错误导致失败。
10(ANCHOR_FRAMES)保存的锚点环境框架的数量。
(2)st_MODULE_3DOF11(3DOF_INITIAL_SUCCESS)说明字符串

CommonStatusCallBack

1)命名空间:Lenovo.stARkit.Toolkit.Common。

2)简介:这是一个通用的公共状态回调模块,会在程序运行时去注册底层回调,停止时取消注册回调。

3)属性:

属性名类型说明
CurrentCommonStatusCallBack这是一个静态访问单例
StatusCBAction<EStARkitModule, EStARkitEventID, string>;这是一个委托事件变量,通过+=(注册)和-=(取消注册),会在收到底层回调后的下一帧调用注册的委托事件。

EStARkitCode

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这里定义列举了所有函数返回值的枚举型。

3)属性:

属性名说明
SUCCESS0操作成功
FAIL1操作失败
EFINIT2初始化失败
EFDEINIT3取消初始化失败
EPERM4不允许操作
ENOENT5无此文件或目录
ESRCH6没有这样的过程
EIO7I/O 错误
E2BIG8参数列表过长
ENOMEM9超过内存
EBADF10档案编号错误
EACCES11没有权限
EFAILT12地址错误
ENOTBLK13需要阻止设备
EBUSY14设备或资源繁忙
ENODEV15无此设备
EINVAL16无效的参数
EFBIG17文件过大
ENODATA18无可用数据
ETIME19计时器到期
ECOMM20发送通信错误
ELIBACC21无法访问共享库
ELIBBAD22访问损坏的共享库
EUSERS23同时访问者太多
ESOCK24socket通信中断
ENOIMP25没有这样的实现
ELAST26待续(无用)

EStARkitEventID

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是查询模块当前状态中列举的有效模块,目前只支持Android设备(NG2/G2)。

3)属性:

属性名说明
EVENT_6DOF_MOVE_SLIGHTLY06自由度头部跟踪时移动太慢
EVENT_6DOF_TEXTURE_NOT_ENOUGH16自由度头部跟踪初始化面前画面纹理不够
EVENT_6DOF_MOVE_TOO_FAST26自由度头部跟踪移动太快
EVENT_6DOF_INITIAL_SUCCESS36自由度头部跟踪功能初始化成功
EVENT_6DOF_TRACK_LOST46自由度头部跟踪数据锚定丢失
EVENT_6DOF_KEYFRAME_COUNTER56自由度头部跟踪数据关键帧计数器关键帧计数器
EVENT_6DOF_RELOCALIZED66自由度头部跟踪数据重定位
EVENT_6DOF_TRACKING_QOS76自由度头部跟踪数据质量
EVENT_6DOF_MAP_EXPORT86自由度头部跟踪数据导出结果
EVENT_6DOF_MAP_LOAD96自由度头部跟踪数据导入结果
EVENT_6DOF_ANCHOR_FRAMES106自由度头部环境画面存储结果
EVENT_STARKIT_DISABLED20StARkit 服务停止
EVENT_STARKIT_ENABLED21StARkit 服务启动
EVENT_3DOF_INITIAL_SUCCESS223自由度头部跟踪数据初始化成功
EVENT_CAMERA_DATA_READY23相机数据准备就绪
EVENT_POINTCLOUD_DATA_READY24点云数据准备就绪

EStARkitModule

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是查询模块当前状态中列举的有效模块,目前只支持Android设备(NG2/G2)。

3)属性:

属性名说明
MODULE_STARKIT0整个设备
MODULE_6DOF16dof模块
MODULE_3DOF23dof模块
MODULE_MESH3SpatialMesh模块
MODULE_PLANE4FindPlane模块

EStARkitStatus

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:表示各个模块当前状态。

3)属性:

属性名说明
STATUS_UNINIT0模块没有初始化
STATUS_INITED1模块已经初始化
STATUS_RUNNING2模块正在正常工作
STATUS_STOPPED3模块已经停止

ETrackingMode

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这个是Slam的两个模块6dof和3dof的枚举。

3)属性:

属性名说明
TRACKING_POSITION0表示6dof。
TRACKING_ORIENTATION1表示3dof。

ETrackingNote

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这个是Slam的节点坐标系的枚举。

3)属性:

属性名说明
None0未定义
HEAD1人的两眼中间
RGB2RGB相机
TOF3TOF相机
IMU4IMU坐标系

IStARkitHeadTrackingService

1)命名空间:Lenovo.stARkit.Tookit.HeadTracking。

2)简介:这是SDK提供的所有预制体中控制Slam的接口,如果使用了提供的预制体,可以用CoreServices.HeadTrackingService的方式调用Slam相关的控制。

3)属性:

属性名类型说明
TrackingModeETrackingMode表示当前是6dof还是3dof。
TrackingNoteETrackingNote当前是处于哪个节点坐标下。
NoteGameObject获得的slam数据应用的节点。
IsHeadTrackingRunningBoolSlam是否正常启动运行,仅代表Start和stop的调用。
DisableUpdateDataBoolTrue,不将数据应用给节点,false将数据应用给节点。

4) 函数:

函数名返回值参数类型参数说明
EnableHeadTracking开启Slam功能
DisableHeadTracking关闭Slam功能
ChangeHeadTrackingModeETrackingModetrackingMode:表示是6dof还是3dof。在6dof和3dof之间切换。切换流程是先关闭slam,然后以新模式重新启动。

STrackingData

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.DefinitionsI。

2)简介:这是Slam 跟踪的数据信息,包括时间戳,旋转和平移。

3)属性:

属性名类型说明
dTimedouble时间戳,单位是秒。
dVectordouble[]slam的平移数据,,是x,y,z三个轴坐标的数组,所以长度为3。
dQuaterniondouble[]slam的旋转四元素数据,分别是x,y,z,w,长度为4。
tagchar[]数据标签信息,长度为10。

GlassSeeThrough

这个Demo是只支持Android设备(NG2/G2)的,设备必须具备DisplayEngine 和Slam两个功能,主要展示双目合像显示和Slam的3dof/6dof锚定效果。

  1. 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/GlassSeeThrough/Scene/ GlassSeeThrough,按照Android Build的步骤出一个APK。
  1. 默认的是打开了ATW(异步时间补偿)功能的,启动6dof,可以在Scene中的StARkitGlassSeeThrough上挂的脚本修改,如下图:

StARkitGlassSeeThrough类

1)命名空间:无

2)简介:这是通过DisplayEngine看3D物体的管理类,这个类会去控制显示和头部跟踪的流程。

3)属性:

属性名类型说明
TrackingHeadGameObject获取和设置Slam数据的使用对象。
  1. 函数:
函数名返回值参数类型参数说明
CloseBeforeLoadScene场景跳转之前调用,关闭显示和头部跟踪。
SetATWActiveboolactive:为true时激活ATW功能,为false时关闭ATW功能动态开关ATW的功能。

VideoSeeThrough

这个Demo主要是展示RGB相机视角的虚实叠加效果的。

注意:这里的叠加是指RGB相机拍到的画面和Unity的虚像之间的叠加,不是人眼看实像和虚像叠加;在Box设备上RGB相机的编号id是0,在Windows上大部分情况是1;只有NG2支持多分辨率内参,G2只支持640*480。

  1. 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/VideoSeeThrough /Scene/VideoSeeThrough 依照上面的Android Build或者PC Build的步骤出一个应用。
  1. 场景中的StARkitVideoSeeThrough预制体上有一些设置参数。如下图

ResolutionCode: RGB相机的分辨率设置。

CameraID: 打开相机的编号,Android端设为0,PC端如果电脑自带摄像头则设为1,

BinocularDisplay: 画面分为左右两个,方便通过glass观看。

FitScreen: 低分辨率的时候自动铺满屏幕

  1. 按照相应平台的安装步骤,安装程序并运行。
  2. 程序运行后会看到一个蓝色的方块,在box上点击ok可以让方块跟随头动,选择一个合适位置后再次点击OK,方块将停留在原位,这时可以围绕方块观察和RGB拍到的位置的叠加关系。

空间重建

SpatialMesh 相关的API

1)命名空间:Lenovo.stARkit.SDK.Features.API。

2)简介:这个是控制SpatialMesh功能的控制类,可以通过里面的函数开关SpatialMesh功能,获取空间Mesh数据。

3)属性:

属性名类型说明
InstanceBaseSpatialMeshAPI这是调用SpatialMesh功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。

4)函数:

函数名返回值参数类型参数说明
StARkitStartSpatialMeshEStARkitCode开启扫描空间Mesh功能。
StARkitStopSpatialMeshEStARkitCode关闭扫描空间Mesh功能。
StARkitClearSpatialMeshEStARkitCode清除扫描缓存的数据。
StARkitSaveFinalSpatialMeshEStARKitCodestringmeshPath:保存文件路径。根据传入的文件路径将扫描缓存的数据保存为完整版,传入的文件必须是.raw。此函数已被弃用,请使用StARkitSaveFinalSpatialMeshWithSimplify(string meshPath,string simplifyMeshPath)
StARkitSaveFinalSpatialMeshEStARKitCodestringmeshPath:保存文件路径。根据传入的文件路径将扫描缓存的数据保存为完整版和精简版,传入的文件必须是.raw。
stringsimplifyMeshPath:精简版mesh数据保存路径,主要用于生成碰撞体的mesh
StARkitGetFinalSpatialMeshEStARkitCodestringmeshPath:存储的数据文件路径。这是把StARkitSaveFinalSpatialMesh存储的数据读取出来。
SStARkitMeshDatameshData:读取的文件数据。
StARkitGetBlockMeshInfoEStARkitCodeuintblockBufferSizeOut:更新mesh碎片的信息结构体的个数。获取当前需要更新的mesh的基本数据,然后分配空间取获取数据。这个是和StARkitGetBlockMesh配合使用的。
uintvertexBufferSizeOut:更新mesh数据的顶点结构体的个数。
uintfaceBufferSizeOut:更新mesh的三角面片信息结构体的个数。
StARkitGetBlockMeshEStARkitCodeuintblockBufferSizeOut:更新mesh碎片的信息结构体的个数。根据StARkitGetBlockMeshInfo拿到的数据信息,分配内存然后取拿去数据,将对应的数据以数据列表的形式返回。不建议使用这种方式。
uintvertexBufferSizeOut:更新mesh数据的顶点结构体的个数。
uintfaceBufferSizeOut:更新mesh的三角面片信息结构体的个数。
List<SBlockMeshInfo>blockMeshInfos:拿到的mesh碎片的信息列表。
List<SMeshVertex>Vertexs:拿到的mesh顶点信息列表。
List<SMeshFaceTriangleIndex>faceTriangles:拿到的mesh三角面信息列表。
StARkitGetBlockMeshEStARkitCodeSStARkitMeshData[]meshData:拿到的可以直接用于画mesh的数据。获取mesh数据的重载,这个函数包含了StARkitGetBlockMeshInfo和StARkitGetBlockMesh的组合使用,简化了调用。建议使用这种方式获取数据。
StARkitReadMeshRawEStARkitCodestringpath:读取的数据文件路径读取文件中的mesh数据。这是protected函数,只是在内部几次中调用。
SStARkitMeshDatameshData:读取的mesh数据。

SStARkitMeshData

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是用来画Mesh的数据的集合,FindPlane和SpatialMesh的数据最后会整合后为SStARkitMeshData,这里面的顶点数组和三角数组可以用来直接画Mesh。

3)属性:

属性名类型说明
MeshIDuint空间Mesh的编号,根据这个ID来判断哪个部分的Mesh数据更新了。
MeshVerSionuintMesh数据的更新号。
VerticesVector3[]Mesh的顶点数组。
Trianglesint[]Mesh的三角面排列数组。
planeSStARkitPlaneData当Mesh是FindPlane的数据时包含一个中心点和法线信息。

SBlockMeshInfo

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是SpatialMesh的mesh的数据信息的结构体,这个结构体包含了顶点个数和三角面个数,和SMeshFaceTriangleIndex,SMeshVertex配合一起使用。

3)属性:

属性名类型说明
MeshIDuint空间Mesh的编号,根据这个ID来边帮那个部分的Mesh数据更新了。
MeshVersionuintMesh数据的更新号,当此编号发生变化,表示数据发生了变化。
MeshVertexCountuint此次mesh数据的顶点个数。
MeshFaceCountuint此次mesh数据的三角面个数。

SMeshFaceTriangleIndex

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是SpatialMesh的三角面信息的结构体,表示哪3个顶点组成一个三角面,和SBlockMeshInfo,SMeshVertex配合使用。

3)属性:

属性名类型说明
v0uint三角面的第一个顶点。
v1uint三角面的第二个顶点。
v2uint三角面的第三个顶点。

SMeshVertex

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是SpatialMesh的顶点信息结构体,表示一个顶点在世界坐标系下的位置,和SBlockMeshInfo,SMeshFaceTriangleIndex配合使用。

3) 属性:

属性名类型说明
xfloat顶点X轴的坐标
yfloat顶点Y轴的坐标
zfloat顶点Z轴的坐标

3D重建 Demo

这个Demo是只支持Android设备(NG2/G2)的,设备必须具备DisplayEngine,Slam,TOF相机。其核心的算法是基于TOF相机的。

  1. 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/SpatialMesh/Scene/SpatialBlockMeshExample,依照上面的Android Build的步骤出一个APK。
  1. 将Build好的apk在设备中安装好后运行应用。
  2. 运行起来后将看到有4个选项按钮在视野前方并会跟随头动,使用gaze对这些按钮进行操作。

Start Scan Mesh : 开启空间扫描功能,函数的调用结果会在4个按钮下方的第一个显示栏显示,根据显示内容查看函数调用情况。如果函数调用成功了,那么每帧都会去获取数据,但不是每次都有数据更新的,数据函数的结果会在最下方的信息栏显示,最后的数字表示拿到Mesh碎片的个数。

Stop Scan Mesh : 关闭扫描功能,函数的调用结果会在4个按钮下方的第一个显示栏显示,根据显示内容查看函数调用情况。

Save Final Mesh : 将扫描到的结果全部保存下来,现在保存的文件格式raw,当需要时可以调用加载FinalMesh的函数读取显示。函数的调用结果会在4个按钮下方的第一个显示栏显示,根据显示内容查看函数调用情况。

Clear Mesh : 清除当前缓存的数据,重新开始扫描,相当于停止后重新开始。函数的调用结果会在4个按钮下方的第一个显示栏显示,根据显示内容查看函数调用情况。

FindPlane 相关的API

1)命名空间:Lenovo.stARkit.SDK.Features.API。

2)简介:这个是控制FindPlane功能的控制类,可以通过里面的函数开关FindPlane功能,获取平面数据。

3)属性:

属性名类型说明
InstanceBaseFindPlaneAPI这是调用FindPlane功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。

4)函数:

函数名返回值参数类型参数说明
StARkitStartFindPlaneEStARkitCode开启FindPlane功能。
StARkitStopFindPlaneEStARkitCode关闭FindPlane功能。
StARkitGetPlaneDataEStARkitCodeEPlaneTypeplaneType:平面的方向。获取平面数据,根据获取的平面的顶点数据渲染平面。
SStARkitMeshData[]planeData:平面数据数组,一个代表一个平面。
ReadDataEStARkitCodeEPlaneTypeplaneType:平面的方向。根据平面内存地址读取平面数据,最后以数组的形式返回。这是protected函数,用于内部调用。
IntPtrdata:平面数据的内存地址
SStARkitMeshData[]planeData:平面数据数组,一个代表一个平面。

EPlaneType

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是定义了平面方向的枚举型。

3)属性:

属性名说明
HORIZONTAL_DOWNWARD0平面水平向下
HORIZONTAL_UPWARD1平面水平向上
VERTICAL2平面垂直

SStARkitPlaneData

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是FIndPlane特有的一些平面信息。

3)属性:

属性名类型说明
centerfloat[]平面的中心点,是x,y,z三个轴坐标的数组,所以长度为3。
normalfloat[]平面的法线方向,是x,y,z三个轴坐标的数组,所以长度为3。
widthfloatFish相机的FindPlane特有的,表示平面的宽,单位是米。
heightfloatFish相机的FindPlane特有的,表示平面的长,单位是米。

找平面Demo

这个Demo是只支持Android设备(NG2/G2)的,设备必须具备DisplayEngine 和Slam两个功能,和fish相机或者TOF相机。功能是主要是用fish相机或者TOF相机扫描筛选出空间中的平面数据。

  1. 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/FindPlane/Scene/FindPlaneExample,依照上面的Android Build的步骤一个APK。
  1. 将Build好的apk在设备中安装好后运行应用。
  2. 运行起来后,你将看到有3个按钮跟随头部。使用gaze对这些按钮进行操作。

Start Find plane : 开始扫描空间中的平面,这个函数的调用结果会在3个按钮下方的第一个显示栏显示,可以查看函数的调用情况。如果接口调用成功,会间隔0.5秒去取一次最新的平面数据,并将平面渲染出来。拿数据的函数调用结果会在最下方的一栏显示。

Stop Find Plane : 关闭扫描空间平面的功能,函数调用的结果会显示在3个按钮下方的第一个显示栏。

HORIZONTAL_DOWNWARD : 这是一个下拉选项,有三个可选项,HORIZONTAL_DOWNWARD(平面水平向下),HORIZONTAL_UPWARD(平面水平向上),VERTICAL(平面垂直水平面)。这个下拉框的值会限定fisn相机的算法过滤掉不符合的平面数据(目前算法默认只找水平的平面),在TOF相机下不起作用。

环境识别与定位

Anchor 相关API

1)命名空间:Lenovo.stARkit.SDK.Features.API。

2)简介:云环境识别和本地重定位的功能接口。

3)属性:

属性名类型说明
InstanceBaseCloudEnvironmentMapAnchor这是调用通用功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。

4)函数:

函数名返回值参数类型参数说明
StARkitStartEnvironmentScanEStARkitCodeboolcloud:是否使用云识别,暂时只支持本地,所以先填flase开启记录环境的功能,Cloud=ture时会保存环境图片到传入的路径地址,Cloud=false时无特殊操作。该函数已被弃用,请使用StARkitStartScan(bool,int, Action<EStARkitCloudCode, string>)代替
stringsavePath(必填):文件保存路径,确保路径存在且有访问权限
intmaxCount=100:环境记录时保存的图片数量,仅云识别使用,本地识别时无需填写。
Action<EStARkitCloudCode, string>saveCB:记录环境过程中的一些信息状态的回调,只在云环境识别过程中使用。
StARkitStopEnvironmentScanEStARkitCodeboolcloud:是否使用云识别,暂时只支持本地,所以先填flase停止记录环境,保存map数据,如果cloud=true,则会将数据和记录的图片数据上传服务器,服务器会返回一个表示Id。该函数已被弃用,请使用StARkitStopScan(string Action<EStARkitCloudCode,string>,string,string)代替
stringdatName(必填):保存的map数据文件名,必须是.dat格式
Action<EStARkitCloudCode, string>uploadCB(必填):本地保存文件结果和上传云端的状态回调
stringserverURL(使用云必填):云服务器的地址
stringtoken(使用云必填):服务器访问的授权
StARkitStartEnvironmentReconEStARkitCodeboolcloud:是否使用云识别,暂时只支持本地,所以先填flase开启环境识别功能,开始扫描周围环境,cloud=false,之间读取传入的本地map文件,开启重定位;cloud=ture,记录扫描的环境图像上传云端匹配,会反复保存上传,直至匹配成功后下载云端map数据自动加载进行重定位。该函数已被弃用,请使用StARkitStartRecon(bool,string,Action<EStARkitCloudCode,string>,string,string)代替
stringsavePath(必填):文件保存路径,确保路径存在且有访问权限,如果是本地map,则是本地map保存的路径
stringdataName(本地必填):如果是本地必须填写之前保存的文件名
Action<EStARkitCloudCode, string>reconCB:环境扫描的结果回调,本地仅返回加载map文件的结果。
stringserverURL(使用云必填):云服务器的地址
stringtoken(使用云必填):服务器访问的授权
StARkitStopEnvironmentReconEStARkitCodeboolcloud:是否使用云识别,暂时只支持本地,所以先填flase如果cloud=ture会去中断扫描环境识别的过程。如果cloud=flase不会进行任何特殊操作。LoadMap之后的重定位过程是无法中断的。该函数已被弃用
StARkitDeleteCloudMapEStARkitCodestringserverURL(云必填):云服务器的地址根据targetId删除服务器上对应的环境数据。
stringtoken(必填):服务器访问的授权
inttargetId(必填):云端保存环境数据的标识Id
Action<EStARkitCloudCode, string>deleteCB:删除数据的结果回调
StARkitSetLocalAnchorEStARkitCodeSStARkitAnchoranchor:记录的anchor数据将Anchor保存本地并上传云端,暂时不支持。**该函数已被弃用,StARkitSetInterestArea(SStARkitAnchor) **
stringserverURL:云服务器的地址
stringtoken:服务器访问的授权
stringtargetId:需要保存到云端的环境标识Id
Action<EStARkitCloudCode,string>anchorCB:云端保存的结果回调。
StARkitResetLocalMapEStARkitCode本地Load的数据清除,恢复到之前的slam状态。该函数已被弃用,请使用StARkitResetMapData()代替
StARkitStartScanEStARkitCodeboolcloud:是否使用云服务器开始建图环境扫描
intselfDefineCloudSavePicNum:环境扫描保存最大图片数量
Action<EStARkitCloudCode, string>scanCB:扫描结果回调(本地扫描时可以为Null)
StARkitStartScanEStARkitCodeboolcloud:是否使用云服务器开始建图环境扫描
EStARkitCloudSavePicNumLevelpictureCode:环境扫描保存最大图片数量
Action<EStARkitCloudCode, string>scanCB:扫描结果回调(本地扫描时可以为Null)
StARkitStopScanEStARkitCodestringmapSlamDatFile:环境扫描保存的数据文件地址(必须为完整的文件路径,文件格式为.dat)停止扫描环境并保存扫描数据
Action<EStARkitCloudCode, string>scanCB:保存扫描数据的结果回调
StARkitBuildEnvironmentEStARkitCodestringmapSlamDatFile:扫描保存的数据文件(必须为完整的文件路径)创建云环境
stringiconFile:缩略图的文件地址(必须为完整的文件路径 .png格式)
stringserverURL:云服务器地址
stringtoken:权限码
Action<EStARkitCloudCode, string>buildCB:云环境创建结果回调
StARkitConfirmEnvironmentEStARkitCodeEStARkitCloudConfirmcloudConfirm:选择(确认创建(id 为新环境的id),替换旧库(id 为需要删除的旧id),放弃创建(id 为新建的id))对创建的云环境做一个选择(确认创建,替换旧库,放弃创建)
intid:需要操作的id
stringserverURL:云服务器地址
stringtoken:权限码
Action<EStARkitCloudCode, string>confirmCB:选择结果回调
StARkitReconEStARkitCodeboolcloud:是否使用云识别开启环境识别
stringmapSlamDatFile: 本地识别加载的数据文件(必须为完整的文件路径 格式为.dat)
Action<EStARkitCloudCode, string>reconCB:识别结果回调
stringserverURL=Null:服务器地址(本地识别可以不填)
stringtoken=Null:权限码(本地识别可以不填)
StARkitLoadMapDataEStARkitCodeintid:指定云环境id选择指定id的数据下载并使用
stringserverURL:服务器地址
stringtoken:权限码
Action<EStARkitCloudCode, string>loadCB:下载数据和本地加载重定位的回调
StARkitResetMapDataEStARkitCode清除加载的环境数据,取消重定位
StARkitGetCloudInfoListEStARkitCodeintpageIndex:获取页数(每次获取成功都会返回存储的总数量)获取当前权限下所有的云环境列表
intpageSize:每页的个数
stringserverURL:服务器地址
stringtoken:权限码
Action<EStARkitCloudCode, string>getCB:获取结果回调,数据将以json的格式返回
StARkitSetInterestAreaEStARkitCodeSStARkitAnchorarea:感兴趣的区域中心位置设置感兴趣的区域中心(在扫描环境的过程中调用)

EStARkitCloudCode

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:云端接口的状态。

3)属性:

属性名说明
SUCCESS0成功
PROGRESS1中间过程
SAVE_PICTURE2扫描图片进度
SAVE_MAP_DATA3保存环境数据
LOAD_MAP_DATA4加载环境数据进行重定位
GET_ID5新环境或者识别环境的ID
CONFIRM_DATA6需要选择确认的数据是Json格式
INFO7数据数量信息
RELOCALIZED8重定位成功
UP_LOAD_PROGRESS9上传进度条
DOWN_LOAD_PROGRESS10下载进度条
FAIL11失败
EToken12Token错误
EFILEPATH13文件路径错误
ENODATA14无数据
ENET15网络错误
EHTTP16HTTP通信异常
EEXC17系统捕获异常

EStARkitCloudConfirm

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:云环境建图和识别有相似场景时的确认选项。

3)属性:

属性名说明
Replace0舍弃旧的
Build1保留新建
Give_Up2删除新建的

EStARkitCloudSavePicNumLevel

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:云环境建图和识别时扫描环境保存的最大图片数量。

3)属性:

属性名说明
PIC_SAVE_LOW0设定图片数量为20
PIC_SAVE_MEDIUM_LOW1设定图片数量为50
PIC_SAVE_MEDIUM_HIGH2设定图片数量为80
PIC_SAVE_HIGH3设定图片数量为100

SStARkitAnchor

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是本地map设置锚定信息时的数据封装。

3) 属性:

属性名类型说明
timestampdoublue锚点的创建时间戳
anchor_idint锚点的编号id
anc_pos_xfloat锚点位置的X轴坐标
anc_pos_yfloat锚点位置的Y轴坐标
anc_pos_zfloat锚点位置的Z轴坐标
anc_rot_xfloat锚点四元素的X
anc_rot_yfloat锚点四元素的Y
anc_rot_zfloat锚点四元素的Z
anc_rot_wfloat锚点四元素的W
cam_pos_xfloat观察点的X轴坐标
cam_pos_yfloat观察点的Y轴坐标
cam_pos_zfloat观察点的Z轴坐标
cam_rot_xfloat观察点四元素的X
cam_rot_yfloat观察点四元素的Y
cam_rot_zfloat观察点四元素的Z
cam_rot_wfloat观察点四元素的W

Anchor Demo

这个Demo主要是展示Slam本地重定位以及云环境识别的流程以及效果,支持Android设备(NG2)。

  1. 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/MapDemo/Scenes/TestAnchor 依照上面的Android Build的步骤出一个应用。
  1. 将Build好的apk在设备中安装好后运行应用。
  2. 运行起来后会看到2个按钮和1个勾选项,其中勾选项表示是否使用云环境识别,只有在成功获取Token后才可勾选。
  1. 如果不勾选使用云环境识别,则为本地数据保存和识别,点击开始扫描环境开始扫描,界面如下图:
  1. 扫描环境结束后点击停止扫描环境保存数据,之后可以点击重新开始回到刚开始的界面。
  1. 如果不勾选使用云环境识别,点击开启识别 加载最近一次保存的环境数据开始重定位,过程中点击清除数据加载 可以停止本次重定位回到一开始的界面,界面如下图:
  1. 如果重定位成功,场景中的方块将回到保存数据时的方位,界面也会出现文字提示和重新开始的选项。
  1. 如果选择了UseCloud使用云环境识别,界面会多出一个获取获取云环境列表的按钮。
  1. 勾选UseCloud后,选择开始扫描环境将开始扫描环境并保存环境数据和图片,扫描的过程中需要有移动,尽量扫纹理丰富有明显特征的区域,当上面进度达到50%后会出现停止扫描环境的选项可以提前停止,如下图:
  1. 点击停止扫描环境之后,如果认为扫描的没有问题就选择上传数据创建云环境,如果不想保留这组数据可以选择重新开始。
  1. 选择上传数据创建云环境 后,需要拍摄一张能够代表环境的缩略图。
  1. 拍摄好缩略图之后,会自动上传缩略图和之前保持的环境数据及照片,在服务器进行匹配创建。
  1. 数据上传之后会返回场景的id,如果没有则流程结束;如果服务器有相似场景需要进行确认操作,选择舍弃旧的之后需要再选择一下舍弃环境的图标按钮进行删除;选择保留新建,则所有场景都会保存在服务器;选择删除新建,则会将新建的数据删除。
  1. 勾选UseCloud后,选择开启识别将会自动开始扫描环境,当进度达到100%后自动上传服务器进行匹配。
  1. 服务器匹配成功之后,如果没有符合的场景则回到一开始的选择界面,如果有相似场景,需要根据匹配度score 和缩略图进行确认选择一个下载数据进行本地重定位。

物体识别与定位

目标制作

物体目标

用户想识别一个物体,但没有其对应的3D模型,可以基于扫描的方式来制作识别目标。 该类型目标需要首先使用晨星扫描仪扫描采集待识别目标的数据后,上传到云端进行训练处理,进而生成目标识别信息,然后即可在平台网页端进行管理操作。 目标管理操作见这里晨星扫描仪的使用方法参考此处

区域目标

若需要识别的对象为一个空间区域,其制作目标的方式和物体目标类似,仅需在扫描仪中右上角切换为环境模式即可。

模型目标

模型目标通过在平台网页端上传目标对应的3D模型。在项目中点击“物体识别目标物”进入上传资源页面,再点击右上方"上传"-"模型"按钮,在弹出的对话框内填写目标名称后,选择本地模型文件和模型文件的单位,点击上传模型,即可将模型和相关信息上传到云端,从而进行自动处理,生成识别目标。

注意:模型文件格式目前支持obj、fbx和dae。若该识别应用是运行在AR眼镜,请务必选择正确的模型单位

图片目标

图片目标是指用户在平台上传一张图片,经云端自动处理后生成可用于stARkit for Cross-platform SDK识别的目标。然后用户将该图片打印出来后,SDK可直接识别打印的图片,进行叠加各种虚拟的信息。图片目标的制作流程与模型目标基本一样,仅在于上传时选择图片即可。 注意:若该识别应用是运行在AR眼镜,请务必填写正确的打印图片宽度

目标管理和下载

在项目页面点击“物体识别目标物”,进入目标管理页面后,可以看到当前项目中的所有目标及其信息。上述各类目标在经过平台处理后,显示为可用状态时,可以通过目标列表右侧的“下载”按钮,将制作好的目标下载到本地电脑中,用于后续的应用开发。 下载的目标为tag[id]-[rand-string].zip的形式,请不要更改文件名和内容。

基于Unity SDK进行物体识别应用开发

在Assets/Recognition中,提供了一个目标识别与跟踪的示例场景(见Assets/Recognition/Tutorial/Scenes/RecognitionTutorial.unity),双击打开后既可在unity editor中修改配置并运行。若需要自己制作场景,请参考以下步骤,下列步骤以Unity2020.3.8f1c1为示例,不同版本unity的界面或选项存在一定差异。

场景配置

在Unity下方的项目窗口中,找到相关的预制件,将其拖拽添加到Unity场景中,注意各个预制件的层级,添加后状态见下图红框。需要添加的预制件包含:

/Assets/Common/Prefabs/SRApplication.prefab

/Assets/stARFrame/Prefabs/SRFrameManager.prefab

/Assets/stARFrame/Prefabs/SRBackground.prefab(PC设备必选,其他设备可选)

/Assets/Recognition/Prefabs/SRTargetReco.prefab

/Assets/Recognition/Prefabs/SRTargetManager.prefab

/Assets/Recognition/Prefabs/SRNotification.prefab (可选)

具体配置:

点击场景中的SRApplication,并在右侧属性列表输入服务器网址以及应用的APP Key和Secret,请务必填入自己APP对应的Key和Secret,获取途径参考此处

点击SRFrameManager,选择相应的设备类型。SRTargetReco建议使用如图配置。

添加目标到场景中

点击场景中的SRTargetManager,右侧属性面板点击"添加目标"按钮,在弹出的对话框中,找到从开发者网站下载的目标文件zip包,点击"打开"即可将该目标添加到场景中,加载一个SRTargetModel_tag[xxx]预制件。同时在SRTargetManager面板的目标列表会显示当前场景中的目标,通过点击“删除”按钮可将对应目标移除。

叠加虚拟模型

如上述操作添加目标后,相应SRTargetModel预制件中会附着一个目标3D模型作为子物体,此处可以根据具体业务需求,在该3D模型下挂着各种虚拟资源(模型、视频、图片等),这样在识别到该物体时便会自动显示加入的虚拟资源。

运行程序

在PC上插入一台摄像机,点击Unity顶部开始按钮,即可进行识别。或者将其打包为安卓或AR眼镜上的应用,在相应设备上运行,具体流程见打包安卓应用

高级开发帮助

unity预制件配置说明

SRApplication
Domain Host设置平台网站域名,通常为https://daystar.lenovo.com, 私有云用户的具体修改值需联系服务器管理员
App Key需要识别的APP对应的Key
App Secret需要识别的APP对应的Secret
SRTargetReco
Auto Get FrameTrue:自动获取图像,无需用户传图像 False:用户需自主传入图像帧
Auto Start RecoTrue:应用启动时自动开始识别 False:用户手动调用接口开启识别
Tracking Mode

TARGET_TRACKING:物体跟踪,建议在手机、PC等设备上使用
ENV_TRACKING:环境跟踪,建议在晨星AR眼镜上使用,适用于物体静止的场景

Roi Width Ratio识别感兴趣区的宽度与图像宽度比例
Roi Height Ratio识别感兴趣区的高度与图像高度比例
SRFrameManager
Device Type

设备类型
D_WebCamera: windows PC
D_ARFoundation:安卓手机平板等
D_Hololens: HoloLens眼镜
D_Starkit:晨星AR眼镜连接拯救者手机和基于光学透视的晨星AR眼镜

Resolution相机分辨率
Auto Open Camera是否自动开关相机
SRTargetModel
Tag目标唯一标识,由云端系统生成
Auto Add Target自动加载目标,取消勾选后需用户自行调用接口加载,适合高级开发者使用
Auto Enable Target自动激活目标,取消候选后需用户自行调用接口激活

接口调用

对于初级开发者,只需通过导入和配置预制件即可完成基本的3D目标识别应用。但当需要在一个解决方案中使用stARkit识别提供的功能时,应用开发者需要自行控制识别算法的启动结束时机,或者根据识别结果激活一些自定义的行为。这样的应用场景下,需要开发者主动调用SDK的接口和重新注册事件回调来实现。stARkit识别 SDK提供的接口类为SRTargetRecoBehaviour,该类提供了实例获取方法public static SRTargetRecoBehaviour Instance(),通过该方法获取类实例后即可调用其中的接口控制算法行为。其中控制识别算法的接口主要有:

目标操作接口

//========================================================
//action有4种类型:
//    TARGET_ACTION_ADD     —— 加载目标
//    TARGET_ACTION_REMOVE  —— 删除目标
//    TARGET_ACTION_ENABLE  —— 激活目标
//    TARGET_ACTION_DISABLE —— 冻结目标
//========================================================
public void TargetDoAction(string tag, SRTargetAction action);

一个目标需要先被加载,然后激活后才可以被识别和跟踪。

但一个目标暂时不需要识别时,可以将其冻结,若后续都不再需要使用,则建议将其删除以节约系统资源。一个目标被加载后默认处于冻结状态。

在RecognitionTutorial的SRTargetBehaviour.cs脚本文件中有调用示例。

识别流程控制接口

//========================================================
//暂停识别,调用接口后,识别回调事件将不会被触发
//========================================================
public void TargetRecoPause();

//========================================================
//恢复识别
//========================================================
public void TargetRecoResume();

自定义回调事件

stARkit识别在每个主要接口调用完成后,会触发相应的回调事件。用户可以通过注册回调的方式触发自定义行为。

SDK初始化完成

在SDK初始化完成后会触发,通常仅在应用启动后触发一次。该事件在SRTargetBehaviour.cs脚本有调用示例,用于在初始化完成后自动加载目标。

回调事件:SRTargetRecoBehaviour.InitializeEvent
回调函数:void SRInitializeFinishedCallback(int errCode);
参数说明:errCode —— 初始化错误码,0:成功, 非0:失败

目标操作完成

每次目标操作完成后触发。该事件在SRTargetBehaviour.cs脚本有调用示例,用于加载目标后自动激活目标。

回调事件:SRTargetRecoBehaviour.DoActionEvent
回调函数:void SRDoActionFinishedCallback(int errCode, string tag, SRTargetAction action);
参数说明:errCode —— 初始化错误码,0:成功, 非0:失败
		 tag —— 操作目标的tag
		 action —— 操作类型

SDK销毁完成

在SDK销毁完成后会触发,通常仅在应用退出前触发一次

回调事件:SRTargetRecoBehaviour.DestroyEvent
回调函数:void SRDestroyFinishedCallback(int errCode);
参数说明:errCode —— 初始化错误码,0:成功, 非0:失败

单帧识别完成

每帧识别完成后都会触发一次,可根据回调的识别目标信息来判断该帧图像的识别情况。该事件在SRTargetBehaviour.cs脚本有调用示例,在每帧识别完后,实时更新虚拟模型的在场景中的位姿信息。

回调事件:SRTargetRecoBehaviour.TargetPoseChangedEvent
回调函数:void SRTargetPoseChangedCallback(int errCode, SRAugTargets augTargets, IntPtr usrData);
参数说明:errCode —— 初始化错误码,0:成功, 非0:失败
		 augTargets —— 识别出的目标以及其位姿信息
		 usrData —— 用户自定义信息,默认情况为识别图像帧的一些附加信息

自定义相机数据

默认情况下,stARkit识别 SDK会自动打开相机获取画面进行识别,在某些情况下,开发者需要多个模块共用一个相机,因此需要其自行控制相机的开关,并将图像数据传到stARkit识别 SDK中。 SDK中提供了一个接口供外部传入图像数据:

void SubmitFrame(ref SRRecoFrame frame);
frame —— 图像帧数据

同时,若要主动调用该接口,需要在SRTargetReco prefab中把“自动获取图像”的复选框去除勾选。

其他接口说明

stARkit识别 SDK 接口中还提供了2个接口,用于获取SDK相关的状态:

SDK版本获取接口

//用于获取stARkit识别 SDK的版本信息
public string GetVersion();

错误描述信息获取接口: 每个回调事件中都会附带一个错误码,用于标识本次接口调用是否成功,当错误码非0时,可以调用GetErrorDescription函数获取错误信息,辅助定位失败原因。

//获取错误码对应的描述
public string GetErrorDescription(int errCode);

其他

Display 相关的API

1)命名空间:Lenovo.stARkit.SDK.Features.API。

2)简介:GlassSeeThrough使用的DisplayEngine的对外API集合。

3)属性:

属性名类型说明
InstanceBaseDisplayAPI这是调用显示相关功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。

4)函数:

函数名返回值参数类型参数说明
DisplayGetPredictedTimeEStARkitCodefloatpredoctedTime:显示动态预测时间获取显示预测时间
DisplaySetWarpModeEStARkitCodeboolstatus : ture 打开ATW(动态预测);false 关闭ATW(动态预测)控制ATW功能的开关

SStARkitEyeData

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是获取Glass的左右眼的标定参数的数据集合。

3) 属性:

属性名类型说明
fovDownfloat下半屏fov
fovLeftfloat左半屏fov
fovRightfloat右半屏fov
fovUpfloat上半屏fov
posFloat[]一个长度为3的float数组,分别表示位置的X,Y,Z
rotFloat[]一个长度为3的float数组,分别表示旋转的X,Y,Z

CameraParameterAPI

1)命名空间:Lenovo.stARkit.SDK.Features.API。

2)简介:这是获取相关标定参数的API集合。

3)属性:

属性名类型说明
InstanceBaseCameraParameterAPI这是调用通用功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。

4)函数:

函数名返回值参数类型参数说明
StARkitGetRGBCameraGetIntrinEStARkitCodeEStARkitResolutionCoderesolution:需要获取内参的分辨率(G2设备只支持640*480)获取指定分辨率下的RGB内参。
SStARkitRGBIntrinrgbIntrin:标定的RGB的内参数据
StARkitGetUnityCameraFovEStARkitCodeEIOConfigDataTypedataType:获取数据的种类(IO_CMD_GET_LEFT_EYE和IO_CMD_GET_RIGHT_EYE)获取左眼或者右眼的显示fov瞳距等参数
SStARkitEyeDataeyeData:标定的Glass的显示参数

EIOConfigDataType

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:获取标定参数的数据类型。

3)属性:

属性名说明
IO_CMD_GET_RGB_INIRINSIC1RGB相机的内参
IO_CMD_GET_LEFT_EYE2Glass的左眼显示FOV和瞳距等显示参数
IO_CMD_GET_RIGHT_EYE3Glass的右眼显示FOV和瞳距等显示参数

EStARkitResolutionCode

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:图像分辨率。

3)属性:

属性名说明
R2592X19441分辨率为2592*194
R1920X10802分辨率为1920*1080
R1280X7203分辨率为1280*720
R640X4804分辨率为640*480
R640X3605分辨率为640*360

SStARkitRGBIntrin

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:这是获取RGB内参的数据集合。

3)属性:

属性名类型说明
fxfloat内参的fx
fyfloat内参的fy
cxfloat内参的cx
cyfloat内参的cy

RGBD 相关的API

1)命名空间:Lenovo.stARkit.SDK.Features.API。

2)简介:这个是将RGB图像和TOF图像之间进行转换的功能,赋予RGB图像深度值,只能在拥有TOF相机的设备上使用(例如G2)。

3)属性:

属性名类型说明
InstanceBaseRGBDAPI这是调用RGBD功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。

4)函数:

函数名返回值参数类型参数说明
StARkitStartRGBDEStARkitCodeEStARkitRGBDModetrans_mode:RGBD的工作模式用于启动工作流程和初始化RGBD算法。
EStARkitTofModetof_mode:TOF相机的工作模式
intrgb_w:rgb图像数据的宽(像素分辨率)
intrgb_h:rgb图像数据的高(像素分辨率)
StARkitStopRGBDEStARkitCode用于关闭工作流程和初始化RGBD算法。
StARkitDoRGBDEStARkitCodeIntPtrin_rgb_img:要输入到RGBD算法的rgb图像数据缓冲区。如果在StARkitStartRGBD中将工作模式设置为"RGB_DEPTH",则必须输入此参数并且不能为null。如果工作模式设置为"DEPTH_RGB"或"DEPTH_RGB_PIXEL", 此输入缓冲区不会在算法中使用,因此参数可以为null。如果将rgb图像输入到算法中,则图像的分辨率必须等于在" StARkitStartRGBD"中设置的rgb_w和rgb_h。用于执行RGBD算法的API。 每次调用API时,RGBD算法都会输出rgbd结果数据。必须首先调用API" StARkitStartRGBD"
IntPtrout_point_cloud:点云数据的输出数据缓冲区。在向API输入缓冲区之前,此缓冲区应该是由调用者使用(depth_w * depth_h * 12)字节的内存分配。在G2和StarCore模块中,depth_w为224,depth_h为172。 如果此参数输入NULL指针,则API将不会输出点云数据
IntPtrout_depth_img:深度图像数据的输出数据缓冲区。在输入API缓冲区之前,调用者应将该缓冲区内存分配为(depth_w * depth_h * 2)字节。在G2和starCore模块中,depth_w为224,depth_h为172。 如果此参数输入NULL指针,则API将不会输出深度图像数据
IntPtrout_rgbd_img:rgbd结果数据的输出数据缓冲区。如果在startRgbdTrans中将工作模式设置为"RGB_DEPTH",则此调用程序必须是由调用方使用(depth_w * depth_h * 3)字节的malloc。如果工作模式设置为"DEPTH_RGB"或"DEPTH_RGB_PIXEL" 在startRgbdTrans中,此缓冲区必须是由调用者使用(rgb_w * rgb_h * 2)字节的malloc。如果此参数输入NULL指针,则API将直接返回错误。

EStARkitRGBDMode

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:表示RGBD的工作模式。

3)属性:

属性名说明
RGB_DEPTH0RGB图到TOF图模式
DEPTH_RGB1TOF图到RGB模式
DEPTH_RGB_PIXEL2像素填充TOF图到RGB模式

EStARkitTofMode

1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。

2)简介:TOF相机的工作模式。

3)属性:

属性名说明
MONO_FREQUENCY0单频模式
DUAL_FREQUENCY1双频模式

RGBDDemo

这个Demo主要是展示RGB的图像如何和Tof的深度信息进行匹配使用,由于需要使用TOF相机所以暂时只支持G2设备,NG2不支持。

  1. 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/RGBDDemo /Scene/RGBDDemo 依照上面的Android Build的步骤出一个应用。
  1. 将Build好的apk在设备中安装好后运行应用。
  2. 场景中有3个按钮如下图:

StartRGBD: 开启RGBD功能

StopRGBD: 关闭RGBDD功能

Quit: 退出应用

  1. 点击StartRGBD之后会出现如下提示,按照提示将Gaze光标对准需要知道深度的地方,点击确认键,会在对应位置产生点云,上方是RGB相机拍到的图像。

FocusEventData

1)命名空间:Lenovo.stARkit.Tookit.EventSystems。

2)简介:这是Focus事件的数据类,里面包含了事件的需要用到的各种细节信息。

3)属性:

属性名类型说明
PointerIStARkitPointer触发事件的指针。
OldFocusedObjectGameObject上一个Focus物体。
NewFocusedObjectGameObject新的Focus物体,即当前触发的物体。
HitPointVector3指针触发物体事件的点。
HitWorldNormalVector3指针触发物体事件点的法线方向。
Reactablebool当前Focus物体是否有点击事件可触发
EventCameraCamera触发事件的相机。

4)函数:

函数名返回值参数类型参数说明
FocusEventDataEventSystemeventSystem:触发事件的事件系统。构造函数,需传入事件系统。
InitializeIStARkitPointerpointer:用指针初始化数据。1个参数的初始化重载函数。
InitializeIStARkitPointerpointer:用指针初始化数据。2个参数的初始化重载函数。
GameObjectnewFocusedObject:新的Focus物体,即当前触发的物体。
InitializeIStARkitPointerpointer:用指针初始化数据。3个参数的初始化重载函数。
GameObjectoldFocusedObject:上一个Focus物体。
GameObjectnewFocusedObject:新的Focus物体,即当前触发的物体。
InitializeIStARkitPointerpointer:用指针初始化数据。7个参数的初始化重载函数。
GameObjectoldFocusedObject:上一个Focus物体。
GameObjectnewFocusedObject:新的Focus物体,即当前触发的物体。
Vector3hitPoint:指针触发物体事件的点。
Vector3hitNormal:指针触发物体事件点的法线方向。
CameraeventCamera:触发事件的相机。
boolClickable:当前Focus物体是否有点击事件可触发

IStARkitFocusChangedHandler

1)命名空间:Lenovo.stARkit.SDK.Features.Handler。

2)简介:这个接口和IPointerEnterHandler的使用方法是一样的,同时它还可以注册全局监听, CoreServices.InputSystem?.RegisterHandler&lt;IStARkitFocusChangedHandler&gt;(handler);这样可以在任意地方监听Gaze交互的状态了。

3)函数:

函数名返回值参数类型参数说明
OnFocusChangedFocusEventDataeventData:事件触发的数据。当Focus的物体发生改变时会被调用。
OnFocusTargetFocusEventDataeventData:事件触发的数据。当Focus在一个物体上时被调用。

IStARkitInputSystem

1)命名空间:Lenovo.stARkit.Tookit.EventSystems。

2)简介:这是事件系统的接口类,定义了事件系统对外的API,调用的方式为CoreServices.InputSystem,这里可以控制Gaze的开关。

3)属性:

属性名类型说明
InputEnabledAction在事件系统Enable的时候调用委托。
InputDisabledAction在事件系统Disenable的时候调用委托。
IsInputEnabledbool当前事件系统是不是enable状态。
PointersHashSet事件指针的存储列表。
KeyInputEnabledbool手柄的按键事件是否工作

4) 函数:

函数名返回值参数类型参数说明
RegisterPointerboolIStARkitPointerpointer:触发事件的指针。注册事件指针
UnregisterPointerboolIStARkitPointerpointer:触发事件的指针。取消注册事件指针。
IsPointerRegisteredboolIStARkitPointerpointer:触发事件的指针。判断事件触发指针是否注册过。
GenerateNewPointerIduint返回一个事件指针的全局ID。
SetPointerActiveboolboolactive:事件指针是激活还是关闭。操作事件指针的激活和关闭。例如关闭Gaze: CoreServices.InputSystem?.SetPointerActive(false, "GazePointer");
stringpointerName=null:如果是null,则是对所有的事件指针操作,否则是对传入的名字的事件指针执行操作。
RaiseFocusChangedIStARkitPointerpointer:触发事件的指针。触发交互物体改变的事件,只有发生变化时才会触发。
GameObjectoldFocusedObject:上一个交互物。
GameObjectnewFocusedObject:最新的交互物。
RaiseFocusTargetIStARkitPointer
GameObjectFocusedObject:当前正在交互的物体。
RegisterKeyEventCallBackAction<KeyCode, EControllerKeyStatus>keyStateEvent:按键触发的回调事件,KeyCode是键值,EControllerKeyStatus是按键的状态注册按键触发的回调事件
UnregisterKeyEventCallBackAction<KeyCode, EControllerKeyStatus>keyStateEvent:按键触发的回调事件,KeyCode是键值,EControllerKeyStatus是按键的状态取消注册按键触发的回调事件

GazeEvent Demo

这个Demo主要介绍Gaze交互系统,这个是支持Android和Windows的,主要使用了slam功能。和UGUI交互的条件是Canvas必须设置为WorldSpace,EventCamera设置为挂有StARkitEventSystem脚本的相机。Gaze通常是在平面的正中间,通过头的转动控制交互,当连接对应的手柄后,手柄控制Gaze在平面内的位置。和3D物体交互则物体必须有碰撞体且挂有实现了Ipointer事件的脚本。

  1. 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/GazeEvent /GazeEventDemo,依照上面的Android Build或者PC Build的步骤出一个应用。
  1. 默认是事件系统是使用手柄的,可以在Scene中的EventCamera上挂的StARkitEventSystem上修改。
  1. 将Build的应用安装到指定设备上,并运行(PC上的运行请参考SlamWindows)。
  2. 程序运行起来后,会看到正前方有3列UI。

Interactive(可交换) : 这一列的是可以Gaze可以交互的,最下方的方块也是可交互的,可以和最后一列进行对比找到其中的规律。和UGUI交互的条件是Canvas必须设置为WorldSpace,EventCamera设置为挂有StARkitEventSystem脚本的相机。3D物体的交互必须有碰撞体,且有挂有继承了Ipointer事件系统的组件或脚本。

Focus&Disable(全局监听Focus和关闭Gaze) : 这一列是监听了Gaze的全局事件,注册事件之后,当Gaze的交互物体发生改变时或者在交互物上移动时都会收到消息,继承IstARkitFocusChangedHandler。按钮DisableGaze是动态关闭Gaze交互功能。中间的Controller按钮是当有手柄连接时切换方向键控制和3dof控制的。

NotInteractive(不可交互) : 这一栏是不可交互的,主要是用来和可交互对比的。

stARkit for daystAR附录:Unity PC开发介绍

请注意,starkit for Windows功能在3.2版本之后将不再维护、不再更新。 starkit for Windows 运行依赖window service package 和 Windows AR应用,前者可以从官网链接下载,后者需要导入unitypackage进行开发。 请参照下面的步骤进行。

Unity Windows创建工程

具体流程参考创建工程

Unity 出 PC应用

  1. 按照上面创建工程的步骤创建一个工程和一个场景。
  2. PC上不支持GlassSeeThrouth,所以把场景中的StARkitMixtureGlassSeeThrough.prefab替换为StARkitTrackingWin.prefab。
  1. 打开Build设置窗口。
  1. 将刚刚保存的scene添加到 scene in build。
  1. 如果当前Build的目标平台不是PC,你需要先切换目标平台为PC。
  1. 打开Player Setting窗口。
  1. 设置应用的名字。
  1. 设置Resolution and Presentation: Run in Background 和 Allow Fullscreen Switch为True。
  1. 设置Architecture : x86_64 ,然后开始build, 最终生成可执行文件。

window service package

请注意,starkit for Windows功能在3.2版本之后将不再维护、不再更新。

从官网下载并解压获取 stARkit_windows_package.zip

可以看到这个文件夹的目录结构:

-- sample_code/starkit_test.cpp

-- service_package

-- lib/dll files

-- starkit_server.exe

-- starkit_server.h

-- starkit_test.exe

-- starkit_sdk.h

-- starkit_config // 默认仅包含 slam 需要的基本配置文件

(NOTE: 建议把Glass对应的标定文件手动拷贝到此目录下,拉取Glass标定文件的方式请联系售后)

-- sensordata.dll

  • 把Glass标定文件、数据接口文件拷贝到相应文件夹下(数据接口文件在上述stARkit_windows_package.zip中)。
  • 其他具体操作请参照Slam_win demo介绍。

Slam_win demo介绍

请注意,starkit for Windows功能在3.2版本之后将不再维护、不再更新。

这个Demo主要是在Windows上展示Slam的,只需要PC上联接了支持此SDKSlam的设备即可。

  1. 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/Slam_win,按照PC build的步骤出应用。
  2. 默认slam是起的6dof,节点为Head,可以在Scene中的StARkitSlamWing上挂的脚本修改。
  1. 把应用所在目录下的全部文件和starkit_server.exe所在的全部文件放入同一个文件夹内。
  1. 在运行之前starkit_server.exe之前,先确保支持slam的设备已经连接电脑,且设备的标定参数已经放在starkit_config目录下。
  1. 在starkit_server.exe成功运行之后,再运行刚刚Build的Slam_win.exe。
  1. 如果你需要通过Glass观看效果,必须确保电脑能识别Glass并将电脑的显示设置为屏幕扩展,在启动应用时按如下设置。如果启动的时候没有选择显示屏幕和设置分辨率的界面,就将运行后的窗口拖拽到Glass的显示器上,应用会自动切换为全屏。
  1. 进去之后你会看到有一个蓝色方块在视野的正前方,方块的长宽高都是0.2m,在初始位置正前方1m处。可以移动绕着方块从各个角度观察,如果方块在空间的位置固定不变,且距离感正确,这表示功能正常。

UnityXR

请注意,starkit for Windows功能在3.2版本之后将不再维护、不再更新。

这个Demo场景主要是展示通过UnityXR的接口在PC上启用Slam的Tracking功能,必须使用Unity2019.3.x的版本进行编译。

  1. 从发布的StARkit3.x.release.unitysdk.zip解压得到一下文件:
  1. com.unity.xr.sdk.displaystarkit.zip是提供Tracking和Display功能unityXR native-libs package
  2. 把需要的插件解压后的内容拷贝到Unity工程Assets同等目录Packages下;
  1. 首先打开工程的ProjectSetting的XR plug-in Management功能:
  1. 然后在Unity中打开PackageManager窗口,导入需要的package:
  1. 退出并重新进入工程,(UnityXR需要)重新打开工程后,如果提示有依赖库找不到,可以尝试重新导入一遍packages。
  2. 设置插件的库的平台:比如DisplayProviderStarkit.dll 仅支持x86_64,勾选其他平台会导致应用异常。
  1. 按照Build PC的流程Build和运行。