altb_pmic / Mbed 2 deprecated Test_optical_flow_PX4

Dependencies:   mbed

Committer:
pmic
Date:
Mon Apr 06 05:57:56 2020 +0000
Revision:
13:89b65bfe6dda
Parent:
12:19fe4f6a8b6b
Change receiving driver and firmware. Data latency now 2.4 ms faster.

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 13:89b65bfe6dda 58 if(1) {// 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 13:89b65bfe6dda 82 // px4_gyro[0] = (float)PX4.gyro_x_rate_integral()*1.0f/155.0f/10.0f;
pmic 13:89b65bfe6dda 83 // px4_gyro[1] = (float)PX4.gyro_y_rate_integral()*1.0f/155.0f/10.0f;
pmic 13:89b65bfe6dda 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 13:89b65bfe6dda 97 // pc.printf("%10i; %10.3f; %10.3f;", counter, velocity, 1.0f/dt);
pmic 13:89b65bfe6dda 98 // pc.printf("%10.3f; %10.3f; %10.3f;", lsm_gyro[0], lsm_gyro[1], lsm_gyro[2]);
pmic 13:89b65bfe6dda 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 13:89b65bfe6dda 100 // pc.printf("%10.3f; %10.3f;", PX4.flow_comp_m_x()*0.3333333f, PX4.flow_comp_m_x()*0.3333333f);
pmic 13:89b65bfe6dda 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 13:89b65bfe6dda 117 // px4_gyro[0] = (float)PX4.gyro_x_rate_integral()*1.0f/155.0f/10.0f;
pmic 13:89b65bfe6dda 118 // px4_gyro[1] = (float)PX4.gyro_y_rate_integral()*1.0f/155.0f/10.0f;
pmic 13:89b65bfe6dda 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 13:89b65bfe6dda 146 /*
pmic 9:be40afb750d3 147 // compare encoder and px4flow output, branch IndNaV with new PX4Flow driver functionality
pmic 12:19fe4f6a8b6b 148 pc.printf("%6i; %6.3f; %6.3f;", counter, velocity, 1.0f/dt);
pmic 12:19fe4f6a8b6b 149 pc.printf("%6.3f; %6.3f; %6.3f;", lsm_gyro[0], lsm_gyro[1], lsm_gyro[2]);
pmic 12:19fe4f6a8b6b 150 // pc.printf("%6i; %6.3f; %6.3i;", counter, 1.0f/dt);
pmic 12:19fe4f6a8b6b 151 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 152 pc.printf("%6.3f; %6.3f; %4i;", PX4.avg_flowx(), PX4.avg_flowy(), PX4.avg_quality());
pmic 12:19fe4f6a8b6b 153 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 154 pc.printf("%4i", PX4.avg_scaled_quality());
pmic 10:c654deb509e2 155 pc.printf("\r\n");
pmic 13:89b65bfe6dda 156 */
pmic 13:89b65bfe6dda 157
pmic 13:89b65bfe6dda 158 // float avg_flow_x(); // avg flow x in mm/s
pmic 13:89b65bfe6dda 159 // float avg_flow_y(); // avg flow y in mm/s
pmic 13:89b65bfe6dda 160 // uint8_t avg_qual(); // avg 0-255 linear quality measurement 0=bad, 255=best
pmic 13:89b65bfe6dda 161 // uint8_t valid_frame_count(); // nr. of valid frames (qual > 0) between i2c readings
pmic 13:89b65bfe6dda 162 // uint8_t frame_count(); // nr. of frames between i2c readings
pmic 13:89b65bfe6dda 163 // uint8_t avg_qual_scaled(); // avg 0-255 linear quality measurement 0=bad, 255=best, scaled with N_valid_frame_count/N_frame_count
pmic 13:89b65bfe6dda 164
pmic 13:89b65bfe6dda 165 // compare encoder and px4flow output, branch IndNaV with new PX4Flow driver functionality
pmic 13:89b65bfe6dda 166 pc.printf("%6i; %6.3f;", counter, 1.0f/dt);
pmic 13:89b65bfe6dda 167 pc.printf("%6.3f; %6.3f; %4i;; %4i;", PX4.avg_flow_x(), PX4.avg_flow_y(), PX4.avg_qual_scaled(), PX4.avg_qual());
pmic 13:89b65bfe6dda 168 pc.printf("%4i; %4i;", PX4.valid_frame_count(), PX4.frame_count());
pmic 13:89b65bfe6dda 169 pc.printf("\r\n");
pmic 10:c654deb509e2 170
pmic 8:cb6d8bc54aaf 171 counter++;
pmic 12:19fe4f6a8b6b 172 // wait(0.0155); // 50 Hz
pmic 13:89b65bfe6dda 173 wait(0.0479); //: pmic, 2019 // wait(0.0455); //: pmic, int16_t for avg_flow, 2019 // 20 Hz USE 20 Hz!!!
pmic 9:be40afb750d3 174 // wait(0.0955); // 10 Hz
pmic 9:be40afb750d3 175 // wait(0.4955); // 2 Hz
pmic 9:be40afb750d3 176 // wait(0.9955); // 1 Hz
pmic 8:cb6d8bc54aaf 177
pmic 3:e03714326b83 178 } else {
pmic 3:e03714326b83 179 pc.printf("TimeOut\r\n");
pmic 3:e03714326b83 180 }
altb2 0:4b02060af95b 181 }
pmic 8:cb6d8bc54aaf 182 // wait(0.046);
altb2 0:4b02060af95b 183 }
altb2 0:4b02060af95b 184 }
altb2 0:4b02060af95b 185