ROSの勉強 第1弾:topicの配信と購読


#プログラミング ROS< topicの配信と購読 >

はじめに

いよいよROSの勉強にも本腰をいれていく.1つの参考書に沿って,ROS(Robot Operating System)を難なく扱えるようになることが目的である.もうすでに,今までにも勉強はしてきており,簡単なところはすこし理解しているが,ここでは改めて初めから学び,復習も兼ねながら学習を進めていくこととする.

環境

仮想環境
ソフト VMware Workstation 15
実装RAM 2 GB
OS Ubuntu 64 ビット
isoファイル ubuntu-mate-20.04.1-desktop-amd64.iso
コンピュータ
デバイス MSI
プロセッサ Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz
実装RAM 8.00 GB (7.89 GB 使用可能)
OS Windows (Windows 10 Home, バージョン:1909)
ROS
Distribution noetic
プログラミング言語 Python 3.8.5

topic

トピック(topic):ノード間での通信を行う最も一般的な方法
様々なノードにデータが散らばる分散システムにおけるデータ交換でよく使われる配信/購読(publish/subscribe)型の通信メカニズムを実装している.

<流れ>

[step1] 公開: トピック名とおくるメッセージの型をアナウンス

[step2] 配信: ノードが,トピックに実際のデータをつけて送信すること

[step3] 購読: roscoreに要求し,あるトピックのメッセージを受け取ること

topicの配信

公開の項目は設けていないが,配信のプログラムの中で公開が行われている.以下にソースコードを示す.

topic_publisher.py
#! /usr/bin/env python3

import rospy    #ROSに必要な基本的な機能を読み込む

from std_msgs.msg import Int32  #トピックに送るメッセージの定義を読み込む



rospy.init_node('topic_publisher')  #'topic_publisher'という名前でノードを新規作成(初期化)

pub = rospy.Publisher('counter', Int32) #'counter'という名前で,送るメッセージの型をInt32に設定  ←公開


#####ここまでで,トピックは公開される.以下はトピックを使って送るメッセージについて

rate = rospy.Rate(2)    #2Hz(1秒間に2回)でメッセージを送る

count = 0   #送るメッセージを格納する変数
while not rospy.is_shutdown():
    pub.publish(count)
    count += 1  #毎回1増やす(カウント)
    rate.sleep()    #指定したrate(いまは2Hz)で実行されるために十分な時間をスリープする

この時点で,本当に配信できているかは,rostopic listにより見つけられる.さらにrostopic echo /トピック名とすれば,実際に送っているメッセージをターミナル(端末)上で見られる.

このような感じである.注意点は,topic_publisher.pyを実行時には,roscoreを別のターミナル(端末)で入力し,立ち上げておかなければならない.仲介人が必要なのである.

topicの購読

先ほどの手順で手動で配信メッセージを拝見できるが,この配信されているメッセージ内のデータを扱いたいときには購読する必要がある.以下にそのソースコードを示す.

topic_subscriber.py
#! /usr/bin/env python3

import rospy    #ROSに必要な基本的な機能を読み込む

from std_msgs.msg import Int32  #トピックに送るメッセージの定義を読み込む


def callback(msg):
    """ callback関数:購読するときに実行させる関数

        引数にmsgとあるが,関数を指定するときは特に引数を渡すことはない.
        自動的に購読対象を引数とする.

    """
    print(msg.data) #購読したメッセージのdataという変数に格納されているものを表示


rospy.init_node('topic_subscriber') #'topic_subscriber'という名前でノードを新規作成(初期化)


sub = rospy.Subscriber('counter', Int32, callback)  #'counter', Int32のトピックを購読し,実行させる関数をcallbackに設定

rospy.spin()    #継続して処理をさせる.while not is_shutdown()のショートカットといえる

roscoretopic_publisher.pyを実行している状態で,topic_subscriber.pyを実行する.そのときのtopic_subscriber.pyを実行しているターミナル(端末)を以下に示す.

確かに,そのソーコードで示した指示通り,1ずつカウントされていることが分かる.

感想

ROSは幾度も独学してきたがうまく整理ができていなかった.今回から,ここでまとめていくことで整理出来たらと思う.ROSは便利なツールである分,参考書も分厚く先は長そうだが,1~2か月でこの参考書1冊を終わらせたい思い出やっていく.

参考文献

プログラミングROS Pythonによるロボットアプリケーション開発
        Morgan Quigley, Brian Gerkey, William D.Smart 著
                       河田 卓志 監訳
            松田 晃一,福地 正樹,由谷 哲夫 訳
                  オイラリー・ジャパン 発行