Загрузка данных


import tkinter as tk
import pymurapi as mur

auv = mur.mur_init()

def clamp(v, lo=-100, hi=100):
    return max(lo, min(hi, v))

def angle_diff(target, current):
    d = target - current
    while d > 180:  d -= 360
    while d < -180: d += 360
    return d

KP_DEPTH = 80
KP_YAW   = 0.6
SPEED    = 50      # тяга вперёд/назад
TURN     = 40      # тяга при повороте
DIVE_STEP = 0.02   # м за тик (50 мс) ≈ 0.4 м/с

DIVE = {"s", "ы", "Next"}     # S / PageDown
RISE = {"w", "ц", "Prior"}    # W / PageUp

keys = set()
depth_target = auv.get_depth()
yaw_target   = auv.get_yaw()
was_turning  = False

root = tk.Tk()
root.title("Стрелки: ход/поворот | W/S: глубина | Esc: выход")
root.geometry("460x60")

root.bind("<KeyPress>",   lambda e: keys.add(e.keysym))
root.bind("<KeyRelease>", lambda e: keys.discard(e.keysym))

def stop():
    for m in range(4):
        auv.set_motor_power(m, 0)
    root.destroy()

root.bind("<Escape>", lambda e: stop())
root.protocol("WM_DELETE_WINDOW", stop)

def tick():
    global depth_target, yaw_target, was_turning

    fwd  = SPEED * (("Up" in keys) - ("Down" in keys))
    turn = ("Right" in keys) - ("Left" in keys)

    # глубина: W/S двигают уставку, регулятор её держит
    if keys & DIVE: depth_target += DIVE_STEP
    if keys & RISE: depth_target = max(0.0, depth_target - DIVE_STEP)
    u_z = clamp(KP_DEPTH * (depth_target - auv.get_depth()))
    auv.set_motor_power(2, u_z)
    auv.set_motor_power(3, u_z)

    # курс: при повороте крутим напрямую, отпустил — держим новый курс
    if turn:
        u_yaw = TURN * turn
        was_turning = True
    else:
        if was_turning:
            yaw_target = auv.get_yaw()
            was_turning = False
        u_yaw = clamp(KP_YAW * angle_diff(yaw_target, auv.get_yaw()))

    auv.set_motor_power(0, clamp(fwd - u_yaw))
    auv.set_motor_power(1, clamp(fwd + u_yaw))

    root.after(50, tick)

tick()
root.mainloop()