openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

661 lines
26 KiB

#include "car.h"
namespace {
#define DIM 9
#define EDIM 9
#define MEDIM 9
typedef void (*Hfun)(double *, double *, double *);
double mass;
void set_mass(double x){ mass = x;}
double rotational_inertia;
void set_rotational_inertia(double x){ rotational_inertia = x;}
double center_to_front;
void set_center_to_front(double x){ center_to_front = x;}
double center_to_rear;
void set_center_to_rear(double x){ center_to_rear = x;}
double stiffness_front;
void set_stiffness_front(double x){ stiffness_front = x;}
double stiffness_rear;
void set_stiffness_rear(double x){ stiffness_rear = x;}
const static double MAHA_THRESH_25 = 3.8414588206941227;
const static double MAHA_THRESH_24 = 5.991464547107981;
const static double MAHA_THRESH_30 = 3.8414588206941227;
const static double MAHA_THRESH_26 = 3.8414588206941227;
const static double MAHA_THRESH_27 = 3.8414588206941227;
const static double MAHA_THRESH_29 = 3.8414588206941227;
const static double MAHA_THRESH_28 = 3.8414588206941227;
const static double MAHA_THRESH_31 = 3.8414588206941227;
/******************************************************************************
* Code generated with SymPy 1.13.2 *
* *
* See http://www.sympy.org/ for more information. *
* *
* This file is part of 'ekf' *
******************************************************************************/
void err_fun(double *nom_x, double *delta_x, double *out_7345504276725310336) {
out_7345504276725310336[0] = delta_x[0] + nom_x[0];
out_7345504276725310336[1] = delta_x[1] + nom_x[1];
out_7345504276725310336[2] = delta_x[2] + nom_x[2];
out_7345504276725310336[3] = delta_x[3] + nom_x[3];
out_7345504276725310336[4] = delta_x[4] + nom_x[4];
out_7345504276725310336[5] = delta_x[5] + nom_x[5];
out_7345504276725310336[6] = delta_x[6] + nom_x[6];
out_7345504276725310336[7] = delta_x[7] + nom_x[7];
out_7345504276725310336[8] = delta_x[8] + nom_x[8];
}
void inv_err_fun(double *nom_x, double *true_x, double *out_1483419534327179826) {
out_1483419534327179826[0] = -nom_x[0] + true_x[0];
out_1483419534327179826[1] = -nom_x[1] + true_x[1];
out_1483419534327179826[2] = -nom_x[2] + true_x[2];
out_1483419534327179826[3] = -nom_x[3] + true_x[3];
out_1483419534327179826[4] = -nom_x[4] + true_x[4];
out_1483419534327179826[5] = -nom_x[5] + true_x[5];
out_1483419534327179826[6] = -nom_x[6] + true_x[6];
out_1483419534327179826[7] = -nom_x[7] + true_x[7];
out_1483419534327179826[8] = -nom_x[8] + true_x[8];
}
void H_mod_fun(double *state, double *out_5980828091480380917) {
out_5980828091480380917[0] = 1.0;
out_5980828091480380917[1] = 0.0;
out_5980828091480380917[2] = 0.0;
out_5980828091480380917[3] = 0.0;
out_5980828091480380917[4] = 0.0;
out_5980828091480380917[5] = 0.0;
out_5980828091480380917[6] = 0.0;
out_5980828091480380917[7] = 0.0;
out_5980828091480380917[8] = 0.0;
out_5980828091480380917[9] = 0.0;
out_5980828091480380917[10] = 1.0;
out_5980828091480380917[11] = 0.0;
out_5980828091480380917[12] = 0.0;
out_5980828091480380917[13] = 0.0;
out_5980828091480380917[14] = 0.0;
out_5980828091480380917[15] = 0.0;
out_5980828091480380917[16] = 0.0;
out_5980828091480380917[17] = 0.0;
out_5980828091480380917[18] = 0.0;
out_5980828091480380917[19] = 0.0;
out_5980828091480380917[20] = 1.0;
out_5980828091480380917[21] = 0.0;
out_5980828091480380917[22] = 0.0;
out_5980828091480380917[23] = 0.0;
out_5980828091480380917[24] = 0.0;
out_5980828091480380917[25] = 0.0;
out_5980828091480380917[26] = 0.0;
out_5980828091480380917[27] = 0.0;
out_5980828091480380917[28] = 0.0;
out_5980828091480380917[29] = 0.0;
out_5980828091480380917[30] = 1.0;
out_5980828091480380917[31] = 0.0;
out_5980828091480380917[32] = 0.0;
out_5980828091480380917[33] = 0.0;
out_5980828091480380917[34] = 0.0;
out_5980828091480380917[35] = 0.0;
out_5980828091480380917[36] = 0.0;
out_5980828091480380917[37] = 0.0;
out_5980828091480380917[38] = 0.0;
out_5980828091480380917[39] = 0.0;
out_5980828091480380917[40] = 1.0;
out_5980828091480380917[41] = 0.0;
out_5980828091480380917[42] = 0.0;
out_5980828091480380917[43] = 0.0;
out_5980828091480380917[44] = 0.0;
out_5980828091480380917[45] = 0.0;
out_5980828091480380917[46] = 0.0;
out_5980828091480380917[47] = 0.0;
out_5980828091480380917[48] = 0.0;
out_5980828091480380917[49] = 0.0;
out_5980828091480380917[50] = 1.0;
out_5980828091480380917[51] = 0.0;
out_5980828091480380917[52] = 0.0;
out_5980828091480380917[53] = 0.0;
out_5980828091480380917[54] = 0.0;
out_5980828091480380917[55] = 0.0;
out_5980828091480380917[56] = 0.0;
out_5980828091480380917[57] = 0.0;
out_5980828091480380917[58] = 0.0;
out_5980828091480380917[59] = 0.0;
out_5980828091480380917[60] = 1.0;
out_5980828091480380917[61] = 0.0;
out_5980828091480380917[62] = 0.0;
out_5980828091480380917[63] = 0.0;
out_5980828091480380917[64] = 0.0;
out_5980828091480380917[65] = 0.0;
out_5980828091480380917[66] = 0.0;
out_5980828091480380917[67] = 0.0;
out_5980828091480380917[68] = 0.0;
out_5980828091480380917[69] = 0.0;
out_5980828091480380917[70] = 1.0;
out_5980828091480380917[71] = 0.0;
out_5980828091480380917[72] = 0.0;
out_5980828091480380917[73] = 0.0;
out_5980828091480380917[74] = 0.0;
out_5980828091480380917[75] = 0.0;
out_5980828091480380917[76] = 0.0;
out_5980828091480380917[77] = 0.0;
out_5980828091480380917[78] = 0.0;
out_5980828091480380917[79] = 0.0;
out_5980828091480380917[80] = 1.0;
}
void f_fun(double *state, double dt, double *out_6771744444959754452) {
out_6771744444959754452[0] = state[0];
out_6771744444959754452[1] = state[1];
out_6771744444959754452[2] = state[2];
out_6771744444959754452[3] = state[3];
out_6771744444959754452[4] = state[4];
out_6771744444959754452[5] = dt*((-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]))*state[6] - 9.8000000000000007*state[8] + stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*state[1]) + (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*state[4])) + state[5];
out_6771744444959754452[6] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*state[4])) + state[6];
out_6771744444959754452[7] = state[7];
out_6771744444959754452[8] = state[8];
}
void F_fun(double *state, double dt, double *out_8079006821062657786) {
out_8079006821062657786[0] = 1;
out_8079006821062657786[1] = 0;
out_8079006821062657786[2] = 0;
out_8079006821062657786[3] = 0;
out_8079006821062657786[4] = 0;
out_8079006821062657786[5] = 0;
out_8079006821062657786[6] = 0;
out_8079006821062657786[7] = 0;
out_8079006821062657786[8] = 0;
out_8079006821062657786[9] = 0;
out_8079006821062657786[10] = 1;
out_8079006821062657786[11] = 0;
out_8079006821062657786[12] = 0;
out_8079006821062657786[13] = 0;
out_8079006821062657786[14] = 0;
out_8079006821062657786[15] = 0;
out_8079006821062657786[16] = 0;
out_8079006821062657786[17] = 0;
out_8079006821062657786[18] = 0;
out_8079006821062657786[19] = 0;
out_8079006821062657786[20] = 1;
out_8079006821062657786[21] = 0;
out_8079006821062657786[22] = 0;
out_8079006821062657786[23] = 0;
out_8079006821062657786[24] = 0;
out_8079006821062657786[25] = 0;
out_8079006821062657786[26] = 0;
out_8079006821062657786[27] = 0;
out_8079006821062657786[28] = 0;
out_8079006821062657786[29] = 0;
out_8079006821062657786[30] = 1;
out_8079006821062657786[31] = 0;
out_8079006821062657786[32] = 0;
out_8079006821062657786[33] = 0;
out_8079006821062657786[34] = 0;
out_8079006821062657786[35] = 0;
out_8079006821062657786[36] = 0;
out_8079006821062657786[37] = 0;
out_8079006821062657786[38] = 0;
out_8079006821062657786[39] = 0;
out_8079006821062657786[40] = 1;
out_8079006821062657786[41] = 0;
out_8079006821062657786[42] = 0;
out_8079006821062657786[43] = 0;
out_8079006821062657786[44] = 0;
out_8079006821062657786[45] = dt*(stiffness_front*(-state[2] - state[3] + state[7])/(mass*state[1]) + (-stiffness_front - stiffness_rear)*state[5]/(mass*state[4]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[6]/(mass*state[4]));
out_8079006821062657786[46] = -dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*pow(state[1], 2));
out_8079006821062657786[47] = -dt*stiffness_front*state[0]/(mass*state[1]);
out_8079006821062657786[48] = -dt*stiffness_front*state[0]/(mass*state[1]);
out_8079006821062657786[49] = dt*((-1 - (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*pow(state[4], 2)))*state[6] - (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*pow(state[4], 2)));
out_8079006821062657786[50] = dt*(-stiffness_front*state[0] - stiffness_rear*state[0])/(mass*state[4]) + 1;
out_8079006821062657786[51] = dt*(-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]));
out_8079006821062657786[52] = dt*stiffness_front*state[0]/(mass*state[1]);
out_8079006821062657786[53] = -9.8000000000000007*dt;
out_8079006821062657786[54] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front - pow(center_to_rear, 2)*stiffness_rear)*state[6]/(rotational_inertia*state[4]));
out_8079006821062657786[55] = -center_to_front*dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*pow(state[1], 2));
out_8079006821062657786[56] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_8079006821062657786[57] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_8079006821062657786[58] = dt*(-(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*pow(state[4], 2)) - (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*pow(state[4], 2)));
out_8079006821062657786[59] = dt*(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(rotational_inertia*state[4]);
out_8079006821062657786[60] = dt*(-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])/(rotational_inertia*state[4]) + 1;
out_8079006821062657786[61] = center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_8079006821062657786[62] = 0;
out_8079006821062657786[63] = 0;
out_8079006821062657786[64] = 0;
out_8079006821062657786[65] = 0;
out_8079006821062657786[66] = 0;
out_8079006821062657786[67] = 0;
out_8079006821062657786[68] = 0;
out_8079006821062657786[69] = 0;
out_8079006821062657786[70] = 1;
out_8079006821062657786[71] = 0;
out_8079006821062657786[72] = 0;
out_8079006821062657786[73] = 0;
out_8079006821062657786[74] = 0;
out_8079006821062657786[75] = 0;
out_8079006821062657786[76] = 0;
out_8079006821062657786[77] = 0;
out_8079006821062657786[78] = 0;
out_8079006821062657786[79] = 0;
out_8079006821062657786[80] = 1;
}
void h_25(double *state, double *unused, double *out_6013514099318955817) {
out_6013514099318955817[0] = state[6];
}
void H_25(double *state, double *unused, double *out_8892173204326502465) {
out_8892173204326502465[0] = 0;
out_8892173204326502465[1] = 0;
out_8892173204326502465[2] = 0;
out_8892173204326502465[3] = 0;
out_8892173204326502465[4] = 0;
out_8892173204326502465[5] = 0;
out_8892173204326502465[6] = 1;
out_8892173204326502465[7] = 0;
out_8892173204326502465[8] = 0;
}
void h_24(double *state, double *unused, double *out_6766398854122891435) {
out_6766398854122891435[0] = state[4];
out_6766398854122891435[1] = state[5];
}
void H_24(double *state, double *unused, double *out_7204356768457398274) {
out_7204356768457398274[0] = 0;
out_7204356768457398274[1] = 0;
out_7204356768457398274[2] = 0;
out_7204356768457398274[3] = 0;
out_7204356768457398274[4] = 1;
out_7204356768457398274[5] = 0;
out_7204356768457398274[6] = 0;
out_7204356768457398274[7] = 0;
out_7204356768457398274[8] = 0;
out_7204356768457398274[9] = 0;
out_7204356768457398274[10] = 0;
out_7204356768457398274[11] = 0;
out_7204356768457398274[12] = 0;
out_7204356768457398274[13] = 0;
out_7204356768457398274[14] = 1;
out_7204356768457398274[15] = 0;
out_7204356768457398274[16] = 0;
out_7204356768457398274[17] = 0;
}
void h_30(double *state, double *unused, double *out_5662394748040244863) {
out_5662394748040244863[0] = state[4];
}
void H_30(double *state, double *unused, double *out_5026874539255440953) {
out_5026874539255440953[0] = 0;
out_5026874539255440953[1] = 0;
out_5026874539255440953[2] = 0;
out_5026874539255440953[3] = 0;
out_5026874539255440953[4] = 1;
out_5026874539255440953[5] = 0;
out_5026874539255440953[6] = 0;
out_5026874539255440953[7] = 0;
out_5026874539255440953[8] = 0;
}
void h_26(double *state, double *unused, double *out_253236005693617473) {
out_253236005693617473[0] = state[7];
}
void H_26(double *state, double *unused, double *out_5813067550508992927) {
out_5813067550508992927[0] = 0;
out_5813067550508992927[1] = 0;
out_5813067550508992927[2] = 0;
out_5813067550508992927[3] = 0;
out_5813067550508992927[4] = 0;
out_5813067550508992927[5] = 0;
out_5813067550508992927[6] = 0;
out_5813067550508992927[7] = 1;
out_5813067550508992927[8] = 0;
}
void h_27(double *state, double *unused, double *out_6177405252431548545) {
out_6177405252431548545[0] = state[3];
}
void H_27(double *state, double *unused, double *out_2852111227455016042) {
out_2852111227455016042[0] = 0;
out_2852111227455016042[1] = 0;
out_2852111227455016042[2] = 0;
out_2852111227455016042[3] = 1;
out_2852111227455016042[4] = 0;
out_2852111227455016042[5] = 0;
out_2852111227455016042[6] = 0;
out_2852111227455016042[7] = 0;
out_2852111227455016042[8] = 0;
}
void h_29(double *state, double *unused, double *out_8631889293023980721) {
out_8631889293023980721[0] = state[1];
}
void H_29(double *state, double *unused, double *out_5537105883569833137) {
out_5537105883569833137[0] = 0;
out_5537105883569833137[1] = 1;
out_5537105883569833137[2] = 0;
out_5537105883569833137[3] = 0;
out_5537105883569833137[4] = 0;
out_5537105883569833137[5] = 0;
out_5537105883569833137[6] = 0;
out_5537105883569833137[7] = 0;
out_5537105883569833137[8] = 0;
}
void h_28(double *state, double *unused, double *out_7267665553617157426) {
out_7267665553617157426[0] = state[0];
}
void H_28(double *state, double *unused, double *out_454706866500302563) {
out_454706866500302563[0] = 1;
out_454706866500302563[1] = 0;
out_454706866500302563[2] = 0;
out_454706866500302563[3] = 0;
out_454706866500302563[4] = 0;
out_454706866500302563[5] = 0;
out_454706866500302563[6] = 0;
out_454706866500302563[7] = 0;
out_454706866500302563[8] = 0;
}
void h_31(double *state, double *unused, double *out_2626363377399586067) {
out_2626363377399586067[0] = state[8];
}
void H_31(double *state, double *unused, double *out_5186859448275641451) {
out_5186859448275641451[0] = 0;
out_5186859448275641451[1] = 0;
out_5186859448275641451[2] = 0;
out_5186859448275641451[3] = 0;
out_5186859448275641451[4] = 0;
out_5186859448275641451[5] = 0;
out_5186859448275641451[6] = 0;
out_5186859448275641451[7] = 0;
out_5186859448275641451[8] = 1;
}
#include <eigen3/Eigen/Dense>
#include <iostream>
typedef Eigen::Matrix<double, DIM, DIM, Eigen::RowMajor> DDM;
typedef Eigen::Matrix<double, EDIM, EDIM, Eigen::RowMajor> EEM;
typedef Eigen::Matrix<double, DIM, EDIM, Eigen::RowMajor> DEM;
void predict(double *in_x, double *in_P, double *in_Q, double dt) {
typedef Eigen::Matrix<double, MEDIM, MEDIM, Eigen::RowMajor> RRM;
double nx[DIM] = {0};
double in_F[EDIM*EDIM] = {0};
// functions from sympy
f_fun(in_x, dt, nx);
F_fun(in_x, dt, in_F);
EEM F(in_F);
EEM P(in_P);
EEM Q(in_Q);
RRM F_main = F.topLeftCorner(MEDIM, MEDIM);
P.topLeftCorner(MEDIM, MEDIM) = (F_main * P.topLeftCorner(MEDIM, MEDIM)) * F_main.transpose();
P.topRightCorner(MEDIM, EDIM - MEDIM) = F_main * P.topRightCorner(MEDIM, EDIM - MEDIM);
P.bottomLeftCorner(EDIM - MEDIM, MEDIM) = P.bottomLeftCorner(EDIM - MEDIM, MEDIM) * F_main.transpose();
P = P + dt*Q;
// copy out state
memcpy(in_x, nx, DIM * sizeof(double));
memcpy(in_P, P.data(), EDIM * EDIM * sizeof(double));
}
// note: extra_args dim only correct when null space projecting
// otherwise 1
template <int ZDIM, int EADIM, bool MAHA_TEST>
void update(double *in_x, double *in_P, Hfun h_fun, Hfun H_fun, Hfun Hea_fun, double *in_z, double *in_R, double *in_ea, double MAHA_THRESHOLD) {
typedef Eigen::Matrix<double, ZDIM, ZDIM, Eigen::RowMajor> ZZM;
typedef Eigen::Matrix<double, ZDIM, DIM, Eigen::RowMajor> ZDM;
typedef Eigen::Matrix<double, Eigen::Dynamic, EDIM, Eigen::RowMajor> XEM;
//typedef Eigen::Matrix<double, EDIM, ZDIM, Eigen::RowMajor> EZM;
typedef Eigen::Matrix<double, Eigen::Dynamic, 1> X1M;
typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> XXM;
double in_hx[ZDIM] = {0};
double in_H[ZDIM * DIM] = {0};
double in_H_mod[EDIM * DIM] = {0};
double delta_x[EDIM] = {0};
double x_new[DIM] = {0};
// state x, P
Eigen::Matrix<double, ZDIM, 1> z(in_z);
EEM P(in_P);
ZZM pre_R(in_R);
// functions from sympy
h_fun(in_x, in_ea, in_hx);
H_fun(in_x, in_ea, in_H);
ZDM pre_H(in_H);
// get y (y = z - hx)
Eigen::Matrix<double, ZDIM, 1> pre_y(in_hx); pre_y = z - pre_y;
X1M y; XXM H; XXM R;
if (Hea_fun){
typedef Eigen::Matrix<double, ZDIM, EADIM, Eigen::RowMajor> ZAM;
double in_Hea[ZDIM * EADIM] = {0};
Hea_fun(in_x, in_ea, in_Hea);
ZAM Hea(in_Hea);
XXM A = Hea.transpose().fullPivLu().kernel();
y = A.transpose() * pre_y;
H = A.transpose() * pre_H;
R = A.transpose() * pre_R * A;
} else {
y = pre_y;
H = pre_H;
R = pre_R;
}
// get modified H
H_mod_fun(in_x, in_H_mod);
DEM H_mod(in_H_mod);
XEM H_err = H * H_mod;
// Do mahalobis distance test
if (MAHA_TEST){
XXM a = (H_err * P * H_err.transpose() + R).inverse();
double maha_dist = y.transpose() * a * y;
if (maha_dist > MAHA_THRESHOLD){
R = 1.0e16 * R;
}
}
// Outlier resilient weighting
double weight = 1;//(1.5)/(1 + y.squaredNorm()/R.sum());
// kalman gains and I_KH
XXM S = ((H_err * P) * H_err.transpose()) + R/weight;
XEM KT = S.fullPivLu().solve(H_err * P.transpose());
//EZM K = KT.transpose(); TODO: WHY DOES THIS NOT COMPILE?
//EZM K = S.fullPivLu().solve(H_err * P.transpose()).transpose();
//std::cout << "Here is the matrix rot:\n" << K << std::endl;
EEM I_KH = Eigen::Matrix<double, EDIM, EDIM>::Identity() - (KT.transpose() * H_err);
// update state by injecting dx
Eigen::Matrix<double, EDIM, 1> dx(delta_x);
dx = (KT.transpose() * y);
memcpy(delta_x, dx.data(), EDIM * sizeof(double));
err_fun(in_x, delta_x, x_new);
Eigen::Matrix<double, DIM, 1> x(x_new);
// update cov
P = ((I_KH * P) * I_KH.transpose()) + ((KT.transpose() * R) * KT);
// copy out state
memcpy(in_x, x.data(), DIM * sizeof(double));
memcpy(in_P, P.data(), EDIM * EDIM * sizeof(double));
memcpy(in_z, y.data(), y.rows() * sizeof(double));
}
}
extern "C" {
void car_update_25(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {
update<1, 3, 0>(in_x, in_P, h_25, H_25, NULL, in_z, in_R, in_ea, MAHA_THRESH_25);
}
void car_update_24(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {
update<2, 3, 0>(in_x, in_P, h_24, H_24, NULL, in_z, in_R, in_ea, MAHA_THRESH_24);
}
void car_update_30(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {
update<1, 3, 0>(in_x, in_P, h_30, H_30, NULL, in_z, in_R, in_ea, MAHA_THRESH_30);
}
void car_update_26(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {
update<1, 3, 0>(in_x, in_P, h_26, H_26, NULL, in_z, in_R, in_ea, MAHA_THRESH_26);
}
void car_update_27(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {
update<1, 3, 0>(in_x, in_P, h_27, H_27, NULL, in_z, in_R, in_ea, MAHA_THRESH_27);
}
void car_update_29(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {
update<1, 3, 0>(in_x, in_P, h_29, H_29, NULL, in_z, in_R, in_ea, MAHA_THRESH_29);
}
void car_update_28(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {
update<1, 3, 0>(in_x, in_P, h_28, H_28, NULL, in_z, in_R, in_ea, MAHA_THRESH_28);
}
void car_update_31(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {
update<1, 3, 0>(in_x, in_P, h_31, H_31, NULL, in_z, in_R, in_ea, MAHA_THRESH_31);
}
void car_err_fun(double *nom_x, double *delta_x, double *out_7345504276725310336) {
err_fun(nom_x, delta_x, out_7345504276725310336);
}
void car_inv_err_fun(double *nom_x, double *true_x, double *out_1483419534327179826) {
inv_err_fun(nom_x, true_x, out_1483419534327179826);
}
void car_H_mod_fun(double *state, double *out_5980828091480380917) {
H_mod_fun(state, out_5980828091480380917);
}
void car_f_fun(double *state, double dt, double *out_6771744444959754452) {
f_fun(state, dt, out_6771744444959754452);
}
void car_F_fun(double *state, double dt, double *out_8079006821062657786) {
F_fun(state, dt, out_8079006821062657786);
}
void car_h_25(double *state, double *unused, double *out_6013514099318955817) {
h_25(state, unused, out_6013514099318955817);
}
void car_H_25(double *state, double *unused, double *out_8892173204326502465) {
H_25(state, unused, out_8892173204326502465);
}
void car_h_24(double *state, double *unused, double *out_6766398854122891435) {
h_24(state, unused, out_6766398854122891435);
}
void car_H_24(double *state, double *unused, double *out_7204356768457398274) {
H_24(state, unused, out_7204356768457398274);
}
void car_h_30(double *state, double *unused, double *out_5662394748040244863) {
h_30(state, unused, out_5662394748040244863);
}
void car_H_30(double *state, double *unused, double *out_5026874539255440953) {
H_30(state, unused, out_5026874539255440953);
}
void car_h_26(double *state, double *unused, double *out_253236005693617473) {
h_26(state, unused, out_253236005693617473);
}
void car_H_26(double *state, double *unused, double *out_5813067550508992927) {
H_26(state, unused, out_5813067550508992927);
}
void car_h_27(double *state, double *unused, double *out_6177405252431548545) {
h_27(state, unused, out_6177405252431548545);
}
void car_H_27(double *state, double *unused, double *out_2852111227455016042) {
H_27(state, unused, out_2852111227455016042);
}
void car_h_29(double *state, double *unused, double *out_8631889293023980721) {
h_29(state, unused, out_8631889293023980721);
}
void car_H_29(double *state, double *unused, double *out_5537105883569833137) {
H_29(state, unused, out_5537105883569833137);
}
void car_h_28(double *state, double *unused, double *out_7267665553617157426) {
h_28(state, unused, out_7267665553617157426);
}
void car_H_28(double *state, double *unused, double *out_454706866500302563) {
H_28(state, unused, out_454706866500302563);
}
void car_h_31(double *state, double *unused, double *out_2626363377399586067) {
h_31(state, unused, out_2626363377399586067);
}
void car_H_31(double *state, double *unused, double *out_5186859448275641451) {
H_31(state, unused, out_5186859448275641451);
}
void car_predict(double *in_x, double *in_P, double *in_Q, double dt) {
predict(in_x, in_P, in_Q, dt);
}
void car_set_mass(double x) {
set_mass(x);
}
void car_set_rotational_inertia(double x) {
set_rotational_inertia(x);
}
void car_set_center_to_front(double x) {
set_center_to_front(x);
}
void car_set_center_to_rear(double x) {
set_center_to_rear(x);
}
void car_set_stiffness_front(double x) {
set_stiffness_front(x);
}
void car_set_stiffness_rear(double x) {
set_stiffness_rear(x);
}
}
const EKF car = {
.name = "car",
.kinds = { 25, 24, 30, 26, 27, 29, 28, 31 },
.feature_kinds = { },
.f_fun = car_f_fun,
.F_fun = car_F_fun,
.err_fun = car_err_fun,
.inv_err_fun = car_inv_err_fun,
.H_mod_fun = car_H_mod_fun,
.predict = car_predict,
.hs = {
{ 25, car_h_25 },
{ 24, car_h_24 },
{ 30, car_h_30 },
{ 26, car_h_26 },
{ 27, car_h_27 },
{ 29, car_h_29 },
{ 28, car_h_28 },
{ 31, car_h_31 },
},
.Hs = {
{ 25, car_H_25 },
{ 24, car_H_24 },
{ 30, car_H_30 },
{ 26, car_H_26 },
{ 27, car_H_27 },
{ 29, car_H_29 },
{ 28, car_H_28 },
{ 31, car_H_31 },
},
.updates = {
{ 25, car_update_25 },
{ 24, car_update_24 },
{ 30, car_update_30 },
{ 26, car_update_26 },
{ 27, car_update_27 },
{ 29, car_update_29 },
{ 28, car_update_28 },
{ 31, car_update_31 },
},
.Hes = {
},
.sets = {
{ "mass", car_set_mass },
{ "rotational_inertia", car_set_rotational_inertia },
{ "center_to_front", car_set_center_to_front },
{ "center_to_rear", car_set_center_to_rear },
{ "stiffness_front", car_set_stiffness_front },
{ "stiffness_rear", car_set_stiffness_rear },
},
.extra_routines = {
},
};
ekf_lib_init(car)