用 Linkbot/Linkbot 多工學習 Python 3
讓我們來盤點一下我們迄今為止用來控制 Linkbot 各個方面的所有函式。
| 函式名稱 | 函式描述 |
|---|---|
setLEDColor(r, g, b) |
根據紅色、綠色和藍色強度更改 LED 顏色。 |
setBuzzerFrequency(Hz) |
使 Linkbot 蜂鳴器播放以赫茲為單位的頻率。 |
moveJoint(jointNum, degrees) |
使單個電機移動。 |
move(degrees, degrees, degrees) |
使多個電機同時移動 |
使用這些函式,我們可以讓我們的機器人四處移動,改變機器人的 LED 顏色,並讓機器人發出嗶嗶聲或播放簡單的旋律。但是,只使用這些函式,我們無法讓機器人播放音樂,並在機器人移動時更改其 LED 顏色。例如,假設我們想要讓我們的機器人移動時發出 2 次嗶嗶聲。我們可以嘗試以下操作
注意! 本節中的示例沒有顯示前幾章中顯示的必要的初始化程式碼。要執行這些示例,您需要在程式開頭包含以下程式碼行 import barobo
dongle = barobo.Dongle()
dongle.connect()
myLinkbot = dongle.getLinkbot('ABCD') # Replace 'ABCD' with your Linkbot's ID
|
myLinkbot.setBuzzerFrequency(440) # 1
time.sleep(0.25) # 2
myLinkbot.setBuzzerFrequency(0) # 3
time.sleep(0.25) # 4
myLinkbot.setBuzzerFrequency(440)
time.sleep(0.25)
myLinkbot.setBuzzerFrequency(0)
time.sleep(0.25)
myLinkbot.move(180, 0, -180) # 5
讓我們推理一下這個程式的每個主要部分。
- 首先,我們開啟 Linkbot 上的蜂鳴器。它開始發出蜂鳴聲
- 暫停程式 0.25 秒
- 關閉 Linkbot 的蜂鳴器。
- 暫停程式另外 0.25 秒。步驟 1-4 的最終結果是 Linkbot 的蜂鳴器發出 0.25 秒的蜂鳴聲。接下來的四行做同樣的事情。
- 此時,Linkbot 已經發出兩次蜂鳴聲,現在
move()函式使 Linkbot 向前滾動。
這幾乎是我們想要做的,除了我們想要讓機器人 在 機器人移動時發出兩次嗶嗶聲;而不是在它開始移動之前。我們再試一次
myLinkbot.move(180, 0, -180) # 1
myLinkbot.setBuzzerFrequency(440) # 2
time.sleep(0.25)
myLinkbot.setBuzzerFrequency(0)
time.sleep(0.25)
myLinkbot.setBuzzerFrequency(440)
time.sleep(0.25)
myLinkbot.setBuzzerFrequency(0)
time.sleep(0.25)
該程式與之前的程式幾乎完全相同,只是我們將 move() 函式重新定位到程式的開頭。這個程式會讓機器人移動時發出兩次嗶嗶聲嗎?
- 首先,我們呼叫
move()函式,該函式移動機器人的電機。機器人開始移動。但是,程式停留在專案 1 處,直到move()函式完成。在機器人完成移動後,程式繼續執行。 - 這裡,機器人開啟蜂鳴器,類似於前面的示例。使用
setBuzzerFrequency()和time.sleep(),它使蜂鳴器發出兩次嗶嗶聲。
正如我們所見,我們再次未能讓機器人移動時發出兩次嗶嗶聲。為了讓機器人同時執行這些操作,我們必須使用一種類似但新的函式型別:非阻塞函式。讓我們看一個例子
myLinkbot.moveNB(180, 0, -180) # 1
myLinkbot.setBuzzerFrequency(440) # 2
time.sleep(0.25)
myLinkbot.setBuzzerFrequency(0)
time.sleep(0.25)
myLinkbot.setBuzzerFrequency(440)
time.sleep(0.25)
myLinkbot.setBuzzerFrequency(0)
time.sleep(0.25)
- 這裡,我們使用
moveNB()函式,而不是使用move()函式。
函式名稱中的 "NB" 代表 "非阻塞"。這兩個函式都移動 Linkbot 上的電機,但有一個重要的區別:NB 版本的函式會立即 "返回"。這意味著 Python 會立即繼續執行下一行程式碼,而無需等待移動完成。換句話說,moveNB() 函式不會 "阻塞" Python 在函式呼叫後立即繼續執行。
- 現在,Linkbot 在仍然移動時開始播放蜂鳴器。我們已經完成了任務!這個程式會讓機器人移動並在機器人移動時發出兩次嗶嗶聲。
現在,讓我們嘗試另一個示例。假設我們想讓機器人旋轉 180 度向前滾動,同時發出兩次嗶嗶聲,然後 在 運動完成後將 LED 顏色更改為綠色。為了實現這一點,我們引入了 moveWait() 函式。讓我們看一看它如何工作
myLinkbot.moveNB(180, 0, -180) # 1
myLinkbot.setBuzzerFrequency(440) # 2
time.sleep(0.25)
myLinkbot.setBuzzerFrequency(0)
time.sleep(0.25)
myLinkbot.setBuzzerFrequency(440)
time.sleep(0.25)
myLinkbot.setBuzzerFrequency(0)
time.sleep(0.25)
myLinkbot.moveWait() # 3
myLinkbot.setLEDColor(0, 255, 0) # 4
- 和以前一樣,這行程式碼告訴機器人開始移動電機 1 和 3。由於我們使用了 "NB" 版本的函式,因此即使機器人仍在移動,Python 也會直接繼續執行下一行程式碼。
- 接下來的幾行程式碼使機器人發出兩次嗶嗶聲,類似於之前。
- 在這裡,我們呼叫了一個名為
moveWait()的函式。該函式會阻塞,直到機器人的所有電機運動完成。實際上,Python 會在 # 3 處等待,直到電機停止移動。 - 在這裡,我們設定 LED 顏色為綠色。
如果我們在 # 3 處省略了 moveWait(),無論電機是否仍在移動,LED 顏色都會被設定。透過使用 moveWait() 函式,我們強制 Python 等待電機停止移動,然後才能設定 LED 顏色。
幾乎所有 Linkbot 運動命令都有一個帶 "NB" 字尾的非阻塞版本。那些沒有非阻塞版本的函式是那些讓 Linkbot 的電機永遠連續移動的函式。我們還沒有探索過它們,但它們確實存在。這些函式沒有非阻塞版本,因為它們會永遠阻塞。
所有以 "set" 為字首的函式,例如 setBuzzerFrequency() 和 setLEDColor(),都可以被認為是非阻塞的,因為蜂鳴器和 LED 顏色的設定速度非常快。例如,如果您執行以下程式碼段
myLinkbot.setBuzzerFrequency(440)
myLinkbot.setLEDColor(0, 255, 0)
Linkbot 似乎會同時開始發出蜂鳴聲並將 LED 顏色更改為綠色。從技術上講,機器人實際上是在執行另一個操作,但這兩個操作發生得非常快(通常在 5 毫秒內),因此實際上是同時發生的。