-
- ArUco: поле {fieldSize}×{fieldSize} · шаг 1 м · X вниз · Y вправо
+
+ ArUco: поле {fieldSize}×{fieldSize} - шаг 1 м - X вниз - Y вправо
-
-
● RMC1● RMC2-- маршрут
+
+ RMC1RMC2 - - - маршрут
)
@@ -195,7 +195,7 @@ function ManualControls({ robot, emergency, send }: { robot: RobotId; emergency:
useEffect(() => stop, [stop])
- const button = 'select-none rounded-lg border border-slate-600 bg-slate-800 px-3 py-3 font-semibold text-slate-100 hover:bg-slate-700 active:bg-cyan-700 disabled:cursor-not-allowed disabled:opacity-40'
+ const button = 'select-none border border-slate-600 bg-slate-800 px-3 py-3 font-semibold text-slate-100 hover:bg-slate-700 active:bg-slate-600 disabled:cursor-not-allowed disabled:opacity-40'
const handlers = (x: number, y: number, yaw: number) => ({
onPointerDown: (event: React.PointerEvent
) => {
event.currentTarget.setPointerCapture(event.pointerId)
@@ -207,15 +207,15 @@ function ManualControls({ robot, emergency, send }: { robot: RobotId; emergency:
return (
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
)
}
@@ -309,13 +309,13 @@ export default function App() {
const setForm = (setter: React.Dispatch>, key: keyof Pose, value: number) => setter((current) => ({ ...current, [key]: value }))
return (
-
+
- MVCH FMS · модуль Г
Управление, навигация и телеметрия RMC1 / RMC2
+ Веб-Панель - модуль Г
Управление, навигация и телеметрия RMC1 / RMC2
- WebSocket: {socketOnline && fresh ? 'online' : 'offline'}
- Bridge: {state.bridgeOnline ? state.mode : 'offline'}
- {state.bridgeError ?? message}
+ WebSocket: {socketOnline && fresh ? 'online' : 'offline'}
+ Bridge: {state.bridgeOnline ? state.mode : 'offline'}
+ {state.bridgeError ?? message}
@@ -323,7 +323,7 @@ export default function App() {
{(['RMC1', 'RMC2'] as RobotId[]).map((id) => (
-
@@ -342,10 +342,10 @@ export default function App() {
- send({ type: 'set_pose', robot: selected, pose: poseForm })} className="mt-3 w-full rounded-lg bg-slate-700 px-4 py-2 font-semibold hover:bg-slate-600">Применить без движения
+ send({ type: 'set_pose', robot: selected, pose: poseForm })} className="mt-3 w-full bg-slate-700 px-4 py-2 font-semibold hover:bg-slate-600">Применить без движения
@@ -378,16 +378,16 @@ export default function App() {
setForm(setGoalForm, 'yaw', value)} />
- send({ type: 'set_goal', robot: selected, pose: goalForm })} className="rounded-lg bg-violet-700 px-3 py-2 font-semibold hover:bg-violet-600 disabled:opacity-40">Ехать к точке
- send({ type: 'cancel_goal', robot: selected })} className="rounded-lg bg-slate-700 px-3 py-2 font-semibold hover:bg-slate-600">Отменить
+ send({ type: 'set_goal', robot: selected, pose: goalForm })} className=" bg-violet-700 px-3 py-2 font-semibold hover:bg-violet-600 disabled:opacity-40">Ехать к точке
+ send({ type: 'cancel_goal', robot: selected })} className=" bg-slate-700 px-3 py-2 font-semibold hover:bg-slate-600">Отменить
{selected === 'RMC1' ? (
- send({ type: 'gripper', robot: 'RMC1', state: 'open' })} className="rounded-lg bg-cyan-800 px-3 py-2 disabled:opacity-40">Открыть схват send({ type: 'gripper', robot: 'RMC1', state: 'closed' })} className="rounded-lg bg-cyan-800 px-3 py-2 disabled:opacity-40">Закрыть схват
+ send({ type: 'gripper', robot: 'RMC1', state: 'open' })} className=" bg-cyan-800 px-3 py-2 disabled:opacity-40">Открыть схват send({ type: 'gripper', robot: 'RMC1', state: 'closed' })} className=" bg-cyan-800 px-3 py-2 disabled:opacity-40">Закрыть схват
) : (
- send({ type: 'lift', robot: 'RMC2', height: 0.1 })} className="rounded-lg bg-amber-800 px-3 py-2 disabled:opacity-40">Поднять лифт send({ type: 'lift', robot: 'RMC2', height: 0 })} className="rounded-lg bg-amber-800 px-3 py-2 disabled:opacity-40">Опустить лифт
+ send({ type: 'lift', robot: 'RMC2', height: 0.1 })} className=" bg-amber-800 px-3 py-2 disabled:opacity-40">Поднять лифт send({ type: 'lift', robot: 'RMC2', height: 0 })} className=" bg-amber-800 px-3 py-2 disabled:opacity-40">Опустить лифт
)}