same

Fork of BNO055_fusion by Kenji Arai

Files at this revision

API Documentation at this revision

Comitter:
mrcrsch
Date:
Mon Jan 16 16:51:39 2017 +0000
Parent:
4:9e6fead1e93e
Commit message:
added extra functions;

Changed in this revision

BNO055.cpp Show annotated file Show diff for this revision Revisions of this file
BNO055.h Show annotated file Show diff for this revision Revisions of this file
diff -r 9e6fead1e93e -r 6a08a4c5b1e1 BNO055.cpp
--- a/BNO055.cpp	Thu Apr 16 10:47:40 2015 +0000
+++ b/BNO055.cpp	Mon Jan 16 16:51:39 2017 +0000
@@ -481,3 +481,55 @@
     change_fusion_mode(current_mode);
     return d;
 }
+
+void BNO055::get_quaternion_float(float *Q){
+    BNO055_QUATERNION_TypeDef intQ;
+    get_quaternion(&intQ);
+    
+    Q[0] = (float)(intQ.w / 16384.0);
+    Q[1] = (float)(intQ.x / 16384.0);
+    Q[2] = (float)(intQ.y / 16384.0);
+    Q[3] = (float)(intQ.z / 16384.0);
+}
+
+
+void BNO055::configure_accelerometer_range(uint8_t range){
+    uint8_t current_mode;
+    
+    current_mode = check_operating_mode();
+    if(current_mode != CONFIGMODE)
+        change_fusion_mode(CONFIGMODE);
+        
+    select_page(1); 
+    dt[0] = ACCEL_CONFIG;
+    dt[1] = 0<<5 | 3 << 2 | range;
+    
+    _i2c.write(chip_addr, dt, 2, false);
+    
+    change_fusion_mode(current_mode);
+}
+
+void BNO055::get_abs_accel(BNO055_LIN_ACC_TypeDef *la){
+    //http://math.stackexchange.com/questions/40164/how-do-you-rotate-a-vector-by-a-unit-quaternion
+    //http://mathworld.wolfram.com/QuaternionConjugate.html
+    
+    float tempQuat[4];
+    float Quat[4];
+    
+    get_linear_accel(la);
+    get_quaternion_float(tempQuat);
+    
+    for( int i=0; i<4; i++)
+        Quat[i] = tempQuat[i];
+    
+    //http://es.mathworks.com/help/aeroblks/quaternionmultiplication.html   q=quat, r=la
+    tempQuat[0]=0 -la->x*Quat[1] -la->y*Quat[2] -la->z*Quat[3];
+    tempQuat[1]=0 +la->x*Quat[0] -la->y*Quat[3] +la->z*Quat[2];
+    tempQuat[2]=0 +la->x*Quat[3] +la->y*Quat[0] -la->z*Quat[1];
+    tempQuat[3]=0 -la->x*Quat[2] +la->y*Quat[1] +la->z*Quat[0];
+
+    //q=tempQuat, r=quatConj
+    la->x=Quat[0]*tempQuat[1] -Quat[1]*tempQuat[0] +Quat[2]*tempQuat[3] -Quat[3]*tempQuat[2];
+    la->y=Quat[0]*tempQuat[2] +Quat[1]*tempQuat[3] -Quat[2]*tempQuat[0] +Quat[3]*tempQuat[1];
+    la->z=Quat[0]*tempQuat[3] +Quat[1]*tempQuat[2] -Quat[2]*tempQuat[1] -Quat[3]*tempQuat[0];
+}
\ No newline at end of file
diff -r 9e6fead1e93e -r 6a08a4c5b1e1 BNO055.h
--- a/BNO055.h	Thu Apr 16 10:47:40 2015 +0000
+++ b/BNO055.h	Mon Jan 16 16:51:39 2017 +0000
@@ -62,6 +62,9 @@
 #define I_AM_BNO055_MAG         0x32    // MAG ID
 #define I_AM_BNO055_GYR         0x0f    // GYR ID
 
+
+
+
 ////////////// DATA TYPE DEFINITION ///////////////////////
 typedef struct {
     uint8_t  chip_id;
@@ -102,6 +105,21 @@
     int8_t gyr_chip;
 } BNO055_TEMPERATURE_TypeDef;
 
+typedef struct {
+    uint8_t Gscale;
+    uint8_t Gbw;
+    uint8_t GPwrMode;
+    
+    uint8_t Ascale;
+    uint8_t Abw;
+    uint8_t APwrMode;
+    
+    uint8_t MOpMode;
+    uint8_t MPwrMode;
+    uint8_t Modr;
+   
+} BNO055_CONFIG_TypeDef;
+
 enum {MT_P0 = 0, MT_P1, MT_P2, MT_P3, MT_P4, MT_P5, MT_P6, MT_P7};
 
 /** Interface for Bosch Sensortec Intelligent 9-axis absolute orientation sensor
@@ -258,7 +276,16 @@
       * @return register data
       */
     uint8_t write_reg1(uint8_t addr, uint8_t data);
-
+    
+    /** Calculate acceleration in Earth frame
+      * @param Linear acceleration structure
+    */
+    void get_abs_accel(BNO055_LIN_ACC_TypeDef *la);
+    
+    void get_quaternion_float(float *Q);
+    
+    void configure_accelerometer_range(uint8_t range);
+    
 protected:
     void initialize(void);
     void check_id(void);
@@ -283,6 +310,8 @@
     uint8_t  gyr_id;
     uint8_t  bootldr_rev_id;
     uint16_t sw_rev_id;
+    
+    
 
 };
 
@@ -465,6 +494,9 @@
 #define GYRO_ANY_MOTION_THRES   0x1e
 #define GYRO_ANY_MOTION_SET     0x1f
 
+
+
+
 //---------------------------------------------------------
 //----- Calibration example -------------------------------
 //---------------------------------------------------------