private Matrix3d computeDesiredFootRotation( double angleToDestination, RobotSide swingLegSide, ReferenceFrame supportFootFrame) { RigidBodyTransform supportFootToWorldTransform = supportFootFrame.getTransformToDesiredFrame(ReferenceFrame.getWorldFrame()); Matrix3d supportFootToWorldRotation = new Matrix3d(); supportFootToWorldTransform.get(supportFootToWorldRotation); double maxTurnInAngle = 0.25; double maxTurnOutAngle = 0.4; double amountToYaw; switch (blindWalkingDirection.getEnumValue()) { case BACKWARD: { amountToYaw = AngleTools.computeAngleDifferenceMinusPiToPi(angleToDestination, Math.PI); break; } case LEFT: { amountToYaw = AngleTools.computeAngleDifferenceMinusPiToPi(angleToDestination, Math.PI / 2.0); break; } case RIGHT: { amountToYaw = AngleTools.computeAngleDifferenceMinusPiToPi(angleToDestination, -Math.PI / 2.0); break; } case FORWARD: { amountToYaw = angleToDestination; break; } default: { throw new RuntimeException("Shouldn't get here!"); } } if (swingLegSide == RobotSide.LEFT) { amountToYaw = MathTools.clipToMinMax(amountToYaw, -maxTurnInAngle, maxTurnOutAngle); } else { amountToYaw = MathTools.clipToMinMax(amountToYaw, -maxTurnOutAngle, maxTurnInAngle); } Matrix3d yawRotation = new Matrix3d(); yawRotation.rotZ(amountToYaw); Matrix3d ret = new Matrix3d(); ret.mul(yawRotation, supportFootToWorldRotation); return ret; }
public Matrix3d getViewMatrix(int index) { Matrix3d m = new Matrix3d(); switch (index) { case 0: m.setIdentity(); // C4 vertex-centered break; case 1: m.rotX(-0.5 * TETRAHEDRAL_ANGLE); // C3 face-centered 2.0*Math.PI/3 Matrix3d m1 = new Matrix3d(); m1.rotZ(Math.PI / 4); m.mul(m1); break; case 2: m.rotY(Math.PI / 4); // side face-centered break; default: throw new IllegalArgumentException("getViewMatrix: index out of range:" + index); } return m; }