用 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 毫秒内),因此实际上是同时发生的。