【新手入门】全网最全Leap Motion技术总结
不好意思有点标题党了hhh~
本科毕设使用了Leap Motion完成了一个双手交互体验的小程序,在查阅相关资料时发现网上的资料良莠不齐、不够系统,常常是花费了很多精力搜集资料却得不到想要的答案。正好借此机会一下自己走过的坑,回馈给我很多帮助的CSDN平台,如果能对后人有一点帮助就有意义。
Leap Motion官方案例中有很多酷炫的效果,实现起来并不那么美好。识别精度确实很高,但因为技术实现原理的缺陷,并不能做到十分准确。如果使用时间较长还会有设备发热的问题。在人机交互方面,用户一直举着双手会很累,不够用户友好。现有的研究更多是讨论优化识别算法、训练模型、或是和其他领域结合做一些实际应用的效果,并没有很好的应用前景。
学习资料上传了一个LeapMotion学习资料包,内含适用于unity2019+的SDK开发工具包,包含Core/Hands/Interaction Engine;学习资料pdf电子版,包含四本英文书和一个中文翻译的官方开发文档。
LeapMotion学习资料包
开发者网站下载 Leap Motion – Unity SDK
https://developer.leapmotion./unity
GitHub下载更全的 Leap Motion – Unity Modules
https://github./leapmotion/UnityModules
Leap Motion – Unity官方SDK技术手册
https://leapmotion.github.io/UnityModules/
b站教学视频Unity – Leap Motion官方示例讲解
https://.bilibili./video/BV1oT4y1N7hD
官方案例
https://gallery.leapmotion./
游戏应用
https://itch.io/games/leap-motion
Leap Motion 3D Jam
https://.roadtovr./leap-motion-3d-jam-inners-announced-indiecade-oculus-rift-virtual-reality/
官方技术论坛
https://forums.leapmotion./c/development
(这一部分本来是写在论文里的,在指导老师的建议下删掉了很多,但也还有一部分还在最终版的论文里,不知道发在这里会不会有风险kkk,如侵删hhh。都是自己查阅各种资料汇总的,对正确性不敢保证,仅供参考。)
技术原理Leap Motion体感交互器使用光学手势追踪技术,拥有两个带广角镜头的高帧率灰度红外摄像头和四个红外LED,最佳的工作环境是可产生清晰的、高对比度对象轮廓的光照环境,如图2.1所示。顶层滤光层只允许红外光波进出,对摄像头所采集的数据进行了初步处理,简化后期运算复杂度;采用双目摄像头通过双目立体视觉成像原理提取手部三维位置,建立手部立体模型;采用灰度摄像头减少运算数据量,提高算法速度。基于以上硬件和算法的优化,使得Leap Motion每秒可采集200帧手部数据,精度可达0.01mm。
Leap Motion可追踪的区域范围在空间中呈一个倒四棱锥型,水平视场角达140°,垂直视场角达120°,可交互深度在10cm-60cm之间,最大不超过80cm,如图2.2所示。Leap Motion的尺寸大小为80mm长30mm宽11.3mm高,重量只有32g。
图2.1 Leap Motion结构图
图2.2 Leap Motion可识别区域
Leap Motion针对PC端支持Windos和Mac系统,针对VR设备支持适配Oculus Rift和HTC Vive头盔,编程语言支持C++、C#、Java、JavaScript、Python等,可使用Unity和Unreal引擎进行开发。官网中针对各开发环境和平台提供有稳定的SDK工具包和详细的学习文档,对开发者非常友好。
追踪数据当有手进入Leap Motion的识别区域时,它会进行自动追踪,输出一系列实时刷新的数据帧。帧数据(Frame)是Leap Motion数据的核心,在每一帧数据中包含了所有有关手部运动的信息,如所有的手(Hands)、手指(Fingers)、端点物体(Pointables)、工具(Tools)、手势(Gestures)及其位置(Position)、速率(Velocity)、方向(Direction)、旋转角度(Rotation)等信息,详细数据如图2.3所示。
对于每只手生成的手部模型,如图2.4所示,具体包含大拇指(Thumb)、食指(Index)、中指(Middle)、无名指(Ring)、小拇指(Pinky)和手腕关节(Wrist);对于每根手指,包含远端指骨(Distal)、中间指骨(Intermediate)、近端指骨(Proximal)和掌骨(Metacarpal)。Leap Motion模拟了真实人手的骨骼关节,通过每帧信息的更新获取,能够实现实时、快速、准确的手部追踪效果。
图2.3 帧数据信息
图2.4 手部骨骼信息
Leap Motion SDK
在Leap Motion开发者网站中可以下载到官方发布的Unity开发工具包,如图2.5所示,在Unity3D项目中点击Assets->Import package即可导入SDK工具包进行开发。
图2.5 Leap Motion SDK
Core是最重要的SDK包,提供了封装好的Leap Motion和Unity3D的接口服务,使得开发者能够直接在Unity3D中调用Leap Motion的全部手部数据,为后续开发工作奠定基础。Hands SDK包中预置了不同的手部模型,提供针对个性化的手部模型fbx文件进行自动绑定骨骼的功能,以满足开发者的不同风格需求。Interaction Engine SDK包中提供了手和物体的物理交互方法,如靠近悬停、触摸、抓取、投掷等功能,并给出了八个示例场景供开发者学习使用。
导入工具包后,为了将物理时间步长与渲染帧速率设置相同,需要修改项目的Fixed Timestep为0.0111111(相当于每秒90帧)。,经多次试验,发现将重力设置为现实世界的一半时,使用物理对象的反应更自然,故将项目Gravity中的Y轴设置为-4.905。上述操作的具体流程为Edit->Project Settings->Time-Fixed Timestep/Physics-Gravity-Y。
Leap Rig预制体
Leap Motion针对桌面和VR设备分别提供了Desk Leap Rig和XR Leap Rig两种不同的Leap Rig预制体,以适应不同的硬件设备需求。
如图2.6和图2.7所示,二者均包含了提供Leap服务的Leap Provider组件、手部模型Hand Models模块、提供物理交互的Interaction Manager模块,二者的区别主要有以下两点一,提供Leap服务的组件分别为Leap Service Provider和Leap XR Service Provider。其中,Leap XR Service Provider直接放置在XR相机上,可以正确解决传感器与头盔设备的姿势跟踪之间的时序差异。开发者需要根据项目需求选择相应的预制体,否则会出现手的方向相反、识别不准确等问题;二,在XR Leap Rig的Interaction Manger部分中,设有针对Oculus Rift和HTC Vive设备的Controllers手柄预制体,方便开发者在项目中直接修改使用。
图2.6 Desk Leap Rig
图2.7 XR Leap Rig
组件模块功能
针对Leap Rig预制体中的各部分组件和模块的功能,具体介绍如下。
Leap Provider是最核心的组件,封装了从Leap Motion到Unity3D的数据接口,与平台上运行的Leap服务进行通信,为应用程序提供帧数据中跟踪的全部手部信息。,Leap Provider完成了从Leap Motion到Unity3D的坐标系统的转化。如图2.8所示,Leap Motion使用右手坐标系,单位为毫米,Unity3D使用左手坐标系,单位为米。Leap Provider将坐标系和单位转化为Unity3D的标准,供开发者直接开发,免去坐标系转化统一的工作。图2.9展示了分别针对桌面和VR设备的Leap Service Provider和Leap XR Service Provider组件。
图2.8 Leap Motion和Unity3D坐标系对比
图2.9 Leap Service Provider和Leap XR Service Provider
Hand Models模块负责管理手部模型的渲染。如图2.10所示,父节点Hand Models是一个空物体,其下包含了左右手的手部模型,其上挂载了Hand Model Manager组件,需要指定提供Leap服务的Leap Provider和所管理控制的左右手模型。每只手模型的父节点LoPoly Rigged Hand上挂载了Rigged Hand组件,需要指定手指、关节点、手掌及其局部旋转、位移等信息。每只手模型的各个关节节点,按照手腕、掌心、手指的顺序依次向下继承;对于每根手指,又按照掌骨、近端指骨、中间指骨、远端指骨的顺序依次向下继承。
图2.10 Hand Models模块
Interaction Manager模块负责管理手部模型的物体交互,为手部模型添加刚体(Rigidbody)和碰撞体(Collider),在Unity中的FixedUpdate函数里进行更新计算,处理物理碰撞和控制物体交互,更新手和交互对象的数据。如图2.11所示,对于每只交互手,可以选择是否启用悬浮、接触、抓取交互类型,可以指定可交互手指。对于外部的物体对象,只需为其增加Interaction Behaviour组件,手部模型即可对其完成悬浮提示、接触碰撞、抓取投掷等功能。
图2.11 Interaction Manager模块