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@105:aaaed895ffaf, 2022-03-01 (annotated)
- Committer:
- NaotoMorita
- Date:
- Tue Mar 01 09:19:27 2022 +0000
- Revision:
- 105:aaaed895ffaf
- Parent:
- 104:f81befbc5ab7
- Child:
- 106:36458fb9b5b7
fuse optical flow
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 | 90:0b1f62f7a83a | 72 | headingUpdateFlag = false; |
| NaotoMorita | 90:0b1f62f7a83a | 73 | if(tstart-theading>0.05f){ |
| NaotoMorita | 90:0b1f62f7a83a | 74 | Matrix euler = eskf.computeAngles(); |
| NaotoMorita | 90:0b1f62f7a83a | 75 | if(fabsf(euler(2,1))<30.0f*M_PI/180.0f){ |
| NaotoMorita | 90:0b1f62f7a83a | 76 | headingUpdateFlag = true; |
| NaotoMorita | 90:0b1f62f7a83a | 77 | theading = _t.read(); |
| NaotoMorita | 90:0b1f62f7a83a | 78 | } |
| NaotoMorita | 90:0b1f62f7a83a | 79 | } |
| NaotoMorita | 90:0b1f62f7a83a | 80 | |
| NaotoMorita | 90:0b1f62f7a83a | 81 | if(gpsUpdateFlag==true){ |
| NaotoMorita | 90:0b1f62f7a83a | 82 | Vector3 pi(updateValues.pi[0], updateValues.pi[1], updateValues.pi[2]); |
| NaotoMorita | 90:0b1f62f7a83a | 83 | Vector3 vi(updateValues.vi[0], updateValues.vi[1], updateValues.vi[2]); |
| osaka | 98:39e4d1844a24 | 84 | Rgps(1, 1) = (updateValues.gps_acc * 0.849f) * (updateValues.gps_acc * 0.849f); |
| osaka | 98:39e4d1844a24 | 85 | Rgps(2, 2) = (updateValues.gps_acc * 0.849f) * (updateValues.gps_acc * 0.849f); |
| NaotoMorita | 90:0b1f62f7a83a | 86 | eskf.updateGPS(MatrixMath::Vector2mat(pi),palt,MatrixMath::Vector2mat(vi),Rgps); |
| NaotoMorita | 101:d9895b8eb49f | 87 | pc.printf("gps\r\n"); |
| NaotoMorita | 90:0b1f62f7a83a | 88 | }else if(headingUpdateFlag == true){ |
| NaotoMorita | 90:0b1f62f7a83a | 89 | float heading = atan2f(-mag.y,mag.x); |
| NaotoMorita | 90:0b1f62f7a83a | 90 | eskf.updateHeading(heading,Rheading); |
| osaka | 84:028bd650e8bc | 91 | }else{ |
| NaotoMorita | 90:0b1f62f7a83a | 92 | Matrix dynacc = eskf.calcDynAcc(MatrixMath::Vector2mat(acc)); |
| NaotoMorita | 90:0b1f62f7a83a | 93 | dynaccnorm2 = dynacc(1,1)*dynacc(1,1)+dynacc(2,1)*dynacc(2,1)+dynacc(3,1)*dynacc(3,1); |
| NaotoMorita | 90:0b1f62f7a83a | 94 | if(dynaccnorm2 > dynAccCriteria*dynAccCriteria){ |
| NaotoMorita | 90:0b1f62f7a83a | 95 | eskf.updateAcc(MatrixMath::Vector2mat(acc),RaccDyn); |
| NaotoMorita | 90:0b1f62f7a83a | 96 | }else{ |
| NaotoMorita | 90:0b1f62f7a83a | 97 | eskf.updateAcc(MatrixMath::Vector2mat(acc),Racc); |
| NaotoMorita | 90:0b1f62f7a83a | 98 | } |
| osaka | 84:028bd650e8bc | 99 | } |
| NaotoMorita | 105:aaaed895ffaf | 100 | if(updateValues.dist_ir<1.0f){ |
| NaotoMorita | 105:aaaed895ffaf | 101 | Matrix vbOpt(2,1); |
| NaotoMorita | 105:aaaed895ffaf | 102 | vbOpt(1,1) = opt_vx; |
| NaotoMorita | 105:aaaed895ffaf | 103 | vbOpt(2,1) = opt_vy; |
| NaotoMorita | 105:aaaed895ffaf | 104 | eskf.updateVb(vbOpt,Ropt); |
| NaotoMorita | 105:aaaed895ffaf | 105 | } |
| NaotoMorita | 105:aaaed895ffaf | 106 | |
| osaka | 84:028bd650e8bc | 107 | } |
| osaka | 87:981895e1d4f2 | 108 | |
| cocorlow | 56:888379912f81 | 109 | PIDtick.loop(); |
| cocorlow | 56:888379912f81 | 110 | |
| osaka | 84:028bd650e8bc | 111 | //制御時間を計測 |
| cocorlow | 56:888379912f81 | 112 | float tend = _t.read(); |
| cocorlow | 56:888379912f81 | 113 | att_dt = (tend-tstart); |
| cocorlow | 56:888379912f81 | 114 | } |
| cocorlow | 56:888379912f81 | 115 | } |