2#include <ossia/detail/config.hpp>
58 const float q = sigma_a * sigma_a;
59 const float dt2 = dt * dt;
60 return {q * dt2 * dt / 3.f, q * dt2 / 2.f, q * dt};
75 [[nodiscard]]
static OSSIA_INLINE process_noise
76 diagonal(
float std_p,
float std_v,
float time_ratio)
noexcept
78 return {std_p * std_p * time_ratio, 0.f, std_v * std_v * time_ratio};
85 float P00{}, P01{}, P11{};
88 OSSIA_INLINE
void initiate(
float p0,
float var_p,
float var_v)
noexcept
101 P00 += dt * (2.f * P01 + dt * P11) + q.q00;
102 P01 += dt * P11 + q.q01;
111 OSSIA_INLINE
void update(
float z,
float r)
noexcept
113 const float S =
P00 + r;
114 if(!(S > 0.f)) [[unlikely]]
116 const float K0 =
P00 / S;
117 const float K1 = P01 / S;
118 const float y = z -
p;
130 const float S =
P00 + r;
131 const float y = z -
p;
132 return S > 0.f ? (y * y) / S : 0.f;
141template <std::
size_t N>
144 std::array<kalman_pv_filter, N> axes{};
147 initiate(
const std::array<float, N>& p0,
float var_p,
float var_v)
noexcept
149 for(std::size_t i = 0; i < N; i++)
150 axes[i].initiate(p0[i], var_p, var_v);
154 OSSIA_INLINE
void predict(
float dt,
float sigma_a)
noexcept
162 OSSIA_INLINE
void update(
const std::array<float, N>& z,
float r)
noexcept
164 for(std::size_t i = 0; i < N; i++)
169 [[nodiscard]] OSSIA_INLINE
float
173 for(std::size_t i = 0; i < N; i++)
178 [[nodiscard]] OSSIA_INLINE std::array<float, N> position() const noexcept
180 std::array<float, N> r;
181 for(std::size_t i = 0; i < N; i++)
186 [[nodiscard]] OSSIA_INLINE std::array<float, N> velocity() const noexcept
188 std::array<float, N> r;
189 for(std::size_t i = 0; i < N; i++)
194 OSSIA_INLINE
void set_velocity(
const std::array<float, N>& v)
noexcept
196 for(std::size_t i = 0; i < N; i++)
207 std::int32_t track, det;
228 std::vector<match_candidate>& candidates, std::int32_t* track_match,
229 std::size_t n_tracks,
char* det_used, std::size_t n_dets)
noexcept
232 candidates.begin(), candidates.end(),
234 return a.cost < b.cost;
236 for(
const auto& c : candidates)
238 if(c.track < 0 || std::size_t(c.track) >= n_tracks)
240 if(c.det < 0 || std::size_t(c.det) >= n_dets)
242 if(track_match[c.track] >= 0 || det_used[c.det])
244 track_match[c.track] = c.det;
void greedy_assignment(std::vector< match_candidate > &candidates, std::int32_t *track_match, std::size_t n_tracks, char *det_used, std::size_t n_dets) noexcept
Greedy bipartite matching: repeatedly take the cheapest remaining candidate whose track and detection...
Definition tracking.hpp:227
N independent position-velocity Kalman filters: a tracked N-D point.
Definition tracking.hpp:143
OSSIA_INLINE void predict(float dt, float sigma_a) noexcept
Propagate dt seconds forward with acceleration noise sigma_a.
Definition tracking.hpp:154
OSSIA_INLINE float gating_distance2(const std::array< float, N > &z, float r) const noexcept
Squared Mahalanobis distance, chi-square with N DOF.
Definition tracking.hpp:170
OSSIA_INLINE void update(const std::array< float, N > &z, float r) noexcept
Fold in a position measurement with isotropic variance r.
Definition tracking.hpp:162
Discrete process noise covariance for one predict step.
Definition tracking.hpp:41
Scalar constant-velocity Kalman filter, one axis of a tracked point.
Definition tracking.hpp:38
float p
State: position and velocity (units, units/s).
Definition tracking.hpp:82
static OSSIA_INLINE process_noise cwna(float sigma_a, float dt) noexcept
Discretised continuous-white-noise-acceleration process noise.
Definition tracking.hpp:56
OSSIA_INLINE void update(float z, float r) noexcept
Fold in a position measurement.
Definition tracking.hpp:111
float P00
Covariance, symmetric 2x2: [[P00, P01], [P01, P11]].
Definition tracking.hpp:85
OSSIA_INLINE void predict(float dt, const process_noise &q) noexcept
Propagate the state dt seconds forward.
Definition tracking.hpp:98
OSSIA_INLINE void initiate(float p0, float var_p, float var_v) noexcept
Start tracking at p0 with the given initial variances.
Definition tracking.hpp:88
OSSIA_INLINE float gating_distance2(float z, float r) const noexcept
Definition tracking.hpp:128
static OSSIA_INLINE process_noise diagonal(float std_p, float std_v, float time_ratio) noexcept
Ad-hoc diagonal process noise, dt-scaled.
Definition tracking.hpp:76
One candidate pairing for greedy bipartite assignment.
Definition tracking.hpp:205