Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MatrixMath LPS25HB_I2C LSM9DS1 Matrix2 PIDcontroller LoopTicker SBUS_without_mainfile UsaPack solaESKF_wind Vector3 CalibrateMagneto FastPWM
run.cpp@109:27ae949bc38e, 2022-03-09 (annotated)
- Committer:
- NaotoMorita
- Date:
- Wed Mar 09 13:04:08 2022 +0000
- Revision:
- 109:27ae949bc38e
- Parent:
- 108:e582f8bd4729
- Child:
- 114:ba221936d53a
20220309_withoutOpticalFlow
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| cocorlow | 56:888379912f81 | 1 | #include "global.hpp" |
| cocorlow | 56:888379912f81 | 2 | |
| cocorlow | 56:888379912f81 | 3 | void run() |
| cocorlow | 56:888379912f81 | 4 | { |
| osaka | 85:0b14a2a600fc | 5 | |
| NaotoMorita | 104:f81befbc5ab7 | 6 | preflightCalibration(); |
| NaotoMorita | 69:0caaad87cf1d | 7 | |
| osaka | 84:028bd650e8bc | 8 | //ESKFの共分散設定 |
| osaka | 84:028bd650e8bc | 9 | eskf.setGravity(0.0f,0.0f,9.8f); |
| NaotoMorita | 101:d9895b8eb49f | 10 | eskf.setPhatPosition(0.1f); |
| NaotoMorita | 101:d9895b8eb49f | 11 | eskf.setPhatVelocity(0.1f); |
| NaotoMorita | 101:d9895b8eb49f | 12 | eskf.setPhatAngleError(0.5f); |
| NaotoMorita | 101:d9895b8eb49f | 13 | eskf.setPhatAccBias(0.001f); |
| NaotoMorita | 101:d9895b8eb49f | 14 | eskf.setPhatGyroBias(0.001f); |
| osaka | 84:028bd650e8bc | 15 | eskf.setPhatGravity(0.0000001f); |
| NaotoMorita | 101:d9895b8eb49f | 16 | |
| osaka | 84:028bd650e8bc | 17 | eskf.setQVelocity(0.001f); |
| osaka | 84:028bd650e8bc | 18 | eskf.setQAngleError(0.0000025f); |
| osaka | 84:028bd650e8bc | 19 | eskf.setQAccBias(0.000001f); |
| osaka | 84:028bd650e8bc | 20 | eskf.setQGyroBias(0.000001f); |
| osaka | 84:028bd650e8bc | 21 | |
| osaka | 84:028bd650e8bc | 22 | Matrix Rgps(5,5); |
| osaka | 84:028bd650e8bc | 23 | setDiag(Rgps,0.05f); |
| osaka | 84:028bd650e8bc | 24 | Rgps(4,4) = 0.1f; |
| osaka | 84:028bd650e8bc | 25 | Rgps(5,5) = 0.1f; |
| osaka | 84:028bd650e8bc | 26 | |
| osaka | 84:028bd650e8bc | 27 | float dynAccCriteria = 0.4f; |
| osaka | 84:028bd650e8bc | 28 | Matrix Racc(3,3); |
| osaka | 84:028bd650e8bc | 29 | setDiag(Racc,100.0f); |
| osaka | 84:028bd650e8bc | 30 | Matrix RaccDyn(3,3); |
| osaka | 84:028bd650e8bc | 31 | setDiag(RaccDyn,5000.0f); |
| osaka | 84:028bd650e8bc | 32 | |
| osaka | 84:028bd650e8bc | 33 | Matrix Rheading(1,1); |
| osaka | 84:028bd650e8bc | 34 | Rheading(1,1) = 0.01f; |
| osaka | 84:028bd650e8bc | 35 | |
| NaotoMorita | 105:aaaed895ffaf | 36 | Matrix Ropt(2,2); |
| NaotoMorita | 105:aaaed895ffaf | 37 | setDiag(Ropt,10.0f); |
| NaotoMorita | 105:aaaed895ffaf | 38 | |
| NaotoMorita | 71:62eb45ecffe9 | 39 | wait(0.5); |
| NaotoMorita | 104:f81befbc5ab7 | 40 | |
| NaotoMorita | 69:0caaad87cf1d | 41 | _t.start(); |
| NaotoMorita | 73:be7a8b8188de | 42 | tail.Subscribe(tail_address[pos_tail], &(updateValues)); |
| cocorlow | 56:888379912f81 | 43 | |
| NaotoMorita | 104:f81befbc5ab7 | 44 | preflightCheck(); |
| osaka | 91:393b9ae62681 | 45 | |
| cocorlow | 56:888379912f81 | 46 | LoopTicker PIDtick; |
| cocorlow | 56:888379912f81 | 47 | PIDtick.attach(calcServoOut,PID_dt); |
| cocorlow | 56:888379912f81 | 48 | |
| cocorlow | 56:888379912f81 | 49 | while(1) |
| cocorlow | 56:888379912f81 | 50 | { |
| NaotoMorita | 104:f81befbc5ab7 | 51 | tstart = _t.read(); |
| osaka | 84:028bd650e8bc | 52 | //センサの値を取得 |
| cocorlow | 56:888379912f81 | 53 | getIMUval(); |
| osaka | 103:34e911b94440 | 54 | calcOpticalVel(); |
| osaka | 84:028bd650e8bc | 55 | |
| osaka | 84:028bd650e8bc | 56 | //ekfの更新 |
| osaka | 84:028bd650e8bc | 57 | eskf.updateNominal(MatrixMath::Vector2mat(acc),MatrixMath::Vector2mat(gyro),att_dt); |
| osaka | 84:028bd650e8bc | 58 | eskf.updateErrState(MatrixMath::Vector2mat(acc),MatrixMath::Vector2mat(gyro),att_dt); |
| osaka | 84:028bd650e8bc | 59 | |
| NaotoMorita | 90:0b1f62f7a83a | 60 | //キャリブレーション中 |
| NaotoMorita | 90:0b1f62f7a83a | 61 | if(updateValues.calibrationFlag == 1111){ |
| NaotoMorita | 104:f81befbc5ab7 | 62 | mainloopCalibration(); |
| osaka | 84:028bd650e8bc | 63 | }else{ |
| NaotoMorita | 90:0b1f62f7a83a | 64 | gpsUpdateFlag = false; |
| NaotoMorita | 101:d9895b8eb49f | 65 | //pc.printf("%d %d \r\n",updateValues.gps_itow,updateValues.gps_fix ); |
| NaotoMorita | 90:0b1f62f7a83a | 66 | if((gpsitow != updateValues.gps_itow) && (updateValues.gps_fix == 0x03)){ |
| NaotoMorita | 90:0b1f62f7a83a | 67 | gpsUpdateFlag = true; |
| NaotoMorita | 90:0b1f62f7a83a | 68 | gpsitow = updateValues.gps_itow; |
| NaotoMorita | 90:0b1f62f7a83a | 69 | tgps = _t.read(); |
| NaotoMorita | 90:0b1f62f7a83a | 70 | } |
| NaotoMorita | 90:0b1f62f7a83a | 71 | |
| NaotoMorita | 106:36458fb9b5b7 | 72 | sensorUpdateFlag = false; |
| NaotoMorita | 106:36458fb9b5b7 | 73 | if(tstart-tsensors>0.05f){ |
| NaotoMorita | 106:36458fb9b5b7 | 74 | sensorUpdateFlag = true; |
| NaotoMorita | 106:36458fb9b5b7 | 75 | tsensors = _t.read(); |
| NaotoMorita | 90:0b1f62f7a83a | 76 | } |
| NaotoMorita | 90:0b1f62f7a83a | 77 | |
| NaotoMorita | 90:0b1f62f7a83a | 78 | if(gpsUpdateFlag==true){ |
| NaotoMorita | 90:0b1f62f7a83a | 79 | Vector3 pi(updateValues.pi[0], updateValues.pi[1], updateValues.pi[2]); |
| NaotoMorita | 90:0b1f62f7a83a | 80 | Vector3 vi(updateValues.vi[0], updateValues.vi[1], updateValues.vi[2]); |
| osaka | 98:39e4d1844a24 | 81 | Rgps(1, 1) = (updateValues.gps_acc * 0.849f) * (updateValues.gps_acc * 0.849f); |
| osaka | 98:39e4d1844a24 | 82 | Rgps(2, 2) = (updateValues.gps_acc * 0.849f) * (updateValues.gps_acc * 0.849f); |
| NaotoMorita | 90:0b1f62f7a83a | 83 | eskf.updateGPS(MatrixMath::Vector2mat(pi),palt,MatrixMath::Vector2mat(vi),Rgps); |
| NaotoMorita | 106:36458fb9b5b7 | 84 | //pc.printf("gps\r\n"); |
| NaotoMorita | 106:36458fb9b5b7 | 85 | }else if(sensorUpdateFlag == true){ |
| NaotoMorita | 106:36458fb9b5b7 | 86 | if(sensorUpdateID==1){ |
| NaotoMorita | 106:36458fb9b5b7 | 87 | Matrix euler = eskf.computeAngles(); |
| NaotoMorita | 106:36458fb9b5b7 | 88 | if(fabsf(euler(2,1))<30.0f*M_PI/180.0f){ |
| NaotoMorita | 106:36458fb9b5b7 | 89 | float heading = atan2f(-mag.y,mag.x); |
| NaotoMorita | 106:36458fb9b5b7 | 90 | eskf.updateHeading(heading,Rheading); |
| NaotoMorita | 106:36458fb9b5b7 | 91 | //pc.printf("heading\r\n"); |
| NaotoMorita | 106:36458fb9b5b7 | 92 | } |
| NaotoMorita | 106:36458fb9b5b7 | 93 | sensorUpdateID += 1; |
| NaotoMorita | 106:36458fb9b5b7 | 94 | }else{ |
| NaotoMorita | 109:27ae949bc38e | 95 | //float vnorm_opt2 = updateValues.vx_opt*updateValues.vx_opt+updateValues.vy_opt*updateValues.vy_opt; |
| NaotoMorita | 109:27ae949bc38e | 96 | //if(updateValues.dist_ir<1.0f && vnorm_opt2 < 400.0f){ |
| NaotoMorita | 109:27ae949bc38e | 97 | //if(vnorm_opt2 < 0.1f){ |
| NaotoMorita | 109:27ae949bc38e | 98 | //Matrix vbOpt(2,1); |
| NaotoMorita | 109:27ae949bc38e | 99 | //vbOpt(1,1) = updateValues.vx_opt; |
| NaotoMorita | 109:27ae949bc38e | 100 | //vbOpt(2,1) = updateValues.vy_opt; |
| NaotoMorita | 109:27ae949bc38e | 101 | //eskf.updateVb(vbOpt,Ropt*0.1f); |
| NaotoMorita | 109:27ae949bc38e | 102 | //}else{ |
| NaotoMorita | 108:e582f8bd4729 | 103 | //Matrix vbOpt(2,1); |
| NaotoMorita | 108:e582f8bd4729 | 104 | //vbOpt(1,1) = updateValues.vx_opt; |
| NaotoMorita | 108:e582f8bd4729 | 105 | //vbOpt(2,1) = updateValues.vy_opt; |
| NaotoMorita | 108:e582f8bd4729 | 106 | //eskf.updateVb(vbOpt,Ropt); |
| NaotoMorita | 109:27ae949bc38e | 107 | //} |
| NaotoMorita | 106:36458fb9b5b7 | 108 | //pc.printf("opt\r\n"); |
| NaotoMorita | 109:27ae949bc38e | 109 | //} |
| NaotoMorita | 106:36458fb9b5b7 | 110 | sensorUpdateID=1; |
| NaotoMorita | 106:36458fb9b5b7 | 111 | } |
| osaka | 84:028bd650e8bc | 112 | }else{ |
| NaotoMorita | 90:0b1f62f7a83a | 113 | Matrix dynacc = eskf.calcDynAcc(MatrixMath::Vector2mat(acc)); |
| NaotoMorita | 90:0b1f62f7a83a | 114 | dynaccnorm2 = dynacc(1,1)*dynacc(1,1)+dynacc(2,1)*dynacc(2,1)+dynacc(3,1)*dynacc(3,1); |
| NaotoMorita | 90:0b1f62f7a83a | 115 | if(dynaccnorm2 > dynAccCriteria*dynAccCriteria){ |
| NaotoMorita | 90:0b1f62f7a83a | 116 | eskf.updateAcc(MatrixMath::Vector2mat(acc),RaccDyn); |
| NaotoMorita | 106:36458fb9b5b7 | 117 | //pc.printf("dyn acc\r\n"); |
| NaotoMorita | 90:0b1f62f7a83a | 118 | }else{ |
| NaotoMorita | 90:0b1f62f7a83a | 119 | eskf.updateAcc(MatrixMath::Vector2mat(acc),Racc); |
| NaotoMorita | 106:36458fb9b5b7 | 120 | //pc.printf("static acc\r\n"); |
| NaotoMorita | 106:36458fb9b5b7 | 121 | } |
| NaotoMorita | 106:36458fb9b5b7 | 122 | |
| osaka | 84:028bd650e8bc | 123 | } |
| NaotoMorita | 106:36458fb9b5b7 | 124 | |
| NaotoMorita | 105:aaaed895ffaf | 125 | |
| osaka | 84:028bd650e8bc | 126 | } |
| osaka | 87:981895e1d4f2 | 127 | |
| cocorlow | 56:888379912f81 | 128 | PIDtick.loop(); |
| cocorlow | 56:888379912f81 | 129 | |
| osaka | 84:028bd650e8bc | 130 | //制御時間を計測 |
| cocorlow | 56:888379912f81 | 131 | float tend = _t.read(); |
| cocorlow | 56:888379912f81 | 132 | att_dt = (tend-tstart); |
| cocorlow | 56:888379912f81 | 133 | } |
| cocorlow | 56:888379912f81 | 134 | } |