diff --git a/gui/admin.html b/gui/admin.html
index e7b66f8..a6cff26 100644
--- a/gui/admin.html
+++ b/gui/admin.html
@@ -189,6 +189,21 @@
° (0=N, 90=O, 180=S, 270=W)
+
+
+ Dreh-Speed
+
+
+
+
@@ -2946,14 +2961,16 @@
async function startRotate() {
var input = document.getElementById('rotate_target');
+ var speedEl = document.getElementById('rotate_speed');
var target = parseFloat(input ? input.value : 0);
+ var speedPct = speedEl ? parseInt(speedEl.value) : 20;
if (isNaN(target)) { alert('Ungültiger Winkel'); return; }
setAdminStatus('Starte Drehung zu ' + target + '°…');
try {
var response = await fetch(adminApiBase + '/api/imu/rotate-to', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
- body: JSON.stringify({target_deg: target})
+ body: JSON.stringify({target_deg: target, speed_pct: speedPct})
});
var data = await response.json();
if (!response.ok) throw new Error(data.status || ('status ' + response.status));
diff --git a/scripts/exomy_admin_api.py b/scripts/exomy_admin_api.py
index 96abdae..588b1b0 100644
--- a/scripts/exomy_admin_api.py
+++ b/scripts/exomy_admin_api.py
@@ -2319,10 +2319,12 @@ class Handler(http.server.BaseHTTPRequestHandler):
self.write_json(status_code, response)
return
+
if self.path == '/api/imu/rotate-to':
try:
payload = json.loads(raw_body.decode('utf-8'))
target_deg = float(payload.get('target_deg', 0))
+ speed_pct = max(20, min(50, int(payload.get('speed_pct', 20))))
except (UnicodeDecodeError, json.JSONDecodeError, TypeError, ValueError):
self.write_json(400, {'status': 'Ungültige Anfrage'})
return
@@ -2333,10 +2335,12 @@ class Handler(http.server.BaseHTTPRequestHandler):
return
import imu_rotate
heading_offset = read_imu_heading_calibration()['offset_deg']
+ vel = max(1, int(100.0 * (speed_pct / 100.0) ** 2.0))
status = imu_rotate.start_rotate(
target_deg=target_deg,
heading_offset=heading_offset,
restore_mode=LAST_LOCOMOTION_MODE,
+ vel=vel,
)
self.write_json(200, {'status': 'Drehung gestartet', 'rotate': status})
return