# Topics
**The connective tissue of your system.**
Topics are defined in Sugarcoat 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 Sugarcoat Topics?
- {material-regular}`link;1.5em;sd-text-primary` Declarative Wiring - No more hardcoded strings buried in your components. Define your Topics as shared resources and pass them into Components during configuration.
- {material-regular}`timer;1.5em;sd-text-primary` Freshness Monitoring - Sugarcoat Topic can enforce a `data_timeout`. If the data is too old, the Event system knows to ignore it, preventing "Stale Data" bugs.
- {material-regular}`auto_awesome;1.5em;sd-text-primary` Lazy Type Resolution - You don't need to import message classes at the top of every file. Sugarcoat resolves types like `'OccupancyGrid'` or `'Odometry'` at runtime, keeping your code clean and decoupling dependencies.
- {material-regular}`tune;1.5em;sd-text-primary` QoS Abstraction - Quality of Service profiles are configured via simple Python objects directly in your recipe.
## Usage Example
```python
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 Sugarcoat'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. Sugarcoat handles this import for you dynamically.
```python
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 Sugarcoat Way (String Literal)
# No import required. Sugarcoat finds 'std_msgs/msg/String' automatically.
topic_2 = Topic(name='/chatter', msg_type='String')
```
:::{seealso}
See the full list of automatically supported message types [here](../advanced/types.md).
:::
## Component Integration
Once defined, Topics are passed to [Components](./component.md) to automatically generate the ROS2 infrastructure.
```python
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")]
)
```