← V1 research

Pupper v3 ROS 2 graph

pupperv3-monorepo 6f96c5e

On the robot · what it takes to walk

ROS 2 Jazzy · on the Raspberry Pi 5 ros2_control_node · 520 Hz one process hardware below ROS Bluetooth CSI USB mic /joy /joy /teleop_cmd_vel /person_following_cmd_vel 20 Hz direct, past the mux /emergency_stop shared memory states · 260 Hz SPI 6 MHz I2C · IMU CAN ×4 · 1 Mbit/s gamepad DualSense · Bluetooth camera Arducam IMX296 🎙️ voice USB mic · speech Raspberry Pi 5 runs every ROS node joy_linux_node reads the gamepad person_follower_node camera → Hailo YOLOv8m ros_tool_server LiveKit voice agent ⇄ joy_util_node e-stop · mode switch ⇄ teleop_twist_joy_node stick → velocity cmd_vel_mux picks one source /cmd_vel neural_controller RL policy · ≈52 Hz control_board_hardware_interface 520 Hz · SPI + I2C optional nodes TF · Foxglove · bag animation playback control board STM32 ×2 + BNO086 IMU Pupper v3 12 × GIM4305 · PD inside each

In simulation · as built (sim_teleop)

Docker container · ROS 2 Jazzy · on the Mac mini ros2_control_node · 520 Hz one process · ⇄ switch / list controllers simulation and display, not ROS keydown/up WebSocket :9090 /joy · 50 Hz /joy keys /teleop_cmd_vel 20 Hz /emergency_stop /emergency_stop shared memory /dynamic_joint_states 260 Hz, 5 Hz to page MuJoCo 2.3.1 · 0.1 ms step window VNC view · :6080 ⌨️ keyboard held keys control.html Chrome · replaces joy_linux_node DualSense USB or Bluetooth 🖥️ Mac mini (M4) runs all of it rosbridge_websocket JSON over WebSocket ↔ ROS ⇄ teleop_twist_joy_node robot config joy_util_node ✕ start · R3 e-stop ⇄ cmd_vel_mux picks one source /cmd_vel neural_controller RL policy · ≈52 Hz joint_state_broadcaster 260 Hz mujoco_hardware_interface replaces the control board simulated Pupper v3 MuJoCo · motor model · backlash Xvfb → x11vnc → noVNC virtual display · :6080
command topic state / sensor topic /cmd_vel past the mux in-process interface bus / cable, not ROS outside launch.py ⇄calls switch_controller

Full graph · every node in launch.py

ros2_control_node · 520 Hz one process · ⇄ switch_controller below ROS inputs state & tools /joy /teleop_cmd_vel /llm_cmd_vel /camera/image_raw/compressed /detections /person_following_cmd_vel 20 Hz direct, past the mux /emergency_stop /cmd_pose no publisher shared-memory interfaces /imu_sensor_broadcaster/imu · 260 Hz /joint_states · 260 Hz /joint_states_throttled · 10 Hz /forward_*/commands 120 Hz SPI 6 MHz CAN 1 Mbit/s ×4 I2C · 100 Hz joy_linux_node gamepad · /dev/input/js0 llm_websocket_server websocket bridge ⇄ camera camera_ros · IMX296 joy_util_node e-stop · mode buttons ⇄ teleop_twist_joy_node 0.75 · 0.5 m/s · 2 rad/s hailo_detection_node YOLOv8m · Hailo-8L person_follower_node visual servoing cmd_vel_mux priority teleop › llm › person 20 Hz · 500 ms timeout ros_tool_server LiveKit voice agent ⇄ /cmd_vel neural_controller ×2 walk · three-legged · every 10th tick imu_sensor_broadcaster 260 Hz joint_state_broadcaster 260 Hz forward_*_controller ×3 animation · pos · kp · kd control_board_hardware_interface read(): SPI exchange · write(): pack commands · IMU thread STM32F446 ×2 SPIneV1 · SPI → CAN GIM4305 ×12 PD inside each driver BNO08x IMU rotation vector + gyro imu_to_tf TF map → base_link robot_state_publisher URDF + joints → TF joint_state_throttler topic_tools throttle animation_controller_py keyframes 40 fps ⇄ bag_recorder all topics → MCAP foxglove_bridge all topics → WebSocket /tf

Not drawn in the robot views: pupper_feelings (/joy → ears, face) · pupper-rs face GUI (ZMQ) · person-follow triggers · /neural_controller/* debug topics · Notes: notes/pupper_v3_control_flow.md §3.9