Перейти к содержанию

gRPC и схемы

Внутренние контракты между gateway, планировщиком и валидатором. Снаружи они недоступны: внешние клиенты работают через REST. Контракты нужны тем, кто встраивает планировщик или валидатор в свой контур напрямую.

Общие правила

  • Protobuf-пакеты geoscan.planner.v1, geoscan.validator.v1, общие типы — common.proto.
  • Документы сценария и плана передаются как JSON в байтовых полях (scenario_json, plan_json) — те же документы, что в REST.
  • Единицы кодируются суффиксом имени поля (_m, _s, _ms, _deg, _frac …).
  • Сервисный ключ — метаданные x-service-api-key; идентификатор запроса — x-request-id.
  • Максимальный размер сообщения — 64 МиБ.

PlannerService

service PlannerService {
  rpc Plan(PlanRequest) returns (stream PlanEvent);
  rpc StopPlan(StopPlanRequest) returns (StopPlanResponse);
  rpc ExportPlan(ExportPlanRequest) returns (ExportPlanResponse);
}
Сообщение Поля
PlanRequest scenario_json, criterion, time_limit_s, seed, parent_plan_json, replan_at_time_s, replan_failed_uav_ids, separation (none, time, altitude)
PlanEvent одно из: PlanProgress progress или PlanResult result
PlanProgress stage, progress_frac, objective_value, best_objective_value, elapsed_s, message
PlanResult plan_json, solver_status, solve_time_s, metrics, violations, unassigned, warnings
ExportPlanRequest plan_json, format (GEOJSON, KML, PLAN, WAYPOINTS), uav_id, scenario_json (для слоёв сценария)

Ошибки планировщика: INVALID_ARGUMENT — сценарий не прошёл проверку (в REST — 400), FAILED_PRECONDITION — нерешаемый вход, например недостижимый GSD (422), DEADLINE_EXCEEDED — вышел срок (504), UNAVAILABLE — сервис недоступен (503).

ValidatorService

service ValidatorService {
  rpc Validate(ValidateRequest) returns (ValidateResponse);
}
Сообщение Поля
ValidateRequest scenario_json, plan_json (можно передать одним plan_json вида {"scenario": …, "plan": …})
ValidateResponse metrics, violations (только жёсткие), warnings, unassigned, admitted, report_json — полный отчёт

Общие типы

Тип Значения
SolverStatus optimal, feasible, infeasible, timeout
ExportFormat GEOJSON, KML, PLAN, WAYPOINTS
ViolationKind NFZ, AIRSPACE, ENDURANCE, WIND, PAYLOAD, ALTITUDE, TURNAROUND
UnassignedReason no_compatible_payload, endurance_exceeded, outside_allowed_airspace, inside_no_fly_zone, wind_above_limit, time_window_missed, solver_time_limit

JSON Schema

Файл Что описывает
scenario.schema.json документ сценария; поля — в Работе с файлами
plan.schema.json документ плана; поля — в Работе с файлами
units.json допустимые суффиксы единиц

Обе схемы — JSON Schema 2020-12 со строгим набором полей (additionalProperties: false): лишнее поле — ошибка.

erDiagram
  SCENARIO ||--|{ LAUNCH_SITE : launch_sites
  SCENARIO ||--o{ LANDING_SITE : landing_sites
  SCENARIO ||--|{ UAV : fleet
  SCENARIO ||--|{ SURVEY_TASK : tasks
  SCENARIO ||--|| AIRSPACE : airspace
  AIRSPACE ||--o{ ZONE : no_fly
  SCENARIO ||--|| WIND : weather
  SCENARIO ||--|| OBJECTIVE : objective
  SCENARIO ||--|| SOLVER : solver
  PLAN ||--|{ MISSION : missions
  MISSION ||--|{ SORTIE : sorties
  SORTIE ||--|{ PHASE : phases
  PLAN ||--o{ UNASSIGNED : unassigned
  PLAN ||--o{ WARNING : warnings
  PLAN ||--o{ DECISION : decisions

Командная строка

Планировщик и валидатор запускаются и без сервера:

cd src/backend
uv run python -m planner run --scenario scenarios/s03-multi-sites.json \
  --objective makespan --out /tmp/plan.json
uv run python -m planner export --plan /tmp/plan.json \
  --scenario scenarios/s03-multi-sites.json --fmt kml --out /tmp/plan.kml
uv run python -m validator check --scenario scenarios/s03-multi-sites.json \
  --plan /tmp/plan.json --json