|
@@ -19,6 +19,57 @@ static void update_device(ohmd_device* device)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+static void nofusion_update(fusion* me, float dt, const vec3f* accel)
|
|
|
+{
|
|
|
+ //avg raw accel data to smooth jitter, and normalise
|
|
|
+ ofq_add(&me->accel_fq, accel);
|
|
|
+ vec3f accel_mean;
|
|
|
+ ofq_get_mean(&me->accel_fq, &accel_mean);
|
|
|
+ vec3f acc_n = accel_mean;
|
|
|
+ ovec3f_normalize_me(&acc_n);
|
|
|
+
|
|
|
+
|
|
|
+ //reference vectors for axis-angle
|
|
|
+ vec3f xyzv[3] = {
|
|
|
+ {1,0,0},
|
|
|
+ {0,1,0},
|
|
|
+ {0,0,1}
|
|
|
+ };
|
|
|
+ quatf roll, pitch;
|
|
|
+
|
|
|
+ //pitch is rot around x, based on gravity in z and y axes
|
|
|
+ oquatf_init_axis(&pitch, xyzv+0, atan2f(-acc_n.z, -acc_n.y));
|
|
|
+
|
|
|
+ //roll is rot around z, based on gravity in x and y axes
|
|
|
+ //note we need to invert the values when the device is upside down (y < 0) for proper results
|
|
|
+ oquatf_init_axis(&roll, xyzv+2, acc_n.y < 0 ? atan2f(-acc_n.x, -acc_n.y) : atan2f(acc_n.x, acc_n.y));
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ quatf or = {0,0,0,1};
|
|
|
+ //order of applying is yaw-pitch-roll
|
|
|
+ //yaw is not possible using only accel
|
|
|
+ oquatf_mult_me(&or, &pitch);
|
|
|
+ oquatf_mult_me(&or, &roll);
|
|
|
+
|
|
|
+ me->orient = or;
|
|
|
+}
|
|
|
+
|
|
|
+//shorter buffers for frame smoothing
|
|
|
+void nofusion_init(fusion* me)
|
|
|
+{
|
|
|
+ memset(me, 0, sizeof(fusion));
|
|
|
+ me->orient.w = 1.0f;
|
|
|
+
|
|
|
+ ofq_init(&me->mag_fq, 10);
|
|
|
+ ofq_init(&me->accel_fq, 10);
|
|
|
+ ofq_init(&me->ang_vel_fq, 10);
|
|
|
+
|
|
|
+ me->flags = FF_USE_GRAVITY;
|
|
|
+ me->grav_gain = 0.05f;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static int getf(ohmd_device* device, ohmd_float_value type, float* out)
|
|
|
{
|
|
|
android_priv* priv = (android_priv*)device;
|
|
@@ -53,7 +104,8 @@ static int setf(ohmd_device* device, ohmd_float_value type, float* in)
|
|
|
|
|
|
switch(type){
|
|
|
case OHMD_EXTERNAL_SENSOR_FUSION: {
|
|
|
- ofusion_update(&priv->sensor_fusion, *in, (vec3f*)(in + 1), (vec3f*)(in + 4), (vec3f*)(in + 7));
|
|
|
+ //ofusion_update(&priv->sensor_fusion, *in, (vec3f*)(in + 1), (vec3f*)(in + 4), (vec3f*)(in + 7));
|
|
|
+ nofusion_update(&priv->sensor_fusion, *in, (vec3f*)(in + 4));
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -101,8 +153,8 @@ static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc)
|
|
|
priv->base.close = close_device;
|
|
|
priv->base.getf = getf;
|
|
|
priv->base.setf = setf;
|
|
|
-
|
|
|
- ofusion_init(&priv->sensor_fusion);
|
|
|
+
|
|
|
+ nofusion_init(&priv->sensor_fusion);
|
|
|
|
|
|
return (ohmd_device*)priv;
|
|
|
}
|
|
@@ -142,7 +194,7 @@ ohmd_driver* ohmd_create_android_drv(ohmd_context* ctx)
|
|
|
}
|
|
|
|
|
|
/* Android specific functions */
|
|
|
-static void set_android_properties(ohmd_driver* driver, ohmd_device_properties* props)
|
|
|
+static void set_android_properties(ohmd_device* device, ohmd_device_properties* props)
|
|
|
{
|
|
|
android_priv* priv = (android_priv*)device;
|
|
|
|