diff --git a/msg/sensor_accel.msg b/msg/sensor_accel.msg index d6d957cb8fd5..cde66abbb300 100644 --- a/msg/sensor_accel.msg +++ b/msg/sensor_accel.msg @@ -10,9 +10,9 @@ float32 temperature # temperature in degrees celsius float32 range_m_s2 # range in m/s^2 (+- this value) float32 scaling -int16 x_raw -int16 y_raw -int16 z_raw +int16 x_raw # acceleration in the NED X board axis in m/s^2 * 1000 +int16 y_raw # acceleration in the NED Y board axis in m/s^2 * 1000 +int16 z_raw # acceleration in the NED Z board axis in m/s^2 * 1000 int16 temperature_raw uint32 device_id # unique device ID for the sensor that does not change between power cycles diff --git a/msg/sensor_gyro.msg b/msg/sensor_gyro.msg index 8b0b72f12d4d..cc4bfacc8038 100644 --- a/msg/sensor_gyro.msg +++ b/msg/sensor_gyro.msg @@ -10,9 +10,9 @@ float32 temperature # temperature in degrees celcius float32 range_rad_s float32 scaling -int16 x_raw -int16 y_raw -int16 z_raw +int16 x_raw # angular velocity in the NED X board axis in rad/s * 1000 +int16 y_raw # angular velocity in the NED Y board axis in rad/s * 1000 +int16 z_raw # angular velocity in the NED Z board axis in rad/s * 1000 int16 temperature_raw uint32 device_id # unique device ID for the sensor that does not change between power cycles diff --git a/msg/sensor_mag.msg b/msg/sensor_mag.msg index 2eeeca3608c5..f095872cbb8c 100644 --- a/msg/sensor_mag.msg +++ b/msg/sensor_mag.msg @@ -1,15 +1,14 @@ uint64 error_count -float32 x -float32 y -float32 z +float32 x # [Gauss] +float32 y # [Gauss] +float32 z # [Gauss] float32 range_ga float32 scaling float32 temperature -int16 x_raw -int16 y_raw -int16 z_raw +int16 x_raw # [milli Gauss] +int16 y_raw # [milli Gauss] +int16 z_raw # [milli Gauss] uint32 device_id # unique device ID for the sensor that does not change between power cycles bool is_external # if true the mag is external (i.e. not built into the board) - diff --git a/src/drivers/adis16448/adis16448.cpp b/src/drivers/adis16448/adis16448.cpp index 41a57ecd28b4..010e538ab3fa 100644 --- a/src/drivers/adis16448/adis16448.cpp +++ b/src/drivers/adis16448/adis16448.cpp @@ -1437,10 +1437,6 @@ ADIS16448::measure() grb.error_count = arb.error_count = mrb.error_count = perf_event_count(_bad_transfers); /* Gyro report: */ - grb.x_raw = report.gyro_x; - grb.y_raw = report.gyro_y; - grb.z_raw = report.gyro_z; - float xraw_f = report.gyro_x; float yraw_f = report.gyro_y; float zraw_f = report.gyro_z; @@ -1448,6 +1444,10 @@ ADIS16448::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + grb.x_raw = (int16_t)(xraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + grb.y_raw = (int16_t)(yraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + grb.z_raw = (int16_t)(zraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + float x_gyro_in_new = ((xraw_f * _gyro_range_scale) * M_PI_F / 180.0f - _gyro_scale.x_offset) * _gyro_scale.x_scale; float y_gyro_in_new = ((yraw_f * _gyro_range_scale) * M_PI_F / 180.0f - _gyro_scale.y_offset) * _gyro_scale.y_scale; float z_gyro_in_new = ((zraw_f * _gyro_range_scale) * M_PI_F / 180.0f - _gyro_scale.z_offset) * _gyro_scale.z_scale; @@ -1467,10 +1467,6 @@ ADIS16448::measure() grb.range_rad_s = _gyro_range_rad_s; /* Accel report: */ - arb.x_raw = report.accel_x; - arb.y_raw = report.accel_y; - arb.z_raw = report.accel_z; - xraw_f = report.accel_x; yraw_f = report.accel_y; zraw_f = report.accel_z; @@ -1478,6 +1474,10 @@ ADIS16448::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + arb.x_raw = (int16_t)(xraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + arb.y_raw = (int16_t)(yraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + arb.z_raw = (int16_t)(zraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + float x_in_new = ((xraw_f * _accel_range_scale) - _accel_scale.x_offset) * _accel_scale.x_scale; float y_in_new = ((yraw_f * _accel_range_scale) - _accel_scale.y_offset) * _accel_scale.y_scale; float z_in_new = ((zraw_f * _accel_range_scale) - _accel_scale.z_offset) * _accel_scale.z_scale; @@ -1497,10 +1497,6 @@ ADIS16448::measure() arb.range_m_s2 = _accel_range_m_s2; /* Mag report: */ - mrb.x_raw = report.mag_x; - mrb.y_raw = report.mag_y; - mrb.z_raw = report.mag_z; - xraw_f = report.mag_x; yraw_f = report.mag_y; zraw_f = report.mag_z; @@ -1508,6 +1504,10 @@ ADIS16448::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + mrb.x_raw = (int16_t)(xraw_f * _mag_range_scale * 1000); // (int16) [Gs * 1000] + mrb.y_raw = (int16_t)(yraw_f * _mag_range_scale * 1000); // (int16) [Gs * 1000] + mrb.z_raw = (int16_t)(zraw_f * _mag_range_scale * 1000); // (int16) [Gs * 1000] + float x_mag_new = ((xraw_f * _mag_range_scale) - _mag_scale.x_offset) * _mag_scale.x_scale; float y_mag_new = ((yraw_f * _mag_range_scale) - _mag_scale.y_offset) * _mag_scale.y_scale; float z_mag_new = ((zraw_f * _mag_range_scale) - _mag_scale.z_offset) * _mag_scale.z_scale; diff --git a/src/drivers/bma180/bma180.cpp b/src/drivers/bma180/bma180.cpp index 537666653268..d1cf4175a9d7 100644 --- a/src/drivers/bma180/bma180.cpp +++ b/src/drivers/bma180/bma180.cpp @@ -725,6 +725,11 @@ BMA180::measure() report.x = ((report.x_raw * _accel_range_scale) - _accel_scale.x_offset) * _accel_scale.x_scale; report.y = ((report.y_raw * _accel_range_scale) - _accel_scale.y_offset) * _accel_scale.y_scale; report.z = ((report.z_raw * _accel_range_scale) - _accel_scale.z_offset) * _accel_scale.z_scale; + + report.x_raw = (int16_t)(report.x_raw * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + report.y_raw = (int16_t)(report.y_raw * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + report.z_raw = (int16_t)(report.z_raw * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + report.scaling = _accel_range_scale; report.range_m_s2 = _accel_range_m_s2; diff --git a/src/drivers/bmi055/bmi055_accel.cpp b/src/drivers/bmi055/bmi055_accel.cpp index 66d05f09ffa6..60d99958ea4a 100644 --- a/src/drivers/bmi055/bmi055_accel.cpp +++ b/src/drivers/bmi055/bmi055_accel.cpp @@ -739,10 +739,6 @@ BMI055_accel::measure() * */ - arb.x_raw = report.accel_x; - arb.y_raw = report.accel_y; - arb.z_raw = report.accel_z; - float xraw_f = report.accel_x; float yraw_f = report.accel_y; float zraw_f = report.accel_z; @@ -750,6 +746,10 @@ BMI055_accel::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + arb.x_raw = (int16_t)(xraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + arb.y_raw = (int16_t)(yraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + arb.z_raw = (int16_t)(zraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + float x_in_new = ((xraw_f * _accel_range_scale) - _accel_scale.x_offset) * _accel_scale.x_scale; float y_in_new = ((yraw_f * _accel_range_scale) - _accel_scale.y_offset) * _accel_scale.y_scale; float z_in_new = ((zraw_f * _accel_range_scale) - _accel_scale.z_offset) * _accel_scale.z_scale; @@ -863,5 +863,3 @@ BMI055_accel::print_registers() printf("\n"); } - - diff --git a/src/drivers/bmi055/bmi055_gyro.cpp b/src/drivers/bmi055/bmi055_gyro.cpp index 2829c17f53f7..87c5744f79e8 100644 --- a/src/drivers/bmi055/bmi055_gyro.cpp +++ b/src/drivers/bmi055/bmi055_gyro.cpp @@ -711,10 +711,6 @@ BMI055_gyro::measure() * 74 from all measurements centers them around zero. */ - grb.x_raw = report.gyro_x; - grb.y_raw = report.gyro_y; - grb.z_raw = report.gyro_z; - float xraw_f = report.gyro_x; float yraw_f = report.gyro_y; float zraw_f = report.gyro_z; @@ -722,6 +718,10 @@ BMI055_gyro::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + grb.x_raw = (int16_t)(xraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + grb.y_raw = (int16_t)(yraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + grb.z_raw = (int16_t)(zraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + float x_gyro_in_new = ((xraw_f * _gyro_range_scale) - _gyro_scale.x_offset) * _gyro_scale.x_scale; float y_gyro_in_new = ((yraw_f * _gyro_range_scale) - _gyro_scale.y_offset) * _gyro_scale.y_scale; float z_gyro_in_new = ((zraw_f * _gyro_range_scale) - _gyro_scale.z_offset) * _gyro_scale.z_scale; @@ -842,7 +842,3 @@ BMI055_gyro::print_registers() printf("\n"); } - - - - diff --git a/src/drivers/bmi160/bmi160.cpp b/src/drivers/bmi160/bmi160.cpp index fd51c6aeee4b..7efc6dd7ffff 100644 --- a/src/drivers/bmi160/bmi160.cpp +++ b/src/drivers/bmi160/bmi160.cpp @@ -1161,10 +1161,6 @@ BMI160::measure() /* NOTE: Axes have been swapped to match the board a few lines above. */ - arb.x_raw = report.accel_x; - arb.y_raw = report.accel_y; - arb.z_raw = report.accel_z; - float xraw_f = report.accel_x; float yraw_f = report.accel_y; float zraw_f = report.accel_z; @@ -1172,6 +1168,10 @@ BMI160::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + arb.x_raw = (int16_t)(xraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + arb.y_raw = (int16_t)(yraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + arb.z_raw = (int16_t)(zraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + float x_in_new = ((xraw_f * _accel_range_scale) - _accel_scale.x_offset) * _accel_scale.x_scale; float y_in_new = ((yraw_f * _accel_range_scale) - _accel_scale.y_offset) * _accel_scale.y_scale; float z_in_new = ((zraw_f * _accel_range_scale) - _accel_scale.z_offset) * _accel_scale.z_scale; @@ -1199,10 +1199,6 @@ BMI160::measure() /* return device ID */ arb.device_id = _device_id.devid; - grb.x_raw = report.gyro_x; - grb.y_raw = report.gyro_y; - grb.z_raw = report.gyro_z; - xraw_f = report.gyro_x; yraw_f = report.gyro_y; zraw_f = report.gyro_z; @@ -1210,6 +1206,10 @@ BMI160::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + grb.x_raw = (int16_t)(xraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + grb.y_raw = (int16_t)(yraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + grb.z_raw = (int16_t)(zraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + float x_gyro_in_new = ((xraw_f * _gyro_range_scale) - _gyro_scale.x_offset) * _gyro_scale.x_scale; float y_gyro_in_new = ((yraw_f * _gyro_range_scale) - _gyro_scale.y_offset) * _gyro_scale.y_scale; float z_gyro_in_new = ((zraw_f * _gyro_range_scale) - _gyro_scale.z_offset) * _gyro_scale.z_scale; diff --git a/src/drivers/bmm150/bmm150.cpp b/src/drivers/bmm150/bmm150.cpp index 590b64e5383f..27df3d257421 100644 --- a/src/drivers/bmm150/bmm150.cpp +++ b/src/drivers/bmm150/bmm150.cpp @@ -687,6 +687,10 @@ BMM150::collect() // apply user specified rotation rotate_3f(_rotation, mrb.x, mrb.y, mrb.z); + mrb.x_raw = (int16_t)(mrb.x * _range_scale * 1000); // (int16) [Gs * 1000] + mrb.y_raw = (int16_t)(mrb.y * _range_scale * 1000); // (int16) [Gs * 1000] + mrb.z_raw = (int16_t)(mrb.z * _range_scale * 1000); // (int16) [Gs * 1000] + /* Scaling the data */ mrb.x = ((mrb.x * _range_scale) - _scale.x_offset) * _scale.x_scale; diff --git a/src/drivers/fxas21002c/fxas21002c.cpp b/src/drivers/fxas21002c/fxas21002c.cpp index 546f142a5f15..ee37d419ee16 100644 --- a/src/drivers/fxas21002c/fxas21002c.cpp +++ b/src/drivers/fxas21002c/fxas21002c.cpp @@ -1045,17 +1045,17 @@ FXAS21002C::measure() // whether it has had failures gyro_report.error_count = perf_event_count(_bad_registers); - gyro_report.x_raw = swap16(raw_gyro_report.x); - gyro_report.y_raw = swap16(raw_gyro_report.y); - gyro_report.z_raw = swap16(raw_gyro_report.z); - - float xraw_f = gyro_report.x_raw; - float yraw_f = gyro_report.y_raw; - float zraw_f = gyro_report.z_raw; + float xraw_f = swap16(raw_gyro_report.x); + float yraw_f = swap16(raw_gyro_report.y); + float zraw_f = swap16(raw_gyro_report.z); // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + gyro_report.x_raw = (int16_t)(xraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + gyro_report.y_raw = (int16_t)(yraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + gyro_report.z_raw = (int16_t)(zraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + float x_in_new = ((xraw_f * _gyro_range_scale) - _gyro_scale.x_offset) * _gyro_scale.x_scale; float y_in_new = ((yraw_f * _gyro_range_scale) - _gyro_scale.y_offset) * _gyro_scale.y_scale; float z_in_new = ((zraw_f * _gyro_range_scale) - _gyro_scale.z_offset) * _gyro_scale.z_scale; diff --git a/src/drivers/fxos8701cq/fxos8701cq.cpp b/src/drivers/fxos8701cq/fxos8701cq.cpp index fae4ab7ddb4a..b6308db04f20 100644 --- a/src/drivers/fxos8701cq/fxos8701cq.cpp +++ b/src/drivers/fxos8701cq/fxos8701cq.cpp @@ -1405,23 +1405,23 @@ FXOS8701CQ::measure() // whether it has had failures accel_report.error_count = perf_event_count(_bad_registers) + perf_event_count(_bad_values); - accel_report.x_raw = swap16RightJustify14(raw_accel_mag_report.x); - accel_report.y_raw = swap16RightJustify14(raw_accel_mag_report.y); - accel_report.z_raw = swap16RightJustify14(raw_accel_mag_report.z); - /* Save off the Mag readings todo: revist integrating theses */ _last_raw_mag_x = swap16(raw_accel_mag_report.mx); _last_raw_mag_y = swap16(raw_accel_mag_report.my); _last_raw_mag_z = swap16(raw_accel_mag_report.mz); - float xraw_f = accel_report.x_raw; - float yraw_f = accel_report.y_raw; - float zraw_f = accel_report.z_raw; + float xraw_f = swap16RightJustify14(raw_accel_mag_report.x); + float yraw_f = swap16RightJustify14(raw_accel_mag_report.y); + float zraw_f = swap16RightJustify14(raw_accel_mag_report.z); // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + accel_report.x_raw = (int16_t)(xraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + accel_report.y_raw = (int16_t)(yraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + accel_report.z_raw = (int16_t)(zraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + float x_in_new = ((xraw_f * _accel_range_scale) - _accel_scale.x_offset) * _accel_scale.x_scale; float y_in_new = ((yraw_f * _accel_range_scale) - _accel_scale.y_offset) * _accel_scale.y_scale; float z_in_new = ((zraw_f * _accel_range_scale) - _accel_scale.z_offset) * _accel_scale.z_scale; @@ -1522,17 +1522,17 @@ FXOS8701CQ::mag_measure() mag_report.timestamp = hrt_absolute_time(); mag_report.is_external = external(); - mag_report.x_raw = _last_raw_mag_x; - mag_report.y_raw = _last_raw_mag_y; - mag_report.z_raw = _last_raw_mag_z; - - float xraw_f = mag_report.x_raw; - float yraw_f = mag_report.y_raw; - float zraw_f = mag_report.z_raw; + float xraw_f = _last_raw_mag_x; + float yraw_f = _last_raw_mag_y; + float zraw_f = _last_raw_mag_z; /* apply user specified rotation */ rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + mag_report.x_raw = (int16_t)(xraw_f * _mag_range_scale * 1000); // (int16) [Gs * 1000] + mag_report.y_raw = (int16_t)(yraw_f * _mag_range_scale * 1000); // (int16) [Gs * 1000] + mag_report.z_raw = (int16_t)(zraw_f * _mag_range_scale * 1000); // (int16) [Gs * 1000] + mag_report.x = ((xraw_f * _mag_range_scale) - _mag_scale.x_offset) * _mag_scale.x_scale; mag_report.y = ((yraw_f * _mag_range_scale) - _mag_scale.y_offset) * _mag_scale.y_scale; mag_report.z = ((zraw_f * _mag_range_scale) - _mag_scale.z_offset) * _mag_scale.z_scale; diff --git a/src/drivers/hmc5883/hmc5883.cpp b/src/drivers/hmc5883/hmc5883.cpp index 031cbb712987..286020cedb88 100644 --- a/src/drivers/hmc5883/hmc5883.cpp +++ b/src/drivers/hmc5883/hmc5883.cpp @@ -971,17 +971,6 @@ HMC5883::collect() } } - /* - * RAW outputs - * - * to align the sensor axes with the board, x and y need to be flipped - * and y needs to be negated - */ - new_report.x_raw = -report.y; - new_report.y_raw = report.x; - /* z remains z */ - new_report.z_raw = report.z; - /* scale values for output */ // XXX revisit for SPI part, might require a bus type IOCTL @@ -1006,6 +995,10 @@ HMC5883::collect() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + new_report.x_raw = (int16_t)(xraw_f * _range_scale * 1000); // (int16) [Gs * 1000] + new_report.y_raw = (int16_t)(yraw_f * _range_scale * 1000); // (int16) [Gs * 1000] + new_report.z_raw = (int16_t)(zraw_f * _range_scale * 1000); // (int16) [Gs * 1000] + new_report.x = ((xraw_f * _range_scale) - _scale.x_offset) * _scale.x_scale; /* flip axes and negate value for y */ new_report.y = ((yraw_f * _range_scale) - _scale.y_offset) * _scale.y_scale; diff --git a/src/drivers/ist8310/ist8310.cpp b/src/drivers/ist8310/ist8310.cpp index 689db00532a8..95d82e20e15d 100644 --- a/src/drivers/ist8310/ist8310.cpp +++ b/src/drivers/ist8310/ist8310.cpp @@ -950,16 +950,6 @@ IST8310::collect() /* temperature measurement is not available on IST8310 */ new_report.temperature = 0; - /* - * raw outputs - * - * Sensor doesn't follow right hand rule, swap x and y to make it obey - * it. - */ - new_report.x_raw = report.y; - new_report.y_raw = report.x; - new_report.z_raw = report.z; - /* scale values for output */ xraw_f = report.y; yraw_f = report.x; @@ -967,6 +957,11 @@ IST8310::collect() /* apply user specified rotation */ rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + + new_report.x_raw = (int16_t)(xraw_f * _range_scale * 1000); // (int16) [Gs * 1000] + new_report.y_raw = (int16_t)(yraw_f * _range_scale * 1000); // (int16) [Gs * 1000] + new_report.z_raw = (int16_t)(zraw_f * _range_scale * 1000); // (int16) [Gs * 1000] + new_report.x = ((xraw_f * _range_scale) - _scale.x_offset) * _scale.x_scale; new_report.y = ((yraw_f * _range_scale) - _scale.y_offset) * _scale.y_scale; new_report.z = ((zraw_f * _range_scale) - _scale.z_offset) * _scale.z_scale; diff --git a/src/drivers/l3gd20/l3gd20.cpp b/src/drivers/l3gd20/l3gd20.cpp index 356c93bdfd61..52ceea54b00c 100644 --- a/src/drivers/l3gd20/l3gd20.cpp +++ b/src/drivers/l3gd20/l3gd20.cpp @@ -1024,6 +1024,10 @@ L3GD20::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + report.x_raw = (int16_t)(xraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + report.y_raw = (int16_t)(yraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + report.z_raw = (int16_t)(zraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + float xin = ((xraw_f * _gyro_range_scale) - _gyro_scale.x_offset) * _gyro_scale.x_scale; float yin = ((yraw_f * _gyro_range_scale) - _gyro_scale.y_offset) * _gyro_scale.y_scale; float zin = ((zraw_f * _gyro_range_scale) - _gyro_scale.z_offset) * _gyro_scale.z_scale; diff --git a/src/drivers/lis3mdl/lis3mdl.cpp b/src/drivers/lis3mdl/lis3mdl.cpp index 64bd8f7a71c5..98b71cac6cda 100644 --- a/src/drivers/lis3mdl/lis3mdl.cpp +++ b/src/drivers/lis3mdl/lis3mdl.cpp @@ -938,14 +938,6 @@ LIS3MDL::collect() sensor_is_onboard = !_interface->ioctl(MAGIOCGEXTERNAL, dummy); new_report.is_external = !sensor_is_onboard; - /* - * RAW outputs - * - */ - new_report.x_raw = report.x; - new_report.y_raw = report.y; - new_report.z_raw = report.z; - /* the LIS3MDL mag on Pixhawk Pro by Drotek has x pointing towards, * y pointing to the right, and z down, therefore no switch needed, * it is better to have no artificial rotation inside the @@ -958,6 +950,10 @@ LIS3MDL::collect() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + new_report.x_raw = (int16_t)(xraw_f * _range_scale * 1000); // (int16) [Gs * 1000] + new_report.y_raw = (int16_t)(yraw_f * _range_scale * 1000); // (int16) [Gs * 1000] + new_report.z_raw = (int16_t)(zraw_f * _range_scale * 1000); // (int16) [Gs * 1000] + new_report.x = ((xraw_f * _range_scale) - _scale.x_offset) * _scale.x_scale; /* flip axes and negate value for y */ new_report.y = ((yraw_f * _range_scale) - _scale.y_offset) * _scale.y_scale; diff --git a/src/drivers/lsm303d/lsm303d.cpp b/src/drivers/lsm303d/lsm303d.cpp index 9268090e5ec5..131ce90ac857 100644 --- a/src/drivers/lsm303d/lsm303d.cpp +++ b/src/drivers/lsm303d/lsm303d.cpp @@ -1518,10 +1518,6 @@ LSM303D::measure() // whether it has had failures accel_report.error_count = perf_event_count(_bad_registers) + perf_event_count(_bad_values); - accel_report.x_raw = raw_accel_report.x; - accel_report.y_raw = raw_accel_report.y; - accel_report.z_raw = raw_accel_report.z; - float xraw_f = raw_accel_report.x; float yraw_f = raw_accel_report.y; float zraw_f = raw_accel_report.z; @@ -1529,6 +1525,10 @@ LSM303D::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + accel_report.x_raw = (int16_t)(xraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + accel_report.y_raw = (int16_t)(yraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + accel_report.z_raw = (int16_t)(zraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + float x_in_new = ((xraw_f * _accel_range_scale) - _accel_scale.x_offset) * _accel_scale.x_scale; float y_in_new = ((yraw_f * _accel_range_scale) - _accel_scale.y_offset) * _accel_scale.y_scale; float z_in_new = ((zraw_f * _accel_range_scale) - _accel_scale.z_offset) * _accel_scale.z_scale; @@ -1644,17 +1644,17 @@ LSM303D::mag_measure() mag_report.timestamp = hrt_absolute_time(); mag_report.is_external = external(); - mag_report.x_raw = raw_mag_report.x; - mag_report.y_raw = raw_mag_report.y; - mag_report.z_raw = raw_mag_report.z; - - float xraw_f = mag_report.x_raw; - float yraw_f = mag_report.y_raw; - float zraw_f = mag_report.z_raw; + float xraw_f = raw_mag_report.x; + float yraw_f = raw_mag_report.y; + float zraw_f = raw_mag_report.z; /* apply user specified rotation */ rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + mag_report.x_raw = (int16_t)(xraw_f * _mag_range_scale * 1000); // (int16) [Gs * 1000] + mag_report.y_raw = (int16_t)(yraw_f * _mag_range_scale * 1000); // (int16) [Gs * 1000] + mag_report.z_raw = (int16_t)(zraw_f * _mag_range_scale * 1000); // (int16) [Gs * 1000] + mag_report.x = ((xraw_f * _mag_range_scale) - _mag_scale.x_offset) * _mag_scale.x_scale; mag_report.y = ((yraw_f * _mag_range_scale) - _mag_scale.y_offset) * _mag_scale.y_scale; mag_report.z = ((zraw_f * _mag_range_scale) - _mag_scale.z_offset) * _mag_scale.z_scale; diff --git a/src/drivers/mpu6000/mpu6000.cpp b/src/drivers/mpu6000/mpu6000.cpp index da29dcf54cb1..0f49a33a4f49 100644 --- a/src/drivers/mpu6000/mpu6000.cpp +++ b/src/drivers/mpu6000/mpu6000.cpp @@ -1990,10 +1990,6 @@ MPU6000::measure() /* NOTE: Axes have been swapped to match the board a few lines above. */ - arb.x_raw = report.accel_x; - arb.y_raw = report.accel_y; - arb.z_raw = report.accel_z; - float xraw_f = report.accel_x; float yraw_f = report.accel_y; float zraw_f = report.accel_z; @@ -2001,6 +1997,10 @@ MPU6000::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + arb.x_raw = (int16_t)(xraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + arb.y_raw = (int16_t)(yraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + arb.z_raw = (int16_t)(zraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + float x_in_new = ((xraw_f * _accel_range_scale) - _accel_scale.x_offset) * _accel_scale.x_scale; float y_in_new = ((yraw_f * _accel_range_scale) - _accel_scale.y_offset) * _accel_scale.y_scale; float z_in_new = ((zraw_f * _accel_range_scale) - _accel_scale.z_offset) * _accel_scale.z_scale; @@ -2033,10 +2033,6 @@ MPU6000::measure() /* return device ID */ arb.device_id = _device_id.devid; - grb.x_raw = report.gyro_x; - grb.y_raw = report.gyro_y; - grb.z_raw = report.gyro_z; - xraw_f = report.gyro_x; yraw_f = report.gyro_y; zraw_f = report.gyro_z; @@ -2044,6 +2040,10 @@ MPU6000::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + grb.x_raw = (int16_t)(xraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + grb.y_raw = (int16_t)(yraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + grb.z_raw = (int16_t)(zraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + float x_gyro_in_new = ((xraw_f * _gyro_range_scale) - _gyro_scale.x_offset) * _gyro_scale.x_scale; float y_gyro_in_new = ((yraw_f * _gyro_range_scale) - _gyro_scale.y_offset) * _gyro_scale.y_scale; float z_gyro_in_new = ((zraw_f * _gyro_range_scale) - _gyro_scale.z_offset) * _gyro_scale.z_scale; diff --git a/src/drivers/mpu9250/mag.cpp b/src/drivers/mpu9250/mag.cpp index 9e8289535a8a..2c17e54a3200 100644 --- a/src/drivers/mpu9250/mag.cpp +++ b/src/drivers/mpu9250/mag.cpp @@ -211,9 +211,6 @@ MPU9250_mag::_measure(struct ak8963_regs data) * Align axes - note the accel & gryo are also re-aligned so this * doesn't look obvious with the datasheet */ - mrb.x_raw = data.x; - mrb.y_raw = -data.y; - mrb.z_raw = -data.z; float xraw_f = data.x; float yraw_f = -data.y; @@ -222,6 +219,10 @@ MPU9250_mag::_measure(struct ak8963_regs data) /* apply user specified rotation */ rotate_3f(_parent->_rotation, xraw_f, yraw_f, zraw_f); + mrb.x_raw = (int16_t)(xraw_f * _mag_range_scale * _mag_asa_x * 1000); // (int16) [Gs * 1000] + mrb.y_raw = (int16_t)(yraw_f * _mag_range_scale * _mag_asa_x * 1000); // (int16) [Gs * 1000] + mrb.z_raw = (int16_t)(zraw_f * _mag_range_scale * _mag_asa_x * 1000); // (int16) [Gs * 1000] + mrb.x = ((xraw_f * _mag_range_scale * _mag_asa_x) - _mag_scale.x_offset) * _mag_scale.x_scale; mrb.y = ((yraw_f * _mag_range_scale * _mag_asa_y) - _mag_scale.y_offset) * _mag_scale.y_scale; mrb.z = ((zraw_f * _mag_range_scale * _mag_asa_z) - _mag_scale.z_offset) * _mag_scale.z_scale; diff --git a/src/drivers/mpu9250/mpu9250.cpp b/src/drivers/mpu9250/mpu9250.cpp index 03fcff7e6f9d..3e14367d49b0 100644 --- a/src/drivers/mpu9250/mpu9250.cpp +++ b/src/drivers/mpu9250/mpu9250.cpp @@ -1404,10 +1404,6 @@ MPU9250::measure() /* NOTE: Axes have been swapped to match the board a few lines above. */ - arb.x_raw = report.accel_x; - arb.y_raw = report.accel_y; - arb.z_raw = report.accel_z; - float xraw_f = report.accel_x; float yraw_f = report.accel_y; float zraw_f = report.accel_z; @@ -1415,6 +1411,10 @@ MPU9250::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + arb.x_raw = (int16_t)(xraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + arb.y_raw = (int16_t)(yraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + arb.z_raw = (int16_t)(zraw_f * _accel_range_scale * 1000); // (int16) [m / s^2 * 1000] + float x_in_new = ((xraw_f * _accel_range_scale) - _accel_scale.x_offset) * _accel_scale.x_scale; float y_in_new = ((yraw_f * _accel_range_scale) - _accel_scale.y_offset) * _accel_scale.y_scale; float z_in_new = ((zraw_f * _accel_range_scale) - _accel_scale.z_offset) * _accel_scale.z_scale; @@ -1442,10 +1442,6 @@ MPU9250::measure() /* return device ID */ arb.device_id = _device_id.devid; - grb.x_raw = report.gyro_x; - grb.y_raw = report.gyro_y; - grb.z_raw = report.gyro_z; - xraw_f = report.gyro_x; yraw_f = report.gyro_y; zraw_f = report.gyro_z; @@ -1453,6 +1449,10 @@ MPU9250::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + grb.x_raw = (int16_t)(xraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + grb.y_raw = (int16_t)(yraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + grb.z_raw = (int16_t)(zraw_f * _gyro_range_scale * 1000); // (int16) [rad / s * 1000] + float x_gyro_in_new = ((xraw_f * _gyro_range_scale) - _gyro_scale.x_offset) * _gyro_scale.x_scale; float y_gyro_in_new = ((yraw_f * _gyro_range_scale) - _gyro_scale.y_offset) * _gyro_scale.y_scale; float z_gyro_in_new = ((zraw_f * _gyro_range_scale) - _gyro_scale.z_offset) * _gyro_scale.z_scale; diff --git a/src/modules/mavlink/mavlink_messages.cpp b/src/modules/mavlink/mavlink_messages.cpp index d4a47046fcec..d5cc9d3a89f4 100644 --- a/src/modules/mavlink/mavlink_messages.cpp +++ b/src/modules/mavlink/mavlink_messages.cpp @@ -69,6 +69,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -726,6 +729,99 @@ class MavlinkStreamHighresIMU : public MavlinkStream }; +class MavlinkStreamScaledIMU : public MavlinkStream +{ +public: + const char *get_name() const + { + return MavlinkStreamScaledIMU::get_name_static(); + } + + static const char *get_name_static() + { + return "SCALED_IMU"; + } + + static uint16_t get_id_static() + { + return MAVLINK_MSG_ID_SCALED_IMU; + } + + uint16_t get_id() + { + return get_id_static(); + } + + static MavlinkStream *new_instance(Mavlink *mavlink) + { + return new MavlinkStreamScaledIMU(mavlink); + } + + unsigned get_size() + { + return _raw_accel_sub->is_published() ? (MAVLINK_MSG_ID_SCALED_IMU_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES) : 0; + } + +private: + MavlinkOrbSubscription *_raw_accel_sub; + MavlinkOrbSubscription *_raw_gyro_sub; + MavlinkOrbSubscription *_sensor_mag_sub; + uint64_t _raw_accel_time; + uint64_t _raw_gyro_time; + uint64_t _sensor_mag_time; + struct sensor_gyro_s _sensor_gyro; + struct sensor_mag_s _sensor_mag; + + /* do not allow top copying this class */ + MavlinkStreamScaledIMU(MavlinkStreamScaledIMU &); + MavlinkStreamScaledIMU &operator = (const MavlinkStreamScaledIMU &); + +protected: + explicit MavlinkStreamScaledIMU(Mavlink *mavlink) : MavlinkStream(mavlink), + _raw_accel_sub(_mavlink->add_orb_subscription(ORB_ID(sensor_accel))), + _raw_gyro_sub(_mavlink->add_orb_subscription(ORB_ID(sensor_gyro))), + _sensor_mag_sub(_mavlink->add_orb_subscription(ORB_ID(sensor_mag))), + _raw_accel_time(0), + _raw_gyro_time(0), + _sensor_gyro{}, + _sensor_mag{} + {} + + bool send(const hrt_abstime t) + { + struct sensor_accel_s sensor_accel = {}; + + bool raw_accel_updated = _raw_accel_sub->update(&_raw_accel_time, &sensor_accel); + _raw_gyro_sub->update(&_raw_gyro_time, &_sensor_gyro); + _sensor_mag_sub->update(&_sensor_mag_time, &_sensor_mag); + + // send if raw_accel has been updated and use the newest gyro/mag values we have + if (raw_accel_updated) { + + const float milliGs_to_milliT = 1e-4; // 1 Gs = 1e-4 T + mavlink_scaled_imu_t msg = {}; + + msg.time_boot_ms = sensor_accel.timestamp / 1000; + msg.xacc = (int16_t)(sensor_accel.x_raw / CONSTANTS_ONE_G); // [milli g] + msg.yacc = (int16_t)(sensor_accel.y_raw / CONSTANTS_ONE_G); // [milli g] + msg.zacc = (int16_t)(sensor_accel.z_raw / CONSTANTS_ONE_G); // [milli g] + msg.xgyro = _sensor_gyro.x_raw; // [milli rad/s] + msg.ygyro = _sensor_gyro.y_raw; // [milli rad/s] + msg.zgyro = _sensor_gyro.z_raw; // [milli rad/s] + msg.xmag = (int16_t)(_sensor_mag.x_raw * milliGs_to_milliT); // [milli T] + msg.ymag = (int16_t)(_sensor_mag.y_raw * milliGs_to_milliT); // [milli T] + msg.zmag = (int16_t)(_sensor_mag.z_raw * milliGs_to_milliT); // [milli T] + + mavlink_msg_scaled_imu_send_struct(_mavlink->get_channel(), &msg); + + return true; + } + + return false; + } +}; + + class MavlinkStreamAttitude : public MavlinkStream { public: @@ -4286,6 +4382,7 @@ const StreamListItem *streams_list[] = { new StreamListItem(&MavlinkStreamCommandLong::new_instance, &MavlinkStreamCommandLong::get_name_static, &MavlinkStreamCommandLong::get_id_static), new StreamListItem(&MavlinkStreamSysStatus::new_instance, &MavlinkStreamSysStatus::get_name_static, &MavlinkStreamSysStatus::get_id_static), new StreamListItem(&MavlinkStreamHighresIMU::new_instance, &MavlinkStreamHighresIMU::get_name_static, &MavlinkStreamHighresIMU::get_id_static), + new StreamListItem(&MavlinkStreamScaledIMU::new_instance, &MavlinkStreamScaledIMU::get_name_static, &MavlinkStreamScaledIMU::get_id_static), new StreamListItem(&MavlinkStreamAttitude::new_instance, &MavlinkStreamAttitude::get_name_static, &MavlinkStreamAttitude::get_id_static), new StreamListItem(&MavlinkStreamAttitudeQuaternion::new_instance, &MavlinkStreamAttitudeQuaternion::get_name_static, &MavlinkStreamAttitudeQuaternion::get_id_static), new StreamListItem(&MavlinkStreamVFRHUD::new_instance, &MavlinkStreamVFRHUD::get_name_static, &MavlinkStreamVFRHUD::get_id_static), diff --git a/src/modules/mavlink/mavlink_receiver.cpp b/src/modules/mavlink/mavlink_receiver.cpp index 1d3b2dd3a29b..aa2eac16fd22 100644 --- a/src/modules/mavlink/mavlink_receiver.cpp +++ b/src/modules/mavlink/mavlink_receiver.cpp @@ -90,8 +90,6 @@ #include "mavlink_main.h" #include "mavlink_command_sender.h" -static const float mg2ms2 = CONSTANTS_ONE_G / 1000.0f; - MavlinkReceiver::MavlinkReceiver(Mavlink *parent) : _mavlink(parent), _mission_manager(parent), @@ -1860,9 +1858,9 @@ MavlinkReceiver::handle_message_hil_sensor(mavlink_message_t *msg) struct accel_report accel = {}; accel.timestamp = timestamp; - accel.x_raw = imu.xacc / mg2ms2; - accel.y_raw = imu.yacc / mg2ms2; - accel.z_raw = imu.zacc / mg2ms2; + accel.x_raw = imu.xacc * 1000; + accel.y_raw = imu.yacc * 1000; + accel.z_raw = imu.zacc * 1000; accel.x = imu.xacc; accel.y = imu.yacc; accel.z = imu.zacc; @@ -2219,9 +2217,9 @@ MavlinkReceiver::handle_message_hil_state_quaternion(mavlink_message_t *msg) struct accel_report accel = {}; accel.timestamp = timestamp; - accel.x_raw = hil_state.xacc / CONSTANTS_ONE_G * 1e3f; - accel.y_raw = hil_state.yacc / CONSTANTS_ONE_G * 1e3f; - accel.z_raw = hil_state.zacc / CONSTANTS_ONE_G * 1e3f; + accel.x_raw = hil_state.xacc * 1000; + accel.y_raw = hil_state.yacc * 1000; + accel.z_raw = hil_state.zacc * 1000; accel.x = hil_state.xacc; accel.y = hil_state.yacc; accel.z = hil_state.zacc; diff --git a/src/platforms/posix/drivers/accelsim/accelsim.cpp b/src/platforms/posix/drivers/accelsim/accelsim.cpp index ca8deaa85f2a..8d705da2575c 100644 --- a/src/platforms/posix/drivers/accelsim/accelsim.cpp +++ b/src/platforms/posix/drivers/accelsim/accelsim.cpp @@ -853,9 +853,9 @@ ACCELSIM::_measure() // whether it has had failures accel_report.error_count = perf_event_count(_bad_registers) + perf_event_count(_bad_values); - accel_report.x_raw = (int16_t)(raw_accel_report.x / _accel_range_scale); - accel_report.y_raw = (int16_t)(raw_accel_report.y / _accel_range_scale); - accel_report.z_raw = (int16_t)(raw_accel_report.z / _accel_range_scale); + accel_report.x_raw = (int16_t)(raw_accel_report.x * 1000); + accel_report.y_raw = (int16_t)(raw_accel_report.y * 1000); + accel_report.z_raw = (int16_t)(raw_accel_report.z * 1000); accel_report.x = raw_accel_report.x; accel_report.y = raw_accel_report.y; @@ -929,18 +929,18 @@ ACCELSIM::mag_measure() mag_report.timestamp = hrt_absolute_time(); mag_report.is_external = false; - mag_report.x_raw = (int16_t)(raw_mag_report.x / _mag_range_scale); - mag_report.y_raw = (int16_t)(raw_mag_report.y / _mag_range_scale); - mag_report.z_raw = (int16_t)(raw_mag_report.z / _mag_range_scale); - - float xraw_f = (int16_t)(raw_mag_report.x / _mag_range_scale); - float yraw_f = (int16_t)(raw_mag_report.y / _mag_range_scale); - float zraw_f = (int16_t)(raw_mag_report.z / _mag_range_scale); + float xraw_f = raw_mag_report.x / _mag_range_scale; + float yraw_f = raw_mag_report.y / _mag_range_scale; + float zraw_f = raw_mag_report.z / _mag_range_scale; /* apply user specified rotation */ rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + mag_report.x_raw = (int16_t)(xraw_f * 1000); // (int16) [Gs * 1000] + mag_report.y_raw = (int16_t)(xraw_f * 1000); // (int16) [Gs * 1000] + mag_report.z_raw = (int16_t)(xraw_f * 1000); // (int16) [Gs * 1000] + /* remember the temperature. The datasheet isn't clear, but it * seems to be a signed offset from 25 degrees C in units of 0.125C */ diff --git a/src/platforms/posix/drivers/df_ak8963_wrapper/df_ak8963_wrapper.cpp b/src/platforms/posix/drivers/df_ak8963_wrapper/df_ak8963_wrapper.cpp index 5256ea901c44..32796bbed853 100644 --- a/src/platforms/posix/drivers/df_ak8963_wrapper/df_ak8963_wrapper.cpp +++ b/src/platforms/posix/drivers/df_ak8963_wrapper/df_ak8963_wrapper.cpp @@ -280,16 +280,15 @@ int DfAK8963Wrapper::_publish(struct mag_sensor_data &data) mag_report.timestamp = hrt_absolute_time(); mag_report.is_external = true; - // TODO: remove these (or get the values) - mag_report.x_raw = 0; - mag_report.y_raw = 0; - mag_report.z_raw = 0; - math::Vector<3> mag_val(data.field_x_ga, data.field_y_ga, data.field_z_ga); // apply sensor rotation on the accel measurement mag_val = _rotation_matrix * mag_val; + mag_report.x_raw = (int16_t)(mag_val(0) * 1000); // (int16) [Gs * 1000] + mag_report.y_raw = (int16_t)(mag_val(1) * 1000); // (int16) [Gs * 1000] + mag_report.z_raw = (int16_t)(mag_val(2) * 1000); // (int16) [Gs * 1000] + mag_report.x = (mag_val(0) - _mag_calibration.x_offset) * _mag_calibration.x_scale; mag_report.y = (mag_val(1) - _mag_calibration.y_offset) * _mag_calibration.y_scale; mag_report.z = (mag_val(2) - _mag_calibration.z_offset) * _mag_calibration.z_scale; diff --git a/src/platforms/posix/drivers/df_hmc5883_wrapper/df_hmc5883_wrapper.cpp b/src/platforms/posix/drivers/df_hmc5883_wrapper/df_hmc5883_wrapper.cpp index f8c84d79133c..1814e88d75a5 100644 --- a/src/platforms/posix/drivers/df_hmc5883_wrapper/df_hmc5883_wrapper.cpp +++ b/src/platforms/posix/drivers/df_hmc5883_wrapper/df_hmc5883_wrapper.cpp @@ -278,11 +278,6 @@ int DfHmc5883Wrapper::_publish(struct mag_sensor_data &data) data.field_x_ga = -data.field_y_ga; data.field_y_ga = tmp; - // TODO: remove these (or get the values) - mag_report.x_raw = 0; - mag_report.y_raw = 0; - mag_report.z_raw = 0; - math::Vector<3> mag_val(data.field_x_ga, data.field_y_ga, data.field_z_ga); @@ -290,6 +285,10 @@ int DfHmc5883Wrapper::_publish(struct mag_sensor_data &data) // apply sensor rotation on the accel measurement mag_val = _rotation_matrix * mag_val; + mag_report.x_raw = (int16_t)(mag_val(0) * 1000); // (int16) [Gs * 1000] + mag_report.y_raw = (int16_t)(mag_val(1) * 1000); // (int16) [Gs * 1000] + mag_report.z_raw = (int16_t)(mag_val(2) * 1000); // (int16) [Gs * 1000] + // Apply calibration after rotation. mag_report.x = (mag_val(0) - _mag_calibration.x_offset) * _mag_calibration.x_scale; mag_report.y = (mag_val(1) - _mag_calibration.y_offset) * _mag_calibration.y_scale; diff --git a/src/platforms/posix/drivers/df_lsm9ds1_wrapper/df_lsm9ds1_wrapper.cpp b/src/platforms/posix/drivers/df_lsm9ds1_wrapper/df_lsm9ds1_wrapper.cpp index d8f75e5b5d20..ce63ef37d11a 100644 --- a/src/platforms/posix/drivers/df_lsm9ds1_wrapper/df_lsm9ds1_wrapper.cpp +++ b/src/platforms/posix/drivers/df_lsm9ds1_wrapper/df_lsm9ds1_wrapper.cpp @@ -569,6 +569,10 @@ int DfLsm9ds1Wrapper::_publish(struct imu_sensor_data &data) _update_gyro_calibration(); } + accel_report accel_report = {}; + gyro_report gyro_report = {}; + mag_report mag_report = {}; + math::Vector<3> vec_integrated_unused; uint64_t integral_dt_unused; math::Vector<3> accel_val(data.accel_m_s2_x, @@ -576,6 +580,11 @@ int DfLsm9ds1Wrapper::_publish(struct imu_sensor_data &data) data.accel_m_s2_z); // apply sensor rotation on the accel measurement accel_val = _rotation_matrix * accel_val; + + accel_report.x_raw = (int16_t)(accel_val(0) * 1000); // (int16) [rad / s * 1000] + accel_report.y_raw = (int16_t)(accel_val(1) * 1000); // (int16) [rad / s * 1000] + accel_report.z_raw = (int16_t)(accel_val(2) * 1000); // (int16) [rad / s * 1000] + // Apply calibration after rotation accel_val(0) = (accel_val(0) - _accel_calibration.x_offset) * _accel_calibration.x_scale; accel_val(1) = (accel_val(1) - _accel_calibration.y_offset) * _accel_calibration.y_scale; @@ -589,6 +598,11 @@ int DfLsm9ds1Wrapper::_publish(struct imu_sensor_data &data) data.gyro_rad_s_z); // apply sensor rotation on the gyro measurement gyro_val = _rotation_matrix * gyro_val; + + gyro_report.x_raw = (int16_t)(gyro_val(0) * 1000); // (int16) [rad / s * 1000] + gyro_report.y_raw = (int16_t)(gyro_val(1) * 1000); // (int16) [rad / s * 1000] + gyro_report.z_raw = (int16_t)(gyro_val(2) * 1000); // (int16) [rad / s * 1000] + // Apply calibration after rotation gyro_val(0) = (gyro_val(0) - _gyro_calibration.x_offset) * _gyro_calibration.x_scale; gyro_val(1) = (gyro_val(1) - _gyro_calibration.y_offset) * _gyro_calibration.y_scale; @@ -618,13 +632,7 @@ int DfLsm9ds1Wrapper::_publish(struct imu_sensor_data &data) perf_begin(_publish_perf); - accel_report accel_report = {}; - gyro_report gyro_report = {}; - mag_report mag_report = {}; - accel_report.timestamp = gyro_report.timestamp = hrt_absolute_time(); - mag_report.timestamp = accel_report.timestamp; - mag_report.is_external = false; // TODO: get these right gyro_report.scaling = -1.0f; @@ -635,27 +643,6 @@ int DfLsm9ds1Wrapper::_publish(struct imu_sensor_data &data) accel_report.range_m_s2 = -1.0f; accel_report.device_id = m_id.dev_id; - if (_mag_enabled) { - mag_report.scaling = -1.0f; - mag_report.range_ga = -1.0f; - mag_report.device_id = m_id.dev_id; - } - - // TODO: remove these (or get the values) - gyro_report.x_raw = 0; - gyro_report.y_raw = 0; - gyro_report.z_raw = 0; - - accel_report.x_raw = 0; - accel_report.y_raw = 0; - accel_report.z_raw = 0; - - if (_mag_enabled) { - mag_report.x_raw = 0; - mag_report.y_raw = 0; - mag_report.z_raw = 0; - } - math::Vector<3> gyro_val_filt; math::Vector<3> accel_val_filt; @@ -673,10 +660,21 @@ int DfLsm9ds1Wrapper::_publish(struct imu_sensor_data &data) accel_report.z = accel_val_filt(2); if (_mag_enabled) { + mag_report.timestamp = accel_report.timestamp; + mag_report.is_external = false; + mag_report.scaling = -1.0f; + mag_report.range_ga = -1.0f; + mag_report.device_id = m_id.dev_id; + math::Vector<3> mag_val(data.mag_ga_x, data.mag_ga_y, data.mag_ga_z); mag_val = _rotation_matrix * mag_val; + + mag_report.x_raw = (int16_t)(mag_val(0) * 1000); // (int16) [Gs * 1000] + mag_report.y_raw = (int16_t)(mag_val(1) * 1000); // (int16) [Gs * 1000] + mag_report.z_raw = (int16_t)(mag_val(2) * 1000); // (int16) [Gs * 1000] + mag_val(0) = (mag_val(0) - _mag_calibration.x_offset) * _mag_calibration.x_scale; mag_val(1) = (mag_val(1) - _mag_calibration.y_offset) * _mag_calibration.y_scale; mag_val(2) = (mag_val(2) - _mag_calibration.z_offset) * _mag_calibration.z_scale; diff --git a/src/platforms/posix/drivers/df_mpu6050_wrapper/df_mpu6050_wrapper.cpp b/src/platforms/posix/drivers/df_mpu6050_wrapper/df_mpu6050_wrapper.cpp index 7b644901476f..fc1414f69bba 100644 --- a/src/platforms/posix/drivers/df_mpu6050_wrapper/df_mpu6050_wrapper.cpp +++ b/src/platforms/posix/drivers/df_mpu6050_wrapper/df_mpu6050_wrapper.cpp @@ -434,11 +434,18 @@ int DfMPU6050Wrapper::_publish(struct imu_sensor_data &data) math::Vector<3> vec_integrated_unused; uint64_t integral_dt_unused; + accel_report accel_report = {}; + gyro_report gyro_report = {}; + math::Vector<3> accel_val(data.accel_m_s2_x, data.accel_m_s2_y, data.accel_m_s2_z); // apply sensor rotation on the accel measurement accel_val = _rotation_matrix * accel_val; + accel_report.x_raw = (int16_t)(accel_val(0) * 1000); // (int16) [rad / s * 1000] + accel_report.y_raw = (int16_t)(accel_val(1) * 1000); // (int16) [rad / s * 1000] + accel_report.z_raw = (int16_t)(accel_val(2) * 1000); // (int16) [rad / s * 1000] + accel_val(0) = (accel_val(0) - _accel_calibration.x_offset) * _accel_calibration.x_scale; accel_val(1) = (accel_val(1) - _accel_calibration.y_offset) * _accel_calibration.y_scale; accel_val(2) = (accel_val(2) - _accel_calibration.z_offset) * _accel_calibration.z_scale; @@ -453,6 +460,10 @@ int DfMPU6050Wrapper::_publish(struct imu_sensor_data &data) // apply sensor rotation on the gyro measurement gyro_val = _rotation_matrix * gyro_val; + gyro_report.x_raw = (int16_t)(gyro_val(0) * 1000); // (int16) [rad / s * 1000] + gyro_report.y_raw = (int16_t)(gyro_val(1) * 1000); // (int16) [rad / s * 1000] + gyro_report.z_raw = (int16_t)(gyro_val(2) * 1000); // (int16) [rad / s * 1000] + gyro_val(0) = (gyro_val(0) - _gyro_calibration.x_offset) * _gyro_calibration.x_scale; gyro_val(1) = (gyro_val(1) - _gyro_calibration.y_offset) * _gyro_calibration.y_scale; gyro_val(2) = (gyro_val(2) - _gyro_calibration.z_offset) * _gyro_calibration.z_scale; @@ -488,9 +499,6 @@ int DfMPU6050Wrapper::_publish(struct imu_sensor_data &data) perf_begin(_publish_perf); - accel_report accel_report = {}; - gyro_report gyro_report = {}; - accel_report.timestamp = gyro_report.timestamp = hrt_absolute_time(); // TODO: get these right @@ -502,15 +510,6 @@ int DfMPU6050Wrapper::_publish(struct imu_sensor_data &data) accel_report.range_m_s2 = -1.0f; accel_report.device_id = m_id.dev_id; - // TODO: remove these (or get the values) - gyro_report.x_raw = 0; - gyro_report.y_raw = 0; - gyro_report.z_raw = 0; - - accel_report.x_raw = 0; - accel_report.y_raw = 0; - accel_report.z_raw = 0; - math::Vector<3> gyro_val_filt; math::Vector<3> accel_val_filt; diff --git a/src/platforms/posix/drivers/df_mpu9250_wrapper/df_mpu9250_wrapper.cpp b/src/platforms/posix/drivers/df_mpu9250_wrapper/df_mpu9250_wrapper.cpp index 2c4d37108186..1c6c767166d7 100644 --- a/src/platforms/posix/drivers/df_mpu9250_wrapper/df_mpu9250_wrapper.cpp +++ b/src/platforms/posix/drivers/df_mpu9250_wrapper/df_mpu9250_wrapper.cpp @@ -599,11 +599,6 @@ int DfMpu9250Wrapper::_publish(struct imu_sensor_data &data) // ACCEL - // write raw data (without rotation) - accel_report.x_raw = data.accel_m_s2_x; - accel_report.y_raw = data.accel_m_s2_y; - accel_report.z_raw = data.accel_m_s2_z; - float xraw_f = data.accel_m_s2_x; float yraw_f = data.accel_m_s2_y; float zraw_f = data.accel_m_s2_z; @@ -611,6 +606,10 @@ int DfMpu9250Wrapper::_publish(struct imu_sensor_data &data) // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + accel_report.x_raw = xraw_f * 1000; // (int16) [m / s^2 * 1000] + accel_report.y_raw = yraw_f * 1000; // (int16) [m / s^2 * 1000] + accel_report.z_raw = zraw_f * 1000; // (int16) [m / s^2 * 1000] + // adjust values according to the calibration float x_in_new = (xraw_f - _accel_calibration.x_offset) * _accel_calibration.x_scale; float y_in_new = (yraw_f - _accel_calibration.y_offset) * _accel_calibration.y_scale; @@ -630,11 +629,6 @@ int DfMpu9250Wrapper::_publish(struct imu_sensor_data &data) // GYRO - // write raw data (withoud rotation) - gyro_report.x_raw = data.gyro_rad_s_x; - gyro_report.y_raw = data.gyro_rad_s_y; - gyro_report.z_raw = data.gyro_rad_s_z; - xraw_f = data.gyro_rad_s_x; yraw_f = data.gyro_rad_s_y; zraw_f = data.gyro_rad_s_z; @@ -642,6 +636,10 @@ int DfMpu9250Wrapper::_publish(struct imu_sensor_data &data) // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + gyro_report.x_raw = xraw_f * 1000; // (int16) [rad / s * 1000] + gyro_report.y_raw = yraw_f * 1000; // (int16) [rad / s * 1000] + gyro_report.z_raw = zraw_f * 1000; // (int16) [rad / s * 1000] + // adjust values according to the calibration float x_gyro_in_new = (xraw_f - _gyro_calibration.x_offset) * _gyro_calibration.x_scale; float y_gyro_in_new = (yraw_f - _gyro_calibration.y_offset) * _gyro_calibration.y_scale; @@ -706,16 +704,16 @@ int DfMpu9250Wrapper::_publish(struct imu_sensor_data &data) mag_report.range_ga = -1.0f; mag_report.device_id = m_id.dev_id; - mag_report.x_raw = 0; - mag_report.y_raw = 0; - mag_report.z_raw = 0; - xraw_f = data.mag_ga_x; yraw_f = data.mag_ga_y; zraw_f = data.mag_ga_z; rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); + mag_report.x_raw = xraw_f * 1000; // (int16) [Gs * 1000] + mag_report.y_raw = yraw_f * 1000; // (int16) [Gs * 1000] + mag_report.z_raw = zraw_f * 1000; // (int16) [Gs * 1000] + mag_report.x = (xraw_f - _mag_calibration.x_offset) * _mag_calibration.x_scale; mag_report.y = (yraw_f - _mag_calibration.y_offset) * _mag_calibration.y_scale; mag_report.z = (zraw_f - _mag_calibration.z_offset) * _mag_calibration.z_scale; diff --git a/src/platforms/posix/drivers/gyrosim/gyrosim.cpp b/src/platforms/posix/drivers/gyrosim/gyrosim.cpp index 9781f539f9d9..ee9f4b7abb06 100644 --- a/src/platforms/posix/drivers/gyrosim/gyrosim.cpp +++ b/src/platforms/posix/drivers/gyrosim/gyrosim.cpp @@ -1034,9 +1034,9 @@ GYROSIM::_measure() /* NOTE: Axes have been swapped to match the board a few lines above. */ - arb.x_raw = (int16_t)(mpu_report.accel_x / _accel_range_scale); - arb.y_raw = (int16_t)(mpu_report.accel_y / _accel_range_scale); - arb.z_raw = (int16_t)(mpu_report.accel_z / _accel_range_scale); + arb.x_raw = (int16_t)(mpu_report.accel_x * 1000); + arb.y_raw = (int16_t)(mpu_report.accel_y * 1000); + arb.z_raw = (int16_t)(mpu_report.accel_z * 1000); arb.scaling = _accel_range_scale; arb.range_m_s2 = _accel_range_m_s2; @@ -1061,9 +1061,9 @@ GYROSIM::_measure() /* fake device ID */ arb.device_id = 6789478; - grb.x_raw = (int16_t)(mpu_report.gyro_x / _gyro_range_scale); - grb.y_raw = (int16_t)(mpu_report.gyro_y / _gyro_range_scale); - grb.z_raw = (int16_t)(mpu_report.gyro_z / _gyro_range_scale); + grb.x_raw = (int16_t)(mpu_report.gyro_x * 1000); // (int16) [rad / s * 1000] + grb.y_raw = (int16_t)(mpu_report.gyro_y * 1000); // (int16) [rad / s * 1000] + grb.z_raw = (int16_t)(mpu_report.gyro_z * 1000); // (int16) [rad / s * 1000] grb.scaling = _gyro_range_scale; grb.range_rad_s = _gyro_range_rad_s; diff --git a/src/platforms/qurt/fc_addon/mpu_spi/mpu9x50_main.cpp b/src/platforms/qurt/fc_addon/mpu_spi/mpu9x50_main.cpp index 246e91d5489a..2f7846ced523 100644 --- a/src/platforms/qurt/fc_addon/mpu_spi/mpu9x50_main.cpp +++ b/src/platforms/qurt/fc_addon/mpu_spi/mpu9x50_main.cpp @@ -407,9 +407,9 @@ void update_reports() _gyro.temperature = _data.temperature; _gyro.range_rad_s = _data.gyro_range_rad_s; _gyro.scaling = _data.gyro_scaling; - _gyro.x_raw = _data.gyro_raw[0]; - _gyro.y_raw = _data.gyro_raw[1]; - _gyro.z_raw = _data.gyro_raw[2]; + _gyro.x_raw = (int16_t)(_data.gyro_raw[0] * _data.gyro_scaling * 1000); // (int16) [rad / s * 1000] + _gyro.y_raw = (int16_t)(_data.gyro_raw[1] * _data.gyro_scaling * 1000); // (int16) [rad / s * 1000] + _gyro.z_raw = (int16_t)(_data.gyro_raw[2] * _data.gyro_scaling * 1000); // (int16) [rad / s * 1000] _gyro.temperature_raw = _data.temperature_raw; _accel.timestamp = _data.timestamp; @@ -419,9 +419,9 @@ void update_reports() _accel.temperature = _data.temperature; _accel.range_m_s2 = _data.accel_range_m_s2; _accel.scaling = _data.accel_scaling; - _accel.x_raw = _data.accel_raw[0]; - _accel.y_raw = _data.accel_raw[1]; - _accel.z_raw = _data.accel_raw[2]; + _accel.x_raw = (int16_t)(_data.accel_raw[0] * _data.accel_scaling * 1000); // (int16) [m / s^2 * 1000] + _accel.y_raw = (int16_t)(_data.accel_raw[1] * _data.accel_scaling * 1000); // (int16) [m / s^2 * 1000] + _accel.z_raw = (int16_t)(_data.accel_raw[2] * _data.accel_scaling * 1000); // (int16) [m / s^2 * 1000] _accel.temperature_raw = _data.temperature_raw; if (_data.mag_data_ready) { @@ -432,9 +432,9 @@ void update_reports() _mag.range_ga = _data.mag_range_ga; _mag.scaling = _data.mag_scaling; _mag.temperature = _data.temperature; - _mag.x_raw = _data.mag_raw[0]; - _mag.y_raw = _data.mag_raw[1]; - _mag.z_raw = _data.mag_raw[2]; + _mag.x_raw = (int16_t)(_data.mag_raw[0] * _data.mag_scaling * 1000); // (int16) [Gs * 1000] + _mag.y_raw = (int16_t)(_data.mag_raw[1] * _data.mag_scaling * 1000); // (int16) [Gs * 1000] + _mag.z_raw = (int16_t)(_data.mag_raw[2] * _data.mag_scaling * 1000); // (int16) [Gs * 1000] } }