GraphNav 本地化(GraphNav Localization)
前言大綱
在 GraphNav 中初始化機器人的位置後,客戶端可以使用 GetLocalizationState RPC。響應消息將包含一個定位物件,該物件報告機器人相對於地圖上特定航路點的姿態。
地圖的航點與在每個航點捕獲的累積點雲數據相結合。重要的是要了解此點雲數據不會導致全局一致性。
本地化更新間隔
GraphNav 每秒至少更新兩次本地化。在內部,GraphNav 使用定位估計來決定是否將定位幀框切換到地圖上的不同航點。
定位是通過結合來自地圖的先驗信息、機器人的里程計以及機器人周圍世界的視覺和幾何特徵來計算的。姿態估計的質量取決於環境、Spot 上的傳感器外掛載荷、機器人與航路點的距離以及機器人如何到達其當前位置。
可能對本地化產生負面影響的情況:
- 機器人距離記錄的地圖足夠遠,很長一段時間都看不到地圖中記錄的任何特徵
- 機器人在未通電的情況下滑倒或被帶到新位置
- 自從地圖被記錄以來,環境發生了巨大的變化
- 環境有少數特徵
- 環境太暗
- 配備激光雷達LiDAR 外掛載荷的機器人,可以在比沒有這種有效載荷的機器人更暗的環境中工作。
特色沙漠
GraphNav 依賴於環境中的特徵進行本地定位。在缺乏特徵的地方,定位更加困難或不可能。
例如,白雪覆蓋的場地上的每個位置看起來都一樣 -- 沒有足夠的細節來成功定位。GraphNav 內部會估計機器人的位置是否為定位提供了足夠的數據。如果不是,則創建的任何航點都將被註釋為特徵沙漠。
GraphNav 不會嘗試在特徵沙漠中進行本地定位。相反,它將依靠里程計來允許機器人穿越小型特徵沙漠。
丟失的機器人
GraphNav 服務會對其是否認為機器人丟失或卡住進行內部評估。當丟失時,服務將拒絕自主導航。
該測定與記錄地圖的環境的變化量相關。自錄製以來發生重大變化的站點與機器人看起來非常不同。例如,當汽車停在那裡時,空停車場的地圖看起來會有所不同。
當站點更改導致本地化狀態為 STATUS_LOST 時,應記錄站點的新地圖。
卡住的機器人
GraphNav 服務使用約束系統使機器人保持相對接近記錄的路線(大約在 3m 走廊內)。
如果在機器人的路徑上放置了一個大物體,機器人可能無法繞過它。如果機器人到達下一個目的地的時間比預期的要長,GraphNav 將宣布機器人卡住。這不會阻止機器人,它會繼續嘗試返迴路線。但是,API 客戶端可能希望干預或提示操作員。
樓梯和其他邊緣約束
當記錄包含樓梯的地圖時,註釋將添加到地圖中的相關邊緣。系統會將機器人定向為面向樓梯(上升和下降時)並降低最大速度。通常,這會導致機器人在樓梯間頂部原地轉動並小心下降。
邊也可以用相關約束進行註釋以保持方向。例如,這允許機器人在進入狹窄區域之前通過轉身安全地穿過連接到狹窄走廊的樓梯。
機器人必須有足夠的空間在上下樓梯之間轉彎,否則機器人將報告 STATUS_CONSTRAINT_FAULT 導航狀態。
圖形導航原點
自 2.1.0 版本以來,本地化物件包括一個額外的字段 seed_tform_body。該字段返回機器人身體相對於起始基準幀的姿勢作為 SE3Pose,可以將其視為 GraphNav 地圖的“原點origin”或“種子seed”。
自 2.1.0 版本起,請參考此文檔,以了解如何在 Autowalk 之外使用平板電腦應用程序初始化和定義自定義原點。
下面提供瞭如何使用 Spot API 訪問此字段的示例。請記住先初始化 GraphNav 地圖,否則 SE3Pose 將不會被填充。
def get_graphnav_origin(self): """ Returns seed_tform_body. """ graph_nav_client = self.bosdyn_sdk_robot.ensure_client(GraphNavClient.default_service_name) state = graph_nav_client.get_localization_state() gn_origin_tform_body = state.localization.seed_tform_body return math_helpers.SE3Pose.from_obj(gn_origin_tform_body)
參考
- GraphNav Localization
- corridor : 走廊
留言
張貼留言
Aron阿龍,謝謝您的留言互動!