# jrl-umi3218/mc_rtc architecture

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

- Interactive diagram: https://gitdiagram.com/jrl-umi3218/mc_rtc
- Repository: https://github.com/jrl-umi3218/mc_rtc

## Overview

mc_rtc is a robot-control framework: an interface supplies robot state and receives desired commands through MCGlobalController, which delegates control to a selected MCController. Controllers work with robot models, optional observer pipelines, control tasks, and a QP solver; FSM controllers add state-driven behavior. The framework also exposes GUI and logging facilities, plugins, Python bindings, and ROS/Replay integrations. The graph reflects README capabilities and the sampled source; some subsystem wiring is documented by the framework structure but was not directly inspected, so uncertain edges are omitted.

Main entry points: [`src/mc_control/mc_global_controller.cpp`](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/mc_global_controller.cpp) (Global controller), [`src/mc_control/MCController.cpp`](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/MCController.cpp) (Controller), [`include/mc_tasks/MetaTask.h`](https://github.com/jrl-umi3218/mc_rtc/blob/master/include/mc_tasks/MetaTask.h) (Control tasks), [`src/mc_observers/ObserverPipeline.cpp`](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_observers/ObserverPipeline.cpp) (Observer pipeline)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Control runtime"]
  node_global_controller["Global controller"]
  node_controller["Controller<br/>[MCController.cpp]"]
  node_fsm_controller["FSM controller<br/>[Controller.cpp]"]
  node_fsm_executor["FSM executor<br/>[Executor.cpp]"]
  node_controller_loader["Controller loader"]
end

subgraph group_robot["Robot state"]
  node_observer_pipeline["Observer pipeline"]
  node_observer_loader["Observer loader<br/>[ObserverLoader.cpp]"]
  node_robot_model["Robot models<br/>[RobotLoader.cpp]"]
  node_robot_state["Robot state<br/>[Robots.h]"]
end

subgraph group_optimization["Control formulation"]
  node_control_tasks["Control tasks<br/>[MetaTask.h]"]
  node_qp_solver["QP solver<br/>[QPSolver.cpp]"]
  node_trajectory["Trajectories<br/>[Spline.h]"]
end

subgraph group_interfaces["User interfaces"]
  node_gui["GUI state<br/>[StateBuilder.cpp]"]
  node_controller_server["Controller server"]
  node_logger["Logging<br/>[Logger.cpp]"]
end

subgraph group_extensions["Extensions"]
  node_python_binding["Python controller"]
  node_ros_plugin["ROS plugin<br/>[ROS.cpp]"]
  node_replay_plugin["Replay plugin<br/>[Replay.cpp]"]
end

node_robot_interface(("Robot interface"))

node_robot_interface -->|"provides state"| node_global_controller
node_global_controller -->|"runs controller"| node_controller
node_controller_loader -->|"loads controller"| node_global_controller
node_global_controller -->|"returns commands"| node_robot_interface
node_global_controller -->|"handles requests"| node_controller_server
node_controller_server -->|"publishes state"| node_gui
node_global_controller -->|"publishes GUI"| node_gui
node_global_controller -->|"updates state"| node_robot_state
node_controller -->|"loads models"| node_robot_model
node_controller -->|"creates pipelines"| node_observer_pipeline
node_observer_pipeline -->|"loads observers"| node_observer_loader
node_observer_pipeline -->|"updates estimates"| node_robot_state
node_fsm_controller -->|"extends runtime"| node_controller
node_fsm_controller -->|"runs states"| node_fsm_executor
node_fsm_executor -->|"dispatches behavior"| node_control_tasks
node_controller -->|"configures tasks"| node_control_tasks
node_control_tasks -->|"adds objectives"| node_qp_solver
node_trajectory -->|"defines motion"| node_control_tasks
node_controller -->|"records data"| node_logger
node_python_binding -.->|"creates controller"| node_controller
node_ros_plugin -.->|"integrates control"| node_global_controller
node_replay_plugin -.->|"replays data"| node_global_controller

click node_global_controller "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/mc_global_controller.cpp"
click node_controller "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/MCController.cpp"
click node_fsm_controller "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/fsm/Controller.cpp"
click node_fsm_executor "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/fsm/Executor.cpp"
click node_controller_loader "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/ControllerLoader.cpp"
click node_observer_pipeline "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_observers/ObserverPipeline.cpp"
click node_observer_loader "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_observers/ObserverLoader.cpp"
click node_robot_model "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_rbdyn/RobotLoader.cpp"
click node_robot_state "https://github.com/jrl-umi3218/mc_rtc/blob/master/include/mc_rbdyn/Robots.h"
click node_control_tasks "https://github.com/jrl-umi3218/mc_rtc/blob/master/include/mc_tasks/MetaTask.h"
click node_qp_solver "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_solver/QPSolver.cpp"
click node_trajectory "https://github.com/jrl-umi3218/mc_rtc/blob/master/include/mc_trajectory/Spline.h"
click node_gui "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_rtc/gui/StateBuilder.cpp"
click node_controller_server "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/ControllerServer.cpp"
click node_logger "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_rtc/Logger.cpp"
click node_python_binding "https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/python/python_controller.cpp"
click node_ros_plugin "https://github.com/jrl-umi3218/mc_rtc/blob/master/plugins/ROS/src/plugin/ROS.cpp"
click node_replay_plugin "https://github.com/jrl-umi3218/mc_rtc/blob/master/plugins/Replay/src/Replay.cpp"

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_global_controller,node_controller,node_fsm_controller,node_fsm_executor,node_controller_loader toneBlue
class node_observer_pipeline,node_observer_loader,node_robot_model,node_robot_state toneAmber
class node_control_tasks,node_qp_solver,node_trajectory toneMint
class node_gui,node_controller_server,node_logger toneRose
class node_python_binding,node_ros_plugin,node_replay_plugin,node_robot_interface toneIndigo
```

## Components

### Control runtime

- [Global controller](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/mc_global_controller.cpp): `src/mc_control/mc_global_controller.cpp`
- [Controller](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/MCController.cpp): `src/mc_control/MCController.cpp`
- [FSM controller](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/fsm/Controller.cpp): `src/mc_control/fsm/Controller.cpp`
- [FSM executor](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/fsm/Executor.cpp): `src/mc_control/fsm/Executor.cpp`
- [Controller loader](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/ControllerLoader.cpp): `src/mc_control/ControllerLoader.cpp`

### Robot state

- [Observer pipeline](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_observers/ObserverPipeline.cpp): `src/mc_observers/ObserverPipeline.cpp`
- [Observer loader](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_observers/ObserverLoader.cpp): `src/mc_observers/ObserverLoader.cpp`
- [Robot models](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_rbdyn/RobotLoader.cpp): `src/mc_rbdyn/RobotLoader.cpp`
- [Robot state](https://github.com/jrl-umi3218/mc_rtc/blob/master/include/mc_rbdyn/Robots.h): `include/mc_rbdyn/Robots.h`

### Control formulation

- [Control tasks](https://github.com/jrl-umi3218/mc_rtc/blob/master/include/mc_tasks/MetaTask.h): `include/mc_tasks/MetaTask.h`
- [QP solver](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_solver/QPSolver.cpp): `src/mc_solver/QPSolver.cpp`
- [Trajectories](https://github.com/jrl-umi3218/mc_rtc/blob/master/include/mc_trajectory/Spline.h): `include/mc_trajectory/Spline.h`

### User interfaces

- [GUI state](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_rtc/gui/StateBuilder.cpp): `src/mc_rtc/gui/StateBuilder.cpp`
- [Controller server](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/ControllerServer.cpp): `src/mc_control/ControllerServer.cpp`
- [Logging](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_rtc/Logger.cpp): `src/mc_rtc/Logger.cpp`

### Extensions

- [Python controller](https://github.com/jrl-umi3218/mc_rtc/blob/master/src/mc_control/python/python_controller.cpp): `src/mc_control/python/python_controller.cpp`
- [ROS plugin](https://github.com/jrl-umi3218/mc_rtc/blob/master/plugins/ROS/src/plugin/ROS.cpp): `plugins/ROS/src/plugin/ROS.cpp`
- [Replay plugin](https://github.com/jrl-umi3218/mc_rtc/blob/master/plugins/Replay/src/Replay.cpp): `plugins/Replay/src/Replay.cpp`

### Other components

- **Robot interface**

## Connections

- Robot interface → Global controller: provides state
- Global controller → Controller: runs controller
- Controller loader → Global controller: loads controller
- Global controller → Robot interface: returns commands
- Global controller → Controller server: handles requests
- Controller server → GUI state: publishes state
- Global controller → GUI state: publishes GUI
- Global controller → Robot state: updates state
- Controller → Robot models: loads models
- Controller → Observer pipeline: creates pipelines
- Observer pipeline → Observer loader: loads observers
- Observer pipeline → Robot state: updates estimates
- FSM controller → Controller: extends runtime
- FSM controller → FSM executor: runs states
- FSM executor → Control tasks: dispatches behavior
- Controller → Control tasks: configures tasks
- Control tasks → QP solver: adds objectives
- Trajectories → Control tasks: defines motion
- Controller → Logging: records data
- Python controller → Controller: creates controller
- ROS plugin → Global controller: integrates control
- Replay plugin → Global controller: replays data
