Skip to content

Commit

Permalink
[mag] add a MAG_TO_IMU option to HMC58XX drivers
Browse files Browse the repository at this point in the history
this allow to choose arbitrary orientation for external mounted hmc mag
and move data back to IMU frame before sending them over IVY.

related to #197
this is the only driver supporting this, but hmc mag are the most
commonly used, especially as external sensor
  • Loading branch information
gautierhattenberger committed Jun 21, 2016
1 parent ede3a2d commit 9dbff18
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions sw/airborne/modules/sensors/mag_hmc58xx.c
Expand Up @@ -29,6 +29,7 @@
#include "mcu_periph/uart.h"
#include "pprzlink/messages.h"
#include "subsystems/datalink/downlink.h"
#include "generated/airframe.h"

#ifndef HMC58XX_CHAN_X
#define HMC58XX_CHAN_X 0
Expand All @@ -52,13 +53,29 @@
#if MODULE_HMC58XX_UPDATE_AHRS
#include "subsystems/imu.h"
#include "subsystems/abi.h"

#if defined HMC58XX_MAG_TO_IMU_PHI && defined HMC58XX_MAG_TO_IMU_THETA && defined HMC58XX_MAG_TO_IMU_PSI
#define USE_MAG_TO_IMU 1
static struct Int32RMat mag_to_imu; ///< rotation from mag to imu frame
#else
#define USE_MAG_TO_IMU 0
#endif
#endif

struct Hmc58xx mag_hmc58xx;

void mag_hmc58xx_module_init(void)
{
hmc58xx_init(&mag_hmc58xx, &(MAG_HMC58XX_I2C_DEV), HMC58XX_ADDR);

#if MODULE_HMC58XX_UPDATE_AHRS && USE_MAG_TO_IMU
struct Int32Eulers mag_to_imu_eulers = {
ANGLE_BFP_OF_REAL(HMC58XX_MAG_TO_IMU_PHI),
ANGLE_BFP_OF_REAL(HMC58XX_MAG_TO_IMU_THETA),
ANGLE_BFP_OF_REAL(HMC58XX_MAG_TO_IMU_PSI)
};
int32_rmat_of_eulers(&mag_to_imu, &mag_to_imu_eulers);
#endif
}

void mag_hmc58xx_module_periodic(void)
Expand All @@ -81,8 +98,17 @@ void mag_hmc58xx_module_event(void)
HMC58XX_CHAN_Y_SIGN(int32_t)(mag_hmc58xx.data.value[HMC58XX_CHAN_Y]),
HMC58XX_CHAN_Z_SIGN(int32_t)(mag_hmc58xx.data.value[HMC58XX_CHAN_Z])
};
// only rotate if needed
#if USE_MAG_TO_IMU
struct Int32Vect3 imu_mag;
// rotate data from mag frame to imu frame
int32_rmat_vmult(&imu_mag, &mag_to_imu, &mag);
// unscaled vector
VECT3_COPY(imu.mag_unscaled, imu_mag);
#else
// unscaled vector
VECT3_COPY(imu.mag_unscaled, mag);
#endif
// scale vector
imu_scale_mag(&imu);

Expand Down

0 comments on commit 9dbff18

Please sign in to comment.