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 硬件支持
每月62次下载
160KB
3K SLoC
LeapRS
LeapRS是LeapC的非官方安全封装器,LeapC是Leap Motion C API。它使用了leap-sys提供的生成的绑定。
这是一个访问Leap Motion/Ultraleap手部追踪设备的API。它适用于Linux和Windows。
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
结构的包装器,没有数据。这些包装器公开了以下内容:
- 访问数据的便捷方法,例如 TrackingEventRef::hands 列出了可见的手
- 通过
Deref
特性直接访问底层数据,例如 [HandRef] 直接访问 leap_sys::LEAP_HAND::confidence:hand_ref.confidence
当两个成员都可用(.hands
和 .hands()
)时,该函数是获取安全包装器的推荐方法。字段访问可以用于绕过 leaprs
的限制。
glam
和 nalgebra
集成
leaprs
包含可选的 glam
和 nalgebra
集成。
它们是两个流行的线性代数库。它们都广泛使用,这些功能可以帮助与使用这些包的生态系统集成。glam
由 Bevy
使用,而 nalgebra
由 Fyrox
使用。
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