2024年6月
            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            

カテゴリー

ブログパーツ

無料ブログはココログ

« PICとXBeeでツィートしてみる(拾遺) | トップページ | PIC24Fに手を出してみる »

2013年2月 6日 (水)

pythonでノードを作る(パブリッシュ編)

ROSさんお手やわらかに:ROS入門編

pythonでノードを作る方法。チュートリアルのこのページ

beginner_tutorialsにscriptsというディレクトリをつくり、以降のファイルはそこに置く。

まずは発行(パブリッシュ)するノードtalker.pyを作る。僕はGUIのエディタで入力した。
ファイルが出来たら

chmod +x scripts/talker.py

で実行可能にしておく。

下記がtalker.pyの解説だ。ブログにコードを貼るとインデントが崩れてしまうが、pythonはインデントに意味があるので、もとページのコードを参照のこと。

1 #!/usr/bin/env python
2 import roslib; roslib.load_manifest('beginner_tutorials')
最初の行はおまじない。pythonで書くときは必ずつける。2行目は、このノードはパッケージbeginner_tutorialsに属し、そのマニュフェストを参照する設定らしい。良くわからないが、こういうものだということで先に進む。

3 import rospy
4 from std_msgs.msg import String
3行目、ノードをpythonで書くときはこれが必要。これもおまじないの一種だな。4行目はstd_msg.msgオブジェクト(?)からStringクラス(?)を読み込む。以降Stringと表記されるのはstd_msg.msg.Stringクラスのことを意味するようになる。

7 def talker():
8 pub = rospy.Publisher('chatter', String)
9 rospy.init_node('talker')
7行目はtalkerというノードを定義する。8行目はchatterというトピックにStringというメッセージタイプを発行(パブリッシュ)する定義。
9行目、これでノードを初期化する。原文に「重要」とある。名前はベースネーム、つまり/とか~とか入らないものということらしい。普通に名前付けすればいいようだ。

10 while not rospy.is_shutdown():
11 str = "hello world %s" % rospy.get_time()
12 rospy.loginfo(str)
13 pub.publish(String(str))
14 rospy.sleep(1.0)
ここが本体の実行ループだ。このプロセスがCTRL+cなどでシャットダウンされるまで一秒おきにhello worldに時刻をつけてパブリッシュ(発行)する。ちなみにブログに張るとインデントが崩れてしまうが、これはpython、インデントが実行単位になっているので要注意。言うまでもないが14行目は一秒待つという意味。

もっと複雑なタイプを発行するにはどうするのかが書いてある。「一般に、コンストラクタの引数が.msgファイルの順番に並んでいること」だそうだ。つまりここ【4項目め】でやったmsgファイルでの構造体の定義順ということか。並びはカンマで切るのかな?
それからString(str)はこんな風に書くことも出来る。(それで?)

msg = String()
msg.data = str

あるいは

String(data=str)


17 if __name__ == '__main__':
18 try:
19 talker()
20 except rospy.ROSInterruptException:
21 pass
ここで前で定義したtalker()を実行する。tryでつかまえる例外がrospy.ROSInterruptException。この例外はsleep()中にCTRL+cなどのシャットダウンイベントで発生、これを感知したら直ちにプログラムを終了させるため。このtalker()ではsleep()のあとに何もコードがないから関係ないが、sleep()の後に何かしらのコードがあると、シャットダウンを受け付けた後にそれを実行してしまうから。

こういう形が発行(パブリッシュ)の雛形のようだ。

« PICとXBeeでツィートしてみる(拾遺) | トップページ | PIC24Fに手を出してみる »

ROSさんお手やわらかに」カテゴリの記事

コメント

コメントを書く

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

トラックバック


この記事へのトラックバック一覧です: pythonでノードを作る(パブリッシュ編):

« PICとXBeeでツィートしてみる(拾遺) | トップページ | PIC24Fに手を出してみる »