簡介
本文是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中,可以分成三部分:
- 第一部分(圖左上)會對輸入資料(光達)進行處理,光達資料會先過濾掉太近與太遠的點,使用體素過濾器(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導航的系統設定,敬請期待。