トピック通信の基本概念
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