feat(simulation): drive stock rover through PX4 offboard
This commit is contained in:
@@ -10,7 +10,7 @@ from typing import Annotated, Any, Final
|
||||
|
||||
from fastapi import APIRouter, Header, HTTPException, Query
|
||||
from fastapi import Path as PathParameter
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
from k1link.simulation import (
|
||||
QualificationRun,
|
||||
@@ -54,6 +54,13 @@ class StartStockRoverRequest(BaseModel):
|
||||
scenario_id: str
|
||||
|
||||
|
||||
class AckermannCommandRequest(BaseModel):
|
||||
model_config = ConfigDict(extra="forbid", frozen=True)
|
||||
|
||||
speed_mps: float = Field(ge=-1.5, le=1.5, allow_inf_nan=False)
|
||||
steering_normalized: float = Field(ge=-1.0, le=1.0, allow_inf_nan=False)
|
||||
|
||||
|
||||
def configured_polygon_runs_root() -> Path | None:
|
||||
raw = os.environ.get(POLYGON_RUNS_ROOT_ENV)
|
||||
if raw is None or not raw.strip():
|
||||
@@ -250,6 +257,40 @@ def build_polygon_router(
|
||||
detail="Simulation Worker не подтвердил остановку.",
|
||||
) from exc
|
||||
|
||||
@router.post("/worker/runs/{run_id}/commands")
|
||||
def command_polygon_worker_run(
|
||||
run_id: Annotated[
|
||||
str,
|
||||
PathParameter(pattern=r"^[a-z0-9][a-z0-9-]{0,63}$"),
|
||||
],
|
||||
request: AckermannCommandRequest,
|
||||
idempotency_key: Annotated[
|
||||
str,
|
||||
Header(alias="Idempotency-Key", min_length=1, max_length=160),
|
||||
],
|
||||
) -> dict[str, Any]:
|
||||
gateway, _ = _control_context(
|
||||
worker_provider,
|
||||
control_provider,
|
||||
commit_provider,
|
||||
)
|
||||
try:
|
||||
return gateway.command(
|
||||
run_id=run_id,
|
||||
speed_mps=request.speed_mps,
|
||||
steering_normalized=request.steering_normalized,
|
||||
idempotency_key=idempotency_key,
|
||||
)
|
||||
except SimulationWorkerUnavailableError as exc:
|
||||
raise HTTPException(status_code=503, detail="Simulation Worker недоступен.") from exc
|
||||
except SimulationWorkerRejectedError as exc:
|
||||
raise HTTPException(status_code=409, detail=str(exc)) from exc
|
||||
except SimulationWorkerGatewayError as exc:
|
||||
raise HTTPException(
|
||||
status_code=502,
|
||||
detail="Simulation Worker не подтвердил команду ровера.",
|
||||
) from exc
|
||||
|
||||
return router
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user