# The body by sections: every part, how it is held, and why

Generated by `cad/body_sections.py` from the CAD and its checks (regenerate, never edit); written 2026-10-27 for the user's "breaking the design down by sections, reviewing each piece to justify all design decisions, and building proper models". Every screw below is a joint in `cad/body_joints.py`: the integrity check reads each one through the solids (head on its face, stack touching, holes, thread engaged, tip clear) and checks that every part reaches the cheeks.

**Integrity now:** 71 joints, 183 screws; joints with problems: none; floating parts: none; interference between body parts: 0; cad-agent's connectivity gate (issue #14): P1 pass, P2 pass, P3 pass.

**Mass (P3, the ledger):** 36.77 kg against the 37.0 kg gate (D71): legs 21.624 kg, frame 4.98 kg, shell 1.11 kg, compute 1.513 kg, power 1.739 kg, deck 2.53 kg, battery 3.27 kg. With the scheduled levers 36.27 kg: passes.

## 1. Skid and power

Carries the battery and turns it into every rail the robot needs: the 10S bus for the legs, the wheels and the turret, 12 V for the J501 and the sensors, 5 V for the MCU; protects every wire with a fuse sized to it; lets the packs out without tools.

**Must meet:**

- two DeWalt DCB609 packs in series, 30-41 V, 360 Wh rated (D65); swapped by hand, no tool
- every load rated over 30-41 V: the RS-04 24-60 V, the Flipsky 75100 14-84 V, the anti-spark switch 12-84 V, the TRACO TEP 150-4812WI 18-75 V (the DDR-120C-24 starts at 33.6 V and is out)
- 80 A for 0.5 s (a jump's push) and 30 A continuous (the adapters' stated rating): the firmware limits both
- the bay under the belly between the knees: |y| <= 58 (25 mm from the knee eyes at |y| 83)
- the robot's only battery protection is its own: cut-off at 3.0 V a cell, a current limit, a regen clamp (docs/body-firmware.md 5)

**Interfaces:**

- the belly plate: the bay's rails and adapter plates on S-M4-0 nuts beyond the cheeks' ends (|x| 102, 150)
- the floor tray: the power plate's four printed posts (M5 inserts both ends); the tray slot (x 40..135) for the cables
- the legs: four XT60H-F sockets for the RS-04 pigtails; the wheels' VESCs under the plate
- the J501: 12 V on an XT30 (W21); CAN bus C (the MCU)
- the turret (D66): its XT30 on a 7.5 A branch of the bus through the stop relay's pole B; its dry safety loop

**Parts** (mass from the CAD where it exists; "held by" from the joints and holds):

| Part | Material and making | g | Held by |
|---|---|---|---|
| adapter_plate_front | printed PA6-CF | 31 | 4 x M4 x 12 socket (adapter plate front, head side); the adapter's own screws into inserts set from its holes on arrival (to item.battery_adapter_front) |
| adapter_plate_rear | printed PA6-CF | 31 | 4 x M4 x 12 socket (adapter plate rear, head side); the adapter's own screws into inserts set from its holes on arrival (to item.battery_adapter_rear) |
| bay_door_front | printed PETG | 66 | 1 x M3 x 10 thumb (bay door front l, head side); 1 x M3 x 10 thumb (bay door front r, head side) |
| bay_door_rear | printed PETG | 66 | 1 x M3 x 10 thumb (bay door rear l, head side); 1 x M3 x 10 thumb (bay door rear r, head side) |
| bay_floor | SendCutSend 5052-H32 aluminium 0.063 in | 174 | 5 x M3 x 6 button (bay side l low, thread); 5 x M3 x 6 button (bay side r low, thread); 3M VHB tape (to bay_skid_1); 3M VHB tape (to bay_skid_2); 3M VHB tape (to bay_skid_3); 3M VHB tape (to bay_skid_4) |
| bay_rail_l | printed PA6-CF | 26 | 4 x M4 x 20 socket (bay rail l, head side); 5 x M3 x 6 button (bay side l high, thread); 1 x M3 x 10 thumb (bay door front l, thread); 1 x M3 x 10 thumb (bay door rear l, thread) |
| bay_rail_r | printed PA6-CF | 26 | 4 x M4 x 20 socket (bay rail r, head side); 5 x M3 x 6 button (bay side r high, thread); 1 x M3 x 10 thumb (bay door front r, thread); 1 x M3 x 10 thumb (bay door rear r, thread) |
| bay_side_l | SendCutSend 5052-H32 aluminium 0.063 in | 108 | 5 x M3 x 6 button (bay side l low, head side); 5 x M3 x 6 button (bay side l high, head side) |
| bay_side_r | SendCutSend (as its twin) | 108 | 5 x M3 x 6 button (bay side r low, head side); 5 x M3 x 6 button (bay side r high, head side) |
| bay_skid_1 | printed TPU95-GYROID | 59 | 3M VHB tape (to bay_floor) |
| bay_skid_2 | printed TPU95-GYROID | 59 | 3M VHB tape (to bay_floor) |
| bay_skid_3 | printed TPU95-GYROID | 59 | 3M VHB tape (to bay_floor) |
| bay_skid_4 | printed TPU95-GYROID | 59 | 3M VHB tape (to bay_floor) |
| bus_bar_1 | SendCutSend C110 copper 0.125 in | 57 | 2 x M3 x 8 socket (bus bar 1, head side) |
| bus_bar_2 | SendCutSend (as its twin) | 57 | 2 x M3 x 8 socket (bus bar 2, head side) |
| bus_insulator_1 | printed PETG | 38 | 2 x M3 x 8 socket (bus insulator 1, thread); 2 x M3 x 8 socket (bus bar 1, thread) |
| bus_insulator_2 | printed PETG | 38 | 2 x M3 x 8 socket (bus insulator 2, thread); 2 x M3 x 8 socket (bus bar 2, thread) |
| dcdc_bracket | printed PA6-CF | 61 | 4 x M3 x 6 pan (power dcdc, thread); 2 x M4 x 12 socket (dcdc bracket, head side) |
| battery_adapter_front | bought: the front pack's rail adapter (10 AWG leads, 30 A), screwed to its printed plate | 70 | the DeWalt rail and its latch; the door behind it (to item.battery_front); the adapter's own screws into inserts set from its holes on arrival (to adapter_plate_front) |
| battery_adapter_rear | bought: the rear pack's rail adapter (10 AWG leads, 30 A), screwed to its printed plate | 70 | the DeWalt rail and its latch; the door behind it (to item.battery_rear); the adapter's own screws into inserts set from its holes on arrival (to adapter_plate_rear) |
| battery_front | bought: DeWalt DCB609 FLEXVOLT 20V/60V MAX 9.0 Ah (20 V mode: 5S3P): slides out of the front door | 1565 | the DeWalt rail and its latch; the door behind it (to item.battery_adapter_front) |
| battery_rear | bought: DeWalt DCB609 FLEXVOLT 20V/60V MAX 9.0 Ah (20 V mode: 5S3P): slides out of the rear door | 1565 | the DeWalt rail and its latch; the door behind it (to item.battery_adapter_rear) |
| plate_buck_5v | bought: 5 V 3.6 A from the 12 V rail: MCU, VN-100, CAN boards, radio-stop receiver | 4 | an M3 standoff in the plate (to power_plate) |
| plate_fuses | bought: the ten branch fuses: Littelfuse MINI 58V in inline holders, bundled on the plate | 110 | cable-tied through the plate's slots (to power_plate) |
| plate_main_switch | bought: Flipsky Anti Spark Switch Smart Enhanced 300A V2.0 (12-84 V, 100 A), low side, in a printe | 110 | in its printed cradle (3 mm under the plate), two M4 into the plate's F-M4-2 (to power_plate) |
| plate_mcu_board | bought: balance MCU: the Nucleo-G474RE standing on edge in a printed carrier with four CAN Pal, th | 75 | its printed carrier on two M4 into the plate's F-M4-2 (to power_plate) |
| plate_mrbf_block | bought: main fuse 80 A (Blue Sea 5181) on the battery + lead's insulated M10 post | 90 | on 3 mm printed spacers, its M8 post through a printed bushing in the plate (to power_plate) |
| plate_shunt | bought: the current shunt in the negative lead (the switch's load side to the - bus) | 85 | on 3 mm printed spacers, two M5 into the plate's F-M5-2 (to power_plate) |
| plate_vesc_l | bought: Flipsky 75100, the left wheel | 230 | 4 x M5 x 8 button (plate vesc l flange, head side) |
| plate_vesc_r | bought: Flipsky 75100, the right wheel, hung under the plate on its four M5 flange holes; leads ou | 230 | 4 x M5 x 8 button (plate vesc r flange, head side) |
| power_dcdc | bought: 12 V 12.5 A from 18-75 V, isolated: the J501 and the 12 V rail; standing on its long edge  | 300 | 4 x M3 x 6 pan (power dcdc, head side) |
| plate_post_1 | printed PA6-CF | 11 | 1 x M5 x 10 button (plate post 1 foot, thread); 1 x M5 x 10 button (plate post 1 head, thread) |
| plate_post_2 | printed PA6-CF | 11 | 1 x M5 x 10 button (plate post 2 foot, thread); 1 x M5 x 10 button (plate post 2 head, thread) |
| plate_post_3 | printed PA6-CF | 11 | 1 x M5 x 10 button (plate post 3 foot, thread); 1 x M5 x 10 button (plate post 3 head, thread) |
| plate_post_4 | printed PA6-CF | 11 | 1 x M5 x 10 button (plate post 4 foot, thread); 1 x M5 x 10 button (plate post 4 head, thread) |
| power_plate | SendCutSend 5052-H32 aluminium 0.1 in | 162 | 1 x M5 x 10 button (plate post 1 head, head side); 1 x M5 x 10 button (plate post 2 head, head side); 1 x M5 x 10 button (plate post 3 head, head side); 1 x M5 x 10 button (plate post 4 head, head side); 2 x M4 x 12 socket (dcdc bracket, thread); 2 x M3 x 8 socket (bus insulator 1, head side); 2 x M3 x 8 socket (bus insulator 2, head side); 4 x M5 x 8 button (plate vesc r flange, thread); 4 x M5 x 8 button (plate vesc l flange, thread); in its printed cradle (3 mm under the plate), two M4 into the plate's F-M4-2 (to item.plate_main_switch); on 3 mm printed spacers, two M5 into the plate's F-M5-2 (to item.plate_shunt); on 3 mm printed spacers, its M8 post through a printed bushing in the plate (to item.plate_mrbf_block); cable-tied through the plate's slots (to item.plate_fuses); its printed carrier on two M4 into the plate's F-M4-2 (to item.plate_mcu_board); an M3 standoff in the plate (to item.plate_buck_5v) |

**Decisions:**

| | Choice | Why | Turned down |
|---|---|---|---|
| D65 | Two DCB609 FLEXVOLT packs in 20 V mode, in series (10S3P) | the user's choice: tool packs and chargers, swapped in seconds, no pack to build | 13S2P Molicel brick (D43/D54: best jump, 2.0 kg, but a pack to build and a BMS to read); two packs in 60 V mode in parallel (a fresh pack sits at the RS-04's 60 V fault); one pack (18 V, under the RS-04's 24 V) |
| this page | The bay under the belly, the packs hanging from their adapters as from a tool, out through end doors | a pack is 138 x 87 x 97 mm: nothing above the belly has 122 mm free over 138 x 87 (the tray holds the J501 and the plate; the deck has 120 mm under it and the turret over it); low and boxed between the legs | on the front and rear faces (the body 244 mm longer, in the lidar's lowest beam and the eyes', where a child grabs them); on the side walls (blocks the louvres, hatch and door; outside the shell); the cost of the belly: the bay is 132 mm deep, the robot sits on its skids under a 139 mm leg (it never runs under 160) |
| this page | One TRACO TEP 150-4812WI (12 V 150 W, 18-75 V) for the J501 and the 12 V rail | the only listed isolated converters that cover 30-41 V are 4:1 chassis bricks; the J501 takes 12-36 V; one converter instead of two saves 366 g and a DIN rail; it stands at the plate's right edge where the DDR-60L-12 stood | DDR-120C-24 (starts at 33.6 V); every Mean Well DDR-120/RSD 2:1 variant (none covers 30-45 V); DDR-60L-24 (60 W: the J501 alone peaks there); TEP 150-4815WI 24 V for the J501 alone (no room in the left strip for its bracket beside the ear bracket's nuts: the integrity check found it) |
| D55 | MRBF 80 A main fuse, low-side anti-spark switch, MINI 58V branch fuses, the frame bonded to - | the pack can deliver hundreds of amps into a short; the switch takes the spark; a chafed + lead to the frame blows a fuse instead of leaving the frame live | a contactor (D37: no e-stop contactor); 32 V MINI fuses (they cannot interrupt 41 V) |
| #11 | The shunt in the + lead after the MRBF (the INA228 high side) | in the - lead ahead of the low-side switch, opening the switch drives the INA228's inputs far below its ground: it dies and bypasses the switch (docs/body-fuse-board.md 1) | an isolated INA228 in the - lead (more parts) |
| this page | Bus-bar insulators in PETG, tested > 10 MOhm at 50 V | the plate is bonded to the - bus; carbon-filled PA6-CF conducts | PA6-CF (conducts); PA6-GF (fine, if the plate runs over 60 C) |
| this page | The VESCs' flange screws M5 x 8, pockets under the bus insulators, the shunt and MRBF on 3 mm spacers | the integrity check found the M5 x 10 tips coming up through the plate 1 mm from a lug screw's tip inside an insulator: a short of a bus bar to the plate | moving the bars (the VESCs' holes are 100 mm apart and the bars 110 long: no position clears both) |
| D60 | A JLCPCB fuse board in P3 (Littelfuse MINI FL1 holders, the 1 mOhm high-side shunt, the INA228) | eleven inline holders and a meter shunt are a nest of wire; the FL1 is the only PCB MINI holder with a DC rating at the bus voltage | Keystone 3568 (20 A, no DC rating) |

The bay: 318.0 x 102.4 x 178.6 mm with its crush pads, their bottom at z -271.6; on D69's 10 in wheels the robot sits on the pads under a 144.6 mm leg; 40.4 mm under them at the lowest controlled leg (185.0 mm), 155.4 at 300; 31.8 mm from the knee eyes. The pads (issue #19): printed TPU 95A gyroid, 50.0 mm, a 600.0 N crush plateau each over 30.0 mm (sim/bay_pad_study.py, exports/body/bay-pad-study.json and bay-pad-depth.json).

## 2. Frame

Joins the two legs into one stiff body and carries everything else: the hip frames bolt to two cheeks, the cheeks to each other through eight standoffs; the floor tray on their upper flanges carries the J501 and the power plate, the belly plate under their lower flanges carries the battery bay.

**Must meet:**

- the legs' reactions at the hip frame's mount plane at 16.25 kg a leg (D56, D57): 197 N m and 555 N in a 150 mm drop, 287 N m and 1016 N in the power-off fault; SF >= 2.0 everyday, 1.2 in the fault
- the track the legs need (the cheeks' webs 31 mm apart: 414 mm of track)
- every sheet part orderable at SendCutSend's instant price as drawn (cad/body_sheet.py's rules)

**Interfaces:**

- the legs: six M5 x 12 per hip frame into its inserts, heads in the gap
- the power section (the plate's posts on the tray, the bay under the belly) and the head (the deck's four posts)
- the J501: on the compute pallet's four standoffs, the pallet on four TPU isolators

**Parts** (mass from the CAD where it exists; "held by" from the joints and holds):

| Part | Material and making | g | Held by |
|---|---|---|---|
| belly_plate | SendCutSend 6061-T6 aluminium 0.1 in | 247 | 4 x M5 x 12 button (belly flange left, head side); 4 x M5 x 12 button (belly flange right, head side); 4 x M4 x 20 socket (bay rail l, thread); 4 x M4 x 20 socket (bay rail r, thread); 4 x M4 x 12 socket (adapter plate front, thread); 4 x M4 x 12 socket (adapter plate rear, thread) |
| cheek_left | SendCutSend 5052-H32 aluminium 0.187 in | 492 | 6 x M5 x 12 button (hip frame left, head side); 8 x M4 x 10 flat (standoff left, head side); 4 x M5 x 12 button (tray flange left, thread); 4 x M5 x 12 button (belly flange left, thread); PEM SS-M5-0 pressed by SendCutSend (to cheek_nuts_left) |
| cheek_nuts_left | bought: PEM SS-M5-0 (pressed by SendCutSend) | - | PEM SS-M5-0 pressed by SendCutSend (to cheek_left) |
| cheek_nuts_right | bought: PEM SS-M5-0 (pressed by SendCutSend) | - | PEM SS-M5-0 pressed by SendCutSend (to cheek_right) |
| cheek_right | SendCutSend 5052-H32 aluminium 0.187 in | 492 | 6 x M5 x 12 button (hip frame right, head side); 8 x M4 x 10 flat (standoff right, head side); 4 x M5 x 12 button (tray flange right, thread); 4 x M5 x 12 button (belly flange right, thread); PEM SS-M5-0 pressed by SendCutSend (to cheek_nuts_right) |
| compute_pallet | SendCutSend 6061-T6 aluminium 0.125 in | 229 | captured between the isolators' feet and caps (four, each on its M4) (to isolator_1); M3 x 6 flat heads up through the pallet (body_frame.pallet_part) (to item.j501_standoff_15_16.5); M3 x 6 flat heads up through the pallet (body_frame.pallet_part) (to item.j501_standoff_165_16.5); M3 x 6 flat heads up through the pallet (body_frame.pallet_part) (to item.j501_standoff_15_146.5); M3 x 6 flat heads up through the pallet (body_frame.pallet_part) (to item.j501_standoff_165_146.5) |
| floor_tray | SendCutSend 5052-H32 aluminium 0.125 in | 753 | 4 x M5 x 12 button (tray flange left, head side); 4 x M5 x 12 button (tray flange right, head side); 1 x M5 x 12 button (post 1 foot, head side); 1 x M5 x 12 button (post 2 foot, head side); 1 x M5 x 12 button (post 3 foot, head side); 1 x M5 x 12 button (post 4 foot, head side); 1 x M4 x 20 socket (isolator 1, thread); 1 x M4 x 20 socket (isolator 2, thread); 1 x M4 x 20 socket (isolator 3, thread); 1 x M4 x 20 socket (isolator 4, thread); 1 x M5 x 10 button (plate post 1 foot, head side); 1 x M5 x 10 button (plate post 2 foot, head side); 1 x M5 x 10 button (plate post 3 foot, head side); 1 x M5 x 10 button (plate post 4 foot, head side); two M3 into tapped holes in the tray (to item.vn100) |
| frame_screws_left | bought: M5 x 12 ISO 7380 into the hip frame's inserts | - | they are the hip frame left joint's 6 screws |
| frame_screws_right | bought: M5 x 12 ISO 7380 into the hip frame's inserts | - | they are the hip frame right joint's 6 screws |
| isolator_1 | printed TPU95 | 2 | 1 x M4 x 20 socket (isolator 1, head side); captured between the isolators' feet and caps (four, each on its M4) (to compute_pallet) |
| isolator_2 | printed TPU95 | 2 | 1 x M4 x 20 socket (isolator 2, head side) |
| isolator_3 | printed TPU95 | 2 | 1 x M4 x 20 socket (isolator 3, head side) |
| isolator_4 | printed TPU95 | 2 | 1 x M4 x 20 socket (isolator 4, head side) |
| agx_cooler | bought: Seeed reComputer mini J501 heatsink with fan (SKU 100099421), 102 x 97 x 50.3 mm | 450 | the cooler's four spring screws through the carrier (j501-agx) (to item.j501_carrier) |
| agx_module | bought: AGX Orin 32 GB module under the cooler | 280 | the module's connector and its two M3 screws (to item.j501_carrier); clamped under the cooler (to item.agx_spreader) |
| agx_spreader | bought: the cooler's 2 mm copper spreader on the module | 200 | clamped under the cooler (to item.agx_module) |
| j501_carrier | bought: J501 carrier: 176 x 163 PCB on 4 x M3 x 16 hex standoffs | 225 | four M3 x 6 into the hex standoffs (the J501's own holes) (to item.j501_standoff_15_16.5); the module's connector and its two M3 screws (to item.agx_module); the cooler's four spring screws through the carrier (j501-agx) (to item.agx_cooler) |
| j501_standoff_15_146.5 | bought:  | 2 | M3 x 6 flat heads up through the pallet (body_frame.pallet_part) (to compute_pallet) |
| j501_standoff_15_16.5 | bought:  | 2 | four M3 x 6 into the hex standoffs (the J501's own holes) (to item.j501_carrier); M3 x 6 flat heads up through the pallet (body_frame.pallet_part) (to compute_pallet) |
| j501_standoff_165_146.5 | bought:  | 2 | M3 x 6 flat heads up through the pallet (body_frame.pallet_part) (to compute_pallet) |
| j501_standoff_165_16.5 | bought:  | 2 | M3 x 6 flat heads up through the pallet (body_frame.pallet_part) (to compute_pallet) |
| vn100 | bought: VN-100 Rugged on 2 x M3 + 2 dowels in the tray; its connector faces +x | 15 | two M3 into tapped holes in the tray (to floor_tray) |
| post_1 | printed PA6-CF | 44 | 1 x M5 x 12 button (post 1 foot, thread); 1 x M5 x 12 button (post 1 head, thread); 2 x M3 x 16 pan (wall l front, thread); 2 x M3 x 16 pan (shell front post l, thread) |
| post_2 | printed PA6-CF | 44 | 1 x M5 x 12 button (post 2 foot, thread); 1 x M5 x 12 button (post 2 head, thread); 2 x M3 x 16 pan (wall r front, thread); 2 x M3 x 16 pan (shell front post r, thread) |
| post_3 | printed PA6-CF | 44 | 1 x M5 x 12 button (post 3 foot, thread); 1 x M5 x 12 button (post 3 head, thread); 2 x M3 x 16 pan (wall l rear, thread); 2 x M3 x 16 pan (shell rear post l, thread) |
| post_4 | printed PA6-CF | 44 | 1 x M5 x 12 button (post 4 foot, thread); 1 x M5 x 12 button (post 4 head, thread); 2 x M3 x 16 pan (wall r rear, thread); 2 x M3 x 16 pan (shell rear post r, thread) |
| spacer_screws | bought: M4 x 10 ISO 10642 flat head | - | they are the standoff left joint's 8 screws; they are the standoff right joint's 8 screws |
| spacers | bought: M4 x 31 hex standoff, 6 mm hex, female-female, aluminium (95947A065) | - | 8 x M4 x 10 flat (standoff left, thread); 8 x M4 x 10 flat (standoff right, thread) |

**Decisions:**

| | Choice | Why | Turned down |
|---|---|---|---|
| D44 | Two bent 3/16 in 5052 cheeks on eight M4 standoffs in the hip frames' bolt rows | the standoffs carry each leg's roll moment straight across to the other frame | a one-piece 36 mm U (SendCutSend cannot bend a channel whose base is under twice its flanges); 1/8 in cheeks (SF 0.6 in the landing) |
| D71 | The design mass 37.5 kg, 18.75 kg a leg; a 37.0 kg ledger gate (it replaces D69's 35.5 / 35.0 and D57's 32.5 / 32.0 kg) | the leg's loads scale with mass; the gate keeps the robot honest against them; D65's packs, D69's hub wheels and D66's turret computer are heavier | designing to the 26.8 kg estimate; D69's 35.0 kg (set before the packs were in) |
| this page | The tray and belly into the cheeks' flange nuts with M5 x 12 (was x 10) | the integrity check: an M5 x 10 engaged 2.8 mm of the SS-M5-0's thread under the 3.2 mm tray | - |

Strength (cad/body_studies.py at 18.75 kg a leg): S1-landing SF 5.87 (pass); S1F-collapse SF 3.07 (pass); S1b-one-leg-bound SF 4.69 (pass); S2-twist SF 8.03 (pass); S3-pitch SF 28.11 (pass); T1-tray SF 2.61 (pass); D1-hand-front SF 5.52 (pass); D1-hand-riser SF 5.91 (pass); D2-turret-fall SF 2.12 (pass).

## 3. Head and mounts

Carries the lidar at the front of the deck and the turret on its riser over the J501's fan; takes a child leaning on it and the turret falling over; lets the J501's exhaust out.

**Must meet:**

- 300 N on the deck (a child) SF >= 2.0 and <= 0.5 mm; a 30 g tip-over of the 1.70 kg head SF >= 2.0 (D59)
- the turret's TM pattern (4 x M5 on 80 x 80, two dowels) 30 mm over the deck; the lidar's 1/4-20 and two pins
- the J501 fan's exhaust out through the deck (it blows up: j501-agx 94da39d) without a finger reaching its blades

**Interfaces:**

- the frame: the deck on its four posts (M5 x 12 into inserts)
- the turret (D66): its pan base on the riser's TM pattern; its XT30, Ethernet and safety loop through the grommet
- the J501: the fan duct from 2 mm over the fan to the turret plate's opening

**Parts** (mass from the CAD where it exists; "held by" from the joints and holds):

| Part | Material and making | g | Held by |
|---|---|---|---|
| deck | SendCutSend 5052-H32 aluminium 0.1 in | 649 | 1 x M5 x 12 button (post 1 head, head side); 1 x M5 x 12 button (post 2 head, head side); 1 x M5 x 12 button (post 3 head, head side); 1 x M5 x 12 button (post 4 head, head side); 4 x M5 x 12 button (riser p1, head side); 4 x M5 x 16 button (riser, clamped); 2 x M5 x 10 button (turret plate ends, head side); its printed bracket on two M4 from above (to item.lidar_box); two printed clips on M4 from above (to item.lidar_coil); its 1/4-20 from below and two locating pins (to item.vlp16) |
| fan_duct | printed PETG (P3) | 10 | 3 x M3 x 6 socket (fan duct, head side) |
| lidar_box | bought: VLP-16 interface box standing on edge on a printed bracket behind the cooler, left; RJ45 o | 120 | its printed bracket on two M4 from above (to deck) |
| lidar_coil | bought: the VLP-16's 3 m cable, coiled flat under the deck behind the cooler, clear of the turret  | 230 | two printed clips on M4 from above (to deck) |
| turret | bought: the foam-ball turret on the riser (P1: a dummy of the budget mass) | 1700 | four M5 into the riser's top inserts and two dowels (the TM pattern) (to riser) |
| vlp16 | bought: VLP-16 on the deck | 830 | its 1/4-20 from below and two locating pins (to deck) |
| riser | printed PA6-CF | 174 | 4 x M5 x 12 button (riser p1, thread); 4 x M5 x 16 button (riser, thread); four M5 into the riser's top inserts and two dowels (the TM pattern) (to item.turret) |
| turret_plate | SendCutSend 6061-T6 aluminium 0.125 in (P2) | 134 | 4 x M5 x 16 button (riser, head side); 2 x M5 x 10 button (turret plate ends, thread); 3 x M3 x 6 socket (fan duct, thread); PEM SS-M5-0 pressed by SendCutSend (to turret_plate_nuts) |
| turret_plate_nuts | bought: PEM SS-M5-0 (pressed by SendCutSend) (P2) | - | PEM SS-M5-0 pressed by SendCutSend (to turret_plate) |

**Decisions:**

| | Choice | Why | Turned down |
|---|---|---|---|
| D59 | A 6061 0.125 in turret plate under the deck at the riser | the deck alone: SF 1.3 in the tip-over; with the plate the deck 2.12 and the plate 3.00 (cad/body_studies.py D2) | a thicker deck (heavier everywhere) |
| D61 | The fan duct: printed PETG from the plate's opening to 2 mm over the fan | keeps the exhaust from coming back round through the fins (the J501 box re-breathed +3.5 K) | an open deck |
| this page | The duct hangs on three M3 x 6 in tapped holes in the turret plate | it was floating: the integrity check found it held by nothing | bonding it |

## 4. Shell (P3)

Closes the body: keeps fingers out of everything that moves or is live, carries the cameras, eyes, ear pods and the rear panel's controls, lets air in for the J501.

**Must meet:**

- ISO 13854: 25 mm from every moving part, or ISO 13857: no opening over 4 mm (no shell part 4-25 mm from a leg)
- every port a person plugs (the J501's HDMI, USB) passes its mated plug through the hatch (cadagent.connectors)
- the ear pods under the lidar's lowest beam (4.3 mm)
- every print on the P1S bed (256 mm)

**Interfaces:**

- the frame: every wall and face into M3 inserts in the deck posts' bosses
- the head: the ear pods' tops under the lidar's beam

**Parts** (mass from the CAD where it exists; "held by" from the joints and holds):

| Part | Material and making | g | Held by |
|---|---|---|---|
| d435_cradle_front | printed PA6-CF (P3) | 16 | 2 x M3 x 8 pan (d435 cradle front feet, thread); 2 x M3 x 8 socket (d435 front back, head side) |
| d435_cradle_rear | printed PA6-CF (P3) | 16 | 2 x M3 x 8 pan (d435 cradle rear feet, thread); 2 x M3 x 8 socket (d435 rear back, head side) |
| d435_front | bought: Intel RealSense D435 (P3) | - | 2 x M3 x 8 socket (d435 front back, thread) |
| d435_rear | bought: Intel RealSense D435 (P3) | - | 2 x M3 x 8 socket (d435 rear back, thread) |
| ear_bracket_l | printed PA6-CF (P3) | 34 | 4 x M5 x 14 button (ear bracket l, head side); the SSC1's 5/16-18 foot bolt into the nut held in the bracket's shelf (to ear_pod_l) |
| ear_bracket_r | printed PA6-CF (P3) | 34 | 4 x M5 x 14 button (ear bracket r, head side); the SSC1's 5/16-18 foot bolt into the nut held in the bracket's shelf (to ear_pod_r) |
| ear_pod_l | bought: Diode Dynamics SSC1 (P3) | - | the SSC1's 5/16-18 foot bolt into the nut held in the bracket's shelf (to ear_bracket_l) |
| ear_pod_r | bought: Diode Dynamics SSC1 (P3) | - | the SSC1's 5/16-18 foot bolt into the nut held in the bracket's shelf (to ear_bracket_r) |
| eyes_board | bought: Waveshare DualEye (P3) | - | clamped between the clip and the face round its window (to eyes_clip) |
| eyes_clip | printed PETG (P3) | 4 | 2 x M3 x 6 socket (eyes clip, head side); clamped between the clip and the face round its window (to eyes_board) |
| shell_door | printed PETG (P3) | 21 | 4 x M3 x 8 pan (shell door, head side) |
| shell_front | printed PETG (P3) | 97 | 2 x M3 x 16 pan (shell front post l, head side); 2 x M3 x 16 pan (shell front post r, head side); 2 x M3 x 8 pan (d435 cradle front feet, head side); 2 x M3 x 6 socket (eyes clip, thread) |
| shell_hatch | printed PETG (P3) | 10 | 2 x M3 x 8 pan (shell hatch, head side) |
| shell_rear | printed PETG (P3) | 106 | 2 x M3 x 16 pan (shell rear post l, head side); 2 x M3 x 16 pan (shell rear post r, head side); 2 x M3 x 8 pan (d435 cradle rear feet, head side) |
| shell_side_l_front | printed PETG (P3) | 53 | 2 x M3 x 16 pan (wall l front, head side); 2 x M3 x 8 pan (splice l, head side); 4 x M5 x 14 button (ear bracket l, clamped); 4 x M3 x 8 pan (shell door, thread) |
| shell_side_l_rear | printed PETG (P3) | 51 | 2 x M3 x 16 pan (wall l rear, head side); 2 x M3 x 8 pan (splice l, thread); 2 x M3 x 8 pan (shell hatch, thread) |
| shell_side_r_front | printed PETG (P3) | 63 | 2 x M3 x 16 pan (wall r front, head side); 2 x M3 x 8 pan (splice r, head side); 4 x M5 x 14 button (ear bracket r, clamped) |
| shell_side_r_rear | printed PETG (P3) | 57 | 2 x M3 x 16 pan (wall r rear, head side); 2 x M3 x 8 pan (splice r, thread) |

**Decisions:**

| | Choice | Why | Turned down |
|---|---|---|---|
| D61 | 2 mm ribbed PETG walls in halves with a splice; PA6-CF where bolts take load | the bed is 256 mm; PETG is tough and cheap | a sheet-metal shell (heavier; sharp edges) |
| this page | The service door 55 mm long, on the left | at 78 mm it took the right front corner post's two screws away (the integrity check); on the right it now faces the converter | - |
| this page | The D435 cradles screwed to the aprons, the eyes on a clip, the receiver bay printed with the rear face | each was floating in the CAD (the integrity check) | - |

## 5. Wiring

The wire list is `cad/body_wiring.py` (docs/body-electrical.md 3.1 is generated from it): every run with both ends, its gauge, colour, connector and the fuse that protects it. A test checks no fuse is larger than its wire carries and that every live end on the body is a socket.

- 41 runs: 5 at 8 AWG, 3 at 10 AWG, 3 at 12 AWG, 8 at 14 AWG, 6 at 16 AWG, 3 at 18 AWG, 2 at 20 AWG, 10 at 22 AWG, 1 at None AWG
- the main path 8 AWG (MRBF 80 A); the packs' own adapter leads 10 AWG (unfused, as every pack lead: kept to 300 mm)
- the branches: RS-04 14 AWG on 20 A, VESCs 12 AWG on 30 A (their battery limit 20 A), the converter 18 AWG on 10 A, the turret 16 AWG on 7.5 A, the J501 16 AWG on 10 A, the 12 V loads 16 AWG on 7.5 A, the INA228's VBUS 22 AWG on 5 A
- CAN: A and B the legs, C the wheels and the J501 (1 Mbit/s each, twisted 22 AWG)

| | Choice | Why | Turned down |
|---|---|---|---|
| D58 | Sockets on every live end of the body | a child touching a plug touches no live pin | pins on the body |
| this page | W33, the frame bond, 14 AWG | a chafed + lead ahead of its branch fuse puts the MRBF's let-through on it | 18 AWG |
| D66 | The turret on its own 10 A bus branch through the stop relay | it is its own robot; the radio stop still cuts it | the shared 24 V converter (D45) |

## 6. The mass gate (D71)

The P3 ledger is 36.77 kg; with every scheduled lever 36.27 kg against D71's 37.0 kg ceiling (37.5 kg design mass, 18.75 kg a leg): a margin of +0.73 kg, pass. The wheels are D69's 10 in hub motors at the listed 3.53 kg each; the battery group is 3.27 kg (two DCB609 at DeWalt US's 1565 g each). The head is still the 1.70 kg budget: the turret as its own robot (D66) weighs 2.55 kg on its branch, which uses about 0.85 kg of the margin when it lands. The on-call levers stay listed as margin (D71), none taken without the user's or the coordinator's word:

| # | Lever | g | Stage |
|---|---|---|---|
| 11 | cheeks Rev B: lightening holes where S1 < 40 MPa (-150), or 1/8 in with more standoffs (-330) | -150 | P3 |
| 12 | aluminium M5 x 120 hex standoffs in place of the printed deck posts | -80 | P3 |
| 13 | the 34 mm WS-RDN-601 cooler instead of the fitted G48R (the user's call after the thermal test) | -200 | P3 |
| 14 | the VLP-16 cable shortened to 1 m (the user's call: a Velodyne waiver) | -150 | P3 |
| 15 | the turret's own: a 24-ball hopper, a one-board bay (its plan, not scheduled here) | -51 | P2 |
| 16 | the two DCB609 weighed: DeWalt's DCB547-XJ sheet says 1.46 kg against the 1.565 kg (3.45 lb) carried | -210 | P3 |
| 17 | D69's backup wheel, the 8.5 in of the same family (about 3.3 kg each, unverified): jump +15 mm, kerb 35 mm | -460 | P1 |
| 18 | two DCB606 FLEXVOLT 6.0 Ah in the same bay and adapters (about 1.0 kg lighter the pair, 2/3 the energy: masses to read from DeWalt) | -1000 | P1 |

