#プログラミング 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の配信
公開の項目は設けていないが,配信のプログラムの中で公開が行われている.以下にソースコードを示す.
#! /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の購読
先ほどの手順で手動で配信メッセージを拝見できるが,この配信されているメッセージ内のデータを扱いたいときには購読する必要がある.以下にそのソースコードを示す.
#! /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()のショートカットといえる
roscore
,topic_publisher.py
を実行している状態で,topic_subscriber.py
を実行する.そのときのtopic_subscriber.py
を実行しているターミナル(端末)を以下に示す.
確かに,そのソーコードで示した指示通り,1ずつカウントされていることが分かる.
##感想
ROSは幾度も独学してきたがうまく整理ができていなかった.今回から,ここでまとめていくことで整理出来たらと思う.ROSは便利なツールである分,参考書も分厚く先は長そうだが,1~2か月でこの参考書1冊を終わらせたい思い出やっていく.
##参考文献
プログラミングROS Pythonによるロボットアプリケーション開発
Morgan Quigley, Brian Gerkey, William D.Smart 著
河田 卓志 監訳
松田 晃一,福地 正樹,由谷 哲夫 訳
オイラリー・ジャパン 発行