Skip to content

物体地图定位开发

  1. 地图生成

该功能需要首先使用晨星扫描仪扫描采集待识别目标的数据后,上传到云端进行训练处理,进而生成目标识别信息,然后即可在平台网页端进行管理操作。 目标管理操作见这里晨星扫描仪的使用方法参考此处

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

  1. 应用开发

在Assets/Recognition/TargetReco中,提供了4个目标识别与跟踪的示例场景(见Assets/Recognition/TargetReco/Tutorial/Scenes),双击打开后既可在unity editor中修改配置运行或编译。

RecognitionTutorial For Smart Core:支持通用Android和iOS设备的示例场景。

RecognitionTutorialForDaystar:支持晨星眼镜设备的示例场景。

请注意SRApplication 里key和secret的填写。一个开发者存在多个项目时,上传地图到哪个项目,就填写对应项目的key和secret。

  1. 自定义开发

若需要自己制作场景,请参考以下步骤,下列步骤以Unity2020.3.8f1c1为示例,不同版本unity的界面或选项存在一定差异。

(a) 开发场景配置

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

/Assets/Common/Prefabs/SRApplication.prefab

/Assets/stARFrame/Prefabs/SRFrameManager.prefab

/Assets/stARFrame/Prefabs/SRBackground.prefab(D_ARFoundation和无SLAM的D_WebCamera设备必选)

/Assets/Recognition/TargetReco/Prefabs/SRTargetReco.prefab

/Assets/Recognition/TargetReco/Prefabs/SRTargetManager.prefab

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

具体配置:

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

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

(b) 添加目标到场景中

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

(c) 叠加虚拟模型

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

(d) 运行程序

应用前需在Project Settings->Graphics->Always Included Shaders中添加Unlit/Texture。

在"Assets\stARkit\Lenovo.stARkit.SDK\Prefab"下找到"StARkitMixtureGlassSeeThrough.prefab" 预制件,将其拖拽添加到场景层级窗口。

更改SRFrameManager与SRTargetReco的配置,设备类型一定要与实际设备对应,否则可能会导致虚实叠加不准,详细场景配置可参照RecognitionTutorialForDaystar场景。

以上配置完成将其打包为安卓应用,即可安装到联想晨星设备上运行,方法同打包和部署安卓应用

4) 预制件配置说明

SRApplicationSDK 通用预制件
Domain Host设置平台网站域名,通常为https://daystar.lenovo.com, 私有云开发者的具体修改值需联系服务器管理员
App Key需要识别的APP对应的Key
App Secret需要识别的APP对应的Secret
SRFrameManagerSDK 通用预制件
Device Type设备类型 D_ARFoundation:Android设备和iOS设备 D_Starkit:晨星AR眼镜连接拯救者手机和基于光学透视的晨星AR眼镜
Resolution相机分辨率
Auto Open Camera是否自动开关相机
SRRecognitionTargetReco预制件
AutoGetFrameTrue:自动获取图像,无需开发者传图像 False:开发者需自主传入图像帧
AutoStartRecoTrue:应用启动时自动开始识别 False:开发者手动调用接口开启识别
SRTrackingModeTARGET_TRACKING:物体跟踪,建议在手机、PC等设备上使用 ENV_TRACKING:环境跟踪,建议在晨星AR眼镜上使用,适用于物体静止的场景
Roi Width Ratio识别感兴趣区的宽度与图像宽度比例
Roi Height Ratio识别感兴趣区的高度与图像高度比例
SRTargetModelTargetReco预制件
Tag目标唯一标识,由云端系统生成
Auto Add Target自动加载目标,取消勾选后需开发者自行调用接口加载,适合高级开发者使用
Auto Enable Target自动激活目标,取消候选后需开发者自行调用接口激活
  1. TargetReco接口介绍

stARkit SDK中TargetReco提供的接口类为SRTargetRecoBehaviour,该类提供了实例获取方法public static SRTargetRecoBehaviour Instance(),通过该方法获取类实例后即可调用其中的接口控制算法行为。其中控制识别算法的接口主要有:

(a) 目标操作接口

复制

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

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

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

(b) 识别流程控制接口

复制

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

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

(c) TargetReco自定义回调事件

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

(d) SDK初始化完成

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

复制

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

(e) 目标操作完成

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

复制

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

(f) SDK销毁完成

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

复制

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

(g) 单帧识别完成

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

复制

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

(h) TargetReco自定义相机数据

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

复制

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

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

(i) TargetReco其他接口说明

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

SDK版本获取接口

复制

//用于获取算法SDK的版本信息
public string GetVersion();

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

复制

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