# 架构：把果蝇连接组当成四旋翼的高层制导策略

## 一句话

连接组不参与快速控制。它每 50 ms 读一次"相机 + 陀螺"，输出一个四维速度/偏航指令；真正让飞机不翻的是 500 Hz 的常规姿态内环。这条分层不是妥协，而是果蝇自己的做法（大脑 → 下行神经元 → VNC/翅控制肌），也是把 16.67 万神经元塞进一台笔记本的唯一可行方式。

## 速率分层

| 层 | 频率 | 内容 | 为什么这样切 |
|---|---|---|---|
| 语义层 | ~1 Hz | LLM 把指令解析成目标向量（S3 才启用） | 语言不需要实时 |
| **连接组层** | **20 Hz** | MaleCNS v1.0 全图 LIF 储备池 → 下行神经元读出 → 4 通道 setpoint | 全图仿真做不到毫秒级；果蝇的视觉制导本身也是 ~10–30 Hz 量级 |
| 姿态内环 | 500 Hz | 几何姿态控制 + 电机混控 | 任何多旋翼都必须的带宽 |
| 机体 | 连续 | 6-DOF 刚体 + 一阶电机滞后 | 被控对象 |

## 感觉映射

映射遵循"果蝇自己有什么通路"的原则，而不是"手头有什么传感器"。

| 机体传感器 | 果蝇对应结构 | 实现 | 注解选择器（可回退） |
|---|---|---|---|
| 相机（300°×100° 全景） | 复眼镶嵌 | R1–R6 亮度通道 3,335 路 + R7–R8 彩色通道 811 路 | `cell_type=*R1-R6*\|*R7*\|*R8*\|*photoreceptor*` |
| 图像序列 | T4/T5 → 视叶板 HS/VS 细胞 | 块匹配光流（6×6 块，±3 格搜索）→ 16 路 | `cell_type=T4*\|T5*\|HS*\|VS*\|DCH*\|*lobula*` |
| IMU 陀螺 | **平衡棒**（果蝇的角速度计） | 三轴角速度 → 8 路机械感觉通道 | `cell_type=*haltere*\|*campaniform*\|*chordotonal*` |
| 读出 | 下行神经元（大脑→VNC 的唯一出口） | 48 个下行神经元平均发放率 → 4 通道 | `cell_type=DNp*\|DNpe*\|DNd*\|DNg*\|DNb*\|DNv*\|DNc*` |

选择器命中失败时会按入度回退到随机神经元，**具体用了哪条路径会打印出来并写进报告**，避免把工程兜底当成生物学映射。

## 神经动力学

离散化电流型 LIF，与 flypoke / DOOMFLY 同一族近似：

```
I[t+1] = I[t]·exp(-dt/τ_syn) + W_signed·s[t-delay]·gain + external
v[t+1] = v[t] + dt/τ_m·(I[t+1] - v[t])
v ≥ v_th  →  发放，v ← v_reset，绝对不应期 1.5 ms
```

- **符号**取自递质：ACh / DA / 5-HT / OA 为兴奋，GABA / Glu 为抑制，未知按兴奋处理并计数。
- **权重**用突触接触数，单连接上限 50（抑制巨型突触），再按行和整体归一化，使"前级全发放"给出 O(1) 电流。
- **延迟** 1.8 ms，沿用 FlyWire/Shiu 等文献与 flypoke 的取值。
- **传播**两条通路：`matvec`（读全部 2560 万权重）与 `events`（只遍历实际发放神经元的出边）。两者结果在测试中逐位对齐（`tests/test_smoke.py::test_event_and_matvec_propagation_agree`），按连通规模自动选择。

这些都是工程近似，不是生物测量值。递质受体的动力学、突触权重标定、树突计算全部没有建模。

## 读出与必跑的对照

三种策略共用**完全相同的可训练参数量**（48×4 权重 + 4 偏置 = 196 个）：

| 策略 | 输入 | 用途 |
|---|---|---|
| `fly` | 48 个下行神经元的平均发放率 | 待验证的假设 |
| `direct` | 同一套观测（光流、陀螺、高度、目标差、速度）经固定随机投影 | **参数匹配对照，不可省** |
| `reference` | 直接比例导引 | 内环能力的上界参照 |
| `zero` | 恒定零动作 | 下界 |

FLM 论文自己的对照显示，不带连接组的直接输入读出头在 3 个种子上都略优于果蝇图。所以本工程从第一行代码起就把 `direct` 当作必需品而不是可选项：**没有对照的"果蝇能飞"结论没有意义**。

训练用对角自适应 ES，目标函数：

```
score = -平均跟踪误差 - 0.1×平均指令幅度 - (坠机 ? 25 : 0)
```

## 目录结构

```
flydrone/
  config.py       所有时间/长度/增益参数
  connectome.py   MaleCNS v1.0 导入、选择器语言、合成连接组
  neural.py       稀疏 LIF 内核（matvec / events 双通路）
  sensors.py      程序化场景、全景相机、复眼镶嵌、光流、平衡棒
  plant.py        6-DOF 四旋翼 + 几何姿态内环
  readout.py      读出策略、四种模式、ES 训练器
  loop.py         多速率闭环、指标、吞吐基准
  cli.py          命令行入口
scripts/
  fetch_malecns.py  并发分块下载 + sha256 校验
  plot_report.py    总览图
```

## 已知边界与不做的事

1. **接线图不是大脑。** MaleCNS 只给出连接关系；神经元模型、时间常数、递质符号、权重强度都是社区近似。
2. **没有突触可塑性。** 本工程只训读出层，连接组的权重全部冻结。DOOMFLY 的 KC→MBON 可塑性实验明确报告未通过任何学习验证门，这里不重复那条路。
3. **没有 sim2real。** 6-DOF 刚体模型不含气动、电机非线性、螺旋桨涡流、电池衰减。真机迁移是 S4 的事。
4. **不是"上传大脑"。** 166,700 个节点是接线数据，不是一只果蝇。
