簡介
本文是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容器時的指令,可以根據使用需求修改參數:
[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為基礎建立映像檔,在原有映像檔之上進行新增與修改,生成自訂的映像檔。
- 首先要建立一個資料夾,用來存放Dockerfile及建立映像檔時的相關文件,連接到終端機後,執行以下程式

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系統設定到此告一段落,之後將會討論光達與地圖繪製及定位的相關設定,敬請期待。




