00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "Component/ModelManager.H"
00040 #include "Image/Image.H"
00041 #include "Image/Transforms.H"
00042 #include "Image/DrawOps.H"
00043 #include "Image/Rectangle.H"
00044 #include "Image/MathOps.H"
00045 #include "Image/MatrixOps.H"
00046 #include "Image/Layout.H"
00047 #include "Media/FrameSeries.H"
00048 #include "Transport/FrameInfo.H"
00049 #include "Raster/GenericFrame.H"
00050 #include "Raster/Raster.H"
00051 #include "Neuro/BeoHeadBrain.H"
00052 #include "Util/Timer.H"
00053 #include "GUI/GeneralGUI.H"
00054 #include "GUI/ImageDisplayStream.H"
00055 #include "GUI/DebugWin.H"
00056 #include "GUI/XWinManaged.H"
00057 #include "RCBot/Motion/MotionEnergy.H"
00058 #include "ArmControl/ArmSim.H"
00059 #include "ArmControl/RobotArm.H"
00060 #include "ArmControl/ArmController.H"
00061 #include "Devices/DeviceOpts.H"
00062 #include "Util/MathFunctions.H"
00063 #include <unistd.h>
00064 #include <stdio.h>
00065 #include <signal.h>
00066
00067 #define USE_EXPAT
00068 #include <lwpr/lwpr.h>
00069 #include <lwpr/lwpr_xml.h>
00070
00071
00072 ModelManager *mgr;
00073 nub::soft_ref<ArmSim> armSim;
00074 nub::soft_ref<ArmController> armControllerArmSim;
00075
00076
00077 void getTargetPos(double* desiredPos)
00078 {
00079 desiredPos[0] = -1.214/2+0.145 + randomDouble()*0.20;
00080 desiredPos[1] = -0.75/2+0.12 + randomDouble()*0.20;
00081 desiredPos[2] = 0.05;
00082
00083 LDEBUG("New target: %0.2f %0.2f %0.2f",
00084 desiredPos[0],
00085 desiredPos[1],
00086 desiredPos[2]);
00087
00088 }
00089
00090
00091 ArmController::JointPos getIK(LWPR_Model& ik_model, const double* desiredPos)
00092 {
00093 double joints[5];
00094 lwpr_predict(&ik_model, desiredPos, 0.001, joints, NULL, NULL);
00095
00096 ArmController::JointPos jointPos;
00097
00098 jointPos.base = (int)joints[0];
00099 jointPos.sholder = (int)joints[1];
00100 jointPos.elbow = (int)joints[2];
00101 jointPos.wrist1 = (int)joints[3];
00102 jointPos.wrist2 = (int)joints[4];
00103 jointPos.gripper = 0;
00104
00105 LDEBUG("Mapping %0.2f %0.2f %0.2f => %i %i %i %i %i",
00106 desiredPos[0], desiredPos[1], desiredPos[2],
00107 jointPos.base, jointPos.sholder, jointPos.elbow,
00108 jointPos.wrist1, jointPos.wrist2);
00109 return jointPos;
00110 }
00111
00112 double getDistance(const double* pos, const double* desiredPos)
00113 {
00114 double sum=0;
00115 for(int i=0; i<3; i++)
00116 sum += (pos[i]-desiredPos[i])*(pos[i]-desiredPos[i]);
00117 return sqrt(sum);
00118
00119 }
00120
00121
00122 void trainArm(LWPR_Model& ik_model, const double* armPos, const ArmController::JointPos& jointPos)
00123 {
00124
00125 double joints[5];
00126 double pJoints[5];
00127 LDEBUG("Training => %0.2f,%0.2f,%0.2f => %i %i %i %i %i",
00128 armPos[0], armPos[1], armPos[2],
00129 jointPos.base, jointPos.sholder, jointPos.elbow,
00130 jointPos.wrist1, jointPos.wrist2);
00131
00132 joints[0] = jointPos.base;
00133 joints[1] = jointPos.sholder;
00134 joints[2] = jointPos.elbow;
00135 joints[3] = jointPos.wrist1;
00136 joints[4] = jointPos.wrist2;
00137
00138 lwpr_update(&ik_model, armPos, joints, pJoints, NULL);
00139
00140 }
00141
00142 ArmController::JointPos calcGradient(const double* desiredPos)
00143 {
00144
00145 ArmController::JointPos jointPos = armControllerArmSim->getJointPos();
00146 ArmController::JointPos tmpJointPos = jointPos;
00147
00148 double dist1, dist2;
00149 double baseGrad, sholderGrad, elbowGrad;
00150 double err = getDistance(armSim->getEndPos(), desiredPos);
00151
00152
00153 tmpJointPos.base = jointPos.base + 100;
00154 armControllerArmSim->setJointPos(tmpJointPos);
00155 dist1 = getDistance(armSim->getEndPos(), desiredPos);
00156
00157 tmpJointPos.base = jointPos.base - 100;
00158 armControllerArmSim->setJointPos(tmpJointPos);
00159 dist2 = getDistance(armSim->getEndPos(), desiredPos);
00160 baseGrad = dist1 - dist2;
00161 tmpJointPos.base = jointPos.base;
00162
00163
00164 tmpJointPos.sholder = jointPos.sholder + 100;
00165 armControllerArmSim->setJointPos(tmpJointPos);
00166 dist1 = getDistance(armSim->getEndPos(), desiredPos);
00167 tmpJointPos.sholder = jointPos.sholder - 100;
00168 armControllerArmSim->setJointPos(tmpJointPos);
00169 dist2 = getDistance(armSim->getEndPos(), desiredPos);
00170 sholderGrad = dist1 - dist2;
00171 tmpJointPos.sholder = jointPos.sholder;
00172
00173
00174 tmpJointPos.elbow = jointPos.elbow + 100;
00175 armControllerArmSim->setJointPos(tmpJointPos);
00176 dist1 = getDistance(armSim->getEndPos(), desiredPos);
00177 tmpJointPos.elbow = jointPos.elbow - 100;
00178 armControllerArmSim->setJointPos(tmpJointPos);
00179 dist2 = getDistance(armSim->getEndPos(), desiredPos);
00180 elbowGrad = dist1 - dist2;
00181 tmpJointPos.elbow = jointPos.elbow;
00182
00183 int moveThresh = (int)(err*100000);
00184 jointPos.base -= (int)(randomUpToIncluding(moveThresh)*baseGrad);
00185 jointPos.sholder -= (int)(randomUpToIncluding(moveThresh)*sholderGrad);
00186 jointPos.elbow -= (int)(randomUpToIncluding(moveThresh)*elbowGrad);
00187
00188 return jointPos;
00189 }
00190
00191
00192
00193 void terminate(int s)
00194 {
00195 LERROR("*** INTERRUPT ***");
00196 exit(0);
00197 }
00198
00199 Point2D<int> getClick(nub::soft_ref<OutputFrameSeries> &ofs)
00200 {
00201 const nub::soft_ref<ImageDisplayStream> ids =
00202 ofs->findFrameDestType<ImageDisplayStream>();
00203
00204 const rutz::shared_ptr<XWinManaged> uiwin =
00205 ids.is_valid()
00206 ? ids->getWindow("Output")
00207 : rutz::shared_ptr<XWinManaged>();
00208 return uiwin->getLastMouseClick();
00209 }
00210
00211
00212 int getKey(nub::soft_ref<OutputFrameSeries> &ofs)
00213 {
00214 const nub::soft_ref<ImageDisplayStream> ids =
00215 ofs->findFrameDestType<ImageDisplayStream>();
00216
00217 const rutz::shared_ptr<XWinManaged> uiwin =
00218 ids.is_valid()
00219 ? ids->getWindow("Output")
00220 : rutz::shared_ptr<XWinManaged>();
00221 return uiwin->getLastKeyPress();
00222 }
00223
00224 void updateDataImg(Image<PixRGB<byte> > &img, ArmController::JointPos &jointPos)
00225 {
00226 static int x = 0;
00227
00228 if (x < img.getWidth())
00229 {
00230 if (!x)
00231 img.clear();
00232
00233 int basePos = (int)(-1.0*((float)jointPos.base/2000.0F)*256.0F);
00234
00235 img.setVal(x,basePos, PixRGB<byte>(255,0,0));
00236
00237 x++;
00238 }
00239
00240 }
00241
00242 int main(const int argc, const char **argv)
00243 {
00244 MYLOGVERB = LOG_INFO;
00245 LWPR_Model ik_model;
00246
00247 initRandomNumbers();
00248 mgr = new ModelManager("Test ObjRec");
00249 armSim = nub::soft_ref<ArmSim>(new ArmSim(*mgr));
00250 armControllerArmSim = nub::soft_ref<ArmController>(new ArmController(*mgr,
00251 "ArmControllerArmSim", "ArmControllerArmSim", armSim));
00252 mgr->addSubComponent(armControllerArmSim);
00253
00254 nub::soft_ref<OutputFrameSeries> ofs(new OutputFrameSeries(*mgr));
00255 mgr->addSubComponent(ofs);
00256
00257 nub::soft_ref<GeneralGUI> armSimGUI(new GeneralGUI(*mgr));
00258 mgr->addSubComponent(armSimGUI);
00259
00260 mgr->exportOptions(MC_RECURSE);
00261
00262 if (mgr->parseCommandLine(
00263 (const int)argc, (const char**)argv, "", 0, 0) == false)
00264 return 1;
00265
00266 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00267 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00268 signal(SIGALRM, terminate);
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 int numWarnings = 0;
00284 lwpr_read_xml(&ik_model, "ik_model.xml", &numWarnings);
00285
00286 mgr->start();
00287
00288 initRandomNumbers();
00289
00290 Image<PixRGB<byte> > dataImg(512, 256, ZEROS);
00291
00292 armSimGUI->startThread(ofs);
00293
00294 armSimGUI->addImage(&dataImg);
00295
00296
00297
00298 armControllerArmSim->setMotorsOn(true);
00299 armControllerArmSim->setPidOn(true);
00300
00301
00302 ArmController::JointPos jointPos;
00303 jointPos.base = 3000;
00304 jointPos.sholder = 3000;
00305 jointPos.elbow = 2000;
00306 jointPos.wrist1 = 0;
00307 jointPos.wrist2 = 0;
00308 armControllerArmSim->setMaxJointPos(jointPos);
00309
00310 jointPos.base = -8000;
00311 jointPos.sholder = -1500;
00312 jointPos.elbow = -3000;
00313 jointPos.wrist1 = 0;
00314 jointPos.wrist2 = 0;
00315 armControllerArmSim->setMinJointPos(jointPos);
00316
00317
00318
00319 jointPos.base = 0;
00320 jointPos.sholder = 0;
00321 jointPos.elbow = 0;
00322 jointPos.wrist1 = 0;
00323 jointPos.wrist2 = 0;
00324 jointPos.gripper = 0;
00325 armControllerArmSim->setJointPos(jointPos);
00326
00327 float dt=.01;
00328
00329
00330 float alpha_z=8;
00331 float beta_z=4;
00332 float y=0;
00333 float y_vel=0;
00334 float goal=0;
00335
00336
00337
00338 float z=0;
00339 float z_vel=0;
00340
00341 getchar();
00342 goal = -1000;
00343
00344 while(1)
00345 {
00346 armSim->simLoop();
00347 Image<PixRGB<byte> > armCam = flipVertic(armSim->getFrame(-1));
00348
00349
00350
00351
00352
00353 z_vel = alpha_z*(beta_z*(goal-y)-z);
00354 z+= dt*z_vel;
00355
00356
00357 float f = 0;
00358 y_vel= z+f;
00359 y+= dt*y_vel;
00360
00361 jointPos.base = (int)y;
00362 armControllerArmSim->setJointPos(jointPos, false);
00363 ArmController::JointPos currentJointPos = armControllerArmSim->getJointPos();
00364 updateDataImg(dataImg, currentJointPos);
00365
00366 ofs->writeRGB(armCam, "Output", FrameInfo("Output", SRC_POS));
00367 }
00368 mgr->stop();
00369
00370 return 0;
00371
00372 }
00373