BodyBalanceEvaluation/backend/tests/SMiTSense_DLL_Analysis.md
2025-08-07 16:22:38 +08:00

260 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SMiTSense足部压力传感器DLL分析报告
## 概述
本文档分析了`SMiTSenseUsb-F3.0.dll`和`SMiTSenseUsb-F3.0.lib`文件并提供了Python调用接口的实现。
## DLL文件分析
### 文件信息
- **DLL文件**: `SMiTSenseUsb-F3.0.dll`
- **库文件**: `SMiTSenseUsb-F3.0.lib`
- **版本**: F3.0
- **用途**: SMiTSense足部压力传感器USB通信驱动
### 导出函数列表
通过分析`.lib`文件,发现以下导出函数:
| 函数名 | 功能描述 | 参数说明 |
|--------|----------|----------|
| `fpms_usb_init` | 初始化USB连接 | 无参数 |
| `fpms_usb_get_device_list` | 获取设备列表 | 设备数量指针 |
| `fpms_usb_open` | 打开指定设备 | 设备ID |
| `fpms_usb_close` | 关闭设备连接 | 设备句柄 |
| `fpms_usb_read_frame` | 读取压力数据帧 | 设备句柄、数据缓冲区、传感器数量 |
| `fpms_usb_get_sensitivity` | 获取传感器灵敏度 | 设备句柄、灵敏度指针 |
| `fpms_usb_config_sensitivity` | 配置传感器灵敏度 | 设备句柄、灵敏度值 |
### 函数调用流程
```
1. fpms_usb_init() // 初始化USB子系统
2. fpms_usb_get_device_list() // 获取可用设备
3. fpms_usb_open() // 打开设备
4. fpms_usb_get_sensitivity() // 获取当前灵敏度(可选)
5. fpms_usb_config_sensitivity() // 设置灵敏度(可选)
6. fpms_usb_read_frame() // 循环读取压力数据
7. fpms_usb_close() // 关闭设备
```
## Python接口实现
### 核心类SMiTSensePressureSensor
```python
class SMiTSensePressureSensor:
def __init__(self, dll_path=None)
def initialize(self)
def get_device_list()
def connect(self, device_id=0)
def disconnect(self)
def read_pressure_data(self, sensor_count=16)
def get_sensitivity()
def set_sensitivity(self, sensitivity_value)
def get_foot_pressure_zones(self, pressure_data)
```
### 使用示例
```python
from test_smitsense_dll import SMiTSensePressureSensor
# 创建传感器实例
sensor = SMiTSensePressureSensor()
# 初始化并连接
if sensor.initialize():
devices = sensor.get_device_list()
if devices and sensor.connect(devices[0]):
# 读取压力数据
pressure_data = sensor.read_pressure_data()
if pressure_data:
foot_zones = sensor.get_foot_pressure_zones(pressure_data)
print(f"左脚压力: {foot_zones['left_total']}")
print(f"右脚压力: {foot_zones['right_total']}")
# 断开连接
sensor.disconnect()
```
## 测试程序说明
### 1. test_smitsense_dll.py
**功能**: 完整的DLL接口封装和测试
**特性**:
- 完整的ctypes函数签名定义
- 错误处理和日志记录
- 足部压力区域数据处理
- 设备连接管理
**运行方式**:
```bash
python test_smitsense_dll.py
```
### 2. smitsense_demo.py
**功能**: 简化的演示程序
**特性**:
- 实时压力监控
- 简单的平衡分析
- 用户友好的界面
- 安全的设备断开
**运行方式**:
```bash
python smitsense_demo.py
python smitsense_demo.py --help # 查看使用说明
```
## 数据格式说明
### 原始压力数据
- **类型**: float数组
- **长度**: 16个传感器点可配置
- **单位**: 压力值(具体单位取决于传感器校准)
- **频率**: 最高支持约50Hz采样
### 足部区域数据
```python
{
'left_front': float, # 左脚前部压力
'left_rear': float, # 左脚后部压力
'right_front': float, # 右脚前部压力
'right_rear': float, # 右脚后部压力
'left_total': float, # 左脚总压力
'right_total': float, # 右脚总压力
'total_pressure': float, # 总压力
'raw_data': list # 原始16点数据
}
```
### 传感器布局假设
```
左脚布局: 右脚布局:
[0] [1] [8] [9]
[2] [3] [10] [11]
[4] [5] [12] [13]
[6] [7] [14] [15]
前部 后部 前部 后部
```
## 集成到现有系统
### 替换MockPressureDevice
在`device_manager.py`中可以用真实的SMiTSense传感器替换模拟设备
```python
# 原代码
self.pressure_device = MockPressureDevice()
# 替换为
from tests.test_smitsense_dll import SMiTSensePressureSensor
self.pressure_device = SMiTSensePressureSensor()
if self.pressure_device.initialize():
devices = self.pressure_device.get_device_list()
if devices:
self.pressure_device.connect(devices[0])
```
### 数据格式适配
需要修改`read_data()`方法以匹配现有的数据格式:
```python
def read_data(self):
pressure_data = self.pressure_device.read_pressure_data()
if pressure_data:
foot_zones = self.pressure_device.get_foot_pressure_zones(pressure_data)
return {
'foot_pressure': foot_zones,
'timestamp': datetime.now().isoformat(),
'pressure_image': '' # 如需要可生成压力分布图
}
return None
```
## 故障排除
### 常见问题
1. **DLL加载失败**
- 检查DLL文件路径
- 确保系统架构匹配32位/64位
- 检查依赖的运行时库
2. **设备未找到**
- 检查USB连接
- 确认设备驱动已安装
- 检查设备是否被其他程序占用
3. **数据读取失败**
- 检查设备连接状态
- 确认传感器校准状态
- 检查USB通信稳定性
4. **函数调用错误**
- 检查函数参数类型
- 确认函数调用顺序
- 查看错误码含义
### 调试建议
1. **启用详细日志**
```python
import logging
logging.basicConfig(level=logging.DEBUG)
```
2. **检查返回值**
- 所有函数都返回错误码
- 0通常表示成功
- 非0值表示不同的错误类型
3. **使用try-except**
- 捕获ctypes相关异常
- 处理设备断开情况
- 记录详细错误信息
## 性能考虑
### 采样频率
- **推荐频率**: 20-50Hz
- **最大频率**: 约100Hz取决于USB带宽
- **实际应用**: 根据应用需求调整
### 内存使用
- **数据缓冲**: 每次读取约64字节16个float
- **内存泄漏**: 确保正确释放设备句柄
- **垃圾回收**: 定期清理压力数据缓存
### CPU占用
- **主要开销**: USB通信和数据转换
- **优化建议**: 使用独立线程进行数据采集
- **批处理**: 可考虑批量读取多帧数据
## 扩展功能
### 可能的增强
1. **数据滤波**: 实现低通滤波减少噪声
2. **校准功能**: 自动零点校准和增益调整
3. **数据记录**: 保存压力数据到文件
4. **可视化**: 实时压力分布图显示
5. **多设备**: 支持同时连接多个传感器
### 与现有系统集成
1. **WebSocket推流**: 集成到现有的实时数据推流
2. **数据库存储**: 保存压力数据到SQLite
3. **前端显示**: 在Vue界面中显示压力分布
4. **报告生成**: 包含压力分析的PDF报告
## 总结
SMiTSenseUsb-F3.0.dll提供了完整的足部压力传感器接口通过Python ctypes可以实现有效的调用。测试程序验证了基本功能可以作为集成到现有平衡体态检测系统的基础。
建议在实际部署前进行充分的硬件测试,确保传感器校准准确,数据采集稳定。