问题描述
我从 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 (将#修改为@)