예제 #1
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    if(nrhs!= 1)
    {
        mexErrMsgIdAndTxt("Drake:constraintCategorymex:BadInputs","Usage constraint_category = constraintCategorymex(constraint_ptr)");
    }
    RigidBodyConstraint* cnst = (RigidBodyConstraint*) getDrakeMexPointer(prhs[0]);
    int category = cnst->getCategory();
    switch(category)
    {
    case RigidBodyConstraint::SingleTimeKinematicConstraintCategory:
        plhs[0] = mxCreateString("SingleTimeKinematicConstraint");
        break;
    case RigidBodyConstraint::MultipleTimeKinematicConstraintCategory:
        plhs[0] = mxCreateString("MultipleTimeKinematicConstraint");
        break;
    case RigidBodyConstraint::QuasiStaticConstraintCategory:
        plhs[0] = mxCreateString("QuasiStaticConstraint");
        break;
    case RigidBodyConstraint::PostureConstraintCategory:
        plhs[0] = mxCreateString("PostureConstraint");
        break;
    case RigidBodyConstraint::MultipleTimeLinearPostureConstraintCategory:
        plhs[0] = mxCreateString("MultipleTimeLinearPostureConstraint");
        break;
    case RigidBodyConstraint::SingleTimeLinearPostureConstraintCategory:
        plhs[0] = mxCreateString("SingleTimeLinearPostureConstraint");
        break;
    default:
        mexErrMsgIdAndTxt("Drake:constraintCategorymex:BadInputs","The constraint category is not supported");
        break;
    }
}
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
    RigidBodyConstraint* constraint = (RigidBodyConstraint*) getDrakeMexPointer(prhs[0]);
    int constraint_type = constraint->getType();
    mwSize strlen = mxGetNumberOfElements(prhs[1])+1;
    char* field = new char[strlen];
    mxGetString(prhs[1],field,strlen);
    string field_str(field);
    switch(constraint_type)
    {
    case RigidBodyConstraint::QuasiStaticConstraintType:
    {
        QuasiStaticConstraint* cnst = (QuasiStaticConstraint*) constraint;
        if(field_str=="active")
        {
            // setActive(qsc_ptr,flag)
            if(mxGetNumberOfElements(prhs[2]) != 1)
            {
                mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","QuasiStaticConstraint:flag must be a single boolean");
            }
            bool* flag = mxGetLogicals(prhs[2]);
            QuasiStaticConstraint* cnst_new = new QuasiStaticConstraint(*cnst);
            cnst_new->setActive(*flag);
            plhs[0] = createDrakeConstraintMexPointer((void*) cnst_new,"deleteRigidBodyConstraintmex","QuasiStaticConstraint");
        }
        else if(field_str=="factor")
        {   // setShrinkFactor(qsc_ptr,factor)
            if(mxGetNumberOfElements(prhs[2]) != 1)
            {
                mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","QuasiStaticConstraint:shrink factor must be a double scalar");
            }
            double factor = mxGetScalar(prhs[2]);
            if(factor<=0.0)
            {
                mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","QuasiStaticConstraint:shrink factor should be a positive scalar");
            }
            QuasiStaticConstraint* cnst_new = new QuasiStaticConstraint(*cnst);
            cnst_new->setShrinkFactor(factor);
            plhs[0] = createDrakeConstraintMexPointer((void*) cnst_new,"deleteRigidBodyConstraintmex","QuasiStaticConstraint");
        }
        else if(field_str=="contact")
        {
            // addContact(qsc_ptr,body1, body1_pts, body2, body2_pts,...)
            int num_new_bodies = (nrhs-2)/2;
            int* new_bodies = new int[num_new_bodies];
            MatrixXd* new_body_pts = new MatrixXd[num_new_bodies];
            for(int idx = 0; idx<num_new_bodies; idx++)
            {
                new_bodies[idx] = (int) mxGetScalar(prhs[2+idx*2])-1;
                int npts = mxGetN(prhs[3+idx*2]);
                MatrixXd new_body_pts_tmp(3,npts);
                memcpy(new_body_pts_tmp.data(),mxGetPr(prhs[3+idx*2]),sizeof(double)*3*npts);
                new_body_pts[idx].resize(4,npts);
                new_body_pts[idx].block(0,0,3,npts) = new_body_pts_tmp;
                new_body_pts[idx].row(3) = MatrixXd::Ones(1,npts);
            }
            QuasiStaticConstraint* cnst_new = new QuasiStaticConstraint(*cnst);
            cnst_new->addContact(num_new_bodies,new_bodies,new_body_pts);
            plhs[0] = createDrakeConstraintMexPointer((void*) cnst_new,"deleteRigidBodyConstraintmex","QuasiStaticConstraint");
            delete[] new_bodies;
            delete[] new_body_pts;
        }
        else if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            QuasiStaticConstraint* cnst_new = new QuasiStaticConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*) cnst_new,"deleteRigidBodyConstraintmex","QuasiStaticConstraint");
        }
        else if(field_str=="robotnum")
        {
            int num_robot = mxGetNumberOfElements(prhs[2]);
            double* robotnum_tmp = new double[num_robot];
            int* robotnum = new int[num_robot];
            memcpy(robotnum_tmp,mxGetPr(prhs[2]),sizeof(double)*num_robot);
            for(int i = 0; i<num_robot; i++)
            {
                robotnum[i] = (int) robotnum_tmp[i]-1;
            }
            set<int> robotnumset(robotnum,robotnum+num_robot);
            QuasiStaticConstraint* cnst_new = new QuasiStaticConstraint(*cnst);
            cnst_new->updateRobotnum(robotnumset);
            plhs[0] = createDrakeConstraintMexPointer((void*) cnst_new,"deleteRigidBodyConstraintmex","QuasiStaticConstraint");
            delete[] robotnum_tmp;
            delete[] robotnum;
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","QuasiStaticConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::PostureConstraintType:
    {
        PostureConstraint* pc = (PostureConstraint*) constraint;
        if(field_str=="bounds")
        {   // setJointLimits(pc,joint_idx,lb,ub)
            int num_idx = mxGetM(prhs[2]);
            if(!mxIsNumeric(prhs[2]) || mxGetN(prhs[2]) != 1 || !mxIsNumeric(prhs[3]) || mxGetM(prhs[3]) != num_idx || mxGetN(prhs[3]) != 1 || !mxIsNumeric(prhs[4]) || mxGetM(prhs[4]) != num_idx || mxGetN(prhs[4]) != 1)
            {
                mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","PostureConstraint:joint_idx, lb and ub must be of the same length numerical vector");
            }
            int* joint_idx = new int[num_idx];
            for(int i = 0; i<num_idx; i++)
            {
                joint_idx[i] = (int) *(mxGetPr(prhs[2])+i)-1;
            }
            VectorXd lb(num_idx),ub(num_idx);
            memcpy(lb.data(),mxGetPr(prhs[3]),sizeof(double)*num_idx);
            memcpy(ub.data(),mxGetPr(prhs[4]),sizeof(double)*num_idx);
            PostureConstraint* pc_new = new PostureConstraint(*pc);
            pc_new->setJointLimits(num_idx,joint_idx,lb,ub);
            delete[] joint_idx;
            plhs[0] = createDrakeConstraintMexPointer((void*)pc_new,"deleteRigidBodyConstraintmex","PostureConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","PostureConstraint: argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::AllBodiesClosestDistanceConstraintType:
    {
        AllBodiesClosestDistanceConstraint* cnst = (AllBodiesClosestDistanceConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            AllBodiesClosestDistanceConstraint* cnst_new = new AllBodiesClosestDistanceConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*) cnst_new,"deleteRigidBodyConstraintmex","AllBodiesClosestDistanceConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","AllBodiesClosestDistanceConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldEulerConstraintType:
    {
        WorldEulerConstraint* cnst = (WorldEulerConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldEulerConstraint* cnst_new = new WorldEulerConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","WorldEulerConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldEulerConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldGazeDirConstraintType:
    {
        WorldGazeDirConstraint* cnst = (WorldGazeDirConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldGazeDirConstraint* cnst_new = new WorldGazeDirConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","WorldGazeDirConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldGazeDirConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldGazeOrientConstraintType:
    {
        WorldGazeOrientConstraint* cnst = (WorldGazeOrientConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldGazeOrientConstraint* cnst_new = new WorldGazeOrientConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","WorldGazeOrientConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldGazeOrientConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldGazeTargetConstraintType:
    {
        WorldGazeTargetConstraint* cnst = (WorldGazeTargetConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldGazeTargetConstraint* cnst_new = new WorldGazeTargetConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","WorldGazeTargetConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldGazeTargetConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::RelativeGazeTargetConstraintType:
    {
        RelativeGazeTargetConstraint* cnst = (RelativeGazeTargetConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            RelativeGazeTargetConstraint* cnst_new = new RelativeGazeTargetConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","RelativeGazeTargetConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","RelativeGazeTargetConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::RelativeGazeDirConstraintType:
    {
        RelativeGazeDirConstraint* cnst = (RelativeGazeDirConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            RelativeGazeDirConstraint* cnst_new = new RelativeGazeDirConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","RelativeGazeDirConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","RelativeGazeDirConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldCoMConstraintType:
    {
        WorldCoMConstraint* cnst = (WorldCoMConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldCoMConstraint* cnst_new = new WorldCoMConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","WorldCoMConstraint");
        }
        else if(field_str=="robotnum")
        {
            int num_robot = mxGetNumberOfElements(prhs[2]);
            double* robotnum_tmp = new double[num_robot];
            int* robotnum = new int[num_robot];
            memcpy(robotnum_tmp,mxGetPr(prhs[2]),sizeof(double)*num_robot);
            for(int i = 0; i<num_robot; i++)
            {
                robotnum[i] = (int) robotnum_tmp[i]-1;
            }
            set<int> robotnumset(robotnum,robotnum+num_robot);
            WorldCoMConstraint* cnst_new = new WorldCoMConstraint(*cnst);
            cnst_new->updateRobotnum(robotnumset);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","WorldCoMConstraint");
            delete[] robotnum_tmp;
            delete[] robotnum;
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldCoMConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldPositionConstraintType:
    {
        WorldPositionConstraint* cnst = (WorldPositionConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldPositionConstraint* cnst_new = new WorldPositionConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*) cnst_new,"deleteRigidBodyConstraintmex","WorldPositionConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldPositionConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldPositionInFrameConstraintType:
    {
        WorldPositionInFrameConstraint* cnst = (WorldPositionInFrameConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldPositionInFrameConstraint* cnst_new = new WorldPositionInFrameConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*) cnst_new,"deleteRigidBodyConstraintmex","WorldPositionInFrameConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldPositionInFrameConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldQuatConstraintType:
    {
        WorldQuatConstraint* cnst = (WorldQuatConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldQuatConstraint* cnst_new = new WorldQuatConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","WorldQuatConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldQuatConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::Point2PointDistanceConstraintType:
    {
        Point2PointDistanceConstraint* cnst = (Point2PointDistanceConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            Point2PointDistanceConstraint* cnst_new = new Point2PointDistanceConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","Point2PointDistanceConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","Point2PointDistanceConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::Point2LineSegDistConstraintType:
    {
        Point2LineSegDistConstraint* cnst = (Point2LineSegDistConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            Point2LineSegDistConstraint* cnst_new = new Point2LineSegDistConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","Point2LineSegDistConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","Point2LineSegDistConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldFixedPositionConstraintType:
    {
        WorldFixedPositionConstraint* cnst = (WorldFixedPositionConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldFixedPositionConstraint* cnst_new = new WorldFixedPositionConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","WorldFixedPositionConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldFixedPositionConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldFixedOrientConstraintType:
    {
        WorldFixedOrientConstraint* cnst = (WorldFixedOrientConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldFixedOrientConstraint* cnst_new = new WorldFixedOrientConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","WorldFixedOrientConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldFixedOrientConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::WorldFixedBodyPoseConstraintType:
    {
        WorldFixedBodyPoseConstraint* cnst = (WorldFixedBodyPoseConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            WorldFixedBodyPoseConstraint* cnst_new = new WorldFixedBodyPoseConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","WorldFixedBodyPoseConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","WorldFixedBodyPoseConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::RelativePositionConstraintType:
    {
        RelativePositionConstraint* cnst = static_cast<RelativePositionConstraint*>(constraint);
        if(field_str == "robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            RelativePositionConstraint* cnst_new = new RelativePositionConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","RelativePositionConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","RelativePositionConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::RelativeQuatConstraintType:
    {
        RelativeQuatConstraint* cnst = static_cast<RelativeQuatConstraint*>(constraint);
        if(field_str == "robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            RelativeQuatConstraint* cnst_new = new RelativeQuatConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*)cnst_new,"deleteRigidBodyConstraintmex","RelativeQuatConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","RelativeQuatConstraint:argument 2 is not accepted");
        }
    }
    break;
    case RigidBodyConstraint::MinDistanceConstraintType:
    {
        MinDistanceConstraint* cnst = (MinDistanceConstraint*) constraint;
        if(field_str=="robot")
        {
            RigidBodyManipulator* robot = (RigidBodyManipulator*) getDrakeMexPointer(prhs[2]);
            MinDistanceConstraint* cnst_new = new MinDistanceConstraint(*cnst);
            cnst_new->updateRobot(robot);
            plhs[0] = createDrakeConstraintMexPointer((void*) cnst_new,"deleteRigidBodyConstraintmex","MinDistanceConstraint");
        }
        else
        {
            mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","MinDistanceConstraint:argument 2 is not accepted");
        }
    }
    break;
    default:
        mexErrMsgIdAndTxt("Drake:updatePtrRigidBodyConstraintmex:BadInputs","Unsupported constraint type");
        break;
    }
    delete[] field;
}
예제 #3
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
  if(nrhs!= 1)
  {
    mexErrMsgIdAndTxt("Drake:constraintTypemex:BadInputs","Usage constraint_type = constraintTypemex(constraint_ptr)");
  }
  RigidBodyConstraint* cnst = (RigidBodyConstraint*) getDrakeMexPointer(prhs[0]);
  int type = cnst->getType();
  switch(type)
  {
    case RigidBodyConstraint::QuasiStaticConstraintType:
      plhs[0] = mxCreateString("QuasiStaticConstraint");
      break;
    case RigidBodyConstraint::PostureConstraintType:
      plhs[0] = mxCreateString("PostureConstraint");
      break;
    case RigidBodyConstraint::SingleTimeLinearPostureConstraintType:
      plhs[0] = mxCreateString("SingleTimeLinearPostureConstraint");
      break;
    case RigidBodyConstraint::AllBodiesClosestDistanceConstraintType:
      plhs[0] = mxCreateString("AllBodiesClosestDistanceConstraint");
      break;
    case RigidBodyConstraint::WorldEulerConstraintType:
      plhs[0] = mxCreateString("WorldEulerConstraint");
      break;
    case RigidBodyConstraint::WorldGazeDirConstraintType:
      plhs[0] = mxCreateString("WorldGazeDirConstraint");
      break;
    case RigidBodyConstraint::WorldGazeOrientConstraintType:
      plhs[0] = mxCreateString("WorldGazeOrientConstraint");
      break;
    case RigidBodyConstraint::WorldGazeTargetConstraintType:
      plhs[0] = mxCreateString("WorldGazeTargetConstraint");
      break;
    case RigidBodyConstraint::RelativeGazeTargetConstraintType:
      plhs[0] = mxCreateString("RelativeGazeTargetConstraint");
      break;
    case RigidBodyConstraint::RelativeGazeDirConstraintType:
      plhs[0] = mxCreateString("RelativeGazeDirConstraint");
      break;
    case RigidBodyConstraint::WorldCoMConstraintType:
      plhs[0] = mxCreateString("WorldCoMConstraint");
      break;
    case RigidBodyConstraint::WorldPositionConstraintType:
      plhs[0] = mxCreateString("WorldPositionConstraint");
      break;
    case RigidBodyConstraint::WorldPositionInFrameConstraintType:
      plhs[0] = mxCreateString("WorldPositionInFrameConstraint");
      break;
    case RigidBodyConstraint::WorldQuatConstraintType:
      plhs[0] = mxCreateString("WorldQuatConstraint");
      break;
    case RigidBodyConstraint::Point2PointDistanceConstraintType:
      plhs[0] = mxCreateString("Point2PointDistanceConstraint");
      break;
    case RigidBodyConstraint::Point2LineSegDistConstraintType:
      plhs[0] = mxCreateString("Point2LineSegDistConstraint");
      break;
    case RigidBodyConstraint::WorldFixedPositionConstraintType:
      plhs[0] = mxCreateString("WorldFixedPositionConstraint");
      break;
    case RigidBodyConstraint::WorldFixedOrientConstraintType:
      plhs[0] = mxCreateString("WorldFixedOrientConstraint");
      break;
    case RigidBodyConstraint::WorldFixedBodyPoseConstraintType:
      plhs[0] = mxCreateString("WorldFixedBodyPoseConstraint");
      break;
    case RigidBodyConstraint::PostureChangeConstraintType:
      plhs[0] = mxCreateString("PostureChangeConstraint");
      break;
    case RigidBodyConstraint::RelativePositionConstraintType:
      plhs[0] = mxCreateString("RelativePositionConstraint");
      break;
    case RigidBodyConstraint::RelativeQuatConstraintType:
      plhs[0] = mxCreateString("RelativeQuatConstraint");
      break;
    case RigidBodyConstraint::MinDistanceConstraintType:
      plhs[0] = mxCreateString("MinDistanceConstraint");
      break;
    case RigidBodyConstraint::GravityCompensationTorqueConstraintType:
      plhs[0] = mxCreateString("GravityCompensationTorqueConstraint");
      break;
    default:
      mexErrMsgIdAndTxt("Drake:constraintTypemex:BadInputs","The constraint type is not supported");
      break;
  }
}
예제 #4
0
void inverseKinBackend(
    RigidBodyTree* model, const int nT,
    const double* t, const MatrixBase<DerivedA>& q_seed,
    const MatrixBase<DerivedB>& q_nom, const int num_constraints,
    RigidBodyConstraint** const constraint_array,
    const IKoptions& ikoptions, MatrixBase<DerivedC>* q_sol,
    int* info, std::vector<std::string>* infeasible_constraint) {

  // Validate some basic parameters of the input.
  if (q_seed.rows() != model->number_of_positions() || q_seed.cols() != nT ||
      q_nom.rows() != model->number_of_positions() || q_nom.cols() != nT) {
    throw std::runtime_error(
        "Drake::inverseKinBackend: q_seed and q_nom must be of size "
        "nq x nT");
  }

  KinematicsCacheHelper<double> kin_helper(model->bodies);

  // TODO(sam.creasey) I really don't like rebuilding the
  // OptimizationProblem for every timestep, but it's not possible to
  // enable/disable (or even remove) a constraint from an
  // OptimizationProblem between calls to Solve() currently, so
  // there's not actually another way.
  for (int t_index = 0; t_index < nT; t_index++) {
    OptimizationProblem prog;
    SetIKSolverOptions(ikoptions, &prog);

    DecisionVariableView vars =
        prog.AddContinuousVariables(model->number_of_positions());

    MatrixXd Q;
    ikoptions.getQ(Q);
    auto objective = std::make_shared<InverseKinObjective>(model, Q);
    prog.AddCost(objective, {vars});

    for (int i = 0; i < num_constraints; i++) {
      RigidBodyConstraint* constraint = constraint_array[i];
      const int constraint_category = constraint->getCategory();
      if (constraint_category ==
          RigidBodyConstraint::SingleTimeKinematicConstraintCategory) {
        SingleTimeKinematicConstraint* stc =
            static_cast<SingleTimeKinematicConstraint*>(constraint);
        if (!stc->isTimeValid(&t[t_index])) { continue; }
        auto wrapper = std::make_shared<SingleTimeKinematicConstraintWrapper>(
            stc, &kin_helper);
        prog.AddConstraint(wrapper, {vars});
      } else if (constraint_category ==
                 RigidBodyConstraint::PostureConstraintCategory) {
        PostureConstraint* pc = static_cast<PostureConstraint*>(constraint);
        if (!pc->isTimeValid(&t[t_index])) { continue; }
        VectorXd lb;
        VectorXd ub;
        pc->bounds(&t[t_index], lb, ub);
        prog.AddBoundingBoxConstraint(lb, ub, {vars});
      } else if (
          constraint_category ==
          RigidBodyConstraint::SingleTimeLinearPostureConstraintCategory) {
        AddSingleTimeLinearPostureConstraint(
            &t[t_index], constraint, model->number_of_positions(),
            vars, &prog);
      } else if (constraint_category ==
                 RigidBodyConstraint::QuasiStaticConstraintCategory) {
        AddQuasiStaticConstraint(&t[t_index], constraint, &kin_helper,
                                 vars, &prog);
      } else if (constraint_category ==
                 RigidBodyConstraint::MultipleTimeKinematicConstraintCategory) {
        throw std::runtime_error(
            "MultipleTimeKinematicConstraint is not supported"
            " in pointwise mode.");
      } else if (
          constraint_category ==
          RigidBodyConstraint::MultipleTimeLinearPostureConstraintCategory) {
        throw std::runtime_error(
            "MultipleTimeLinearPostureConstraint is not supported"
            " in pointwise mode.");
      }
    }

    // Add a bounding box constraint from the model.
    prog.AddBoundingBoxConstraint(
        model->joint_limit_min, model->joint_limit_max,
        {vars});

    // TODO(sam.creasey) would this be faster if we stored the view
    // instead of copying into a VectorXd?
    objective->set_q_nom(q_nom.col(t_index));
    if (!ikoptions.getSequentialSeedFlag() || (t_index == 0)) {
      prog.SetInitialGuess(vars, q_seed.col(t_index));
    } else {
      prog.SetInitialGuess(vars, q_sol->col(t_index - 1));
    }

    SolutionResult result = prog.Solve();
    prog.PrintSolution();
    q_sol->col(t_index) = vars.value();
    info[t_index] = GetIKSolverInfo(prog, result);
  }
}