Add support in drivetrain for IMU gyro
Change-Id: Id1d63cb2f01ae34d53c620168f85ac5d5b53e665
diff --git a/frc971/control_loops/drivetrain/drivetrain.cc b/frc971/control_loops/drivetrain/drivetrain.cc
index 7bbba74..6a2822b 100644
--- a/frc971/control_loops/drivetrain/drivetrain.cc
+++ b/frc971/control_loops/drivetrain/drivetrain.cc
@@ -20,6 +20,7 @@
#include "frc971/wpilib/imu.q.h"
using frc971::sensors::gyro_reading;
+using frc971::imu_values;
namespace frc971 {
namespace control_loops {
@@ -121,8 +122,8 @@
gear_logging.controller_index = kf_.controller_index();
LOG_STRUCT(DEBUG, "state", gear_logging);
}
-
- if (::frc971::imu_values.FetchLatest()) {
+ const bool is_latest_imu_values = ::frc971::imu_values.FetchLatest();
+ if (is_latest_imu_values) {
const double rate = -::frc971::imu_values->gyro_y;
const double accel_squared = ::frc971::imu_values->accelerometer_x *
::frc971::imu_values->accelerometer_x +
@@ -154,10 +155,40 @@
// TODO(austin): Signal the current gear to both loops.
- if (gyro_reading.FetchLatest()) {
- LOG_STRUCT(DEBUG, "using", *gyro_reading.get());
- last_gyro_heading_ = gyro_reading->angle;
- last_gyro_rate_ = gyro_reading->velocity;
+ switch (dt_config_.gyro_type) {
+ case GyroType::IMU_X_GYRO:
+ if (is_latest_imu_values) {
+ LOG_STRUCT(DEBUG, "using", *imu_values.get());
+ last_gyro_rate_ = imu_values->gyro_x;
+ }
+ break;
+ case GyroType::IMU_Y_GYRO:
+ if (is_latest_imu_values) {
+ LOG_STRUCT(DEBUG, "using", *imu_values.get());
+ last_gyro_rate_ = imu_values->gyro_y;
+ }
+ break;
+ case GyroType::IMU_Z_GYRO:
+ if (is_latest_imu_values) {
+ LOG_STRUCT(DEBUG, "using", *imu_values.get());
+ last_gyro_rate_ = imu_values->gyro_z;
+ }
+ break;
+ case GyroType::SPARTAN_GYRO:
+ if (gyro_reading.FetchLatest()) {
+ LOG_STRUCT(DEBUG, "using", *gyro_reading.get());
+ last_gyro_rate_ = gyro_reading->velocity;
+ }
+ break;
+ case GyroType::FLIPPED_SPARTAN_GYRO:
+ if (gyro_reading.FetchLatest()) {
+ LOG_STRUCT(DEBUG, "using", *gyro_reading.get());
+ last_gyro_rate_ = -gyro_reading->velocity;
+ }
+ break;
+ default:
+ LOG(FATAL, "invalid gyro configured");
+ break;
}
{