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

在项目页面点击“物体识别目标物”,进入目标管理页面后,可以看到当前项目中的所有目标及其信息。上述各类目标在经过平台处理后,显示为可用状态时,可以通过目标列表右侧的“下载”按钮,将制作好的目标下载到本地电脑中,用于后续的应用开发。 下载的目标为tag[id][rand_string].zip的形式,请不要更改文件名和内容。
.png)
- 应用开发
在Assets/Recognition/TargetReco中,提供了4个目标识别与跟踪的示例场景(见Assets/Recognition/TargetReco/Tutorial/Scenes),双击打开后既可在unity editor中修改配置运行或编译。
.png)
RecognitionTutorial For Smart Core:支持通用Android和iOS设备的示例场景。
RecognitionTutorialForDaystar:支持晨星眼镜设备的示例场景。
请注意SRApplication 里key和secret的填写。一个开发者存在多个项目时,上传地图到哪个项目,就填写对应项目的key和secret。
.png)
- 自定义开发
若需要自己制作场景,请参考以下步骤,下列步骤以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 (可选)
.png)
具体配置:
点击场景中的SRApplication,并在右侧属性列表输入服务器网址以及应用的APP Key和Secret,请务必填入自己APP对应的Key和Secret,获取途径参考此处。
点击SRFrameManager,选择相应的设备类型。SRTargetReco建议使用如图配置。
.png)
(b) 添加目标到场景中
点击场景中的SRTargetManager,右侧属性面板点击"添加目标"按钮,在弹出的对话框中,找到从开发者网站下载的目标文件zip包,点击"打开"即可将该目标添加到场景中,加载一个SRTargetModel_tag[xxx]预制件。同时在SRTargetManager面板的目标列表会显示当前场景中的目标,通过点击“删除”按钮可将对应目标移除。如需要显示场景zip包自带的模型,场景zip包解压的文件夹,需要保留在工程中。
.png)
(c) 叠加虚拟模型
如上述操作添加目标后,相应SRTargetModel预制件中会附着一个目标3D模型作为子物体,此处可以根据具体业务需求,在该3D模型下挂着各种虚拟资源(模型、视频、图片等),这样在识别到该物体时便会自动显示加入的虚拟资源。通过"添加目标"按钮添加时,Model默认链接到zip包解压的文件夹下资源。
.png)
(d) 运行程序
应用前需在Project Settings->Graphics->Always Included Shaders中添加Unlit/Texture。
.png)
在"Assets\stARkit\Lenovo.stARkit.SDK\Prefab"下找到"StARkitMixtureGlassSeeThrough.prefab" 预制件,将其拖拽添加到场景层级窗口。
.png)
更改SRFrameManager与SRTargetReco的配置,设备类型一定要与实际设备对应,否则可能会导致虚实叠加不准,详细场景配置可参照RecognitionTutorialForDaystar场景。
.png)
以上配置完成将其打包为安卓应用,即可安装到联想晨星设备上运行,方法同打包和部署安卓应用。
4) 预制件配置说明
SRApplication | SDK 通用预制件 |
---|---|
Domain Host | 设置平台网站域名,通常为https://daystar.lenovo.com, 私有云开发者的具体修改值需联系服务器管理员 |
App Key | 需要识别的APP对应的Key |
App Secret | 需要识别的APP对应的Secret |
SRFrameManager | SDK 通用预制件 |
---|---|
Device Type | 设备类型 D_ARFoundation:Android设备和iOS设备 D_Starkit:晨星AR眼镜连接拯救者手机和基于光学透视的晨星AR眼镜 |
Resolution | 相机分辨率 |
Auto Open Camera | 是否自动开关相机 |
SRRecognition | TargetReco预制件 |
---|---|
AutoGetFrame | True:自动获取图像,无需开发者传图像 False:开发者需自主传入图像帧 |
AutoStartReco | True:应用启动时自动开始识别 False:开发者手动调用接口开启识别 |
SRTrackingMode | TARGET_TRACKING:物体跟踪,建议在手机、PC等设备上使用 ENV_TRACKING:环境跟踪,建议在晨星AR眼镜上使用,适用于物体静止的场景 |
Roi Width Ratio | 识别感兴趣区的宽度与图像宽度比例 |
Roi Height Ratio | 识别感兴趣区的高度与图像高度比例 |
SRTargetModel | TargetReco预制件 |
---|---|
Tag | 目标唯一标识,由云端系统生成 |
Auto Add Target | 自动加载目标,取消勾选后需开发者自行调用接口加载,适合高级开发者使用 |
Auto Enable Target | 自动激活目标,取消候选后需开发者自行调用接口激活 |
- 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);