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

连接控制器(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类(即使用继承)实现回调函数。当事件发生时,控制器会调用相应的回调函数。
   回调函数及事件包括:
  控制器与LeapMotion服务/守护程序建立连接,同时LeapMotion硬件也与电脑连接。
 LeapMotion硬件的设备状态发生改变
  控制器与LeapMotion服务/守护程序断开连接或者LeapMotion硬件被移除。
  控制器对象被析构(释放)
  程序获得操作系统的输入焦点同时开始接收数据。
  程序失去操作系统的输入焦点。程序将停止接收数据,直到设置BACKGROUND_FRAMES_POLICY 策略。
  获得一个新的数据帧(Frame对象)
  控制器对象初始化
  控制器与LeapMotion服务/守护程序建立连接。
控制器失去与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)))





阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页