Commit 0b2d7b2a authored by Jun Cai's avatar Jun Cai Committed by Commit Bot

Move radian and degree conversion constants to generic_sensor_consts.h

Currently there are radian and degree conversion constants in both
generic_sensor_consts.h and orientation_util.h. This CL moves them to
generic_sensor_consts.h.

Bug: None
Change-Id: I7de69b7e9536bb003158ab9d3611ec9a621211fc
Reviewed-on: https://chromium-review.googlesource.com/661077
Commit-Queue: Jun Cai <juncai@chromium.org>
Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#501311}
parent 2780167e
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#include "services/device/device_service_test_base.h" #include "services/device/device_service_test_base.h"
#include "services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.h" #include "services/device/generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer.h"
#include "services/device/generic_sensor/fake_platform_sensor_fusion.h" #include "services/device/generic_sensor/fake_platform_sensor_fusion.h"
#include "services/device/generic_sensor/orientation_util.h" #include "services/device/generic_sensor/generic_sensor_consts.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace device { namespace device {
...@@ -191,8 +191,8 @@ TEST_F( ...@@ -191,8 +191,8 @@ TEST_F(
AbsoluteOrientationEulerAnglesFusionAlgorithmUsingAccelerometerAndMagnetometerTest, AbsoluteOrientationEulerAnglesFusionAlgorithmUsingAccelerometerAndMagnetometerTest,
BetaIs45Degrees) { BetaIs45Degrees) {
double gravity_x = 0.0; double gravity_x = 0.0;
double gravity_y = std::sin(kDegToRad * 45.0); double gravity_y = std::sin(kDegreesToRadians * 45.0);
double gravity_z = std::cos(kDegToRad * 45.0); double gravity_z = std::cos(kDegreesToRadians * 45.0);
double geomagnetic_x = 0.0; double geomagnetic_x = 0.0;
double geomagnetic_y = 1.0; double geomagnetic_y = 1.0;
double geomagnetic_z = 0.0; double geomagnetic_z = 0.0;
...@@ -210,9 +210,9 @@ TEST_F( ...@@ -210,9 +210,9 @@ TEST_F(
TEST_F( TEST_F(
AbsoluteOrientationEulerAnglesFusionAlgorithmUsingAccelerometerAndMagnetometerTest, AbsoluteOrientationEulerAnglesFusionAlgorithmUsingAccelerometerAndMagnetometerTest,
GammaIs45Degrees) { GammaIs45Degrees) {
double gravity_x = -std::sin(kDegToRad * 45.0); double gravity_x = -std::sin(kDegreesToRadians * 45.0);
double gravity_y = 0.0; double gravity_y = 0.0;
double gravity_z = std::cos(kDegToRad * 45.0); double gravity_z = std::cos(kDegreesToRadians * 45.0);
double geomagnetic_x = 0.0; double geomagnetic_x = 0.0;
double geomagnetic_y = 1.0; double geomagnetic_y = 1.0;
double geomagnetic_z = 0.0; double geomagnetic_z = 0.0;
...@@ -233,8 +233,8 @@ TEST_F( ...@@ -233,8 +233,8 @@ TEST_F(
double gravity_x = 0.0; double gravity_x = 0.0;
double gravity_y = 0.0; double gravity_y = 0.0;
double gravity_z = 1.0; double gravity_z = 1.0;
double geomagnetic_x = std::sin(kDegToRad * 45.0); double geomagnetic_x = std::sin(kDegreesToRadians * 45.0);
double geomagnetic_y = std::cos(kDegToRad * 45.0); double geomagnetic_y = std::cos(kDegreesToRadians * 45.0);
double geomagnetic_z = 0.0; double geomagnetic_z = 0.0;
double expected_alpha_in_degrees = 45.0; double expected_alpha_in_degrees = 45.0;
...@@ -253,9 +253,9 @@ TEST_F( ...@@ -253,9 +253,9 @@ TEST_F(
double gravity_x = 0.0; double gravity_x = 0.0;
double gravity_y = 1.0; double gravity_y = 1.0;
double gravity_z = 0.0; double gravity_z = 0.0;
double geomagnetic_x = std::sin(kDegToRad * 45.0); double geomagnetic_x = std::sin(kDegreesToRadians * 45.0);
double geomagnetic_y = 0.0; double geomagnetic_y = 0.0;
double geomagnetic_z = -std::cos(kDegToRad * 45.0); double geomagnetic_z = -std::cos(kDegreesToRadians * 45.0);
// Favor Alpha instead of Gamma. // Favor Alpha instead of Gamma.
double expected_alpha_in_degrees = 45.0; double expected_alpha_in_degrees = 45.0;
...@@ -272,8 +272,8 @@ TEST_F( ...@@ -272,8 +272,8 @@ TEST_F(
AbsoluteOrientationEulerAnglesFusionAlgorithmUsingAccelerometerAndMagnetometerTest, AbsoluteOrientationEulerAnglesFusionAlgorithmUsingAccelerometerAndMagnetometerTest,
BetaIsGreaterThan90Degrees) { BetaIsGreaterThan90Degrees) {
double gravity_x = 0.0; double gravity_x = 0.0;
double gravity_y = std::cos(kDegToRad * 45.0); double gravity_y = std::cos(kDegreesToRadians * 45.0);
double gravity_z = -std::sin(kDegToRad * 45.0); double gravity_z = -std::sin(kDegreesToRadians * 45.0);
double geomagnetic_x = 0.0; double geomagnetic_x = 0.0;
double geomagnetic_y = 0.0; double geomagnetic_y = 0.0;
double geomagnetic_z = -1.0; double geomagnetic_z = -1.0;
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define SERVICES_DEVICE_GENERIC_SENSOR_GENERIC_SENSOR_CONSTS_H_ #define SERVICES_DEVICE_GENERIC_SENSOR_GENERIC_SENSOR_CONSTS_H_
#define _USE_MATH_DEFINES #define _USE_MATH_DEFINES
#include <math.h> #include <math.h>
namespace device { namespace device {
...@@ -13,8 +14,11 @@ namespace device { ...@@ -13,8 +14,11 @@ namespace device {
// Required for conversion from G/s^2 to m/s^2 // Required for conversion from G/s^2 to m/s^2
constexpr double kMeanGravity = 9.80665; constexpr double kMeanGravity = 9.80665;
// Required for conversion from deg to rad // Conversion ratio from radians to degrees.
constexpr double kRadiansInDegrees = M_PI / 180.0; constexpr double kRadiansToDegrees = 180.0 / M_PI;
// Conversion ratio from degrees to radians.
constexpr double kDegreesToRadians = M_PI / 180.0;
// Required for conversion from Gauss to uT. // Required for conversion from Gauss to uT.
constexpr double kMicroteslaInGauss = 100.0; constexpr double kMicroteslaInGauss = 100.0;
......
...@@ -115,7 +115,7 @@ void InitGyroscopeSensorData(SensorPathsLinux* data) { ...@@ -115,7 +115,7 @@ void InitGyroscopeSensorData(SensorPathsLinux* data) {
data->sensor_frequency_file_name = "in_anglvel_base_frequency"; data->sensor_frequency_file_name = "in_anglvel_base_frequency";
data->apply_scaling_func = base::Bind( data->apply_scaling_func = base::Bind(
[](double scaling_value, double offset, SensorReading& reading) { [](double scaling_value, double offset, SensorReading& reading) {
double scaling = kMeanGravity * kRadiansInDegrees / scaling_value; double scaling = kMeanGravity * kDegreesToRadians / scaling_value;
// Adapt CrOS reading values to generic sensor api specs. // Adapt CrOS reading values to generic sensor api specs.
reading.gyro.x = -scaling * (reading.gyro.x + offset); reading.gyro.x = -scaling * (reading.gyro.x + offset);
reading.gyro.y = -scaling * (reading.gyro.y + offset); reading.gyro.y = -scaling * (reading.gyro.y + offset);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#include <cmath> #include <cmath>
#include "base/logging.h" #include "base/logging.h"
#include "services/device/generic_sensor/orientation_util.h" #include "services/device/generic_sensor/generic_sensor_consts.h"
#include "services/device/generic_sensor/platform_sensor_fusion.h" #include "services/device/generic_sensor/platform_sensor_fusion.h"
namespace device { namespace device {
...@@ -21,9 +21,9 @@ void ComputeQuaternionFromEulerAngles(double alpha_in_degrees, ...@@ -21,9 +21,9 @@ void ComputeQuaternionFromEulerAngles(double alpha_in_degrees,
double* y, double* y,
double* z, double* z,
double* w) { double* w) {
double alpha_in_radians = device::kDegToRad * alpha_in_degrees; double alpha_in_radians = device::kDegreesToRadians * alpha_in_degrees;
double beta_in_radians = device::kDegToRad * beta_in_degrees; double beta_in_radians = device::kDegreesToRadians * beta_in_degrees;
double gamma_in_radians = device::kDegToRad * gamma_in_degrees; double gamma_in_radians = device::kDegreesToRadians * gamma_in_degrees;
double cx = std::cos(beta_in_radians / 2); double cx = std::cos(beta_in_radians / 2);
double cy = std::cos(gamma_in_radians / 2); double cy = std::cos(gamma_in_radians / 2);
......
...@@ -2,13 +2,12 @@ ...@@ -2,13 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#define _USE_MATH_DEFINES // For VC++ to get M_PI. This has to be first.
#include "services/device/generic_sensor/orientation_util.h" #include "services/device/generic_sensor/orientation_util.h"
#include <cmath> #include <cmath>
#include "base/logging.h" #include "base/logging.h"
#include "services/device/generic_sensor/generic_sensor_consts.h"
namespace { namespace {
...@@ -94,10 +93,6 @@ void ComputeOrientationEulerAnglesInRadiansFromRotationMatrix( ...@@ -94,10 +93,6 @@ void ComputeOrientationEulerAnglesInRadiansFromRotationMatrix(
namespace device { namespace device {
const double kRadToDeg = 180.0 / M_PI;
const double kDegToRad = M_PI / 180.0;
void ComputeOrientationEulerAnglesFromRotationMatrix( void ComputeOrientationEulerAnglesFromRotationMatrix(
const std::vector<double>& r, const std::vector<double>& r,
double* alpha_in_degrees, double* alpha_in_degrees,
...@@ -106,9 +101,9 @@ void ComputeOrientationEulerAnglesFromRotationMatrix( ...@@ -106,9 +101,9 @@ void ComputeOrientationEulerAnglesFromRotationMatrix(
double alpha_in_radians, beta_in_radians, gamma_in_radians; double alpha_in_radians, beta_in_radians, gamma_in_radians;
ComputeOrientationEulerAnglesInRadiansFromRotationMatrix( ComputeOrientationEulerAnglesInRadiansFromRotationMatrix(
r, &alpha_in_radians, &beta_in_radians, &gamma_in_radians); r, &alpha_in_radians, &beta_in_radians, &gamma_in_radians);
*alpha_in_degrees = kRadToDeg * alpha_in_radians; *alpha_in_degrees = kRadiansToDegrees * alpha_in_radians;
*beta_in_degrees = kRadToDeg * beta_in_radians; *beta_in_degrees = kRadiansToDegrees * beta_in_radians;
*gamma_in_degrees = kRadToDeg * gamma_in_radians; *gamma_in_degrees = kRadiansToDegrees * gamma_in_radians;
} }
} // namespace device } // namespace device
...@@ -9,12 +9,6 @@ ...@@ -9,12 +9,6 @@
namespace device { namespace device {
// Conversion ratio from radians to degrees.
extern const double kRadToDeg;
// Conversion ratio from degrees to radians.
extern const double kDegToRad;
void ComputeOrientationEulerAnglesFromRotationMatrix( void ComputeOrientationEulerAnglesFromRotationMatrix(
const std::vector<double>& r, const std::vector<double>& r,
double* alpha_in_degrees, double* alpha_in_degrees,
......
...@@ -638,7 +638,7 @@ TEST_F(PlatformSensorAndProviderLinuxTest, CheckGyroscopeReadingConversion) { ...@@ -638,7 +638,7 @@ TEST_F(PlatformSensorAndProviderLinuxTest, CheckGyroscopeReadingConversion) {
SensorReadingSharedBuffer* buffer = SensorReadingSharedBuffer* buffer =
static_cast<SensorReadingSharedBuffer*>(mapping.get()); static_cast<SensorReadingSharedBuffer*>(mapping.get());
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
double scaling = kMeanGravity * kRadiansInDegrees / kGyroscopeScalingValue; double scaling = kMeanGravity * kDegreesToRadians / kGyroscopeScalingValue;
EXPECT_THAT(buffer->reading.gyro.x, -scaling * sensor_values[0]); EXPECT_THAT(buffer->reading.gyro.x, -scaling * sensor_values[0]);
EXPECT_THAT(buffer->reading.gyro.y, -scaling * sensor_values[1]); EXPECT_THAT(buffer->reading.gyro.y, -scaling * sensor_values[1]);
EXPECT_THAT(buffer->reading.gyro.z, -scaling * sensor_values[2]); EXPECT_THAT(buffer->reading.gyro.z, -scaling * sensor_values[2]);
......
...@@ -625,9 +625,9 @@ TEST_F(PlatformSensorAndProviderTestWin, CheckGyroscopeReadingConversion) { ...@@ -625,9 +625,9 @@ TEST_F(PlatformSensorAndProviderTestWin, CheckGyroscopeReadingConversion) {
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
SensorReadingSharedBuffer* buffer = SensorReadingSharedBuffer* buffer =
static_cast<SensorReadingSharedBuffer*>(mapping.get()); static_cast<SensorReadingSharedBuffer*>(mapping.get());
EXPECT_THAT(buffer->reading.gyro.x, -x_ang_accel * kRadiansInDegrees); EXPECT_THAT(buffer->reading.gyro.x, -x_ang_accel * kDegreesToRadians);
EXPECT_THAT(buffer->reading.gyro.y, -y_ang_accel * kRadiansInDegrees); EXPECT_THAT(buffer->reading.gyro.y, -y_ang_accel * kDegreesToRadians);
EXPECT_THAT(buffer->reading.gyro.z, -z_ang_accel * kRadiansInDegrees); EXPECT_THAT(buffer->reading.gyro.z, -z_ang_accel * kDegreesToRadians);
EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); EXPECT_TRUE(sensor->StopListening(client.get(), configuration));
} }
......
...@@ -124,9 +124,9 @@ std::unique_ptr<ReaderInitParams> CreateGyroscopeReaderInitParams() { ...@@ -124,9 +124,9 @@ std::unique_ptr<ReaderInitParams> CreateGyroscopeReaderInitParams() {
// Windows uses coordinate system where Z axis points down from device // Windows uses coordinate system where Z axis points down from device
// screen, therefore, using right hand notation, we have to reverse // screen, therefore, using right hand notation, we have to reverse
// sign for each axis. Values are converted from deg to rad. // sign for each axis. Values are converted from deg to rad.
reading->gyro.x = -x * kRadiansInDegrees; reading->gyro.x = -x * kDegreesToRadians;
reading->gyro.y = -y * kRadiansInDegrees; reading->gyro.y = -y * kDegreesToRadians;
reading->gyro.z = -z * kRadiansInDegrees; reading->gyro.z = -z * kDegreesToRadians;
return S_OK; return S_OK;
}; };
return params; return params;
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include "base/logging.h" #include "base/logging.h"
#include "services/device/generic_sensor/generic_sensor_consts.h" #include "services/device/generic_sensor/generic_sensor_consts.h"
#include "services/device/generic_sensor/orientation_util.h"
#include "services/device/generic_sensor/platform_sensor_fusion.h" #include "services/device/generic_sensor/platform_sensor_fusion.h"
namespace device { namespace device {
...@@ -41,8 +40,10 @@ void ComputeRelativeOrientationFromAccelerometer(double acceleration_x, ...@@ -41,8 +40,10 @@ void ComputeRelativeOrientationFromAccelerometer(double acceleration_x,
// This is necessary in order to provide enough information to solve // This is necessary in order to provide enough information to solve
// the equations. // the equations.
*alpha_in_degrees = 0.0; *alpha_in_degrees = 0.0;
*beta_in_degrees = kRadToDeg * std::atan2(-acceleration_y, acceleration_z); *beta_in_degrees =
*gamma_in_degrees = kRadToDeg * std::asin(acceleration_x / kMeanGravity); kRadiansToDegrees * std::atan2(-acceleration_y, acceleration_z);
*gamma_in_degrees =
kRadiansToDegrees * std::asin(acceleration_x / kMeanGravity);
// Convert beta and gamma to fit the intervals in the specification. Beta is // Convert beta and gamma to fit the intervals in the specification. Beta is
// [-180, 180) and gamma is [-90, 90). // [-180, 180) and gamma is [-90, 90).
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment