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