4. SDK接口调用说明
4.1 核心类和方法
4.1.1 SerialInterface 类
串口通信接口类,处理底层硬件通信。
python
from psi_glove_sdk import SerialInterface
# 创建串口接口
serial = SerialInterface(
port="/dev/ttyACM0", # 串口路径
baudrate=115200, # 波特率
timeout=0.006, # 超时 (秒)
auto_connect=False, # 是否自动连接
mock=False # 是否使用模拟数据
)4.1.2 PSIGloveController 类
主控制器类,管理数据读取、解析和平滑处理。
python
from psi_glove_sdk import PSIGloveController
# 创建控制器
controller = PSIGloveController(
communication_interface=serial, # 通信接口
smoothing_window_size=10 # 平滑窗口大小
)核心方法:
| 方法名称 | 返回类型 | 功能说明 |
|---|---|---|
connect() | bool | 连接设备,成功返回 True |
disconnect() | None | 断开设备连接 |
is_connected() | bool | 检查是否已连接 |
loop() | Optional[StatusMessage] | 读取并返回关节数据,失败返回 None |
get_last_status() | Optional[StatusMessage] | 获取最后一次成功读取的数据 |
4.2 读取主手数据的完整流程
python
#!/usr/bin/env python3
from psi_glove_sdk import PSIGloveController, SerialInterface, StatusMessage
import time
# 步骤 1: 创建串口接口
serial = SerialInterface(
port="/dev/ttyACM0",
baudrate=115200,
timeout=0.006
)
# 步骤 2: 创建控制器
controller = PSIGloveController(
communication_interface=serial,
smoothing_window_size=10
)
# 步骤 3: 连接设备
if not controller.connect():
print("错误: 无法连接到设备")
exit(1)
print("连接成功!")
# 步骤 4: 循环读取数据
try:
while True:
# 读取数据(自动解析和平滑)
status: StatusMessage = controller.loop()
if status:
# 成功读取数据
print(f"拇指关节: {status.thumb}")
print(f"食指关节: {status.index}")
print(f"中指关节: {status.middle}")
print(f"无名指关节: {status.ring}")
print(f"小指关节: {status.pinky}")
# 或者获取所有关节的扁平列表(21个值)
all_joints = status.to_list()
print(f"所有关节 (21个): {all_joints}")
else:
# 读取失败,使用缓存数据
last_status = controller.get_last_status()
if last_status:
print("使用缓存数据")
# 控制循环频率(100 Hz)
time.sleep(0.01)
except KeyboardInterrupt:
print("\n用户中断")
finally:
# 步骤 5: 断开连接
controller.disconnect()
print("已断开连接")4.3 数据格式和单位
StatusMessage 数据结构
python
from dataclasses import dataclass
from typing import List
@dataclass
class StatusMessage:
thumb: List[int] # 拇指 5 个关节位置
index: List[int] # 食指 4 个关节位置
middle: List[int] # 中指 4 个关节位置
ring: List[int] # 无名指 4 个关节位置
pinky: List[int] # 小指 4 个关节位置
def to_list(self) -> List[int]:
"""返回所有 21 个关节值的扁平列表"""
return self.thumb + self.index + self.middle + self.ring + self.pinky关节索引映射
| 手指 | 关节数量 | 索引范围 | 访问方式 |
|---|---|---|---|
| 拇指 | 5 | 0-4 | status.thumb[0-4] |
| 食指 | 4 | 5-8 | status.index[0-3] |
| 中指 | 4 | 9-12 | status.middle[0-3] |
| 无名指 | 4 | 13-16 | status.ring[0-3] |
| 小指 | 4 | 17-20 | status.pinky[0-3] |
数据单位和范围
- 数据类型:
int(整数) - 数值范围:
0 - 4095(12位 ADC) - 物理含义: 关节传感器的电压值(经过模数转换)
- 数值对应:
0: 传感器最小值(手指完全伸直)2048: 传感器中间值4095: 传感器最大值(手指完全弯曲)
数据处理示例:
python
# 归一化到 0.0 - 1.0 范围
def normalize_joint(value: int) -> float:
"""将 ADC 值归一化到 [0.0, 1.0]"""
return value / 4095.0
# 映射到角度(需要校准)
def adc_to_angle(value: int, min_adc: int, max_adc: int, min_angle: float, max_angle: float) -> float:
"""将 ADC 值映射到角度"""
normalized = (value - min_adc) / (max_adc - min_adc)
return min_angle + normalized * (max_angle - min_angle)
# 使用示例
status = controller.loop()
if status:
# 归一化拇指第一关节
normalized = normalize_joint(status.thumb[0])
print(f"归一化值: {normalized:.3f}")
# 映射到角度(假设校准范围)
angle = adc_to_angle(status.thumb[0], 500, 3500, 0.0, 90.0)
print(f"关节角度: {angle:.2f}°")4.4 高级用法示例
4.4.1 批量数据采集
python
import time
from psi_glove_sdk import PSIGloveController, SerialInterface
# 初始化
serial = SerialInterface("/dev/ttyACM0", 115200)
controller = PSIGloveController(serial, smoothing_window_size=10)
controller.connect()
# 采集 1000 帧数据
data_buffer = []
for i in range(1000):
status = controller.loop()
if status:
data_buffer.append(status.to_list())
time.sleep(0.01)
# 保存到 CSV
import csv
with open('glove_data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow([f'joint_{i}' for i in range(21)]) # 表头
writer.writerows(data_buffer)
print(f"已保存 {len(data_buffer)} 帧数据到 glove_data.csv")
controller.disconnect()4.4.2 多手套同时使用
python
from psi_glove_sdk import PSIGloveController, SerialInterface
# 左手
left_serial = SerialInterface("/dev/ttyACM0", 115200)
left_controller = PSIGloveController(left_serial)
left_controller.connect()
# 右手
right_serial = SerialInterface("/dev/ttyACM1", 115200)
right_controller = PSIGloveController(right_serial)
right_controller.connect()
# 同时读取双手数据
while True:
left_status = left_controller.loop()
right_status = right_controller.loop()
if left_status and right_status:
print(f"左手拇指: {left_status.thumb[0]}, 右手拇指: {right_status.thumb[0]}")
time.sleep(0.01)