# jon-bon-jono/vip_mmwave_hpe_demo architecture

> Architecture diagram of the GitHub repository jon-bon-jono/vip_mmwave_hpe_demo, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-15). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/jon-bon-jono/vip_mmwave_hpe_demo
- Repository: https://github.com/jon-bon-jono/vip_mmwave_hpe_demo

## Overview

1. **Overall shape**
   - This is a ROS 2 Jazzy workspace organized as three real runtime layers plus one future ML placeholder:
     - `vip_hpe_msgs` for shared message definitions
     - `vip_hpe_core` for ROS-free preprocessing and constants
     - `vip_hpe_runtime` for ROS nodes, launch/session orchestration, replay, and visualization
     - `ml/` as a future training framework, intentionally ignored by `colcon`

2. **Primary runtime data flow**
   - The default demo is a replay pipeline, not live sensor capture.
   - Data flows from prerecorded pickle data into ROS topics, then through preprocessing, then to visualization:
     - radar point-cloud replay publishes `vip_hpe_msgs/RadarFrame` on `/radar/points`
     - pose emulation subscribes to `/radar/points`, preprocesses the point cloud, and publishes `vip_hpe_msgs/PersonPose3DArray` on `/pose/people`
     - the animated plot node subscribes to both topics and renders the result

3. **Session/launch orchestration**
   - `vip_hpe_runtime/launch/session.launch.py` starts a full session from YAML under `src/vip_hpe_runtime/config/sessions/`.
   - The session config defines workspace root, topics, source selection, pose mode, preprocessing config, and sinks.
   - This is the main composition boundary: the launch layer wires together nodes based on config rather than hardcoding the graph.

4. **Runtime nodes**
   - `radar_replay_node` replays radar frames from a pickle file.
   - `pose_gt_inference_emulator_node` is the key bridge node: it makes replayed radar look like a future inference path by converting `RadarFrame` to NumPy, building a preprocessor from YAML, and publishing matching ground-truth pose.
   - `animated_plot_node` is a visualization sink using Matplotlib 3D.
   - `pose_gt_replay_node` and `live_model_inference_node` exist as additional runtime modes/placeholders in the same node family.

5. **Replay subsystem**
   - `vip_hpe_runtime/replay/living_lab.py` parses the UNSW Living Lab pickle dataset used by the demo.
   - `replay_base.py` likely provides shared playback behavior for replay-style nodes.
   - This subsystem isolates dataset parsing and timed replay from ROS publishing and from pose preprocessing.

6. **ROS adapters and message boundary**
   - `vip_hpe_runtime/adapters/ros_conversions.py` is the translation layer between ROS message types and internal Python/NumPy representations.
   - Custom messages in `vip_hpe_msgs/msg/` define the runtime contract:
     - `RadarFrame`, `RadarPoint`
     - `Joint3D`, `PersonPose3D`, `PersonPose3DArray`
   - This package is the cross-package interface used by runtime nodes and any future live inference implementation.

7. **Shared preprocessing core**
   - `vip_hpe_core` is explicitly the non-ROS, non-PyTorch shared domain layer.
   - Its main modules are:
     - `preprocessing/base.py` for the preprocessor interface
     - `preprocessing/config.py` for YAML-driven construction
     - `preprocessing/registry.py` for name-to-class lookup
     - `preprocessing/model_input.py` for the model-facing data container
   - The dummy preprocessor config in `src/vip_hpe_core/config/preprocessing/dummy_pointcloud.yaml` is the current example implementation.

8. **Dependency boundary**
   - `vip_hpe_core` must stay free of ROS, `rclpy`, `vip_hpe_msgs`, PyTorch, Ultralytics, ONNX Runtime, and Matplotlib.
   - `vip_hpe_runtime` is allowed to depend on ROS and on `vip_hpe_core`.
   - `ml/` is the intended home for future PyTorch training code and should reuse `vip_hpe_core` rather than duplicating preprocessing logic.
   - This separation is the key architectural constraint in the repo.

9. **Constants and sensor/domain presets**
   - `vip_hpe_core/constants/` contains sensor- or environment-specific constants such as `iwr6843.py`, `kinect.py`, and `living_lab.py`.
   - These files suggest the project is meant to normalize differences between radar hardware, Kinect-derived ground truth, and the Living Lab dataset.
   - They act as shared reference data for preprocessing and replay without tying the core to any particular runtime node.

10. **Configuration-driven behavior**
   - Runtime behavior is mostly configured through YAML, not code changes.
   - The default session config points to the dummy point-cloud preprocessor YAML, and pose mode `replay_gt_synced` demonstrates the future inference contract.
   - The topic names are part of the config contract and are meant to stay stable as the system evolves from replay/emulation to live inference.

11. **Testing and CI**
   - Tests are split by layer:
     - `tests/core` for ROS-free preprocessing and architecture boundaries
     - `tests/runtime` for replay/runtime parsing and node-adjacent logic
     - `tests/ml` as a placeholder
   - The existence of a dependency-boundary test is important architecturally: it enforces the split between shared core logic and ROS runtime.
   - GitHub Actions runs pytest for the core package.

12. **What a diagram should emphasize**
   - Show `data/ll_replay/07_SW.pickle` feeding the replay node.
   - Show a ROS topic bus with `/radar/points` and `/pose/people` as the central data channels.
   - Place `vip_hpe_core` off to the side as a pure preprocessing library used by runtime and future ML.
   - Place `vip_hpe_msgs` as the shared schema boundary between producers, consumers, and future live inference.

Main entry points: [`src/vip_hpe_runtime/vip_hpe_runtime/nodes/pose_gt_inference_emulator_node.py`](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/pose_gt_inference_emulator_node.py) (Pose emulator), [`src/vip_hpe_runtime/vip_hpe_runtime/nodes/radar_replay_node.py`](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/radar_replay_node.py) (Radar replay), [`src/vip_hpe_runtime/vip_hpe_runtime/launching/builders.py`](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/launching/builders.py) (Builders), [`src/vip_hpe_core/vip_hpe_core/preprocessing/config.py`](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/preprocessing/config.py) (Preproc config)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["vip_hpe_runtime"]
  node_session_launch["Session launch<br/>launch entrypoint<br/>[session.launch.py]"]
  node_session_yaml["Replay session<br/>session config"]
  node_launching_config["Launch config<br/>composition config<br/>[config.py]"]
  node_launching_builders["Builders<br/>node factory<br/>[builders.py]"]
  node_launching_validation["Validation<br/>guard rails<br/>[validation.py]"]
  node_radar_replay["Radar replay<br/>ROS node"]
  node_pose_emulator["Pose emulator<br/>ROS node"]
  node_pose_replay["Pose replay<br/>ROS node"]
  node_live_inference["Live inference<br/>ROS node"]
  node_plot_node["Animated plot<br/>ROS node"]
  node_replay_base["Replay base<br/>node base<br/>[replay_base.py]"]
  node_living_lab_parser["Living Lab parser<br/>dataset parser<br/>[living_lab.py]"]
  node_ros_conversions["ROS conversions<br/>adapter<br/>[ros_conversions.py]"]
end

subgraph group_core["vip_hpe_core"]
  node_preproc_config["Preproc config<br/>yaml builder<br/>[config.py]"]
  node_preproc_base["Preprocessor API<br/>interface<br/>[base.py]"]
  node_preproc_registry["Registry<br/>lookup<br/>[registry.py]"]
  node_model_input["Model input<br/>data model<br/>[model_input.py]"]
  node_dummy_yaml["Dummy preproc<br/>example config"]
  node_iwr6843["IWR6843<br/>sensor constants<br/>[iwr6843.py]"]
  node_kinect["Kinect<br/>sensor constants<br/>[kinect.py]"]
  node_living_lab_consts["Living Lab<br/>dataset constants<br/>[living_lab.py]"]
end

subgraph group_msgs["vip_hpe_msgs"]
  node_radar_frame_msg["RadarFrame<br/>ROS msg<br/>[RadarFrame.msg]"]
  node_radar_point_msg(("RadarPoint<br/>ROS msg<br/>[RadarPoint.msg]"))
  node_person_pose_msg["PersonPose3D<br/>ROS msg<br/>[PersonPose3D.msg]"]
  node_person_pose_array_msg["PoseArray<br/>ROS msg"]
  node_joint3d_msg(("Joint3D<br/>ROS msg<br/>[Joint3D.msg]"))
end

subgraph group_ml["ml"]
  node_ml_pkg["vip_hpe_ml<br/>future ML<br/>[__init__.py]"]
end

node_session_launch -->|"loads"| node_session_yaml
node_session_launch -->|"parses"| node_launching_config
node_launching_config -->|"validates"| node_launching_validation
node_launching_config -->|"builds"| node_launching_builders
node_launching_builders -->|"creates"| node_radar_replay
node_launching_builders -->|"creates"| node_pose_emulator
node_launching_builders -->|"creates"| node_plot_node
node_radar_replay -->|"reads"| node_living_lab_parser
node_radar_replay -->|"extends"| node_replay_base
node_pose_emulator -->|"extends"| node_replay_base
node_pose_emulator -->|"converts"| node_ros_conversions
node_pose_emulator -->|"builds"| node_preproc_config
node_preproc_config -->|"instantiates"| node_preproc_base
node_preproc_config -->|"resolves"| node_preproc_registry
node_preproc_base -->|"produces"| node_model_input
node_dummy_yaml -->|"example for"| node_preproc_config
node_radar_replay -->|"publishes"| node_radar_frame_msg
node_pose_emulator -->|"subscribes"| node_radar_frame_msg
node_pose_emulator -->|"publishes"| node_person_pose_array_msg
node_plot_node -->|"subscribes"| node_radar_frame_msg
node_plot_node -->|"subscribes"| node_person_pose_array_msg
node_radar_frame_msg -->|"contains"| node_radar_point_msg
node_person_pose_array_msg -->|"contains"| node_person_pose_msg
node_person_pose_msg -->|"contains"| node_joint3d_msg
node_pose_emulator -->|"uses"| node_iwr6843
node_pose_emulator -->|"uses"| node_kinect
node_radar_replay -->|"uses"| node_living_lab_consts
node_ml_pkg -->|"reuses"| node_preproc_base
node_ml_pkg -->|"consumes"| node_model_input

click node_session_launch "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/launch/session.launch.py"
click node_session_yaml "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/config/sessions/replay_pc_gt_pose_visualize.yaml"
click node_launching_config "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/launching/config.py"
click node_launching_builders "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/launching/builders.py"
click node_launching_validation "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/launching/validation.py"
click node_radar_replay "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/radar_replay_node.py"
click node_pose_emulator "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/pose_gt_inference_emulator_node.py"
click node_pose_replay "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/pose_gt_replay_node.py"
click node_live_inference "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/live_model_inference_node.py"
click node_plot_node "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/animated_plot_node.py"
click node_replay_base "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/replay_base.py"
click node_living_lab_parser "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/replay/living_lab.py"
click node_ros_conversions "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/adapters/ros_conversions.py"
click node_preproc_config "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/preprocessing/config.py"
click node_preproc_base "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/preprocessing/base.py"
click node_preproc_registry "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/preprocessing/registry.py"
click node_model_input "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/preprocessing/model_input.py"
click node_dummy_yaml "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/config/preprocessing/dummy_pointcloud.yaml"
click node_iwr6843 "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/constants/iwr6843.py"
click node_kinect "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/constants/kinect.py"
click node_living_lab_consts "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/constants/living_lab.py"
click node_radar_frame_msg "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_msgs/msg/RadarFrame.msg"
click node_radar_point_msg "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_msgs/msg/RadarPoint.msg"
click node_person_pose_msg "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_msgs/msg/PersonPose3D.msg"
click node_person_pose_array_msg "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_msgs/msg/PersonPose3DArray.msg"
click node_joint3d_msg "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_msgs/msg/Joint3D.msg"
click node_ml_pkg "https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/ml/vip_hpe_ml/__init__.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_session_launch,node_session_yaml,node_launching_config,node_launching_builders,node_launching_validation,node_radar_replay,node_pose_emulator,node_pose_replay,node_live_inference,node_plot_node,node_replay_base,node_living_lab_parser,node_ros_conversions toneBlue
class node_preproc_config,node_preproc_base,node_preproc_registry,node_model_input,node_dummy_yaml,node_iwr6843,node_kinect,node_living_lab_consts toneAmber
class node_radar_frame_msg,node_radar_point_msg,node_person_pose_msg,node_person_pose_array_msg,node_joint3d_msg toneMint
class node_ml_pkg toneRose
```

## Components

### vip_hpe_runtime

ROS 2 nodes, launch/session wiring, replay, and visualization

- [Session launch](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/launch/session.launch.py): launch entrypoint · Starts a full demo session from YAML config · `src/vip_hpe_runtime/launch/session.launch.py`
- [Replay session](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/config/sessions/replay_pc_gt_pose_visualize.yaml): session config · Defines workspace root, topics, source selection, pose mode, preprocessing config, and sinks · `src/vip_hpe_runtime/config/sessions/replay_pc_gt_pose_visualize.yaml`
- [Launch config](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/launching/config.py): composition config · Parses and validates session settings before node creation · `src/vip_hpe_runtime/vip_hpe_runtime/launching/config.py`
- [Builders](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/launching/builders.py): node factory · Constructs runtime nodes and wiring from config · `src/vip_hpe_runtime/vip_hpe_runtime/launching/builders.py`
- [Validation](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/launching/validation.py): guard rails · Checks that session composition is internally consistent · `src/vip_hpe_runtime/vip_hpe_runtime/launching/validation.py`
- [Radar replay](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/radar_replay_node.py): ROS node · Replays prerecorded radar frames into ROS topics · `src/vip_hpe_runtime/vip_hpe_runtime/nodes/radar_replay_node.py`
- [Pose emulator](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/pose_gt_inference_emulator_node.py): ROS node · Bridges replayed radar into preprocessing and publishes ground-truth pose · `src/vip_hpe_runtime/vip_hpe_runtime/nodes/pose_gt_inference_emulator_node.py`
- [Pose replay](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/pose_gt_replay_node.py): ROS node · Alternative pose replay mode in the same runtime family · `src/vip_hpe_runtime/vip_hpe_runtime/nodes/pose_gt_replay_node.py`
- [Live inference](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/live_model_inference_node.py): ROS node · Placeholder node for future online model inference · `src/vip_hpe_runtime/vip_hpe_runtime/nodes/live_model_inference_node.py`
- [Animated plot](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/animated_plot_node.py): ROS node · Subscribes to radar and pose topics and renders the 3D result · `src/vip_hpe_runtime/vip_hpe_runtime/nodes/animated_plot_node.py`
- [Replay base](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/nodes/replay_base.py): node base · Shared playback behavior for replay-style runtime nodes · `src/vip_hpe_runtime/vip_hpe_runtime/nodes/replay_base.py`
- [Living Lab parser](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/replay/living_lab.py): dataset parser · Loads the UNSW Living Lab pickle dataset used by the demo · `src/vip_hpe_runtime/vip_hpe_runtime/replay/living_lab.py`
- [ROS conversions](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_runtime/vip_hpe_runtime/adapters/ros_conversions.py): adapter · Translates between ROS messages and internal Python/NumPy representations · `src/vip_hpe_runtime/vip_hpe_runtime/adapters/ros_conversions.py`

### vip_hpe_core

ROS-free preprocessing and shared constants

- [Preproc config](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/preprocessing/config.py): yaml builder · Builds preprocessors from YAML definitions · `src/vip_hpe_core/vip_hpe_core/preprocessing/config.py`
- [Preprocessor API](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/preprocessing/base.py): interface · ROS-free preprocessor contract · `src/vip_hpe_core/vip_hpe_core/preprocessing/base.py`
- [Registry](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/preprocessing/registry.py): lookup · Resolves preprocessor names to implementations · `src/vip_hpe_core/vip_hpe_core/preprocessing/registry.py`
- [Model input](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/preprocessing/model_input.py): data model · Shared model-facing input container · `src/vip_hpe_core/vip_hpe_core/preprocessing/model_input.py`
- [Dummy preproc](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/config/preprocessing/dummy_pointcloud.yaml): example config · Current example point-cloud preprocessing setup · `src/vip_hpe_core/config/preprocessing/dummy_pointcloud.yaml`
- [IWR6843](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/constants/iwr6843.py): sensor constants · Radar-hardware preset and normalization constants · `src/vip_hpe_core/vip_hpe_core/constants/iwr6843.py`
- [Kinect](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/constants/kinect.py): sensor constants · Kinect-derived ground-truth preset and normalization constants · `src/vip_hpe_core/vip_hpe_core/constants/kinect.py`
- [Living Lab](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_core/vip_hpe_core/constants/living_lab.py): dataset constants · Shared constants for the Living Lab dataset and replay · `src/vip_hpe_core/vip_hpe_core/constants/living_lab.py`

### vip_hpe_msgs

Cross-package ROS message contract

- [RadarFrame](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_msgs/msg/RadarFrame.msg): ROS msg · Radar frame contract carried on /radar/points · `src/vip_hpe_msgs/msg/RadarFrame.msg`
- [RadarPoint](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_msgs/msg/RadarPoint.msg): ROS msg · Single radar point representation · `src/vip_hpe_msgs/msg/RadarPoint.msg`
- [PersonPose3D](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_msgs/msg/PersonPose3D.msg): ROS msg · Single 3D person pose representation · `src/vip_hpe_msgs/msg/PersonPose3D.msg`
- [PoseArray](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_msgs/msg/PersonPose3DArray.msg): ROS msg · Array of person pose messages carried on /pose/people · `src/vip_hpe_msgs/msg/PersonPose3DArray.msg`
- [Joint3D](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/src/vip_hpe_msgs/msg/Joint3D.msg): ROS msg · Single joint used inside pose messages · `src/vip_hpe_msgs/msg/Joint3D.msg`

### ml

Future training workspace, currently ignored by colcon

- [vip_hpe_ml](https://github.com/jon-bon-jono/vip_mmwave_hpe_demo/blob/main/ml/vip_hpe_ml/__init__.py): future ML · Placeholder package for future training code · `ml/vip_hpe_ml/__init__.py`

## Connections

- Session launch → Replay session: loads · Launch entrypoint reads the session definition
- Session launch → Launch config: parses · Launch layer turns YAML into a structured config
- Launch config → Validation: validates · Checks composition and topic wiring
- Launch config → Builders: builds · Validated config is used to instantiate nodes
- Builders → Radar replay: creates · Session composition includes the radar replay node
- Builders → Pose emulator: creates · Session composition includes the pose emulator node
- Builders → Animated plot: creates · Session composition includes the visualization node
- Radar replay → Living Lab parser: reads · Replay node consumes the Living Lab pickle dataset
- Radar replay → Replay base: extends · Replay node shares timed playback behavior
- Pose emulator → Replay base: extends · Bridge node reuses replay-style runtime behavior
- Pose emulator → ROS conversions: converts · Translates ROS radar messages into internal arrays and back
- Pose emulator → Preproc config: builds · Constructs the preprocessor from YAML
- Preproc config → Preprocessor API: instantiates · YAML-driven config produces a preprocessor implementation
- Preproc config → Registry: resolves · Registry maps config names to concrete preprocessors
- Preprocessor API → Model input: produces · Preprocessors emit the shared model-facing input structure
- Dummy preproc → Preproc config: example for · Current demo configuration points at the dummy point-cloud setup
- Radar replay → RadarFrame: publishes · Replayed radar frames are emitted as ROS messages
- Pose emulator → RadarFrame: subscribes · Pose emulator consumes radar frames from the bus
- Pose emulator → PoseArray: publishes · Bridge node emits synchronized pose output
- Animated plot → RadarFrame: subscribes · Visualization reads radar frames from the topic bus
- Animated plot → PoseArray: subscribes · Visualization reads pose output from the topic bus
- RadarFrame → RadarPoint: contains · Radar frame wraps individual radar points
- PoseArray → PersonPose3D: contains · Pose array wraps per-person pose messages
- PersonPose3D → Joint3D: contains · Person pose is composed of 3D joints
- Pose emulator → IWR6843: uses · Preprocessing may rely on radar hardware constants
- Pose emulator → Kinect: uses · Ground-truth pose alignment may rely on Kinect constants
- Radar replay → Living Lab: uses · Replay behavior uses Living Lab dataset constants
- vip_hpe_ml → Preprocessor API: reuses · Future training code is expected to share preprocessing logic
- vip_hpe_ml → Model input: consumes · Training code should consume the shared model input contract
