Skip to content

Commit bd9395c

Browse files
committed
started improving the update to the foot state for the kinematic pelvis linear velocity
1 parent a6d21f2 commit bd9395c

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

ihmc-state-estimation/src/main/java/us/ihmc/stateEstimation/humanoid/kinematicsBasedStateEstimation/PelvisKinematicsBasedLinearStateCalculator.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public class PelvisKinematicsBasedLinearStateCalculator
4545

4646
private final YoFramePoint3D rootJointPosition = new YoFramePoint3D("estimatedRootJointPositionKinematics", worldFrame, registry);
4747
private final YoFrameVector3D rootJointLinearVelocity = new YoFrameVector3D("estimatedRootJointLinearVelocityKinematics", worldFrame, registry);
48+
private final YoFrameVector3D averagedTrustedFootVelocity = new YoFrameVector3D("averagedTrustedFootVelocity", worldFrame, registry);
4849
private final DoubleProvider alphaRootJointLinearVelocity;
4950

5051
/** Debug variable */
@@ -180,17 +181,23 @@ public void estimatePelvisLinearState(List<RigidBodyBasics> trustedFeet, FramePo
180181
}
181182
else
182183
{
184+
averagedTrustedFootVelocity.setToZero();
183185
for (int i = 0; i < trustedFeet.size(); i++)
184186
{
185187
SingleFootEstimator footEstimator = footEstimatorMap.get(trustedFeet.get(i));
186188

187189
double scaleFactor = 1.0 / trustedFeet.size();
188190

191+
// The root joint position is zeroed when we call #updateKinematics
189192
rootJointPosition.scaleAdd(scaleFactor, footEstimator.getRootJointPositionFromKinematics(), rootJointPosition);
190-
rootJointLinearVelocity.scaleAdd(-scaleFactor * alphaRootJointLinearVelocity.getValue(),
191-
footEstimator.getCopVelocityInWorld(),
192-
rootJointLinearVelocity);
193+
averagedTrustedFootVelocity.scaleAdd(scaleFactor, footEstimator.getCopVelocityInWorld(), averagedTrustedFootVelocity);
194+
193195
}
196+
197+
// We want the average velocity of the feet to trend to zero, since the trusted feet are assumed to not be moving.
198+
rootJointLinearVelocity.scaleAdd(-alphaRootJointLinearVelocity.getValue(),
199+
averagedTrustedFootVelocity,
200+
rootJointLinearVelocity);
194201
}
195202

196203
rootJointLinearVelocityFDDebug.update();

ihmc-state-estimation/src/main/java/us/ihmc/stateEstimation/humanoid/kinematicsBasedStateEstimation/SingleFootEstimator.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,11 @@ public class SingleFootEstimator implements SCS2YoGraphicHolder
6363

6464
private final YoFrameVector3D copVelocityInWorld;
6565
private final AlphaFilteredYoFrameVector3D footToRootJointPosition;
66+
private final AlphaFilteredYoFrameVector3D footToRootJointVelocity;
6667
private final YoFramePoint3D footPositionInWorld;
6768
/** Debug variable */
6869
private final YoFramePoint3D rootJointPositionPerFoot;
70+
private final YoFrameVector3D rootJointVelocityPerFoot;
6971

7072
private final YoFramePoint3D copIKPositionInWorld;
7173
private final YoFramePoint3D copIMUPositionInWorld;
@@ -131,7 +133,9 @@ public SingleFootEstimator(FloatingJointBasics rootJoint,
131133

132134
DoubleProvider alphaFoot = () -> AlphaFilterTools.computeAlphaGivenBreakFrequencyProperly(footToRootJointPositionBreakFrequency.getValue(), estimatorDT);
133135
footToRootJointPosition = new AlphaFilteredYoFrameVector3D(namePrefix + "FootToRootJointPosition", "", registry, alphaFoot, worldFrame);
136+
footToRootJointVelocity = new AlphaFilteredYoFrameVector3D(namePrefix + "FootToRootJointVelocity", "", registry, alphaFoot, worldFrame);
134137
rootJointPositionPerFoot = new YoFramePoint3D(namePrefix + "BasedRootJointPosition", worldFrame, registry);
138+
rootJointVelocityPerFoot = new YoFrameVector3D(namePrefix + "BasedRootJointVelocity", worldFrame, registry);
135139
footPositionInWorld = new YoFramePoint3D(namePrefix + "FootPositionInWorld", worldFrame, registry);
136140
footPolygon = new FrameConvexPolygon2D(FrameVertex2DSupplier.asFrameVertex2DSupplier(contactableFoot.getContactPoints2D()));
137141
footCenterCoPLineSegment = new FrameLineSegment2D(soleFrame);
@@ -182,6 +186,7 @@ public YoGraphicDefinition getSCS2YoGraphics()
182186
public void initialize()
183187
{
184188
footToRootJointPosition.reset();
189+
footToRootJointVelocity.reset();
185190
copFilteredInFootFrame.reset();
186191
copFilteredInFootFrame.update(0.0, 0.0);
187192
copFusedPositionInWorld.setMatchingFrame(copFilteredInFootFrame, 0.0);
@@ -236,6 +241,7 @@ public void computeStateSettingCoPZ(boolean trustCoPAsNonSlippingContactPoint, b
236241
correctFootPositionUsingCoP();
237242

238243
rootJointPositionPerFoot.add(footPositionInWorld, footToRootJointPosition);
244+
rootJointVelocityPerFoot.sub(footFusedLinearVelocityInWorld, footToRootJointVelocity);
239245
}
240246

241247
public void computeState(boolean trustCoPAsNonSlippingContactPoint, boolean useControllerDesiredCoP)
@@ -245,6 +251,7 @@ public void computeState(boolean trustCoPAsNonSlippingContactPoint, boolean useC
245251
correctFootPositionUsingCoP();
246252

247253
rootJointPositionPerFoot.add(footPositionInWorld, footToRootJointPosition);
254+
rootJointVelocityPerFoot.sub(footFusedLinearVelocityInWorld, footToRootJointVelocity);
248255
}
249256

250257
public void computeStateSettingFootZ(double zPosition)
@@ -255,6 +262,7 @@ public void computeStateSettingFootZ(double zPosition)
255262
copFusedPositionInWorld.set(footPositionInWorld);
256263

257264
rootJointPositionPerFoot.add(footPositionInWorld, footToRootJointPosition);
265+
rootJointVelocityPerFoot.sub(footFusedLinearVelocityInWorld, footToRootJointVelocity);
258266
}
259267

260268
/**
@@ -298,6 +306,11 @@ public FramePoint3DReadOnly getRootJointPositionFromKinematics()
298306
return rootJointPositionPerFoot;
299307
}
300308

309+
public FrameVector3DReadOnly getRootJointVelocityFromKinematics()
310+
{
311+
return rootJointVelocityPerFoot;
312+
}
313+
301314
public FrameVector3DReadOnly getCopVelocityInWorld()
302315
{
303316
return copVelocityInWorld;
@@ -426,6 +439,11 @@ private void computeFootTwistInWorldFusingBaseStateAndFootIMU(TwistReadOnly root
426439
tempRootBodyTwist.changeFrame(foot.getBodyFixedFrame());
427440

428441
foot.getBodyFixedFrame().getTwistRelativeToOther(rootJointFrame, footTwistInWorld);
442+
443+
tempFrameVector.setIncludingFrame(footTwistInWorld.getLinearPart());
444+
tempFrameVector.changeFrame(worldFrame);
445+
footToRootJointVelocity.update(tempFrameVector);
446+
429447
footTwistInWorld.add(tempRootBodyTwist);
430448
footTwistInWorld.setBodyFrame(soleFrame);
431449
footTwistInWorld.changeFrame(worldFrame);

0 commit comments

Comments
 (0)