分享

leap motion 系统简介

 文清阳 2017-01-09

从leap motion官网的介绍文章leap motion overview中,提取出个人认为有价值的东西,做下笔记,也是分享,希望能给大家带来帮助。原文地址

https://developer./documentation/Languages/C++/Guides/Leap_Overview.html

一、坐标系统

leap motion系统使用右手笛卡尔坐标系(图1)。什么是右手坐标系呢?就是右手四指从X轴正向向Y轴正向握拳,拇指方向就是Z轴正向(图2)。记录单位为毫米,原点在设备中心。X,Z轴水平,Y轴竖直。远离屏幕Z值增大,向上Y值增大,需注意放置方向。


图一 leap motion 坐标系


图二 右手坐标系

二、动作跟踪数据

leap motion可以跟踪手,手指,和一些小工具,并以帧的形式更新跟踪数据。每一帧包括跟踪对象的列表,和描述对象动作的特征。每检测到一个对象leap motion就自动给它分配一个唯一的ID,直到对象移动出检测区域,重新进入检测区域的对象会重新分配ID。

1、帧的结构

每一个帧的实例都包括跟踪数据,手势和动作因子(factor)等。

跟踪数据列表:

  • hands手。包括所有可以检测到的
  • fingers手指。所有的
  • tools工具。所有的
  • pointables。具有指向性的物体,包括所有的手指和工具
  • gestures手势。包括以上所有对象的动作
每帧有三个pointables列表,手指、工具、pointables,包含了所有被检测到的具有指向性的物体。可以利用和手的关联性,通过手的列表找到pointables。在帧序列中跟踪一个独立物体时,可以根据ID号在下一帧中查找该物体。通过ID可以查找到跟踪数据列表里面的所有对象。如果当前帧存在查找对象,查找函数返回一个指向该对象的引用。如果对象不存在了,就返回一个不可见对象,其中不包含有效的跟踪数据。这样就可以避免每次跟踪物体时都有检查其是否存在。

leap motion通过分析当前帧动作与之前帧动作的变化,将动作翻译成平移、旋转、缩放等动作因子。例如双手都向左移动表示平移,双手做转球的动作表示旋转,双手相向移动或远离表示缩放。leap motion根据检测区域内检测到的所有对象的运动转化为动作因子。如果检测到两只手,则同时考虑两只手的动作,也可以通过单个手的实例分别获取每一只手的动作因子。

描述动作的属性包括:

  • rotation axis旋转轴 
  • rotation angle旋转角度
  • rotation matrix旋转矩阵
  • scale factor缩放系数
  • translation平移向量
通过动作因子操作物体就可以避免跟踪多帧间的手和手指。帧可以帧内动作进行估计,把它当成特定的动作,比如当缩放系数特别大的时候,就可以忽略平移和旋转。使用该估计过滤掉多余的帧可以增加程序的可用性。

2、手的模型

手模型可以提供位置、特征、动作,以及和手关联的手指、工具等信息。对手的模型leap motion API提供了尽可能多的信息,但并不是每一帧都能完全检测到这些属性。例如握拳时,手指不可见,所以手指的列表就可能为空,编码时要注意到这些情况。

leap motion并不区分左右手,hand列表也可以包含超过2只手,但是超出两只手时会影响跟踪效果。

手的属性包括:

  • palm position手掌位置,手掌中心位置距leap motion原点的距离,单位毫米
  • palm velocity手掌速度,单位mm/s
  • palm normal手掌法向量,由掌心向下指向外部,图3
  • direction方向,掌心指向手指的向量,图3
  • sphere center球心,根据手的曲线拟合出的球的球心,图4
  • sphere radius球半径,拟合球的半径,图4
方向和手掌法向量都是单位向量。


图3 法向量和方向


图4 球心与球半径

手的动作即上面提到的平移,旋转,缩放等,不再赘述。

调用函数hand::finger(),hand::tool(),hand::pointable()可以得到手指和工具的ID。

3、手指和工具的模型

leap motion靠形状识别手状物体,工具指比手更长、更细或者更直的物体(图5)。在leap motion模型中,手指和工具被抽象为pointable对象。其物理属性包括:

  • length长度。可见部分长度
  • width宽度。可见部分平均宽度
  • direction方向。物体的单位向量,例如从指根到指尖,图6
  • tip position指尖的位置。指尖相对leap motion原点的位置,单位mm
  • tip velocity指尖的速度。单位mm/s
函数Pointable::isTool()可以判断一个pointable对象是手指还是工具。


图5 工具更长,更细,更直


图6 指尖位置和方向向量

4、手势

leap motion可以识别特定的运动模式,用户可以靠这些手势发令。手势和手指、手等其他运动跟踪数据的传回方式一样,每发现一个手势就向帧中自动添加一个手势对象,可以从帧中的手势列表获取手势对象。

leap motion可以识别的运动模式包括:

  • circle画圆,一根手指画一个圆
  • swipe挥扫,手的线性运动
  • key tap击键,敲键盘一样的轻击
  • screen tap触屏,触摸垂直屏幕一样的轻击
leap motion首次识别出一个手势后将其加入帧,如果这是一个持续性动作,leap motion将一个更新的手势对象加入后续帧。画圆和挥扫是持续性动作,leap motion在每一帧中更新这些手势,tap轻击是不连续的动作,所以每次敲击只需一个手势对象。

程序中,想使用某个手势前,需要调用Controller类中的enableGesture()方法启用该手势的识别。

画圆

可以用手指和工具画圆,手势开始后leap motion会一直更新这个过程直到手势结束,手指或工具离开圆的轨道或动作过慢时视为手势结束。相关API:CircleGesture。


图7 画圆

挥扫

相关API:SwipeGesture。


图8 挥扫

击键

快速的向下敲击被视为一次击键手势。相关API:KeyTapGesture。


图9 击键

触屏

快速向前轻击被视为一次触屏手势,相关API: ScreenTapGesture。


图10 触屏

有些地方翻译的比较生硬。请指教。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多