25 #ifndef INCLUDED_EigenFilters_h_GUID_ECD959BF_587B_4ABB_30B3_E881B4520AC8
26 #define INCLUDED_EigenFilters_h_GUID_ECD959BF_587B_4ABB_30B3_E881B4520AC8
46 template <
typename Derived>
47 inline Derived computeStep(Eigen::MatrixBase<Derived>
const &hatx,
48 Eigen::MatrixBase<Derived>
const &x,
50 Derived ret = alpha * x + (1 - alpha) * hatx;
54 template <
typename Derived>
56 computeStep(Eigen::QuaternionBase<Derived>
const &hatx,
57 Eigen::QuaternionBase<Derived>
const &x,
59 Derived ret = hatx.slerp(alpha, x).normalized();
72 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
76 value_type
const &
filter(value_type
const &x, scalar alpha) {
82 if (std::isfinite(alpha)) {
83 m_hatx = computeStep(hatx(), x, alpha);
88 value_type
const &hatx()
const {
return m_hatx; }
92 bool m_firstTime =
true;
104 template <
typename T>
inline T computeAlpha(T dt, T cutoff) {
105 auto tau = T(1) / (T(2) * M_PI * cutoff);
106 return T(1) / (T(1) + tau / dt);
123 Params(
double minCut,
double b = 0.5,
double dCut = 1)
139 using DerivativeType = T;
140 static void setIdentity(DerivativeType &dx) {
141 dx = DerivativeType::Zero();
143 static DerivativeType compute(T
const &prev, T
const &curr,
145 return (curr - prev) / dt;
147 static double computeMagnitude(DerivativeType
const &dx) {
155 using DerivativeType = Eigen::Vector3d;
156 static void setIdentity(DerivativeType &dx) {
157 dx = DerivativeType::Zero();
159 static DerivativeType compute(Eigen::Quaterniond
const &prev,
160 Eigen::Quaterniond
const &curr,
162 return util::quat_ln(curr * prev.conjugate()) / dt;
164 static double computeMagnitude(DerivativeType
const &dx) {
182 using value_type = T;
185 using deriv_type =
typename deriv::DerivativeType;
186 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
190 value_type
const &filter(scalar dt, value_type
const &x) {
191 auto dx = deriv_type{};
194 deriv::setIdentity(dx);
196 dx = deriv::compute(m_xFilter.hatx(), x, dt);
199 m_dxFilter.
filter(dx, detail::computeAlpha<scalar>(
202 auto dxMag = deriv::computeMagnitude(m_dxFilter.hatx());
207 return m_xFilter.filter(
208 x, detail::computeAlpha<scalar>(dt, cutoff));
211 value_type
const &getState()
const {
return m_xFilter.hatx(); }
212 scalar getDerivativeMagnitude()
const {
213 return deriv::computeMagnitude(m_dxFilter.hatx());
217 bool m_firstTime =
true;
229 using Vec3 = Eigen::Matrix<scalar, 3, 1>;
230 using Quat = Eigen::Quaternion<scalar>;
231 using Translation = Translation3<scalar>;
232 using Isometry = Isometry3<scalar>;
236 : m_positionFilter(positionFilterParams),
237 m_orientationFilter(oriFilterParams){};
239 void filter(scalar dt, Vec3
const &position,
240 Quat
const &orientation) {
241 if (dt <= scalar(0)) {
245 m_positionFilter.filter(dt, position);
246 m_orientationFilter.filter(dt, orientation);
249 Vec3
const &getPosition()
const {
250 return m_positionFilter.getState();
253 scalar getLinearVelocityMagnitude()
const {
254 return m_positionFilter.getDerivativeMagnitude();
257 Quat
const &getOrientation()
const {
258 return m_orientationFilter.getState();
261 scalar getAngularVelocityMagnitude()
const {
262 return m_orientationFilter.getDerivativeMagnitude();
265 Isometry getIsometry()
const {
270 OneEuroFilter<Vec3> m_positionFilter;
271 OneEuroFilter<Quat> m_orientationFilter;
276 using one_euro::OneEuroFilter;
277 using one_euro::PoseOneEuroFilter;
279 using PoseOneEuroFilterd = one_euro::PoseOneEuroFilter<double>;
284 #endif // INCLUDED_EigenFilters_h_GUID_ECD959BF_587B_4ABB_30B3_E881B4520AC8
The main namespace for all C++ elements of the framework, internal and external.
double minCutoff
Minimum cutoff frequency (in Hz) at "0" speed.
Header wrapping include of and for warning quieting.
EIGEN_MAKE_ALIGNED_OPERATOR_NEW value_type const & filter(value_type const &x, scalar alpha)
double beta
Slope of cutoff frequency with respect to speed.
Isometry3< typename Derived1::Scalar > makeIsometry(Eigen::MatrixBase< Derived1 > const &translation, Eigen::RotationBase< Derived2, 3 > const &rotation)
A simpler, functional-style alternative to .fromPositionOrientationScale when no scaling is performed...
void filter(scalar dt, Vec3 const &position, Quat const &orientation)
double Scalar
Common scalar type.