| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef FUSION_H_ |
| |
| #define FUSION_H_ |
| |
| #include <common/math/vec.h> |
| #include <common/math/mat.h> |
| #include <common/math/quat.h> |
| |
| #include <stdbool.h> |
| #include <stdint.h> |
| #include <sys/types.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| struct FusionParam { |
| float gyro_var; |
| float gyro_bias_var; |
| float acc_stdev; |
| float mag_stdev; |
| }; |
| |
| struct Fusion { |
| Quat x0; |
| struct Vec3 x1; |
| |
| struct Mat33 P[2][2]; |
| struct Mat33 GQGt[2][2]; |
| |
| struct Mat33 Phi0[2]; |
| struct Vec3 Ba, Bm; |
| uint32_t mInitState; |
| float mPredictDt; |
| struct Vec3 mData[3]; |
| uint32_t mCount[3]; |
| uint32_t flags; |
| |
| float trustedMagDuration; |
| bool lastMagInvalid; |
| |
| float fake_mag_decimation; |
| struct FusionParam param; |
| }; |
| |
| enum FusionFlagBits { |
| FUSION_USE_MAG = 1 << 0, |
| FUSION_USE_GYRO = 1 << 1, |
| FUSION_REINITIALIZE = 1 << 2, |
| }; |
| |
| enum MagTrustMode { |
| NORMAL, |
| INITIALIZATION, // right after initialization of fusion |
| BACK_TO_VALID, // when the mag value goes from invalid to valid |
| MANUAL_MAG_CAL // right after a manual calibration |
| }; |
| |
| void initFusion(struct Fusion *fusion, uint32_t flags); |
| |
| void fusionHandleGyro(struct Fusion *fusion, const struct Vec3 *w, float dT); |
| int fusionHandleAcc(struct Fusion *fusion, const struct Vec3 *a, float dT); |
| int fusionHandleMag(struct Fusion *fusion, const struct Vec3 *m, float dT); |
| |
| // set trust mode of mag sensors depending on scenarios, see MagTrustMode |
| void fusionSetMagTrust(struct Fusion *fusion, int mode); |
| |
| void fusionGetAttitude(const struct Fusion *fusion, struct Vec4 *attitude); |
| void fusionGetBias(const struct Fusion *fusion, struct Vec3 *bias); |
| void fusionGetRotationMatrix(const struct Fusion *fusion, struct Mat33 *R); |
| int fusionHasEstimate(const struct Fusion *fusion); |
| |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif // FUSION_H_ |