跳轉到內容

用 Linkbot/Linkbot 多工學習 Python 3

來自 Wikibooks,開放世界中的開放書籍

"非阻塞" Linkbot 函式

[編輯 | 編輯原始碼]

讓我們來盤點一下我們迄今為止用來控制 Linkbot 各個方面的所有函式。

函式名稱 函式描述
setLEDColor(r, g, b) 根據紅色、綠色和藍色強度更改 LED 顏色。
setBuzzerFrequency(Hz) 使 Linkbot 蜂鳴器播放以赫茲為單位的頻率。
moveJoint(jointNum, degrees) 使單個電機移動。
move(degrees, degrees, degrees) 使多個電機同時移動

使用這些函式,我們可以讓我們的機器人四處移動,改變機器人的 LED 顏色,並讓機器人發出嗶嗶聲或播放簡單的旋律。但是,只使用這些函式,我們無法讓機器人播放音樂,並在機器人移動時更改其 LED 顏色。例如,假設我們想要讓我們的機器人移動時發出 2 次嗶嗶聲。我們可以嘗試以下操作

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

讓我們推理一下這個程式的每個主要部分。

  1. 首先,我們開啟 Linkbot 上的蜂鳴器。它開始發出蜂鳴聲
  2. 暫停程式 0.25 秒
  3. 關閉 Linkbot 的蜂鳴器。
  4. 暫停程式另外 0.25 秒。步驟 1-4 的最終結果是 Linkbot 的蜂鳴器發出 0.25 秒的蜂鳴聲。接下來的四行做同樣的事情。
  5. 此時,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() 函式重新定位到程式的開頭。這個程式會讓機器人移動時發出兩次嗶嗶聲嗎?

  1. 首先,我們呼叫 move() 函式,該函式移動機器人的電機。機器人開始移動。但是,程式停留在專案 1 處,直到 move() 函式完成。在機器人完成移動後,程式繼續執行。
  2. 這裡,機器人開啟蜂鳴器,類似於前面的示例。使用 setBuzzerFrequency()time.sleep(),它使蜂鳴器發出兩次嗶嗶聲。

moveNB() 函式

[編輯 | 編輯原始碼]

正如我們所見,我們再次未能讓機器人移動時發出兩次嗶嗶聲。為了讓機器人同時執行這些操作,我們必須使用一種類似但新的函式型別:非阻塞函式。讓我們看一個例子

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)
  1. 這裡,我們使用 moveNB() 函式,而不是使用 move() 函式。

函式名稱中的 "NB" 代表 "非阻塞"。這兩個函式都移動 Linkbot 上的電機,但有一個重要的區別:NB 版本的函式會立即 "返回"。這意味著 Python 會立即繼續執行下一行程式碼,而無需等待移動完成。換句話說,moveNB() 函式不會 "阻塞" Python 在函式呼叫後立即繼續執行。

  1. 現在,Linkbot 在仍然移動時開始播放蜂鳴器。我們已經完成了任務!這個程式會讓機器人移動並在機器人移動時發出兩次嗶嗶聲。

moveWait() 函式

[編輯 | 編輯原始碼]

現在,讓我們嘗試另一個示例。假設我們想讓機器人旋轉 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. 和以前一樣,這行程式碼告訴機器人開始移動電機 1 和 3。由於我們使用了 "NB" 版本的函式,因此即使機器人仍在移動,Python 也會直接繼續執行下一行程式碼。
  2. 接下來的幾行程式碼使機器人發出兩次嗶嗶聲,類似於之前。
  3. 在這裡,我們呼叫了一個名為 moveWait() 的函式。該函式會阻塞,直到機器人的所有電機運動完成。實際上,Python 會在 # 3 處等待,直到電機停止移動。
  4. 在這裡,我們設定 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 毫秒內),因此實際上是同時發生的。

用 Linkbot 學習 Python 3
 ← 決策 Linkbot 多工處理 除錯 → 
華夏公益教科書