Show HN:VolAnti——面向光纤 FPV 无人机的开源声学探测器
英文标题:🔶 Show HN: VolAnti – Open-source acoustic detector for fibre-optic FPV drones
VolAnti 是一款开源本地声学告警设备,通过四麦克风阵列识别多旋翼无人机螺旋桨产生的谐波梳状频谱,尤其面向无线电静默的光纤 FPV 无人机。设备基于 ESP32-S3、LoRa 和电子纸屏幕,可在探测到目标后同时发出蜂鸣、红灯、振动、屏幕记录和网络广播告警。项目实测在有交通和人声的环境中,对悬停测试平台实现了 104.2 米探测;其有效距离会随风力和环境噪声显著变化。开发者可通过约 35 至 45 英镑的面包板方案或约 50 至 80 英镑的完整 PCB 方案自行构建,并获得开放硬件、固件和文档许可支持。
899.5 KB
339.7 KB
215.0 KB
27.3 KB
346.2 KB
357.2 KB
264.3 KB
50.0 KB
中文
一个边长 91 mm 的盒子,内置四个麦克风、ESP32-S3、电子纸屏幕和 LoRa 无线电模块。它会监听多旋翼产生的谐波梳状频谱;一旦听到这种信号,便会蜂鸣、闪烁红灯、振动、将时间写入即使断电也能保留内容的屏幕,并通知网络中的所有其他设备。
如果你想看带插图的简短版本,或想在自己控制的声场中观看探测器工作,请访问网站和模拟器。本页是完整长文版本,构建设备所需的一切内容都在这个代码库中。
实测探测, 悬停机架、微风环境 | 从首次听到声音 到触发告警 | 迄今现场测试中的 误报次数 | 单次 电池充电续航 | 完整设备的 部件成本 ---|---|---|---|---
了解它:问题 · 设备功能 · 工作原理 · 无线电 · 供电 · 探测距离与测试
构建它:两种构建方式 · 面包板指南 · 完整设备指南 · 烧录 · 运行多台设备
其他内容:照片和视频 · 测试结果 · 部署 · 贡献 · 范围 · 许可证
文件:固件 · PCB、BOM 和元件布局 · 可打印外壳 · 测试音频 · 网站源代码
几乎所有无人机探测系统都监听无线电信号。它们寻找飞手与飞行器之间的控制链路,对其进行解码,并报告两者的位置。这种方式效果很好,但存在一个根本性的失效条件:无人机必须发射无线电信号。
光纤 FPV 无人机不会。它会拖着一根玻璃纤维连接回操作员,视频通过光纤下传,控制信号通过光纤上行,无线电频谱保持静默。没有信号可供发现,也没有内容可供解码。
但它无法隐藏四个电机旋转螺旋桨的声音。一副安装在 2807 级电机上的 7 英寸三叶螺旋桨,会在空气中产生具有精确结构的谐波梳状频谱;各谐波之间的间距由桨叶通过频率决定,而这一间距由飞行器无法关闭的物理规律决定。VolAnti 监听的正是这种结构。
它不是雷达,也不能替代雷达。它是一道低成本的本地近距触发线,覆盖最后几百米;即使无线电态势图为空也能工作,而且学校或农场可以自行建造和维修。
它持续运行,只做一件事。每隔 32 ms,它从四个麦克风获取一段新的声音数据,将其叠加,测量频谱有多像梳状结构,并询问四个独立探测器这是否是旋翼信号。
当其中任意一个探测器给出肯定结果时,会同时发生五件事。
| 通道 | 发生的动作 |
|---|---|
| 蜂鸣器 | 响亮且有节奏的告警声,可穿透墙壁传播。 |
| LED | 通过上盖导光管持续亮起红灯。 |
| 电机 | 为手持设备的人提供触觉脉冲。 |
| 电子纸 | 显示告警和时间;即使没有供电,内容仍会保留在屏幕上。 |
| LoRa | 向范围内每台其他设备发送一个 18 字节数据包。 |
在两次告警之间,指示灯会缓慢闪烁绿色,因此安静运行的设备不会与断电设备看起来一样。按下静音按钮可让输出静音十秒,而底层探测仍会继续进行。
一副具有 B 片桨叶、以每秒 R 转旋转的螺旋桨,会以每秒 B×R 次的频率切割空气。这就是基频。由于这种切割并不是平滑的正弦波,能量还会落在 2×、3×、4× 等频率上,形成谐波梳:峰值等间距分布,其间存在较安静的间隙。
风、交通和雨水会模糊整个频谱。等间距的梳齿不会,而其间距就是旋翼转速。因此,探测器会测量一个频率,并检查它是否保持稳定。
**四个麦克风合成一个数值。**四个 ICS-43434 MEMS 麦克风以十字形排列,对角间距为 79 mm,并由同一个时钟源驱动。四路数据流被相加。在这些频率下,79 mm 约为十分之一个波长,因此来自任意方向的声音都会同相叠加,而每个麦克风自身的噪声不会。这可免费获得约 6 dB 的信噪比提升,并且几乎是全向的。这个尺寸下曾尝试波束成形,但没有带来收益,所以该阵列是灵敏度设备,而不是测向设备。
**频谱。**在 16 kHz 采样率下,每 512 个采样点进行一次 2048 点 FFT,每 32 ms 得到一帧。
**自适应底噪。**探测器会持续建立各频率上该地点通常声音的模型,并将其扣除。安静的声音约在 6 秒内被学习;响亮的宽带突发声则在 1 秒内学习完成,这避免了一辆路过的卡车永久进入噪声模型。
**梳状评分。**对于 70 至 2000 Hz 的每一个候选频率,累加该谐波梳齿位置上的能量,减去间隙中的能量,进行归一化,并保留最佳结果。
**跟踪与保持。**单个高分帧没有意义。同一个频率必须在连续六帧中获胜,且变化控制在 2% 以内。噪声不会这样做,旋翼会。
**一个频谱上的四个探测器。**单个探测器必须在捕捉正在接近的无人机与捕捉悬停无人机之间二选一,因此系统设置了四个探测器,哪个最先确认就触发告警。
| 层级 | 捕捉目标 | 方法 | 延迟 |
|---|---|---|---|
| 1 | 快速谐波梳 | 到达、接近或改变状态的飞行器 | 相对于快速底噪计算梳状评分 |
| 2 | 慢速谐波梳 | 到达后进入悬停状态的飞行器 | 使用相同评分,对比 30 s 底噪 |
| 3 | 包络扩散 | 有负载、近距离、高推力飞行 | 3 kHz 以上的宽带调制 |
| 4 | 无底噪谐波梳 | 长时间悬停且环境始终未恢复安静的目标 | 2 s Welch 频谱、白化处理、无底噪 |
第 1 层已被固定:黄金测试向量锁定其行为,同一段音频在笔记本电脑和开发板上都会得到精确到最后一位小数的相同评分。第 4 层是在 104 m 距离触发的一层。
更多细节,包括每个阶段背后的数值,见 docs/how-it-works.md。全部功能也可在模拟器中实时运行。
每台设备都配备一个 Ra-01H LoRa 模块,以及一根沿外壳侧壁布置的弹簧天线。告警数据包为 18 字节:身份标识、层级、频率、评分、序列号。系统没有中继,也没有网状网络。每台设备都直接接收其他每台设备的信号,这是一项你可以在一个下午完成测试的设计。
该链路用于扩散告警,而不是对告警进行投票。每台设备独立作出判断。等待第二个意见会花费数秒,而数秒正是这个产品的核心价值。
频率必须根据使用国家设置:英国和欧盟为 868 MHz,美国为 915 MHz,其他地区则采用当地分配的频段。详情见 docs/deploying.md。
通过 USB-C 供电,采用带电源路径的 BQ24074 充电器、维持 3.3 V 的 TPS63020 升降压转换器,以及一块 1S 2500 mAh LiPo 电池。仅靠电池可运行约 18 至 22 小时。
即使设备常驻市电供电,电池也应保持安装。在调试期间,当蜂鸣器、电机和无线电模块同时触发时,仅依靠 USB 供电会导致开发板掉电复位。电池可以吸收这一尖峰负载。没有电池的市电设备,会恰恰在最关键的时刻重启。
**2026 年 9 月 6 日,104 m。**一台设备放置在有车辆经过的砖墙街道上,测试机架在街道远端悬停。第 4 层在 104.2 m 处触发,地图上为 114 码;设备附近有人交谈。没有任何车辆触发告警。该测试机架由四台 2807 级电机和 7 英寸三叶螺旋桨组成,安装于与该设备针对的飞行器相同的机架上;每台电机均独立控制油门,因此可在标记位置保持悬停。视频、地图和测试屏幕见测试结果和图库。
自这次测试以来,探测器又经过进一步调校,以降低误报率并提高反应速度;这些改动已包含在当前固件中。
**此前。**8 月 21 日,开阔地带、风况变化:带负载螺旋桨的探测距离为 14 m,全天无误报。8 月 28 日,第一块量产板:探测器输出与黄金向量参考实现逐位一致;在 1,938 帧测试中,最慢一帧为 29.4 ms,低于 32 ms 的时间预算,没有超时。
探测距离会因风力变化一个数量级。无风且安静的场地应能达到 100 至 200 m;有风或嘈杂的场地可能只有 15 至 50 m。风速超过 8 m/s 时,应假定性能会下降。docs/deploying.md 中提供了表格。
使用面包板。一块开发板和四个麦克风扩展板。不需要定制 PCB,除排针外无需焊接。使用相同固件、相同探测器,并且能够探测无人机。成本约为 35 至 45 英镑,需要一个晚上。面包板构建指南 → |
或者构建完整设备。订购已贴装的四层板,打印四个部件,焊接制造厂无法完成的少量连接,再将其螺丝组装起来。本页的所有数据均来自该设备。成本约为 50 至 80 英镑,需要一个周末。完整设备构建指南 → |
|---|
单台设备本身就是完整的。多台设备可覆盖更大区域,并将告警传递到有人所在的位置:围栏旁的设备听到飞行器,厨房里的设备重复告警。
每台设备都运行完整探测器,并根据自己的证据独立告警。监听设备应部署在来袭方向,间距应使覆盖范围相接,可采用太阳能或电池供电。室内设备则放在人员所在位置,接入市电,主要负责重复告警。货架上备有一台已组装和烧录完成的备用设备,可将一周的维修缩短为两分钟的替换。
设备应正面朝上、与地面平行、置于阴影中、离地 2 至 4 m,并与持续噪声源保持数米距离。不要公开设备的位置。选址、市电布线、维护计划和规划计算见 docs/deploying.md。
构建报告是你能提交的最有用内容,包括那些未能正常工作的报告。请创建标题为 Build report: <rough location, month> 的 issue,其中包括构建类型、固件版本、产生声音的物体、成功和未成功探测到它时的距离、风况以及任何误报。请不要提供设备位置地图。
欢迎提交范围内的任何 Pull Request。对探测链的改动必须在黄金向量测试中保持结果不变,或者附带新的测试向量及其理由。
VolAnti 负责探测和告警。该项目或任何带有其名称的分支,绝不会包含干扰、欺骗、拦截、瞄准或任何其他反制措施。朝这些方向的贡献将不经讨论直接关闭。
硬件采用 CERN-OHL-W-2.0,固件采用 Apache-2.0,文档采用 CC BY-SA 4.0。完整文本见 LICENSES/,简要版本和免责声明见 LICENSE.md。本产品不是生命安全产品,可能会漏检飞行器。
由约克大学的 Agam Rossen 设计和测试。
English / 原文
A 91 mm box with four microphones, an ESP32-S3, an e-paper screen and a LoRa radio. It listens for the harmonic comb a multirotor makes and when it hears one it beeps, flashes red, buzzes, writes the time to a screen that survives a power cut, and tells every other unit on the network.
If you want the short illustrated version, or to watch the detector work on a sound field you control, that is what the website and the simulator are for. This page is the long version, and everything needed to build one is in this repository.
measured detection,
hovering airframe, light wind | from first sound
to alarm | false alarms in
field sessions so far | on one
battery charge | parts for a
full unit
---|---|---|---|---
Understand it : The problem · What the device does · How it works · Radio · Power · Range and testing
Build it : Two ways to build it · Breadboard guide · Full unit guide · Flashing · Running several units
Everything else : Photos and videos · Test results · Deploying · Contributing · Scope · Licence
Files : firmware · PCB, BOM and placement · printable enclosure · test audio · website source
Nearly all drone detection listens for radio. It finds the control link between the pilot and the aircraft, decodes it, and reports where both are. It works well, and it has one hard failure: the drone has to transmit.
A fibre-optic FPV drone does not. It trails a thread of glass back to its operator, video comes down the fibre, control goes up it, and the radio spectrum stays silent. There is nothing to find and nothing to decode.
What it cannot hide is four motors spinning propellers. A 7 in three-blade propeller on a 2807-class motor puts a precisely structured comb of harmonics into the air, spaced by the blade-passage rate, and that spacing is set by physics the airframe cannot switch off. VolAnti listens for that structure.
It is not radar and not a replacement for one. It is a cheap local tripwire for the last few hundred metres that keeps working when the radio picture is empty, and that a school or a farm can build and repair themselves.
It runs continuously and does one job. Every 32 ms it takes a new slice of sound from the four microphones, folds them together, measures how comb-like the spectrum is, and asks four independent detectors whether that is a rotor.
When one of them says yes, five things happen at once.
| Channel | What happens |
|---|---|
| Beeper | Loud and patterned. The one that carries through a wall. |
| LED | Solid red through the light pipe in the lid. |
| Motor | A haptic pulse for whoever is holding it. |
| E-paper | The alert and the time, and it stays on the screen with no power. |
| LoRa | An 18 byte packet to every other unit in range. |
Between alerts the light blinks slow green, so a quiet unit and a dead unit never look the same. A press on the snooze button silences the outputs for ten seconds while detection carries on underneath.
A propeller with B blades turning at R revolutions per second chops the air B×R times a second. That is the fundamental. Because the chopping is not a smooth sine, energy also lands at 2×, 3×, 4× and so on, and the result is a harmonic comb: peaks at even spacing with quiet gaps between.
Wind, traffic and rain smear across the whole spectrum. Evenly spaced teeth do not, and their spacing is the rotor speed. So the detector measures a rate and checks that it holds still.
Four microphones to one number. Four ICS-43434 MEMS microphones sit in a plus, 79 mm corner to corner, clocked from one source. Their four streams are added. At these frequencies 79 mm is a tenth of a wavelength, so sound from any direction adds in phase and each capsule's own noise does not. That is about 6 dB of signal to noise for free and it is nearly omnidirectional. Beamforming was tried at this size and buys nothing, so the array is a sensitivity device, not a direction finder.
Spectrum. A 2048 point FFT every 512 samples at 16 kHz, one frame every 32 ms.
Adaptive floor. The detector keeps a running picture of what the site normally sounds like at every frequency and subtracts it. Quiet things are learned in about 6 s, loud broadband bursts in under a second, which is what stops a passing lorry parking itself in the noise model.
Comb score. For every candidate rate from 70 to 2000 Hz, add the energy on that comb's teeth, subtract the energy in its gaps, normalise, keep the best.
Track and hold. One high scoring frame means nothing. The same rate has to win six frames in a row within 2 %. Noise does not do that. A rotor does.
Four detectors on one spectrum. A single detector would have to be tuned for either a drone that arrives or a drone that hovers, so there are four, and the alert is whichever is sure first.
| Tier | Catches | How | Latency
---|---|---|---|---
1 | Fast comb | An aircraft that arrives, approaches or changes | Comb score against the fast floor | 0.23 s
2 | Slow comb | An aircraft that arrives and then hovers | Same score against a 30 s floor | 1.4 to 4 s
3 | Envelope wash | Loaded, close, high thrust flight | Broadband modulation above 3 kHz | 1 to 3 s
4 | No-floor comb | A long hover somewhere that never goes quiet | 2 s Welch spectrum, whitened, no floor | 5 to 15 s
Tier 1 is sealed: golden test vectors pin its behaviour, and the same audio gives the same score to the last decimal place on a laptop and on the board. Tier 4 is the one that fired at 104 m.
More detail, including the numbers behind each stage, is in docs/how-it-works.md. All of it runs live in the simulator.
Each unit carries an Ra-01H LoRa module and a spring antenna lying in the wall of the case. The alert packet is 18 bytes: identity, tier, rate, score, sequence. There is no relay and no mesh. Every unit hears every other unit directly, which is a thing you can test in an afternoon.
The link spreads an alert, it does not vote on one. Every unit decides for itself. Waiting for a second opinion costs seconds and seconds are the whole product.
The frequency has to be set for the country of use: 868 MHz in the UK and EU, 915 MHz in the US, and whatever the local allocation is elsewhere. Details in docs/deploying.md.
USB-C in, a BQ24074 charger with power path, a TPS63020 buck-boost holding 3.3 V, and a 1S 2500 mAh LiPo. About 18 to 22 hours on the cell alone.
The cell stays fitted even on a unit that lives on mains. During bring-up the board browned out when the beeper, the motor and the radio fired at the same moment on USB alone. The cell absorbs that spike. A mains unit with no battery is a unit that reboots at the exact moment it matters.
6 September 2026, 104 m. One unit on a brick-walled street with traffic passing, the test rig hovering at the far end. Tier 4 fired at 104.2 m, 114 yards on the map, with people talking near the unit. Nothing fired on the cars. The rig is four 2807-class motors with 7 in three-blade propellers on the same frame as the airframes this was built against, each motor on its own throttle, so it holds a hover wherever the tape says. Video, the map and the test screen are in test results and the gallery.
Since that test the detector has been tuned further, for a lower false-alarm rate and a faster reaction, and those changes are in the current firmware.
Before it. 21 August, open ground, changing wind: 14 m with loaded propellers, no false alarms all day. 28 August, first production board: detector output bit-identical to the reference on the golden vectors, worst frame 29.4 ms against the 32 ms budget over 1,938 frames, no overruns.
Range moves by an order of magnitude with wind. Still air and a quiet site should give 100 to 200 m. A breezy or noisy site can give 15 to 50 m. Above 8 m/s assume it is degraded. docs/deploying.md has the table.
On a breadboard. A dev board and four microphone breakouts. No custom PCB, nothing to solder beyond header pins. Same firmware, same detector, and it will detect a drone. About £35 to £45 and an evening. Breadboard build guide → |
Or the full unit. Order the four-layer board assembled, print four parts, solder the few joints the fab cannot, screw it together. This is the unit every number on this page came from. About £50 to £80 and a weekend. Full unit build guide → |
|---|
A single unit is complete on its own. Several units cover more ground and move the alarm to where the people are: a unit at the fence hears the aircraft, a unit in the kitchen repeats it.
Every unit runs the full detector and alerts on its own evidence. Listening units go out on the approach sides, spaced so their coverage touches, on solar or battery. Indoor units sit where people are, on mains, and mostly repeat. One assembled and flashed spare on a shelf turns a week's repair into a two minute swap.
Face up, parallel to the ground, in shade, 2 to 4 m high, a few metres clear of steady noise. Do not publish where your units are. Siting, mains wiring, the service schedule and the planning arithmetic are in docs/deploying.md.
Build reports are the most useful thing you can send, including the ones where it did not work. Open an issue titled Build report: <rough location, month> with the build type, firmware version, what made the sound, the distance it was and was not detected at, the wind, and any false alarms. No maps of where your units are.
Pull requests are welcome for anything inside the scope below. Changes to the detection chain need to pass the golden vector tests unchanged, or come with new vectors and a reason.
VolAnti detects and alerts. It will never include jamming, spoofing, interception, targeting or any other countermeasure, in this project or in any fork carrying its name. Contributions in that direction are closed without discussion.
Hardware under CERN-OHL-W-2.0, firmware under Apache-2.0, documentation under CC BY-SA 4.0. Full texts in LICENSES/, the short version and the disclaimer in LICENSE.md. Not a life-safety product. It will miss aircraft.
Designed and tested by Agam Rossen at the University of York.





