我正在为我的大学参加比赛的机器人编写代码。我目前正在尝试使用反射传感器构建一些车轮编码器。不久前我意识到我可能需要使用线程来实现这一点,因为机器人需要同时监控左右编码器。下面的代码是我到目前为止所拥有的:
from __future__ import division
import threading
import time
from sr import *
R = Robot()
class Encoder(threading.Thread):
def __init__(self, motor, pin, div=16):
self.motor = motor
self.pin = pin
self.div = div
self.count = 0
threading.Thread.__init__(self)
def run(self):
while True:
wait_for(R.io[0].input[self.pin].query.d)
self.count += 1
def rotations(self, angle, start_speed=50):
seg = 360/self.div
startcount = self.count
current_dist = angle #Distance away from target
R.motors[self.motor].target = start_speed
while current_dist > 360:
newcount = self.count - startcount
current_dist = angle - newcount*seg
R.motors[self.motor].target = 50
while abs(current_dist) > seg/2:
newcount = self.count - startcount
current_dist = angle - newcount*seg
current_speed = start_speed * current_dist / 360
if current_speed < 5:
R.motors[self.motor].target = 5
else:
R.motors[self.motor].target = current_speed
R.motors[self.motor].target = 0
WheelLeft = Encoder(0,0)
WheelLeft.start()
WheelRight = Encoder(1,3)
WheelRight.start()
WheelRight.rotations(720)
WheelLeft.rotations(720)
sr 模块由举办比赛的南安普顿大学提供。它允许我们与机器人的硬件进行交互。
现在,创建的线程似乎允许分别监控两个反射传感器。这段代码:R.io[0].input[self.pin].query.d
计算来自反射传感器的值是否发生了变化。“旋转”方法通过不断检查车轮已经转动了多少度,并在到达终点时减慢速度,将车轮转动一定角度。我希望两个轮子在我运行程序时都开始转动,然后在它们经过 2 圈后减速并停止。目前,当我运行程序时,一个轮子开始转动并减速并停止,然后是另一个轮子。在我看来,“旋转”方法没有在线程中运行,就像“运行”方法一样。是不是只有'run'方法下的代码在线程中运行,
如果有帮助,我一直在关注本教程: http: //www.devshed.com/c/a/Python/Basic-Threading-in-Python/1/
另外,我想知道为什么只能用Encoder(0,0).start()
. 为什么你不必使用类创建一个对象(例如Thread = Encoder(0,0).start()
创建一个新线程?
抱歉,如果我使用的术语不符合标准,因为您可能会说我对线程和一般编程很陌生。