AMR ROS2光達搬運機器人-光達地圖繪製與定位(SLAM)系統設定-使用NVIDIA Orin Nano

簡介

本文是AMR ROS2光達搬運機器人系統設定的第二篇文章,文章內容會講解光達的設置,以及地圖繪製與定位(SLAM)的架構與參數設定。如果還沒有閱讀過之前我們部落格AMR ROS2搬運機器人文章的讀者,建議先往回閱讀之前的文章,會更容易了解文章中的內容。

一、AMR ROS2光達搬運機器人 規劃貨品搬運路線 使用NVIDIA Orin Nano-功能介紹篇-連結點這裡

二、AMR ROS2光達搬運機器人 -入門操作篇 使用NVIDIA Orin Nano-連結點這裡

三、AMR ROS2光達搬運機器人 -進階應用篇 使用NVIDIA Orin Nano-連結點這裡

四、AMR ROS2光達搬運機器人-掛載映象檔與資料分發服務設定 使用NVIDIA Orin Nano-連結點這裡

 

攝影/撰寫 楊子賢 材料表 RK-AMR ROS2 光達搬運機器人

場地圍牆

筆電電腦 (連入 ROS2 搬運機器人 編寫程式)

 

時間 1小時
難度 3(滿分5)

 

軟硬體背景

NVIDIA Jetson Orin Nano

Jetpack 5.1.1

L4T 35.3.1

Ubuntu 20.04 LTS

 

光達設置

硬體

2D光達會按照設定順時針或逆時針方向進行掃描,因此安裝方向會影響資料的排列順序,通常在光達上會有箭頭作為標示指向前方,要按照機器人的前進方向安裝。

 

軟體(ROS2設定)

根據硬體與光達廠商提供的ROS2軟體不同,設定上也會有所差異,這邊以本隻影片中ROS2車上的LiDar為範例。

  • package: 光達的ROS2套件名稱。
  • executable: 光達的ROS2執行檔名稱。
  • name: 光達節點的名稱,用來在系統中辨識。
  • output: 節點的訊息輸出位置,使用screen會輸出到終端機上,使用log會輸出到log記錄檔中。
  • parameters: 軟體參數,內容如下:
    • product_name: 產品的名稱,用來對應不同規格的程式。
    • topic_name: 光達輸出的訊息主題名稱,之後在其他程式中會需要使用這個名稱來獲得光達資料。
    • frame_id: 光達座標轉換的名稱,之後在其他程式中會需要使用這個名稱來獲得座標轉換。
    • port_name: 與光達進行串列連接的裝置位置,根據硬體配置進行設定。
    • port_baudrate: 與光達進行串列連接的速率,根據光達型號進行設定。
    • laser_scan_dir: 光達掃描的方向,True代表逆時針,False代表順時針。
    • enable_angle_crop_func: 是否限制光達的掃瞄範圍。
    • angle_crop_min: 限制光達掃描範圍的最小值。
    • angle_crop_max: 限制光達掃描範圍的最大值。
    • bins: 設定光達資料的數量上限,超過這個數值會被移除。

 

光達里程計 – rf2o_laser_odometry

里程計是用來記錄機器人在活動中的位移及旋轉的元件,通常是使用編碼器資料來計算里程計,但如果機器人的底盤沒有安裝編碼器,可以使用光達來計算里程計,這邊使用的是rf2o_laser_odometry套件。

  • package: 里程計的ROS2套件名稱。
  • executable: 里程計的ROS2執行檔名稱。
  • parameters: 軟體參數,內容如下:
    • laser_scan_topic: 光達資料的訊息主題名稱,對應前面的光達輸出的訊息主題名稱(topic_name)。
    • odom_topic: 里程計的訊息主題名稱,之後在其他程式中會需要使用這個名稱來獲得里程計資料。
    • publish_tf: 發布地圖到里程計的座標轉換,看使用需求設定。
    • base_frame_id: 發布的座標轉換要以哪個地方為基準點,通常是base_link或是base_footprint,根據使用配置進行設定。
    • odom_frame_id: 發布的座標轉換要以哪個地方為目標,通常是odom,根據使用配置進行設定。
    • init_pose_from_topic: 初始位置的訊息主題名稱,用來設定機器人的開始位置
    • freq: 里程計的訊息的發布頻率,單位為次/每秒

 

地圖繪製與定位(SLAM)系統設定 – Cartographer

SLAM系統選擇

現在ROS2中主流的SLAM方案有兩種,各有優缺:

  • slam_toolbox
  • Cartographer

經過實際測試後,選擇了Cartographer作為目前的SLAM系統,原因如下:

  • 在僅有光達資料的環境下測試後,輸出結果較佳
  • 在長距離移動後能夠自動修正位移偏差

 

SLAM系統架構

(Cartographer演算法,圖片來自原始文件)

 

在Cartographer中,可以分成三部分:

  • 第一部分(圖左上)會對輸入資料(光達)進行處理,光達資料會先過濾掉太近與太遠的點,使用體素過濾器(Voxel Filter)合併資料點,減少需求運算量,再用適應性體素過濾器(Adaptive Voxel Filter),將光達資料分為較精細的資料與較粗糙的資料,用於後續的掃描比對。

 

  • 第二部分(圖右)是對區域進行SLAM(Local SLAM),利用光達資料進行掃描比對,再依照機器人的移動狀態,決定是否將掃描比對的結果加入子地圖(Submaps),加入固定數量的結果後,該張子地圖就建立完成,如此循環。這部分在設定中以Trajectory Builder標註。

 

  • 第三部分(圖中下)是對整個場域進行SLAM(Global SLAM),在累積一定數量的子地圖後,系統會試著達成閉環(Loop closure)的狀態,在這些子地圖間建立約束(Constraint),約束代表子地圖之間的關聯性,讓機器人可以準確地定位到現在地圖上的位置。這部分在設定中以Pose Graph標註。

 

SLAM設定 – ROS2系統端

這邊僅列出可能會使用的參數,設定中的距離單位為公尺(m)、時間單位為秒(sec)

  • map_builder = MAP_BUILDER :地圖建立的設定名稱,一般不用改。
  • trajectory_builder = TRAJECTORY_BUILDER :區域SLAM的設定名稱,一般不用改。
  • map_frame = “map” :地圖座標轉換的名稱,一般不用改。
  • tracking_frame = “base_link” :SLAM演算法追蹤的座標轉換名稱,依照接收的資料不同,需要選擇對應的座標轉換名稱,例如使用IMU時,要用IMU的座標轉換,像是imu_link這種名稱。
  • published_frame = “base_link” :地圖座標轉換的對象名稱,通常是設定為里程計(odom)或是機器人的原點(base_link)。
  • odom_frame = “odom” :里程計座標轉換的名稱,一般不用改。
  • provide_odom_frame = true :是否發布地圖到里程計的座標轉換,看使用需求設定。
  • publish_frame_projected_to_2d = false :將座標轉換限定在平面範圍(沒有俯仰、滾轉以及Z軸的移動),通常不需要。
  • use_odometry = false :是否使用里程計。
  • use_nav_sat = false :是否使用導航衛星。
  • use_landmarks = false :是否使用地標。
  • num_laser_scans = 1 :光達的數量。
  • num_multi_echo_laser_scans = 0 :多回波光達的數量。
  • num_subdivisions_per_laser_scan = 10 :每個光達掃描的細分數量,用於多回波光達。
  • num_point_clouds = 0 :點雲的數量。
  • lookup_transform_timeout_sec = 0.2 :獲取座標轉換的超時時間。
  • submap_publish_period_sec = 0.3 :子地圖的發布間隔。
  • pose_publish_period_sec = 5e-3 :姿態的發布間隔。
  • trajectory_publish_period_sec = 30e-3 :軌跡的發布間隔。
  • rangefinder_sampling_ratio = 1. :光達的採樣比率。
  • odometry_sampling_ratio = 1. :里程計的採樣比率。
  • fixed_frame_pose_sampling_ratio = 1. :GPS的採樣比率。
  • imu_sampling_ratio = 1. :IMU的採樣比率。
  • landmarks_sampling_ratio = 1. :地標的採樣比率。
  • MAP_BUILDER.use_trajectory_builder_2d = true :是否使用2D SLAM建立軌跡。

 

SLAM設定 – 區域SLAM

這邊僅列出可能會使用的參數,設定中的距離單位為公尺(m)、時間單位為秒(sec),如果沒有使用的話會套用預設值

  • TRAJECTORY_BUILDER_2D.use_imu_data = false :是否使用IMU資料。
  • TRAJECTORY_BUILDER_2D.min_range = 0.25 :光達掃描的最短距離。
  • TRAJECTORY_BUILDER_2D.max_range = 8 :光達掃描的最遠距離。
  • TRAJECTORY_BUILDER_2D.missing_data_ray_length = 12. :如果光達掃描的數值超過範圍,設定為這個數值。
  • TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 1 :接收到指定次數的光達掃描資料後進行一次掃描比對,根據光達發送資料的頻率設定。
  • TRAJECTORY_BUILDER_2D.voxel_filter_size = 0.025 :將設定距離內的光達掃描點合併,減少運算負擔。
  • TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true :使用實時相關性掃描比對,開啟後會在原來的掃描比對前多做一次實時比對,作為後續的參考位置,可以提高定位性能,但會使用更多運算資源。
  • TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) :設定對於旋轉的靈敏度,低於這個數值的結果會被捨棄。

 

SLAM設定 – 全域SLAM

這邊僅列出可能會使用的參數,設定中的距離單位為公尺(m)、時間單位為秒(sec),如果沒有使用的話會套用預設值

  • POSE_GRAPH.optimize_every_n_nodes = 90 :如果是正值,會在地圖建好之後進行閉環計算,如果有達成閉環則會按照每隔設定的數量做一次優化。
  • POSE_GRAPH.global_sampling_ratio = 0.003 :進行定位時,對軌跡取樣數量的比例。
  • POSE_GRAPH.constraint_builder.min_score = 0.65 :掃描比對的最低評分,低於這個分數的結果會被捨棄。
  • POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 :全域定位的最低評分,低於此分數則認為目前全域定位不準確。
  • POSE_GRAPH.constraint_builder.sampling_ratio = 0.3 :如果當前的約束數量與潛在可能的約束數量比值少於這個數值,代表全域SLAM的完成度不夠,就會加入一個新的約束。

 

純定位設定

如果在已經建立好場景地圖的環境下,可以選擇只使用定位功能,關閉地圖繪製功能,在設定中加入以下設定:

  • TRAJECTORY_BUILDER.pure_localization_trimmer.max_submaps_to_keep = 3 :讓系統以純定位模式運作。
  • POSE_GRAPH.optimize_every_n_nodes = 20 :在純定位時會希望獲得更多次優化後的結果,所以將該數值下調,讓優化變得更頻繁。
  • POSE_GRAPH.constraint_builder.sampling_ratio = 0.01 :進行純定位時,為了讓全域SLAM可以更快產生結果,所以將該數值下調。
  • POSE_GRAPH.global_sampling_ratio = 0.001 :進行純定位時,為了讓全域SLAM可以更快產生結果,所以將該數值下調。

 

以上就是搬運機器人上關於光達及地圖繪製與定位的設定,下一篇文章是關於ROS2導航的系統設定,敬請期待。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *