# SaltyRover Chassis Rev 2 — BOM & Assembly Notes
**Issue: #109  Agent: sl-mechanical  Date: 2026-03-01**

---

## Overview

Rev 2 adds spring suspension, an enclosed electronics bay, and corner CSI cameras
to the SaltyRover platform (originally designed in issue #73).
Sensor head, RPLIDAR, D435i, and vertical stem are **shared with SaltyLab** — no changes.

```
Top view (schematic):

        +Y (forward)
             │
 [CSI] ┌────┴────┐ [CSI]
    ◉──┤         ├──◉   ← front axles (suspension arms)
       │ [Orin]  │
       │ [ Bay ] │
       │ [RPLIDAR tower]
       │ [ FC  ] │
    ◉──┤         ├──◉   ← rear axles (suspension arms)
 [CSI] └────┬────┘ [CSI]
             │
         D435i →

Deck footprint: 500 × 480 mm (Y × X)
Track (axle C/C):     540 mm
Wheelbase (axle C/C): 340 mm
Ground clearance:      55 mm (static sag; 30 mm at full compression)
Overall width (tyre edge to tyre edge): ~810 mm
Overall height (deck to RPLIDAR top): ~317 mm
```

---

## File Index

| File | Description | Part | Qty |
|------|-------------|------|-----|
| `saltyrover_chassis_r2.scad` | Deck plate + pivot brackets + sensor brackets | Laser cut + 3D print | See below |
| `rover_spring_arm.scad` | Spring suspension trailing arm + retainer cap | 3D print | 4× arm + 4× cap |
| `rover_electronics_bay.scad` | Electronics bay body + lid (with RPLIDAR tower) | 3D print | 1× body + 1× lid |
| `rover_motor_mount.scad` | Motor axle L-bracket (Rev 1, unchanged) | 3D print or CNC | 4× |
| `rover_battery_tray.scad` | Under-deck battery slide tray (Rev 1) | 3D print | 1× |
| `rover_stem_adapter.scad` | Stem-to-deck collar adapter (Rev 1) | 3D print | 1× |
| `rplidar_mount.scad` | RPLIDAR anti-vibration ring (shared) | 3D print | 1× |
| `realsense_mount.scad` | D435i bracket (integrated into chassis r2) | — | — |
| `imx219_mount.scad` | IMX219 radial arm on sensor_head (unchanged) | — | — |

---

## Part A — Deck Plate (`saltyrover_chassis_r2.scad` → `deck_2d`)

| # | Spec | Qty | Notes |
|---|------|-----|-------|
| A1 | 6 mm 5052-H32 aluminium, 500×480 mm blank | 1 | Waterjet or CNC router. 6 mm preferred (vs 8 mm Rev 1) for weight target. |
| A1-alt | 8 mm PETG FDM, split in two halves, joined with M5 lap bolts | 1 | Prototype only — expect 1.5× weight, 0.5× stiffness |

**Deck plate weight estimate:** 6 mm Al, ~50% lightening → **≈ 1.15 kg** ✓

Export DXF:
```bash
openscad saltyrover_chassis_r2.scad -D 'RENDER="deck_2d"' -o saltyrover_r2_deck.dxf
```

---

## Part B — Pivot Brackets (`saltyrover_chassis_r2.scad` → `pivot_bracket_stl`)

Each bracket provides: M8 pivot for suspension arm + spring guide boss + M3 adjustment slots.

| # | RENDER | Qty | Material | Settings |
|---|--------|-----|----------|----------|
| B1 | `pivot_bracket_stl` | 4 | PETG or PC | 5 perims, 60% gyroid |
| B1-alt | `pivot_bracket_2d` | 4 | 8 mm 6061-T6 Al | CNC router / waterjet |

CNC export:
```bash
openscad saltyrover_chassis_r2.scad -D 'RENDER="pivot_bracket_2d"' -o rover_pivot_bracket.dxf
```

**Fasteners — Bracket to Deck:**

| # | Spec | Qty | Use |
|---|------|-----|-----|
| B-f1 | M3×16 SHCS | 8 | Bracket to deck (2× per bracket) through slotted deck holes |
| B-f2 | M3 nyloc nut | 8 | Under-deck retention (accessible from below before deck install) |
| B-f3 | M3 flat washer | 16 | Both sides |

**Fasteners — Suspension pivot:**

| # | Spec | Qty | Use |
|---|------|-----|-----|
| B-f4 | M8×50 SHCS | 4 | Pivot pin (bracket clevis → trailing arm) |
| B-f5 | M8 nyloc nut | 4 | Pivot retention |
| B-f6 | M8 flat washer | 8 | Both sides of clevis |
| B-f7 | Flanged IGUS GFI-0810-10 bushing | 4 | Pivot arm bearing (optional, reduces wear) |

---

## Part C — Spring Suspension Arms (`rover_spring_arm.scad`)

| # | RENDER | Qty | Material | Settings |
|---|--------|-----|----------|----------|
| C1 | `arm_stl` | 4 | PC (Polycarbonate) recommended; PETG acceptable | 5 perims, 60% gyroid infill |
| C2 | `retainer_stl` | 4 | PETG | 4 perims, 40% infill |

Export:
```bash
openscad rover_spring_arm.scad -D 'RENDER="arm_stl"'       -o rover_spring_arm.stl
openscad rover_spring_arm.scad -D 'RENDER="retainer_stl"'  -o rover_spring_retainer.stl
```

**Compression Springs (×4):**

| # | Spec | Qty | Notes |
|---|------|-----|-------|
| C-s1 | OD 14 mm, wire Ø 1.5 mm, free length 50 mm, spring rate ~5 N/mm | 4 | Lee Spring LCI 014M 05 S or equivalent |
| C-s2 | *(Stiffer alternative)* OD 14 mm, rate ~8 N/mm | 4 | For heavier payloads >3 kg |

**Retainer fasteners:**

| # | Spec | Qty | Use |
|---|------|-----|-----|
| C-f1 | M3×12 SHCS | 8 | Retainer cap to arm (2× per arm; self-taps into PETG) |

---

## Part D — Electronics Bay (`rover_electronics_bay.scad`)

| # | RENDER | Qty | Material | Settings |
|---|--------|-----|----------|----------|
| D1 | `bay_stl` | 1 | PETG | 4 perims, 30% gyroid |
| D1-alt | `front_half` + `rear_half` | 1+1 | PETG | For 220 mm bed printers (split at Y=0 centreline) |
| D2 | `lid_stl` | 1 | PETG | 4 perims, 30% gyroid |

Export:
```bash
openscad rover_electronics_bay.scad -D 'RENDER="bay_stl"'    -o rover_elec_bay.stl
openscad rover_electronics_bay.scad -D 'RENDER="lid_stl"'    -o rover_elec_bay_lid.stl
# For 220 mm beds:
openscad rover_electronics_bay.scad -D 'RENDER="front_half"' -o rover_elec_bay_front.stl
openscad rover_electronics_bay.scad -D 'RENDER="rear_half"'  -o rover_elec_bay_rear.stl
```

**Bay-to-deck fasteners:**

| # | Spec | Qty | Use |
|---|------|-----|-----|
| D-f1 | M3×12 SHCS | 10 | Bay body to deck through floor flanges |
| D-f2 | M3 flat washer | 10 | Under head |
| D-f3 | M3×8 BHCS | 4 | Lid retention (corner screws self-tap into bay rim) |

**Electronics internal (FC + Jetson standoffs — built into bay body):**

| # | Spec | Qty | Use |
|---|------|-----|-----|
| D-f4 | M3×8 SHCS | 8 | FC mount to bay standoffs (4×) + Jetson to bay standoffs (4×) |
| D-f5 | M3 flat washer | 8 | Under heads |
| D-f6 | Anti-vibration M3 grommet | 4 | FC isolation (silicone, M3, same as rplidar_mount.scad) |

---

## Part E — CSI Corner Camera Brackets (`saltyrover_chassis_r2.scad` → `csi_mount_stl`)

| # | RENDER | Qty | Material | Settings |
|---|--------|-----|----------|----------|
| E1 | `csi_mount_stl` | 4 | PETG | 4 perims, 30% infill |

Export:
```bash
openscad saltyrover_chassis_r2.scad -D 'RENDER="csi_mount_stl"' -o rover_csi_mount.stl
```

| # | Spec | Qty | Use |
|---|------|-----|-----|
| E-f1 | M2×6 SHCS | 8 | CSI camera PCB to bracket (2× per camera) |
| E-f2 | M3×8 SHCS | 8 | Bracket to deck (2× per bracket) |
| E-c1 | 200 mm CSI FPC flat cable | 4 | IMX219 to Jetson (extended) |

---

## Part F — D435i Front Bracket (`saltyrover_chassis_r2.scad` → `d435i_mount_stl`)

| # | RENDER | Qty | Material | Settings |
|---|--------|-----|----------|----------|
| F1 | `d435i_mount_stl` | 1 | PETG | 5 perims, 40% infill |

Export:
```bash
openscad saltyrover_chassis_r2.scad -D 'RENDER="d435i_mount_stl"' -o rover_d435i_mount.stl
```

| # | Spec | Qty | Use |
|---|------|-----|-----|
| F-f1 | 1/4-20 UNC hex nut | 1 | Captured in bracket face for D435i tripod socket |
| F-f2 | M4×14 SHCS | 2 | Bracket to deck front face |

---

## Mass Estimate — Frame Only (excl. motors, electronics, battery)

| Assembly | Material | Est. mass |
|----------|----------|-----------|
| Deck plate | 6 mm Al, lightened | ~1.15 kg |
| Pivot brackets × 4 | PETG | ~0.22 kg |
| Spring arms × 4 | PC | ~0.28 kg |
| Spring retainer caps × 4 | PETG | ~0.04 kg |
| Springs × 4 | Steel | ~0.04 kg |
| Electronics bay body | PETG | ~0.12 kg |
| Electronics bay lid + RPLIDAR tower | PETG | ~0.08 kg |
| CSI brackets × 4 | PETG | ~0.04 kg |
| D435i bracket × 1 | PETG | ~0.03 kg |
| Fasteners (M2–M8) | Stainless | ~0.15 kg |
| **Frame total** | | **~2.15 kg** |

> ⚠ Target: <2 kg frame.  Current estimate is 0.15 kg over.
> Options to reduce:
>   1. Switch deck from 6 mm Al → 5 mm Al saves ~0.19 kg ✓
>   2. Or: enlarge lightening holes from Ø55 → Ø65 mm (saves ~0.12 kg)
>   3. Electronics bay in 2 mm wall PETG (saves ~0.06 kg)
>   Recommend option 1: change `DECK_T = 5.0` in `saltyrover_chassis_r2.scad`
>   and re-verify with waterjet quotation.

---

## Assembly Sequence

### 1. Fabrication
1. Export DXF and send deck plate to waterjet / CNC.  Specify 6 mm (or 5 mm) 5052-H32 Al.
2. Export and print all STL parts (settings per table above).
3. Source springs, fasteners, and hub motors per BOM.

### 2. Deck preparation
1. Deburr all deck holes.  Tap stem-collar M4 holes if using threaded standoffs.
2. Press or thread M3 rivet-nuts into deck at battery-tray rail positions (from `rover_battery_tray.scad`).
3. Apply stem collar with 4× M4×16 FHCS; Loctite 243.

### 3. Pivot bracket installation
1. Slide pivot bracket through deck M3 slots (under-deck side first).
2. Fit M3 washers + nyloc nuts; snug but do not torque — leave adjustable.
3. Set all 4 brackets to nominal Y position (motor corner fore-aft CL).
4. Torque M3 bolts to 1.2 N·m once alignment is confirmed (step 6).

### 4. Suspension arm assembly
1. Drop spring into bracket spring-guide boss (compress by hand).
2. Slide trailing arm pivot boss over pivot bolt M8×50.
3. Fit IGUS bushing in pivot bore (if used).
4. Fit M8 washer + nyloc nut; torque to 6 N·m.
5. Snap retainer cap onto arm axle slot; thread 2× M3×12 by hand.

### 5. Motor installation
1. Slide hub motor axle into arm dropout slot.
2. Fit clamp plate (from `rover_motor_mount.scad`); tighten M4 bolts 1.5 N·m.
3. Thread axle lock nut; apply Loctite 243; torque to 30 N·m.
4. Route phase cables + hall wires through deck phase pass-through hole.

### 6. Geometry check and bracket torque
1. Set robot on flat surface; check that all 4 wheels contact ground.
2. Measure axle-to-ground on each corner.  Nominal: 127 mm ± 5 mm.
3. Adjust pivot bracket fore-aft position if needed to correct height.
4. Torque all M3 bracket bolts to 1.2 N·m.

### 7. Electronics bay + wiring
1. Thread ESC/VESC harnesses through bay floor cable pass-throughs.
2. Place electronics bay body on deck; fasten 10× M3×12 SHCS.
3. Mount FC on bay standoffs: anti-vibration grommets + M3×8 SHCS.
4. Mount Jetson Orin on bay standoffs: M3×8 SHCS.
5. Route USB/UART cables internally; cable-tie to bay walls.
6. Fit lid (with RPLIDAR tower stub); 4× M3×8 BHCS at corners.

### 8. Sensor installation
1. **RPLIDAR A1M8**: Fit anti-vibration ring (`rplidar_mount.scad`) on tower top.
   Bolt RPLIDAR with 4× M3×30 SHCS through ring.
2. **D435i**: Bolt to front bracket arm using captured 1/4-20 nut.
   Confirm 8° downward tilt; tighten firmly.
3. **4× CSI cameras**: Plug CSI flex into Jetson CSI ports.
   Thread M2×6 SHCS into each corner bracket PCB holes.
4. **Stem + sensor head**: Press stem through deck collar bore.
   Fit stem adapter (`rover_stem_adapter.scad`); clamp at 550 mm height.
   Attach sensor_head to stem top as per `sensor_head_assembly.md`.

### 9. Final checks
- [ ] All wheels spin freely without catching wiring
- [ ] Suspension compresses and rebounds on each corner
- [ ] RPLIDAR scans 360° without obstruction (check deck edge clearance)
- [ ] D435i USB connected and streaming
- [ ] CSI cameras initialised on Jetson boot (`v4l2-ctl --list-devices`)
- [ ] FC armed and IMU reading correctly
- [ ] E-stop functional

---

## Motors (unchanged from Rev 1)

| # | Part | Qty | Spec |
|---|------|-----|------|
| M1 | Hub motor | 4 | 10×2.125" pneumatic, 36 V, ~350 W; axle OD 16.11 mm (caliper) |
| M2 | Phase cable extension | 4 | 3-wire 12 AWG, 300 mm, XT30 to VESC |
| M3 | Hall cable extension | 4 | 6-pin JST-PH, 300 mm |

---

## Critical Dimensions

| Dimension | Nominal | Tolerance |
|-----------|---------|-----------|
| Track (axle C/C) | 540 mm | ±2 mm |
| Wheelbase (axle C/C) | 340 mm | ±2 mm |
| Axle CL height | 127 mm | ±3 mm |
| Pivot bracket M3 slot pitch | 32 mm | ±0.3 mm |
| FC hole pattern | 30.5×30.5 mm | ±0.2 mm |
| Jetson hole pattern | 58×49 mm | ±0.2 mm |
| Stem bore | Ø25.5 mm | +0.3/0 |
| Spring guide boss OD | Ø14 mm | ±0.1 mm |

---

## OpenSCAD Version Requirement

Requires **OpenSCAD 2021.01 or newer** (for `linear_extrude` + `minkowski` with `$fn` in difference).

Render command (full assembly):
```bash
openscad saltyrover_chassis_r2.scad &
```
