# seriouslysilly21612/mpsoc-paper architecture

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

- Interactive diagram: https://gitdiagram.com/seriouslysilly21612/mpsoc-paper
- Repository: https://github.com/seriouslysilly21612/mpsoc-paper

## Overview

This is an Indy7 camera-guided picking application for a Kria KV260: ROS 2 vision detects objects, chooses a target, estimates its 3-D pose in base_link, and hands pick goals to the robot controller. The controller runs EtherCAT, trajectory, and computed-torque tasks, with a MuJoCo simulation alternative; an operator GUI exposes video, robot state, and controls. Calibration, training, and analysis tools support development. The README documents the broad workflow; several ROS nodes and bridge implementations were not excerpted, so their detailed message-level links are not asserted.

Main entry points: [`goal-to-torque_MPSoC/indy7/src/Indy7Ctrl.h`](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/Indy7Ctrl.h) (Indy7 task coordinator), [`ros2_ws/src/vitis_ai_detector_pkg/vitis_ai_detector_pkg/vitis_ai_detector_node.py`](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/vitis_ai_detector_pkg/vitis_ai_detector_pkg/vitis_ai_detector_node.py) (YOLO detector), [`ros2_ws/src/raon_operator_gui/src/main.cpp`](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/raon_operator_gui/src/main.cpp) (Operator console), [`ros2_ws/src/pick_logic_pkg/pick_logic_pkg/pick_logic.py`](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/pick_logic_pkg/pick_logic_pkg/pick_logic.py) (Pick selection)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_vision["Camera perception"]
  node_camera(("Camera input"))
  node_detector["YOLO detector"]
  node_yolo_worker["DPU worker"]
  node_pick_logic["Pick selection<br/>[pick_logic.py]"]
  node_pose_3d["3D localization"]
  node_base_target["Base target"]
end

subgraph group_robot["Robot control"]
  node_robot_entry["Controller entry<br/>[main.cpp]"]
  node_robot_control["Indy7 task coordinator<br/>[Indy7Ctrl.h]"]
  node_dynamics["Computed torque"]
  node_ethercat["EtherCAT arm<br/>[EcatMaster.cpp]"]
  node_simulation["MuJoCo arm<br/>[SimArm.cpp]"]
  node_ros_bridge["ROS 2 bridge<br/>[ROS2PickBridge.h]"]
end

subgraph group_operator["Operator interface"]
  node_gui["Operator console<br/>[main.cpp]"]
end

subgraph group_engineering["Calibration and analysis"]
  node_calibration["Hand-eye calibration"]
  node_training["YOLO training<br/>[12_quantize.py]"]
  node_analysis["Log analysis<br/>[hl_analyze.py]"]
end

node_robot_operator(("Robot operator"))

node_camera -->|"supplies frames"| node_detector
node_detector -->|"dispatches inference"| node_yolo_worker
node_detector -->|"publishes detections"| node_pick_logic
node_pick_logic -->|"selects target"| node_pose_3d
node_pose_3d -->|"localizes in base_link"| node_base_target
node_base_target -.->|"provides pick goal"| node_ros_bridge
node_robot_operator -->|"starts controller"| node_robot_entry
node_robot_entry -->|"initializes"| node_robot_control
node_robot_control -->|"runs control task"| node_dynamics
node_robot_control -->|"runs bus task"| node_ethercat
node_robot_control -->|"selects simulation"| node_simulation
node_ros_bridge -.->|"forwards commands"| node_robot_control
node_gui -.->|"shows video"| node_camera
node_gui -.->|"operator commands"| node_robot_control

click node_detector "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/vitis_ai_detector_pkg/vitis_ai_detector_pkg/vitis_ai_detector_node.py"
click node_yolo_worker "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/vitis_ai_detector_pkg/vitis_ai_detector_pkg/vitis_ai_worker_yolo.py"
click node_pick_logic "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/pick_logic_pkg/pick_logic_pkg/pick_logic.py"
click node_pose_3d "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/target_3d_pkg/target_3d_pkg/pick_target_3d_node.py"
click node_base_target "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/target_3d_pkg/target_3d_pkg/pick_target_base_node.py"
click node_robot_entry "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/main.cpp"
click node_robot_control "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/Indy7Ctrl.h"
click node_dynamics "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/FullDynControllerRT.cpp"
click node_ethercat "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/ecat/EcatMaster.cpp"
click node_simulation "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/sim/SimArm.cpp"
click node_ros_bridge "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/ROS2PickBridge.h"
click node_gui "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/raon_operator_gui/src/main.cpp"
click node_calibration "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/calib/eye_to_hand_calib.py"
click node_training "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/yolo_v3_tiny_training/scripts/12_quantize.py"
click node_analysis "https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/tools/hl_analyze.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_camera,node_detector,node_yolo_worker,node_pick_logic,node_pose_3d,node_base_target toneBlue
class node_robot_entry,node_robot_control,node_dynamics,node_ethercat,node_simulation,node_ros_bridge toneAmber
class node_gui toneMint
class node_calibration,node_training,node_analysis toneRose
class node_robot_operator toneIndigo
```

## Components

### Camera perception

- **Camera input**
- [YOLO detector](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/vitis_ai_detector_pkg/vitis_ai_detector_pkg/vitis_ai_detector_node.py): `ros2_ws/src/vitis_ai_detector_pkg/vitis_ai_detector_pkg/vitis_ai_detector_node.py`
- [DPU worker](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/vitis_ai_detector_pkg/vitis_ai_detector_pkg/vitis_ai_worker_yolo.py): `ros2_ws/src/vitis_ai_detector_pkg/vitis_ai_detector_pkg/vitis_ai_worker_yolo.py`
- [Pick selection](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/pick_logic_pkg/pick_logic_pkg/pick_logic.py): `ros2_ws/src/pick_logic_pkg/pick_logic_pkg/pick_logic.py`
- [3D localization](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/target_3d_pkg/target_3d_pkg/pick_target_3d_node.py): `ros2_ws/src/target_3d_pkg/target_3d_pkg/pick_target_3d_node.py`
- [Base target](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/target_3d_pkg/target_3d_pkg/pick_target_base_node.py): `ros2_ws/src/target_3d_pkg/target_3d_pkg/pick_target_base_node.py`

### Robot control

- [Controller entry](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/main.cpp): `goal-to-torque_MPSoC/indy7/src/main.cpp`
- [Indy7 task coordinator](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/Indy7Ctrl.h): `goal-to-torque_MPSoC/indy7/src/Indy7Ctrl.h`
- [Computed torque](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/FullDynControllerRT.cpp): `goal-to-torque_MPSoC/indy7/src/FullDynControllerRT.cpp`
- [EtherCAT arm](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/ecat/EcatMaster.cpp): `goal-to-torque_MPSoC/indy7/src/ecat/EcatMaster.cpp`
- [MuJoCo arm](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/sim/SimArm.cpp): `goal-to-torque_MPSoC/indy7/src/sim/SimArm.cpp`
- [ROS 2 bridge](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/indy7/src/ROS2PickBridge.h): `goal-to-torque_MPSoC/indy7/src/ROS2PickBridge.h`

### Operator interface

- [Operator console](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/src/raon_operator_gui/src/main.cpp): `ros2_ws/src/raon_operator_gui/src/main.cpp`

### Calibration and analysis

- [Hand-eye calibration](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/calib/eye_to_hand_calib.py): `goal-to-torque_MPSoC/calib/eye_to_hand_calib.py`
- [YOLO training](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/ros2_ws/yolo_v3_tiny_training/scripts/12_quantize.py): `ros2_ws/yolo_v3_tiny_training/scripts/12_quantize.py`
- [Log analysis](https://github.com/seriouslysilly21612/mpsoc-paper/blob/main/goal-to-torque_MPSoC/tools/hl_analyze.py): `goal-to-torque_MPSoC/tools/hl_analyze.py`

### Other components

- **Robot operator**

## Connections

- Camera input → YOLO detector: supplies frames (evidence: `README.md`)
- YOLO detector → DPU worker: dispatches inference (evidence: `ros2_ws/src/vitis_ai_detector_pkg/vitis_ai_detector_pkg/vitis_ai_worker_yolo.py`)
- YOLO detector → Pick selection: publishes detections (evidence: `README.md`)
- Pick selection → 3D localization: selects target (evidence: `README.md`)
- 3D localization → Base target: localizes in base_link (evidence: `README.md`)
- Base target → ROS 2 bridge: provides pick goal
- Robot operator → Controller entry: starts controller (evidence: `README.md`)
- Controller entry → Indy7 task coordinator: initializes (evidence: `goal-to-torque_MPSoC/indy7/src/main.cpp`)
- Indy7 task coordinator → Computed torque: runs control task (evidence: `goal-to-torque_MPSoC/indy7/src/Indy7Ctrl.h`)
- Indy7 task coordinator → EtherCAT arm: runs bus task (evidence: `README.md`)
- Indy7 task coordinator → MuJoCo arm: selects simulation
- ROS 2 bridge → Indy7 task coordinator: forwards commands (evidence: `goal-to-torque_MPSoC/indy7/src/Indy7Ctrl.h`)
- Operator console → Camera input: shows video
- Operator console → Indy7 task coordinator: operator commands
