Main Content

ROS 2 ネットワークへの接続

ROS 2 ネットワークは、複数の "ROS 2 ノード" で構成されます。ROS では、ROS マスターがすべてのアクティブな ROS エンティティを追跡することにより通信を円滑にしていますが、ROS 2 は検出、シリアル化、転送などの機能を備えたエンドツーエンドのミドルウェアである Data Distribution Standard (DDS) に基づきます。これらの機能は "分散検出" などの ROS 2 の設計原則に沿ったものであり、転送の各種 "サービス品質" オプションを制御します。

ROS 1 ネットワークに接続するには、ROS ネットワークへの接続を参照してください。

ROS 2 を操作する場合、一般的に以下の手順に従います。

  • "ROS 2 ネットワークに接続" します。ROS 2 ネットワークに接続するには、MATLAB で ROS 2 ノードを作成し、ネットワーク ドメイン ID を指定する必要があります。

  • "データを交換" します。接続後、MATLAB は、パブリッシャーやサブスクライバーを介して、同じドメイン ID の他の ROS 2 ノードとデータを交換します。

  • "ROS 2 ネットワークから切断" します。ノード、パブリッシャー、およびサブスクライバーに対するすべての参照を消去すると、MATLAB が ROS 2 ネットワークから削除されます。

既定のドメインでの ROS 2 ノードの作成

既定のドメインでノードを作成するには ros2node を使用します。このとき、ID として 0 が使用されます。ノードは同じドメインの他のノードと通信し、別のドメインのノードについては認識しません。

defaultNode = ros2node("/default_node")
defaultNode = 
  ros2node with properties:

    Name: '/default_node'
      ID: 0

clear を使用するとノードへの参照が削除され、ROS 2 ネットワークからそのノードを削除できるようになります。

clear defaultNode

別のドメインでの ROS 2 ノードの作成

既定でないドメインのノードを作成するには、ros2node の 2 番目の入力引数としてドメイン ID を明示的に指定します。以下では、ID 25 で指定されたドメインで newDomainNode が作成されます。

newDomainNode = ros2node("/new_domain_node",25)
newDomainNode = 
  ros2node with properties:

    Name: '/new_domain_node'
      ID: 25

特定のドメインのネットワーク情報を表示するには、ID を関数 ros2 のパラメーターとして指定します。次のコマンドは、ドメイン ID が 25 であるノードをすべて表示します。

ros2("node","list","DomainID",25)
/new_domain_node

既定のドメイン ID の変更

ドメイン ID が明示的にノードや ros2 コマンドで指定されない場合、環境変数 ROS_DOMAIN_ID の値が既定で使用されます。現在値を確認するには、getenv を使用します。この環境変数が設定されていないか、有効な値が設定されていない場合、既定のドメイン ID として 0 が使用されます。

getenv("ROS_DOMAIN_ID")
ans =

  0x0 empty char array

ROS_DOMAIN_ID は、setenvコマンドを使用して設定できます。

setenv("ROS_DOMAIN_ID","25")
envDomainNode = ros2node("/env_domain_node")
envDomainNode = 
  ros2node with properties:

    Name: '/env_domain_node'
      ID: 25

関数 ros2 は、この環境変数で指定されたネットワークに関する情報を提供します。ros2 node list を使用して、ドメイン ID が 25 であるノードを表示します。

ros2 node list
/env_domain_node
/new_domain_node

ROS_DOMAIN_ID を既定値にリセットします。

setenv("ROS_DOMAIN_ID","")

ROS 2 ネットワークとの通信

既存の ROS 2 ネットワークに接続するには、目的のドメインでノードを作成します。ROS 2 ネットワークは、"検出" と呼ばれるメカニズムで、同じドメインで作成されたすべての新しいノードを自動検出します。

起動時に、ROS 2 の各ノードは同じドメインの他のノードに自分の存在をアドバタイズします。他のノードは自分の情報を新しいノードに提供することにより、このアドバタイズに応答します。パブリッシャーやサブスクライバーのような通信オブジェクトをもつノードでは、対応するオブジェクトが互換性のあるサービス品質 (QoS) に設定されたノードである場合に、そのノードとの接続を確立します。QoS 設定の詳細については、Manage Quality of Service Policies in ROS 2を参照してください。

検出は継続的に実行されるプロセスで、これにより新しいノードが作成されると同時にネットワークに参加できます。各ノードは ROS 2 ネットワークをモニタリングし、ROS ネットワークの ROS マスターと同様の動作をします。また、ノードはオフライン状態になると、他のノードに自分の不在をアドバタイズします。

新しい ROS 2 ノードは自分のアドバタイズを既存のノードに送信します。既存のノードはこのアドバタイズに応答し、継続的な通信ができるよう設定を行います。

サブネット外の ROS 通信

サブネットは、IP ネットワークを複数の小さなネットワーク セグメントに論理分割したものです。ROS 2 ノードは同じサブネット内の他のノードと通信できます。サブネット外にあるノードを検出するには、DEFAULT_FASTRTPS_PROFILE.xml ファイルを作成し、MATLAB が使用する特定の DDS 実装を構成します。通信相手となるサブネット外のシステムの IP アドレスのリストを、address 要素内に追加します。通信を行うどちらのシステムも、通信相手のアドレスを各自の DEFAULT_FASTRTPS_PROFILE.xml ファイルで指定しなければならないことに注意してください。domainId 要素を、通信に使用するネットワークに応じた値に設定します。

このファイルを MATLAB の "現在の作業ディレクトリ" に保存します。MATLAB の外で ROS 2 を使用しているシステムでは、ROS 2 アプリケーションが実行されるディレクトリと同じディレクトリにこのファイルを配置する必要があります。以下は DEFAULT_FASTRTPS_PROFILES.xml ファイルの例です。

<?xml version="1.0" encoding="UTF-8" ?>
<profiles>
    <participant profile_name="participant_win" is_default_profile="true">
        <rtps>
            <builtin>
                <domainId>0</domainId>
                 <initialPeersList>
                     <locator>
                         <kind>UDPv4</kind>
                         <address>192.34.17.36</address>
                     </locator>
                     <locator>
                         <kind>UDPv4</kind>
                         <address>182.30.45.12</address>
                     </locator>
                     <locator>
                         <kind>UDPv4</kind>
                         <address>194.158.78.29</address>
                     </locator>
                 </initialPeersList>
             </builtin>
         </rtps>
     </participant>
</profiles> 

ROS 2 は、DEFAULT_FASTRTPS_PROFILES.xml 内に記録されている IP アドレスのシステムに存在するノードに情報をアドバタイズします。DEFAULT_FASTRTPS_PROFILES.xml が存在しないか、このファイルに正しい IP アドレスが含まれていない場合、サブネットの外にある他のマシンのノードからの情報は取得されません。

次のステップ