Beispiel #1
0
Vector Vector::operator*(Matrix nM)
{/*
   int row,col;
   double t[4];
   fPoint pp;

   formulate(); 

   for (col=0;col<dm;col++){
	t[col] = 0.0f;
	for (row=0;row<dm-1;row++) 
	   t[col] += vm[row] * nM.mm[row][col];
       // the reason to loop to dm-1 rather than dm is 
       // because this is for vector transformation, 
       //so need to remove the translation of the origin (0,0,0)
  }
  pp.setXYZ((float)t[0],(float)t[1],(float)t[2],1.0f);
  pp.formulate();
  return Vector(pp);
*/
  fPoint p1=fPoint(vm[0],vm[1],vm[2],vm[3])*nM;
  fPoint p2=fPoint(0,0,0)*nM;
  return Vector(p2,p1);
}	 
Beispiel #2
0
eeVector3f cGL::UnProjectCurrent( const eeVector3f& point ) {
	GLfloat projMat[16];
	GetCurrentMatrix( GL_PROJECTION_MATRIX, projMat );

	GLfloat modelMat[16];
	GetCurrentMatrix( GL_MODELVIEW_MATRIX, modelMat );

	GLint viewPort[4];
	GetViewport( viewPort );

	eeVector3f fPoint( point );
	fPoint.y = viewPort[3] - point.y;

	Vector3<GLfloat> tv3;

	UnProject( (GLfloat)fPoint.x, (GLfloat)fPoint.y, (GLfloat)fPoint.z, projMat, modelMat, viewPort, &tv3.x, &tv3.y, &tv3.z );

	return eeVector3f( tv3.x, tv3.y, tv3.z );
}
void Streamline::UpdateSeedPoint(){
	this->DeleteStreamlines() ; 
	this->Configure( fPoint(this->fSeedPosX, this->fSeedPosY, this->fSeedPosZ) ,this->iNumberOfStreamlines) ;
	this->CreateStreamlines() ; 
} 
Beispiel #4
0
void StdCostFunc::impl_gradient(gradient_t& gradient,
    const argument_t& x, size_type /* functionId */) const
{
  gradient.reserve(robotDatas_[0].pgdata->pbSize());
  gradient.setZero();

  for(RobotData& rd: robotDatas_)
  {
    rd.pgdata->x(x);

    if(rd.postureScale > 0.)
    {
      int index = rd.pgdata->qParamsBegin();
      const std::vector<std::vector<double>>& q = rd.pgdata->mbc().q;
      double coef = 2.*rd.postureScale*scale_;
      for(int i = 0; i < rd.pgdata->multibody().nrJoints(); ++i)
      {
        if(rd.pgdata->multibody().joint(i).params() == 1)
        {
          gradient.coeffRef(index) += coef*(q[i][0] - rd.tq[i][0]);
        }
        index += rd.pgdata->mb().joint(i).dof();
      }
    }


    if(rd.forceScale > 0.)
    {
      int index = rd.pgdata->forceParamsBegin();
      for(const auto& fd: rd.pgdata->forceDatas())
      {
        for(std::size_t i = 0; i < fd.forces.size(); ++i)
        {
          Eigen::Vector3d forceTmp = fd.forces[i].force()*rd.forceScale*scale_*2.;

          gradient.coeffRef(index + 0) += forceTmp.x();
          gradient.coeffRef(index + 1) += forceTmp.y();
          gradient.coeffRef(index + 2) += forceTmp.z();
          index += 3;
        }
      }
    }


    for(const ForceContactMinimizationData& fcmd: rd.forceContactsMin)
    {
      const auto& forceData = rd.pgdata->forceDatas()[fcmd.forcePos];
      int index = int(fcmd.gradientPos);

      for(std::size_t i = 0; i < forceData.forces.size(); ++i)
      {
        Eigen::Vector3d forceTmp = forceData.forces[i].force()*fcmd.scale*scale_*2.;

        gradient.coeffRef(index + 0) += forceTmp.x();
        gradient.coeffRef(index + 1) += forceTmp.y();
        gradient.coeffRef(index + 2) += forceTmp.z();
        index += 3;
      }
    }


    for(TorqueContactMinimizationData& tcmd: rd.torqueContactsMin)
    {
      const auto& forceData = rd.pgdata->forceDatas()[tcmd.forcePos];
      const sva::PTransformd& X_0_b = rd.pgdata->mbc().bodyPosW[tcmd.bodyIndex];

      int forceIndex = int(tcmd.gradientPos);
      for(std::size_t pi = 0; pi < tcmd.points.size(); ++pi)
      {
        Eigen::Vector3d fBody(X_0_b.rotation()*forceData.forces[pi].force());
        Eigen::Vector3d lever = tcmd.levers[pi].cross(fBody);
        Eigen::Matrix3d crossMat = sva::vector3ToCrossMatrix(tcmd.levers[pi]);
        Eigen::RowVector3d dotCrossDiff(tcmd.axis.transpose()*crossMat);
        double squareDiff = 2.*tcmd.axis.dot(lever)*tcmd.scale*scale_;


        const auto& qDiffX = tcmd.jac.vectorJacobian(rd.pgdata->mb(), rd.pgdata->mbc(),
                                                     Eigen::Vector3d::UnitX()).block(3, 0, 3, tcmd.jac.dof());
        tcmd.jacMatTmp.row(0) = forceData.forces[pi].force().transpose()*qDiffX;

        const auto& qDiffY = tcmd.jac.vectorJacobian(rd.pgdata->mb(), rd.pgdata->mbc(),
                                                     Eigen::Vector3d::UnitY()).block(3, 0, 3, tcmd.jac.dof());
        tcmd.jacMatTmp.row(1) = forceData.forces[pi].force().transpose()*qDiffY;

        const auto& qDiffZ = tcmd.jac.vectorJacobian(rd.pgdata->mb(), rd.pgdata->mbc(),
                                                     Eigen::Vector3d::UnitZ()).block(3, 0, 3, tcmd.jac.dof());
        tcmd.jacMatTmp.row(2) = forceData.forces[pi].force().transpose()*qDiffZ;

        tcmd.jacMat.noalias() = (squareDiff*dotCrossDiff)*tcmd.jacMatTmp;

        updateFullJacobianSparse(rd.pgdata->mb(), tcmd.jac, tcmd.jacMat, tcmd.jacMatFull,
                                 {0, rd.pgdata->qParamsBegin()});
        gradient += tcmd.jacMatFull.transpose();

        Eigen::RowVector3d fDiff;
        fDiff = squareDiff*dotCrossDiff*X_0_b.rotation();

        gradient.coeffRef(forceIndex + 0) += fDiff.x();
        gradient.coeffRef(forceIndex + 1) += fDiff.y();
        gradient.coeffRef(forceIndex + 2) += fDiff.z();
        forceIndex += 3;
      }
    }


    for(NormalForceTargetData& nft: rd.normalForceTargets)
    {
      const auto& forceData = rd.pgdata->forceDatas()[nft.forcePos];
      const sva::PTransformd& X_0_b = rd.pgdata->mbc().bodyPosW[forceData.bodyIndex];

      double nForceSum = 0.;
      for(std::size_t pi = 0; pi < forceData.points.size(); ++pi)
      {
        // force in the point pi frame
        sva::PTransformd X_0_pi = forceData.points[pi]*X_0_b;
        nForceSum += (X_0_pi.rotation()*forceData.forces[pi].force()).z();
      }
      double error = nForceSum - nft.target;

      int forceIndex = int(nft.gradientPos);
      double scale = scale_*nft.scale;
      for(std::size_t pi = 0; pi < forceData.points.size(); ++pi)
      {
        double coef = 2.*scale*error;
        sva::PTransformd X_0_pi = forceData.points[pi]*X_0_b;

        const auto& jacPointMat =
            nft.jac.vectorJacobian(rd.pgdata->mb(),
                                   rd.pgdata->mbc(),
                                   forceData.points[pi].rotation().row(2).transpose())\
            .block(3, 0, 3, nft.jac.dof());
        nft.jacMat.noalias() = (coef*forceData.forces[pi].force().transpose())*
          jacPointMat;
        updateFullJacobianSparse(rd.pgdata->mb(), nft.jac, nft.jacMat,
                                 nft.jacMatFull,
                                 {0, rd.pgdata->qParamsBegin()});
        gradient += nft.jacMatFull.transpose();

        Eigen::RowVector3d fDiff;
        fDiff = coef*X_0_pi.rotation().row(2);
        gradient.coeffRef(forceIndex + 0) += fDiff.x();
        gradient.coeffRef(forceIndex + 1) += fDiff.y();
        gradient.coeffRef(forceIndex + 2) += fDiff.z();
        forceIndex += 3;
      }
    }


    for(TangentialForceMinimizationData& tfm: rd.tanForceMin)
    {
      const auto& forceData = rd.pgdata->forceDatas()[tfm.forcePos];
      const sva::PTransformd& X_0_b = rd.pgdata->mbc().bodyPosW[forceData.bodyIndex];

      int forceIndex = int(tfm.gradientPos);
      double scale = scale_*tfm.scale;
      for(std::size_t pi = 0; pi < forceData.points.size(); ++pi)
      {
        sva::PTransformd X_0_pi = forceData.points[pi]*X_0_b;
        Eigen::Vector3d fPoint(X_0_pi.rotation()*forceData.forces[pi].force());

        double coefT = 2.*scale*fPoint.x();
        double coefB = 2.*scale*fPoint.y();

        auto fillGradient =
          [forceIndex, pi, &X_0_pi, &forceData, &rd, &gradient, &tfm](int row, double coef)
        {
          const auto& jacPointMat =
              tfm.jac.vectorJacobian(rd.pgdata->mb(),
                                     rd.pgdata->mbc(),
                                     forceData.points[pi].rotation().row(row).transpose())\
              .block(3, 0, 3, tfm.jac.dof());
          tfm.jacMat.noalias() = (coef*forceData.forces[pi].force().transpose())*
            jacPointMat;
          updateFullJacobianSparse(rd.pgdata->mb(), tfm.jac, tfm.jacMat,
                                   tfm.jacMatFull,
                                   {0, rd.pgdata->qParamsBegin()});
          gradient += tfm.jacMatFull.transpose();

          Eigen::RowVector3d fDiff;
          fDiff = coef*X_0_pi.rotation().row(row);
          gradient.coeffRef(forceIndex + 0) += fDiff.x();
          gradient.coeffRef(forceIndex + 1) += fDiff.y();
          gradient.coeffRef(forceIndex + 2) += fDiff.z();
        };
        fillGradient(0, coefT);
        fillGradient(1, coefB);

        forceIndex += 3;
      }
    }


    for(BodyPositionTargetData& bp: rd.bodyPosTargets)
    {
      Eigen::Vector3d error(rd.pgdata->mbc().bodyPosW[bp.bodyIndex].translation()
        - bp.target);

      const Eigen::MatrixXd& jacMat = bp.jac.jacobian(rd.pgdata->mb(), rd.pgdata->mbc());
      bp.jacMat.noalias() = (scale_*bp.scale*2.*error.transpose())*\
          jacMat.block(3, 0, 3, bp.jac.dof());
      updateFullJacobianSparse(rd.pgdata->mb(), bp.jac, bp.jacMat, bp.jacMatFull,
                               {0, rd.pgdata->qParamsBegin()});
      gradient += bp.jacMatFull.transpose();
    }


    for(BodyOrientationTargetData& bo: rd.bodyOriTargets)
    {
      Eigen::Vector3d error(sva::rotationError(bo.target,
        rd.pgdata->mbc().bodyPosW[bo.bodyIndex].rotation(), 1e-7));

      const Eigen::MatrixXd& jacMat = bo.jac.jacobian(rd.pgdata->mb(), rd.pgdata->mbc());
      bo.jacMat.noalias() = (scale_*bo.scale*2.*error.transpose())*\
          jacMat.block(0, 0, 3, bo.jac.dof());
      updateFullJacobianSparse(rd.pgdata->mb(), bo.jac, bo.jacMat, bo.jacMatFull,
                               {0, rd.pgdata->qParamsBegin()});
      gradient += bo.jacMatFull.transpose();
    }
  }
}
Beispiel #5
0
void StdCostFunc::impl_compute(result_t& res, const argument_t& x) const
{
  res(0) = 0.;

  for(RobotData& rd: robotDatas_)
  {
    rd.pgdata->x(x);

    // compute posture task
    double posture = 0.;
    if(rd.postureScale > 0.)
    {
      const std::vector<std::vector<double>>& q = rd.pgdata->mbc().q;
      for(int i = 0; i < rd.pgdata->mb().nrJoints(); ++i)
      {
        if(rd.pgdata->mb().joint(i).params() == 1)
        {
          posture += std::pow(q[i][0] - rd.tq[i][0], 2);
        }
      }
    }

    // compute torque task
    /*
    scalar_t torque = scalar_t(0., Eigen::VectorXd::Zero(this->inputSize()));
    if(torqueScale_ > 0.)
    {
      const auto& torqueVec = rd.pgdata->id().torque();
      for(int i = 0; i < rd.pgdata->multibody().nrJoints(); ++i)
      {
        for(int j = 0; j < rd.pgdata->multibody().joint(i).dof(); ++j)
        {
          torque += std::pow(torqueVec[i](j), 2);
        }
      }
    }
    */

    // compute force task
    double force = 0.;
    if(rd.forceScale > 0.)
    {
      for(const auto& fd: rd.pgdata->forceDatas())
      {
        for(const sva::ForceVecd& fv: fd.forces)
        {
          force += fv.force().squaredNorm()*rd.forceScale;
        }
      }
    }

    double pos = 0.;
    for(const BodyPositionTargetData& bp: rd.bodyPosTargets)
    {
      pos += (rd.pgdata->mbc().bodyPosW[bp.bodyIndex].translation() - bp.target).squaredNorm()*
          bp.scale;
    }

    double ori = 0.;
    for(const BodyOrientationTargetData& bo: rd.bodyOriTargets)
    {
      ori += sva::rotationError(bo.target,
        rd.pgdata->mbc().bodyPosW[bo.bodyIndex].rotation(), 1e-7).squaredNorm()*
          bo.scale;
    }

    double forceMin = 0.;
    for(const ForceContactMinimizationData& fcmd: rd.forceContactsMin)
    {
      const auto& forceData = rd.pgdata->forceDatas()[fcmd.forcePos];
      for(const sva::ForceVecd& fv: forceData.forces)
      {
        forceMin += fv.force().squaredNorm()*fcmd.scale;
      }
    }

    double torqueContactMin = 0.;
    for(const TorqueContactMinimizationData& tcmd: rd.torqueContactsMin)
    {
      const auto& forceData = rd.pgdata->forceDatas()[tcmd.forcePos];
      const sva::PTransformd& X_0_b = rd.pgdata->mbc().bodyPosW[tcmd.bodyIndex];
      for(std::size_t pi = 0; pi < tcmd.points.size(); ++pi)
      {
        Eigen::Vector3d fBody(X_0_b.rotation()*forceData.forces[pi].force());
        torqueContactMin += std::pow(tcmd.axis.dot(tcmd.levers[pi].cross(fBody)), 2)*tcmd.scale;
      }
    }

    double normalForceTarget = 0.;
    for(const NormalForceTargetData& nft: rd.normalForceTargets)
    {
      const auto& forceData = rd.pgdata->forceDatas()[nft.forcePos];
      const sva::PTransformd& X_0_b = rd.pgdata->mbc().bodyPosW[forceData.bodyIndex];
      double nForceSum = 0.;
      for(std::size_t pi = 0; pi < forceData.points.size(); ++pi)
      {
        // force in the point pi frame
        sva::PTransformd X_0_pi = forceData.points[pi]*X_0_b;
        nForceSum += (X_0_pi.rotation()*forceData.forces[pi].force()).z();
      }
      normalForceTarget += std::pow(nForceSum - nft.target, 2)*nft.scale;
    }

    double tanForceMin = 0.;
    for(const TangentialForceMinimizationData& tfm: rd.tanForceMin)
    {
      const auto& forceData = rd.pgdata->forceDatas()[tfm.forcePos];
      const sva::PTransformd& X_0_b = rd.pgdata->mbc().bodyPosW[forceData.bodyIndex];
      for(std::size_t pi = 0; pi < forceData.points.size(); ++pi)
      {
        // force in the point pi frame
        sva::PTransformd X_0_pi = forceData.points[pi]*X_0_b;
        Eigen::Vector3d fPoint(X_0_pi.rotation()*forceData.forces[pi].force());
        tanForceMin += Eigen::Vector2d(fPoint.x(), fPoint.y()).squaredNorm()*tfm.scale;
      }
    }

    //Compute ellipse contact cost
    /*
    scalar_t ellipses = scalar_t(0., Eigen::VectorXd::Zero(this->inputSize()));
    if(ellipseScale_ > 0.)
    {
      for(std::size_t i = 0; i < rd.pgdata->ellipseDatas().size(); ++i)
      {
        ellipses += -boost::math::constants::pi<double>()*rd.pgdata->ellipseDatas()[i].r1 * rd.pgdata->ellipseDatas()[i].r2;
        std::cout << "ellipses cost: " << ellipses << std::endl;
      }
    }
    */

    res(0) += (posture*rd.postureScale + force +
        pos + ori + forceMin + torqueContactMin + normalForceTarget +
        tanForceMin)*scale_;
  }
}
Beispiel #6
0
fPoint Line::getPoint(float t)
{
  float Xx,Yy,Zz;
  getPoint(t, Xx, Yy, Zz);
  return fPoint(Xx,Yy,Zz);
}