Up IN・OUT : publish-subscribe の場合 作成: 2026-10-18
更新: 2026-10-22

4足歩行ロボット > 自律型> 神経系 (コンピュータ) > ストアネットワーク > IN・OUT > publish_subscribe

    ROS2ノードのストアは,publisher・subscriber を,つぎの形式で設定する:

       self.create_publisher(
       出荷データの型
       流通名 ("自分のノード名/データ名"),
       10
       )

       self.create_subscriber(
       入荷データの型,
       流通名 ("出荷元のノード名/データ名"),
       データを受け取る変数,
       10
       )

    例えば,視覚NNストアだと,

       self.create_publisher(
       VisualStatus,
       '/visual/status',
       10
       )

       self.create_subscriber(
       CameraData,
       '/camera/data',
       self.camera_callback,
       10
       )

    この文脈で,データは message と呼ばれる。
    流通名の "自分のノード名/データ名" は,topic と呼ばれる。


    この設定の中の
      流通名
      データ受け取り用変数
    は,CPU 視点では,特定メモリ領域のポインタであり,実際その領域の先頭アドレを表す。
     
     註:変数xを宣言することは,メモリ領域を確保し,その先頭アドレスをxが表すようにすること。
    変数は,メモリ領域のポインタである。  


    データの publish は,つぎのようになる:

     1. つぎの変数を予め作成:
       msg = 出荷データの型()
       publish = self.create_publisher()
     2. データを
        msg.feature
      のメモリ領域に作成。
     3. つぎのコマンドが,データの publish になる:
        self.publisher.publish(msg)
     4. 流通名が指すメモリ領域に,データが収まる

    というわけで,
      流通名
      データ受け取り用変数
    が指すメモリ領域が,それぞれストアの OUT と IN バッファということになる。

    まとめ:
      OUT : 流通名がこれのポインタを表す
      IN  : データ受け取り用変数がこれのポインタを表す


    ROS2 は,この2つのメモリ領域を OUT (出荷用倉庫)・IN (入荷用倉庫) として使う。

    特に,ストアの IN, OUT は,ストアと ROS2 のどちらに属するかを問うというものではない。


    ところで,1つのストアが subscribe, publish するデータは,一般に1つと限るものではない。
    そして 「複数の流通名,複数のデータ受け取り用変数」 は,OUT, IN のつぎの絵図になる:
      倉庫 IN, OUT は,それぞれ
      トピックごとの棚で成る
        (棚:メモリ領域)

    そして,publish-subscribe のデータ流通は:
    1. ストアAが,データを topic "a/data" として作成し,publish
    2. ROS2 が,"a/data" の subscriber になっているストアに,publish があったことを call
    3. subscriber のストアBは,これに callback
    4. ROS2 が,
        ストアA の OUT の "a/data" 棚から
        ストアB の IN の "a/data" 棚へ
      データを送る (コピー)
    5. これは,ストアB が "a/data" 受け取りように設定した変数に,データが代入されたということ


    注意.
    データ流通を 「物流」 モデルで考えることのミスリーディングは,「距離」 の錯覚である。
    ストアは,実行ファイル。
    これを起動すると,いろいろなメモリ領域がつくられるが,IN・OUT はその中のもの。
    「ストアA の IN・OUT」 の意味は,Aのプロセスが owner であるメモリ領域 IN・OUT」であり,「互いに近接」 ではない。