PybricksというLegoが出しているMoveHubを使ってロボット動かすことをしています。
センサーから色(光の反射具合)を検出してその色に応じて動作を変えるということをしているのですが、左旋回のコードで少し手こずっています。
センサーが検出した反射が白のときより低いときに一秒間に右に90度回転する速度で回るようにして、その検出したものが白より高くなったらその動作を終了するというものにしたのですが、何回やってもwhileから抜け出せず困っています。
classを使用してturn_leftという関数を作ったのですが、多分そこがおかしいんだと思います。多分これはロボット関係なく自身のコードの問題だと思うのでどなたかご教授願います。
ifの部分が違うのかなとか、何個か試したのですがどれもだめでした。そもそもこの文が間違っているでしょうか?
ちなみに反射した強さはすべて数字で表示されますので
white = 20などのようにしてあります。基本的に白の表面を反射すると25以上になるので余裕をもたせて20にしました。
python
1class LineFollower(DriveBase): 2 3 def __init__(self, *args, **kwargs): 4 super().__init__(*args, **kwargs) 5 self.sensor = ColorDistanceSensor(Port.D) 6 self.hub = MoveHub() 7 print('Voltage {} mV'.format(self.hub.battery.voltage())) 8 9 def run(self, min_runtime=1000, max_runtime=30000, max_duration=100): 10 watch_runtime = StopWatch() 11 watch_runtime.reset() 12 watch_online = StopWatch() 13 watch_online.reset() 14 15 print('following line...') 16 17 WHITE = 20 18 LIGHTGREY = 14 19 DARKGREY = 10 20 BLACK = 7 21 22 while watch_runtime.time() < max_runtime: 23 24 intensity = self.sensor.reflection() 25 26 27 if intensity > WHITE: 28 self.drive(0, 180) 29 elif intensity > LIGHTGREY: 30 self.drive(30, 90) 31 elif intensity > DARKGREY: 32 self.drive(40, 0) 33 elif intensity > BLACK: 34 self.drive(30, -90) 35 else: 36 self.drive(0, -180) 37 38 wait(1) 39 40 if intensity > 10: 41 watch_online.reset() 42 elif (watch_online.time() > max_runtime or watch_online.time() > max_duration): 43 print('exceeded.') 44 break 45 self.stop() 46 47 def turn_left(self): 48 print('turn left...') 49 50 intensity = self.sensor.reflection() 51 52 WHITE = 20 53 LIGHTGREY = 14 54 DARKGREY = 10 55 BLACK = 7 56 57 while intensity < WHITE: 58 self.drive(0, -90) 59 60 if False: 61 break 62 self.stop() 63
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/11/25 13:46