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.
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL 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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.