Topics

The connective tissue of your system.

Topics are defined in EMOS with a Topic class that specifies the Data Contract (Type/Name of the ROS2 topic), the Behavior (QoS), and the Freshness Constraints (Timeout) for a specific stream of information.

Topics act as the bridge for both:

  1. Component I/O: They define what data a Component produces or consumes.

  2. Event Triggers: They act as the “Sensors” for the Event-Driven system, feeding data into the Blackboard.

Why Use EMOS Topics?

  • Declarative Wiring - No more hardcoded strings buried in your components. Define your Topics as shared resources and pass them into Components during configuration.

  • Freshness Monitoring - An EMOS Topic can enforce a data_timeout. If the data is too old, the Event system knows to ignore it, preventing “Stale Data” bugs.

  • Lazy Type Resolution - You don’t need to import message classes at the top of every file. EMOS resolves types like 'OccupancyGrid' or 'Odometry' at runtime, keeping your code clean and decoupling dependencies.

  • QoS Abstraction - Quality of Service profiles are configured via simple Python objects directly in your recipe.

Usage Example

from ros_sugar.config import QoSConfig
from ros_sugar.io import Topic

qos_conf = QoSConfig(
    history=qos.HistoryPolicy.KEEP_LAST,
    queue_size=20,
    reliability=qos.ReliabilityPolicy.BEST_EFFORT,
    durability=qos.DurabilityPolicy.TRANSIENT_LOCAL
)

topic = Topic(name='/local_map', msg_type='OccupancyGrid', qos_profile=qos_conf)

Advanced: Smart Type Resolution

One of EMOS’s most convenient features is String-Based Type Resolution. In standard ROS2, you must import the specific message class (from geometry_msgs.msg import Twist) to create a publisher or subscriber. EMOS handles this import for you dynamically.

from ros_sugar.io import Topic
from std_msgs.msg import String

# Method 1: The Standard Way (Explicit Class)
# Requires 'from std_msgs.msg import String'
topic_1 = Topic(name='/chatter', msg_type=String)

# Method 2: The EMOS Way (String Literal)
# No import required. EMOS finds 'std_msgs/msg/String' automatically.
topic_2 = Topic(name='/chatter', msg_type='String')

See also

See the full list of automatically supported message types in the advanced types reference.

Component Integration

Once defined, Topics are passed to Components to automatically generate the ROS2 infrastructure.

from ros_sugar.core import BaseComponent
from ros_sugar.io import Topic

# When this component starts, it automatically creates:
# - A Subscriber to '/scan' (LaserScan)
# - A Publisher to '/cmd_vel' (Twist)
my_node = BaseComponent(
    component_name="safety_controller",
    inputs=[Topic(name="/scan", msg_type="LaserScan")],
    outputs=[Topic(name="/cmd_vel", msg_type="Twist")]
)