ROSの勉強 第3弾:配信者と購読者の混合


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

はじめに

1つの参考書に沿って,ROS(Robot Operating System)を難なく扱えるようになることが目的である.改めて初めから学び,復習も兼ねながら学習を進めていくこととする.その第3弾として,配信者と購読者の混合を扱う.

環境

仮想環境
ソフト 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

配信者と購読者の混合とは?

文字通り,1つのノードに配信者と購読者の機能を持たせることである.1つのファイル内で,配信者と購読者のコードを記述できる.このようにROSでは複数の配信と購読を1つのノードで行うことができる.

どんなときに1つのノードに配信者と購読者の機能を持たせるのか?

データに何らかの処理を加えて変換するときなど.
例えば,カメラの画像を含むトピックを購読して,その画像から顔を検出し,顔の位置をほかのトピックとして配信するかもしれない.このような場合,「購読」してさらに「配信」することとなる.

実装

ここでは,何かしら数値を得た時に,それを2倍にした値を配信する例を扱う.以下にソースコードを示す.

ソースコード
doubler.py
#! /usr/bin/env python3

import rospy

from std_msgs.msg import Int32

rospy.init_node('doubler')  #doublerという名前でノード作成

def callback(msg):
    """ データ変換のように,新たなデータを受け取ったときのみに変換するために,この関数内で配信する """
    doubled = Int32()           #データにアクセスするためにインスタンス作成
    doubled.data = msg.data * 2 #受け取ったデータを2倍にする
    pub.publish(doubled)        #callback関数実行するときのみ配信

sub = rospy.Subscriber('number', Int32, callback)           #numberというトピックを購読
pub = rospy.Publisher('doubled', Int32, queue_size = 10)    #配信準備

rospy.spin()

以下にプログラムを実行後,今扱われているトピックをrostopic listにより表示させたターミナル(端末)を示す.

確かに/doubled/numberの2つが扱われている.ここでは,前者が配信で,後者が購読対象である.では,ここで購読対象にrostopic pubを使って,値を入力し,そのときの出力を見てみる.以下に3つのターミナル(端末)を示す.上から順に,「プログラム実行」,「購読対象に値を入力」,「配信情報の観察」である.

2, 3が入力されると,結果として4,6が配信されていることが分かる.ただし,入力されないと配信はされない.なぜなら,上のソースコードにおいて,publish()callback()内にあり,Subscriber()が動くたびのみに,配信するためである.これは,このノードの目的がデータ変換する(ここでは,購読しているトピックからやってきた数を2倍にする)ことなので,新しいデータが入ってきたときにだけデータを配信したいという考えが背景にある.

感想

今回で,トピックの学習は終わりである.最後に混合によるデータ変換を学んだが,まさにラジコンなどでPS4のコントローラを使うときにjoyから得られるデータをcmd_velに変換したいときが出てくると思うが,そのときの変換はこれを使えばよいのかなとヒントが得られた気がする.実際にやってみるが,その結果はまた別にまとめることとする.

参考文献

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