diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2016-06-14 11:44:30 +0200 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-06-14 18:14:46 +0200 | 
| commit | 2f0d5047d3fbe3958f2663c1ac7e7a2ecccc9336 (patch) | |
| tree | cd0932f9d6d4ca0f6e82a6db4c104ea2eb4d2c78 /opentrack | |
| parent | 8c882ca9311e70fc0a1577a5c38baba16e4398b2 (diff) | |
api/tracker: add euler filter
Gimbal lock is a problem too often.
Diffstat (limited to 'opentrack')
| -rw-r--r-- | opentrack/simple-mat.cpp | 17 | ||||
| -rw-r--r-- | opentrack/tracker.cpp | 48 | ||||
| -rw-r--r-- | opentrack/tracker.h | 3 | 
3 files changed, 46 insertions, 22 deletions
diff --git a/opentrack/simple-mat.cpp b/opentrack/simple-mat.cpp index 45a6ef5b..645bcbbe 100644 --- a/opentrack/simple-mat.cpp +++ b/opentrack/simple-mat.cpp @@ -9,7 +9,7 @@ enum Axis      TX, TY, TZ, Yaw, Pitch, Roll  }; -static constexpr double eps_ = 1e-1; +static constexpr double eps_ = 2e1;  static constexpr double d2r = pi / 180;  static constexpr double eps = eps_ * d2r; @@ -25,15 +25,24 @@ euler_t euler_filter(const euler_t& rot_)          pi, pi/2, pi      }; +    double changed_eps[] = { 0, 0, 0 }; +      for (int i = 0; i < 3; i++)          if (fabs(rot(i)) > thres[i] - eps && fabs(rot(i)) < thres[i] + eps)          {              const double eps__ = copysign(eps, rot(i)); +            changed_eps[i] = eps__; +              rot(i) -= eps__; -            rmat tmp = euler_to_rmat(rot); -            rot = rmat_to_euler(tmp); -            rot(i) += eps__; +            rot = rmat_to_euler(euler_to_rmat(rot));          } + +    for (int i = 0; i < 3; i++) +    { +        rot(i) += changed_eps[i]; +        if (fabs(rot(i)) > 2*pi) +            rot(i) = copysign(2*pi, rot(i)); +    }      return rot;  } diff --git a/opentrack/tracker.cpp b/opentrack/tracker.cpp index cdee2800..819c3592 100644 --- a/opentrack/tracker.cpp +++ b/opentrack/tracker.cpp @@ -63,11 +63,13 @@ void Tracker::t_compensate(const rmat& rmat, const double* xyz, double* output,      output[0] = -ret(1);  } -static inline bool nanp(double value) -{ -    const volatile double x = value; -    return std::isnan(x) || std::isinf(x); -} +#ifdef _WIN32 +__declspec(noinline) bool nanp(double value); +#elif defined(__GNUC__) +bool __attribute__ ((noinline)) nanp(double value); +#else +bool nanp(double value); +#endif  static inline double elide_nan(double value, double def)  { @@ -116,6 +118,8 @@ void Tracker::logic()      static constexpr double pi = 3.141592653;      static constexpr double r2d = 180. / pi; +    using namespace euler; +      Pose value, raw;      for (int i = 0; i < 6; i++) @@ -138,9 +142,9 @@ void Tracker::logic()          (double)-s.camera_pitch,          (double)-s.camera_roll      }; -    const rmat cam = rmat::euler_to_rmat(off); -    rmat r = rmat::euler_to_rmat(&value[Yaw]); -    dmat<3, 1> t(value(0), value(1), value(2)); +    const rmat cam = euler_to_rmat(off); +    rmat r = euler_to_rmat(&value[Yaw]); +    euler_t t(value(0), value(1), value(2));      r = cam * r; @@ -181,7 +185,8 @@ void Tracker::logic()              m_ = r_b.t() * r;          } -        const dmat<3, 1> euler = rmat::rmat_to_euler(m_); +        const euler_t euler = rmat_to_euler(m_); +          for (int i = 0; i < 3; i++)          {              value(i) = tmp[i]; @@ -190,23 +195,32 @@ void Tracker::logic()      }      bool nan_ = false; -    // we're checking NaNs after every block of numeric ops +    // whenever something can corrupt its internal state due to nan/inf, elide the call      if (is_nan(value))      {          nan_ = true;      }      else      { -        Pose tmp = value; +        { +            Pose tmp = value; -        if (libs.pFilter) -            libs.pFilter->filter(tmp, value); +            if (libs.pFilter) +                libs.pFilter->filter(tmp, value); +        } + +        { +            euler_t e(value(Yaw), value(Pitch), value(Roll)); +            e = euler_filter(e); +            for (int i = 0; i < 3; i++) +                value(i + Yaw) = e(i); +        }          for (int i = 0; i < 6; i++)              value(i) = map(value(i), m(i));          if (s.tcomp_p) -            t_compensate(rmat::euler_to_rmat(&value[Yaw]), +            t_compensate(euler_to_rmat(&value[Yaw]),                           value,                           value,                           s.tcomp_tz); @@ -244,7 +258,8 @@ void Tracker::logic()      raw_6dof = raw;  } -void Tracker::run() { +void Tracker::run() +{      const int sleep_ms = 3;  #if defined(_WIN32) @@ -265,7 +280,8 @@ void Tracker::run() {          logic();          long q = sleep_ms * 1000L - t.elapsed()/1000L; -        usleep(std::max(1L, q)); +        using std::max; +        usleep(max(1L, q));      }      { diff --git a/opentrack/tracker.h b/opentrack/tracker.h index 079ce473..c1cfa850 100644 --- a/opentrack/tracker.h +++ b/opentrack/tracker.h @@ -64,7 +64,7 @@ private:      SelectedLibraries const& libs;      using rmat = dmat<3, 3>; -     +      dmat<3, 3> r_b;      double t_b[3]; @@ -73,7 +73,6 @@ private:      void t_compensate(const dmat<3, 3>& rmat, const double* ypr, double* output, bool rz);      void run() override; -      public:      Tracker(main_settings& s, Mappings& m, SelectedLibraries& libs);      ~Tracker();  | 
