【翻译】Leapmotion-python开发官方文档(1)

翻译 2016年02月17日 18:41:16

连接控制器(Connecting to the Controller

(本人第一次写技术类博客,如有什么地方不妥请轻喷)

      英文链接地址:https://developer.leapmotion.com/documentation/python/devguide/Leap_Controllers.html

      (PS:本人英语有限如果翻译地方有错误,望指出)

     为了与LeapMotion设备连接,需要实例化一个Controller(控制器)对象。Controller对象能够自动与Leapmotion的守护进程或服务程序(译者注:即Leap service。我的电脑->服务中可找到,有些时候插上Leapmotion却没有反应,就是该服务没有启动,手动将其启动就好。)建立连接,然后通过帧(Frame)对象传输数据。

controller = Leap.Controller()

     使用Controller对象可以获得有关当前连接状态、已连接的硬件等信息,同时还能为你的程序设置连接选项(connection options)

    获取数据帧
    

      通过使用Controller.frame()函数(译者注:其实是Controller类中的一个方法)获取包含数据的Frame(帧)对象。当你的程序已经准备好处理由LeapMotion产生的相关数据时,你可以调用这个函数。你也可以实现一个Listener对象定义回调函数。控制器会在新的数据帧准备好后,调用此函数。

     前台程序与后台程序

     一般来说,LeapMotion服务/守护程序只会向正在运行的具有操作系统输入焦点的(has the operating system input focus不知怎么翻译......)程序发送数据。这是为了防止用于接收输入并传输给其他程序的后台程序发生空转。
    如果你的程序在前台运行,同时你想知道LeapMotion的服务/守护程序是否允许你的程序作为前台程序。你可以检查Controller.has_focus 或者检查由控制器发送的事件。LeapMotion服务/守护程序直接从操作系统获得程序焦点状态的改变。注意,由于Linux系统没有提供这项功能,所以在Linux上运行的程序总能获得数据。
   注意,通过网络套接字服务端(WebSocket server)与LeapMotion的服务/守护程序连接的程序在他们获得操作系统焦点的时候不会自动开始接受数据。使用网络套接字服务端的程序必须在他们移向前台时显式的从服务程序获得焦点。(LeapJS JavaScript library不会为你管理前台-后台的转换:))。
   你可以告诉控制器你的程序在后台时也需要数据,通过使用Controller.set_policy()。为你的程序设置BACKGROUND_POLICY_FLAG策略。这样,即使是像鼠标模拟器或者系统控制器这种没有获得焦点的程序仍能从LeapMotion中获得数据。在LeapMotion控制面板中将允许后台(Allow Background Apps)设置必须选中,不然设置这种策略是不被允许的。
   注意,如果另一个 能从LeapMotion中读取数据的(Leap-enabled) 程序在前台运行,那么你的程序无法获得数据帧,即使后台数据帧策略已经设置并生效。此策略只对 non-Leap-enabled程序获得系统输入焦点时起作用。
  
controller.set_policy(Leap.Controller.POLICY_BACKGROUND_FRAMES)
controller.set_policy(Leap.Controller.POLICY_IMAGES)
controller.set_policy(Leap.Controller.POLICY_OPTIMIZE_HMD)


   获得图像

  为了让你的程序可以从LeapMotion的摄像头中接受图像,必须设置Images 策略。在LeapMotion控制面板中必须将允许图像设置打勾。

  允许手势

  在使用内置的手势之前,必须在先将其使能。Controller.enable_gesture()
controller.enable_gesture(Leap.Gesture.TYPE_SWIPE)
  只有使能的手势才能被你的程序使用。

  控制器状态

  当你创建了一个Controller对象,这个对象会尝试与LeapMotion服务/守护程序建立连接,如果连接成功,那么Controller.is_Service_Connected属性就会变成True。同样的,如果LeapMotion硬件连接上电脑并且被 服务程序/守护进程检测到,那么Controlle.is_connected 属性会变成True。
  在你程序运行时,is_service_connected和 is_connected属性可能会发生变化,当连接状态发生改变是你可以监测这些属性值,或者从控制器获取事件。

  获取控制器事件

   在采用侦听机制时(Listener mechanism)Controller对象会发送许多事件。为了处理这些事件,你可以扩展Listener类(即使用继承)实现回调函数。当事件发生时,控制器会调用相应的回调函数。
   回调函数及事件包括:
   on_connect()
  控制器与LeapMotion服务/守护程序建立连接,同时LeapMotion硬件也与电脑连接。
   on_device_change()
 LeapMotion硬件的设备状态发生改变
  on_disconnect()
  控制器与LeapMotion服务/守护程序断开连接或者LeapMotion硬件被移除。
  on_exit()
  控制器对象被析构(释放)
 on_focus_gained()
  程序获得操作系统的输入焦点同时开始接收数据。
  on_focus_lost()
  程序失去操作系统的输入焦点。程序将停止接收数据,直到设置BACKGROUND_FRAMES_POLICY 策略。
  on_frame()
  获得一个新的数据帧(Frame对象)
  on_init()
  控制器对象初始化
  on_service_connect()
  控制器与LeapMotion服务/守护程序建立连接。
  on_service_disconnect()
控制器失去与LeapMotion服务/守护程序的连接。
 
     控制器通过回调函数返回信息,这使得在回调函数体中查询控制器以获得更多信息变得简单。
     下面的例子就是Listener子类(增加一些代表性的回调函数)的简单应用:
import Leap, sys

class LeapEventListener(Leap.Listener):

    def on_connect(self, controller):
        print "Connected"
        controller.enable_gesture(Leap.Gesture.Type.TYPE_SWIPE)
        controller.config.set("Gesture.Swipe.MinLength", 200.0)
        controller.config.save()

    def on_disconnect(self, controller):
        # Note: not dispatched when running in a debugger.
        print "Disconnected"

    def on_frame(self, controller):
        print "Frame available"
        frame = controller.frame()
        #Process frame data

  然后给控制器增加一个你的Listener的实例。
listener = LeapEventListener
controller = Leap.Controller()
controller.add_listener(listener)
  每一个回调函数都会在一个独立的由LeapMotion函数库产生的线程中调用。由此函数库产生的数据对象是线程安全的,但是你必须保证其他由你应用产生的被回调函数利用的数据能够安全的被其他独立的线程改变。避免多线程带来的复杂性,你也可以采用轮询控制器对象以获得数据帧和状态信息来代替使用Listener对象。

 设备类型

 当前有3种LeapMotion硬件类型:标准的控制器是独立的电脑外设,内嵌于键盘中的控制器,内嵌于笔记本电脑中的控制器。这三种设备功能与效果都是一样的。但是他们在物理特性上有所不同。比如,内嵌于笔记本的控制器不会处于“未插入”状态,也不能使用快捷键设置其启动及未启动。
  你可以得到设备类型,通过使用Device.type。使用Controller.device获得已接入设备列表(在同一时刻,只有一个设备能被识别)。

补充:写程序前应当做的

1.从开发者网站下载最新的LeapMotion SDK开发包,同时安装最新的LeapMotion服务程序(从官网上选择开发者,下载就是SDK与服务程序打包的文件)
2.在你的程序import Leap 之前你应当导入LeapMotion的函数库。在你的程序开始部分添加:
import os, sys, inspect, thread, time
src_dir = os.path.dirname(inspect.getfile(inspect.currentframe()))
arch_dir = '../lib/x64' if sys.maxsize > 2**32 else '../lib/x86'#将..替换成SDK解压后所在路径。
sys.path.insert(0, os.path.abspath(os.path.join(src_dir, arch_dir)))





LeapMotion官方开发翻译文档现在免费下载

该文档原本在淘宝网进行售卖,但由于LeapMotion的SDK发展很迅速,没想到一个这么小的硬件可以搞这么代多SDK。我也无暇去更新SDK信息,并且对体感开发没有之前那么热情了。现在我在这里公布出以前...
  • guoming0000
  • guoming0000
  • 2016年03月27日 23:19
  • 1020

[中文]Leap Motion官方开发文档

  • 2016年05月08日 18:26
  • 1016KB
  • 下载

LeapMotion的python示例程序

  • 2016年09月13日 15:18
  • 110KB
  • 下载

如何在Python程序中导入LeapSDK的Python库

本文讨论如何在Python程序中导入LeapSDK中Python库; ImportError: No module named Leap。...
  • tt_tara
  • tt_tara
  • 2017年03月12日 19:51
  • 579

【翻译】Leapmotion-python开发官方文档(10)

相机图像 LeapMotion控制器采用双目红外相机作为跟踪传感器。你可以使用Controller.images或者Frame.images来访问由相机采集到的图像。这些函数提供ImageList对象...
  • qq_27582707
  • qq_27582707
  • 2016年03月22日 14:01
  • 665

初识Leap motion

Leap motion
  • shiwq13
  • shiwq13
  • 2016年04月26日 21:11
  • 394

用motion实现家庭视频监控

需求?当然不是为了艳照!你们这些猥琐的人类!毕竟家里总会有没人的时候,出门走到半路忘记煤气灶是不是关了,还得回去看看。在这个科技以人为本的时代,当然应该是拿出智能手机联网看看啦。还有万一有人闯空门什么...
  • Raptor
  • Raptor
  • 2014年12月18日 20:18
  • 8809

树莓派+motion实现局域网简单监控

一.检查USB摄像头主要检查摄像头是否被树莓派检测到(同博主上一篇树莓派的博客)如果没有你的摄像头的信息,那么有可能你的树莓派的电源无法供应足够的电力给你的摄像头。这时你可以给你的摄像头用独立的电源线...
  • u013151320
  • u013151320
  • 2015年12月06日 16:56
  • 10831

【VR】Leap Motion 官网文档 手型资源

Leap Motion的官网文档已经有不少的热心网友参与了翻译,但没有覆盖官网文档的全部。 为迎合Unity VR的热潮与大家的学习需要,推出的针对Unity方向的官方文档翻译系列。 第三篇 《手型资...
  • lotusiki
  • lotusiki
  • 2015年05月02日 21:50
  • 2280

[资料汇总]Leap Motion官方开发文档翻译

对应博客地址:http://52coding.com/leap-motion-official-doc-translation 此文中所有连接都是链接到我的52coding.com上去的,你也可以在...
  • guoming0000
  • guoming0000
  • 2013年09月30日 02:16
  • 7786
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【翻译】Leapmotion-python开发官方文档(1)
举报原因:
原因补充:

(最多只允许输入30个字)