圖形導航初始化(GraphNav Initialization)
前言大綱
最初加載地圖時,GraphNav 不知道機器人相對於它的位置。GraphNav 服務提供了一組基本原語來初始化機器人在地圖上的位置。每一個都需要用戶提供不同級別的幫助。
- 使用基準點初始化機器人的定位
- 使用機器人周圍的本地幾何和紋理(geometry and texture)來初始化機器人的位置
用基準初始化
這是將機器人姿態初始化到地圖的最簡單方法。在 Spot SDK 中,不同類型的基準初始化用 FiducialInit enum 枚舉表示:
- FIDUCIAL_INIT_NEAREST:定位到任何航點中最近的基準點。
- FIDUCIAL_INIT_NEAREST_AT_TARGET 定位到目標航路點的最近基準點。
- FIDUCIAL_INIT_SPECIFIC:定位到目標航路點的給定基準點。
在某些情況下,初始化需要基準點:
- 在每個任務開始時(僅限 Autowalk)
- 在“特徵沙漠feature desert”區域,Spot 的傳感器沒有足夠的信息來確定其在環境中的位置,基準點可能有助於防止機器人迷路
關於基準點
基準點是專門設計的圖像,類似於 Spot 用來將其內部地圖與其周圍世界相匹配的 QR 碼。
Spot 認可滿足以下要求的 AprilTag 基準點:
- 作為 AprilTag Tag36h11 集合一部分的基準
- 圖像尺寸:146mm 方形
- 印刷在白色無光澤美國信紙尺寸的紙張上
Spot 配置為將基準點視為 146 毫米的正方形,並根據該大小計算距離。如果基準以其他尺寸打印,Spot 將推斷出錯誤的位置。
波士頓動力公司在 Spot Autowalk 中提供了 Spot 機器人識別的正確大小的 AprilTag 基準點的小樣本:使用 AprilTag 基準點,Spot 用戶文檔的一部分。
以 100% 的比例打印此集將生成大小正確的基準圖像。
有關 AprilTags 的背景信息可以在密歇根大學 April Robotics Lab 網站上找到。
放置基準點
放置基準點時,請確保:
- 將基準點平貼在垂直牆上,盡可能牢固。如果記錄後基準點移動,任務可能不再重播。
- 把它們放在牆上的低處。基準圖像的頂部應位於人類膝蓋高度,離地面 45-60 厘米(18-24 英寸)。
- 將它們放置在一個永久位置,只要您計劃重播任務,它們就會一直存在。
- 將它們放置在具有"沙漠特徵eature deserts"的區域,例如跨度超過 3m 的無特徵白牆。
放置基準點時,請避免以下情況:
- 在一次任務中多次重複相同的基準點。任務中的每個基準點都必須是唯一的,但同一個基準點可以用於多個任務。
- 將基準點放置在光照不一致的區域。陰影或不均勻照明的基準點可能具有不可靠的檢測。
- 放置基準點,使它們由明亮的背景(例如在窗戶上)提供背光。
- 將基準點放置在它們會被阻擋、損壞、移動或移除的地方。
請注意,具有相交牆壁、角落、家具、設備和其他視覺特徵的區域通常不需要基準點(除非任務從該位置開始)。 使用 LIDAR 有效載荷進行導航將減少所需的基準點數量。
用搜索初始化
如果基準不可用,客戶端程序可以通過 SetLocalization RPC(在 graph_nav.proto 中可用)使用其他初始化方法。客戶端可以在 initial_guess 字段中提供完整定位的初始猜測,該字段描述了機器人相對於已知航點的姿態以及要初始化到哪個航點。在提供 "初始猜測initial guess"時運行的算法的詳細信息將在下一節中描述。
如果定位的初始猜測未知,則 GraphNav 可以執行蠻力搜索。該搜索的參數通過 max_distance 和 max_yaw 字段在 SetLocalization RPC 中設置。根據這些參數的大小,SetLocalization RPC 可能需要很長時間才能完成。
用本地幾何圖形和紋理初始化
Spot 可以運行專有的初始化算法,將機器人現在所處位置的本第幾何形狀和紋理與記錄時間收集的類似數據進行比較。在 API 中,我們稱之為掃描匹配。這種技術最適合具有獨特特徵的區域(例如角落、門口);在具有非獨特特徵或沒有特徵的區域(例如平淡的走廊、大的開放空間),它的效果會很差。
供您參考,Spot 基礎平台會考慮任何小於 3 米的“局部幾何形狀local geometry.”。 Spot with Lidar 將任何小於 100 米的事物視為“局部幾何”。
客戶端必須提供關於機器人相對於地圖上已知航路點的位置的合理猜測。如果該猜測相當接近,並且機器人周圍的特徵足夠豐富,則掃描匹配初始化可以在不需要基準的情況下建立初始地圖位姿。
這是通過在 SetLocalization 中不設置 max_distance 和 max_yaw 並為 FiducialInit 枚舉指定 FIDUCIAL_INIT_NO_FIDUCIAL 來實現的。
參考資料
- GraphNav Initialization
- brute : 野蠻的
留言
張貼留言
Aron阿龍,謝謝您的留言互動!