From 442a1434833ee084c3f8eda26e48954272176ea6 Mon Sep 17 00:00:00 2001
From: Operator Computer Title: Description: Copyright: Copyright (c) 2007 Company:
+ *
+ *+ * An AlphaBetaFilteredYoVariable is a filtered version of an input YoVar. + * Either a YoVariable holding the unfiltered val is passed in to the + * constructor and update() is called every tick, or update(double) is + * called every tick. The AlphaBetaFilteredYoVariable updates it's val + * with the current filtered velocity using + * + * xp = x + (dt) v // angular position prediction + * x+ = xp + alpha (xmeas - xp) // adjusted angular position estimate + * v+ = v + beta (xmeas - xp) // adjusted velocity estimate + * + *
+ *+ * + * For complete reference see: + * http://www.mstarlabs.com/control/engspeed.html#Ref2 + * + *+ */ +public class AlphaBetaFilteredYoVariable extends YoDouble +{ + private double alpha = 0.0, beta = 0.0; + + private final double DT; + private YoDouble alphaVariable = null; + private YoDouble betaVariable = null; + + private final YoDouble positionState; + private final YoDouble xMeasuredVariable; + + public AlphaBetaFilteredYoVariable(String name, YoVariableRegistry registry, double alpha, double beta, YoDouble positionVariable, + YoDouble xMeasuredVariable, double DT) + { + super(name, registry); + this.alpha = alpha; + this.beta = beta; + this.DT = DT; + this.positionState = positionVariable; + this.xMeasuredVariable = xMeasuredVariable; + + reset(); + } + + public AlphaBetaFilteredYoVariable(String name, YoVariableRegistry registry, YoDouble alphaVariable, YoDouble betaVariable, + YoDouble positionVariable, YoDouble xMeasuredVariable, double DT) + { + super(name, registry); + this.alphaVariable = alphaVariable; + this.betaVariable = betaVariable; + this.DT = DT; + this.positionState = positionVariable; + this.xMeasuredVariable = xMeasuredVariable; + + reset(); + } + + public void reset() + { + } + + public YoDouble getPositionEstimation() + { + return positionState; + } + + public YoDouble getVelocityEstimation() + { + return this; + } + + public void update() + { + update(positionState.getDoubleValue()); + } + + public void update(double position) + { + if (alphaVariable != null) + { + alpha = alphaVariable.getDoubleValue(); + } + + if (betaVariable != null) + { + beta = betaVariable.getDoubleValue(); + } + + double velocity = this.getDoubleValue(); + + double prediction = position + DT * velocity; // xp = x + (dt) v, position prediction + double error = xMeasuredVariable.getDoubleValue() - prediction; + double newPosition = prediction + alpha * error; // x+ = xp + alpha (xmeas - xp), adjusted position estimate + double newVelocity = velocity + beta * error; // v+ = v + beta (xmeas - xp), adjusted velocity estimate + + positionState.set(newPosition); + this.set(newVelocity); // filter updates its YoVariable value to velocity by convention. + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredWrappingYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredWrappingYoVariable.java new file mode 100644 index 00000000..9ab23e07 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredWrappingYoVariable.java @@ -0,0 +1,138 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class AlphaFilteredWrappingYoVariable extends AlphaFilteredYoVariable +{ + public static final double EPSILON = 1e-10; + + private double previousUnfilteredVariable; + private final YoDouble unfilteredVariable; + private final YoDouble unfilteredInRangeVariable; + private final YoDouble alphaVariable; + + private final YoDouble temporaryOutputVariable; + private final YoDouble error; + private final double upperLimit; + private final double lowerLimit; + private final double range; + + //wrap the values in [lowerLimit ; upperLimit[ + + public AlphaFilteredWrappingYoVariable(String name, String description, YoVariableRegistry registry, final YoDouble unfilteredVariable, YoDouble alphaVariable, double lowerLimit, double upperLimit) + { + super(name, description, registry, alphaVariable); + this.alphaVariable = alphaVariable; + this.upperLimit = upperLimit; + this.lowerLimit = lowerLimit; + this.range = upperLimit - lowerLimit; + this.unfilteredVariable = unfilteredVariable; + + unfilteredInRangeVariable = new YoDouble(name + "UnfilteredInRangeVariable", registry); + temporaryOutputVariable = new YoDouble(name + "TemporaryOutputVariable", registry); + error = new YoDouble(name + "Error", registry); + + } + + @Override + public void update() + { + update(unfilteredVariable.getDoubleValue()); + } + + + @Override + public void update(double currentPosition) + { + if(!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + previousUnfilteredVariable = unfilteredVariable.getDoubleValue(); + + unfilteredVariableModulo(currentPosition); + + temporaryOutputVariable.set(unfilteredInRangeVariable.getDoubleValue()); + set(unfilteredInRangeVariable.getDoubleValue()); + } + else + { + if (!MathTools.epsilonEquals(currentPosition, previousUnfilteredVariable, EPSILON)) + { + previousUnfilteredVariable = currentPosition; + + unfilteredVariableModulo(currentPosition); + + //calculate the error + double standardError = unfilteredInRangeVariable.getDoubleValue() - getDoubleValue(); + double wrappingError; + if(unfilteredInRangeVariable.getDoubleValue() > getDoubleValue()) + { + wrappingError = lowerLimit - getDoubleValue() + unfilteredInRangeVariable.getDoubleValue() - upperLimit; + } + else + { + wrappingError = upperLimit - getDoubleValue() + unfilteredInRangeVariable.getDoubleValue() - lowerLimit; + } + if(Math.abs(standardError) < Math.abs(wrappingError)) + { + error.set(standardError); + } + else + { + error.set(wrappingError); + } + + //determine if wrapping and move the input if necessary + temporaryOutputVariable.set(getDoubleValue()); + if ((getDoubleValue() + error.getDoubleValue()) >= upperLimit) + { + temporaryOutputVariable.set(getDoubleValue() - range); + } + if ((getDoubleValue() + error.getDoubleValue()) < lowerLimit) + { + temporaryOutputVariable.set(getDoubleValue() + range); + } + } + + temporaryOutputVariable.set(alphaVariable.getDoubleValue() * temporaryOutputVariable.getDoubleValue() + (1.0 - alphaVariable.getDoubleValue()) + * unfilteredInRangeVariable.getDoubleValue()); + + if (temporaryOutputVariable.getDoubleValue() > upperLimit + EPSILON) + { + set(temporaryOutputVariable.getDoubleValue() - range); + } + else if (temporaryOutputVariable.getDoubleValue() <= lowerLimit - EPSILON) + { + set(temporaryOutputVariable.getDoubleValue() + range); + } + else + { + set(temporaryOutputVariable.getDoubleValue()); + } + } + } + + private void unfilteredVariableModulo(double currentPosition) + { + //handle if the input is out of range + boolean rangeNeedsToBeChecked = true; + unfilteredInRangeVariable.set(currentPosition); + + while(rangeNeedsToBeChecked) + { + rangeNeedsToBeChecked = false; + if (unfilteredInRangeVariable.getDoubleValue() >= upperLimit) + { + unfilteredInRangeVariable.set(unfilteredInRangeVariable.getDoubleValue() - range); + rangeNeedsToBeChecked = true; + } + if (unfilteredInRangeVariable.getDoubleValue() < lowerLimit) + { + unfilteredInRangeVariable.set(unfilteredInRangeVariable.getDoubleValue() + range); + rangeNeedsToBeChecked = true; + } + } + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFramePoint.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFramePoint.java new file mode 100644 index 00000000..11441ca3 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFramePoint.java @@ -0,0 +1,139 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.euclid.referenceFrame.FramePoint3D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.tuple3D.Point3D; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.robotics.math.frames.YoFramePoint; +import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; + +public class AlphaFilteredYoFramePoint extends YoFramePoint +{ + private final AlphaFilteredYoVariable x, y, z; + + private AlphaFilteredYoFramePoint(AlphaFilteredYoVariable x, AlphaFilteredYoVariable y, AlphaFilteredYoVariable z, ReferenceFrame referenceFrame) + { + super(x, y, z, referenceFrame); + + this.x = x; + this.y = y; + this.z = z; + } + + public static AlphaFilteredYoFramePoint createAlphaFilteredYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, double alpha, + ReferenceFrame referenceFrame) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alpha); + + AlphaFilteredYoFramePoint ret = new AlphaFilteredYoFramePoint(x, y, z, referenceFrame); + + return ret; + } + + public static AlphaFilteredYoFramePoint createAlphaFilteredYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, + YoDouble alpha, ReferenceFrame referenceFrame) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alpha); + + AlphaFilteredYoFramePoint ret = new AlphaFilteredYoFramePoint(x, y, z, referenceFrame); + + return ret; + } + + + public static AlphaFilteredYoFramePoint createAlphaFilteredYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, double alpha, + YoFramePoint unfilteredPoint) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha, unfilteredPoint.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha, unfilteredPoint.getYoY()); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alpha, unfilteredPoint.getYoZ()); + + AlphaFilteredYoFramePoint ret = new AlphaFilteredYoFramePoint(x, y, z, unfilteredPoint.getReferenceFrame()); + + return ret; + } + + + public static AlphaFilteredYoFramePoint createAlphaFilteredYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, + YoDouble alpha, YoFramePoint unfilteredPoint) + { + // alpha is a YoVariable + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha, unfilteredPoint.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha, unfilteredPoint.getYoY()); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alpha, unfilteredPoint.getYoZ()); + + AlphaFilteredYoFramePoint ret = new AlphaFilteredYoFramePoint(x, y, z, unfilteredPoint.getReferenceFrame()); + + return ret; + } + + public static AlphaFilteredYoFramePoint createAlphaFilteredYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, + double alphaX, double alphaY, double alphaZ, YoFramePoint unfilteredPoint) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alphaX, unfilteredPoint.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alphaY, unfilteredPoint.getYoY()); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alphaZ, unfilteredPoint.getYoZ()); + + AlphaFilteredYoFramePoint ret = new AlphaFilteredYoFramePoint(x, y, z, unfilteredPoint.getReferenceFrame()); + + return ret; + } + + public static AlphaFilteredYoFramePoint createAlphaFilteredYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, + YoDouble alphaX, YoDouble alphaY, YoDouble alphaZ, YoFramePoint unfilteredPoint) + { + // alpha is a YoVariable + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alphaX, unfilteredPoint.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alphaY, unfilteredPoint.getYoY()); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alphaZ, unfilteredPoint.getYoZ()); + + AlphaFilteredYoFramePoint ret = new AlphaFilteredYoFramePoint(x, y, z, unfilteredPoint.getReferenceFrame()); + + return ret; + } + + public void update() + { + x.update(); + y.update(); + z.update(); + } + + public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) + { + x.update(xUnfiltered); + y.update(yUnfiltered); + z.update(zUnfiltered); + } + + public void update(Point3D pointUnfiltered) + { + x.update(pointUnfiltered.getX()); + y.update(pointUnfiltered.getY()); + z.update(pointUnfiltered.getZ()); + } + + public void update(FramePoint3D pointUnfiltered) + { + checkReferenceFrameMatch(pointUnfiltered); + x.update(pointUnfiltered.getX()); + y.update(pointUnfiltered.getY()); + z.update(pointUnfiltered.getZ()); + } + + public void reset() + { + x.reset(); + y.reset(); + z.reset(); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFramePoint2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFramePoint2d.java new file mode 100644 index 00000000..1c58601c --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFramePoint2d.java @@ -0,0 +1,102 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.euclid.referenceFrame.FramePoint2D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.tuple2D.Point2D; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.robotics.math.frames.YoFramePoint2d; +import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; + +public class AlphaFilteredYoFramePoint2d extends YoFramePoint2d +{ + private final AlphaFilteredYoVariable x, y; + + private AlphaFilteredYoFramePoint2d(AlphaFilteredYoVariable x, AlphaFilteredYoVariable y, ReferenceFrame referenceFrame) + { + super(x, y, referenceFrame); + + this.x = x; + this.y = y; + } + + public static AlphaFilteredYoFramePoint2d createAlphaFilteredYoFramePoint2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, double alpha, ReferenceFrame referenceFrame) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha); + + AlphaFilteredYoFramePoint2d ret = new AlphaFilteredYoFramePoint2d(x, y, referenceFrame); + + return ret; + } + + public static AlphaFilteredYoFramePoint2d createAlphaFilteredYoFramePoint2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble alpha, ReferenceFrame referenceFrame) + { + return createAlphaFilteredYoFramePoint2d(namePrefix, nameSuffix, "", registry, alpha, referenceFrame); + } + + public static AlphaFilteredYoFramePoint2d createAlphaFilteredYoFramePoint2d(String namePrefix, String nameSuffix, String description, YoVariableRegistry registry, YoDouble alpha, ReferenceFrame referenceFrame) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), description, registry, alpha); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), description, registry, alpha); + + AlphaFilteredYoFramePoint2d ret = new AlphaFilteredYoFramePoint2d(x, y, referenceFrame); + + return ret; + } + + public static AlphaFilteredYoFramePoint2d createAlphaFilteredYoFramePoint2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, double alpha, YoFramePoint2d unfilteredPoint) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha, unfilteredPoint.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha, unfilteredPoint.getYoY()); + + AlphaFilteredYoFramePoint2d ret = new AlphaFilteredYoFramePoint2d(x, y, unfilteredPoint.getReferenceFrame()); + + return ret; + } + + public static AlphaFilteredYoFramePoint2d createAlphaFilteredYoFramePoint2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble alpha, YoFramePoint2d unfilteredPoint) + { + // alpha is a YoVariable + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha, unfilteredPoint.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha, unfilteredPoint.getYoY()); + + AlphaFilteredYoFramePoint2d ret = new AlphaFilteredYoFramePoint2d(x, y, unfilteredPoint.getReferenceFrame()); + + return ret; + } + + public void update() + { + x.update(); + y.update(); + } + + public void update(double xUnfiltered, double yUnfiltered) + { + x.update(xUnfiltered); + y.update(yUnfiltered); + } + + public void update(Point2D point2dUnfiltered) + { + x.update(point2dUnfiltered.getX()); + y.update(point2dUnfiltered.getY()); + } + + public void update(FramePoint2D point2dUnfiltered) + { + checkReferenceFrameMatch(point2dUnfiltered); + x.update(point2dUnfiltered.getX()); + y.update(point2dUnfiltered.getY()); + } + + public void reset() + { + x.reset(); + y.reset(); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFrameQuaternion.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFrameQuaternion.java new file mode 100644 index 00000000..5568a4aa --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFrameQuaternion.java @@ -0,0 +1,95 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.tuple4D.Quaternion; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.robotics.math.frames.YoFrameQuaternion; + +public class AlphaFilteredYoFrameQuaternion extends YoFrameQuaternion implements ProcessingYoVariable +{ + private final YoFrameQuaternion unfilteredQuaternion; + private final YoDouble alpha; + private final YoBoolean hasBeenCalled; + private final Quaternion qMeasured = new Quaternion(); + private final Quaternion qPreviousFiltered = new Quaternion(); + private final Quaternion qNewFiltered = new Quaternion(); + + public AlphaFilteredYoFrameQuaternion(String namePrefix, String nameSuffix, YoFrameQuaternion unfilteredQuaternion, double alpha, + YoVariableRegistry registry) + { + this(namePrefix, nameSuffix, unfilteredQuaternion, new YoDouble(namePrefix + "Alpha", registry), registry); + this.setAlpha(alpha); + } + + public AlphaFilteredYoFrameQuaternion(String namePrefix, String nameSuffix, YoDouble alpha, ReferenceFrame referenceFrame, + YoVariableRegistry registry) + { + this(namePrefix, nameSuffix, null, alpha, referenceFrame, registry); + } + + public AlphaFilteredYoFrameQuaternion(String namePrefix, String nameSuffix, YoFrameQuaternion unfilteredQuaternion, YoDouble alpha, + YoVariableRegistry registry) + { + this(namePrefix, nameSuffix, unfilteredQuaternion, alpha, unfilteredQuaternion.getReferenceFrame(), registry); + } + + private AlphaFilteredYoFrameQuaternion(String namePrefix, String nameSuffix, YoFrameQuaternion unfilteredQuaternion, YoDouble alpha, + ReferenceFrame referenceFrame, YoVariableRegistry registry) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + this.unfilteredQuaternion = unfilteredQuaternion; + this.alpha = alpha; + this.hasBeenCalled = new YoBoolean(namePrefix + nameSuffix + "HasBeenCalled", registry); + } + + @Override + public void update() + { + if (unfilteredQuaternion == null) + { + throw new NullPointerException("AlphaFilteredYoFrameQuaternion must be constructed with a non null " + + "quaternion variable to call update(), otherwise use update(Quat4d)"); + } + + qMeasured.set(unfilteredQuaternion); + update(qMeasured); + } + + public void update(Quaternion qMeasured) + { + if (hasBeenCalled.getBooleanValue()) + { + qPreviousFiltered.set(this); + + qNewFiltered.interpolate(qMeasured, qPreviousFiltered, alpha.getDoubleValue()); // qPreviousFiltered 'gets multiplied by alpha' + set(qNewFiltered); + } + else + { + set(qMeasured); + hasBeenCalled.set(true); + } + } + + public void setAlpha(double alpha) + { + this.alpha.set(alpha); + } + + public void setBreakFrequency(double breakFrequencyHertz, double dt) + { + this.alpha.set(AlphaFilteredYoVariable.computeAlphaGivenBreakFrequencyProperly(breakFrequencyHertz, dt)); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public YoFrameQuaternion getUnfilteredQuaternion() + { + return unfilteredQuaternion; + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFrameVector.java new file mode 100644 index 00000000..32bca05c --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFrameVector.java @@ -0,0 +1,127 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.euclid.referenceFrame.FrameVector3D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.tuple3D.Vector3D; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.robotics.math.frames.YoFramePoint; +import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; +import us.ihmc.robotics.math.frames.YoFrameVector; + +public class AlphaFilteredYoFrameVector extends YoFrameVector implements ProcessingYoVariable +{ + private final AlphaFilteredYoVariable x, y, z; + + private AlphaFilteredYoFrameVector(AlphaFilteredYoVariable x, AlphaFilteredYoVariable y, AlphaFilteredYoVariable z, ReferenceFrame referenceFrame) + { + super(x, y, z, referenceFrame); + + this.x = x; + this.y = y; + this.z = z; + } + + public static AlphaFilteredYoFrameVector createAlphaFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, double alpha, + ReferenceFrame referenceFrame) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alpha); + + AlphaFilteredYoFrameVector ret = new AlphaFilteredYoFrameVector(x, y, z, referenceFrame); + + return ret; + } + + public static AlphaFilteredYoFrameVector createAlphaFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, + YoDouble alpha, ReferenceFrame referenceFrame) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alpha); + + AlphaFilteredYoFrameVector ret = new AlphaFilteredYoFrameVector(x, y, z, referenceFrame); + + return ret; + } + + + public static AlphaFilteredYoFrameVector createAlphaFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, double alpha, + YoFrameVector unfilteredVector) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha, unfilteredVector.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha, unfilteredVector.getYoY()); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alpha, unfilteredVector.getYoZ()); + + AlphaFilteredYoFrameVector ret = new AlphaFilteredYoFrameVector(x, y, z, unfilteredVector.getReferenceFrame()); + + return ret; + } + + + public static AlphaFilteredYoFrameVector createAlphaFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, + YoDouble alpha, YoFrameVector unfilteredVector) + { + // alpha is a YoVariable + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha, unfilteredVector.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha, unfilteredVector.getYoY()); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alpha, unfilteredVector.getYoZ()); + + AlphaFilteredYoFrameVector ret = new AlphaFilteredYoFrameVector(x, y, z, unfilteredVector.getReferenceFrame()); + + return ret; + } + + public static AlphaFilteredYoFrameVector createAlphaFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, + YoDouble alpha, YoFramePoint unfilteredPosition) + { + // alpha is a YoVariable + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha, unfilteredPosition.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha, unfilteredPosition.getYoY()); + AlphaFilteredYoVariable z = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, alpha, unfilteredPosition.getYoZ()); + + AlphaFilteredYoFrameVector ret = new AlphaFilteredYoFrameVector(x, y, z, unfilteredPosition.getReferenceFrame()); + + return ret; + } + + public void update() + { + x.update(); + y.update(); + z.update(); + } + + public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) + { + x.update(xUnfiltered); + y.update(yUnfiltered); + z.update(zUnfiltered); + } + + public void update(Vector3D vectorUnfiltered) + { + x.update(vectorUnfiltered.getX()); + y.update(vectorUnfiltered.getY()); + z.update(vectorUnfiltered.getZ()); + } + + public void update(FrameVector3D vectorUnfiltered) + { + checkReferenceFrameMatch(vectorUnfiltered); + x.update(vectorUnfiltered.getX()); + y.update(vectorUnfiltered.getY()); + z.update(vectorUnfiltered.getZ()); + } + + public void reset() + { + x.reset(); + y.reset(); + z.reset(); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFrameVector2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFrameVector2d.java new file mode 100644 index 00000000..ac4a535f --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoFrameVector2d.java @@ -0,0 +1,107 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.euclid.referenceFrame.FrameVector2D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.tuple2D.Vector2D; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; +import us.ihmc.robotics.math.frames.YoFrameVector2d; + +public class AlphaFilteredYoFrameVector2d extends YoFrameVector2d +{ + private final AlphaFilteredYoVariable x, y; + + private AlphaFilteredYoFrameVector2d(AlphaFilteredYoVariable x, AlphaFilteredYoVariable y, ReferenceFrame referenceFrame) + { + super(x, y, referenceFrame); + + this.x = x; + this.y = y; + } + + public static AlphaFilteredYoFrameVector2d createAlphaFilteredYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, double alpha, ReferenceFrame referenceFrame) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha); + + AlphaFilteredYoFrameVector2d ret = new AlphaFilteredYoFrameVector2d(x, y, referenceFrame); + + return ret; + } + + public static AlphaFilteredYoFrameVector2d createAlphaFilteredYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble alpha, ReferenceFrame referenceFrame) + { + return createAlphaFilteredYoFrameVector2d(namePrefix, nameSuffix, "", registry, alpha, referenceFrame); + } + + public static AlphaFilteredYoFrameVector2d createAlphaFilteredYoFrameVector2d(String namePrefix, String nameSuffix, String description, YoVariableRegistry registry, YoDouble alpha, ReferenceFrame referenceFrame) + { + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), description, registry, alpha); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), description, registry, alpha); + + AlphaFilteredYoFrameVector2d ret = new AlphaFilteredYoFrameVector2d(x, y, referenceFrame); + + return ret; + } + + public static AlphaFilteredYoFrameVector2d createAlphaFilteredYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, double alpha, YoFrameVector2d unfilteredVector) + { + // alpha is a double + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, alpha, unfilteredVector.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, alpha, unfilteredVector.getYoY()); + + AlphaFilteredYoFrameVector2d ret = new AlphaFilteredYoFrameVector2d(x, y, unfilteredVector.getReferenceFrame()); + + return ret; + } + + + public static AlphaFilteredYoFrameVector2d createAlphaFilteredYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble alpha, YoFrameVector2d unfilteredVector) + { + return createAlphaFilteredYoFrameVector2d(namePrefix, nameSuffix, "", registry, alpha, unfilteredVector); + } + + public static AlphaFilteredYoFrameVector2d createAlphaFilteredYoFrameVector2d(String namePrefix, String nameSuffix, String description, YoVariableRegistry registry, YoDouble alpha, YoFrameVector2d unfilteredVector) + { + // alpha is a YoVariable + AlphaFilteredYoVariable x = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), description, registry, alpha, unfilteredVector.getYoX()); + AlphaFilteredYoVariable y = new AlphaFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), description, registry, alpha, unfilteredVector.getYoY()); + + AlphaFilteredYoFrameVector2d ret = new AlphaFilteredYoFrameVector2d(x, y, unfilteredVector.getReferenceFrame()); + + return ret; + } + + public void update() + { + x.update(); + y.update(); + } + + public void update(double xUnfiltered, double yUnfiltered) + { + x.update(xUnfiltered); + y.update(yUnfiltered); + } + + public void update(Vector2D vector2dUnfiltered) + { + x.update(vector2dUnfiltered.getX()); + y.update(vector2dUnfiltered.getY()); + } + + public void update(FrameVector2D vector2dUnfiltered) + { + checkReferenceFrameMatch(vector2dUnfiltered); + x.update(vector2dUnfiltered.getX()); + y.update(vector2dUnfiltered.getY()); + } + + public void reset() + { + x.reset(); + y.reset(); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoVariable.java new file mode 100644 index 00000000..ab994d3c --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoVariable.java @@ -0,0 +1,171 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +/** + * @author jrebula + * + *
+ * LittleDogVersion06: + * us.ihmc.LearningLocomotion.Version06.util.YoAlphaFilteredVariable, + * 9:34:00 AM, Aug 29, 2006 + *
= + *+ * A YoAlphaFilteredVariable is a filtered version of an input YoVar. + * Either a YoVariable holding the unfiltered val is passed in to the + * constructor and update() is called every tick, or update(double) is + * called every tick. The YoAlphaFilteredVariable updates it's val + * with the current filtered version using + *
+ *+ * filtered_{n} = alpha * filtered_{n-1} + (1 - alpha) * raw_{n} + *+ * + * For alpha=0 -> no filtered + * For alpha=1 -> 100% filtered, no use of raw signal + */ +public class AlphaFilteredYoVariable extends YoDouble implements ProcessingYoVariable +{ + private final YoDouble alphaVariable; + + private final YoDouble position; + protected final YoBoolean hasBeenCalled; + + public AlphaFilteredYoVariable(String name, YoVariableRegistry registry, double alpha) + { + this(name, registry, alpha, null); + } + + public AlphaFilteredYoVariable(String name, YoVariableRegistry registry, double alpha, YoDouble positionVariable) + { + super(name,registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + this.alphaVariable = new YoDouble(name + "AlphaVariable", registry); + this.alphaVariable.set(alpha); + this.position = positionVariable; + reset(); + } + + public AlphaFilteredYoVariable(String name, YoVariableRegistry registry, YoDouble alphaVariable) + { + this(name, "", registry, alphaVariable, null); + } + + public AlphaFilteredYoVariable(String name, String description, YoVariableRegistry registry, YoDouble alphaVariable) + { + this(name, description, registry, alphaVariable, null); + } + + + public AlphaFilteredYoVariable(String name, YoVariableRegistry registry, YoDouble alphaVariable, YoDouble positionVariable) + { + this(name, "", registry, alphaVariable, positionVariable); + } + + public AlphaFilteredYoVariable(String name, String description, YoVariableRegistry registry, YoDouble alphaVariable, YoDouble positionVariable) + { + super(name, description, registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", description, registry); + this.position = positionVariable; + this.alphaVariable = alphaVariable; + + reset(); + } + + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (position == null) + { + throw new NullPointerException("YoAlphaFilteredVariable must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(position.getDoubleValue()); + } + + public void update(double currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + set(currentPosition); + } + + + set(alphaVariable.getDoubleValue() * getDoubleValue() + (1.0 - alphaVariable.getDoubleValue()) * currentPosition); + + } + + public void setAlpha(double alpha) + { + this.alphaVariable.set(alpha); + } + + /** + * This method is replaced by computeAlphaGivenBreakFrequencyProperly. It is fine to keep using this method is currently using it, knowing that + * the actual break frequency is not exactly what you are asking for. + * + * @param breakFrequencyInHertz + * @param dt + * @return + */ + @Deprecated + public static double computeAlphaGivenBreakFrequency(double breakFrequencyInHertz, double dt) + { + if (Double.isInfinite(breakFrequencyInHertz)) + return 0.0; + + double alpha = 1.0 - breakFrequencyInHertz * 2.0 * Math.PI * dt; + + alpha = MathTools.clamp(alpha, 0.0, 1.0); + + return alpha; + } + + public static double computeAlphaGivenBreakFrequencyProperly(double breakFrequencyInHertz, double dt) + { + if (Double.isInfinite(breakFrequencyInHertz)) + return 0.0; + + double omega = 2.0 * Math.PI * breakFrequencyInHertz; + double alpha = (1.0 - omega * dt / 2.0) / (1.0 + omega * dt / 2.0); + alpha = MathTools.clamp(alpha, 0.0, 1.0); + return alpha; + } + + public static double computeBreakFrequencyGivenAlpha(double alpha, double dt) + { + return (1.0 - alpha) / (Math.PI * dt + Math.PI * alpha * dt); + } + + public static void main(String[] args) + { + double dt = 1 / 1e3; + + for (double i = 2; i < 1.0/dt; i = i * 1.2) + { + double alpha = computeAlphaGivenBreakFrequency(i, dt); + double alphaProperly = computeAlphaGivenBreakFrequencyProperly(i, dt); + System.out.println("freq=" + i + ", alpha=" + alpha + ", alphaProperly=" + alphaProperly); + } + + System.out.println(computeBreakFrequencyGivenAlpha(0.8, 0.006)); + System.out.println(computeAlphaGivenBreakFrequencyProperly(20, 0.006)); + System.out.println(computeAlphaGivenBreakFrequencyProperly(20, 0.003)); + } + + public boolean getHasBeenCalled() + { + return hasBeenCalled.getBooleanValue(); + } + +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoFrameVector.java new file mode 100644 index 00000000..01c22b1e --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoFrameVector.java @@ -0,0 +1,77 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.robotics.math.frames.YoFramePoint; +import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; +import us.ihmc.robotics.math.frames.YoFrameVector; + +public class BacklashCompensatingVelocityYoFrameVector extends YoFrameVector +{ + private final BacklashCompensatingVelocityYoVariable xDot, yDot, zDot; + + public static BacklashCompensatingVelocityYoFrameVector createBacklashCompensatingVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, YoDouble slopTime, + YoVariableRegistry registry, YoFrameVector yoFrameVectorToDifferentiate) + { + BacklashCompensatingVelocityYoVariable xDot = new BacklashCompensatingVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, yoFrameVectorToDifferentiate.getYoX(), dt, slopTime, + registry); + BacklashCompensatingVelocityYoVariable yDot = new BacklashCompensatingVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), "", alpha, yoFrameVectorToDifferentiate.getYoY(), dt, slopTime, + registry); + BacklashCompensatingVelocityYoVariable zDot = new BacklashCompensatingVelocityYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), "", alpha, yoFrameVectorToDifferentiate.getYoZ(), dt, slopTime, + registry); + + BacklashCompensatingVelocityYoFrameVector ret = new BacklashCompensatingVelocityYoFrameVector(xDot, yDot, zDot, registry, yoFrameVectorToDifferentiate); + + return ret; + } + + public static BacklashCompensatingVelocityYoFrameVector createBacklashCompensatingVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, YoDouble slopTime, + YoVariableRegistry registry, YoFramePoint yoFramePointToDifferentiate) + { + BacklashCompensatingVelocityYoVariable xDot = new BacklashCompensatingVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, yoFramePointToDifferentiate.getYoX(), dt, slopTime, + registry); + BacklashCompensatingVelocityYoVariable yDot = new BacklashCompensatingVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), "", alpha, yoFramePointToDifferentiate.getYoY(), dt, slopTime, + registry); + BacklashCompensatingVelocityYoVariable zDot = new BacklashCompensatingVelocityYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), "", alpha, yoFramePointToDifferentiate.getYoZ(), dt, slopTime, + registry); + + BacklashCompensatingVelocityYoFrameVector ret = new BacklashCompensatingVelocityYoFrameVector(xDot, yDot, zDot, registry, yoFramePointToDifferentiate); + + return ret; + } + + private BacklashCompensatingVelocityYoFrameVector(BacklashCompensatingVelocityYoVariable xDot, BacklashCompensatingVelocityYoVariable yDot, BacklashCompensatingVelocityYoVariable zDot, + YoVariableRegistry registry, YoFrameVector yoFrameVectorToDifferentiate) + { + super(xDot, yDot, zDot, yoFrameVectorToDifferentiate.getReferenceFrame()); + + this.xDot = xDot; + this.yDot = yDot; + this.zDot = zDot; + } + + private BacklashCompensatingVelocityYoFrameVector(BacklashCompensatingVelocityYoVariable xDot, BacklashCompensatingVelocityYoVariable yDot, BacklashCompensatingVelocityYoVariable zDot, + YoVariableRegistry registry, YoFramePoint yoFramePointToDifferentiate) + { + super(xDot, yDot, zDot, yoFramePointToDifferentiate.getReferenceFrame()); + + this.xDot = xDot; + this.yDot = yDot; + this.zDot = zDot; + } + + public void update() + { + xDot.update(); + yDot.update(); + zDot.update(); + } + + public void reset() + { + xDot.reset(); + yDot.reset(); + zDot.reset(); + } + +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoVariable.java new file mode 100644 index 00000000..5203f46d --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoVariable.java @@ -0,0 +1,240 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoEnum; + +public class BacklashCompensatingVelocityYoVariable extends YoDouble implements ProcessingYoVariable +{ + private final double dt; + + private final YoDouble alphaVariable; + private final YoDouble position; + + private final YoDouble lastPosition; + private final YoBoolean hasBeenCalled; + + private final YoEnum
+ *
+ *+ * A BetaFilteredYoVariable is a filtered version of an input YoVar. + * Either a YoVariable holding the unfiltered val is passed in to the + * constructor and update() is called every tick, or update(double) is + * called every tick. The BetaFilteredYoVariable updates it's val + * with the current filtered version using + *
+ *+ * filtered_{n} = (raw_{0} + ... + raw_{n-1} + raw_{n}) / n + *+ */ +public class BetaFilteredYoVariable extends YoDouble +{ + private int beta; + private int index = 0; + @SuppressWarnings("unused") + private final YoDouble betaVariable; + + private final YoDouble position; + + private static double raw[]; + + private final YoBoolean hasBeenCalled; + + public BetaFilteredYoVariable(String name, YoVariableRegistry registry, int beta) + { + this(name, "", registry, beta, null); + } + + public BetaFilteredYoVariable(String name, String description, YoVariableRegistry registry, int beta) + { + this(name, description, registry, beta, null); + } + + public BetaFilteredYoVariable(String name, YoVariableRegistry registry, int beta, YoDouble positionVariable) + { + this(name, "", registry, beta, positionVariable); + } + + public BetaFilteredYoVariable(String name, String description, YoVariableRegistry registry, int beta, YoDouble positionVariable) + { + super(name, description, registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + + this.beta = beta; + this.position = positionVariable; + this.betaVariable = null; + + raw = new double[beta]; + + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + + for (int i = 0; i < beta; i++) + { + set(0.0); + } + } + + public void update() + { + if (position == null) + { + throw new NullPointerException("BetaFilteredYoVariable must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(position.getDoubleValue()); + } + public void update(double currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + set(currentPosition); + } + + raw[index++] = currentPosition; + if (index == beta) + index = 0; + set(0.0); + + for (int i = 0; i < beta; i++) + { + set(getDoubleValue() + raw[i]); + } + + set(getDoubleValue() / beta); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoFrameVector.java new file mode 100644 index 00000000..7667ff72 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoFrameVector.java @@ -0,0 +1,72 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; +import us.ihmc.robotics.math.frames.YoFrameTuple; +import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; +import us.ihmc.robotics.math.frames.YoFrameVector; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class DeadzoneYoFrameVector extends YoFrameVector implements ProcessingYoVariable +{ + private final DeadzoneYoVariable x, y, z; + + private DeadzoneYoFrameVector(DeadzoneYoVariable x, DeadzoneYoVariable y, DeadzoneYoVariable z, ReferenceFrame referenceFrame) + { + super(x, y, z, referenceFrame); + + this.x = x; + this.y = y; + this.z = z; + } + + public static DeadzoneYoFrameVector createDeadzoneYoFrameVector(String namePrefix, YoVariableRegistry registry, YoDouble deadzoneSize, ReferenceFrame referenceFrame) + { + return createDeadzoneYoFrameVector(namePrefix, "", registry, deadzoneSize, referenceFrame); + } + + public static DeadzoneYoFrameVector createDeadzoneYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble deadzoneSize, ReferenceFrame referenceFrame) + { + DeadzoneYoVariable x = new DeadzoneYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), deadzoneSize, registry); + DeadzoneYoVariable y = new DeadzoneYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), deadzoneSize, registry); + DeadzoneYoVariable z = new DeadzoneYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), deadzoneSize, registry); + + DeadzoneYoFrameVector ret = new DeadzoneYoFrameVector(x, y, z, referenceFrame); + + return ret; + } + + public static DeadzoneYoFrameVector createDeadzoneYoFrameVector(String namePrefix, YoVariableRegistry registry, YoDouble deadzoneSize, YoFrameTuple rawTuple) + { + return createDeadzoneYoFrameVector(namePrefix, "", registry, deadzoneSize, rawTuple); + } + + public static DeadzoneYoFrameVector createDeadzoneYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble deadzoneSize, YoFrameTuple rawTuple) + { + DeadzoneYoVariable x = new DeadzoneYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), rawTuple.getYoX(), deadzoneSize, registry); + DeadzoneYoVariable y = new DeadzoneYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), rawTuple.getYoY(), deadzoneSize, registry); + DeadzoneYoVariable z = new DeadzoneYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), rawTuple.getYoZ(), deadzoneSize, registry); + + DeadzoneYoFrameVector ret = new DeadzoneYoFrameVector(x, y, z, rawTuple.getReferenceFrame()); + + return ret; + } + + @Override + public void update() + { + x.update(); + y.update(); + z.update(); + } + + public void update(FrameTuple3DReadOnly frameTuple) + { + checkReferenceFrameMatch(frameTuple); + + x.update(frameTuple.getX()); + y.update(frameTuple.getY()); + z.update(frameTuple.getZ()); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoVariable.java new file mode 100644 index 00000000..f49b922f --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoVariable.java @@ -0,0 +1,69 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class DeadzoneYoVariable extends YoDouble implements ProcessingYoVariable +{ + private final YoDouble deadzoneSize; + private final YoDouble inputVariable; + + public DeadzoneYoVariable(String name, YoDouble deadzoneSize, YoVariableRegistry registry) + { + super(name, registry); + this.inputVariable = null; + this.deadzoneSize = deadzoneSize; + } + + public DeadzoneYoVariable(String name, YoDouble inputVariable, YoDouble deadzoneSize, YoVariableRegistry registry) + { + super(name, registry); + this.inputVariable = inputVariable; + this.deadzoneSize = deadzoneSize; + } + + public void update() + { + if (inputVariable == null) + throw new NullPointerException("DeadzoneYoVariable must be constructed with a non null " + + "input variable to call update(), otherwise use update(double)"); + update(inputVariable.getDoubleValue()); + } + + public void update(double valueToBeCorrected) + { + if (valueToBeCorrected >= deadzoneSize.getDoubleValue()) + { + super.set(valueToBeCorrected - deadzoneSize.getDoubleValue()); + } + else if (valueToBeCorrected <= -deadzoneSize.getDoubleValue()) + { + super.set(valueToBeCorrected + deadzoneSize.getDoubleValue()); + } + else + { + super.set(0.0); + } + } + + public static void main(String[] args) + { + YoVariableRegistry registry = new YoVariableRegistry("test"); + YoDouble deadzoneSize = new YoDouble("deadzoneSize", registry); + YoDouble input = new YoDouble("input", registry); + deadzoneSize.set(2.0); + DeadzoneYoVariable testDeadzone = new DeadzoneYoVariable("testDeadZone", input,deadzoneSize,registry); + + for(int i = -50; i < 51; i++) + { + input.set((double)i); + testDeadzone.update(); + System.out.println("//////////////////////////"); + System.out.println("uncorrected = " + (double)i); + System.out.println("corrected = " + testDeadzone.getDoubleValue()); + } + + System.out.println("done"); + } + +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoBoolean.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoBoolean.java new file mode 100644 index 00000000..e010bacf --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoBoolean.java @@ -0,0 +1,68 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; + +public class DelayedYoBoolean extends YoBoolean +{ + private final YoBoolean variableToDelay; + + private final YoBoolean[] previousYoVariables; + + public DelayedYoBoolean(String name, String description, YoBoolean variableToDelay, int ticksToDelay, YoVariableRegistry registry) + { + super(name, description, registry); + + this.variableToDelay = variableToDelay; + previousYoVariables = new YoBoolean[ticksToDelay]; + + for (int i = 0; i < ticksToDelay; i++) + { + previousYoVariables[i] = new YoBoolean(name + "_previous" + i, registry); + previousYoVariables[i].set(variableToDelay.getBooleanValue()); + } + + this.set(variableToDelay.getBooleanValue()); + } + + public void update() + { + if (previousYoVariables.length == 0) + { + this.set(variableToDelay.getBooleanValue()); + return; + } + + this.set(previousYoVariables[0].getBooleanValue()); + + for (int i = 0; i < previousYoVariables.length - 1; i++) + { + previousYoVariables[i].set(previousYoVariables[i + 1].getBooleanValue()); + } + + previousYoVariables[previousYoVariables.length - 1].set(variableToDelay.getBooleanValue()); + } + + public void reset() + { + for (YoBoolean var : previousYoVariables) + { + var.set(variableToDelay.getBooleanValue()); + } + this.set(variableToDelay.getBooleanValue()); + } + + void getInternalState(String inputString, Boolean ifDebug) + { + if (!ifDebug) + return; + + String string = inputString + "\nvalue = " + this.getBooleanValue() + "\n"; + for (int i = 0; i < previousYoVariables.length; i++) + { + string = string + i + " = " + previousYoVariables[i].getBooleanValue() + "\n"; + } + string = string + "variableToDelay = " + variableToDelay.getBooleanValue() + "\n"; + System.out.println(string); + } +} \ No newline at end of file diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoDouble.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoDouble.java new file mode 100644 index 00000000..b87555d6 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoDouble.java @@ -0,0 +1,54 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class DelayedYoDouble extends YoDouble +{ + private final YoDouble variableToDelay; + + private final YoDouble[] previousYoVariables; + + public DelayedYoDouble(String name, String description, YoDouble variableToDelay, int ticksToDelay, YoVariableRegistry registry) + { + super(name, description, registry); + + this.variableToDelay = variableToDelay; + previousYoVariables = new YoDouble[ticksToDelay]; + + for (int i = 0; i < ticksToDelay; i++) + { + previousYoVariables[i] = new YoDouble(name + "_previous" + i, registry); + previousYoVariables[i].set(variableToDelay.getDoubleValue()); + } + + this.set(variableToDelay.getDoubleValue()); + } + + public void update() + { + if (previousYoVariables.length == 0) + { + this.set(variableToDelay.getDoubleValue()); + return; + } + + this.set(previousYoVariables[0].getDoubleValue()); + + for (int i = 0; i < previousYoVariables.length - 1; i++) + { + previousYoVariables[i].set(previousYoVariables[i + 1].getDoubleValue()); + } + + previousYoVariables[previousYoVariables.length - 1].set(variableToDelay.getDoubleValue()); + } + + public void reset() + { + for (YoDouble var : previousYoVariables) + { + var.set(variableToDelay.getDoubleValue()); + } + this.set(variableToDelay.getDoubleValue()); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeltaLimitedYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeltaLimitedYoVariable.java new file mode 100644 index 00000000..5ab166ef --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeltaLimitedYoVariable.java @@ -0,0 +1,69 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +/** + * + * @author Doug Stephen (dstephen@ihmc.us) + */ +public class DeltaLimitedYoVariable extends YoDouble +{ + private final YoDouble maxDelta; + private final YoDouble actual; + private final YoDouble desired; + private final YoBoolean isLimitingActive; + + public DeltaLimitedYoVariable(String name, YoVariableRegistry registry, double maxDelta) + { + super(name, registry); + + this.maxDelta = new YoDouble(name + "MaxAllowedDelta", registry); + this.maxDelta.set(Math.abs(maxDelta)); + this.actual = new YoDouble(name + "Actual", registry); + this.desired = new YoDouble(name + "Desired", registry); + this.isLimitingActive = new YoBoolean(name + "IsLimitingActive", registry); + isLimitingActive.set(false); + } + + public void setMaxDelta(double maxDelta) + { + this.maxDelta.set(Math.abs(maxDelta)); + } + + public void updateOutput(double actual, double desired) + { + this.desired.set(desired); + this.actual.set(actual); + updateOutput(); + } + + public boolean isLimitingActive() + { + return isLimitingActive.getBooleanValue(); + } + + private void updateOutput() + { + double actualDoubleValue = actual.getDoubleValue(); + double desiredDoubleValue = desired.getDoubleValue(); + double maxDeltaDoubleValue = Math.abs(maxDelta.getDoubleValue()); + double rawDelta = actualDoubleValue - desiredDoubleValue; + double sign = Math.signum(rawDelta); + double requestedDelta = Math.abs(rawDelta); + double overshoot = maxDeltaDoubleValue - requestedDelta; + + if(overshoot < 0) + { + desiredDoubleValue = actualDoubleValue - maxDeltaDoubleValue * sign; + isLimitingActive.set(true); + } + else + { + isLimitingActive.set(false); + } + + this.set(desiredDoubleValue); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredDiscreteVelocityYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredDiscreteVelocityYoVariable.java new file mode 100644 index 00000000..f93d052b --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredDiscreteVelocityYoVariable.java @@ -0,0 +1,201 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoEnum; + +/** + * @author jrebula + *
+ * A YoFilteredVelocityVariable is a filtered velocity of a position. + * Either a YoVariable holding the position is passed in to the + * constructor and update() is called every tick, or update(double) is + * called every tick. The YoFilteredVelocityVariable updates it's val + * with the current velocity after a filter of + *
+ * + *+ * vel_{n} = alpha * vel{n-1} + (1 - alpha) * (pos_{n} - pos_{n-1}) + *+ * + */ +public class FilteredDiscreteVelocityYoVariable extends YoDouble +{ + private final double alpha; + + private final YoDouble time; + + private final YoDouble alphaVariable; + private final YoDouble position; + + private final YoDouble lastUpdateTime; + private final YoEnum
FilteredVelocityYoFrameVector
+ * + *Differentiates and Filters a YoFrameVector to get its derivative.
+ * + *IHMC
+ * + * @author IHMC Biped Team + * @version 1.0 + */ +public class FilteredVelocityYoFrameVector extends YoFrameVector +{ + private final FilteredVelocityYoVariable xDot, yDot, zDot; + + public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, + YoVariableRegistry registry, YoFrameVector yoFrameVectorToDifferentiate) + { + FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, + yoFrameVectorToDifferentiate.getYoX(), dt, registry); + FilteredVelocityYoVariable yDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), "", alpha, + yoFrameVectorToDifferentiate.getYoY(), dt, registry); + FilteredVelocityYoVariable zDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), "", alpha, + yoFrameVectorToDifferentiate.getYoZ(), dt, registry); + + FilteredVelocityYoFrameVector ret = new FilteredVelocityYoFrameVector(xDot, yDot, zDot, alpha, dt, registry, + yoFrameVectorToDifferentiate.getReferenceFrame()); + + return ret; + } + + public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, + YoVariableRegistry registry, YoFramePoint yoFramePointToDifferentiate) + { + FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, + yoFramePointToDifferentiate.getYoX(), dt, registry); + FilteredVelocityYoVariable yDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), "", alpha, + yoFramePointToDifferentiate.getYoY(), dt, registry); + FilteredVelocityYoVariable zDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), "", alpha, + yoFramePointToDifferentiate.getYoZ(), dt, registry); + + FilteredVelocityYoFrameVector ret = new FilteredVelocityYoFrameVector(xDot, yDot, zDot, alpha, dt, registry, + yoFramePointToDifferentiate.getReferenceFrame()); + + return ret; + } + + public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, + YoVariableRegistry registry, ReferenceFrame referenceFrame) + { + FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, dt, registry); + FilteredVelocityYoVariable yDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), "", alpha, dt, registry); + FilteredVelocityYoVariable zDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), "", alpha, dt, registry); + + FilteredVelocityYoFrameVector ret = new FilteredVelocityYoFrameVector(xDot, yDot, zDot, alpha, dt, registry, referenceFrame); + + return ret; + } + + private FilteredVelocityYoFrameVector(FilteredVelocityYoVariable xDot, FilteredVelocityYoVariable yDot, FilteredVelocityYoVariable zDot, + YoDouble alpha, double dt, YoVariableRegistry registry, ReferenceFrame referenceFrame) + { + super(xDot, yDot, zDot, referenceFrame); + + this.xDot = xDot; + this.yDot = yDot; + this.zDot = zDot; + } + + private FilteredVelocityYoFrameVector(FilteredVelocityYoVariable xDot, FilteredVelocityYoVariable yDot, FilteredVelocityYoVariable zDot, + YoDouble alpha, double dt, YoVariableRegistry registry, YoFramePoint yoFramePointToDifferentiate) + { + super(xDot, yDot, zDot, yoFramePointToDifferentiate.getReferenceFrame()); + + this.xDot = xDot; + this.yDot = yDot; + this.zDot = zDot; + } + + public void update() + { + xDot.update(); + yDot.update(); + zDot.update(); + } + + public void update(Tuple3DReadOnly tuple) + { + xDot.update(tuple.getX()); + yDot.update(tuple.getY()); + zDot.update(tuple.getZ()); + } + + public void update(FrameTuple3DReadOnly frameTuple) + { + checkReferenceFrameMatch(frameTuple); + xDot.update(frameTuple.getX()); + yDot.update(frameTuple.getY()); + zDot.update(frameTuple.getZ()); + } + + public void reset() + { + xDot.reset(); + yDot.reset(); + zDot.reset(); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java new file mode 100644 index 00000000..10a2a55f --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java @@ -0,0 +1,91 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly; +import us.ihmc.euclid.tuple2D.interfaces.Vector2DReadOnly; +import us.ihmc.robotics.math.frames.YoFramePoint; +import us.ihmc.robotics.math.frames.YoFrameTuple2d; +import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; +import us.ihmc.robotics.math.frames.YoFrameVector2d; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class FilteredVelocityYoFrameVector2d extends YoFrameVector2d +{ + private final FilteredVelocityYoVariable xDot, yDot; + + public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, YoDouble alpha, double dt, + YoVariableRegistry registry, YoFrameTuple2d yoFrameVectorToDifferentiate) + { + return createFilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, "", alpha, dt, registry, yoFrameVectorToDifferentiate); + } + + public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, String description, YoDouble alpha, + double dt, YoVariableRegistry registry, + YoFrameTuple2d yoFrameVectorToDifferentiate) + { + FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), description, alpha, + yoFrameVectorToDifferentiate.getYoX(), dt, registry); + FilteredVelocityYoVariable yDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), description, alpha, + yoFrameVectorToDifferentiate.getYoY(), dt, registry); + + FilteredVelocityYoFrameVector2d ret = new FilteredVelocityYoFrameVector2d(xDot, yDot, alpha, dt, registry, + yoFrameVectorToDifferentiate.getReferenceFrame()); + + return ret; + } + + public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, YoDouble alpha, double dt, + YoVariableRegistry registry, ReferenceFrame referenceFrame) + { + FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, dt, registry); + FilteredVelocityYoVariable yDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), "", alpha, dt, registry); + + FilteredVelocityYoFrameVector2d ret = new FilteredVelocityYoFrameVector2d(xDot, yDot, alpha, dt, registry, referenceFrame); + + return ret; + } + + private FilteredVelocityYoFrameVector2d(FilteredVelocityYoVariable xDot, FilteredVelocityYoVariable yDot, YoDouble alpha, double dt, + YoVariableRegistry registry, ReferenceFrame referenceFrame) + { + super(xDot, yDot, referenceFrame); + + this.xDot = xDot; + this.yDot = yDot; + } + + private FilteredVelocityYoFrameVector2d(FilteredVelocityYoVariable xDot, FilteredVelocityYoVariable yDot, YoDouble alpha, double dt, + YoVariableRegistry registry, YoFramePoint yoFramePointToDifferentiate) + { + super(xDot, yDot, yoFramePointToDifferentiate.getReferenceFrame()); + + this.xDot = xDot; + this.yDot = yDot; + } + + public void update() + { + xDot.update(); + yDot.update(); + } + + public void update(Vector2DReadOnly vector) + { + xDot.update(vector.getX()); + yDot.update(vector.getY()); + } + + public void update(FrameTuple2DReadOnly tupleToDifferentiate) + { + checkReferenceFrameMatch(tupleToDifferentiate); + xDot.update(tupleToDifferentiate.getX()); + yDot.update(tupleToDifferentiate.getY()); + } + + public void reset() + { + xDot.reset(); + yDot.reset(); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoVariable.java new file mode 100644 index 00000000..a47053db --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoVariable.java @@ -0,0 +1,179 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.robotics.geometry.AngleTools; + +/** + * @author jrebula + *+ * A YoFilteredVelocityVariable is a filtered velocity of a position. + * Either a YoVariable holding the position is passed in to the + * constructor and update() is called every tick, or update(double) is + * called every tick. The YoFilteredVelocityVariable updates it's val + * with the current velocity after a filter of + *
+ * + *+ * vel_{n} = alpha * vel{n-1} + (1 - alpha) * (pos_{n} - pos_{n-1}) + *+ * + */ +public class FilteredVelocityYoVariable extends YoDouble implements ProcessingYoVariable +{ + private double alphaDouble; + private final double dt; + + private final YoDouble alphaVariable; + private final YoDouble position; + +// private double lastPosition; + private final YoDouble lastPosition; + private final YoBoolean hasBeenCalled; + + public FilteredVelocityYoVariable(String name, String description, double alpha, double dt, YoVariableRegistry registry) + { + super(name, description, registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + + this.alphaDouble = alpha; + this.dt = dt; + + this.alphaVariable = null; + this.position = null; + + lastPosition = new YoDouble(name + "_lastPosition", registry); + + reset(); + } + + public FilteredVelocityYoVariable(String name, String description, double alpha, YoDouble positionVariable, double dt, YoVariableRegistry registry) + { + super(name, description, registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + + this.alphaDouble = alpha; + this.position = positionVariable; + this.dt = dt; + + this.alphaVariable = null; + + lastPosition = new YoDouble(name + "_lastPosition", registry); + + + reset(); + } + + public FilteredVelocityYoVariable(String name, String description, YoDouble alphaVariable, YoDouble positionVariable, double dt, YoVariableRegistry registry) + { + super(name, description, registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + + position = positionVariable; + this.alphaVariable = alphaVariable; + this.alphaDouble = 0.0; + + this.dt = dt; + + lastPosition = new YoDouble(name + "_lastPosition", registry); + + reset(); + } + + public FilteredVelocityYoVariable(String name, String description, YoDouble alphaVariable, double dt, YoVariableRegistry registry) + { + super(name, description, registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + + this.position = null; + this.alphaVariable = alphaVariable; + this.alphaDouble = 0.0; + + this.dt = dt; + + lastPosition = new YoDouble(name + "_lastPosition", registry); + + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (position == null) + { + throw new NullPointerException("YoFilteredVelocityVariable must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(position.getDoubleValue()); + } + + public void updateForAngles() + { + if (position == null) + { + throw new NullPointerException("YoFilteredVelocityVariable must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + updateForAngles(position.getDoubleValue()); + } + + public void update(double currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + lastPosition.set(currentPosition); + set(0.0); + } + + double difference = currentPosition - lastPosition.getDoubleValue(); + + updateUsingDifference(difference); + + lastPosition.set(currentPosition); + } + + public void updateForAngles(double currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + lastPosition.set(currentPosition); + set(0.0); + } + + double difference = AngleTools.computeAngleDifferenceMinusPiToPi(currentPosition, lastPosition.getDoubleValue()); + + updateUsingDifference(difference); + + lastPosition.set(currentPosition); + } + + private void updateUsingDifference(double difference) + { + double previousFilteredDerivative = getDoubleValue(); + double currentRawDerivative = difference / dt; + + double alpha = alphaVariable == null ? alphaDouble : alphaVariable.getDoubleValue(); + set(alpha * previousFilteredDerivative + (1.0 - alpha) * currentRawDerivative); + } + + public void setAlpha(double alpha) + { + if (alphaVariable == null) + { + this.alphaDouble = alpha; + } + else + { + alphaVariable.set(alpha); + } + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java new file mode 100644 index 00000000..aac85152 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java @@ -0,0 +1,104 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.euclid.axisAngle.AxisAngle; +import us.ihmc.euclid.axisAngle.interfaces.AxisAngleReadOnly; +import us.ihmc.euclid.matrix.RotationMatrix; +import us.ihmc.euclid.matrix.interfaces.RotationMatrixReadOnly; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameQuaternionReadOnly; +import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly; +import us.ihmc.robotics.math.frames.YoFrameQuaternion; +import us.ihmc.robotics.math.frames.YoFrameVector; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; + +public class FiniteDifferenceAngularVelocityYoFrameVector extends YoFrameVector +{ + private final YoFrameQuaternion orientation; + private final YoFrameQuaternion orientationPreviousValue; + + private final YoBoolean hasBeenCalled; + + private final RotationMatrix currentOrientationMatrix = new RotationMatrix(); + private final RotationMatrix previousOrientationMatrix = new RotationMatrix(); + private final RotationMatrix deltaOrientationMatrix = new RotationMatrix(); + private final AxisAngle deltaAxisAngle = new AxisAngle(); + + private final double dt; + + public FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, ReferenceFrame referenceFrame, double dt, YoVariableRegistry registry) + { + this(namePrefix, null, referenceFrame, dt, registry); + } + + public FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, YoFrameQuaternion orientationToDifferentiate, double dt, YoVariableRegistry registry) + { + this(namePrefix, orientationToDifferentiate, orientationToDifferentiate.getReferenceFrame(), dt, registry); + } + + private FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, YoFrameQuaternion orientationToDifferentiate, ReferenceFrame referenceFrame, double dt, YoVariableRegistry registry) + { + super(namePrefix, referenceFrame, registry); + + this.dt = dt; + + orientation = orientationToDifferentiate; + orientationPreviousValue = new YoFrameQuaternion(namePrefix + "_previous", referenceFrame, registry); + + hasBeenCalled = new YoBoolean(namePrefix + "HasBeenCalled", registry); + hasBeenCalled.set(false); + } + + public void update() + { + if (orientation == null) + { + throw new NullPointerException("FiniteDifferenceAngularVelocityYoFrameVector must be constructed with a non null " + + "orientation variable to call update(), otherwise use update(FrameOrientation)"); + } + + currentOrientationMatrix.set(orientation); + update(currentOrientationMatrix); + } + + public void update(FrameQuaternionReadOnly currentOrientation) + { + checkReferenceFrameMatch(currentOrientation); + + currentOrientationMatrix.set(currentOrientation); + update(currentOrientationMatrix); + } + + public void update(QuaternionReadOnly currentOrientation) + { + currentOrientationMatrix.set(currentOrientation); + update(currentOrientationMatrix); + } + + public void update(AxisAngleReadOnly currentOrientation) + { + currentOrientationMatrix.set(currentOrientation); + update(currentOrientationMatrix); + } + + public void update(RotationMatrixReadOnly rotationMatrix) + { + if (!hasBeenCalled.getBooleanValue()) + { + orientationPreviousValue.set(rotationMatrix); + hasBeenCalled.set(true); + } + + if (rotationMatrix != currentOrientationMatrix) + currentOrientationMatrix.set(rotationMatrix); + previousOrientationMatrix.set(orientationPreviousValue); + deltaOrientationMatrix.set(currentOrientationMatrix); + deltaOrientationMatrix.multiplyTransposeOther(previousOrientationMatrix); + deltaAxisAngle.set(deltaOrientationMatrix); + + set(deltaAxisAngle.getX(), deltaAxisAngle.getY(), deltaAxisAngle.getZ()); + scale(deltaAxisAngle.getAngle() / dt); + + orientationPreviousValue.set(currentOrientationMatrix); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderBandPassFilteredYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderBandPassFilteredYoVariable.java new file mode 100644 index 00000000..636ba048 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderBandPassFilteredYoVariable.java @@ -0,0 +1,68 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class FirstOrderBandPassFilteredYoVariable extends FirstOrderFilteredYoVariable +{ + private boolean hasBeenCalled = false; + + private final FirstOrderFilteredYoVariable highPassFilteredInput; + + public FirstOrderBandPassFilteredYoVariable(String name, String description, double minPassThroughFrequency_Hz, double maxPassThroughFrequency_Hz, + YoDouble yoTime, YoVariableRegistry registry) + { + super(name, description, maxPassThroughFrequency_Hz, yoTime, FirstOrderFilterType.LOW_PASS, registry); + + this.highPassFilteredInput = new FirstOrderFilteredYoVariable(name + "HighPassFilteredOnly", description, minPassThroughFrequency_Hz, yoTime, + FirstOrderFilterType.HIGH_PASS, registry); + + setPassBand(minPassThroughFrequency_Hz, maxPassThroughFrequency_Hz); + } + + public FirstOrderBandPassFilteredYoVariable(String name, String description, double minPassThroughFrequency_Hz, double maxPassThroughFrequency_Hz, + double DT, YoVariableRegistry registry) + { + super(name, description, maxPassThroughFrequency_Hz, DT, FirstOrderFilterType.LOW_PASS, registry); + + this.highPassFilteredInput = new FirstOrderFilteredYoVariable(name + "HighPassFilteredOnly", description, minPassThroughFrequency_Hz, DT, + FirstOrderFilterType.HIGH_PASS, registry); + } + + private void checkPassband(double minPassThroughFrequency_Hz, double maxPassThroughFrequency_Hz) + { + if (minPassThroughFrequency_Hz > maxPassThroughFrequency_Hz) + { + throw new RuntimeException("minPassThroughFrequency [ " + minPassThroughFrequency_Hz + " ] > maxPassThroughFrequency [ " + maxPassThroughFrequency_Hz + + " ]"); + } + } + + public void update(double filterInput) + { + if (!hasBeenCalled) + { + hasBeenCalled = true; + this.set(filterInput); + } + else + { + updateHighPassFilterAndThenLowPassFilterThat(filterInput); + } + } + + public void setPassBand(double minPassThroughFreqHz, double maxPassThroughFreqHz) + { + checkPassband(minPassThroughFreqHz, maxPassThroughFreqHz); + + highPassFilteredInput.setCutoffFrequencyHz(minPassThroughFreqHz); + this.setCutoffFrequencyHz(maxPassThroughFreqHz); + } + + private void updateHighPassFilterAndThenLowPassFilterThat(double filterInput) + { + this.highPassFilteredInput.update(filterInput); + + super.update(highPassFilteredInput.getDoubleValue()); + } +} \ No newline at end of file diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderFilteredYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderFilteredYoVariable.java new file mode 100644 index 00000000..d1c7f545 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderFilteredYoVariable.java @@ -0,0 +1,157 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class FirstOrderFilteredYoVariable extends YoDouble + { + + public enum FirstOrderFilterType + { + LOW_PASS, HIGH_PASS + } + + private boolean hasBeenCalled = false; + + private double filterInputOld; + private double filterUpdateTimeOld; + + private final YoDouble cutoffFrequency_Hz; + + private final YoDouble yoTime; + private double dt; + + private FirstOrderFilterType highOrLowPass; + + public FirstOrderFilteredYoVariable(String name, String description, double cutoffFrequency_Hz, YoDouble yoTime, FirstOrderFilterType highOrLowPass, YoVariableRegistry registry) + { + super(name, description, registry); + + String cutoffFrequencyName; + switch (highOrLowPass) + { + case LOW_PASS: + cutoffFrequencyName = name + "_LowPassCutoff_Hz"; + break; + case HIGH_PASS: + cutoffFrequencyName = name + "_HighPassCutoff_Hz"; + break; + default: + throw new RuntimeException("Must Specify Filter Type as Low or High Pass. Current Specification : " + highOrLowPass); + } + + this.cutoffFrequency_Hz = new YoDouble(cutoffFrequencyName, registry); + this.cutoffFrequency_Hz.set(cutoffFrequency_Hz); + + this.yoTime = yoTime; + + this.highOrLowPass = highOrLowPass; + } + + public FirstOrderFilteredYoVariable(String name, String description, double cutoffFrequency_Hz, double DT, FirstOrderFilterType highOrLowPass, YoVariableRegistry registry) + { + this(name, description, cutoffFrequency_Hz, null, highOrLowPass, registry); + this.dt = DT; + } + + private double computeLowPassUpdate(double filterInput, double dt) + { + double alpha = computeAlpha( dt, cutoffFrequency_Hz.getDoubleValue()); + + double ret = alpha * this.getDoubleValue() + (1.0-alpha) * filterInput; + + return ret; + } + + private double computeHighPassUpdate(double filterInput, double dt) + { + double alpha = computeAlpha(dt, cutoffFrequency_Hz.getDoubleValue()); + + double ret = alpha * (this.getDoubleValue() + filterInput - filterInputOld); + return ret; + } + + private double computeAlpha(double dt, double cutoffFrequencyHz) + { + if (cutoffFrequencyHz <= 0.0) + { + throw new RuntimeException("Cutoff Frequency must be greater than zero. Cutoff = " + cutoffFrequencyHz); + } + + double cutoff_radPerSec = cutoffFrequencyHz * 2.0 * Math.PI; + double RC = 1.0 / cutoff_radPerSec; + double alpha = RC / (RC + dt); // alpha decreases with increasing cutoff frequency + + if (alpha <= 0 || alpha >= 1.0 && dt != 0.0) + { + throw new RuntimeException("Alpha value must be between 0 and 1. Alpha = " + alpha); + } + + return alpha; + } + + public void reset() + { + hasBeenCalled = false; + } + + public void setCutoffFrequencyHz(double cutoffHz) + { + this.cutoffFrequency_Hz.set(cutoffHz); + } + + public void update(double filterInput) + { + if (!hasBeenCalled) + { + hasBeenCalled = true; + + filterInputOld = 0.0; + filterUpdateTimeOld = 0.0; + + this.set(filterInput); + } + else + { + if ( yoTime != null ) + { + double timeSinceLastUpdate = yoTime.getDoubleValue() - filterUpdateTimeOld; + + if (timeSinceLastUpdate > 0.0) + { + dt = timeSinceLastUpdate; + } + else + { + reset(); +// throw new RuntimeException("Computed step size, DT must be greater than zero. DT = " + dt + ". Current time = " + yoTime.getDoubleValue() + ", previous update time = " + filterUpdateTimeOld); + } + } + + double filterOutput; + + switch (highOrLowPass) + { + case LOW_PASS: + filterOutput = computeLowPassUpdate(filterInput, dt); + break; + case HIGH_PASS: + filterOutput = computeHighPassUpdate(filterInput, dt); + break; + + default: + filterOutput = filterInput; + break; + } + + this.set(filterOutput); + } + + filterInputOld = filterInput; + + if (yoTime != null) + { + filterUpdateTimeOld = yoTime.getDoubleValue(); + } + } + } \ No newline at end of file diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoBoolean.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoBoolean.java new file mode 100644 index 00000000..1cbfaaad --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoBoolean.java @@ -0,0 +1,110 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoInteger; + +public class GlitchFilteredYoBoolean extends YoBoolean +{ + private YoBoolean variableToFilter; + private final YoInteger windowSize; + protected final YoInteger counter; + + public GlitchFilteredYoBoolean(String name, int windowSize) + { + super(name, "GlitchFilteredYoBoolean", null); + counter = new YoInteger(name + "Count", getYoVariableRegistry()); + this.windowSize = new YoInteger(name + "WindowSize", getYoVariableRegistry()); + + initialize(null, windowSize); + } + + public GlitchFilteredYoBoolean(String name, YoVariableRegistry registry, int windowSize) + { + super(name, registry); + counter = new YoInteger(name + "Count", registry); + this.windowSize = new YoInteger(name + "WindowSize", registry); + + initialize(null, windowSize); + } + + public GlitchFilteredYoBoolean(String name, YoBoolean yoVariableToFilter, int windowSize) + { + super(name, "GlitchFilteredYoBoolean", null); + counter = new YoInteger(name + "Count", getYoVariableRegistry()); + this.windowSize = new YoInteger(name + "WindowSize", getYoVariableRegistry()); + + initialize(yoVariableToFilter, windowSize); + } + + public GlitchFilteredYoBoolean(String name, YoVariableRegistry registry, YoBoolean yoVariableToFilter, int windowSize) + { + this(name, "", registry, yoVariableToFilter, windowSize); + } + + public GlitchFilteredYoBoolean(String name, String description, YoVariableRegistry registry, YoBoolean yoVariableToFilter, int windowSize) + { + super(name, description, registry); + counter = new YoInteger(name + "Count", description, registry); + this.windowSize = new YoInteger(name + "WindowSize", description, registry); + + initialize(yoVariableToFilter, windowSize); + } + + private void initialize(YoBoolean yoVariableToFilter, int windowSize) + { + if (windowSize < 0) + throw new RuntimeException("window size must be greater than 0"); + + variableToFilter = yoVariableToFilter; + this.windowSize.set(windowSize); + + if (variableToFilter != null) + this.set(yoVariableToFilter.getBooleanValue()); + + this.set(false); + } + + public void set(boolean value) + { + super.set(value); + if (counter != null) + { + counter.set(0); + } + } + + public void update(boolean value) + { + + if (value != this.getBooleanValue()) + { + counter.set(counter.getIntegerValue() + 1); + } + else + counter.set(0); + + if (counter.getIntegerValue() >= (windowSize.getIntegerValue() )) + set(value); + } + + public int getWindowSize() + { + return windowSize.getIntegerValue(); + } + + public void setWindowSize(int windowSize) //untested + { + this.windowSize.set(windowSize); + } + + public void update() + { + if (variableToFilter == null) + { + throw new RuntimeException("variableToFilter was not initialized. Use the other constructor"); + } + else + update(variableToFilter.getBooleanValue()); + } +} \ No newline at end of file diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoInteger.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoInteger.java new file mode 100644 index 00000000..92fa4f63 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoInteger.java @@ -0,0 +1,82 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoInteger; + +public class GlitchFilteredYoInteger extends YoInteger +{ + private final YoInteger position; + private final YoInteger previousPosition; + private final YoInteger windowSize; + private final YoInteger counter; + + public GlitchFilteredYoInteger(String name, int windowSize, YoVariableRegistry registry) + { + this(name, windowSize, null, registry); + } + + public GlitchFilteredYoInteger(String name, int windowSize, YoInteger position, YoVariableRegistry registry) + { + super(name, GlitchFilteredYoInteger.class.getSimpleName(), registry); + + this.position = position; + + previousPosition = new YoInteger(name + "PrevValue", registry); + counter = new YoInteger(name + "Count", registry); + this.windowSize = new YoInteger(name + "WindowSize", registry); + this.windowSize.set(windowSize); + } + + @Override + public void set(int value) + { + super.set(value); + if (counter != null) + counter.set(0); + } + + @Override + public boolean set(int value, boolean notifyListeners) + { + if (counter != null) + counter.set(0); + return super.set(value, notifyListeners); + } + + public void update() + { + if (position == null) + { + throw new NullPointerException( + "GlitchFilteredYoInteger must be constructed with a non null position variable to call update(), otherwise use update(int)"); + } + + update(position.getIntegerValue()); + } + + public void update(int currentValue) + { + if (currentValue == previousPosition.getIntegerValue()) + counter.increment(); + else + counter.set(0); + + if (counter.getIntegerValue() >= windowSize.getIntegerValue()) + { + set(currentValue); + counter.set(0); + } + + previousPosition.set(currentValue); + } + + public int getWindowSize() + { + return windowSize.getIntegerValue(); + } + + public void setWindowSize(int windowSize) + { + this.windowSize.set(windowSize); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/JerkLimitedYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/JerkLimitedYoVariable.java new file mode 100644 index 00000000..556f17b8 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/JerkLimitedYoVariable.java @@ -0,0 +1,151 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +public class JerkLimitedYoVariable extends YoDouble +{ + private final double dt; + + private final YoBoolean hasBeenInitialized; + + private final YoDouble smoothedRate; + private final YoDouble smoothedAcceleration; + private final YoDouble smoothedJerk; + + private final YoDouble positionGain; + private final YoDouble velocityGain; + private final YoDouble accelerationGain; + + private final YoDouble maximumJerk; + private final YoDouble maximumAcceleration; + + private final YoDouble inputPosition; + private final YoDouble inputVelocity; + private final YoDouble inputAcceleration; + + public JerkLimitedYoVariable(String name, YoVariableRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, double dt) + { + this(name, registry, maxAcceleration, maxJerk, null, null, null, dt); + } + + public JerkLimitedYoVariable(String name, YoVariableRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, + YoDouble inputPosition, double dt) + { + this(name, registry, maxAcceleration, maxJerk, inputPosition, null, null, dt); + } + + public JerkLimitedYoVariable(String name, YoVariableRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, + YoDouble inputPosition, YoDouble inputVelocity, double dt) + { + this(name, registry, maxAcceleration, maxJerk, inputPosition, inputVelocity, null, dt); + } + + public JerkLimitedYoVariable(String name, YoVariableRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, + YoDouble inputPosition, YoDouble inputVelocity, YoDouble inputAcceleration, double dt) + { + super(name, registry); + + this.inputPosition = inputPosition; + this.inputVelocity = inputVelocity; + this.inputAcceleration = inputAcceleration; + + this.maximumJerk = maxJerk; + this.maximumAcceleration = maxAcceleration; + + this.dt = dt; + + hasBeenInitialized = new YoBoolean(name + "HasBeenInitialized", registry); + + smoothedRate = new YoDouble(name + "SmoothedRate", registry); + smoothedAcceleration = new YoDouble(name + "SmoothedAcceleration", registry); + smoothedJerk = new YoDouble(name + "SmoothedJerk", registry); + + positionGain = new YoDouble(name + "PositionGain", registry); + velocityGain = new YoDouble(name + "VelocityGain", registry); + accelerationGain = new YoDouble(name + "AccelerationGain", registry); + + double w0 = 2.0 * Math.PI * 16.0; + double w1 = 2.0 * Math.PI * 16.0; + double zeta = 1.0; + + setGainsByPolePlacement(w0, w1, zeta); + hasBeenInitialized.set(false); + } + + public void setMaximumAcceleration(double maximumAcceleration) + { + this.maximumAcceleration.set(maximumAcceleration); + } + + public void setMaximumJerk(double maximumJerk) + { + this.maximumJerk.set(maximumJerk); + } + + public void setGainsByPolePlacement(double w0, double w1, double zeta) + { + positionGain.set(w0 * w1 * w1); + velocityGain.set(w1 * w1 + 2.0 * zeta * w1 * w0); + accelerationGain.set(w0 + 2.0 * zeta * w1); + } + + public void update() + { + double inputPosition = this.inputPosition == null ? 0.0 : this.inputPosition.getDoubleValue(); + double inputVelocity = this.inputVelocity == null ? 0.0 : this.inputVelocity.getDoubleValue(); + double inputAcceleration = this.inputAcceleration == null ? 0.0 : this.inputAcceleration.getDoubleValue(); + + update(inputPosition, inputVelocity, inputAcceleration); + } + + public void update(double inputPosition) + { + update(inputPosition, 0.0, 0.0); + } + + public void update(double inputPosition, double inputVelocity) + { + update(inputPosition, inputVelocity, 0.0); + } + + public void update(double inputPosition, double inputVelocity, double inputAcceleration) + { + if (!hasBeenInitialized.getBooleanValue()) + initialize(inputPosition, inputVelocity, inputAcceleration); + + double positionError = inputPosition - this.getDoubleValue(); + double velocityError = inputVelocity - smoothedRate.getDoubleValue(); + double accelerationError = inputAcceleration - smoothedAcceleration.getDoubleValue(); + double jerk = accelerationGain.getDoubleValue() * accelerationError + velocityGain.getDoubleValue() * velocityError + positionGain.getDoubleValue() + * positionError; + jerk = MathTools.clamp(jerk, -maximumJerk.getDoubleValue(), maximumJerk.getDoubleValue()); + + smoothedJerk.set(jerk); + smoothedAcceleration.add(smoothedJerk.getDoubleValue() * dt); + smoothedAcceleration.set(MathTools.clamp(smoothedAcceleration.getDoubleValue(), maximumJerk.getDoubleValue())); + smoothedRate.add(smoothedAcceleration.getDoubleValue() * dt); + this.add(smoothedRate.getDoubleValue() * dt); + } + + public void initialize(double inputPosition, double inputVelocity, double inputAcceleration) + { + this.set(inputPosition); + smoothedRate.set(inputVelocity); + smoothedAcceleration.set(inputAcceleration); + smoothedJerk.set(0.0); + + this.hasBeenInitialized.set(true); + } + + public void reset() + { + this.hasBeenInitialized.set(false); + smoothedRate.set(0.0); + smoothedAcceleration.set(0.0); + smoothedJerk.set(0.0); + } + +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/ProcessingYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/ProcessingYoVariable.java new file mode 100644 index 00000000..7353f617 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/ProcessingYoVariable.java @@ -0,0 +1,6 @@ +package us.ihmc.robotics.math.filters; + +public interface ProcessingYoVariable +{ + public abstract void update(); +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java new file mode 100644 index 00000000..190ff7de --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java @@ -0,0 +1,124 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.euclid.referenceFrame.FrameQuaternion; +import us.ihmc.euclid.referenceFrame.FrameVector3D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.robotics.math.frames.YoFrameOrientation; + +public class RateLimitedYoFrameOrientation extends YoFrameOrientation +{ + private final YoDouble maxRateVariable; + + private final YoFrameOrientation rawOrientation; + private final YoBoolean limited; + private final YoBoolean hasBeenCalled; + private final double dt; + + private final FrameVector3D differenceVector = new FrameVector3D(); + + public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble maxRate, double dt, + YoFrameOrientation rawOrientation) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, rawOrientation, rawOrientation.getReferenceFrame()); + } + + public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble maxRate, double dt, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); + } + + public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt, YoFrameOrientation rawOrientation) + { + this(namePrefix, nameSuffix, registry, null, dt, rawOrientation, rawOrientation.getReferenceFrame()); + setMaxRate(maxRate); + } + + public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, null, dt, null, referenceFrame); + setMaxRate(maxRate); + } + + private RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble maxRate, double dt, + YoFrameOrientation rawOrientation, ReferenceFrame referenceFrame) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + + this.hasBeenCalled = new YoBoolean(namePrefix + "HasBeenCalled" + nameSuffix, registry); + this.limited = new YoBoolean(namePrefix + "Limited" + nameSuffix, registry); + + if (maxRate != null) + this.maxRateVariable = maxRate; + else + this.maxRateVariable = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry); + + this.rawOrientation = rawOrientation; + + this.dt = dt; + + reset(); + } + + public void setMaxRate(double maxRate) + { + this.maxRateVariable.set(maxRate); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (rawOrientation == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(rawOrientation); + } + + public void update(YoFrameOrientation yoFrameVectorUnfiltered) + { + checkReferenceFrameMatch(yoFrameVectorUnfiltered); + update(yoFrameVectorUnfiltered.getYaw().getDoubleValue(), yoFrameVectorUnfiltered.getPitch().getDoubleValue(), + yoFrameVectorUnfiltered.getRoll().getDoubleValue()); + } + + public void update(FrameQuaternion frameOrientationUnfiltered) + { + checkReferenceFrameMatch(frameOrientationUnfiltered); + update(frameOrientationUnfiltered); + } + + public void update(QuaternionReadOnly quaternionUnfiltered) + { + update(quaternionUnfiltered.getYaw(), quaternionUnfiltered.getPitch(), quaternionUnfiltered.getRoll()); + } + + public void update(double yawUnfiltered, double pitchUnfiltered, double rollUnfiltered) + { + if (!hasBeenCalled.getBooleanValue() || containsNaN()) + { + hasBeenCalled.set(true); + setYawPitchRoll(yawUnfiltered, pitchUnfiltered, rollUnfiltered); + } + + if (maxRateVariable.getDoubleValue() < 0) + throw new RuntimeException("The maxRate parameter in the " + getClass().getSimpleName() + " cannot be negative."); + + differenceVector.setToZero(getReferenceFrame()); + differenceVector.set(yawUnfiltered, pitchUnfiltered, rollUnfiltered); + differenceVector.sub(getYaw().getDoubleValue(), getPitch().getDoubleValue(), getRoll().getDoubleValue()); + + limited.set(differenceVector.clipToMaxLength(maxRateVariable.getDoubleValue() * dt)); + add(differenceVector.getX(), differenceVector.getY(), differenceVector.getZ()); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java new file mode 100644 index 00000000..286207ad --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java @@ -0,0 +1,125 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.euclid.referenceFrame.FrameVector3D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DBasics; +import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; +import us.ihmc.euclid.tuple3D.interfaces.Vector3DReadOnly; +import us.ihmc.robotics.math.frames.YoFrameTuple; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.robotics.math.frames.YoFrameVector; + +public class RateLimitedYoFrameVector extends YoFrameVector +{ + private final YoDouble maxRateVariable; + + private final YoFrameTuple rawPosition; + private final YoBoolean limited; + private final YoBoolean hasBeenCalled; + private final double dt; + + private final FrameVector3D differenceVector = new FrameVector3D(); + + public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble maxRate, double dt, + YoFrameTuple rawPosition) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame()); + } + + public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble maxRate, double dt, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); + } + + public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt, YoFrameTuple rawPosition) + { + this(namePrefix, nameSuffix, registry, null, dt, rawPosition, rawPosition.getReferenceFrame()); + setMaxRate(maxRate); + } + + public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, null, dt, null, referenceFrame); + setMaxRate(maxRate); + } + + private RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, YoDouble maxRate, double dt, + YoFrameTuple rawPosition, ReferenceFrame referenceFrame) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + + this.hasBeenCalled = new YoBoolean(namePrefix + "HasBeenCalled" + nameSuffix, registry); + this.limited = new YoBoolean(namePrefix + "Limited" + nameSuffix, registry); + + if (maxRate != null) + this.maxRateVariable = maxRate; + else + this.maxRateVariable = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry); + + this.rawPosition = rawPosition; + + this.dt = dt; + + reset(); + } + + public void setMaxRate(double maxRate) + { + this.maxRateVariable.set(maxRate); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (rawPosition == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(rawPosition); + } + + public void update(YoFrameTuple yoFrameVectorUnfiltered) + { + checkReferenceFrameMatch(yoFrameVectorUnfiltered); + update(yoFrameVectorUnfiltered.getX(), yoFrameVectorUnfiltered.getY(), yoFrameVectorUnfiltered.getZ()); + } + + public void update(FrameTuple3DBasics frameVectorUnfiltered) + { + checkReferenceFrameMatch(frameVectorUnfiltered); + update(frameVectorUnfiltered.getX(), frameVectorUnfiltered.getY(), frameVectorUnfiltered.getZ()); + } + + public void update(Tuple3DReadOnly vectorUnfiltered) + { + update(vectorUnfiltered.getX(), vectorUnfiltered.getY(), vectorUnfiltered.getZ()); + } + + public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) + { + if (!hasBeenCalled.getBooleanValue() || containsNaN()) + { + hasBeenCalled.set(true); + set(xUnfiltered, yUnfiltered, zUnfiltered); + } + + if (maxRateVariable.getDoubleValue() < 0) + throw new RuntimeException("The maxRate parameter in the " + getClass().getSimpleName() + " cannot be negative."); + + differenceVector.setToZero(getReferenceFrame()); + differenceVector.set(xUnfiltered, yUnfiltered, zUnfiltered); + differenceVector.sub(getX(), getY(), getZ()); + + limited.set(differenceVector.clipToMaxLength(maxRateVariable.getDoubleValue() * dt)); + add(differenceVector); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java new file mode 100644 index 00000000..a6e1833f --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java @@ -0,0 +1,107 @@ +package us.ihmc.robotics.math.filters; + + +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly; +import us.ihmc.euclid.tuple2D.interfaces.Vector2DReadOnly; +import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; +import us.ihmc.robotics.math.frames.YoFrameVector2d; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + + +public class RateLimitedYoFrameVector2d extends YoFrameVector2d +{ + private final RateLimitedYoVariable x, y; + + private RateLimitedYoFrameVector2d(RateLimitedYoVariable x, RateLimitedYoVariable y, ReferenceFrame referenceFrame) + { + super(x, y, referenceFrame); + + this.x = x; + this.y = y; + } + + public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, + double maxRate, double dt, ReferenceFrame referenceFrame) + { + RateLimitedYoVariable x = new RateLimitedYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, dt); + RateLimitedYoVariable y = new RateLimitedYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, dt); + + RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, referenceFrame); + + return ret; + } + + public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, + YoDouble maxRate, double dt, ReferenceFrame referenceFrame) + { + RateLimitedYoVariable x = new RateLimitedYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, dt); + RateLimitedYoVariable y = new RateLimitedYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, dt); + + RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, referenceFrame); + + return ret; + } + + + public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, + double maxRate, double dt, YoFrameVector2d unfilteredVector) + { + RateLimitedYoVariable x = new RateLimitedYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt); + RateLimitedYoVariable y = new RateLimitedYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt); + + RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, unfilteredVector.getReferenceFrame()); + + return ret; + } + + + public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, + YoDouble maxRate, double dt, YoFrameVector2d unfilteredVector) + { + RateLimitedYoVariable x = new RateLimitedYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt); + RateLimitedYoVariable y = new RateLimitedYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt); + + RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, unfilteredVector.getReferenceFrame()); + + return ret; + } + + public void update() + { + x.update(); + y.update(); + } + + public void update(double xUnfiltered, double yUnfiltered) + { + x.update(xUnfiltered); + y.update(yUnfiltered); + } + + public void update(Vector2DReadOnly vector2dUnfiltered) + { + x.update(vector2dUnfiltered.getX()); + y.update(vector2dUnfiltered.getY()); + } + + public void update(FrameTuple2DReadOnly vector2dUnfiltered) + { + x.update(vector2dUnfiltered.getX()); + y.update(vector2dUnfiltered.getY()); + } + + public void setMaxRate(double maxRate) + { + x.setMaxRate(maxRate); + y.setMaxRate(maxRate); + } + + public void reset() + { + x.reset(); + y.reset(); + } +} + diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoVariable.java new file mode 100644 index 00000000..35f4a687 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoVariable.java @@ -0,0 +1,120 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +public class RateLimitedYoVariable extends YoDouble +{ + private final YoDouble maxRateVariable; + + private final YoDouble position; + private final YoBoolean limited; + + private final double dt; + + private final YoBoolean hasBeenCalled; + + public RateLimitedYoVariable(String name, YoVariableRegistry registry, double maxRate, double dt) + { + super(name, registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + this.limited = new YoBoolean(name + "Limited", registry); + + this.maxRateVariable = new YoDouble(name + "MaxRate", registry); + this.maxRateVariable.set(maxRate); + + this.position = null; + + this.dt = dt; + + reset(); + } + + public RateLimitedYoVariable(String name, YoVariableRegistry registry, YoDouble maxRateVariable, double dt) + { + super(name, registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + this.limited = new YoBoolean(name + "Limited", registry); + + this.maxRateVariable = maxRateVariable; + this.position = null; + + this.dt = dt; + reset(); + } + + public RateLimitedYoVariable(String name, YoVariableRegistry registry, double maxRate, YoDouble positionVariable, double dt) + { + super(name, registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + this.limited = new YoBoolean(name + "Limited", registry); + + position = positionVariable; + + this.maxRateVariable = new YoDouble(name + "MaxRate", registry); + this.maxRateVariable.set(maxRate); + + this.dt = dt; + + reset(); + } + + public RateLimitedYoVariable(String name, YoVariableRegistry registry, YoDouble maxRateVariable, YoDouble positionVariable, double dt) + { + super(name, registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + this.limited = new YoBoolean(name + "Limited", registry); + + position = positionVariable; + this.maxRateVariable = maxRateVariable; + + this.dt = dt; + + reset(); + } + + public void setMaxRate(double maxRate) + { + this.maxRateVariable.set(maxRate); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (position == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(position.getDoubleValue()); + } + + public void update(double currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + set(currentPosition); + } + + if (maxRateVariable.getDoubleValue() < 0) + throw new RuntimeException("The maxRate parameter in the RateLimitedYoVariable cannot be negative."); + + double difference = currentPosition - getDoubleValue(); + if (Math.abs(difference) > maxRateVariable.getDoubleValue() * dt) + { + difference = Math.signum(difference) * maxRateVariable.getDoubleValue() * dt; + this.limited.set(true); + } + else + this.limited.set(false); + + set(getDoubleValue() + difference); + } +} \ No newline at end of file diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RevisedBacklashCompensatingVelocityYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RevisedBacklashCompensatingVelocityYoVariable.java new file mode 100644 index 00000000..e1952293 --- /dev/null +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RevisedBacklashCompensatingVelocityYoVariable.java @@ -0,0 +1,213 @@ +package us.ihmc.robotics.math.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoEnum; + +/** + * This does essentially the same as BacklashCompensatingVelocityYoVariable, except does the steps in a different order and + * goes sloppy when the output changes sign rather than the finite differences. This works better for a signal with noise on it, + * which might have a true velocity but due to the noise seems to switch direction often. + * + */ +public class RevisedBacklashCompensatingVelocityYoVariable extends YoDouble implements ProcessingYoVariable +{ + private final double dt; + + private final FilteredVelocityYoVariable finiteDifferenceVelocity; + + private final YoDouble alphaVariable; + private final YoDouble position; + + private final YoDouble lastPosition; + private final YoBoolean hasBeenCalled; + + private final YoEnum
FilteredVelocityYoFrameVector
@@ -19,12 +19,12 @@ * @author IHMC Biped Team * @version 1.0 */ -public class FilteredVelocityYoFrameVector extends YoFrameVector +public class FilteredVelocityYoFrameVector extends YoFrameVector3D { private final FilteredVelocityYoVariable xDot, yDot, zDot; public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, - YoVariableRegistry registry, YoFrameVector yoFrameVectorToDifferentiate) + YoVariableRegistry registry, YoFrameVector3D yoFrameVectorToDifferentiate) { FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, yoFrameVectorToDifferentiate.getYoX(), dt, registry); @@ -40,7 +40,7 @@ public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector( } public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, - YoVariableRegistry registry, YoFramePoint yoFramePointToDifferentiate) + YoVariableRegistry registry, YoFramePoint3D yoFramePointToDifferentiate) { FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, yoFramePointToDifferentiate.getYoX(), dt, registry); @@ -78,7 +78,7 @@ private FilteredVelocityYoFrameVector(FilteredVelocityYoVariable xDot, FilteredV } private FilteredVelocityYoFrameVector(FilteredVelocityYoVariable xDot, FilteredVelocityYoVariable yDot, FilteredVelocityYoVariable zDot, - YoDouble alpha, double dt, YoVariableRegistry registry, YoFramePoint yoFramePointToDifferentiate) + YoDouble alpha, double dt, YoVariableRegistry registry, YoFramePoint3D yoFramePointToDifferentiate) { super(xDot, yDot, zDot, yoFramePointToDifferentiate.getReferenceFrame()); diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java index 10a2a55f..92638f36 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java @@ -3,26 +3,26 @@ import us.ihmc.euclid.referenceFrame.ReferenceFrame; import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly; import us.ihmc.euclid.tuple2D.interfaces.Vector2DReadOnly; -import us.ihmc.robotics.math.frames.YoFramePoint; -import us.ihmc.robotics.math.frames.YoFrameTuple2d; import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; -import us.ihmc.robotics.math.frames.YoFrameVector2d; import us.ihmc.yoVariables.registry.YoVariableRegistry; import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoFramePoint3D; +import us.ihmc.yoVariables.variable.YoFrameTuple2D; +import us.ihmc.yoVariables.variable.YoFrameVector2D; -public class FilteredVelocityYoFrameVector2d extends YoFrameVector2d +public class FilteredVelocityYoFrameVector2d extends YoFrameVector2D { private final FilteredVelocityYoVariable xDot, yDot; public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, YoDouble alpha, double dt, - YoVariableRegistry registry, YoFrameTuple2d yoFrameVectorToDifferentiate) + YoVariableRegistry registry, YoFrameTuple2D yoFrameVectorToDifferentiate) { return createFilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, "", alpha, dt, registry, yoFrameVectorToDifferentiate); } public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, String description, YoDouble alpha, double dt, YoVariableRegistry registry, - YoFrameTuple2d yoFrameVectorToDifferentiate) + YoFrameTuple2D yoFrameVectorToDifferentiate) { FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), description, alpha, yoFrameVectorToDifferentiate.getYoX(), dt, registry); @@ -56,7 +56,7 @@ private FilteredVelocityYoFrameVector2d(FilteredVelocityYoVariable xDot, Filtere } private FilteredVelocityYoFrameVector2d(FilteredVelocityYoVariable xDot, FilteredVelocityYoVariable yDot, YoDouble alpha, double dt, - YoVariableRegistry registry, YoFramePoint yoFramePointToDifferentiate) + YoVariableRegistry registry, YoFramePoint3D yoFramePointToDifferentiate) { super(xDot, yDot, yoFramePointToDifferentiate.getReferenceFrame()); diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java index aac85152..528ed7e2 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java @@ -7,12 +7,12 @@ import us.ihmc.euclid.referenceFrame.ReferenceFrame; import us.ihmc.euclid.referenceFrame.interfaces.FrameQuaternionReadOnly; import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly; -import us.ihmc.robotics.math.frames.YoFrameQuaternion; -import us.ihmc.robotics.math.frames.YoFrameVector; import us.ihmc.yoVariables.registry.YoVariableRegistry; import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoFrameQuaternion; +import us.ihmc.yoVariables.variable.YoFrameVector3D; -public class FiniteDifferenceAngularVelocityYoFrameVector extends YoFrameVector +public class FiniteDifferenceAngularVelocityYoFrameVector extends YoFrameVector3D { private final YoFrameQuaternion orientation; private final YoFrameQuaternion orientationPreviousValue; diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java index d3d09342..1e86932d 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java @@ -5,17 +5,17 @@ import us.ihmc.euclid.tuple3D.Vector3D; import us.ihmc.euclid.tuple4D.Quaternion; import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly; -import us.ihmc.robotics.math.frames.YoFrameOrientation; import us.ihmc.yoVariables.providers.DoubleProvider; import us.ihmc.yoVariables.registry.YoVariableRegistry; import us.ihmc.yoVariables.variable.YoBoolean; import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoFrameYawPitchRoll; -public class RateLimitedYoFrameOrientation extends YoFrameOrientation +public class RateLimitedYoFrameOrientation extends YoFrameYawPitchRoll { private final DoubleProvider maxRateVariable; - private final YoFrameOrientation rawOrientation; + private final YoFrameYawPitchRoll rawOrientation; private final YoBoolean limited; private final YoBoolean hasBeenCalled; private final double dt; @@ -28,7 +28,7 @@ private static DoubleProvider createMaxRateYoDouble(String namePrefix, String na } public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt, - YoFrameOrientation rawOrientation) + YoFrameYawPitchRoll rawOrientation) { this(namePrefix, nameSuffix, registry, maxRate, dt, rawOrientation, rawOrientation.getReferenceFrame()); } @@ -40,7 +40,7 @@ public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVar } public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt, - YoFrameOrientation rawOrientation) + YoFrameYawPitchRoll rawOrientation) { this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawOrientation, rawOrientation.getReferenceFrame()); @@ -53,7 +53,7 @@ public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVar } private RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt, - YoFrameOrientation rawOrientation, ReferenceFrame referenceFrame) + YoFrameYawPitchRoll rawOrientation, ReferenceFrame referenceFrame) { super(namePrefix, nameSuffix, referenceFrame, registry); @@ -88,7 +88,7 @@ public void update() update(rawOrientation); } - public void update(YoFrameOrientation yoFrameVectorUnfiltered) + public void update(YoFrameYawPitchRoll yoFrameVectorUnfiltered) { checkReferenceFrameMatch(yoFrameVectorUnfiltered); update(yoFrameVectorUnfiltered.getYaw().getDoubleValue(), yoFrameVectorUnfiltered.getPitch().getDoubleValue(), diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java index 089cc9f5..ef258e76 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java @@ -4,13 +4,13 @@ import us.ihmc.euclid.referenceFrame.ReferenceFrame; import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; -import us.ihmc.robotics.math.frames.YoFramePoint; import us.ihmc.yoVariables.providers.DoubleProvider; import us.ihmc.yoVariables.registry.YoVariableRegistry; import us.ihmc.yoVariables.variable.YoBoolean; import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoFramePoint3D; -public class RateLimitedYoFramePoint extends YoFramePoint +public class RateLimitedYoFramePoint extends YoFramePoint3D { private final DoubleProvider maxRateVariable; diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java index 4b45ec5c..90c34f49 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java @@ -6,11 +6,11 @@ import us.ihmc.euclid.tuple3D.Vector3D; import us.ihmc.euclid.tuple4D.Quaternion; import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly; -import us.ihmc.robotics.math.frames.YoFrameQuaternion; import us.ihmc.yoVariables.providers.DoubleProvider; import us.ihmc.yoVariables.registry.YoVariableRegistry; import us.ihmc.yoVariables.variable.YoBoolean; import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoFrameQuaternion; public class RateLimitedYoFrameQuaternion extends YoFrameQuaternion { diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java index 1492a13e..c83c50b6 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java @@ -4,13 +4,13 @@ import us.ihmc.euclid.referenceFrame.ReferenceFrame; import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; -import us.ihmc.robotics.math.frames.YoFrameVector; import us.ihmc.yoVariables.providers.DoubleProvider; import us.ihmc.yoVariables.registry.YoVariableRegistry; import us.ihmc.yoVariables.variable.YoBoolean; import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoFrameVector3D; -public class RateLimitedYoFrameVector extends YoFrameVector +public class RateLimitedYoFrameVector extends YoFrameVector3D { private final DoubleProvider maxRateVariable; diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java index a6e1833f..82e07d17 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java @@ -5,12 +5,12 @@ import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly; import us.ihmc.euclid.tuple2D.interfaces.Vector2DReadOnly; import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; -import us.ihmc.robotics.math.frames.YoFrameVector2d; import us.ihmc.yoVariables.registry.YoVariableRegistry; import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoFrameVector2D; -public class RateLimitedYoFrameVector2d extends YoFrameVector2d +public class RateLimitedYoFrameVector2d extends YoFrameVector2D { private final RateLimitedYoVariable x, y; @@ -46,7 +46,7 @@ public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, - double maxRate, double dt, YoFrameVector2d unfilteredVector) + double maxRate, double dt, YoFrameVector2D unfilteredVector) { RateLimitedYoVariable x = new RateLimitedYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt); RateLimitedYoVariable y = new RateLimitedYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt); @@ -58,7 +58,7 @@ public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry, - YoDouble maxRate, double dt, YoFrameVector2d unfilteredVector) + YoDouble maxRate, double dt, YoFrameVector2D unfilteredVector) { RateLimitedYoVariable x = new RateLimitedYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt); RateLimitedYoVariable y = new RateLimitedYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt); diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoFrameVector.java index 92ba898a..51bb8535 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoFrameVector.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoFrameVector.java @@ -4,10 +4,10 @@ import us.ihmc.euclid.referenceFrame.ReferenceFrame; import us.ihmc.euclid.tuple3D.Vector3D; import us.ihmc.yoVariables.registry.YoVariableRegistry; +import us.ihmc.yoVariables.variable.YoFrameVector3D; import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; -import us.ihmc.robotics.math.frames.YoFrameVector; -public class SecondOrderFilteredYoFrameVector extends YoFrameVector implements ProcessingYoVariable +public class SecondOrderFilteredYoFrameVector extends YoFrameVector3D implements ProcessingYoVariable { private final SecondOrderFilteredYoVariable x, y, z; @@ -40,7 +40,7 @@ public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameV } public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, - double dt, double naturalFrequencyInHz, double dampingRatio, SecondOrderFilterType filterType, YoFrameVector unfilteredVector) + double dt, double naturalFrequencyInHz, double dampingRatio, SecondOrderFilterType filterType, YoFrameVector3D unfilteredVector) { SecondOrderFilteredYoVariableParameters parameters = new SecondOrderFilteredYoVariableParameters(namePrefix + nameSuffix, registry, naturalFrequencyInHz, dampingRatio, filterType); @@ -48,7 +48,7 @@ public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameV } public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, - double dt, SecondOrderFilteredYoVariableParameters parameters, YoFrameVector unfilteredVector) + double dt, SecondOrderFilteredYoVariableParameters parameters, YoFrameVector3D unfilteredVector) { SecondOrderFilteredYoVariable x, y, z; x = new SecondOrderFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, dt, parameters, unfilteredVector.getYoX()); diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoFrameVector.java index e2550a48..f09e918e 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoFrameVector.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoFrameVector.java @@ -8,9 +8,9 @@ import us.ihmc.euclid.referenceFrame.ReferenceFrame; import us.ihmc.euclid.tuple3D.Vector3D; import us.ihmc.yoVariables.registry.YoVariableRegistry; -import us.ihmc.robotics.math.frames.YoFrameVector; +import us.ihmc.yoVariables.variable.YoFrameVector3D; -public class SimpleMovingAverageFilteredYoFrameVector extends YoFrameVector implements ProcessingYoVariable +public class SimpleMovingAverageFilteredYoFrameVector extends YoFrameVector3D implements ProcessingYoVariable { private final SimpleMovingAverageFilteredYoVariable x, y, z; @@ -39,7 +39,7 @@ public static SimpleMovingAverageFilteredYoFrameVector createSimpleMovingAverage } public static SimpleMovingAverageFilteredYoFrameVector createSimpleMovingAverageFilteredYoFrameVector(String namePrefix, String nameSuffix, int windowSize, - YoFrameVector unfilteredVector, YoVariableRegistry registry) + YoFrameVector3D unfilteredVector, YoVariableRegistry registry) { String xName = createXName(namePrefix, nameSuffix); String yName = createYName(namePrefix, nameSuffix); From 7134ceeeac804cd9df8809ea314dfdb85e391e7a Mon Sep 17 00:00:00 2001 From: gwiedebachFilteredVelocityYoFrameVector
+ *+ * FilteredVelocityYoFrameVector + *
* - *Differentiates and Filters a YoFrameVector to get its derivative.
+ *+ * Differentiates and Filters a YoFrameVector to get its derivative. + *
* - *IHMC
+ *+ * IHMC + *
* * @author IHMC Biped Team * @version 1.0 */ public class FilteredVelocityYoFrameVector extends YoFrameVector3D { - private final FilteredVelocityYoVariable xDot, yDot, zDot; - - public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, - YoVariableRegistry registry, YoFrameVector3D yoFrameVectorToDifferentiate) + private final double dt; + private final DoubleProvider alphaProvider; + + private final YoBoolean hasBeenCalled; + private final FrameTuple3DReadOnly currentPosition; + private final YoFrameVector3D lastPosition; + + /** + * @deprecated Use + * {@link #FilteredVelocityYoFrameVector(String, String, DoubleProvider, double, YoVariableRegistry, FrameTuple3DReadOnly)} + * instead. + */ + @Deprecated + public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, + YoVariableRegistry registry, + FrameTuple3DReadOnly frameTuple3DToDifferentiate) { - FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, - yoFrameVectorToDifferentiate.getYoX(), dt, registry); - FilteredVelocityYoVariable yDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), "", alpha, - yoFrameVectorToDifferentiate.getYoY(), dt, registry); - FilteredVelocityYoVariable zDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), "", alpha, - yoFrameVectorToDifferentiate.getYoZ(), dt, registry); - - FilteredVelocityYoFrameVector ret = new FilteredVelocityYoFrameVector(xDot, yDot, zDot, alpha, dt, registry, - yoFrameVectorToDifferentiate.getReferenceFrame()); - - return ret; + return new FilteredVelocityYoFrameVector(namePrefix, nameSuffix, alpha, dt, registry, frameTuple3DToDifferentiate); } - public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, - YoVariableRegistry registry, YoFramePoint3D yoFramePointToDifferentiate) + /** + * @deprecated Use + * {@link #FilteredVelocityYoFrameVector(String, String, DoubleProvider, double, YoVariableRegistry, ReferenceFrame)} + * instead. + */ + @Deprecated + public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, + YoVariableRegistry registry, ReferenceFrame referenceFrame) { - FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, - yoFramePointToDifferentiate.getYoX(), dt, registry); - FilteredVelocityYoVariable yDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), "", alpha, - yoFramePointToDifferentiate.getYoY(), dt, registry); - FilteredVelocityYoVariable zDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), "", alpha, - yoFramePointToDifferentiate.getYoZ(), dt, registry); - - FilteredVelocityYoFrameVector ret = new FilteredVelocityYoFrameVector(xDot, yDot, zDot, alpha, dt, registry, - yoFramePointToDifferentiate.getReferenceFrame()); - - return ret; + return new FilteredVelocityYoFrameVector(namePrefix, nameSuffix, alpha, dt, registry, referenceFrame); } - public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, - YoVariableRegistry registry, ReferenceFrame referenceFrame) + public FilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoVariableRegistry registry, + FrameTuple3DReadOnly frameTuple3DToDifferentiate) { - FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, dt, registry); - FilteredVelocityYoVariable yDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), "", alpha, dt, registry); - FilteredVelocityYoVariable zDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), "", alpha, dt, registry); - - FilteredVelocityYoFrameVector ret = new FilteredVelocityYoFrameVector(xDot, yDot, zDot, alpha, dt, registry, referenceFrame); - - return ret; + super(namePrefix, nameSuffix, frameTuple3DToDifferentiate.getReferenceFrame(), registry); + this.alphaProvider = alpha; + this.dt = dt; + + hasBeenCalled = new YoBoolean(namePrefix + nameSuffix + "HasBeenCalled", registry); + currentPosition = frameTuple3DToDifferentiate; + lastPosition = new YoFrameVector3D(namePrefix + "_lastPosition", nameSuffix, getReferenceFrame(), registry); + reset(); } - private FilteredVelocityYoFrameVector(FilteredVelocityYoVariable xDot, FilteredVelocityYoVariable yDot, FilteredVelocityYoVariable zDot, - YoDouble alpha, double dt, YoVariableRegistry registry, ReferenceFrame referenceFrame) + public FilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoVariableRegistry registry, + ReferenceFrame referenceFrame) { - super(xDot, yDot, zDot, referenceFrame); + super(namePrefix, nameSuffix, referenceFrame, registry); - this.xDot = xDot; - this.yDot = yDot; - this.zDot = zDot; + this.alphaProvider = alpha; + this.dt = dt; + + hasBeenCalled = new YoBoolean(namePrefix + nameSuffix + "HasBeenCalled", registry); + currentPosition = null; + lastPosition = new YoFrameVector3D(namePrefix + "_lastPosition", nameSuffix, getReferenceFrame(), registry); + reset(); } - private FilteredVelocityYoFrameVector(FilteredVelocityYoVariable xDot, FilteredVelocityYoVariable yDot, FilteredVelocityYoVariable zDot, - YoDouble alpha, double dt, YoVariableRegistry registry, YoFramePoint3D yoFramePointToDifferentiate) + public void reset() { - super(xDot, yDot, zDot, yoFramePointToDifferentiate.getReferenceFrame()); - - this.xDot = xDot; - this.yDot = yDot; - this.zDot = zDot; + hasBeenCalled.set(false); } public void update() { - xDot.update(); - yDot.update(); - zDot.update(); - } + if (currentPosition == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(FrameTuple3DReadOnly)"); + } - public void update(Tuple3DReadOnly tuple) - { - xDot.update(tuple.getX()); - yDot.update(tuple.getY()); - zDot.update(tuple.getZ()); + update(currentPosition); } public void update(FrameTuple3DReadOnly frameTuple) { checkReferenceFrameMatch(frameTuple); - xDot.update(frameTuple.getX()); - yDot.update(frameTuple.getY()); - zDot.update(frameTuple.getZ()); + update((Tuple3DReadOnly) frameTuple); } - public void reset() + private final Vector3D currentRawDerivative = new Vector3D(); + + public void update(Tuple3DReadOnly currentPosition) { - xDot.reset(); - yDot.reset(); - zDot.reset(); + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + lastPosition.set(currentPosition); + setToZero(); + } + + currentRawDerivative.sub(currentPosition, lastPosition); + currentRawDerivative.scale(1.0 / dt); + + double alpha = alphaProvider.getValue(); + interpolate(currentRawDerivative, this, alpha); + + lastPosition.set(currentPosition); } } diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java index 92638f36..250f1faa 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java @@ -2,90 +2,125 @@ import us.ihmc.euclid.referenceFrame.ReferenceFrame; import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly; -import us.ihmc.euclid.tuple2D.interfaces.Vector2DReadOnly; -import us.ihmc.robotics.math.frames.YoFrameVariableNameTools; +import us.ihmc.euclid.tuple2D.Vector2D; +import us.ihmc.euclid.tuple2D.interfaces.Tuple2DReadOnly; +import us.ihmc.yoVariables.providers.DoubleProvider; import us.ihmc.yoVariables.registry.YoVariableRegistry; -import us.ihmc.yoVariables.variable.YoDouble; -import us.ihmc.yoVariables.variable.YoFramePoint3D; -import us.ihmc.yoVariables.variable.YoFrameTuple2D; +import us.ihmc.yoVariables.variable.YoBoolean; import us.ihmc.yoVariables.variable.YoFrameVector2D; public class FilteredVelocityYoFrameVector2d extends YoFrameVector2D { - private final FilteredVelocityYoVariable xDot, yDot; - - public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, YoDouble alpha, double dt, - YoVariableRegistry registry, YoFrameTuple2D yoFrameVectorToDifferentiate) + private final double dt; + private final DoubleProvider alphaProvider; + + private final YoBoolean hasBeenCalled; + private final FrameTuple2DReadOnly currentPosition; + private final YoFrameVector2D lastPosition; + + /** + * @deprecated Use + * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoVariableRegistry, FrameTuple2DReadOnly)} + * instead. + */ + @Deprecated + public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, + YoVariableRegistry registry, + FrameTuple2DReadOnly frameTuple2DToDifferentiate) { - return createFilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, "", alpha, dt, registry, yoFrameVectorToDifferentiate); + return new FilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, alpha, dt, registry, frameTuple2DToDifferentiate); } - public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, String description, YoDouble alpha, - double dt, YoVariableRegistry registry, - YoFrameTuple2D yoFrameVectorToDifferentiate) + /** + * @deprecated Use + * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoVariableRegistry, FrameTuple2DReadOnly)} + * instead. + */ + @Deprecated + public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, String description, + DoubleProvider alpha, double dt, YoVariableRegistry registry, + FrameTuple2DReadOnly frameTuple2DToDifferentiate) { - FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), description, alpha, - yoFrameVectorToDifferentiate.getYoX(), dt, registry); - FilteredVelocityYoVariable yDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), description, alpha, - yoFrameVectorToDifferentiate.getYoY(), dt, registry); - - FilteredVelocityYoFrameVector2d ret = new FilteredVelocityYoFrameVector2d(xDot, yDot, alpha, dt, registry, - yoFrameVectorToDifferentiate.getReferenceFrame()); - - return ret; + return new FilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, alpha, dt, registry, frameTuple2DToDifferentiate); } - public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, YoDouble alpha, double dt, + /** + * @deprecated Use + * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoVariableRegistry, ReferenceFrame)} + * instead. + */ + @Deprecated + public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoVariableRegistry registry, ReferenceFrame referenceFrame) { - FilteredVelocityYoVariable xDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), "", alpha, dt, registry); - FilteredVelocityYoVariable yDot = new FilteredVelocityYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), "", alpha, dt, registry); - - FilteredVelocityYoFrameVector2d ret = new FilteredVelocityYoFrameVector2d(xDot, yDot, alpha, dt, registry, referenceFrame); - - return ret; + return new FilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, alpha, dt, registry, referenceFrame); } - private FilteredVelocityYoFrameVector2d(FilteredVelocityYoVariable xDot, FilteredVelocityYoVariable yDot, YoDouble alpha, double dt, - YoVariableRegistry registry, ReferenceFrame referenceFrame) + public FilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoVariableRegistry registry, + FrameTuple2DReadOnly frameTuple2DToDifferentiate) { - super(xDot, yDot, referenceFrame); - - this.xDot = xDot; - this.yDot = yDot; + super(namePrefix, nameSuffix, frameTuple2DToDifferentiate.getReferenceFrame(), registry); + this.alphaProvider = alpha; + this.dt = dt; + + hasBeenCalled = new YoBoolean(namePrefix + nameSuffix + "HasBeenCalled", registry); + currentPosition = frameTuple2DToDifferentiate; + lastPosition = new YoFrameVector2D(namePrefix + "_lastPosition", nameSuffix, getReferenceFrame(), registry); + reset(); } - private FilteredVelocityYoFrameVector2d(FilteredVelocityYoVariable xDot, FilteredVelocityYoVariable yDot, YoDouble alpha, double dt, - YoVariableRegistry registry, YoFramePoint3D yoFramePointToDifferentiate) + public FilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoVariableRegistry registry, + ReferenceFrame referenceFrame) { - super(xDot, yDot, yoFramePointToDifferentiate.getReferenceFrame()); + super(namePrefix, nameSuffix, referenceFrame, registry); - this.xDot = xDot; - this.yDot = yDot; + this.alphaProvider = alpha; + this.dt = dt; + + hasBeenCalled = new YoBoolean(namePrefix + nameSuffix + "HasBeenCalled", registry); + currentPosition = null; + lastPosition = new YoFrameVector2D(namePrefix + "_lastPosition", nameSuffix, getReferenceFrame(), registry); + reset(); } - public void update() + public void reset() { - xDot.update(); - yDot.update(); + hasBeenCalled.set(false); } - public void update(Vector2DReadOnly vector) + public void update() { - xDot.update(vector.getX()); - yDot.update(vector.getY()); + if (currentPosition == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(FrameTuple3DReadOnly)"); + } + + update(currentPosition); } - public void update(FrameTuple2DReadOnly tupleToDifferentiate) + public void update(FrameTuple2DReadOnly frameTuple) { - checkReferenceFrameMatch(tupleToDifferentiate); - xDot.update(tupleToDifferentiate.getX()); - yDot.update(tupleToDifferentiate.getY()); + checkReferenceFrameMatch(frameTuple); + update((Tuple2DReadOnly) frameTuple); } - public void reset() + private final Vector2D currentRawDerivative = new Vector2D(); + + public void update(Tuple2DReadOnly currentPosition) { - xDot.reset(); - yDot.reset(); + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + lastPosition.set(currentPosition); + setToZero(); + } + + currentRawDerivative.sub(currentPosition, lastPosition); + currentRawDerivative.scale(1.0 / dt); + + interpolate(currentRawDerivative, this, alphaProvider.getValue()); + + lastPosition.set(currentPosition); } } From 3072938c1b79b7c7e04f1981a5037ab6a2daae66 Mon Sep 17 00:00:00 2001 From: Jesper Smith
@@ -36,12 +36,12 @@ public class FilteredVelocityYoFrameVector extends YoFrameVector3D
/**
* @deprecated Use
- * {@link #FilteredVelocityYoFrameVector(String, String, DoubleProvider, double, YoVariableRegistry, FrameTuple3DReadOnly)}
+ * {@link #FilteredVelocityYoFrameVector(String, String, DoubleProvider, double, YoRegistry, FrameTuple3DReadOnly)}
* instead.
*/
@Deprecated
public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt,
- YoVariableRegistry registry,
+ YoRegistry registry,
FrameTuple3DReadOnly frameTuple3DToDifferentiate)
{
return new FilteredVelocityYoFrameVector(namePrefix, nameSuffix, alpha, dt, registry, frameTuple3DToDifferentiate);
@@ -49,17 +49,17 @@ public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(
/**
* @deprecated Use
- * {@link #FilteredVelocityYoFrameVector(String, String, DoubleProvider, double, YoVariableRegistry, ReferenceFrame)}
+ * {@link #FilteredVelocityYoFrameVector(String, String, DoubleProvider, double, YoRegistry, ReferenceFrame)}
* instead.
*/
@Deprecated
public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt,
- YoVariableRegistry registry, ReferenceFrame referenceFrame)
+ YoRegistry registry, ReferenceFrame referenceFrame)
{
return new FilteredVelocityYoFrameVector(namePrefix, nameSuffix, alpha, dt, registry, referenceFrame);
}
- public FilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoVariableRegistry registry,
+ public FilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoRegistry registry,
FrameTuple3DReadOnly frameTuple3DToDifferentiate)
{
super(namePrefix, nameSuffix, frameTuple3DToDifferentiate.getReferenceFrame(), registry);
@@ -72,7 +72,7 @@ public FilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, Doubl
reset();
}
- public FilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoVariableRegistry registry,
+ public FilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoRegistry registry,
ReferenceFrame referenceFrame)
{
super(namePrefix, nameSuffix, referenceFrame, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java
index 250f1faa..ab519961 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java
@@ -4,10 +4,10 @@
import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly;
import us.ihmc.euclid.tuple2D.Vector2D;
import us.ihmc.euclid.tuple2D.interfaces.Tuple2DReadOnly;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector2D;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
-import us.ihmc.yoVariables.variable.YoFrameVector2D;
public class FilteredVelocityYoFrameVector2d extends YoFrameVector2D
{
@@ -20,12 +20,12 @@ public class FilteredVelocityYoFrameVector2d extends YoFrameVector2D
/**
* @deprecated Use
- * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoVariableRegistry, FrameTuple2DReadOnly)}
+ * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoRegistry, FrameTuple2DReadOnly)}
* instead.
*/
@Deprecated
public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt,
- YoVariableRegistry registry,
+ YoRegistry registry,
FrameTuple2DReadOnly frameTuple2DToDifferentiate)
{
return new FilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, alpha, dt, registry, frameTuple2DToDifferentiate);
@@ -33,12 +33,12 @@ public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVecto
/**
* @deprecated Use
- * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoVariableRegistry, FrameTuple2DReadOnly)}
+ * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoRegistry, FrameTuple2DReadOnly)}
* instead.
*/
@Deprecated
public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, String description,
- DoubleProvider alpha, double dt, YoVariableRegistry registry,
+ DoubleProvider alpha, double dt, YoRegistry registry,
FrameTuple2DReadOnly frameTuple2DToDifferentiate)
{
return new FilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, alpha, dt, registry, frameTuple2DToDifferentiate);
@@ -46,17 +46,17 @@ public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVecto
/**
* @deprecated Use
- * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoVariableRegistry, ReferenceFrame)}
+ * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoRegistry, ReferenceFrame)}
* instead.
*/
@Deprecated
public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt,
- YoVariableRegistry registry, ReferenceFrame referenceFrame)
+ YoRegistry registry, ReferenceFrame referenceFrame)
{
return new FilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, alpha, dt, registry, referenceFrame);
}
- public FilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoVariableRegistry registry,
+ public FilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoRegistry registry,
FrameTuple2DReadOnly frameTuple2DToDifferentiate)
{
super(namePrefix, nameSuffix, frameTuple2DToDifferentiate.getReferenceFrame(), registry);
@@ -69,7 +69,7 @@ public FilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, Dou
reset();
}
- public FilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoVariableRegistry registry,
+ public FilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoRegistry registry,
ReferenceFrame referenceFrame)
{
super(namePrefix, nameSuffix, referenceFrame, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoVariable.java
index 444c7710..f8bd502c 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoVariable.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoVariable.java
@@ -2,7 +2,7 @@
import us.ihmc.robotics.geometry.AngleTools;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
@@ -33,7 +33,7 @@ public class FilteredVelocityYoVariable extends YoDouble implements ProcessingYo
private final YoDouble lastPosition;
private final YoBoolean hasBeenCalled;
- public FilteredVelocityYoVariable(String name, String description, double alpha, double dt, YoVariableRegistry registry)
+ public FilteredVelocityYoVariable(String name, String description, double alpha, double dt, YoRegistry registry)
{
super(name, description, registry);
this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry);
@@ -49,7 +49,7 @@ public FilteredVelocityYoVariable(String name, String description, double alpha,
reset();
}
- public FilteredVelocityYoVariable(String name, String description, double alpha, YoDouble positionVariable, double dt, YoVariableRegistry registry)
+ public FilteredVelocityYoVariable(String name, String description, double alpha, YoDouble positionVariable, double dt, YoRegistry registry)
{
super(name, description, registry);
this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry);
@@ -66,7 +66,7 @@ public FilteredVelocityYoVariable(String name, String description, double alpha,
reset();
}
- public FilteredVelocityYoVariable(String name, String description, DoubleProvider alphaVariable, YoDouble positionVariable, double dt, YoVariableRegistry registry)
+ public FilteredVelocityYoVariable(String name, String description, DoubleProvider alphaVariable, YoDouble positionVariable, double dt, YoRegistry registry)
{
super(name, description, registry);
this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry);
@@ -82,7 +82,7 @@ public FilteredVelocityYoVariable(String name, String description, DoubleProvide
reset();
}
- public FilteredVelocityYoVariable(String name, String description, DoubleProvider alphaVariable, double dt, YoVariableRegistry registry)
+ public FilteredVelocityYoVariable(String name, String description, DoubleProvider alphaVariable, double dt, YoRegistry registry)
{
super(name, description, registry);
this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java
index 18067e7f..0f97d89a 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java
@@ -6,10 +6,10 @@
import us.ihmc.euclid.orientation.interfaces.Orientation3DReadOnly;
import us.ihmc.euclid.referenceFrame.ReferenceFrame;
import us.ihmc.euclid.referenceFrame.interfaces.FrameOrientation3DReadOnly;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameQuaternion;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
-import us.ihmc.yoVariables.variable.YoFrameQuaternion;
-import us.ihmc.yoVariables.variable.YoFrameVector3D;
public class FiniteDifferenceAngularVelocityYoFrameVector extends YoFrameVector3D
{
@@ -25,17 +25,17 @@ public class FiniteDifferenceAngularVelocityYoFrameVector extends YoFrameVector3
private final double dt;
- public FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, ReferenceFrame referenceFrame, double dt, YoVariableRegistry registry)
+ public FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, ReferenceFrame referenceFrame, double dt, YoRegistry registry)
{
this(namePrefix, null, referenceFrame, dt, registry);
}
- public FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, YoFrameQuaternion orientationToDifferentiate, double dt, YoVariableRegistry registry)
+ public FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, YoFrameQuaternion orientationToDifferentiate, double dt, YoRegistry registry)
{
this(namePrefix, orientationToDifferentiate, orientationToDifferentiate.getReferenceFrame(), dt, registry);
}
- private FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, YoFrameQuaternion orientationToDifferentiate, ReferenceFrame referenceFrame, double dt, YoVariableRegistry registry)
+ private FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, YoFrameQuaternion orientationToDifferentiate, ReferenceFrame referenceFrame, double dt, YoRegistry registry)
{
super(namePrefix, referenceFrame, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderBandPassFilteredYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderBandPassFilteredYoVariable.java
index 636ba048..ee9be329 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderBandPassFilteredYoVariable.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderBandPassFilteredYoVariable.java
@@ -1,6 +1,6 @@
package us.ihmc.robotics.math.filters;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoDouble;
public class FirstOrderBandPassFilteredYoVariable extends FirstOrderFilteredYoVariable
@@ -10,7 +10,7 @@ public class FirstOrderBandPassFilteredYoVariable extends FirstOrderFilteredYoVa
private final FirstOrderFilteredYoVariable highPassFilteredInput;
public FirstOrderBandPassFilteredYoVariable(String name, String description, double minPassThroughFrequency_Hz, double maxPassThroughFrequency_Hz,
- YoDouble yoTime, YoVariableRegistry registry)
+ YoDouble yoTime, YoRegistry registry)
{
super(name, description, maxPassThroughFrequency_Hz, yoTime, FirstOrderFilterType.LOW_PASS, registry);
@@ -21,7 +21,7 @@ public FirstOrderBandPassFilteredYoVariable(String name, String description, dou
}
public FirstOrderBandPassFilteredYoVariable(String name, String description, double minPassThroughFrequency_Hz, double maxPassThroughFrequency_Hz,
- double DT, YoVariableRegistry registry)
+ double DT, YoRegistry registry)
{
super(name, description, maxPassThroughFrequency_Hz, DT, FirstOrderFilterType.LOW_PASS, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderFilteredYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderFilteredYoVariable.java
index d1c7f545..ab2caa2f 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderFilteredYoVariable.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderFilteredYoVariable.java
@@ -1,6 +1,6 @@
package us.ihmc.robotics.math.filters;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoDouble;
public class FirstOrderFilteredYoVariable extends YoDouble
@@ -23,7 +23,7 @@ public enum FirstOrderFilterType
private FirstOrderFilterType highOrLowPass;
- public FirstOrderFilteredYoVariable(String name, String description, double cutoffFrequency_Hz, YoDouble yoTime, FirstOrderFilterType highOrLowPass, YoVariableRegistry registry)
+ public FirstOrderFilteredYoVariable(String name, String description, double cutoffFrequency_Hz, YoDouble yoTime, FirstOrderFilterType highOrLowPass, YoRegistry registry)
{
super(name, description, registry);
@@ -48,7 +48,7 @@ public FirstOrderFilteredYoVariable(String name, String description, double cuto
this.highOrLowPass = highOrLowPass;
}
- public FirstOrderFilteredYoVariable(String name, String description, double cutoffFrequency_Hz, double DT, FirstOrderFilterType highOrLowPass, YoVariableRegistry registry)
+ public FirstOrderFilteredYoVariable(String name, String description, double cutoffFrequency_Hz, double DT, FirstOrderFilterType highOrLowPass, YoRegistry registry)
{
this(name, description, cutoffFrequency_Hz, null, highOrLowPass, registry);
this.dt = DT;
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoBoolean.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoBoolean.java
index 1cbfaaad..0f85d3cf 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoBoolean.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoBoolean.java
@@ -1,6 +1,6 @@
package us.ihmc.robotics.math.filters;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoInteger;
@@ -13,13 +13,13 @@ public class GlitchFilteredYoBoolean extends YoBoolean
public GlitchFilteredYoBoolean(String name, int windowSize)
{
super(name, "GlitchFilteredYoBoolean", null);
- counter = new YoInteger(name + "Count", getYoVariableRegistry());
- this.windowSize = new YoInteger(name + "WindowSize", getYoVariableRegistry());
+ counter = new YoInteger(name + "Count", getRegistry());
+ this.windowSize = new YoInteger(name + "WindowSize", getRegistry());
initialize(null, windowSize);
}
- public GlitchFilteredYoBoolean(String name, YoVariableRegistry registry, int windowSize)
+ public GlitchFilteredYoBoolean(String name, YoRegistry registry, int windowSize)
{
super(name, registry);
counter = new YoInteger(name + "Count", registry);
@@ -31,18 +31,18 @@ public GlitchFilteredYoBoolean(String name, YoVariableRegistry registry, int win
public GlitchFilteredYoBoolean(String name, YoBoolean yoVariableToFilter, int windowSize)
{
super(name, "GlitchFilteredYoBoolean", null);
- counter = new YoInteger(name + "Count", getYoVariableRegistry());
- this.windowSize = new YoInteger(name + "WindowSize", getYoVariableRegistry());
+ counter = new YoInteger(name + "Count", getRegistry());
+ this.windowSize = new YoInteger(name + "WindowSize", getRegistry());
initialize(yoVariableToFilter, windowSize);
}
- public GlitchFilteredYoBoolean(String name, YoVariableRegistry registry, YoBoolean yoVariableToFilter, int windowSize)
+ public GlitchFilteredYoBoolean(String name, YoRegistry registry, YoBoolean yoVariableToFilter, int windowSize)
{
this(name, "", registry, yoVariableToFilter, windowSize);
}
- public GlitchFilteredYoBoolean(String name, String description, YoVariableRegistry registry, YoBoolean yoVariableToFilter, int windowSize)
+ public GlitchFilteredYoBoolean(String name, String description, YoRegistry registry, YoBoolean yoVariableToFilter, int windowSize)
{
super(name, description, registry);
counter = new YoInteger(name + "Count", description, registry);
@@ -65,18 +65,18 @@ private void initialize(YoBoolean yoVariableToFilter, int windowSize)
this.set(false);
}
- public void set(boolean value)
+ public boolean set(boolean value)
{
- super.set(value);
if (counter != null)
{
counter.set(0);
}
+ return super.set(value);
}
public void update(boolean value)
{
-
+
if (value != this.getBooleanValue())
{
counter.set(counter.getIntegerValue() + 1);
@@ -84,7 +84,7 @@ public void update(boolean value)
else
counter.set(0);
- if (counter.getIntegerValue() >= (windowSize.getIntegerValue() ))
+ if (counter.getIntegerValue() >= (windowSize.getIntegerValue()))
set(value);
}
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoInteger.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoInteger.java
index eed1c217..4ee14989 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoInteger.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoInteger.java
@@ -1,7 +1,7 @@
package us.ihmc.robotics.math.filters;
import us.ihmc.yoVariables.providers.IntegerProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoInteger;
public class GlitchFilteredYoInteger extends YoInteger
@@ -11,12 +11,12 @@ public class GlitchFilteredYoInteger extends YoInteger
private final IntegerProvider windowSize;
private final YoInteger counter;
- public GlitchFilteredYoInteger(String name, int windowSize, YoVariableRegistry registry)
+ public GlitchFilteredYoInteger(String name, int windowSize, YoRegistry registry)
{
this(name, windowSize, null, registry);
}
- public GlitchFilteredYoInteger(String name, int windowSize, YoInteger position, YoVariableRegistry registry)
+ public GlitchFilteredYoInteger(String name, int windowSize, YoInteger position, YoRegistry registry)
{
super(name, GlitchFilteredYoInteger.class.getSimpleName(), registry);
@@ -29,12 +29,12 @@ public GlitchFilteredYoInteger(String name, int windowSize, YoInteger position,
this.windowSize = yoWindowSize;
}
- public GlitchFilteredYoInteger(String name, IntegerProvider windowSize, YoVariableRegistry registry)
+ public GlitchFilteredYoInteger(String name, IntegerProvider windowSize, YoRegistry registry)
{
this(name, windowSize, null, registry);
}
- public GlitchFilteredYoInteger(String name, IntegerProvider windowSize, YoInteger position, YoVariableRegistry registry)
+ public GlitchFilteredYoInteger(String name, IntegerProvider windowSize, YoInteger position, YoRegistry registry)
{
super(name, GlitchFilteredYoInteger.class.getSimpleName(), registry);
@@ -46,11 +46,11 @@ public GlitchFilteredYoInteger(String name, IntegerProvider windowSize, YoIntege
}
@Override
- public void set(int value)
+ public boolean set(int value)
{
- super.set(value);
if (counter != null)
counter.set(0);
+ return super.set(value);
}
@Override
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/JerkLimitedYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/JerkLimitedYoVariable.java
index 556f17b8..05a6c61e 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/JerkLimitedYoVariable.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/JerkLimitedYoVariable.java
@@ -1,7 +1,7 @@
package us.ihmc.robotics.math.filters;
import us.ihmc.commons.MathTools;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
@@ -26,24 +26,24 @@ public class JerkLimitedYoVariable extends YoDouble
private final YoDouble inputVelocity;
private final YoDouble inputAcceleration;
- public JerkLimitedYoVariable(String name, YoVariableRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, double dt)
+ public JerkLimitedYoVariable(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, double dt)
{
this(name, registry, maxAcceleration, maxJerk, null, null, null, dt);
}
- public JerkLimitedYoVariable(String name, YoVariableRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk,
+ public JerkLimitedYoVariable(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk,
YoDouble inputPosition, double dt)
{
this(name, registry, maxAcceleration, maxJerk, inputPosition, null, null, dt);
}
- public JerkLimitedYoVariable(String name, YoVariableRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk,
+ public JerkLimitedYoVariable(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk,
YoDouble inputPosition, YoDouble inputVelocity, double dt)
{
this(name, registry, maxAcceleration, maxJerk, inputPosition, inputVelocity, null, dt);
}
- public JerkLimitedYoVariable(String name, YoVariableRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk,
+ public JerkLimitedYoVariable(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk,
YoDouble inputPosition, YoDouble inputVelocity, YoDouble inputAcceleration, double dt)
{
super(name, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java
index d7ccddce..1c7ec5fb 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java
@@ -5,11 +5,11 @@
import us.ihmc.euclid.tuple3D.Vector3D;
import us.ihmc.euclid.tuple4D.Quaternion;
import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameYawPitchRoll;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
-import us.ihmc.yoVariables.variable.YoFrameYawPitchRoll;
public class RateLimitedYoFrameOrientation extends YoFrameYawPitchRoll
{
@@ -20,39 +20,39 @@ public class RateLimitedYoFrameOrientation extends YoFrameYawPitchRoll
private final YoBoolean hasBeenCalled;
private final double dt;
- private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoVariableRegistry registry)
+ private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry)
{
YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry);
maxRate.set(initialValue);
return maxRate;
}
- public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
YoFrameYawPitchRoll rawOrientation)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, rawOrientation, rawOrientation.getReferenceFrame());
}
- public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame);
}
- public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt,
+ public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt,
YoFrameYawPitchRoll rawOrientation)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawOrientation,
rawOrientation.getReferenceFrame());
}
- public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt,
+ public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt,
ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame);
}
- private RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ private RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
YoFrameYawPitchRoll rawOrientation, ReferenceFrame referenceFrame)
{
super(namePrefix, nameSuffix, referenceFrame, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java
index ef258e76..cea995da 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java
@@ -4,11 +4,11 @@
import us.ihmc.euclid.referenceFrame.ReferenceFrame;
import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly;
import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFramePoint3D;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
-import us.ihmc.yoVariables.variable.YoFramePoint3D;
public class RateLimitedYoFramePoint extends YoFramePoint3D
{
@@ -21,38 +21,38 @@ public class RateLimitedYoFramePoint extends YoFramePoint3D
private final FrameVector3D differenceVector = new FrameVector3D();
- private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoVariableRegistry registry)
+ private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry)
{
YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry);
maxRate.set(initialValue);
return maxRate;
}
- public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FrameTuple3DReadOnly rawPosition)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame());
}
- public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame);
}
- public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt,
+ public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt,
FrameTuple3DReadOnly rawPosition)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition,
rawPosition.getReferenceFrame());
}
- public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame)
+ public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame);
}
- private RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ private RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FrameTuple3DReadOnly rawPosition, ReferenceFrame referenceFrame)
{
super(namePrefix, nameSuffix, referenceFrame, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint2D.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint2D.java
index 109ea90f..b138bf53 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint2D.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint2D.java
@@ -5,14 +5,12 @@
import us.ihmc.euclid.referenceFrame.interfaces.FramePoint2DReadOnly;
import us.ihmc.euclid.referenceFrame.interfaces.FramePoint3DReadOnly;
import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly;
-import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly;
import us.ihmc.euclid.tuple2D.interfaces.Tuple2DReadOnly;
-import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFramePoint2D;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
-import us.ihmc.yoVariables.variable.YoFramePoint2D;
public class RateLimitedYoFramePoint2D extends YoFramePoint2D
{
@@ -25,38 +23,38 @@ public class RateLimitedYoFramePoint2D extends YoFramePoint2D
private final FrameVector2D differenceVector = new FrameVector2D();
- private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoVariableRegistry registry)
+ private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry)
{
YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry);
maxRate.set(initialValue);
return maxRate;
}
- public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FrameTuple2DReadOnly rawPosition)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame());
}
- public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame);
}
- public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt,
+ public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt,
FrameTuple2DReadOnly rawPosition)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition,
rawPosition.getReferenceFrame());
}
- public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame)
+ public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame);
}
- private RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ private RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FrameTuple2DReadOnly rawPosition, ReferenceFrame referenceFrame)
{
super(namePrefix, nameSuffix, referenceFrame, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePose.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePose.java
index e41da55a..72b6f523 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePose.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePose.java
@@ -7,7 +7,7 @@
import us.ihmc.euclid.referenceFrame.interfaces.FixedFrameQuaternionBasics;
import us.ihmc.euclid.referenceFrame.interfaces.FramePose3DReadOnly;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoDouble;
public class RateLimitedYoFramePose implements FixedFramePose3DBasics
@@ -15,36 +15,36 @@ public class RateLimitedYoFramePose implements FixedFramePose3DBasics
private final RateLimitedYoFramePoint position;
private final RateLimitedYoFrameQuaternion orientation;
- private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoVariableRegistry registry)
+ private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry)
{
YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry);
maxRate.set(initialValue);
return maxRate;
}
- public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FramePose3DReadOnly rawPose)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, rawPose, rawPose.getReferenceFrame());
}
- public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame);
}
- public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt, FramePose3DReadOnly rawPose)
+ public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, FramePose3DReadOnly rawPose)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPose, rawPose.getReferenceFrame());
}
- public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame)
+ public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame);
}
- private RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ private RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FramePose3DReadOnly rawPose, ReferenceFrame referenceFrame)
{
if (rawPose != null)
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java
index de863547..37a8c317 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java
@@ -6,11 +6,11 @@
import us.ihmc.euclid.tuple3D.Vector3D;
import us.ihmc.euclid.tuple4D.Quaternion;
import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameQuaternion;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
-import us.ihmc.yoVariables.variable.YoFrameQuaternion;
public class RateLimitedYoFrameQuaternion extends YoFrameQuaternion
{
@@ -21,45 +21,45 @@ public class RateLimitedYoFrameQuaternion extends YoFrameQuaternion
private final YoBoolean limited;
private final DoubleProvider maxRateVariable;
- private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoVariableRegistry registry)
+ private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry)
{
YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry);
maxRate.set(initialValue);
return maxRate;
}
- public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt,
+ public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt,
FrameQuaternionReadOnly rawQuaternion)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawQuaternion.getReferenceFrame(),
rawQuaternion);
}
- public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt,
+ public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt,
ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, referenceFrame, null);
}
- public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt,
+ public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt,
ReferenceFrame referenceFrame, QuaternionReadOnly rawQuaternion)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, referenceFrame, rawQuaternion);
}
- public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FrameQuaternionReadOnly rawQuaternion)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, rawQuaternion.getReferenceFrame(), rawQuaternion);
}
- public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, referenceFrame, null);
}
- public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
ReferenceFrame referenceFrame, QuaternionReadOnly rawQuaternion)
{
super(namePrefix, nameSuffix, referenceFrame, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java
index c83c50b6..30dc9e1c 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java
@@ -4,11 +4,11 @@
import us.ihmc.euclid.referenceFrame.ReferenceFrame;
import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly;
import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
-import us.ihmc.yoVariables.variable.YoFrameVector3D;
public class RateLimitedYoFrameVector extends YoFrameVector3D
{
@@ -21,38 +21,38 @@ public class RateLimitedYoFrameVector extends YoFrameVector3D
private final FrameVector3D differenceVector = new FrameVector3D();
- private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoVariableRegistry registry)
+ private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry)
{
YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry);
maxRate.set(initialValue);
return maxRate;
}
- public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FrameTuple3DReadOnly rawPosition)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame());
}
- public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame);
}
- public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt,
+ public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt,
FrameTuple3DReadOnly rawPosition)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition,
rawPosition.getReferenceFrame());
}
- public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame)
+ public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame);
}
- private RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ private RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FrameTuple3DReadOnly rawPosition, ReferenceFrame referenceFrame)
{
super(namePrefix, nameSuffix, referenceFrame, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java
index 4afeb977..2c32bbbb 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java
@@ -4,11 +4,11 @@
import us.ihmc.euclid.referenceFrame.ReferenceFrame;
import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly;
import us.ihmc.euclid.tuple2D.interfaces.Vector2DReadOnly;
-import us.ihmc.robotics.math.frames.YoFrameVariableNameTools;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector2D;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
+import us.ihmc.yoVariables.tools.YoGeometryNameTools;
import us.ihmc.yoVariables.variable.YoDouble;
-import us.ihmc.yoVariables.variable.YoFrameVector2D;
public class RateLimitedYoFrameVector2d extends YoFrameVector2D
@@ -23,22 +23,22 @@ private RateLimitedYoFrameVector2d(RateLimitedYoVariable x, RateLimitedYoVariabl
this.y = y;
}
- public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry,
+ public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoRegistry registry,
double maxRate, double dt, ReferenceFrame referenceFrame)
{
- RateLimitedYoVariable x = new RateLimitedYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, dt);
- RateLimitedYoVariable y = new RateLimitedYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, dt);
+ RateLimitedYoVariable x = new RateLimitedYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, dt);
+ RateLimitedYoVariable y = new RateLimitedYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, dt);
RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, referenceFrame);
return ret;
}
- public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry,
+ public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoRegistry registry,
YoDouble maxRate, double dt, ReferenceFrame referenceFrame)
{
- RateLimitedYoVariable x = new RateLimitedYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, dt);
- RateLimitedYoVariable y = new RateLimitedYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, dt);
+ RateLimitedYoVariable x = new RateLimitedYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, dt);
+ RateLimitedYoVariable y = new RateLimitedYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, dt);
RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, referenceFrame);
@@ -46,11 +46,11 @@ public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String
}
- public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry,
+ public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoRegistry registry,
double maxRate, double dt, YoFrameVector2D unfilteredVector)
{
- RateLimitedYoVariable x = new RateLimitedYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt);
- RateLimitedYoVariable y = new RateLimitedYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt);
+ RateLimitedYoVariable x = new RateLimitedYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt);
+ RateLimitedYoVariable y = new RateLimitedYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt);
RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, unfilteredVector.getReferenceFrame());
@@ -58,11 +58,11 @@ public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String
}
- public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoVariableRegistry registry,
+ public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoRegistry registry,
DoubleProvider maxRate, double dt, YoFrameVector2D unfilteredVector)
{
- RateLimitedYoVariable x = new RateLimitedYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt);
- RateLimitedYoVariable y = new RateLimitedYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt);
+ RateLimitedYoVariable x = new RateLimitedYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt);
+ RateLimitedYoVariable y = new RateLimitedYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt);
RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, unfilteredVector.getReferenceFrame());
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoMutableFrameVector3D.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoMutableFrameVector3D.java
index 3c794ee6..02871c05 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoMutableFrameVector3D.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoMutableFrameVector3D.java
@@ -4,11 +4,11 @@
import us.ihmc.euclid.referenceFrame.ReferenceFrame;
import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly;
import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoMutableFrameVector3D;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
-import us.ihmc.yoVariables.variable.frameObjects.YoMutableFrameVector3D;
public class RateLimitedYoMutableFrameVector3D extends YoMutableFrameVector3D
{
@@ -21,39 +21,39 @@ public class RateLimitedYoMutableFrameVector3D extends YoMutableFrameVector3D
private final FrameVector3D differenceVector = new FrameVector3D();
- private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoVariableRegistry registry)
+ private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry)
{
YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry);
maxRate.set(initialValue);
return maxRate;
}
- public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FrameTuple3DReadOnly rawPosition)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame());
}
- public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame);
}
- public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt,
+ public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt,
FrameTuple3DReadOnly rawPosition)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition,
rawPosition.getReferenceFrame());
}
- public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoVariableRegistry registry, double maxRate, double dt,
+ public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt,
ReferenceFrame referenceFrame)
{
this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame);
}
- private RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoVariableRegistry registry, DoubleProvider maxRate, double dt,
+ private RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt,
FrameTuple3DReadOnly rawPosition, ReferenceFrame referenceFrame)
{
super(namePrefix, nameSuffix, registry, referenceFrame);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoVariable.java
index 3d889b19..60705109 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoVariable.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoVariable.java
@@ -1,7 +1,7 @@
package us.ihmc.robotics.math.filters;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
@@ -16,7 +16,7 @@ public class RateLimitedYoVariable extends YoDouble
private final YoBoolean hasBeenCalled;
- public RateLimitedYoVariable(String name, YoVariableRegistry registry, double maxRate, double dt)
+ public RateLimitedYoVariable(String name, YoRegistry registry, double maxRate, double dt)
{
super(name, registry);
this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry);
@@ -33,7 +33,7 @@ public RateLimitedYoVariable(String name, YoVariableRegistry registry, double ma
reset();
}
- public RateLimitedYoVariable(String name, YoVariableRegistry registry, DoubleProvider maxRateVariable, double dt)
+ public RateLimitedYoVariable(String name, YoRegistry registry, DoubleProvider maxRateVariable, double dt)
{
super(name, registry);
this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry);
@@ -46,7 +46,7 @@ public RateLimitedYoVariable(String name, YoVariableRegistry registry, DoublePro
reset();
}
- public RateLimitedYoVariable(String name, YoVariableRegistry registry, double maxRate, YoDouble positionVariable, double dt)
+ public RateLimitedYoVariable(String name, YoRegistry registry, double maxRate, YoDouble positionVariable, double dt)
{
super(name, registry);
this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry);
@@ -63,7 +63,7 @@ public RateLimitedYoVariable(String name, YoVariableRegistry registry, double ma
reset();
}
- public RateLimitedYoVariable(String name, YoVariableRegistry registry, DoubleProvider maxRateVariable, YoDouble positionVariable, double dt)
+ public RateLimitedYoVariable(String name, YoRegistry registry, DoubleProvider maxRateVariable, YoDouble positionVariable, double dt)
{
super(name, registry);
this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RevisedBacklashCompensatingVelocityYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RevisedBacklashCompensatingVelocityYoVariable.java
index 40f7c194..8fc8a2a4 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RevisedBacklashCompensatingVelocityYoVariable.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RevisedBacklashCompensatingVelocityYoVariable.java
@@ -2,7 +2,7 @@
import us.ihmc.commons.MathTools;
import us.ihmc.yoVariables.providers.DoubleProvider;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
import us.ihmc.yoVariables.variable.YoEnum;
@@ -31,7 +31,7 @@ public class RevisedBacklashCompensatingVelocityYoVariable extends YoDouble impl
private final YoDouble timeSinceSloppy;
public RevisedBacklashCompensatingVelocityYoVariable(String name, String description, DoubleProvider alphaVariable, YoDouble positionVariable,
- double dt, DoubleProvider slopTime, YoVariableRegistry registry)
+ double dt, DoubleProvider slopTime, YoRegistry registry)
{
super(name, description, registry);
@@ -57,7 +57,7 @@ public RevisedBacklashCompensatingVelocityYoVariable(String name, String descrip
}
public RevisedBacklashCompensatingVelocityYoVariable(String name, String description, YoDouble alphaVariable, double dt, YoDouble slopTime,
- YoVariableRegistry registry)
+ YoRegistry registry)
{
super(name, description, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoFrameVector.java
index ebdf4d31..7b328c2d 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoFrameVector.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoFrameVector.java
@@ -3,9 +3,9 @@
import us.ihmc.euclid.referenceFrame.FrameVector3D;
import us.ihmc.euclid.referenceFrame.ReferenceFrame;
import us.ihmc.euclid.tuple3D.Vector3D;
-import us.ihmc.robotics.math.frames.YoFrameVariableNameTools;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
-import us.ihmc.yoVariables.variable.YoFrameVector3D;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D;
+import us.ihmc.yoVariables.registry.YoRegistry;
+import us.ihmc.yoVariables.tools.YoGeometryNameTools;
public class SecondOrderFilteredYoFrameVector extends YoFrameVector3D implements ProcessingYoVariable
{
@@ -21,7 +21,7 @@ private SecondOrderFilteredYoFrameVector(SecondOrderFilteredYoVariable x, Second
this.z = z;
}
- public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry,
+ public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry,
double dt, double naturalFrequencyInHz, double dampingRatio, SecondOrderFilterType filterType, ReferenceFrame referenceFrame)
{
SecondOrderFilteredYoVariableParameters parameters = new SecondOrderFilteredYoVariableParameters(namePrefix + nameSuffix, registry, naturalFrequencyInHz,
@@ -29,17 +29,17 @@ public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameV
return createSecondOrderFilteredYoFrameVector(namePrefix, nameSuffix, registry, dt, parameters, referenceFrame);
}
- public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry,
+ public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry,
double dt, SecondOrderFilteredYoVariableParameters parameters, ReferenceFrame referenceFrame)
{
SecondOrderFilteredYoVariable x, y, z;
- x = new SecondOrderFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, dt, parameters);
- y = new SecondOrderFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, dt, parameters);
- z = new SecondOrderFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, dt, parameters);
+ x = new SecondOrderFilteredYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, dt, parameters);
+ y = new SecondOrderFilteredYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, dt, parameters);
+ z = new SecondOrderFilteredYoVariable(YoGeometryNameTools.createZName(namePrefix, nameSuffix), registry, dt, parameters);
return new SecondOrderFilteredYoFrameVector(x, y, z, referenceFrame);
}
- public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry,
+ public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry,
double dt, double naturalFrequencyInHz, double dampingRatio, SecondOrderFilterType filterType, YoFrameVector3D unfilteredVector)
{
SecondOrderFilteredYoVariableParameters parameters = new SecondOrderFilteredYoVariableParameters(namePrefix + nameSuffix, registry, naturalFrequencyInHz,
@@ -47,13 +47,13 @@ public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameV
return createSecondOrderFilteredYoFrameVector(namePrefix, nameSuffix, registry, dt, parameters, unfilteredVector);
}
- public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameVector(String namePrefix, String nameSuffix, YoVariableRegistry registry,
+ public static SecondOrderFilteredYoFrameVector createSecondOrderFilteredYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry,
double dt, SecondOrderFilteredYoVariableParameters parameters, YoFrameVector3D unfilteredVector)
{
SecondOrderFilteredYoVariable x, y, z;
- x = new SecondOrderFilteredYoVariable(YoFrameVariableNameTools.createXName(namePrefix, nameSuffix), registry, dt, parameters, unfilteredVector.getYoX());
- y = new SecondOrderFilteredYoVariable(YoFrameVariableNameTools.createYName(namePrefix, nameSuffix), registry, dt, parameters, unfilteredVector.getYoY());
- z = new SecondOrderFilteredYoVariable(YoFrameVariableNameTools.createZName(namePrefix, nameSuffix), registry, dt, parameters, unfilteredVector.getYoZ());
+ x = new SecondOrderFilteredYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, dt, parameters, unfilteredVector.getYoX());
+ y = new SecondOrderFilteredYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, dt, parameters, unfilteredVector.getYoY());
+ z = new SecondOrderFilteredYoVariable(YoGeometryNameTools.createZName(namePrefix, nameSuffix), registry, dt, parameters, unfilteredVector.getYoZ());
return new SecondOrderFilteredYoFrameVector(x, y, z, unfilteredVector.getReferenceFrame());
}
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoVariableParameters.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoVariableParameters.java
index 8c3cac60..d40f88c9 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoVariableParameters.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SecondOrderFilteredYoVariableParameters.java
@@ -1,6 +1,6 @@
package us.ihmc.robotics.math.filters;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoDouble;
public class SecondOrderFilteredYoVariableParameters
@@ -9,7 +9,7 @@ public class SecondOrderFilteredYoVariableParameters
private final YoDouble dampingRatio;
private final SecondOrderFilterType filterType;
- public SecondOrderFilteredYoVariableParameters(String name, YoVariableRegistry registry, double naturalFrequencyInHz, double dampingRatio,
+ public SecondOrderFilteredYoVariableParameters(String name, YoRegistry registry, double naturalFrequencyInHz, double dampingRatio,
SecondOrderFilterType filterType)
{
this.naturalFrequencyInHz = new YoDouble(name + "NaturalFrequency", registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoFrameVector.java
index 087ad981..efe57e2a 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoFrameVector.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoFrameVector.java
@@ -1,14 +1,11 @@
package us.ihmc.robotics.math.filters;
-import static us.ihmc.robotics.math.frames.YoFrameVariableNameTools.createXName;
-import static us.ihmc.robotics.math.frames.YoFrameVariableNameTools.createYName;
-import static us.ihmc.robotics.math.frames.YoFrameVariableNameTools.createZName;
-
import us.ihmc.euclid.referenceFrame.FrameVector3D;
import us.ihmc.euclid.referenceFrame.ReferenceFrame;
import us.ihmc.euclid.tuple3D.Vector3D;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
-import us.ihmc.yoVariables.variable.YoFrameVector3D;
+import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D;
+import us.ihmc.yoVariables.registry.YoRegistry;
+import us.ihmc.yoVariables.tools.YoGeometryNameTools;
public class SimpleMovingAverageFilteredYoFrameVector extends YoFrameVector3D implements ProcessingYoVariable
{
@@ -25,11 +22,11 @@ private SimpleMovingAverageFilteredYoFrameVector(SimpleMovingAverageFilteredYoVa
}
public static SimpleMovingAverageFilteredYoFrameVector createSimpleMovingAverageFilteredYoFrameVector(String namePrefix, String nameSuffix, int windowSize,
- ReferenceFrame referenceFrame, YoVariableRegistry registry)
+ ReferenceFrame referenceFrame, YoRegistry registry)
{
- String xName = createXName(namePrefix, nameSuffix);
- String yName = createYName(namePrefix, nameSuffix);
- String zName = createZName(namePrefix, nameSuffix);
+ String xName = YoGeometryNameTools.createXName(namePrefix, nameSuffix);
+ String yName = YoGeometryNameTools.createYName(namePrefix, nameSuffix);
+ String zName = YoGeometryNameTools.createZName(namePrefix, nameSuffix);
SimpleMovingAverageFilteredYoVariable x = new SimpleMovingAverageFilteredYoVariable(xName, windowSize, registry);
SimpleMovingAverageFilteredYoVariable y = new SimpleMovingAverageFilteredYoVariable(yName, windowSize, registry);
@@ -39,11 +36,11 @@ public static SimpleMovingAverageFilteredYoFrameVector createSimpleMovingAverage
}
public static SimpleMovingAverageFilteredYoFrameVector createSimpleMovingAverageFilteredYoFrameVector(String namePrefix, String nameSuffix, int windowSize,
- YoFrameVector3D unfilteredVector, YoVariableRegistry registry)
+ YoFrameVector3D unfilteredVector, YoRegistry registry)
{
- String xName = createXName(namePrefix, nameSuffix);
- String yName = createYName(namePrefix, nameSuffix);
- String zName = createZName(namePrefix, nameSuffix);
+ String xName = YoGeometryNameTools.createXName(namePrefix, nameSuffix);
+ String yName = YoGeometryNameTools.createYName(namePrefix, nameSuffix);
+ String zName = YoGeometryNameTools.createZName(namePrefix, nameSuffix);
SimpleMovingAverageFilteredYoVariable x = new SimpleMovingAverageFilteredYoVariable(xName, windowSize, unfilteredVector.getYoX(), registry);
SimpleMovingAverageFilteredYoVariable y = new SimpleMovingAverageFilteredYoVariable(yName, windowSize, unfilteredVector.getYoY(), registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoVariable.java
index 17d7cfef..f3945330 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoVariable.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/SimpleMovingAverageFilteredYoVariable.java
@@ -3,7 +3,7 @@
import org.ejml.data.DMatrixRMaj;
import org.ejml.dense.row.CommonOps_DDRM;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoDouble;
import us.ihmc.yoVariables.variable.YoInteger;
@@ -20,12 +20,12 @@ public class SimpleMovingAverageFilteredYoVariable extends YoDouble
private boolean bufferHasBeenFilled = false;
- public SimpleMovingAverageFilteredYoVariable(String name, int windowSize, YoVariableRegistry registry)
+ public SimpleMovingAverageFilteredYoVariable(String name, int windowSize, YoRegistry registry)
{
this(name, windowSize, null, registry);
}
- public SimpleMovingAverageFilteredYoVariable(String name, int windowSize, YoDouble yoVariableToFilter, YoVariableRegistry registry)
+ public SimpleMovingAverageFilteredYoVariable(String name, int windowSize, YoDouble yoVariableToFilter, YoRegistry registry)
{
super(name, registry);
diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/frames/YoMatrix.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/frames/YoMatrix.java
index 9d9e08b8..f42d60a8 100644
--- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/frames/YoMatrix.java
+++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/frames/YoMatrix.java
@@ -2,7 +2,7 @@
import org.ejml.data.DMatrixRMaj;
-import us.ihmc.yoVariables.registry.YoVariableRegistry;
+import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoDouble;
import us.ihmc.yoVariables.variable.YoInteger;
@@ -21,7 +21,7 @@ public class YoMatrix
private final YoInteger numberOfRows, numberOfColumns;
private final YoDouble[][] variables;
- public YoMatrix(String name, int maxNumberOfRows, int maxNumberOfColumns, YoVariableRegistry registry)
+ public YoMatrix(String name, int maxNumberOfRows, int maxNumberOfColumns, YoRegistry registry)
{
this.maxNumberOfRows = maxNumberOfRows;
this.maxNumberOfColumns = maxNumberOfColumns;
From 4cfe0e5b47717a23ef6f4f39190ae281c9b184bb Mon Sep 17 00:00:00 2001
From: Sylvain Bertrand
+ * vel_{n} = alpha * vel{n-1} + (1 - alpha) * (pos_{n} - pos_{n-1}) + *+ * * @author IHMC Biped Team * @version 1.0 */ From f4333a95b1ec40a153653776607fdbc9787e7c00 Mon Sep 17 00:00:00 2001 From: Sylvain Bertrand
+ * NOTE: This method does not solve for the filtered value. To solve for the filtered value, use {@link #solve()}. + *
+ * + * @param current the current value of the matrix to be filtered. Not modified. + */ + @Override + public void set(DMatrix current) + { + super.set(current); + this.current.set(current); + } + + /** + * Assuming that the current value has been set, this method solves for the filtered value. + *+ * See {@link #set(DMatrix)} for how to set the matrix's current value. + *
+ */ + public void solve() + { + filtered.set(previous); + CommonOps_DDRM.scale(alpha.getDoubleValue(), filtered); + + super.get(current); + CommonOps_DDRM.addEquals(filtered, 1 - alpha.getDoubleValue(), current); + + // Set the previous value to be the output of the filter, so it can be used next time + previous.set(filtered); + super.set(filtered); + } + + /** + * Set the current value of the matrix to be filtered and solve for the filtered value. + * + * @param current the current value of the matrix to be filtered. Not modified. + */ + public void setAndSolve(DMatrix current) + { + filtered.set(previous); + CommonOps_DDRM.scale(alpha.getDoubleValue(), filtered); + + super.set(current); + this.current.set(current); + CommonOps_DDRM.addEquals(filtered, 1 - alpha.getDoubleValue(), this.current); + + // Set the previous value to be the output of the filter, so it can be used next time + previous.set(filtered); + super.set(filtered); + } +} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/frames/YoMatrix.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/frames/YoMatrix.java index 8585174b..1ebf58e5 100644 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/frames/YoMatrix.java +++ b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/frames/YoMatrix.java @@ -1,7 +1,6 @@ package us.ihmc.robotics.math.frames; import org.ejml.data.*; - import org.ejml.ops.MatrixIO; import us.ihmc.yoVariables.registry.YoRegistry; import us.ihmc.yoVariables.variable.YoDouble; @@ -12,7 +11,7 @@ * maximum number of rows and columns and an actual number of rows and columns. If you set with a * smaller matrix, then the actual size will be the size of the passed in matrix. extra entries will * be set to NaN. If you get the contents the matrix you pack must be the correct size. - * + * * @author JerryPratt */ public class YoMatrix implements DMatrix, ReshapeMatrix @@ -72,20 +71,21 @@ public YoMatrix(String name, String description, int maxNumberOfRows, int maxNum { case NONE: { - variables[row][column] = new YoDouble(name + "_" + row + "_" + column, description, registry); // names are simply the row and column indices + variables[row][column] = new YoDouble(name + row + column, description, registry); // names are simply the row and column indices break; } case ROWS: { if (maxNumberOfColumns > 1) - throw new IllegalArgumentException("The YoMatrix must be a column vector if only row names are provided, else unique names cannot be generated."); + throw new IllegalArgumentException( + "The YoMatrix must be a column vector if only row names are provided, else unique names cannot be generated."); - variables[row][column] = new YoDouble(name + "_" + rowNames[row], description, registry); // names are the row names, no column identifier + variables[row][column] = new YoDouble(name + rowNames[row], description, registry); // names are the row names, no column identifier break; } case ROWS_AND_COLUMNS: { - variables[row][column] = new YoDouble(name + "_" + rowNames[row] + "_" + columnNames[column], description, registry); // names are the row and column names + variables[row][column] = new YoDouble(name + rowNames[row] + columnNames[column], description, registry); // names are the row and column names break; } } @@ -187,10 +187,9 @@ public- * NOTE: This method does not solve for the filtered value. To solve for the filtered value, use {@link #solve()}. - *
- * - * @param current the current value of the matrix to be filtered. Not modified. - */ - @Override - public void set(DMatrix current) - { - super.set(current); - this.current.set(current); - } - - /** - * Assuming that the current value has been set, this method solves for the filtered value. - *- * See {@link #set(DMatrix)} for how to set the matrix's current value. - *
- */ - public void solve() - { - CommonOps_DDRM.scale(alpha.getDoubleValue(), previous, filtered); - - super.get(current); - CommonOps_DDRM.addEquals(filtered, 1 - alpha.getDoubleValue(), current); - - // Set the previous value to be the output of the filter, so it can be used next time - previous.set(filtered); - super.set(filtered); - } - - /** - * Set the current value of the matrix to be filtered and solve for the filtered value. - * - * @param current the current value of the matrix to be filtered. Not modified. - */ - public void setAndSolve(DMatrix current) - { - CommonOps_DDRM.scale(alpha.getDoubleValue(), previous, filtered); - - super.set(current); - this.current.set(current); - CommonOps_DDRM.addEquals(filtered, 1 - alpha.getDoubleValue(), this.current); - - // Set the previous value to be the output of the filter, so it can be used next time - previous.set(filtered); - super.set(filtered); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoVariable.java deleted file mode 100644 index 6da82cc5..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AlphaFilteredYoVariable.java +++ /dev/null @@ -1,181 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.commons.MathTools; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -/** - * @author jrebula - * - *- * LittleDogVersion06: - * us.ihmc.LearningLocomotion.Version06.util.YoAlphaFilteredVariable, - * 9:34:00 AM, Aug 29, 2006 - *
= - *- * A YoAlphaFilteredVariable is a filtered version of an input YoVar. - * Either a YoVariable holding the unfiltered val is passed in to the - * constructor and update() is called every tick, or update(double) is - * called every tick. The YoAlphaFilteredVariable updates it's val - * with the current filtered version using - *
- *- * filtered_{n} = alpha * filtered_{n-1} + (1 - alpha) * raw_{n} - *- * - * For alpha=0 -> no filtered - * For alpha=1 -> 100% filtered, no use of raw signal - */ -public class AlphaFilteredYoVariable extends YoDouble implements ProcessingYoVariable -{ - private final DoubleProvider alphaVariable; - - private final YoDouble position; - protected final YoBoolean hasBeenCalled; - - public static DoubleProvider createAlphaYoDouble(String namePrefix, double initialValue, YoRegistry registry) - { - YoDouble maxRate = new YoDouble(namePrefix + "AlphaVariable", registry); - maxRate.set(initialValue); - return maxRate; - } - - public AlphaFilteredYoVariable(String name, YoRegistry registry, double alpha) - { - this(name, registry, alpha, null); - } - - public AlphaFilteredYoVariable(String name, YoRegistry registry, double alpha, YoDouble positionVariable) - { - this(name, "", registry, createAlphaYoDouble(name, alpha, registry), positionVariable); - } - - public AlphaFilteredYoVariable(String name, YoRegistry registry, DoubleProvider alphaVariable) - { - this(name, "", registry, alphaVariable, null); - } - - public AlphaFilteredYoVariable(String name, String description, YoRegistry registry, DoubleProvider alphaVariable) - { - this(name, description, registry, alphaVariable, null); - } - - public AlphaFilteredYoVariable(String name, YoRegistry registry, DoubleProvider alphaVariable, YoDouble positionVariable) - { - this(name, "", registry, alphaVariable, positionVariable); - } - - public AlphaFilteredYoVariable(String name, String description, YoRegistry registry, DoubleProvider alphaVariable, YoDouble positionVariable) - { - super(name, description, registry); - this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", description, registry); - this.position = positionVariable; - - if (alphaVariable == null) - alphaVariable = createAlphaYoDouble(name, 0.0, registry); - this.alphaVariable = alphaVariable; - if(alphaVariable instanceof YoDouble) - { - this.yoAlphaVariable = (YoDouble) alphaVariable; - } - else - { - this.yoAlphaVariable = null; - } - - reset(); - } - - @Override - public void reset() - { - hasBeenCalled.set(false); - } - - @Override - public void update() - { - if (position == null) - { - throw new NullPointerException("YoAlphaFilteredVariable must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - update(position.getDoubleValue()); - } - - public void update(double currentPosition) - { - if (!hasBeenCalled.getBooleanValue()) - { - hasBeenCalled.set(true); - set(currentPosition); - } - else - { - double alpha = alphaVariable.getValue(); - set(alpha * getDoubleValue() + (1.0 - alpha) * currentPosition); - } - } - - /** - * This method is replaced by computeAlphaGivenBreakFrequencyProperly. It is fine to keep using this method is currently using it, knowing that - * the actual break frequency is not exactly what you are asking for. - * - * @param breakFrequencyInHertz - * @param dt - * @return - */ - @Deprecated - public static double computeAlphaGivenBreakFrequency(double breakFrequencyInHertz, double dt) - { - if (Double.isInfinite(breakFrequencyInHertz)) - return 0.0; - - double alpha = 1.0 - breakFrequencyInHertz * 2.0 * Math.PI * dt; - - alpha = MathTools.clamp(alpha, 0.0, 1.0); - - return alpha; - } - - public static double computeAlphaGivenBreakFrequencyProperly(double breakFrequencyInHertz, double dt) - { - if (Double.isInfinite(breakFrequencyInHertz)) - return 0.0; - - double omega = 2.0 * Math.PI * breakFrequencyInHertz; - double alpha = (1.0 - omega * dt / 2.0) / (1.0 + omega * dt / 2.0); - alpha = MathTools.clamp(alpha, 0.0, 1.0); - return alpha; - } - - public static double computeBreakFrequencyGivenAlpha(double alpha, double dt) - { - return (1.0 - alpha) / (Math.PI * dt * (1.0 + alpha)); - } - - public static void main(String[] args) - { - double dt = 1 / 1e3; - - for (double i = 2; i < 1.0 / dt; i = i * 1.2) - { - double alpha = computeAlphaGivenBreakFrequency(i, dt); - double alphaProperly = computeAlphaGivenBreakFrequencyProperly(i, dt); - System.out.println("freq=" + i + ", alpha=" + alpha + ", alphaProperly=" + alphaProperly); - } - - System.out.println(computeBreakFrequencyGivenAlpha(0.8, 0.006)); - System.out.println(computeAlphaGivenBreakFrequencyProperly(20, 0.006)); - System.out.println(computeAlphaGivenBreakFrequencyProperly(20, 0.003)); - } - - public boolean getHasBeenCalled() - { - return hasBeenCalled.getBooleanValue(); - } - -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AverageYoDouble.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AverageYoDouble.java deleted file mode 100644 index d42f5774..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AverageYoDouble.java +++ /dev/null @@ -1,52 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoDouble; -import us.ihmc.yoVariables.variable.YoInteger; - -public class AverageYoDouble extends YoDouble -{ - private final YoInteger sampleSize; - private final DoubleProvider dataSource; - - public AverageYoDouble(String name, YoRegistry registry) - { - this(name, null, registry); - } - - public AverageYoDouble(String name, DoubleProvider dataSource, YoRegistry registry) - { - super(name, registry); - - this.dataSource = dataSource; - sampleSize = new YoInteger(name + "SampleSize", registry); - } - - public void update() - { - if (dataSource == null) - { - throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " - + "dataSource variable to call update(), otherwise use update(double)"); - } - - update(dataSource.getValue()); - } - - public void update(double dataSource) - { - sampleSize.increment(); - add((dataSource - getValue()) / sampleSize.getValue()); - } - - public void reset() - { - sampleSize.set(0); - } - - public int getSampleSize() - { - return sampleSize.getValue(); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AverageYoFrameVector3D.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AverageYoFrameVector3D.java deleted file mode 100644 index d7197689..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/AverageYoFrameVector3D.java +++ /dev/null @@ -1,78 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; -import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.tools.YoGeometryNameTools; -import us.ihmc.yoVariables.variable.YoInteger; - -public class AverageYoFrameVector3D extends YoFrameVector3D -{ - private final YoInteger sampleSize; - private final Tuple3DReadOnly dataSource; - - public AverageYoFrameVector3D(String namePrefix, ReferenceFrame referenceFrame, YoRegistry registry) - { - this(namePrefix, "", registry, referenceFrame, null); - } - - public AverageYoFrameVector3D(String namePrefix, String nameSuffix, ReferenceFrame referenceFrame, YoRegistry registry) - { - this(namePrefix, nameSuffix, registry, referenceFrame, null); - } - - public AverageYoFrameVector3D(String namePrefix, YoRegistry registry, FrameTuple3DReadOnly dataSource) - { - this(namePrefix, "", registry, dataSource.getReferenceFrame(), dataSource); - } - - public AverageYoFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, FrameTuple3DReadOnly dataSource) - { - this(namePrefix, nameSuffix, registry, dataSource.getReferenceFrame(), dataSource); - } - - private AverageYoFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, ReferenceFrame referenceFrame, Tuple3DReadOnly dataSource) - { - super(namePrefix, nameSuffix, referenceFrame, registry); - - this.dataSource = dataSource; - - sampleSize = new YoInteger(YoGeometryNameTools.assembleName(namePrefix, "sampleSize", nameSuffix), registry); - } - - public void update() - { - update(dataSource); - } - - public void update(Tuple3DReadOnly vectorSource) - { - update(vectorSource.getX(), vectorSource.getY(), vectorSource.getZ()); - } - - public void update(FrameTuple3DReadOnly vectorSource) - { - checkReferenceFrameMatch(vectorSource); - update((Tuple3DReadOnly) vectorSource); - } - - public void update(double xSource, double ySource, double zSource) - { - sampleSize.increment(); - setX(getX() + (xSource - getX()) / sampleSize.getValue()); - setY(getY() + (ySource - getY()) / sampleSize.getValue()); - setZ(getZ() + (zSource - getZ()) / sampleSize.getValue()); - } - - public void reset() - { - sampleSize.set(0); - } - - public int getSampleSize() - { - return sampleSize.getValue(); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoFrameVector.java deleted file mode 100644 index ce05ef8b..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoFrameVector.java +++ /dev/null @@ -1,77 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.euclid.referenceFrame.YoFramePoint3D; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.tools.YoGeometryNameTools; -import us.ihmc.yoVariables.variable.YoDouble; - -public class BacklashCompensatingVelocityYoFrameVector extends YoFrameVector3D -{ - private final BacklashCompensatingVelocityYoVariable xDot, yDot, zDot; - - public static BacklashCompensatingVelocityYoFrameVector createBacklashCompensatingVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, YoDouble slopTime, - YoRegistry registry, YoFrameVector3D yoFrameVectorToDifferentiate) - { - BacklashCompensatingVelocityYoVariable xDot = new BacklashCompensatingVelocityYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), "", alpha, yoFrameVectorToDifferentiate.getYoX(), dt, slopTime, - registry); - BacklashCompensatingVelocityYoVariable yDot = new BacklashCompensatingVelocityYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), "", alpha, yoFrameVectorToDifferentiate.getYoY(), dt, slopTime, - registry); - BacklashCompensatingVelocityYoVariable zDot = new BacklashCompensatingVelocityYoVariable(YoGeometryNameTools.createZName(namePrefix, nameSuffix), "", alpha, yoFrameVectorToDifferentiate.getYoZ(), dt, slopTime, - registry); - - BacklashCompensatingVelocityYoFrameVector ret = new BacklashCompensatingVelocityYoFrameVector(xDot, yDot, zDot, registry, yoFrameVectorToDifferentiate); - - return ret; - } - - public static BacklashCompensatingVelocityYoFrameVector createBacklashCompensatingVelocityYoFrameVector(String namePrefix, String nameSuffix, YoDouble alpha, double dt, YoDouble slopTime, - YoRegistry registry, YoFramePoint3D yoFramePointToDifferentiate) - { - BacklashCompensatingVelocityYoVariable xDot = new BacklashCompensatingVelocityYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), "", alpha, yoFramePointToDifferentiate.getYoX(), dt, slopTime, - registry); - BacklashCompensatingVelocityYoVariable yDot = new BacklashCompensatingVelocityYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), "", alpha, yoFramePointToDifferentiate.getYoY(), dt, slopTime, - registry); - BacklashCompensatingVelocityYoVariable zDot = new BacklashCompensatingVelocityYoVariable(YoGeometryNameTools.createZName(namePrefix, nameSuffix), "", alpha, yoFramePointToDifferentiate.getYoZ(), dt, slopTime, - registry); - - BacklashCompensatingVelocityYoFrameVector ret = new BacklashCompensatingVelocityYoFrameVector(xDot, yDot, zDot, registry, yoFramePointToDifferentiate); - - return ret; - } - - private BacklashCompensatingVelocityYoFrameVector(BacklashCompensatingVelocityYoVariable xDot, BacklashCompensatingVelocityYoVariable yDot, BacklashCompensatingVelocityYoVariable zDot, - YoRegistry registry, YoFrameVector3D yoFrameVectorToDifferentiate) - { - super(xDot, yDot, zDot, yoFrameVectorToDifferentiate.getReferenceFrame()); - - this.xDot = xDot; - this.yDot = yDot; - this.zDot = zDot; - } - - private BacklashCompensatingVelocityYoFrameVector(BacklashCompensatingVelocityYoVariable xDot, BacklashCompensatingVelocityYoVariable yDot, BacklashCompensatingVelocityYoVariable zDot, - YoRegistry registry, YoFramePoint3D yoFramePointToDifferentiate) - { - super(xDot, yDot, zDot, yoFramePointToDifferentiate.getReferenceFrame()); - - this.xDot = xDot; - this.yDot = yDot; - this.zDot = zDot; - } - - public void update() - { - xDot.update(); - yDot.update(); - zDot.update(); - } - - public void reset() - { - xDot.reset(); - yDot.reset(); - zDot.reset(); - } - -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoVariable.java deleted file mode 100644 index 81354164..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/BacklashCompensatingVelocityYoVariable.java +++ /dev/null @@ -1,242 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.commons.MathTools; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; -import us.ihmc.yoVariables.variable.YoEnum; - -public class BacklashCompensatingVelocityYoVariable extends YoDouble implements ProcessingYoVariable -{ - private final double dt; - - private final YoDouble alphaVariable; - private final YoDouble position; - - private final YoDouble lastPosition; - private final YoBoolean hasBeenCalled; - - private final YoEnum
- *
- *- * A BetaFilteredYoVariable is a filtered version of an input YoVar. - * Either a YoVariable holding the unfiltered val is passed in to the - * constructor and update() is called every tick, or update(double) is - * called every tick. The BetaFilteredYoVariable updates it's val - * with the current filtered version using - *
- *- * filtered_{n} = (raw_{0} + ... + raw_{n-1} + raw_{n}) / n - *- */ -public class BetaFilteredYoVariable extends YoDouble -{ - private int beta; - private int index = 0; - @SuppressWarnings("unused") - private final YoDouble betaVariable; - - private final YoDouble position; - - private static double raw[]; - - private final YoBoolean hasBeenCalled; - - public BetaFilteredYoVariable(String name, YoRegistry registry, int beta) - { - this(name, "", registry, beta, null); - } - - public BetaFilteredYoVariable(String name, String description, YoRegistry registry, int beta) - { - this(name, description, registry, beta, null); - } - - public BetaFilteredYoVariable(String name, YoRegistry registry, int beta, YoDouble positionVariable) - { - this(name, "", registry, beta, positionVariable); - } - - public BetaFilteredYoVariable(String name, String description, YoRegistry registry, int beta, YoDouble positionVariable) - { - super(name, description, registry); - this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); - - this.beta = beta; - this.position = positionVariable; - this.betaVariable = null; - - raw = new double[beta]; - - reset(); - } - - public void reset() - { - hasBeenCalled.set(false); - - for (int i = 0; i < beta; i++) - { - set(0.0); - } - } - - public void update() - { - if (position == null) - { - throw new NullPointerException("BetaFilteredYoVariable must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - update(position.getDoubleValue()); - } - public void update(double currentPosition) - { - if (!hasBeenCalled.getBooleanValue()) - { - hasBeenCalled.set(true); - set(currentPosition); - } - - raw[index++] = currentPosition; - if (index == beta) - index = 0; - set(0.0); - - for (int i = 0; i < beta; i++) - { - set(getDoubleValue() + raw[i]); - } - - set(getDoubleValue() / beta); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoFrameVector.java deleted file mode 100644 index 419f806b..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoFrameVector.java +++ /dev/null @@ -1,72 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameTuple3D; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.tools.YoGeometryNameTools; -import us.ihmc.yoVariables.variable.YoDouble; - -public class DeadzoneYoFrameVector extends YoFrameVector3D implements ProcessingYoVariable -{ - private final DeadzoneYoVariable x, y, z; - - private DeadzoneYoFrameVector(DeadzoneYoVariable x, DeadzoneYoVariable y, DeadzoneYoVariable z, ReferenceFrame referenceFrame) - { - super(x, y, z, referenceFrame); - - this.x = x; - this.y = y; - this.z = z; - } - - public static DeadzoneYoFrameVector createDeadzoneYoFrameVector(String namePrefix, YoRegistry registry, YoDouble deadzoneSize, ReferenceFrame referenceFrame) - { - return createDeadzoneYoFrameVector(namePrefix, "", registry, deadzoneSize, referenceFrame); - } - - public static DeadzoneYoFrameVector createDeadzoneYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, YoDouble deadzoneSize, ReferenceFrame referenceFrame) - { - DeadzoneYoVariable x = new DeadzoneYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), deadzoneSize, registry); - DeadzoneYoVariable y = new DeadzoneYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), deadzoneSize, registry); - DeadzoneYoVariable z = new DeadzoneYoVariable(YoGeometryNameTools.createZName(namePrefix, nameSuffix), deadzoneSize, registry); - - DeadzoneYoFrameVector ret = new DeadzoneYoFrameVector(x, y, z, referenceFrame); - - return ret; - } - - public static DeadzoneYoFrameVector createDeadzoneYoFrameVector(String namePrefix, YoRegistry registry, YoDouble deadzoneSize, YoFrameTuple3D rawTuple) - { - return createDeadzoneYoFrameVector(namePrefix, "", registry, deadzoneSize, rawTuple); - } - - public static DeadzoneYoFrameVector createDeadzoneYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, YoDouble deadzoneSize, YoFrameTuple3D rawTuple) - { - DeadzoneYoVariable x = new DeadzoneYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), rawTuple.getYoX(), deadzoneSize, registry); - DeadzoneYoVariable y = new DeadzoneYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), rawTuple.getYoY(), deadzoneSize, registry); - DeadzoneYoVariable z = new DeadzoneYoVariable(YoGeometryNameTools.createZName(namePrefix, nameSuffix), rawTuple.getYoZ(), deadzoneSize, registry); - - DeadzoneYoFrameVector ret = new DeadzoneYoFrameVector(x, y, z, rawTuple.getReferenceFrame()); - - return ret; - } - - @Override - public void update() - { - x.update(); - y.update(); - z.update(); - } - - public void update(FrameTuple3DReadOnly frameTuple) - { - checkReferenceFrameMatch(frameTuple); - - x.update(frameTuple.getX()); - y.update(frameTuple.getY()); - z.update(frameTuple.getZ()); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoVariable.java deleted file mode 100644 index c7e93205..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeadzoneYoVariable.java +++ /dev/null @@ -1,69 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoDouble; - -public class DeadzoneYoVariable extends YoDouble implements ProcessingYoVariable -{ - private final YoDouble deadzoneSize; - private final YoDouble inputVariable; - - public DeadzoneYoVariable(String name, YoDouble deadzoneSize, YoRegistry registry) - { - super(name, registry); - this.inputVariable = null; - this.deadzoneSize = deadzoneSize; - } - - public DeadzoneYoVariable(String name, YoDouble inputVariable, YoDouble deadzoneSize, YoRegistry registry) - { - super(name, registry); - this.inputVariable = inputVariable; - this.deadzoneSize = deadzoneSize; - } - - public void update() - { - if (inputVariable == null) - throw new NullPointerException("DeadzoneYoVariable must be constructed with a non null " - + "input variable to call update(), otherwise use update(double)"); - update(inputVariable.getDoubleValue()); - } - - public void update(double valueToBeCorrected) - { - if (valueToBeCorrected >= deadzoneSize.getDoubleValue()) - { - super.set(valueToBeCorrected - deadzoneSize.getDoubleValue()); - } - else if (valueToBeCorrected <= -deadzoneSize.getDoubleValue()) - { - super.set(valueToBeCorrected + deadzoneSize.getDoubleValue()); - } - else - { - super.set(0.0); - } - } - - public static void main(String[] args) - { - YoRegistry registry = new YoRegistry("test"); - YoDouble deadzoneSize = new YoDouble("deadzoneSize", registry); - YoDouble input = new YoDouble("input", registry); - deadzoneSize.set(2.0); - DeadzoneYoVariable testDeadzone = new DeadzoneYoVariable("testDeadZone", input,deadzoneSize,registry); - - for(int i = -50; i < 51; i++) - { - input.set((double)i); - testDeadzone.update(); - System.out.println("//////////////////////////"); - System.out.println("uncorrected = " + (double)i); - System.out.println("corrected = " + testDeadzone.getDoubleValue()); - } - - System.out.println("done"); - } - -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoBoolean.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoBoolean.java deleted file mode 100644 index 0d7c554f..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoBoolean.java +++ /dev/null @@ -1,68 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; - -public class DelayedYoBoolean extends YoBoolean -{ - private final YoBoolean variableToDelay; - - private final YoBoolean[] previousYoVariables; - - public DelayedYoBoolean(String name, String description, YoBoolean variableToDelay, int ticksToDelay, YoRegistry registry) - { - super(name, description, registry); - - this.variableToDelay = variableToDelay; - previousYoVariables = new YoBoolean[ticksToDelay]; - - for (int i = 0; i < ticksToDelay; i++) - { - previousYoVariables[i] = new YoBoolean(name + "_previous" + i, registry); - previousYoVariables[i].set(variableToDelay.getBooleanValue()); - } - - this.set(variableToDelay.getBooleanValue()); - } - - public void update() - { - if (previousYoVariables.length == 0) - { - this.set(variableToDelay.getBooleanValue()); - return; - } - - this.set(previousYoVariables[0].getBooleanValue()); - - for (int i = 0; i < previousYoVariables.length - 1; i++) - { - previousYoVariables[i].set(previousYoVariables[i + 1].getBooleanValue()); - } - - previousYoVariables[previousYoVariables.length - 1].set(variableToDelay.getBooleanValue()); - } - - public void reset() - { - for (YoBoolean var : previousYoVariables) - { - var.set(variableToDelay.getBooleanValue()); - } - this.set(variableToDelay.getBooleanValue()); - } - - void getInternalState(String inputString, Boolean ifDebug) - { - if (!ifDebug) - return; - - String string = inputString + "\nvalue = " + this.getBooleanValue() + "\n"; - for (int i = 0; i < previousYoVariables.length; i++) - { - string = string + i + " = " + previousYoVariables[i].getBooleanValue() + "\n"; - } - string = string + "variableToDelay = " + variableToDelay.getBooleanValue() + "\n"; - System.out.println(string); - } -} \ No newline at end of file diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoDouble.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoDouble.java deleted file mode 100644 index 55da3af5..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DelayedYoDouble.java +++ /dev/null @@ -1,55 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoDouble; - -public class DelayedYoDouble extends YoDouble -{ - private final DoubleProvider variableToDelay; - - private final YoDouble[] previousYoVariables; - - public DelayedYoDouble(String name, String description, DoubleProvider variableToDelay, int ticksToDelay, YoRegistry registry) - { - super(name, description, registry); - - this.variableToDelay = variableToDelay; - previousYoVariables = new YoDouble[ticksToDelay]; - - for (int i = 0; i < ticksToDelay; i++) - { - previousYoVariables[i] = new YoDouble(name + "_previous" + i, registry); - previousYoVariables[i].set(variableToDelay.getValue()); - } - - this.set(variableToDelay.getValue()); - } - - public void update() - { - if (previousYoVariables.length == 0) - { - this.set(variableToDelay.getValue()); - return; - } - - this.set(previousYoVariables[0].getValue()); - - for (int i = 0; i < previousYoVariables.length - 1; i++) - { - previousYoVariables[i].set(previousYoVariables[i + 1].getValue()); - } - - previousYoVariables[previousYoVariables.length - 1].set(variableToDelay.getValue()); - } - - public void reset() - { - for (YoDouble var : previousYoVariables) - { - var.set(variableToDelay.getValue()); - } - this.set(variableToDelay.getValue()); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeltaLimitedYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeltaLimitedYoVariable.java deleted file mode 100644 index 5bd56a4c..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/DeltaLimitedYoVariable.java +++ /dev/null @@ -1,69 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -/** - * - * @author Doug Stephen (dstephen@ihmc.us) - */ -public class DeltaLimitedYoVariable extends YoDouble -{ - private final YoDouble maxDelta; - private final YoDouble actual; - private final YoDouble desired; - private final YoBoolean isLimitingActive; - - public DeltaLimitedYoVariable(String name, YoRegistry registry, double maxDelta) - { - super(name, registry); - - this.maxDelta = new YoDouble(name + "MaxAllowedDelta", registry); - this.maxDelta.set(Math.abs(maxDelta)); - this.actual = new YoDouble(name + "Actual", registry); - this.desired = new YoDouble(name + "Desired", registry); - this.isLimitingActive = new YoBoolean(name + "IsLimitingActive", registry); - isLimitingActive.set(false); - } - - public void setMaxDelta(double maxDelta) - { - this.maxDelta.set(Math.abs(maxDelta)); - } - - public void updateOutput(double actual, double desired) - { - this.desired.set(desired); - this.actual.set(actual); - updateOutput(); - } - - public boolean isLimitingActive() - { - return isLimitingActive.getBooleanValue(); - } - - private void updateOutput() - { - double actualDoubleValue = actual.getDoubleValue(); - double desiredDoubleValue = desired.getDoubleValue(); - double maxDeltaDoubleValue = Math.abs(maxDelta.getDoubleValue()); - double rawDelta = actualDoubleValue - desiredDoubleValue; - double sign = Math.signum(rawDelta); - double requestedDelta = Math.abs(rawDelta); - double overshoot = maxDeltaDoubleValue - requestedDelta; - - if(overshoot < 0) - { - desiredDoubleValue = actualDoubleValue - maxDeltaDoubleValue * sign; - isLimitingActive.set(true); - } - else - { - isLimitingActive.set(false); - } - - this.set(desiredDoubleValue); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredDiscreteVelocityYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredDiscreteVelocityYoVariable.java deleted file mode 100644 index 6a0ba403..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredDiscreteVelocityYoVariable.java +++ /dev/null @@ -1,201 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoDouble; -import us.ihmc.yoVariables.variable.YoEnum; - -/** - * @author jrebula - *
- * A YoFilteredVelocityVariable is a filtered velocity of a position. - * Either a YoVariable holding the position is passed in to the - * constructor and update() is called every tick, or update(double) is - * called every tick. The YoFilteredVelocityVariable updates it's val - * with the current velocity after a filter of - *
- * - *- * vel_{n} = alpha * vel{n-1} + (1 - alpha) * (pos_{n} - pos_{n-1}) - *- * - */ -public class FilteredDiscreteVelocityYoVariable extends YoDouble -{ - private final double alpha; - - private final YoDouble time; - - private final YoDouble alphaVariable; - private final YoDouble position; - - private final YoDouble lastUpdateTime; - private final YoEnum
- * FilteredVelocityYoFrameVector - *
- * - *- * Differentiates and Filters a YoFrameVector to get its derivative. - *
- * - *- * IHMC - *
- * - *- * vel_{n} = alpha * vel{n-1} + (1 - alpha) * (pos_{n} - pos_{n-1}) - *- * - * @author IHMC Biped Team - * @version 1.0 - */ -public class FilteredVelocityYoFrameVector extends YoFrameVector3D -{ - private final double dt; - private final DoubleProvider alphaProvider; - - private final YoBoolean hasBeenCalled; - private final FrameTuple3DReadOnly currentPosition; - private final YoFrameVector3D lastPosition; - - /** - * @deprecated Use - * {@link #FilteredVelocityYoFrameVector(String, String, DoubleProvider, double, YoRegistry, FrameTuple3DReadOnly)} - * instead. - */ - @Deprecated - public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, - YoRegistry registry, - FrameTuple3DReadOnly frameTuple3DToDifferentiate) - { - return new FilteredVelocityYoFrameVector(namePrefix, nameSuffix, alpha, dt, registry, frameTuple3DToDifferentiate); - } - - /** - * @deprecated Use - * {@link #FilteredVelocityYoFrameVector(String, String, DoubleProvider, double, YoRegistry, ReferenceFrame)} - * instead. - */ - @Deprecated - public static FilteredVelocityYoFrameVector createFilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, - YoRegistry registry, ReferenceFrame referenceFrame) - { - return new FilteredVelocityYoFrameVector(namePrefix, nameSuffix, alpha, dt, registry, referenceFrame); - } - - public FilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoRegistry registry, - FrameTuple3DReadOnly frameTuple3DToDifferentiate) - { - super(namePrefix, nameSuffix, frameTuple3DToDifferentiate.getReferenceFrame(), registry); - this.alphaProvider = alpha; - this.dt = dt; - - hasBeenCalled = new YoBoolean(namePrefix + nameSuffix + "HasBeenCalled", registry); - currentPosition = frameTuple3DToDifferentiate; - lastPosition = new YoFrameVector3D(namePrefix + "_lastPosition", nameSuffix, getReferenceFrame(), registry); - reset(); - } - - public FilteredVelocityYoFrameVector(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoRegistry registry, - ReferenceFrame referenceFrame) - { - super(namePrefix, nameSuffix, referenceFrame, registry); - - this.alphaProvider = alpha; - this.dt = dt; - - hasBeenCalled = new YoBoolean(namePrefix + nameSuffix + "HasBeenCalled", registry); - currentPosition = null; - lastPosition = new YoFrameVector3D(namePrefix + "_lastPosition", nameSuffix, getReferenceFrame(), registry); - reset(); - } - - public void reset() - { - hasBeenCalled.set(false); - } - - public void update() - { - if (currentPosition == null) - { - throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " - + "position variable to call update(), otherwise use update(FrameTuple3DReadOnly)"); - } - - update(currentPosition); - } - - public void update(FrameTuple3DReadOnly frameTuple) - { - checkReferenceFrameMatch(frameTuple); - update((Tuple3DReadOnly) frameTuple); - } - - private final Vector3D currentRawDerivative = new Vector3D(); - - public void update(Tuple3DReadOnly currentPosition) - { - if (!hasBeenCalled.getBooleanValue()) - { - hasBeenCalled.set(true); - lastPosition.set(currentPosition); - setToZero(); - } - - currentRawDerivative.sub(currentPosition, lastPosition); - currentRawDerivative.scale(1.0 / dt); - - double alpha = alphaProvider.getValue(); - interpolate(currentRawDerivative, this, alpha); - - lastPosition.set(currentPosition); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java deleted file mode 100644 index ab519961..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoFrameVector2d.java +++ /dev/null @@ -1,126 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly; -import us.ihmc.euclid.tuple2D.Vector2D; -import us.ihmc.euclid.tuple2D.interfaces.Tuple2DReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector2D; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; - -public class FilteredVelocityYoFrameVector2d extends YoFrameVector2D -{ - private final double dt; - private final DoubleProvider alphaProvider; - - private final YoBoolean hasBeenCalled; - private final FrameTuple2DReadOnly currentPosition; - private final YoFrameVector2D lastPosition; - - /** - * @deprecated Use - * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoRegistry, FrameTuple2DReadOnly)} - * instead. - */ - @Deprecated - public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, - YoRegistry registry, - FrameTuple2DReadOnly frameTuple2DToDifferentiate) - { - return new FilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, alpha, dt, registry, frameTuple2DToDifferentiate); - } - - /** - * @deprecated Use - * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoRegistry, FrameTuple2DReadOnly)} - * instead. - */ - @Deprecated - public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, String description, - DoubleProvider alpha, double dt, YoRegistry registry, - FrameTuple2DReadOnly frameTuple2DToDifferentiate) - { - return new FilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, alpha, dt, registry, frameTuple2DToDifferentiate); - } - - /** - * @deprecated Use - * {@link #FilteredVelocityYoFrameVector2d(String, String, DoubleProvider, double, YoRegistry, ReferenceFrame)} - * instead. - */ - @Deprecated - public static FilteredVelocityYoFrameVector2d createFilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, - YoRegistry registry, ReferenceFrame referenceFrame) - { - return new FilteredVelocityYoFrameVector2d(namePrefix, nameSuffix, alpha, dt, registry, referenceFrame); - } - - public FilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoRegistry registry, - FrameTuple2DReadOnly frameTuple2DToDifferentiate) - { - super(namePrefix, nameSuffix, frameTuple2DToDifferentiate.getReferenceFrame(), registry); - this.alphaProvider = alpha; - this.dt = dt; - - hasBeenCalled = new YoBoolean(namePrefix + nameSuffix + "HasBeenCalled", registry); - currentPosition = frameTuple2DToDifferentiate; - lastPosition = new YoFrameVector2D(namePrefix + "_lastPosition", nameSuffix, getReferenceFrame(), registry); - reset(); - } - - public FilteredVelocityYoFrameVector2d(String namePrefix, String nameSuffix, DoubleProvider alpha, double dt, YoRegistry registry, - ReferenceFrame referenceFrame) - { - super(namePrefix, nameSuffix, referenceFrame, registry); - - this.alphaProvider = alpha; - this.dt = dt; - - hasBeenCalled = new YoBoolean(namePrefix + nameSuffix + "HasBeenCalled", registry); - currentPosition = null; - lastPosition = new YoFrameVector2D(namePrefix + "_lastPosition", nameSuffix, getReferenceFrame(), registry); - reset(); - } - - public void reset() - { - hasBeenCalled.set(false); - } - - public void update() - { - if (currentPosition == null) - { - throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " - + "position variable to call update(), otherwise use update(FrameTuple3DReadOnly)"); - } - - update(currentPosition); - } - - public void update(FrameTuple2DReadOnly frameTuple) - { - checkReferenceFrameMatch(frameTuple); - update((Tuple2DReadOnly) frameTuple); - } - - private final Vector2D currentRawDerivative = new Vector2D(); - - public void update(Tuple2DReadOnly currentPosition) - { - if (!hasBeenCalled.getBooleanValue()) - { - hasBeenCalled.set(true); - lastPosition.set(currentPosition); - setToZero(); - } - - currentRawDerivative.sub(currentPosition, lastPosition); - currentRawDerivative.scale(1.0 / dt); - - interpolate(currentRawDerivative, this, alphaProvider.getValue()); - - lastPosition.set(currentPosition); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoVariable.java deleted file mode 100644 index f8bd502c..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FilteredVelocityYoVariable.java +++ /dev/null @@ -1,182 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.robotics.geometry.AngleTools; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -/** - * @author jrebula - *
- * A YoFilteredVelocityVariable is a filtered velocity of a position. - * Either a YoVariable holding the position is passed in to the - * constructor and update() is called every tick, or update(double) is - * called every tick. The YoFilteredVelocityVariable updates it's val - * with the current velocity after a filter of - *
- * - *- * vel_{n} = alpha * vel{n-1} + (1 - alpha) * (pos_{n} - pos_{n-1}) - *- * - */ -public class FilteredVelocityYoVariable extends YoDouble implements ProcessingYoVariable -{ - private double alphaDouble; - private final double dt; - - private final DoubleProvider alphaVariable; - private final YoDouble position; - -// private double lastPosition; - private final YoDouble lastPosition; - private final YoBoolean hasBeenCalled; - - public FilteredVelocityYoVariable(String name, String description, double alpha, double dt, YoRegistry registry) - { - super(name, description, registry); - this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); - - this.alphaDouble = alpha; - this.dt = dt; - - this.alphaVariable = null; - this.position = null; - - lastPosition = new YoDouble(name + "_lastPosition", registry); - - reset(); - } - - public FilteredVelocityYoVariable(String name, String description, double alpha, YoDouble positionVariable, double dt, YoRegistry registry) - { - super(name, description, registry); - this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); - - this.alphaDouble = alpha; - this.position = positionVariable; - this.dt = dt; - - this.alphaVariable = null; - - lastPosition = new YoDouble(name + "_lastPosition", registry); - - - reset(); - } - - public FilteredVelocityYoVariable(String name, String description, DoubleProvider alphaVariable, YoDouble positionVariable, double dt, YoRegistry registry) - { - super(name, description, registry); - this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); - - position = positionVariable; - this.alphaVariable = alphaVariable; - this.alphaDouble = 0.0; - - this.dt = dt; - - lastPosition = new YoDouble(name + "_lastPosition", registry); - - reset(); - } - - public FilteredVelocityYoVariable(String name, String description, DoubleProvider alphaVariable, double dt, YoRegistry registry) - { - super(name, description, registry); - this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); - - this.position = null; - this.alphaVariable = alphaVariable; - this.alphaDouble = 0.0; - - this.dt = dt; - - lastPosition = new YoDouble(name + "_lastPosition", registry); - - reset(); - } - - @Override - public void reset() - { - hasBeenCalled.set(false); - } - - @Override - public void update() - { - if (position == null) - { - throw new NullPointerException("YoFilteredVelocityVariable must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - update(position.getDoubleValue()); - } - - public void updateForAngles() - { - if (position == null) - { - throw new NullPointerException("YoFilteredVelocityVariable must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - updateForAngles(position.getDoubleValue()); - } - - public void update(double currentPosition) - { - if (!hasBeenCalled.getBooleanValue()) - { - hasBeenCalled.set(true); - lastPosition.set(currentPosition); - set(0.0); - } - - double difference = currentPosition - lastPosition.getDoubleValue(); - - updateUsingDifference(difference); - - lastPosition.set(currentPosition); - } - - public void updateForAngles(double currentPosition) - { - if (!hasBeenCalled.getBooleanValue()) - { - hasBeenCalled.set(true); - lastPosition.set(currentPosition); - set(0.0); - } - - double difference = AngleTools.computeAngleDifferenceMinusPiToPi(currentPosition, lastPosition.getDoubleValue()); - - updateUsingDifference(difference); - - lastPosition.set(currentPosition); - } - - private void updateUsingDifference(double difference) - { - double previousFilteredDerivative = getDoubleValue(); - double currentRawDerivative = difference / dt; - - double alpha = alphaVariable == null ? alphaDouble : alphaVariable.getValue(); - set(alpha * previousFilteredDerivative + (1.0 - alpha) * currentRawDerivative); - } - - public void setAlpha(double alpha) - { - if (alphaVariable == null) - { - this.alphaDouble = alpha; - } - else - { - throw new RuntimeException("A double provider was used to construct this filtered variable. Modyfy the value of that provider directly."); - } - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java deleted file mode 100644 index 0f97d89a..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FiniteDifferenceAngularVelocityYoFrameVector.java +++ /dev/null @@ -1,97 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.axisAngle.AxisAngle; -import us.ihmc.euclid.matrix.RotationMatrix; -import us.ihmc.euclid.matrix.interfaces.RotationMatrixReadOnly; -import us.ihmc.euclid.orientation.interfaces.Orientation3DReadOnly; -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FrameOrientation3DReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameQuaternion; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; - -public class FiniteDifferenceAngularVelocityYoFrameVector extends YoFrameVector3D -{ - private final YoFrameQuaternion orientation; - private final YoFrameQuaternion orientationPreviousValue; - - private final YoBoolean hasBeenCalled; - - private final RotationMatrix currentOrientationMatrix = new RotationMatrix(); - private final RotationMatrix previousOrientationMatrix = new RotationMatrix(); - private final RotationMatrix deltaOrientationMatrix = new RotationMatrix(); - private final AxisAngle deltaAxisAngle = new AxisAngle(); - - private final double dt; - - public FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, ReferenceFrame referenceFrame, double dt, YoRegistry registry) - { - this(namePrefix, null, referenceFrame, dt, registry); - } - - public FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, YoFrameQuaternion orientationToDifferentiate, double dt, YoRegistry registry) - { - this(namePrefix, orientationToDifferentiate, orientationToDifferentiate.getReferenceFrame(), dt, registry); - } - - private FiniteDifferenceAngularVelocityYoFrameVector(String namePrefix, YoFrameQuaternion orientationToDifferentiate, ReferenceFrame referenceFrame, double dt, YoRegistry registry) - { - super(namePrefix, referenceFrame, registry); - - this.dt = dt; - - orientation = orientationToDifferentiate; - orientationPreviousValue = new YoFrameQuaternion(namePrefix + "_previous", referenceFrame, registry); - - hasBeenCalled = new YoBoolean(namePrefix + "HasBeenCalled", registry); - hasBeenCalled.set(false); - } - - public void update() - { - if (orientation == null) - { - throw new NullPointerException("FiniteDifferenceAngularVelocityYoFrameVector must be constructed with a non null " - + "orientation variable to call update(), otherwise use update(FrameOrientation)"); - } - - currentOrientationMatrix.set(orientation); - update(currentOrientationMatrix); - } - - public void update(FrameOrientation3DReadOnly currentOrientation) - { - checkReferenceFrameMatch(currentOrientation); - - currentOrientationMatrix.set(currentOrientation); - update(currentOrientationMatrix); - } - - public void update(Orientation3DReadOnly currentOrientation) - { - currentOrientationMatrix.set(currentOrientation); - update(currentOrientationMatrix); - } - - public void update(RotationMatrixReadOnly rotationMatrix) - { - if (!hasBeenCalled.getBooleanValue()) - { - orientationPreviousValue.set(rotationMatrix); - hasBeenCalled.set(true); - } - - if (rotationMatrix != currentOrientationMatrix) - currentOrientationMatrix.set(rotationMatrix); - previousOrientationMatrix.set(orientationPreviousValue); - deltaOrientationMatrix.set(currentOrientationMatrix); - deltaOrientationMatrix.multiplyTransposeOther(previousOrientationMatrix); - deltaAxisAngle.set(deltaOrientationMatrix); - - set(deltaAxisAngle.getX(), deltaAxisAngle.getY(), deltaAxisAngle.getZ()); - scale(deltaAxisAngle.getAngle() / dt); - - orientationPreviousValue.set(currentOrientationMatrix); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderBandPassFilteredYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderBandPassFilteredYoVariable.java deleted file mode 100644 index ee9be329..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderBandPassFilteredYoVariable.java +++ /dev/null @@ -1,68 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoDouble; - -public class FirstOrderBandPassFilteredYoVariable extends FirstOrderFilteredYoVariable -{ - private boolean hasBeenCalled = false; - - private final FirstOrderFilteredYoVariable highPassFilteredInput; - - public FirstOrderBandPassFilteredYoVariable(String name, String description, double minPassThroughFrequency_Hz, double maxPassThroughFrequency_Hz, - YoDouble yoTime, YoRegistry registry) - { - super(name, description, maxPassThroughFrequency_Hz, yoTime, FirstOrderFilterType.LOW_PASS, registry); - - this.highPassFilteredInput = new FirstOrderFilteredYoVariable(name + "HighPassFilteredOnly", description, minPassThroughFrequency_Hz, yoTime, - FirstOrderFilterType.HIGH_PASS, registry); - - setPassBand(minPassThroughFrequency_Hz, maxPassThroughFrequency_Hz); - } - - public FirstOrderBandPassFilteredYoVariable(String name, String description, double minPassThroughFrequency_Hz, double maxPassThroughFrequency_Hz, - double DT, YoRegistry registry) - { - super(name, description, maxPassThroughFrequency_Hz, DT, FirstOrderFilterType.LOW_PASS, registry); - - this.highPassFilteredInput = new FirstOrderFilteredYoVariable(name + "HighPassFilteredOnly", description, minPassThroughFrequency_Hz, DT, - FirstOrderFilterType.HIGH_PASS, registry); - } - - private void checkPassband(double minPassThroughFrequency_Hz, double maxPassThroughFrequency_Hz) - { - if (minPassThroughFrequency_Hz > maxPassThroughFrequency_Hz) - { - throw new RuntimeException("minPassThroughFrequency [ " + minPassThroughFrequency_Hz + " ] > maxPassThroughFrequency [ " + maxPassThroughFrequency_Hz - + " ]"); - } - } - - public void update(double filterInput) - { - if (!hasBeenCalled) - { - hasBeenCalled = true; - this.set(filterInput); - } - else - { - updateHighPassFilterAndThenLowPassFilterThat(filterInput); - } - } - - public void setPassBand(double minPassThroughFreqHz, double maxPassThroughFreqHz) - { - checkPassband(minPassThroughFreqHz, maxPassThroughFreqHz); - - highPassFilteredInput.setCutoffFrequencyHz(minPassThroughFreqHz); - this.setCutoffFrequencyHz(maxPassThroughFreqHz); - } - - private void updateHighPassFilterAndThenLowPassFilterThat(double filterInput) - { - this.highPassFilteredInput.update(filterInput); - - super.update(highPassFilteredInput.getDoubleValue()); - } -} \ No newline at end of file diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderFilteredYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderFilteredYoVariable.java deleted file mode 100644 index ab2caa2f..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/FirstOrderFilteredYoVariable.java +++ /dev/null @@ -1,157 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoDouble; - -public class FirstOrderFilteredYoVariable extends YoDouble - { - - public enum FirstOrderFilterType - { - LOW_PASS, HIGH_PASS - } - - private boolean hasBeenCalled = false; - - private double filterInputOld; - private double filterUpdateTimeOld; - - private final YoDouble cutoffFrequency_Hz; - - private final YoDouble yoTime; - private double dt; - - private FirstOrderFilterType highOrLowPass; - - public FirstOrderFilteredYoVariable(String name, String description, double cutoffFrequency_Hz, YoDouble yoTime, FirstOrderFilterType highOrLowPass, YoRegistry registry) - { - super(name, description, registry); - - String cutoffFrequencyName; - switch (highOrLowPass) - { - case LOW_PASS: - cutoffFrequencyName = name + "_LowPassCutoff_Hz"; - break; - case HIGH_PASS: - cutoffFrequencyName = name + "_HighPassCutoff_Hz"; - break; - default: - throw new RuntimeException("Must Specify Filter Type as Low or High Pass. Current Specification : " + highOrLowPass); - } - - this.cutoffFrequency_Hz = new YoDouble(cutoffFrequencyName, registry); - this.cutoffFrequency_Hz.set(cutoffFrequency_Hz); - - this.yoTime = yoTime; - - this.highOrLowPass = highOrLowPass; - } - - public FirstOrderFilteredYoVariable(String name, String description, double cutoffFrequency_Hz, double DT, FirstOrderFilterType highOrLowPass, YoRegistry registry) - { - this(name, description, cutoffFrequency_Hz, null, highOrLowPass, registry); - this.dt = DT; - } - - private double computeLowPassUpdate(double filterInput, double dt) - { - double alpha = computeAlpha( dt, cutoffFrequency_Hz.getDoubleValue()); - - double ret = alpha * this.getDoubleValue() + (1.0-alpha) * filterInput; - - return ret; - } - - private double computeHighPassUpdate(double filterInput, double dt) - { - double alpha = computeAlpha(dt, cutoffFrequency_Hz.getDoubleValue()); - - double ret = alpha * (this.getDoubleValue() + filterInput - filterInputOld); - return ret; - } - - private double computeAlpha(double dt, double cutoffFrequencyHz) - { - if (cutoffFrequencyHz <= 0.0) - { - throw new RuntimeException("Cutoff Frequency must be greater than zero. Cutoff = " + cutoffFrequencyHz); - } - - double cutoff_radPerSec = cutoffFrequencyHz * 2.0 * Math.PI; - double RC = 1.0 / cutoff_radPerSec; - double alpha = RC / (RC + dt); // alpha decreases with increasing cutoff frequency - - if (alpha <= 0 || alpha >= 1.0 && dt != 0.0) - { - throw new RuntimeException("Alpha value must be between 0 and 1. Alpha = " + alpha); - } - - return alpha; - } - - public void reset() - { - hasBeenCalled = false; - } - - public void setCutoffFrequencyHz(double cutoffHz) - { - this.cutoffFrequency_Hz.set(cutoffHz); - } - - public void update(double filterInput) - { - if (!hasBeenCalled) - { - hasBeenCalled = true; - - filterInputOld = 0.0; - filterUpdateTimeOld = 0.0; - - this.set(filterInput); - } - else - { - if ( yoTime != null ) - { - double timeSinceLastUpdate = yoTime.getDoubleValue() - filterUpdateTimeOld; - - if (timeSinceLastUpdate > 0.0) - { - dt = timeSinceLastUpdate; - } - else - { - reset(); -// throw new RuntimeException("Computed step size, DT must be greater than zero. DT = " + dt + ". Current time = " + yoTime.getDoubleValue() + ", previous update time = " + filterUpdateTimeOld); - } - } - - double filterOutput; - - switch (highOrLowPass) - { - case LOW_PASS: - filterOutput = computeLowPassUpdate(filterInput, dt); - break; - case HIGH_PASS: - filterOutput = computeHighPassUpdate(filterInput, dt); - break; - - default: - filterOutput = filterInput; - break; - } - - this.set(filterOutput); - } - - filterInputOld = filterInput; - - if (yoTime != null) - { - filterUpdateTimeOld = yoTime.getDoubleValue(); - } - } - } \ No newline at end of file diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoBoolean.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoBoolean.java deleted file mode 100644 index 530dab44..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoBoolean.java +++ /dev/null @@ -1,122 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoInteger; - -public class GlitchFilteredYoBoolean extends YoBoolean -{ - private YoBoolean variableToFilter; - private final YoInteger windowSize; - protected final YoInteger counter; - - public GlitchFilteredYoBoolean(String name, int windowSize) - { - super(name, "GlitchFilteredYoBoolean", null); - counter = new YoInteger(name + "Count", getRegistry()); - this.windowSize = new YoInteger(name + "WindowSize", getRegistry()); - - initialize(null, windowSize); - } - - public GlitchFilteredYoBoolean(String name, YoRegistry registry, int windowSize) - { - super(name, registry); - counter = new YoInteger(name + "Count", registry); - this.windowSize = new YoInteger(name + "WindowSize", registry); - - initialize(null, windowSize); - } - - public GlitchFilteredYoBoolean(String name, YoBoolean yoVariableToFilter, int windowSize) - { - super(name, "GlitchFilteredYoBoolean", null); - counter = new YoInteger(name + "Count", getRegistry()); - this.windowSize = new YoInteger(name + "WindowSize", getRegistry()); - - initialize(yoVariableToFilter, windowSize); - } - - public GlitchFilteredYoBoolean(String name, YoRegistry registry, YoBoolean yoVariableToFilter, int windowSize) - { - this(name, "", registry, yoVariableToFilter, windowSize); - } - - public GlitchFilteredYoBoolean(String name, YoRegistry registry, YoBoolean yoVariableToFilter, YoInteger windowSize) - { - this(name, "", registry, yoVariableToFilter, windowSize); - } - - public GlitchFilteredYoBoolean(String name, String description, YoRegistry registry, YoBoolean yoVariableToFilter, int windowSize) - { - this(name, description, registry, yoVariableToFilter, new YoInteger(name + "WindowSize", description, registry)); - - this.windowSize.set(windowSize); - } - - public GlitchFilteredYoBoolean(String name, String description, YoRegistry registry, YoBoolean yoVariableToFilter, YoInteger windowSize) - { - super(name, description, registry); - counter = new YoInteger(name + "Count", description, registry); - this.windowSize = windowSize; - - initialize(yoVariableToFilter, windowSize.getIntegerValue()); - } - - private void initialize(YoBoolean yoVariableToFilter, int windowSize) - { - if (windowSize < 0) - throw new RuntimeException("window size must be greater than 0"); - - variableToFilter = yoVariableToFilter; - this.windowSize.set(windowSize); - - if (variableToFilter != null) - this.set(yoVariableToFilter.getBooleanValue()); - - this.set(false); - } - - public boolean set(boolean value) - { - if (counter != null) - { - counter.set(0); - } - return super.set(value); - } - - public void update(boolean value) - { - - if (value != this.getBooleanValue()) - { - counter.set(counter.getIntegerValue() + 1); - } - else - counter.set(0); - - if (counter.getIntegerValue() >= (windowSize.getIntegerValue())) - set(value); - } - - public int getWindowSize() - { - return windowSize.getIntegerValue(); - } - - public void setWindowSize(int windowSize) //untested - { - this.windowSize.set(windowSize); - } - - public void update() - { - if (variableToFilter == null) - { - throw new RuntimeException("variableToFilter was not initialized. Use the other constructor"); - } - else - update(variableToFilter.getBooleanValue()); - } -} \ No newline at end of file diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoInteger.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoInteger.java deleted file mode 100644 index 4ee14989..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/GlitchFilteredYoInteger.java +++ /dev/null @@ -1,107 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.providers.IntegerProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoInteger; - -public class GlitchFilteredYoInteger extends YoInteger -{ - private final YoInteger position; - private final YoInteger previousPosition; - private final IntegerProvider windowSize; - private final YoInteger counter; - - public GlitchFilteredYoInteger(String name, int windowSize, YoRegistry registry) - { - this(name, windowSize, null, registry); - } - - public GlitchFilteredYoInteger(String name, int windowSize, YoInteger position, YoRegistry registry) - { - super(name, GlitchFilteredYoInteger.class.getSimpleName(), registry); - - this.position = position; - - previousPosition = new YoInteger(name + "PrevValue", registry); - counter = new YoInteger(name + "Count", registry); - YoInteger yoWindowSize = new YoInteger(name + "WindowSize", registry); - yoWindowSize.set(windowSize); - this.windowSize = yoWindowSize; - } - - public GlitchFilteredYoInteger(String name, IntegerProvider windowSize, YoRegistry registry) - { - this(name, windowSize, null, registry); - } - - public GlitchFilteredYoInteger(String name, IntegerProvider windowSize, YoInteger position, YoRegistry registry) - { - super(name, GlitchFilteredYoInteger.class.getSimpleName(), registry); - - this.position = position; - - previousPosition = new YoInteger(name + "PrevValue", registry); - counter = new YoInteger(name + "Count", registry); - this.windowSize = windowSize; - } - - @Override - public boolean set(int value) - { - if (counter != null) - counter.set(0); - return super.set(value); - } - - @Override - public boolean set(int value, boolean notifyListeners) - { - if (counter != null) - counter.set(0); - return super.set(value, notifyListeners); - } - - public void update() - { - if (position == null) - { - throw new NullPointerException( - "GlitchFilteredYoInteger must be constructed with a non null position variable to call update(), otherwise use update(int)"); - } - - update(position.getIntegerValue()); - } - - public void update(int currentValue) - { - if (currentValue == previousPosition.getIntegerValue()) - counter.increment(); - else - counter.set(0); - - if (counter.getIntegerValue() >= windowSize.getValue()) - { - set(currentValue); - counter.set(0); - } - - previousPosition.set(currentValue); - } - - public int getWindowSize() - { - return windowSize.getValue(); - } - - public void setWindowSize(int windowSize) - { - if (this.windowSize instanceof YoInteger) - { - ((YoInteger) this.windowSize).set(windowSize); - } - else - { - throw new RuntimeException("Setting the window size is not supported"); - } - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/JerkLimitedYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/JerkLimitedYoVariable.java deleted file mode 100644 index 05a6c61e..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/JerkLimitedYoVariable.java +++ /dev/null @@ -1,151 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.commons.MathTools; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -public class JerkLimitedYoVariable extends YoDouble -{ - private final double dt; - - private final YoBoolean hasBeenInitialized; - - private final YoDouble smoothedRate; - private final YoDouble smoothedAcceleration; - private final YoDouble smoothedJerk; - - private final YoDouble positionGain; - private final YoDouble velocityGain; - private final YoDouble accelerationGain; - - private final YoDouble maximumJerk; - private final YoDouble maximumAcceleration; - - private final YoDouble inputPosition; - private final YoDouble inputVelocity; - private final YoDouble inputAcceleration; - - public JerkLimitedYoVariable(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, double dt) - { - this(name, registry, maxAcceleration, maxJerk, null, null, null, dt); - } - - public JerkLimitedYoVariable(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, - YoDouble inputPosition, double dt) - { - this(name, registry, maxAcceleration, maxJerk, inputPosition, null, null, dt); - } - - public JerkLimitedYoVariable(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, - YoDouble inputPosition, YoDouble inputVelocity, double dt) - { - this(name, registry, maxAcceleration, maxJerk, inputPosition, inputVelocity, null, dt); - } - - public JerkLimitedYoVariable(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, - YoDouble inputPosition, YoDouble inputVelocity, YoDouble inputAcceleration, double dt) - { - super(name, registry); - - this.inputPosition = inputPosition; - this.inputVelocity = inputVelocity; - this.inputAcceleration = inputAcceleration; - - this.maximumJerk = maxJerk; - this.maximumAcceleration = maxAcceleration; - - this.dt = dt; - - hasBeenInitialized = new YoBoolean(name + "HasBeenInitialized", registry); - - smoothedRate = new YoDouble(name + "SmoothedRate", registry); - smoothedAcceleration = new YoDouble(name + "SmoothedAcceleration", registry); - smoothedJerk = new YoDouble(name + "SmoothedJerk", registry); - - positionGain = new YoDouble(name + "PositionGain", registry); - velocityGain = new YoDouble(name + "VelocityGain", registry); - accelerationGain = new YoDouble(name + "AccelerationGain", registry); - - double w0 = 2.0 * Math.PI * 16.0; - double w1 = 2.0 * Math.PI * 16.0; - double zeta = 1.0; - - setGainsByPolePlacement(w0, w1, zeta); - hasBeenInitialized.set(false); - } - - public void setMaximumAcceleration(double maximumAcceleration) - { - this.maximumAcceleration.set(maximumAcceleration); - } - - public void setMaximumJerk(double maximumJerk) - { - this.maximumJerk.set(maximumJerk); - } - - public void setGainsByPolePlacement(double w0, double w1, double zeta) - { - positionGain.set(w0 * w1 * w1); - velocityGain.set(w1 * w1 + 2.0 * zeta * w1 * w0); - accelerationGain.set(w0 + 2.0 * zeta * w1); - } - - public void update() - { - double inputPosition = this.inputPosition == null ? 0.0 : this.inputPosition.getDoubleValue(); - double inputVelocity = this.inputVelocity == null ? 0.0 : this.inputVelocity.getDoubleValue(); - double inputAcceleration = this.inputAcceleration == null ? 0.0 : this.inputAcceleration.getDoubleValue(); - - update(inputPosition, inputVelocity, inputAcceleration); - } - - public void update(double inputPosition) - { - update(inputPosition, 0.0, 0.0); - } - - public void update(double inputPosition, double inputVelocity) - { - update(inputPosition, inputVelocity, 0.0); - } - - public void update(double inputPosition, double inputVelocity, double inputAcceleration) - { - if (!hasBeenInitialized.getBooleanValue()) - initialize(inputPosition, inputVelocity, inputAcceleration); - - double positionError = inputPosition - this.getDoubleValue(); - double velocityError = inputVelocity - smoothedRate.getDoubleValue(); - double accelerationError = inputAcceleration - smoothedAcceleration.getDoubleValue(); - double jerk = accelerationGain.getDoubleValue() * accelerationError + velocityGain.getDoubleValue() * velocityError + positionGain.getDoubleValue() - * positionError; - jerk = MathTools.clamp(jerk, -maximumJerk.getDoubleValue(), maximumJerk.getDoubleValue()); - - smoothedJerk.set(jerk); - smoothedAcceleration.add(smoothedJerk.getDoubleValue() * dt); - smoothedAcceleration.set(MathTools.clamp(smoothedAcceleration.getDoubleValue(), maximumJerk.getDoubleValue())); - smoothedRate.add(smoothedAcceleration.getDoubleValue() * dt); - this.add(smoothedRate.getDoubleValue() * dt); - } - - public void initialize(double inputPosition, double inputVelocity, double inputAcceleration) - { - this.set(inputPosition); - smoothedRate.set(inputVelocity); - smoothedAcceleration.set(inputAcceleration); - smoothedJerk.set(0.0); - - this.hasBeenInitialized.set(true); - } - - public void reset() - { - this.hasBeenInitialized.set(false); - smoothedRate.set(0.0); - smoothedAcceleration.set(0.0); - smoothedJerk.set(0.0); - } - -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/ProcessingYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/ProcessingYoVariable.java deleted file mode 100644 index 14b60182..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/ProcessingYoVariable.java +++ /dev/null @@ -1,10 +0,0 @@ -package us.ihmc.robotics.math.filters; - -public interface ProcessingYoVariable -{ - public abstract void update(); - - public default void reset() - { - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java deleted file mode 100644 index 1c7ec5fb..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameOrientation.java +++ /dev/null @@ -1,152 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.referenceFrame.FrameQuaternion; -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.tuple3D.Vector3D; -import us.ihmc.euclid.tuple4D.Quaternion; -import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameYawPitchRoll; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -public class RateLimitedYoFrameOrientation extends YoFrameYawPitchRoll -{ - private final DoubleProvider maxRateVariable; - - private final YoFrameYawPitchRoll rawOrientation; - private final YoBoolean limited; - private final YoBoolean hasBeenCalled; - private final double dt; - - private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry) - { - YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry); - maxRate.set(initialValue); - return maxRate; - } - - public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - YoFrameYawPitchRoll rawOrientation) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, rawOrientation, rawOrientation.getReferenceFrame()); - } - - public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); - } - - public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, - YoFrameYawPitchRoll rawOrientation) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawOrientation, - rawOrientation.getReferenceFrame()); - } - - public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, - ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); - } - - private RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - YoFrameYawPitchRoll rawOrientation, ReferenceFrame referenceFrame) - { - super(namePrefix, nameSuffix, referenceFrame, registry); - - this.hasBeenCalled = new YoBoolean(namePrefix + "HasBeenCalled" + nameSuffix, registry); - this.limited = new YoBoolean(namePrefix + "Limited" + nameSuffix, registry); - - if (maxRate == null) - maxRate = createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); - - maxRateVariable = maxRate; - - this.rawOrientation = rawOrientation; - - this.dt = dt; - - reset(); - } - - public void reset() - { - hasBeenCalled.set(false); - } - - public void update() - { - if (rawOrientation == null) - { - throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - update(rawOrientation); - } - - public void update(YoFrameYawPitchRoll yoFrameVectorUnfiltered) - { - checkReferenceFrameMatch(yoFrameVectorUnfiltered); - update(yoFrameVectorUnfiltered.getYaw(), yoFrameVectorUnfiltered.getPitch(), yoFrameVectorUnfiltered.getRoll()); - } - - public void update(FrameQuaternion frameOrientationUnfiltered) - { - checkReferenceFrameMatch(frameOrientationUnfiltered); - update((QuaternionReadOnly) frameOrientationUnfiltered); - } - - private final Quaternion quaternionUnfiltered = new Quaternion(); - - public void update(double yawUnfiltered, double pitchUnfiltered, double rollUnfiltered) - { - quaternionUnfiltered.setYawPitchRoll(yawUnfiltered, pitchUnfiltered, rollUnfiltered); - update(quaternionUnfiltered); - } - - private final Quaternion quaternionFiltered = new Quaternion(); - private final Quaternion difference = new Quaternion(); - private final Vector3D limitedRotationVector = new Vector3D(); - - public void update(QuaternionReadOnly quaternionUnfiltered) - { - if (!hasBeenCalled.getBooleanValue() || containsNaN()) - { - hasBeenCalled.set(true); - limited.set(false); - set(quaternionUnfiltered); - return; - } - - quaternionFiltered.set(this); - - if (quaternionFiltered.dot(quaternionUnfiltered) > 0.0) - { - difference.difference(quaternionFiltered, quaternionUnfiltered); - } - else - { - difference.setAndNegate(quaternionUnfiltered); - difference.preMultiplyConjugateOther(quaternionFiltered); - } - - difference.getRotationVector(limitedRotationVector); - boolean clipped = limitedRotationVector.clipToMaxLength(dt * maxRateVariable.getValue()); - limited.set(clipped); - - if (clipped) - { - difference.setRotationVector(limitedRotationVector); - quaternionFiltered.multiply(difference); - set(quaternionFiltered); - } - else - { - set(quaternionUnfiltered); - } - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java deleted file mode 100644 index cea995da..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint.java +++ /dev/null @@ -1,120 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.referenceFrame.FrameVector3D; -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; -import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFramePoint3D; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -public class RateLimitedYoFramePoint extends YoFramePoint3D -{ - private final DoubleProvider maxRateVariable; - - private final FrameTuple3DReadOnly rawPosition; - private final YoBoolean limited; - private final YoBoolean hasBeenCalled; - private final double dt; - - private final FrameVector3D differenceVector = new FrameVector3D(); - - private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry) - { - YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry); - maxRate.set(initialValue); - return maxRate; - } - - public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FrameTuple3DReadOnly rawPosition) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame()); - } - - public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); - } - - public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, - FrameTuple3DReadOnly rawPosition) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition, - rawPosition.getReferenceFrame()); - } - - public RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); - } - - private RateLimitedYoFramePoint(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FrameTuple3DReadOnly rawPosition, ReferenceFrame referenceFrame) - { - super(namePrefix, nameSuffix, referenceFrame, registry); - - this.hasBeenCalled = new YoBoolean(namePrefix + "HasBeenCalled" + nameSuffix, registry); - this.limited = new YoBoolean(namePrefix + "Limited" + nameSuffix, registry); - - if (maxRate == null) - maxRate = createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); - - maxRateVariable = maxRate; - - this.rawPosition = rawPosition; - - this.dt = dt; - - reset(); - } - - public void reset() - { - hasBeenCalled.set(false); - } - - public void update() - { - if (rawPosition == null) - { - throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - update(rawPosition); - } - - public void update(FrameTuple3DReadOnly frameVectorUnfiltered) - { - checkReferenceFrameMatch(frameVectorUnfiltered); - update(frameVectorUnfiltered.getX(), frameVectorUnfiltered.getY(), frameVectorUnfiltered.getZ()); - } - - public void update(Tuple3DReadOnly vectorUnfiltered) - { - update(vectorUnfiltered.getX(), vectorUnfiltered.getY(), vectorUnfiltered.getZ()); - } - - public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) - { - if (!hasBeenCalled.getBooleanValue() || containsNaN()) - { - hasBeenCalled.set(true); - set(xUnfiltered, yUnfiltered, zUnfiltered); - } - - if (maxRateVariable.getValue() < 0) - throw new RuntimeException("The maxRate parameter in the " + getClass().getSimpleName() + " cannot be negative."); - - differenceVector.setToZero(getReferenceFrame()); - differenceVector.set(xUnfiltered, yUnfiltered, zUnfiltered); - differenceVector.sub(getX(), getY(), getZ()); - - limited.set(differenceVector.clipToMaxLength(maxRateVariable.getValue() * dt)); - add(differenceVector); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint2D.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint2D.java deleted file mode 100644 index b138bf53..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePoint2D.java +++ /dev/null @@ -1,134 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.referenceFrame.FrameVector2D; -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FramePoint2DReadOnly; -import us.ihmc.euclid.referenceFrame.interfaces.FramePoint3DReadOnly; -import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly; -import us.ihmc.euclid.tuple2D.interfaces.Tuple2DReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFramePoint2D; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -public class RateLimitedYoFramePoint2D extends YoFramePoint2D -{ - private final DoubleProvider maxRateVariable; - - private final FrameTuple2DReadOnly rawPosition; - private final YoBoolean limited; - private final YoBoolean hasBeenCalled; - private final double dt; - - private final FrameVector2D differenceVector = new FrameVector2D(); - - private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry) - { - YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry); - maxRate.set(initialValue); - return maxRate; - } - - public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FrameTuple2DReadOnly rawPosition) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame()); - } - - public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); - } - - public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, - FrameTuple2DReadOnly rawPosition) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition, - rawPosition.getReferenceFrame()); - } - - public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); - } - - private RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FrameTuple2DReadOnly rawPosition, ReferenceFrame referenceFrame) - { - super(namePrefix, nameSuffix, referenceFrame, registry); - - this.hasBeenCalled = new YoBoolean(namePrefix + "HasBeenCalled" + nameSuffix, registry); - this.limited = new YoBoolean(namePrefix + "Limited" + nameSuffix, registry); - - if (maxRate == null) - maxRate = createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); - - maxRateVariable = maxRate; - - this.rawPosition = rawPosition; - - this.dt = dt; - - reset(); - } - - public void setAndUpdate(FramePoint2DReadOnly framePoint2D) - { - super.set(framePoint2D); - hasBeenCalled.set(true); - } - - public void setAndUpdate(FramePoint3DReadOnly framePoint3D) - { - super.set(framePoint3D); - hasBeenCalled.set(true); - } - - public void reset() - { - hasBeenCalled.set(false); - } - - public void update() - { - if (rawPosition == null) - { - throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - update(rawPosition); - } - - public void update(FrameTuple2DReadOnly frameVectorUnfiltered) - { - checkReferenceFrameMatch(frameVectorUnfiltered); - update(frameVectorUnfiltered.getX(), frameVectorUnfiltered.getY()); - } - - public void update(Tuple2DReadOnly vectorUnfiltered) - { - update(vectorUnfiltered.getX(), vectorUnfiltered.getY()); - } - - public void update(double xUnfiltered, double yUnfiltered) - { - if (!hasBeenCalled.getBooleanValue() || containsNaN()) - { - hasBeenCalled.set(true); - set(xUnfiltered, yUnfiltered); - } - - if (maxRateVariable.getValue() < 0) - throw new RuntimeException("The maxRate parameter in the " + getClass().getSimpleName() + " cannot be negative."); - - differenceVector.setToZero(getReferenceFrame()); - differenceVector.set(xUnfiltered, yUnfiltered); - differenceVector.sub(getX(), getY()); - - limited.set(differenceVector.clipToMaxLength(maxRateVariable.getValue() * dt)); - add(differenceVector); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePose.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePose.java deleted file mode 100644 index 72b6f523..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFramePose.java +++ /dev/null @@ -1,110 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.geometry.tools.EuclidGeometryIOTools; -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FixedFramePoint3DBasics; -import us.ihmc.euclid.referenceFrame.interfaces.FixedFramePose3DBasics; -import us.ihmc.euclid.referenceFrame.interfaces.FixedFrameQuaternionBasics; -import us.ihmc.euclid.referenceFrame.interfaces.FramePose3DReadOnly; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoDouble; - -public class RateLimitedYoFramePose implements FixedFramePose3DBasics -{ - private final RateLimitedYoFramePoint position; - private final RateLimitedYoFrameQuaternion orientation; - - private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry) - { - YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry); - maxRate.set(initialValue); - return maxRate; - } - - public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FramePose3DReadOnly rawPose) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, rawPose, rawPose.getReferenceFrame()); - } - - public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); - } - - public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, FramePose3DReadOnly rawPose) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPose, rawPose.getReferenceFrame()); - } - - public RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); - } - - private RateLimitedYoFramePose(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FramePose3DReadOnly rawPose, ReferenceFrame referenceFrame) - { - if (rawPose != null) - { - this.position = new RateLimitedYoFramePoint(namePrefix, "Position" + nameSuffix, registry, maxRate, dt, rawPose.getPosition()); - this.orientation = new RateLimitedYoFrameQuaternion(namePrefix, "Orientation" + nameSuffix, registry, maxRate, dt, rawPose.getOrientation()); - } - else - { - this.position = new RateLimitedYoFramePoint(namePrefix, "Position" + nameSuffix, registry, maxRate, dt, referenceFrame); - this.orientation = new RateLimitedYoFrameQuaternion(namePrefix, "Orientation" + nameSuffix, registry, maxRate, dt, referenceFrame); - } - - reset(); - } - - public void reset() - { - position.reset(); - orientation.reset(); - } - - public void update() - { - position.update(); - orientation.update(); - - set(position, orientation); - } - - public void update(FramePose3DReadOnly framePoseUnfiltered) - { - checkReferenceFrameMatch(framePoseUnfiltered); - position.update(framePoseUnfiltered.getPosition()); - orientation.update(framePoseUnfiltered.getOrientation()); - - set(position, orientation); - } - - @Override - public FixedFramePoint3DBasics getPosition() - { - return position; - } - - @Override - public FixedFrameQuaternionBasics getOrientation() - { - return orientation; - } - - @Override - public ReferenceFrame getReferenceFrame() - { - return position.getReferenceFrame(); - } - - @Override - public String toString() - { - return EuclidGeometryIOTools.getPose3DString(this) + "-" + getReferenceFrame(); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java deleted file mode 100644 index 37a8c317..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameQuaternion.java +++ /dev/null @@ -1,151 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FrameOrientation3DReadOnly; -import us.ihmc.euclid.referenceFrame.interfaces.FrameQuaternionReadOnly; -import us.ihmc.euclid.tuple3D.Vector3D; -import us.ihmc.euclid.tuple4D.Quaternion; -import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameQuaternion; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -public class RateLimitedYoFrameQuaternion extends YoFrameQuaternion -{ - private final QuaternionReadOnly rawQuaternion; - private final YoBoolean hasBeenCalled; - private final double dt; - - private final YoBoolean limited; - private final DoubleProvider maxRateVariable; - - private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry) - { - YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry); - maxRate.set(initialValue); - return maxRate; - } - - public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, - FrameQuaternionReadOnly rawQuaternion) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawQuaternion.getReferenceFrame(), - rawQuaternion); - } - - public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, - ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, referenceFrame, null); - } - - public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, - ReferenceFrame referenceFrame, QuaternionReadOnly rawQuaternion) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, referenceFrame, rawQuaternion); - } - - public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FrameQuaternionReadOnly rawQuaternion) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, rawQuaternion.getReferenceFrame(), rawQuaternion); - } - - public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, referenceFrame, null); - } - - public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - ReferenceFrame referenceFrame, QuaternionReadOnly rawQuaternion) - { - super(namePrefix, nameSuffix, referenceFrame, registry); - - hasBeenCalled = new YoBoolean(namePrefix + "HasBeenCalled" + nameSuffix, registry); - limited = new YoBoolean(namePrefix + "Limited" + nameSuffix, registry); - - if (maxRate == null) - maxRate = createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); - - maxRateVariable = maxRate; - - this.rawQuaternion = rawQuaternion; - - this.dt = dt; - - reset(); - } - - public void reset() - { - hasBeenCalled.set(false); - } - - public void update() - { - if (rawQuaternion == null) - { - throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - update(rawQuaternion); - } - - private final Quaternion quaternion = new Quaternion(); - - public void update(FrameOrientation3DReadOnly frameOrientationUnfiltered) - { - checkReferenceFrameMatch(frameOrientationUnfiltered); - quaternion.set(frameOrientationUnfiltered); - update(quaternion); - } - - public void update(FrameQuaternionReadOnly frameQuaternionUnfiltered) - { - checkReferenceFrameMatch(frameQuaternionUnfiltered); - quaternion.set(frameQuaternionUnfiltered); - update(quaternion); - } - - private final Quaternion difference = new Quaternion(); - private final Vector3D limitedRotationVector = new Vector3D(); - - public void update(QuaternionReadOnly quaternionUnfiltered) - { - if (!hasBeenCalled.getBooleanValue() || containsNaN()) - { - hasBeenCalled.set(true); - limited.set(false); - set(quaternionUnfiltered); - return; - } - - if (dot(quaternionUnfiltered) > 0.0) - { - difference.difference(this, quaternionUnfiltered); - } - else - { - difference.setAndNegate(quaternionUnfiltered); - difference.preMultiplyConjugateOther(this); - } - - difference.getRotationVector(limitedRotationVector); - boolean clipped = limitedRotationVector.clipToMaxLength(dt * maxRateVariable.getValue()); - limited.set(clipped); - - if (clipped) - { - difference.setRotationVector(limitedRotationVector); - multiply(difference); - } - else - { - set(quaternionUnfiltered); - } - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java deleted file mode 100644 index 30dc9e1c..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector.java +++ /dev/null @@ -1,120 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.referenceFrame.FrameVector3D; -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; -import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -public class RateLimitedYoFrameVector extends YoFrameVector3D -{ - private final DoubleProvider maxRateVariable; - - private final FrameTuple3DReadOnly rawPosition; - private final YoBoolean limited; - private final YoBoolean hasBeenCalled; - private final double dt; - - private final FrameVector3D differenceVector = new FrameVector3D(); - - private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry) - { - YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry); - maxRate.set(initialValue); - return maxRate; - } - - public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FrameTuple3DReadOnly rawPosition) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame()); - } - - public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); - } - - public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, - FrameTuple3DReadOnly rawPosition) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition, - rawPosition.getReferenceFrame()); - } - - public RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); - } - - private RateLimitedYoFrameVector(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FrameTuple3DReadOnly rawPosition, ReferenceFrame referenceFrame) - { - super(namePrefix, nameSuffix, referenceFrame, registry); - - this.hasBeenCalled = new YoBoolean(namePrefix + "HasBeenCalled" + nameSuffix, registry); - this.limited = new YoBoolean(namePrefix + "Limited" + nameSuffix, registry); - - if (maxRate == null) - maxRate = createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); - - maxRateVariable = maxRate; - - this.rawPosition = rawPosition; - - this.dt = dt; - - reset(); - } - - public void reset() - { - hasBeenCalled.set(false); - } - - public void update() - { - if (rawPosition == null) - { - throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - update(rawPosition); - } - - public void update(FrameTuple3DReadOnly frameVectorUnfiltered) - { - checkReferenceFrameMatch(frameVectorUnfiltered); - update(frameVectorUnfiltered.getX(), frameVectorUnfiltered.getY(), frameVectorUnfiltered.getZ()); - } - - public void update(Tuple3DReadOnly vectorUnfiltered) - { - update(vectorUnfiltered.getX(), vectorUnfiltered.getY(), vectorUnfiltered.getZ()); - } - - public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) - { - if (!hasBeenCalled.getBooleanValue() || containsNaN()) - { - hasBeenCalled.set(true); - set(xUnfiltered, yUnfiltered, zUnfiltered); - } - - if (maxRateVariable.getValue() < 0) - throw new RuntimeException("The maxRate parameter in the " + getClass().getSimpleName() + " cannot be negative."); - - differenceVector.setToZero(getReferenceFrame()); - differenceVector.set(xUnfiltered, yUnfiltered, zUnfiltered); - differenceVector.sub(getX(), getY(), getZ()); - - limited.set(differenceVector.clipToMaxLength(maxRateVariable.getValue() * dt)); - add(differenceVector); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java deleted file mode 100644 index 2c32bbbb..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoFrameVector2d.java +++ /dev/null @@ -1,102 +0,0 @@ -package us.ihmc.robotics.math.filters; - - -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly; -import us.ihmc.euclid.tuple2D.interfaces.Vector2DReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector2D; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.tools.YoGeometryNameTools; -import us.ihmc.yoVariables.variable.YoDouble; - - -public class RateLimitedYoFrameVector2d extends YoFrameVector2D -{ - private final RateLimitedYoVariable x, y; - - private RateLimitedYoFrameVector2d(RateLimitedYoVariable x, RateLimitedYoVariable y, ReferenceFrame referenceFrame) - { - super(x, y, referenceFrame); - - this.x = x; - this.y = y; - } - - public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoRegistry registry, - double maxRate, double dt, ReferenceFrame referenceFrame) - { - RateLimitedYoVariable x = new RateLimitedYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, dt); - RateLimitedYoVariable y = new RateLimitedYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, dt); - - RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, referenceFrame); - - return ret; - } - - public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoRegistry registry, - YoDouble maxRate, double dt, ReferenceFrame referenceFrame) - { - RateLimitedYoVariable x = new RateLimitedYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, dt); - RateLimitedYoVariable y = new RateLimitedYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, dt); - - RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, referenceFrame); - - return ret; - } - - - public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoRegistry registry, - double maxRate, double dt, YoFrameVector2D unfilteredVector) - { - RateLimitedYoVariable x = new RateLimitedYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt); - RateLimitedYoVariable y = new RateLimitedYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt); - - RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, unfilteredVector.getReferenceFrame()); - - return ret; - } - - - public static RateLimitedYoFrameVector2d createRateLimitedYoFrameVector2d(String namePrefix, String nameSuffix, YoRegistry registry, - DoubleProvider maxRate, double dt, YoFrameVector2D unfilteredVector) - { - RateLimitedYoVariable x = new RateLimitedYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt); - RateLimitedYoVariable y = new RateLimitedYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt); - - RateLimitedYoFrameVector2d ret = new RateLimitedYoFrameVector2d(x, y, unfilteredVector.getReferenceFrame()); - - return ret; - } - - public void update() - { - x.update(); - y.update(); - } - - public void update(double xUnfiltered, double yUnfiltered) - { - x.update(xUnfiltered); - y.update(yUnfiltered); - } - - public void update(Vector2DReadOnly vector2dUnfiltered) - { - x.update(vector2dUnfiltered.getX()); - y.update(vector2dUnfiltered.getY()); - } - - public void update(FrameTuple2DReadOnly vector2dUnfiltered) - { - x.update(vector2dUnfiltered.getX()); - y.update(vector2dUnfiltered.getY()); - } - - public void reset() - { - x.reset(); - y.reset(); - } -} - diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoMutableFrameVector3D.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoMutableFrameVector3D.java deleted file mode 100644 index 02871c05..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoMutableFrameVector3D.java +++ /dev/null @@ -1,121 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.euclid.referenceFrame.FrameVector3D; -import us.ihmc.euclid.referenceFrame.ReferenceFrame; -import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; -import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; -import us.ihmc.yoVariables.euclid.referenceFrame.YoMutableFrameVector3D; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -public class RateLimitedYoMutableFrameVector3D extends YoMutableFrameVector3D -{ - private final DoubleProvider maxRateVariable; - - private final FrameTuple3DReadOnly rawPosition; - private final YoBoolean limited; - private final YoBoolean hasBeenCalled; - private final double dt; - - private final FrameVector3D differenceVector = new FrameVector3D(); - - private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry) - { - YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry); - maxRate.set(initialValue); - return maxRate; - } - - public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FrameTuple3DReadOnly rawPosition) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame()); - } - - public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); - } - - public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, - FrameTuple3DReadOnly rawPosition) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition, - rawPosition.getReferenceFrame()); - } - - public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, - ReferenceFrame referenceFrame) - { - this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); - } - - private RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, - FrameTuple3DReadOnly rawPosition, ReferenceFrame referenceFrame) - { - super(namePrefix, nameSuffix, registry, referenceFrame); - - this.hasBeenCalled = new YoBoolean(namePrefix + "HasBeenCalled" + nameSuffix, registry); - this.limited = new YoBoolean(namePrefix + "Limited" + nameSuffix, registry); - - if (maxRate == null) - maxRate = createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); - - maxRateVariable = maxRate; - - this.rawPosition = rawPosition; - - this.dt = dt; - - reset(); - } - - public void reset() - { - hasBeenCalled.set(false); - } - - public void update() - { - if (rawPosition == null) - { - throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - update(rawPosition); - } - - public void update(FrameTuple3DReadOnly frameVectorUnfiltered) - { - checkReferenceFrameMatch(frameVectorUnfiltered); - update(frameVectorUnfiltered.getX(), frameVectorUnfiltered.getY(), frameVectorUnfiltered.getZ()); - } - - public void update(Tuple3DReadOnly vectorUnfiltered) - { - update(vectorUnfiltered.getX(), vectorUnfiltered.getY(), vectorUnfiltered.getZ()); - } - - public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) - { - if (!hasBeenCalled.getBooleanValue() || containsNaN()) - { - hasBeenCalled.set(true); - set(xUnfiltered, yUnfiltered, zUnfiltered); - } - - if (maxRateVariable.getValue() < 0) - throw new RuntimeException("The maxRate parameter in the " + getClass().getSimpleName() + " cannot be negative."); - - differenceVector.setToZero(getReferenceFrame()); - differenceVector.set(xUnfiltered, yUnfiltered, zUnfiltered); - differenceVector.sub(getX(), getY(), getZ()); - - limited.set(differenceVector.clipToMaxLength(maxRateVariable.getValue() * dt)); - add(differenceVector); - } -} diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoVariable.java deleted file mode 100644 index 60705109..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RateLimitedYoVariable.java +++ /dev/null @@ -1,118 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; - -public class RateLimitedYoVariable extends YoDouble -{ - private final DoubleProvider maxRateVariable; - - private final YoDouble position; - private final YoBoolean limited; - - private final double dt; - - private final YoBoolean hasBeenCalled; - - public RateLimitedYoVariable(String name, YoRegistry registry, double maxRate, double dt) - { - super(name, registry); - this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); - this.limited = new YoBoolean(name + "Limited", registry); - - YoDouble maxRateVariable = new YoDouble(name + "MaxRate", registry); - maxRateVariable.set(maxRate); - this.maxRateVariable = maxRateVariable; - - this.position = null; - - this.dt = dt; - - reset(); - } - - public RateLimitedYoVariable(String name, YoRegistry registry, DoubleProvider maxRateVariable, double dt) - { - super(name, registry); - this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); - this.limited = new YoBoolean(name + "Limited", registry); - - this.maxRateVariable = maxRateVariable; - this.position = null; - - this.dt = dt; - reset(); - } - - public RateLimitedYoVariable(String name, YoRegistry registry, double maxRate, YoDouble positionVariable, double dt) - { - super(name, registry); - this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); - this.limited = new YoBoolean(name + "Limited", registry); - - position = positionVariable; - - YoDouble maxRateVariable = new YoDouble(name + "MaxRate", registry); - maxRateVariable.set(maxRate); - this.maxRateVariable = maxRateVariable; - - this.dt = dt; - - reset(); - } - - public RateLimitedYoVariable(String name, YoRegistry registry, DoubleProvider maxRateVariable, YoDouble positionVariable, double dt) - { - super(name, registry); - this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); - this.limited = new YoBoolean(name + "Limited", registry); - - position = positionVariable; - this.maxRateVariable = maxRateVariable; - - this.dt = dt; - - reset(); - } - - public void reset() - { - hasBeenCalled.set(false); - } - - public void update() - { - if (position == null) - { - throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " - + "position variable to call update(), otherwise use update(double)"); - } - - update(position.getDoubleValue()); - } - - public void update(double currentPosition) - { - if (!hasBeenCalled.getBooleanValue()) - { - hasBeenCalled.set(true); - set(currentPosition); - } - - if (maxRateVariable.getValue() < 0) - throw new RuntimeException("The maxRate parameter in the RateLimitedYoVariable cannot be negative."); - - double difference = currentPosition - getDoubleValue(); - if (Math.abs(difference) > maxRateVariable.getValue() * dt) - { - difference = Math.signum(difference) * maxRateVariable.getValue() * dt; - this.limited.set(true); - } - else - this.limited.set(false); - - set(getDoubleValue() + difference); - } -} \ No newline at end of file diff --git a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RevisedBacklashCompensatingVelocityYoVariable.java b/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RevisedBacklashCompensatingVelocityYoVariable.java deleted file mode 100644 index 8fc8a2a4..00000000 --- a/ihmc-robotics-toolkit/src/main/java/us/ihmc/robotics/math/filters/RevisedBacklashCompensatingVelocityYoVariable.java +++ /dev/null @@ -1,206 +0,0 @@ -package us.ihmc.robotics.math.filters; - -import us.ihmc.commons.MathTools; -import us.ihmc.yoVariables.providers.DoubleProvider; -import us.ihmc.yoVariables.registry.YoRegistry; -import us.ihmc.yoVariables.variable.YoBoolean; -import us.ihmc.yoVariables.variable.YoDouble; -import us.ihmc.yoVariables.variable.YoEnum; - -/** - * This does essentially the same as BacklashCompensatingVelocityYoVariable, except does the steps in a different order and - * goes sloppy when the output changes sign rather than the finite differences. This works better for a signal with noise on it, - * which might have a true velocity but due to the noise seems to switch direction often. - * - */ -public class RevisedBacklashCompensatingVelocityYoVariable extends YoDouble implements ProcessingYoVariable -{ - private final double dt; - - private final FilteredVelocityYoVariable finiteDifferenceVelocity; - - private final DoubleProvider alphaVariable; - private final YoDouble position; - - private final YoDouble lastPosition; - private final YoBoolean hasBeenCalled; - - private final YoEnum
+ * {@link FilteredFiniteDifferenceYoFrameVector2D} + *
+ * + *+ * Differentiates and Filters a {@link YoFrameVector2D} to get its derivative. This derviative is then low pass filtered. + *
+ *+ * vel_{n} = alpha * vel{n-1} + (1 - alpha) * (pos_{n} - pos_{n-1}) + *+ */ +public class FilteredFiniteDifferenceYoFrameVector2D extends YoFrameVector2D +{ + private final double dt; + private final DoubleProvider alphaProvider; + + private final YoBoolean hasBeenCalled; + private final FrameTuple2DReadOnly currentPosition; + private final YoFrameVector2D lastPosition; + + public FilteredFiniteDifferenceYoFrameVector2D(String namePrefix, + String nameSuffix, + DoubleProvider alpha, + double dt, + YoRegistry registry, + FrameTuple2DReadOnly frameTuple2DToDifferentiate) + { + this(namePrefix, nameSuffix, alpha, dt, registry, frameTuple2DToDifferentiate, frameTuple2DToDifferentiate.getReferenceFrame()); + } + + public FilteredFiniteDifferenceYoFrameVector2D(String namePrefix, + String nameSuffix, + DoubleProvider alpha, + double dt, + YoRegistry registry, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, alpha, dt, registry, null, referenceFrame); + } + + private FilteredFiniteDifferenceYoFrameVector2D(String namePrefix, + String nameSuffix, + DoubleProvider alpha, + double dt, + YoRegistry registry, + FrameTuple2DReadOnly frameTuple2DToDifferentiate, + ReferenceFrame referenceFrame) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + + this.alphaProvider = alpha; + this.dt = dt; + + hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(namePrefix, nameSuffix, registry); + currentPosition = frameTuple2DToDifferentiate; + lastPosition = new YoFrameVector2D(namePrefix + "_lastPosition", nameSuffix, getReferenceFrame(), registry); + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (currentPosition == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(FrameTuple3DReadOnly)"); + } + + update(currentPosition); + } + + public void update(FrameTuple2DReadOnly frameTuple) + { + checkReferenceFrameMatch(frameTuple); + update((Tuple2DReadOnly) frameTuple); + } + + private final Vector2D currentRawDerivative = new Vector2D(); + + public void update(Tuple2DReadOnly currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + lastPosition.set(currentPosition); + setToZero(); + } + + currentRawDerivative.sub(currentPosition, lastPosition); + currentRawDerivative.scale(1.0 / dt); + + interpolate(currentRawDerivative, this, alphaProvider.getValue()); + + lastPosition.set(currentPosition); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/FilteredFiniteDifferenceYoFrameVector3D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/FilteredFiniteDifferenceYoFrameVector3D.java new file mode 100644 index 00000000..557eff95 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/FilteredFiniteDifferenceYoFrameVector3D.java @@ -0,0 +1,113 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; +import us.ihmc.euclid.tuple3D.Vector3D; +import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; +import us.ihmc.yoVariables.filters.VariableTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; + +/** + *
+ * {@link FilteredFiniteDifferenceYoFrameVector3D} + *
+ * + *+ * Differentiates and Filters a {@link YoFrameVector3D} to get its derivative. This derviative is then low pass filtered. + *
+ *+ * vel_{n} = alpha * vel{n-1} + (1 - alpha) * (pos_{n} - pos_{n-1}) + *+ */ +public class FilteredFiniteDifferenceYoFrameVector3D extends YoFrameVector3D +{ + private final double dt; + private final DoubleProvider alphaProvider; + + private final YoBoolean hasBeenCalled; + private final FrameTuple3DReadOnly currentPosition; + private final YoFrameVector3D lastPosition; + + public FilteredFiniteDifferenceYoFrameVector3D(String namePrefix, + String nameSuffix, + DoubleProvider alpha, + double dt, + YoRegistry registry, + FrameTuple3DReadOnly frameTuple3DToDifferentiate) + { + this(namePrefix, nameSuffix, alpha, dt, registry, frameTuple3DToDifferentiate, frameTuple3DToDifferentiate.getReferenceFrame()); + } + + public FilteredFiniteDifferenceYoFrameVector3D(String namePrefix, + String nameSuffix, + DoubleProvider alpha, + double dt, + YoRegistry registry, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, alpha, dt, registry, null, referenceFrame); + } + + private FilteredFiniteDifferenceYoFrameVector3D(String namePrefix, + String nameSuffix, + DoubleProvider alpha, + double dt, + YoRegistry registry, + FrameTuple3DReadOnly frameTuple3DToDifferentiate, + ReferenceFrame referenceFrame) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + + this.alphaProvider = alpha; + this.dt = dt; + + hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(namePrefix, nameSuffix, registry); + currentPosition = frameTuple3DToDifferentiate; + lastPosition = new YoFrameVector3D(namePrefix + "_lastPosition", nameSuffix, getReferenceFrame(), registry); + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (currentPosition == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(FrameTuple3DReadOnly)"); + } + + update(currentPosition); + } + + public void update(FrameTuple3DReadOnly frameTuple) + { + checkReferenceFrameMatch(frameTuple); + update((Tuple3DReadOnly) frameTuple); + } + + private final Vector3D currentRawDerivative = new Vector3D(); + + public void update(Tuple3DReadOnly currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + lastPosition.set(currentPosition); + setToZero(); + } + + currentRawDerivative.sub(currentPosition, lastPosition); + currentRawDerivative.scale(1.0 / dt); + + interpolate(currentRawDerivative, this, alphaProvider.getValue()); + + lastPosition.set(currentPosition); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/FiniteDifferenceAngularVelocityYoFrameVector3D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/FiniteDifferenceAngularVelocityYoFrameVector3D.java new file mode 100644 index 00000000..1576414a --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/FiniteDifferenceAngularVelocityYoFrameVector3D.java @@ -0,0 +1,98 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.axisAngle.AxisAngle; +import us.ihmc.euclid.matrix.RotationMatrix; +import us.ihmc.euclid.matrix.interfaces.RotationMatrixReadOnly; +import us.ihmc.euclid.orientation.interfaces.Orientation3DReadOnly; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameOrientation3DReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameQuaternion; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; +import us.ihmc.yoVariables.filters.VariableTools; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; + +public class FiniteDifferenceAngularVelocityYoFrameVector3D extends YoFrameVector3D +{ + private final YoFrameQuaternion orientation; + private final YoFrameQuaternion orientationPreviousValue; + + private final YoBoolean hasBeenCalled; + + private final RotationMatrix currentOrientationMatrix = new RotationMatrix(); + private final RotationMatrix previousOrientationMatrix = new RotationMatrix(); + private final RotationMatrix deltaOrientationMatrix = new RotationMatrix(); + private final AxisAngle deltaAxisAngle = new AxisAngle(); + + private final double dt; + + public FiniteDifferenceAngularVelocityYoFrameVector3D(String namePrefix, ReferenceFrame referenceFrame, double dt, YoRegistry registry) + { + this(namePrefix, null, referenceFrame, dt, registry); + } + + public FiniteDifferenceAngularVelocityYoFrameVector3D(String namePrefix, YoFrameQuaternion orientationToDifferentiate, double dt, YoRegistry registry) + { + this(namePrefix, orientationToDifferentiate, orientationToDifferentiate.getReferenceFrame(), dt, registry); + } + + private FiniteDifferenceAngularVelocityYoFrameVector3D(String namePrefix, YoFrameQuaternion orientationToDifferentiate, ReferenceFrame referenceFrame, double dt, YoRegistry registry) + { + super(namePrefix, referenceFrame, registry); + + this.dt = dt; + + orientation = orientationToDifferentiate; + orientationPreviousValue = new YoFrameQuaternion(namePrefix + "_previous", referenceFrame, registry); + + hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(namePrefix, "", registry); + hasBeenCalled.set(false); + } + + public void update() + { + if (orientation == null) + { + throw new NullPointerException("FiniteDifferenceAngularVelocityYoFrameVector must be constructed with a non null " + + "orientation variable to call update(), otherwise use update(FrameOrientation)"); + } + + currentOrientationMatrix.set(orientation); + update(currentOrientationMatrix); + } + + public void update(FrameOrientation3DReadOnly currentOrientation) + { + checkReferenceFrameMatch(currentOrientation); + + currentOrientationMatrix.set(currentOrientation); + update(currentOrientationMatrix); + } + + public void update(Orientation3DReadOnly currentOrientation) + { + currentOrientationMatrix.set(currentOrientation); + update(currentOrientationMatrix); + } + + public void update(RotationMatrixReadOnly rotationMatrix) + { + if (!hasBeenCalled.getBooleanValue()) + { + orientationPreviousValue.set(rotationMatrix); + hasBeenCalled.set(true); + } + + if (rotationMatrix != currentOrientationMatrix) + currentOrientationMatrix.set(rotationMatrix); + previousOrientationMatrix.set(orientationPreviousValue); + deltaOrientationMatrix.set(currentOrientationMatrix); + deltaOrientationMatrix.multiplyTransposeOther(previousOrientationMatrix); + deltaAxisAngle.set(deltaOrientationMatrix); + + set(deltaAxisAngle.getX(), deltaAxisAngle.getY(), deltaAxisAngle.getZ()); + scale(deltaAxisAngle.getAngle() / dt); + + orientationPreviousValue.set(currentOrientationMatrix); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/MovingAverageYoFramePoint2D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/MovingAverageYoFramePoint2D.java new file mode 100644 index 00000000..e06c568e --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/MovingAverageYoFramePoint2D.java @@ -0,0 +1,65 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FramePoint2DReadOnly; +import us.ihmc.euclid.tuple2D.interfaces.Point2DReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFramePoint2D; +import us.ihmc.yoVariables.filters.MovingAverageYoDouble; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.tools.YoGeometryNameTools; + +public class MovingAverageYoFramePoint2D extends YoFramePoint2D +{ + private final MovingAverageYoDouble x, y; + + public MovingAverageYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, int beta, ReferenceFrame referenceFrame) + { + this(new MovingAverageYoDouble(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, beta), + new MovingAverageYoDouble(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, beta), + referenceFrame); + } + + public MovingAverageYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, int beta, YoFramePoint2D unfilteredPoint) + { + this(new MovingAverageYoDouble(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, beta, unfilteredPoint.getYoX()), + new MovingAverageYoDouble(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, beta, unfilteredPoint.getYoY()), + unfilteredPoint.getReferenceFrame()); + } + + private MovingAverageYoFramePoint2D(MovingAverageYoDouble x, MovingAverageYoDouble y, ReferenceFrame referenceFrame) + { + super(x, y, referenceFrame); + + this.x = x; + this.y = y; + } + + public void update() + { + x.update(); + y.update(); + } + + public void update(double xUnfiltered, double yUnfiltered) + { + x.update(xUnfiltered); + y.update(yUnfiltered); + } + + public void update(Point2DReadOnly point2dUnfiltered) + { + update(point2dUnfiltered.getX(), point2dUnfiltered.getY()); + } + + public void update(FramePoint2DReadOnly point2dUnfiltered) + { + checkReferenceFrameMatch(point2dUnfiltered); + update((Point2DReadOnly) point2dUnfiltered); + } + + public void reset() + { + x.reset(); + y.reset(); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/MovingAverageYoFrameVector2D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/MovingAverageYoFrameVector2D.java new file mode 100644 index 00000000..cebccec1 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/MovingAverageYoFrameVector2D.java @@ -0,0 +1,65 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameVector2DReadOnly; +import us.ihmc.euclid.tuple2D.interfaces.Vector2DReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector2D; +import us.ihmc.yoVariables.filters.MovingAverageYoDouble; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.tools.YoGeometryNameTools; + +public class MovingAverageYoFrameVector2D extends YoFrameVector2D +{ + private final MovingAverageYoDouble x, y; + + public MovingAverageYoFrameVector2D(String namePrefix, String nameSuffix, YoRegistry registry, int beta, ReferenceFrame referenceFrame) + { + this(new MovingAverageYoDouble(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, beta), + new MovingAverageYoDouble(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, beta), + referenceFrame); + } + + public MovingAverageYoFrameVector2D(String namePrefix, String nameSuffix, YoRegistry registry, int beta, YoFrameVector2D unfilteredVector) + { + this(new MovingAverageYoDouble(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, beta, unfilteredVector.getYoX()), + new MovingAverageYoDouble(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, beta, unfilteredVector.getYoY()), + unfilteredVector.getReferenceFrame()); + } + + private MovingAverageYoFrameVector2D(MovingAverageYoDouble x, MovingAverageYoDouble y, ReferenceFrame referenceFrame) + { + super(x, y, referenceFrame); + + this.x = x; + this.y = y; + } + + public void update() + { + x.update(); + y.update(); + } + + public void update(double xUnfiltered, double yUnfiltered) + { + x.update(xUnfiltered); + y.update(yUnfiltered); + } + + public void update(Vector2DReadOnly vector2dUnfiltered) + { + update(vector2dUnfiltered.getX(), vector2dUnfiltered.getY()); + } + + public void update(FrameVector2DReadOnly vector2dUnfiltered) + { + checkReferenceFrameMatch(vector2dUnfiltered); + update((Vector2DReadOnly) vector2dUnfiltered); + } + + public void reset() + { + x.reset(); + y.reset(); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameOrientation.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameOrientation.java new file mode 100644 index 00000000..fef4624a --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameOrientation.java @@ -0,0 +1,145 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.FrameQuaternion; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.tuple3D.Vector3D; +import us.ihmc.euclid.tuple4D.Quaternion; +import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameYawPitchRoll; +import us.ihmc.yoVariables.filters.VariableTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; + +public class RateLimitedYoFrameOrientation extends YoFrameYawPitchRoll +{ + private final DoubleProvider maxRateVariable; + + private final YoFrameYawPitchRoll rawOrientation; + private final YoBoolean limited; + private final YoBoolean hasBeenCalled; + private final double dt; + + public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + YoFrameYawPitchRoll rawOrientation) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, rawOrientation, rawOrientation.getReferenceFrame()); + } + + public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); + } + + public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, + YoFrameYawPitchRoll rawOrientation) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawOrientation, + rawOrientation.getReferenceFrame()); + } + + public RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); + } + + private RateLimitedYoFrameOrientation(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + YoFrameYawPitchRoll rawOrientation, ReferenceFrame referenceFrame) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + + hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(namePrefix, nameSuffix, registry); + limited = VariableTools.createLimitedCalledYoBoolean(namePrefix, nameSuffix, registry); + + if (maxRate == null) + maxRate = VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); + + maxRateVariable = maxRate; + + this.rawOrientation = rawOrientation; + + this.dt = dt; + + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (rawOrientation == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(rawOrientation); + } + + public void update(YoFrameYawPitchRoll yoFrameVectorUnfiltered) + { + checkReferenceFrameMatch(yoFrameVectorUnfiltered); + update(yoFrameVectorUnfiltered.getYaw(), yoFrameVectorUnfiltered.getPitch(), yoFrameVectorUnfiltered.getRoll()); + } + + public void update(FrameQuaternion frameOrientationUnfiltered) + { + checkReferenceFrameMatch(frameOrientationUnfiltered); + update((QuaternionReadOnly) frameOrientationUnfiltered); + } + + private final Quaternion quaternionUnfiltered = new Quaternion(); + + public void update(double yawUnfiltered, double pitchUnfiltered, double rollUnfiltered) + { + quaternionUnfiltered.setYawPitchRoll(yawUnfiltered, pitchUnfiltered, rollUnfiltered); + update(quaternionUnfiltered); + } + + private final Quaternion quaternionFiltered = new Quaternion(); + private final Quaternion difference = new Quaternion(); + private final Vector3D limitedRotationVector = new Vector3D(); + + public void update(QuaternionReadOnly quaternionUnfiltered) + { + if (!hasBeenCalled.getBooleanValue() || containsNaN()) + { + hasBeenCalled.set(true); + limited.set(false); + set(quaternionUnfiltered); + return; + } + + quaternionFiltered.set(this); + + if (quaternionFiltered.dot(quaternionUnfiltered) > 0.0) + { + difference.difference(quaternionFiltered, quaternionUnfiltered); + } + else + { + difference.setAndNegate(quaternionUnfiltered); + difference.preMultiplyConjugateOther(quaternionFiltered); + } + + difference.getRotationVector(limitedRotationVector); + boolean clipped = limitedRotationVector.clipToMaxNorm(dt * maxRateVariable.getValue()); + limited.set(clipped); + + if (clipped) + { + difference.setRotationVector(limitedRotationVector); + quaternionFiltered.multiply(difference); + set(quaternionFiltered); + } + else + { + set(quaternionUnfiltered); + } + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFramePoint2D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFramePoint2D.java new file mode 100644 index 00000000..0a5575d1 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFramePoint2D.java @@ -0,0 +1,135 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.FrameVector2D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FramePoint2DReadOnly; +import us.ihmc.euclid.referenceFrame.interfaces.FramePoint3DReadOnly; +import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple2DReadOnly; +import us.ihmc.euclid.tuple2D.interfaces.Tuple2DReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFramePoint2D; +import us.ihmc.yoVariables.filters.VariableTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +public class RateLimitedYoFramePoint2D extends YoFramePoint2D +{ + private final DoubleProvider maxRateVariable; + + private final FrameTuple2DReadOnly rawPosition; + private final YoBoolean limited; + private final YoBoolean hasBeenCalled; + private final double dt; + + private final FrameVector2D differenceVector = new FrameVector2D(); + + private static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry) + { + YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry); + maxRate.set(initialValue); + return maxRate; + } + + public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FrameTuple2DReadOnly rawPosition) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame()); + } + + public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); + } + + public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, + FrameTuple2DReadOnly rawPosition) + { + this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition, + rawPosition.getReferenceFrame()); + } + + public RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); + } + + private RateLimitedYoFramePoint2D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FrameTuple2DReadOnly rawPosition, ReferenceFrame referenceFrame) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + + hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(namePrefix, nameSuffix, registry); + limited = VariableTools.createLimitedCalledYoBoolean(namePrefix, nameSuffix, registry); + + if (maxRate == null) + maxRate = createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); + + maxRateVariable = maxRate; + + this.rawPosition = rawPosition; + + this.dt = dt; + + reset(); + } + + public void setAndUpdate(FramePoint2DReadOnly framePoint2D) + { + super.set(framePoint2D); + hasBeenCalled.set(true); + } + + public void setAndUpdate(FramePoint3DReadOnly framePoint3D) + { + super.set(framePoint3D); + hasBeenCalled.set(true); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (rawPosition == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(rawPosition); + } + + public void update(FrameTuple2DReadOnly frameVectorUnfiltered) + { + checkReferenceFrameMatch(frameVectorUnfiltered); + update(frameVectorUnfiltered.getX(), frameVectorUnfiltered.getY()); + } + + public void update(Tuple2DReadOnly vectorUnfiltered) + { + update(vectorUnfiltered.getX(), vectorUnfiltered.getY()); + } + + public void update(double xUnfiltered, double yUnfiltered) + { + if (!hasBeenCalled.getBooleanValue() || containsNaN()) + { + hasBeenCalled.set(true); + set(xUnfiltered, yUnfiltered); + } + + if (maxRateVariable.getValue() < 0) + throw new RuntimeException("The maxRate parameter in the " + getClass().getSimpleName() + " cannot be negative."); + + differenceVector.setToZero(getReferenceFrame()); + differenceVector.set(xUnfiltered, yUnfiltered); + differenceVector.sub(getX(), getY()); + + limited.set(differenceVector.clipToMaxNorm(maxRateVariable.getValue() * dt)); + add(differenceVector); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFramePoint3D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFramePoint3D.java new file mode 100644 index 00000000..5b7ad253 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFramePoint3D.java @@ -0,0 +1,113 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.FrameVector3D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; +import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFramePoint3D; +import us.ihmc.yoVariables.filters.VariableTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; + +public class RateLimitedYoFramePoint3D extends YoFramePoint3D +{ + private final DoubleProvider maxRateVariable; + + private final FrameTuple3DReadOnly rawPosition; + private final YoBoolean limited; + private final YoBoolean hasBeenCalled; + private final double dt; + + private final FrameVector3D differenceVector = new FrameVector3D(); + + public RateLimitedYoFramePoint3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FrameTuple3DReadOnly rawPosition) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame()); + } + + public RateLimitedYoFramePoint3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); + } + + public RateLimitedYoFramePoint3D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, + FrameTuple3DReadOnly rawPosition) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition, + rawPosition.getReferenceFrame()); + } + + public RateLimitedYoFramePoint3D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); + } + + private RateLimitedYoFramePoint3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FrameTuple3DReadOnly rawPosition, ReferenceFrame referenceFrame) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + + hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(namePrefix, nameSuffix, registry); + limited = VariableTools.createLimitedCalledYoBoolean(namePrefix, nameSuffix, registry); + + if (maxRate == null) + maxRate = VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); + + maxRateVariable = maxRate; + + this.rawPosition = rawPosition; + + this.dt = dt; + + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (rawPosition == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(rawPosition); + } + + public void update(FrameTuple3DReadOnly frameVectorUnfiltered) + { + checkReferenceFrameMatch(frameVectorUnfiltered); + update(frameVectorUnfiltered.getX(), frameVectorUnfiltered.getY(), frameVectorUnfiltered.getZ()); + } + + public void update(Tuple3DReadOnly vectorUnfiltered) + { + update(vectorUnfiltered.getX(), vectorUnfiltered.getY(), vectorUnfiltered.getZ()); + } + + public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) + { + if (!hasBeenCalled.getBooleanValue() || containsNaN()) + { + hasBeenCalled.set(true); + set(xUnfiltered, yUnfiltered, zUnfiltered); + } + + if (maxRateVariable.getValue() < 0) + throw new RuntimeException("The maxRate parameter in the " + getClass().getSimpleName() + " cannot be negative."); + + differenceVector.setToZero(getReferenceFrame()); + differenceVector.set(xUnfiltered, yUnfiltered, zUnfiltered); + differenceVector.sub(getX(), getY(), getZ()); + + limited.set(differenceVector.clipToMaxLength(maxRateVariable.getValue() * dt)); + add(differenceVector); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFramePose3D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFramePose3D.java new file mode 100644 index 00000000..f27cdf31 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFramePose3D.java @@ -0,0 +1,103 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.geometry.tools.EuclidGeometryIOTools; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FixedFramePoint3DBasics; +import us.ihmc.euclid.referenceFrame.interfaces.FixedFramePose3DBasics; +import us.ihmc.euclid.referenceFrame.interfaces.FixedFrameQuaternionBasics; +import us.ihmc.euclid.referenceFrame.interfaces.FramePose3DReadOnly; +import us.ihmc.yoVariables.filters.VariableTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; + +public class RateLimitedYoFramePose3D implements FixedFramePose3DBasics +{ + private final RateLimitedYoFramePoint3D position; + private final RateLimitedYoFrameQuaternion orientation; + + public RateLimitedYoFramePose3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FramePose3DReadOnly rawPose) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, rawPose, rawPose.getReferenceFrame()); + } + + public RateLimitedYoFramePose3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); + } + + public RateLimitedYoFramePose3D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, FramePose3DReadOnly rawPose) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPose, rawPose.getReferenceFrame()); + } + + public RateLimitedYoFramePose3D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); + } + + private RateLimitedYoFramePose3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FramePose3DReadOnly rawPose, ReferenceFrame referenceFrame) + { + if (rawPose != null) + { + this.position = new RateLimitedYoFramePoint3D(namePrefix, "Position" + nameSuffix, registry, maxRate, dt, rawPose.getPosition()); + this.orientation = new RateLimitedYoFrameQuaternion(namePrefix, "Orientation" + nameSuffix, registry, maxRate, dt, rawPose.getOrientation()); + } + else + { + this.position = new RateLimitedYoFramePoint3D(namePrefix, "Position" + nameSuffix, registry, maxRate, dt, referenceFrame); + this.orientation = new RateLimitedYoFrameQuaternion(namePrefix, "Orientation" + nameSuffix, registry, maxRate, dt, referenceFrame); + } + + reset(); + } + + public void reset() + { + position.reset(); + orientation.reset(); + } + + public void update() + { + position.update(); + orientation.update(); + + set(position, orientation); + } + + public void update(FramePose3DReadOnly framePoseUnfiltered) + { + checkReferenceFrameMatch(framePoseUnfiltered); + position.update(framePoseUnfiltered.getPosition()); + orientation.update(framePoseUnfiltered.getOrientation()); + + set(position, orientation); + } + + @Override + public FixedFramePoint3DBasics getPosition() + { + return position; + } + + @Override + public FixedFrameQuaternionBasics getOrientation() + { + return orientation; + } + + @Override + public ReferenceFrame getReferenceFrame() + { + return position.getReferenceFrame(); + } + + @Override + public String toString() + { + return EuclidGeometryIOTools.getPose3DString(this) + "-" + getReferenceFrame(); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameQuaternion.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameQuaternion.java new file mode 100644 index 00000000..7cbcebea --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameQuaternion.java @@ -0,0 +1,144 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameOrientation3DReadOnly; +import us.ihmc.euclid.referenceFrame.interfaces.FrameQuaternionReadOnly; +import us.ihmc.euclid.tuple3D.Vector3D; +import us.ihmc.euclid.tuple4D.Quaternion; +import us.ihmc.euclid.tuple4D.interfaces.QuaternionReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameQuaternion; +import us.ihmc.yoVariables.filters.VariableTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; + +public class RateLimitedYoFrameQuaternion extends YoFrameQuaternion +{ + private final QuaternionReadOnly rawQuaternion; + private final YoBoolean hasBeenCalled; + private final double dt; + + private final YoBoolean limited; + private final DoubleProvider maxRateVariable; + + public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, + FrameQuaternionReadOnly rawQuaternion) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawQuaternion.getReferenceFrame(), + rawQuaternion); + } + + public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, referenceFrame, null); + } + + public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, + ReferenceFrame referenceFrame, QuaternionReadOnly rawQuaternion) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, referenceFrame, rawQuaternion); + } + + public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FrameQuaternionReadOnly rawQuaternion) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, rawQuaternion.getReferenceFrame(), rawQuaternion); + } + + public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, referenceFrame, null); + } + + public RateLimitedYoFrameQuaternion(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + ReferenceFrame referenceFrame, QuaternionReadOnly rawQuaternion) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + + hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(namePrefix, nameSuffix, registry); + limited = VariableTools.createLimitedCalledYoBoolean(namePrefix, nameSuffix, registry); + + if (maxRate == null) + maxRate = VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); + + maxRateVariable = maxRate; + + this.rawQuaternion = rawQuaternion; + + this.dt = dt; + + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (rawQuaternion == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(rawQuaternion); + } + + private final Quaternion quaternion = new Quaternion(); + + public void update(FrameOrientation3DReadOnly frameOrientationUnfiltered) + { + checkReferenceFrameMatch(frameOrientationUnfiltered); + quaternion.set(frameOrientationUnfiltered); + update(quaternion); + } + + public void update(FrameQuaternionReadOnly frameQuaternionUnfiltered) + { + checkReferenceFrameMatch(frameQuaternionUnfiltered); + quaternion.set(frameQuaternionUnfiltered); + update(quaternion); + } + + private final Quaternion difference = new Quaternion(); + private final Vector3D limitedRotationVector = new Vector3D(); + + public void update(QuaternionReadOnly quaternionUnfiltered) + { + if (!hasBeenCalled.getBooleanValue() || containsNaN()) + { + hasBeenCalled.set(true); + limited.set(false); + set(quaternionUnfiltered); + return; + } + + if (dot(quaternionUnfiltered) > 0.0) + { + difference.difference(this, quaternionUnfiltered); + } + else + { + difference.setAndNegate(quaternionUnfiltered); + difference.preMultiplyConjugateOther(this); + } + + difference.getRotationVector(limitedRotationVector); + boolean clipped = limitedRotationVector.clipToMaxNorm(dt * maxRateVariable.getValue()); + limited.set(clipped); + + if (clipped) + { + difference.setRotationVector(limitedRotationVector); + multiply(difference); + } + else + { + set(quaternionUnfiltered); + } + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameVector2D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameVector2D.java new file mode 100644 index 00000000..da92c1d8 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameVector2D.java @@ -0,0 +1,48 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector2D; +import us.ihmc.yoVariables.filters.RateLimitedYoVariable; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.tools.YoGeometryNameTools; + +public class RateLimitedYoFrameVector2D extends YoFrameVector2D +{ + private final RateLimitedYoVariable x, y; + + public RateLimitedYoFrameVector2D(String namePrefix, YoRegistry registry, + DoubleProvider maxRate, double dt, YoFrameVector2D unfilteredVector) + { + this(namePrefix, "", registry, maxRate, dt, unfilteredVector); + } + + public RateLimitedYoFrameVector2D(String namePrefix, String nameSuffix, YoRegistry registry, + DoubleProvider maxRate, double dt, YoFrameVector2D unfilteredVector) + { + this(new RateLimitedYoVariable(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoX(), dt), + new RateLimitedYoVariable(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, maxRate, unfilteredVector.getYoY(), dt), + unfilteredVector.getReferenceFrame()); + } + + private RateLimitedYoFrameVector2D(RateLimitedYoVariable x, RateLimitedYoVariable y, ReferenceFrame referenceFrame) + { + super(x, y, referenceFrame); + + this.x = x; + this.y = y; + } + + public void update() + { + x.update(); + y.update(); + } + + public void reset() + { + x.reset(); + y.reset(); + } +} + diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameVector3D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameVector3D.java new file mode 100644 index 00000000..64760b2e --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoFrameVector3D.java @@ -0,0 +1,114 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.FrameVector3D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; +import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; +import us.ihmc.yoVariables.filters.VariableTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; + +public class RateLimitedYoFrameVector3D extends YoFrameVector3D +{ + private final DoubleProvider maxRateVariable; + + private final FrameTuple3DReadOnly rawPosition; + private final YoBoolean limited; + private final YoBoolean hasBeenCalled; + private final double dt; + + private final FrameVector3D differenceVector = new FrameVector3D(); + + + public RateLimitedYoFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FrameTuple3DReadOnly rawPosition) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame()); + } + + public RateLimitedYoFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, null, referenceFrame); + } + + public RateLimitedYoFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, + FrameTuple3DReadOnly rawPosition) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, rawPosition, + rawPosition.getReferenceFrame()); + } + + public RateLimitedYoFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, double maxRate, double dt, ReferenceFrame referenceFrame) + { + this(namePrefix, nameSuffix, registry, VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, maxRate, registry), dt, null, referenceFrame); + } + + private RateLimitedYoFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FrameTuple3DReadOnly rawPosition, ReferenceFrame referenceFrame) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + + hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(namePrefix, nameSuffix, registry); + limited = VariableTools.createLimitedCalledYoBoolean(namePrefix, nameSuffix, registry); + + if (maxRate == null) + maxRate = VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); + + maxRateVariable = maxRate; + + this.rawPosition = rawPosition; + + this.dt = dt; + + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (rawPosition == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(rawPosition); + } + + public void update(FrameTuple3DReadOnly frameVectorUnfiltered) + { + checkReferenceFrameMatch(frameVectorUnfiltered); + update(frameVectorUnfiltered.getX(), frameVectorUnfiltered.getY(), frameVectorUnfiltered.getZ()); + } + + public void update(Tuple3DReadOnly vectorUnfiltered) + { + update(vectorUnfiltered.getX(), vectorUnfiltered.getY(), vectorUnfiltered.getZ()); + } + + public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) + { + if (!hasBeenCalled.getBooleanValue() || containsNaN()) + { + hasBeenCalled.set(true); + set(xUnfiltered, yUnfiltered, zUnfiltered); + } + + if (maxRateVariable.getValue() < 0) + throw new RuntimeException("The maxRate parameter in the " + getClass().getSimpleName() + " cannot be negative."); + + differenceVector.setToZero(getReferenceFrame()); + differenceVector.set(xUnfiltered, yUnfiltered, zUnfiltered); + differenceVector.sub(getX(), getY(), getZ()); + + limited.set(differenceVector.clipToMaxNorm(maxRateVariable.getValue() * dt)); + add(differenceVector); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoMutableFrameVector3D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoMutableFrameVector3D.java new file mode 100644 index 00000000..8e68b73a --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RateLimitedYoMutableFrameVector3D.java @@ -0,0 +1,95 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.FrameVector3D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; +import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoMutableFrameVector3D; +import us.ihmc.yoVariables.filters.VariableTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; + +public class RateLimitedYoMutableFrameVector3D extends YoMutableFrameVector3D +{ + private final DoubleProvider maxRateVariable; + + private final FrameTuple3DReadOnly rawPosition; + private final YoBoolean limited; + private final YoBoolean hasBeenCalled; + private final double dt; + + private final FrameVector3D differenceVector = new FrameVector3D(); + + public RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FrameTuple3DReadOnly rawPosition) + { + this(namePrefix, nameSuffix, registry, maxRate, dt, rawPosition, rawPosition.getReferenceFrame()); + } + + private RateLimitedYoMutableFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, DoubleProvider maxRate, double dt, + FrameTuple3DReadOnly rawPosition, ReferenceFrame referenceFrame) + { + super(namePrefix, nameSuffix, registry, referenceFrame); + + hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(namePrefix, nameSuffix, registry); + limited = VariableTools.createLimitedCalledYoBoolean(namePrefix, nameSuffix, registry); + + if (maxRate == null) + maxRate = VariableTools.createMaxRateYoDouble(namePrefix, nameSuffix, Double.POSITIVE_INFINITY, registry); + + maxRateVariable = maxRate; + + this.rawPosition = rawPosition; + + this.dt = dt; + + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (rawPosition == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(rawPosition); + } + + public void update(FrameTuple3DReadOnly frameVectorUnfiltered) + { + checkReferenceFrameMatch(frameVectorUnfiltered); + update(frameVectorUnfiltered.getX(), frameVectorUnfiltered.getY(), frameVectorUnfiltered.getZ()); + } + + public void update(Tuple3DReadOnly vectorUnfiltered) + { + update(vectorUnfiltered.getX(), vectorUnfiltered.getY(), vectorUnfiltered.getZ()); + } + + public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) + { + if (!hasBeenCalled.getBooleanValue() || containsNaN()) + { + hasBeenCalled.set(true); + set(xUnfiltered, yUnfiltered, zUnfiltered); + } + + if (maxRateVariable.getValue() < 0) + throw new RuntimeException("The maxRate parameter in the " + getClass().getSimpleName() + " cannot be negative."); + + differenceVector.setToZero(getReferenceFrame()); + differenceVector.set(xUnfiltered, yUnfiltered, zUnfiltered); + differenceVector.sub(getX(), getY(), getZ()); + + limited.set(differenceVector.clipToMaxLength(maxRateVariable.getValue() * dt)); + add(differenceVector); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RunningAverageYoFrameVector3D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RunningAverageYoFrameVector3D.java new file mode 100644 index 00000000..556f6bd5 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/RunningAverageYoFrameVector3D.java @@ -0,0 +1,78 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.referenceFrame.interfaces.FrameTuple3DReadOnly; +import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.tools.YoGeometryNameTools; +import us.ihmc.yoVariables.variable.YoInteger; + +public class RunningAverageYoFrameVector3D extends YoFrameVector3D +{ + private final YoInteger sampleSize; + private final Tuple3DReadOnly dataSource; + + public RunningAverageYoFrameVector3D(String namePrefix, ReferenceFrame referenceFrame, YoRegistry registry) + { + this(namePrefix, "", registry, referenceFrame, null); + } + + public RunningAverageYoFrameVector3D(String namePrefix, String nameSuffix, ReferenceFrame referenceFrame, YoRegistry registry) + { + this(namePrefix, nameSuffix, registry, referenceFrame, null); + } + + public RunningAverageYoFrameVector3D(String namePrefix, YoRegistry registry, FrameTuple3DReadOnly dataSource) + { + this(namePrefix, "", registry, dataSource.getReferenceFrame(), dataSource); + } + + public RunningAverageYoFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, FrameTuple3DReadOnly dataSource) + { + this(namePrefix, nameSuffix, registry, dataSource.getReferenceFrame(), dataSource); + } + + private RunningAverageYoFrameVector3D(String namePrefix, String nameSuffix, YoRegistry registry, ReferenceFrame referenceFrame, Tuple3DReadOnly dataSource) + { + super(namePrefix, nameSuffix, referenceFrame, registry); + + this.dataSource = dataSource; + + sampleSize = new YoInteger(YoGeometryNameTools.assembleName(namePrefix, "sampleSize", nameSuffix), registry); + } + + public void update() + { + update(dataSource); + } + + public void update(Tuple3DReadOnly vectorSource) + { + update(vectorSource.getX(), vectorSource.getY(), vectorSource.getZ()); + } + + public void update(FrameTuple3DReadOnly vectorSource) + { + checkReferenceFrameMatch(vectorSource); + update((Tuple3DReadOnly) vectorSource); + } + + public void update(double xSource, double ySource, double zSource) + { + sampleSize.increment(); + addX((xSource - getX()) / sampleSize.getValue()); + addY((ySource - getY()) / sampleSize.getValue()); + addZ((zSource - getZ()) / sampleSize.getValue()); + } + + public void reset() + { + sampleSize.set(0); + } + + public int getSampleSize() + { + return sampleSize.getValue(); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/SecondOrderFilteredYoFrameVector3D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/SecondOrderFilteredYoFrameVector3D.java new file mode 100644 index 00000000..57f6d78c --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/SecondOrderFilteredYoFrameVector3D.java @@ -0,0 +1,129 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.FrameVector3D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.tuple3D.Vector3D; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; +import us.ihmc.yoVariables.filters.ProcessingYoVariable; +import us.ihmc.yoVariables.filters.SecondOrderFilterType; +import us.ihmc.yoVariables.filters.SecondOrderFilteredYoDouble; +import us.ihmc.yoVariables.filters.SecondOrderFilteredYoVariableParameters; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.tools.YoGeometryNameTools; + +public class SecondOrderFilteredYoFrameVector3D extends YoFrameVector3D implements ProcessingYoVariable +{ + private final SecondOrderFilteredYoDouble x, y, z; + + public SecondOrderFilteredYoFrameVector3D(String namePrefix, + String nameSuffix, + YoRegistry registry, + double dt, + SecondOrderFilteredYoVariableParameters parameters, + YoFrameVector3D unfilteredVector) + { + this(new SecondOrderFilteredYoDouble(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, dt, parameters, unfilteredVector.getYoX()), + new SecondOrderFilteredYoDouble(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, dt, parameters, unfilteredVector.getYoY()), + new SecondOrderFilteredYoDouble(YoGeometryNameTools.createZName(namePrefix, nameSuffix), registry, dt, parameters, unfilteredVector.getYoZ()), + unfilteredVector.getReferenceFrame()); + } + + private SecondOrderFilteredYoFrameVector3D(SecondOrderFilteredYoDouble x, + SecondOrderFilteredYoDouble y, + SecondOrderFilteredYoDouble z, + ReferenceFrame referenceFrame) + { + super(x, y, z, referenceFrame); + + this.x = x; + this.y = y; + this.z = z; + } + + public static SecondOrderFilteredYoFrameVector3D createSecondOrderFilteredYoFrameVector(String namePrefix, + String nameSuffix, + YoRegistry registry, + double dt, + double naturalFrequencyInHz, + double dampingRatio, + SecondOrderFilterType filterType, + ReferenceFrame referenceFrame) + + { + SecondOrderFilteredYoVariableParameters parameters = new SecondOrderFilteredYoVariableParameters(namePrefix + nameSuffix, + registry, + naturalFrequencyInHz, + dampingRatio, + filterType); + return createSecondOrderFilteredYoFrameVector(namePrefix, nameSuffix, registry, dt, parameters, referenceFrame); + } + + public static SecondOrderFilteredYoFrameVector3D createSecondOrderFilteredYoFrameVector(String namePrefix, + String nameSuffix, + YoRegistry registry, + double dt, + SecondOrderFilteredYoVariableParameters parameters, + ReferenceFrame referenceFrame) + { + SecondOrderFilteredYoDouble x, y, z; + x = new SecondOrderFilteredYoDouble(YoGeometryNameTools.createXName(namePrefix, nameSuffix), registry, dt, parameters); + y = new SecondOrderFilteredYoDouble(YoGeometryNameTools.createYName(namePrefix, nameSuffix), registry, dt, parameters); + z = new SecondOrderFilteredYoDouble(YoGeometryNameTools.createZName(namePrefix, nameSuffix), registry, dt, parameters); + return new SecondOrderFilteredYoFrameVector3D(x, y, z, referenceFrame); + } + + public static SecondOrderFilteredYoFrameVector3D createSecondOrderFilteredYoFrameVector(String namePrefix, + String nameSuffix, + YoRegistry registry, + double dt, + double naturalFrequencyInHz, + double dampingRatio, + SecondOrderFilterType filterType, + YoFrameVector3D unfilteredVector) + { + SecondOrderFilteredYoVariableParameters parameters = new SecondOrderFilteredYoVariableParameters(namePrefix + nameSuffix, + registry, + naturalFrequencyInHz, + dampingRatio, + filterType); + return new SecondOrderFilteredYoFrameVector3D(namePrefix, nameSuffix, registry, dt, parameters, unfilteredVector); + } + + @Override + public void update() + { + x.update(); + y.update(); + z.update(); + } + + public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) + { + x.update(xUnfiltered); + y.update(yUnfiltered); + z.update(zUnfiltered); + } + + public void update(Vector3D vectorUnfiltered) + { + x.update(vectorUnfiltered.getX()); + y.update(vectorUnfiltered.getY()); + z.update(vectorUnfiltered.getZ()); + } + + public void update(FrameVector3D vectorUnfiltered) + { + checkReferenceFrameMatch(vectorUnfiltered); + x.update(vectorUnfiltered.getX()); + y.update(vectorUnfiltered.getY()); + z.update(vectorUnfiltered.getZ()); + } + + @Override + public void reset() + { + x.reset(); + y.reset(); + z.reset(); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/SimpleMovingAverageFilteredYoFrameVector3D.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/SimpleMovingAverageFilteredYoFrameVector3D.java new file mode 100644 index 00000000..07e32c51 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/euclid/filters/SimpleMovingAverageFilteredYoFrameVector3D.java @@ -0,0 +1,96 @@ +package us.ihmc.yoVariables.euclid.filters; + +import us.ihmc.euclid.referenceFrame.FrameVector3D; +import us.ihmc.euclid.referenceFrame.ReferenceFrame; +import us.ihmc.euclid.tuple3D.Vector3D; +import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D; +import us.ihmc.yoVariables.filters.ProcessingYoVariable; +import us.ihmc.yoVariables.filters.SimpleMovingAverageFilteredYoVariable; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.tools.YoGeometryNameTools; + +public class SimpleMovingAverageFilteredYoFrameVector3D extends YoFrameVector3D implements ProcessingYoVariable +{ + private final SimpleMovingAverageFilteredYoVariable x, y, z; + + private SimpleMovingAverageFilteredYoFrameVector3D(SimpleMovingAverageFilteredYoVariable x, SimpleMovingAverageFilteredYoVariable y, + SimpleMovingAverageFilteredYoVariable z, ReferenceFrame referenceFrame) + { + super(x, y, z, referenceFrame); + + this.x = x; + this.y = y; + this.z = z; + } + + public static SimpleMovingAverageFilteredYoFrameVector3D createSimpleMovingAverageFilteredYoFrameVector(String namePrefix, String nameSuffix, int windowSize, + ReferenceFrame referenceFrame, YoRegistry registry) + { + String xName = YoGeometryNameTools.createXName(namePrefix, nameSuffix); + String yName = YoGeometryNameTools.createYName(namePrefix, nameSuffix); + String zName = YoGeometryNameTools.createZName(namePrefix, nameSuffix); + + SimpleMovingAverageFilteredYoVariable x = new SimpleMovingAverageFilteredYoVariable(xName, windowSize, registry); + SimpleMovingAverageFilteredYoVariable y = new SimpleMovingAverageFilteredYoVariable(yName, windowSize, registry); + SimpleMovingAverageFilteredYoVariable z = new SimpleMovingAverageFilteredYoVariable(zName, windowSize, registry); + + return new SimpleMovingAverageFilteredYoFrameVector3D(x, y, z, referenceFrame); + } + + public static SimpleMovingAverageFilteredYoFrameVector3D createSimpleMovingAverageFilteredYoFrameVector(String namePrefix, String nameSuffix, int windowSize, + YoFrameVector3D unfilteredVector, YoRegistry registry) + { + String xName = YoGeometryNameTools.createXName(namePrefix, nameSuffix); + String yName = YoGeometryNameTools.createYName(namePrefix, nameSuffix); + String zName = YoGeometryNameTools.createZName(namePrefix, nameSuffix); + + SimpleMovingAverageFilteredYoVariable x = new SimpleMovingAverageFilteredYoVariable(xName, windowSize, unfilteredVector.getYoX(), registry); + SimpleMovingAverageFilteredYoVariable y = new SimpleMovingAverageFilteredYoVariable(yName, windowSize, unfilteredVector.getYoY(), registry); + SimpleMovingAverageFilteredYoVariable z = new SimpleMovingAverageFilteredYoVariable(zName, windowSize, unfilteredVector.getYoZ(), registry); + + return new SimpleMovingAverageFilteredYoFrameVector3D(x, y, z, unfilteredVector.getReferenceFrame()); + } + + @Override + public void update() + { + x.update(); + y.update(); + z.update(); + } + + public void update(double xUnfiltered, double yUnfiltered, double zUnfiltered) + { + x.update(xUnfiltered); + y.update(yUnfiltered); + z.update(zUnfiltered); + } + + public void update(Vector3D vectorUnfiltered) + { + x.update(vectorUnfiltered.getX()); + y.update(vectorUnfiltered.getY()); + z.update(vectorUnfiltered.getZ()); + } + + public void update(FrameVector3D vectorUnfiltered) + { + checkReferenceFrameMatch(vectorUnfiltered); + x.update(vectorUnfiltered.getX()); + y.update(vectorUnfiltered.getY()); + z.update(vectorUnfiltered.getZ()); + } + + @Override + public void reset() + { + x.reset(); + y.reset(); + z.reset(); + } + + public boolean getHasBufferWindowFilled() + { + return x.getHasBufferWindowFilled() && y.getHasBufferWindowFilled() && z.getHasBufferWindowFilled(); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AccelerationLimitedYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AccelerationLimitedYoVariable.java new file mode 100644 index 00000000..243da69a --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AccelerationLimitedYoVariable.java @@ -0,0 +1,138 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +public class AccelerationLimitedYoVariable extends YoDouble +{ + private final double dt; + + private final YoBoolean hasBeenInitialized; + + private final YoDouble smoothedRate; + private final YoDouble smoothedAcceleration; + + private final YoDouble positionGain; + private final YoDouble velocityGain; + + private DoubleProvider maximumRate; + private DoubleProvider maximumAcceleration; + + private final DoubleProvider inputVariable; + + public AccelerationLimitedYoVariable(String name, YoRegistry registry, DoubleProvider maxRate, DoubleProvider maxAcceleration, double dt) + { + this(name, registry, maxRate, maxAcceleration, null, dt); + } + + public AccelerationLimitedYoVariable(String name, YoRegistry registry, DoubleProvider maxRate, DoubleProvider maxAcceleration, + DoubleProvider inputVariable, double dt) + { + super(name, registry); + + if (maxRate != null && maxAcceleration != null) + { + this.maximumRate = maxRate; + this.maximumAcceleration = maxAcceleration; + } + + this.dt = dt; + + hasBeenInitialized = new YoBoolean(name + "HasBeenInitialized", registry); + + smoothedRate = new YoDouble(name + "SmoothedRate", registry); + smoothedAcceleration = new YoDouble(name + "SmoothedAcceleration", registry); + + positionGain = new YoDouble(name + "PositionGain", registry); + velocityGain = new YoDouble(name + "VelocityGain", registry); + + double w0 = 2.0 * Math.PI * 16.0; + double zeta = 1.0; + + setGainsByPolePlacement(w0, zeta); + hasBeenInitialized.set(false); + + this.inputVariable = inputVariable; + } + + + public void setGainsByPolePlacement(double w0, double zeta) + { + positionGain.set(w0 * w0); + velocityGain.set(2.0 * zeta * w0); + } + + public YoDouble getPositionGain() + { + return positionGain; + } + + public YoDouble getVelocityGain() + { + return velocityGain; + } + + public void update() + { + update(inputVariable.getValue()); + } + + public void update(double input) + { + if (!hasBeenInitialized.getBooleanValue()) + initialize(input); + + double positionError = input - this.getDoubleValue(); + double acceleration = -velocityGain.getDoubleValue() * smoothedRate.getDoubleValue() + positionGain.getDoubleValue() * positionError; + acceleration = MathTools.clamp(acceleration, -maximumAcceleration.getValue(), maximumAcceleration.getValue()); + + smoothedAcceleration.set(acceleration); + smoothedRate.add(smoothedAcceleration.getDoubleValue() * dt); + smoothedRate.set(MathTools.clamp(smoothedRate.getDoubleValue(), maximumRate.getValue())); + this.add(smoothedRate.getDoubleValue() * dt); + } + + public void initialize(double input) + { + this.set(input); + smoothedRate.set(0.0); + smoothedAcceleration.set(0.0); + + this.hasBeenInitialized.set(true); + } + + public void reset() + { + this.hasBeenInitialized.set(false); + smoothedRate.set(0.0); + smoothedAcceleration.set(0.0); + } + + public YoDouble getSmoothedRate() + { + return smoothedRate; + } + + public YoDouble getSmoothedAcceleration() + { + return smoothedAcceleration; + } + + public boolean hasBeenInitialized() + { + return hasBeenInitialized.getBooleanValue(); + } + + public double getMaximumRate() + { + return maximumRate.getValue(); + } + + public double getMaximumAcceleration() + { + return maximumAcceleration.getValue(); + } +} \ No newline at end of file diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaBasedOnBreakFrequencyProvider.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaBasedOnBreakFrequencyProvider.java new file mode 100644 index 00000000..836eeb91 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaBasedOnBreakFrequencyProvider.java @@ -0,0 +1,55 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.providers.DoubleProvider; + +/** + * This class calculates the alpha value given a break frequency provider + * + * The value gets cached to avoid unnecessary calculations + * + * @author Jesper Smith + * + */ +public class AlphaBasedOnBreakFrequencyProvider implements DoubleProvider +{ + + private final DoubleProvider breakFrequencyProvider; + private final double dt; + + private double previousBreakFrequency = Double.NaN; + private double alpha = 0.0; + + /** + * Create a new provider using the break frequency provided by double provider + * + * @param breakFrequencyProvider + * @param dt + */ + public AlphaBasedOnBreakFrequencyProvider(DoubleProvider breakFrequencyProvider, double dt) + { + this.breakFrequencyProvider = breakFrequencyProvider; + this.dt = dt; + } + + /** + * Get the desired alpha value, based on the break frequency given by the breakFrequencyProvider + * + * The value gets cached, and checked based on the current value of the breakFrequencyProvider. + * This will be safe to rewind. + * + * @return alpha variable based on the value of breakFrequencyProvider and dt + */ + @Override + public double getValue() + { + double currentBreakFrequency = breakFrequencyProvider.getValue(); + if (currentBreakFrequency != previousBreakFrequency) + { + alpha = AlphaFilteredYoVariable.computeAlphaGivenBreakFrequencyProperly(currentBreakFrequency, dt); + previousBreakFrequency = currentBreakFrequency; + } + + return alpha; + } + +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilterTools.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilterTools.java new file mode 100644 index 00000000..12215c30 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilterTools.java @@ -0,0 +1,33 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.commons.MathTools; + +public class AlphaFilterTools +{ + /** + * This computes the alpha + * variable for an alpha filtered yo variable that is equivalent to a first order low pass frequnecy at filter {@param breakFrequencyInHertz} + * + * @return alpha value + */ + public static double computeAlphaGivenBreakFrequencyProperly(double breakFrequencyInHertz, double dt) + { + if (Double.isInfinite(breakFrequencyInHertz)) + return 0.0; + + double omega = AngleTools.TwoPI * breakFrequencyInHertz; + double alpha = (1.0 - omega * dt / 2.0) / (1.0 + omega * dt / 2.0); + alpha = MathTools.clamp(alpha, 0.0, 1.0); + return alpha; + } + + /** + * This computes the break frequency of a first order low-pass filter given an alpha value. + * + * @return alpha value + */ + public static double computeBreakFrequencyGivenAlpha(double alpha, double dt) + { + return (1.0 - alpha) / (Math.PI * dt * (1.0 + alpha)); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredWrappingYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredWrappingYoVariable.java new file mode 100644 index 00000000..60a1bd07 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredWrappingYoVariable.java @@ -0,0 +1,139 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class AlphaFilteredWrappingYoVariable extends AlphaFilteredYoVariable +{ + public static final double EPSILON = 1e-10; + + private double previousUnfilteredVariable; + private final YoDouble unfilteredVariable; + private final YoDouble unfilteredInRangeVariable; + private final DoubleProvider alphaVariable; + + private final YoDouble temporaryOutputVariable; + private final YoDouble error; + private final double upperLimit; + private final double lowerLimit; + private final double range; + + //wrap the values in [lowerLimit ; upperLimit[ + + public AlphaFilteredWrappingYoVariable(String name, String description, YoRegistry registry, final YoDouble unfilteredVariable, DoubleProvider alphaVariable, double lowerLimit, double upperLimit) + { + super(name, description, registry, alphaVariable); + this.alphaVariable = alphaVariable; + this.upperLimit = upperLimit; + this.lowerLimit = lowerLimit; + this.range = upperLimit - lowerLimit; + this.unfilteredVariable = unfilteredVariable; + + unfilteredInRangeVariable = new YoDouble(name + "UnfilteredInRangeVariable", registry); + temporaryOutputVariable = new YoDouble(name + "TemporaryOutputVariable", registry); + error = new YoDouble(name + "Error", registry); + + } + + @Override + public void update() + { + update(unfilteredVariable.getDoubleValue()); + } + + + @Override + public void update(double currentPosition) + { + if(!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + previousUnfilteredVariable = unfilteredVariable.getDoubleValue(); + + unfilteredVariableModulo(currentPosition); + + temporaryOutputVariable.set(unfilteredInRangeVariable.getDoubleValue()); + set(unfilteredInRangeVariable.getDoubleValue()); + } + else + { + if (!MathTools.epsilonEquals(currentPosition, previousUnfilteredVariable, EPSILON)) + { + previousUnfilteredVariable = currentPosition; + + unfilteredVariableModulo(currentPosition); + + //calculate the error + double standardError = unfilteredInRangeVariable.getDoubleValue() - getDoubleValue(); + double wrappingError; + if(unfilteredInRangeVariable.getDoubleValue() > getDoubleValue()) + { + wrappingError = lowerLimit - getDoubleValue() + unfilteredInRangeVariable.getDoubleValue() - upperLimit; + } + else + { + wrappingError = upperLimit - getDoubleValue() + unfilteredInRangeVariable.getDoubleValue() - lowerLimit; + } + if(Math.abs(standardError) < Math.abs(wrappingError)) + { + error.set(standardError); + } + else + { + error.set(wrappingError); + } + + //determine if wrapping and move the input if necessary + temporaryOutputVariable.set(getDoubleValue()); + if ((getDoubleValue() + error.getDoubleValue()) >= upperLimit) + { + temporaryOutputVariable.set(getDoubleValue() - range); + } + if ((getDoubleValue() + error.getDoubleValue()) < lowerLimit) + { + temporaryOutputVariable.set(getDoubleValue() + range); + } + } + + temporaryOutputVariable.set(alphaVariable.getValue() * temporaryOutputVariable.getDoubleValue() + (1.0 - alphaVariable.getValue()) + * unfilteredInRangeVariable.getDoubleValue()); + + if (temporaryOutputVariable.getDoubleValue() > upperLimit + EPSILON) + { + set(temporaryOutputVariable.getDoubleValue() - range); + } + else if (temporaryOutputVariable.getDoubleValue() <= lowerLimit - EPSILON) + { + set(temporaryOutputVariable.getDoubleValue() + range); + } + else + { + set(temporaryOutputVariable.getDoubleValue()); + } + } + } + + private void unfilteredVariableModulo(double currentPosition) + { + //handle if the input is out of range + boolean rangeNeedsToBeChecked = true; + unfilteredInRangeVariable.set(currentPosition); + + while(rangeNeedsToBeChecked) + { + rangeNeedsToBeChecked = false; + if (unfilteredInRangeVariable.getDoubleValue() >= upperLimit) + { + unfilteredInRangeVariable.set(unfilteredInRangeVariable.getDoubleValue() - range); + rangeNeedsToBeChecked = true; + } + if (unfilteredInRangeVariable.getDoubleValue() < lowerLimit) + { + unfilteredInRangeVariable.set(unfilteredInRangeVariable.getDoubleValue() + range); + rangeNeedsToBeChecked = true; + } + } + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredYoMatrix.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredYoMatrix.java new file mode 100644 index 00000000..46e63224 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredYoMatrix.java @@ -0,0 +1,108 @@ +package us.ihmc.yoVariables.filters; + +import org.ejml.data.DMatrix; +import org.ejml.data.DMatrixRMaj; +import org.ejml.dense.row.CommonOps_DDRM; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class AlphaFilteredYoMatrix extends YoMatrix +{ + private final DMatrixRMaj previous; + private final DMatrixRMaj current; + private final DMatrixRMaj filtered; + + private final YoDouble alpha; + + public AlphaFilteredYoMatrix(String name, double alpha, int numberOfRows, int numberOfColumns, YoRegistry registry) + { + this(name, null, alpha, numberOfRows, numberOfColumns, null, null, registry); + } + + public AlphaFilteredYoMatrix(String name, double alpha, int numberOfRows, int numberOfColumns, String[] rowNames, YoRegistry registry) + { + this(name, null, alpha, numberOfRows, numberOfColumns, rowNames, null, registry); + } + + public AlphaFilteredYoMatrix(String name, double alpha, int numberOfRows, int numberOfColumns, String[] rowNames, String[] columnNames, YoRegistry registry) + { + this(name, null, alpha, numberOfRows, numberOfColumns, rowNames, columnNames, registry); + } + + public AlphaFilteredYoMatrix(String name, String description, double alpha, int numberOfRows, int numberOfColumns, YoRegistry registry) + { + this(name, description, alpha, numberOfRows, numberOfColumns, null, null, registry); + } + + public AlphaFilteredYoMatrix(String name, String description, double alpha, int numberOfRows, int numberOfColumns, String[] rowNames, YoRegistry registry) + { + this(name, description, alpha, numberOfRows, numberOfColumns, rowNames, null, registry); + } + + public AlphaFilteredYoMatrix(String name, String description, double alpha, int numberOfRows, int numberOfColumns, String[] rowNames, String[] columnNames, YoRegistry registry) + { + super(name, description, numberOfRows, numberOfColumns, rowNames, columnNames, registry); + this.alpha = new YoDouble(name + "_alpha", registry); + this.alpha.set(alpha); + + previous = new DMatrixRMaj(numberOfRows, numberOfColumns); + current = new DMatrixRMaj(numberOfRows, numberOfColumns); + filtered = new DMatrixRMaj(numberOfRows, numberOfColumns); + } + + public void setAlpha(double alpha) + { + this.alpha.set(alpha); + } + + /** + * Set the current value of the matrix to be filtered. + *
+ * NOTE: This method does not solve for the filtered value. To solve for the filtered value, use {@link #solve()}. + *
+ * + * @param current the current value of the matrix to be filtered. Not modified. + */ + @Override + public void set(DMatrix current) + { + super.set(current); + this.current.set(current); + } + + /** + * Assuming that the current value has been set, this method solves for the filtered value. + *+ * See {@link #set(DMatrix)} for how to set the matrix's current value. + *
+ */ + public void solve() + { + CommonOps_DDRM.scale(alpha.getDoubleValue(), previous, filtered); + + super.get(current); + CommonOps_DDRM.addEquals(filtered, 1 - alpha.getDoubleValue(), current); + + // Set the previous value to be the output of the filter, so it can be used next time + previous.set(filtered); + super.set(filtered); + } + + /** + * Set the current value of the matrix to be filtered and solve for the filtered value. + * + * @param current the current value of the matrix to be filtered. Not modified. + */ + public void setAndSolve(DMatrix current) + { + CommonOps_DDRM.scale(alpha.getDoubleValue(), previous, filtered); + + super.set(current); + this.current.set(current); + CommonOps_DDRM.addEquals(filtered, 1 - alpha.getDoubleValue(), this.current); + + // Set the previous value to be the output of the filter, so it can be used next time + previous.set(filtered); + super.set(filtered); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredYoVariable.java new file mode 100644 index 00000000..0f7841fa --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredYoVariable.java @@ -0,0 +1,172 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.euclid.tools.EuclidCoreTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +/** + * @author jrebula + * + *+ * LittleDogVersion06: + * us.ihmc.LearningLocomotion.Version06.util.YoAlphaFilteredVariable, + * 9:34:00 AM, Aug 29, 2006 + *
= + *+ * A YoAlphaFilteredVariable is a filtered version of an input YoVar. + * Either a YoVariable holding the unfiltered val is passed in to the + * constructor and update() is called every tick, or update(double) is + * called every tick. The YoAlphaFilteredVariable updates it's val + * with the current filtered version using + *
+ *+ * filtered_{n} = alpha * filtered_{n-1} + (1 - alpha) * raw_{n} + *+ * + * For alpha=0 -> no filtered + * For alpha=1 -> 100% filtered, no use of raw signal + */ +public class AlphaFilteredYoVariable extends YoDouble implements ProcessingYoVariable +{ + private final DoubleProvider alphaVariable; + + private final YoDouble position; + protected final YoBoolean hasBeenCalled; + + /** + * Please use + * @param namePrefix + * @param initialValue + * @param registry + * @return + */ + @Deprecated + public static DoubleProvider createAlphaYoDouble(String namePrefix, double initialValue, YoRegistry registry) + { + return VariableTools.createAlphaYoDouble(namePrefix, "", initialValue, registry); + } + + + public AlphaFilteredYoVariable(String name, YoRegistry registry, double alpha) + { + this(name, registry, alpha, null); + } + + public AlphaFilteredYoVariable(String name, YoRegistry registry, double alpha, YoDouble positionVariable) + { + this(name, "", registry, VariableTools.createAlphaYoDouble(name, "", alpha, registry), positionVariable); + } + + public AlphaFilteredYoVariable(String name, YoRegistry registry, DoubleProvider alphaVariable) + { + this(name, "", registry, alphaVariable, null); + } + + public AlphaFilteredYoVariable(String name, String description, YoRegistry registry, DoubleProvider alphaVariable) + { + this(name, description, registry, alphaVariable, null); + } + + public AlphaFilteredYoVariable(String name, YoRegistry registry, DoubleProvider alphaVariable, YoDouble positionVariable) + { + this(name, "", registry, alphaVariable, positionVariable); + } + + public AlphaFilteredYoVariable(String name, String description, YoRegistry registry, DoubleProvider alphaVariable, YoDouble positionVariable) + { + super(name, description, registry); + this.hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(name, "", registry); + this.position = positionVariable; + + if (alphaVariable == null) + alphaVariable = VariableTools.createAlphaYoDouble(name, "", 0.0, registry); + this.alphaVariable = alphaVariable; + + reset(); + } + + @Override + public void reset() + { + hasBeenCalled.set(false); + } + + @Override + public void update() + { + if (position == null) + { + throw new NullPointerException("YoAlphaFilteredVariable must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(position.getDoubleValue()); + } + + public void update(double currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + set(currentPosition); + } + else + { + double alpha = alphaVariable.getValue(); + set(EuclidCoreTools.interpolate(currentPosition, getDoubleValue(), alpha)); + } + } + + /** + * This method is replaced by computeAlphaGivenBreakFrequencyProperly. It is fine to keep using this method is currently using it, knowing that + * the actual break frequency is not exactly what you are asking for. + * + * @param breakFrequencyInHertz + * @param dt + * @return + */ + @Deprecated + public static double computeAlphaGivenBreakFrequency(double breakFrequencyInHertz, double dt) + { + if (Double.isInfinite(breakFrequencyInHertz)) + return 0.0; + + double alpha = 1.0 - breakFrequencyInHertz * AngleTools.TwoPI * dt; + + alpha = MathTools.clamp(alpha, 0.0, 1.0); + + return alpha; + } + + /** + * This method has been replaced with {@link AlphaFilterTools#computeAlphaGivenBreakFrequencyProperly(double, double)}. It computes the alpha + * variable for an alpha filtered yo variable that is equivalent to a first order low pass frequnecy at filter {@param breakFrequencyInHertz} + * @return alpha value + */ + @Deprecated + public static double computeAlphaGivenBreakFrequencyProperly(double breakFrequencyInHertz, double dt) + { + return AlphaFilterTools.computeAlphaGivenBreakFrequencyProperly(breakFrequencyInHertz, dt); + } + + /** + * This method has been replaced with {@link AlphaFilterTools#computeBreakFrequencyGivenAlpha(double, double)}. + * This computes the break frequency of a first order low-pass filter given an alpha value. + * + * @return alpha value + */ + @Deprecated + public static double computeBreakFrequencyGivenAlpha(double alpha, double dt) + { + return AlphaFilterTools.computeBreakFrequencyGivenAlpha(alpha, dt); + } + + public boolean getHasBeenCalled() + { + return hasBeenCalled.getBooleanValue(); + } + +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AngleTools.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AngleTools.java new file mode 100644 index 00000000..e493d1d5 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AngleTools.java @@ -0,0 +1,399 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.euclid.referenceFrame.interfaces.FramePoint2DReadOnly; +import us.ihmc.euclid.referenceFrame.interfaces.FramePose2DReadOnly; +import us.ihmc.euclid.tuple2D.interfaces.Point2DReadOnly; +import us.ihmc.euclid.tuple2D.interfaces.Vector2DReadOnly; +import us.ihmc.euclid.tuple3D.Vector3D; +import us.ihmc.euclid.tuple3D.interfaces.Tuple3DBasics; +import us.ihmc.euclid.tuple3D.interfaces.Tuple3DReadOnly; +import us.ihmc.euclid.tuple4D.Quaternion32; + +import java.util.Random; + +// TODO replace with teh values that are pushed into ihmc commons +@Deprecated +public class AngleTools +{ + + public static final double PI = Math.PI; + public static final double TwoPI = 2.0 * PI; + public static final double EPSILON = 1e-10; + + private AngleTools() + { + + } + + public static double trimAngleMinusPiToPi(double angle) + { + return AngleTools.shiftAngleToStartOfRange(angle, -PI); + } + + public static float getAngle(Quaternion32 q) + { + return 2.0f * (float) Math.acos(q.getS()); + } + + public static double angleMinusPiToPi(Vector2DReadOnly startVector, Vector2DReadOnly endVector) + { + double absoluteAngle = Math.acos(startVector.dot(endVector) / startVector.norm() / endVector.norm()); + + Vector3D start3d = new Vector3D(startVector.getX(), startVector.getY(), 0.0); + Vector3D end3d = new Vector3D(endVector.getX(), endVector.getY(), 0.0); + + Vector3D crossProduct = new Vector3D(); + crossProduct.cross(start3d, end3d); + + if (crossProduct.getZ() >= 0.0) + { + return absoluteAngle; + } + else + { + return -absoluteAngle; + } + } + + public static double computeAngleAverage(double angleA, double angleB) + { + // average = A + (B-A)/2 = (A+B)/2 + return interpolateAngle(angleA, angleB, 0.5); + } + + /** + * Performs a linear interpolation from {@code angleA} to {@code angleB} given the percentage + * {@code alpha} and trim the result to be in [-pi, pi]. + *
+ * For example, if a deadband of 1 is applied to a signal of 3, the return is 2. If a deadband of 3 is applied to a signal of 3, the return is 0. + *
+ * + * @param deadbandSize size of deadband to apply + * @param value value to apply the deadband to. + * @return value after applying the deadband. + */ + public static double applyDeadband(double deadbandSize, double value) + { + return applyDeadband(deadbandSize, 0.0, value); + } + + /** + * Applies a deadband of size {@param deadbandSize} to value {@param value}, centered about {@param deadbandCenter}. + *+ * For example, if a deadband of 1 is applied to a signal of 3 about 2, the return is 2. if a deadband of 3 is applied to a signal of 3 about 1, the return + * is 1. + *
+ * + * @param deadbandSize size of deadband to apply + * @param deadbandCenter center about which the deadband is applied. + * @param value value to apply the deadband to. + * @return value after applying the deadband. + */ + public static double applyDeadband(double deadbandSize, double deadbandCenter, double value) + { + if (value > deadbandCenter) + return Math.max(deadbandCenter, value - deadbandSize); + else + return Math.min(deadbandCenter, value + deadbandSize); + } + + /** + * Applies a deadband to the length of a vector. + * + * @param vectorToPack vector to apply the deadband to. + * @param deadband deadband magnitude to apply. + */ + public static void applyDeadband(Vector2DBasics vectorToPack, double deadband) + { + double length = vectorToPack.norm(); + if (length < deadband) + { + vectorToPack.setToZero(); + } + else + { + double newLength = length - deadband; + vectorToPack.scale(newLength / length); + } + } + + /** + * Applies a deadband to the length of a vector. + * + * @param vectorToPack vector to apply the deadband to. + * @param deadband deadband magnitude to apply. + */ + public static boolean applyDeadband(Vector3DBasics vectorToPack, double deadband) + { + double length = vectorToPack.norm(); + if (length < deadband) + { + vectorToPack.setToZero(); + return false; + } + else + { + double newLength = length - deadband; + vectorToPack.scale(newLength / length); + return true; + } + } + + /** + * Applies a deadband to the magnitude of a point from another point, where the total distance is the value that is deadbanded. This can be thought of as + * applying a deadband of the size {@param deadband} to the vector from {@param centerPoint} to {@param pointToPack}, and then using this deadbanded vector + * to recompute the value of {@param pointToPack}. + * + * @param pointToPack point to apply the deadband to. + * @param centerPoint point about which to apply the deadband. + * @param deadband deadband magnitude to apply. + */ + public static boolean applyDeadband(Point2DBasics pointToPack, Point2DReadOnly centerPoint, double deadband) + { + double distance = pointToPack.distance(centerPoint); + if (distance < deadband) + { + pointToPack.set(centerPoint); + return false; + } + else + { + double newDistance = distance - deadband; + pointToPack.interpolate(centerPoint, 1.0 - newDistance / distance); + return true; + } + } + + /** + * Applies a deadband to the magnitude of a point from another point, where the total distance is the value that is deadbanded. This can be thought of as + * applying a deadband of the size {@param deadband} to the vector from {@param centerPoint} to {@param pointToPack}, and then using this deadbanded vector + * to recompute the value of {@param pointToPack}. + * + * @param pointToPack point to apply the deadband to. + * @param centerPoint point about which to apply the deadband. + * @param deadband deadband magnitude to apply. + */ + public static boolean applyDeadband(Point3DBasics pointToPack, Point3DReadOnly centerPoint, double deadband) + { + double distance = pointToPack.distance(centerPoint); + if (distance < deadband) + { + pointToPack.set(centerPoint); + return false; + } + else + { + double newDistance = distance - deadband; + pointToPack.interpolate(centerPoint, 1.0 - newDistance / distance); + return true; + } + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DeadbandedYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DeadbandedYoVariable.java new file mode 100644 index 00000000..12670240 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DeadbandedYoVariable.java @@ -0,0 +1,59 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class DeadbandedYoVariable extends YoDouble implements ProcessingYoVariable +{ + private final DoubleProvider deadzoneSize; + private final DoubleProvider inputVariable; + + public DeadbandedYoVariable(String name, DoubleProvider deadzoneSize, YoRegistry registry) + { + super(name, registry); + this.inputVariable = null; + this.deadzoneSize = deadzoneSize; + } + + public DeadbandedYoVariable(String name, DoubleProvider inputVariable, DoubleProvider deadzoneSize, YoRegistry registry) + { + super(name, registry); + this.inputVariable = inputVariable; + this.deadzoneSize = deadzoneSize; + } + + public void update() + { + if (inputVariable == null) + throw new NullPointerException("DeadzoneYoVariable must be constructed with a non null " + + "input variable to call update(), otherwise use update(double)"); + update(inputVariable.getValue()); + } + + public void update(double valueToBeCorrected) + { + super.set(DeadbandTools.applyDeadband(deadzoneSize.getValue(), valueToBeCorrected)); + } + + public static void main(String[] args) + { + YoRegistry registry = new YoRegistry("test"); + YoDouble deadzoneSize = new YoDouble("deadzoneSize", registry); + YoDouble input = new YoDouble("input", registry); + deadzoneSize.set(2.0); + DeadbandedYoVariable testDeadzone = new DeadbandedYoVariable("testDeadZone", input, deadzoneSize, registry); + + for(int i = -50; i < 51; i++) + { + input.set((double)i); + testDeadzone.update(); + System.out.println("//////////////////////////"); + System.out.println("uncorrected = " + (double)i); + System.out.println("corrected = " + testDeadzone.getDoubleValue()); + } + + System.out.println("done"); + } + +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DelayedYoBoolean.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DelayedYoBoolean.java new file mode 100644 index 00000000..3d18c14f --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DelayedYoBoolean.java @@ -0,0 +1,72 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; + +/** + * This is a class that introduces purposeful delay between the passed in variable and the output of this variable. This is useful to capture latency in a + * process. The length of the delay is set by a specific number of ticks. + */ +public class DelayedYoBoolean extends YoBoolean +{ + private final YoBoolean variableToDelay; + + private final YoBoolean[] previousYoVariables; + + public DelayedYoBoolean(String name, String description, YoBoolean variableToDelay, int ticksToDelay, YoRegistry registry) + { + super(name, description, registry); + + this.variableToDelay = variableToDelay; + previousYoVariables = new YoBoolean[ticksToDelay]; + + for (int i = 0; i < ticksToDelay; i++) + { + previousYoVariables[i] = new YoBoolean(name + "_previous" + i, registry); + previousYoVariables[i].set(variableToDelay.getBooleanValue()); + } + + this.set(variableToDelay.getBooleanValue()); + } + + public void update() + { + if (previousYoVariables.length == 0) + { + this.set(variableToDelay.getBooleanValue()); + return; + } + + this.set(previousYoVariables[0].getBooleanValue()); + + for (int i = 0; i < previousYoVariables.length - 1; i++) + { + previousYoVariables[i].set(previousYoVariables[i + 1].getBooleanValue()); + } + + previousYoVariables[previousYoVariables.length - 1].set(variableToDelay.getBooleanValue()); + } + + public void reset() + { + for (YoBoolean var : previousYoVariables) + { + var.set(variableToDelay.getBooleanValue()); + } + this.set(variableToDelay.getBooleanValue()); + } + + void getInternalState(String inputString, Boolean ifDebug) + { + if (!ifDebug) + return; + + String string = inputString + "\nvalue = " + this.getBooleanValue() + "\n"; + for (int i = 0; i < previousYoVariables.length; i++) + { + string = string + i + " = " + previousYoVariables[i].getBooleanValue() + "\n"; + } + string = string + "variableToDelay = " + variableToDelay.getBooleanValue() + "\n"; + System.out.println(string); + } +} \ No newline at end of file diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DelayedYoDouble.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DelayedYoDouble.java new file mode 100644 index 00000000..47301666 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DelayedYoDouble.java @@ -0,0 +1,59 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +/** + * This is a class that introduces purposeful delay between the passed in variable and the output of this variable. This is useful to capture latency in a + * process. The length of the delay is set by a specific number of ticks. + */ +public class DelayedYoDouble extends YoDouble +{ + private final DoubleProvider variableToDelay; + + private final YoDouble[] previousYoDouble; + + public DelayedYoDouble(String name, String description, DoubleProvider variableToDelay, int ticksToDelay, YoRegistry registry) + { + super(name, description, registry); + + this.variableToDelay = variableToDelay; + previousYoDouble = new YoDouble[ticksToDelay]; + + for (int i = 0; i < ticksToDelay; i++) + { + previousYoDouble[i] = new YoDouble(name + "_previous" + i, registry); + previousYoDouble[i].set(variableToDelay.getValue()); + } + + this.set(variableToDelay.getValue()); + } + + public void update() + { + if (previousYoDouble.length == 0) + { + this.set(variableToDelay.getValue()); + return; + } + + this.set(previousYoDouble[0].getValue()); + + for (int i = 0; i < previousYoDouble.length - 1; i++) + { + previousYoDouble[i].set(previousYoDouble[i + 1].getValue()); + } + + previousYoDouble[previousYoDouble.length - 1].set(variableToDelay.getValue()); + } + + public void reset() + { + for (YoDouble var : previousYoDouble) + { + var.set(variableToDelay.getValue()); + } + this.set(variableToDelay.getValue()); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DeltaLimitedYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DeltaLimitedYoVariable.java new file mode 100644 index 00000000..688363d1 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DeltaLimitedYoVariable.java @@ -0,0 +1,68 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +/** + * This variable stores data in such a way that its value is guaranteed to be within a certain delta of the desired value. + */ +public class DeltaLimitedYoVariable extends YoDouble +{ + private final YoDouble maxDelta; + private final YoDouble actual; + private final YoDouble desired; + private final YoBoolean isLimitingActive; + + public DeltaLimitedYoVariable(String name, YoRegistry registry, double maxDelta) + { + super(name, registry); + + this.maxDelta = new YoDouble(name + "MaxAllowedDelta", registry); + this.maxDelta.set(Math.abs(maxDelta)); + this.actual = new YoDouble(name + "Actual", registry); + this.desired = new YoDouble(name + "Desired", registry); + this.isLimitingActive = new YoBoolean(name + "IsLimitingActive", registry); + isLimitingActive.set(false); + } + + public void setMaxDelta(double maxDelta) + { + this.maxDelta.set(Math.abs(maxDelta)); + } + + public void updateOutput(double actual, double desired) + { + this.desired.set(desired); + this.actual.set(actual); + updateOutput(); + } + + public boolean isLimitingActive() + { + return isLimitingActive.getBooleanValue(); + } + + private void updateOutput() + { + double actualDoubleValue = actual.getDoubleValue(); + double desiredDoubleValue = desired.getDoubleValue(); + double maxDeltaDoubleValue = Math.abs(maxDelta.getDoubleValue()); + double rawDelta = actualDoubleValue - desiredDoubleValue; + double sign = Math.signum(rawDelta); + double requestedDelta = Math.abs(rawDelta); + double overshoot = maxDeltaDoubleValue - requestedDelta; + + if(overshoot < 0) + { + desiredDoubleValue = actualDoubleValue - maxDeltaDoubleValue * sign; + isLimitingActive.set(true); + } + else + { + isLimitingActive.set(false); + } + + this.set(desiredDoubleValue); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FilteredDiscreteVelocityYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FilteredDiscreteVelocityYoVariable.java new file mode 100644 index 00000000..23c41014 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FilteredDiscreteVelocityYoVariable.java @@ -0,0 +1,168 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.euclid.tools.EuclidCoreTools; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoEnum; + +/** + * @author jrebula + *+ * A {@link FilteredDiscreteVelocityYoVariable} is a filtered velocity of a position. That is, it takes the finite difference of the position signal to + * compute a velocity, it then filters the velocity using an alpha filter + * Either a YoVariable holding the position is passed in to the + * constructor and update() is called every tick, or update(double) is + * called every tick. The YoFilteredVelocityVariable updates it's val + * with the current velocity after a filter of + *
+ * + *+ * vel_{n} = alpha * vel{n-1} + (1 - alpha) * (pos_{n} - pos_{n-1}) + *+ * + */ +public class FilteredDiscreteVelocityYoVariable extends YoDouble +{ + + private final YoDouble time; + + private final DoubleProvider alphaVariable; + private final YoDouble position; + + private final YoDouble lastUpdateTime; + private final YoEnum
+ * A {@link FilteredFiniteDifferenceYoVariable} computes the velocity of a position signal via finite differencing it, and then applies an alpha filter to that + * value. The value contained in the parent {@link YoDouble} returns the filtered velocity signal. + *
+ *+ * To construct and use this variable, either a YoVariable holding the position is passed in at construction + * constructor and {@link #update()} is called every tick, or {@link #update(double)} is + * called every tick. + *
+ *The {@link FilteredFiniteDifferenceYoVariable} updates its value with the current velocity after a filter of + *
+ * + *+ * vel_{n} = alpha * vel{n-1} + (1 - alpha) * (pos_{n} - pos_{n-1}) + *+ */ +public class FilteredFiniteDifferenceYoVariable extends YoDouble implements ProcessingYoVariable +{ + private final double dt; + + private final DoubleProvider alphaVariable; + private final DoubleProvider position; + + // private double lastPosition; + private final YoDouble lastPosition; + private final YoBoolean hasBeenCalled; + + public FilteredFiniteDifferenceYoVariable(String name, String description, double alpha, double dt, YoRegistry registry) + { + this(name, description, alpha, null, dt, registry); + } + + public FilteredFiniteDifferenceYoVariable(String name, String description, double alpha, DoubleProvider positionVariable, double dt, YoRegistry registry) + { + this(name, description, VariableTools.createAlphaYoDouble(name, "", alpha, registry), positionVariable, dt, registry); + } + + public FilteredFiniteDifferenceYoVariable(String name, String description, DoubleProvider alphaVariable, double dt, YoRegistry registry) + { + this(name, description, alphaVariable, null, dt, registry); + } + + public FilteredFiniteDifferenceYoVariable(String name, + String description, + DoubleProvider alphaVariable, + DoubleProvider positionVariable, + double dt, + YoRegistry registry) + { + super(name, description, registry); + this.hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(name, "", registry); + + position = positionVariable; + this.alphaVariable = alphaVariable; + + this.dt = dt; + + lastPosition = new YoDouble(name + "_lastPosition", registry); + + reset(); + } + + @Override + public void reset() + { + hasBeenCalled.set(false); + } + + @Override + public void update() + { + if (position == null) + { + throw new NullPointerException( + "YoFilteredVelocityVariable must be constructed with a non null " + "position variable to call update(), otherwise use update(double)"); + } + + update(position.getValue()); + } + + public void updateForAngles() + { + if (position == null) + { + throw new NullPointerException( + "YoFilteredVelocityVariable must be constructed with a non null " + "position variable to call update(), otherwise use update(double)"); + } + + updateForAngles(position.getValue()); + } + + public void update(double currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + lastPosition.set(currentPosition); + set(0.0); + } + + double difference = currentPosition - lastPosition.getDoubleValue(); + + updateUsingDifference(difference); + + lastPosition.set(currentPosition); + } + + public void updateForAngles(double currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + lastPosition.set(currentPosition); + set(0.0); + } + + double difference = AngleTools.computeAngleDifferenceMinusPiToPi(currentPosition, lastPosition.getDoubleValue()); + + updateUsingDifference(difference); + + lastPosition.set(currentPosition); + } + + private void updateUsingDifference(double difference) + { + double previousFilteredDerivative = getDoubleValue(); + double currentRawDerivative = difference / dt; + + double alpha = alphaVariable.getValue(); + set(alpha * previousFilteredDerivative + (1.0 - alpha) * currentRawDerivative); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderBandPassFilteredYoDouble.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderBandPassFilteredYoDouble.java new file mode 100644 index 00000000..08596c2b --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderBandPassFilteredYoDouble.java @@ -0,0 +1,185 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +public class FirstOrderBandPassFilteredYoDouble extends YoDouble +{ + private final YoBoolean hasBeenCalled; + + private double filterUpdateTimeOld; + private FirstOrderFilterType filterType; + + private final YoDouble firstCutoffFrequencyHz; + private final YoDouble secondCutoffFrequencyHz; + + private final DoubleProvider yoTime; + private double dt; + + + public enum FirstOrderFilterType + { + NOTCH, BAND + } + + public FirstOrderBandPassFilteredYoDouble(String name, + String description, + double minPassThroughFrequency_Hz, + double maxPassThroughFrequency_Hz, + DoubleProvider yoTime, + FirstOrderFilterType filterType, + YoRegistry registry) + { + this(name, description, minPassThroughFrequency_Hz, maxPassThroughFrequency_Hz, yoTime, 0.0, filterType, registry); + } + + public FirstOrderBandPassFilteredYoDouble(String name, + String description, + double minPassThroughFrequency_Hz, + double maxPassThroughFrequency_Hz, + double dt, + FirstOrderFilterType filterType, + YoRegistry registry) + { + this(name, description, minPassThroughFrequency_Hz, maxPassThroughFrequency_Hz, null, dt, filterType, registry); + } + + private FirstOrderBandPassFilteredYoDouble(String name, + String description, + double minPassThroughFrequency_Hz, + double maxPassThroughFrequency_Hz, + DoubleProvider yoTime, + double dt, + FirstOrderFilterType filterType, + YoRegistry registry) + { + super(name, description, registry); + + String firstCutoffFrequencyName, secondCuttoffFrequencyName; + switch (filterType) + { + case NOTCH: + firstCutoffFrequencyName = name + "_NotchPassStart_Hz"; + secondCuttoffFrequencyName = name + "_NotchPassEnd_Hz"; + break; + case BAND: + firstCutoffFrequencyName = name + "_BandPassStart_Hz"; + secondCuttoffFrequencyName = name + "_BandPassEnd_Hz"; + break; + default: + throw new RuntimeException("Must specify filter type notch or break"); + } + + hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(name, "", registry); + hasBeenCalled.set(false); + this.firstCutoffFrequencyHz = new YoDouble(firstCutoffFrequencyName, registry); + this.firstCutoffFrequencyHz.set(minPassThroughFrequency_Hz); + this.secondCutoffFrequencyHz = new YoDouble(secondCuttoffFrequencyName, registry); + this.secondCutoffFrequencyHz.set(maxPassThroughFrequency_Hz); + + this.yoTime = yoTime; + this.dt = dt; + + this.filterType = filterType; + } + + private void checkPassband(double minPassThroughFrequency_Hz, double maxPassThroughFrequency_Hz) + { + if (minPassThroughFrequency_Hz > maxPassThroughFrequency_Hz) + { + throw new RuntimeException( + "minPassThroughFrequency [ " + minPassThroughFrequency_Hz + " ] > maxPassThroughFrequency [ " + maxPassThroughFrequency_Hz + " ]"); + } + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update(double filterInput) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + this.set(filterInput); + } + else + { + if (yoTime != null) + { + double timeSinceLastUpdate = yoTime.getValue() - filterUpdateTimeOld; + + if (timeSinceLastUpdate > 0.0) + { + dt = timeSinceLastUpdate; + } + else + { + reset(); + // throw new RuntimeException("Computed step size, DT must be greater than zero. DT = " + dt + ". Current time = " + yoTime.getDoubleValue() + ", previous update time = " + filterUpdateTimeOld); + } + } + double filterOutput; + + switch (filterType) + { + case NOTCH: + filterOutput = applyNotchFilter(filterInput, dt); + break; + case BAND: + filterOutput = applyBandFilter(filterInput, dt); + break; + default: + throw new RuntimeException("The first order filter must be either a high pass or low pass filter, it cannot be " + filterType); + } + + this.set(filterOutput); + } + + if (yoTime != null) + { + filterUpdateTimeOld = yoTime.getValue(); + } + } + + public void setPassBand(double minPassThroughFreqHz, double maxPassThroughFreqHz) + { + checkPassband(minPassThroughFreqHz, maxPassThroughFreqHz); + + firstCutoffFrequencyHz.set(minPassThroughFreqHz); + secondCutoffFrequencyHz.set(maxPassThroughFreqHz); + } + + private double applyNotchFilter(double filterInput, double dt) + { + double lowFiltered = applyLowPassFilter(filterInput, firstCutoffFrequencyHz.getDoubleValue(), dt); + double highFiltered = applyHighPassFilter(filterInput, secondCutoffFrequencyHz.getDoubleValue(), dt); + + return lowFiltered + highFiltered; + } + + private double applyBandFilter(double filterInput, double dt) + { + double lowFiltered = applyLowPassFilter(filterInput, firstCutoffFrequencyHz.getDoubleValue(), dt); + double highFiltered = applyHighPassFilter(filterInput, secondCutoffFrequencyHz.getDoubleValue(), dt); + + return filterInput - lowFiltered - highFiltered; + } + + private double applyLowPassFilter(double filterInput, double breakFrequency, double dt) + { + double alpha = AlphaFilterTools.computeAlphaGivenBreakFrequencyProperly(dt, breakFrequency); + + return alpha * this.getDoubleValue() + (1.0 - alpha) * filterInput; + } + + private double applyHighPassFilter(double filterInput, double breakFrequency, double dt) + { + double lowPassValue = applyLowPassFilter(filterInput, breakFrequency, dt); + + return filterInput - lowPassValue; + } +} \ No newline at end of file diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderFilteredYoDouble.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderFilteredYoDouble.java new file mode 100644 index 00000000..ef26ebab --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderFilteredYoDouble.java @@ -0,0 +1,140 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoDouble; + +public class FirstOrderFilteredYoDouble extends YoDouble +{ + public enum FirstOrderFilterType + { + LOW_PASS, NOTCH, BAND, HIGH_PASS + } + + private boolean hasBeenCalled = false; + + private double filterUpdateTimeOld; + + private final YoDouble cutoffFrequencyHz; + + private final DoubleProvider yoTime; + private double dt; + + private FirstOrderFilterType filterType; + + public FirstOrderFilteredYoDouble(String name, + String description, + double cutoffFrequencyHz, + DoubleProvider yoTime, + FirstOrderFilterType highOrLowPass, + YoRegistry registry) + { + super(name, description, registry); + + String cutoffFrequencyName; + switch (highOrLowPass) + { + case LOW_PASS: + cutoffFrequencyName = name + "_LowPassCutoff_Hz"; + break; + case HIGH_PASS: + cutoffFrequencyName = name + "_HighPassCutoff_Hz"; + break; + default: + throw new RuntimeException("Must Specify Filter Type as Low or High Pass. Current Specification : " + highOrLowPass); + } + + this.cutoffFrequencyHz = new YoDouble(cutoffFrequencyName, registry); + this.cutoffFrequencyHz.set(cutoffFrequencyHz); + + this.yoTime = yoTime; + + this.filterType = highOrLowPass; + } + + public FirstOrderFilteredYoDouble(String name, + String description, + double cutoffFrequency_Hz, + double dt, + FirstOrderFilterType highOrLowPass, + YoRegistry registry) + { + this(name, description, cutoffFrequency_Hz, null, highOrLowPass, registry); + this.dt = dt; + } + + private double computeLowPassUpdate(double filterInput, double dt) + { + double alpha = AlphaFilterTools.computeAlphaGivenBreakFrequencyProperly(dt, cutoffFrequencyHz.getDoubleValue()); + + return alpha * this.getDoubleValue() + (1.0 - alpha) * filterInput; + } + + private double computeHighPassUpdate(double filterInput, double dt) + { + double lowPassValue = computeLowPassUpdate(filterInput, dt); + + return filterInput - lowPassValue; + } + + public void reset() + { + hasBeenCalled = false; + } + + public void setCutoffFrequencyHz(double cutoffHz) + { + this.cutoffFrequencyHz.set(cutoffHz); + } + + public void update(double filterInput) + { + if (!hasBeenCalled) + { + hasBeenCalled = true; + + filterUpdateTimeOld = 0.0; + + this.set(filterInput); + } + else + { + if (yoTime != null) + { + double timeSinceLastUpdate = yoTime.getValue() - filterUpdateTimeOld; + + if (timeSinceLastUpdate > 0.0) + { + dt = timeSinceLastUpdate; + } + else + { + reset(); + // throw new RuntimeException("Computed step size, DT must be greater than zero. DT = " + dt + ". Current time = " + yoTime.getDoubleValue() + ", previous update time = " + filterUpdateTimeOld); + } + } + + double filterOutput; + + switch (filterType) + { + case LOW_PASS: + filterOutput = computeLowPassUpdate(filterInput, dt); + break; + case HIGH_PASS: + filterOutput = computeHighPassUpdate(filterInput, dt); + break; + default: + throw new RuntimeException("The first order filter must be either a high pass or low pass filter, it cannot be " + filterType); + } + + this.set(filterOutput); + } + + + if (yoTime != null) + { + filterUpdateTimeOld = yoTime.getValue(); + } + } +} \ No newline at end of file diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/GlitchFilteredYoBoolean.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/GlitchFilteredYoBoolean.java new file mode 100644 index 00000000..c2f6d2f0 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/GlitchFilteredYoBoolean.java @@ -0,0 +1,92 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoInteger; + +public class GlitchFilteredYoBoolean extends YoBoolean +{ + private final YoBoolean variableToFilter; + private final YoInteger windowSize; + protected final YoInteger counter; + + public GlitchFilteredYoBoolean(String name, YoRegistry registry, int windowSize) + { + this(name, "", registry, null, windowSize); + } + + public GlitchFilteredYoBoolean(String name, YoRegistry registry, YoBoolean yoVariableToFilter, int windowSize) + { + this(name, "", registry, yoVariableToFilter, windowSize); + } + + public GlitchFilteredYoBoolean(String name, YoRegistry registry, YoBoolean yoVariableToFilter, YoInteger windowSize) + { + this(name, "", registry, yoVariableToFilter, windowSize); + } + + public GlitchFilteredYoBoolean(String name, String description, YoRegistry registry, YoBoolean yoVariableToFilter, int windowSize) + { + this(name, description, registry, yoVariableToFilter, VariableTools.createWindowSizeYoInteger(name, "", windowSize, registry)); + } + + public GlitchFilteredYoBoolean(String name, String description, YoRegistry registry, YoBoolean yoVariableToFilter, YoInteger windowSize) + { + super(name, description, registry); + counter = new YoInteger(name + "Count", description, registry); + this.windowSize = windowSize; + + if (windowSize.getIntegerValue() < 0) + throw new RuntimeException("window size must be greater than 0"); + + variableToFilter = yoVariableToFilter; + + if (variableToFilter != null) + this.set(yoVariableToFilter.getBooleanValue()); + + this.set(false); + } + + public boolean set(boolean value) + { + if (counter != null) + { + counter.set(0); + } + return super.set(value); + } + + public void update(boolean value) + { + + if (value != this.getBooleanValue()) + { + counter.set(counter.getIntegerValue() + 1); + } + else + counter.set(0); + + if (counter.getIntegerValue() >= (windowSize.getIntegerValue())) + set(value); + } + + public int getWindowSize() + { + return windowSize.getIntegerValue(); + } + + public void setWindowSize(int windowSize) //untested + { + this.windowSize.set(windowSize); + } + + public void update() + { + if (variableToFilter == null) + { + throw new RuntimeException("variableToFilter was not initialized. Use the other constructor"); + } + else + update(variableToFilter.getBooleanValue()); + } +} \ No newline at end of file diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/GlitchFilteredYoInteger.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/GlitchFilteredYoInteger.java new file mode 100644 index 00000000..469e7a70 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/GlitchFilteredYoInteger.java @@ -0,0 +1,99 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.providers.IntegerProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoInteger; + +public class GlitchFilteredYoInteger extends YoInteger +{ + private final IntegerProvider position; + private final YoInteger previousPosition; + private final IntegerProvider windowSize; + private final YoInteger counter; + + public GlitchFilteredYoInteger(String name, int windowSize, YoRegistry registry) + { + this(name, windowSize, null, registry); + } + + public GlitchFilteredYoInteger(String name, int windowSize, IntegerProvider position, YoRegistry registry) + { + this(name, VariableTools.createWindowSizeYoInteger(name, "", windowSize, registry), position, registry); + } + + public GlitchFilteredYoInteger(String name, IntegerProvider windowSize, YoRegistry registry) + { + this(name, windowSize, null, registry); + } + + public GlitchFilteredYoInteger(String name, IntegerProvider windowSize, IntegerProvider position, YoRegistry registry) + { + super(name, GlitchFilteredYoInteger.class.getSimpleName(), registry); + + this.position = position; + + previousPosition = new YoInteger(name + "PrevValue", registry); + counter = new YoInteger(name + "Count", registry); + this.windowSize = windowSize; + } + + @Override + public boolean set(int value) + { + if (counter != null) + counter.set(0); + return super.set(value); + } + + @Override + public boolean set(int value, boolean notifyListeners) + { + if (counter != null) + counter.set(0); + return super.set(value, notifyListeners); + } + + public void update() + { + if (position == null) + { + throw new NullPointerException( + "GlitchFilteredYoInteger must be constructed with a non null position variable to call update(), otherwise use update(int)"); + } + + update(position.getValue()); + } + + public void update(int currentValue) + { + if (currentValue == previousPosition.getIntegerValue()) + counter.increment(); + else + counter.set(0); + + if (counter.getIntegerValue() >= windowSize.getValue()) + { + set(currentValue); + counter.set(0); + } + + previousPosition.set(currentValue); + } + + public int getWindowSize() + { + return windowSize.getValue(); + } + + public void setWindowSize(int windowSize) + { + if (this.windowSize instanceof YoInteger) + { + ((YoInteger) this.windowSize).set(windowSize); + } + else + { + throw new RuntimeException("Setting the window size is not supported"); + } + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/JerkLimitedYoDouble.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/JerkLimitedYoDouble.java new file mode 100644 index 00000000..8f66d063 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/JerkLimitedYoDouble.java @@ -0,0 +1,151 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +public class JerkLimitedYoDouble extends YoDouble +{ + private final double dt; + + private final YoBoolean hasBeenInitialized; + + private final YoDouble smoothedRate; + private final YoDouble smoothedAcceleration; + private final YoDouble smoothedJerk; + + private final YoDouble positionGain; + private final YoDouble velocityGain; + private final YoDouble accelerationGain; + + private final YoDouble maximumJerk; + private final YoDouble maximumAcceleration; + + private final YoDouble inputPosition; + private final YoDouble inputVelocity; + private final YoDouble inputAcceleration; + + public JerkLimitedYoDouble(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, double dt) + { + this(name, registry, maxAcceleration, maxJerk, null, null, null, dt); + } + + public JerkLimitedYoDouble(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, + YoDouble inputPosition, double dt) + { + this(name, registry, maxAcceleration, maxJerk, inputPosition, null, null, dt); + } + + public JerkLimitedYoDouble(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, + YoDouble inputPosition, YoDouble inputVelocity, double dt) + { + this(name, registry, maxAcceleration, maxJerk, inputPosition, inputVelocity, null, dt); + } + + public JerkLimitedYoDouble(String name, YoRegistry registry, YoDouble maxAcceleration, YoDouble maxJerk, + YoDouble inputPosition, YoDouble inputVelocity, YoDouble inputAcceleration, double dt) + { + super(name, registry); + + this.inputPosition = inputPosition; + this.inputVelocity = inputVelocity; + this.inputAcceleration = inputAcceleration; + + this.maximumJerk = maxJerk; + this.maximumAcceleration = maxAcceleration; + + this.dt = dt; + + hasBeenInitialized = new YoBoolean(name + "HasBeenInitialized", registry); + + smoothedRate = new YoDouble(name + "SmoothedRate", registry); + smoothedAcceleration = new YoDouble(name + "SmoothedAcceleration", registry); + smoothedJerk = new YoDouble(name + "SmoothedJerk", registry); + + positionGain = new YoDouble(name + "PositionGain", registry); + velocityGain = new YoDouble(name + "VelocityGain", registry); + accelerationGain = new YoDouble(name + "AccelerationGain", registry); + + double w0 = 2.0 * Math.PI * 16.0; + double w1 = 2.0 * Math.PI * 16.0; + double zeta = 1.0; + + setGainsByPolePlacement(w0, w1, zeta); + hasBeenInitialized.set(false); + } + + public void setMaximumAcceleration(double maximumAcceleration) + { + this.maximumAcceleration.set(maximumAcceleration); + } + + public void setMaximumJerk(double maximumJerk) + { + this.maximumJerk.set(maximumJerk); + } + + public void setGainsByPolePlacement(double w0, double w1, double zeta) + { + positionGain.set(w0 * w1 * w1); + velocityGain.set(w1 * w1 + 2.0 * zeta * w1 * w0); + accelerationGain.set(w0 + 2.0 * zeta * w1); + } + + public void update() + { + double inputPosition = this.inputPosition == null ? 0.0 : this.inputPosition.getDoubleValue(); + double inputVelocity = this.inputVelocity == null ? 0.0 : this.inputVelocity.getDoubleValue(); + double inputAcceleration = this.inputAcceleration == null ? 0.0 : this.inputAcceleration.getDoubleValue(); + + update(inputPosition, inputVelocity, inputAcceleration); + } + + public void update(double inputPosition) + { + update(inputPosition, 0.0, 0.0); + } + + public void update(double inputPosition, double inputVelocity) + { + update(inputPosition, inputVelocity, 0.0); + } + + public void update(double inputPosition, double inputVelocity, double inputAcceleration) + { + if (!hasBeenInitialized.getBooleanValue()) + initialize(inputPosition, inputVelocity, inputAcceleration); + + double positionError = inputPosition - this.getDoubleValue(); + double velocityError = inputVelocity - smoothedRate.getDoubleValue(); + double accelerationError = inputAcceleration - smoothedAcceleration.getDoubleValue(); + double jerk = accelerationGain.getDoubleValue() * accelerationError + velocityGain.getDoubleValue() * velocityError + positionGain.getDoubleValue() + * positionError; + jerk = MathTools.clamp(jerk, -maximumJerk.getDoubleValue(), maximumJerk.getDoubleValue()); + + smoothedJerk.set(jerk); + smoothedAcceleration.add(smoothedJerk.getDoubleValue() * dt); + smoothedAcceleration.set(MathTools.clamp(smoothedAcceleration.getDoubleValue(), maximumJerk.getDoubleValue())); + smoothedRate.add(smoothedAcceleration.getDoubleValue() * dt); + this.add(smoothedRate.getDoubleValue() * dt); + } + + public void initialize(double inputPosition, double inputVelocity, double inputAcceleration) + { + this.set(inputPosition); + smoothedRate.set(inputVelocity); + smoothedAcceleration.set(inputAcceleration); + smoothedJerk.set(0.0); + + this.hasBeenInitialized.set(true); + } + + public void reset() + { + this.hasBeenInitialized.set(false); + smoothedRate.set(0.0); + smoothedAcceleration.set(0.0); + smoothedJerk.set(0.0); + } + +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/MovingAverageYoDouble.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/MovingAverageYoDouble.java new file mode 100644 index 00000000..bad8f2db --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/MovingAverageYoDouble.java @@ -0,0 +1,114 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +/** + * @author thutcheson + * + *
+ *
+ *+ * A BetaFilteredYoVariable is a filtered version of an input YoVar. + * This is a moving average filter. + * Either a YoVariable holding the unfiltered val is passed in to the + * constructor and update() is called every tick, or update(double) is + * called every tick. The BetaFilteredYoVariable updates it's val + * with the current filtered version using + *
+ *+ * filtered_{n} = (raw_{0} + ... + raw_{n-1} + raw_{n}) / n + *+ */ +public class MovingAverageYoDouble extends YoDouble +{ + private int beta; + private int index = 0; + @SuppressWarnings("unused") + private final YoDouble betaVariable; + + private final YoDouble position; + + private final double[] raw; + private boolean bufferFull = false; + + private final YoBoolean hasBeenCalled; + + public MovingAverageYoDouble(String name, YoRegistry registry, int beta) + { + this(name, "", registry, beta, null); + } + + public MovingAverageYoDouble(String name, String description, YoRegistry registry, int beta) + { + this(name, description, registry, beta, null); + } + + public MovingAverageYoDouble(String name, YoRegistry registry, int beta, YoDouble positionVariable) + { + this(name, "", registry, beta, positionVariable); + } + + public MovingAverageYoDouble(String name, String description, YoRegistry registry, int beta, YoDouble positionVariable) + { + super(name, description, registry); + this.hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(name, "", registry); + + this.beta = beta; + this.position = positionVariable; + this.betaVariable = null; + + raw = new double[beta]; + + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + bufferFull = false; + index = 0; + + for (int i = 0; i < beta; i++) + { + set(0.0); + } + } + + public void update() + { + if (position == null) + { + throw new NullPointerException("BetaFilteredYoVariable must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(position.getDoubleValue()); + } + + public void update(double currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + set(currentPosition, false); + } + + raw[index++] = currentPosition; + if (index == beta) + { + index = 0; + bufferFull = true; + } + + final int size = bufferFull ? beta : index; + double value = 0.0; + for (int i = 0; i < size; i++) + { + value += raw[i]; + } + + set(value / size); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/ProcessingYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/ProcessingYoVariable.java new file mode 100644 index 00000000..d3182ab8 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/ProcessingYoVariable.java @@ -0,0 +1,10 @@ +package us.ihmc.yoVariables.filters; + +public interface ProcessingYoVariable +{ + public abstract void update(); + + public default void reset() + { + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/RateLimitedYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/RateLimitedYoVariable.java new file mode 100644 index 00000000..bcc4b17f --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/RateLimitedYoVariable.java @@ -0,0 +1,87 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +public class RateLimitedYoVariable extends YoDouble +{ + private final DoubleProvider maxRateVariable; + + private final DoubleProvider unlimitedPosition; + private final YoBoolean limited; + + private final double dt; + + private final YoBoolean hasBeenCalled; + + public RateLimitedYoVariable(String name, YoRegistry registry, double maxRate, double dt) + { + this(name, registry, maxRate, null, dt); + } + + public RateLimitedYoVariable(String name, YoRegistry registry, DoubleProvider maxRateVariable, double dt) + { + this(name, registry, maxRateVariable, null, dt); + } + + public RateLimitedYoVariable(String name, YoRegistry registry, double maxRate, DoubleProvider positionVariable, double dt) + { + this(name, registry, VariableTools.createMaxRateYoDouble(name, "", maxRate, registry), positionVariable, dt); + } + + public RateLimitedYoVariable(String name, YoRegistry registry, DoubleProvider maxRateVariable, DoubleProvider unlimitedPosition, double dt) + { + super(name, registry); + + this.hasBeenCalled = VariableTools.createHasBeenCalledYoBoolean(name, "", registry); + this.limited = VariableTools.createLimitedCalledYoBoolean(name, "", registry); + + this.unlimitedPosition = unlimitedPosition; + this.maxRateVariable = maxRateVariable; + + this.dt = dt; + + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (unlimitedPosition == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(unlimitedPosition.getValue()); + } + + public void update(double currentPosition) + { + if (!hasBeenCalled.getBooleanValue()) + { + hasBeenCalled.set(true); + set(currentPosition); + } + + if (maxRateVariable.getValue() < 0) + throw new RuntimeException("The maxRate parameter in the RateLimitedYoVariable cannot be negative."); + + double difference = currentPosition - getDoubleValue(); + if (Math.abs(difference) > maxRateVariable.getValue() * dt) + { + difference = Math.signum(difference) * maxRateVariable.getValue() * dt; + this.limited.set(true); + } + else + this.limited.set(false); + + set(getDoubleValue() + difference); + } +} \ No newline at end of file diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/RunningAverageYoDouble.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/RunningAverageYoDouble.java new file mode 100644 index 00000000..25c05db6 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/RunningAverageYoDouble.java @@ -0,0 +1,52 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoDouble; +import us.ihmc.yoVariables.variable.YoInteger; + +public class RunningAverageYoDouble extends YoDouble +{ + private final YoInteger sampleSize; + private final DoubleProvider dataSource; + + public RunningAverageYoDouble(String name, YoRegistry registry) + { + this(name, null, registry); + } + + public RunningAverageYoDouble(String name, DoubleProvider dataSource, YoRegistry registry) + { + super(name, registry); + + this.dataSource = dataSource; + sampleSize = new YoInteger(name + "SampleSize", registry); + } + + public void update() + { + if (dataSource == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "dataSource variable to call update(), otherwise use update(double)"); + } + + update(dataSource.getValue()); + } + + public void update(double dataSource) + { + sampleSize.increment(); + add((dataSource - getValue()) / sampleSize.getValue()); + } + + public void reset() + { + sampleSize.set(0); + } + + public int getSampleSize() + { + return sampleSize.getValue(); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SecondOrderFilterType.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SecondOrderFilterType.java new file mode 100644 index 00000000..d524c37e --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SecondOrderFilterType.java @@ -0,0 +1,6 @@ +package us.ihmc.yoVariables.filters; + +public enum SecondOrderFilterType +{ + LOW_PASS, NOTCH, BAND, HIGH_PASS +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SecondOrderFilteredYoDouble.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SecondOrderFilteredYoDouble.java new file mode 100644 index 00000000..28893835 --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SecondOrderFilteredYoDouble.java @@ -0,0 +1,204 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +/** + * A discrete-time second order filter using the bilinear transform + *
+ * ---------------------------------------------------------------- + * LOW PASS: + *
+ * Y(s) omega^2 + * ---- = ---------------------------------- + * X(s) s^2 + 2 * xi * omega * s + omega^2 + *
+ * ---------------------------------------------------------------- + * NOTCH: + *
+ * Y(s) s^2 + omega^2 + * ---- = ---------------------------------- + * X(s) s^2 + 2 * xi * omega * s + omega^2 + *
+ * ---------------------------------------------------------------- + * HIGH PASS: + *
+ * Y(s) s^2 + * ---- = ---------------------------------- + * X(s) s^2 + 2 * xi * omega * s + omega^2 + *
+ * ----------------------------------------------------------------- + *
+ * omega = 2 * PI * naturalFrequencyInHz
+ * xi = dampingRatio
+ */
+public class SecondOrderFilteredYoDouble extends YoDouble implements ProcessingYoVariable
+{
+ private final double dt;
+ private final SecondOrderFilteredYoVariableParameters parameters;
+ protected final YoBoolean hasBeenCalled;
+ private final YoDouble inputVariable;
+ private final YoDouble[] input;
+ private final YoDouble[] output;
+ private final double a[];
+ private final double b[];
+
+ public SecondOrderFilteredYoDouble(String name, YoRegistry registry, double dt, double naturalFrequencyInHz, double dampingRatio, SecondOrderFilterType filterType)
+ {
+ this(name, registry, dt, new SecondOrderFilteredYoVariableParameters(name, registry, naturalFrequencyInHz, dampingRatio, filterType), null);
+ }
+
+ public SecondOrderFilteredYoDouble(String name, YoRegistry registry, double dt, SecondOrderFilteredYoVariableParameters parameters)
+ {
+ this(name, registry, dt, parameters, null);
+ }
+
+ public SecondOrderFilteredYoDouble(String name,
+ YoRegistry registry,
+ double dt,
+ double naturalFrequencyInHz,
+ double dampingRatio,
+ SecondOrderFilterType filterType,
+ YoDouble inputVariable)
+ {
+ this(name, registry, dt, new SecondOrderFilteredYoVariableParameters(name, registry, naturalFrequencyInHz, dampingRatio, filterType), inputVariable);
+ }
+
+ public SecondOrderFilteredYoDouble(String name, YoRegistry registry, double dt, SecondOrderFilteredYoVariableParameters parameters, YoDouble inputVariable)
+ {
+ super(name, registry);
+ this.dt = dt;
+ this.parameters = parameters;
+ this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry);
+ this.inputVariable = inputVariable;
+ this.input = new YoDouble[3];
+ this.output = new YoDouble[3];
+ this.a = new double[3];
+ this.b = new double[3];
+ for (int i = 0; i < 3; i++)
+ {
+ this.input[i] = new YoDouble(name + "input" + i, registry);
+ this.output[i] = new YoDouble(name + "output" + i, registry);
+ }
+ reset();
+ }
+
+ @Override
+ public void reset()
+ {
+ hasBeenCalled.set(false);
+ computeCoefficients();
+ }
+
+ @Override
+ public void update()
+ {
+ if (inputVariable == null)
+ {
+ throw new NullPointerException(
+ "SecondOrderFilteredYoVariable must be constructed with a non null position variable to call update(), otherwise use update(double)");
+ }
+
+ update(inputVariable.getDoubleValue());
+ }
+
+ public void update(double currentInputValue)
+ {
+ if (!hasBeenCalled.getBooleanValue())
+ {
+ hasBeenCalled.set(true);
+ set(currentInputValue);
+ for (int i = 0; i < 3; i++)
+ {
+ input[i].set(currentInputValue);
+ output[i].set(currentInputValue);
+ }
+ return;
+ }
+
+ for (int i = 2; i > 0; i--)
+ {
+ input[i].set(input[i - 1].getDoubleValue());
+ output[i].set(output[i - 1].getDoubleValue());
+ }
+ input[0].set(currentInputValue);
+
+ double currentOutputValue = 0.0;
+ currentOutputValue += b[2] * input[2].getDoubleValue();
+ currentOutputValue += b[1] * input[1].getDoubleValue();
+ currentOutputValue += b[0] * input[0].getDoubleValue();
+ currentOutputValue -= a[2] * output[2].getDoubleValue();
+ currentOutputValue -= a[1] * output[1].getDoubleValue();
+ currentOutputValue /= a[0];
+ output[0].set(currentOutputValue);
+
+ set(currentOutputValue);
+ }
+
+ public void setNaturalFrequencyInHz(double naturalFrequencyInHz)
+ {
+ parameters.getNaturalFrequencyInHz().set(Math.min(Math.max(naturalFrequencyInHz, 0.0), 1.0 / (2.0 * dt)));
+ computeCoefficients();
+ }
+
+ public void setDampingRatio(double dampingRatio)
+ {
+ parameters.getDampingRatio().set(Math.max(dampingRatio, 0.0));
+ computeCoefficients();
+ }
+
+ public boolean getHasBeenCalled()
+ {
+ return hasBeenCalled.getBooleanValue();
+ }
+
+ public void getFilterCoefficients(double[] b, double[] a)
+ {
+ if (b.length < 3)
+ throw new RuntimeException("b must be of length 3 or greater");
+
+ if (a.length < 3)
+ throw new RuntimeException("a must be of length 3 or greater");
+
+ for (int i = 0; i < 3; i++)
+ b[i] = this.b[i];
+ for (int i = 3; i < b.length; i++)
+ b[i] = 0.0;
+ for (int i = 0; i < 3; i++)
+ a[i] = this.a[i];
+ for (int i = 3; i < a.length; i++)
+ a[i] = 0.0;
+ }
+
+ private void computeCoefficients()
+ {
+ double omega = 2 * Math.PI * parameters.getNaturalFrequencyInHz().getDoubleValue();
+ double xi = parameters.getDampingRatio().getDoubleValue();
+
+ switch (parameters.getFilterType())
+ {
+ case LOW_PASS:
+ b[0] = omega * omega;
+ b[1] = 2.0 * omega * omega;
+ b[2] = omega * omega;
+ break;
+ case NOTCH:
+ b[0] = 4.0 / (dt * dt) + omega * omega;
+ b[1] = 2.0 * omega * omega - 8.0 / (dt * dt);
+ b[2] = 4.0 / (dt * dt) + omega * omega;
+ break;
+ case HIGH_PASS:
+ b[0] = 4.0 / (dt * dt);
+ b[1] = -8.0 / (dt * dt);
+ b[2] = 4.0 / (dt * dt);
+ break;
+ case BAND:
+ throw new IllegalArgumentException("Band pass filters are not established for the second order filter yo variable.");
+ }
+
+ a[0] = 4.0 / (dt * dt) + 4.0 / dt * xi * omega + omega * omega;
+ a[1] = 2.0 * omega * omega - 8.0 / (dt * dt);
+ a[2] = 4.0 / (dt * dt) - 4.0 / dt * xi * omega + omega * omega;
+ }
+}
diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SecondOrderFilteredYoVariableParameters.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SecondOrderFilteredYoVariableParameters.java
new file mode 100644
index 00000000..68bf4f78
--- /dev/null
+++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SecondOrderFilteredYoVariableParameters.java
@@ -0,0 +1,36 @@
+package us.ihmc.yoVariables.filters;
+
+import us.ihmc.yoVariables.registry.YoRegistry;
+import us.ihmc.yoVariables.variable.YoDouble;
+
+public class SecondOrderFilteredYoVariableParameters
+{
+ private final YoDouble naturalFrequencyInHz;
+ private final YoDouble dampingRatio;
+ private final SecondOrderFilterType filterType;
+
+ public SecondOrderFilteredYoVariableParameters(String name, YoRegistry registry, double naturalFrequencyInHz, double dampingRatio,
+ SecondOrderFilterType filterType)
+ {
+ this.naturalFrequencyInHz = new YoDouble(name + "NaturalFrequency", registry);
+ this.naturalFrequencyInHz.set(naturalFrequencyInHz);
+ this.dampingRatio = new YoDouble(name + "DampingRatio", registry);
+ this.dampingRatio.set(dampingRatio);
+ this.filterType = filterType;
+ }
+
+ public YoDouble getNaturalFrequencyInHz()
+ {
+ return naturalFrequencyInHz;
+ }
+
+ public YoDouble getDampingRatio()
+ {
+ return dampingRatio;
+ }
+
+ public SecondOrderFilterType getFilterType()
+ {
+ return filterType;
+ }
+}
diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SimpleMovingAverageFilteredYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SimpleMovingAverageFilteredYoVariable.java
new file mode 100644
index 00000000..2628b7d9
--- /dev/null
+++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/SimpleMovingAverageFilteredYoVariable.java
@@ -0,0 +1,87 @@
+package us.ihmc.yoVariables.filters;
+
+import org.ejml.data.DMatrixRMaj;
+import org.ejml.dense.row.CommonOps_DDRM;
+
+import us.ihmc.yoVariables.registry.YoRegistry;
+import us.ihmc.yoVariables.variable.YoDouble;
+import us.ihmc.yoVariables.variable.YoInteger;
+
+/**
+ * Filter the given yoVariable using a moving average filter. This class is NOT REWINDABLE!
+ */
+public class SimpleMovingAverageFilteredYoVariable extends YoDouble
+{
+ private final YoInteger windowSize;
+ private final YoDouble yoVariableToFilter;
+
+ private final DMatrixRMaj previousUpdateValues = new DMatrixRMaj(0, 0);
+ private int bufferPosition = 0;
+
+ private boolean bufferHasBeenFilled = false;
+
+ public SimpleMovingAverageFilteredYoVariable(String name, int windowSize, YoRegistry registry)
+ {
+ this(name, windowSize, null, registry);
+ }
+
+ public SimpleMovingAverageFilteredYoVariable(String name, int windowSize, YoDouble yoVariableToFilter, YoRegistry registry)
+ {
+ super(name, registry);
+
+ this.yoVariableToFilter = yoVariableToFilter;
+ this.windowSize = new YoInteger(name + "WindowSize", registry);
+ this.windowSize.set(windowSize);
+
+ previousUpdateValues.reshape(windowSize, 1);
+ CommonOps_DDRM.fill(previousUpdateValues, 0.0);
+ }
+
+ public void setWindowSize(int windowSize)
+ {
+ this.windowSize.set(windowSize);
+ reset();
+ }
+
+ public void update()
+ {
+ update(yoVariableToFilter.getDoubleValue());
+ }
+
+ public void update(double value)
+ {
+ if (previousUpdateValues.getNumRows() != windowSize.getIntegerValue())
+ {
+ reset();
+ }
+ previousUpdateValues.set(bufferPosition, 0, value);
+
+ bufferPosition++;
+
+ if (bufferPosition >= windowSize.getIntegerValue())
+ {
+ bufferPosition = 0;
+ bufferHasBeenFilled = true;
+ }
+
+ double average = 0;
+ for (int i = 0; i < windowSize.getIntegerValue(); i++)
+ {
+ average += previousUpdateValues.get(i, 0);
+ }
+
+ this.set(average / ((double) windowSize.getIntegerValue()));
+ }
+
+ public void reset()
+ {
+ bufferPosition = 0;
+ bufferHasBeenFilled = false;
+ previousUpdateValues.reshape(windowSize.getIntegerValue(), 1);
+ }
+
+ public boolean getHasBufferWindowFilled()
+ {
+ return bufferHasBeenFilled;
+ }
+}
diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/VariableTools.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/VariableTools.java
new file mode 100644
index 00000000..d798ac1a
--- /dev/null
+++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/VariableTools.java
@@ -0,0 +1,48 @@
+package us.ihmc.yoVariables.filters;
+
+import us.ihmc.yoVariables.providers.DoubleProvider;
+import us.ihmc.yoVariables.registry.YoRegistry;
+import us.ihmc.yoVariables.variable.YoBoolean;
+import us.ihmc.yoVariables.variable.YoDouble;
+import us.ihmc.yoVariables.variable.YoInteger;
+
+public class VariableTools
+{
+ public static YoBoolean createHasBeenCalledYoBoolean(String namePrefix, String nameSuffix, YoRegistry registry)
+ {
+ return new YoBoolean(namePrefix + "HasBeenCalled" + nameSuffix, registry);
+ }
+
+ public static YoBoolean createLimitedCalledYoBoolean(String namePrefix, String nameSuffix, YoRegistry registry)
+ {
+ return new YoBoolean(namePrefix + "Limited" + nameSuffix, registry);
+ }
+
+ public static DoubleProvider createMaxRateYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry)
+ {
+ YoDouble maxRate = new YoDouble(namePrefix + "MaxRate" + nameSuffix, registry);
+ maxRate.set(initialValue);
+ return maxRate;
+ }
+
+ public static DoubleProvider createAlphaYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry)
+ {
+ YoDouble maxRate = new YoDouble(namePrefix + "AlphaVariable" + nameSuffix, registry);
+ maxRate.set(initialValue);
+ return maxRate;
+ }
+
+ public static YoInteger createWindowSizeYoInteger(String namePrefix, String nameSuffix, int initialValue, YoRegistry registry)
+ {
+ YoInteger windowSize = new YoInteger(namePrefix + "WindowSize" + nameSuffix, registry);
+ windowSize.set(initialValue);
+ return windowSize;
+ }
+
+ public static DoubleProvider createMaxAccelerationYoDouble(String namePrefix, String nameSuffix, double initialValue, YoRegistry registry)
+ {
+ YoDouble maxRate = new YoDouble(namePrefix + "MaxAcceleration" + nameSuffix, registry);
+ maxRate.set(initialValue);
+ return maxRate;
+ }
+}
diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/YoMatrix.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/YoMatrix.java
new file mode 100644
index 00000000..e640d87b
--- /dev/null
+++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/YoMatrix.java
@@ -0,0 +1,352 @@
+package us.ihmc.yoVariables.filters;
+
+import org.ejml.data.*;
+import org.ejml.ops.MatrixIO;
+import us.ihmc.yoVariables.registry.YoRegistry;
+import us.ihmc.yoVariables.variable.YoDouble;
+import us.ihmc.yoVariables.variable.YoInteger;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+/**
+ * YoMatrix. Object for holding a matrix of YoVariables so that Matrices can be rewound. Has a
+ * maximum number of rows and columns and an actual number of rows and columns. If you set with a
+ * smaller matrix, then the actual size will be the size of the passed in matrix. extra entries will
+ * be set to NaN. If you get the contents the matrix you pack must be the correct size.
+ *
+ * @author JerryPratt
+ */
+public class YoMatrix implements DMatrix, ReshapeMatrix
+{
+ // TODO: eventually consolidate YoMatrix implementations
+
+ private static final long serialVersionUID = 2156411740647948028L;
+
+ private final int maxNumberOfRows, maxNumberOfColumns;
+
+ private final YoInteger numberOfRows, numberOfColumns;
+ private final YoDouble[][] variables;
+
+ public YoMatrix(String name, int maxNumberOfRows, int maxNumberOfColumns, YoRegistry registry)
+ {
+ this(name, null, maxNumberOfRows, maxNumberOfColumns, null, null, registry);
+ }
+
+ public YoMatrix(String name, int maxNumberOfRows, int maxNumberOfColumns, String[] rowNames, YoRegistry registry)
+ {
+ this(name, null, maxNumberOfRows, maxNumberOfColumns, rowNames, null, registry);
+ }
+
+ public YoMatrix(String name, int maxNumberOfRows, int maxNumberOfColumns, String[] rowNames, String[] columnNames, YoRegistry registry)
+ {
+ this(name, null, maxNumberOfRows, maxNumberOfColumns, rowNames, columnNames, registry);
+ }
+
+ public YoMatrix(String name, String description, int maxNumberOfRows, int maxNumberOfColumns, YoRegistry registry)
+ {
+ this(name, description, maxNumberOfRows, maxNumberOfColumns, null, null, registry);
+ }
+
+ public YoMatrix(String name, String description, int maxNumberOfRows, int maxNumberOfColumns, String[] rowNames, YoRegistry registry)
+ {
+ this(name, description, maxNumberOfRows, maxNumberOfColumns, rowNames, null, registry);
+ }
+
+ public YoMatrix(String name, String description, int maxNumberOfRows, int maxNumberOfColumns, String[] rowNames, String[] columnNames, YoRegistry registry)
+ {
+ this.maxNumberOfRows = maxNumberOfRows;
+ this.maxNumberOfColumns = maxNumberOfColumns;
+
+ this.numberOfRows = new YoInteger(name + "NumRows", registry);
+ this.numberOfColumns = new YoInteger(name + "NumCols", registry);
+
+ this.numberOfRows.set(maxNumberOfRows);
+ this.numberOfColumns.set(maxNumberOfColumns);
+
+ variables = new YoDouble[maxNumberOfRows][maxNumberOfColumns];
+
+ for (int row = 0; row < maxNumberOfRows; row++)
+ {
+ for (int column = 0; column < maxNumberOfColumns; column++)
+ {
+ switch (checkNames(rowNames, columnNames))
+ {
+ case NONE:
+ {
+ variables[row][column] = new YoDouble(getFieldName(name, row, column), description, registry); // names are simply the row and column indices
+ variables[row][column].setToNaN();
+ break;
+ }
+ case ROWS:
+ {
+ if (maxNumberOfColumns > 1)
+ throw new IllegalArgumentException(
+ "The YoMatrix must be a column vector if only row names are provided, else unique names cannot be generated.");
+
+ variables[row][column] = new YoDouble(getFieldName(name, rowNames[row], ""), description, registry); // names are the row names, no column identifier
+ variables[row][column].setToNaN();
+ break;
+ }
+ case ROWS_AND_COLUMNS:
+ {
+ variables[row][column] = new YoDouble(getFieldName(name, rowNames[row], columnNames[column]), description, registry); // names are the row and column names
+ variables[row][column].setToNaN();
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ public static String getFieldName(String prefix, int row, int column)
+ {
+ return getFieldName(prefix, "_" + row, "_" + column);
+ }
+
+ public static String getFieldName(String prefix, String rowName, String columName)
+ {
+ return prefix + rowName + columName;
+ }
+
+ private enum NamesProvided
+ {
+ NONE, ROWS, ROWS_AND_COLUMNS
+ }
+
+ private NamesProvided checkNames(String[] rowNames, String[] columnNames)
+ {
+ if (rowNames == null && columnNames == null)
+ return NamesProvided.NONE;
+ else if (rowNames != null && columnNames == null)
+ return NamesProvided.ROWS;
+ else
+ return NamesProvided.ROWS_AND_COLUMNS;
+ }
+
+ @Override
+ public double get(int row, int col)
+ {
+ if (col < 0 || col >= getNumCols() || row < 0 || row >= getNumRows())
+ throw new IllegalArgumentException("Specified element is out of bounds: (" + row + " , " + col + ")");
+ return unsafe_get(row, col);
+ }
+
+ @Override
+ public double unsafe_get(int row, int col)
+ {
+ return variables[row][col].getValue();
+ }
+
+ @Override
+ public void set(int row, int col, double val)
+ {
+ if (col < 0 || col >= getNumCols() || row < 0 || row >= getNumRows())
+ throw new IllegalArgumentException("Specified element is out of bounds: (" + row + " , " + col + ")");
+ unsafe_set(row, col, val);
+ }
+
+ @Override
+ public void unsafe_set(int row, int col, double val)
+ {
+ unsafe_set(row, col, val, true);
+ }
+
+ private void unsafe_set(int row, int col, double val, boolean notifyListeners)
+ {
+ variables[row][col].set(val, notifyListeners);
+ }
+
+ @Override
+ public int getNumElements()
+ {
+ return numberOfRows.getValue() * numberOfColumns.getValue();
+ }
+
+ @Override
+ public int getNumRows()
+ {
+ return numberOfRows.getValue();
+ }
+
+ @Override
+ public int getNumCols()
+ {
+ return numberOfColumns.getValue();
+ }
+
+ @Override
+ public void zero()
+ {
+ for (int row = 0; row < getNumRows(); row++)
+ {
+ for (int col = 0; col < getNumCols(); col++)
+ {
+ variables[row][col].set(0.0);
+ }
+ }
+ }
+
+ @Override
+ public
- * For example, if a deadband of 1 is applied to a signal of 3, the return is 2. If a deadband of 3 is applied to a signal of 3, the return is 0.
- *
- * For example, if a deadband of 1 is applied to a signal of 3 about 2, the return is 2. if a deadband of 3 is applied to a signal of 3 about 1, the return
- * is 1.
- * Title:
+ * An {@code AlphaBetaFilteredYoVariable} is a filtered version of {@link YoDouble}, and estimates the velocity of some value it is tracking.
+ * Either a {@link YoDouble} holding the position value is passed in to the
+ * constructor and {@link #update()} is called every tick, or {@link #update(double)} is
+ * called every tick. The {@code AlphaBetaFilteredYoVariable} updates its value
+ * with the current filtered velocity using
+ *
+ * xp = x + (dt) v // angular position prediction
+ * x+ = xp + alpha (xmeas - xp) // adjusted angular position estimate
+ * v+ = v + beta (xmeas - xp) // adjusted velocity estimate
*
- * Description: Copyright: Copyright (c) 2007 Company:
- *
- *
- * @param angleA the first angle in the interpolation.
- * @param angleB the second angle in the interpolation.
- * @param alpha the percentage to use for the interpolation. A value of 0 will return
- * {@code angleA}, while a value of 1 will return {@code angleB}.
- * @return the interpolated angle in [-pi, pi].
- */
- public static double interpolateAngle(double angleA, double angleB, double alpha)
- {
- // A + alpha * (B-A)/2
- double average = angleA + alpha * computeAngleDifferenceMinusPiToPi(angleB, angleA);
- return trimAngleMinusPiToPi(average);
- }
-
- /**
- * Formula found on Wikipedia.
- */
- public static double computeAngleAverage(double[] angles)
- {
- double average = 0.0;
-
- double averageOfSin = 0.0;
- double averageOfCos = 0.0;
- double weight = 1.0 / angles.length;
-
- for (int i = 0; i < angles.length; i++)
- {
- averageOfSin += weight * Math.sin(angles[i]);
- averageOfCos += weight * Math.cos(angles[i]);
- }
-
- average = Math.atan2(averageOfSin, averageOfCos);
-
- return average;
- }
-
- /**
- * Finds the closest 90 degree yaw and returns number of 90 degrees (0 = 0; 1 = 90; 2 = 180; 3 = 270).
- *
- * @param yawInRadians double
- * @return int between 0 and 3 for the number of 90 degree yawed.
- */
- public static int findClosestNinetyDegreeYaw(double yawInRadians)
- {
- double minDifference = Double.POSITIVE_INFINITY;
- int ret = -1;
-
- double difference = AngleTools.computeAngleDifferenceMinusPiToPi(yawInRadians, 0.0);
-
- minDifference = Math.abs(difference);
- ret = 0;
-
- difference = AngleTools.computeAngleDifferenceMinusPiToPi(yawInRadians, Math.PI / 2.0);
-
- if (Math.abs(difference) < minDifference)
- {
- minDifference = Math.abs(difference);
- ret = 1;
- }
-
- difference = AngleTools.computeAngleDifferenceMinusPiToPi(yawInRadians, Math.PI);
-
- if (Math.abs(difference) < minDifference)
- {
- minDifference = Math.abs(difference);
- ret = 2;
- }
-
- difference = AngleTools.computeAngleDifferenceMinusPiToPi(yawInRadians, 3.0 * Math.PI / 2.0);
-
- if (Math.abs(difference) < minDifference)
- {
- minDifference = Math.abs(difference);
- ret = 3;
- }
-
- return ret;
- }
-
- /**
- * computeAngleDifferenceMinusPiToPi: returns (angleA - angleB), where the return value is [-pi, pi)
- *
- * @param angleA double
- * @param angleB double
- * @return double
- */
- public static double computeAngleDifferenceMinusPiToPi(double angleA, double angleB)
- {
- double difference = angleA - angleB;
- difference = difference % TwoPI;
- difference = AngleTools.shiftAngleToStartOfRange(difference, -PI);
-
- return difference;
- }
-
- /**
- * computeAngleDifferenceMinusPiToPi: returns (angleA - angleB), where the return value is [-2.0*pi, 0.0)
- *
- * @param angleA double
- * @param angleB double
- * @return double
- */
- public static double computeAngleDifferenceMinusTwoPiToZero(double angleA, double angleB)
- {
- double difference = angleA - angleB;
- difference = difference % TwoPI;
- difference = AngleTools.shiftAngleToStartOfRange(difference, -TwoPI);
-
- return difference;
- }
-
- /**
- * This will shift an angle to be in the range [startOfAngleRange,
- * (startOfAngleRange + 2*pi)
- *
- * @param angleToShift the angle to shift
- * @param startOfAngleRange start of the range.
- * @return the shifted angle
- */
- public static double shiftAngleToStartOfRange(double angleToShift, double startOfAngleRange)
- {
- return shiftAngleToStartOfRange(angleToShift, startOfAngleRange, TwoPI);
- }
-
- /**
- * This will shift an angle to be in the range [startOfAngleRange,
- * (startOfAngleRange + endOfAngleRange)
- *
- * @param angleToShift the angle to shift
- * @param startOfAngleRange start of the range.
- * @param endOfAngleRange end of the range.
- * @return the shifted angle
- */
- public static double shiftAngleToStartOfRange(double angleToShift, double startOfAngleRange, double endOfAngleRange)
- {
- double ret = angleToShift;
- startOfAngleRange = startOfAngleRange - EPSILON;
-
- if (angleToShift < startOfAngleRange)
- {
- ret = angleToShift + Math.ceil((startOfAngleRange - angleToShift) / endOfAngleRange) * endOfAngleRange;
- }
-
- if (angleToShift >= (startOfAngleRange + endOfAngleRange))
- {
- ret = angleToShift - Math.floor((angleToShift - startOfAngleRange) / endOfAngleRange) * endOfAngleRange;
- }
-
- return ret;
- }
-
- /**
- * Returns an evenly distributed random number between -2PI and 2PI
- *
- * @param random Random number generator
- * @return number between -2PI and 2PI
- */
- public static double generateRandomAngle(Random random)
- {
- return -2.0 * Math.PI + 4 * Math.PI * random.nextDouble();
- }
-
- /**
- * Returns array of angles increasing from -2PI to 2PI
- *
- * @param numberOfAngles
- * @param stayThisFarAwayFromPlusMinus2PI
- * @param includeZero
- * @param includePlusMinusPI
- * @return
- */
- public static double[] generateArrayOfTestAngles(int numberOfAngles, double stayThisFarAwayFromPlusMinus2PI, boolean includeZero, boolean includePlusMinusPI)
- {
- int arraySize = numberOfAngles;
- double epsilon = stayThisFarAwayFromPlusMinus2PI;
-
- if (includeZero && !includePlusMinusPI)
- {
- arraySize += 1;
- }
- else if (includePlusMinusPI && !includeZero)
- {
- arraySize += 2;
- }
- else if (includeZero && includePlusMinusPI)
- {
- arraySize += 3;
- }
-
- double thetaMin = -2.0 * Math.PI + stayThisFarAwayFromPlusMinus2PI;
- double thetaMax = 2.0 * Math.PI - stayThisFarAwayFromPlusMinus2PI;
- double deltaTheta = Math.abs(thetaMax - thetaMin) / (numberOfAngles - 1);
-
- double[] ret = new double[arraySize];
-
- for (int i = 0; i < numberOfAngles; i++)
- {
- ret[i] = thetaMin + deltaTheta * i;
-
- boolean epsilonEqualToZero = MathTools.epsilonEquals(Math.abs(ret[i]), 0.0, epsilon);
- boolean epsilonEqualToPlusMinusPI = MathTools.epsilonEquals(Math.abs(ret[i]), Math.PI, epsilon);
-
- if (epsilonEqualToZero && !includeZero || epsilonEqualToPlusMinusPI && !includePlusMinusPI)
- ret[i] += Math.signum(ret[i]) * Math.max(1.0e-4, Math.abs(epsilon));
- }
-
- if (includeZero && !includePlusMinusPI)
- {
- ret[numberOfAngles] = 0.0;
- }
- else if (includePlusMinusPI && !includeZero)
- {
- ret[numberOfAngles] = -Math.PI;
- ret[numberOfAngles + 1] = Math.PI;
- }
- else if (includeZero && includePlusMinusPI)
- {
- ret[numberOfAngles] = 0.0;
- ret[numberOfAngles + 1] = -Math.PI;
- ret[numberOfAngles + 2] = Math.PI;
- }
-
- return ret;
- }
-
- /**
- * Returns an angle between two points + heading Offset from -PI to PI.
- * If the x or y components are both under the noTranslationTolerance,
- * then the initial orientation as given in startPose will be returned.
- *
- * @param startPose initial position and orientation
- * @param endPoint end position
- * @param headingOffset offset from path angle
- * @param noTranslationTolerance tolerance for determining if path angle should be determined
- * @return number between -PI and PI
- */
- public static double calculateHeading(FramePose2DReadOnly startPose, FramePoint2DReadOnly endPoint, double headingOffset, double noTranslationTolerance)
- {
- double deltaX = endPoint.getX() - startPose.getX();
- double deltaY = endPoint.getY() - startPose.getY();
- double heading;
- if (Math.abs(deltaX) < noTranslationTolerance && Math.abs(deltaY) < noTranslationTolerance)
- {
- heading = startPose.getYaw();
- }
- else
- {
- double pathHeading = Math.atan2(deltaY, deltaX);
- heading = AngleTools.trimAngleMinusPiToPi(pathHeading + headingOffset);
- }
- return heading;
- }
-
- /**
- * Returns an angle between two points + heading Offset from -PI to PI.
- *
- * @param startPose initial position and orientation
- * @param endPoint end position
- * @param headingOffset offset from path angle
- * @return number between -PI and PI
- */
- public static double calculateHeading(Tuple3DReadOnly startPose, Tuple3DReadOnly endPoint, double headingOffset)
- {
- double deltaX = endPoint.getX() - startPose.getX();
- double deltaY = endPoint.getY() - startPose.getY();
-
- double pathHeading = Math.atan2(deltaY, deltaX);
- return AngleTools.trimAngleMinusPiToPi(pathHeading + headingOffset);
- }
-
- /**
- * Returns an angle between two points + heading Offset from -PI to PI.
- *
- * @param startPose initial position
- * @param endPoint end position
- * @return number between -PI and PI
- */
- public static double calculateHeading(Point2DReadOnly startPose, Point2DReadOnly endPoint)
- {
- double deltaX = endPoint.getX() - startPose.getX();
- double deltaY = endPoint.getY() - startPose.getY();
- double heading;
-
- double pathHeading = Math.atan2(deltaY, deltaX);
- heading = AngleTools.trimAngleMinusPiToPi(pathHeading);
-
- return heading;
- }
-
- /**
- * Pass in a vector. Get its angle in polar coordinates.
- *
- * @param vx
- * @param vy
- * @return angle of vector from 0 to 2PI
- */
- public static double angleFromZeroToTwoPi(double vx, double vy)
- {
- double angleFromNegtivePiToPi = Math.atan2(vy, vx);
-
- if (angleFromNegtivePiToPi < 0.0)
- {
- return 2.0 * Math.PI + angleFromNegtivePiToPi;
- }
- else
- {
- return angleFromNegtivePiToPi;
- }
- }
-
- public static double roundToGivenPrecisionForAngle(double angleValue, double precisionFactor)
- {
- double centeredAngleValue = trimAngleMinusPiToPi(angleValue + 0.5 * precisionFactor);
- long longValue = (long) (centeredAngleValue / precisionFactor);
- double roundedValue = ((double) longValue) * precisionFactor;
- return trimAngleMinusPiToPi(roundedValue);
- }
-
- public static void roundToGivenPrecisionForAngles(Tuple3DBasics tuple3d, double precision)
- {
- tuple3d.setX(roundToGivenPrecisionForAngle(tuple3d.getX(), precision));
- tuple3d.setY(roundToGivenPrecisionForAngle(tuple3d.getY(), precision));
- tuple3d.setZ(roundToGivenPrecisionForAngle(tuple3d.getZ(), precision));
- }
-}
diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DeadbandTools.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DeadbandTools.java
deleted file mode 100644
index 98be17ac..00000000
--- a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/DeadbandTools.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package us.ihmc.yoVariables.filters;
-
-import us.ihmc.euclid.tuple2D.interfaces.Point2DBasics;
-import us.ihmc.euclid.tuple2D.interfaces.Point2DReadOnly;
-import us.ihmc.euclid.tuple2D.interfaces.Vector2DBasics;
-import us.ihmc.euclid.tuple3D.interfaces.Point3DBasics;
-import us.ihmc.euclid.tuple3D.interfaces.Point3DReadOnly;
-import us.ihmc.euclid.tuple3D.interfaces.Vector3DBasics;
-
-// TODO replace with teh values that are pushed into ihmc commons
-@Deprecated
-public class DeadbandTools
-{
- /**
- * Applies a deadband of size {@param deadbandSize} to value {@param value}, centered about zero.
- *
- *
- *- * An AlphaBetaFilteredYoVariable is a filtered version of an input YoVar. - * Either a YoVariable holding the unfiltered val is passed in to the - * constructor and update() is called every tick, or update(double) is - * called every tick. The AlphaBetaFilteredYoVariable updates it's val - * with the current filtered velocity using - * - * xp = x + (dt) v // angular position prediction - * x+ = xp + alpha (xmeas - xp) // adjusted angular position estimate - * v+ = v + beta (xmeas - xp) // adjusted velocity estimate - * - *
- *+ * + ** * For complete reference see: * http://www.mstarlabs.com/control/engspeed.html#Ref2 @@ -51,8 +34,13 @@ public class AlphaBetaFilteredYoVariable extends YoDouble private final YoDouble positionState; private final YoDouble xMeasuredVariable; - public AlphaBetaFilteredYoVariable(String name, YoRegistry registry, double alpha, double beta, YoDouble positionVariable, - YoDouble xMeasuredVariable, double DT) + public AlphaBetaFilteredYoVariable(String name, + YoRegistry registry, + double alpha, + double beta, + YoDouble positionVariable, + YoDouble xMeasuredVariable, + double DT) { super(name, registry); this.alpha = alpha; @@ -64,19 +52,6 @@ public AlphaBetaFilteredYoVariable(String name, YoRegistry registry, double alph reset(); } - public AlphaBetaFilteredYoVariable(String name, YoRegistry registry, YoDouble alphaVariable, YoDouble betaVariable, - YoDouble positionVariable, YoDouble xMeasuredVariable, double DT) - { - super(name, registry); - this.alphaVariable = alphaVariable; - this.betaVariable = betaVariable; - this.DT = DT; - this.positionState = positionVariable; - this.xMeasuredVariable = xMeasuredVariable; - - reset(); - } - public void reset() { } diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilterTools.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilterTools.java index a1c446b9..6f09dbe3 100644 --- a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilterTools.java +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilterTools.java @@ -7,7 +7,13 @@ public class AlphaFilterTools { /** * This computes the alpha - * variable for an alpha filtered yo variable that is equivalent to a first order low pass frequnecy at filter {@param breakFrequencyInHertz} + * variable for an alpha filtered yo variable that is equivalent to a first order low pass frequnecy at filter {@param breakFrequencyInHertz}. + * + *+ * If this + * calculation is done as part of a double provider, consider using {@link AlphaBasedOnBreakFrequencyProvider}, which only updates the alpha estimate + * on a change in the break frequency, saving computation. + *
* * @return alpha value */ diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredYoMatrix.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredYoMatrix.java index 46e63224..47580e57 100644 --- a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredYoMatrix.java +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/AlphaFilteredYoMatrix.java @@ -14,31 +14,11 @@ public class AlphaFilteredYoMatrix extends YoMatrix private final YoDouble alpha; - public AlphaFilteredYoMatrix(String name, double alpha, int numberOfRows, int numberOfColumns, YoRegistry registry) - { - this(name, null, alpha, numberOfRows, numberOfColumns, null, null, registry); - } - - public AlphaFilteredYoMatrix(String name, double alpha, int numberOfRows, int numberOfColumns, String[] rowNames, YoRegistry registry) - { - this(name, null, alpha, numberOfRows, numberOfColumns, rowNames, null, registry); - } - public AlphaFilteredYoMatrix(String name, double alpha, int numberOfRows, int numberOfColumns, String[] rowNames, String[] columnNames, YoRegistry registry) { this(name, null, alpha, numberOfRows, numberOfColumns, rowNames, columnNames, registry); } - public AlphaFilteredYoMatrix(String name, String description, double alpha, int numberOfRows, int numberOfColumns, YoRegistry registry) - { - this(name, description, alpha, numberOfRows, numberOfColumns, null, null, registry); - } - - public AlphaFilteredYoMatrix(String name, String description, double alpha, int numberOfRows, int numberOfColumns, String[] rowNames, YoRegistry registry) - { - this(name, description, alpha, numberOfRows, numberOfColumns, rowNames, null, registry); - } - public AlphaFilteredYoMatrix(String name, String description, double alpha, int numberOfRows, int numberOfColumns, String[] rowNames, String[] columnNames, YoRegistry registry) { super(name, description, numberOfRows, numberOfColumns, rowNames, columnNames, registry); diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/ButterworthFilteredYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/ButterworthFilteredYoVariable.java new file mode 100644 index 00000000..7622c3ce --- /dev/null +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/ButterworthFilteredYoVariable.java @@ -0,0 +1,152 @@ +package us.ihmc.yoVariables.filters; + +import us.ihmc.commons.MathTools; +import us.ihmc.yoVariables.filters.AlphaFilteredYoVariable; +import us.ihmc.yoVariables.providers.DoubleProvider; +import us.ihmc.yoVariables.registry.YoRegistry; +import us.ihmc.yoVariables.variable.YoBoolean; +import us.ihmc.yoVariables.variable.YoDouble; + +/** + * @author jrebula + * + *+ * LittleDogVersion06: us.ihmc.LearningLocomotion.Version06.util.YoAlphaFilteredVariable, + * 9:34:00 AM, Aug 29, 2006 + *
+ *+ * A YoAlphaFilteredVariable is a filtered version of an input YoVar. Either a YoVariable + * holding the unfiltered val is passed in to the constructor and update() is called every + * tick, or update(double) is called every tick. The YoAlphaFilteredVariable updates it's + * val with the current filtered version using + *
+ * + *+ * filtered_{n} = alpha * filtered_{n-1} + 1/2 * (1 - alpha) * (raw_{n} + raw{n-1}} + *+ */ +public class ButterworthFilteredYoVariable extends YoDouble +{ + public enum ButterworthFilterType + { + LOW_PASS, HIGH_PASS + } + + private final DoubleProvider alphaVariable; + private final ButterworthFilterType butterworthFilterType; + + private final DoubleProvider position; + private final YoDouble previousInput; + + private final YoBoolean hasBeenCalled; + + public ButterworthFilteredYoVariable(String name, YoRegistry registry, double alpha, ButterworthFilterType butterworthFilterType) + { + this(name, registry, AlphaFilteredYoVariable.createAlphaYoDouble(name, alpha, registry), butterworthFilterType); + } + + public ButterworthFilteredYoVariable(String name, + YoRegistry registry, + double alpha, + DoubleProvider positionVariable, + ButterworthFilterType butterworthFilterType) + { + this(name, registry, AlphaFilteredYoVariable.createAlphaYoDouble(name, alpha, registry), positionVariable, butterworthFilterType); + } + + public ButterworthFilteredYoVariable(String name, YoRegistry registry, DoubleProvider alphaVariable, ButterworthFilterType butterworthFilterType) + { + this(name, registry, alphaVariable, null, butterworthFilterType); + } + + public ButterworthFilteredYoVariable(String name, + YoRegistry registry, + DoubleProvider alphaVariable, + DoubleProvider positionVariable, + ButterworthFilterType butterworthFilterType) + { + super(name, registry); + + this.alphaVariable = alphaVariable; + this.butterworthFilterType = butterworthFilterType; + + this.position = positionVariable; + this.previousInput = new YoDouble(name + "_prevIn", registry); + this.hasBeenCalled = new YoBoolean(name + "HasBeenCalled", registry); + + reset(); + } + + public void reset() + { + hasBeenCalled.set(false); + } + + public void update() + { + if (position == null) + { + throw new NullPointerException(getClass().getSimpleName() + " must be constructed with a non null " + + "position variable to call update(), otherwise use update(double)"); + } + + update(position.getValue()); + } + + public void update(double currentInput) + { + if (!hasBeenCalled.getValue()) + { + hasBeenCalled.set(true); + + if (this.butterworthFilterType == ButterworthFilterType.HIGH_PASS) + { + set(0.0); + } + else + { + set(currentInput); + } + } + else + { + double alpha = alphaVariable.getValue(); + + switch (butterworthFilterType) + { + case LOW_PASS: + { + set(alpha * getValue() + 0.5 * (1.0 - alpha) * (currentInput + previousInput.getValue())); + break; + } + case HIGH_PASS: + { + set(alpha * getValue() + 0.5 * (1.0 + alpha) * (currentInput - previousInput.getValue())); + break; + } + } + } + + previousInput.set(currentInput); + } + + public static double computeAlphaGivenBreakFrequency(double breakFrequencyInHertz, double dt) + { + if (Double.isInfinite(breakFrequencyInHertz)) + return 0.0; + + double samplingFrequency = 1.0 / dt; + + if (breakFrequencyInHertz > 0.25 * samplingFrequency) + return 0.0; + + double tanOmegaBreak = Math.tan(Math.PI * breakFrequencyInHertz * dt); + return MathTools.clamp((1.0 - tanOmegaBreak) / (1.0 + tanOmegaBreak), 0.0, 1.0); + } + + public static double computeBreakFrequencyGivenAlpha(double alpha, double dt) + { + double beta = (1.0 - alpha) / (1.0 + alpha); + return Math.max(Math.atan(beta) / (dt * Math.PI), 0.0); + } +} diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FilteredDiscreteVelocityYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FilteredDiscreteVelocityYoVariable.java index 23c41014..e548ae57 100644 --- a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FilteredDiscreteVelocityYoVariable.java +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FilteredDiscreteVelocityYoVariable.java @@ -37,11 +37,6 @@ public class FilteredDiscreteVelocityYoVariable extends YoDouble private final YoDouble lastPosition; private boolean hasBeenCalled; - public FilteredDiscreteVelocityYoVariable(String name, String description, double alpha, YoDouble time, YoRegistry registry) - { - this(name, description, alpha, null, time, registry); - } - public FilteredDiscreteVelocityYoVariable(String name, String description, double alpha, YoDouble positionVariable, YoDouble time, YoRegistry registry) { diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderBandPassFilteredYoDouble.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderBandPassFilteredYoDouble.java index 08596c2b..626d02d0 100644 --- a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderBandPassFilteredYoDouble.java +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderBandPassFilteredYoDouble.java @@ -10,7 +10,7 @@ public class FirstOrderBandPassFilteredYoDouble extends YoDouble private final YoBoolean hasBeenCalled; private double filterUpdateTimeOld; - private FirstOrderFilterType filterType; + private final FirstOrderFilterType filterType; private final YoDouble firstCutoffFrequencyHz; private final YoDouble secondCutoffFrequencyHz; @@ -18,10 +18,9 @@ public class FirstOrderBandPassFilteredYoDouble extends YoDouble private final DoubleProvider yoTime; private double dt; - public enum FirstOrderFilterType { - NOTCH, BAND + NOTCH, BAND } public FirstOrderBandPassFilteredYoDouble(String name, @@ -176,7 +175,7 @@ private double applyLowPassFilter(double filterInput, double breakFrequency, dou return alpha * this.getDoubleValue() + (1.0 - alpha) * filterInput; } - private double applyHighPassFilter(double filterInput, double breakFrequency, double dt) + private double applyHighPassFilter(double filterInput, double breakFrequency, double dt) { double lowPassValue = applyLowPassFilter(filterInput, breakFrequency, dt); diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderFilteredYoDouble.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderFilteredYoDouble.java index ef26ebab..89db7267 100644 --- a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderFilteredYoDouble.java +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/FirstOrderFilteredYoDouble.java @@ -20,7 +20,7 @@ public enum FirstOrderFilterType private final DoubleProvider yoTime; private double dt; - private FirstOrderFilterType filterType; + private final FirstOrderFilterType filterType; public FirstOrderFilteredYoDouble(String name, String description, diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/ProcessingYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/ProcessingYoVariable.java index d3182ab8..b38e0214 100644 --- a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/ProcessingYoVariable.java +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/ProcessingYoVariable.java @@ -2,9 +2,9 @@ public interface ProcessingYoVariable { - public abstract void update(); + void update(); - public default void reset() + default void reset() { } } diff --git a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/RateLimitedYoVariable.java b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/RateLimitedYoVariable.java index bcc4b17f..475a49ab 100644 --- a/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/RateLimitedYoVariable.java +++ b/ihmc-yovariables-filters/src/main/java/us/ihmc/yoVariables/filters/RateLimitedYoVariable.java @@ -5,6 +5,11 @@ import us.ihmc.yoVariables.variable.YoBoolean; import us.ihmc.yoVariables.variable.YoDouble; +/** + * This is a yo variable whose rate of change is clamped to some maximum value. To use it, either create this variable passing in the non-limited yo variable to + * track and then call {@link #update()}, or unlink it keep it unlinked from a specific yo variable and call {@link #update(double)}. This variable when then + * track the specified variable or input, but will not change faster than the rate provided by {@code maxRateVariable}. + */ public class RateLimitedYoVariable extends YoDouble { private final DoubleProvider maxRateVariable; @@ -16,21 +21,111 @@ public class RateLimitedYoVariable extends YoDouble private final YoBoolean hasBeenCalled; + /** + * Constructs this variable with no double to track. The value contained in this yo variable will track the desired reference, but will limit the maximum + * rate of change to {@code maxRate}. + *+ * The maximum rate of change is enforced as a maximum step size every time {@link #update(double)} is called. The maximum step size + * can be calculated as {@code maxRate} * {@code dt}. + *
+ *+ * To use this variable after using this constructor, you must call {@link #update(double)}. Calling {@link #update()} will result in a null pointer + * exception. + *
+ *+ * A known edge case is if {@link #update(double)} is called more than once per control update. In this case, the maximum rate is enforced each time + * {@link #update()} called, rather than per each control update. Avoid doing this. + *
+ * + * @param name name of this variable. + * @param registry registry to add this variable to. + * @param maxRate maximum rate of change this value can experience every time {@link #update(double)} is called. + * @param dt expected time change since between calls of {@link #update(double)}. + */ public RateLimitedYoVariable(String name, YoRegistry registry, double maxRate, double dt) { this(name, registry, maxRate, null, dt); } + /** + * Constructs this variable with no double to track. The value contained in this yo variable will track the desired reference, but will limit the maximum + * rate of change to {@code maxRateVariable}. + *+ * The maximum rate of change is enforced as a maximum step size every time {@link #update(double)} is called. The maximum step size + * can be calculated as {@code maxRateVariable} * {@code dt}. + *
+ *+ * To use this variable after using this constructor, you must call {@link #update(double)}. Calling {@link #update()} will result in a null pointer + * exception. + *
+ *+ * A known edge case is if {@link #update(double)} is called more than once per control update. In this case, the maximum rate is enforced each time + * {@link #update()} called, rather than per each control update. Avoid doing this. + *
+ * + * @param name name of this variable. + * @param registry registry to add this variable to. + * @param maxRateVariable maximum rate of change this value can experience every time {@link #update(double)} is called. + * @param dt expected time change since between calls of {@link #update(double)}. + */ public RateLimitedYoVariable(String name, YoRegistry registry, DoubleProvider maxRateVariable, double dt) { this(name, registry, maxRateVariable, null, dt); } + /** + * Constructs this variable to track {@code positionVariable}. The value contained in this yo variable will track the desired reference passed in at + * construction, but will limit the maximum + * rate of change to {@code maxRate}. + *+ * The maximum rate of change is enforced as a maximum step size every time {@link #update()} is called. The maximum step size + * can be calculated as {@code maxRate} * {@code dt}. + *
+ *+ * To use this variable after using this constructor, you should call {@link #update()}. Calling {@link #update(double)} will not track the variable + * provided + * by {@code positionVariable}. + *
+ *+ * A known edge case is if {@link #update()} is called more than once per control update. In this case, the maximum rate is enforced each time + * {@link #update()} called, rather than per each control update. Avoid doing this. + *
+ * + * @param name name of this variable. + * @param registry registry to add this variable to. + * @param maxRate maximum rate of change this value can experience every time {@link #update()} is called. + * @param positionVariable varible provider that this variable will track. + * @param dt expected time change since between calls of {@link #update()}. + */ public RateLimitedYoVariable(String name, YoRegistry registry, double maxRate, DoubleProvider positionVariable, double dt) { this(name, registry, VariableTools.createMaxRateYoDouble(name, "", maxRate, registry), positionVariable, dt); } + /** + * Constructs this variable to track {@code positionVariable}. The value contained in this yo variable will track the desired reference passed in at + * construction, but will limit the maximum + * rate of change to {@code maxRateVariable}. + *+ * The maximum rate of change is enforced as a maximum step size every time {@link #update()} is called. The maximum step size + * can be calculated as {@code maxRateVariable} * {@code dt}. + *
+ *+ * To use this variable after using this constructor, you should call {@link #update()}. Calling {@link #update(double)} will not track the variable + * provided + * by {@code positionVariable}. + *
+ *+ * A known edge case is if {@link #update()} is called more than once per control update. In this case, the maximum rate is enforced each time + * {@link #update()} called, rather than per each control update. Avoid doing this. + *
+ * + * @param name name of this variable. + * @param registry registry to add this variable to. + * @param maxRateVariable maximum rate of change this value can experience every time {@link #update()} is called. + * @param unlimitedPosition varible provider that this variable will track. + * @param dt expected time change since between calls of {@link #update()}. + */ public RateLimitedYoVariable(String name, YoRegistry registry, DoubleProvider maxRateVariable, DoubleProvider unlimitedPosition, double dt) { super(name, registry); @@ -46,22 +141,57 @@ public RateLimitedYoVariable(String name, YoRegistry registry, DoubleProvider ma reset(); } + /** + * Resets this variable. On the next time {@link #update()} or {@link #update(double)} is called, it will automatically be set to the variable to track, + * rather than experiencing any rate limiting. + */ public void reset() { hasBeenCalled.set(false); } + /** + * Updates the value contained in this yo variable to track the value contained in {@code unlimitedPosition}. If the {@code unlimitedPosition} can be + * achieved with a rate of change + * less that provided by {@code maxRateVariable}, then the value stored in this variable and returned by {@link #getValue()} will match + * {@code unlimitedPosition}. + * Otherwise, it will step towards the new position at maximum rate. This can be computed using the following pseudo-code: + *+ *
+ *