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()