void KickEngineData::mirrorIfNecessary(JointRequest& joints)
{
  if((positions[Phase::leftFootTra].z - positions[Phase::rightFootTra].z) > 5)
  {
    toLeftSupport = false;
  }
  else if((positions[Phase::leftFootTra].z - positions[Phase::rightFootTra].z) < -5)
  {
    toLeftSupport = true;
  }
  else
  {
    if(ref.y > 0)
    {
      toLeftSupport = true;
    }
    else
    {
      toLeftSupport = false;
    }
  }

  if(currentKickRequest.mirror)
  {
    JointRequest old = joints;
    for(int i = 0; i < JointData::numOfJoints; ++i)
    {
      if(i == JointData::HeadPitch)
        continue;

      joints.angles[i] = old.mirror(JointData::Joint(i));
    }
  }
}
示例#2
0
void GetUpEngine::setNextJoints(GetUpEngineOutput& output)
{
  //do stuff only if we are not at the end of the movement
  if(lineCounter < maxCounter && motionID > -1)
  {
    const float& time = p.mofs[motionID].lines[lineCounter].duration;
    ASSERT(time > 0);
    ratio = (float)theFrameInfo.getTimeSince(lineStartTimeStamp) / time;
    //check if we are done yet with the current line
    if(ratio > 1.f)
    {
      lineStartTimeStamp = theFrameInfo.time;
      startJoints = lastUnbalanced;
      ratio = 0.f;
      //update stiffness
      if(++lineCounter < maxCounter)
        for(unsigned i = 0; i < p.mofs[motionID].lines[lineCounter].singleMotorStiffnessChange.size(); ++i)
          targetJoints.stiffnessData.stiffnesses[p.mofs[motionID].lines[lineCounter].singleMotorStiffnessChange[i].joint] = p.mofs[motionID].lines[lineCounter].singleMotorStiffnessChange[i].s;
    }
    //are we still not at the end?
    if(lineCounter < maxCounter)
    {
      if(!balance && lineCounter >= p.mofs[motionID].balanceStartLine && p.mofs[motionID].balanceStartLine > -1)
      {
        theBalancer.init(mirror, p.balancingParams);
        balance = true;
      }
      //set head joints
      for(int i = 0; i < 2; ++i)
        targetJoints.angles[i] = Angle::fromDegrees(p.mofs[motionID].lines[lineCounter].head[i]);
      //set arm joints
      for(int i = 0; i < 6; ++i)
      {
        targetJoints.angles[Joints::lShoulderPitch + i] = Angle::fromDegrees(p.mofs[motionID].lines[lineCounter].leftArm[i]);
        targetJoints.angles[Joints::rShoulderPitch + i] = Angle::fromDegrees(p.mofs[motionID].lines[lineCounter].rightArm[i]);
        targetJoints.angles[Joints::lHipYawPitch + i] = Angle::fromDegrees(p.mofs[motionID].lines[lineCounter].leftLeg[i]);
        targetJoints.angles[Joints::rHipYawPitch + i] = Angle::fromDegrees(p.mofs[motionID].lines[lineCounter].rightLeg[i]);
      }

      //mirror joints if necessary
      if(mirror)
      {
        JointRequest mirroredJoints;
        mirroredJoints.mirror(targetJoints);
        targetJoints = mirroredJoints;
      }

      if(p.mofs[motionID].lines[lineCounter].critical)
        verifyUprightTorso(output);
    }
  }
  interpolate(startJoints, targetJoints, ratio, output);
  lastUnbalanced = output;
  if(balance)
    theBalancer.balanceJointRequest(output, p.balancingParams);
}
void KickEngineData::mirrorIfNecessary(JointRequest& joints)
{
  if(currentKickRequest.mirror)
  {
    const JointRequest old = joints;
    for(int i = 0; i < Joints::numOfJoints; ++i)
    {
      if(i == Joints::headPitch)
        continue;

      joints.angles[i] = old.mirror(static_cast<Joints::Joint>(i));
    }
  }
}
void SpecialActions::calculateJointRequest(JointRequest& jointRequest)
{
  float ratio, f, t;

  //joint angles
  if(interpolationMode)
  {
    ratio = dataRepetitionCounter / static_cast<float>(dataRepetitionLength);
    for(int i = 0; i < Joints::numOfJoints; ++i)
    {
      f = lastRequest.angles[i];
      if(!mirror)
        t = currentRequest.angles[i];
      else
        t = currentRequest.mirror(static_cast<Joints::Joint>(i));
      // if fromAngle is off or ignore use JointAngles for further calculation
      if(f == JointAngles::off || f == JointAngles::ignore)
        f = theJointAngles.angles[i];

      // if toAngle is off or ignore -> turn joint off/ignore
      if(t == JointAngles::off || t == JointAngles::ignore)
        jointRequest.angles[i] = t;
      //interpolate
      else
        jointRequest.angles[i] = static_cast<float>(t + (f - t) * ratio);
    }
  }
  else
  {
    if(!mirror)
      jointRequest = currentRequest;
    else
      jointRequest.mirror(currentRequest);
  }

  //stiffness stuff
  if(stiffnessInterpolationCounter <= 0)
  {
    if(!mirror)
      jointRequest.stiffnessData = currentStiffnessRequest;
    else
      jointRequest.stiffnessData.mirror(currentStiffnessRequest);
  }
  else
  {
    ratio = static_cast<float>(stiffnessInterpolationCounter) / stiffnessInterpolationLength;
    int f, t;
    for(int i = 0; i < Joints::numOfJoints; i++)
    {
      f = lastStiffnessRequest.stiffnesses[i];
      if(!mirror)
        t = currentStiffnessRequest.stiffnesses[i];
      else
        t = currentStiffnessRequest.mirror(static_cast<Joints::Joint>(i));
      if(t == f)
        jointRequest.stiffnessData.stiffnesses[i] = t;
      else
      {
        if(f == StiffnessData::useDefault)
          f = theStiffnessSettings.stiffnesses[i];
        if(t == StiffnessData::useDefault)
          t = mirror ? theStiffnessSettings.mirror(static_cast<Joints::Joint>(i)) : theStiffnessSettings.stiffnesses[i];
        jointRequest.stiffnessData.stiffnesses[i] = int(float(t) + float(f - t) * ratio);
      }
    }
  }
}
示例#5
0
void SpecialActions::calculateJointRequest(JointRequest& jointRequest)
{
  float ratio, f, t;

  //joint angles
  if(interpolationMode)
  {
    ratio = dataRepetitionCounter / (float) dataRepetitionLength;
    for(int i = 0; i < JointData::numOfJoints; ++i)
    {
      f = lastRequest.angles[i];
      if(!mirror)
        t = currentRequest.angles[i];
      else
        t = currentRequest.mirror((JointData::Joint)i);
      // if fromAngle is off or ignore use JointData for further calculation
      if(f == JointData::off || f == JointData::ignore)
        f = theFilteredJointData.angles[i];

      // if toAngle is off or ignore -> turn joint off/ignore
      if(t == JointData::off || t == JointData::ignore)
        jointRequest.angles[i] = t;
      //interpolate
      else
        jointRequest.angles[i] = (float)(t + (f - t) * ratio);
    }
  }
  else
  {
    if(!mirror)
      jointRequest = currentRequest;
    else
      jointRequest.mirror(currentRequest);
  }

  //hardness stuff
  if(hardnessInterpolationCounter <= 0)
  {
    if(!mirror)
      jointRequest.jointHardness = currentHardnessRequest;
    else
      jointRequest.jointHardness.mirror(currentHardnessRequest);
  }
  else
  {
    ratio = ((float)hardnessInterpolationCounter) / hardnessInterpolationLength;
    int f, t;
    for(int i = 0; i < JointData::numOfJoints; i++)
    {
      f = lastHardnessRequest.hardness[i];
      if(!mirror)
        t = currentHardnessRequest.hardness[i];
      else
        t = currentHardnessRequest.mirror((JointData::Joint)i);
      if(t == f)
        jointRequest.jointHardness.hardness[i] = t;
      else
      {
        if(f == HardnessData::useDefault)
          f = theHardnessSettings.hardness[i];
        if(t == HardnessData::useDefault)
          t = mirror ? theHardnessSettings.mirror((JointData::Joint)i) : theHardnessSettings.hardness[i];
        jointRequest.jointHardness.hardness[i] = int(float(t) + float(f - t) * ratio);
      }
    }
  }
}