fly_egomotion_from_flow — FLYVISION selfmotion op

• 資料種類:matrix × table → table

• 呼叫: import fullseye as fs; fs.ledger.fly_egomotion_from_flow(flow, lattice, axes=None, weights=None)(要直接呼叫實作,import flyvision; flyvision.fly_egomotion_from_flow(flow, lattice, axes=None, weights=None);從台帳取用則 opsflyvision.get("fly_egomotion_from_flow"))

用法

> 該運算子的說明尚無譯文,以下照原文給出。

Least-squares rotation of the eye from its flow field — and how badly the

eye's own shape conditions the answer.

Given the flow `f_i at known viewing directions d_i`, a pure rotation

`w predicts f_i = -(w x d_i)`, which is linear in w: projecting on

the tangent basis gives `f_az = -w . (d x e_az)` and

`f_el = -w . (d x e_el), so the estimate is one 2n x 3` least-squares

solve with no iteration and no starting guess (Franz et al.'s linear

egomotion estimate, *Biol. Cybern.* 2004).

The catch is not the algebra, it is the eye. A single patch of ommatidia sees

a small piece of the sphere, and over a small piece the flow of a yaw and the

flow of a sideways translation — or of a pitch — look nearly the same. This

op therefore returns the condition number of that solve next to the

answer, so that "the fit converged" and "the fit was identifiable" stay

separate claims.

flow: `(n, 2)` azimuth/elevation components per ommatidium

(:func:fly_flow_from_directions or :func:fly_matched_filter).

lattice: the eye they were measured on.

axes: `None to solve for the full 3-D rotation, or a (k, 3)` array of

axes to restrict the fit to (`[[0, 0, 1]]` = yaw only, the well-conditioned

question a forward-looking eye can actually answer).

weights: `None or (n,)` non-negative per-ommatidium weights — a

confidence, e.g. the local contrast, or zeros to drop the rim.

Returns a dict::

{"omega_rad_s": (3,), "yaw_rad_s": float, "pitch_rad_s": float,

"roll_rad_s": float, "residual_rms": float, "flow_rms": float,

"explained": float, "condition": float, "n_ommatidia": int}

with yaw about +z (left positive), pitch about +y, roll about +x, and

`explained = 1 - residual_rms/flow_rms` (1.0 = the flow is exactly a

rotation, 0.0 = the fit explains none of it).

Ground truth: handed a :func:fly_matched_filter template scaled by a known

rate, it returns that rate to machine precision and `explained = 1`; handed

a pure translation field it returns a small rate with a low `explained`; and

the condition number of a narrow forward eye is large (the tests measure it)

while the yaw-only fit is near 1.

Raises `ValueError: a *flow* that is not (n, 2)` for this lattice,

non-finite entries, a malformed *axes* / *weights*, all-zero weights, and a

lattice with fewer ommatidia than the fit has unknowns.

詳細使用指南

• fly_vision 族使用指南

參考(範例資料・文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。

• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。

• 演算法的正典(作者・年份)與用途見上面的族使用指南。

可執行的範例(實際呼叫該運算子並已驗證的樣例)

• poc_fly_optomotor_steering — py -3.11 examples/poc_fly_optomotor_steering.py

型別可銜接的下一個運算子(可接受 table 作為輸入)

fly_t4t5_field · fly_flow_from_directions · fly_matched_filter · fly_eye_merge · fly_hex_resample · fly_hs_readout

同類別(selfmotion)

fly_matched_filter · fly_eye_merge


*Provenance: flyvision.py — FLYVISION 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.