diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2018-03-03 10:49:43 +0100 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2018-03-03 13:05:54 +0100 | 
| commit | 7072e072f4bb8388b40d6599a2a509d84d41a51d (patch) | |
| tree | 58b063c59a872f27acf6c06f7ccdc9136b0b16f6 | |
| parent | 4d2106c3c6f51c574fbfad69d6086cbe74af1179 (diff) | |
logic/pipeline: centering fix
The `scaled_rotation' gimbal lock "fix" didn't take
into account sign changes, making center close to +-180
useless. remove the "fix".
This leaves with a gimbal lock problem at +-90 yaw. Fix
in another commit.
| -rw-r--r-- | logic/pipeline.cpp | 44 | ||||
| -rw-r--r-- | logic/pipeline.hpp | 14 | 
2 files changed, 32 insertions, 26 deletions
diff --git a/logic/pipeline.cpp b/logic/pipeline.cpp index 654a9f09..f691a653 100644 --- a/logic/pipeline.cpp +++ b/logic/pipeline.cpp @@ -17,6 +17,7 @@  #include "compat/meta.hpp"  #include "pipeline.hpp" +#include "logic/shortcuts.h"  #include <cmath>  #include <algorithm> @@ -246,10 +247,10 @@ bool maybe_nan(const char* text, const char* fun, int line, const xs&... vals)      do                                                                      \      {                                                                       \          if (maybe_nan(#__VA_ARGS__, OTR_FUNNAME, __LINE__, __VA_ARGS__))    \ -            goto nan;                                                       \ +            goto error;                                                     \      } while (false) -void pipeline::maybe_enable_center_on_tracking_started() +bool pipeline::maybe_enable_center_on_tracking_started()  {      if (!tracking_started)      { @@ -261,15 +262,20 @@ void pipeline::maybe_enable_center_on_tracking_started()              }          if (tracking_started && s.center_at_startup) +        {              set(f_center, true); +            return true; +        }      } + +    return false;  }  void pipeline::maybe_set_center_pose(const Pose& value, bool own_center_logic)  {      euler_t tmp = d2r * euler_t(&value[Yaw]); -    scaled_rotation.rotation = euler_to_rmat(c_div * tmp); -    real_rotation.rotation = euler_to_rmat(tmp); +    //scaled_rotation.rotation = euler_to_rmat(c_div * tmp); +    rotation.rotation = euler_to_rmat(tmp);      if (get(f_center))      { @@ -278,15 +284,15 @@ void pipeline::maybe_set_center_pose(const Pose& value, bool own_center_logic)          if (own_center_logic)          { -            scaled_rotation.rot_center = rmat::eye(); -            real_rotation.rot_center = rmat::eye(); +            //scaled_rotation.rot_center = rmat::eye(); +            rotation.inv_rot_center = rmat::eye();              t_center = euler_t();          }          else          { -            real_rotation.rot_center = real_rotation.rotation.t(); -            scaled_rotation.rot_center = scaled_rotation.rotation.t(); +            rotation.inv_rot_center = rotation.rotation.t(); +            //scaled_rotation.rot_center = scaled_rotation.rotation.t();              t_center = euler_t(static_cast<const double*>(value));          } @@ -316,27 +322,26 @@ Pose pipeline::clamp_value(Pose value) const  Pose pipeline::apply_center(Pose value) const  { -    rmat rotation = scaled_rotation.rotation * scaled_rotation.rot_center; -    euler_t pos = euler_t(value) - t_center; -    euler_t rot = r2d * c_mult * rmat_to_euler(rotation); +    euler_t T = euler_t(value) - t_center; +    euler_t R = r2d * rmat_to_euler(rotation.rotation * rotation.inv_rot_center); -    pos = rel.rotate(real_rotation.rot_center, pos, vec3_bool()); +    T = rel.rotate(rotation.inv_rot_center, T, vec3_bool());      for (int i = 0; i < 3; i++)      { -        // don't invert after t_compensate +        // don't invert after reltrans          // inverting here doesn't break centering          if (m(i+3).opts.invert) -            rot(i) = -rot(i); +            R(i) = -R(i);          if (m(i).opts.invert) -            pos(i) = -pos(i); +            T(i) = -T(i);      }      for (int i = 0; i < 3; i++)      { -        value(i) = pos(i); -        value(i+3) = rot(i); +        value(i) = T(i); +        value(i+3) = R(i);      }      return value; @@ -442,7 +447,8 @@ void pipeline::logic()          maybe_enable_center_on_tracking_started();          maybe_set_center_pose(value, own_center_logic);          value = apply_center(value); -        logger.write_pose(value); // "corrected" - after various transformations to account for camera position +        // "corrected" - after various transformations to account for camera position +        logger.write_pose(value);      }      { @@ -470,7 +476,7 @@ void pipeline::logic()      goto ok; -nan: +error:      {          QMutexLocker foo(&mtx); diff --git a/logic/pipeline.hpp b/logic/pipeline.hpp index 45d5b2b2..d51655b3 100644 --- a/logic/pipeline.hpp +++ b/logic/pipeline.hpp @@ -98,16 +98,16 @@ private:      struct state      { -        rmat rot_center; +        rmat inv_rot_center;          rmat rotation; -        state() : rot_center(rmat::eye()) +        state() : inv_rot_center(rmat::eye())          {}      };      reltrans rel; -    state real_rotation, scaled_rotation; +    state rotation;      euler_t t_center;      ns backlog_time = ns(0); @@ -117,7 +117,7 @@ private:      double map(double pos, Map& axis);      void logic();      void run() override; -    void maybe_enable_center_on_tracking_started(); +    bool maybe_enable_center_on_tracking_started();      void maybe_set_center_pose(const Pose& value, bool own_center_logic);      Pose clamp_value(Pose value) const;      Pose apply_center(Pose value) const; @@ -126,9 +126,9 @@ private:      Pose apply_reltrans(Pose value, vec6_bool disabled);      Pose apply_zero_pos(Pose value) const; -    // note: float exponent base is 2 -    static constexpr inline double c_mult = 16; -    static constexpr inline double c_div = 1./c_mult; +    // reminder: float exponent base is 2 +    //static constexpr inline double c_mult = 16; +    //static constexpr inline double c_div = 1./c_mult;  public:      pipeline(Mappings& m, runtime_libraries& libs, event_handler& ev, TrackLogger& logger);      ~pipeline();  | 
