feat(simulation): add provider-neutral worker profile

This commit is contained in:
DCCONSTRUCTIONS
2026-07-25 00:29:00 +03:00
parent 5abd07d2bf
commit 37c24b5fa8
21 changed files with 1275 additions and 121 deletions
@@ -136,6 +136,12 @@ export function PolygonLivePanel() {
}
}, [worker?.activeRunId]);
const controllerProvider = worker?.providerProfile?.providers.find((provider) =>
provider.roles.includes("controller"));
const providerStack = worker?.providerProfile?.providers
.map((provider) => provider.providerId)
.join(" · ");
const stopMotion = async () => {
const runId = worker?.activeRunId;
setControlIntent(null);
@@ -184,7 +190,10 @@ export function PolygonLivePanel() {
<div>
<span className="section-eyebrow">ПОЛИГОН / LIVE</span>
<h2>Stock Ackermann Rover</h2>
<p>PX4/Gazebo исполняются на отдельном worker; браузер показывает канонический срез.</p>
<p>
Провайдеры симуляции исполняются на отдельном worker; браузер показывает
канонический срез ENU/FLU.
</p>
</div>
<div>
<StatusBadge
@@ -198,7 +207,7 @@ export function PolygonLivePanel() {
disabled={!worker?.controlAvailable || actionBusy}
onClick={() => void runAction()}
>
{actionBusy ? "Ожидаем PX4/Gazebo…" : runActive ? "Остановить" : "Запустить"}
{actionBusy ? "Ожидаем провайдеры…" : runActive ? "Остановить" : "Запустить"}
</Button>
</div>
</header>
@@ -221,9 +230,11 @@ export function PolygonLivePanel() {
<div className="polygon-live-telemetry">
<div className="polygon-rover-controls">
<div className="polygon-rover-controls__heading">
<span>Управление PX4</span>
<StatusBadge tone={commandAcceptance?.offboard ? "success" : "neutral"}>
{commandAcceptance?.offboard ? "Armed · Offboard" : "Ожидает прогона"}
<span>
Управление {controllerProvider?.providerId ?? "машиной"}
</span>
<StatusBadge tone={commandAcceptance?.controllerReady ? "success" : "neutral"}>
{commandAcceptance?.controllerReady ? "Controller ready" : "Ожидает прогона"}
</StatusBadge>
</div>
<div className="polygon-rover-controls__grid">
@@ -270,8 +281,16 @@ export function PolygonLivePanel() {
</strong>
</div>
<div>
<span>Провайдеры</span>
<strong>{worker?.providerIds.join(" · ") || "—"}</strong>
<span>Провайдерный стек</span>
<strong>{providerStack || "—"}</strong>
</div>
<div>
<span>Активные процессы</span>
<strong>{worker?.activeProviderIds.join(" · ") || "—"}</strong>
</div>
<div>
<span>Источник live-состояния</span>
<strong>{live ? `${live.sourceProvider} · ${live.sourceSignal}` : "—"}</strong>
</div>
<div>
<span>Последняя команда</span>
@@ -284,8 +303,9 @@ export function PolygonLivePanel() {
<div className="polygon-live-boundary">
<StatusBadge tone="success">Virtual only</StatusBadge>
<p>
Команды проходят PX4 ROS 2 Offboard только в SITL. Физического actuator
authority нет; live-поза остаётся диагностической.
Команды проходят только через заявленный controller provider
{controllerProvider ? ` ${controllerProvider.providerId}` : ""}. Физического
actuator authority нет; live-поза остаётся диагностической.
</p>
</div>
{error && <p className="polygon-live-error">{error}</p>}