2023年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

カテゴリー

ブログパーツ

無料ブログはココログ

« WiringPi-Pythonでつまづく | トップページ | sudoなしで最新のWiringPi-Pythonを使うには »

2016年8月22日 (月)

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が点灯するはずです。

Dscn3486

これで一件落着と言いたいところですが、まだ問題が残ります。それは実行速度です。下の写真はポートに1を書いてすぐ0を書くという無限ループを走らせた時のポートの波形です。つまりポートに書く関数の実行速度を測定したものです。

これは以前ROSでWiringPi-Pythonを使った場合です。(クリックで拡大します)

Dscn3493 #ラズパイ2で実行

時間軸は5us、1回の入出力にかかる時間は8us程度です。これならモーターの回転数を読んだり、簡易的なPWMを行ったりすることも可能です。しかし、今回のgpioコマンドを使った方法ではそうはいきません。

Dscn3497 #ラズパイ3で実行

一見前の写真と変わりませんが、時間軸が違います。時間軸10ms、波形から読み取れる1回の入出力の時間はなんと16msです。まさに桁違いに遅くなっています。これはシェルコマンドを呼び出している関係でどうしてもしょうがありません。1回の読み書きにこれだけなので、例えば4個のボタンをチェックするには4倍の64mSかかる計算になります。

押しボタンでのUIとか、以前作った「光を追いかけるロボット」くらいのレスポンスなら充分ですが、積極的に制御に使うのはちょっと苦しいですね。前の投稿で書いたようにセンサやモーターが簡単に接続しやすいため、ROSが身近になるという効果は大きいので、この辺は我慢することにしましょう。

« WiringPi-Pythonでつまづく | トップページ | sudoなしで最新のWiringPi-Pythonを使うには »

ラズパイでROS」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: ROSでラズパイのGPIOをちゃんと使うには:

« WiringPi-Pythonでつまづく | トップページ | sudoなしで最新のWiringPi-Pythonを使うには »