Recovering a moving target’s starting position and constant velocity using only AoA (Angle of Arrival) bearings from a maneuvering sensor.
See the research report: See here for the full academic write‑up (derivations, Jacobians, solver details).
One sensor moves along a known path and measures only the bearing to a target once per second. There are no range readings. From the time‑sequence of angles, the system estimates the target’s initial position
At time
Assume constant velocity (CV) over the 30‑s window:
- Position now = start + velocity × time.
- Unknowns to estimate:
$(x_0,y_0,v_x,v_y)$ .
At every second
For each time step, form the vector from sensor → target:
-
$\Delta x_k = x(t_k) - x_p(t_k)$ ,$\Delta y_k = y(t_k) - y_p(t_k)$ -
The ideal bearing is the four‑quadrant arctangent
$$\theta_k = arctan2(\Delta y_k,\ \Delta x_k).$$ -
Unlike
$\arctan(\Delta y/\Delta x)$ ,atan2(y,x)uses the signs of both inputs to return the correct direction in$(-\pi,\pi]$ . -
It behaves well on vertical lines (
$\Delta x=0$ ) and distinguishes left/right quadrants correctly. -
In short: it’s the right tool whenever you want a true heading from a vector.
Measurements are noisy angles
A Gauss–Newton solver adjusts
If the sensor never turns, many different target states can produce nearly the same angle history. The west‑then‑north path creates cross‑range motion, making the angle curve distinctive enough to reveal both position and velocity.
-
Target (truth): starts at
$(0,0)$ , moves northeast at constant speed (≈30 m/s). - Sensor path (known): starts east, goes west for 15 s, then north for 14 s at ≈35 m/s.
- Sampling: 1 angle per second, 30 samples total.
- Noise: Gaussian, 1° standard deviation.
This geometry supplies the needed viewpoint change for reliable estimation.
Now that the workflow is clear, the three outputs below illustrate the run on the scenario above.
Fig A — Trajectories. The turning sensor provides cross‑range motion that disambiguates position and velocity.
Fig B — Bearings over time. Blue = true angle; orange = noisy measurements (~1° std). The curvature arises from the sensor’s turn.
Fig C — Solver convergence. The four parameters settle close to truth after a few Gauss–Newton iterations.
- Initialization. Start near the first line‑of‑sight with a reasonable speed; try a few random restarts if convergence stalls.
- Units. Keep all calculations in radians; convert to degrees for plots only.
- Robustness. Clip extreme residuals or use a gentle robust loss if a few angles are suspect.
- When it struggles. Nearly straight sensor paths or very close passes reduce information; deliberate L/S‑turns help.
- Extensions. Constant Velocity works for this window; for long windows consider constant‑acceleration or coordinated‑turn models (and EKF/UKF) as noted in the report.
AoA / Bearing — Direction from sensor to target; computed with atan2(Δy,Δx) in
Angle wrapping — Mapping any angle back into a principal interval (e.g.,
Constant‑velocity model — Position evolves linearly with time; velocity fixed over the window.
Gauss–Newton — Iterative least‑squares method that adjusts parameters to shrink the total squared angle error.
Observability — Whether the angle history carries enough information to infer the state (improved by sensor maneuvers).
MIT — see LICENSE.