Final limits
| Parameter | Value | Comment |
|---|---|---|
| Minimum altitude | 8 cm | below — focus lost, noise |
| Maximum altitude | 3-4 m typical indoor; up to 30 m outdoor with good contrast | realistically ≤3 m indoor |
| Minimum illuminance | ~60 lux | darker — noise accumulates |
| Floor contrast | critical | white laminate, glossy floor — low contrast → drift |
| FOV | 42° | at h=1 m, footprint ~80 cm |
| Sample rate | up to 121 fps (full mode) | typical ~30-50 fps in sustained SPI |
| Interface | SPI (mode 3) | not I²C |
Indoor caveats
- Floor surface critical. Plain laminate / linoleum — sensor sees a “smooth sea,” flow drift accumulates. Solutions:
- stickers / floor patterns for tests
- textured mat
- additional fallback to rangefinder + IMU dead reckoning
- Low illuminance = noise. Add extra light or an IR LED on the drone.
- Reflective floor (glossy tile, wet concrete) — sensor sees its reflection, glitches. Workaround: matte surface.
Comparison with CXOF (a PMW3901-based ready module)
| Aspect | PMW3901 raw chip | CXOF (Holybro) |
|---|---|---|
| Connection | SPI, needs your own MCU | UART, ready ArduPilot protocol |
| Price | ~$10 | ~$50 |
| Stack | own driver | FLOW_TYPE=6 parameter in ArduPilot |
| Applicability | research / custom | production-ready |
See CXOF setup — concrete ArduPilot wiring workflow.
Integration with EKF3
Optical flow is the source for EK3_SRC1_VELXY=5. Without it, ArduPilot indoor without GPS has no XY velocity → EKF3 doesn’t converge, the drone doesn’t arm. See EKF3 multi-sensor fusion.
Sources
- PixArt PMW3901MB-TXQT datasheet R1.10 (mirror in Espressif
esp-dronerepo) - ArduPilot wiki — OpticalFlow params (
FLOW_TYPE,FLOW_*) - Bitcraze documentation — flow deck v2 (PMW3901)