質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

765閲覧

while構文から抜け出せません

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/25 13:02

編集2021/11/25 13:09

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python

1 intensity = self.sensor.reflection()

は、その瞬間のself.sensor.reflection()の値をintensity に代入しています。

self.sensor.reflection()を自動的にintensity に入れるようなことはPythonではできません。

したがって、While文の条件は変わらないので無限ループになります。

これが理解できれば、どう修正すればよいかは明らかでしょう。

投稿2021/11/25 13:20

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/25 13:46

whileの中にintensityの部分を入れればいいということですかね?先程それでやってみたらたしかに動きました!ありがとうございます...!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問