Chapter 5: Publishers & Subscribers
Topic Communication​
Topics are the primary way nodes exchange data in ROS 2. They use a publish-subscribe pattern for asynchronous, one-to-many communication.
Message Types​
Common message types:
from std_msgs.msg import String, Int32, Float64, Bool
from geometry_msgs.msg import Twist, Pose, Point
from sensor_msgs.msg import Image, LaserScan, Imu
Advanced Publisher​
from geometry_msgs.msg import Twist
class RobotController(Node):
def __init__(self):
super().__init__('robot_controller')
self.cmd_vel_pub = self.create_publisher(Twist, 'cmd_vel', 10)
self.timer = self.create_timer(0.1, self.move_robot) # 10Hz
def move_robot(self):
msg = Twist()
msg.linear.x = 0.5 # Forward 0.5 m/s
msg.angular.z = 0.2 # Turn 0.2 rad/s
self.cmd_vel_pub.publish(msg)
Advanced Subscriber​
from sensor_msgs.msg import LaserScan
class ObstacleDetector(Node):
def __init__(self):
super().__init__('obstacle_detector')
self.scan_sub = self.create_subscription(
LaserScan, 'scan', self.scan_callback, 10)
def scan_callback(self, msg):
min_distance = min(msg.ranges)
if min_distance < 0.5: # Obstacle within 0.5m
self.get_logger().warn(f'Obstacle detected: {min_distance}m')
QoS Policies​
from rclpy.qos import QoSProfile, ReliabilityPolicy, DurabilityPolicy
# Sensor data: best effort, transient local
sensor_qos = QoSProfile(
reliability=ReliabilityPolicy.BEST_EFFORT,
durability=DurabilityPolicy.TRANSIENT_LOCAL,
depth=10
)
# Control commands: reliable
control_qos = QoSProfile(
reliability=ReliabilityPolicy.RELIABLE,
depth=10
)
self.sub = self.create_subscription(LaserScan, 'scan', callback, sensor_qos)
Custom Messages​
- Create message file
msg/CustomMsg.msg:
string name
int32 id
float64[] values
-
Update
CMakeLists.txtandpackage.xml -
Use in code:
from my_package.msg import CustomMsg
msg = CustomMsg()
msg.name = "sensor_1"
msg.id = 42
msg.values = [1.0, 2.0, 3.0]
CLI Tools​
# List topics
ros2 topic list
# Echo topic
ros2 topic echo /cmd_vel
# Info
ros2 topic info /scan
# Hz
ros2 topic hz /scan
# Pub from CLI
ros2 topic pub /cmd_vel geometry_msgs/Twist "{linear: {x: 0.5}}"
Exercise: Create node that subscribes to /scan and publishes /cmd_vel to avoid obstacles.