ROS2におけるトピック通信の実装

トピック通信の基本概念

ROS2におけるトピック通信は、システム内のノード間でデータを交換するための主要なメカニズムです。パブリッシャーが特定のトピックにデータを公開し、サブスクライバーはそのトピックを購読することでデータを受信できます。この通信方式は、パブリッシュ/サブスクライブモデルに基づいており、データは一方向に流れます。各トピックには一意の名前が必要で、データには固定のメッセージ型が定義されます。

実践的なトピック通信の例

1. 新しいパッケージの作成

まず、トピック通信のデモンストレーション用の新しいROS2パッケージを作成します。

cd ~/ros_ws/src
ros2 pkg create ros2_topic_demo --build-type ament_python --dependencies rclpy --node-name message_publisher

このコマンドは、ros2_topic_demoという名前のパッケージを作成し、message_publisherというノードを含みます。必要な設定ファイルも自動的に生成されます。

2. パブリッシャーの実装

次に、メッセージを公開するパブリッシャーを実装します。

# rclpyライブラリのインポート
import rclpy
from rclpy.node import Node
# 文字列メッセージ型のインポート
from std_msgs.msg import String

class MessagePublisher(Node):
    def __init__(self, node_name):
        super().__init__(node_name)
        # パブリッシャーの作成
        # 引数: メッセージ型、トピック名、キューの深さ
        self.publisher = self.create_publisher(String, "/demo_topic", 10)
        # 定期的なメッセージ送信のためのタイマーの設定
        self.timer = self.create_timer(0.5, self.send_message)
    
    # メッセージ送信関数
    def send_message(self):
        message = String()
        message.data = "こんにちは、メッセージを送信しています"
        self.publisher.publish(message)
        self.get_logger().info('メッセージを公開しました: "%s"' % message.data)

def main():
    rclpy.init()
    publisher_node = MessagePublisher("publisher")
    rclpy.spin(publisher_node)
    publisher_node.destroy_node()
    rclpy.shutdown()

3. サブスクライバーの実装

次に、メッセージを受信するサブスクライバーを実装します。

# 必要なライブラリのインポート
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class MessageSubscriber(Node):
    def __init__(self, node_name):
        super().__init__(node_name)
        # サブスクライバーの作成
        # 引数: メッセージ型、トピック名、コールバック関数、キューの深さ
        self.subscription = self.create_subscription(
            String, 
            "/demo_topic", 
            self.message_callback, 
            10
        )
    
    # メッセージ受信時のコールバック関数
    def message_callback(self, received_msg):
        self.get_logger().info('受信したメッセージ: "%s"' % received_msg.data)

def main():
    rclpy.init()
    subscriber_node = MessageSubscriber("subscriber")
    rclpy.spin(subscriber_node)
    subscriber_node.destroy_node()
    rclpy.shutdown()

4. 設定ファイルの編集とワークスペースのビルド

setup.pyファイルを編集し、ワークスペースをビルドします。

cd ~/ros_ws
colcon build --packages-select ros2_topic_demo
source install/setup.bash

5. プログラムの実行

別々のターミナルでパブリッシャーとサブスクライバーを実行します。

# パブリッシャーノードの起動
ros2 run ros2_topic_demo message_publisher

# サブスクライバーノードの起動
ros2 run ros2_topic_demo message_subscriber

タグ: ros2 rclpy トピック通信 パブリッシャー サブスクライバー

6月22日 20:05 投稿