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


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    = 80      # вперёд/назад
TURN     = 50      # поворот
VERT     = 100     # вертикальная тяга (+ = вниз, при неверном знаке поменяй)

DIVE = {"s", "ы", "Next",  "Shift_L", "Shift_R", "btn_down"}
RISE = {"w", "ц", "Prior", "space",              "btn_up"}

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

root = tk.Tk()
root.title("Стрелки: ход/поворот | W/Space: вверх | S/Shift: вниз | Esc")

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 hold_button(text, name, col):
    b = tk.Button(root, text=text, width=14, height=3)
    b.grid(row=0, column=col, padx=4, pady=4)
    b.bind("<ButtonPress-1>",   lambda e: keys.add(name))
    b.bind("<ButtonRelease-1>", lambda e: keys.discard(name))

hold_button("▲ Вверх", "btn_up", 0)
hold_button("▼ Вниз",  "btn_down", 1)
tk.Button(root, text="СТОП", width=10, height=3, command=stop).grid(row=0, column=2, padx=4)

def tick():
    global depth_target, yaw_target, was_turning, was_vert

    fwd  = SPEED * (("Up" in keys) - ("Down" in keys))
    turn = ("Right" in keys) - ("Left" in keys)
    vert = bool(keys & DIVE) - bool(keys & RISE)

    # глубина: клавиша — прямая тяга, отпустил — держим достигнутую
    if vert:
        u_z = VERT * vert
        was_vert = True
    else:
        if was_vert:
            depth_target = auv.get_depth()
            was_vert = False
        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()