# nuttawat-saepan/robot-buddy-python architecture

> Architecture diagram of the GitHub repository nuttawat-saepan/robot-buddy-python, 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/nuttawat-saepan/robot-buddy-python
- Repository: https://github.com/nuttawat-saepan/robot-buddy-python

## Overview

This repository provides ROS 2 control and navigation software for Unitree quadruped robots, plus C++ API clients and runnable examples. The apparent user-to-result workflow is to start a real or simulated robot, produce navigation or velocity commands, and send them to the robot; the file tree identifies these stages, but the Python control and launch wiring was not excerpted, so those links are left unverified. The excerpts do show C++ request/response clients and their ROS topics. The README is empty, and unsampled modules are represented only where their purpose is apparent from their names.

Main entry points: [`src/go2_control/go2_control/main.py`](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/go2_control/main.py) (Control Application), [`src/go2_control/include/g1/g1_audio_client.hpp`](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/g1/g1_audio_client.hpp) (G1 Audio), [`src/go2_control/include/common/ros2_sport_client.h`](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/ros2_sport_client.h) (Sport Client), [`src/go2_control/include/common/base_client.hpp`](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/base_client.hpp) (Request Base Client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_navigation["Navigation and Control"]
  node_control_main["Control Application<br/>[main.py]"]
  node_localizer["April Localizer<br/>[april_localizer.py]"]
  node_waypoints["Waypoint Generator<br/>[waypoint_gen.py]"]
  node_goal_sender["Goal Sender<br/>[send_goal.py]"]
end

subgraph group_ros["ROS Integration"]
  node_velocity_node["Velocity Node<br/>[cmd_vel_node.cpp]"]
  node_launch_modes["Robot Launch Modes<br/>[real.launch.py]"]
  node_sim_launch["Simulation Launch<br/>[sim.launch.py]"]
end

subgraph group_clients["Robot API Clients"]
  node_sport_client["Sport Client"]
  node_b2_sport_client["B2 Sport Client"]
  node_robot_state["Robot State Client"]
  node_motion_client["B2 Motion Switch"]
  node_g1_loco["G1 Locomotion<br/>[g1_loco_client.hpp]"]
  node_g1_audio["G1 Audio"]
  node_base_client["Request Base Client<br/>[base_client.hpp]"]
  node_b2_base["B2 Base Client<br/>[b2_base_client.hpp]"]
end

subgraph group_examples["Control Examples"]
  node_sport_example["Go2 Sport Example"]
  node_state_example["Go2 State Example"]
  node_audio_example["G1 Audio Example"]
end

node_operator(("Operator"))
node_robot{{"Unitree Robot"}}
node_sport_api["Sport Request Topic"]
node_b2_api["B2 Sport Request Topic"]
node_voice_api["Voice Request API"]

node_operator -.->|"operates"| node_control_main
node_control_main -.->|"uses"| node_localizer
node_control_main -.->|"uses"| node_waypoints
node_control_main -.->|"dispatches goals"| node_goal_sender
node_control_main -.->|"sends commands"| node_velocity_node
node_launch_modes -.->|"starts"| node_control_main
node_sim_launch -.->|"simulates"| node_robot
node_sport_client -->|"publishes requests"| node_sport_api
node_b2_sport_client -->|"publishes requests"| node_b2_api
node_motion_client -->|"delegates calls"| node_b2_base
node_g1_loco -->|"delegates calls"| node_base_client
node_g1_audio -->|"delegates calls"| node_base_client
node_g1_audio -->|"requests voice actions"| node_voice_api
node_sport_example -->|"uses client"| node_sport_client
node_state_example -->|"uses client"| node_robot_state
node_audio_example -->|"uses client"| node_g1_audio

click node_control_main "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/go2_control/main.py"
click node_localizer "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/go2_control/april_localizer.py"
click node_waypoints "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/go2_control/waypoint_gen.py"
click node_goal_sender "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/go2_control/send_goal.py"
click node_velocity_node "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/src/cmd_vel_node.cpp"
click node_launch_modes "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/launch/real.launch.py"
click node_sim_launch "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/launch/sim.launch.py"
click node_sport_client "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/ros2_sport_client.h"
click node_b2_sport_client "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/ros2_b2_sport_client.h"
click node_robot_state "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/ros2_robot_state_client.h"
click node_motion_client "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/b2/b2_motion_switch_client.hpp"
click node_g1_loco "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/g1/g1_loco_client.hpp"
click node_g1_audio "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/g1/g1_audio_client.hpp"
click node_base_client "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/base_client.hpp"
click node_b2_base "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/b2_base_client.hpp"
click node_sport_example "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/unitree_example/src/go2/go2_sport_client.cpp"
click node_state_example "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/unitree_example/src/go2/go2_robot_state_client.cpp"
click node_audio_example "https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/unitree_example/src/g1/audio_client/g1_audio_client_example.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_control_main,node_localizer,node_waypoints,node_goal_sender toneBlue
class node_velocity_node,node_launch_modes,node_sim_launch toneAmber
class node_sport_client,node_b2_sport_client,node_robot_state,node_motion_client,node_g1_loco,node_g1_audio,node_base_client,node_b2_base,node_sport_api,node_b2_api,node_voice_api toneMint
class node_sport_example,node_state_example,node_audio_example toneRose
class node_operator,node_robot toneIndigo
```

## Components

### Navigation and Control

- [Control Application](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/go2_control/main.py): `src/go2_control/go2_control/main.py`
- [April Localizer](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/go2_control/april_localizer.py): `src/go2_control/go2_control/april_localizer.py`
- [Waypoint Generator](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/go2_control/waypoint_gen.py): `src/go2_control/go2_control/waypoint_gen.py`
- [Goal Sender](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/go2_control/send_goal.py): `src/go2_control/go2_control/send_goal.py`

### ROS Integration

- [Velocity Node](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/src/cmd_vel_node.cpp): `src/go2_control/src/cmd_vel_node.cpp`
- [Robot Launch Modes](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/launch/real.launch.py): `src/go2_control/launch/real.launch.py`
- [Simulation Launch](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/launch/sim.launch.py): `src/go2_control/launch/sim.launch.py`

### Robot API Clients

- [Sport Client](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/ros2_sport_client.h): `src/go2_control/include/common/ros2_sport_client.h`
- [B2 Sport Client](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/ros2_b2_sport_client.h): `src/go2_control/include/common/ros2_b2_sport_client.h`
- [Robot State Client](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/ros2_robot_state_client.h): `src/go2_control/include/common/ros2_robot_state_client.h`
- [B2 Motion Switch](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/b2/b2_motion_switch_client.hpp): `src/go2_control/include/b2/b2_motion_switch_client.hpp`
- [G1 Locomotion](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/g1/g1_loco_client.hpp): `src/go2_control/include/g1/g1_loco_client.hpp`
- [G1 Audio](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/g1/g1_audio_client.hpp): `src/go2_control/include/g1/g1_audio_client.hpp`
- [Request Base Client](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/base_client.hpp): `src/go2_control/include/common/base_client.hpp`
- [B2 Base Client](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/go2_control/include/common/b2_base_client.hpp): `src/go2_control/include/common/b2_base_client.hpp`

### Control Examples

- [Go2 Sport Example](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/unitree_example/src/go2/go2_sport_client.cpp): `src/unitree_example/src/go2/go2_sport_client.cpp`
- [Go2 State Example](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/unitree_example/src/go2/go2_robot_state_client.cpp): `src/unitree_example/src/go2/go2_robot_state_client.cpp`
- [G1 Audio Example](https://github.com/nuttawat-saepan/robot-buddy-python/blob/main/src/unitree_example/src/g1/audio_client/g1_audio_client_example.cpp): `src/unitree_example/src/g1/audio_client/g1_audio_client_example.cpp`

### Other components

- **Operator**
- **Unitree Robot**
- **Sport Request Topic**
- **B2 Sport Request Topic**
- **Voice Request API**

## Connections

- Operator → Control Application: operates
- Control Application → April Localizer: uses
- Control Application → Waypoint Generator: uses
- Control Application → Goal Sender: dispatches goals
- Control Application → Velocity Node: sends commands
- Robot Launch Modes → Control Application: starts
- Simulation Launch → Unitree Robot: simulates
- Sport Client → Sport Request Topic: publishes requests (evidence: `src/go2_control/include/common/ros2_sport_client.h`)
- B2 Sport Client → B2 Sport Request Topic: publishes requests (evidence: `src/go2_control/include/common/ros2_b2_sport_client.h`)
- B2 Motion Switch → B2 Base Client: delegates calls (evidence: `src/go2_control/include/b2/b2_motion_switch_client.hpp`)
- G1 Locomotion → Request Base Client: delegates calls (evidence: `src/go2_control/include/g1/g1_loco_client.hpp`)
- G1 Audio → Request Base Client: delegates calls (evidence: `src/go2_control/include/g1/g1_audio_client.hpp`)
- G1 Audio → Voice Request API: requests voice actions (evidence: `src/go2_control/include/g1/g1_audio_client.hpp`)
- Go2 Sport Example → Sport Client: uses client (evidence: `src/unitree_example/src/go2/go2_sport_client.cpp`)
- Go2 State Example → Robot State Client: uses client (evidence: `src/unitree_example/src/go2/go2_robot_state_client.cpp`)
- G1 Audio Example → G1 Audio: uses client (evidence: `src/unitree_example/src/g1/audio_client/g1_audio_client_example.cpp`)
