solaESKF_EIGEN
Dependencies: mbed LPS25HB_I2C LSM9DS1 PIDcontroller LoopTicker GPSUBX_UART_Eigen SBUS_without_mainfile MedianFilter Eigen UsaPack solaESKF_Eigen Vector3 CalibrateMagneto FastPWM
main.cpp@54:ca88777b295a, 2021-05-31 (annotated)
- Committer:
- cocorlow
- Date:
- Mon May 31 07:15:52 2021 +0000
- Revision:
- 54:ca88777b295a
- Parent:
- 53:3a6dfb55e087
- Child:
- 56:888379912f81
ekf
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cocorlow | 54:ca88777b295a | 1 | //#include "mbed.h" |
cocorlow | 54:ca88777b295a | 2 | //#include "PIDcontroller.h" |
cocorlow | 54:ca88777b295a | 3 | //#include "SBUS.hpp" |
cocorlow | 54:ca88777b295a | 4 | //#include "LoopTicker.hpp" |
cocorlow | 54:ca88777b295a | 5 | //#include "MPU6050.h" |
cocorlow | 54:ca88777b295a | 6 | //#include "MAG3110.h" |
cocorlow | 54:ca88777b295a | 7 | //#include "I2Cdev.h" |
cocorlow | 54:ca88777b295a | 8 | //#include "FastPWM.h" |
cocorlow | 54:ca88777b295a | 9 | //#include "Matrix.h" |
cocorlow | 54:ca88777b295a | 10 | //#include "MatrixMath.h" |
cocorlow | 54:ca88777b295a | 11 | //#include "math.h" |
cocorlow | 54:ca88777b295a | 12 | //#include "UsaPack.hpp" |
cocorlow | 54:ca88777b295a | 13 | // |
cocorlow | 54:ca88777b295a | 14 | //#define MPU6050_PWR_MGMT_1 0x6B |
cocorlow | 54:ca88777b295a | 15 | //#define MPU_ADDRESS 0x68 |
cocorlow | 54:ca88777b295a | 16 | //#define pi 3.141562 |
cocorlow | 54:ca88777b295a | 17 | //#define ACCEL_FSR MPU6050_ACCEL_FS_8 |
cocorlow | 54:ca88777b295a | 18 | //#define ACCEL_SSF 4096.0 |
cocorlow | 54:ca88777b295a | 19 | //#define GYRO_FSR MPU6050_GYRO_FS_250 |
cocorlow | 54:ca88777b295a | 20 | //#define GYRO_SSF 131.0 |
cocorlow | 54:ca88777b295a | 21 | //#define MPU6050_LPF MPU6050_DLPF_BW_256 |
cocorlow | 54:ca88777b295a | 22 | //#define gyro_th 20.0 |
cocorlow | 54:ca88777b295a | 23 | //#define PID_dt 0.015 |
cocorlow | 54:ca88777b295a | 24 | //#define servoPwmMax 1800.0 |
cocorlow | 54:ca88777b295a | 25 | //#define servoPwmMin 1200.0 |
cocorlow | 54:ca88777b295a | 26 | //#define motorPwmMax 2000.0 |
cocorlow | 54:ca88777b295a | 27 | //#define motorPwmMin 1100.0 |
cocorlow | 54:ca88777b295a | 28 | // |
cocorlow | 54:ca88777b295a | 29 | //#define N_EEPROM 11 |
cocorlow | 54:ca88777b295a | 30 | // |
cocorlow | 54:ca88777b295a | 31 | //MPU6050 accelgyro; |
cocorlow | 54:ca88777b295a | 32 | //MAG3110 mag(PB_9,PB_8); |
cocorlow | 54:ca88777b295a | 33 | //SBUS sbus(PD_5, PD_6); |
cocorlow | 54:ca88777b295a | 34 | //Serial pc(USBTX, USBRX, 115200); |
cocorlow | 54:ca88777b295a | 35 | //DigitalIn userButton(USER_BUTTON); |
cocorlow | 54:ca88777b295a | 36 | //DigitalIn locdef1(PG_2); |
cocorlow | 54:ca88777b295a | 37 | //DigitalIn locdef2(PG_3); |
cocorlow | 54:ca88777b295a | 38 | //FastPWM servo(PE_9); |
cocorlow | 54:ca88777b295a | 39 | //PID pitchPID(5.0, 0,0,PID_dt); //rad |
cocorlow | 54:ca88777b295a | 40 | //PID pitchratePID(0.5, 0.0, 0.0, PID_dt);//rad/s |
cocorlow | 54:ca88777b295a | 41 | //Timer t; |
cocorlow | 54:ca88777b295a | 42 | // |
cocorlow | 54:ca88777b295a | 43 | //Matrix qhat(4,1); |
cocorlow | 54:ca88777b295a | 44 | //Matrix qhat_gyro(4,1); |
cocorlow | 54:ca88777b295a | 45 | //Matrix Phat(4,4); |
cocorlow | 54:ca88777b295a | 46 | //Matrix Qgyro(3,3); |
cocorlow | 54:ca88777b295a | 47 | //Matrix Racc(3,3); |
cocorlow | 54:ca88777b295a | 48 | //Matrix Rmag(3,3); |
cocorlow | 54:ca88777b295a | 49 | //Matrix D(3,3); |
cocorlow | 54:ca88777b295a | 50 | // |
cocorlow | 54:ca88777b295a | 51 | //int loop_count = 0; |
cocorlow | 54:ca88777b295a | 52 | //int obs_count = 0; |
cocorlow | 54:ca88777b295a | 53 | //float att_dt = 0.01; |
cocorlow | 54:ca88777b295a | 54 | //float rc[16]; |
cocorlow | 54:ca88777b295a | 55 | //float pitch = 0.0; |
cocorlow | 54:ca88777b295a | 56 | //float roll = 0.0; |
cocorlow | 54:ca88777b295a | 57 | //float yaw = 0.0; |
cocorlow | 54:ca88777b295a | 58 | // |
cocorlow | 54:ca88777b295a | 59 | //float pitch_g = 0.0; |
cocorlow | 54:ca88777b295a | 60 | //float roll_g = 0.0; |
cocorlow | 54:ca88777b295a | 61 | //float yaw_g = 0.0; |
cocorlow | 54:ca88777b295a | 62 | // |
cocorlow | 54:ca88777b295a | 63 | //int16_t ax, ay, az; |
cocorlow | 54:ca88777b295a | 64 | //int16_t gx, gy, gz; |
cocorlow | 54:ca88777b295a | 65 | //MotionSensorDataUnits mdata; |
cocorlow | 54:ca88777b295a | 66 | //float magval[3] = {1.0,0.0,0.0}; |
cocorlow | 54:ca88777b295a | 67 | //float acc_x,acc_y,acc_z; |
cocorlow | 54:ca88777b295a | 68 | //float dynacc_x,dynacc_y,dynacc_z; |
cocorlow | 54:ca88777b295a | 69 | //float gyro_x,gyro_y,gyro_z; |
cocorlow | 54:ca88777b295a | 70 | //float mag_x,mag_y,mag_z; |
cocorlow | 54:ca88777b295a | 71 | // |
cocorlow | 54:ca88777b295a | 72 | //float LPacc_x=0.0; |
cocorlow | 54:ca88777b295a | 73 | //float LPacc_y=0.0; |
cocorlow | 54:ca88777b295a | 74 | //float LPacc_z=0.0; |
cocorlow | 54:ca88777b295a | 75 | //float LPmag_x = 0.0; |
cocorlow | 54:ca88777b295a | 76 | //float LPmag_y = 0.0; |
cocorlow | 54:ca88777b295a | 77 | //float LPmag_z = 0.0;; |
cocorlow | 54:ca88777b295a | 78 | // |
cocorlow | 54:ca88777b295a | 79 | //int out1, out2; |
cocorlow | 54:ca88777b295a | 80 | //float scaledServoOut[1]= {0}; |
cocorlow | 54:ca88777b295a | 81 | //float servoOut[1] = {1500.0}; |
cocorlow | 54:ca88777b295a | 82 | // |
cocorlow | 54:ca88777b295a | 83 | //float accnorm; |
cocorlow | 54:ca88777b295a | 84 | //float magnorm; |
cocorlow | 54:ca88777b295a | 85 | //float LPaccnorm; |
cocorlow | 54:ca88777b295a | 86 | //float LPmagnorm; |
cocorlow | 54:ca88777b295a | 87 | //float accrefnorm; |
cocorlow | 54:ca88777b295a | 88 | //float magrefnorm; |
cocorlow | 54:ca88777b295a | 89 | // |
cocorlow | 54:ca88777b295a | 90 | // |
cocorlow | 54:ca88777b295a | 91 | //float val_thmg = 0.0; |
cocorlow | 54:ca88777b295a | 92 | //float th_mg = 0.0; |
cocorlow | 54:ca88777b295a | 93 | //float dynaccnorm = 0.0; |
cocorlow | 54:ca88777b295a | 94 | //float accnormerr = 0.0; |
cocorlow | 54:ca88777b295a | 95 | //float accref[3] = {0, 0, -0.98}; |
cocorlow | 54:ca88777b295a | 96 | //float magref[3] = {0.65, 0, 0.75}; |
cocorlow | 54:ca88777b295a | 97 | // |
cocorlow | 54:ca88777b295a | 98 | //int calibrationFlag = 0; |
cocorlow | 54:ca88777b295a | 99 | //int pos_tail = 1;//1:left 2:center 3:right |
cocorlow | 54:ca88777b295a | 100 | //int agoffset[6] = {0, 0, 0, 386, -450, 48}; |
cocorlow | 54:ca88777b295a | 101 | //float magbias[4] = {-215.833374, 207.740616, -167.444565, 36.688690}; |
cocorlow | 54:ca88777b295a | 102 | //float pitch_align = 0.0*3.141562/180.0; |
cocorlow | 54:ca88777b295a | 103 | //float roll_align = 0.0*3.141562/180.0; |
cocorlow | 54:ca88777b295a | 104 | //// eepromのread writeのためのunionを定義 |
cocorlow | 54:ca88777b295a | 105 | //int address = 0xAE; // EEPROMの3つの入力が全て+より |
cocorlow | 54:ca88777b295a | 106 | //int pointeraddress = 0; |
cocorlow | 54:ca88777b295a | 107 | // |
cocorlow | 54:ca88777b295a | 108 | //I2C i2c(PB_9,PB_8); // sda, scl |
cocorlow | 54:ca88777b295a | 109 | //union U{ |
cocorlow | 54:ca88777b295a | 110 | // int i[N_EEPROM]; // 0: flag(>1で正常に書き込まれた状態) 1 ~ 3: 磁場の中心座標, 4: 磁場の半径、 5~7; mag, 8~10: acc bias |
cocorlow | 54:ca88777b295a | 111 | // char c[N_EEPROM*4]; // floatはcharの4倍 |
cocorlow | 54:ca88777b295a | 112 | //}; |
cocorlow | 54:ca88777b295a | 113 | // |
cocorlow | 54:ca88777b295a | 114 | //// UsaPack |
cocorlow | 54:ca88777b295a | 115 | //UsaPack tail(PG_14, PG_9, 115200); |
cocorlow | 54:ca88777b295a | 116 | //int tail_address = 0; |
cocorlow | 54:ca88777b295a | 117 | //struct valuePack |
cocorlow | 54:ca88777b295a | 118 | //{ |
cocorlow | 54:ca88777b295a | 119 | // float dt; |
cocorlow | 54:ca88777b295a | 120 | // int count; |
cocorlow | 54:ca88777b295a | 121 | // float acc[3]; |
cocorlow | 54:ca88777b295a | 122 | // float gyro[3]; |
cocorlow | 54:ca88777b295a | 123 | // float mag[3]; |
cocorlow | 54:ca88777b295a | 124 | // float rot[3]; |
cocorlow | 54:ca88777b295a | 125 | // float rot_g[3]; |
cocorlow | 54:ca88777b295a | 126 | //}; |
cocorlow | 54:ca88777b295a | 127 | //valuePack vp; |
cocorlow | 54:ca88777b295a | 128 | // |
cocorlow | 54:ca88777b295a | 129 | // |
cocorlow | 54:ca88777b295a | 130 | //void writeSdcard() |
cocorlow | 54:ca88777b295a | 131 | //{ |
cocorlow | 54:ca88777b295a | 132 | // //magcal.getExtremes(&magmin[0],&magmax[0]); |
cocorlow | 54:ca88777b295a | 133 | // //pc.printf("%f %f %f %f %f %f\r\n",magmin[0],magmin[1],magmin[2],magmax[0],magmax[1],magmax[2]); |
cocorlow | 54:ca88777b295a | 134 | // //pc.printf("%f %f %f %f %f %f %f %f %f %f %f %f \r\n",acc_x,acc_y,acc_z,mag_x,mag_y,mag_z,accref[0],accref[1],accref[2],magref[0],magref[1],magref[2]); |
cocorlow | 54:ca88777b295a | 135 | //// sd.printf("%f %d %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\r\n",1.0/att_dt,obs_count,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,mag_x,mag_y,mag_z,roll*180.0f/pi,pitch*180.0f/pi,yaw*180.0f/pi,roll_g*180.0f/pi,pitch_g*180.0f/pi,yaw_g*180.0f/pi); |
cocorlow | 54:ca88777b295a | 136 | // //pc.printf("%f %f %f %f %f %f\r\n",roll*180.0f/pi,pitch*180.0f/pi,yaw*180.0f/pi,roll_g*180.0f/pi,pitch_g*180.0f/pi,yaw_g*180.0f/pi); |
cocorlow | 54:ca88777b295a | 137 | // //pc.printf("%f %f %f %f : %f %f %f\r\n",float(obs_count)/100.0,th_mg,dynaccnorm,accnormerr,roll*180.0f/pi,pitch*180.0f/pi,yaw*180.0f/pi); |
cocorlow | 54:ca88777b295a | 138 | // //pc.printf("%d \r\n",userButton.read()); |
cocorlow | 54:ca88777b295a | 139 | // //pc.printf("%f %f %f %f %f %f\r\n",gyro_x*180.0f/pi,gyro_y*180.0f/pi,gyro_z*180.0f/pi,roll*180.0f/pi,pitch*180.0f/pi,yaw*180.0f/pi); |
cocorlow | 54:ca88777b295a | 140 | // //pc.printf("%f %f %f\r\n",roll*180.0f/pi,pitch*180.0f/pi,yaw*180.0f/pi); |
cocorlow | 54:ca88777b295a | 141 | // //pc.printf("%f %f %f %f %f %f\r\n",dynacc_x,dynacc_y,dynacc_z,roll*180.0f/pi,pitch*180.0f/pi,yaw*180.0f/pi); |
cocorlow | 54:ca88777b295a | 142 | // //pc.printf("%f %f %f : %f %f %f\r\n",magref[0],magref[1],magref[2],mag_x,mag_y,mag_z); |
cocorlow | 54:ca88777b295a | 143 | // //pc.printf("%f %f %f %f %f : %f %f %f %f %f %f\r\n",f,magbias[0],magbias[1],magbias[2],magbias[3],magval[0],magval[1],magval[2],mdata.x,mdata.y,mdata.z); |
cocorlow | 54:ca88777b295a | 144 | // |
cocorlow | 54:ca88777b295a | 145 | // vp.dt = 1.0f/att_dt; |
cocorlow | 54:ca88777b295a | 146 | // vp.count = obs_count; |
cocorlow | 54:ca88777b295a | 147 | // vp.acc[0] = acc_x; |
cocorlow | 54:ca88777b295a | 148 | // vp.acc[1] = acc_y; |
cocorlow | 54:ca88777b295a | 149 | // vp.acc[2] = acc_z; |
cocorlow | 54:ca88777b295a | 150 | // vp.gyro[0] = gyro_x; |
cocorlow | 54:ca88777b295a | 151 | // vp.gyro[1] = gyro_y; |
cocorlow | 54:ca88777b295a | 152 | // vp.gyro[2] = gyro_z; |
cocorlow | 54:ca88777b295a | 153 | // vp.mag[0] = mag_x; |
cocorlow | 54:ca88777b295a | 154 | // vp.mag[1] = mag_y; |
cocorlow | 54:ca88777b295a | 155 | // vp.mag[2] = mag_z; |
cocorlow | 54:ca88777b295a | 156 | // vp.rot[0] = roll*180.0f/pi; |
cocorlow | 54:ca88777b295a | 157 | // vp.rot[1] = pitch*180.0f/pi; |
cocorlow | 54:ca88777b295a | 158 | // vp.rot[2] = yaw*180.0f/pi; |
cocorlow | 54:ca88777b295a | 159 | // vp.rot_g[0] = roll_g*180.0f/pi; |
cocorlow | 54:ca88777b295a | 160 | // vp.rot_g[1] = pitch_g*180.0f/pi; |
cocorlow | 54:ca88777b295a | 161 | // vp.rot_g[2] = yaw_g*180.0f/pi; |
cocorlow | 54:ca88777b295a | 162 | // tail.Send(tail_address, &vp); |
cocorlow | 54:ca88777b295a | 163 | //// pc.printf("%f %d %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\r\n",1.0/att_dt,obs_count,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,mag_x,mag_y,mag_z,roll*180.0f/pi,pitch*180.0f/pi,yaw*180.0f/pi,roll_g*180.0f/pi,pitch_g*180.0f/pi,yaw_g*180.0f/pi); |
cocorlow | 54:ca88777b295a | 164 | // |
cocorlow | 54:ca88777b295a | 165 | //} |
cocorlow | 54:ca88777b295a | 166 | // |
cocorlow | 54:ca88777b295a | 167 | //// eeprom書き込み・読み込みに必要な関数 |
cocorlow | 54:ca88777b295a | 168 | //void writeEEPROM(int address, unsigned int eeaddress, char *data, int size) |
cocorlow | 54:ca88777b295a | 169 | //{ |
cocorlow | 54:ca88777b295a | 170 | // char i2cBuffer[size + 2]; |
cocorlow | 54:ca88777b295a | 171 | // i2cBuffer[0] = (unsigned char)(eeaddress >> 8); // MSB |
cocorlow | 54:ca88777b295a | 172 | // i2cBuffer[1] = (unsigned char)(eeaddress & 0xFF); // LSB |
cocorlow | 54:ca88777b295a | 173 | // |
cocorlow | 54:ca88777b295a | 174 | // for (int i = 0; i < size; i++) { |
cocorlow | 54:ca88777b295a | 175 | // i2cBuffer[i + 2] = data[i]; |
cocorlow | 54:ca88777b295a | 176 | // } |
cocorlow | 54:ca88777b295a | 177 | // |
cocorlow | 54:ca88777b295a | 178 | // int result = i2c.write(address, i2cBuffer, size + 2, false); |
cocorlow | 54:ca88777b295a | 179 | // //sleep_ms(500); |
cocorlow | 54:ca88777b295a | 180 | //} |
cocorlow | 54:ca88777b295a | 181 | // |
cocorlow | 54:ca88777b295a | 182 | //// this function has no read limit |
cocorlow | 54:ca88777b295a | 183 | //void readEEPROM(int address, unsigned int eeaddress, char *data, int size) |
cocorlow | 54:ca88777b295a | 184 | //{ |
cocorlow | 54:ca88777b295a | 185 | // char i2cBuffer[2]; |
cocorlow | 54:ca88777b295a | 186 | // i2cBuffer[0] = (unsigned char)(eeaddress >> 8); // MSB |
cocorlow | 54:ca88777b295a | 187 | // i2cBuffer[1] = (unsigned char)(eeaddress & 0xFF); // LSB |
cocorlow | 54:ca88777b295a | 188 | // |
cocorlow | 54:ca88777b295a | 189 | // // Reset eeprom pointer address |
cocorlow | 54:ca88777b295a | 190 | // int result = i2c.write(address, i2cBuffer, 2, false); |
cocorlow | 54:ca88777b295a | 191 | // |
cocorlow | 54:ca88777b295a | 192 | // //sleep_ms(500); |
cocorlow | 54:ca88777b295a | 193 | // |
cocorlow | 54:ca88777b295a | 194 | // // Read eeprom |
cocorlow | 54:ca88777b295a | 195 | // i2c.read(address, data, size); |
cocorlow | 54:ca88777b295a | 196 | // //sleep_ms(500); |
cocorlow | 54:ca88777b295a | 197 | //} |
cocorlow | 54:ca88777b295a | 198 | // |
cocorlow | 54:ca88777b295a | 199 | //float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) |
cocorlow | 54:ca88777b295a | 200 | //{ |
cocorlow | 54:ca88777b295a | 201 | // return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; |
cocorlow | 54:ca88777b295a | 202 | //} |
cocorlow | 54:ca88777b295a | 203 | // |
cocorlow | 54:ca88777b295a | 204 | //void calcMagRef(float mx, float my, float mz){ |
cocorlow | 54:ca88777b295a | 205 | // |
cocorlow | 54:ca88777b295a | 206 | // Matrix magvec(3,1); |
cocorlow | 54:ca88777b295a | 207 | // magvec << mx << my << mz; |
cocorlow | 54:ca88777b295a | 208 | // Matrix magnedvec = MatrixMath::Transpose(D)*magvec; |
cocorlow | 54:ca88777b295a | 209 | // magref[0] = sqrt(magnedvec(1,1)*magnedvec(1,1)+magnedvec(2,1)*magnedvec(2,1)); |
cocorlow | 54:ca88777b295a | 210 | // magref[1] = 0.0; |
cocorlow | 54:ca88777b295a | 211 | // magref[2] = magnedvec(3,1); |
cocorlow | 54:ca88777b295a | 212 | //} |
cocorlow | 54:ca88777b295a | 213 | // |
cocorlow | 54:ca88777b295a | 214 | // |
cocorlow | 54:ca88777b295a | 215 | //void getIMUval(){ |
cocorlow | 54:ca88777b295a | 216 | // // gx gy gz ax ay az |
cocorlow | 54:ca88777b295a | 217 | // accelgyro.getMotion6(&ay, &ax, &az, &gy, &gx, &gz); |
cocorlow | 54:ca88777b295a | 218 | // ax = ax - agoffset[0]; |
cocorlow | 54:ca88777b295a | 219 | // ay = ay - agoffset[1]; |
cocorlow | 54:ca88777b295a | 220 | // az = -az - agoffset[2]; |
cocorlow | 54:ca88777b295a | 221 | // gx = gx - agoffset[3]; |
cocorlow | 54:ca88777b295a | 222 | // gy = gy - agoffset[4]; |
cocorlow | 54:ca88777b295a | 223 | // gz = -gz - agoffset[5]; |
cocorlow | 54:ca88777b295a | 224 | // // 加速度値を分解能で割って加速度(G)に変換する |
cocorlow | 54:ca88777b295a | 225 | // acc_x = float(ax) / ACCEL_SSF; //FS_SEL_0 16,384 LSB / g |
cocorlow | 54:ca88777b295a | 226 | // acc_y = float(ay) / ACCEL_SSF; |
cocorlow | 54:ca88777b295a | 227 | // acc_z = float(az) / ACCEL_SSF; |
cocorlow | 54:ca88777b295a | 228 | // // 角速度値を分解能で割って角速度(rad per sec)に変換する |
cocorlow | 54:ca88777b295a | 229 | // gyro_x = float(gx) / GYRO_SSF * 0.0174533f; // (rad/s) |
cocorlow | 54:ca88777b295a | 230 | // gyro_y = float(gy) / GYRO_SSF * 0.0174533f; |
cocorlow | 54:ca88777b295a | 231 | // gyro_z = float(gz) / GYRO_SSF * 0.0174533f; |
cocorlow | 54:ca88777b295a | 232 | // mag.getAxis(mdata); // flush the magnetmeter |
cocorlow | 54:ca88777b295a | 233 | // magval[0] = (mdata.x - magbias[0]); |
cocorlow | 54:ca88777b295a | 234 | // magval[1] = (mdata.y - magbias[1]); |
cocorlow | 54:ca88777b295a | 235 | // magval[2] = (mdata.z - magbias[2]); |
cocorlow | 54:ca88777b295a | 236 | // mag_x = -magval[0]/magbias[3]; |
cocorlow | 54:ca88777b295a | 237 | // mag_y = -magval[1]/magbias[3]; |
cocorlow | 54:ca88777b295a | 238 | // mag_z = -magval[2]/magbias[3]; |
cocorlow | 54:ca88777b295a | 239 | // |
cocorlow | 54:ca88777b295a | 240 | // float lpc_acc = 0.15; |
cocorlow | 54:ca88777b295a | 241 | // LPacc_x = lpc_acc*acc_x+(1.0-lpc_acc)*LPacc_x; |
cocorlow | 54:ca88777b295a | 242 | // LPacc_y = lpc_acc*acc_y+(1.0-lpc_acc)*LPacc_y; |
cocorlow | 54:ca88777b295a | 243 | // LPacc_z = lpc_acc*acc_z+(1.0-lpc_acc)*LPacc_z; |
cocorlow | 54:ca88777b295a | 244 | // |
cocorlow | 54:ca88777b295a | 245 | // float lpc_mag = 0.15; |
cocorlow | 54:ca88777b295a | 246 | // LPmag_x = lpc_mag*mag_x+(1.0-lpc_mag)*LPmag_x; |
cocorlow | 54:ca88777b295a | 247 | // LPmag_y = lpc_mag*mag_y+(1.0-lpc_mag)*LPmag_y; |
cocorlow | 54:ca88777b295a | 248 | // LPmag_z = lpc_mag*mag_z+(1.0-lpc_mag)*LPmag_z; |
cocorlow | 54:ca88777b295a | 249 | // |
cocorlow | 54:ca88777b295a | 250 | // accnorm = sqrt(acc_x*acc_x+acc_y*acc_y+acc_z*acc_z); |
cocorlow | 54:ca88777b295a | 251 | // magnorm = sqrt(mag_x*mag_x+mag_y*mag_y+mag_z*mag_z); |
cocorlow | 54:ca88777b295a | 252 | // LPaccnorm = sqrt(LPacc_x*LPacc_x+LPacc_y*LPacc_y+LPacc_z*LPacc_z); |
cocorlow | 54:ca88777b295a | 253 | // LPmagnorm = sqrt(LPmag_x*LPmag_x+LPmag_y*LPmag_y+LPmag_z*LPmag_z); |
cocorlow | 54:ca88777b295a | 254 | // accrefnorm = sqrt(accref[0]*accref[0]+accref[1]*accref[1]+accref[2]*accref[2]); |
cocorlow | 54:ca88777b295a | 255 | // magrefnorm = sqrt(magref[0]*magref[0]+magref[1]*magref[1]+magref[2]*magref[2]); |
cocorlow | 54:ca88777b295a | 256 | // calcMagRef(LPmag_x/LPmagnorm, LPmag_y/LPmagnorm, LPmag_z/LPmagnorm); |
cocorlow | 54:ca88777b295a | 257 | // |
cocorlow | 54:ca88777b295a | 258 | // |
cocorlow | 54:ca88777b295a | 259 | //} |
cocorlow | 54:ca88777b295a | 260 | // |
cocorlow | 54:ca88777b295a | 261 | //void updateBetweenMeasures(){ |
cocorlow | 54:ca88777b295a | 262 | // float q0 = qhat.getNumber( 1, 1 ); |
cocorlow | 54:ca88777b295a | 263 | // float q1 = qhat.getNumber( 2, 1 ); |
cocorlow | 54:ca88777b295a | 264 | // float q2 = qhat.getNumber( 3, 1 ); |
cocorlow | 54:ca88777b295a | 265 | // float q3 = qhat.getNumber( 4, 1 ); |
cocorlow | 54:ca88777b295a | 266 | // |
cocorlow | 54:ca88777b295a | 267 | // Matrix B(4,3); |
cocorlow | 54:ca88777b295a | 268 | // B << q1 << q2 << q3 |
cocorlow | 54:ca88777b295a | 269 | // <<-q0 << q3 <<-q2 |
cocorlow | 54:ca88777b295a | 270 | // <<-q3 <<-q0 << q1 |
cocorlow | 54:ca88777b295a | 271 | // << q2 <<-q1 <<-q0; |
cocorlow | 54:ca88777b295a | 272 | // B *= 0.5f; |
cocorlow | 54:ca88777b295a | 273 | // |
cocorlow | 54:ca88777b295a | 274 | // Matrix phi(4,4); |
cocorlow | 54:ca88777b295a | 275 | // phi << 1.0 << -gyro_x*0.5*att_dt <<-gyro_y*0.5*att_dt <<-gyro_z*0.5*att_dt |
cocorlow | 54:ca88777b295a | 276 | // << gyro_x*0.5*att_dt << 1.0 << gyro_z*0.5*att_dt <<-gyro_y*0.5*att_dt |
cocorlow | 54:ca88777b295a | 277 | // << gyro_y*0.5*att_dt << -gyro_z*0.5*att_dt << 1.0 << gyro_x*0.5*att_dt |
cocorlow | 54:ca88777b295a | 278 | // << gyro_z*0.5*att_dt << gyro_y*0.5*att_dt <<-gyro_x*0.5*att_dt << 1.0; |
cocorlow | 54:ca88777b295a | 279 | // |
cocorlow | 54:ca88777b295a | 280 | // qhat = phi*qhat; |
cocorlow | 54:ca88777b295a | 281 | // float qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qhat),qhat)); |
cocorlow | 54:ca88777b295a | 282 | // qhat *= (1.0f/ qnorm); |
cocorlow | 54:ca88777b295a | 283 | // |
cocorlow | 54:ca88777b295a | 284 | // qhat_gyro = phi*qhat_gyro; |
cocorlow | 54:ca88777b295a | 285 | // qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qhat_gyro),qhat_gyro)); |
cocorlow | 54:ca88777b295a | 286 | // qhat_gyro *= (1.0f/ qnorm); |
cocorlow | 54:ca88777b295a | 287 | // |
cocorlow | 54:ca88777b295a | 288 | // Phat = phi*Phat*MatrixMath::Transpose(phi)+B*Qgyro*MatrixMath::Transpose(B); |
cocorlow | 54:ca88777b295a | 289 | // |
cocorlow | 54:ca88777b295a | 290 | // q0 = qhat.getNumber( 1, 1 ); |
cocorlow | 54:ca88777b295a | 291 | // q1 = qhat.getNumber( 2, 1 ); |
cocorlow | 54:ca88777b295a | 292 | // q2 = qhat.getNumber( 3, 1 ); |
cocorlow | 54:ca88777b295a | 293 | // q3 = qhat.getNumber( 4, 1 ); |
cocorlow | 54:ca88777b295a | 294 | // |
cocorlow | 54:ca88777b295a | 295 | // D.add(1,1,q0*q0 + q1*q1 - q2*q2 - q3*q3); |
cocorlow | 54:ca88777b295a | 296 | // D.add(1,2,2*(q1*q2 + q0*q3)); |
cocorlow | 54:ca88777b295a | 297 | // D.add(1,3,2*(q1*q3 - q0*q2)); |
cocorlow | 54:ca88777b295a | 298 | // D.add(2,1,2*(q1*q2 - q0*q3)); |
cocorlow | 54:ca88777b295a | 299 | // D.add(2,2,q0*q0 - q1*q1 + q2*q2 - q3*q3); |
cocorlow | 54:ca88777b295a | 300 | // D.add(2,3,2*(q2*q3 + q0*q1)); |
cocorlow | 54:ca88777b295a | 301 | // D.add(3,1,2*(q1*q3 + q0*q2)); |
cocorlow | 54:ca88777b295a | 302 | // D.add(3,2,2*(q2*q3 - q0*q1)); |
cocorlow | 54:ca88777b295a | 303 | // D.add(3,3,q0*q0 - q1*q1 - q2*q2 + q3*q3); |
cocorlow | 54:ca88777b295a | 304 | // |
cocorlow | 54:ca88777b295a | 305 | //} |
cocorlow | 54:ca88777b295a | 306 | // |
cocorlow | 54:ca88777b295a | 307 | //void updateAcrossMeasures(float v1,float v2, float v3, float u1, float u2, float u3, Matrix R){ |
cocorlow | 54:ca88777b295a | 308 | // |
cocorlow | 54:ca88777b295a | 309 | // Matrix u(3,1); |
cocorlow | 54:ca88777b295a | 310 | // Matrix v(3,1); |
cocorlow | 54:ca88777b295a | 311 | // |
cocorlow | 54:ca88777b295a | 312 | // u << u1 << u2 <<u3; |
cocorlow | 54:ca88777b295a | 313 | // v << v1 << v2 <<v3; |
cocorlow | 54:ca88777b295a | 314 | // |
cocorlow | 54:ca88777b295a | 315 | // float q0 = qhat.getNumber( 1, 1 ); |
cocorlow | 54:ca88777b295a | 316 | // float q1 = qhat.getNumber( 2, 1 ); |
cocorlow | 54:ca88777b295a | 317 | // float q2 = qhat.getNumber( 3, 1 ); |
cocorlow | 54:ca88777b295a | 318 | // float q3 = qhat.getNumber( 4, 1 ); |
cocorlow | 54:ca88777b295a | 319 | // |
cocorlow | 54:ca88777b295a | 320 | // Matrix A1(3,3); |
cocorlow | 54:ca88777b295a | 321 | // A1 << q0 << q3 << -q2 |
cocorlow | 54:ca88777b295a | 322 | // <<-q3 << q0 << q1 |
cocorlow | 54:ca88777b295a | 323 | // <<q2 <<-q1 <<q0; |
cocorlow | 54:ca88777b295a | 324 | // A1 *= 2.0f; |
cocorlow | 54:ca88777b295a | 325 | // |
cocorlow | 54:ca88777b295a | 326 | // Matrix A2(3,3); |
cocorlow | 54:ca88777b295a | 327 | // A2 << q1 << q2 << q3 |
cocorlow | 54:ca88777b295a | 328 | // << q2 <<-q1 << q0 |
cocorlow | 54:ca88777b295a | 329 | // << q3 <<-q0 <<-q1; |
cocorlow | 54:ca88777b295a | 330 | // A2 *= 2.0f; |
cocorlow | 54:ca88777b295a | 331 | // |
cocorlow | 54:ca88777b295a | 332 | // Matrix A3(3,3); |
cocorlow | 54:ca88777b295a | 333 | // A3 <<-q2 << q1 <<-q0 |
cocorlow | 54:ca88777b295a | 334 | // << q1 << q2 << q3 |
cocorlow | 54:ca88777b295a | 335 | // << q0 << q3 <<-q2; |
cocorlow | 54:ca88777b295a | 336 | // A3 *= 2.0f; |
cocorlow | 54:ca88777b295a | 337 | // |
cocorlow | 54:ca88777b295a | 338 | // Matrix A4(3,3); |
cocorlow | 54:ca88777b295a | 339 | // A4 <<-q3 << q0 << q1 |
cocorlow | 54:ca88777b295a | 340 | // <<-q0 <<-q3 << q2 |
cocorlow | 54:ca88777b295a | 341 | // << q1 << q2 << q3; |
cocorlow | 54:ca88777b295a | 342 | // A4 *= 2.0f; |
cocorlow | 54:ca88777b295a | 343 | // |
cocorlow | 54:ca88777b295a | 344 | // Matrix H(3,4); |
cocorlow | 54:ca88777b295a | 345 | // |
cocorlow | 54:ca88777b295a | 346 | // Matrix ab1(A1*u); |
cocorlow | 54:ca88777b295a | 347 | // Matrix ab2(A2*u); |
cocorlow | 54:ca88777b295a | 348 | // Matrix ab3(A3*u); |
cocorlow | 54:ca88777b295a | 349 | // Matrix ab4(A4*u); |
cocorlow | 54:ca88777b295a | 350 | // |
cocorlow | 54:ca88777b295a | 351 | // H << ab1.getNumber( 1, 1 ) << ab2.getNumber( 1, 1 ) << ab3.getNumber( 1, 1 ) << ab4.getNumber( 1, 1 ) |
cocorlow | 54:ca88777b295a | 352 | // << ab1.getNumber( 2, 1 ) << ab2.getNumber( 2, 1 ) << ab3.getNumber( 2, 1 ) << ab4.getNumber( 2, 1 ) |
cocorlow | 54:ca88777b295a | 353 | // << ab1.getNumber( 3, 1 ) << ab2.getNumber( 3, 1 ) << ab3.getNumber( 3, 1 ) << ab4.getNumber( 3, 1 ); |
cocorlow | 54:ca88777b295a | 354 | // |
cocorlow | 54:ca88777b295a | 355 | // |
cocorlow | 54:ca88777b295a | 356 | // Matrix K(4,3); |
cocorlow | 54:ca88777b295a | 357 | // K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R); |
cocorlow | 54:ca88777b295a | 358 | // |
cocorlow | 54:ca88777b295a | 359 | // Matrix dq(4,1); |
cocorlow | 54:ca88777b295a | 360 | // dq = K*(v-D*u); |
cocorlow | 54:ca88777b295a | 361 | // qhat = qhat+dq; |
cocorlow | 54:ca88777b295a | 362 | // |
cocorlow | 54:ca88777b295a | 363 | // float qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qhat),qhat)); |
cocorlow | 54:ca88777b295a | 364 | // qhat *= (1.0f/ qnorm); |
cocorlow | 54:ca88777b295a | 365 | // |
cocorlow | 54:ca88777b295a | 366 | // Matrix eye4(4,4); |
cocorlow | 54:ca88777b295a | 367 | // eye4 << 1 << 0 << 0 << 0 |
cocorlow | 54:ca88777b295a | 368 | // << 0 << 1 << 0 << 0 |
cocorlow | 54:ca88777b295a | 369 | // << 0 << 0 << 1 << 0 |
cocorlow | 54:ca88777b295a | 370 | // << 0 << 0 << 0 << 1; |
cocorlow | 54:ca88777b295a | 371 | // Phat = (eye4-K*H)*Phat*MatrixMath::Transpose(eye4-K*H)+K*R*MatrixMath::Transpose(K); |
cocorlow | 54:ca88777b295a | 372 | //} |
cocorlow | 54:ca88777b295a | 373 | // |
cocorlow | 54:ca88777b295a | 374 | //void computeAngles() |
cocorlow | 54:ca88777b295a | 375 | //{ |
cocorlow | 54:ca88777b295a | 376 | // float q0 = qhat.getNumber( 1, 1 ); |
cocorlow | 54:ca88777b295a | 377 | // float q1 = qhat.getNumber( 2, 1 ); |
cocorlow | 54:ca88777b295a | 378 | // float q2 = qhat.getNumber( 3, 1 ); |
cocorlow | 54:ca88777b295a | 379 | // float q3 = qhat.getNumber( 4, 1 ); |
cocorlow | 54:ca88777b295a | 380 | // roll = atan2f(q0*q1 + q2*q3, 0.5f - q1*q1 - q2*q2)-roll_align; |
cocorlow | 54:ca88777b295a | 381 | // pitch = asinf(-2.0f * (q1*q3 - q0*q2))-pitch_align; |
cocorlow | 54:ca88777b295a | 382 | // yaw = atan2f(q1*q2 + q0*q3, 0.5f - q2*q2 - q3*q3); |
cocorlow | 54:ca88777b295a | 383 | // |
cocorlow | 54:ca88777b295a | 384 | // q0 = qhat_gyro.getNumber( 1, 1 ); |
cocorlow | 54:ca88777b295a | 385 | // q1 = qhat_gyro.getNumber( 2, 1 ); |
cocorlow | 54:ca88777b295a | 386 | // q2 = qhat_gyro.getNumber( 3, 1 ); |
cocorlow | 54:ca88777b295a | 387 | // q3 = qhat_gyro.getNumber( 4, 1 ); |
cocorlow | 54:ca88777b295a | 388 | // roll_g = atan2f(q0*q1 + q2*q3, 0.5f - q1*q1 - q2*q2)-roll_align; |
cocorlow | 54:ca88777b295a | 389 | // pitch_g = asinf(-2.0f * (q1*q3 - q0*q2))-pitch_align; |
cocorlow | 54:ca88777b295a | 390 | // yaw_g = atan2f(q1*q2 + q0*q3, 0.5f - q2*q2 - q3*q3); |
cocorlow | 54:ca88777b295a | 391 | // |
cocorlow | 54:ca88777b295a | 392 | //} |
cocorlow | 54:ca88777b295a | 393 | // |
cocorlow | 54:ca88777b295a | 394 | //void triad(float fb1,float fb2, float fb3, float fn1, float fn2, float fn3,float mb1,float mb2, float mb3, float mn1, float mn2, float mn3){ |
cocorlow | 54:ca88777b295a | 395 | // Matrix W1(3,1); |
cocorlow | 54:ca88777b295a | 396 | // W1 << fb1 << fb2<< fb3; |
cocorlow | 54:ca88777b295a | 397 | // Matrix W2(3,1); |
cocorlow | 54:ca88777b295a | 398 | // W2 << mb1 << mb2<< mb3; |
cocorlow | 54:ca88777b295a | 399 | // |
cocorlow | 54:ca88777b295a | 400 | // Matrix V1(3,1); |
cocorlow | 54:ca88777b295a | 401 | // V1 << fn1 << fn2<< fn3; |
cocorlow | 54:ca88777b295a | 402 | // Matrix V2(3,1); |
cocorlow | 54:ca88777b295a | 403 | // V2 << mn1 << mn2<< mn3; |
cocorlow | 54:ca88777b295a | 404 | // |
cocorlow | 54:ca88777b295a | 405 | // |
cocorlow | 54:ca88777b295a | 406 | // Matrix Ou2(3,1); |
cocorlow | 54:ca88777b295a | 407 | // Ou2 << W1.getNumber( 2, 1 )*W2.getNumber( 3, 1 )-W1.getNumber( 3, 1 )*W2.getNumber( 2, 1 ) << W1.getNumber( 3, 1 )*W2.getNumber( 1, 1 )-W1.getNumber( 1, 1 )*W2.getNumber( 3, 1 ) << W1.getNumber( 1, 1 )*W2.getNumber( 2, 1 )-W1.getNumber( 2, 1 )*W2.getNumber( 1, 1 ); |
cocorlow | 54:ca88777b295a | 408 | // Ou2 *= 1.0/sqrt(MatrixMath::dot(MatrixMath::Transpose(Ou2),Ou2)); |
cocorlow | 54:ca88777b295a | 409 | // Matrix Ou3(3,1); |
cocorlow | 54:ca88777b295a | 410 | // Ou3 << W1.getNumber( 2, 1 )*Ou2.getNumber( 3, 1 )-W1.getNumber( 3, 1 )*Ou2.getNumber( 2, 1 ) << W1.getNumber( 3, 1 )*Ou2.getNumber( 1, 1 )-W1.getNumber( 1, 1 )*Ou2.getNumber( 3, 1 ) << W1.getNumber( 1, 1 )*Ou2.getNumber( 2, 1 )-W1.getNumber( 2, 1 )*Ou2.getNumber( 1, 1 ); |
cocorlow | 54:ca88777b295a | 411 | // Ou3 *= 1.0/sqrt(MatrixMath::dot(MatrixMath::Transpose(Ou3),Ou3)); |
cocorlow | 54:ca88777b295a | 412 | // Matrix R2(3,1); |
cocorlow | 54:ca88777b295a | 413 | // R2 << V1.getNumber( 2, 1 )*V2.getNumber( 3, 1 )-V1.getNumber( 3, 1 )*V2.getNumber( 2, 1 ) << V1.getNumber( 3, 1 )*V2.getNumber( 1, 1 )-V1.getNumber( 1, 1 )*V2.getNumber( 3, 1 ) << V1.getNumber( 1, 1 )*V2.getNumber( 2, 1 )-V1.getNumber( 2, 1 )*V2.getNumber( 1, 1 ); |
cocorlow | 54:ca88777b295a | 414 | // R2 *= 1.0/sqrt(MatrixMath::dot(MatrixMath::Transpose(R2),R2)); |
cocorlow | 54:ca88777b295a | 415 | // Matrix R3(3,1); |
cocorlow | 54:ca88777b295a | 416 | // R3 << V1.getNumber( 2, 1 )*R2.getNumber( 3, 1 )-V1.getNumber( 3, 1 )*R2.getNumber( 2, 1 ) << V1.getNumber( 3, 1 )*R2.getNumber( 1, 1 )-V1.getNumber( 1, 1 )*R2.getNumber( 3, 1 ) << V1.getNumber( 1, 1 )*R2.getNumber( 2, 1 )-V1.getNumber( 2, 1 )*R2.getNumber( 1, 1 ); |
cocorlow | 54:ca88777b295a | 417 | // R3 *= 1.0/sqrt(MatrixMath::dot(MatrixMath::Transpose(R3),R3)); |
cocorlow | 54:ca88777b295a | 418 | // |
cocorlow | 54:ca88777b295a | 419 | // Matrix Mou(3,3); |
cocorlow | 54:ca88777b295a | 420 | // Mou << W1.getNumber( 1, 1 ) << Ou2.getNumber( 1, 1 ) << Ou3.getNumber( 1, 1 ) |
cocorlow | 54:ca88777b295a | 421 | // << W1.getNumber( 2, 1 ) << Ou2.getNumber( 2, 1 ) << Ou3.getNumber( 2, 1 ) |
cocorlow | 54:ca88777b295a | 422 | // << W1.getNumber( 3, 1 ) << Ou2.getNumber( 3, 1 ) << Ou3.getNumber( 3, 1 ); |
cocorlow | 54:ca88777b295a | 423 | // Matrix Mr(3,3); |
cocorlow | 54:ca88777b295a | 424 | // Mr << V1.getNumber( 1, 1 ) << R2.getNumber( 1, 1 ) << R3.getNumber( 1, 1 ) |
cocorlow | 54:ca88777b295a | 425 | // << V1.getNumber( 2, 1 ) << R2.getNumber( 2, 1 ) << R3.getNumber( 2, 1 ) |
cocorlow | 54:ca88777b295a | 426 | // << V1.getNumber( 3, 1 ) << R2.getNumber( 3, 1 ) << R3.getNumber( 3, 1 ); |
cocorlow | 54:ca88777b295a | 427 | // |
cocorlow | 54:ca88777b295a | 428 | // Matrix Cbn = Mr*MatrixMath::Transpose(Mou); |
cocorlow | 54:ca88777b295a | 429 | // |
cocorlow | 54:ca88777b295a | 430 | // float sqtrp1 = sqrt(1.0+Cbn.getNumber( 1, 1 )+Cbn.getNumber( 2, 2 )+Cbn.getNumber( 3, 3 )); |
cocorlow | 54:ca88777b295a | 431 | // |
cocorlow | 54:ca88777b295a | 432 | // qhat.add(1,1,0.5*sqtrp1); |
cocorlow | 54:ca88777b295a | 433 | // qhat.add(2,1,-(Cbn.getNumber( 2, 3 )-Cbn.getNumber( 3, 2 ))/2.0/sqtrp1); |
cocorlow | 54:ca88777b295a | 434 | // qhat.add(3,1,-(Cbn.getNumber( 3, 1 )-Cbn.getNumber( 1, 3 ))/2.0/sqtrp1); |
cocorlow | 54:ca88777b295a | 435 | // qhat.add(4,1,-(Cbn.getNumber( 1, 2 )-Cbn.getNumber( 2, 1 ))/2.0/sqtrp1); |
cocorlow | 54:ca88777b295a | 436 | // |
cocorlow | 54:ca88777b295a | 437 | // float qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qhat),qhat)); |
cocorlow | 54:ca88777b295a | 438 | // qhat *= (1.0f/ qnorm); |
cocorlow | 54:ca88777b295a | 439 | // |
cocorlow | 54:ca88777b295a | 440 | // qhat_gyro = qhat; |
cocorlow | 54:ca88777b295a | 441 | // |
cocorlow | 54:ca88777b295a | 442 | // float q0 = qhat.getNumber( 1, 1 ); |
cocorlow | 54:ca88777b295a | 443 | // float q1 = qhat.getNumber( 2, 1 ); |
cocorlow | 54:ca88777b295a | 444 | // float q2 = qhat.getNumber( 3, 1 ); |
cocorlow | 54:ca88777b295a | 445 | // float q3 = qhat.getNumber( 4, 1 ); |
cocorlow | 54:ca88777b295a | 446 | // |
cocorlow | 54:ca88777b295a | 447 | // D.add(1,1,q0*q0 + q1*q1 - q2*q2 - q3*q3); |
cocorlow | 54:ca88777b295a | 448 | // D.add(1,2,2*(q1*q2 + q0*q3)); |
cocorlow | 54:ca88777b295a | 449 | // D.add(1,3,2*(q1*q3 - q0*q2)); |
cocorlow | 54:ca88777b295a | 450 | // D.add(2,1,2*(q1*q2 - q0*q3)); |
cocorlow | 54:ca88777b295a | 451 | // D.add(2,2,q0*q0 - q1*q1 + q2*q2 - q3*q3); |
cocorlow | 54:ca88777b295a | 452 | // D.add(2,3,2*(q2*q3 + q0*q1)); |
cocorlow | 54:ca88777b295a | 453 | // D.add(3,1,2*(q1*q3 + q0*q2)); |
cocorlow | 54:ca88777b295a | 454 | // D.add(3,2,2*(q2*q3 - q0*q1)); |
cocorlow | 54:ca88777b295a | 455 | // D.add(3,3,q0*q0 - q1*q1 - q2*q2 + q3*q3); |
cocorlow | 54:ca88777b295a | 456 | // |
cocorlow | 54:ca88777b295a | 457 | //} |
cocorlow | 54:ca88777b295a | 458 | // |
cocorlow | 54:ca88777b295a | 459 | //void calcDynAcc(){ |
cocorlow | 54:ca88777b295a | 460 | // dynacc_x = LPacc_x-(D.getNumber( 1, 1 )*accref[0]+D.getNumber( 1, 2 )*accref[1]+D.getNumber( 1, 3 )*accref[2]); |
cocorlow | 54:ca88777b295a | 461 | // dynacc_y = LPacc_y-(D.getNumber( 2, 1 )*accref[0]+D.getNumber( 2, 2 )*accref[1]+D.getNumber( 2, 3 )*accref[2]); |
cocorlow | 54:ca88777b295a | 462 | // dynacc_z = LPacc_z-(D.getNumber( 3, 1 )*accref[0]+D.getNumber( 3, 2 )*accref[1]+D.getNumber( 3, 3 )*accref[2]); |
cocorlow | 54:ca88777b295a | 463 | //} |
cocorlow | 54:ca88777b295a | 464 | // |
cocorlow | 54:ca88777b295a | 465 | //// 割り込まれた時点での出力(computeの結果)を返す関数 |
cocorlow | 54:ca88777b295a | 466 | //void calcServoOut(){ |
cocorlow | 54:ca88777b295a | 467 | // if(sbus.failSafe == false) { |
cocorlow | 54:ca88777b295a | 468 | // // sbusデータの読み込み |
cocorlow | 54:ca88777b295a | 469 | // for (int i =0 ; i < 16;i ++){ |
cocorlow | 54:ca88777b295a | 470 | // rc[i] = 0.65f * mapfloat(float(sbus.getData(i)),368,1680,-1,1) + (1.0f - 0.65f) * rc[i]; // mapped input |
cocorlow | 54:ca88777b295a | 471 | // } |
cocorlow | 54:ca88777b295a | 472 | // } |
cocorlow | 54:ca88777b295a | 473 | // pitchPID.setGain(6.36, 10.6,0.0); |
cocorlow | 54:ca88777b295a | 474 | // pitchratePID.setGain(0.9540,0.0,0.0); |
cocorlow | 54:ca88777b295a | 475 | // pitchPID.setProcessValue(pitch); |
cocorlow | 54:ca88777b295a | 476 | // pitchratePID.setProcessValue(gyro_y); |
cocorlow | 54:ca88777b295a | 477 | // float de = pitchPID.compute()+pitchratePID.compute()-rc[1]; |
cocorlow | 54:ca88777b295a | 478 | // |
cocorlow | 54:ca88777b295a | 479 | // scaledServoOut[0]=de; |
cocorlow | 54:ca88777b295a | 480 | // |
cocorlow | 54:ca88777b295a | 481 | // float LP_servo = 0.2; |
cocorlow | 54:ca88777b295a | 482 | // for(int i = 0;i<sizeof(servoOut)/sizeof(servoOut[0]);i++){ |
cocorlow | 54:ca88777b295a | 483 | // servoOut[i] = LP_servo*(mapfloat(scaledServoOut[i],-1,1,servoPwmMin,servoPwmMax))+(1.0-LP_servo)*servoOut[i]; |
cocorlow | 54:ca88777b295a | 484 | // if(servoOut[i]<servoPwmMin) { |
cocorlow | 54:ca88777b295a | 485 | // servoOut[i] = servoPwmMin; |
cocorlow | 54:ca88777b295a | 486 | // }; |
cocorlow | 54:ca88777b295a | 487 | // if(servoOut[i]>servoPwmMax) { |
cocorlow | 54:ca88777b295a | 488 | // servoOut[i] = servoPwmMax; |
cocorlow | 54:ca88777b295a | 489 | // }; |
cocorlow | 54:ca88777b295a | 490 | // } |
cocorlow | 54:ca88777b295a | 491 | // |
cocorlow | 54:ca88777b295a | 492 | // servo.pulsewidth_us(servoOut[0]); |
cocorlow | 54:ca88777b295a | 493 | // |
cocorlow | 54:ca88777b295a | 494 | // //観測アップデート |
cocorlow | 54:ca88777b295a | 495 | // calcDynAcc(); |
cocorlow | 54:ca88777b295a | 496 | // th_mg = abs(acos((LPmag_x*LPacc_x+LPmag_y*LPacc_y+LPmag_z*LPacc_z)/LPmagnorm/LPaccnorm)-val_thmg); |
cocorlow | 54:ca88777b295a | 497 | // dynaccnorm = sqrt(dynacc_x*dynacc_x+dynacc_y*dynacc_y+dynacc_z*dynacc_z); |
cocorlow | 54:ca88777b295a | 498 | // accnormerr = abs(LPaccnorm-accrefnorm); |
cocorlow | 54:ca88777b295a | 499 | // //静止時100個の平均 0.01877522 0.00514146 0.00477393 |
cocorlow | 54:ca88777b295a | 500 | // |
cocorlow | 54:ca88777b295a | 501 | // //int ang_th = th_mg < 0.01877522; |
cocorlow | 54:ca88777b295a | 502 | // //int dyn_th = dynaccnorm < 0.00514146; |
cocorlow | 54:ca88777b295a | 503 | // //int norm_th = accnormerr< 0.00477393; |
cocorlow | 54:ca88777b295a | 504 | // int ang_th = th_mg < 0.01877522/5.0; |
cocorlow | 54:ca88777b295a | 505 | // int dyn_th = dynaccnorm < 0.00514146/5.0; |
cocorlow | 54:ca88777b295a | 506 | // int norm_th = accnormerr< 0.00477393/5.0; |
cocorlow | 54:ca88777b295a | 507 | // if(dyn_th+ang_th+norm_th>0){ |
cocorlow | 54:ca88777b295a | 508 | // //if(dyn_th+ang_th+norm_th>-1){ |
cocorlow | 54:ca88777b295a | 509 | // obs_count += 1; |
cocorlow | 54:ca88777b295a | 510 | // updateAcrossMeasures(LPmag_x/LPmagnorm,LPmag_y/LPmagnorm,LPmag_z/LPmagnorm,magref[0]/magrefnorm,magref[1]/magrefnorm,magref[2]/magrefnorm,Rmag); |
cocorlow | 54:ca88777b295a | 511 | // updateAcrossMeasures(LPacc_x/LPaccnorm,LPacc_y/LPaccnorm,LPacc_z/LPaccnorm,accref[0]/accrefnorm,accref[1]/accrefnorm,accref[2]/accrefnorm,Racc); |
cocorlow | 54:ca88777b295a | 512 | // } |
cocorlow | 54:ca88777b295a | 513 | // |
cocorlow | 54:ca88777b295a | 514 | // if(loop_count >= 10){ |
cocorlow | 54:ca88777b295a | 515 | // writeSdcard(); |
cocorlow | 54:ca88777b295a | 516 | // loop_count = 1; |
cocorlow | 54:ca88777b295a | 517 | // obs_count = 0; |
cocorlow | 54:ca88777b295a | 518 | // }else{ |
cocorlow | 54:ca88777b295a | 519 | // loop_count +=1; |
cocorlow | 54:ca88777b295a | 520 | // } |
cocorlow | 54:ca88777b295a | 521 | // |
cocorlow | 54:ca88777b295a | 522 | // |
cocorlow | 54:ca88777b295a | 523 | //} |
cocorlow | 54:ca88777b295a | 524 | // |
cocorlow | 54:ca88777b295a | 525 | //int main() |
cocorlow | 54:ca88777b295a | 526 | //{ |
cocorlow | 54:ca88777b295a | 527 | // pitchPID.setSetPoint(0.0); |
cocorlow | 54:ca88777b295a | 528 | // pitchratePID.setSetPoint(0.0); |
cocorlow | 54:ca88777b295a | 529 | // pitchPID.setBias(0.0); |
cocorlow | 54:ca88777b295a | 530 | // pitchratePID.setBias(0.0); |
cocorlow | 54:ca88777b295a | 531 | // pitchPID.setOutputLimits(-1.0,1.0); |
cocorlow | 54:ca88777b295a | 532 | // pitchratePID.setOutputLimits(-1.0,1.0); |
cocorlow | 54:ca88777b295a | 533 | // pitchPID.setInputLimits(-pi,pi); |
cocorlow | 54:ca88777b295a | 534 | // pitchratePID.setInputLimits(-pi,pi); |
cocorlow | 54:ca88777b295a | 535 | // |
cocorlow | 54:ca88777b295a | 536 | // servo.period_us(15000.0); |
cocorlow | 54:ca88777b295a | 537 | // servo.pulsewidth_us(1500.0); |
cocorlow | 54:ca88777b295a | 538 | // |
cocorlow | 54:ca88777b295a | 539 | //// pc.baud(57600); |
cocorlow | 54:ca88777b295a | 540 | // accelgyro.initialize(); |
cocorlow | 54:ca88777b295a | 541 | // //加速度計のフルスケールレンジを設定 |
cocorlow | 54:ca88777b295a | 542 | // accelgyro.setFullScaleAccelRange(ACCEL_FSR); |
cocorlow | 54:ca88777b295a | 543 | // //角速度計のフルスケールレンジを設定 |
cocorlow | 54:ca88777b295a | 544 | // accelgyro.setFullScaleGyroRange(GYRO_FSR); |
cocorlow | 54:ca88777b295a | 545 | // //MPU6050のLPFを設定 |
cocorlow | 54:ca88777b295a | 546 | // accelgyro.setDLPFMode(MPU6050_LPF); |
cocorlow | 54:ca88777b295a | 547 | // //地磁気 |
cocorlow | 54:ca88777b295a | 548 | // mag.enable(); |
cocorlow | 54:ca88777b295a | 549 | // |
cocorlow | 54:ca88777b295a | 550 | // qhat << 1 << 0 << 0 << 0; |
cocorlow | 54:ca88777b295a | 551 | // |
cocorlow | 54:ca88777b295a | 552 | // D.add(1,1,1.0); |
cocorlow | 54:ca88777b295a | 553 | // D.add(2,2,1.0); |
cocorlow | 54:ca88777b295a | 554 | // D.add(3,3,1.0); |
cocorlow | 54:ca88777b295a | 555 | // |
cocorlow | 54:ca88777b295a | 556 | // Phat.add(1,1,0.05); |
cocorlow | 54:ca88777b295a | 557 | // Phat.add(2,2,0.05); |
cocorlow | 54:ca88777b295a | 558 | // Phat.add(3,3,0.05); |
cocorlow | 54:ca88777b295a | 559 | // Phat.add(4,4,0.05); |
cocorlow | 54:ca88777b295a | 560 | // |
cocorlow | 54:ca88777b295a | 561 | // Qgyro.add(1,1,0.0224); |
cocorlow | 54:ca88777b295a | 562 | // Qgyro.add(2,2,0.0224); |
cocorlow | 54:ca88777b295a | 563 | // Qgyro.add(3,3,0.0224); |
cocorlow | 54:ca88777b295a | 564 | // |
cocorlow | 54:ca88777b295a | 565 | // Racc.add(1,1,0.0330*200); |
cocorlow | 54:ca88777b295a | 566 | // Racc.add(2,2,0.0330*200); |
cocorlow | 54:ca88777b295a | 567 | // Racc.add(3,3,0.0330*200); |
cocorlow | 54:ca88777b295a | 568 | // |
cocorlow | 54:ca88777b295a | 569 | // Rmag.add(1,1,1.0); |
cocorlow | 54:ca88777b295a | 570 | // Rmag.add(2,2,1.0); |
cocorlow | 54:ca88777b295a | 571 | // Rmag.add(3,3,1.0); |
cocorlow | 54:ca88777b295a | 572 | // |
cocorlow | 54:ca88777b295a | 573 | // calibrationFlag = userButton.read(); |
cocorlow | 54:ca88777b295a | 574 | // if(calibrationFlag == 0){ |
cocorlow | 54:ca88777b295a | 575 | // |
cocorlow | 54:ca88777b295a | 576 | // pc.printf("reading calibration value\r\n"); |
cocorlow | 54:ca88777b295a | 577 | // //キャリブレーション値を取得 |
cocorlow | 54:ca88777b295a | 578 | // U read_calib; |
cocorlow | 54:ca88777b295a | 579 | // readEEPROM(address, pointeraddress, read_calib.c, N_EEPROM*4); |
cocorlow | 54:ca88777b295a | 580 | // wait(3); |
cocorlow | 54:ca88777b295a | 581 | // pos_tail = read_calib.i[0]; |
cocorlow | 54:ca88777b295a | 582 | // agoffset[3] = float(read_calib.i[5]); |
cocorlow | 54:ca88777b295a | 583 | // agoffset[4] = float(read_calib.i[6]); |
cocorlow | 54:ca88777b295a | 584 | // agoffset[5] = float(read_calib.i[7]); |
cocorlow | 54:ca88777b295a | 585 | // magbias[0] = float(read_calib.i[1])/1000.0; |
cocorlow | 54:ca88777b295a | 586 | // magbias[1] = float(read_calib.i[2])/1000.0; |
cocorlow | 54:ca88777b295a | 587 | // magbias[2] = float(read_calib.i[3])/1000.0; |
cocorlow | 54:ca88777b295a | 588 | // magbias[3] = float(read_calib.i[4])/1000.0; |
cocorlow | 54:ca88777b295a | 589 | // pitch_align = float(read_calib.i[8])/200000.0; |
cocorlow | 54:ca88777b295a | 590 | // roll_align = float(read_calib.i[9])/200000.0; |
cocorlow | 54:ca88777b295a | 591 | // tail_address = (int)read_calib.i[10]; |
cocorlow | 54:ca88777b295a | 592 | // |
cocorlow | 54:ca88777b295a | 593 | // switch(pos_tail){ |
cocorlow | 54:ca88777b295a | 594 | // case 1: |
cocorlow | 54:ca88777b295a | 595 | // pc.printf("This MBED is Located at Left \r\n"); |
cocorlow | 54:ca88777b295a | 596 | // break; |
cocorlow | 54:ca88777b295a | 597 | // case 2: |
cocorlow | 54:ca88777b295a | 598 | // pc.printf("This MBED is Located at Center \r\n"); |
cocorlow | 54:ca88777b295a | 599 | // break; |
cocorlow | 54:ca88777b295a | 600 | // case 3: |
cocorlow | 54:ca88777b295a | 601 | // pc.printf("This MBED is Located at Right \r\n"); |
cocorlow | 54:ca88777b295a | 602 | // break; |
cocorlow | 54:ca88777b295a | 603 | // default: // error situation |
cocorlow | 54:ca88777b295a | 604 | // pc.printf("error\r\n"); |
cocorlow | 54:ca88777b295a | 605 | // break; |
cocorlow | 54:ca88777b295a | 606 | // } |
cocorlow | 54:ca88777b295a | 607 | // pc.printf("tail_address : %d\r\n", tail_address); |
cocorlow | 54:ca88777b295a | 608 | // pc.printf("Alignment values are %f(pitch deg) %f(roll deg)\r\n",pitch_align*180.0/pi,roll_align*180.0/pi); |
cocorlow | 54:ca88777b295a | 609 | // getIMUval(); |
cocorlow | 54:ca88777b295a | 610 | // triad(acc_x/accnorm,acc_y/accnorm,acc_z/accnorm, accref[0]/accrefnorm,accref[1]/accrefnorm,accref[2]/accrefnorm,mag_x/magnorm,mag_y/magnorm,mag_z/magnorm, magref[0]/magrefnorm,magref[1]/magrefnorm,magref[2]/magrefnorm); |
cocorlow | 54:ca88777b295a | 611 | // float sumLPaccnorm = 0; |
cocorlow | 54:ca88777b295a | 612 | // for(int i = 0; i<1000 ;i++){ |
cocorlow | 54:ca88777b295a | 613 | // getIMUval(); |
cocorlow | 54:ca88777b295a | 614 | // val_thmg += acos((mag_x*acc_x+mag_y*acc_y+mag_z*acc_z)/magnorm/accnorm); |
cocorlow | 54:ca88777b295a | 615 | // sumLPaccnorm += LPaccnorm; |
cocorlow | 54:ca88777b295a | 616 | // } |
cocorlow | 54:ca88777b295a | 617 | // accref[2]=-sumLPaccnorm/1000; |
cocorlow | 54:ca88777b295a | 618 | // val_thmg /= 1000; |
cocorlow | 54:ca88777b295a | 619 | // LoopTicker PIDtick; |
cocorlow | 54:ca88777b295a | 620 | // PIDtick.attach(calcServoOut,PID_dt); |
cocorlow | 54:ca88777b295a | 621 | // |
cocorlow | 54:ca88777b295a | 622 | // t.start(); |
cocorlow | 54:ca88777b295a | 623 | // |
cocorlow | 54:ca88777b295a | 624 | // while(1) { |
cocorlow | 54:ca88777b295a | 625 | // float tstart = t.read(); |
cocorlow | 54:ca88777b295a | 626 | // //姿勢角を更新 |
cocorlow | 54:ca88777b295a | 627 | // getIMUval(); |
cocorlow | 54:ca88777b295a | 628 | // updateBetweenMeasures(); |
cocorlow | 54:ca88777b295a | 629 | // computeAngles(); |
cocorlow | 54:ca88777b295a | 630 | // PIDtick.loop(); |
cocorlow | 54:ca88777b295a | 631 | // |
cocorlow | 54:ca88777b295a | 632 | // float tend = t.read(); |
cocorlow | 54:ca88777b295a | 633 | // att_dt = (tend-tstart); |
cocorlow | 54:ca88777b295a | 634 | // } |
cocorlow | 54:ca88777b295a | 635 | // }else{ |
cocorlow | 54:ca88777b295a | 636 | // pc.printf("\r\nEnter to Calibration Mode\r\n"); |
cocorlow | 54:ca88777b295a | 637 | // wait(5); |
cocorlow | 54:ca88777b295a | 638 | // pc.printf("Acc and Gyro Calibration Start\r\n"); |
cocorlow | 54:ca88777b295a | 639 | // |
cocorlow | 54:ca88777b295a | 640 | // int gxs = 0; |
cocorlow | 54:ca88777b295a | 641 | // int gys = 0; |
cocorlow | 54:ca88777b295a | 642 | // int gzs = 0; |
cocorlow | 54:ca88777b295a | 643 | // int iter_n = 10000; |
cocorlow | 54:ca88777b295a | 644 | // for(int i = 0;i<iter_n ;i++){ |
cocorlow | 54:ca88777b295a | 645 | // accelgyro.getMotion6(&ay, &ax, &az, &gy, &gx, &gz); |
cocorlow | 54:ca88777b295a | 646 | // gxs += gx; |
cocorlow | 54:ca88777b295a | 647 | // gys += gy; |
cocorlow | 54:ca88777b295a | 648 | // gzs -= gz; |
cocorlow | 54:ca88777b295a | 649 | // //wait(0.01); |
cocorlow | 54:ca88777b295a | 650 | // } |
cocorlow | 54:ca88777b295a | 651 | // gxs = gxs /iter_n; |
cocorlow | 54:ca88777b295a | 652 | // gys = gys /iter_n; |
cocorlow | 54:ca88777b295a | 653 | // gzs = gzs /iter_n; |
cocorlow | 54:ca88777b295a | 654 | // agoffset[3] = gxs; |
cocorlow | 54:ca88777b295a | 655 | // agoffset[4] = gys; |
cocorlow | 54:ca88777b295a | 656 | // agoffset[5] = gzs; |
cocorlow | 54:ca88777b295a | 657 | // pc.printf("Gyrooffset : 0, 0, 0, %d, %d, %d \r\n",gxs,gys,gzs); |
cocorlow | 54:ca88777b295a | 658 | // |
cocorlow | 54:ca88777b295a | 659 | // pc.printf("Mag Calibration Start\r\n"); |
cocorlow | 54:ca88777b295a | 660 | // float f = 0; |
cocorlow | 54:ca88777b295a | 661 | // while(1){ |
cocorlow | 54:ca88777b295a | 662 | // mag.getAxis(mdata); // flush the magnetmeter |
cocorlow | 54:ca88777b295a | 663 | // magval[0] = (mdata.x - magbias[0]); |
cocorlow | 54:ca88777b295a | 664 | // magval[1] = (mdata.y - magbias[1]); |
cocorlow | 54:ca88777b295a | 665 | // magval[2] = (mdata.z - magbias[2]); |
cocorlow | 54:ca88777b295a | 666 | // float mag_r = magval[0]*magval[0] + magval[1]*magval[1] + magval[2]*magval[2]; |
cocorlow | 54:ca88777b295a | 667 | // float lr = 0.00001f; |
cocorlow | 54:ca88777b295a | 668 | // f = mag_r - magbias[3]*magbias[3]; |
cocorlow | 54:ca88777b295a | 669 | // magbias[0] = magbias[0] + 4 * lr * f * magval[0]; |
cocorlow | 54:ca88777b295a | 670 | // magbias[1] = magbias[1] + 4 * lr * f * magval[1]; |
cocorlow | 54:ca88777b295a | 671 | // magbias[2] = magbias[2] + 4 * lr * f * magval[2]; |
cocorlow | 54:ca88777b295a | 672 | // magbias[3] = magbias[3] + 4 * lr * f * magbias[3]; |
cocorlow | 54:ca88777b295a | 673 | // |
cocorlow | 54:ca88777b295a | 674 | // if(userButton.read() == 1){ |
cocorlow | 54:ca88777b295a | 675 | // break; |
cocorlow | 54:ca88777b295a | 676 | // } |
cocorlow | 54:ca88777b295a | 677 | // wait(0.001); |
cocorlow | 54:ca88777b295a | 678 | // } |
cocorlow | 54:ca88777b295a | 679 | // pc.printf("Magbias : %f, %f, %f, %f\r\n",magbias[0],magbias[1],magbias[2],magbias[3]); |
cocorlow | 54:ca88777b295a | 680 | // |
cocorlow | 54:ca88777b295a | 681 | // pc.printf("Determine Position of MBED\r\n"); |
cocorlow | 54:ca88777b295a | 682 | // wait(1); |
cocorlow | 54:ca88777b295a | 683 | // pc.printf("Press the user button\r\n"); |
cocorlow | 54:ca88777b295a | 684 | // |
cocorlow | 54:ca88777b295a | 685 | // while(userButton.read() == 0){wait(0.01);}; |
cocorlow | 54:ca88777b295a | 686 | // while(1){ |
cocorlow | 54:ca88777b295a | 687 | // pc.printf("Left\r\n"); |
cocorlow | 54:ca88777b295a | 688 | // wait(2); |
cocorlow | 54:ca88777b295a | 689 | // if(userButton.read() == 0){ |
cocorlow | 54:ca88777b295a | 690 | // pos_tail=1; |
cocorlow | 54:ca88777b295a | 691 | // tail_address = 1111; |
cocorlow | 54:ca88777b295a | 692 | // break; |
cocorlow | 54:ca88777b295a | 693 | // }; |
cocorlow | 54:ca88777b295a | 694 | // pc.printf("Center\r\n"); |
cocorlow | 54:ca88777b295a | 695 | // wait(2); |
cocorlow | 54:ca88777b295a | 696 | // if(userButton.read() == 0){ |
cocorlow | 54:ca88777b295a | 697 | // pos_tail=2; |
cocorlow | 54:ca88777b295a | 698 | // tail_address = 2222; |
cocorlow | 54:ca88777b295a | 699 | // break; |
cocorlow | 54:ca88777b295a | 700 | // }; |
cocorlow | 54:ca88777b295a | 701 | // pc.printf("Right\r\n"); |
cocorlow | 54:ca88777b295a | 702 | // wait(2); |
cocorlow | 54:ca88777b295a | 703 | // if(userButton.read() == 0){ |
cocorlow | 54:ca88777b295a | 704 | // pos_tail=3; |
cocorlow | 54:ca88777b295a | 705 | // tail_address = 3333; |
cocorlow | 54:ca88777b295a | 706 | // break; |
cocorlow | 54:ca88777b295a | 707 | // }; |
cocorlow | 54:ca88777b295a | 708 | // }; |
cocorlow | 54:ca88777b295a | 709 | // pc.printf("tail_address : %d\r\n", tail_address); |
cocorlow | 54:ca88777b295a | 710 | // switch(pos_tail){ |
cocorlow | 54:ca88777b295a | 711 | // case 1: |
cocorlow | 54:ca88777b295a | 712 | // pc.printf("This MBED is Located at Left \r\n"); |
cocorlow | 54:ca88777b295a | 713 | // break; |
cocorlow | 54:ca88777b295a | 714 | // case 2: |
cocorlow | 54:ca88777b295a | 715 | // pc.printf("This MBED is Located at Center \r\n"); |
cocorlow | 54:ca88777b295a | 716 | // break; |
cocorlow | 54:ca88777b295a | 717 | // case 3: |
cocorlow | 54:ca88777b295a | 718 | // pc.printf("This MBED is Located at Right \r\n"); |
cocorlow | 54:ca88777b295a | 719 | // break; |
cocorlow | 54:ca88777b295a | 720 | // default: // error situation |
cocorlow | 54:ca88777b295a | 721 | // pc.printf("error\r\n"); |
cocorlow | 54:ca88777b295a | 722 | // break; |
cocorlow | 54:ca88777b295a | 723 | // } |
cocorlow | 54:ca88777b295a | 724 | // |
cocorlow | 54:ca88777b295a | 725 | // //姿勢オフセットを計算 |
cocorlow | 54:ca88777b295a | 726 | // pitch_align = 0.0*3.141562/180.0; |
cocorlow | 54:ca88777b295a | 727 | // roll_align = 0.0*3.141562/180.0; |
cocorlow | 54:ca88777b295a | 728 | // float ave_pitch = 0.0; |
cocorlow | 54:ca88777b295a | 729 | // float ave_roll = 0.0; |
cocorlow | 54:ca88777b295a | 730 | // for (int i = 0 ; i<2200; i++){ |
cocorlow | 54:ca88777b295a | 731 | // float tstart = t.read(); |
cocorlow | 54:ca88777b295a | 732 | // //姿勢角を更新 |
cocorlow | 54:ca88777b295a | 733 | // getIMUval(); |
cocorlow | 54:ca88777b295a | 734 | // updateBetweenMeasures(); |
cocorlow | 54:ca88777b295a | 735 | // updateAcrossMeasures(LPmag_x/LPmagnorm,LPmag_y/LPmagnorm,LPmag_z/LPmagnorm,magref[0]/magrefnorm,magref[1]/magrefnorm,magref[2]/magrefnorm,Rmag); |
cocorlow | 54:ca88777b295a | 736 | // updateAcrossMeasures(LPacc_x/LPaccnorm,LPacc_y/LPaccnorm,LPacc_z/LPaccnorm,accref[0]/accrefnorm,accref[1]/accrefnorm,accref[2]/accrefnorm,Racc); |
cocorlow | 54:ca88777b295a | 737 | // computeAngles(); |
cocorlow | 54:ca88777b295a | 738 | // if(i>199){ |
cocorlow | 54:ca88777b295a | 739 | // ave_pitch += pitch; |
cocorlow | 54:ca88777b295a | 740 | // ave_roll += roll; |
cocorlow | 54:ca88777b295a | 741 | // } |
cocorlow | 54:ca88777b295a | 742 | // wait(0.001); |
cocorlow | 54:ca88777b295a | 743 | // float tend = t.read(); |
cocorlow | 54:ca88777b295a | 744 | // att_dt = (tend-tstart); |
cocorlow | 54:ca88777b295a | 745 | // } |
cocorlow | 54:ca88777b295a | 746 | // |
cocorlow | 54:ca88777b295a | 747 | // pc.printf("aliginment data : %f(pitch deg) %f(roll deg)\r\n",ave_pitch/2000.0*180.0f/pi,ave_roll/2000.0*180.0f/pi); |
cocorlow | 54:ca88777b295a | 748 | // |
cocorlow | 54:ca88777b295a | 749 | // pc.printf("Writing to EEPROM...\r\n"); |
cocorlow | 54:ca88777b295a | 750 | // U transfer_data; |
cocorlow | 54:ca88777b295a | 751 | // transfer_data.i[0] = pos_tail; |
cocorlow | 54:ca88777b295a | 752 | // for (int i = 1; i < 5; i++) { |
cocorlow | 54:ca88777b295a | 753 | // if (!isnan(magbias[i - 1])) |
cocorlow | 54:ca88777b295a | 754 | // transfer_data.i[i] = int(magbias[i - 1]*1000); // intに丸めた値を送る。 |
cocorlow | 54:ca88777b295a | 755 | // else { |
cocorlow | 54:ca88777b295a | 756 | // pc.printf("Mag bias is NOT transferred\n"); |
cocorlow | 54:ca88777b295a | 757 | // transfer_data.i[i] = 100; |
cocorlow | 54:ca88777b295a | 758 | // } |
cocorlow | 54:ca88777b295a | 759 | // } |
cocorlow | 54:ca88777b295a | 760 | // // gxs,gys,gzsを送る |
cocorlow | 54:ca88777b295a | 761 | // int gxyzs[3] = {gxs, gys, gzs}; |
cocorlow | 54:ca88777b295a | 762 | // for (int i = 5; i < 8; i++) { |
cocorlow | 54:ca88777b295a | 763 | // if (!isnan(gxyzs[i - 5])) |
cocorlow | 54:ca88777b295a | 764 | // transfer_data.i[i] = gxyzs[i - 5]; |
cocorlow | 54:ca88777b295a | 765 | // else { |
cocorlow | 54:ca88777b295a | 766 | // pc.printf("gxyzs is NOT transferred\n"); |
cocorlow | 54:ca88777b295a | 767 | // transfer_data.i[i] = 0; |
cocorlow | 54:ca88777b295a | 768 | // } |
cocorlow | 54:ca88777b295a | 769 | // } |
cocorlow | 54:ca88777b295a | 770 | // |
cocorlow | 54:ca88777b295a | 771 | // // ave_pitch,ave_rollを送る |
cocorlow | 54:ca88777b295a | 772 | // int ave_pr[2] = {ave_pitch*100, ave_roll*100}; |
cocorlow | 54:ca88777b295a | 773 | // for (int i = 8; i < 10; i++) { |
cocorlow | 54:ca88777b295a | 774 | // if (!isnan(ave_pr[i - 8])) |
cocorlow | 54:ca88777b295a | 775 | // transfer_data.i[i] = ave_pr[i - 8]; |
cocorlow | 54:ca88777b295a | 776 | // else { |
cocorlow | 54:ca88777b295a | 777 | // pc.printf("alignment data is NOT transferred\n"); |
cocorlow | 54:ca88777b295a | 778 | // transfer_data.i[i] = 0; |
cocorlow | 54:ca88777b295a | 779 | // } |
cocorlow | 54:ca88777b295a | 780 | // } |
cocorlow | 54:ca88777b295a | 781 | // transfer_data.i[10] = tail_address; |
cocorlow | 54:ca88777b295a | 782 | // for (int i = 0; i < N_EEPROM; i++) { |
cocorlow | 54:ca88777b295a | 783 | // pc.printf("transfer_data[%d]: %d\r\n", i, transfer_data.i[i]); |
cocorlow | 54:ca88777b295a | 784 | // } |
cocorlow | 54:ca88777b295a | 785 | // writeEEPROM(address, pointeraddress, transfer_data.c, N_EEPROM*4); |
cocorlow | 54:ca88777b295a | 786 | // wait(3); |
cocorlow | 54:ca88777b295a | 787 | // |
cocorlow | 54:ca88777b295a | 788 | // U read_test; |
cocorlow | 54:ca88777b295a | 789 | // readEEPROM(address, pointeraddress, read_test.c, N_EEPROM*4); |
cocorlow | 54:ca88777b295a | 790 | // wait(3); |
cocorlow | 54:ca88777b295a | 791 | // for (int i = 0 ; i < N_EEPROM; i ++){ |
cocorlow | 54:ca88777b295a | 792 | // pc.printf("transfer_data[%d]: %d\r\n",i, read_test.i[i]); |
cocorlow | 54:ca88777b295a | 793 | // } |
cocorlow | 54:ca88777b295a | 794 | // |
cocorlow | 54:ca88777b295a | 795 | // while(1) {wait(1000);} |
cocorlow | 54:ca88777b295a | 796 | // } |
cocorlow | 54:ca88777b295a | 797 | //} |