void GCS_MAVLINK::send_raw_imu(const AP_InertialSensor &ins, const Compass &compass) { const Vector3f &accel = ins.get_accel(0); const Vector3f &gyro = ins.get_gyro(0); const Vector3f &mag = compass.get_field(0); mavlink_msg_raw_imu_send( chan, hal.scheduler->micros(), accel.x * 1000.0f / GRAVITY_MSS, accel.y * 1000.0f / GRAVITY_MSS, accel.z * 1000.0f / GRAVITY_MSS, gyro.x * 1000.0f, gyro.y * 1000.0f, gyro.z * 1000.0f, mag.x, mag.y, mag.z); #if INS_MAX_INSTANCES > 1 if (ins.get_gyro_count() <= 1 && ins.get_accel_count() <= 1 && compass.get_count() <= 1) { return; } const Vector3f &accel2 = ins.get_accel(1); const Vector3f &gyro2 = ins.get_gyro(1); const Vector3f &mag2 = compass.get_field(1); mavlink_msg_scaled_imu2_send( chan, hal.scheduler->millis(), accel2.x * 1000.0f / GRAVITY_MSS, accel2.y * 1000.0f / GRAVITY_MSS, accel2.z * 1000.0f / GRAVITY_MSS, gyro2.x * 1000.0f, gyro2.y * 1000.0f, gyro2.z * 1000.0f, mag2.x, mag2.y, mag2.z); #endif }
bool AP_Arming::ins_accels_consistent(const AP_InertialSensor &ins) { const uint8_t accel_count = ins.get_accel_count(); if (accel_count <= 1) { return true; } const Vector3f &prime_accel_vec = ins.get_accel(); const uint32_t now = AP_HAL::millis(); for(uint8_t i=0; i<accel_count; i++) { if (!ins.use_accel(i)) { continue; } // get next accel vector const Vector3f &accel_vec = ins.get_accel(i); Vector3f vec_diff = accel_vec - prime_accel_vec; // allow for user-defined difference, typically 0.75 m/s/s. Has to pass in last 10 seconds float threshold = accel_error_threshold; if (i >= 2) { /* we allow for a higher threshold for IMU3 as it runs at a different temperature to IMU1/IMU2, and is not used for accel data in the EKF */ threshold *= 3; } // EKF is less sensitive to Z-axis error vec_diff.z *= 0.5f; if (vec_diff.length() <= threshold) { last_accel_pass_ms[i] = now; } if (now - last_accel_pass_ms[i] > 10000) { return false; } } return true; }
static void run_test() { Vector3f accel; Vector3f gyro; float length; uint8_t counter = 0; // flush any user input while( hal.console->available() ) { hal.console->read(); } // clear out any existing samples from ins ins.update(); // loop as long as user does not press a key while( !hal.console->available() ) { // wait until we have a sample ins.wait_for_sample(); // read samples from ins ins.update(); accel = ins.get_accel(); gyro = ins.get_gyro(); length = accel.length(); if (counter++ % 50 == 0) { // display results hal.console->printf_P(PSTR("Accel X:%4.2f \t Y:%4.2f \t Z:%4.2f \t len:%4.2f \t Gyro X:%4.2f \t Y:%4.2f \t Z:%4.2f\n"), accel.x, accel.y, accel.z, length, gyro.x, gyro.y, gyro.z); } } // clear user input while( hal.console->available() ) { hal.console->read(); } }
void GCS_MAVLINK::send_raw_imu(const AP_InertialSensor &ins, const Compass &compass) { const Vector3f &accel = ins.get_accel(0); const Vector3f &gyro = ins.get_gyro(0); Vector3f mag; if (compass.get_count() >= 1) { mag = compass.get_field(0); } else { mag.zero(); } mavlink_msg_raw_imu_send( chan, AP_HAL::micros(), accel.x * 1000.0f / GRAVITY_MSS, accel.y * 1000.0f / GRAVITY_MSS, accel.z * 1000.0f / GRAVITY_MSS, gyro.x * 1000.0f, gyro.y * 1000.0f, gyro.z * 1000.0f, mag.x, mag.y, mag.z); if (ins.get_gyro_count() <= 1 && ins.get_accel_count() <= 1 && compass.get_count() <= 1) { return; } const Vector3f &accel2 = ins.get_accel(1); const Vector3f &gyro2 = ins.get_gyro(1); if (compass.get_count() >= 2) { mag = compass.get_field(1); } else { mag.zero(); } mavlink_msg_scaled_imu2_send( chan, AP_HAL::millis(), accel2.x * 1000.0f / GRAVITY_MSS, accel2.y * 1000.0f / GRAVITY_MSS, accel2.z * 1000.0f / GRAVITY_MSS, gyro2.x * 1000.0f, gyro2.y * 1000.0f, gyro2.z * 1000.0f, mag.x, mag.y, mag.z); if (ins.get_gyro_count() <= 2 && ins.get_accel_count() <= 2 && compass.get_count() <= 2) { return; } const Vector3f &accel3 = ins.get_accel(2); const Vector3f &gyro3 = ins.get_gyro(2); if (compass.get_count() >= 3) { mag = compass.get_field(2); } else { mag.zero(); } mavlink_msg_scaled_imu3_send( chan, AP_HAL::millis(), accel3.x * 1000.0f / GRAVITY_MSS, accel3.y * 1000.0f / GRAVITY_MSS, accel3.z * 1000.0f / GRAVITY_MSS, gyro3.x * 1000.0f, gyro3.y * 1000.0f, gyro3.z * 1000.0f, mag.x, mag.y, mag.z); }
static void run_test() { Vector3f accel; Vector3f gyro; uint8_t counter = 0; static uint8_t accel_count = ins.get_accel_count(); static uint8_t gyro_count = ins.get_gyro_count(); static uint8_t ins_count = MAX(accel_count, gyro_count); // flush any user input while (hal.console->available()) { hal.console->read(); } // clear out any existing samples from ins ins.update(); // loop as long as user does not press a key while (!hal.console->available()) { // wait until we have a sample ins.wait_for_sample(); // read samples from ins ins.update(); // print each accel/gyro result every 50 cycles if (counter++ % 50 != 0) { continue; } // loop and print each sensor for (uint8_t ii = 0; ii < ins_count; ii++) { char state; if (ii > accel_count - 1) { // No accel present state = '-'; } else if (ins.get_accel_health(ii)) { // Healthy accel state = 'h'; } else { // Accel present but not healthy state = 'u'; } accel = ins.get_accel(ii); hal.console->printf("%u - Accel (%c) : X:%6.2f Y:%6.2f Z:%6.2f norm:%5.2f", ii, state, (double)accel.x, (double)accel.y, (double)accel.z, (double)accel.length()); gyro = ins.get_gyro(ii); if (ii > gyro_count - 1) { // No gyro present state = '-'; } else if (ins.get_gyro_health(ii)) { // Healthy gyro state = 'h'; } else { // Gyro present but not healthy state = 'u'; } hal.console->printf(" Gyro (%c) : X:%6.2f Y:%6.2f Z:%6.2f\n", state, (double)gyro.x, (double)gyro.y, (double)gyro.z); auto temp = ins.get_temperature(ii); hal.console->printf(" t:%6.2f\n", (double)temp); } } // clear user input while (hal.console->available()) { hal.console->read(); } }