This report analyzes the evolution from Autoware 2025.02 (February 2025 release) to 0.45.1 (July 2025), revealing a significant versioning scheme change from date-based (YYYY.MM) to semantic versioning (0.x.x), along with architectural improvements and the reintroduction of experimental components like Agnocast.
timeline
title Autoware Versioning Evolution
section Date-Based Versions
2024.11 : November 2024
2025.01 : January 2025
2025.02 : February 2025
: Last date-based version
: Modular architecture
section Semantic Versions
0.45.0 : ~June 2025
: New versioning scheme
: Agnocast reintroduced
0.45.1 : July 2025
: Current version
: Agnocast integrated
: Monolithic tendencies
The project transitioned from date-based versioning (YYYY.MM) to semantic versioning (0.x.x):
- Old: 2025.02 (February 2025)
- New: 0.45.1 (July 2025)
This suggests a shift toward more traditional software versioning, possibly indicating the project is approaching a 1.0 stable release.
graph TD
A[src/] --> B[core/]
A --> C[launcher/]
A --> D[param/]
A --> E[sensor_component/]
A --> F[sensor_kit/]
A --> G[universe/]
A --> H[vehicle/]
B --> B1[Core stable packages]
C --> C1[Launch configurations]
D --> D1[Centralized parameters]
E --> E1[Sensor drivers/interfaces]
F --> F1[Sensor kit configs]
G --> G1[Experimental packages]
H --> H1[Vehicle configs]
style D fill:#4A7C59,color:#FFFFFF
style F fill:#4A7C59,color:#FFFFFF
style H fill:#4A7C59,color:#FFFFFF
graph TD
A[src/] --> B[core/]
A --> C[launcher/]
A --> D[middleware/]
A --> E[sensor_component/]
A --> G[universe/]
B --> B1[Core packages + rviz_plugins]
C --> C1[Launch configurations]
D --> D1[NEW: Agnocast middleware]
E --> E1[Sensor drivers/interfaces]
G --> G1[Experimental packages]
style D fill:#D4A017,color:#000000
style param fill:#8B0000,stroke:#8B0000,color:#FFFFFF
style sensor_kit fill:#8B0000,stroke:#8B0000,color:#FFFFFF
style vehicle fill:#8B0000,stroke:#8B0000,color:#FFFFFF
graph TB
subgraph "2025.02 Architecture"
subgraph "Modular Design"
A1[Core] --> A2[Universe]
A2 --> A3[Launch]
A4[Sensor Kits<br/>- sample_sensor_kit<br/>- awsim_sensor_kit<br/>- single_lidar_kit] --> A3
A5[Vehicles<br/>- sample_vehicle<br/>- awsim_labs_vehicle<br/>- pacmod_interface] --> A3
A6[Parameters<br/>individual_params] --> A3
A7[Sensor Component] --> A4
end
subgraph "Customization"
C1[Custom Sensor Kit Package]
C2[Custom Vehicle Package]
C3[Custom Parameters]
end
C1 -.->|Pluggable| A4
C2 -.->|Pluggable| A5
C3 -.->|Override| A6
end
subgraph "0.45.1 Architecture"
subgraph "Integrated Design"
B1[Core + RViz] --> B2[Universe]
B2 --> B3[Launch<br/>with configs]
B3 --> B4[Middleware<br/>Agnocast]
B2 --> B5[Embedded<br/>Sensor Configs]
B2 --> B6[Embedded<br/>Vehicle Configs]
end
subgraph "Customization"
D1[Config Files]
D2[Launch Args]
D3[Env Variables]
end
D1 -.->|Runtime| B3
D2 -.->|Runtime| B3
D3 -.->|Runtime| B4
end
A4 ==>|Consolidated into| B5
A5 ==>|Consolidated into| B6
A6 ==>|Distributed to| B2
style A4 fill:#4A7C59,color:#FFFFFF
style A5 fill:#4A7C59,color:#FFFFFF
style A6 fill:#4A7C59,color:#FFFFFF
style C1 fill:#4A7C59,color:#FFFFFF,stroke-dasharray: 5 5
style C2 fill:#4A7C59,color:#FFFFFF,stroke-dasharray: 5 5
style C3 fill:#4A7C59,color:#FFFFFF,stroke-dasharray: 5 5
style B4 fill:#D4A017,color:#000000
style B5 fill:#CD5C5C,color:#FFFFFF
style B6 fill:#CD5C5C,color:#FFFFFF
style D1 fill:#D4A017,color:#000000
style D2 fill:#D4A017,color:#000000
style D3 fill:#D4A017,color:#000000
- Agnocast middleware: True zero-copy communication system
- autoware_rviz_plugins: Moved back to core
- bevdet_vendor: BEVDet perception model support
- cuda_blackboard: CUDA memory management
- negotiated: QoS negotiation interfaces
- managed_transform_buffer: TF buffer management
- param/: Centralized parameter management directory
- sensor_kit/: Dedicated sensor kit configurations
- vehicle/: Dedicated vehicle configurations
- Individual sensor/vehicle launch packages (consolidated)
Aspect | 2025.02 | 0.45.1 |
---|---|---|
Version tracking | Commit hashes | Semantic versions (e.g., 1.10.0) |
Architecture | Highly modular | More monolithic |
Separation | Clear boundaries | Consolidated packages |
Parameters | Centralized system | Distributed in packages |
The transition from 2025.02 to 0.45.1 fundamentally changed how sensor kits and vehicle interfaces are customized and integrated.
graph TD
subgraph "2025.02 Sensor/Vehicle Architecture"
subgraph "Sensor Kit Layer"
SK1[sample_sensor_kit_launch]
SK2[awsim_sensor_kit_launch]
SK3[single_lidar_sensor_kit_launch]
SK4[custom_sensor_kit_launch]
end
subgraph "Vehicle Layer"
V1[sample_vehicle_launch]
V2[awsim_labs_vehicle_launch]
V3[pacmod_interface]
V4[custom_vehicle_launch]
end
subgraph "Core Components"
C1[sensor_component/]
C2[autoware_launch/]
C3[individual_params/]
end
SK1 --> C2
SK2 --> C2
SK3 --> C2
SK4 --> C2
V1 --> C2
V2 --> C2
V3 --> C2
V4 --> C2
C1 --> SK1
C1 --> SK2
C1 --> SK3
C1 --> SK4
C3 --> C2
end
style SK4 fill:#4A7C59,color:#FFFFFF,stroke-dasharray: 5 5
style V4 fill:#4A7C59,color:#FFFFFF,stroke-dasharray: 5 5
graph TD
subgraph "0.45.1 Sensor/Vehicle Architecture"
subgraph "Unified Launch Layer"
L1[autoware_launch<br/>with embedded configs]
L2[sensor configs<br/>in packages]
L3[vehicle configs<br/>in packages]
end
subgraph "Customization Points"
CP1[Launch Arguments]
CP2[Parameter Files]
CP3[Environment Variables]
end
subgraph "Middleware Integration"
M1[Agnocast Support]
M2[Standard ROS 2]
end
L1 --> L2
L1 --> L3
CP1 --> L1
CP2 --> L1
CP3 --> L1
L1 --> M1
L1 --> M2
end
style CP1 fill:#D4A017,color:#000000
style CP2 fill:#D4A017,color:#000000
style CP3 fill:#D4A017,color:#000000
style M1 fill:#4682B4,color:#FFFFFF
In 2025.02, each sensor kit was a separate package with its own:
- Description files: URDF/Xacro for sensor placement
- Launch files: Individual sensor drivers and configurations
- Calibration data: Extrinsic calibration files
- Parameters: Sensor-specific parameters
Example structure:
sensor_kit/
├── sample_sensor_kit_launch/
│ ├── common_sensor_launch/
│ ├── sample_sensor_kit_description/
│ └── sample_sensor_kit_launch/
├── awsim_labs_sensor_kit_launch/
│ ├── awsim_labs_sensor_kit_description/
│ └── common_awsim_labs_sensor_launch/
└── custom_sensor_kit_launch/ # User's custom kit
├── description/
├── launch/
└── config/
In 0.45.1, sensor kits are configured through:
- Launch arguments: Select predefined sensor configurations
- Parameter overrides: Modify sensor behavior without new packages
- Environment variables: Runtime configuration changes
Example usage:
# 2025.02 style
ros2 launch custom_sensor_kit_launch sensing.launch.xml
# 0.45.1 style
ros2 launch autoware_launch sensing.launch.xml \
sensor_model:=custom_sensors \
sensor_config:=/path/to/custom_config.yaml
graph LR
subgraph "2025.02 Vehicle Integration"
VI1[Vehicle Package] --> VI2[Interface Node]
VI2 --> VI3[Vehicle HAL]
VI3 --> VI4[CAN/Serial]
VI5[Parameters] --> VI2
VI6[Launch Files] --> VI2
end
subgraph "0.45.1 Vehicle Integration"
VO1[Generic Interface] --> VO2[Config Loader]
VO2 --> VO3[Protocol Handler]
VO3 --> VO4[CAN/Serial/Network]
VO5[Runtime Config] --> VO2
VO6[Agnocast Option] -.-> VO3
end
VI1 ==>|Consolidated| VO1
VI5 ==>|Runtime| VO5
VI6 ==>|Arguments| VO2
style VI1 fill:#4A7C59,color:#FFFFFF
style VO1 fill:#4682B4,color:#FFFFFF
style VO6 fill:#D4A017,color:#000000
2025.02 Method:
<!-- custom_sensor_kit_launch/launch/sensing.launch.xml -->
<launch>
<include file="$(find-pkg-share lidar_driver)/launch/lidar.launch.xml">
<arg name="model" value="custom_lidar"/>
</include>
<include file="$(find-pkg-share camera_driver)/launch/camera.launch.xml">
<arg name="config" value="$(find-pkg-share custom_sensor_kit_launch)/config/camera.yaml"/>
</include>
</launch>
0.45.1 Method:
# config/custom_sensors.yaml
sensors:
lidar:
driver: "custom_lidar"
parameters:
ip: "192.168.1.201"
port: 2368
cameras:
front:
driver: "usb_cam"
device: "/dev/video0"
2025.02 Method:
// custom_vehicle_interface/src/custom_interface.cpp
class CustomVehicleInterface : public VehicleInterfaceBase {
// Full implementation required
};
0.45.1 Method:
# config/custom_vehicle.yaml
vehicle:
interface_type: "pacmod"
protocol: "can"
parameters:
can_device: "can0"
commands:
throttle: { id: 0x100, scale: 0.01 }
brake: { id: 0x101, scale: 0.01 }
steering: { id: 0x102, scale: 0.1 }
Aspect | 2025.02 | 0.45.1 |
---|---|---|
Flexibility | High (full control) | Medium (config-based) |
Ease of Use | Complex (requires packages) | Simple (config files) |
Maintenance | Distributed | Centralized |
Performance | Standard ROS 2 | Optional Agnocast |
Customization Depth | Unlimited | Limited to configs |
Version Control | Per-package | Single config repo |
- For Simple Customizations: Use 0.45.1's configuration approach
- For Complex Hardware: May need to patch core packages
- For Production: Consider maintaining custom forks
- For Development: Use parameter overrides and environment variables
Agnocast is a true zero-copy communication middleware for ROS 2, designed to eliminate data copying between processes. It was removed after 2025.02 but reintroduced in the 0.45.x series.
graph TB
subgraph "Publisher Process"
P1[Publisher Node]
P2[Agnocast API]
P3[Heap Hook<br/>LD_PRELOAD]
end
subgraph "Subscriber Process"
S1[Subscriber Node]
S2[Agnocast API]
S3[Heap Hook<br/>LD_PRELOAD]
end
subgraph "Kernel Space"
K1[Kernel Module<br/>agnocast.ko]
K2[Shared Memory<br/>/dev/shm]
K3[Message Queue<br/>/dev/mqueue]
end
P1 --> P2
P2 --> P3
P3 --> K1
S1 --> S2
S2 --> S3
S3 --> K1
K1 --> K2
K1 --> K3
K2 -.->|Zero-Copy Data| S3
K3 -.->|Metadata| S3
style K1 fill:#D4A017,color:#000000
style K2 fill:#4682B4,color:#FFFFFF
style K3 fill:#4682B4,color:#FFFFFF
# Insert kernel module
sudo modprobe agnocast
# Set environment variables
export LD_PRELOAD=libagnocast_heaphook.so
export AGNOCAST_MEMPOOL_SIZE=134217728 # 128MB
// Standard ROS 2
rclcpp::Publisher<MessageType>::SharedPtr pub;
pub = node->create_publisher<MessageType>("/topic", 10);
// Agnocast replacement
std::shared_ptr<agnocast::Publisher<MessageType>> pub;
pub = agnocast::create_publisher<MessageType>("/topic", 10);
graph LR
subgraph "Standard ROS 2 Data Flow"
R1[Publisher<br/>Process] -->|Serialize| R2[DDS Layer]
R2 -->|Network/IPC| R3[DDS Layer]
R3 -->|Deserialize| R4[Subscriber<br/>Process]
R2 -.->|Copy 1| R2A[Buffer]
R3 -.->|Copy 2| R3A[Buffer]
end
subgraph "Agnocast Zero-Copy Flow"
A1[Publisher<br/>Process] -->|Write Pointer| A2[Shared Memory]
A2 -->|Read Pointer| A3[Subscriber<br/>Process]
A4[Kernel Module] -->|Manages| A2
A5[Message Queue] -->|Notifies| A3
end
style R2A fill:#CD5C5C,color:#FFFFFF
style R3A fill:#CD5C5C,color:#FFFFFF
style A2 fill:#4A7C59,color:#FFFFFF
graph TD
subgraph "ROS 2 Middleware Stack"
R1[ROS 2 Node] --> R2[RCL Layer]
R2 --> R3[RMW Interface]
R3 --> R4A[DDS<br/>FastDDS/Cyclone]
R3 --> R4B[Iceoryx<br/>rmw_iceoryx_cpp]
R3 --> R4C[Agnocast<br/>Direct Integration]
R4A --> R5A[Network/SHM]
R4B --> R5B[POSIX SHM]
R4C --> R5C[Kernel Module<br/>+ Custom SHM]
end
style R4A fill:#4682B4,color:#FFFFFF
style R4B fill:#4A7C59,color:#FFFFFF
style R4C fill:#D4A017,color:#000000
Aspect | Standard RMW (DDS) | Iceoryx | Agnocast |
---|---|---|---|
Integration Level | RMW interface | RMW interface | API replacement |
Message Types | Fixed at compile | Fixed at compile | Any type (runtime) |
Memory Management | Copy-based | Zero-copy (loan/return) | True zero-copy (heap hook) |
Kernel Module | No | No | Yes (required) |
Setup Complexity | Low | Medium | High |
Performance | Good | Better | Best (for large msgs) |
Stability | Production | Production | Experimental |
Cross-machine | Yes | No | No |
graph LR
subgraph "Iceoryx Approach"
I1[Publisher] -->|Request Chunk| I2[RouDi Daemon]
I2 -->|Loan Memory| I1
I1 -->|Write Data| I3[Shared Memory]
I3 -->|Notify| I4[Subscriber]
I4 -->|Return Chunk| I2
end
subgraph "Agnocast Approach"
A1[Publisher] -->|malloc/new| A2[Heap Hook]
A2 -->|Intercept| A3[Kernel Module]
A3 -->|Allocate from| A4[Pre-allocated Pool]
A4 -->|Direct Access| A5[Subscriber]
end
style I2 fill:#4A7C59,color:#FFFFFF
style A3 fill:#D4A017,color:#000000
-
High-Bandwidth Topics:
// Point cloud topics (highest priority) agnocast::create_publisher<sensor_msgs::msg::PointCloud2>( "/sensing/lidar/concatenated/pointcloud", rclcpp::QoS{1}); // Camera image topics agnocast::create_publisher<sensor_msgs::msg::Image>( "/sensing/camera/front/image_raw", rclcpp::QoS{1});
-
Perception Pipeline:
# perception.launch.xml <node pkg="autoware_pointcloud_preprocessor" exec="concatenate_node"> <env name="LD_PRELOAD" value="libagnocast_heaphook.so"/> <env name="AGNOCAST_MEMPOOL_SIZE" value="536870912"/> <!-- 512MB --> </node>
-
Selective Enablement:
<!-- Only for specific high-throughput nodes --> <group if="$(var use_agnocast)"> <include file="sensing_agnocast.launch.xml"/> </group> <group unless="$(var use_agnocast)"> <include file="sensing_standard.launch.xml"/> </group>
graph TB
subgraph "Autoware Data Flow with Agnocast"
S1[LiDAR Driver] -->|~2MB/frame| S2[Point Cloud Filter]
S2 -->|~1.5MB/frame| S3[Ground Removal]
S3 -->|~1MB/frame| S4[Concatenation]
S4 -->|~3MB/frame| S5[Detection]
C1[Camera Driver] -->|~6MB/frame| C2[Rectification]
C2 -->|~6MB/frame| C3[Detection]
S5 --> F1[Fusion]
C3 --> F1
end
S1 -.->|Zero-Copy| A1[Agnocast Pool]
S2 -.->|Zero-Copy| A1
S3 -.->|Zero-Copy| A1
S4 -.->|Zero-Copy| A1
S5 -.->|Zero-Copy| A1
C1 -.->|Zero-Copy| A2[Agnocast Pool]
C2 -.->|Zero-Copy| A2
C3 -.->|Zero-Copy| A2
style A1 fill:#D4A017,color:#000000
style A2 fill:#D4A017,color:#000000
Pipeline Stage | Standard ROS 2 | With Iceoryx | With Agnocast |
---|---|---|---|
LiDAR Processing | 45ms | 38ms | 32ms |
Camera Processing | 65ms | 58ms | 48ms |
Memory Usage | Dynamic | Dynamic | Pre-allocated |
CPU Load | 100% baseline | 85% | 70% |
-
Memory Pool Sizing:
# Calculate based on message size × queue depth × safety factor # LiDAR: 2MB × 10 msgs × 2.5 = 50MB # Camera: 6MB × 5 msgs × 2.5 = 75MB export AGNOCAST_MEMPOOL_SIZE=134217728 # 128MB total
-
Node Selection Criteria:
- Message size > 1MB
- Publishing rate > 10Hz
- Multiple subscribers
- Part of critical path
-
Limitations in Autoware:
- Cannot be used for inter-machine communication
- Not suitable for small, frequent messages (e.g., vehicle commands)
- Requires careful memory pool management
- May conflict with CUDA memory allocation
- Performance Requirements: Growing need for handling larger sensor data (LiDAR, cameras)
- Technical Maturity: Improved implementation and testing since initial experiments
- Community Feedback: Strong interest in zero-copy capabilities
- Hardware Evolution: Modern systems better suited for kernel module approach
- Iceoryx Limitations: Need for runtime type flexibility that Iceoryx doesn't provide
-
Adapt to New Structure:
- Sensor kits now integrated into launch packages
- Vehicle configs moved to respective packages
- Parameters distributed across packages
-
Enable Agnocast (optional):
# Install kernel module sudo modprobe agnocast # Update launch files with Agnocast environment
-
Update Dependencies:
- Check for new middleware requirements
- Verify CUDA dependencies for cuda_blackboard
-
Version References:
# Old (2025.02) - commit hashes version: bbafc6c4410222de45df2d73e66678f80b1e28d4 # New (0.45.1) - semantic versions version: 1.10.0
-
Architecture Adaptation:
- Sensor/vehicle configs now part of main packages
- Consider Agnocast for high-bandwidth topics
- Parameters managed within individual packages
The evolution from 2025.02 to 0.45.1 shows a fundamental shift in how Autoware handles hardware customization:
- Philosophy: Maximum flexibility through modular packages
- Implementation: Create custom sensor_kit and vehicle packages
- Benefits: Complete control, clear separation, version independence
- Drawbacks: High maintenance burden, complex integration
- Philosophy: Simplicity through configuration
- Implementation: Use config files and launch arguments
- Benefits: Easier deployment, centralized maintenance, faster iteration
- Drawbacks: Limited flexibility, harder for complex customizations
The shift represents Autoware's maturation from a research platform (where everyone builds custom packages) to a production-ready system (where most users configure existing functionality). This change:
- Lowers the barrier to entry for new users
- Reduces maintenance overhead for the core team
- Standardizes common patterns across deployments
- Enables performance optimizations like Agnocast
However, it also means that teams with highly customized hardware may need to:
- Maintain forks of core packages
- Contribute their customizations upstream
- Work within the configuration framework's limitations
The transition from 2025.02 to 0.45.1 represents both a versioning philosophy change and architectural evolution:
- Versioning: Move from date-based to semantic versioning indicates project maturation
- Architecture: Shift from highly modular to more integrated structure
- Customization: From package-based to configuration-based approach
- Performance: Reintroduction of Agnocast shows commitment to addressing real-world performance needs
- Trade-offs: Sacrificed some modularity for potentially better performance and simpler deployment
This evolution suggests Autoware is moving toward a more stable, performance-oriented release as it approaches version 1.0, with a focus on making the platform more accessible to a broader range of users while maintaining the flexibility needed for production deployments.