微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Leap Motion 控制器 - 未连接 cpp、python (mac)

如何解决Leap Motion 控制器 - 未连接 cpp、python (mac)

我从 https://developer.leapmotion.com/sdk-leap-motion-controller 下载了 SDK 并尝试在示例下运行代码。它适用于 java 和 javascript,但不适用于 cpp 和 python。

控制器已连接并工作。并且服务“leapd”正在后台运行。

知道可能是什么原因吗?

我使用的是 macOS (Big Sur 11.1)

编辑:

.
├── Makefile
├── include
│   ├── Leap.h
│   └── LeapMath.h
├── lib
│   └── libLeap.dylib
├── main
└── main.cpp
/******************************************************************************\
* copyright (C) 2012-2014 Leap Motion,Inc. All rights reserved.               *
* Leap Motion proprietary and confidential. Not for distribution.              *
* Use subject to the terms of the Leap Motion SDK Agreement available at       *
* https://developer.leapmotion.com/sdk_agreement,or another agreement         *
* between Leap Motion and you,your company or other organization.             *
\******************************************************************************/

#include <iostream>
#include <cstring>
#include "Leap.h"

using namespace Leap;

class SampleListener : public Listener {
  public:
    virtual void onInit(const Controller&);
    virtual void onConnect(const Controller&);
    virtual void ondisconnect(const Controller&);
    virtual void onExit(const Controller&);
    virtual void onFrame(const Controller&);
    virtual void onFocusGained(const Controller&);
    virtual void onFocusLost(const Controller&);
    virtual void onDeviceChange(const Controller&);
    virtual void onServiceConnect(const Controller&);
    virtual void onServicedisconnect(const Controller&);

  private:
};

const std::string fingerNames[] = {"Thumb","Index","Middle","Ring","Pinky"};
const std::string boneNames[] = {"Metacarpal","Proximal","distal"};
const std::string stateNames[] = {"STATE_INVALID","STATE_START","STATE_UPDATE","STATE_END"};

void SampleListener::onInit(const Controller& controller) {
  std::cout << "Initialized" << std::endl;
}

void SampleListener::onConnect(const Controller& controller) {
  std::cout << "Connected" << std::endl;
  controller.enableGesture(Gesture::TYPE_CIRCLE);
  controller.enableGesture(Gesture::TYPE_KEY_TAP);
  controller.enableGesture(Gesture::TYPE_SCREEN_TAP);
  controller.enableGesture(Gesture::TYPE_SWIPE);
}

void SampleListener::ondisconnect(const Controller& controller) {
  // Note: not dispatched when running in a debugger.
  std::cout << "disconnected" << std::endl;
}

void SampleListener::onExit(const Controller& controller) {
  std::cout << "Exited" << std::endl;
}

void SampleListener::onFrame(const Controller& controller) {
  // Get the most recent frame and report some basic information
  const Frame frame = controller.frame();
  std::cout << "Frame id: " << frame.id()
            << ",timestamp: " << frame.timestamp()
            << ",hands: " << frame.hands().count()
            << ",extended fingers: " << frame.fingers().extended().count()
            << ",tools: " << frame.tools().count()
            << ",gestures: " << frame.gestures().count() << std::endl;

  HandList hands = frame.hands();
  for (HandList::const_iterator hl = hands.begin(); hl != hands.end(); ++hl) {
    // Get the first hand
    const Hand hand = *hl;
    std::string handType = hand.isLeft() ? "Left hand" : "Right hand";
    std::cout << std::string(2,' ') << handType << ",id: " << hand.id()
              << ",palm position: " << hand.palmPosition() << std::endl;
    // Get the hand's normal vector and direction
    const Vector normal = hand.palmnormal();
    const Vector direction = hand.direction();

    // Calculate the hand's pitch,roll,and yaw angles
    std::cout << std::string(2,' ') <<  "pitch: " << direction.pitch() * RAD_TO_DEG << " degrees,"
              << "roll: " << normal.roll() * RAD_TO_DEG << " degrees,"
              << "yaw: " << direction.yaw() * RAD_TO_DEG << " degrees" << std::endl;

    // Get the Arm bone
    Arm arm = hand.arm();
    std::cout << std::string(2,' ') <<  "Arm direction: " << arm.direction()
              << " wrist position: " << arm.wristPosition()
              << " elbow position: " << arm.elbowPosition() << std::endl;

    // Get fingers
    const FingerList fingers = hand.fingers();
    for (FingerList::const_iterator fl = fingers.begin(); fl != fingers.end(); ++fl) {
      const Finger finger = *fl;
      std::cout << std::string(4,' ') <<  fingerNames[finger.type()]
                << " finger,id: " << finger.id()
                << ",length: " << finger.length()
                << "mm,width: " << finger.width() << std::endl;

      // Get finger bones
      for (int b = 0; b < 4; ++b) {
        Bone::Type boneType = static_cast<Bone::Type>(b);
        Bone bone = finger.bone(boneType);
        std::cout << std::string(6,' ') <<  boneNames[boneType]
                  << " bone,start: " << bone.prevJoint()
                  << ",end: " << bone.nextJoint()
                  << ",direction: " << bone.direction() << std::endl;
      }
    }
  }

  // Get tools
  const ToolList tools = frame.tools();
  for (ToolList::const_iterator tl = tools.begin(); tl != tools.end(); ++tl) {
    const Tool tool = *tl;
    std::cout << std::string(2,' ') <<  "Tool,id: " << tool.id()
              << ",position: " << tool.tipPosition()
              << ",direction: " << tool.direction() << std::endl;
  }

  // Get gestures
  const GestureList gestures = frame.gestures();
  for (int g = 0; g < gestures.count(); ++g) {
    Gesture gesture = gestures[g];

    switch (gesture.type()) {
      case Gesture::TYPE_CIRCLE:
      {
        CircleGesture circle = gesture;
        std::string clockwiseness;

        if (circle.pointable().direction().angleto(circle.normal()) <= PI/2) {
          clockwiseness = "clockwise";
        } else {
          clockwiseness = "counterclockwise";
        }

        // Calculate angle swept since last frame
        float sweptAngle = 0;
        if (circle.state() != Gesture::STATE_START) {
          CircleGesture prevIoUsUpdate = CircleGesture(controller.frame(1).gesture(circle.id()));
          sweptAngle = (circle.progress() - prevIoUsUpdate.progress()) * 2 * PI;
        }
        std::cout << std::string(2,' ')
                  << "Circle id: " << gesture.id()
                  << ",state: " << stateNames[gesture.state()]
                  << ",progress: " << circle.progress()
                  << ",radius: " << circle.radius()
                  << ",angle " << sweptAngle * RAD_TO_DEG
                  <<  "," << clockwiseness << std::endl;
        break;
      }
      case Gesture::TYPE_SWIPE:
      {
        SwipeGesture swipe = gesture;
        std::cout << std::string(2,' ')
          << "Swipe id: " << gesture.id()
          << ",state: " << stateNames[gesture.state()]
          << ",direction: " << swipe.direction()
          << ",speed: " << swipe.speed() << std::endl;
        break;
      }
      case Gesture::TYPE_KEY_TAP:
      {
        KeyTapGesture tap = gesture;
        std::cout << std::string(2,' ')
          << "Key Tap id: " << gesture.id()
          << ",position: " << tap.position()
          << ",direction: " << tap.direction()<< std::endl;
        break;
      }
      case Gesture::TYPE_SCREEN_TAP:
      {
        ScreenTapGesture screentap = gesture;
        std::cout << std::string(2,' ')
          << "Screen Tap id: " << gesture.id()
          << ",position: " << screentap.position()
          << ",direction: " << screentap.direction()<< std::endl;
        break;
      }
      default:
        std::cout << std::string(2,' ')  << "UnkNown gesture type." << std::endl;
        break;
    }
  }

  if (!frame.hands().isEmpty() || !gestures.isEmpty()) {
    std::cout << std::endl;
  }

}

void SampleListener::onFocusGained(const Controller& controller) {
  std::cout << "Focus Gained" << std::endl;
}

void SampleListener::onFocusLost(const Controller& controller) {
  std::cout << "Focus Lost" << std::endl;
}

void SampleListener::onDeviceChange(const Controller& controller) {
  std::cout << "Device Changed" << std::endl;
  const DeviceList devices = controller.devices();

  for (int i = 0; i < devices.count(); ++i) {
    std::cout << "id: " << devices[i].toString() << std::endl;
    std::cout << "  isstreaming: " << (devices[i].isstreaming() ? "true" : "false") << std::endl;
  }
}

void SampleListener::onServiceConnect(const Controller& controller) {
  std::cout << "Service Connected" << std::endl;
}

void SampleListener::onServicedisconnect(const Controller& controller) {
  std::cout << "Service disconnected" << std::endl;
}

int main(int argc,char** argv) {
  // Create a sample listener and controller
  SampleListener listener;
  Controller controller;

  // Have the sample listener receive events from the controller
  controller.addListener(listener);

  if (argc > 1 && strcmp(argv[1],"--bg") == 0)
    controller.setPolicy(Leap::Controller::POLICY_BACKGROUND_FRAMES);

  // Keep this process running until Enter is pressed
  std::cout << "Press Enter to quit..." << std::endl;
  std::cin.get();

  // Remove the sample listener when done
  controller.removeListener(listener);

  return 0;
}

LEAP_LIBRARY := ./lib/libLeap.dylib

main: main.cpp
    $(CXX) -Wall -g -I ./include main.cpp -o main $(LEAP_LIBRARY);
    install_name_tool -change @loader_path/libLeap.dylib ./lib/libLeap.dylib main

clean:
    rm -rf main main.dSYM
$ otool -L lib/libLeap.dylib
lib/libLeap.dylib:
    @loader_path/libLeap.dylib (compatibility version 0.7.0,current version 2.3.1)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0,current version 1197.1.1)
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0,current version 1265.21.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0,current version 120.0.0)
    /System/Library/Frameworks/applicationservices.framework/Versions/A/applicationservices (compatibility version 1.0.0,current version 48.0.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0,current version 228.0.0)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。