教你運用威盛Pixetto的AprilTag辨識功能來控制自動小車

這次的活動內容中,我們要示範如何用威盛Pixetto和一個Arduino板,並用AprilTag辨識功能來控制一台自動小車。

共包含四個步驟:連接威盛Pixetto和PC,設定威盛Pixetto以及用Grove連接器把它連到Arduino 板,以程式積木編輯威盛Pixetto的程式,和把程式上傳到安裝於自動小車的Arduino板上。

步驟 1

用Micro USB線將威盛Pixetto連接至電腦。

步驟 2

點擊下方連結下載AprilTag 16H5 圖檔,並將其列印出來
http://cdn.viaembedded.com/Pixetto/Demo/AprilTags.pdf

點擊下方連結下載Arduino程式庫壓縮檔 “SmartSensor.zip” http://mls.pixetto.ai/files/SmartSensor-1.0.9.zip

步驟 3

打開Pixetto Utility應用程式,將「功能」設定為「AprilTag(16h5)」並訓練威盛Pixetto鏡頭辨識列印出來的AprilTag。

訓練完畢記得關閉Pixetto Utility。

步驟 4

連接威盛Pixetto和自動小車。

第一,你需要連接Grove和威盛Pixetto感測器。

用Grove連接線將Grove線連接至威盛Pixetto。

確認Grove線連至擴充板且擴充板已連至Arduino開發板。
將原本連接著威盛Pixetto的Micro USB線拔除,並改為連接電腦與自動小車上的Arduino開發板。

步驟 5

如果還沒安裝Arduino IDE,請先去Arduino 官網下載。 https://www.arduino.cc/en/main/software

打開Arduino IDE

在上方工具列中,選擇「草稿碼」並在列表中點選「匯入程式庫」接著選擇「加入 .zip程式庫」。

在彈出視窗中,選擇先前下載好的SmartSensor程式庫壓縮檔。

接著在上方工具條中選擇「工具」,在「序列埠」中選擇有顯示Arduino開發板名稱的序列埠。例如:COM 7 (Arduino UNO)

現在我們可以開始撰寫程式了!

步驟 6

首先,要匯入這個程式會用到的程式庫。

SmartSensor.h 是用來使用Pixetto 鏡頭回傳的數據。

Servo.h 是用來控制伺服馬達的內建程式庫。

現在我們要來創建個全域變數 。

• focal_length:型態 float,代表威盛Pixetto鏡頭的焦距 (單位: pixel),賦值為43。
• real_diag:型態 float,代表AprilTag 的實際對角線長度。請測量列印來的AprilTag 的邊長(單位:公分) 並乘與根號二來計算對角線長度。
• cam_diag:型態 float,代表通過威盛Pixetto鏡頭成像的AprilTag的對角線長度 (單位: pixel)。
• dist:型態 float,代表自動小車上的威盛Pixetto鏡頭與實際AprilTag 的距離(單位:公分)。
• lt_bool:型態 bool,賦值為 false。

指定管腳 0 和 1 將 Arduino 開發板與威盛 Pixetto 連接,並在 setup 函式裡面
將其初始化。
接著,宣告一個Servo型態的變數來控制伺服馬達,並在 setup 函式裡面將完成對

其的設置。

• attach 函式後面的數字是依照伺服馬達連接的 Grove 接口編號 (例如:D9)。
• 在程式開始時,將伺服馬達轉向90度讓無人車前輪面向正前方。

接著,讓自動小車以50的速度開始前行。

步驟 7

接著,我們要來撰寫 loop 函式中的程式。

利用一個 if 條件式來確認威盛Pixetto有識別到 AprilTag,再來我們要賦值給兩個之前定義的變數利用威盛Pixetto回傳關於識別對象的資訊。

變數 diag 代表 AprilTag 經威盛Pixetto 鏡頭成像的對角線長度,因此運用偵測到 AprilTag 的邊長以及計算對角線的公式可以計算出成像的對角像長度。

利用剛剛的計算出來的成像的對角像長度以及已知的 AprilTag 實際大小與威盛Pixetto焦距來計算目前偵測到的 ArilTag 跟鏡頭的距離。

接著,在上面兩行的賦值中下方加入控制自動小車的速度,讓速度維持在50。

步驟 8

現在,我們要讓自動小車在威盛Pixetto辨識到特定編號的 AprilTag 時,做出指定動作:停止,右轉,左轉。

因此會需要三個情況條件式,利用一個 if 條件式跟兩個 else if 條件式來確認三
個特定的編號。

如果要讓自動小車在編號 0 的 AprilTag 前 30 公分處停止的話,只要運用兩個簡單 if 條件式。

辨識對象的編號,也就是 AprilTag 的編號等於 0 的話,自動小車將會在與 tag 的距離小於 30 公分將馬達的轉速設為 0。

如果要讓自動小車在編號 1 的 AprilTag 前進行右轉的話, 需要運用到一個 if 條件式以及變數 turn_bool。

turn_bool 可以讓自動小車在每次辨識到編號 1 的 AprilTag 時,進行一次右轉而不會重複執行。

turn_bool 初始的值為 false,當自動小車辨識到編號 1 的 AprilTag 且距離小於 60 公分時,確認turn_bool 為 false (自動小車已無右轉動作)。將 turn_bool 設為 true 並開始右轉。直到自動小車轉回直行時,再將 turn_bool 設回 false, 等待下次右轉。

以上執行轉彎的距離,角度以及持續時間需要依照每台自動小車進行調整。

讓自動小車在辨識到編號 2 的AprilTag 前進行左轉需要的程式跟上一個步驟右轉時類似,只需要將if 條件式裡確認的編號換成 2 以及角度 125 換成 35度。

以上執行轉彎的距離,角度以及持續時間需要依照每台自動小車進行調整。

最後在確認威盛Pixetto是否有辨識到對像的 if 條件式下方加上一個 else 條件式,讓turn_bool 在else 條件式中重置回false並讓自動小車直行。

這樣我們就完成程式編輯的部分了!

最後,點擊Arduino IDE左上角的箭頭符號上傳按鈕,將寫好的程式上傳到自動小車上的Arduino開發板。

等到顯示儲存完畢後,就可以開始測試自動小車啦!

找一個適當的場地,將編號0到2的AprilTag擺設在你希望自動小車轉彎以及停止的位置,就可以讓自動小車依照你設計好的路線行駛!

恭喜您完成了!
如果想要增加自動小車的功能,可以利用上面的邏輯和程式來讓它做到轉彎與停止以外的動作。


祝您玩得愉快,別忘了分享自己的創作至社群並標註 #VIAPixetto!

分享貼文!

Share on linkedin
Share on twitter
Share on facebook

Leave a Reply