在NVIDIA Jetson Nano上實現JetBot AI自駕車專案-02控制移動篇

*本文由RS components 贊助發表,轉載自DesignSpark部落格原文連結

作者/攝影 郭俊廷、蔡雨錡
難度

★★★☆☆

所需時間 2小時

 

一、介紹

首先來看看我們移動的影片及操作時的照片

JetBot網頁控制車子移動影片

接著介紹我們使用的DFRobot馬達驅動板,因為我們程式裡寫好各個馬達接線對應的腳位,請按照以下腳位接在相對應的位子,JetBot才會朝正確的方向移動。

以下是DFRobot馬達驅動板跟馬達接線表還有圖片。

  馬達                 DFRobot驅動板
左馬達紅線 M1-
左馬達黑線 M1+
右馬達紅線 M2+
右馬達黑線 M2-

DFRobot馬達驅動板跟馬達接線表

DFRobot驅動板接線圖

 

二、JetBot範例介紹基本移動

首先進入JupyterLab的網址是http://<jetbot_ip_address>:8888

點選左邊的路徑”Home > Notebooks可以看到我們JetBot的範例都在這邊。

有基本移動、避開障礙物、目標跟隨、道路跟隨、搖桿控制。

 

今天我們要來介紹Basic Motion跟teleoperation的功能。

Basic Motion的功能是車子操作基本移動的範例。

teleoperation的功能是使用搖桿來控制車子。

 

接下來會介紹部分程式碼所代表的意思跟功能。

首先點選左邊的路徑”Home > Notebooks > basic_motion > basic_motion.ipynb”,就能打開JupyterLab的Basic Motion畫面。

Basic Motion畫面

在JupyterLab中每一段執行的程式碼的地方我們都稱為一個區塊(Cell),區塊的執行順序通常都由第一個執行到最後一個。

在JupyterLab中執行程式碼的方式為點選程式碼區塊,然後按下快捷鍵”Shift+Enter”,或上面RUN的按鈕來執行程式,執行中的區塊會顯示*號。當執行過該區塊程式即會在該區塊前顯示執行順序的數字。

RUN的按鈕位置與執行的區塊如上圖紅色框框所示

執行中的區塊會顯示*號

 

首先這兩個區塊先宣告我們使用到的參數 Robot

並且定義馬達驅動板的參數,不同的馬達驅動板有不同的參數。

 

如果是使用我們DFrobot馬達驅動板需要改成以下參數

robot = Robot(driver_board="dfrobot")

 

如果是使用Adafruit的馬達驅動板,並且使用官方預設的函式庫,使用預設的程式即可

robot = Robot()

如果馬達驅動板沒有問題可以看到以下執行結果:

board begin success

執行程式碼之後車子輪胎會開始移動所以需先抬高車身讓車子輪胎懸空,避免車子撞到或摔落至地板(如下圖)

當您執行到第3個區塊時,應該就可以看到馬達開始動了,以30%的速度向左轉,如果沒有,請確認一下馬達驅動板有沒有接上電或者是馬達驅動板跟馬達接線是否有正確接好。

robot.left(speed=0.3)

這裡的speed=0.3 就是車子移動速度的百分比,可以依照你想要的速度修改數值

執行到第4個robot.stop()區塊時車子才會停止

第5個區塊使用 import time 宣告時間參數

第6個區塊預設的範例是讓車子左轉30%的速度,執行0.5秒後停止。可以依照自己想要的移動跟時間跟速度修改數值。

robot.left(0.3)       車子左轉30%的速度

time.sleep(0.5)     執行0.5秒

robot.stop()          車子停止

執行第7第8個區塊是一樣的移動方式,但有不同的寫法,以下介紹兩種不同的寫法。

分別都是以左馬達30%的速度前進,右馬達60%的速度前進移動車子一秒這樣車子就會朝左拱形移動一秒。

 

第7個區塊的寫法

robot.set_motors(0.3, 0.6)   車子左馬達30%的速度前進、右馬達60%的速度前進

time.sleep(1.0)                     執行1秒

robot.stop()                          車子停止

 

第8個區塊的寫法

robot.left_motor.value = 0.3       車子左馬達30%的速度前進

robot.right_motor.value = 0.6     右馬達60%的速度前進

time.sleep(1.0)                           執行1秒

robot.left_motor.value = 0.0       車子左馬達停止

robot.right_motor.value = 0.0     車子右馬達停止

第9個區塊是建立一個滑桿,用來控制左右馬達,移動速度的數值由-1到1。

第10個區塊會把上面的滑桿真正連結到馬達中,這時候才可以透過滑桿來控制馬達速度。

 

執行到第10個區塊時,就可以回到第9個區塊去拉動滑桿,看看能否用滑桿來分別控制兩個馬達的馬力以及正反轉。

執行到第12個區塊時,會解除滑桿的連結,這時候改變滑桿的數值馬達的轉速就不會跟著改變。

接著是第14個區塊是建立出一個移動的控制視窗,有前、後、左、右跟停止。

第15個區塊是定義前、後、左、右、停止所執行的動作。

第16個區塊是連結各個按鈕所對應到的動作。

所以執行到第16個區塊時,就可以回到第14個區塊去點選按鈕,看看能否透過按鍵來控制馬達的行為,如果前後左右控制都對代表馬達接線正常,基本移動功能正常,不正常移動則檢查接線有無脫落或接線有無錯誤。

創建移動的控制視窗

定義按鈕、按鈕功能連結

以下是我們實際操作的影片:

以上我們基本移動的介紹就在這裡告一段落。

 

注意:

執行完一個檔案的功能之後記得關閉kernel和使用視窗

  1. 點選正在使用的視窗上的叉叉
  2. 點選左邊目錄第二個選項的人離開的圖案
  3. 按SHUTDOWN關閉正在使用的所有kernel才可執行下一個檔案

接下來執行完每個檔案都要這樣做,才不會導致各個執行序互相衝突。

關閉kernel之步驟

 

三、JetBot範例介紹搖桿移動

關閉完Basic Motion的kernel之後

我們來介紹Teleoperation,也就是用搖桿控制車子的功能。

首先點選左邊的路徑”Home > Notebooks > teleoperation > teleoperation.ipynb”,就能打開以下的JupyterLab的Teleoperation畫面。

我們使用Logitech F710 無線遊戲控制器來當作我們的控制器,搖桿部分沒有特別規定型號有線無線都可以,只要支援HTML5 Gamepad的搖桿皆可使用,把接受器或USB插入電腦中即可使用。

進入以下html5gamepad網址檢查搖桿可無使用並查看INDEX的數字是多少,目前我使用的Logitech F710所得到的INDEX是1。

之後需要填入相對應的地方,搖桿才能正常使用控制車子。

http://html5gamepad.com

第1個區塊是定義使用元件,定義搖桿的index,還有顯示搖桿的對應的數字。

按下任何按鈕即可偵測到搖桿,搖桿上每個按鈕都有對應的號碼。例如我的左搖桿往前後時對應的是滑桿1,右搖桿往前後時對應的是滑桿3,按鈕下對應的是13。之後程式有用到的時候只要改變對應的數字就可以使該數字執行相對應的功能。

在下面這一段程式碼index=1的部分這裡要依照你們剛剛網頁取得的INDEX來填入,預設是1,我們得到的是0所以需要把INDEX的數值改成0。(如下圖紅框處)

controller = widgets.Controller(index=1)  # replace with index of your controller

第2個區塊,連結搖桿跟馬達所對應的功能,當使用滑桿1的時候依照滑桿的數值讓左馬達轉動,使用滑桿3的時候依照滑桿的數值讓右馬達轉動。

我們的實際操作畫面如下

第3個區塊會建立一個長、寬各300的畫面來顯示等一下會建立的攝影機畫面。

第4個區塊宣告攝影機的參數跟定義攝影機的instance

第5個區塊這裡才會將攝影機畫面連結到剛剛第3個區塊建立的畫面,這時可以回去第3個區塊看看有無正確看到攝影機的畫面。

攝影機呈現出的畫面如下圖

第8個區塊則是使用我們的搖桿結合攝影機的功能來達到拍照的功能。

建立一個snapshots的資料夾當我們按了buttons[5]即可儲存當下的照片,儲存的格式用jpeg,長寬都是300。儲存照片檔的命名格式使用uuid。

buttons[5]根據我們的Logitech F710所對應的是RB,當按下RB就會拍下照片顯示在右邊的畫面並存在snapshots的資料夾裡( 如下圖所示) 。也可以改變按鈕號碼更改搖桿對應的按鈕,各位也可以嘗試看看。

以上移動篇的講解到這邊告一段落,各位有沒有成功讓車子移動呢?接著我們會繼續介紹更多JetBot相關的範例,有興趣的歡迎繼續關注我們。

 

*本文由RS components 贊助發表

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *