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

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

ただいまの
回答率

89.07%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 169

TokiShin

score 0

前提・実現したいこと

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

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

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

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

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

該当のソースコード

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

while(1):
event = gamepad.read_one()
if event != None :
#for event in gamepad.read_loop() :
f = open(’./data/cam.txt’, mode=’r’) s=f.read()
f.close()
s = float(s)
print("s␣=␣%3d" %(s)) if s != 0 :
stop(in1,in2,in3,in4) print("Obstacles!!") sys.exit(0)
if event.type == ecodes.EV_KEY: if event.value == 1:
if event.code == yBtn: print("Y-medium") p.ChangeDutyCycle(50) p2.ChangeDutyCycle(50)
elif event.code == bBtn: print("B-stop")
elif event.code == cBtn: print("C-very␣high") p.ChangeDutyCycle(100) p2.ChangeDutyCycle(100)
elif event.code == aBtn: print("A-QR␣mode␣press␣Ctrl+C␣to␣exit") capture_code()
root.mainloop()
elif event.code == xBtn: print("X-low") p.ChangeDutyCycle(25) p2.ChangeDutyCycle(25)
elif event.code == zBtn: print("Z-high") p.ChangeDutyCycle(75) p2.ChangeDutyCycle(75)
elif event.code == home:
print("home-line␣auto␣mode␣press␣Ctrl+C␣to␣exit") p.ChangeDutyCycle(20)
p2.ChangeDutyCycle(20)
forward(in1, in2,in3,in4)
try:
while (1) :
forward(in1, in2,in3,in4)
if ((not GPIO.input(left_sensor)) and (GPIO.input(right_sensor))):
print("move␣left") p.ChangeDutyCycle(0) p2.ChangeDutyCycle(70) sleep(0.5)
elif ((not GPIO.input(right_sensor)) and (GPIO.input(left_sensor))): print("move␣right")
p.ChangeDutyCycle(70)
p2.ChangeDutyCycle(0)
sleep(0.5)
elif ((not GPIO.input(right_sensor)) and (not GPIO.input(left_sensor))) :
i = random.randrange(100) print("Going␣back") p.ChangeDutyCycle(20) p2.ChangeDutyCycle(20) backward(in1,in2,in3,in4) sleep(0.5)
if (i%2 == 0 ): p.ChangeDutyCycle(0) p2.ChangeDutyCycle(70) forward(in1, in2,in3,in4) sleep(0.2)
else:
p.ChangeDutyCycle(70) p2.ChangeDutyCycle(0) forward(in1, in2,in3,in4) sleep(0.2)
else: print("Following␣the␣line!") p.ChangeDutyCycle(20) p2.ChangeDutyCycle(20)
except KeyboardInterrupt: print(’exiting...’) GPIO.cleanup() print("GPIO␣Clean␣up") sys.exit(0)
elif event.code == select: GPIO.cleanup() print("select-GPIO␣Clean␣up") break
elif event.code == lTrig: print("PUMP␣OFF") pumpstop()
elif event.code == rTrig:
for event in gamepad.read_loop():
if event.type == ecodes.EV_KEY: if event.value == 0:
if event.code == rTrig: break
elif event.type == 3 : if event.code == 0 :
if event.value == stick1: print("pump␣up")
pe = pe + 10
if (pe > 100) :
pe = 100 print("pe␣=␣%3d" %(pe))
elif event.value == stick2: print("pump␣down")
2
 pe = pe - 10 if (pe < 0) :
pe = 0 print("pe␣=␣%3d" %(pe))
print("PUMP␣ON␣with␣pe␣=␣%3d" %(pe)) pump(pe)
elif event.type == 3 : if event.code == 0 :
if event.value == stick1: print("turn␣right") turn_right(in1, in2,in3,in4) temp1=0
elif event.value == stick2: print("turn␣left") turn_left(in1, in2,in3,in4) temp1=0
elif event.value == stickN: print("stick␣Neutral") stop(in1,in2,in3,in4)
if event.code == 1 :
if event.value == stick1:
print("backward") backward(in1, in2,in3,in4) temp1=0
elif event.value == stick2: print("stick␣forward") forward(in1,in2,in3,in4) temp1=1
elif event.value == stickN: print("stick␣Neutral") stop(in1,in2,in3,in4)

試したこと

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

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

よろしくお願いします!

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • thkana

    2020/06/21 09:06

    そのようにプログラムを組めばよい話だと思いますが。解決すべき課題は(漠然と)わかりましたが、「質問」はなんでしょうか。

    「試したこと」は、「色々頑張ってます」をアピールする場ではなく、解決に向けて参考になる(かも知れない)情報を書く項目です。どの様に試して、どういう結果を得た、ということを具体的に書いてください。

    「非常停止ボタン」処理ぐらいならともかく、走っていて前方に障害物があるくらいの普通な事象を「例外」とするのは適切でないように思います。

    キャンセル

  • glyzinieh

    2020/06/21 19:08

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

    キャンセル

回答 1

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/21 12:52

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

    キャンセル

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

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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