ROS 2 入門
この例では、MATLAB 内で ROS 2 を設定し、ROS 2 ネットワークおよび ROS 2 メッセージに関する情報を取得する方法について説明します。
Robot Operating System 2 (ROS 2) は ROS の 2 番目のバージョンであり、ロボット システムのさまざまな部分によるデータの検出や送受信を可能にする通信インターフェイスです。ROS 2 に対する MATLAB® のサポートは、ROS 2 対応の物理的ロボット、または Gazebo® などのロボット シミュレーターとデータを交換できる関数のライブラリです。ROS 2 は検出、シリアル化、転送などの機能を備えたエンドツーエンドのミドルウェアである Data Distribution Service (DDS) を基に構築されています。これらの機能は "分散検出" などの ROS 2 の設計原則に沿ったものであり、転送の各種 "サービス品質" オプションを制御します。DDS は、UDP など信頼性の低いネットワーク プロトコル経由での通信を提供する Real Time Publish-Subscribe (RTPS) プロトコルを使用します。詳細については、RTPS を参照してください。
ROS の詳細については、ROS 入門を参照してください。
ROS 2 の用語
"ROS 2 ネットワーク" は、ROS 2 ネットワーク経由で通信するロボット システムのさまざまな部分 (プランナーやカメラ インターフェイスなど) で構成されます。ネットワークは複数のマシンに分散させることができます。
"ROS 2 ノード" は、関連する ROS 2 機能 (パブリッシャーとサブスクライバーなど) のコレクションを含むエンティティです。1 つの ROS 2 ネットワークに複数の ROS 2 ノードを含めることができます。
"パブリッシャー" および "サブスクライバー" は、データを処理する異なった種類の ROS 2 エンティティです。これらは "メッセージ" を使用してデータを交換します。
パブリッシャーが特定の "トピック" ("odometry" など) にメッセージを送信し、そのトピックのサブスクライバーがメッセージを受信します。複数のパブリッシャーとサブスクライバーを単一のトピックに関連付けることができます。
"ドメイン" は、ネットワークの物理的セグメンテーションです。"ドメイン ID" という一意の整数値によって識別されます。既定では、"ドメイン ID" は
0
です。ROS 2 ネットワークの各ノードは、作成時に同じ "ドメイン ID" の他のノードのみに自身の存在をアドバタイズします。
"ROS 2" ネットワークは、Data Distribution Service (DDS) を基に構築されているため、分散ネットワーク全体で複数のノードを接続できます。詳細については、Switching Between ROS Middleware Implementationsを参照してください。
"RTPS" (Real Time publisher-subscriber) プロトコルは、信頼性の低いネットワーク条件でメッセージを送信する機能をもつ ROS 2 ネットワークを提供します。
ROS 2 では、さまざまな "サービス品質 (QoS)" ポリシーが提供されており、ノード間の通信を調整できます。詳細については、Manage Quality of Service Policies in ROS 2を参照してください。
詳細については、Robot Operating System (ROS 2) および ROS 2 Web サイトの Concepts のセクションを参照してください。
ROS 2 ネットワークの初期化
ROS とは異なり、ROS 2 には MATLAB での初期化は不要です。ノードを作成すると、ROS 2 ネットワークは自動的に起動します。
ros2node
を使用してノードを作成します。
test1 = ros2node("/test1")
test1 = ros2node with properties: Name: '/test1' ID: 0
ros2 node list
を使用して ROS 2 ネットワーク内のすべてのノードを確認します。
ros2 node list
/test1
clear
を使用して ROS 2 ネットワーク内のノードをシャットダウンします。
clear test1
exampleHelperROS2CreateSampleNetwork
を使用して、ROS ネットワークに、サンプルのパブリッシャーとサブスクライバーをもつ 3 つの追加ノードを作成します。
exampleHelperROS2CreateSampleNetwork
ros2 node list
を再度使用して、新しいノードを確認します。
ros2 node list
/node_1 /node_2 /node_3
これは、サンプル ノードの作成後の ROS 2 ネットワークを視覚的に表現したものです。この図を参照して、例の残りの部分で ROS 2 ネットワークを確認してください。
トピックとサービス品質ポリシー
コマンド ros2 topic list
を実行して、ROS 2 ネットワーク内の使用可能なトピックを確認します。このコマンドでは、/pose
、/parameter_events,
、/scan
の 3 つのアクティブなトピックが返されます。トピック /parameter_events
は、ROS 2 ネットワークに常に存在するグローバル トピックです。ノードは /paramater_events
トピックを使用して、ネットワーク内でパラメーターを監視または変更します。/scan
トピックと /pose
トピックは、サンプル ネットワークの一部として作成したものです。
ros2 topic list
/parameter_events /pose /rosout /scan
トピックは、それぞれ 1 つの "メッセージ タイプ" に関連付けられています。コマンド ros2 topic list -t
を実行して、各トピックのメッセージ タイプを確認します。
ros2 topic list -t
Topic MessageType _____________________ _________________________________ {'/parameter_events'} {'rcl_interfaces/ParameterEvent'} {'/pose' } {'geometry_msgs/Twist' } {'/rosout' } {'rcl_interfaces/Log' } {'/scan' } {'sensor_msgs/LaserScan' }
サービス品質 (QoS) ポリシー オプションでは、パブリッシャーとサブスクライバーがメッセージを処理して交換する方法を変更します。
1. History
および Depth
QoS ポリシーを使用して、処理キューへのメッセージの配置方法に基づいて通信オブジェクトの動作を決定します。History
は次のオプションのいずれかとして指定します。
"keeplast"
— メッセージを破棄し、最新の情報のみを保持します。"keepall"
— 処理されるまですべてのメッセージをキューで受信したまま保持します。
2. Reliability
QoS ポリシーを使用して、メッセージがサブスクライバーに確実に配信されるようにします。Reliability
は次のオプションのいずれかとして指定します。
"reliable"
— サブスクライバーがメッセージの受信を確認するまで、パブリッシャーがサブスクライバーにメッセージを確実に送信し続けるようにします。"besteffort"
— パブリッシャーがメッセージを 1 回だけ送信できるようにします。
3. Depth
入力を指定した Durability
QoS ポリシーを使用して、遅れて参加した接続のためのメッセージの持続性を制御します。Durability
は次のオプションのいずれかとして指定します。
"transientlocal"
— パブリッシャーが最初にメッセージを送信した後にサブスクライバーがネットワークに参加した場合、パブリッシャーはサブスクライバーに持続メッセージを送信します。"volatile"
— パブリッシャーは、メッセージの送信後にそのメッセージを保持しません。サブスクライバーはパブリッシャーに持続メッセージを要求しません。
メッセージ
パブリッシャーとサブスクライバーは、ROS 2 メッセージを使用して情報を交換します。ROS 2 メッセージにはそれぞれ、メッセージ内の情報のデータ型とレイアウトを定義するメッセージ タイプが関連付けられています。詳細については、基本的な ROS 2 メッセージの操作を参照してください。
ros2 msg show
を使用して、メッセージ タイプのプロパティを表示します。geometry_msgs/Twist
メッセージ タイプには、Linear
と Angular
の 2 つのプロパティがあります。各プロパティは geometry_msgs/Vector3
タイプのメッセージであり、これには double
型の 3 つのプロパティがあります。
ros2 msg show geometry_msgs/Twist
# This expresses velocity in free space broken into its linear and angular parts. Vector3 linear Vector3 angular
ros2 msg show geometry_msgs/Vector3
# This represents a vector in free space. # This is semantically different than a point. # A vector is always anchored at the origin. # When a transform is applied to a vector, only the rotational component is applied. float64 x float64 y float64 z
MATLAB で使用可能なメッセージ タイプの完全なリストを確認するには、 ros2 msg list
を使用します。
ROS 2 ネットワークからの切断
exampleHelperROS2ShutDownSampleNetwork
を使用して、サンプル ノード、パブリッシャー、およびサブスクライバーを ROS 2 ネットワークから削除します。独自のノードを削除するには、ノード、パブリッシャー、サブスクライバーのいずれかのオブジェクトを指定して、clear
を使用します。
exampleHelperROS2ShutDownSampleNetwork
DDS と RMW 実装
MATLAB® および Simulink® で ROS 2 を操作する場合、Data Distribution Service (DDS) を使用するために RMW 実装を切り替えることができます。必要な RMW 実装を構成するには、以下の手順に従います。
1. MATLAB ツールストリップの [ホーム] タブの [環境] セクションで、[基本設定] を開きます。
2. [ROS Toolbox 基本設定] ダイアログ ボックスで Python™ 環境を構成し、[ROS ミドルウェア (RMW) 実装] ドロップダウン リストから実装を選択します。既定の実装は rmw_fastrtps_cpp
です。
3. [カスタム RMW 実装を構成しそれに切り替える] をクリックしてカスタム RMW 実装に切り替えます。[ROS ミドルウェア構成] ダイアログ ボックスが起動します。
4. カスタム RMW 実装パッケージをインストールしてビルドし、選択したカスタム RMW 実装をもつ ROS 2 ノードの作成を検証します。