AMR ROS2光達搬運機器人-導航系統與路徑規劃設定-使用NVIDIA Orin Nano

簡介

本文是AMR ROS2光達搬運機器人系統設定的第三篇文章,文章內容會大略講解導航系統中的架構與設置。如果還沒有閱讀過之前我們部落格AMR ROS2搬運機器人文章的讀者,建議先往回閱讀之前的文章,會更容易了解文章中的內容。

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

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

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

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

五、AMR ROS2光達搬運機器人-光達地圖繪製與定位(SLAM)系統設定 -使用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

 

導航系統 – Navigation2

Navigation2是ROS2中最主要在使用的導航系統,它可以應用在各式各樣的機器人上,提供感測、規劃、控制、定位、圖形化等功能,也能根據使用需求,以新增插件或是修改行為樹的方式進行功能客製化,實現使用者對於機器人自動化的要求。

導航架構

(Nav2架構,圖片來自官方文件)

在Navigation2上,主要可以分為行為樹(Behavior Tree, BT)、規劃器(Planner)、控制器(Controller)。

 

行為樹

(Nav2行為樹,圖片來自官方文件)

行為樹負責主導導航的流程,它會根據設定判斷當前的狀態,並執行對應的功能部件,例如接收到目標時交由規劃器給出大略的路徑,之後交給控制器操控機器人沿著路徑移動。在系統中預設的行為樹已經相當完善,這邊僅需要調整座標轉換的設定即可。

  • “use_sim_time”:是否使用虛擬時間,在模擬環境時使用
  • “global_frame”:設定作為基底的座標轉換,通常是map
  • “robot_frame”:設定機器人的座標轉換,通常是base_footprint或是base_link
  • “odom_topic”:設定里程計的訊息來源名稱

 

導航規劃器-規劃導航時的路徑

當使用者或其他系統給予導航系統一個目標時,規劃器會參考光達及地圖資料,根據選擇的演算法建立一條繞過障礙物,前往目的地的最短或是最佳路徑,這條路徑會作為之後控制的參考。當使用有動態避障功能的控制器時,遇到突然出現在路徑上的障礙物,規劃器會立刻規劃另一條路徑,避開新加入的障礙物。

Navfn規劃器

Navfn(Navigation Function)使用Dijkstra或A*演算法,假設機器人外型是圓形,並在加權過後的代價地圖上計算路徑。Navfn從ROS1的套件沿用而來,穩定性經過時間驗證,且設定簡單。

  • “tolerance”:影響機器人對於目標距離的可接受誤差容忍值,如果無法到達目標,但距離少於這個數值就會停止,以公尺(m)為單位
  • “use_astar”:是否使用A*演算法,如果沒有設定或是關閉就會使用Dijkstra演算法
  • “allow_unknown”:是否允許規劃路徑到地圖上未知的位置
  • “use_final_approach_orientation”:是否以路徑最後的方向作為停止點,而非依照目標的方向停止

 

Smac2D規劃器

Smac2D使用A*演算法在2D網格中的相鄰節點進行路徑搜尋,規劃出最佳路徑。

  • “tolerance”:影響機器人對於目標距離的可接受誤差容忍值,如果無法到達目標,但距離少於這個數值就會停止,以公尺(m)為單位
  • “downsample_costmap”:是否對代價地圖降採樣,壓縮代價地圖的內容
  • “downsampling_factor”:降採樣的倍率
  • “allow_unknown”:是否允許規劃路徑到地圖上未知的位置
  • “max_iterations”:搜尋路徑的最大次數,超過後會被視為無法到達
  • “max_on_approach_iterations”:在與目標距離小於可接受誤差容忍值時,搜尋路徑的最大次數
  • “max_planning_time”:規畫路徑的最大時間,以秒(s)為單位
  • “cost_travel_multiplier”:路徑移動的權重,數值愈大路徑會越偏向道路中央,以遠離障礙物
  • “use_final_approach_orientation”:是否以路徑最後的方向作為停止點,而非依照目標的方向停止
  • “smoother.max_iterations”:進行路徑平滑的最大次數
  • “smoother.w_smooth”:路徑平滑的權重
  • “smoother.w_data”:保留原始資料的權重
  • “smoother.tolerance”:結束路徑平滑的條件

 

ThetaStar規劃器

ThetaStar使用Theta*演算法,利用代價地圖計算網格節點與障礙物距離,用以規劃路徑。

  • “how_many_corners”:使用周圍八個方向或是四個方向規畫路徑,輸入值只能是4或8
  • “w_euc_cost”:路徑長度的權重,數值愈大路線會越簡潔(直線)
  • “w_traversal_cost”:移動路徑的權重,數值愈大路線會越複雜(曲線)
  • “use_final_approach_orientation”:是否以路徑最後的方向作為停止點,而非依照目標的方向停止
  • “allow_unknown”:是否允許規劃路徑到地圖上未知的位置
  • “terminal_check_interval”:在執行多少次後系統會認為導航被取消或超時

 

導航控制器-控制導航時的方向

在導航系統中,控制器會接收規劃好的路徑,按照設定好的演算法,讓機器人移動到目的地,根據控制器內演算法的不同,在行走時也會有不一樣的表現,套件中有預設三個控制器可供選擇,分別是:RPP、DWB、MPPI。

RPP控制器-單純跟隨路徑

 

RPP(Regulated Pure Pursuit)是三個控制器中最簡單的,它就只會跟著接收到的路徑移動,並在接近障礙物時減速,這個控制器就足以應付大多數環境單純,不會有動態障礙物的場景。

  • “desired_linear_vel”:可以改變機器人的直線(線性)速度
  • “rotate_to_heading_angular_vel”:可以改變機器人的旋轉(角)速度
  • “lookahead_dist”、“min_lookahead_dist”、“max_lookahead_dist”、“lookahead_time”:機器人考量的路線距離,會影響跟隨路徑的穩定性,越遠越不穩定

 

DWB控制器-動態窗口法

 

DWB(Dynamic Window approach B)是導航系統中預設的控制器,它會根據設定中機器人的移動參數,在機器人可能的移動範圍內考慮行走路線,並用障礙物以及與路徑的距離與方向等數值評估最佳路線,另外還有了動態障礙物躲避的能力。

  • “min_vel_x”、“max_vel_x”:可以改變機器人的直線(線性)速度範圍
  • “min_vel_theta”、“max_vel_theta”:可以改變機器人的旋轉(角)速度範圍
  • “min_speed_xy”、“max_speed_xy”:代表機器人最大移動速度
  • “critics”:用來評估路線的項目,下方的scale參數是各個項目的倍率

 

MPPI控制器-模型預測路徑積分

MPPI(Model Predictive Path Integral)是三個控制器中運算需求最高的,它會根據機器人的當前狀態還有之前的控制指令,加入隨機雜訊後模擬行走路線,並用障礙物距離以及與路徑的距離與方向等數值評估最佳路線,同樣也有動態障礙物躲避的能力。

  • “vx_max”、“vx_min”可以改變機器人的直線(線性)速度範圍
  • “vz_max”可以改變機器人的旋轉(角)速度上限
  • “critics”是用來評估路線的項目,每個項目都有獨立的設定
  • 各個評估項目critic裡的通用細部設定:
    • “enabled”:是否開啟
    • “cost_power”:評估時的順序
    • “cost_weight”:評估時的倍率
    • “threshold_to_consider”:距離目標多遠開始評估

 

代價地圖

代價地圖可以分為全域與區域的代價地圖,全域代價地圖用來給規劃器規劃路徑,區域代價地圖則是供給控制器操控機器人。兩者可以分開設定,它們有著相同的設定項目,因此這邊以全域代價地圖的設定為例。

  • “update_frequency”:代價地圖的更新頻率
  • “publish_frequency”:代價地圖的發布頻率
  • “global_frame”:代價地圖的座標轉換對象,通常是map
  • “robot_base_frame”:機器人的座標轉換,通常是base_footprint或base_link
  • “use_sim_time”:是否使用虛擬時間,在模擬環境時使用
  • “robot_radius”:機器人的半徑,單位是公尺(m)
  • “resolution”:代價地圖的解析度,單位是公尺(m)
  • “track_unknown_space”:是否將地圖中未確定的區域視為可行走區域
  • “transform_tolerance”:座標轉換的誤差容忍值
  • “plugins”:代價地圖的插件
  • “obstacle_layer.enabled”:是否使用障礙層
  • “obstacle_layer.scan.topic”:障礙層的資料來源名稱
  • “obstacle_layer.scan.obstacle_max_range”:障礙物偵測的最大距離
  • “obstacle_layer.scan.obstacle_min_range”:障礙物偵測的最小距離
  • “inflation_layer.cost_scaling_factor”:膨脹層的成本倍率,數值越高成本會衰減越快
  • “inflation_layer.inflation_radius”:膨脹層的範圍,單位是公尺(m)
  • “always_send_full_costmap”:每次更新代價地圖時傳送整份地圖,而不是只發送更改的部分

 

導航點跟隨-在導航點等待

先前使用過的導航點跟隨,移動到導航點後會等待一定時間後再繼續移動。

  • “use_sim_time”:是否使用虛擬時間,在模擬環境時使用
  • “loop_rate”:導航點跟隨系統的執行速率
  • “stop_on_failure”:當無法移動到下一個導航點時,是否取消後續的導航點
  • “waypoint_task_executor_plugin”:導航點跟隨的功能,這邊選用“wait_at_waypoint”
  • “wait_at_waypoint.plugin”:根據上方設定的導航點跟隨功能,選擇對應的插件
  • “wait_at_waypoint.enabled”:是否啟用插件
  • “wait_at_waypoint.waypoint_pause_duration”:抵達導航點後等待的時間

 

導航點跟隨-在導航點接收訊息

與先前使用過的導航點跟隨相比,一樣會移動到導航點,但接收到訊息後馬上開始移動,可以額外在機器人上設置一個按鈕,讓使用者可以按下按鈕發送訊息。

  • “waypoint_task_executor_plugin”:導航點跟隨的功能,這邊選用“input_at_waypoint”
  • “input_at_waypoint.plugin”:根據上方設定的導航點跟隨功能,選擇對應的插件
  • “input_at_waypoint.enabled”:是否啟用插件
  • “input_at_waypoint.timeout”:在抵達導航點後,超過這個時間沒有進行輸入,就會前往下一個導航點
  • “input_at_waypoint.input_topic”:輸入訊息來源的名稱

 

導航點跟隨-在導航點拍照

與上面的功能有些不同,在移動到導航點後,機器人會從設定好的影像訊息儲存一張圖片,可以事先設定好攝影機,再使用usb_cam發送影像訊息。

  • “waypoint_task_executor_plugin”:導航點跟隨的功能,這邊選用“photo_at_waypoint”
  • “photo_at_waypoint.plugin”:根據上方設定的導航點跟隨功能,選擇對應的插件
  • “photo_at_waypoint.enabled”:是否啟用插件
  • “photo_at_waypoint.camera_image_topic_name”:影像訊息來源的名稱
  • “photo_at_waypoint.save_images_dir”:圖片的儲存位置
  • “photo_at_waypoint.image_format”:圖片的儲存格式

 

ROS2搬運機器人的導航設定到此告一段落,未來還會有更多與ROS2相關的內容,敬請期待。

發佈留言

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