× Overview Our Purpose The Robot Learning Path Contact Learning Hub ↗
The Robot

21 degrees of freedom.
All student-controlled.

A real physical platform running ROS 2. Students write code, connect it to hardware, and watch a machine respond. Click the anatomy hotspots below to explore every system.

SwayForm humanoid robot prototype
21
Degrees of freedom
8 GB
RPi 5 RAM
12V
Main supply rail
D435i
RealSense depth
ROS 2
Software stack
PLA
3D printed frame
Interactive Anatomy

The robot, labeled.

Click any hotspot. The viewer animates into that part and holds on the labeled image.

SwayForm robot overview
Loading system view…

Click a hotspot on the robot to explore that system.

Joint Reference

All joints

ROS joint names, PCA9685 channels, safe ranges, and servo models.

Joint name ROS name Ch Range Servo Access
Neck Yaw neck_yaw 0 −45° / +45° MG996R Student
Neck Pitch neck_pitch 1 −20° / +25° MG90S Student
R. Shoulder Pitch right_shoulder_pitch 2 −10° / +90° MG996R Student
R. Shoulder Roll right_shoulder_roll 3 −30° / +20° MG996R Student
R. Elbow right_elbow 4 −120° / 0° MG996R Student
R. Wrist right_wrist 5 −45° / +45° MG90S Student
R. Thumb right_thumb 6 0° / +70° MG90S Student
R. Index Finger right_index 7 0° / +90° MG90S Student
R. Middle Finger right_middle 8 0° / +90° MG90S Student
R. Ring Finger right_ring 9 0° / +90° MG90S Student
R. Pinky Finger right_pinky 10 0° / +80° MG90S Student
L. Shoulder Pitch left_shoulder_pitch 11 −10° / +90° MG996R Student
L. Shoulder Roll left_shoulder_roll 12 −20° / +30° MG996R Student
L. Elbow left_elbow 13 0° / +120° MG996R Student
L. Wrist left_wrist 14 −45° / +45° MG90S Student
L. Thumb left_thumb 15 0° / +70° MG90S Student
L. Index Finger left_index 16 0° / +90° MG90S Student
L. Middle Finger left_middle 17 0° / +90° MG90S Student
L. Ring Finger left_ring 18 0° / +90° MG90S Student
L. Pinky Finger left_pinky 19 0° / +80° MG90S Student
Waist Rotation waist_yaw DC −60° / +60° DC+encoder Supervised
Components

Every part. What it does. How it connects to code.

Key components. Click any card for details.

Raspberry Pi 5 (8GB)
Compute

The robot's brain. Runs Ubuntu 22.04, ROS 2, the hardware driver, and all student nodes. Connects to everything over GPIO, I²C, USB, and WiFi.

Python lib: rclpy
Intel RealSense D435i
Vision

Publishes synchronized color and depth image streams. Color at 640×480, depth per pixel in millimeters. USB-connected to Pi. Min range ~0.3m.

Topic: /camera/color/image_raw
PCA9685 ×2
Motion

16-channel PWM controllers on I²C. Two units give 32 total channels. Addresses 0x40 and 0x41. 12-bit resolution, 50Hz default frequency.

Python lib: adafruit_pca9685
MG996R Servo
Motion

High-torque metal-gear servo for large joints (shoulders, elbows). Stall torque 13kg/cm at 6V. PWM range 500–2500µs.

Current draw: up to 1.4A stall
MG90S Servo
Motion

Micro metal-gear servo for small joints (wrists, fingers, neck pitch). Stall torque 2.2kg/cm at 5V. Same PWM timing as MG996R.

Weight: 13.4g
MPU-6050 IMU
Sensing

Accelerometer + gyroscope on one I²C chip. Publishes on /swayform/imu. Used for tilt detection, shake triggers, and orientation-aware behaviors.

Topic: /swayform/imu
HC-SR04 Ultrasonic
Sensing

Time-of-flight distance sensor. Range 2cm–4m, ±3mm accuracy. Key for proximity-triggered greetings and obstacle detection behaviors.

Topic: /swayform/distance
12V / 5A Power Supply
Power

Main input rail. Steps down to 6V servo rail and 5V Pi rail via buck converters. Never connect/disconnect while servos are active.

Two-rail isolated architecture
PAM8403 Amp + Speaker
Audio

3.5mm from Pi 5 → PAM8403 amp → 3W speaker. Software: pyttsx3 for TTS, pygame.mixer for clips. Triggered via /swayform/audio_command.

Topic: /swayform/audio_command
Electrical

Power architecture

The servo rail and Pi rail are intentionally separate. Current spikes from motors should never reset the Pi.

Wiring block diagram
12V PSU 5A+ Terminal Bus bar Buck 5V Pi 5 rail Pi 5 USB-C 5V PCA9685 ×2 I²C @ 0x40/41 Buck 6V Servo rail Servo Power MG996R/90S PWM signal

Common electrical issues

Servo twitching randomly
Voltage sag under load. Buck converter undersized or servo rail underpowered. Check voltage at PCA9685 V+ pin under load (should stay above 5.8V).
Pi reboots when robot moves
Servo rail and Pi rail sharing ground but not properly isolated. Inrush current from multiple servos starting simultaneously spikes the Pi supply. Use separate buck converters.
One side of robot dead
Second PCA9685 not initializing. Check I²C address (0x41 vs 0x40 jumper). Run i2cdetect -y 1 on Pi and confirm both addresses appear.
Grinding noise from joint
Servo hitting mechanical stop. Out-of-range command bypassing clamp, or wrong joint name published. Cut servo power immediately. Verify angle limits and joint name mapping.