簡介
本文是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)之間的不同有以下幾點:
- 僅在應用程式層面虛擬化,而非從最底層硬體開始模擬,可以取得較好的性能表現。
- 啟動速度較快,相較於虛擬機器動輒數分鐘的啟動時間,Docker僅需較短的時間即可開始使用。
- 確保系統一致性,同一份Docker映像檔(Image)建立出來的容器完全相同,可以讓開發、測試、運行環境統一,簡化開發流程。
- 部署、搬遷、拓展容易,Docker用以建立容器的映像檔相較虛擬機器的映像檔小上許多,並可以在同一架構與相同作業系統版本下的任意機器上運行,也可以在已有的映像檔上修改建立新的映像檔。
在Jetson系列上,Docker已經預先安裝在JetPack當中,不需要另外進行安裝,在Nvidia推出的開源專案上也經常會使用Docker容器,例如以下兩者:
- jetson-container: 整合了在Jetson系列上可以直接運行的Docker容器範例,包含最新的大語言模型、生成式人工智慧及ROS2等,jetson-ai-lab的許多範例便是基於此專案執行。
- Isaac ROS: 由Nvidia開發,具有硬體加速能力、高性能、低延遲的ROS2套件組合,當中推薦以Docker容器執行來簡化安裝流程。
Docker執行設定
這是建立Docker容器時的指令,可以根據使用需求修改參數:
如果無法執行,代表可能現在的使用者沒有docker的身分組,用以下兩個指令加入身分組:
以下是每一段指令代表的意涵:
- docker run: 呼叫Docker建立一個新的容器
- –runtime nvidia: Nvidia Container Runtime,讓容器可以使用GPU加速功能
- –it: 可以分為-i與-t兩部分,-i: 讓鍵盤的輸入進入Docker,-t: 讓Docker的輸出到螢幕上
- –rm: 讓這個容器在關閉時自動刪除,如果在進行環境測試時要保存環境的話,把它移除掉就可以保留容器,保留下來的容器可以用以下指令再次開啟
- –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為基礎建立映像檔,在原有映像檔之上進行新增與修改,生成自訂的映像檔。
- 首先要建立一個資料夾,用來存放Dockerfile及建立映像檔時的相關文件,連接到終端機後,執行以下程式
2.建立Dockerfile,並用ls查看是否建立成功
3.用文字編輯器開啟Dockerfile
4.編輯Dockerfile,FROM代表使用哪一個映像檔作為基底,RUN則是代表要執行什麼指令,可以使用多個RUN執行不同的指令,或是集中在同一個RUN後面,這邊示範在建立映像檔時使用Git下載torch2trt及jetson-gpio:
5.按下Ctrl+S儲存,下方會出現“wrote 4 lines”字樣,再按Ctrl+X結束編輯
6.建立映像檔,-f代表Dockerfile的名稱,-t代表映像檔建立後的名稱,注意指令最後面有一個句點,稍待片刻後就會完成建立
7.用剛才建立的映像檔建立一個容器
8.檢查建立時下載的torch2trt與jetson-gpio是否存在
9.執行ROS2範例,檢查ROS2系統是否正常
10.輸入“exit”離開Docker環境
關於Dockerfile更詳細的內容,可以參考官方文件:
https://docs.docker.com/reference/dockerfile/
ROS2系統設定 – 資料分發服務DDS
ROS2中,DDS負責軟體系統間的通訊,不同的廠商推出的DDS彼此之間可以互相通訊,但當中難免會有一些差異,造成通訊異常,因此建議在同一個場景中的裝置都選擇相同的DDS版本。
可以使用以下指令查看ROS2系統當前使用的DDS版本,如果沒有輸出任何訊息,代表使用的是ROS2預設的DDS版本(FastDDS),目前主要使用的DDS版本有CycloneDDS及FastDDS:
使用以下指令可以指定使用CycloneDDS:
使用以下指令可以指定使用FastDDS:
也可以在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系統設定到此告一段落,之後將會討論光達與地圖繪製及定位的相關設定,敬請期待。
〈AMR ROS2光達搬運機器人-掛載映象檔與資料分發服務設定-使用NVIDIA Orin Nano〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。