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

AMR ROS2光達搬運機器人 規劃貨品搬運路線-使用NVIDIA Orin Nano邊緣運算裝置-功能介紹篇

$
0
0

 

 

撰寫/攝影 楊子賢
時間 1小時 材料表
  • RK-AMR ROS2 光達搬運機器人 
  • 場地圍牆
  • 筆電電腦 (連入 ROS2 搬運機器人 編寫程式)
難度 1(滿分5)

 

簡介

ROS2光達導航六輪移動平台採用Nvidia Orin Nano邊緣運算電腦,能夠運用光達提供的距離資料,在ROS2機器人作業系統中進行定位、建立地圖、路徑規劃與導航等操作,文章中將會大略展示上述的基本功能和其延伸的進階運用

 

軟硬體背景

  • NVIDIA Jetson Orin Nano
  • Jetpack 5.1.1
  • L4T 35.3.1
  • Ubuntu 20.04 LTS

 

基礎功能

A、遙控移動

對機器人而言應該是最基礎的功能,可以使用鍵盤遠端操控,機器人會馬上做出反應,開始移動

 

B、定位與建立地圖

在這個平台上我們使用光達,透過它提供的距離資料,機器人會自行建立地圖並進行定位,

這可以讓機器人認得周遭的環境,還有知道自己在地圖上的哪個位置

 

C、路徑規劃

給予機器人一個目標的導航點後,它就會根據過去建立的地圖與光達的掃描情況規劃出一條避開障礙物的路徑

 

 

D、路徑導航

有了規劃好的路徑後,就可以讓機器人按照預先設定的控制方式,沿著路徑走到目標的導航點

 

 

E、導航點導航

既然機器人有辦法行走到一個目標導航點,那當然也可以一次走過很多個導航點,而且沒有數量上限,設定好之後就能夠依設定的順序導航移動

 

 

F、重複執行導航

想要讓機器人重複走很多次一樣的路線,但一直反覆設定導航點又很麻煩,可以在開始導航前設定次數,機器人就會自動重複固定的次數

 

 

進階功能

A、保存與載入地圖與導航點

想要節省每次開啟後繪製地圖與建立導航點的時間,或是想把地圖及導航點拿到其他機器使用,

可以將建立好的地圖與導航點以檔案的方式保存,就能重複使用或是轉移到其他裝置上

 

B、動態障礙物躲避

在導航的過程中如果遭遇突然出現的障礙物,機器人不是只會撞上去或站在原地乾等而已,當光達掃描到障礙物時,它會馬上重新規劃路徑,想辦法繞過障礙物,並繼續移動到目標地點

 

 

以上是AMR ROS2 搬運機器人的常用功能展示,之後也會陸續分享功能教學,敬請期待。

AMR ROS2光達搬運機器人 規劃貨品搬運路線-使用NVIDIA Orin Nano邊緣運算裝置-功能介紹篇〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。


5G通訊跨領域人才培育學習資源-陣列天線波束成形、5G NR小基站、SDN/NFV

$
0
0

作者:豐智

難度:0~10星

了解所需時間:10分鐘~100小時

 

5G跨領域專業人才學習資源

2023年協助整理5G人才培育相關學習資源時,也順帶確認現今低軌道衛星與5G的通訊概況,這次打算先來做一些簡易的5G教學資源分享。

如果對5G的通訊技術有想要學習或了解的話可以參考這個 -培育5G跨領域專業人才學習地圖 https://www.5g-jump.org.tw/zh-tw/onlinecourse/learningMap

裡面有相當多的教授、國外工程師帶領大家學習理論知識、演算法、天線通訊、通訊協定、實機操作。

 

協助整理的學習領域:

一、天線

以理論、演算法、訊號特性、束波成型特性、陣列天線原理為主

設計毫米波前端模組與檢測需要注意的二三事-

  1. 天線模組,與soc整合,有調整校正問題,公司製程,溫度問題造成。
  2. 陣列天線模擬與實際狀況不同,在設備有限的需要排隊使用的狀況下,建議跟模擬工程師一起cowork建置。因著相較於傳統頻寬更大,演算法與電子工程師必須cowork
  3. 需要量測與校正方案,ADC至少到2G以上才能看到諧波
  4. 5G因頻寬信號變化非常大,與記憶效應等問題,這是校正需要與挑戰的部分
  5. 規劃開發期程時須注意傳統RF建置成本,VAN,VSG,VDA設備協調,設計射頻前端耗費的時間
  6. 確認beam wave是否符合預期
  7. 天線Array 線上測試,檢驗問題,尤其要考慮在低軌道衛星的使用上
  8. Attena array檢測哪一個elements有問題

 

天線技術 5G JUMP 學習資源

  1. 行動通訊系統與天線原理
  2. 5G天線系統整合與驗測
  3. 陣列天線波束成形電路
  4. 製成專案管理

資料來源-https://www.5g-jump.org.tw/

二、小基站 / 無線接取

會以國際電信聯盟提出的3GPP(第三代合作夥伴計劃)提到的5G通訊協定為主,也可以參考歐洲電信標準協會提出的標準與解決方案。其中5G NR、5G O-RAN更被視為代工製造的台灣,一個可評估的商機,其中5G NR開放的頻段,也讓新加入的開發商,有很大的測試/發展新商品的空間。

O-RAN技術可評估特點-

  1. RAN Disaggregation (RAN解藕)
  2. Funtional Split(功能切割)
  3. Multivendor(多供應商)
  4. 技術評估-Fronthaul需要的頻寬 VS. RU實施 VS. 功能擴展性與廠商互通性
  5. 可以使用AI機器學習的部分-RIC元件,布署機器學習模型,及時偵測網路負載,於離線閉合迴路進行資源的調整配置,提高資源有效利用率並可改善用戶體驗

 

小基站 / 無線接取 – 5G JUMP教學影片學習資源

  1. 5G / 5GNR入門
  2. 5G基地台白盒化技術剖析
  3. 5G NR 實體層技術與規範
  4. 5G NR 基站端測試

資料來源-https://www.5g-jump.org.tw/

 

三、SDN / NFV

關於SDN / NFV的二三事-

  1. SDN通訊網路元件的CP中心化管理,透過southbound AP進行UP fumctions configuarion,促成CP/UP脫鉤,另外UP的功能地理位置分布不受限,基礎硬體建設與網路服務應用脫鉤。
  2. NFV架構轉換依然還在過渡中,以使用Native K8S Spec為例,尚未收斂出統一/通用的5G特性架構轉換標準。
  3. 傳統網路功能以硬體網路線的部分以網路線對接,在資料傳輸上的監聽管理相對直覺。
  4. 轉換為數台NFV虛擬機器管理時,資料傳輸上有可能在同一台硬體實現,需要更多的管理方法
  5. 實現將低延遲要求的CU之間雲端化管理,有延遲要求的部分則按照各廠商設備與天線處理。

 

SDN / NFV -5G JUMP教學影片學習資源

  1. SDN網路技術
  2. SDN網路技術與mininet實現分析
  3. SDN/NFV網路設計實務
  4. 軟體測試與管理

資料來源-https://www.5g-jump.org.tw/

 

本篇先分享到此,之後有機會再繼續分享。

5G通訊跨領域人才培育學習資源-陣列天線波束成形、5G NR小基站、SDN/NFV〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

《Arduino首次接觸就上手》新手村教學:LED燈閃爍

$
0
0

前言

《Arduino首次接觸就上手》是一套非常適合初學者的 Arduino 套件,整合了多個常用的輸出輸入元件,搭配圖形化介面很快就能完成各種趣味互動專題!本文要與您一起快速掌握 Arduino 的基礎操作,只要三大步驟:下載專屬軟體、安裝驅動程式,最後完成一個 LED 燈閃爍專案喔!

撰寫/攝影  許鈺莨
時間  30分鐘   材料表

(購買)

難度  2(滿分5)

本文

我們針對 《Arduino首次接觸就上手》已經錄製許多簡易教學影片 -> YouTube 播放清單請點我

除了這份教學之外,如果您家有小朋友的話,也可以跟著影片中的阿吉老師一起做,步驟也很清楚喔!

第一步:下載專屬軟體

請點我下載《Arduino首次接觸就上手》圖形化介面「Hangeekduino」。[注意]本軟體僅限在Windows 10/11作業系統環境下使用,Mac OS 或其他作業系統則無法使用。

請依照以下步驟操作:

1. 解壓縮下載好的檔案

2.啟動「Hangeekduino」圖形化介面

請找到執行檔 HanGeekduino.exe,顏色特別繽紛可愛的就是了!點兩下滑鼠左鍵即可啟動。

3. HangeekDuino 主畫面

成功啟動之後,這就是主畫面啦!後續再一一介紹常用功能與指令。

第二步:安裝驅動程式

請根據以下步驟來安裝驅動程式:

1.  點我下載驅動程式

2. 安裝驅動程式

按下 INSTALL,並照著指示依序安裝完成,很快就好了。

3. 連接開發板與電腦

套件有隨附一條 Micro USB線,放在盒子右側,打開即可拿出。

使用Micro USB線將 Arduino 板連接到您的電腦

4. 開啟裝置管理員

請對著左下角的”開始”圖示按右鍵,並選擇”裝置管理員”,如果找不到也可由 Windows 搜尋列直接搜尋。


 5. 確認《Arduino首次接觸就上手》之COM號

裝置管理員中,請在連接埠(COM和LPT)底下找到 [Silicon Labs CP210x…],並確認最後的 COM? 號碼,例如筆者的《Arduino首次接觸就上手》COM編號為COM7,請注意這個編號是由系統指定,您的編號不一定與筆者相同。

接下來在 HangeekDuino 中需要正確指定這個 COM 號才能順利上傳程式喔!

第三步:LED燈閃爍

回到 HangeekDuino 介面,讓我們來完成第一個範例吧

1. 選定《Arduino首次接觸就上手》COM編號

於右上角的下拉式選單設定 COM 號。需和裝置管理員所看到的COM號相同。如果裝置管理員有看到,但在 HangeekDuino 沒有看到,請重新插拔一次 USB 線試試看。

2. 撰寫控制LED燈的閃爍程式

《Arduino首次接觸就上手》的LED燈已連接到 D4 腳位,在此我們希望它一秒亮一秒暗來不斷閃爍。數位寫入指令請由 [數位I/O] 抽屜找到,延遲毫秒指令請由 [程式流程] 抽屜找到。

指令只要用滑鼠拖拉就能輕鬆完成,完成如下圖。


3. 上傳燒錄程式

確認 COM號與程式正確之後,按下紅圈處的按鈕就能上傳程式,如下圖。

4. 防火牆解除封鎖
上傳過程中,如果出現下圖,請按允許存取

5. 成功了嗎?

程式碼上傳完成後,請看看左上角的 LED 燈是否如我們所設定的來閃爍,如以下動圖。如果LED燈未能正常閃爍,請檢查連接COM號是否正確,並確認程式碼中有沒有正確設定 數位寫入指令的腳位編號為 4。

結語

恭喜您順利完成了《Arduino首次接觸就上手》的設定,也完成了第一個專案。未來還會陸續與您分享更多有趣的互動專題,敬請期待!

相關文章與資源連結

《Arduino首次接觸就上手》新手村教學:LED燈閃爍〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

RK-micro:bit 機器人 –組裝說明

$
0
0

前言

由於某所學校的客製化委託案,我們製作了 micro:bit V2 開發板搭配馬達驅動模組L298N和超音波感測器相結合,這一篇文章寫著如何組裝教學,想在課堂中使用 micro:bit 小車進行教學嗎?歡迎來電或來信洽詢~

⚡ 連絡電話:(02) 2306-2900

⚡ 電子郵件:service@robotkingdom.com.tw

後續會有另一篇文章來說明如何使用 MakeCode 圖形化介面來編寫這台小車的程式!

也歡迎參考英文版!

撰寫/攝影 楊國立撰寫 / 何卓鈞 翻譯,CAVEDU 2023 實習生
時間 1~ 2 hours  材料表
難度 3 / 5 

本文

在開始之前,先來看看這台小車的材料表:

—Micro:bit單板電腦 * 1
—L298n馬達驅動模組 * 1
—TT馬達 * 2
—超音波感測器(HC-SR04) * 1
—球狀輪 * 1
—65×15 mm 輪(與胎皮) * 2 (連接TT馬達)
—9V 有開關電池盒 * 1
—Micro:bit感測器擴展板模組 * 1
—Micro USB 傳輸線  *1
—M3*8 螺絲 * 2
—M3*12 螺絲 * 10
—M3 螺母 * 12
—M2*20 螺絲 * 4
—M2 螺母 * 4
—M3*6 塑膠間隔柱 * 10
—M3*6 塑膠螺絲 *10
—M3  塑膠螺母 * 10
—壓克力板 * 1套
—10條10p 線材

STEP 1  將前輪安裝到底板上(底板 x1,M3*8 螺絲 x2,M3 螺母 x2)(不分正反面,不擔心鎖錯面)。

STEP 2 四個(M36) 螺絲安裝到底板上(同樣是 4個M36 螺絲 )。注意:請確保它安裝在正確的方向上,螺絲的一面與球形輪子在同一側。

STEP 3  將 L298N 馬達驅動模組安裝在底板上方(注意馬達驅動模組的方向)。

STEP 4 將兩個馬達的電線、帶有開關的 9V 電池盒和 Micro USB 線連接起來:

  • 馬達 B {左側}:最左邊是黑色電線,然後右邊是紅色電線。
  • 馬達 A {右側}:最右邊是黑色電線,然後左邊是紅色電線。
  • 將 USB 的紅色電線放在最左邊的中間位置。
  • 將電池的紅色電線放在最右邊的中間位置。
  • 將所有電線的黑色電線一起放在中間。
  • 請確保按照上述指示接好所有電線。

STEP 5 將馬達安裝在側邊的壓克力板上(請注意圖片中的方向)。

STEP 6  將側面壓克力板接到底部壓克力板(注意:螺絲不要鎖太緊)。

STEP 7 將超音波感測器安裝在壓克力板上,這裡會用到兩個 M3*6 螺絲

STEP 8 將超音波感測器專用的壓克力板安裝到底部壓克力板,這裡會用到兩個 M3*12 螺絲。請注意:這片板子要裝在底部壓克力板的上方,而不是下方!

STEP 10  把 9V 電池盒放在頂部的壓克力板之間(請先打開電池盒,使其能夠放進去)

STEP 11 將 Micro USB 傳輸線小心繞出壓克力板的洞。

STEP 12 把所有電線接好,別接錯囉

STEP 13 將電線繞出壓克力板的洞,如下圖。

STEP 14  使用四個 M3*6 螺絲將頂部板固定好,如下圖。

STEP 15 將頂部壓克力板與其他元件都接好,這時可以鎖緊所有螺絲。

STEP 16 將Micro:bit感測器擴充板模組安裝在頂部壓克力板上方(注意擴充板的方向)。

STEP 17 兩個輪子分別裝上 TT 馬達的轉軸。

完成!

小車組裝完成,歡迎多多發揮 maker 精神,調整各種設定與元件配置,讓機器人更符合您的需求。後續會介紹如何使用 MakeCode 圖形化介面來編寫小車程式喔!

 

 

 

 

RK-micro:bit 機器人 – 組裝說明〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

RK-micro:bit 機器人 – 循線前進程式教學 (MakeCode)

$
0
0

前言

本文將說明如何使用 MakeCode 圖形化介面來編寫 RK-micro:bit 機器人循線前進的程式。組裝教學請點我

也歡迎參考英文版!

本範例會讓機器人運用自身前端紅外線光感測器來沿地上的黑色軌跡線 (膠帶) 前進,請參考以下影片:

作者 楊國立撰寫 / 何卓鈞 翻譯,CAVEDU 2023 實習生
時間 1~ 2 hours  材料表
難度 1 / 5 

本文

如何控制馬達與機器人的行為

RK-micro:bit小車中,兩個馬達背對背地配置,這稱為為差速驅動平台,代表機器人的行為是由這兩個馬達的方向/速度決定。

由於我們使用 L298N 馬達驅動模組來控制兩個馬達,這實際上會控制四隻腳位,每個馬達各自由兩隻腳位來控制:

  • P1, P2 – 左側馬達
  • P14, P15 – 右側馬達

首先來看看如何控制一個馬達,如果馬達旋轉方向與下表所說相反,只需把紅/黑線 (也就是正負極) 對調即可:

下表中 H 代表高電位),L 代表低電位,這可透過程式來控制。

P1 – H P1 – L
P2 – H (高電位) 煞車 (馬達轉軸因被施加電流而無法轉動) 順時鐘轉動 (正轉)
P2 – L (低電位) 逆時鐘轉動 (正轉) 無作用 (馬達轉軸可轉動)

結合兩個馬達之後,就能讓機器人跑來跑去啦!您可以進一步調整馬達的速度以對機器人有更細緻的控制。

請注意,單一顆馬達只有正反轉的概念,須由兩顆 (或以上) 的馬達配置起來才能呈現出機器人前後左右移動的效果,別搞混囉!

右側馬達 – 正轉 R右側馬達 – 反轉
左側馬達 – 正轉 機器人前進 機器人右轉
左側馬達 – 反轉 機器人左轉 機器人後退

Makecode 圖形化程式

We will use MakeCode graphical IDE to program RK-micro:bit Car. The code should be quite straight-forward and fun, enjoy! 我們將使用 MakeCode 圖形化IDE 來編寫 RK-micro:bit 小車 的程式。圖形化介面可讓您更快更輕鬆完成各種專案,當然它的功能也會比較有限。程式應該相當直觀有趣,好好享受其中樂趣吧!

STEP1:在 on start 事件中,我們宣告一個變數來控制馬達速度,並將其指定 P13P0,這就是 microbit 對應到 L298N 馬達控制模組的腳位,。

  

STEP2:forever 中的程式碼會不斷執行,也就是說它會一直循環,直到您移除 micro:bit 電源為止。

由於紅外線感測器接到 P12,當它偵測到黑色軌跡線和白色地面時,它會分別回傳 1 0。我們可以運用這個特性製作一個行走之字形路線的循跡機器人。

在影片中,可以看到機器人(實際上是紅外線感測器)是放在黑色軌跡線的左側,代表機器人將朝著右前方來右尋找黑色軌跡線。如果偵測到了黑色軌跡線,那麼它將稍微向前左移動 -> 這樣的兩階段模式會不斷重複,使得機器人可持續沿著黑色軌跡線來前進。

回到程式,當光感測器偵測黑色軌跡線(digital read pin P12 = 1)時,機器人將向右前方移動,反之則朝著左前方移動。

注意:請修改馬達參數,使您的機器人移動得更好,也更能應對各種複雜的軌跡喔!

資源

本範例完整 .hex 程式碼請由以下連結下載:

 

RK-micro:bit 機器人 – 循線前進程式教學 (MakeCode)〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

AMR ROS2光達搬運機器人 -使用NVIDIA Orin Nano-入門操作篇

$
0
0

簡介

本文是接續之前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

 

如何啟動環境

在啟動前需要先關閉MobaXterm的X11擴充功能RANDR,否則可能會遇到像是下面訊息中的XCB錯誤,修改後會要求重啟X11伺服器,按下”是”後就能開始使用

MobaXterm的X11擴充功能RANDR
QXcbConnection: XCB error: 145 (Unknown) ...

 

使用時需要先建立一個docker容器,使用docker可以保持系統環境的一致性,避免受到之前的操作影響,指令執行完成後就會進入docker環境內,開啟時會自動載入設定檔,要離開環境時輸入”exit”即可

遠端Terminal指令
./run_docker.sh

 

遇到需要在docker執行其他程式的情況時,可以開另外一個終端機,使用以下指令連接到docker環境並載入ROS2設定檔就可以正常操作

開另外一個終端機,遠端Terminal指令
./run_docker.sh
source ros_entrypoint.sh

 

如何執行遙控程式

首先要開啟docker環境,如果看到命令列最前方的使用者是root,就代表已經在docker環境內了

遠端Terminal指令
./run_docker.sh

 

接著執行有底盤操控功能的程式,這邊用最簡單的溝通程式當範例,繪製地圖與導航程式也同樣有遙控的功能,看到畫面不再跳出訊息代表已經準備好了

遠端Terminal指令
ros2 launch ugv_bringup base.launch.py

 

這時再開啟另外一個終端機連接到docker環境,並載入設定檔

開另外一個終端機,遠端Terminal指令
./run_docker.sh
source ros_entrypoint.sh

 

執行遙控程式並等待程式啟動完成後,就能夠以鍵盤輸入遙控機器人:

前進: i

後退: ,

原地左轉: j

原地右轉: l

前進左轉: u

前進右轉: o

後退左轉: m

前進左轉: .

ros2 run ugv_teleop ugv_teleop

 

如何執行地圖繪製程式

剛上面一樣要先開啟docker環境,如果看到命令列最前方的使用者是root,就代表已經在docker環境內了,不用重複執行

./run_docker.sh

 

執行地圖繪製程式,等待程式啟動完成就會跳出操作視窗

ros2 launch ugv_bringup carto.launch.py

 

這時候再開啟另外一個終端機,進到docker環境並載入設定檔

./run_docker.sh
ros2 run ugv_teleop ugv_teleop

 

執行遙控程式後,就可以操控著機器人到處繪製地圖

ros2 run ugv_teleop ugv_teleop

 

如何執行導航程式

跟上面一樣要先開啟docker環境,如果看到命令列最前方的使用者是root,就代表已經在docker環境內了,不用重複執行

./run_docker.sh

 

執行導航程式,等待程式啟動完成後就會跳出操作視窗,進行導航時請務必要關閉遙控程式,否則會影響到導航的移動

ros2 launch ugv_bringup nav2.launch.py

 

地圖介面的功能簡介

 

導航面板的功能簡介

 

如何設定導航點及路徑

首先在docker環境內執行導航程式,等待操作視窗出現

ros2 launch ugv_bringup nav2.launch.py

開啟後會處於單點導航模式,選擇設定導航點功能,然後在地圖內容上按住左鍵,這個位置代表想要移動到的座標,接著將箭頭拖曳到想要的方向,這代表最後停車時的方向,放開左鍵後車子會立刻尋找通往目標路徑開始導航移動

 

若是處於多點導航模式,放開左鍵後會留下一個標記,再次選擇設定導航點功能就能再設定下一個導航點,設定完所有的導航點後,按下導航點導航就會照著設定的導航點尋找路徑依序移動,移動完成後所有的標記點就會消失

 

如何臨時取消設定導航點

在設定多點導航模式的導航點時,如果想要取消現在已經的設定的導航點,可以先切換至單導航點導航,再點擊切換到多導航點導航,就可以重新設定導航點

 

常見問題

執行程式後沒有畫面、沒有辦法操作、機器人的動作或是程式畫面很奇怪

首先可以查看終端機上的錯誤訊息,通常會給予明確的錯誤位置,像是開啟時的參數設定錯誤、沒有讀取到光達資料或沒辦法跟底盤建立連線等,前者可以透過修改參數修正,後兩者可能是因為連線出了問題,可以檢查連接線狀態或電源是否開啟,完成後重新執行程式即可

 

程式關閉後機器人不會停下

當正在執行導航時關閉程式,會讓底盤沒有辦法接收到新的指令,此時會停留在最後一個送出的指令,這時只要再次開啟程式,就會讓底盤回到靜止狀態

 

一定要先建立地圖嗎?

跟大家在外面玩時看地圖找路一樣,機器人也是照著地圖來定位自己的位置,還有找到前往目標的路徑,雖然機器人有能力在移動時把地圖補齊,但想要機器人在導航時達到最好的效果,還是需要在道路上行走過一遍,可以使用單導航點導航或是遙控程式來移動機器人,將可能會走到的地方盡量納入地圖中,就可以放心的使用機器人的導航功能

AMR ROS2光達搬運機器人 -使用NVIDIA Orin Nano-入門操作篇〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

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

$
0
0

簡介

本文是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

那我們下篇文章再見。

 

 

AMR ROS2光達搬運機器人 -使用NVIDIA Orin Nano-進階應用篇〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

《Arduino首次接觸就上手》的進階教學 追憶鳥山明:OLED螢幕上的經典重現

$
0
0

前言

已逝的鳥山明畫家,曾畫出許多知名的漫畫作品,如《怪博士與機器娃娃》和《七龍珠》…等,而這些作品深深著影響著我們,並陪伴著我們長大,變成我們的童年回憶。

本篇文章,要在Arduino 首次接觸就上手的OLED螢幕中,重現鳥山明的經典作品。從基礎的圖像處理到數據轉換,到最終的OLED顯示技術,我們將一步步引導你完成這個有趣的項目。

如果是新手或初學者想要知道有關《Arduino首次接觸就上手》基本操作的相關文章,可以移駕到

撰寫/攝影  許鈺莨
時間  30分鐘   材料表

(購買)

難度  2(滿分5)

本文

第一步:網路上下載七龍珠經典圖片

1.圖片搜尋

筆者是以Google搜尋的圖片,請輸入:七龍珠孫悟空黑白圖片。圖片不一定是七龍珠啦~讀者也可以找到喜歡的圖。但請注意,關鍵字一定要有”黑白圖片”,因為《Arduino首次接觸就上手》的OLED是單色的模組,顯示會較清楚。

 

2.開啟圖像畫面及截圖

另外要注意的一點是,OLED模組像素為128×64,顯示為長方形,所以盡量找橫向顯示的圖,如果找直向顯示的圖,如:悟空的站立圖,之後顯示會變很扁,不過可以用圖片軟體來旋轉角度。

基於很多都是悟空的站立圖,所以筆者找到顯示DRAGONBALL圖片(下方紅框處),打算用截圖出來,但在這邊截圖會變成很小。

 

所以要顯示正常大小的圖形畫面,可對圖形按右鍵>複製圖片網址

再把網址貼上網址列,就可以還原圖片大小。

 

再來截圖,可以使用Windows內建的截圖功能,Home+Shift+S三鍵一起按就可以截圖。

如下圖所示。

 

第二步:改變圖像尺寸

1.使用小畫家

檔案>開啟舊檔>開啟圖片

 

2.改變圖片尺寸

因OLED的尺寸為128×64個像素,所以必須要更改圖片像素的尺寸。

常用>調整大小

 

然後選像素,水平欄位寫128垂直欄位寫入64。另外,不要勾選維持外觀比例。

3.另存新檔

另存新檔成單色點陣圖

 

第三步:下載並安裝Image2Lcd軟體

1.下載並安裝Image2Lcd軟體

Image2Lcd是一款可將圖像轉換為LCD 顯示器格式的軟體,當然有很多種作法,只要最後可以轉換成BMP(Bitmap)格式即可。

下載Image2Lcd軟體  (請按我)

2.預覽圖像畫面

開啟圖片後,右側可以預覽圖片,有圖片旋轉及顏色反轉之功能。

3.保存為BMP檔

【注意】這裡必須要把位元組內象素數據反序勾選起來,否則OLED的圖會很破碎,再選擇保存

之後就會產生圖片的BMP格式了,再將當中的像素陣列程式寫入到Arduino程式碼當中即可。

 

 

第四步:使用Arduino IDE燒錄

要在OLED模組顯示圖形,必須要使用到U8g2lib.h的函式庫。所以只能用Arduino IDE撰寫,而HanGeekduino圖形化的OLED積木程式中,採用的是U8x8lib.h的函式庫,此函式庫只能顯示文字,而不行繪製圖形。

1.開啟程式

路徑位置在HanGeekduino\BlocklyDuino3\arduino-1.8.5

再開啟arduino.exe即可。

開啟名為Arduino_OLED.ino程式,程式連結(請按我)

 

完整程式如下

Arduino_OLED.ino
#include <Arduino.h>
#include <U8g2lib.h>

// 初始化顯示器
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE);

#define imgWidth 128
#define imgHeight 64

//可以替換第13行~第76行的陣列圖案
static const unsigned char logo_bmp[] PROGMEM =
{
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X20,0X30,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X50,0X50,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X10,0X50,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X94,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0XA0,0X8A,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X20,0X2A,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X40,0X40,0X0B,0X02,0X06,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0XC0,0X0D,0X42,0X02,0X0C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X70,0XF7,0X90,0X0C,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X80,0XFF,0X03,0XCC,0XAA,0XE3,0X11,0X30,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0XF0,0XFF,0X0F,0X92,0X48,0X05,0XF3,0X63,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X00,
0XF8,0X01,0XFE,0XF3,0XFF,0X39,0X09,0XC4,0X00,0X00,0X00,0X1F,0X00,0X00,0X00,0X00,
0X38,0X00,0X78,0X5C,0XD5,0XDF,0X55,0X84,0XFF,0X13,0X00,0X7B,0X00,0X0C,0X00,0X00,
0X18,0X00,0XF0,0XBB,0XFE,0XEF,0XBF,0X07,0X7E,0X27,0X00,0XC1,0X03,0X3C,0X00,0X00,
0X18,0X00,0X88,0XD7,0XFB,0XFF,0X3F,0X02,0X04,0X5E,0X01,0X01,0X07,0XF4,0X01,0X00,
0X18,0X00,0XE8,0X2D,0XB5,0XDF,0X2B,0X0A,0X1B,0XBA,0X03,0X01,0X0C,0X86,0X01,0X00,
0X18,0X00,0XA2,0XFB,0XFF,0X7F,0X02,0XEF,0X11,0X0C,0X81,0X01,0X18,0X86,0X01,0X00,
0X10,0X00,0X76,0X3F,0XF2,0XFF,0X03,0X21,0X35,0X5E,0X82,0X01,0X10,0X82,0X01,0X00,
0X10,0X00,0XDE,0X43,0X00,0XED,0X93,0X61,0X60,0X1A,0X9A,0X01,0XB0,0X83,0X00,0X00,
0X30,0X10,0XFD,0XC8,0X2D,0X06,0X63,0X3E,0X60,0X8C,0XE8,0X00,0X60,0X83,0X00,0X00,
0X30,0XF0,0XFF,0X70,0X80,0X07,0XE3,0XEF,0XE1,0X38,0X83,0X60,0X60,0X83,0X03,0X00,
0X30,0XF0,0X3F,0X0E,0X00,0X06,0X17,0XB0,0XFF,0X18,0XDE,0XE0,0XE1,0X83,0X07,0X00,
0X30,0X90,0X1F,0X18,0X00,0X02,0XD7,0XFF,0XE3,0XB8,0XFD,0XE0,0XC1,0XC1,0X7F,0X00,
0X20,0XB0,0X2B,0X19,0X00,0X03,0XC7,0X3F,0X80,0X8C,0XFA,0XF0,0XC1,0XC1,0X43,0X00,
0X20,0XB0,0XC7,0X18,0X00,0X03,0X87,0X27,0X80,0X07,0XDD,0XB0,0XC1,0XC1,0X41,0X00,
0X60,0XF0,0X47,0X10,0X00,0X01,0X1F,0X27,0X00,0X07,0X40,0XF0,0XC1,0XC1,0XC1,0X00,
0X60,0XE0,0X2F,0X90,0X01,0X01,0XAF,0X23,0X00,0X83,0X40,0XE0,0XE1,0XC1,0XC1,0X03,
0X60,0X60,0X21,0X70,0X87,0X11,0X86,0X23,0X02,0XBB,0X58,0X00,0XE0,0XE0,0X41,0X02,
0X60,0XE0,0X21,0X30,0X88,0X10,0X7E,0X33,0X02,0X96,0X53,0X00,0XA0,0XE0,0XC1,0X06,
0X60,0XE0,0X31,0X30,0X80,0XF0,0X7F,0XD3,0X0F,0X52,0X70,0X00,0XF0,0X20,0XC1,0X05,
0XE0,0XE1,0X3C,0X70,0XCF,0XF8,0X7F,0X9B,0X0F,0XFE,0X87,0X00,0XF0,0X21,0XC1,0X05,
0X20,0X61,0X30,0X70,0X59,0X3C,0XFA,0X8F,0X07,0XFE,0XDF,0X00,0XF8,0X21,0XC1,0X07,
0XA0,0XC1,0X38,0X70,0X73,0X3A,0XC2,0X03,0X07,0X3E,0X3C,0X01,0X18,0XF1,0XC1,0X0B,
0X40,0XC3,0X3F,0XF0,0X62,0X01,0X02,0X83,0X07,0X3E,0X6C,0X19,0X18,0XE3,0XC3,0X0B,
0X20,0XC3,0X38,0X30,0XA1,0X00,0X02,0X83,0X04,0X3E,0XFC,0X79,0X18,0X03,0XCF,0X0F,
0XA0,0XC1,0X18,0X30,0XA0,0X00,0X12,0X02,0X08,0X3A,0XFC,0X6C,0X14,0X02,0XCC,0X07,
0XA0,0XC3,0X1C,0XD0,0X31,0X00,0X7E,0X02,0X00,0X33,0XFC,0X4D,0X1A,0X02,0XCC,0X0F,
0X40,0XC2,0X1B,0X70,0X13,0X00,0XCE,0X06,0X00,0X31,0X6C,0XCD,0X19,0X02,0XCC,0X0F,
0X00,0X81,0X0C,0X58,0X12,0X02,0X86,0X05,0X80,0X21,0X7C,0X3F,0X14,0X06,0XC4,0X0F,
0X80,0X81,0X0F,0XD8,0X1B,0X3E,0X7E,0X0F,0X80,0X20,0XAC,0X3B,0X12,0X06,0XC4,0X1B,
0XA0,0X81,0X07,0XD8,0X09,0X3F,0XF6,0X1F,0XC0,0X00,0XFC,0X23,0X1C,0X0C,0XC4,0X3F,
0XA0,0X81,0X03,0X0C,0X38,0X3D,0XF6,0X3F,0X70,0X00,0XFC,0X76,0X0A,0X3C,0XC4,0X3F,
0XA0,0X01,0X00,0X0C,0XF8,0X2D,0X9E,0XFF,0X3F,0X00,0XEC,0XF5,0X2E,0XFC,0XC6,0X3F,
0XE0,0X03,0X00,0X06,0XE0,0X2D,0X1E,0XFF,0X1F,0X00,0XEC,0XE7,0X2C,0XCC,0XC7,0X37,
0XE0,0X03,0X00,0X06,0X30,0XEC,0X0F,0X0E,0X19,0X06,0XCC,0X6F,0X67,0X88,0XE3,0X37,
0XE0,0X03,0X00,0X03,0X38,0XCC,0X1F,0X38,0X19,0X04,0XCC,0X7F,0X63,0X08,0XF1,0X36,
0XE0,0X03,0X00,0X63,0X18,0X0F,0X3F,0X30,0X19,0X0C,0XD6,0XDF,0X23,0X08,0XB9,0X33,
0XE0,0X03,0X80,0X61,0X58,0X0F,0X7F,0X60,0X15,0X1C,0XF6,0XDF,0X01,0X18,0XB9,0X33,
0XC0,0X03,0XC0,0XE1,0XF0,0X1B,0XFE,0X20,0X13,0X1C,0X27,0XEF,0X00,0X98,0XFD,0X31,
0XC0,0X03,0XE0,0XF1,0XF0,0X1F,0XFC,0XA0,0X30,0XB4,0XA8,0XFF,0X00,0X90,0XF7,0X31,
0X00,0X07,0XF0,0XB1,0XF0,0X1F,0X00,0X30,0X30,0XE4,0XA3,0XFF,0X00,0XF0,0XF3,0X35,
0X00,0X06,0XBC,0XF0,0XB0,0X3F,0X00,0X10,0X30,0XE4,0X65,0XF7,0X00,0XB0,0XEE,0X3F,
0X00,0X06,0XCE,0XF0,0XF0,0X61,0X00,0X18,0X30,0X44,0XE6,0XFE,0X00,0X70,0X7F,0X1E,
0X00,0X06,0XE7,0XFF,0X61,0XE9,0X00,0X0C,0X30,0XCC,0XE1,0XFF,0XF0,0X60,0X3F,0X00,
0X00,0XC6,0X9F,0X9F,0X3F,0XC9,0X01,0X06,0XF0,0X8F,0XC7,0XFF,0XF0,0XE1,0X1F,0X00,
0X00,0XFC,0X01,0X99,0X7F,0XA9,0X83,0X03,0XF0,0X0F,0XC5,0XFB,0XF0,0XE1,0X1D,0X00,
0X00,0X7C,0X88,0X08,0X64,0X09,0XFF,0X01,0X00,0X00,0XF8,0XFF,0XDF,0XFF,0X0F,0X00,
0X00,0X1C,0X70,0X44,0X24,0X05,0X7C,0X00,0X00,0X00,0XE0,0XEB,0XBF,0XFF,0X07,0X00,
0X00,0X04,0X40,0X06,0X80,0X01,0X00,0X00,0X00,0X00,0XC0,0XB3,0X5F,0XF7,0X01,0X00,
0X00,0X00,0X80,0X23,0X42,0X00,0X00,0X00,0X00,0X00,0X80,0X43,0XFE,0X7F,0X00,0X00,
0X00,0X00,0X00,0X1C,0X11,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X21,0X0D,0X00,0X00,
};

void setup() {
u8g2.begin();
}

void loop() {
u8g2.clearBuffer(); // 清除內部記憶體
u8g2.setFont(u8g2_font_ncenB08_tr);// 設定字型
u8g2.firstPage();
do {
u8g2.drawXBMP(0, 0, imgWidth, imgHeight, logo_bmp); //繪圖
//u8g2.drawStr(0, 15, "DRAGON BALL !"); //輸出文字
} while ( u8g2.nextPage() );
u8g2.sendBuffer();

delay(1000);
}

 

 

2.上傳程式

取代像素陣列程式,即下方黃色部份,並燒錄上傳至《Arduino首次接觸就上手》

 

 

實體效果

程式上傳完成後,就會看見圖示顯示在OLED上面。

 

結語

恭喜完成了在《Arduino首次接觸就上手》的OLED模組完成進階實作,這當中建議找黑白色的圖,成功完整顯示機率才比較高。其實,OLED模組不僅可以單純的顯示文字,透過這些步驟,還可以在OLED模組中顯示想要的圖案,是不是很棒呢?

未來還有更多《Arduino首次接觸就上手》的主題喔,敬請各位讀者期待,我們下次見!

 

相關文章與資源連結

《Arduino首次接觸就上手》的進階教學 追憶鳥山明:OLED螢幕上的經典重現〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。


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

AMR ROS2光達搬運機器人-光達地圖繪製與定位(SLAM)系統設定-使用NVIDIA Orin Nano

$
0
0

簡介

本文是AMR ROS2光達搬運機器人系統設定的第二篇文章,文章內容會講解光達的設置,以及地圖繪製與定位(SLAM)的架構與參數設定。如果還沒有閱讀過之前我們部落格AMR ROS2搬運機器人文章的讀者,建議先往回閱讀之前的文章,會更容易了解文章中的內容。

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

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

 

光達設置

硬體

2D光達會按照設定順時針或逆時針方向進行掃描,因此安裝方向會影響資料的排列順序,通常在光達上會有箭頭作為標示指向前方,要按照機器人的前進方向安裝。

 

軟體(ROS2設定)

根據硬體與光達廠商提供的ROS2軟體不同,設定上也會有所差異,這邊以本隻影片中ROS2車上的LiDar為範例。

  • package: 光達的ROS2套件名稱。
  • executable: 光達的ROS2執行檔名稱。
  • name: 光達節點的名稱,用來在系統中辨識。
  • output: 節點的訊息輸出位置,使用screen會輸出到終端機上,使用log會輸出到log記錄檔中。
  • parameters: 軟體參數,內容如下:
    • product_name: 產品的名稱,用來對應不同規格的程式。
    • topic_name: 光達輸出的訊息主題名稱,之後在其他程式中會需要使用這個名稱來獲得光達資料。
    • frame_id: 光達座標轉換的名稱,之後在其他程式中會需要使用這個名稱來獲得座標轉換。
    • port_name: 與光達進行串列連接的裝置位置,根據硬體配置進行設定。
    • port_baudrate: 與光達進行串列連接的速率,根據光達型號進行設定。
    • laser_scan_dir: 光達掃描的方向,True代表逆時針,False代表順時針。
    • enable_angle_crop_func: 是否限制光達的掃瞄範圍。
    • angle_crop_min: 限制光達掃描範圍的最小值。
    • angle_crop_max: 限制光達掃描範圍的最大值。
    • bins: 設定光達資料的數量上限,超過這個數值會被移除。

 

光達里程計 – rf2o_laser_odometry

里程計是用來記錄機器人在活動中的位移及旋轉的元件,通常是使用編碼器資料來計算里程計,但如果機器人的底盤沒有安裝編碼器,可以使用光達來計算里程計,這邊使用的是rf2o_laser_odometry套件。

  • package: 里程計的ROS2套件名稱。
  • executable: 里程計的ROS2執行檔名稱。
  • parameters: 軟體參數,內容如下:
    • laser_scan_topic: 光達資料的訊息主題名稱,對應前面的光達輸出的訊息主題名稱(topic_name)。
    • odom_topic: 里程計的訊息主題名稱,之後在其他程式中會需要使用這個名稱來獲得里程計資料。
    • publish_tf: 發布地圖到里程計的座標轉換,看使用需求設定。
    • base_frame_id: 發布的座標轉換要以哪個地方為基準點,通常是base_link或是base_footprint,根據使用配置進行設定。
    • odom_frame_id: 發布的座標轉換要以哪個地方為目標,通常是odom,根據使用配置進行設定。
    • init_pose_from_topic: 初始位置的訊息主題名稱,用來設定機器人的開始位置
    • freq: 里程計的訊息的發布頻率,單位為次/每秒

 

地圖繪製與定位(SLAM)系統設定 – Cartographer

SLAM系統選擇

現在ROS2中主流的SLAM方案有兩種,各有優缺:

  • slam_toolbox
  • Cartographer

經過實際測試後,選擇了Cartographer作為目前的SLAM系統,原因如下:

  • 在僅有光達資料的環境下測試後,輸出結果較佳
  • 在長距離移動後能夠自動修正位移偏差

 

SLAM系統架構

(Cartographer演算法,圖片來自原始文件)

 

在Cartographer中,可以分成三部分:

  • 第一部分(圖左上)會對輸入資料(光達)進行處理,光達資料會先過濾掉太近與太遠的點,使用體素過濾器(Voxel Filter)合併資料點,減少需求運算量,再用適應性體素過濾器(Adaptive Voxel Filter),將光達資料分為較精細的資料與較粗糙的資料,用於後續的掃描比對。

 

  • 第二部分(圖右)是對區域進行SLAM(Local SLAM),利用光達資料進行掃描比對,再依照機器人的移動狀態,決定是否將掃描比對的結果加入子地圖(Submaps),加入固定數量的結果後,該張子地圖就建立完成,如此循環。這部分在設定中以Trajectory Builder標註。

 

  • 第三部分(圖中下)是對整個場域進行SLAM(Global SLAM),在累積一定數量的子地圖後,系統會試著達成閉環(Loop closure)的狀態,在這些子地圖間建立約束(Constraint),約束代表子地圖之間的關聯性,讓機器人可以準確地定位到現在地圖上的位置。這部分在設定中以Pose Graph標註。

 

SLAM設定 – ROS2系統端

這邊僅列出可能會使用的參數,設定中的距離單位為公尺(m)、時間單位為秒(sec)

  • map_builder = MAP_BUILDER :地圖建立的設定名稱,一般不用改。
  • trajectory_builder = TRAJECTORY_BUILDER :區域SLAM的設定名稱,一般不用改。
  • map_frame = “map” :地圖座標轉換的名稱,一般不用改。
  • tracking_frame = “base_link” :SLAM演算法追蹤的座標轉換名稱,依照接收的資料不同,需要選擇對應的座標轉換名稱,例如使用IMU時,要用IMU的座標轉換,像是imu_link這種名稱。
  • published_frame = “base_link” :地圖座標轉換的對象名稱,通常是設定為里程計(odom)或是機器人的原點(base_link)。
  • odom_frame = “odom” :里程計座標轉換的名稱,一般不用改。
  • provide_odom_frame = true :是否發布地圖到里程計的座標轉換,看使用需求設定。
  • publish_frame_projected_to_2d = false :將座標轉換限定在平面範圍(沒有俯仰、滾轉以及Z軸的移動),通常不需要。
  • use_odometry = false :是否使用里程計。
  • use_nav_sat = false :是否使用導航衛星。
  • use_landmarks = false :是否使用地標。
  • num_laser_scans = 1 :光達的數量。
  • num_multi_echo_laser_scans = 0 :多回波光達的數量。
  • num_subdivisions_per_laser_scan = 10 :每個光達掃描的細分數量,用於多回波光達。
  • num_point_clouds = 0 :點雲的數量。
  • lookup_transform_timeout_sec = 0.2 :獲取座標轉換的超時時間。
  • submap_publish_period_sec = 0.3 :子地圖的發布間隔。
  • pose_publish_period_sec = 5e-3 :姿態的發布間隔。
  • trajectory_publish_period_sec = 30e-3 :軌跡的發布間隔。
  • rangefinder_sampling_ratio = 1. :光達的採樣比率。
  • odometry_sampling_ratio = 1. :里程計的採樣比率。
  • fixed_frame_pose_sampling_ratio = 1. :GPS的採樣比率。
  • imu_sampling_ratio = 1. :IMU的採樣比率。
  • landmarks_sampling_ratio = 1. :地標的採樣比率。
  • MAP_BUILDER.use_trajectory_builder_2d = true :是否使用2D SLAM建立軌跡。

 

SLAM設定 – 區域SLAM

這邊僅列出可能會使用的參數,設定中的距離單位為公尺(m)、時間單位為秒(sec),如果沒有使用的話會套用預設值

  • TRAJECTORY_BUILDER_2D.use_imu_data = false :是否使用IMU資料。
  • TRAJECTORY_BUILDER_2D.min_range = 0.25 :光達掃描的最短距離。
  • TRAJECTORY_BUILDER_2D.max_range = 8 :光達掃描的最遠距離。
  • TRAJECTORY_BUILDER_2D.missing_data_ray_length = 12. :如果光達掃描的數值超過範圍,設定為這個數值。
  • TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 1 :接收到指定次數的光達掃描資料後進行一次掃描比對,根據光達發送資料的頻率設定。
  • TRAJECTORY_BUILDER_2D.voxel_filter_size = 0.025 :將設定距離內的光達掃描點合併,減少運算負擔。
  • TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true :使用實時相關性掃描比對,開啟後會在原來的掃描比對前多做一次實時比對,作為後續的參考位置,可以提高定位性能,但會使用更多運算資源。
  • TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) :設定對於旋轉的靈敏度,低於這個數值的結果會被捨棄。

 

SLAM設定 – 全域SLAM

這邊僅列出可能會使用的參數,設定中的距離單位為公尺(m)、時間單位為秒(sec),如果沒有使用的話會套用預設值

  • POSE_GRAPH.optimize_every_n_nodes = 90 :如果是正值,會在地圖建好之後進行閉環計算,如果有達成閉環則會按照每隔設定的數量做一次優化。
  • POSE_GRAPH.global_sampling_ratio = 0.003 :進行定位時,對軌跡取樣數量的比例。
  • POSE_GRAPH.constraint_builder.min_score = 0.65 :掃描比對的最低評分,低於這個分數的結果會被捨棄。
  • POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 :全域定位的最低評分,低於此分數則認為目前全域定位不準確。
  • POSE_GRAPH.constraint_builder.sampling_ratio = 0.3 :如果當前的約束數量與潛在可能的約束數量比值少於這個數值,代表全域SLAM的完成度不夠,就會加入一個新的約束。

 

純定位設定

如果在已經建立好場景地圖的環境下,可以選擇只使用定位功能,關閉地圖繪製功能,在設定中加入以下設定:

  • TRAJECTORY_BUILDER.pure_localization_trimmer.max_submaps_to_keep = 3 :讓系統以純定位模式運作。
  • POSE_GRAPH.optimize_every_n_nodes = 20 :在純定位時會希望獲得更多次優化後的結果,所以將該數值下調,讓優化變得更頻繁。
  • POSE_GRAPH.constraint_builder.sampling_ratio = 0.01 :進行純定位時,為了讓全域SLAM可以更快產生結果,所以將該數值下調。
  • POSE_GRAPH.global_sampling_ratio = 0.001 :進行純定位時,為了讓全域SLAM可以更快產生結果,所以將該數值下調。

 

以上就是搬運機器人上關於光達及地圖繪製與定位的設定,下一篇文章是關於ROS2導航的系統設定,敬請期待。

 

AMR ROS2光達搬運機器人-光達地圖繪製與定位(SLAM)系統設定-使用NVIDIA Orin Nano〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

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-連結點這裡

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

五、AMR ROS2光達搬運機器人-光達地圖繪製與定位(SLAM)系統設定 -使用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

 

導航系統 – Navigation2

Navigation2是ROS2中最主要在使用的導航系統,它可以應用在各式各樣的機器人上,提供感測、規劃、控制、定位、圖形化等功能,也能根據使用需求,以新增插件或是修改行為樹的方式進行功能客製化,實現使用者對於機器人自動化的要求。

導航架構

(Nav2架構,圖片來自官方文件)

在Navigation2上,主要可以分為行為樹(Behavior Tree, BT)、規劃器(Planner)、控制器(Controller)。

 

行為樹

(Nav2行為樹,圖片來自官方文件)

行為樹負責主導導航的流程,它會根據設定判斷當前的狀態,並執行對應的功能部件,例如接收到目標時交由規劃器給出大略的路徑,之後交給控制器操控機器人沿著路徑移動。在系統中預設的行為樹已經相當完善,這邊僅需要調整座標轉換的設定即可。

  • “use_sim_time”:是否使用虛擬時間,在模擬環境時使用
  • “global_frame”:設定作為基底的座標轉換,通常是map
  • “robot_frame”:設定機器人的座標轉換,通常是base_footprint或是base_link
  • “odom_topic”:設定里程計的訊息來源名稱

 

導航規劃器-規劃導航時的路徑

當使用者或其他系統給予導航系統一個目標時,規劃器會參考光達及地圖資料,根據選擇的演算法建立一條繞過障礙物,前往目的地的最短或是最佳路徑,這條路徑會作為之後控制的參考。當使用有動態避障功能的控制器時,遇到突然出現在路徑上的障礙物,規劃器會立刻規劃另一條路徑,避開新加入的障礙物。

Navfn規劃器

Navfn(Navigation Function)使用Dijkstra或A*演算法,假設機器人外型是圓形,並在加權過後的代價地圖上計算路徑。Navfn從ROS1的套件沿用而來,穩定性經過時間驗證,且設定簡單。

  • “tolerance”:影響機器人對於目標距離的可接受誤差容忍值,如果無法到達目標,但距離少於這個數值就會停止,以公尺(m)為單位
  • “use_astar”:是否使用A*演算法,如果沒有設定或是關閉就會使用Dijkstra演算法
  • “allow_unknown”:是否允許規劃路徑到地圖上未知的位置
  • “use_final_approach_orientation”:是否以路徑最後的方向作為停止點,而非依照目標的方向停止

 

Smac2D規劃器

Smac2D使用A*演算法在2D網格中的相鄰節點進行路徑搜尋,規劃出最佳路徑。

  • “tolerance”:影響機器人對於目標距離的可接受誤差容忍值,如果無法到達目標,但距離少於這個數值就會停止,以公尺(m)為單位
  • “downsample_costmap”:是否對代價地圖降採樣,壓縮代價地圖的內容
  • “downsampling_factor”:降採樣的倍率
  • “allow_unknown”:是否允許規劃路徑到地圖上未知的位置
  • “max_iterations”:搜尋路徑的最大次數,超過後會被視為無法到達
  • “max_on_approach_iterations”:在與目標距離小於可接受誤差容忍值時,搜尋路徑的最大次數
  • “max_planning_time”:規畫路徑的最大時間,以秒(s)為單位
  • “cost_travel_multiplier”:路徑移動的權重,數值愈大路徑會越偏向道路中央,以遠離障礙物
  • “use_final_approach_orientation”:是否以路徑最後的方向作為停止點,而非依照目標的方向停止
  • “smoother.max_iterations”:進行路徑平滑的最大次數
  • “smoother.w_smooth”:路徑平滑的權重
  • “smoother.w_data”:保留原始資料的權重
  • “smoother.tolerance”:結束路徑平滑的條件

 

ThetaStar規劃器

ThetaStar使用Theta*演算法,利用代價地圖計算網格節點與障礙物距離,用以規劃路徑。

  • “how_many_corners”:使用周圍八個方向或是四個方向規畫路徑,輸入值只能是4或8
  • “w_euc_cost”:路徑長度的權重,數值愈大路線會越簡潔(直線)
  • “w_traversal_cost”:移動路徑的權重,數值愈大路線會越複雜(曲線)
  • “use_final_approach_orientation”:是否以路徑最後的方向作為停止點,而非依照目標的方向停止
  • “allow_unknown”:是否允許規劃路徑到地圖上未知的位置
  • “terminal_check_interval”:在執行多少次後系統會認為導航被取消或超時

 

導航控制器-控制導航時的方向

在導航系統中,控制器會接收規劃好的路徑,按照設定好的演算法,讓機器人移動到目的地,根據控制器內演算法的不同,在行走時也會有不一樣的表現,套件中有預設三個控制器可供選擇,分別是:RPP、DWB、MPPI。

RPP控制器-單純跟隨路徑

 

RPP(Regulated Pure Pursuit)是三個控制器中最簡單的,它就只會跟著接收到的路徑移動,並在接近障礙物時減速,這個控制器就足以應付大多數環境單純,不會有動態障礙物的場景。

  • “desired_linear_vel”:可以改變機器人的直線(線性)速度
  • “rotate_to_heading_angular_vel”:可以改變機器人的旋轉(角)速度
  • “lookahead_dist”、“min_lookahead_dist”、“max_lookahead_dist”、“lookahead_time”:機器人考量的路線距離,會影響跟隨路徑的穩定性,越遠越不穩定

 

DWB控制器-動態窗口法

 

DWB(Dynamic Window approach B)是導航系統中預設的控制器,它會根據設定中機器人的移動參數,在機器人可能的移動範圍內考慮行走路線,並用障礙物以及與路徑的距離與方向等數值評估最佳路線,另外還有了動態障礙物躲避的能力。

  • “min_vel_x”、“max_vel_x”:可以改變機器人的直線(線性)速度範圍
  • “min_vel_theta”、“max_vel_theta”:可以改變機器人的旋轉(角)速度範圍
  • “min_speed_xy”、“max_speed_xy”:代表機器人最大移動速度
  • “critics”:用來評估路線的項目,下方的scale參數是各個項目的倍率

 

MPPI控制器-模型預測路徑積分

MPPI(Model Predictive Path Integral)是三個控制器中運算需求最高的,它會根據機器人的當前狀態還有之前的控制指令,加入隨機雜訊後模擬行走路線,並用障礙物距離以及與路徑的距離與方向等數值評估最佳路線,同樣也有動態障礙物躲避的能力。

  • “vx_max”、“vx_min”可以改變機器人的直線(線性)速度範圍
  • “vz_max”可以改變機器人的旋轉(角)速度上限
  • “critics”是用來評估路線的項目,每個項目都有獨立的設定
  • 各個評估項目critic裡的通用細部設定:
    • “enabled”:是否開啟
    • “cost_power”:評估時的順序
    • “cost_weight”:評估時的倍率
    • “threshold_to_consider”:距離目標多遠開始評估

 

代價地圖

代價地圖可以分為全域與區域的代價地圖,全域代價地圖用來給規劃器規劃路徑,區域代價地圖則是供給控制器操控機器人。兩者可以分開設定,它們有著相同的設定項目,因此這邊以全域代價地圖的設定為例。

  • “update_frequency”:代價地圖的更新頻率
  • “publish_frequency”:代價地圖的發布頻率
  • “global_frame”:代價地圖的座標轉換對象,通常是map
  • “robot_base_frame”:機器人的座標轉換,通常是base_footprint或base_link
  • “use_sim_time”:是否使用虛擬時間,在模擬環境時使用
  • “robot_radius”:機器人的半徑,單位是公尺(m)
  • “resolution”:代價地圖的解析度,單位是公尺(m)
  • “track_unknown_space”:是否將地圖中未確定的區域視為可行走區域
  • “transform_tolerance”:座標轉換的誤差容忍值
  • “plugins”:代價地圖的插件
  • “obstacle_layer.enabled”:是否使用障礙層
  • “obstacle_layer.scan.topic”:障礙層的資料來源名稱
  • “obstacle_layer.scan.obstacle_max_range”:障礙物偵測的最大距離
  • “obstacle_layer.scan.obstacle_min_range”:障礙物偵測的最小距離
  • “inflation_layer.cost_scaling_factor”:膨脹層的成本倍率,數值越高成本會衰減越快
  • “inflation_layer.inflation_radius”:膨脹層的範圍,單位是公尺(m)
  • “always_send_full_costmap”:每次更新代價地圖時傳送整份地圖,而不是只發送更改的部分

 

導航點跟隨-在導航點等待

先前使用過的導航點跟隨,移動到導航點後會等待一定時間後再繼續移動。

  • “use_sim_time”:是否使用虛擬時間,在模擬環境時使用
  • “loop_rate”:導航點跟隨系統的執行速率
  • “stop_on_failure”:當無法移動到下一個導航點時,是否取消後續的導航點
  • “waypoint_task_executor_plugin”:導航點跟隨的功能,這邊選用“wait_at_waypoint”
  • “wait_at_waypoint.plugin”:根據上方設定的導航點跟隨功能,選擇對應的插件
  • “wait_at_waypoint.enabled”:是否啟用插件
  • “wait_at_waypoint.waypoint_pause_duration”:抵達導航點後等待的時間

 

導航點跟隨-在導航點接收訊息

與先前使用過的導航點跟隨相比,一樣會移動到導航點,但接收到訊息後馬上開始移動,可以額外在機器人上設置一個按鈕,讓使用者可以按下按鈕發送訊息。

  • “waypoint_task_executor_plugin”:導航點跟隨的功能,這邊選用“input_at_waypoint”
  • “input_at_waypoint.plugin”:根據上方設定的導航點跟隨功能,選擇對應的插件
  • “input_at_waypoint.enabled”:是否啟用插件
  • “input_at_waypoint.timeout”:在抵達導航點後,超過這個時間沒有進行輸入,就會前往下一個導航點
  • “input_at_waypoint.input_topic”:輸入訊息來源的名稱

 

導航點跟隨-在導航點拍照

與上面的功能有些不同,在移動到導航點後,機器人會從設定好的影像訊息儲存一張圖片,可以事先設定好攝影機,再使用usb_cam發送影像訊息。

  • “waypoint_task_executor_plugin”:導航點跟隨的功能,這邊選用“photo_at_waypoint”
  • “photo_at_waypoint.plugin”:根據上方設定的導航點跟隨功能,選擇對應的插件
  • “photo_at_waypoint.enabled”:是否啟用插件
  • “photo_at_waypoint.camera_image_topic_name”:影像訊息來源的名稱
  • “photo_at_waypoint.save_images_dir”:圖片的儲存位置
  • “photo_at_waypoint.image_format”:圖片的儲存格式

 

ROS2搬運機器人的導航設定到此告一段落,未來還會有更多與ROS2相關的內容,敬請期待。

AMR ROS2光達搬運機器人-導航系統與路徑規劃設定-使用NVIDIA Orin Nano〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

NVIDIA 黃仁勳執行長在 2024 Computex 說的 NIM 是什麼?

$
0
0

NVIDIA 黃仁勳執行長在 2024 Computex 說的 NIM 是什麼?

大雨滂沱的 6/2,週日晚上的台大體育館擠滿了人,大家要來聽NVIDIA 黃仁勳執行長的 2024 Computex 專題演講,其中用了相當大的篇幅來提到 NIM,也就是 NVIDIA Inference Microservice,或稱 NVIDIA 推論微服務

根據 NIM 開發者頁面,NIM 的定義如下:

隸屬於 NVIDIA AI Enterprise,NVIDIA NIM 是一組加速推理微服務,允許組織在 NVIDIA GPU 上運行 AI 模型,無論是在雲端、資料中心、工作站或個人電腦上。使用業界標準 API,開發人員只須幾行程式碼就能部署 AI 模型。NIM 容器可以與 Kubernetes (K8s) 生態系統無缝整合,實現容器化 AI 應用的高效編排和管理。使用 NIM 可以有效加速 AI 應用的開發。

2024 Computex 談到  NIM 的影片如下 (1:47:30),先聽聽執行長怎麼說吧:

NIM – NVIDIA Inference Microservice

這張圖片展示了 NVIDIA Inference Microservice (NIM) 的架構,包含了多個組成部分,每個部分都在 AI 模型推論的不同層面上發揮關鍵作用。就讓阿吉來看圖說故事吧 (當然是有參考 NIM 開發者頁面 的啦):

讓我們由下往上說。

NVIDIA CUDA:首先,老黃在 keynote 開頭用很大的力氣在宣傳自家的 CUDA,可說是 CUDA 實現了 NVIDIA 加速運算的基礎,也是後續所有功能的可行性關鍵。

接下來各項我都整理了功能與優勢,希望幫助大家理解 NIM 的威力。大家可去搜尋各項的副標小字,會更加了解整體脈絡。左下角開始順時鐘介紹:

1. Kubernetes
功能:Kubernetes 作為容器編排系統,幫助管理和調度 NIM 中的所有服務和應用。
優勢:簡化了大規模的部署和管理,使資源的分配更加靈活高效。
2. Enterprise Management
功能:提供企業級管理功能,包括健康檢查、身份驗證、指標監控和機密管理。
優勢:確保系統的穩定運行和安全性,便於監控和維護。
3. Cloud-Native Stack
功能:包含 GPU Operator 和 Network Operator,負責管理 GPU 資源和網絡連接。
優勢:支持在雲端或本地環境中的高效部署和運行。
4. Triton Inference Server
功能:支持多框架的推論伺服器,包含 cuDNN、cuBLAS、NCCL 等加速庫。
優勢:提供高效的推理性能,支持多種模型和加速技術。
5. Industry-Standard APIs
功能:提供文字、語音、圖像和影片等標準 API 接口。
優勢:方便整合多種應用和服務,提升開發靈活性。
6. TensorRT-LLM and Triton
功能:支持大語言模型和 Triton 的記憶體最佳化、批次處理等功能。
優勢:提供高效記憶體管理和推論加速,適合大型模型的部署。
7. Optimized AI Model
功能:支持單 GPU、多 GPU 和多節點的 AI 模型最佳化。
優勢:提供從小型到大型 AI 應用的靈活支持,提升模型運行效率。
8. Customization Cache
功能: 包括 P-Tuning、LoRA 和模型權重的自定義緩存。
優勢: 支持模型的自定義和優化,滿足特定應用的需求。

NIM 立即體驗

先說結論:我有感受到 NIM 的目標就是要把東西弄得很簡單,簡單到您會覺得 “就這樣嗎?這樣就會動嗎?” 說這麼多,玩玩看就知道好不好用!

請進入 [NVIDIA NIM for Deploying Generative AI] 頁面,可以看到許多最新資訊與可用的模型,例如 meta llama3、microsoft phi-3 等等。請點選 Try Now 立即線上試玩,也可以在本地端 VSCode 這類環境來執行。

線上試玩

點選 Try Now 之後會進入 NVIDIA Build 頁面,請點選您想要體驗的模型,例如 llama3-70b-instruct,會出現以下畫面,請隨意輸入您想要與其對話的內容,例如下圖我問的是 “常見的機器人分類有哪些?“。按下 Send 之後可以看到模型回答的結果相當正確。

再次要求它用正體中文回答,也沒問題喔!

不過… 您不是只是來體驗交談式AI而已吧?那麼在本地端要如何執行呢?

本地端執行

其實在上圖的 llama3 操作畫面中的右側,就會看到立即可用的程式碼樣板,包含 Python、Node、Shell 與 Docker 等,方便您在各種情境下都能很快上手。

如果要在本地端執行,您需要申請一個 model api key (網頁上體驗則不需要),會是以 nvapi 開頭。請點選上圖中右側視窗的 Get API Key 並依序操作就可以了,會在畫面中出現這個視窗,請注意由於安全性考量,key 只會出現就這麼一次,如果忘記就要重新申請。

把申請好的 model api key 填入您的 api_key 變數,執行如下,就能看到執行結果。

讚喔!您已經順利運用 NIM 來執行所指定的模型了,例如下圖中我用的是 mixtral-8x22b。同樣的方法也適用於不同的模型,歡迎多多嘗試喔!

延伸閱讀與資料來源

NVIDIA 黃仁勳執行長在 2024 Computex 說的 NIM 是什麼?〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

東京大學松尾實驗室-使用GPT4等大型語言模型(LLM)打造可自我恢復的通用服務機器人-NVIDIA AGX ORIN

$
0
0

這次有幸可以前往在日本橫濱舉辦的IEEE ICRA(International Conference on Robotics and Automation)展覽,有許多的廠商以及學校在現場設攤,展出他們最新的設備產品以及技術研究,還有由學生以海報形式進行的研究發表,讓我們得以見識到在機器人各大領域中的最新知識,有應用在各方面的大語言模型(LLM),還有用在自動駕駛上的新技術等。在會場繁多的資訊當中,我們選出了數個具有特色的內容,在文章中將會做簡單的分享講解。

 

基於基礎模型打造可以自我恢復的通用服務機器人

 

相關深入資料連結

研究介紹:https://sites.google.com/view/srgpsr

論文網址:https://arxiv.org/abs/2309.14425

使用運算裝置:NVIDIA Jetson AGX Orin

 

這份研究是由東京大學的松尾研究室,一個專注在AI深度學習領域的團隊,於去年9月時發表。這次的成果就是將基礎模型(大型深度學習神經網路,具有適應性,例如大語言模型LLM)實際應用在機器人上,他們發表的通用服務機器人(General-Purpose Service Robot, GPSR)是一種可以應對多種不同環境與任務的機器人,使用豐田的照護機器人HSR(Human Support Robot)作為開發平台,並搭載Nvidia Jetson AGX Orin邊緣運算裝置,它可以使用安裝在上方攝影機獲取環境影像,傳入CLIP和Detic模型進行環境的辨識與分類,並透過CLIP-Fields記錄下環境的詳細資訊供後續使用。在接收到使用者的語音指令時,系統會使用Whisper將語音轉錄為文字,再交由GPT-4生成行動規劃。最後結合環境的資訊以及行動規劃給出機器人可以執行的計畫。

儘管通用型服務機器人具有高度通用性與適應性,但它也會在運行時遭遇系統失靈,這是所有機器人都會面臨的難題,研究團隊在他們的機器人上提出三個可能會遇到的情況與解決辦法:

 

1、獲得的資訊不足

當使用者的指令中缺少了執行任務必須的資訊時,機器人就會沒辦法達成使用者的要求,研究團隊設計了一個流程,讓機器人在資訊不足時,會使用GPT-4獲取常識來推斷缺失的資訊,或是向使用者對話,試著在當中取得相關資訊。

 

2、生成錯誤的計畫

機器人可能會因為轉錄過程失誤、缺乏常識或推理能力等因素,導致產生了錯誤的計畫,這時就無法繼續進行任務,研究團隊讓機器人在遇到這種情況時,向使用者提出重新敘述問題的請求,直到它可以正確的理解使用者的要求。

 

3、執行計畫時發生失誤

機器人在執行計畫時有時會因為外在或機械等因素,沒有辦法按照計畫執行,研究團隊會讓機器人利用GPT-4重新生成行動規劃,像是重新執行動作,或是利用環境資訊推斷可能的解決方案,來繼續完成使用者的要求。

 

基於這三種情況,研究團隊所提出的方法都能夠解決當下的難點,證實了他們的機器人在擁有通用性與適應性的情形下,同時還有能力可以面對任務中出現的各種失誤場景,並且在去年的RoboCup通用服務機器人競賽中獲得第二名的成績,進一步的驗證了這套方案的可行性。

 

在展覽現場,他們展示的是在場地內拾取地上的物體後,將其放到對應分類的位置上。在這看似簡單的展示中,實際上卻需要整合許多系統,首先要使用攝影機確認物體在地上的位置,讓機器人移動到可以抓取物品的位置,接著針對物體的外形控制機械手臂的抓取方向,再來根據抓起來的物件分類,移動到對應的分類位置並把物體放下。他們使用機器人系統ROS來整合機器人各部分的系統,一旁的筆電用遠端連線的方式連接到機器人上的邊緣裝置,執行範例並用螢幕上Rviz的地圖畫面顯示機器人的執行情況。

 

以上就是我們在ICRA的見聞,之後還會有數篇文章繼續分享在展覽見到的新知識,敬請期待!

東京大學松尾實驗室-使用GPT4等大型語言模型(LLM)打造可自我恢復的通用服務機器人-NVIDIA AGX ORIN〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

NVIDIA Jetson AI Lab範例:text-generation-webui

$
0
0

前言

CAVEDU 已介紹了很多 Jetson 系列平台上的視覺辨識範例,本文將介紹 NVIDIA Jetson AI Lab 的文字生成範例,並執行於 Jetson AGX Orin (32 GB) 較高規格的邊緣運算電腦。

攝影/撰寫 郭俊廷 材料表

 

時間 1小時 (看網路速度決定 docker 要下載多久)
難度 2(滿分5)

本文

NVIDIA Jetson AI Lab

首先介紹一下 NVIDIA Jetson AI Lab,本網站整理了邊緣運算裝置上可執行的各種生成式 AI 範例,幫助您更快聚焦在所需的應用情境上。

針對自家 Jetson Orin 系列都可以使用,但部分範例會因為記憶體關係可能效能不家或無法執行。至於上一代的 Jetson Nano 系列…  由於只有 4G 記憶體,所以無法執行生成式 AI 範例喔!

原廠測試可用的裝置清單:

  • Jetson AGX Orin 64GB Developer Kit 64GB
  • Jetson AGX Orin Developer Kit 32GB
  • Jetson Orin Nano Developer Kit 8GB

相關Orin系列設備,如要購買請點我或來電洽詢 (0223062900)

Jetson Orin NX 經測試後也可以執行,但有可能會有套件安裝版本等問題。總之,不管是不是找我們買的,都可以詢問相關問題喔!

下圖是 NVIDIA Jetson AI Lab到目前(2024六月)可用的相關範例,有八大項,非常豐富!

系統安裝建置

NVIDIA Jetson AI Lab 皆使用 Docker 來執行,所以個範例的執行方式相當簡易。jetson-containers 的github 都有詳細說明。

安裝指令如下:

git clone https://github.com/dusty-nv/jetson-containers

bash jetson-containers/install.sh

如果要建置容器,則需要將 Docker 設定 default-runtimenvidia,以便 NVCC 編譯器和 GPU 在docker build操作期間可用。在嘗試建置容器之前,請在 /etc/docker/daemon.json 設定檔中新增 "default-runtime": "nvidia"

sudo nano /etc/docker/daemon.json

如以下內容

{

   "runtimes": {

      "nvidia": {

         "path": "nvidia-container-runtime",

         "runtimeArgs": []

      }

   },

      "default-runtime": "nvidia"

}

原本的內容與修改後的內容如下兩圖:

然後重新啟動 Docker 服務,或重新啟動系統,才能繼續使用:

sudo systemctl restart docker

可以透過查看以下內容來確認更改docker info,應可看到 Default Runtime: nvidia 訊息,如下圖:

sudo docker info | grep 'Default Runtime'

將使用者新增至 Docker 群組

由於 Ubuntu 用戶預設帳戶不在該docker群組中,因此他們需要執行 docker 命令sudo(建置工具會在需要時自動執行此操作)。因此,在建置過程中可能會定期要求您輸入 sudo 密碼。

相反,您可以將您的使用者新增至 docker 群組,如下所示:

sudo usermod -aG docker $USER

然後關閉/重新啟動您的終端機(登出或重開機),您應該能夠執行 docker 命令(如 docker info)就不需使用sudo。

Text generation web UI

本範例將在 Jetson AGX ORIN 上執行 Text generation web UI 範例,Text generation web UI 是一個適用於大型語言模型的 Gradio Web UI。例如最熱門的 chatGPT 等交談式 AI (或對話機器人) 也是提供網頁介面來與 LLM 互動。

以下為Text generation web UI 範例使用的 Jetson 裝置

  • Jetson AGX Orin (64GB)
  • Jetson AGX Orin (32GB)
  • Jetson Orin NX (16GB)
  • Jetson Orin Nano (8GB) ⚠ (僅限於使用 7B 模型(4 位元量化))

必須運行以下版本的JetPack:JetPack 5 (L4T r35.x) JetPack 6 (L4T r36.x)

足夠的儲存空間(最好是使用NVMe SSD)。

  • 6.2GB:docker image
  • 模型:端看您所選用的模型,下載愈多當然愈占空間

本範例使用 NVIDIA JETSON AGX ORIN開發人員套件(32GB 記憶體)來操作,並且使用JetPack 5.1.2來安裝,但經測試 JetPack 6 正式版也可使用。

使用以下指令來開始執行Text generation web UI,第一次使用會先下載相關docker檔案。

jetson-containers run $(autotag text-generation-webui)

第一次使用會先下載相關docker檔案,請耐心等候

下載完畢再等一下就會執行起來,如看到以下訊息就可由本網址進入介面來操作:

http://0.0.0.0:7860。如果使用本機桌面端可以直接點選該網址

如果是使用遠端連線則需使用 http://<AGX ORIN IP>:7860

如果是第一次使用就直接問問題,會出現找不到模型無法使用 (No model is loaded! ) 等錯誤訊息。

如何下載模型

您可使用已啟動的 GUI 介面下載模型,在上方選單選擇Model (如下圖紅框所示位置)

上方欄位中找到這個模型名稱:TheBloke/Llama-2-7b-Chat-GGUF

下方檔案欄位複製以下檔案名稱:llama-2-7b-chat.Q4_K_M.gguf

這樣就能根據您的硬體及對話需求來更改下載的模型

 

模型名稱後的數字代表參數量,數字愈大效能愈好,但容量也會愈大!

下載成功會出現如下圖文字:Model successfully saved to ...

 

接著需要重新載入模型,點選左上方的重新整理(如下圖紅框處)

接著按下 Load 就能載入模型。

這款 llama-2-7b-chat.Q4_K_M.gguf模型可以讀取中文輸入,但只能回答英文。

 

成功了!之後各位可以嘗試著問問看各種問題,看看模型可以回答到甚麼程度的,之後會繼續介紹更多 NVIDIA Jetson AI Lab 相關範例與詳細操作說明。

最後,如果您使用 Jetson Orin Nano 或16G以下記憶體的裝置,請先按照以下連結來進行記憶體最佳化,因為執行NVIDIA Jetson AI Lab相關範例的時候需要用到大量記憶體。

https://www.jetson-ai-lab.com/tips_ram-optimization.html

參考資料

NVIDIA Jetson AI Lab範例:text-generation-webui〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

Google DeepMind使用大語言模型LLM提示詞來產生你的機器人操作程式碼

$
0
0

這次有幸可以前往在日本橫濱舉辦的IEEE ICRA(International Conference on Robotics and Automation)展覽,有許多的廠商以及學校在現場設攤,展出他們最新的設備產品以及技術研究,還有由學生以海報形式進行的研究發表,讓我們得以見識到在機器人各大領域中的最新知識,有應用在各方面的大語言模型(LLM),還有用在自動駕駛上的新技術等。在會場繁多的資訊當中,我們選出了數個具有特色的內容,在文章中將會做簡單的分享講解。

 

使用大語言模型與提示詞操控機器人

 

專案網址:https://robot-promptbook.github.io/

論文網址:https://openreview.net/forum?id=T8AiZj1QdN

適合的運算裝置:Nvidia Jetson AGX Orin

 

 

這份研究是由Google Deepmind發表,相信大家對Deepmind都不陌生,就是開發出圍棋人工智慧軟體AlphaGo的Google子公司。這次發表的內容是基於他們過去提出的程式碼即原則(Code as Policies),這是一種讓使用者只需要給予少量的說明,就能讓語言模型生成程式碼,用來精確操控機器人的概念。在Code as Policies之上,Deepmind精心設計了一組提示詞的配方,他們稱為PromptBook,內容包含了以下幾點:

 

  1. 一組註解用來描述機器人的構造、周遭的環境,還有一些對於機器人動作的限制,比如說機器人有幾隻機械手臂、安裝的平台能否移動、手臂的移動範圍等類似的內容。
  2. 一組註解用來描述機器人的座標系統,例如前後移動是X軸、左右移動是Y軸、上下移動是Z軸之類的,還有表達手臂上的夾爪方向訊息。
  3. 列出操控機器人可能會需要的所有API,讓語言模型知道有哪些功能可用在操作上。
  4. 數組運用到關聯思考(Chain-of-Thought)的範例,從模擬使用者要求衍生出需要進行的操作,並在每一步操作程式前附加使用該操作的原因,讓語言模型理解輸出結果時應該要有的格式。
  5. 使用者提供要求後,透過外部的程式進行物件偵測,將結果以邊界框(Bounding Box)的形式加入提示詞中。
  6. 等待語言模型生成輸出內容後,使用者給予反饋,要求其改進內容,重複進行這一步直到滿足使用者需求。

 

過去通常是透過語言模型呼叫預先訓練與編寫好的設定來執行動作,或是在生成的程式碼中運用代價地圖等方式產生動作路線,這些方法通常無法移植到其他環境,限制了系統的攜帶性(Portability)與通用性(Generalization)。研究中的PromptBook可以使用指令式提示詞(Instruction-based Prompting)、提示詞中提供的範例以及通過外部進行的物件偵測,讓語言模型產生出高複雜度的動作規劃,並且在零樣本(Zero Shot)的情況下也能結合提示詞、範例與動作API在各種環境產生可以使用的動作路線。

 

簡而言之,透過PromptBook有望可以舒緩在建立機器人系統時的最大難點,將機器人部署到各種環境時,為了要讓它在新的情境下可以更好的運作,往往都需要花費大量時間與人力,針對各種動作去做適應與調整。PromptBook中的方法使用設計好的提示詞,加上對環境中的物件進行偵測,就能直接生成適合當下環境的的動作指令,節省設定的時間。

 

這項技術或許可以結合第一篇文章中東京大學松尾實驗室的通用服務機器人,將在NVIDIA Jetson AGX Orin上透過影像生成的環境偵測資訊,以及彙整動作控制指令加入PromptBook的設定中,增進大語言模型在規劃動作上的能力,並降低錯誤產生的機率,對於PromptBook的使用者反饋也能使用Whisper語音轉文字輸入,加速整個流程的循環速度。

 

關於東京大學松尾實驗室的通用服務機器人,可以參考部落格文章:

[東京大學松尾實驗室-使用GPT4等大型語言模型(LLM)打造可自我恢復的通用服務機器人-NVIDIA AGX ORIN]

 

以上就是我們在ICRA的見聞,之後還會有數篇文章繼續分享在展覽裡面見到的新知識,敬請期待!

Google DeepMind使用大語言模型LLM提示詞來產生你的機器人操作程式碼〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。


NVIDIA 深度學習機構有哪些優質課程?英文版與正體中文版有何不同?

$
0
0

AI 時代,我如何累積好自己的實力呢?有沒有優質的教學內容呢?當然有,看過來!NVIDIA Deep Learning Institute (正體中文名稱為深度學習機構,本文後簡稱 DLI)

NVIDIA  深度學習機構

NVIDIA 深度學習機構提供豐富資源滿足各種學習需求,從學習教材到自行安排進度的課程和實際訓練,以及教育者計畫,可協助個人、團隊、組織、教育者和學生進一步瞭解人工智慧、加速運算、加速資料科學、繪圖運算和模擬等方面知識。

申請開發者帳號就送一堂 DLI 付費課程!

這…  有點過分,居然申請開發者帳號就送一堂 DLI 付費課程!

那就請點選 本連結 開始吧,也可以參考詳細說明文件。我們先不要太在意正體 / 簡體中文,先把付費課程拿到再說吧!而且很多課程就算課程名稱是中文,但課程內容還是英文的。

登入帳號之後,點選 [領取福利]

會看到一個很類似的頁面,點選 [領取我的課程]

接著會看到可選取的課程列表,還蠻多的,在此因為截圖所已沒有全部列出來。

請注意:實際上的免費 DLI 課程,需以您進行這項流程時的相關做法為準,不一定與下圖相同,皆以 NVIDIA 原廠公布為準。

請在以下頁面中選一門喜歡的吧,例如下圖中的 [[Getting Started with Deep Learning]

選好之後就會在 DLI / My Learning 頁面的 [Courses in Progress] 區塊看到這門課,我後來選了這門課 [Building Real-Time Video AI Applications]。日後可以隨時完成課程喔!happy learning !

想多上幾堂課怎麼辦?免費課程是綁定 email 來申請開發者帳號的,所以如果不想花錢的話,就只能用多幾個開發者帳號囉~

DLI 英文版與正體中文版有何不同?

DLI 英文站點 / DLI 正體中文站點。兩個網站的基本配置是一樣,但在 Self Paced Courses (可自行安排進度的訓練課程) 有個重大不同!

DLI 正體中文站點中,點選左上角的 [可自行安排進度的訓練課程],共有五個課程分類:加速運算、資料科學、深度學習、繪圖與模擬與基礎架構。點選 [深度學習] 會看到以下畫面。

點選上圖左上角 [圖神經網路入門] 的 [查看課程] 之後,會看到課程資訊,包括課程簡介、學習目標、涵蓋主題、課程大綱以及右側的課程細節,進一步說明了課程長度、價格、難易度、使用語言 (英文 etc) 、先備條件與相關課程等等。

不得不說,就算是 [可自行安排進度的訓練課程] 也是超級扎實甚至很有難度,例如本文之後會介紹到的 [Building RAG Agents with LLMs]。真的要很感謝 NVIDIA 整理出這麼好的課程喔!

重點來了!DLI 英文站點文中,一樣點選左上角的 [Self Paced Courses],居然有六個課程分類:Accelerated Computing, Data Science, Deep Learning, Generative AI/LLM, Graphics and Simulation, Infrastructure

想一想也很合理,開發課程一定是以英文最優先,後續再翻譯成其他語言。但隨著黃仁勳執行長這兩年這麼愛來台灣逛夜市,期待更多正體中文資源囉!

多了一區 [Generative AI / LLM] 正是目前最熱門的主題啊!目前有八門課程整理如下

課程名稱 (連結) 有無中文內容 課程費用 (美金) 有無電子證書
Generative AI Explained (看影片) 目前無 免費
Techniques for Improving the Effectiveness of RAG Systems 目前無 $30
Synthetic Tabular Data Generation Using Transformers 目前無 $30
Generative AI with Diffusion Models 目前無 $90
Introduction to Transformer-Based Natural Language Processing 目前無 $30
Prompt Engineering with LLaMA-2 目前無 $30
Building RAG Agents with LLMs 目前無 免費 有!
Augment your LLM Using Retrieval Augmented Generation (看影片) 目前無 免費

精彩課程介紹

DLI 課程分類可用以下幾個指標來分類:首先當然是課程分類,再來是有無證照?有無收費?請注意:付費課程也不一定有證照!

因此:目前免費的課程如下,有證照會特別列出來!CAVEDU 已多次針對免費課程進行直播,歡迎關注 CAVEDU 教育團隊 Facebook 來取得第一手資訊喔!

課程名稱 (連結) 課程分類 課程長度 (小時) 有無電子證書 備註
淺顯易懂的 CUDA 介紹 加速運算 1
使用衛星圖像進行災害風險監測 深度學習 8 有!
在 10 分鐘內構建大腦! 深度學習 10(分鐘)
Jetson Nano 上的人工智慧技術入門

Getting Started with AI on Jetson Nano 

深度學習 8 有!
在 Jetson Nano 的邊緣端建造影像人工智慧應用程式

Building Video AI Applications at the Edge on Jetson Nano 

深度學習 8 有!
優化車輛路線 深度學習 1
運用 Morpheus™ 進行數位指紋辨識 深度學習 1
在 Omniverse 中使用 Extensions 擴充進行開發、客製和發佈 繪圖和模擬 8 有!
在 Isaac Sim 中組裝簡單的機器人 繪圖和模擬 0.5
在 NVIDIA Omniverse 上為 3D 工具構建漂亮的自定義 UI 繪圖和模擬 1.5
在 NVIDIA Omniverse 上輕鬆開發進階 3D 版面工具 繪圖和模擬 1.5
如何在 NVIDIA Omniverse 上構建自定義 3D 場景操縱器工具 繪圖和模擬 1.5
使用通用場景描述 (USD) 協作 3D 工作流程 繪圖和模擬 2
Generative AI Explained Generative AI / LLM 2 只能在英文站點取得
Building RAG Agents with LLMs Generative AI / LLM 8 有! 只能在英文站點取得
Augment your LLM Using Retrieval Augmented Generation Generative AI / LLM 1 只能在英文站點取得
NVIDIA 授權系統 基礎架構 2
DOCA Flow 入門 基礎架構 2
適用於 DPU 的 DOCA 簡介 基礎架構 2
InfiniBand 必備能力課程 基礎架構 1.5
Mellanox 乙太網交換器偵錯工具 基礎架構 1
乙太網路訓練課程—產品概覽 基礎架構 1.5
RDMA over Converged Ethernet (RoCE) 全面性課程 基礎架構 1.5
運用 NVIDIA Mellanox NEO® 輕鬆管理網路 基礎架構 1
MLXlink 和 MLXcables 偵錯工具 基礎架構 0.5

就讓我們用 [Building RAG Agents with LLMs] 這門課來說明吧。點選連結之後進入課程介紹頁面,點選右下角的 Learn。如果已經登入過課成,這裡會顯示 Continue Learning

進到課程主頁,不得不說上面的黑色區塊實在是太厚了,上課還要一直上下拉動,很不方便。希望可以很快修正來提升上課體驗。

 

除了 Jetson Nano 的課程之外,其餘的課程都是以雲端虛擬機的方式來進行。有些 1 小時課程甚至會節錄 GTC 的精采議題影片,適合不同技術背景的學習者來切入。

就本課程來說,他是切成多段來進行,點選畫面中右下角的 START 就會啟動虛擬機。啟動需要時間,請耐心等候

啟動之後就會開啟 JupyterLab 頁面,請快樂學習吧。也會看到本次虛擬機可用時間與整體課程剩餘時間。請注意:免費課程的雲端虛擬機會有時數上限!如果超過就無法再用,只能換一個帳號囉。所以要注意時間,也可先下載相關檔案,減輕時間壓力。

點選右上角個人帳號的 My Learning 就會進到以下頁面,可以看到 [Courses in Progress (進行中/未完成課程)] 與 [Completed Courses (已完成課程)] 。當然如果您的課程在完成之後有電子證照的話,則可在右上角的 [Certificates] 區塊中看到。

 

最後就能取得證書,可以放上  LinkedIn 或其他可連動電子證照的平台,讓您的專業成就被更多人看見!

加入 NVIDIA 認證講師

我 (阿吉) 當初是加入 Jetson AI Certification 計劃來成為 Jetson AI Ambassador,CAVEDU 也有多位 Jetson AI 專家,提供您更多優質課程與諮詢服務。

您如果有興趣加入的話,歡迎點選以上連結來了解詳情。如果您想成為其他課程的講師,且不是和 CAVEDU 一樣聚焦在 Jetson 邊緣裝置的話,可以申請別門課。想要執教哪一門課,就要通過該門課的認證。每堂課都要考試而且不是很容易通過 (抓頭),但這樣更顯得認證講師的大氣、尊爵,不凡,對吧~

Jetson AI 專家 / 大使申請流程

您也可以先參考這裡 Teaching Kits for Educators

由下圖 (NVIDIA 認證講師清單) 可以看到我還有 [Building Transformer-Based Natural Language Processing Applications, Taiwanese]、 [Fundamentals of Deep Learning, Taiwanese] 與 [Getting Started with AI on Jetson Nano, Taiwanese] 等多門課的認證講師資格。另外根據你開課的場次數量與完成課程的人數進行排名 (好刺激),我是白金級 (Platinum) 講師 / 大使喔!

 

NVIDIA 深度學習機構有哪些優質課程?英文版與正體中文版有何不同?〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

使用 Raspberry Pi Pico W 建立雲端室內環境監測系統-Google雲端存取與LINE通知警報

$
0
0

 

攝影/撰寫 許鈺莨 材料表 Raspberry PI PICO W 感測器套件包-連結 

 

時間 1小時
難度  

2(滿分5)

 

本文使用Raspberry Pi Pico W開發板和洞洞伍材料包,會將偵測瓦斯氣體濃度,並同時監測環境中的溫度與濕度數據。所有感測器數據將自動上傳至Google Sheets雲端儲存。如果偵測到瓦斯數據超標,系統會通過LINE發送通知訊息。這一概念可靈活應用於多種場景,如家庭安全、工業環境及公司辦公空間監測等。

 

以下是家庭主婦在廚房煮飯,氣體感測器偵測瓦斯濃度的場景圖(本圖為AI生圖)。

 

感測器元件

硬體準備

首先,我們需要準備以下硬體:

  • Raspberry Pi Pico W 和擴充板
  • 氣體感測器(MQ7)
  • 溫濕度感測器 (DHT22)
  • RGB LED 模組(共陽)
  • 有緣蜂鳴器模組
  • OLED 螢幕
  • Mirco – USB 訊號線
  • 些許杜邦線

 

硬體連線圖

以下是感測器與各種模組分開接線的接線圖,下列五種可同時接線。

1、瓦斯感應器接線腳位

 

2、溫溼度感應器接線腳位

 

3、RGB LED燈接線腳位

 

4、OLED顯示器接線腳位

 

5、蜂鳴器接線腳位

 

專案流程圖

在程式一開始,會先讀取氣體和溫溼度感測器的數值,並都上傳至 Google 的雲端試算表,但如果氣體感測器(MQ7)超標,便會把警告訊息推播至LINE。

流程圖如以下所示。

 

軟體及程式下載

程式是使用採用吉哥積木Blockly F2的方式撰寫,有興趣的讀者可以到劉老師網站觀看。

 

讀者請預先將程式下載下來,因為後面需要更改程式金鑰。

程式撰寫軟體下載與其相關硬體模組說明

程式下載連結

 

雲端設置

由於以往都是使用IFTTT (If This Then That)的網路平台透過Webhook 串接的作法。但現在 Webhook 串接的作法要收費,所以目前上傳 Google試算表和LINE就分開設置。以下是設置步驟。

 

Google試算表設置

  1. 首先新增新的Google試算表,需共用給Raspberry Pi Pico W,故先按下共用。

 

  1. 並將知道連結所有人的存取權,設為編輯者。

 

  1. 要記住試算表ID工作表名稱,並分別填入試算表ID工作表名稱的積木中,如下圖所示

 

LINE設置

  1. 申請LINE Notify的權杖

可以用自己的 LINE 申請,如下圖所示。網址連結:

https://notify-bot.line.me/zh_TW/

 

  1. 發行權杖,建議個人權杖不要外洩

 

  1. 填寫權杖名稱(可自訂),然後選擇透過1對1聊天接收LINE Notify的通知群組中

最後按發行。

 

  1. 將權杖填入設定權杖積木中

 

如何在試算表中顯示圖表

  1. 全選試算表中日期時間、溫度、瓦斯溫度(即A~D欄位)

 

[註]選定的欄位都必須是數值,圖表呈現才會有變化

 

  1. 點選插入->圖表

 

  1. 圖表編輯器-> 圖表類型->折線圖

 

  1. X軸 -> 新增X軸 -> 日期時間

 

  1. 系列 -> 日期時間右側三個點 -> 移除

 

 

  1. 大功告成,可看見有數據線條的折線出現。

 

 

專題展示

可以看見數據的趨勢圖不斷隨著數據增加而改變,而瓦斯濃度超標後,就會推播到Line 訊息當中。

 

相關文章可參考

Raspberry Pi Pico W 智慧淹水偵測系統,結合 Google 試算表與 LINE 通訊軟體

Raspberry Pi Pico W 空氣品質檢測系統 — 上傳感測器數值到 Google 試算表

Raspberry Pi Pico W 與手機進行藍牙配對與無線通訊

使用 Raspberry Pi Pico W 建立雲端室內環境監測系統-Google雲端存取與LINE通知警報〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

ROS/ROS2 Autoware自動駕駛競賽F1Tenth-相關資料在這-使用NVIDIA Orin Nano

$
0
0

前言

這次有幸可以前往在日本橫濱舉辦的IEEE ICRA(International Conference on Robotics and Automation)展覽,有許多的廠商以及學校在現場設攤,展出他們最新的設備產品以及技術研究,還有由學生以海報形式進行的研究發表,讓我們得以見識到在機器人各大領域中的最新知識,有應用在各方面的大語言模型(LLM),還有用在自動駕駛上的新技術等。在會場繁多的資訊當中,我們選出了數個具有特色的內容,在文章中將會做簡單的分享講解。

 

F1Tenth自動駕駛競賽

活動網址:https://icra2024-race.f1tenth.org

專案網址:https://f1tenth.org

Github網址:https://github.com/f1tenth

使用運算裝置:Nvidia Jetson Orin Nano

 

自動駕駛是近幾年迅速竄紅的研究題目之一,有許多大型企業也有投入其中,但是對於學生或是個人而言,就顯得有點不知從何開始,那麼F1Tenth的車輛平台或許能夠成為踏入自動駕駛領域時的第一步。

圖片來源-f1tenth.org

 

F1Tenth是一個由研究者、工程師與自動駕駛愛好者組成的社群,旨在促進人們對於自動駕駛的興趣與思考能力,他們設計了一組開源的多用途車輛平台,基於該平台提供開放式課程,並且每年都會不定期地在各地舉行自動駕駛競賽,這次活動舉辦的就是2024年其中一場競賽。

圖片來源-f1tenth.org

 

車輛平台採用雙層的設計,下層是底盤:

  • 使用1:10尺寸的遙控車進行改裝
  • 無刷直流馬達
  • 鋰聚合物(Li-Po)電池

 

上層則是自動駕駛的硬體設備:

  • Nvidia Jetson Orin Nano邊緣運算設備
  • Hokuyo 10LX光達
  • ZED 2i或Realsense D455深度攝影機,或是其他網路攝影機(例如C270)
  • 馬達控制板及電源轉換板

 

F1Tenth希望參與者專注在演算法上的突破,而非一昧追求更強勁的硬體,因此在競賽時會限制車輛硬體配置,讓參賽者都能在同一起跑線上競爭,更詳細的硬體清單請看材料表BOM(Bill Of Materials):https://f1tenth.readthedocs.io/en/foxy_test/getting_started/build_car/bom.html#bill-of-materials

圖片來源-f1tenth.org

F1Tenth – Build文件:https://f1tenth.org/build.html

 

F1Tenth同時提供了完整且詳細的教學文件,從組裝與設定,到最後讓車輛可以自動駕駛,還有自動駕駛相關的知識整理可供使用者學習,以下是文件中比較重要的幾大部分:

圖片來源-f1tenth.org

F1Tenth – 組裝車體:https://f1tenth.readthedocs.io/en/foxy_test/getting_started/build_car/index.html#building-the-f1tenth-car

 

組裝交學中的每一步都有詳細的說明,照著做就能組出一台自己的F1Tenth平台。另外雖然文件上的型號還是NVIDIA Jetson NX,但目前在BOM上已經改為推薦使用大小相同,但效能增進了30倍的NVIDIA Jetson Orin Nano。

圖片來源-f1tenth.org

F1Tenth – 設定Jetson與周邊設備:https://f1tenth.readthedocs.io/en/foxy_test/getting_started/software_setup/index.html#configure-jetson-and-peripherals

 

車輛整體的系統都是建立在NVIDIA Jetson Orin Nano上,包含光達的資料處理、馬達的速度控制,並透過電腦使用WIFI遠端連線進行操作,跟我們最近發布的ROS2搬運機器人相同,對ROS2機器人有興趣的話可以從下方的連結看看我們部落格中的ROS2搬運機器人文章:https://blog.cavedu.com/?s=ROS2

圖片來源-f1tenth.org

F1Tenth – 模擬器:https://f1tenth.readthedocs.io/en/foxy_test/going_forward/simulator/index.html#f1tenth-simulator

 

另外他們也有製作模擬環境,可以連接ROS2系統,讓使用者可以在虛擬的賽道上測試車輛的參數,動圖中有顏色的小點就是光達在模擬環境中掃描到的障礙物,顏色越紅代表距離越近。

 

比賽的場地在展覽會場的其中一個角落,賽道使用塑膠風管包圍,當車輛偏離賽道時可以做為緩衝,避免損傷車體與設備,另外也比較容易收納。

 

第一天是賽前訓練,所有隊伍都會遙控車輛在賽道上跑個幾圈收集資料,在系統中把地圖建立完成,並用收集來的資料訓練自動駕駛模型,之後就開始進行調整與試跑。在這段期間每台車上都放了一個大盒子,這是因為要讓其他車輛的光達比較容易掃描到,避免發生追尾的事故。

 

第二天就開始進行資格賽,每個隊伍在指定時間內要讓車輛在賽道上不停地跑,儘量避免偏離賽道,時間結束後會以單圈最快速度與連續不停完成的圈數計分,超過一定分數就能晉級。

 

第三天則是決賽,採用單淘汰制,車輛會以一前一後的方式進行追逐,在指定時間內追上就是後追隊伍的勝利,反之,如果時間內沒有超過前車,就是前方隊伍獲勝。

 

以上就是我們在ICRA的見聞,未來如果還有機會參加類似的活動,將會繼續為大家帶來更多新知識,敬請期待!

 

相關文章

1、東京大學松尾實驗室-使用GPT4等大型語言模型(LLM)打造可自我恢復的通用服務機器人-NVIDIA AGX ORIN

2、Google DeepMind使用大語言模型LLM提示詞來產生你的機器人操作程式碼

ROS/ROS2 Autoware自動駕駛競賽F1Tenth-相關資料在這-使用NVIDIA Orin Nano〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

AMR ROS2光達搬運機器人-分段路徑規劃與即時影像串流-使用NVIDIA Orin Nano

$
0
0

簡介

本文是AMR ROS2光達搬運機器人的延伸應用分享,文章內容共有兩段。

首先是搬運機器人在遞送物品場景的改進,結合之前提及的導航點插件,可以加速運送的流程。

再來是在搬運機器人上使用新安裝的StereoLabs ZED 2i深度影像攝影機,透過ROS2傳送影像訊息,讓遠端能夠查看機器人的即時畫面,也能提供後續有關影像的應用使用。

如果還沒有閱讀過之前部落格中AMR ROS2搬運機器人文章的讀者,可以先往回閱讀之前的文章,會更容易了解文章中的內容:

AMR ROS2光達搬運機器人-使用NVIDIA Orin Nano系列文章清單-連結點這裡

 

攝影/撰寫 楊子賢 材料表 RK-AMR ROS2 光達搬運機器人

場地圍牆

筆電電腦 (連入 ROS2 搬運機器人 編寫程式)

 

時間 1小時
難度 3(滿分5)

 

軟硬體背景

NVIDIA Jetson Orin Nano

StereoLabs ZED 2i

Jetpack 5.1.1

L4T 35.3.1

Ubuntu 20.04 LTS

 

遞送物品場景改進實作

原先的設定中,抵達導航點後會停留一個固定的時間,如下圖左側紅色區塊的流程,這樣在運送少量物品時會花費過多時間等待,運送的物品較多時也會讓使用者來不及取下或放上貨物。

 

在之前的導航系統設定的文章中,有提到一個在導航點接收訊息的插件,配合程式處理按鈕輸入並轉換為ROS2訊息,使用者在操作完畢後按下按鈕,就能讓機器人直接前往下一個導航點,如果忘記按鈕的話,也會在一定時間後繼續下一段導航。

 

如果想要知道其他有關導航設定的詳細內容,可以參考部落格文章:

[AMR ROS2光達搬運機器人-導航系統與路徑規劃設定-使用NVIDIA Orin Nano]

 

下圖是改進前後的流程差異,多了一個使用者輸入的功能:

 

首先要修改導航系統的插件設定,將原本的在導航點等待時間(WaitAtWaypoint)改為等待輸入(InputAtWaypoint),並設定等待超時的時間與之後要接收的ROS2訊息主題名稱

 

接著要建立一個套件處理按鈕的功能,這邊使用Jetson.GPIO來讀取GPIO的數值,當按鈕被按下後,就會發送一個名為button_pushed的ROS2訊息,通知導航系統繼續前進到下一個導航點

 

然後要在車上安裝輸入裝置,這邊使用麵包板配置臨時的線路,連接到Orin Nano上的40PIN GPIO針腳,當按鈕按下時,訊號輸入的電位會改變,就能夠在程式中進行判斷並發送訊息給導航系統

 

最後開啟導航系統與按鈕套件,執行一次導航點導航,測試設定是否正確

 

這個功能也可以結合影像辨識等AI模型,取代按鈕輸入方式,例如偵測到使用者離開,機器人就繼續開往下一個導航點之類的功能。

 

在ROS2上使用ZED深度影像攝影機傳送影像

這次使用的攝影機是StereoLabs的ZED 2i深度影像攝影機,StereoLabs有為ZED系列深度影像攝影機建立ROS2專用的套件程式,另外ZED的軟體開發套件(SDK, Software Development Kit)對於NVIDIA Jetson Orin系列以及最近推出的Jetpack 6都有提供完整的支援。

 

ZED軟體開發套件:https://www.stereolabs.com/developers/release

ZED ROS2套件 – zed-ros2-wrapper:https://github.com/stereolabs/zed-ros2-wrapper

 

這裡選擇利用套件中提供的ZED攝影機專用Docker容器,容器建立完成後,裡面就已經安裝好軟體開發套件以及ROS2套件,並設定好環境,立刻就可以開始使用。

使用Docker來部署程式環境已經是一種趨勢,可以省下許多繁瑣的設定過程,最近NVIDIA推出的NIM(NVIDIA Inference Microservice)也採用了Docker容器進行本地部署,只需要一行指令就能完成部署。想知道NVIDIA NIM有哪些特色,以及它能夠做什麼事情,可以看看部落格文章:

[NVIDIA 黃仁勳執行長在 2024 Computex 說的 NIM 是什麼?]

 

套件會發布攝影機左右鏡頭的影像、計算出來的深度影像、IMU資料、攝影機的狀態等訊息,系統的大略架構會如下圖中所示。

 

首先要將ZED ROS2套件下載到Orin Nano上,指令中的–recursive相當重要,它會幫我們把Github上關聯的程式也一起下載下來,就不用自己再去下載了

cd ~ && \

git clone  --recursive https://github.com/stereolabs/zed-ros2-wrapper.git && \

ls

 

接著進到剛才下載的套件資料夾中的docker資料夾,可以看到裡面有給不同架構電腦使用的Dockerfile以及建立Docker映像檔使用的腳本

cd ~/zed-ros2-wrapper/docker && \

ls

 

建立Docker映像檔前,要先把Dockerfile裡面的Image版本改成humble-desktop,這樣才可以使用Rviz顯示畫面,還有加入顯示結果用的範例zed-ros2-example,改完後按Ctrl+S儲存,再按Ctrl+X離開即可

nano Dockerfile.l4t-humble

 

修改完成後,就可以使用腳本建立Docker映像檔,使用時要在後方輸入L4T與ZED SDK版本,建立過程大概需要20分鐘

./jetson_build_dockerfile_from_sdk_and_l4T_version.sh l4t-r35.3.1 zedsdk4.1.2

 

映像檔建立完成後,就可以接上ZED攝影機,開啟Docker容器

docker run --runtime nvidia -it --rm --privileged --network=host \

  --ipc=host --pid=host \

  -e NVIDIA_DRIVER_CAPABILITIES=all \

  -e DISPLAY \

  -v /dev:/dev \

  -v /tmp/.X11-unix/:/tmp/.X11-unix \

  -v $HOME/.Xauthority:/root/.Xauthority \

  -v ${HOME}/zed_docker_ai/:/usr/local/zed/resources/ \

  -name zed_container \

  zed_ros2_l4t_image:latest

 

最後使用範例程式測試是否正常運作,執行後會開啟Rviz視窗,並顯示平面影像、深度影像與點雲

ros2 launch zed_display_rviz2 display_zed_cam.launch.py camera_model:=zed2i

 

ZED ROS2套件會發布相機的各種訊息,像是左右鏡頭的灰階與彩色影像、

、合成深度影像與點雲、相機上的IMU資料等,都可以透過訂閱訊息的方式取得內容

 

這樣算是在ROS2搬運機器人上進行AI人工智慧應用的第一步,之後會將結合以上內容,延伸到更進階的功能,敬請期待。

AMR ROS2光達搬運機器人-分段路徑規劃與即時影像串流-使用NVIDIA Orin Nano〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

AMR ROS2光達搬運機器人-AI即時影像推論Jetson Inference-使用NVIDIA Orin Nano

$
0
0

簡介

本文是AMR ROS2光達搬運機器人的延伸應用分享,延續上一篇完成的ZED深度攝影機設定,利用擷取到的影像在機器人上執行深度學習推論,我們使用Jetson Inference專案結合ROS2,讓機器人在移動時也能夠進行影像辨識、物件偵測等深度學習應用。

如果還沒有閱讀過上一篇文章,以及之前部落格中AMR ROS2搬運機器人系列文章的讀者,可以看看之前的文章,會更容易了解這篇所要分享的內容:

AMR ROS2光達搬運機器人-分段路徑規劃與即時影像串流-使用NVIDIA Orin Nano-連結點這裡

AMR ROS2光達搬運機器人-使用NVIDIA Orin Nano系列文章清單-連結點這裡

 

攝影/撰寫 楊子賢 材料表 RK-AMR ROS2 光達搬運機器人

場地圍牆

筆電電腦 (連入 ROS2 搬運機器人 編寫程式)

 

時間 1小時
難度 3(滿分5)

 

軟硬體背景

NVIDIA Jetson Orin Nano

StereoLabs ZED 2i

Jetpack 5.1.1

L4T 35.3.1

Ubuntu 20.04 LTS

 

在ROS2上執行深度學習專案

有了上一篇文章中設定好的影像來源後,就能開始進行有關影像的深度學習推論,這邊使用Jetson Inference的ROS2套件ros_deep_learning,它提供了影像辨識imagenet、物件偵測detectnet以及圖像分割segnet三個不同的推論選項。

Jetson Inference:https://github.com/dusty-nv/jetson-inference

Jetson Inference ROS2套件 – ros_deep_learning:

https://github.com/dusty-nv/ros_deep_learning

 

ros_deep_learning套件會使用從ZED套件發送的ROS2影像訊息獲得用來辨識的圖像,完成推論後再將結果以ROS2訊息傳送出來,接著就能在Rviz上看到辨識完成的結果。

 

平時使用Jetson Inference時會直接使用攝影機作為來源,並且直接將結果輸出到外接螢幕上,但在機器人上運行時,因為使用了CUDA與OpenGL,無法傳送辨識完成的畫面至遠端的電腦上,所以使用ROS2訊息作為輸出方式,這樣只要在同一個網域下,使用Rviz就能接收到來自ZED深度攝影機的影像,還有來自Jetson Inference的辨識結果。

 

在開始操作前,要先開一個新的終端機,把ZED的Docker容器打開,並執行ZED ROS2套件,發送影像到ROS2系統中,記得不要把Rviz的視窗關掉,等一下會用它來看Jetson Inference的辨識結果

docker run --runtime nvidia -it --rm --privileged --network=host \

  --ipc=host --pid=host \

  -e NVIDIA_DRIVER_CAPABILITIES=all \

  -e DISPLAY \

  -v /dev:/dev \

  -v /tmp/.X11-unix/:/tmp/.X11-unix \

  -v $HOME/.Xauthority:/root/.Xauthority \

  -v ${HOME}/zed_docker_ai/:/usr/local/zed/resources/ \

  -name zed_container \

  zed_ros2_l4t_image:latest




ros2 launch zed_display_rviz2 display_zed_cam.launch.py camera_model:=zed2i

 

跟ZED ROS2套件一樣,首先要將Jetson Inference下載到Orin Nano上,同樣會用到–recursive指令,把關聯的程式也一起下載下來,Jetson Inference的檔案較多,會花一點時間

cd ~ && \

git clone  --recursive https://github.com/dusty-nv/jetson-inference.git && \

ls

 

再來要開啟Jetson Inference的Docker容器,因為作者尚未更新映像檔的名稱,所以要手動指定現在使用的版本,執行之後會自動下載映像檔

cd ~/jetson-inference && \

docker/run.sh --container dustynv/ros:humble-pytorch-l4t-r35.3.1

 

在ROS2上執行影像辨識

進到Docker容器內後,就可以執行Jetson Inference的ROS2套件,第一個是影像辨識imagenet,預設使用googlenet模型,第一次執行會下載模型並對模型進行優化,大概需要數分鐘,開始執行後就會輸出辨識的結果

ros2 run ros_deep_learning imagenet --ros-args -r /imagenet/image_in:=/zed/zed_node/rgb/image_rect_color

 

回到前面在ZED容器開啟的Rviz視窗,在左邊的Display區域中找到ROI Mask,把裡面的Topic改成/imagenet/overlay

 

接著就能在右上角看到Jetson Inference的輸出影像,影像左上角會有辨識的結果,包含代表結果可信度的信心指數百分比,與辨識出來的分類類別

 

在ROS2上執行物件偵測

第二個是物件偵測detectnet,預設使用ssd-mobilenet-v2模型,第一次執行也會下載模型並對模型進行優化,會花費數分鐘,開始執行後就會輸出偵測的結果

ros2 run ros_deep_learning detectnet --ros-args -r /detectnet/image_in:=/zed/zed_node/rgb/image_rect_color

 

回到前面在ZED容器開啟的Rviz視窗,在左邊的Display區域中找到ROI Mask,把裡面的Topic改成/detectnet/overlay

 

接著就能在右上角看到Jetson Inference的偵測結果影像,影像中會將辨識到的物體框出,並標示信心指數百分比與辨識出來的分類類別

 

 

在ROS2上執行圖像分割

第三個是圖像分割segnet,預設使用fcn-resnet18-cityscapes-1024×512模型,第一次執行也會下載模型並對模型進行優化,會花費數分鐘

ros2 run ros_deep_learning segnet --ros-args -r /segnet/image_in:=/zed/zed_node/rgb/image_rect_color

 

回到前面在ZED容器開啟的Rviz視窗,在左邊的Display區域中找到ROI Mask,把裡面的Topic改成/segnet/overlay

 

接著就能在右上角看到Jetson Inference的推論結果影像,影像中會使用顏色標記區域內的物體種類

 

這些算是一些基礎的AI人工智慧應用,之後會結合前面提到的各種功能,在ROS2搬運機器人上做出一些更為實際的應用,敬請期待。

AMR ROS2光達搬運機器人-AI即時影像推論Jetson Inference-使用NVIDIA Orin Nano〉這篇文章最早發佈於《CAVEDU教育團隊技術部落格》。

Viewing all 678 articles
Browse latest View live