我目前正在开发一个在机器人上运行的程序。该程序需要将职位添加到列表中,但您必须按下按钮才能添加新职位。这必须在 while 循环内。但是当我按下按钮时,该函数会重复多次,而不仅仅是 1 次。这是代码的一部分:
while not self.done():
if self._io_left_lower.state:
self._gripper_left.open()
elif self._io_left_upper.state:
self._gripper_left.close()
if self._io_right_lower.state:
self._gripper_right.open()
elif self._io_right_upper.state:
self._gripper_right.close()
if self._io_left_nav.button0:
print("repeats")
#self._mapping.append([self._limb_left.joint_angles(), self._gripper_left.position()])
if self._io_right_nav.button0:
self._mapping.append([self._limb_right.joint_angles(), self._gripper_right.position()])
if self._io_left_nav.button1:
self.stop()
正如您所看到的,当按下 self._io_left_nav.button0 时,它现在只会打印“重复”几次,但必须只打印一次。 self._io_right_nav.button0 也是如此。
最佳答案
如果button0是一个物理按钮并且你的循环正在轮询按钮状态,那么在按下按钮时运行许多迭代是正常的。您有多种选择来解决这种情况,其中两个是:
- 不要使用循环检查按钮,而是使用硬件中断来保持状态的更新表示。
- 如果您仍然想使用循环,则应该检测按钮状态更改,而不是在每次迭代时检查其当前状态。这可能需要您的程序实现噪声滤波器。
实现第二个选项的一个非常简单的方法是让按钮状态变量与时间戳相关联:在每次循环迭代时,如果当前时间和时间戳之间的差异足够大,那么您应该检查当前状态是否与存储在变量中的相同。如果没有,那么您已经检测到了变化。无论如何,此时您应该更新您的状态时间戳变量。
这是一个例子:
from time import time
prevState = (False,time())
while not self.done():
current = time()
if self._io_left_nav.button0 and (current-prevState[1])*1000>2: #For example, 2 ms
if self._io_left_nav.button0 != prevState[0]:
print("repeats")
prevState = (self._io_left_nav.button0,time())
关于python - 如何使用Python检查机器人按钮的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22475218/