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

 

簡介

本文是AMR ROS2光達搬運機器人系統設定的第一篇文章,文章內容會大略講解機器人的基礎架構,以及如何在機器人上的系統進行基礎的參數設定與修改。如果還沒有閱讀過之前部落格中AMR ROS2搬運機器人文章的讀者,建議先往回閱讀之前的文章,會更容易了解文章中的內容。

一、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

機器人系統架構

將ROS2搬運機器人的系統簡化後以軟硬體分隔,箭頭代表資料流向,會呈現下圖:

 

硬體

目前使用的系統是以Pi Pico作為下位機接收訊號並控制底盤,由NVIDIA Jetson Orin Nano負責處理所有的軟體運行,光達將掃描後訊息傳入Jetson Orin Nano,彼此間以USB線連接。

軟體

在NVIDIA Jetson Orin Nano上,運行有ROS2機器人作業系統,用來執行光達、控制、遙控、建圖與定位、導航等程式,透過串列(Serial)與外部硬體溝通以發送或取得資料,程式間則是透過ROS2的訊息進行通訊。

 

ROS2系統設定 – Docker

為什麼選擇Docker

Docker容器(Container)與虛擬機器(Virtual Machine, VM)之間的不同有以下幾點:

  1. 僅在應用程式層面虛擬化,而非從最底層硬體開始模擬,可以取得較好的性能表現。
  2. 啟動速度較快,相較於虛擬機器動輒數分鐘的啟動時間,Docker僅需較短的時間即可開始使用。
  3. 確保系統一致性,同一份Docker映像檔(Image)建立出來的容器完全相同,可以讓開發、測試、運行環境統一,簡化開發流程。
  4. 部署、搬遷、拓展容易,Docker用以建立容器的映像檔相較虛擬機器的映像檔小上許多,並可以在同一架構與相同作業系統版本下的任意機器上運行,也可以在已有的映像檔上修改建立新的映像檔。

在Jetson系列上,Docker已經預先安裝在JetPack當中,不需要另外進行安裝,在Nvidia推出的開源專案上也經常會使用Docker容器,例如以下兩者:

  • jetson-container: 整合了在Jetson系列上可以直接運行的Docker容器範例,包含最新的大語言模型、生成式人工智慧及ROS2等,jetson-ai-lab的許多範例便是基於此專案執行。
  • Isaac ROS: 由Nvidia開發,具有硬體加速能力、高性能、低延遲的ROS2套件組合,當中推薦以Docker容器執行來簡化安裝流程。

 

Docker執行設定

這是建立Docker容器時的指令,可以根據使用需求修改參數:

[pastacode lang=”python” manual=”docker%20run%20–runtime%20nvidia%20-it%20–rm%20–privileged%20%5C%0A–network%3Dhost%20–name%20ros2_container%20-e%20DISPLAY%3D%24DISPLAY%20%5C%0A-v%20%2Ftmp%2F.X11-unix%3A%2Ftmp%2F.X11-unix%20%5C%0A-v%20%24HOME%2F.Xauthority%3A%2Froot%2F.Xauthority%20%5C%0A-v%20%24HOME%2Fros_ws%3A%2Fros_ws%20%5C%0Adustynv%2Fros%3Ahumble-desktop-l4t-r35.3.1%0A” message=”” highlight=”” provider=”manual”/]

 

如果無法執行,代表可能現在的使用者沒有docker的身分組,用以下兩個指令加入身分組:

[pastacode lang=”python” manual=”sudo%20groupadd%20docker%0Asudo%20usermod%20-aG%20docker%20%24USER%0A” message=”” highlight=”” provider=”manual”/]

以下是每一段指令代表的意涵:

  • docker run: 呼叫Docker建立一個新的容器
  • –runtime nvidia: Nvidia Container Runtime,讓容器可以使用GPU加速功能
  • –it: 可以分為-i與-t兩部分,-i: 讓鍵盤的輸入進入Docker,-t: 讓Docker的輸出到螢幕上
  • –rm: 讓這個容器在關閉時自動刪除,如果在進行環境測試時要保存環境的話,把它移除掉就可以保留容器,保留下來的容器可以用以下指令再次開啟

 

  • [pastacode lang=”python” manual=”docker%20start%20ros2_container%0Adocker%20attach%20ros2_container” message=”” highlight=”” provider=”manual”/]
  • –privileged: 給予容器特權,可以看到並存取所有的裝置(/dev)
  • –network=host: 設定容器的網路,這邊使用與主機相同的網路設定
  • –name ros2_container: 設定這個容器的名字,名字不能與其他容器重複
  • -e DISPLAY=$DISPLAY: 指定顯示的裝置,這邊使用主機中的環境變數
  • -v /tmp/.X11-unix:/tmp/.X11-unix: 掛載X11的目錄,讓視窗顯示正常
  • -v $HOME/.Xauthority:/root/.Xauthority: 掛載X11的目錄,讓視窗顯示正常
  • -v $HOME/ros_ws:/ros_ws: 掛載程式的目錄,用來保存設定與地圖
  • dustynv/ros:humble-desktop-l4t-r35.3.1: 用來建立容器的映像檔名稱,如果在本地沒有這個名稱的映像檔,且網路上有相同名稱的映像檔,會從網路上自動下載

 

要離開Docker環境時輸入“exit”就能離開

 

更詳細的參數設定,可以到Docker官方文件查詢:

https://docs.docker.com/reference/cli/docker/container/run/

 

Dockerfile與Docker映像檔(Image)

以下步驟會建立並編輯一個Dockerfile,並以這份Dockerfile為基礎建立映像檔,在原有映像檔之上進行新增與修改,生成自訂的映像檔。

  1. 首先要建立一個資料夾,用來存放Dockerfile及建立映像檔時的相關文件,連接到終端機後,執行以下程式
[pastacode lang=”python” manual=”mkdir%20docker_build%0Acd%20docker_build%0A” message=”” highlight=”” provider=”manual”/]

 

2.建立Dockerfile,並用ls查看是否建立成功

[pastacode lang=”python” manual=”touch%20Dockerfile%0Als%0A” message=”” highlight=”” provider=”manual”/]

 

3.用文字編輯器開啟Dockerfile

[pastacode lang=”python” manual=”nano%20Dockerfile” message=”” highlight=”” provider=”manual”/]

 

4.編輯Dockerfile,FROM代表使用哪一個映像檔作為基底,RUN則是代表要執行什麼指令,可以使用多個RUN執行不同的指令,或是集中在同一個RUN後面,這邊示範在建立映像檔時使用Git下載torch2trt及jetson-gpio:

[pastacode lang=”python” manual=”FROM%20dustynv%2Fros%3Ahumble-desktop-l4t-r35.3.1%0A%0ARUN%20git%20clone%20–depth%201%20https%3A%2F%2Fgithub.com%2FNVIDIA-AI-IOT%2Ftorch2trt%20%26%26%20%5C%0A%20%20%20%20git%20clone%20–depth%201%20https%3A%2F%2Fgithub.com%2FNVIDIA%2Fjetson-gpio%0A” message=”” highlight=”” provider=”manual”/]

 

5.按下Ctrl+S儲存,下方會出現“wrote 4 lines”字樣,再按Ctrl+X結束編輯

 

6.建立映像檔,-f代表Dockerfile的名稱,-t代表映像檔建立後的名稱,注意指令最後面有一個句點,稍待片刻後就會完成建立

[pastacode lang=”python” manual=”docker%20build%20-f%20Dockerfile%20-t%20ros_inference%3Ahumble%20.” message=”” highlight=”” provider=”manual”/]

 

7.用剛才建立的映像檔建立一個容器

[pastacode lang=”python” manual=”docker%20run%20–runtime%20nvidia%20-it%20–rm%20–privileged%20%5C%0A–network%3Dhost%20–name%20ros2_container%20-e%20DISPLAY%3D%24DISPLAY%20%5C%0A-v%20%2Ftmp%2F.X11-unix%3A%2Ftmp%2F.X11-unix%20%5C%0A-v%20%24HOME%2F.Xauthority%3A%2Froot%2F.Xauthority%20%5C%0Aros_inference%3Ahumble%0A” message=”” highlight=”” provider=”manual”/]

 

8.檢查建立時下載的torch2trt與jetson-gpio是否存在

[pastacode lang=”python” manual=”ls” message=”” highlight=”” provider=”manual”/]

 

9.執行ROS2範例,檢查ROS2系統是否正常

[pastacode lang=”python” manual=”ros2%20run%20examples_rclcpp_minimal_publisher%20publisher_member_function” message=”” highlight=”” provider=”manual”/]

 

10.輸入“exit”離開Docker環境

關於Dockerfile更詳細的內容,可以參考官方文件:

https://docs.docker.com/reference/dockerfile/

 

ROS2系統設定 – 資料分發服務DDS

ROS2中,DDS負責軟體系統間的通訊,不同的廠商推出的DDS彼此之間可以互相通訊,但當中難免會有一些差異,造成通訊異常,因此建議在同一個場景中的裝置都選擇相同的DDS版本。

可以使用以下指令查看ROS2系統當前使用的DDS版本,如果沒有輸出任何訊息,代表使用的是ROS2預設的DDS版本(FastDDS),目前主要使用的DDS版本有CycloneDDS及FastDDS:

[pastacode lang=”python” manual=”echo%20%24RMW_IMPLEMENTATION” message=”” highlight=”” provider=”manual”/]

 

使用以下指令可以指定使用CycloneDDS:

[pastacode lang=”python” manual=”export%20RMW_IMPLEMENTATION%3Drmw_cyclonedds_cpp” message=”” highlight=”” provider=”manual”/]

 

使用以下指令可以指定使用FastDDS:

[pastacode lang=”python” manual=”export%20RMW_IMPLEMENTATION%3Drmw_fastrtps_cpp” message=”” highlight=”” provider=”manual”/]

 

也可以在Dockerfile中,使用ENV事先定義要使用的DDS版本,這樣就不用每次使用時進行設定,生效的版本會以最後設定的版本為主

 

DDS設定的細部內容可以參考ROS2文件:

https://docs.ros.org/en/humble/How-To-Guides/Working-with-multiple-RMW-implementations.html

https://docs.ros.org/en/humble/Concepts/Intermediate/About-Different-Middleware-Vendors.html

 

在搬運機器人上的ROS2系統設定到此告一段落,之後將會討論光達與地圖繪製及定位的相關設定,敬請期待。

 

發佈留言

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