#include "ForwardKinematics/FKJacobian.h" // provides generalized forward position solution
#include "InverseKinematics/IKJReconfig.h" // provides a closed form puma inverse
#include "Controllers/GeneralKeyboard.h" // class to poll the keyboard for input
#include "RoboWorks/Include/RoboTalk.h" // communicate with RoboWorks puma model
#include "FileData/WorkcellData.h" // used to store and retrieve DH and other data in XML files
using namespace OSCAR;
using namespace std;
String scemafilepath = "c:\\oscar\\Schemas\\ManipulatorModelingTypes.xsd";
String xmlfilepath = "c:\\oscar Tutorials\\Kinematics Tutorials\\DataFiles\\KinematicsTutorial.xml";char* TagNames[] = {"planar4R_1","planar4R_2","planar4R_3", "planar4R_4"};
OSCAR::ManipulatorData* GetManipulator( vector<ManipulatorData*> manips, string name )
{
for( unsigned int i=0; i<manips.size(); i++) {
if( manips[i]->GetName()==name ) {
return manips[i];
}
}
OSCARError newerror(777, "NO DATA FOUND");
newerror.SetCustomDescription( "GetManipulator -> Manipulator named '"+name+"' not found in XML." );
DisplayError( newerror );
system("PAUSE");
throw runtime_error( string("GetManipulator -> Manipulator named '"+name+"' not found in XML.").c_str() );
}
int main()
{ const unsigned int noTags = 4;
float tagValues[noTags]; if(Connect("Planar4R", SELF) != NO_ERROR){
cout << "Error Connecting" << endl;
return 0;
} GeneralKeyboard keyboard; Vector deltas(6);
for(unsigned int i = 0; i < 3; i++)
{
deltas.at(i) = .4;
deltas.at(i+3) = .04;
} deltas.at(2) = 0.0; deltas.at(3) = 0.0; deltas.at(4) = 0.0; OSCARError error(noError);
error = XMLData::SetSchemaFile(scemafilepath);
if(error != OSCAR::noError){
OSCAR::DisplayError(error);
system("PAUSE");
return 0; } WorkcellData XMLDataFile(xmlfilepath, error);
if(error != OSCAR::noError){
OSCAR::DisplayError(error);
system("PAUSE");
return 0; }
XMLDataFile.LoadData();
vector<ManipulatorData*> robots = XMLDataFile.Manipulators; FKJacobian fkj( *(GetManipulator(robots,"Planar4R")->GetDHParameters()) ); fkj.SetTool( *(GetManipulator(robots,"Planar4R")->GetToolPlatePose()) ); JointVector initialJoints(fkj.GetDOF());
initialJoints[0] = 30.0;
initialJoints[1] = 65.0;
initialJoints[2] = -105.0;
initialJoints[3] = 55.0;
initialJoints *= DegToRad; for(i = 0; i < noTags; i++)
tagValues[i]=initialJoints.at(i)*RadToDeg;
SetTagValues(TagNames, tagValues, noTags); HandPose initialHandPose(Orientation::FixedXYZ);
(fkj.GetHandPose(initialJoints))->Get(initialHandPose); IKJReconfig<> ikj(initialJoints,&fkj);
ikj.SetMinimumMOT(10); bool inverseResult;
int kFlag = 0;
JointVector currentJoints(fkj.GetDOF());
HandPose previousHand(Orientation::FixedXYZ), currentHand(Orientation::FixedXYZ);
currentJoints = initialJoints;
previousHand = currentHand = initialHandPose; currentHand.SetCoordinateStatus(2,Inactive);
currentHand.SetCoordinateStatus(3,Inactive);
currentHand.SetCoordinateStatus(4,Inactive);
cout<<" -- Inverse Control of Planar 4R 3-DOF Manipulator --\n"<<endl;
cout<<" Use keys for x, y, and yaw control of end-effector."<<endl;
cout<<" For +/- x direction use 1 and q."<<endl;
cout<<" For +/- y direction use 2 and w."<<endl;
cout<<" For +/- z rotation use 6 and y.\n"<<endl;
cout<<" Use keys a and z for Self-motion about joint 2.\n"<<endl;
cout<<" Press ESC to exit.\n\n";
cout<<"any key to begin...";
getch();
bool selfMotion=false;
while(kFlag != -4)
{
kFlag = keyboard.UpdateVector(currentHand, deltas);
if(kFlag == -4)
cout << "ESC WAS PRESSED." << endl; if(keyboard.GetKeyState('a') == true){
currentJoints.at(1) += .2;
selfMotion = true;
ikj.SetJointPosition(currentJoints);
} if(keyboard.GetKeyState('z') == true){
currentJoints.at(1) -= .2;
selfMotion = true;
ikj.SetJointPosition(currentJoints);
} if((kFlag > -1) || (selfMotion==true)){ inverseResult = ikj.GetJointPosition(currentHand, currentJoints); if(inverseResult == false){
currentHand = previousHand;
DisplayError(ikj.GetError());
}
previousHand = currentHand; for(i = 0; i < fkj.GetDOF(); i++)
tagValues[i]=currentJoints.at(i)*RadToDeg;
SetTagValues(TagNames, tagValues, noTags);
selfMotion=false;
} double mom = ikj.GetSolutionProperties();
cout <<"MOM = " << mom << endl;
}
return 0;
}