fpv-spider
Warning
This is just dumped from Grok and has not been verified.
Mission
Outdoor confined-space survey / recon crawler. Possible SAR support later. Pilot it from a standard FPV-drone ELRS radio with FPV goggles. Not a certified rescue device. A human team still owns any rescue.
Use a hexapod when you need discrete footholds, stepping over debris, a narrow/tall profile, static stability with one jammed leg, or body-pose peeking around a corner with feet planted.
Do not use this platform if target gaps are under ~150–180 mm. Build a tracked or snake chassis instead.
Professional confined-space work usually uses tethered tracked inspection robots or caged drones. This is a recon tool that can go where wheels smear or get stuck.
Why this architecture
An FPV drone maps sticks almost 1:1 to motors. A hexapod cannot. Eighteen servos must stay coordinated (tripod gait, IK, body pose). The ELRS receiver sends high-level commands. A gait computer sits in the middle.
ELRS radio (existing handset)
|
ELRS RX -- CRSF serial --> ESP32 gait computer
|
2x PCA9685
|
18x MG92B
+
analog FPV cam + VTX + lights + optional DVR
+
2S pack + dual BEC + recovery tether
PWM-only receivers (ER6/ER8) are wrong as the only brain. They cannot run a gait. Use CRSF into an MCU.
Keep video independent of control, same as a drone.
Platform lock: VC-35 void crawler
Circular body so there is no long axis to snag. Micro servos so stance stays near 350 mm. FPV mast and tether hook printed in.
| Item | Target |
| Stance diameter (neutral) | ~350 mm |
| Body | Ø 116 mm × 42 mm |
| Standing height | ~110–130 mm |
| Wet weight | 1.1–1.4 kg |
| DOF | 18 (3 per leg) |
| Servo class | MG92B micro metal-gear digital, 22.8 × 12 × 31 mm |
| Battery | 2S 18650 or 2S 850–1300 mAh LiPo |
| Control | ELRS CRSF → ESP32 → 2× PCA9685 |
| Video | Analog 5.8 GHz FPV + optional HD recorder |
| Fit envelope | Voids / ducts ≳ 180 mm wide, 140 mm tall |
| Runtime goal | 30–45 min walking, 2+ hr sit-and-look |
| Weather v1 | Splash-resistant box, not waterproof |
Leg geometry in the generator (mm):
| Segment | Axis-to-axis |
| BODYR | 58 |
| COXALEN | 28 |
| FEMURLEN | 54 |
| TIBIALEN | 70 |
MG92B torque is only ~3.5 kg·cm at 6 V. That is the size/torque compromise that keeps a 35 cm stance. Payload is FPV + small VTX + 2S + lights. A full thermal module is v1.5, not v1. Do not hang a Jetson on this frame.
Standard-size 20 kg servos blow the diameter past ~420 mm. Wrong for a void crawler.
Files on disk
voidcrawler_vc35/stl/printable parts plus non-printable_preview_assembly.stlvoidcrawler_vc35/src/generate_frame.pyregenerate STLsvoidcrawler_vc35/docs/vc35_top_view.pngdimension sketchvoidcrawler_vc35/VC35_BOM_and_build.xlsxlive cart / print list / wiring / radio mapvoidcrawler_vc35.zipwhole pack
STLs are v0.1 block geometry. Dimensionally aimed at an MG92B pocket. Servo brands vary by a few tenths of a millimetre. File the first pocket before printing the other five of each leg part.
Regenerate after changing lengths:
python3 src/generate_frame.py
Edit COXA_LEN, FEMUR_LEN, TIBIA_LEN, BODY_R at the top of
the generator.
Printable parts
| File | Qty | Material | Layer | Walls | Infill | Supports | Notes |
| stl/bodybottom.stl | 1 | PETG or ASA | 0.20 | 4 | 40% gyroid | No | Floor down. Drill lid bosses 2.5 mm then tap M3 or melt inserts. |
| stl/bodytop.stl | 1 | PETG or ASA | 0.20 | 4 | 30% | Touching buildplate only | Hook and handle as printed. |
| stl/electronicstray.stl | 1 | PETG | 0.20 | 3 | 20% | No | |
| stl/coxa.stl | 6 | PETG or ASA | 0.16 | 5 | 50% | From servo cradle | File pocket to MG92B. Same orientation all 6. |
| stl/femur.stl | 6 | PETG or ASA | 0.16 | 5 | 50% | From servo cradle | Structural. No PLA. |
| stl/tibia.stl | 6 | PETG or ASA | 0.16 | 5 | 50% | Minimal | |
| stl/foottpu.stl | 8 | TPU 95A | 0.20 | 3 | 20% | No | Print 8, run 6, keep 2 spare toes. |
| stl/cambracket.stl | 1 | PETG | 0.16 | 4 | 30% | No | 19 mm analog cam. |
| stl/antennaclip.stl | 2 | PETG or TPU | 0.20 | 3 | 20% | No | |
| stl/servohornplate.stl | 18 | PETG | 0.16 | 3 | 100% | No | Optional. |
| stl/previewassembly.stl | 0 | — | — | — | — | — | Do not print. Viewer only. |
Printer notes:
- Nozzle 0.4 mm.
- Bed: PETG 75–85 °C, ASA 90–100 °C, TPU 40–50 °C.
- Dry filament.
- Orient legs so layer lines run along the beam, not across servo ears.
- PLA is acceptable only for a first fit-check of bodytop / tray — not for outdoor legs.
- Body design intent: one sealed-ish electronics tub, servos outside, belly clearance, service hatch, TPU replaceable feet, ELRS antenna high and clear of the 5.8 antenna, printed rear tow hook.
Parts list
Planning total ~$414 at the 2026 street estimates in the workbook. Yellow price cells are meant to be overwritten. Status dropdown: Buy / Have / Skip / Ordered.
Printed structure (~$24)
| Item | Qty | Unit | Spec | Example | Unit USD |
| bodybottom.stl | 1 | PETG/ASA, 4 walls, 40% gyroid | repo /stl | 3.50 | |
| bodytop.stl | 1 | PETG/ASA, 4 walls, 30% | repo /stl | 2.20 | |
| electronicstray.stl | 1 | PETG, 3 walls | repo /stl | 0.60 | |
| coxa.stl | 6 | PETG/ASA, 5 walls, 50% | repo /stl | 0.70 | |
| femur.stl | 6 | PETG/ASA, 5 walls, 50% | repo /stl | 0.80 | |
| tibia.stl | 6 | PETG/ASA, 5 walls, 50% | repo /stl | 0.80 | |
| foottpu.stl | 6 | TPU 95A; extra 2 spare recommended | repo /stl | 0.40 | |
| cambracket.stl | 1 | PETG, 4 walls | repo /stl | 0.40 | |
| antennaclip.stl | 2 | PETG or TPU | repo /stl | 0.15 | |
| servohornplate.stl | 18 | Optional PETG horn stiffener | repo /stl | 0.05 |
Servos (~$170)
| Item | Qty | Spec | Example | Unit USD |
| MG92B digital metal-gear servo | 20 | 22.8×12×31 mm class, 180°, metal gears. Install 18, keep 2 spare. Same batch if possible. | Tower Pro / one-seller clones | 8.50 |
| 25T micro servo horns + screws | 1 set | Usually in the servo bag; buy extras | Servo bag | 0 |
Compute + radio (~$37)
| Item | Qty | Spec | Example | Unit USD |
| ESP32 DevKit C (30-pin) | 1 | WROOM-32, USB-C preferred | Espressif / clone | 6.00 |
| PCA9685 16-ch PWM driver | 2 | Second board A0 so addresses 0x40 and 0x41 | Adafruit or clone | 4.50 |
| ELRS receiver 900 MHz | 1 | Prefer 900 MHz for voids / timber / interior | RadioMaster Bandit RX / Matek | 22.00 |
| ELRS 2.4 GHz nano RX (alt) | 0 | If radio is 2.4-only: qty 1 and 900 MHz qty 0 | RP1 / BetaFPV Nano | 15.00 |
Power (~$48)
| Item | Qty | Spec | Example | Unit USD |
| 18650 cell protected | 2 | Name-brand 2500–3500 mAh, button-top protected | Samsung / Molicel + protection | 8.00 |
| 2-cell 18650 holder with leads | 1 | Series 7.4 V. Zip-tie into body cradle. | Generic | 3.00 |
| 2S 850–1300 mAh LiPo (alt pack) | 1 | Optional lighter field pack, XT30 | Tattu / CNHL | 12.00 |
| XT30 pigtails + bullet kit | 1 set | Main power connector | AMASS | 4.00 |
| Buck 7.4→6.0 V 8A+ | 1 | Servo rail. XL4015 or better. Set to 6.0 V before any servo is connected. | XL4015 | 5.00 |
| Buck 7.4→5.0 V 3A | 1 | ESP32 + RX + camera logic | Mini560 / MP1584 | 2.50 |
| 1000 µF 16 V + 100 nF | 1 set | Across 6 V servo rail and VTX 5 V | Any | 1.00 |
| SPST rocker or keyed toggle 6A | 1 | Main power, reachable with gloves | Generic 12 mm | 2.00 |
>| Polyfuse 10 A (+ reverse FET optional) | 1 | Cheap insurance | Littlefuse | 2.00 |
FPV + lights (~$92)
| Item | Qty | Spec | Example | Unit USD |
| Starlight analog FPV camera | 1 | 19 mm case. Caddx Ratel 2 / Foxeer T-Rex class. | Caddx Ratel 2 | 22.00 |
| 5.8 GHz VTX 25–200 mW | 1 | SmartAudio or IRC Tramp if possible. 200 mW max in voids. | TBS Unify / Rush Tiny Tank | 25.00 |
| 5.8 dipole or stubby | 1 | Do not power VTX without antenna. | Pagoda / stubby | 8.00 |
| Mini DVR or action cam | 1 | Survey record, not for piloting. | Eachine PRO DVR | 18.00 |
| White LED flood 2–5 W | 1 | Switched from AUX via N-FET or 5 V driver. | Cree-based drone light | 8.00 |
| 850 nm IR illuminator | 1 | Optional. Pairs with IR-sensitive analog cam. | Generic 850 nm array | 7.00 |
| Camera wire + cap pack | 1 set | 300–1000 µF low-ESR on VTX. | FPV wire kit | 4.00 |
Hardware (~$43)
| Item | Qty | Spec | Unit USD |
| M2×8 self-tapping servo screws | 80 | Extra because they strip. | 0.04 |
| M2×10 socket cap + nuts | 20 | Horn and camera ears. | 0.08 |
| M3×12 socket cap | 12 | Body lid + tether hook. | 0.10 |
| M3×8 socket cap | 8 | Tray and camera mast. | 0.08 |
| M3 hex nuts + 2× locknuts | 16 | One locknut on tether eye. | 0.05 |
| M3 short heat-set inserts | 12 | Lid bosses. Optional but worth it. | 0.15 |
| Zip ties 2.5 mm + 4 mm | 1 pack | Strain relief every cable. | 3.00 |
| Velcro + 1 mm foam tape | 1 pack | Camera isolation, pack padding. | 4.00 |
| 3 mm recovery cord 15 m | 1 | Mandatory in voids. Dyneema or kernmantle. | 12.00 |
| Small carabiner / clip | 2 | Tether to printed hook. | 3.00 |
| 22 AWG + 26 AWG silicone | 2 m | 22 AWG servo rail, 26 AWG signals. | 2.50 |
| Heat shrink assortment | 1 pack | 4.00 |
Buy-first (long lead / expensive): 20× MG92B, ESP32, 2× PCA9685, ELRS RX, dual bucks, 2S pack, Ratel-class cam + VTX + antenna, 15 m recovery cord.
Wiring
Two power domains. Never share one weak 5 V BEC across servos, RX, and VTX.
2S pack → switch → XT30
├─ XL4015 @ 6.0 V → PCA9685 V+ (servos only)
└─ Mini buck @ 5.0 V → ESP32, ELRS RX, camera, VTX
ELRS TX → ESP32 RX
ELRS RX → ESP32 TX
ESP32 SDA/SCL → both PCA9685 (0x40 and 0x41)
| Net | From → to | Rule |
| PACK+ | Pack → switch → XT30 distribution | 22 AWG |
| 6VSERVO | XL4015 6.0 V → both PCA9685 V+ | Star to both boards. 1000 µF here. |
| 5VLOGIC | Mini buck 5.0 V → ESP32 5V, RX, camera, VTX | Do not feed servos from this rail. |
| GND | Pack − common to every board | Single star ground at the XT30. |
| I2C | ESP32 SDA/SCL → both PCA9685 | 4.7k pullups if the boards lack them. |
| CRSF | ELRS TX→ESP32 RX, ELRS RX→ESP32 TX | Hardware UART, 420000 baud. Software serial will not keep up. |
| PWM | PCA9685 channels per map below | Bundle servo leads up the coxa. |
| VIDEO | Cam video → VTX VIN, cam 5 V from logic rail | Antenna on before applying power. |
| LIGHT | AUX FET switches LED− to ground | Logic-level N-FET + 100 Ω gate. |
Brownout is the number-one killer of first hexapods. Eighteen MG92B servos can spike well past 10 A. If the ESP32 resets when the robot stands, the 6 V BEC is too weak or the pack cannot deliver stall current. First stand-up on a current-limited bench supply, not a LiPo.
PCA9685 channel map
Label legs L1–L3 / R1–R3 clockwise from the camera.
| Leg | Board | Coxa ch | Femur ch | Tibia ch |
| L1 front-left | 0x40 | 0 | 1 | 2 |
| L2 mid-left | 0x40 | 3 | 4 | 5 |
| L3 rear-left | 0x40 | 6 | 7 | 8 |
| R1 front-right | 0x41 | 0 | 1 | 2 |
| R2 mid-right | 0x41 | 3 | 4 | 5 |
| R3 rear-right | 0x41 | 6 | 7 | 8 |
| Cam tilt (optional) | 0x41 | 15 | — | — |
Radio / EdgeTX map
Mode 2 assumed. Packet rate 50 Hz or 100 Hz Full. Switch mode 8ch or 16ch/2. Walking does not need 500 Hz. Unique bind phrase. 900 MHz preferred for interior / timber; 2.4 GHz is fine in open fields if that is all the radio has.
| Radio channel | Name | Robot function | Notes |
| CH1 Aileron | Y | Strafe | Deadband 30 µs |
| CH2 Elevator | X | Forward / back | |
| CH3 Throttle | Z / speed | Walk speed or body height | Pick one in firmware |
| CH4 Rudder | Yaw | Turn in place | |
| CH5 AUX1 2-pos | ARM | Enable motion | ELRS arm channel. Disarmed = sit |
| CH6 AUX2 3-pos | MODE | Sit / walk / body-pose | Body-pose freezes feet |
| CH7 AUX3 pot/slider | TILT | Camera tilt | |
| CH8 AUX4 2-pos | LIGHT | Flood + IR | Momentary also fine |
Failsafe: sit or freeze joints, lights stay on, VTX stays on. Never hold-last walk command. You still need the picture to recover the robot.
Send pack voltage telemetry back to the radio.
Firmware plan
Do not write a gait engine from scratch.
- Stand the robot with any ESP32 hexapod sketch that already talks
to two PCA9685 boards. RookiDroid-style UDP firmware is a
reasonable donor.
rasheeddo/hexapod_dev_esp32already speaks SBUS from a radio — closest existing architecture. - Replace the UDP/SBUS parser with CRSF using AlfredoCRSF or CRSFforArduino.
- Map CH1–CH4 to body X/Y/yaw/speed. CH5 is ARM. Failsafe sits.
- Later: body pitch/roll from the left stick while feet are planted (the rubble peek move).
Donor projects worth reading, not cloning blindly:
- RookiDroid Hexapod / Mochi — ESP32, printable, gait LUTs, web cal. Mochi settled on MG92B after 21g servos jittered.
- rasheeddo hexapoddevesp32 — SBUS radio + IK on ESP32 + dual PCA9685.
- ggldnl Hexapod — Servo2040 + real IK. Heavier first week.
- AlfredoCRSF / CRSFforArduino — ELRS channel + telemetry libraries.
Sensors, in order
Must have on v1:
- Analog FPV camera with a starlight sensor (Ratel 2 / T-Rex class) for dusk and interiors.
- 25–200 mW 5.8 GHz VTX, adjustable from the radio if possible.
- Onboard DVR or cheap HD action camera pointing the same way. FPV is for driving. Survey work needs a file.
- 2–5 W white flood, switched. Confined spaces are dark.
- Pack voltage, current, IMU so the body can level on a slope.
- Camera at the front, 15–30° down, so you see the ground you are about to step on. Foam-mount it. Gait vibration is real.
Add on v1.5 after it walks outside:
- One-axis tilt, maybe pan.
- 850 nm IR illuminator + IR-sensitive analog cam.
- Cheap thermal (Lepton class) as a second view, not the pilot view.
- Lav or contact mic if you care about voices through debris.
- GPS only for outdoor survey breadcrumbs. Ignore GPS indoors.
Leave for v2:
- Depth camera / LiDAR mapping
- Companion computer
- Gas sensors (CO, O2, LEL) only if actually supporting a fire/rescue team who know how to interpret them
- Autonomy
Analog FPV is the right pilot link in clutter: it snows before it dies. Digital stays pretty until it freezes. Caddx Gazer / Infra-style analog cameras exist if you want zoom or IR later.
2.4/900 MHz ELRS and 5.8 GHz video coexist if antennas are separated and the VTX is not sitting on the RX.
Assembly order
[ ]Print body + one coxa/femur/tibia/foot and test-fit a servo. Pass: servo seats without cracking plastic.[ ]Print remaining structural set in PETG/ASA + TPU feet. Pass: all 6 legs identical.[ ]Servos center every servo with a tester at 1500 µs before installing horns. Pass: horn spline at mid-travel.[ ]Legs assemble 6 legs loosely; label L1–L3 / R1–R3 clockwise from camera. Pass: each joint moves 90°+ without bind.[ ]Power set 6.0 V and 5.0 V bucks on the bench. Never guess. Pass: DMM confirms voltages.[ ]Brain wire ESP32 + both PCA9685 + ELRS RX on the tray. No servos yet. Pass: RX binds, serial monitor sees CRSF.[ ]Body install tray, pack, switch, VTX (antenna ON), camera. Pass: no metal shorting the buck modules.[ ]Integrate mount 6 legs. Power via current-limited supply first time. Pass: sits / stands without brownout.[ ]Radio load EdgeTX model map. Pass: ARM switch sits the robot.[ ]Field fit tether before any void. Walk gravel, then a pallet tunnel. Pass: failsafe sits, picture stays up.
Training loop
- Week 1–2
- print, assemble, calibrate, walk on carpet.
- Week 3
- gravel, roots, wet grass. Tune step height and body height from the radio.
- Week 4
- night walk with lights + analog FPV. Practice sitting on failsafe and pulling the tether.
- Week 5
- constructed yard void (pallets, pipe, furniture) before any real structure.
Practice body-pose mode: freeze the feet, pitch/yaw the body and camera around a corner. That is the move that makes hexapods useful in rubble.
First milestone that actually matters:
- Robot stands and sits from AUX1.
- Forward / turn from the right stick, speed from throttle.
- Failsafe sits.
- Analog FPV picture while it walks across a room.
Field / SAR rules
- Always tether in a void. 3–5 mm line from the rear hook to a person outside. Radio multipath and battery sag will otherwise strand it.
- Optional later umbilical: power + analog video up the same line.
- Lights on before you lose the analog picture.
- If the picture snows, turn around. Do not "just a little further."
- Low-voltage telemetry on the radio. Sit, then reel.
- Failsafe sits, lights stay on, VTX stays up.
- Do not present this as a life-safety appliance. No onboard "find the victim" autonomy on v1.
What not to do
- Do not drive 18 servos directly from an ER8 PWM receiver.
- Do not start with 9g plastic-gear servos.
- Do not share one weak 5 V BEC between servos, RX, and VTX.
- Do not write a gait engine from scratch if an existing ESP32 hexapod already walks.
- Do not start with LiDAR and a Jetson.
- Do not use PLA on outdoor legs.
- Do not invent a new chassis until one donor gait stands on the bench.
- Do not skip centering servos before horns.
- Do not power a VTX without an antenna.
Larger-platform note (not this build)
Yard/trail surveyor class is ~45 cm, 2–3.5 kg, 25–35 kg·cm servos, ~1 kg payload, HexArth-sized. Rejected for the void crawler because it will not fit the holes. Keep that as a second robot if outdoor payload outgrows MG92B.
Waveshare HexArth reference (too big here): 344 × 429 × 155 mm standing, 2.1 kg, 1 kg payload, 30 kg·cm bus servos, ESP32 + optional Pi.
Open questions / next artifacts
- Firmware: CRSF → gait on this channel map.
- v0.2 parts after measuring the actual servo batch (pocket slop, horn height, cable exits).
- 900 vs 2.4 on the handset you actually own.
- Whether throttle is walk speed or body height.
- Whether to donor RookiDroid firmware or rasheeddo IK.