# robotis-git/physical_ai_tools architecture

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

- Interactive diagram: https://gitdiagram.com/robotis-git/physical_ai_tools
- Repository: https://github.com/robotis-git/physical_ai_tools

## Overview

Physical AI Tools combines a ROS 2-connected management UI with server-side dataset, training, inference, and evaluation capabilities, plus a behavior-tree package and a ROS bag recorder. The visible UI workflow is page selection, ROS service/topic interaction, and display of task or training status. Server-side relationships are included only where the source index or excerpts support them; several backend and ROS service connections remain unverified.

Main entry points: [`physical_ai_manager/src/App.js`](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/App.js) (App Navigation), [`physical_ai_manager/src/hooks/useRosTopicSubscription.js`](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/hooks/useRosTopicSubscription.js) (Topic Subscriber), [`physical_ai_manager/src/hooks/useRosServiceCaller.js`](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/hooks/useRosServiceCaller.js) (Service Caller), [`physical_ai_manager/src/pages/InferencePage.js`](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/pages/InferencePage.js) (Inference Page)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_manager["Manager UI"]
  node_app["App Navigation<br/>[App.js]"]
  node_record_page["Record Page<br/>[RecordPage.js]"]
  node_inference_page["Inference Page<br/>[InferencePage.js]"]
  node_inference_panel["Inference Controls<br/>[InferencePanel.js]"]
  node_control_panel["Task Controls<br/>[ControlPanel.js]"]
  node_training_page["Training Page<br/>[TrainingPage.js]"]
  node_edit_page["Dataset Editing<br/>[EditDatasetPage.js]"]
  node_service_hook["Service Caller"]
  node_topic_hook["Topic Subscriber"]
  node_ros_connection["ROS Connection"]
  node_task_state["Task State<br/>[taskSlice.js]"]
  node_training_state["Training State<br/>[trainingSlice.js]"]
end

subgraph group_server["AI Server"]
  node_dataset_manager["Dataset Manager<br/>[data_manager.py]"]
  node_dataset_wrapper[("LeRobot Dataset")]
  node_data_converter["Data Converter<br/>[data_converter.py]"]
  node_training_manager["Training Manager"]
  node_lerobot_trainer["LeRobot Trainer<br/>[lerobot_trainer.py]"]
  node_inference_manager["Inference Manager"]
  node_evaluation_manager["Evaluation Manager"]
  node_visualization_manager["Evaluation Views"]
end

subgraph group_robot["Robot Runtime"]
  node_bt_node["BT ROS Node<br/>[bt_node.py]"]
  node_bt_loader["BT Node Loader<br/>[bt_nodes_loader.py]"]
  node_bt_core["BT Core<br/>[bt_core.py]"]
  node_bt_actions["Robot Actions<br/>[base_action.py]"]
end

subgraph group_recording["Bag Recording"]
  node_bag_recorder["Bag Recorder"]
end

node_operator(("Operator"))
node_ros_services{{"ROS Services"}}
node_ros_topics{{"ROS Topics"}}

node_operator -->|"uses"| node_app
node_app -->|"routes to"| node_record_page
node_app -->|"routes to"| node_inference_page
node_app -->|"routes to"| node_training_page
node_app -->|"routes to"| node_edit_page
node_inference_page -->|"renders"| node_control_panel
node_inference_page -.->|"renders"| node_inference_panel
node_control_panel -->|"calls"| node_service_hook
node_inference_panel -->|"calls"| node_service_hook
node_service_hook -->|"calls"| node_ros_services
node_service_hook -->|"uses"| node_ros_connection
node_app -->|"subscribes via"| node_topic_hook
node_topic_hook -->|"subscribes"| node_ros_topics
node_topic_hook -->|"uses"| node_ros_connection
node_topic_hook -->|"updates"| node_task_state
node_topic_hook -->|"updates"| node_training_state
node_dataset_manager -->|"uses"| node_dataset_wrapper
node_dataset_manager -->|"uses"| node_data_converter
node_training_manager -->|"uses"| node_lerobot_trainer
node_evaluation_manager -->|"uses"| node_inference_manager
node_evaluation_manager -->|"uses"| node_visualization_manager
node_bt_node -->|"loads"| node_bt_loader
node_bt_loader -->|"uses"| node_bt_core
node_bt_loader -->|"loads"| node_bt_actions
node_ros_services -.->|"dispatches to"| node_dataset_manager
node_ros_services -.->|"dispatches to"| node_training_manager
node_ros_services -.->|"dispatches to"| node_inference_manager
node_ros_services -.->|"commands"| node_bag_recorder

click node_app "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/App.js"
click node_record_page "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/pages/RecordPage.js"
click node_inference_page "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/pages/InferencePage.js"
click node_inference_panel "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/components/InferencePanel.js"
click node_control_panel "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/components/ControlPanel.js"
click node_training_page "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/pages/TrainingPage.js"
click node_edit_page "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/pages/EditDatasetPage.js"
click node_service_hook "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/hooks/useRosServiceCaller.js"
click node_topic_hook "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/hooks/useRosTopicSubscription.js"
click node_ros_connection "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/utils/rosConnectionManager.js"
click node_task_state "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/features/tasks/taskSlice.js"
click node_training_state "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/features/training/trainingSlice.js"
click node_dataset_manager "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/data_processing/data_manager.py"
click node_dataset_wrapper "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/data_processing/lerobot_dataset_wrapper.py"
click node_data_converter "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/data_processing/data_converter.py"
click node_training_manager "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/training/training_manager.py"
click node_lerobot_trainer "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/training/trainers/lerobot/lerobot_trainer.py"
click node_inference_manager "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/inference/inference_manager.py"
click node_evaluation_manager "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/evaluation/evaluation_manager.py"
click node_visualization_manager "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/evaluation/visualization_manager.py"
click node_bt_node "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_bt/physical_ai_bt/bt_node.py"
click node_bt_loader "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_bt/physical_ai_bt/bt_nodes_loader.py"
click node_bt_core "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_bt/physical_ai_bt/bt_core.py"
click node_bt_actions "https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_bt/physical_ai_bt/actions/base_action.py"
click node_bag_recorder "https://github.com/robotis-git/physical_ai_tools/blob/main/rosbag_recorder/src/service_bag_recorder.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_app,node_record_page,node_inference_page,node_inference_panel,node_control_panel,node_training_page,node_edit_page,node_service_hook,node_topic_hook,node_ros_connection,node_task_state,node_training_state toneBlue
class node_dataset_manager,node_dataset_wrapper,node_data_converter,node_training_manager,node_lerobot_trainer,node_inference_manager,node_evaluation_manager,node_visualization_manager toneAmber
class node_bt_node,node_bt_loader,node_bt_core,node_bt_actions toneMint
class node_bag_recorder toneRose
class node_operator,node_ros_services,node_ros_topics toneIndigo
```

## Components

### Manager UI

- [App Navigation](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/App.js): `physical_ai_manager/src/App.js`
- [Record Page](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/pages/RecordPage.js): `physical_ai_manager/src/pages/RecordPage.js`
- [Inference Page](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/pages/InferencePage.js): `physical_ai_manager/src/pages/InferencePage.js`
- [Inference Controls](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/components/InferencePanel.js): `physical_ai_manager/src/components/InferencePanel.js`
- [Task Controls](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/components/ControlPanel.js): `physical_ai_manager/src/components/ControlPanel.js`
- [Training Page](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/pages/TrainingPage.js): `physical_ai_manager/src/pages/TrainingPage.js`
- [Dataset Editing](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/pages/EditDatasetPage.js): `physical_ai_manager/src/pages/EditDatasetPage.js`
- [Service Caller](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/hooks/useRosServiceCaller.js): `physical_ai_manager/src/hooks/useRosServiceCaller.js`
- [Topic Subscriber](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/hooks/useRosTopicSubscription.js): `physical_ai_manager/src/hooks/useRosTopicSubscription.js`
- [ROS Connection](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/utils/rosConnectionManager.js): `physical_ai_manager/src/utils/rosConnectionManager.js`
- [Task State](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/features/tasks/taskSlice.js): `physical_ai_manager/src/features/tasks/taskSlice.js`
- [Training State](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_manager/src/features/training/trainingSlice.js): `physical_ai_manager/src/features/training/trainingSlice.js`

### AI Server

- [Dataset Manager](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/data_processing/data_manager.py): `physical_ai_server/physical_ai_server/data_processing/data_manager.py`
- [LeRobot Dataset](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/data_processing/lerobot_dataset_wrapper.py): `physical_ai_server/physical_ai_server/data_processing/lerobot_dataset_wrapper.py`
- [Data Converter](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/data_processing/data_converter.py): `physical_ai_server/physical_ai_server/data_processing/data_converter.py`
- [Training Manager](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/training/training_manager.py): `physical_ai_server/physical_ai_server/training/training_manager.py`
- [LeRobot Trainer](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/training/trainers/lerobot/lerobot_trainer.py): `physical_ai_server/physical_ai_server/training/trainers/lerobot/lerobot_trainer.py`
- [Inference Manager](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/inference/inference_manager.py): `physical_ai_server/physical_ai_server/inference/inference_manager.py`
- [Evaluation Manager](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/evaluation/evaluation_manager.py): `physical_ai_server/physical_ai_server/evaluation/evaluation_manager.py`
- [Evaluation Views](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_server/physical_ai_server/evaluation/visualization_manager.py): `physical_ai_server/physical_ai_server/evaluation/visualization_manager.py`

### Robot Runtime

- [BT ROS Node](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_bt/physical_ai_bt/bt_node.py): `physical_ai_bt/physical_ai_bt/bt_node.py`
- [BT Node Loader](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_bt/physical_ai_bt/bt_nodes_loader.py): `physical_ai_bt/physical_ai_bt/bt_nodes_loader.py`
- [BT Core](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_bt/physical_ai_bt/bt_core.py): `physical_ai_bt/physical_ai_bt/bt_core.py`
- [Robot Actions](https://github.com/robotis-git/physical_ai_tools/blob/main/physical_ai_bt/physical_ai_bt/actions/base_action.py): `physical_ai_bt/physical_ai_bt/actions/base_action.py`

### Bag Recording

- [Bag Recorder](https://github.com/robotis-git/physical_ai_tools/blob/main/rosbag_recorder/src/service_bag_recorder.cpp): `rosbag_recorder/src/service_bag_recorder.cpp`

### Other components

- **Operator**
- **ROS Services**
- **ROS Topics**

## Connections

- Operator → App Navigation: uses
- App Navigation → Record Page: routes to (evidence: `physical_ai_manager/src/App.js`)
- App Navigation → Inference Page: routes to (evidence: `physical_ai_manager/src/App.js`)
- App Navigation → Training Page: routes to (evidence: `physical_ai_manager/src/App.js`)
- App Navigation → Dataset Editing: routes to (evidence: `physical_ai_manager/src/App.js`)
- Inference Page → Task Controls: renders (evidence: `physical_ai_manager/src/pages/InferencePage.js`)
- Inference Page → Inference Controls: renders (evidence: `physical_ai_manager/src/pages/InferencePage.js`)
- Task Controls → Service Caller: calls (evidence: `physical_ai_manager/src/components/ControlPanel.js`)
- Inference Controls → Service Caller: calls (evidence: `physical_ai_manager/src/components/InferencePanel.js`)
- Service Caller → ROS Services: calls (evidence: `physical_ai_manager/src/hooks/useRosServiceCaller.js`)
- Service Caller → ROS Connection: uses (evidence: `physical_ai_manager/src/hooks/useRosServiceCaller.js`)
- App Navigation → Topic Subscriber: subscribes via (evidence: `physical_ai_manager/src/App.js`)
- Topic Subscriber → ROS Topics: subscribes (evidence: `physical_ai_manager/src/hooks/useRosTopicSubscription.js`)
- Topic Subscriber → ROS Connection: uses (evidence: `physical_ai_manager/src/hooks/useRosTopicSubscription.js`)
- Topic Subscriber → Task State: updates (evidence: `physical_ai_manager/src/hooks/useRosTopicSubscription.js`)
- Topic Subscriber → Training State: updates (evidence: `physical_ai_manager/src/hooks/useRosTopicSubscription.js`)
- Dataset Manager → LeRobot Dataset: uses (evidence: `physical_ai_server/physical_ai_server/data_processing/data_manager.py`)
- Dataset Manager → Data Converter: uses (evidence: `physical_ai_server/physical_ai_server/data_processing/data_manager.py`)
- Training Manager → LeRobot Trainer: uses (evidence: `physical_ai_server/physical_ai_server/training/training_manager.py`)
- Evaluation Manager → Inference Manager: uses (evidence: `physical_ai_server/physical_ai_server/evaluation/evaluation_manager.py`)
- Evaluation Manager → Evaluation Views: uses (evidence: `physical_ai_server/physical_ai_server/evaluation/evaluation_manager.py`)
- BT ROS Node → BT Node Loader: loads (evidence: `physical_ai_bt/physical_ai_bt/bt_node.py`)
- BT Node Loader → BT Core: uses (evidence: `physical_ai_bt/physical_ai_bt/bt_nodes_loader.py`)
- BT Node Loader → Robot Actions: loads (evidence: `physical_ai_bt/physical_ai_bt/bt_nodes_loader.py`)
- ROS Services → Dataset Manager: dispatches to
- ROS Services → Training Manager: dispatches to
- ROS Services → Inference Manager: dispatches to
- ROS Services → Bag Recorder: commands
