53 lines
2.6 KiB
Python
53 lines
2.6 KiB
Python
import cv2
|
|
import numpy as np
|
|
from typing import Dict
|
|
from .config import Config, Colors
|
|
|
|
class HUD:
|
|
@staticmethod
|
|
def draw(frame: np.ndarray,
|
|
status: str,
|
|
emergency_stop: bool,
|
|
is_locked: bool,
|
|
lock_trigger: bool,
|
|
current_height: float,
|
|
target_altitude: float,
|
|
current_yaw: float,
|
|
bat: int,
|
|
depth_map_vis: np.ndarray,
|
|
zones: Dict[str, bool]):
|
|
|
|
cv2.rectangle(frame, (0, 0), (Config.WIDTH, 90), Colors.HUD_BG, -1)
|
|
cv2.rectangle(frame, (0, Config.HEIGHT-90), (Config.WIDTH, Config.HEIGHT), Colors.HUD_BG, -1)
|
|
|
|
stat_color = Colors.RED if "AVOIDING" in status or emergency_stop else Colors.GREEN
|
|
if is_locked: stat_color = Colors.BLUE
|
|
|
|
cv2.putText(frame, f"STATUS: {status}", (25, 40), cv2.FONT_HERSHEY_DUPLEX, 1.1, stat_color, 2)
|
|
cv2.putText(frame, f"ALT: {current_height:.1f}m | BAT: {bat}% | YAW: {int(current_yaw)}o", (25, 75), cv2.FONT_HERSHEY_SIMPLEX, 0.7, Colors.WHITE, 2)
|
|
|
|
if depth_map_vis is not None:
|
|
mini = cv2.resize(depth_map_vis, (200, 150))
|
|
frame[100:250, 25:225] = mini
|
|
cv2.rectangle(frame, (25, 100), (225, 250), Colors.WHITE, 2)
|
|
cv2.putText(frame, "AI DEPTH", (25, 275), cv2.FONT_HERSHEY_SIMPLEX, 0.6, Colors.WHITE, 2)
|
|
|
|
radar_x = Config.WIDTH - 220
|
|
for i, name in enumerate(["LEFT", "CENTER", "RIGHT"]):
|
|
short_name = name[0]
|
|
active = zones[name]
|
|
col = Colors.RED if active else Colors.GREEN
|
|
cv2.rectangle(frame, (radar_x + i*70, 100), (radar_x + (i+1)*60, 150), col, -1 if active else 2)
|
|
cv2.putText(frame, short_name, (radar_x + 20 + i*70, 135), cv2.FONT_HERSHEY_DUPLEX, 0.8, Colors.WHITE, 2)
|
|
|
|
stop_col = Colors.RED if not emergency_stop else (0, 255, 255)
|
|
cv2.rectangle(frame, (Config.WIDTH - 250, Config.HEIGHT - 80), (Config.WIDTH - 25, Config.HEIGHT - 10), stop_col, -1)
|
|
cv2.putText(frame, "STOP", (Config.WIDTH - 200, Config.HEIGHT - 35), cv2.FONT_HERSHEY_DUPLEX, 0.8, Colors.WHITE, 2)
|
|
|
|
keys = ["T:Takeoff", "L:Land", "M:Manual", "K:LockOn", "R:Up", "F:Down", "1:Rotate", "Space:Stop", "ENTER:Quit"]
|
|
for i, k in enumerate(keys):
|
|
cv2.putText(frame, k, (25 + (i%5)*200, Config.HEIGHT - 55 + (i//5)*35), cv2.FONT_HERSHEY_SIMPLEX, 0.6, Colors.WHITE, 2)
|
|
|
|
if lock_trigger:
|
|
cv2.putText(frame, "LOCK TRIGGER ACTIVE: FINDING FACE...", (25, 120), cv2.FONT_HERSHEY_SIMPLEX, 0.7, Colors.BLUE, 2)
|