私の大学がコンテストに参加しているロボットのコードを書いています。私は現在、反射率センサーを使用していくつかのホイールエンコーダーを構築しようとしています。ロボットが左右のエンコーダーの両方を同時に監視する必要があるので、これを達成するにはおそらくスレッドを使用する必要があることにしばらく前に気づきました。以下のコードは私がこれまでに持っているものです:
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モジュールは、コンテストを運営しているサウサンプトン大学によって提供されています。これにより、ロボットのハードウェアと対話できます。
現在、作成されるスレッドにより、2つの反射率センサーを別々に監視できるようになります。このコードのビット:R.io[0].input[self.pin].query.d
反射率センサーからの値が変更されたかどうかを判断します。「回転」方式では、ホイールがすでに何度回転したかを常にチェックし、最後に到達するまで速度を落とすことにより、ホイールを特定の角度で回転させます。プログラムを実行すると両方のホイールが回転し始め、2回転したときに減速して停止します。しかし現在、プログラムを実行すると、一方のホイールが回転を開始し、減速して停止し、次にもう一方のホイールが続きます。'run'メソッドのように、'rotations'メソッドがスレッドで実行されていないように見えます。スレッドで実行されるのは、「run」メソッドの下のコードだけですか、
それが役に立ったら、私はこのチュートリアルに従っています:http ://www.devshed.com/c/a/Python/Basic-Threading-in-Python/1/
また、なぜスレッドを。だけで開始できるのか知りたいEncoder(0,0).start()
です。クラスを使用してオブジェクトを作成する必要がないのはなぜですか(たとえばThread = Encoder(0,0).start()
、新しいスレッドを作成する場合)。
私が使用した用語が完全ではない場合は申し訳ありません。おそらく、私はスレッド化とプログラミング全般にまったく慣れていないことがわかるでしょう。