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

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

新規登録して質問してみよう
ただいま回答率
85.35%
例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

Q&A

1回答

1166閲覧

ラジコンカーの操作で、前進ボタンを押し続けながらも、前方の障害物との距離が近くなったら停止するようにプログラムしたい!

TokiShin

総合スコア0

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

0グッド

0クリップ

投稿2020/06/20 16:25

編集2020/06/21 05:12

前提・実現したいこと

前提:
趣味でラジコンをしています。ラズパイを積んだ車をpythonで動かしています。
今回質問させていただいている部分は、if文、try文、exceptやfinalなどの例外処理も試しています。

実現したいこと: 
コントローラーでの操作をしつつ、ウルトラソニックセンサーが正面の障害物を検知した時は、一時停止する。
(前進ボタンを押し続けている間に、障害物を検知した場合は停止するようなプログラム)

質問:
・ifやtry文で両方の処理を実現できるかどうか
・gamepad.read_one()またはgamepad.read_loop()に代るコードで、実現できるものはないかどうか

発生している問題・エラーメッセージ

問題:
前進ボタンから手を離すと、障害物との距離が近い場合は停止する。(ボタンを押し続けている場合は、"障害物→停止"のコードに辿りつかない。

該当のソースコード

一度pdfに出力したものからコピペしたので、一部文字化けしてしまっています。
後ほど変更します。

Python

1while(1): 2event = gamepad.read_one() 3if event != None : 4#for event in gamepad.read_loop() : 5f = open(./data/cam.txt’, mode=’r’) s=f.read() 6f.close() 7s = float(s) 8print("s␣=␣%3d" %(s)) if s != 0 : 9stop(in1,in2,in3,in4) print("Obstacles!!") sys.exit(0) 10if event.type == ecodes.EV_KEY: if event.value == 1: 11if event.code == yBtn: print("Y-medium") p.ChangeDutyCycle(50) p2.ChangeDutyCycle(50) 12elif event.code == bBtn: print("B-stop") 13elif event.code == cBtn: print("C-very␣high") p.ChangeDutyCycle(100) p2.ChangeDutyCycle(100) 14elif event.code == aBtn: print("A-QR␣mode␣press␣Ctrl+C␣to␣exit") capture_code() 15root.mainloop() 16elif event.code == xBtn: print("X-low") p.ChangeDutyCycle(25) p2.ChangeDutyCycle(25) 17elif event.code == zBtn: print("Z-high") p.ChangeDutyCycle(75) p2.ChangeDutyCycle(75) 18elif event.code == home: 19print("home-line␣auto␣mode␣press␣Ctrl+C␣to␣exit") p.ChangeDutyCycle(20) 20p2.ChangeDutyCycle(20) 21forward(in1, in2,in3,in4) 22try: 23while (1) : 24forward(in1, in2,in3,in4) 25if ((not GPIO.input(left_sensor)) and (GPIO.input(right_sensor))): 26print("move␣left") p.ChangeDutyCycle(0) p2.ChangeDutyCycle(70) sleep(0.5) 27elif ((not GPIO.input(right_sensor)) and (GPIO.input(left_sensor))): print("move␣right") 28p.ChangeDutyCycle(70) 29p2.ChangeDutyCycle(0) 30sleep(0.5) 31elif ((not GPIO.input(right_sensor)) and (not GPIO.input(left_sensor))) : 32i = random.randrange(100) print("Going␣back") p.ChangeDutyCycle(20) p2.ChangeDutyCycle(20) backward(in1,in2,in3,in4) sleep(0.5) 33if (i%2 == 0 ): p.ChangeDutyCycle(0) p2.ChangeDutyCycle(70) forward(in1, in2,in3,in4) sleep(0.2) 34else: 35p.ChangeDutyCycle(70) p2.ChangeDutyCycle(0) forward(in1, in2,in3,in4) sleep(0.2) 36else: print("Following␣the␣line!") p.ChangeDutyCycle(20) p2.ChangeDutyCycle(20) 37except KeyboardInterrupt: print(’exiting...) GPIO.cleanup() print("GPIO␣Clean␣up") sys.exit(0) 38elif event.code == select: GPIO.cleanup() print("select-GPIO␣Clean␣up") break 39elif event.code == lTrig: print("PUMP␣OFF") pumpstop() 40elif event.code == rTrig: 41for event in gamepad.read_loop(): 42if event.type == ecodes.EV_KEY: if event.value == 0: 43if event.code == rTrig: break 44elif event.type == 3 : if event.code == 0 : 45if event.value == stick1: print("pump␣up") 46pe = pe + 10 47if (pe > 100) : 48pe = 100 print("pe␣=␣%3d" %(pe)) 49elif event.value == stick2: print("pump␣down") 502 51 pe = pe - 10 if (pe < 0) : 52pe = 0 print("pe␣=␣%3d" %(pe)) 53print("PUMP␣ON␣with␣pe␣=␣%3d" %(pe)) pump(pe) 54elif event.type == 3 : if event.code == 0 : 55if event.value == stick1: print("turn␣right") turn_right(in1, in2,in3,in4) temp1=0 56elif event.value == stick2: print("turn␣left") turn_left(in1, in2,in3,in4) temp1=0 57elif event.value == stickN: print("stick␣Neutral") stop(in1,in2,in3,in4) 58if event.code == 1 : 59if event.value == stick1: 60print("backward") backward(in1, in2,in3,in4) temp1=0 61elif event.value == stick2: print("stick␣forward") forward(in1,in2,in3,in4) temp1=1 62elif event.value == stickN: print("stick␣Neutral") stop(in1,in2,in3,in4)

試したこと

if文、try文、exceptやfinalなどの例外処理等を試しました。
前進のボタンを長押ししている間は、分岐がそれ以上進まず、前進の処理を続けています。
その途中で、障害物との距離が一定以下になっても止まらずに、ボタンから手を離して初めて停止します。

補足情報(FW/ツールのバージョンなど)

よろしくお願いします!

teratailを使うのもプログラミングについて他者に相談するのも初めてなので質問の仕方が上手くなくて申し訳ないです。

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

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

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

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

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

thkana

2020/06/21 00:06

そのようにプログラムを組めばよい話だと思いますが。解決すべき課題は(漠然と)わかりましたが、「質問」はなんでしょうか。 「試したこと」は、「色々頑張ってます」をアピールする場ではなく、解決に向けて参考になる(かも知れない)情報を書く項目です。どの様に試して、どういう結果を得た、ということを具体的に書いてください。 「非常停止ボタン」処理ぐらいならともかく、走っていて前方に障害物があるくらいの普通な事象を「例外」とするのは適切でないように思います。
glyzinieh

2020/06/21 10:08

Pythonでは、インデントがとても大切です。ソースコードを編集しなおしてください。 よろしくお願いします。
guest

回答1

0

ウルトラソニックセンサーが正面の障害物を検知したときに、前進状態の場合だったら、停止させるようなコードを書けばいいです

#コードの提示がないのでここまで

投稿2020/06/21 00:00

y_waiwai

総合スコア88042

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

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

AkitoshiManabe

2020/06/21 03:52

「クルマの前進中にセンサーの動作を常時評価する(割り込みで停止できる)処理」を書けていないだけにも思えますよね。質問が漠然としている(車両/モータ/操作ボタン仕様などの詳細を明示してない)中では最適解と思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問