16个版本

0.2.2 2024年6月19日
0.2.1 2024年3月25日
0.1.4 2023年12月28日
0.1.3 2023年9月23日
0.0.6 2022年7月31日

#107 in 硬件支持

Download history 198/week @ 2024-06-16 13/week @ 2024-06-23 7/week @ 2024-07-21 55/week @ 2024-07-28

每月62次下载

MIT/Apache

160KB
3K SLoC

LeapRS

Github Crates.io docs.rs Crates.io

LeapRS是LeapC的非官方安全封装器,LeapC是Leap Motion C API。它使用了leap-sys提供的生成的绑定。

这是一个访问Leap Motion/Ultraleap手部追踪设备的API。它适用于Linux和Windows。

leaprs

Warning: This library is not complete and not fully tested. Moreover, it includes unsafe code to interact with the C API. It should be treated with caution in its current state.

范围

LeapRS的目标是完全以安全的方式涵盖LeapC。它旨在尽可能接近原始的C库。因此,它是比较底层的,并携带了LeapC使用的大部分困难。

它不打算提供任何全功能的框架,例如拥有工作线程并提供异步API。但它旨在可用于创建这样的框架。

API覆盖率

当前的覆盖包括在单设备或多设备环境中与Leap Motion设备交互所需的大部分必要函数。插值和扭曲方法尚未完全翻译和测试。

没有暴露分配API。

设置

leaprs 添加到当前项目:cargo add leaprs

您还需要安装LeapMotion 追踪软件

该库是为名为 Geminy (5.6.1) 的版本创建的。

如果您在自定义路径中安装此软件,您需要定义环境变量 LEAPSDK_LIB_PATH(默认:Windows上的C:\Program Files\Ultraleap\LeapSDK\lib\x64和Linux上的/usr/share/doc/ultraleap-hand-tracking-service)。

在运行时,应用程序需要LeapC.dll文件可用。在开发期间最容易的方法是将它的文件夹添加到环境变量PATH中。对于分发,请参阅SDK许可协议。

快速入门

主入口点是 Connection::create。对于大多数基本的手部跟踪用法,您必须使用 Connection::poll 并使用 ConnectionMessage::event 获取底层事件。可能的各类事件在 [EventRef] 枚举中描述,包括包含手部位置的 EventRef::Tracking

use leaprs::*;

let mut c = Connection::create(ConnectionConfig::default()).unwrap();
c.open().unwrap();
for _ in 0..10 {
    if let Ok(msg) = c.poll(1000) {
        match msg.event() {
            EventRef::Tracking(e) => println!("{} hand(s)", e.hands().len()),
            _ => {}   
        }
    }
}

leaprs 中的大多数类型都是围绕底层 LeapC 结构的包装器,没有数据。这些包装器公开了以下内容:

当两个成员都可用(.hands.hands())时,该函数是获取安全包装器的推荐方法。字段访问可以用于绕过 leaprs 的限制。

glamnalgebra 集成

leaprs 包含可选的 glamnalgebra 集成。

它们是两个流行的线性代数库。它们都广泛使用,这些功能可以帮助与使用这些包的生态系统集成。glamBevy 使用,而 nalgebraFyrox 使用。

glam

cargobuild --featuresglam

use leaprs::*;
use glam::{Vec3, Quat};

let mut c = Connection::create(ConnectionConfig::default()).unwrap();
c.open().unwrap();
for _ in 0..10 {
    if let Ok(msg) = c.poll(1000) {
        match msg.event() {
            EventRef::Tracking(e) => {
                for hand in e.hands() {
                    let position: Vec3 = hand.palm().position().into();
                    let orientation: Quat = hand.palm().orientation().into();
                }
            },
            _ => {}
        }
    }
}

nalgebra

cargobuild --featuresnalgebra

use leaprs::*;
use nalgebra::{Vector3, UnitQuaternion};

let mut c = Connection::create(ConnectionConfig::default()).unwrap();
c.open().unwrap();
for _ in 0..10 {
    if let Ok(msg) = c.poll(1000) {
        match msg.event() {
            EventRef::Tracking(e) => {
                for hand in e.hands() {
                    let position: Vector3<f32> = hand.palm().position().into();
                    let orientation: UnitQuaternion<f32> = hand.palm().orientation().into();
                }
            },
            _ => {}
        }
    }
}

使用先前 SDK 版本

禁用 geminy 功能可以使构建适用于先前 SDK 代(Orion)的应用程序。在 Cargo.toml 中

[dependencies = { version = "*", default-features = false }]

您还需要将 LEAPSDK_LIB_PATH 指向具有 Orion 版本的 SDK。

许可证

根据您的选择,许可协议为 Apache 许可证 2.0 版本或 MIT 许可证。

此许可证仅覆盖 leaprs 包装器,不包括底层 LeapC 库。

实现

枚举安全性是通过 num_enum 提供的。

位标志是用 bitflags 包装的。

大多数结构都是围绕它们的 C 对应物简单包装。大多数情况下,C 结构是包装器的唯一成员,除非需要外部分配(当向 LeapC 提供预分配的数组时)。访问器随后以一致的方式公开与这些结构相关联的所有函数和成员。

测试

测试需要Leap软件正在运行,并且有一个设备连接。

依赖项

~0.7–2.5MB
~62K SLoC