Update ReadMe for submission
This commit is contained in:
parent
ed6209939c
commit
690265863f
4 changed files with 9278 additions and 169 deletions
169
README.md
169
README.md
|
@ -1,169 +0,0 @@
|
||||||
# ROS 2 Dynamic Priority Executor with Performance Monitoring
|
|
||||||
|
|
||||||
This repository contains a ROS 2 executor implementation with priority-based and deadline-based scheduling capabilities, including comprehensive performance monitoring.
|
|
||||||
|
|
||||||
## Performance Monitoring Features
|
|
||||||
|
|
||||||
- High-resolution event tracking for callbacks
|
|
||||||
- Chain-aware monitoring for multi-callback sequences
|
|
||||||
- Deadline tracking and violation detection
|
|
||||||
- Thread-aware monitoring in multi-threaded executors
|
|
||||||
- Automatic JSON log generation
|
|
||||||
- Configurable buffer sizes and auto-dumping
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
1. Clone the repository:
|
|
||||||
```bash
|
|
||||||
git clone --recurse-submodules https://github.com/user/ROS-Dynamic-Executor-Experiments.git
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Build the project:
|
|
||||||
```bash
|
|
||||||
colcon build
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Source the workspace:
|
|
||||||
```bash
|
|
||||||
source install/setup.bash
|
|
||||||
```
|
|
||||||
|
|
||||||
## Using the Performance Monitor
|
|
||||||
|
|
||||||
### Basic Setup
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "priority_executor/priority_executor.hpp"
|
|
||||||
|
|
||||||
// Create executor with monitoring enabled
|
|
||||||
auto executor = std::make_shared<priority_executor::TimedExecutor>(options, "my_executor");
|
|
||||||
|
|
||||||
// Configure monitoring options
|
|
||||||
executor->setMonitoringOptions(
|
|
||||||
10000, // Buffer size
|
|
||||||
5000, // Auto-dump threshold
|
|
||||||
"performance_logs" // Output directory
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Monitoring Configuration
|
|
||||||
|
|
||||||
- **Buffer Size**: Maximum number of events to hold in memory
|
|
||||||
- **Auto-dump Threshold**: Number of events that triggers automatic file dump
|
|
||||||
- **Output Directory**: Where performance logs are saved
|
|
||||||
|
|
||||||
### Event Types Tracked
|
|
||||||
|
|
||||||
- `CALLBACK_READY`: Callback is ready for execution
|
|
||||||
- `CALLBACK_START`: Callback execution started
|
|
||||||
- `CALLBACK_END`: Callback execution completed
|
|
||||||
- `DEADLINE_MISSED`: A deadline was missed
|
|
||||||
- `DEADLINE_MET`: A deadline was successfully met
|
|
||||||
- `CHAIN_START`: Start of a callback chain
|
|
||||||
- `CHAIN_END`: End of a callback chain
|
|
||||||
|
|
||||||
### Performance Data
|
|
||||||
|
|
||||||
Each event captures:
|
|
||||||
- High-resolution timestamps
|
|
||||||
- Node and callback names
|
|
||||||
- Chain IDs and positions
|
|
||||||
- Deadlines and processing times
|
|
||||||
- Thread IDs (for multi-threaded executors)
|
|
||||||
- Additional context data
|
|
||||||
|
|
||||||
### Output Format
|
|
||||||
|
|
||||||
Performance logs are saved as JSON files with the following structure:
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"timestamp": 1234567890,
|
|
||||||
"type": "callback_start",
|
|
||||||
"node_name": "example_node",
|
|
||||||
"callback_name": "timer_callback",
|
|
||||||
"chain_id": 1,
|
|
||||||
"is_first_in_chain": true,
|
|
||||||
"deadline": 1000000,
|
|
||||||
"processing_time": 500,
|
|
||||||
"executor_id": 0,
|
|
||||||
"additional_data": {
|
|
||||||
"thread_id": 1,
|
|
||||||
"cpu_affinity": 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Multi-threaded Monitoring
|
|
||||||
|
|
||||||
The monitoring system automatically handles multi-threaded executors:
|
|
||||||
- Tracks per-thread execution
|
|
||||||
- Records CPU affinity
|
|
||||||
- Thread-safe event recording
|
|
||||||
- Maintains event ordering
|
|
||||||
|
|
||||||
### Best Practices
|
|
||||||
|
|
||||||
1. Set appropriate buffer sizes based on your system's memory constraints
|
|
||||||
2. Enable auto-dumping for long-running systems
|
|
||||||
3. Use meaningful executor names for better log analysis
|
|
||||||
4. Monitor deadline compliance in real-time systems
|
|
||||||
5. Track callback chains for end-to-end latency analysis
|
|
||||||
|
|
||||||
### Analyzing Results
|
|
||||||
|
|
||||||
1. Performance logs are saved in the configured output directory
|
|
||||||
2. Use the provided Jupyter notebook for analysis:
|
|
||||||
```bash
|
|
||||||
jupyter notebook analysis/analysis.ipynb
|
|
||||||
```
|
|
||||||
|
|
||||||
## Advanced Usage
|
|
||||||
|
|
||||||
### Manual Log Dumping
|
|
||||||
```cpp
|
|
||||||
auto& monitor = PerformanceMonitor::getInstance();
|
|
||||||
monitor.dumpToFile("custom_log_name.json");
|
|
||||||
```
|
|
||||||
|
|
||||||
### Temporary Monitoring Disable
|
|
||||||
```cpp
|
|
||||||
executor->enableMonitoring(false);
|
|
||||||
// ... execute some callbacks ...
|
|
||||||
executor->enableMonitoring(true);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Custom Event Context
|
|
||||||
Additional context can be added to events through the `additional_data` field in JSON format.
|
|
||||||
|
|
||||||
## Performance Impact
|
|
||||||
|
|
||||||
The monitoring system is designed to be lightweight:
|
|
||||||
- Lock-free recording for most operations
|
|
||||||
- Efficient event buffering
|
|
||||||
- Configurable buffer sizes
|
|
||||||
- Optional auto-dumping
|
|
||||||
- Minimal overhead during normal operation
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Contributions are welcome! Please follow these steps:
|
|
||||||
1. Fork the repository
|
|
||||||
2. Create a feature branch
|
|
||||||
3. Commit your changes
|
|
||||||
4. Create a pull request
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Apache License 2.0 - See LICENSE file for details
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
colcon build
|
|
||||||
# later also just:
|
|
||||||
colcon build --packages-select full_topology
|
|
||||||
source install/setup.bash
|
|
||||||
ros2 launch full_topology trace_full_topology.launch.py
|
|
||||||
ros2 trace-analysis convert ./analysis/tracing/full_topology_tracing
|
|
||||||
ros2 trace-analysis process ./analysis/tracing/full_topology_tracing
|
|
162
ReadMe.md
Normal file
162
ReadMe.md
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
# Full Topology Experimentation Framework
|
||||||
|
|
||||||
|
This repository contains the experimentation code used for my master's thesis on *semantic scheduling for multi-modal sensor data in ROS 2*.
|
||||||
|
It implements and evaluates multiple executor configurations (ROS 2 default, dynamic EDF) on a fixed test topology, with automated tracing and batch experiment execution.
|
||||||
|
|
||||||
|
> **Audience:** This version is intended for thesis reviewers.
|
||||||
|
> For the eventual open-source release, setup and dependency instructions will be expanded.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Repository structure
|
||||||
|
|
||||||
|
Key files and directories:
|
||||||
|
```
|
||||||
|
src/full_topology/
|
||||||
|
├── CMakeLists.txt # CMake config, passes macro switches
|
||||||
|
├── package.xml # ROS 2 package manifest
|
||||||
|
├── launch/
|
||||||
|
│ └── trace_full_topology.launch.py # Starts topology with tracing
|
||||||
|
├── src/
|
||||||
|
│ ├── full_topology.cpp # Main implementation with macro-controlled behavior
|
||||||
|
│ ├── simple.cpp # Minimal setup to explore one-chain starvation
|
||||||
|
│ └── nodes.hpp # Node type definitions
|
||||||
|
src/cyclonedds/ # Submodule: Cyclone DDS
|
||||||
|
src/rcl/ # Submodule: ROS 2 rcl
|
||||||
|
src/rclcpp/ # Submodule: ROS 2 rclcpp
|
||||||
|
src/rmw_cyclonedds/ # Submodule: RMW layer
|
||||||
|
src/ros2_tracing/ # Submodule: ros2_tracing framework
|
||||||
|
src/ros_edf/ # Submodule: EDF executor implementation (Arafat et al.)
|
||||||
|
src/tracetools_analysis/ # Submodule: trace analysis tools
|
||||||
|
init.sh
|
||||||
|
build.sh
|
||||||
|
build_run_copy.sh
|
||||||
|
batch_run.sh
|
||||||
|
setup-venv.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Platform & prerequisites
|
||||||
|
|
||||||
|
* **ROS 2 distribution:** Foxy (required)
|
||||||
|
* **Test environment:** Raspberry Pi 4 (4 GB) with Ubuntu 20.04 LTS, PREEMPT\_RT kernel, LTTng 2.13, 2 isolated CPU cores at fixed frequency (as in [ros-realtime/reference-system](https://github.com/ros-realtime/reference-system))
|
||||||
|
* **Python:** 3.8 (used via `setup-venv.sh`)
|
||||||
|
* **RMW:** `rmw_cyclonedds_cpp` (mandatory , the only implementation with our modifications)
|
||||||
|
* **Build concurrency:** limited to `-j1` to avoid overloading the Pi’s non-isolated cores.
|
||||||
|
|
||||||
|
System dependencies were installed via `apt`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Macro options and their flow
|
||||||
|
|
||||||
|
Experiment configurations are set at **build time** via CMake options, which `build_run_copy.sh` sets based on its arguments:
|
||||||
|
|
||||||
|
| CMake Option | Compile Definition | Meaning |
|
||||||
|
| --------------------------- | --------------------------- | ------------------------------------------------------- |
|
||||||
|
| `ROS_DEFAULT_EXECUTOR` | `ROS_DEFAULT_EXECUTOR` | Use ROS 2 default executor |
|
||||||
|
| `EDF_PRIORITY_EXECUTOR` | `EDF_PRIORITY_EXECUTOR` | Use EDF executor (Arafat et al.) |
|
||||||
|
| `MULTI_THREADED` | `MULTI_THREADED` | Multi-threaded executor |
|
||||||
|
| `USE_TIMER_IN_FUSION_NODES` | `USE_TIMER_IN_FUSION_NODES` | Enable internal timers in fusion nodes |
|
||||||
|
| `BOOSTED=<ms>` | `BOOSTED=<ms>` | Reduce chain deadlines to this value; `1000` = disabled |
|
||||||
|
|
||||||
|
**Flow:**
|
||||||
|
`batch_run.sh` → calls `build_run_copy.sh` with args → sets CMake options → `CMakeLists.txt` adds compile definitions → `full_topology.cpp` selects behavior via `#ifdef`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Source ROS 2 Foxy environment
|
||||||
|
source /opt/ros/foxy/setup.bash
|
||||||
|
|
||||||
|
# 2. Source init script (sets RMW, build flags, venv, etc.)
|
||||||
|
source init.sh
|
||||||
|
|
||||||
|
# 3. Build & run a single timed, single-threaded ROS 2 default executor run
|
||||||
|
./build_run_copy.sh ros single timed 1000
|
||||||
|
|
||||||
|
# or: run the full batch (takes multiple hours)
|
||||||
|
./batch_run.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Launch file: `trace_full_topology.launch.py`
|
||||||
|
|
||||||
|
* Declares a `length` argument (seconds; default: 60.0).
|
||||||
|
* Starts an LTTng tracing session `trace_full_topology` in `analysis/tracing/`.
|
||||||
|
* Traces UST events from DDS, ROS 2 layers, RMW, rclcpp callbacks & executors.
|
||||||
|
* Launches `full_topology` node executable.
|
||||||
|
* Automatically shuts down after `length` seconds.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Running experiments
|
||||||
|
|
||||||
|
### `build_run_copy.sh` arguments
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./build_run_copy.sh <scheduler> <threading> <timer> [boost] [no_rebuild]
|
||||||
|
```
|
||||||
|
|
||||||
|
* **scheduler:** `ros` (ROS 2 default) or `edf` (EDF executor)
|
||||||
|
* **threading:** `single` or `multi`
|
||||||
|
* **timer:** `timed` or `direct` (thesis uses `timed`)
|
||||||
|
* **boost:** integer (ms) deadline; `1000` = disabled boost
|
||||||
|
* **no\_rebuild:** skip rebuilding (useful for repeated runs in same config)
|
||||||
|
|
||||||
|
Each run takes \~30–45 s (20 s experiment time + launch/stop/convert/copy).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `batch_run.sh` defaults
|
||||||
|
|
||||||
|
Runs a full matrix:
|
||||||
|
|
||||||
|
* Timer modes: `direct`, `timed`
|
||||||
|
* Threading: `single`, `multi`
|
||||||
|
* Schedulers:
|
||||||
|
* ROS default (`ros`)
|
||||||
|
* EDF with boosts `{1000, 500, 100, 50, 10}`
|
||||||
|
* Iterations: `ITERATIONS=49` per configuration, thus with the one that did the rebuild, a total of 50
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Trace files
|
||||||
|
|
||||||
|
Traces are renamed after run completion (boost only when applicable):
|
||||||
|
|
||||||
|
```
|
||||||
|
<scheduler>_<threading>_<timer>_<runtime>_<boost>-<timestamp>
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
edf_multi_timed_20_boosted_500-20250301T101530
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Remote copy
|
||||||
|
|
||||||
|
After renaming, traces are optionally copied to a remote location via `scp`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
REMOTE_USER=user
|
||||||
|
REMOTE_HOST=host
|
||||||
|
REMOTE_PATH=/path/to/store/traces
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Warning:** Update these in `build_run_copy.sh` before use.
|
||||||
|
> If unset or inaccessible, copying will fail (local trace is still kept).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Disclaimer
|
||||||
|
|
||||||
|
Research code, provided as is. See thesis for methodology, hardware setup, and complete experiment design.
|
||||||
|
This repository reflects the full development history of the thesis work. Some commits represent intermediate or WIP states. For traceability, commit hashes referenced in the thesis remain valid.
|
4541
batch_run.log
Normal file
4541
batch_run.log
Normal file
File diff suppressed because it is too large
Load diff
4575
trace_ids.txt
Normal file
4575
trace_ids.txt
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue