![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
PmodNAV test
Dependencies: mbed LPS25HB_I2C LSM9DS1 UsaPack
main.cpp
- Committer:
- NaotoMorita
- Date:
- 2021-11-05
- Revision:
- 2:20d44bbe80e4
- Parent:
- 0:c99eaed54c50
File content as of revision 2:20d44bbe80e4:
#include "mbed.h" #include "LSM9DS1.h" #include "LPS.h" #include "Matrix.h" #include <cmath> #include "MatrixMath.h" Serial pc(USBTX, USBRX, 115200); I2C i2c(PB_9, PB_8); LSM9DS1 lsm(i2c); LPS lps(i2c); Matrix K(3,3); Matrix beta(3,1); float R; Matrix gamma(10,1); Matrix jac(10,1); float b; void setBetaK() { K(1,1) = gamma(1,1); K(1,2) = gamma(2,1); K(2,1) = gamma(2,1); K(1,3) = gamma(3,1); K(3,1) = gamma(3,1); K(2,2) = gamma(4,1); K(2,3) = gamma(5,1); K(3,2) = gamma(5,1); K(3,3) = gamma(6,1); beta(1,1) = gamma(7,1); beta(2,1) = gamma(8,1); beta(3,1) = gamma(9,1); R = gamma(10,1); } void calcMagCalUpdate(Matrix H) { float A = K(1,1)*(H(1,1)+beta(1,1)) + K(1,2)*(H(2,1)+beta(2,1)) + K(1,3)*(H(3,1)+beta(3,1)) ; float B = K(2,1)*(H(1,1)+beta(1,1)) + K(2,2)*(H(2,1)+beta(2,1)) + K(2,3)*(H(3,1)+beta(3,1)) ; float C = K(3,1)*(H(1,1)+beta(1,1)) + K(3,2)*(H(2,1)+beta(2,1)) + K(3,3)*(H(3,1)+beta(3,1)) ; Matrix bvec = K * (H+beta); b = sqrt(bvec(1,1)*bvec(1,1)+bvec(2,1)*bvec(2,1)+bvec(3,1)*bvec(3,1)); jac(1,1) = - (H(1,1) + beta(1,1))*A/b; jac(2,1) = - (H(2,1) + beta(2,1))*B/b; jac(3,1) = - (H(3,1) + beta(3,1))*C/b; jac(4,1) = - ((H(2,1) + beta(2,1))*A+(H(1,1) + beta(1,1))*B)/b; jac(5,1) = - ((H(3,1) + beta(3,1))*A+(H(1,1) + beta(1,1))*C)/b; jac(6,1) = - ((H(3,1) + beta(3,1))*B+(H(2,1) + beta(2,1))*C)/b; jac(7,1) = - (K(1,1)*(H(1,1) + beta(1,1))+K(1,2)*(H(2,1) + beta(2,1)) + K(1,3)*(H(3,1) + beta(3,1)))/b; jac(8,1) = - (K(2,1)*(H(1,1) + beta(1,1))+K(2,2)*(H(2,1) + beta(2,1)) + K(2,3)*(H(3,1) + beta(3,1)))/b; jac(9,1) = - (K(3,1)*(H(1,1) + beta(1,1))+K(3,2)*(H(2,1) + beta(2,1)) + K(3,3)*(H(3,1) + beta(3,1)))/b; jac(10,1) = 1.0f; gamma = gamma - 0.001f*jac*(R-b); //gamma = gamma - 0.001f*jac; } int main() { uint16_t reg = lsm.begin(); //printf("%x\n", reg); if (!lps.init()){ printf("Failed to autodetect pressure sensor!\r\n"); while (1); } lps.enableDefault(); //初期値 R = 1.0f; gamma(1,1) = 1.0f; gamma(4,1) = 1.0f; gamma(6,1) = 1.0f; setBetaK(); wait_ms(100); while(true) { lsm.readAccel(); lsm.readMag(); lsm.readGyro(); //printf("%f %f %f %f %f %f %f %f %f\r\n", lsm.ax, lsm.ay, lsm.az, lsm.gx, lsm.gy, lsm.gz, lsm.mx, lsm.my, lsm.mz); //printf("%f %f %f\r\n", lsm.gx, lsm.gy, lsm.gz); //printf("%f %f %f\r\n", lsm.mx, lsm.my, lsm.mz); float pressure = lps.readPressureMillibars(); float altitude = lps.pressureToAltitudeMeters(pressure); float temperature = lps.readTemperatureC(); Matrix h(3,1); h << lsm.mx << lsm.my << lsm.mz; Matrix hmod = K*(h+beta); float res = R*R-(hmod(1,1)*hmod(1,1)+hmod(2,1)*hmod(2,1)+hmod(3,1)*hmod(3,1)); if(abs(res) >0.01f){ calcMagCalUpdate(h); setBetaK(); } //printf("p:%.2f\t mbar\ta:%.2f m\tt:%.2f deg C\r\n",pressure,altitude,temperature); printf("%f %f %f %f %f %f %f %f %f %f %f %f %f %f\r\n", hmod(1,1),hmod(2,1),hmod(3,1),res,gamma(1,1),gamma(2,1),gamma(3,1),gamma(4,1),gamma(5,1),gamma(6,1),gamma(7,1),gamma(8,1),gamma(9,1),gamma(10,1)); wait(0.005); } }