altb_pmic / Mbed 2 deprecated Test_optical_flow_PX4

Dependencies:   mbed

Committer:
pmic
Date:
Sun Apr 05 08:47:25 2020 +0000
Revision:
12:19fe4f6a8b6b
Parent:
11:d367224f2194
Child:
13:89b65bfe6dda
Commit before implementing driver update (reduce ammount of data transmitted). i2c driver has to be updated on both software sides (F446RE and px4flow)!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
altb2 0:4b02060af95b 1 #include "mbed.h"
altb2 0:4b02060af95b 2 #include "PX4Flow.h"
pmic 3:e03714326b83 3 #include "LSM9DS1_i2c.h"
pmic 4:77914e52baf3 4 #include "EncoderCounter.h"
pmic 4:77914e52baf3 5 #include "DiffCounter.h"
pmic 5:d97332d7f812 6 #include "TFmini.h"
pmic 4:77914e52baf3 7 #define pi 3.1415927f
altb2 0:4b02060af95b 8
pmic 3:e03714326b83 9 Serial pc(SERIAL_TX, SERIAL_RX);
altb2 0:4b02060af95b 10
altb2 1:562a583eb77c 11 I2C i2c(PC_9, PA_8);
pmic 11:d367224f2194 12 PX4Flow PX4(i2c);
pmic 3:e03714326b83 13 float px4_gyro[3];
altb2 0:4b02060af95b 14
pmic 3:e03714326b83 15 LSM9DS1 imu(PC_9, PA_8, 0xD6, 0x3C);
pmic 3:e03714326b83 16 float lsm_gyro[3];
altb2 0:4b02060af95b 17
pmic 3:e03714326b83 18 Timer timer; // timer for time measurement
pmic 3:e03714326b83 19 float dt = 0.0f;
pmic 3:e03714326b83 20
pmic 3:e03714326b83 21 uint32_t counter;
altb2 0:4b02060af95b 22
pmic 4:77914e52baf3 23 EncoderCounter encoder(PA_6, PC_7);
pmic 4:77914e52baf3 24 short counts;
pmic 4:77914e52baf3 25 float gain_encoder = 0.0000025927f;
pmic 4:77914e52baf3 26
pmic 8:cb6d8bc54aaf 27 DiffCounter diffcounter(1/(2.0f*pi*9.0f), 0.05f); // discrete differentiate, based on encoder data
pmic 4:77914e52baf3 28 float velocity;
pmic 4:77914e52baf3 29
pmic 5:d97332d7f812 30 RawSerial uart(PC_10, PC_11);
pmic 5:d97332d7f812 31 TFmini tfmini(uart);
pmic 5:d97332d7f812 32 float dist;
pmic 5:d97332d7f812 33
altb2 0:4b02060af95b 34 int main()
altb2 0:4b02060af95b 35 {
altb2 0:4b02060af95b 36 i2c.frequency(400000);
altb2 0:4b02060af95b 37 pc.baud(2000000);
pmic 3:e03714326b83 38
pmic 3:e03714326b83 39 for(uint8_t i = 0; i < 3; i++) px4_gyro[i] = 0.0f;
pmic 3:e03714326b83 40
pmic 3:e03714326b83 41 for(uint8_t i = 0; i < 3; i++) lsm_gyro[i] = 0.0f;
pmic 3:e03714326b83 42 imu.begin();
pmic 3:e03714326b83 43
pmic 3:e03714326b83 44 timer.start();
pmic 3:e03714326b83 45
pmic 3:e03714326b83 46 counter = 0;
pmic 4:77914e52baf3 47
pmic 4:77914e52baf3 48 encoder.reset(); // encoder reset
pmic 4:77914e52baf3 49 counts = 0;
pmic 4:77914e52baf3 50
pmic 4:77914e52baf3 51 diffcounter.reset(0.0f,0.0f);
pmic 4:77914e52baf3 52 velocity = 0.0f;
pmic 5:d97332d7f812 53
pmic 5:d97332d7f812 54 dist = 0.0f;
pmic 3:e03714326b83 55
altb2 0:4b02060af95b 56 while(1) {
pmic 12:19fe4f6a8b6b 57 if(0) {
pmic 3:e03714326b83 58 if(PX4.update()) {
pmic 4:77914e52baf3 59
pmic 6:db20dd57a30a 60 /*
pmic 7:692d01d007f9 61 pc.printf("Frame Count: %8d\t", PX4.frame_count());
pmic 7:692d01d007f9 62 // pc.printf("Flow X Sum: %d\t", PX4.pixel_flow_x_sum()); // acg flow
pmic 7:692d01d007f9 63 // pc.printf("Flow Y Sum: %d\t", PX4.pixel_flow_y_sum());
pmic 7:692d01d007f9 64 pc.printf("Acc Val Frames: %8d\t", PX4.flow_comp_m_x()); // valid frame count over batch
pmic 7:692d01d007f9 65 pc.printf("Acc Frames: %8d\t", PX4.flow_comp_m_y()); // total frame count over batch
pmic 7:692d01d007f9 66 pc.printf("Avg Quality: %8d\t", PX4.qual()); // avg quality
pmic 7:692d01d007f9 67 // pc.printf("Gyro X: %d\t", PX4.gyro_x_rate());
pmic 7:692d01d007f9 68 // pc.printf("Gyro Y: %d\t", PX4.gyro_y_rate());
pmic 7:692d01d007f9 69 // pc.printf("Gyro Z: %d\t", PX4.gyro_z_rate());
pmic 7:692d01d007f9 70 // pc.printf("Gyro Range: %d\t", PX4.gyro_range()); // temperature
pmic 7:692d01d007f9 71 pc.printf("fs Avg px: %8.3f\t", 1.0f/((float)PX4.sonar_timestamp()*50.0f*0.000001f));
pmic 7:692d01d007f9 72 pc.printf("fs Avg avg: %8.3f\t", 1.0f/((float)PX4.ground_distance()*0.001f));
pmic 7:692d01d007f9 73 pc.printf("fs Nuc: %8.3f\t", 1.0f/dt);
pmic 7:692d01d007f9 74 pc.printf("\r\n");
pmic 6:db20dd57a30a 75 */
pmic 4:77914e52baf3 76
pmic 10:c654deb509e2 77 imu.readGyro();
pmic 10:c654deb509e2 78 lsm_gyro[0] = imu.gyroX*1.17f;
pmic 10:c654deb509e2 79 lsm_gyro[1] = imu.gyroY*1.17f;
pmic 10:c654deb509e2 80 lsm_gyro[2] = imu.gyroZ*1.17f;
pmic 10:c654deb509e2 81
pmic 10:c654deb509e2 82 px4_gyro[0] = (float)PX4.gyro_x_rate_integral()*1.0f/155.0f/10.0f;
pmic 10:c654deb509e2 83 px4_gyro[1] = (float)PX4.gyro_y_rate_integral()*1.0f/155.0f/10.0f;
pmic 10:c654deb509e2 84 px4_gyro[2] = (float)PX4.gyro_z_rate_integral()*1.0f/155.0f/10.0f;
pmic 10:c654deb509e2 85
pmic 10:c654deb509e2 86 counts = encoder;
pmic 10:c654deb509e2 87 velocity = diffcounter(counts)*gain_encoder;
pmic 10:c654deb509e2 88
pmic 10:c654deb509e2 89 /*
pmic 10:c654deb509e2 90 dist = tfmini();
pmic 10:c654deb509e2 91 */
pmic 10:c654deb509e2 92
pmic 10:c654deb509e2 93 dt = timer.read();
pmic 10:c654deb509e2 94 timer.reset();
pmic 10:c654deb509e2 95
pmic 10:c654deb509e2 96 // compare encoder and px4flow output, branch OrgSoftwareNoSonar
pmic 10:c654deb509e2 97 pc.printf("%10i; %10.3f; %10.3f;", counter, velocity, 1.0f/dt);
pmic 10:c654deb509e2 98 pc.printf("%10.3f; %10.3f; %10.3f;", lsm_gyro[0], lsm_gyro[1], lsm_gyro[2]);
pmic 10:c654deb509e2 99 pc.printf("%10.3f; %10.3f; %10.3f;", PX4.gyro_x_rate()*0.00064516132f, PX4.gyro_y_rate()*0.00064516132f, PX4.gyro_z_rate()*0.00064516132f);
pmic 10:c654deb509e2 100 pc.printf("%10.3f; %10.3f;", PX4.flow_comp_m_x()*0.3333333f, PX4.flow_comp_m_x()*0.3333333f);
pmic 10:c654deb509e2 101 pc.printf("\r\n");
pmic 10:c654deb509e2 102
pmic 10:c654deb509e2 103 counter++;
pmic 10:c654deb509e2 104 wait(0.0455); // 20 Hz USE 20 Hz!!!
pmic 10:c654deb509e2 105
pmic 3:e03714326b83 106 } else {
pmic 3:e03714326b83 107 pc.printf("TimeOut\r\n");
pmic 3:e03714326b83 108 }
altb2 0:4b02060af95b 109 } else {
pmic 3:e03714326b83 110 if(PX4.update_integral()) {
pmic 8:cb6d8bc54aaf 111
pmic 8:cb6d8bc54aaf 112 imu.readGyro();
pmic 8:cb6d8bc54aaf 113 lsm_gyro[0] = imu.gyroX*1.17f;
pmic 8:cb6d8bc54aaf 114 lsm_gyro[1] = imu.gyroY*1.17f;
pmic 8:cb6d8bc54aaf 115 lsm_gyro[2] = imu.gyroZ*1.17f;
pmic 8:cb6d8bc54aaf 116
pmic 8:cb6d8bc54aaf 117 px4_gyro[0] = (float)PX4.gyro_x_rate_integral()*1.0f/155.0f/10.0f;
pmic 8:cb6d8bc54aaf 118 px4_gyro[1] = (float)PX4.gyro_y_rate_integral()*1.0f/155.0f/10.0f;
pmic 8:cb6d8bc54aaf 119 px4_gyro[2] = (float)PX4.gyro_z_rate_integral()*1.0f/155.0f/10.0f;
pmic 6:db20dd57a30a 120
pmic 8:cb6d8bc54aaf 121 counts = encoder;
pmic 8:cb6d8bc54aaf 122 velocity = diffcounter(counts)*gain_encoder;
pmic 8:cb6d8bc54aaf 123
pmic 7:692d01d007f9 124 /*
pmic 8:cb6d8bc54aaf 125 dist = tfmini();
pmic 8:cb6d8bc54aaf 126 */
pmic 8:cb6d8bc54aaf 127
pmic 8:cb6d8bc54aaf 128 dt = timer.read();
pmic 8:cb6d8bc54aaf 129 timer.reset();
pmic 8:cb6d8bc54aaf 130
pmic 8:cb6d8bc54aaf 131 /*
pmic 8:cb6d8bc54aaf 132 pc.printf("Valid Framecount: %3.0d\t", PX4.frame_count_since_last_readout());
pmic 8:cb6d8bc54aaf 133 pc.printf("Flow X: %3.0d\t", PX4.pixel_flow_x_integral());
pmic 8:cb6d8bc54aaf 134 pc.printf("Flow Y: %3.0d\t", PX4.pixel_flow_y_integral());
pmic 8:cb6d8bc54aaf 135 pc.printf("Gyro X: %3.0d\t", PX4.gyro_x_rate_integral());
pmic 8:cb6d8bc54aaf 136 pc.printf("Gyro Y: %3.0d\t", PX4.gyro_y_rate_integral());
pmic 8:cb6d8bc54aaf 137 pc.printf("Gyro Z: %3.0d\t", PX4.gyro_z_rate_integral());
pmic 3:e03714326b83 138 pc.printf("Quality: %3.0d\t", PX4.quality_integral());
pmic 8:cb6d8bc54aaf 139 pc.printf("Framecount: %10.d\t", PX4.sonar_timestamp_integral());
pmic 8:cb6d8bc54aaf 140 pc.printf("Readout Hz*1000: %3.d\t", PX4.ground_distance_integral());
pmic 8:cb6d8bc54aaf 141 pc.printf("Gyro Temp: %3.d\t", PX4.gyro_temperature());
pmic 8:cb6d8bc54aaf 142 pc.printf("Update Hz*1000: %8.0d\t", PX4.integration_timespan());
pmic 3:e03714326b83 143 pc.printf("\r\n");
pmic 7:692d01d007f9 144 */
pmic 7:692d01d007f9 145
pmic 9:be40afb750d3 146 // compare encoder and px4flow output, branch IndNaV with new PX4Flow driver functionality
pmic 12:19fe4f6a8b6b 147 pc.printf("%6i; %6.3f; %6.3f;", counter, velocity, 1.0f/dt);
pmic 12:19fe4f6a8b6b 148 pc.printf("%6.3f; %6.3f; %6.3f;", lsm_gyro[0], lsm_gyro[1], lsm_gyro[2]);
pmic 12:19fe4f6a8b6b 149 // pc.printf("%6i; %6.3f; %6.3i;", counter, 1.0f/dt);
pmic 12:19fe4f6a8b6b 150 pc.printf("%6.3f; %6.3f; %6.3f; %6.4f;", PX4.avg_gyro_x(), PX4.avg_gyro_y(), PX4.avg_gyro_z(), PX4.int_timespan());
pmic 12:19fe4f6a8b6b 151 pc.printf("%6.3f; %6.3f; %4i;", PX4.avg_flowx(), PX4.avg_flowy(), PX4.avg_quality());
pmic 12:19fe4f6a8b6b 152 pc.printf("%6.3f; %6.3f; %4d; %4i;", PX4.update_fs(), PX4.readout_fs(), PX4.all_frame_count(), PX4.valid_frame_count());
pmic 9:be40afb750d3 153 pc.printf("%4i", PX4.avg_scaled_quality());
pmic 10:c654deb509e2 154 pc.printf("\r\n");
pmic 10:c654deb509e2 155
pmic 8:cb6d8bc54aaf 156 counter++;
pmic 12:19fe4f6a8b6b 157 // wait(0.0155); // 50 Hz
pmic 9:be40afb750d3 158 wait(0.0455); // 20 Hz USE 20 Hz!!!
pmic 9:be40afb750d3 159 // wait(0.0955); // 10 Hz
pmic 9:be40afb750d3 160 // wait(0.4955); // 2 Hz
pmic 9:be40afb750d3 161 // wait(0.9955); // 1 Hz
pmic 8:cb6d8bc54aaf 162
pmic 3:e03714326b83 163 } else {
pmic 3:e03714326b83 164 pc.printf("TimeOut\r\n");
pmic 3:e03714326b83 165 }
altb2 0:4b02060af95b 166 }
pmic 8:cb6d8bc54aaf 167 // wait(0.046);
altb2 0:4b02060af95b 168 }
altb2 0:4b02060af95b 169 }
altb2 0:4b02060af95b 170