LoginSignup
6
13

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-01-29

#プログラミング 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 /トピック名とすれば,実際に送っているメッセージをターミナル(端末)上で見られる.
キャプチャ.PNG
このような感じである.注意点は,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.PNG
確かに,そのソーコードで示した指示通り,1ずつカウントされていることが分かる.

感想

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

参考文献

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

6
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
13