FPV Cameras
The camera in the nose that the pilot flies by, and why we chose it. This page collects the sensor research from 2026-09-28 and 2026-09-29. The link that carries the picture, its latency budget and its settings are on Open FPV link; the antennas are on Antennas. Nothing here is measured on our hardware yet.
What the nose camera is for
Section titled “What the nose camera is for”It is for piloting, not mapping. The MAPIR Survey3W in the aft bay does the mapping, so the nose camera does not need resolution, colour accuracy or a flat field. It needs to show the pilot what the aircraft is doing, as soon as possible. Our criteria, in order:
- Latency. A high frame rate at a modest resolution. Every stage between the sensor and the goggles holds about one frame, so the frame time sets most of the delay.
- A tall field of view. The TerraHawk lands vertically and changes attitude in transition. The pilot needs to see the ground below the nose, not only the horizon. A 4:3 image helps; a wide 16:9 crop does not.
- Low light and dynamic range. Dawn and dusk flights, and a bright sky over a dark landing pad.
- Stay on the open stack. OpenIPC on the SigmaStar SSC338Q, so MAVLink rides the same WFB-ng link as the video (see Open FPV link). A closed system needs its own camera and cannot carry our telemetry.
The decision
Section titled “The decision”The Walksnail Avatar HD Moonlight kit (Ryan, 2026-10-06), in place of the DJI O4 and the RunCam WiFiLink 2. It pairs with the Walksnail goggles. The values below are from the retailer listings (RaceDayQuads, Team BlackSheep), not measured.
| Item | Value |
|---|---|
| Camera | Starlight sensor, F/2.1, up to 160 degrees, rolling shutter, ISO 100 to 25,600, 19.6 x 19 x 24 mm |
| Live view and recording | Recording to a microSD card at 4K 30 or 60 fps, 2.7K 30 or 60, 1080p 100 or 60, 720p 60; H.264 up to 150 Mbit/s; built-in EIS and Gyroflow data |
| VTX | 5.725 to 5.850 GHz, under 30 dBm EIRP (FCC), 500 mW output (Team BlackSheep), pit mode, MSP OSD, no SmartAudio |
| Latency | 22 ms on average (Walksnail’s figure) |
| Antennas | Two Avatar V2, LHCP, 1.9 dBi, IPEX-1 (u.FL) |
| Power | 7.4 to 25.2 V; 12 V at 1.4 A, 8 V at 2.2 A |
| VTX size and mass | 34.5 x 34.5 x 15.3 mm, M2 holes at 20 x 20 and 25 x 25 mm; 38.5 g with the camera, without antennas |
What it changes:
- Criterion 4 no longer applies. The open stack was chosen so that MAVLink could ride the video link. Since 2026-10-04 the LoRa link carries MAVLink and the RTK corrections, so the video link only has to carry video and the OSD.
- Two antennas in the nose. On Fuselage C the port nose-ring notch takes one, and a notch in the nose roof takes the starboard one, 86.6 mm apart (th-blender W127, e0006164; Ryan, 2026-10-21). See Antennas.
- The goggles must be LHCP, the same as the air unit’s antennas. A right-hand antenna on the ground costs about 20 dB or more against a left-hand one in the air.
- Power from a 12 V rail. A full 6S pack is 25.2 V, which is the unit’s maximum, and the lift motors’ brake on stop adds spikes above the pack voltage. So the unit takes 12 V through the video power switch: 1.4 A against its 2.0 A rating at 55 °C (th-avionics decides the power path). Since 2026-10-08 (Ryan, th-main) the 12 V comes from a Matek Power Hub V2.1, hub A, in place of the BEC12S-PRO: 12 V at 2 A continuous (3 A for 10 s a minute), input 7 to 26 V. Hub A also feeds the CG slider at 5 V. The elevon servos have their own supply, two Matek Micro BEC 6S on hub A’s pad (th-blender W53, 6611f51d; in place of the second Power Hub), which never feed the flight controller, so a failure of hub A costs only the video and the CG slider. A 470 uF low-ESR capacitor goes across its battery pads, because 26 V leaves only 0.8 V above a full pack.
- It fits the Camera Arm. The 19 mm camera fits the 20 mm cradle.
- The camera looks 15 degrees down on Fuselage C (th-blender W104,
make_nose_split.CAM_TILT), so that the pad stays in view in a hover and on the approach. The lens axis is 15 degrees below the airframe’s Y axis. A horizon drawn for a level camera would sit 15 degrees too high in the picture, so ArduPilot’s OSD horizon is off (OSD1_HORIZON_EN0; Ryan, 2026-10-20, th-avionics). The Walksnail system draws no horizon of its own that we use. When the recordings are stabilized with Gyroflow from the Moonlight’s gyro data, set the camera’s tilt to 15 degrees down, or the stabilized horizon tilts with the pitch (to check on the first recording: the field name differs between Gyroflow versions). The lens-guard cheeks of the nose cone show in the picture’s lower corners by about 15 degrees, as drawn (Ryan, 2026-10-20).
The earlier choice: RunCam WiFiLink 2 with the Commonlands CIL292 (not flying)
Section titled “The earlier choice: RunCam WiFiLink 2 with the Commonlands CIL292 (not flying)”The RunCam WiFiLink 2 (Sony IMX415) with a Commonlands CIL292 lens (Ryan: the RunCam on 2026-09-28, the lens on 2026-09-29). It stays here for the open link in Open FPV link.
| Item | What | Price (2026-09-28) |
|---|---|---|
| Air unit | RunCam WiFiLink 2: SSC338Q, IMX415, RTL8812EU radio, 19 x 19 mm camera, M12 lens mount, 15 W max | $129.99, in stock |
| Lens | Commonlands CIL292-F2.1-M12A650: 2.3 mm f-theta, F/2.1, 7.1 mm image circle, 650 nm IR-cut, 3 g | $59.00, in stock |
Its default mode: 1080p90, binned 2 x 2 from the whole sensor, encoded at 1280 x 720 at 90 fps. With this lens that gives about 139 x 79 degrees, and about 160 degrees diagonal (estimate, f-theta from the 2.3 mm focal length). The frame is 11.1 ms.
The alternative: 1472 x 816 at 120 fps. This mode is binned and then cropped, so it reads only the middle of the sensor: about 110 x 61 degrees (estimate). Its frame is 8.3 ms, which saves about 3 ms in each stage that holds a frame. It loses about a fifth of the width and a quarter of the height.
Why this pair:
- The IMX415 sees the most at 90 fps. Its 1080p90 mode reads the whole sensor, 5.60 x 3.18 mm. Every IMX335 mode above 60 fps reads a window (see the table below).
- It is the only sensor in the finished air units. The RunCam, Emax and Caddx firmware images keep the IMX415 and drop every other sensor.
- The CIL292 covers the whole sensor. Its 7.1 mm image circle is larger than the IMX415’s 6.4 mm diagonal, so the corners are not dark. The view is about the same as the stock 160 degree lens; the gain is all-glass optics, sharper corners and a known projection. The CIL822 (2.4 mm, $39) has a 6.2 mm image circle, smaller than the sensor diagonal, so it was not chosen.
- It fits. The 19 x 19 mm camera goes in the kit’s 21 mm nose cone with no spacers. The lens cap is
14.0 mm across, with 3.5 mm clear on each side of the window (th-blender, from Commonlands’
STEP; see
parts-list.md). - Its mass is useful. It is heavier than the DJI O4, but it sits in the nose, where the aircraft
needs ballast anyway (see
cg.md).
Sensors compared
Section titled “Sensors compared”Mode and support facts come from OpenIPC’s source: the SSC338Q drivers in
OpenIPC/sensors and the device
excludes lists in OpenIPC/builder (sensors 0294a00, builder
ae60858). Format and pixel figures are from the sensor makers or
Commonlands’ sensor pages. The DJI O4 and the
Divimath HD90 are closed systems, shown for context.
| Sensor | Format | Native aspect | Pixel | Useful FPV modes on our stack | What limits it | OpenIPC image support |
|---|---|---|---|---|---|---|
| Sony IMX415 | 1/2.8” | 16:9 (3864 x 2192) | 1.45 µm; 2.9 µm effective when 2 x 2 binned | 1920 x 1080 at 90, binned over the whole sensor; 1472 x 816 at 120, binned and cropped; Waybeam lists 100 fps | 120 fps costs field of view; small native pixel | Every SSC338Q FPV image we checked, and the only sensor in the RunCam, Emax and Caddx images |
| Sony IMX335 | 1/2.8” | 4:3 (2592 x 1944) | 2.0 µm | 2560 x 1920 at 60 (full 4:3); 2400 x 1350 at 90 (window); 1920 x 1080 at 120 (window); Waybeam claims up to 144 | Every mode above 60 fps is a window; no buyable unit carries it | Thinker AIO and URLLC images; the RunCam image drops it with two excludes lines |
| Sony IMX307 / IMX327 | 1/2.8” | 16:9 (1920 x 1080) | 2.9 µm | IMX307: 1080p30 on 2 lanes; 1080p60 only with lane_num=4, which no load script passes |
No mode above 60 fps; no compact module on sale | IMX307: Thinker AIO only, dropped from URLLC. IMX327: no SSC338Q driver |
| OmniVision OS04A10 | 1/1.8” | 16:9 (2688 x 1520) | 2.9 µm | 2688 x 1520 at 30, linear, 2 lanes | 30 fps only; no tuning file for this chip family | Driver only; no FPV image keeps it |
| DJI O4 Air Unit (non-Pro) | 1/2” | 4:3 or 16:9 | not published | 1080p at up to 120 fps; 117.6 degree FOV; DJI claims 20 ms at 1080p100 with Goggles 3 | Closed: DJI’s camera only, video and its own OSD only | None (DJI specs) |
| Divimath HD90 | 1/3” | 4:3 | not published | 720 x 540 at 90, 720 x 540 at 60, 960 x 720 at 60; D162, H132, V101 degrees | Closed: Divimath’s VTX and goggle only; low resolution | None (Divimath) |
Sensor sources: IMX415, IMX335, IMX307, IMX327, OS04A10 (OmniVision’s own page; a third-party page lists 2 µm, which is the OS04C10’s pixel).
The IMX335 is the strongest sensor on paper: a true 4:3 sensor with bigger pixels than the IMX415. On our stack it loses anyway. At 90 fps and above it reads a window, so it sees less than the IMX415’s binned mode. Its 4:3 shape is only there at 60 fps. Its firmware is not the block; the hardware is. RunCam’s DF56-26 camera pinout is not published, and no IMX335 module for it can be bought.
The HD90 deserves a note. It is 14 x 18 mm and 4.5 g, it is 4:3, and Divimath claims about 14 ms glass to glass for a full frame. It was $139.99 and sold out when we checked (2026-09-29). It works only with Divimath’s own VTX and goggle, so it would put us back on a closed link with a separate radio for MAVLink.
Analog is still an option. The Divimath dual-band analog VTX (5.8 GHz, CVBS input, 12.4 g, $69.99 on pre-order, 2026-09-29) is one example. Analog sends each line as the camera scans it, with no frame held for encoding, so the first change reaches the screen almost at once. A weak signal fades into noise that a pilot can still fly through, where a digital link freezes or drops frames. The cost is a much softer picture, a second camera with a CVBS output, and no MAVLink.
Lessons worth keeping
Section titled “Lessons worth keeping”Check sensor support in the firmware build’s excludes, not in shop listings. The SSC338Q driver set covers eleven sensors, but each device image removes most of them. A listing that says “supports IMX335” means the chip can; the image on that board may not. The excludes lists in OpenIPC/builder are the truth.
“120 fps” can mean a cropped window. Both the IMX335’s 1080p120 and the IMX415’s 1472 x 816 at 120 read only the middle of the sensor. The frame rate goes up and the field of view goes down. Read the driver’s mode table for the sensor area, not only the resolution and the rate.
Binning keeps the field of view. A 2 x 2 bin adds four pixels into one, so the whole sensor is read at a quarter of the pixel count. That is why the IMX415 at 1080p90 sees more than the IMX335 at 2400 x 1350 at 90.
Aspect ratio matters for a VTOL landing. In hover and on the approach the pad is below the nose. A tall image keeps it in view without pitching the camera down, which would cost the horizon in forward flight. A fisheye lens on the full sensor height buys back much of what a 16:9 sensor loses.
Bigger pixels help low light. A 2.9 µm pixel has four times the area of a 1.45 µm pixel. It collects about four times the light in the same exposure. The IMX415’s 2 x 2 bin gives a 2.9 µm effective pixel, and that roughly cancels the IMX335’s low-light advantage (estimate, not measured).
The Thinker cannot be bought. The OpenIPC Thinker was the reference IMX335 board. Since 2025-08-04 its store redirects to Open Collective. Its schematic, Gerbers and STEP went public at KennyPlus/Thinker338Q on 2026-09-22, but with no licence, the base board only and no camera module design. We decided not to build it (th-main, 2026-09-29).
Watch item. The HiSilicon Hi3516CV610 with a Sony IMX662 (2.9 µm STARVIS 2, 1080p90) could be a better low-light camera on an open stack. Its Waybeam support is still initial.
Open items
Section titled “Open items”| Item | What to do | Owner |
|---|---|---|
| Goggle antennas | Confirm that the goggles’ antennas are LHCP, the same as the air unit’s | th-telemetry |
| Thermal test | The Walksnail unit takes up to about 17 W in the nose (12 V, 1.4 A, the listing’s maximum). The nose vent cools it in forward flight, not in a hover or on the pad. Keep the goggles’ Standby Mode on: before arming, the unit sends at 25 mW, and it learns of arming over the OSD serial link, so that link needs both TX and RX (Oscar Liang). Standby lowers only the RF power, and the encoder still runs, so measure on the bench: the current in standby, at 200 mW and at 500 mW, and the case temperature after 10 minutes with no airflow. Check that the goggles’ standby line clears when the flight controller arms (props off). If standby saves too little, the video power switch keeps the unit off on the pad until the launch sequence turns it on (th-avionics) | th-telemetry |
| Latency bench test | Measure glass to glass at 1080p 100 and 60 fps with the LED method in Open FPV link, “How to measure it”, and compare with Walksnail’s 22 ms | th-telemetry |
| Interference | Run the GNSS noise bench test and antenna bench test 7 with the VTX at full power and with it off | th-telemetry |
| Lens position | The camera’s 20 mm cradle slot is now on the Camera Arm, on Battery Tray B’s riser (th-blender, 1dbefba). It is the kit Nose Plate’s camera prongs, trimmed so that the short nose cone slides off forward. It still has no fore-aft stop. Put the lens’s front vertex flush with the short cone’s rim, with the cone fitted. Then mark the camera’s position or add a printed stop | th-blender |
Source: docs/fpv-cameras.md in the repo. Edit it there; this page is generated.
Comments
Comment on the whole page here, or on one section or step with the button beside it.