跳转到内容

用 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 多任务处理 调试 → 
华夏公益教科书