# mbodjimassar03/ros2-adaptive-cruise-control architecture

> Architecture diagram of the GitHub repository mbodjimassar03/ros2-adaptive-cruise-control, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/mbodjimassar03/ros2-adaptive-cruise-control
- Repository: https://github.com/mbodjimassar03/ros2-adaptive-cruise-control

## Overview

This ROS 2 Raspberry Pi project implements an adaptive-cruise-control loop: it measures obstacle distance and motor RPM, computes a safe speed setpoint, and uses a PI controller to drive motor PWM. Separate nodes provide a manual setpoint and record telemetry. The README documents the topic-level workflow; the sampled node sources confirm the sensor, controller, and logging behaviors. The launch file starts the main runtime nodes. Relationships for unsampled node implementations are shown only where documented; the standalone motor node is not shown as part of the launched loop.

Main entry points: [`launch/moteur.launch.py`](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/launch/moteur.launch.py) (Runtime launcher), [`moteur_ros/capteur_node.py`](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/capteur_node.py) (Speed node), [`moteur_ros/acc_node.py`](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/acc_node.py) (ACC node), [`moteur_ros/controle_node.py`](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/controle_node.py) (PI controller)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_sensing["Sensing"]
  node_ultrasonic["Ultrasonic sensor"]
  node_distance["Distance node<br/>[distance_node.py]"]
  node_encoder["Rotation sensor"]
  node_speed["Speed node<br/>[capteur_node.py]"]
end

subgraph group_control["ACC control"]
  node_acc["ACC node<br/>[acc_node.py]"]
  node_setpoint["Setpoint node<br/>[consigne_node.py]"]
  node_controller["PI controller<br/>[controle_node.py]"]
end

subgraph group_actuation["Motor actuation"]
  node_motor["Motor"]
  node_motor_node["Standalone motor node<br/>[moteur_node.py]"]
end

subgraph group_telemetry["Telemetry"]
  node_logger["Logger node<br/>[logger_node.py]"]
  node_csv["ACC data file<br/>[donnees_acc.csv]"]
end

node_obstacle(("Obstacle"))
node_launch["Runtime launcher<br/>[moteur.launch.py]"]

node_obstacle -->|"reflects sound"| node_ultrasonic
node_ultrasonic -->|"provides echoes"| node_distance
node_distance -->|"publishes distance"| node_acc
node_encoder -->|"signals pulses"| node_speed
node_speed -->|"publishes RPM"| node_acc
node_speed -->|"publishes RPM"| node_controller
node_acc -->|"publishes setpoint"| node_controller
node_setpoint -->|"publishes setpoint"| node_controller
node_controller -->|"applies PWM"| node_motor
node_motor_node -->|"applies PWM"| node_motor
node_distance -->|"publishes distance"| node_logger
node_speed -->|"publishes RPM"| node_logger
node_acc -->|"publishes setpoint"| node_logger
node_logger -->|"writes records"| node_csv
node_launch -->|"starts node"| node_speed
node_launch -->|"starts node"| node_controller
node_launch -->|"starts node"| node_distance
node_launch -->|"starts node"| node_acc
node_launch -->|"starts node"| node_logger

click node_distance "https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/distance_node.py"
click node_speed "https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/capteur_node.py"
click node_acc "https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/acc_node.py"
click node_setpoint "https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/consigne_node.py"
click node_controller "https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/controle_node.py"
click node_motor_node "https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/moteur_node.py"
click node_logger "https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/logger_node.py"
click node_csv "https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/donnees_acc.csv"
click node_launch "https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/launch/moteur.launch.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_ultrasonic,node_distance,node_encoder,node_speed toneBlue
class node_acc,node_setpoint,node_controller toneAmber
class node_motor,node_motor_node toneMint
class node_logger,node_csv toneRose
class node_obstacle toneIndigo
class node_launch toneTeal
```

## Components

### Sensing

- **Ultrasonic sensor**
- [Distance node](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/distance_node.py): `moteur_ros/distance_node.py`
- **Rotation sensor**
- [Speed node](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/capteur_node.py): `moteur_ros/capteur_node.py`

### ACC control

- [ACC node](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/acc_node.py): `moteur_ros/acc_node.py`
- [Setpoint node](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/consigne_node.py): `moteur_ros/consigne_node.py`
- [PI controller](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/controle_node.py): `moteur_ros/controle_node.py`

### Motor actuation

- **Motor**
- [Standalone motor node](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/moteur_node.py): `moteur_ros/moteur_node.py`

### Telemetry

- [Logger node](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/moteur_ros/logger_node.py): `moteur_ros/logger_node.py`
- [ACC data file](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/donnees_acc.csv): `donnees_acc.csv`

### Other components

- **Obstacle**
- [Runtime launcher](https://github.com/mbodjimassar03/ros2-adaptive-cruise-control/blob/main/launch/moteur.launch.py): `launch/moteur.launch.py`

## Connections

- Obstacle → Ultrasonic sensor: reflects sound (evidence: `README.md`)
- Ultrasonic sensor → Distance node: provides echoes (evidence: `moteur_ros/distance_node.py`)
- Distance node → ACC node: publishes distance (evidence: `README.md`)
- Rotation sensor → Speed node: signals pulses (evidence: `moteur_ros/capteur_node.py`)
- Speed node → ACC node: publishes RPM (evidence: `README.md`)
- Speed node → PI controller: publishes RPM (evidence: `README.md`)
- ACC node → PI controller: publishes setpoint (evidence: `README.md`)
- Setpoint node → PI controller: publishes setpoint (evidence: `moteur_ros/consigne_node.py`)
- PI controller → Motor: applies PWM (evidence: `moteur_ros/controle_node.py`)
- Standalone motor node → Motor: applies PWM (evidence: `moteur_ros/moteur_node.py`)
- Distance node → Logger node: publishes distance (evidence: `moteur_ros/logger_node.py`)
- Speed node → Logger node: publishes RPM (evidence: `moteur_ros/logger_node.py`)
- ACC node → Logger node: publishes setpoint (evidence: `moteur_ros/logger_node.py`)
- Logger node → ACC data file: writes records (evidence: `moteur_ros/logger_node.py`)
- Runtime launcher → Speed node: starts node (evidence: `launch/moteur.launch.py`)
- Runtime launcher → PI controller: starts node (evidence: `launch/moteur.launch.py`)
- Runtime launcher → Distance node: starts node (evidence: `launch/moteur.launch.py`)
- Runtime launcher → ACC node: starts node (evidence: `launch/moteur.launch.py`)
- Runtime launcher → Logger node: starts node (evidence: `launch/moteur.launch.py`)
