robot-notes — 機器人知識筆記 GitHub ↗
本章與本頁目次

調度

robot-notes /調度/跨車隊協調/Fleet 深入:API/圖資/座標/避塞車

多車隊怎麼共用一個場域:地圖、座標與交通

Open-RMF 那篇講清楚了「為什麼要在車隊之上加一層」,VDA5050 講清楚了「主控怎麼跟車講話」。這篇補的是多家車隊真的要放進同一個場域時,那幾件必須先對齊的事:

前置:OpenRMFVDA5050座標轉換與 TF。 API/格式名稱經官方來源查證;不確定處標待查證。


1. 一個場域、多張地圖:先分清楚有幾種「地圖」

RMF 用 traffic-editor 畫的 .building.yaml:levels(樓層)→ 每個 level 有 vertices(waypoint,可帶 is_charger/is_holding_point/is_parking_spot)與 lanes(連 waypoint 成 nav graph)。用 graph_idx 區分多個 nav graph(traffic-editor 慣例提供數個,不是車隊數硬上限),每條 lane 標屬於哪隊。重點:不同車隊各有自己的 nav graph,但全部疊在同一個 building/level 座標系——這就是異質車隊能被統一調度的基礎。

2. 座標對齊:reference_coordinates 在解什麼

每家車有自己的原點與方位,而 RMF 的時空排程要把所有車放在同一個座標系裡比較。這一步做不對,後面的交通協商全部沒有意義。

每家車有自己的座標原點,要先對齊到 RMF 世界座標。fleet adapter 的 config.yamlreference_coordinates:給同一批實體地點在「RMF 座標」與「該車座標」的兩串對應點,求一個 2D 相似變換(平移+旋轉+均勻縮放):

reference_coordinates:
  L1:
    rmf:   [[20.33,-3.16],[8.91,-2.57],[13.02,-3.60],[21.93,-4.12]]   # RMF 世界座標
    robot: [[59,399],     [57,172],    [68,251],     [75,429]]         # 車自己座標(同一批點)

3. VDA5050 車輛怎麼拿到圖資(最容易誤解的一段)

關鍵認知:VDA5050 核心協定不傳「路網地圖」。 order 裡主控只給每個 node 的 nodeId + nodePosition(x,y,θ,mapId)——它假設車輛已經有 mapId 對應的環境,只是引用節點。那「整個廠房路網長怎樣、怎麼從車廠交給主控」由誰負責?答案是 LIF:

VDA5050 圖資:車廠出 LIF(JSON nodes/edges/stations)→主控匯入建路網→order 引用同套 nodeId;車載 SLAM 地圖另管定位

三種「地圖」分清(現場導入最常混淆):① 車載 SLAM 地圖(車自己定位/避障)② LIF 路網(主控規劃派工)③ RMF building map(下一節)。橋樑是 nodeId+mapId,且 LIF 的 (x,y) 必須與車載地圖座標對齊,否則「去 node N」會落到錯的物理位置——這是現場最常見的對位工作。

4. 避塞車:共用時空排程 + 協商 + 路權原語

RMF 避塞車:提交 itinerary→時空衝突偵測(time-dependent A*)→協商(judge 選)→逐段放行;路權原語:單向lane/mutex/holding/限速

rmf_traffic 採「先預防、衝突再協商」(第一性原理見 open-rmf §3 的「事前預測 vs 事後撞」):

  1. 共用時空排程:各車向中央排程庫申報 itinerary(時空軌跡),系統因此有全域意圖可見性。
  2. 衝突偵測:比對時空軌跡(不只空間交叉,還看同時刻),用 time-dependent A(加時間維度的 A)規劃避開他車。
  3. 協商(negotiation):衝突 → 各車隊提偏好 + 可容讓的替代 itinerary → 第三方 judge(系統整合商部署)選整體較佳的一組。(協商層大致平等對待各車,任務優先序主要在派工端;見 open-rmf §3。)
  4. 路權交接(blockade):路線空間交疊時,用 checkpoint 確保「同一段不同時前進」。(與下節 VDA5050 released/horizon 的逐段釋放是不同層機制,別混。)

掛在 nav graph 上的路權原語(避塞車的具體工具):

原語 設在哪 作用
單向 lane lane bidirectional: false 窄道只准一個方向,根除對向死鎖
mutex group(互斥鎖) lane/waypoint 指派同群組 進路口/窄道前先 lock,同時只一台持有
holding point waypoint is_holding_point 可無限期等待,讓路/排隊用
parking spot waypoint is_parking_spot 緊急警報時自行停靠
speed limit lane 屬性 該段限速

對應 VDA5050:RMF 協商定案後,透過 fleet adapter 控制車隊;對 VDA5050 車隊則對映到 order 的 released/horizon 逐段放行(見 open-rmf §5)。

5. OpenRMF 對外的三層 API

「RMF 的 API」橫跨三個層級,先分清在講哪一層:

RMF 三層 API:對外 Web API(rmf_api_msgs/rmf-web)、內部 ROS msgs(rmf_task_msgs/門梯)、adapter 程式 API

一句話:由外而內 = Web API(JSON over WS/REST)→ ROS msgs(派工/門梯)→ adapter 程式 API(接車)

6. 待查證

7. 來源

附錄:VDA5050 訊息結構速查

VDA5050 那篇講得完整,這裡只留一張對照表方便回查。

完整 order 樹與設計理由見 VDA5050 篇;這裡補 topic 命名規則與 state/factsheet 關鍵欄位。