pose_graph op• 資料種類:pose → table
• 呼叫: import fullseye as fs; fs.ledger.optimize_pose_graph(poses_init, edges, fix_first=True, max_iter=200)(要直接呼叫實作,import pose_graph; pose_graph.optimize_pose_graph(poses_init, edges, fix_first=True, max_iter=200);從台帳取用則 ops3d.get("optimize_pose_graph"))
由相對姿態約束 + 迴環閉合最佳化全域姿態。→ dict{poses, rmse, cost}。
對 poses_init (N,6)=[rvec|t] 的初始估計(含漂移)進行最佳化,使其滿足 edges 的相對位姿約束。fix_first=True 時固定第一個節點以消除 gauge。
• edges: (i, j, rvec_ij, t_ij[, w_rot, w_trans]) 的串列。(rvec_ij, t_ij) 是「從 i 看到的 j」= T_i⁻¹ ∘ T_j 的量測值(與 relative_pose 慣例相同)。里程計 (i, i+1) 與迴圈閉合(相距較遠的 i, j)可以用同一形式混合。權重會把殘差乘以 sqrt(w)(省略時為 1)。
• 各邊的殘差是把 measured⁻¹ ∘ predicted 轉為旋轉向量 + 平移的 6 維量, 以 scipy.optimize.least_squares(method="lm") 最小化(max_nfev = max_iter × 參數個數)。
• 回傳值:poses (N,6)(若 fix_first 則第一個保持初始值)、rmse = mean_edge_error(poses, edges)、cost = 最終代價(殘差 2 次方和的 1/2)。
fail-closed(失敗即拒絕):節點數 < 2、邊為 0 條、邊的索引超出 [0, N)(負索引的靜默回繞也拒絕)時拋出 ValueError。若設 fix_first=False,gauge 會殘留,解不唯一(LM 回傳初始值附近的 1 個解)。旋轉為 rad,平移為座標單位,由於兩者排在同一個殘差向量中,單位相差很大時以權重來對齊。既不使用 3D 點也不使用觀測像素(包含它們進行最佳化的是 bundle_adjust)。
• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。
• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。
• pose_graph_slam — py -3.11 examples_3d/pose_graph_slam.py
table 作為輸入)fuse_to_voxel · mesh_select_lod
pose_graph)relative_pose · mean_edge_error
*Provenance: pose_graph.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.