AMR ROS2光達搬運機器人 -使用NVIDIA Orin Nano-進階應用篇

簡介

本文是AMR ROS2光達搬運機器人的第三篇文章,內容涵蓋進階功能,如果還沒有閱讀過入門操作篇的讀者,建議先往回閱讀之前的文章,文內將會說明地圖的解讀、動態避障的利用、保存/載入地圖與導航點還有導航程式設定

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

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

 

撰寫/攝影 楊子賢
時間 1小時 材料表
  • RK-AMR ROS2 光達搬運機器人 (有興趣歡迎來信service@cavedu.com)
  • 場地圍牆
  • 筆電電腦 (連入 ROS2 搬運機器人 編寫程式)
難度 2(滿分5)

 

軟硬體背景

NVIDIA Jetson Orin Nano

Jetpack 5.1.1

L4T 35.3.1

Ubuntu 20.04 LTS

 

如何解讀地圖

地圖代表了在機器人眼中周圍的環境,不同的顏色標註都有不同的功能,會影響機器人行走時的表現

  • 光達掃描點:光達掃描後回傳的障礙物距離資料,是建立地圖與定位的主要依靠
  • 全域代價地圖:用於規劃路徑,是根據地圖資料和光達掃描的結果產生,導航時顯示的路徑就是參考全域代價地圖後用演算法得到的最佳路徑
  • 區域代價地圖:用於行走時的控制,一樣是根據地圖資料和光達掃描的結果產生,導航時移動的方向和速度都會參考區域代價地圖進行修正
  • 靜態層:由地圖和光達提供資料,代表障礙物本體
  • 障礙層:由障礙層向外延伸產生,代表會與障礙物碰撞的範圍,當機器人的中心進到這個區域裡面時,就等於撞到障礙物
  • 膨脹層:由障礙層向外延伸產生,代表現在區域行走的可行性,數值與障礙物的距離成正比,機器人會以這個圖層為參考,在這個區域內行走,盡量待在道路中央,離障礙物遠一點

 

如何利用動態避障

要利用動態避障,首先要大概理解一下它的使用要點,只要符合這些要件後,機器人基本上就有辦法繞過突然加入的障礙物:

  • 障礙物要可以被掃描到,也就是高度要高過光達的位置
  • 障礙物出現時至少要距離機器人大約40公分,讓機器人有時間做出反應
  • 障礙物最好是低速移動或是靜止的,讓機器人可以穩定的更新障礙物狀態
  • 最好要有其他的通道可以通往目標點,不然導航可能會因為超時被取消
  • 機器人在更換路徑時,會想辦法走最近的路線

 

如何保存地圖

在移動機器人建立地圖後,可以將地圖保存下來供之後再次使用或是分享給其他人,有兩種檔案格式可選擇:Pbstream與PGM+YAML,兩者互不相通,該系統現在用的是Pbstream格式

保存Pbstream地圖

當地圖繪製到一個段落之後,可以開啟另外一個終端機,連接進入docker容器並載入設定檔

./run_docker.sh
source ros_entrypoint.sh

 

執行以下指令讓系統先停止建立新的地圖,成功的話會回傳”Finished trajectory 0.”,像是以下圖片中的訊息。這時會發現操作視窗的地圖畫面停止了,這是正常的現象

ros2 service call /finish_trajectory \
cartographer_ros_msgs/srv/FinishTrajectory "{trajectory_id: 0}"

 

然後執行以下指令將地圖資料寫入檔案,成功的話會回傳”State written to ‘/ros_ws/map.pbstream’”,如同以下圖片中的訊息。這邊要把檔案放在特定的資料夾裡,關閉docker的時候才會保留下來,檔案在docker外的路徑在”~/ros_ws”裡

ros2 service call /write_state cartographer_ros_msgs/srv/WriteState \
"{filename: '/ros_ws/map.pbstream', \
include_unfinished_submaps: "false"}"

 

完成後記得回到原來的終端機按下Ctrl+C關閉地圖繪製程式

 

保存PGM+YAML地圖

請注意這個方式保存下來的地圖不能用在這個系統上,跟上方一樣開啟另外一個終端機,連接進入docker容器並載入設定檔

./run_docker.sh
source ros_entrypoint.sh

 

這次不需要暫停建立地圖,輸入以下指令就能保存地圖檔案,成功的話會回傳”Map saved sucessfully”,如同以下圖片中的訊息。這邊要把檔案放在機器人程式的資料夾裡,關閉docker的時候才會保留下來,docker外的路徑在”~/ugv_ws”裡

ros2 run nav2_map_server map_saver_cli -f /ros_ws/map

 

如何載入地圖

當要使用先前建立的Pbstream地圖時,將機器人放到建立地圖時的起始點,開啟docker環境,如果看到命令列最前方的使用者是root,就代表已經在docker環境內了,不用重複執行

./run_docker.sh

 

輸入以下指令執行導航程式,就會從檔案載入先前建立的地圖用以定位,這個情況下系統不會再產生新的地圖

ros2 launch ugv_bringup nav2.launch.py map_path:=/ros_ws/map.pbstream

 

如何保存與載入導航點

執行程式並在多導航點模式設定導航點後,可以選擇將其保存,方便之後使用,點擊導航操作面板的”Save WPs”,會跳出儲存視窗,選擇儲存位置及檔案名稱後,按下OK就會完成儲存

 

要載入導航點時,點擊導航操作面板的”Load WPs”,會跳出載入視窗,選擇要載入的檔案後,按下OK就會完成載入

 

如何重複執行導航點

 

當希望在設定的導航點上多次執行導航時,可以修改導航操作面板中Num of loops欄位的數值,這個數值代表執行導航時額外重複的次數,0代表執行一次,1代表執行兩次,以此類推,設定完成後按下開始導航就會執行設定中指定的次數

 

如何調整導航設定

這邊的設定是關於導航時的各種細節,例如導航時使用的規劃器、控制器,還有各種輔助插件的詳細參數,設定可以從容器內或是從外部進行調整,調整完成後按下Ctrl+S、Ctrl+X就可以儲存離開

容器內:

nano /ros_ws/src/ugv_navigation/params/ugv_nav2.yaml

 

容器外:

nano ~/ugv_ws/src/ugv_navigation/params/ugv_nav2.yaml

 

以下是可能會需要調整的數值:

  • 代價地圖最小障礙物距離,代表光達中障礙物出現的最短距離,以公尺(m)為單位,當在機器人上安裝的配件會遮擋到光達的掃描範圍時,可以修改這項參數,讓系統忽視出現在近距離的障礙物,避免導航出現異常
local_costmap:
local_costmap:
ros_parameters:
obstacle_layer:
scan:
obstacle_min_range: 0.25
global_costmap:
global_costmap:
ros_parameters:
obstacle_layer:
scan:
obstacle_min_range: 0.25

 

  • 代價地圖膨脹層,代表現在區域行走的可行性,用於導航時產生路徑,可以配合機器人的大小與場地大小調整,最理想的情況是大部分的路徑都有被膨脹層覆蓋,這樣在決定行走方向時會較為正確,規劃路徑時也才能維持在道路中央
local_costmap:
local_costmap:
ros_parameters:
inflation_layer:
inflation_radius: 0.5
global_costmap:
global_costmap:
ros_parameters:
inflation_layer:
inflation_radius: 0.5

 

  • 導航點停駐時間,代表在導航抵達導航點時停留的時間,以毫秒(ms)為單位,可以根據使用需求調整,下方的動圖有做加速處理
waypoint_follower:
ros__parameters:
wait_at_waypoint:
waypoint_pause_duration: 3000

 

其他設定的詳細內容以及此處未使用的插件可以到導航套件Nav2官方文件查詢:https://navigation.ros.org/configuration/index.html

那我們下篇文章再見。

 

 

發佈留言

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