7#include "../ptp_defs.h"
14#include <flexptp_options.h>
18#ifndef SIGMA_THETA_SQUARED
19#define SIGMA_THETA_SQUARED (1E-16)
22#ifndef SIGMA_GAMMA_SQUARED
23#define SIGMA_GAMMA_SQUARED (1E-12)
26#ifndef SIGMA_CT_SQUARED
27#define SIGMA_CT_SQUARED (1E-10)
32#define FAST_TUNING_THRESHOLD (500E-09)
33#define FAST_TUNING_COEFFICIENT (0.2)
34#define CALM_TUNING_COEFFICIENT (0.01)
38typedef double mtx[2][2];
41#define MTX_ELEMENTWISE(ctx) \
42 for (uint8_t i = 0; i < 2; i++) { \
43 for (uint8_t j = 0; j < 2; j++) { \
48#define VEC_ELEMENTWISE(ctx) \
49 for (uint8_t i = 0; i < 2; i++) { \
55 dst[i][j] = src[i][j];)
60 r[i][j] = a[i][j] + b[i][j];)
65 r[i][j] = a[i][j] - b[i][j];)
70 r[i][j] = c * a[i][j];)
75 r[i] = m[i][0] * v[0] + m[i][1] * v[1];)
79 r[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0];
80 r[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1];
81 r[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0];
82 r[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1];
91 return m[0][0] * m[1][1] - m[0][1] * m[1][0];
104 MSG(
"%.4f %.4f\n%.4f %.4f\n", m[0][0], m[0][1], m[1][0], m[1][1]);
137#define SQR(x) ((x) * (x))
171#error "No CMD_FUNCTION macro has been defined, cannot register CLI functions!"
174static CMD_FUNCTION(sts) {
176 if (!strcat(
"default", ppArgs[0])) {
188static CMD_FUNCTION(sgs) {
190 if (!strcat(
"default", ppArgs[0])) {
202static CMD_FUNCTION(stms) {
204 if (!strcat(
"default", ppArgs[0])) {
219 KF_CMDH_SIGMA_THETA_SQ = 0,
220 KF_CMDH_SIGMA_GAMMA_SQ,
221 KF_CMDH_SIGMA_THETA_M_SQ,
223} KalmanFilterCmdHandle;
225static int cmd_handles[KF_CMDH_N];
227static void register_cmd_commands() {
228 cmd_handles[KF_CMDH_SIGMA_THETA_SQ] =
CLI_REG_CMD(
"ptp servo st [var|default] \t\t\t Set or get sigma_theta^2 (s^2)", 3, 0, sts);
229 cmd_handles[KF_CMDH_SIGMA_GAMMA_SQ] =
CLI_REG_CMD(
"ptp servo sg [var|default] \t\t\t Set or get sigma_gamma^2 (s^2)", 3, 0, sgs);
230 cmd_handles[KF_CMDH_SIGMA_THETA_M_SQ] =
CLI_REG_CMD(
"ptp servo stm [var|default] \t\t\t Set or get sigma_theta_m^2 (s^2)", 3, 0, stms);
234static void remove_cmd_commands() {
235 for (uint8_t i = 0; i < KF_CMDH_N; i++) {
253 register_cmd_commands();
262 remove_cmd_commands();
299 double tuning_ppb = 0.0;
303 goto retain_cycle_data;
310 double offset = ((double)dt) * 1E-09;
345 mtx P_priR, P_priRinv;
365 double tuning = -
x[1] + ((-
x[0] * 1E+09 / pAux->
measSyncPeriodNs) * tuning_coefficient);
366 tuning_ppb = tuning * 1E+09;
#define CLI_REG_CMD(cmd_hintline, n_cmd, n_min_arg, cb)
void kalman_filter_reset()
static void mtx_scale(mtx r, double c, mtx a)
static double sigma_gamma_squared
static void init_variances()
#define MTX_ELEMENTWISE(ctx)
static void mtx_mul(mtx r, mtx a, mtx b)
static void vec_sub(vec r, vec a, vec b)
#define SIGMA_THETA_SQUARED
static void mtx_add(mtx r, mtx a, mtx b)
static void vec_zero(vec v)
#define VEC_ELEMENTWISE(ctx)
void kalman_filter_init()
static void mtx_sub(mtx r, mtx a, mtx b)
#define SIGMA_GAMMA_SQUARED
#define FAST_TUNING_COEFFICIENT
static void mtx_copy(mtx dst, mtx src)
static void insert_DT(double DT)
static void mtx_inverse(mtx r, mtx m)
#define FAST_TUNING_THRESHOLD
float kalman_filter_run(int32_t dt, PtpServoAuxInput *pAux)
static double sigma_theta_m_squared
#define CALM_TUNING_COEFFICIENT
static void mtx_print(mtx m)
static void mtx_dot(vec r, mtx m, vec v)
static void vec_add(vec r, vec a, vec b)
static double sigma_theta_squared
static void mtx_transp(mtx r, mtx m)
static void vec_copy(vec r, vec v)
static void mtx_unit(mtx m)
static double mtx_det(mtx m)
void kalman_filter_deinit()
static void mtx_zero(mtx m)