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