2015-07-29 2 views
1

Я написал тестовый код, чтобы узнать, принимаются ли мои жесты касания от прыжкового движения. После запуска кода я заметил, что я должен нажимать действительно агрессивно, и даже тогда, я получаю только краны, полученные раз в несколько раз. Как я могу изменить свой код, чтобы предотвратить это?пропущенные жесты крана от прыжкового движения в java

(Пожалуйста, обратите внимание, я очень новой для кодирования так плз быть сложным, спасибо)

FILE # 1

package com.leaptoarduino; 
    import com.leapmotion.leap.Controller; 
    import com.leapmotion.leap.Gesture; 
    public class Leapd 
    { 
     //Main 
     public static final void main(String args[]) 
     { 
      //Initialize serial communications 
      RS232Protocol serial = new RS232Protocol(); 
      serial.connect("COM3"); 
      //Initialize the Leapd listener 
      LeapdListener leap = new LeapdListener(serial); 
      Controller controller = new Controller(); 
      controller.addListener(leap); 
      controller.enableGesture(Gesture.Type.TYPE_KEY_TAP); 
      //Set up controller for gestures 
      controller.config().setFloat("Gesture.KeyTap.MinDownVelocity", 5.0f); 
      controller.config().setFloat("Gesture.KeyTap.HistorySeconds", .8f); 
      controller.config().setFloat("Gesture.KeyTap.MinDistance", 20.0f); 
      controller.config().save();  
     } 

    } 

FILE # 2

package com.leaptoarduino; 
    import com.leapmotion.leap.*; 
    import com.leapmotion.leap.Gesture.Type; 
    import com.leapmotion.leap.KeyTapGesture; 
    public class LeapdListener extends Listener 
    { 
    //Serial port that will be used to communicate with the Arduino 
    private RS232Protocol serial; 
    //Constructor 
    public LeapdListener(RS232Protocol serial) 
    { 
     this.serial = serial; 
    } 
    //Member function: onInit 
    public void onInit(Controller controller) 
    { 
     System.out.println("Initialized"); 
    } 
    //Member function: onConncect 
    public void onConnect(Controller controller) 
    { 
     System.out.println("Connected"); 
    } 
    //Member Function: onDisconnect 
    public void onDisconnect(Controller controller) 
    { 
     System.out.println("Disconnected"); 
    } 
    //Member Function: onExit 
    public void onExit(Controller controller) 
    { 
     System.out.println("Exited"); 
    } 
    //Member Function: onFrame 
    public void onFrame(Controller controller) 
    { 

     //Get the most recent frame 
     Frame frame = controller.frame(); 
     //Verify a hand is in view 
     if (frame.hands().count() > 0) 
     { 
      GestureList gestures = frame.gestures(); 
      for (Gesture gesture: gestures) 
      { 
       if (gesture.type() == Type.TYPE_KEY_TAP) 
       { 
        KeyTapGesture keytap = new KeyTapGesture (gesture); 
        System.out.println("KEYTAPPED"); 
       } 
      } 

      //Send the tap data to the Arduino 
      // TBD 
      //Give the Arduino some time to process our data 
      try { Thread.sleep(30); } 
      catch (InterruptedException e) { e.printStackTrace(); } 
     } 
    } 
} 
+0

Не зная високосный движение, вы пытаетесь установить 'Gesture.KeyTap.MinDownVelocity' на более низкое значение? –

+0

Да, я сделал. Только для очень низкого значения он работал. – NewbieJav

+0

Проблема с низкой долькой, которая вызвала обнаружение моей руки, слегка двигающейся, даже без нажатия ... Я также пробовал разные значения для расстояния и истории, с тем же эффектом - низкие значения работали, но обнаруживали очень небольшие движения руки без особого нажатия. – NewbieJav

ответ

1

Когда вы спите нить в обработчике OnFrame вы будете пропускать кадры из сервиса Leap Motion. Вероятно, часть вашей проблемы связана с тем, что жесты касания распознаются в пропущенных кадрах. Функция Frame.gestures() принимает параметр «fromFrame», чтобы избежать этой проблемы: frame.gestures(sinceFrame) дает вам все жесты, которые произошли между frame и текущим фреймом, и, таким образом, вы не пропустите ни одного, когда кадры будут сброшены или пропущены. То, что вы делаете, это сохранить текущий кадр в переменной lastFrameProcessed каждый раз, когда выполняется обработчик onFrame. Вы передаете эту переменную lastFrameProcessed в gestures(), чтобы получить полный список жестов. Что-то вроде:

Frame lastFrameProcessed = Frame.invalid(); 
public void onFrame(Controller controller) 
{ 

    //Get the most recent frame 
    Frame frame = controller.frame(); 
    //Verify a hand is in view 
    if (frame.hands().count() > 0) 
    { 
     GestureList gestures = frame.gestures(lastFrameProcessed); 
     for (Gesture gesture: gestures) 
     { 
      if (gesture.type() == Type.TYPE_KEY_TAP) 
      { 
       KeyTapGesture keytap = new KeyTapGesture (gesture); 
       System.out.println("KEYTAPPED"); 
      } 
     } 

     //Send the tap data to the Arduino 
     // TBD 
     //Give the Arduino some time to process our data 
     try { Thread.sleep(30); } 
     catch (InterruptedException e) { e.printStackTrace(); } 
    } 
    lastFrameProcessed = frame; 
} 
+0

Спасибо a! Ot. Я попробую это. – NewbieJav

+1

Пробовал. Все еще теряет краны. Тем не менее, я всегда получаю STOP_STATE за краны и, кажется, никогда не получаю его. – NewbieJav

+1

Отводы имеют только один объект жестов на каждый физический кран. Только круг и звуковые дорожки будут иметь более одного обновления жестов на нескольких кадрах. Попробуйте, не спали Thread и посмотрите, не имеет ли это значение (временно прекратите вызов функции Arduino, если необходимо). –

Смежные вопросы