Wiki
loam_interface(Point-LIO輸出的座標與話題適配)
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
1.loam_interface(Point-LIO輸出的座標與話題適配)
這個節點把 Point-LIO 的位姿與配準掃描接到後續導航介面:訂閱 aft_mapped_to_init 和 cloud_registered,釋出 lidar_odometry 和 registered_scan。它執行座標變換,不負責 SLAM 估計,也不直接釋出 odom → base_footprint 的 TF。
以下按 2026-10-10 當前原始碼與實物 YAML 核對。引數名與當前值可以確認,但 IMU、雷達和底盤的完整位姿轉換存在原始碼疑點,不能把話題有輸出等同於座標關係正確。
1.1.引數
1.1.1.ros__parameters(ROS節點引數)
1.1.1.1.參數列
loam_interface:
ros__parameters:
use_sim_time: False
state_estimation_topic: "aft_mapped_to_init"
registered_scan_topic: "cloud_registered"
odom_frame: "odom"
base_frame: "base_footprint"
lidar_frame: "front_mid360"
| 引數名 | 當前值 | 單位 | 實車處理建議 | 作用 | 調大效果 | 調小效果 | 生效條件/備註 |
|---|---|---|---|---|---|---|---|
use_sim_time |
False |
不適用,布林 | 上實物前必須核對並正確配置 | 選擇節點及 TF 快取使用的時間源 | 不適用 | 不適用 | ROS2 標準引數;實物通常 False,模擬 True 並依賴 /clock;整套 launch 會覆蓋 YAML 中的值;不轉換輸入時間戳 |
state_estimation_topic |
"aft_mapped_to_init" |
不適用,話題名 | 上實物前必須核對並正確配置 | 指定輸入位姿話題,型別為 nav_msgs/msg/Odometry |
不適用 | 不適用 | 當前對應 Point-LIO 的 camera_init → body 位姿訊息,body 是內部 IMU;原始碼卻按雷達位姿使用,見下文 |
registered_scan_topic |
"cloud_registered" |
不適用,話題名 | 上實物前必須核對並正確配置 | 指定輸入配準掃描,型別為 sensor_msgs/msg/PointCloud2 |
不適用 | 不適用 | 當前點座標在 camera_init 中,已由 Point-LIO 使用雷達→IMU 外參變換;不能替換成原始掃描或 cloud_registered_body |
odom_frame |
"odom" |
不適用,座標系名稱 | 通常保持當前值,不作為優先除錯項 | 指定輸出點雲及里程計的參考系名稱 | 不適用 | 不適用 | 實際用快取矩陣轉換資料,再設定輸出名稱;不是通過 TF 查詢任意目標系,也不釋出對應 TF;名稱本身不能保證水平或重力方向正確 |
base_frame |
"base_footprint" |
不適用,座標系名稱 | 上實物前必須核對並正確配置 | 指定首次 TF 查詢的目標機體系,用於構造初始對齊快取 | 不適用 | 不適用 | 查詢 lookupTransform(base_frame, lidar_frame, 输入位姿时间戳, 0.5秒);首次成功後不再查詢;獨立 launch 寫的是 gimbal_yaw,與整套配置不同 |
lidar_frame |
"front_mid360" |
不適用,座標系名稱 | 上實物前必須核對並正確配置 | 指定首次 TF 查詢的源系,並設定輸出里程計子座標系名稱 | 不適用 | 不適用 | 指向雷達座標系;設定這個名字不會把內部 IMU 位姿自動轉換為雷達位姿;當前遺漏的外參轉換需要單獨處理 |
六項都有作用,本塊沒有當前完全不參與執行的引數。五項業務引數只在構造時讀取,原始碼沒有執行時更新處理;執行中寫入同名引數不會重建訂閱或更新快取,需在另行授權的重啟中應用。use_sim_time 由 ROS2 管理,不屬於這五項。
1.1.1.2.引數詳解
1.1.1.2.1.use_sim_time(系統時間與模擬時間選擇)
False 使用系統時間;True 使用 /clock 提供的 ROS 時間。TF 快取用的是節點時鐘,Point-LIO、關節 TF 和本節點必須處於一致的時間域。
本節點不會用當前時間重新標記輸入位姿。切換時間源也不會修正雷達點時間單位、感測器時鐘同步或舊時間戳;此前模擬轉換器的秒/微秒不一致仍未解決。
1.1.1.2.2.state_estimation_topic 與 registered_scan_topic(輸入里程計與配準點雲)
| 方向 | 話題 | 訊息與座標含義 |
|---|---|---|
| 訂閱 | aft_mapped_to_init |
Odometry;參考系 camera_init,子系 body,數值是內部 IMU 位姿 |
| 訂閱 | cloud_registered |
PointCloud2;當前掃描的配準點座標,參考系 camera_init |
| 釋出 | lidar_odometry |
Odometry;參考系名設為 odom,子系名設為 front_mid360;數值語義仍需核對 |
| 釋出 | registered_scan |
PointCloud2;用快取矩陣轉換點座標,參考系名設為 odom |
兩訂閱和兩釋出的佇列深度均為5。輸入話題名是相對名,隨節點名稱空間和重對映解析;座標系字串不自動新增節點名稱空間。兩個輸出話題名在原始碼中固定,不能通過修改輸入引數改名。
位置與點座標沿用上游的 m,姿態使用無量綱四元數,時間戳由秒和納秒欄位表達;本節點不縮放單位、不再次降取樣,也不做兩種輸入的時間同步。里程計沿用輸入位姿時間戳,正常點雲轉換沿用輸入點雲時間戳;後者已對照容器安裝的 pcl_ros 2.4.5 對應實現核對。
本節點只寫輸出里程計的位姿,不轉傳輸入速度和協方差,這些欄位保持預設零值,不能據此判斷車輛靜止或估計沒有不確定性。
1.1.1.2.3.odom_frame(輸出里程計與點雲參考系)
當前保持 odom。節點對點雲執行剛體變換,對位姿左乘同一快取矩陣,然後填寫輸出參考系名稱。它沒有驗證輸入位姿的 header.frame_id 與 child_frame_id 是否符合預期,也沒有按輸入名稱查詢 camera_init → odom。
因此改為其他名字不會自動獲得該參考系的變換。odom 是輸出命名,實際軸向、原點和重力關係取決於快取與 Point-LIO 初始化,不能靠名稱判定正確。
1.1.1.2.4.base_frame(初始化基準的底盤座標系)
首次收到位姿時,節點按該訊息時間戳查詢 base_footprint ← front_mid360,最大等待0.5秒;失敗則告警並放棄本次位姿,後續位姿回撥重試。首次成功後,把當時的雷達安裝與關節變換存為固定矩陣 C,後續位姿和點雲都使用它。
這項指定初始對齊所依賴的機體系,不表示本節點輸出底盤位姿。當前 MID360 掛在 gimbal_yaw,所以該 TF 包含底盤到雲臺、機械 yaw 和雷達安裝關係;它隨 yaw 變化,不隨 pitch 變化。快取時刻也不一定等於 Point-LIO 初始化時刻,需要核對啟動時的位姿與關節狀態。
固定快取本身不等於錯誤:兩個固定參考系之間的對齊通常應保持固定,運動中的雷達→底盤變換由下游 sensor_scan_generation 按點雲時間查詢。需要確認的是 C 是否正確代表 odom 與 camera_init 的關係,不能簡單改成每幀跟隨雲臺更新。Point-LIO 的初始旋轉還受重力對齊影響,不能預設輸入初始姿態一定是單位旋轉。
1.1.1.2.5.lidar_frame(雷達座標系與輸出里程計子系)
當前 front_mid360 與模型中的雷達名稱一致,但上游 body 是內部 IMU。設 T_AB 表示把 B 系座標轉換到 A 系,W=camera_init、I=內部 IMU、L=front_mid360、O=odom,完整雷達位姿一般應滿足:
當前原始碼實際計算 C × 输入位姿,即 C × T_WI(t),隨後將子系名設為 L;沒有右乘 T_IL,也沒有用初始輸入位姿核對 C=T_OW 的條件。
Point-LIO 配準點雲已經使用 mapping.extrinsic_R/T,而位姿釋出直接取濾波器的 IMU 位置和姿態。當前實物 extrinsic_R 為單位矩陣,extrinsic_T=[-0.011,-0.02329,+0.04412] m 非零;軸向一致不代表兩個原點相同。缺少這一步時,雷達繞 IMU 轉動的杆臂效應可能表現為位置誤差。單純改 lidar_frame 或話題名無法補齊外參;先記錄這一介面缺口,工程修改另行授權。
1.1.1.2.6.啟動配置與原始碼缺口
| 啟動方式 | 這塊引數從哪裡來 | 需要區分的值 |
|---|---|---|
| 整套 reality launch | 預設 pb2025_nav_bringup/config/reality/nav2_params.yaml,可由 params_file 指定其他檔案;經 bringup 傳給 navigation_launch.py |
base_frame=base_footprint;use_sim_time 最終由 launch 引數重寫,預設 False |
| 整套 simulation launch | 預設 pb2025_nav_bringup/config/simulation/nav2_params.yaml;同樣經 navigation_launch.py 載入 |
base_frame=base_footprint;use_sim_time 最終由 launch 引數重寫,預設 True |
獨立 loam_interface_launch.py |
launch 內的引數字典,不讀取上述 YAML | base_frame=gimbal_yaw;未設定或宣告 use_sim_time 啟動引數,按 ROS2 預設 False |
整套啟動的獨立程序和元件模式都載入同一份處理後的引數檔案;slam 選擇建圖或定位,不會跳過這段導航介面。本次在 ysu_ros_humble 中僅載入環境並查詢包路徑,確認相關安裝後的 launch 和 YAML 指向當前原始碼;沒有啟動節點,也沒有讀取執行節點的有效引數。
另一個已確認的原始碼缺口是初始化保護:點雲回撥沒有檢查初始 TF 是否成功,直接使用快取。容器的 tf2::Transform 預設構造不初始化數值,而節點也沒有先將快取設為單位變換。如果點雲先到、或首次 TF 查詢一直失敗,可能使用未初始化矩陣;觸發後的執行表現本輪未測試。
原始碼位置:loam_interface/src/loam_interface.cpp 的引數讀取、點雲回撥和位姿回撥;point_lio/src/laserMapping.cpp 的 set_posestamp/publish_odometry,以及 point_lio/src/Estimator.cpp 的 pointBodyToWorld。上述包均位於 src/pb2025_sentry_nav/。
1.1.1.2.7.已觀察與待核實事項
- 原始碼能確認: 六項引數的使用、輸入輸出話題、首次 TF 快取、IMU 位姿未補雷達外參、初始化保護缺失,以及 launch 配置來源。
- 模擬已觀察: 2026-10-08 的獨立 Point-LIO 檢查在靜止和約20 cm低速往返時有正常位姿與配準點雲;該檢查沒有覆蓋本節點和下游的完整轉換,也沒有獨立雲臺 yaw 驗證,不能據此認定這裡的介面正確。
- 必須實物核實: MID360 實際安裝位置與軸向、內部雷達/IMU 外參、機械 yaw/pitch 零位與方向、序列埠角度單位和含義、各訊息的時鐘一致性,以及 Point-LIO 重力目標參考系與導航
odom的關係。當前約定要求 JointState 使用機械相對角,世界 IMU 姿態不能代替關節角;本輪不修改重力方向。
機械關係與Linux與MCU資料對接、MID360安裝位置一致:兩個odom關節固定,實際yaw在gimbal_yaw_joint、實際pitch在gimbal_pitch_joint,序列埠position為{relative_pitch, relative_yaw, 0, 0}。MID360掛在實際yaw關節之後,隨yaw、不隨pitch;不能用關節之前的gimbal_yaw_odom替代其掛載層。