3939import us .ihmc .yoVariables .providers .DoubleProvider ;
4040import us .ihmc .yoVariables .registry .YoRegistry ;
4141import us .ihmc .yoVariables .variable .YoBoolean ;
42+ import us .ihmc .yoVariables .variable .YoDouble ;
4243
4344public class SingleFootEstimator implements SCS2YoGraphicHolder
4445{
@@ -56,6 +57,8 @@ public class SingleFootEstimator implements SCS2YoGraphicHolder
5657 private final YoFrameVector3D footFusedLinearVelocityInWorld ;
5758 private final YoFrameVector3D footFusedAngularVelocityInWorld ;
5859
60+ private final YoDouble footLinearVelocity ;
61+ private final YoDouble footAngularVelocity ;
5962 private final YoBoolean footIsMoving ;
6063
6164 private final YoFrameVector3D copVelocityInWorld ;
@@ -81,6 +84,8 @@ public class SingleFootEstimator implements SCS2YoGraphicHolder
8184 private final DoubleProvider imuAgainstKinematicsForVelocityBreakFrequency ;
8285 private final DoubleProvider imuAgainstKinematicsForPositionBreakFrequency ;
8386 private final BooleanProvider cancelGravityFromAccelerationMeasurement ;
87+ private final DoubleProvider footLinearVelocityMovingThreshold ;
88+ private final DoubleProvider footAngularVelocityMovingThreshold ;
8489 private final FrameVector3DReadOnly gravityVector ;
8590 private final double estimatorDT ;
8691
@@ -95,6 +100,8 @@ public SingleFootEstimator(FloatingJointBasics rootJoint,
95100 DoubleProvider copFilterBreakFrequency ,
96101 CenterOfPressureDataHolder centerOfPressureDataHolderFromController ,
97102 BooleanProvider cancelGravityFromAccelerationMeasurement ,
103+ DoubleProvider footLinearVelocityMovingThreshold ,
104+ DoubleProvider footAngularVelocityMovingThreshold ,
98105 FrameVector3DReadOnly gravityVector ,
99106 BooleanProvider useIMUData ,
100107 DoubleProvider imuAgainstKinematicsForPositionBreakFrequency ,
@@ -109,6 +116,8 @@ public SingleFootEstimator(FloatingJointBasics rootJoint,
109116 this .imuBiasProvider = imuBiasProvider ;
110117 this .centerOfPressureDataHolderFromController = centerOfPressureDataHolderFromController ;
111118 this .cancelGravityFromAccelerationMeasurement = cancelGravityFromAccelerationMeasurement ;
119+ this .footLinearVelocityMovingThreshold = footLinearVelocityMovingThreshold ;
120+ this .footAngularVelocityMovingThreshold = footAngularVelocityMovingThreshold ;
112121 this .gravityVector = gravityVector ;
113122 this .useIMUData = useIMUData ;
114123 this .imuAgainstKinematicsForPositionBreakFrequency = imuAgainstKinematicsForPositionBreakFrequency ;
@@ -129,6 +138,8 @@ public SingleFootEstimator(FloatingJointBasics rootJoint,
129138 copRawInFootFrame = new YoFramePoint2D (namePrefix + "CoPRawInFootFrame" , soleFrame , registry );
130139 previousCoPInFootFrame = new YoFramePoint2D (namePrefix + "PreviousCoPInFootFrame" , soleFrame , registry );
131140
141+ footLinearVelocity = new YoDouble (namePrefix + "LinearVelocity" , registry );
142+ footAngularVelocity = new YoDouble (namePrefix + "AngularVelocity" , registry );
132143 footIsMoving = new YoBoolean (namePrefix + "IsMoving" , registry );
133144
134145 footIKLinearVelocityInWorld = new YoFrameVector3D (namePrefix + "IKLinearVelocityInWorld" , worldFrame , registry );
@@ -203,9 +214,11 @@ public void updateStateFromKinematics(TwistReadOnly rootBodyTwist)
203214
204215 footToRootJointPosition .update (tempFrameVector );
205216
206- // FIXME remove magic parameters
217+ footLinearVelocity .set (getFootLinearVelocityInWorld ().norm ());
218+ footAngularVelocity .set (getFootAngularVelocityInWorld ().norm ());
219+
207220 if (useIMUData .getValue () && footIMU != null )
208- footIsMoving .set (getFootLinearVelocityInWorld (). norm () > 0.5 || getFootAngularVelocityInWorld (). norm () > 1.0 );
221+ footIsMoving .set (footLinearVelocity . getDoubleValue () > footLinearVelocityMovingThreshold . getValue () || footAngularVelocity . getDoubleValue () > footAngularVelocityMovingThreshold . getValue () );
209222 else
210223 footIsMoving .set (false );
211224 }
0 commit comments