我正在爲我的大學進入競賽的機器人編寫代碼。我目前正在嘗試使用反射式傳感器來構建一些輪式編碼器。我後來意識到,我可能需要使用線程來實現這一點,因爲機器人需要同時監視左側和右側編碼器。下面的代碼是我到目前爲止:用於機器人上的車輪編碼器的Python線程
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
計算出來自反射率傳感器的值是否已經改變。 '旋轉'方法通過不斷檢查車輪已經轉過的程度,並且在車輪到達終點時放慢車輪的轉向速度,從而使車輪轉過一定的角度。當我運行程序時,我希望兩個輪子都開始轉動,然後減速並在經過兩次轉動時停下來。目前,當我運行程序時,一個車輪開始轉動並減速並停止,然後是另一個車輪。在我看來,像'旋轉'方法不在線程中運行,就像'運行'方法一樣。它只是運行在線程中的'run'方法下的代碼,還是它是整個類?
如果有幫助,我一直在關注這個教程:http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/1/
另外,我想知道爲什麼有可能啓動一個線程只能用Encoder(0,0).start()
。爲什麼你不必創建一個使用類的對象(例如Thread = Encoder(0,0).start()
爲一個新的線程創建?
對不起,如果terminoligy我已經使用不達標,因爲你可能可以告訴我是。很新的線程,和編程一般