206 lines
6.1 KiB
Python
Executable File
206 lines
6.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
系统测试脚本
|
|
测试手部检测Web服务的各个组件
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import time
|
|
import json
|
|
|
|
# 添加src目录到Python路径
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))
|
|
|
|
def test_import_modules():
|
|
"""测试模块导入"""
|
|
print("🔍 测试模块导入...")
|
|
try:
|
|
import cv2
|
|
print("✅ OpenCV 导入成功")
|
|
|
|
import mediapipe as mp
|
|
print("✅ MediaPipe 导入成功")
|
|
|
|
import flask
|
|
import flask_socketio
|
|
print("✅ Flask 和 SocketIO 导入成功")
|
|
|
|
from hand_detection_3d import load_mediapipe_model, process_frame_3d
|
|
print("✅ 手部检测模块导入成功")
|
|
|
|
from web_server import HandDetectionWebServer
|
|
print("✅ Web服务器模块导入成功")
|
|
|
|
from robot_client import RobotArmClient
|
|
print("✅ 机械臂客户端模块导入成功")
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f"❌ 模块导入失败: {e}")
|
|
return False
|
|
|
|
def test_hand_detection():
|
|
"""测试手部检测功能"""
|
|
print("\n🤖 测试手部检测功能...")
|
|
try:
|
|
from hand_detection_3d import load_mediapipe_model, process_frame_3d
|
|
import numpy as np
|
|
|
|
# 加载模型
|
|
model = load_mediapipe_model()
|
|
print("✅ MediaPipe模型加载成功")
|
|
|
|
# 创建测试图像
|
|
test_frame = np.zeros((480, 640, 3), dtype=np.uint8)
|
|
test_frame[:] = (50, 50, 50) # 灰色背景
|
|
|
|
# 处理帧
|
|
control_signal, hand_data = process_frame_3d(test_frame, model)
|
|
|
|
# 检查输出格式
|
|
required_keys = ['x_angle', 'y_angle', 'z_angle', 'grip', 'action', 'speed']
|
|
if all(key in control_signal for key in required_keys):
|
|
print("✅ 手部检测输出格式正确")
|
|
print(f" 控制信号: {control_signal}")
|
|
return True
|
|
else:
|
|
print("❌ 手部检测输出格式不正确")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ 手部检测测试失败: {e}")
|
|
return False
|
|
|
|
def test_web_server():
|
|
"""测试Web服务器"""
|
|
print("\n🌐 测试Web服务器...")
|
|
try:
|
|
from web_server import HandDetectionWebServer
|
|
|
|
# 创建服务器实例
|
|
server = HandDetectionWebServer(port=5003)
|
|
print("✅ Web服务器创建成功")
|
|
|
|
# 测试路由配置
|
|
with server.app.test_client() as client:
|
|
# 测试主页
|
|
response = client.get('/')
|
|
if response.status_code == 200:
|
|
print("✅ 主页路由正常")
|
|
else:
|
|
print(f"❌ 主页路由失败: {response.status_code}")
|
|
return False
|
|
|
|
# 测试API状态
|
|
response = client.get('/api/status')
|
|
if response.status_code == 200:
|
|
print("✅ API状态路由正常")
|
|
status_data = json.loads(response.data)
|
|
print(f" 状态信息: {status_data}")
|
|
else:
|
|
print(f"❌ API状态路由失败: {response.status_code}")
|
|
return False
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f"❌ Web服务器测试失败: {e}")
|
|
return False
|
|
|
|
def test_robot_client():
|
|
"""测试机械臂客户端"""
|
|
print("\n🦾 测试机械臂客户端...")
|
|
try:
|
|
from robot_client import RobotArmClient, MockRobotArmController
|
|
|
|
# 创建模拟控制器
|
|
mock_controller = MockRobotArmController()
|
|
print("✅ 模拟机械臂控制器创建成功")
|
|
|
|
# 测试控制器方法
|
|
mock_controller.move_to_angles(45, 90, 135, 5)
|
|
print("✅ 机械臂移动测试成功")
|
|
|
|
mock_controller.set_gripper_state(1)
|
|
print("✅ 抓取器控制测试成功")
|
|
|
|
# 创建客户端(不连接服务器)
|
|
client = RobotArmClient('http://localhost:5003')
|
|
print("✅ 机械臂客户端创建成功")
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f"❌ 机械臂客户端测试失败: {e}")
|
|
return False
|
|
|
|
def test_file_structure():
|
|
"""测试文件结构"""
|
|
print("\n📁 测试文件结构...")
|
|
required_files = [
|
|
'README.md',
|
|
'requirements.txt',
|
|
'run_web_service.py',
|
|
'start_service.sh',
|
|
'start_service.bat',
|
|
'start_robot_client.sh',
|
|
'start_robot_client.bat',
|
|
'src/__init__.py',
|
|
'src/hand_detection_3d.py',
|
|
'src/web_server.py',
|
|
'src/robot_client.py',
|
|
'templates/index.html'
|
|
]
|
|
|
|
missing_files = []
|
|
for file_path in required_files:
|
|
if not os.path.exists(file_path):
|
|
missing_files.append(file_path)
|
|
|
|
if missing_files:
|
|
print(f"❌ 缺少文件: {missing_files}")
|
|
return False
|
|
else:
|
|
print("✅ 所有必需文件存在")
|
|
return True
|
|
|
|
def main():
|
|
"""主测试函数"""
|
|
print("=" * 60)
|
|
print("🧪 手部检测Web服务系统测试")
|
|
print("=" * 60)
|
|
|
|
tests = [
|
|
test_file_structure,
|
|
test_import_modules,
|
|
test_hand_detection,
|
|
test_web_server,
|
|
test_robot_client
|
|
]
|
|
|
|
passed = 0
|
|
total = len(tests)
|
|
|
|
for test in tests:
|
|
if test():
|
|
passed += 1
|
|
else:
|
|
print(f"\n⚠️ 测试失败,请检查上述错误")
|
|
|
|
print("\n" + "=" * 60)
|
|
print(f"📊 测试结果: {passed}/{total} 个测试通过")
|
|
|
|
if passed == total:
|
|
print("🎉 所有测试通过!系统准备就绪")
|
|
print("\n🚀 启动命令:")
|
|
print(" Linux/Mac: ./start_service.sh")
|
|
print(" Windows: start_service.bat")
|
|
print(" 访问地址: http://localhost:5000")
|
|
else:
|
|
print("❌ 部分测试失败,请修复问题后重试")
|
|
|
|
print("=" * 60)
|
|
return passed == total
|
|
|
|
if __name__ == '__main__':
|
|
success = main()
|
|
sys.exit(0 if success else 1) |