如果已經將 Jetbot 智能小車組裝好的話,現在就可以開始執行 Jetbot 智能小車實驗,接下來的操作都在以下環境中執行:
1. 無線的方式連接 Jetbot 與 PC:
關于這部分的設置,請參考“NVIDIA Jetson Nano 2GB 系列文章(42):無線WIFI的安裝與調試”文章,有詳細的說明。
我們采用如下圖的“Jetbot 熱點”方式連接,就是將 Jetbot 無線網卡設置為“熱點”模式,將 PC 的 WIFI 連上 Jetbot 設置的熱點,如此 Jetbot 的 IP 固定為 “10.42.0.1”,操作起來方便。
2. 所有實驗的界面都在 PC 上的瀏覽器操作:確定好連線之后,在 PC 的瀏覽器(推薦使用 Google Chrome)輸入“https://10.42.0.1:8888” 就可以進入,第一次連上去需要輸入 “jetbot” 這個預設的密碼,只要第一次選擇保存密碼,以后進入就不需要再輸入密碼。
3. 關于 Jupyter 的使用技巧請自行在網上學習,這里只對 Jetbot 各個項目的代碼進行探索與調試建議。
4. 所有實驗都需要為 Jetbot 提供足夠的運動空間:最好直接在空曠而且平坦的地面上運行,避免在桌子之類與地面有高度落差的地方,以及凹凸不平、阻力較大(例如地毯)、泥沙淤積的地面上,以免對 Jetbot 造成傷害。
5. 最后提醒一點,Jetbot 的重點是在于“學習”而非“競技”,因此避免將電機馬達轉速調到太快,如果感覺車速太快時,請自行將實驗代碼里的速度調低。
現在就開始兩個基礎的 Jetbot “手動”運行實驗,這兩個實驗最重要的目的是讓大家熟悉代碼的運作。第一個實驗是以鍵盤的“上下左右”去控制 Jetbot 的行進,第二個實驗是使用游戲用的搖桿設備來進行控制,前提是您得采購一個最簡單的搖桿設備,我們測試了幾種包括有線以及無線的搖桿設備,都能正確使用。
現在就開始 Jetbot 的基礎項目,請自行登陸 Jupyter 并進入 jetbot/notebooks 目錄下,總共有 5 個實驗目錄。
基本動作(Basci Motion)
在 Jupyter 進入 basic_motion 目錄,里面有 basic_motion.ipynb 這個實驗內容,點選后就能打開,這里的代碼主要分為四大段:
1. 基本操作:
這部分的代碼非常直觀,并且有很詳盡的英文解說,最主要是讓大家了解如何導入關于電機控制的模塊,并且創建 robot 對象來控制 Jetbot 的行進:
fromjetbotimportRobot
robot = Robot()
我們只要分別對 robot 對象的左右輪設定速度,就能實現讓 Jetbot 移動的任務。這里“設定速度”的方法,是以“全速”為基準給定[-1, +1]之間的相對值,但給定“負值”表示“反向”旋轉,這是不建議的做法。
下面有三種設置左右輪的方法,如下:
(1) 用 robot.left (速度)與 robot.right (速度)分別設置左右輪速度:
robot.left(speed=0.3)
robot.stop()
import time
robot.left(0.3)
time.sleep(0.5)
robot.stop()
(2) 用 robot.set_motor (左輪速, 右輪速) 同時設置左右輪速度:
robot.set_motors(0.3,0.6)
time.sleep(1.0)
robot.stop()
(3) 對 robot.left_motor.value 與 robot.right_motor.value 這兩個變量進行設置:
robot.left_motor.value=0.3
robot.right_motor.value=0.6
time.sleep(1.0)
robot.left_motor.value=0.0
robot.right_motor.value = 0.0
上面的這些數值您可以在要求的范圍內自由設置,最好能試著將兩個值調成一樣,并且讓延續時間稍微長一點,例如 3~5 秒,可以先檢查一下左右輪的轉速是否一致!
2. 使用 traitlets 庫將 robot 左右輪與小部件進行連接:
在“Jetbot 實戰系列 04:CSI 攝像頭安裝與測試”里已經使用過 traitlets 這個非常強大的庫,將攝像頭捕獲的畫面與 widgets.image 小部件連接,再透過 display(image) 顯示動態的圖像。
這里也用相同的方法,創建兩個“滑塊(slider)”小部件與 robot 左右輪的數值進行捆綁,可以單向地在兩個滑塊上顯示輪的速度值,還可以進一步透過兩個滑塊去控制個別輪的速度。下面是這個用途的執行步驟:
(1) 創建兩個垂直滑塊小部件,再用一個水平框部件將兩個滑塊放在一起:
importipywidgets.widgetsaswidgets
from IPython.display import display
#創建”left”與”right”兩個垂直滑塊小部件,數值范圍在[-1.0,1.0]之間
left_slider=widgets.FloatSlider(description='left',min=-1.0,max=1.0,step=0.01,orientation='vertical')
right_slider= widgets.FloatSlider(description='right', min=-1.0, max=1.0, step=0.01, orientation='vertical')
#創建一個水平框,放置前面生成的兩個垂直滑塊
slider_container = widgets.HBox([left_slider, right_slider])
#在下面這個滑塊容器
display(slider_container)
(2) 單向顯示:使用 traitlets.link 函數將左右滑塊的值分別與左右輪的值進行連接,這樣就能看到兩個滑塊的值會跟著兩個輪的值而改變。
importtraitlets
left_link=traitlets.link((left_slider,'value'),(robot.left_motor,'value'))
right_link=traitlets.link((right_slider,'value'),(robot.right_motor,'value'))
robot.forward(0.3)
time.sleep(1.0)
robot.stop()
left_link.unlink()
right_link.unlink()
(3) 雙向控制:使用 traitlets.dlink 函數將左右滑塊的值分別與左右輪的值進行連接,這時候可以試試看調整兩個滑塊的值(上下拖),就能改變兩個輪的轉速。
left_link=traitlets.dlink((robot.left_motor,'value'),(left_slider,'value'))
right_link = traitlets.dlink((robot.right_motor, 'value'), (right_slider, 'value'))
3. 將控制函數附加到事件:
使用 traitlets 的另一種方法是將函數(如 forward)附加到事件。每當對象發生更改時,這些函數都會被調用,并且會被傳遞一些有關該更改的信息,如舊值和新值。讓我們創建并顯示一些用于控制機器人的按鈕。
(1)創建并顯示 4 個方向按鈕與中間的“停止”按鈕:
#創建5個按鈕
stop_button=widgets.Button(省略)
forward_button=widgets.Button(省略)
backward_button=widgets.Button(省略)
left_button=widgets.Button(省略)
right_button=widgets.Button(省略)
#顯示按鈕
middle_box=widgets.HBox([left_button,stop_button,right_button],layout=widgets.Layout(align_self='center'))
controls_box=widgets.VBox([forward_button,middle_box,backward_button])
display(controls_box)
(2) 定義 5 個方向的動作指令:
defstop(change):
defstep_forward(change):
defstep_backward(change):
defstep_left(change):
def step_right(change):
在這里可以看到 robot 對象還提供 stop/forword/backword/left/right 等五個預定義的動作,可以直接使用。這里的 left 與 right 所定義的方式是“原地旋轉”的動作,如果要讓小車往“左前方”或“右前方”行進的話,則需要自行對左右輪設置不同速度比的方式來處理。
(3) 將按鈕與動作定義進行捆綁:
#捆綁方式:按鈕.on_click(動作)
stop_button.on_click(stop)
forward_button.on_click(step_forward)
backward_button.on_click(step_backward)
left_button.on_click(step_left)
right_button.on_click(step_right)
完成這個捆綁的步驟之后,按下按鈕才會向 Jetbot 發送控制指令,現在試試看能不能用這個方向鍵來控制 Jetbot 小車!
4. 心跳停止開關:
這是個預防 Jetbot 與 PC 直接因為距離過遠而失去控制能力狀況下,提供的一種安全管理措施,這部分的內容請自行測試即可,沒什么難度,這里不做說明。
以上就完成這個智能小車的最基本運動功能,大家可以多嘗試調整轉速、方向、持續時間等參數,感受一下這個基本運動的處理方式。
搖桿操作(Teleoperation)
項目代碼在 notebooks/teleoperation 目錄的 teleoperation.ipynb,在 Jupyter 里打開這個文件就能執行。這是在 PC 控制機上,用游戲搖桿(gamepad)來控制 Jetbot 小車的左右輪,基本邏輯與上面的“滑塊控制輪速”的原理是一致的,只不過將設備從鼠標變成搖桿而已。
我們將手邊的四種游戲搖桿(如下圖)都做過測試,不過有線無線、單價高低的都能使用,如果手上沒有這類搖桿的,可以簡單選個 30 元左右的也可以執行這些測試,并且以后做些這類相關的應用。
將搖桿接上 PC 之后,如果是 Linux 操作系統請執行以下指令,檢查是否已經安裝:
ls /dev/input/js*
至于 Windows 或 MacOS 請自行在設備列表中檢查。
如果確認設備已將連上控制 PC 之后,就可以開始執行 teleoperation.ipynb 這個項目,不過有個對初學者很重要的地方,卻放在不起眼的注釋里面,在這里我們特別將它提出來,在執行項目之前必須先點進去注釋里的“1.Visit http://html5gamepad.com.”,點進這個連接之后,就能確認您手上的這個搖桿是否能夠正常工作。
最左上角的 “INDEX” 編號就是接下來代碼中 “widgets.Controller(index=N)” 的實際編號,當然在前面 “ls /dev/input/js*” 所顯示的編號,也能作為這個編號的依據,不過在這個網頁上可以動一動游戲搖桿上的兩個控制桿與其他按鈕,看看在 B0~B16 以及 AXIS0~AXIS3 這些鈕上面是不是有對應的回饋?
執行第一步驟之后,如果出現以下畫面,就表示驅動的加載也都正確。
這個實驗只要把游戲搖桿設備的部分捋順了,后面的實驗步驟就非常直觀,包括將攝像頭“拍照”功能與游戲搖桿的某個鍵進行綁定的部分,在執行步驟都有非常詳細說明,大家只要順著去執行并且閱讀說明,就能輕松完成整個任務。
原文標題:NVIDIA Jetson Nano 2GB 系列文章(48):用鍵盤與搖桿控制行動
文章出處:【微信公眾號:NVIDIA英偉達企業解決方案】歡迎添加關注!文章轉載請注明出處。
審核編輯:湯梓紅
-
NVIDIA
+關注
關注
14文章
4990瀏覽量
103103 -
鍵盤
+關注
關注
4文章
859瀏覽量
39692 -
控制
+關注
關注
4文章
1011瀏覽量
122669
原文標題:NVIDIA Jetson Nano 2GB 系列文章(48):用鍵盤與搖桿控制行動
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達企業解決方案】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論