PX4 云端接入

PX4 是 UTMOS 的一等厂商适配器,和 DJI 平级。PX4 不属于 DJI 兼容层,也不会写入 DJI command catalog。
真实 PX4 下行默认关闭。PX4 edge agent 必须保持 PX4_COMMAND_MODE=disabled,除非 guarded downlink 显式授权并完成安全验收。

命令方向

command.accepted 只表示云端已经鉴权、授权、幂等校验并持久化命令,不表示 PX4 已执行命令。

PX4 命令覆盖

命令族数量响应模型页面
generated MAV_CMD flow178COMMAND_ACKPX4 命令目录
parameter read1PARAM_VALUE / PARAM_ERRORpx4.parameter.read
named parameter set1873PARAM_VALUE / PARAM_ERROR参数 set 全量目录
不开放的 MAV_CMD_DO_SET_PARAMETER1不适用由 named parameter set commands 替代

云端后端与 Console 接入边界

PX4 agent 只负责 utmos-px4-agent <-> NATS <-> PX4 MAVLink 边界。Open Platform API、Console 后端和 Console 前端必须把 agent 输出的 named catalog 当作能力合同消费,不应重新发明 PX4 MAV_CMDPARAM_SET payload。
层级新增或改动方式不允许
Open Platform 后端从 PX4 vendor catalog 同步 command_type、请求 schema、结果状态和 evidence;受理后发布 command.accepted;查询时聚合 command.completed在业务后端暴露 generic mav_cmdparam1..param7px4.parameter.set 或自定义 PX4 参数名字段。
Console 后端给浏览器返回已授权设备的可用 command catalog、参数 schema、allowlist、guard 状态、transport readiness 和最近完成结果。让浏览器直接拼 NATS subject、MAVLink frame、PARAM_SET 或读取 agent 私有配置。
Console 前端按 catalog 渲染表单:枚举用下拉,bitmask 用具名开关,boolean 用开关,number/integer 用范围输入;按 PX4 group、命令域和搜索过滤。显示 param1..param7、要求用户猜 enum 数字、把 1873 个参数平铺成一级导航、把 disabled 状态伪装成可发送。
文档 UX保持 commandsparameters/readparameters/setparameters/set/catalogparameters/set/groups 分层;重点参数单独写中文解释。为每个 generated parameter 建一级 sidebar 项,或只给英文 PX4 原文不解释业务含义。
Console 的推荐交互是先展示设备控制 readiness,再展示可用命令。不可发送时,主按钮应禁用并显示来自后端的原因,例如 disabled、transport unavailable、operator guard missing、parameter not allowlisted。参数写入表单必须先显示当前值或提示用户刷新参数;提交后只展示平台命令 command_id 和生命周期状态,不把 NATS 内部 subject 当作用户操作对象。

command.accepted 事件

Subject:
tenant.<tenant_id>.command.accepted
Payload 示例:
{
  "event_id": "uuid",
  "event_type": "command.accepted",
  "command_id": "uuid",
  "tenant_id": "tenant_local",
  "client_id": "client_001",
  "vendor": "px4",
  "device_id": "px4-real-1",
  "command_type": "nav_takeoff",
  "timeout_seconds": 30,
  "accepted_at": "2026-06-08T10:15:30Z",
  "request_id": "req_001",
  "payload": {
    "latitude": 473566000,
    "longitude": 85432100,
    "altitude": 30
  }
}

command.completed 事件

Subject:
tenant.<tenant_id>.command.completed
PX4 statusadapter_statuspublic_status
rejected_by_agentREJECTED_BY_ADAPTERFAILED
sent_to_px4SENT_TO_DEVICEDELIVERED
ack_acceptedSENT_TO_DEVICESUCCEEDED
ack_temporarily_rejectedSENT_TO_DEVICEFAILED
ack_deniedSENT_TO_DEVICEFAILED
ack_unsupportedSENT_TO_DEVICEUNSUPPORTED
ack_timeoutRESPONSE_TIMEOUTTIMED_OUT
parameter_value_confirmedSENT_TO_DEVICESUCCEEDED
parameter_errorSENT_TO_DEVICEFAILED
parameter_response_mismatchRECEIVEDUNKNOWN
parameter_timeoutRESPONSE_TIMEOUTTIMED_OUT
transport_failedTRANSPORT_FAILEDFAILED
UTMOS 保存原始 adapter result,并追加 command lifecycle event。查询接口返回聚合状态,接入方不需要直接消费 NATS。 PX4 agent 还会在终态事件中提供可直接展示的响应字段:
字段说明
human_summary中文优先的可读结果,例如 PX4 已确认 COM_RC_IN_MODE 设置为 MAVLink only。
hardware_responsePX4 硬件响应的 typed payload,例如 COMMAND_ACKPARAM_VALUEPARAM_ERRORMISSION_ACKFILE_TRANSFER_PROTOCOLTIMESYNC
source_evidence定义该响应语义的 PX4/MAVLink 本地源码证据。
UTMOS 会把这些字段持久化到 adapter result,并在 Open API 与 Console 命令记录中返回。云端业务不需要自行解析 COMMAND_ACK.resultPARAM_VALUE.param_typePARAM_ERROR.error 或 delegated protocol ACK/NACK payload。

command.problem 事件

Subject:
tenant.<tenant_id>.command.problem
agent 仅在命令边界问题无法安全生成 command-scoped command.completed 时发布该事件,例如 accepted-command JSON 格式错误。UTMOS 会把原始 problem payload 投影到 PX4 设备最近事件视图,Console 可展开查看 problem_codeproblemdetailsource_subject

上行方向

PX4 edge agent 发布:
iot.uplink.px4.telemetry.observed
iot.uplink.px4.state.vehicle
数据策略
高频 telemetry不写 PostgreSQL 主事实表
latest state写入可重建当前态投影
历史分析后续由 ClickHouse telemetry-history 特性承接
运行指标暴露 Prometheus 指标