saltylab-firmware/docs/SALTYLAB-DETAILED.md
salty 02217443ea chore: merge CAD files and design docs from seb/saltylab seed repo
Consolidating seb/saltylab into saltylab-firmware before deleting the seed repo.
- 16 OpenSCAD CAD models → cad/
- Design docs (SALTYLAB.md, PLATFORM.md, AGENTS.md, board-viz.html) → docs/
2026-03-07 10:04:24 -05:00

18 KiB
Raw Permalink Blame History

SaltyLab — Detailed Build Plan 🔬⚖️

Self-balancing two-wheeled indoor robot with AI brain.


1. Battery Analysis

Pack Specs (Begode Master V1 packs)

  • Configuration per pack: 10S (35V nominal, 42V full, 30V cutoff)
  • Chemistry: Li-ion 18650 or 21700
  • Estimated capacity per pack: ~450-500Wh (based on Master V1 total ~1800Wh ÷ 4 packs)
    • If 10S4P with 21700 5000mAh cells: 36V × 20Ah = 720Wh
    • If 10S3P with 21700 5000mAh cells: 36V × 15Ah = 540Wh
    • If 10S4P with 18650 3500mAh cells: 36V × 14Ah = 504Wh
    • Need to verify: check cell count visible on pack, or weigh it

SaltyLab Battery Config: Single Pack

  • Voltage: 35V nominal (fits hoverboard ESC: designed for 36V/10S)
  • Capacity: ~500Wh (conservative estimate)
  • Weight: ~2-3kg per pack

Why Single Pack is Enough

  • SaltyLab is indoor-only, short missions
  • One pack gives 2-4 hours runtime (see estimates below)
  • Keep other 3 packs for SaltyRider and SaltyTank

2. Power Budget & Range Estimation

Component Power Draw

Component Voltage Current Power (W) Notes
Jetson Nano 5V 2-4A 10-20W AI inference mode: ~15W avg
RealSense D435i 5V (USB) 0.7A 3.5W Depth + RGB streaming
RPLIDAR A1M8 5V 0.5A 2.5W Spinning at 5.5Hz
BNO055 IMU 3.3V 0.01A 0.04W Negligible
ESC (idle/balance) 36V 0.3A 10W Maintaining balance, no movement
LEDs + misc 12V 0.5A 6W Status LEDs, speaker
DC-DC losses ~5W ~85% efficiency on converters
Subtotal (idle/balancing) ~47W

Motor Power (Moving)

Activity Per Motor Total (2 motors) Notes
Balancing in place 5-15W 10-30W Continuous micro-corrections
Slow indoor movement (2 km/h) 15-25W 30-50W Walking pace
Normal indoor (5 km/h) 30-50W 60-100W Brisk walk
Fast / acceleration 80-150W 160-300W Bursts, turning
Climbing threshold/ramp 100-200W 200-400W Short duration

Total Power by Use Case

Mode Electronics Motors Total Notes
Idle (balancing) 47W 20W ~67W Standing still
Slow patrol 47W 40W ~87W Gentle movement
Normal follow 47W 80W ~127W Following person around house
Active (turning, accel) 47W 200W ~247W Bursts

Range Estimates (Single 500Wh Pack)

Mode Avg Power Runtime Distance
Idle (balancing) 67W 7.5 hours 0 km (stationary)
Slow patrol (2 km/h) 87W 5.7 hours ~11 km
Normal follow (5 km/h) 127W 3.9 hours ~20 km
Mixed indoor use ~100W avg 5 hours ~15 km
Aggressive (lots of turning) 180W avg 2.8 hours ~8 km

Bottom line: 3-5 hours of indoor use on a single pack. More than enough.

Weight Budget

Component Weight (g) Notes
Battery pack (1x) 2500 Estimated, weigh to verify
2x 8" hub motors 2400 ~1200g each with tire
ESC board 150 Single board
Jetson Nano + heatsink 280 With Noctua fan
RealSense D435i 72 Very light
RPLIDAR A1M8 170 With motor
BNO055 breakout 5 Tiny
DC-DC converters (2x) 300 150g each
Frame + brackets 1200 Aluminum + 3D printed
Wiring + connectors 200
Bumpers (TPU) 150
TOTAL ~7.4 kg Target: under 8 kg

3. Detailed 2D Schematics

3.1 Base Plate — Top View

                         350mm
    ←─────────────────────────────────────→
    
    ┌─────────────────────────────────────┐  ─┬─
    │ ○                               ○   │   │
    │   ┌───────────────────────────┐     │   │
    │   │      MOTOR MOUNT PLATE    │     │   │
    │   │                           │     │   │
    │   │  ┌─────┐       ┌─────┐   │     │   │
    │   │  │AXLE │       │AXLE │   │     │   │  200mm
    │   │  │ L   │       │ R   │   │     │   │
    │   │  └─────┘       └─────┘   │     │   │
    │   │     ↑   250mm    ↑       │     │   │
    │   │     └─────────────┘      │     │   │
    │   │        track width       │     │   │
    │   └───────────────────────────┘     │   │
    │ ○                               ○   │   │
    └─────────────────────────────────────┘  ─┴─

    ○ = M5 mounting holes for vertical spine (4 corners)
    
    Axle holes: Ø14mm (standard hoverboard axle)
    Plate thickness: 6mm PETG
    
    Motor mount detail:
    ┌──────────────┐
    │  ┌────────┐  │
    │  │ Ø14mm  │  │   Two-piece clamp:
    │  │  axle  │  │   Bottom: part of base plate
    │  │  hole  │  │   Top: clamp plate with 2x M6 bolts
    │  └────────┘  │
    │  ○        ○  │   ○ = M6 clamp bolt holes
    └──────────────┘
         80mm

3.2 Side View — Full Assembly

                    FRONT →
    
    550mm ┬  ┌─────────┐
          │  │ RPLIDAR │ Ø80mm, 360° clear
          │  │  A1M8   │
    500mm │  ├─────────┤
          │  │         │ ← LIDAR standoff tube (80mm tall)
          │  │         │
    420mm │  ├─────────┤
          │  │RealSense│ ← Tilted down 10°, front-facing
          │  │ D435i   │   Adjustable bracket
    380mm │  ├─────────┤
          │  │         │
          │  │ JETSON  │ ← Noctua fan, ventilation slots
          │  │  NANO   │
    300mm │  ├─────────┤
          │  │ BNO055  │ ← IMU, vibration-isolated mount
    280mm │  ├─────────┤
          │  │         │
          │  │ ESC +   │ ← ESC board + DC-DC converters
          │  │ DC-DCs  │
    200mm │  ├─────────┤
          │  │         │
          │  │ BATTERY │ ← Heaviest component, lowest position
          │  │  PACK   │   Strapped to spine with velcro
          │  │         │
     80mm │  ├─────────┤
          │  │  BASE   │ ← Motor mount plate (6mm)
          │  │  PLATE  │
     40mm │  ├────┬────┤
          │  │    │    │
          ┴  └────┘    └── 8" wheel (Ø203mm)
             ═════════════
              GROUND (0mm)
    
    Ground clearance: ~40mm (bottom of plate to ground)
    Wheel contact to axle center: ~100mm (8" diameter / 2)
    Axle height from ground: ~100mm

3.3 Front View

              ←── 350mm ──→
              
              ┌─────────┐          ─┬─ 550mm
              │ RPLIDAR │           │
              ├─────────┤           │
              │   ┃     │  ← spine  │
              │   ┃     │  (2020    │
              │   ┃     │  extrusion│
              │   ┃     │  or       │
              │   ┃     │  aluminum │
              │   ┃     │  tube)    │
              │   ┃     │           │
              ├───┃─────┤           │
    ┌─────┐   │   ┃     │   ┌─────┐│
    │     │   │   ┃     │   │     ││  
    │ 8"  │   │   ┃     │   │ 8"  ││ 100mm
    │ L   │───┤   ┃     ├───│ R   ││ (axle)
    │     │   │   ┃     │   │     ││
    │     │   └───┃─────┘   │     │┴─ 0mm
    └─────┘       ┃         └─────┘
    ═══════════════════════════════════
    
    ←65→←──── 250mm ────→←65→
     mm    (track width)    mm
    
    Total width with tires: ~380mm
    Fits through standard doorway (760mm) ✓

3.4 Spine Detail — Side View

    ┌──┐ ← 20×20mm aluminum extrusion (2020 V-slot)
    │  │   or 25×25mm square aluminum tube
    │  │
    │  │──── Shelf bracket (3D printed, bolts to T-slot)
    │  │     Each shelf: 120mm wide × 100-150mm deep
    │  │
    │  │──── Shelf bracket
    │  │
    │  │──── Shelf bracket
    │  │
    │  │──── Shelf bracket
    │  │
    ├──┤
    │  │──── Base plate connection (L-brackets, 4x M5)
    └──┘

    Spine length: 470mm (from base plate to LIDAR mount)
    
    Shelf positions (from base plate):
      0mm  — Base plate
     30mm  — Battery shelf (holds pack on its side)
    150mm  — ESC + DC-DC shelf  
    250mm  — Jetson Nano shelf
    300mm  — BNO055 (attached to spine directly)
    370mm  — RealSense bracket (front-facing arm)
    420mm  — LIDAR standoff begins
    500mm  — LIDAR mount plate

3.5 Wiring Diagram

    BATTERY PACK (35V nominal, 10S Li-ion)
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
         │(+)                    ()│
         │                          │
         ├──[E-STOP (NC)]───────────┤
         │                          │
    XT60 ├────────┬────────┬────────┤ XT60
         │        │        │        │
         │    ┌───┴───┐    │        │
         │    │DC-DC  │    │        │
         │    │36V→5V │    │        │
         │    │  4A   │    │        │
         │    └───┬───┘    │        │
         │     5V │        │        │
         │    ┌───┴────┐   │        │
         │    │USB Hub │   │        │
         │    │Jetson  │   │        │
         │    │RealSns │   │        │
         │    │RPLIDAR │   │        │
         │    └────────┘   │        │
         │                 │        │
         │    ┌────┴───┐   │        │
         │    │DC-DC   │   │        │
         │    │36V→12V │   │        │
         │    │  2A    │   │        │
         │    └───┬────┘   │        │
         │    12V │        │        │
         │    ┌───┴────┐   │        │
         │    │LEDs    │   │        │
         │    │Speaker │   │        │
         │    └────────┘   │        │
         │                 │        │
    ┌────┴─────────────────┴────────┴────┐
    │          HOVERBOARD ESC            │
    │          (FOC firmware)            │
    │                                    │
    │  I2C: SDA──BNO055──SCL            │
    │  UART: TX──Jetson──RX             │
    │                                    │
    │  PHASE L: ─── 8" LEFT MOTOR       │
    │  HALL  L: ─── (5 wire: hall A/B/C │
    │                + 5V + GND)         │
    │                                    │
    │  PHASE R: ─── 8" RIGHT MOTOR      │
    │  HALL  R: ─── (5 wire)            │
    └────────────────────────────────────┘

4. Phased Build Plan

Phase 1: Rolling Skeleton (Days 1-3)

Goal: Prove balance works.

Tasks:

  • Measure 8" motor axle diameter with calipers
  • Design motor mount plate in CAD (FreeCAD or TinkerCAD)
  • Print motor mount plate on Bambu X1C (PETG, 80% infill, ~4h print)
  • Print axle clamp tops (x2)
  • Mount both 8" motors to plate
  • Mount ESC to plate with standoffs
  • Wire BNO055 to ESC I2C (4 wires: VCC, GND, SDA, SCL)
  • Wire battery to ESC (XT60)
  • Modify FOC firmware: add BNO055 I2C read, replace gyro board input
  • Flash ESC with updated firmware
  • SAFETY: Tie rope from ceiling to plate as fall catch
  • Power on, tune PID (start with Kp=20, Ki=0, Kd=0, increase gradually)
  • Achieve stable free-standing balance (no rope)

Parts needed: motor mount plate, 2x clamp tops, M6 bolts, M3 standoffs Risk: PID tuning can take hours of iteration. Be patient.

Phase 2: Spine + Brain (Days 4-7)

Goal: Add Jetson, achieve remote-controlled movement while balancing.

Tasks:

  • Cut aluminum extrusion/tube to 470mm for spine
  • Print shelf brackets (4x) and L-brackets for base connection
  • Assemble spine onto base plate
  • Mount battery to lowest shelf (velcro straps)
  • Mount ESC + DC-DC converters
  • Mount Jetson Nano on shelf, connect 5V power
  • Wire Jetson UART → ESC UART
  • Install JetPack 4.6 on Jetson (if not already)
  • Write serial bridge: Jetson Python → ESC UART commands
  • Test: keyboard control (WASD) → speed/steer commands → balanced movement
  • Tune speed response (acceleration limits, max speed for indoor)
  • Add E-stop button (inline with battery positive)

Software deliverable: saltylab_teleop.py — keyboard-controlled balancing bot

Phase 3: Eyes + Ears (Days 8-12)

Goal: See the world. Map a room. Detect people.

Tasks:

  • Print RealSense bracket (adjustable tilt)
  • Print LIDAR standoff tube + mount plate
  • Mount RealSense D435i (front-facing, ~10° down tilt)
  • Mount RPLIDAR A1M8 (top of spine, 360° clear)
  • Install ROS2 on Jetson
  • Install and test realsense-ros (verify depth stream)
  • Install and test rplidar_ros (verify laser scan)
  • Run slam_toolbox — drive around room, build 2D map
  • Test person detection with SSD-MobileNet-v2 (TensorRT)
  • Implement follow mode:
    • Detect person in RGB frame
    • Get distance from depth frame
    • PID to maintain 1.5m following distance
    • LIDAR for obstacle avoidance

Software deliverable: saltylab_follow.py — person-following balanced bot

Phase 4: Polish + Personality (Days 13-17)

Goal: Make it feel alive. Make it SaltyLab.

Tasks:

  • Print proper enclosures for all electronics
  • Print TPU bumpers (front + rear)
  • Print carry handle
  • Add NeoPixel LED ring around LIDAR mount (status indication)
    • Blue breathing: idle/balancing
    • Green: following
    • Yellow: exploring/mapping
    • Red: error/low battery
  • Add small speaker (USB or I2S to amp)
    • Boot sound
    • Acknowledge commands with beeps/chirps
    • Optional: TTS via Jetson ("I see you", "battery low")
  • WiFi dashboard: live camera feed + map + battery status
  • Battery voltage monitoring (ADC on ESC → Jetson via UART)
  • Low battery return behavior (stop and beep)
  • Integrate with Home Assistant (MQTT: location, battery, status)

Phase 5: House Mapping + Autonomy (Days 18-24)

Goal: SaltyLab knows your house.

Tasks:

  • Map every room (drive around manually, SLAM builds full floor plan)
  • Save map, set up nav2 for autonomous navigation
  • Define waypoints: lab, living room, kitchen, hallway
  • Patrol mode: visit waypoints on schedule
  • Person detection + greeting ("hey Tee", "hi Inka")
  • Integration with Bermuda BLE: know where people are, go to them
  • Charging dock design (future: auto-dock when low)

5. Speed & Performance Specs

Target Performance

Parameter Value Notes
Max speed (indoor) 5 km/h Software limited for safety
Normal follow speed 2-3 km/h Walking pace
Turning radius 0 (pivot) Differential drive, spins in place
Ground clearance 40mm Clears door thresholds (~15mm)
Max incline ~10° Limited by motor torque + balance
Operating time 3-5 hours Single 500Wh pack
Charge time ~2-3 hours Using one of the existing chargers
Weight ~7.5 kg Easy to pick up with handle
Width 380mm Fits all doorways
Height 550mm Below table height

Motor Specs (8" hub motor, estimated)

Parameter Value
Nominal voltage 36V
Rated power 250-350W per motor
No-load RPM ~250 RPM
Wheel circumference ~0.64m (Ø203mm)
Max wheel speed 160 m/min = 9.6 km/h
Continuous torque ~2-3 Nm
Stall torque ~8-10 Nm

6. Safety Considerations

Hazard Mitigation
Falls over TPU bumpers, max tilt cutoff (30°), low CoG
Runs away Software speed limit (5 km/h), E-stop button
Pinches/crushes No exposed gears, motor covers
Battery fire BMS on pack, fused main power, no charging unattended
Hits furniture LIDAR obstacle avoidance, bumper sensors (future)
Scares the cat Slow acceleration, no sudden movements

7. Shopping List (Items NOT in Inventory)

Item Price (CAD) Source Notes
2020 aluminum extrusion 500mm ~$8 Amazon/AliExpress Spine
T-slot nuts + M5 bolts (pack) ~$12 Amazon For shelf mounting
M6 bolts + nuts (axle clamps) ~$5 Hardware store 4x sets
NeoPixel ring (24 LED) ~$8 Amazon Status indication
Small speaker + amp (MAX98357A) ~$10 Amazon/Adafruit I2S audio
E-stop mushroom button ~$5 Amazon Safety
XT60 splitter/distribution ~$8 Amazon Power wiring
Misc: heat shrink, zip ties, wire ~$10 Always need more
TOTAL ~$66 Everything else: already owned

Last updated: 2026-02-27 Project: SaltyRover / SaltyLab