179 static constexpr uint8_t FLASH_CNT = 0x00;
180 static constexpr uint8_t DIAG_STAT =
182 static constexpr uint8_t X_GYRO_LOW =
184 static constexpr uint8_t X_GYRO_OUT =
186 static constexpr uint8_t Y_GYRO_LOW =
188 static constexpr uint8_t Y_GYRO_OUT =
190 static constexpr uint8_t Z_GYRO_LOW =
192 static constexpr uint8_t Z_GYRO_OUT =
194 static constexpr uint8_t X_ACCL_LOW =
196 static constexpr uint8_t X_ACCL_OUT =
198 static constexpr uint8_t Y_ACCL_LOW =
200 static constexpr uint8_t Y_ACCL_OUT =
202 static constexpr uint8_t Z_ACCL_LOW =
204 static constexpr uint8_t Z_ACCL_OUT =
206 static constexpr uint8_t TEMP_OUT =
208 static constexpr uint8_t TIME_STAMP = 0x1E;
209 static constexpr uint8_t X_DELTANG_LOW =
211 static constexpr uint8_t X_DELTANG_OUT =
213 static constexpr uint8_t Y_DELTANG_LOW =
215 static constexpr uint8_t Y_DELTANG_OUT =
217 static constexpr uint8_t Z_DELTANG_LOW =
219 static constexpr uint8_t Z_DELTANG_OUT =
221 static constexpr uint8_t X_DELTVEL_LOW =
223 static constexpr uint8_t X_DELTVEL_OUT =
225 static constexpr uint8_t Y_DELTVEL_LOW =
227 static constexpr uint8_t Y_DELTVEL_OUT =
229 static constexpr uint8_t Z_DELTVEL_LOW =
231 static constexpr uint8_t Z_DELTVEL_OUT =
233 static constexpr uint8_t XG_BIAS_LOW =
235 static constexpr uint8_t XG_BIAS_HIGH =
237 static constexpr uint8_t YG_BIAS_LOW =
239 static constexpr uint8_t YG_BIAS_HIGH =
241 static constexpr uint8_t ZG_BIAS_LOW =
243 static constexpr uint8_t ZG_BIAS_HIGH =
245 static constexpr uint8_t XA_BIAS_LOW =
247 static constexpr uint8_t XA_BIAS_HIGH =
249 static constexpr uint8_t YA_BIAS_LOW =
251 static constexpr uint8_t YA_BIAS_HIGH =
253 static constexpr uint8_t ZA_BIAS_LOW =
255 static constexpr uint8_t ZA_BIAS_HIGH =
257 static constexpr uint8_t FILT_CTRL = 0x5C;
258 static constexpr uint8_t MSC_CTRL = 0x60;
259 static constexpr uint8_t UP_SCALE = 0x62;
260 static constexpr uint8_t DEC_RATE =
262 static constexpr uint8_t NULL_CNFG = 0x66;
263 static constexpr uint8_t GLOB_CMD = 0x68;
264 static constexpr uint8_t FIRM_REV = 0x6C;
265 static constexpr uint8_t FIRM_DM =
267 static constexpr uint8_t FIRM_Y = 0x70;
268 static constexpr uint8_t PROD_ID = 0x72;
269 static constexpr uint8_t SERIAL_NUM =
271 static constexpr uint8_t USER_SCR1 = 0x76;
272 static constexpr uint8_t USER_SCR2 = 0x78;
273 static constexpr uint8_t USER_SCR3 = 0x7A;
274 static constexpr uint8_t FLSHCNT_LOW =
276 static constexpr uint8_t FLSHCNT_HIGH =
280 static constexpr uint8_t m_autospi_x_packet[16] = {
281 X_DELTANG_OUT, FLASH_CNT, X_DELTANG_LOW, FLASH_CNT, X_GYRO_OUT, FLASH_CNT,
282 Y_GYRO_OUT, FLASH_CNT, Z_GYRO_OUT, FLASH_CNT, X_ACCL_OUT, FLASH_CNT,
283 Y_ACCL_OUT, FLASH_CNT, Z_ACCL_OUT, FLASH_CNT};
285 static constexpr uint8_t m_autospi_y_packet[16] = {
286 Y_DELTANG_OUT, FLASH_CNT, Y_DELTANG_LOW, FLASH_CNT, X_GYRO_OUT, FLASH_CNT,
287 Y_GYRO_OUT, FLASH_CNT, Z_GYRO_OUT, FLASH_CNT, X_ACCL_OUT, FLASH_CNT,
288 Y_ACCL_OUT, FLASH_CNT, Z_ACCL_OUT, FLASH_CNT};
290 static constexpr uint8_t m_autospi_z_packet[16] = {
291 Z_DELTANG_OUT, FLASH_CNT, Z_DELTANG_LOW, FLASH_CNT, X_GYRO_OUT, FLASH_CNT,
292 Y_GYRO_OUT, FLASH_CNT, Z_GYRO_OUT, FLASH_CNT, X_ACCL_OUT, FLASH_CNT,
293 Y_ACCL_OUT, FLASH_CNT, Z_ACCL_OUT, FLASH_CNT};
296 static constexpr double delta_angle_sf =
297 2160.0 / 2147483648.0;
298 static constexpr double rad_to_deg = 57.2957795;
299 static constexpr double deg_to_rad = 0.0174532;
300 static constexpr double grav = 9.81;
303 DigitalInput* m_reset_in;
304 DigitalOutput* m_status_led;
313 bool SwitchToStandardSPI();
322 bool SwitchToAutoSPI();
332 uint16_t ReadRegister(uint8_t reg);
343 void WriteRegister(uint8_t reg, uint16_t val);
354 double m_integ_angle = 0.0;
357 double m_gyro_rate_x = 0.0;
358 double m_gyro_rate_y = 0.0;
359 double m_gyro_rate_z = 0.0;
360 double m_accel_x = 0.0;
361 double m_accel_y = 0.0;
362 double m_accel_z = 0.0;
366 double m_dt, m_alpha = 0.0;
367 double m_compAngleX, m_compAngleY, m_accelAngleX, m_accelAngleY = 0.0;
370 double FormatFastConverge(
double compAngle,
double accAngle);
372 double FormatRange0to2PI(
double compAngle);
374 double FormatAccelRange(
double accelAngle,
double accelZ);
376 double CompFilterProcess(
double compAngle,
double accelAngle,
double omega);
379 volatile bool m_thread_active =
false;
380 volatile bool m_first_run =
true;
381 volatile bool m_thread_idle =
false;
382 bool m_auto_configured =
false;
384 uint16_t m_calibration_time = 0;
385 SPI* m_spi =
nullptr;
386 DigitalInput* m_auto_interrupt =
nullptr;
387 double m_scaled_sample_rate = 2500.0;
388 bool m_connected{
false};
390 std::thread m_acquire_task;
404 struct NonMovableMutexWrapper {
406 NonMovableMutexWrapper() =
default;
408 NonMovableMutexWrapper(
const NonMovableMutexWrapper&) =
delete;
409 NonMovableMutexWrapper&
operator=(
const NonMovableMutexWrapper&) =
delete;
411 NonMovableMutexWrapper(NonMovableMutexWrapper&&) {}
412 NonMovableMutexWrapper&
operator=(NonMovableMutexWrapper&&) {
416 void lock() { mutex.lock(); }
418 void unlock() { mutex.unlock(); }
420 bool try_lock() noexcept {
return mutex.try_lock(); }
423 mutable NonMovableMutexWrapper m_mutex;
Use DMA SPI to read rate and acceleration data from the ADIS16470 IMU and return the robot's heading ...
Definition: ADIS16470_IMU.h:54
~ADIS16470_IMU() override
Destructor.
ADIS16470_IMU(IMUAxis yaw_axis, SPI::Port port, CalibrationTime cal_time)
Customizable constructor.
units::degree_t GetAngle() const
Returns the yaw axis angle in degrees (CCW positive).
ADIS16470_IMU(ADIS16470_IMU &&)=default
ADIS16470_IMU()
Default constructor.
units::degree_t GetYFilteredAccelAngle() const
IMUAxis
Definition: ADIS16470_IMU.h:72
@ kX
Definition: ADIS16470_IMU.h:72
@ kZ
Definition: ADIS16470_IMU.h:72
@ kY
Definition: ADIS16470_IMU.h:72
units::degrees_per_second_t GetRate() const
Returns the yaw axis angular rate in degrees per second (CCW positive).
void Calibrate()
Switches the active SPI port to standard SPI mode, writes the command to activate the new null config...
CalibrationTime
Definition: ADIS16470_IMU.h:57
int SetYawAxis(IMUAxis yaw_axis)
void InitSendable(wpi::SendableBuilder &builder) override
Initializes this Sendable object.
units::degree_t GetXFilteredAccelAngle() const
units::degree_t GetYComplementaryAngle() const
int GetPort() const
Get the SPI port number.
ADIS16470_IMU & operator=(ADIS16470_IMU &&)=default
int ConfigCalTime(CalibrationTime new_cal_time)
Switches the active SPI port to standard SPI mode, writes a new value to the NULL_CNFG register in th...
IMUAxis m_yaw_axis
Definition: ADIS16470_IMU.h:166
IMUAxis GetYawAxis() const
void Reset()
Resets (zeros) the xgyro, ygyro, and zgyro angle integrations.
units::meters_per_second_squared_t GetAccelX() const
Returns the acceleration in the X axis.
units::meters_per_second_squared_t GetAccelY() const
Returns the acceleration in the Y axis.
int ConfigDecRate(uint16_t reg)
units::meters_per_second_squared_t GetAccelZ() const
Returns the acceleration in the Z axis.
units::degree_t GetXComplementaryAngle() const
C++ wrapper around a HAL simulator boolean value handle.
Definition: SimDevice.h:610
A move-only C++ wrapper around a HAL simulator device handle.
Definition: SimDevice.h:644
C++ wrapper around a HAL simulator double value handle.
Definition: SimDevice.h:535
Definition: SendableBuilder.h:18
A helper class for use with objects that add themselves to SendableRegistry.
Definition: SendableHelper.h:19
Interface for Sendable objects.
Definition: Sendable.h:16
Definition: AprilTagPoseEstimator.h:15
::std::mutex mutex
Definition: mutex.h:17