Quantcast
Channel: CAVEDU教育團隊技術部落格
Viewing all articles
Browse latest Browse all 678

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

$
0
0

 

簡介

本文是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容器時的指令,可以根據使用需求修改參數:

docker run --runtime nvidia -it --rm --privileged \
--network=host --name ros2_container -e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME/.Xauthority:/root/.Xauthority \
-v $HOME/ros_ws:/ros_ws \
dustynv/ros:humble-desktop-l4t-r35.3.1

 

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

sudo groupadd docker
sudo usermod -aG docker $USER

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

  • docker run: 呼叫Docker建立一個新的容器

 

 

  • –it: 可以分為-i與-t兩部分,-i: 讓鍵盤的輸入進入Docker,-t: 讓Docker的輸出到螢幕上

 

  • –rm: 讓這個容器在關閉時自動刪除,如果在進行環境測試時要保存環境的話,把它移除掉就可以保留容器,保留下來的容器可以用以下指令再次開啟
  • docker start ros2_container
    docker attach ros2_container
  • –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及建立映像檔時的相關文件,連接到終端機後,執行以下程式
mkdir docker_build
cd docker_build

 

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

touch Dockerfile
ls

 

3.用文字編輯器開啟Dockerfile

nano Dockerfile

 

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

FROM dustynv/ros:humble-desktop-l4t-r35.3.1

RUN git clone --depth 1 https://github.com/NVIDIA-AI-IOT/torch2trt && \
git clone --depth 1 https://github.com/NVIDIA/jetson-gpio

 

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

 

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

docker build -f Dockerfile -t ros_inference:humble .

 

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

docker run --runtime nvidia -it --rm --privileged \
--network=host --name ros2_container -e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME/.Xauthority:/root/.Xauthority \
ros_inference:humble

 

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

ls

 

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

ros2 run examples_rclcpp_minimal_publisher publisher_member_function

 

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

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

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

 

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

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

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

echo $RMW_IMPLEMENTATION

 

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

export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

 

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

export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

 

也可以在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教育團隊技術部落格》。


Viewing all articles
Browse latest Browse all 678

Trending Articles