ROSでラズパイのGPIOをちゃんと使うには
【後日追加】WiringPi-Pythonを使ってsudoなしで実行する方法がわかりました。こちらの投稿をみてください。
前回の続きです。このバージョンのWiringPi-PythonではsudoなしではGPIOが使えないのがはっきりしたので、WiringPiを入れるともれなく付いてくるgpioコマンドをpythonから使ってみました。入力ポートで押しボタンの状態を読んで、押されたらLEDを点灯するROSノードです。
#!/usr/bin/env python import roslib import rospy import time import subprocess #main if __name__ == '__main__': ### init io port ### subprocess.check_call('gpio export 17 out',shell=True) subprocess.check_call('gpio export 18 in',shell=True) ### rospy.init_node('swtest') while not rospy.is_shutdown(): sens = subprocess.check_output('gpio -g read 18',shell=True) if '0' in sens: subprocess.check_output('gpio -g write 17 1',shell=True) else: subprocess.check_output('gpio -g write 17 0',shell=True) print('\rStopped')
GPIO18にプルアップされたボタンSWを押すと0になるように接続、GPIO17にLEDを1で点灯するよう接続します。roscoreを起動しておくのを忘れないでください。ボタンを押すとLEDが点灯するはずです。
これで一件落着と言いたいところですが、まだ問題が残ります。それは実行速度です。下の写真はポートに1を書いてすぐ0を書くという無限ループを走らせた時のポートの波形です。つまりポートに書く関数の実行速度を測定したものです。
これは以前ROSでWiringPi-Pythonを使った場合です。(クリックで拡大します)
時間軸は5us、1回の入出力にかかる時間は8us程度です。これならモーターの回転数を読んだり、簡易的なPWMを行ったりすることも可能です。しかし、今回のgpioコマンドを使った方法ではそうはいきません。
一見前の写真と変わりませんが、時間軸が違います。時間軸10ms、波形から読み取れる1回の入出力の時間はなんと16msです。まさに桁違いに遅くなっています。これはシェルコマンドを呼び出している関係でどうしてもしょうがありません。1回の読み書きにこれだけなので、例えば4個のボタンをチェックするには4倍の64mSかかる計算になります。
押しボタンでのUIとか、以前作った「光を追いかけるロボット」くらいのレスポンスなら充分ですが、積極的に制御に使うのはちょっと苦しいですね。前の投稿で書いたようにセンサやモーターが簡単に接続しやすいため、ROSが身近になるという効果は大きいので、この辺は我慢することにしましょう。
« WiringPi-Pythonでつまづく | トップページ | sudoなしで最新のWiringPi-Pythonを使うには »
「ラズパイでROS」カテゴリの記事
- 3Dプリンターで作る簡単turtlebot(おしまい)(2017.01.07)
- 3Dプリンターで作る簡単turtlebot(raspberry pi3の取り付け)(2017.01.03)
- 3Dプリンターで作る簡単turtlebot(kinectの取り付け)(2017.01.02)
- 3Dプリンターで作る簡単turtlebot(パーツの組み立て2)(2016.12.29)
- 3Dプリンターで作る簡単turtlebot(パーツの組み立て1)(2016.12.25)
« WiringPi-Pythonでつまづく | トップページ | sudoなしで最新のWiringPi-Pythonを使うには »
コメント