|
|
import cv2
|
|
|
import sys
|
|
|
from config import Config
|
|
|
from skeleton.mediapipe_detector import MediaPipeDetector
|
|
|
from gesture_control.arm_control import ArmController
|
|
|
from gesture_control.special_gestures import SpecialGestureDetector
|
|
|
from gesture_control.state import ControlState
|
|
|
from robot.map_simulator import MapSimulator
|
|
|
from robot.dummy import DummyRobot
|
|
|
|
|
|
def main():
|
|
|
cfg = Config()
|
|
|
|
|
|
# Детектор
|
|
|
detector = MediaPipeDetector()
|
|
|
|
|
|
# Состояние управления
|
|
|
state = ControlState()
|
|
|
|
|
|
# Специальные жесты
|
|
|
special_detector = SpecialGestureDetector(
|
|
|
mode=cfg.SPECIAL_GESTURE_MODE,
|
|
|
model_path=cfg.ML_GESTURE_MODEL,
|
|
|
class_names=cfg.ML_GESTURE_CLASSES
|
|
|
)
|
|
|
|
|
|
# Управление скоростями
|
|
|
arm_control = ArmController(cfg.ARM_CONTROL, mirror=cfg.MIRROR_CAMERA)
|
|
|
|
|
|
# Робот
|
|
|
if cfg.ROBOT_MODE == 'simulator':
|
|
|
robot = MapSimulator(cfg)
|
|
|
else:
|
|
|
robot = DummyRobot()
|
|
|
|
|
|
# Камера
|
|
|
cap = cv2.VideoCapture(cfg.CAMERA_ID)
|
|
|
if not cap.isOpened():
|
|
|
print("Ошибка: не удалось открыть камеру")
|
|
|
sys.exit(1)
|
|
|
|
|
|
print("Управление: крест руками = СТОП, домик = ПУСК")
|
|
|
print("Линейная скорость: правая рука в сторону, угловая: левая рука")
|
|
|
print("В симуляторе: R – перезапуск после Game Over/победы")
|
|
|
print("q – выход")
|
|
|
|
|
|
while True:
|
|
|
ret, frame = cap.read()
|
|
|
if not ret:
|
|
|
break
|
|
|
|
|
|
if cfg.MIRROR_CAMERA:
|
|
|
frame = cv2.flip(frame, 1)
|
|
|
|
|
|
result = detector.detect(frame)
|
|
|
|
|
|
if result['success']:
|
|
|
landmarks = result['landmarks']
|
|
|
vis_frame = detector.draw_landmarks(frame, result['pose_landmarks'])
|
|
|
|
|
|
special = special_detector.predict(landmarks)
|
|
|
state.update(special)
|
|
|
|
|
|
if state.enabled:
|
|
|
linear, angular = arm_control.compute_speeds(landmarks)
|
|
|
else:
|
|
|
linear, angular = 0.0, 0.0
|
|
|
|
|
|
robot.set_speeds(linear, angular)
|
|
|
|
|
|
# Отрисовка на видео
|
|
|
cv2.putText(vis_frame, f"State: {'ON' if state.enabled else 'OFF'}",
|
|
|
(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1,
|
|
|
(0,255,0) if state.enabled else (0,0,255), 2)
|
|
|
cv2.putText(vis_frame, f"L:{linear:.2f} A:{angular:.2f}",
|
|
|
(10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,0), 2)
|
|
|
if special != 'none':
|
|
|
cv2.putText(vis_frame, f"Special: {special}", (10, 90),
|
|
|
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,0), 2)
|
|
|
else:
|
|
|
vis_frame = frame
|
|
|
cv2.putText(vis_frame, "No pose detected", (10, 30),
|
|
|
cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
|
|
|
|
|
|
cv2.imshow('Camera', vis_frame)
|
|
|
|
|
|
if cfg.ROBOT_MODE == 'simulator':
|
|
|
if not robot.step():
|
|
|
break
|
|
|
else:
|
|
|
robot.step()
|
|
|
|
|
|
if cv2.waitKey(1) & 0xFF == ord('q'):
|
|
|
break
|
|
|
|
|
|
cap.release()
|
|
|
cv2.destroyAllWindows()
|
|
|
robot.quit()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
main()
|