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 #include "Component/ModelManager.H"
00038 #include "Image/Image.H"
00039 #include "Image/Transforms.H"
00040 #include "Image/DrawOps.H"
00041 #include "Image/Rectangle.H"
00042 #include "Image/MathOps.H"
00043 #include "Image/MatrixOps.H"
00044 #include "Image/Layout.H"
00045 #include "Media/FrameSeries.H"
00046 #include "Transport/FrameInfo.H"
00047 #include "Raster/GenericFrame.H"
00048 #include "Raster/Raster.H"
00049 #include "Util/Timer.H"
00050 #include "GUI/GeneralGUI.H"
00051 #include "GUI/ImageDisplayStream.H"
00052 #include "GUI/DebugWin.H"
00053 #include "GUI/XWinManaged.H"
00054 #include "ArmControl/ArmSim.H"
00055 #include "ArmControl/RobotArm.H"
00056 #include "ArmControl/ArmController.H"
00057 #include "Util/MathFunctions.H"
00058 #include <unistd.h>
00059 #include <stdio.h>
00060 #include <signal.h>
00061
00062 double getDistance(double desire[3]);
00063 ModelManager *mgr = new ModelManager("Test ObjRec");
00064 nub::soft_ref<ArmSim> armSim(new ArmSim(*mgr));
00065 nub::soft_ref<ArmController> armControllerArmSim(new ArmController(*mgr,
00066 "ArmControllerArmSim", "ArmControllerArmSim", armSim));
00067
00068
00069 void terminate(int s)
00070 {
00071
00072 LERROR("*** INTERRUPT ***");
00073 exit(0);
00074 }
00075 Point2D<int> getClick(nub::soft_ref<OutputFrameSeries> &ofs)
00076 {
00077 const nub::soft_ref<ImageDisplayStream> ids =
00078 ofs->findFrameDestType<ImageDisplayStream>();
00079
00080 const rutz::shared_ptr<XWinManaged> uiwin =
00081 ids.is_valid()
00082 ? ids->getWindow("Output")
00083 : rutz::shared_ptr<XWinManaged>();
00084 return uiwin->getLastMouseClick();
00085 }
00086
00087
00088 int getKey(nub::soft_ref<OutputFrameSeries> &ofs)
00089 {
00090 const nub::soft_ref<ImageDisplayStream> ids =
00091 ofs->findFrameDestType<ImageDisplayStream>();
00092
00093 const rutz::shared_ptr<XWinManaged> uiwin =
00094 ids.is_valid()
00095 ? ids->getWindow("Output")
00096 : rutz::shared_ptr<XWinManaged>();
00097 return uiwin->getLastKeyPress();
00098 }
00099 void sync()
00100 {
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 }
00111 void output()
00112 {
00113 double desire[3] = {-1.125/4,0,0};
00114 double dist = getDistance(desire);
00115 double *pos = armSim->getEndPos();
00116 printf("%f %f %f ",pos[0],pos[1],pos[2]);
00117 printf("%d %d %d %f\n",armControllerArmSim->getBase(),
00118 armControllerArmSim->getSholder(),
00119 armControllerArmSim->getElbow(),dist);
00120
00121 }
00122 double getDistance(double desire[3])
00123 {
00124 double *pos = armSim->getEndPos();
00125 double sum = 0;
00126 for(int i=0;i<3;i++)
00127 sum+= (pos[i]-desire[i])*(pos[i]-desire[i]);
00128 return sum;
00129 }
00130 void moveMotor(int motor,int move)
00131 {
00132 switch(motor)
00133 {
00134 case 0:
00135 armControllerArmSim->setBasePos(move, true);
00136 break;
00137 case 1:
00138 armControllerArmSim->setSholderPos(move, true);
00139 break;
00140 case 2:
00141 armControllerArmSim->setElbowPos(move, true);
00142 break;
00143 default:
00144 break;
00145 }
00146 while(!armControllerArmSim->isFinishMove())
00147 {
00148 armSim->simLoop();
00149 usleep(1000);
00150 }
00151
00152
00153
00154 }
00155
00156 bool gibbsSampling()
00157 {
00158 double desire[3] = {-1*1.125/4,0,0.05};
00159 double current_distance = getDistance(desire);
00160 double prev_distance = current_distance;
00161
00162 if(current_distance < 0.01){
00163 output();
00164 return true;
00165 }
00166 do{
00167 int motor = randomUpToIncluding(2);
00168 int move = randomUpToIncluding(200)-100;
00169
00170 LINFO("Move motor %d with %d dist %f",motor,move,current_distance);
00171 prev_distance = current_distance;
00172 moveMotor(motor,move);
00173 current_distance = getDistance(desire);
00174 LINFO("Motor moved %d with %d dist %f",motor,move,current_distance);
00175
00176
00177 if(current_distance > prev_distance)
00178 {
00179 moveMotor(motor,-move);
00180 }
00181 }while(current_distance > prev_distance);
00182
00183 return false;
00184 }
00185
00186
00187 int main(const int argc, const char **argv)
00188 {
00189 MYLOGVERB = LOG_INFO;
00190
00191 nub::soft_ref<OutputFrameSeries> ofs(new OutputFrameSeries(*mgr));
00192 mgr->addSubComponent(ofs);
00193
00194 mgr->addSubComponent(armControllerArmSim);
00195
00196 nub::soft_ref<GeneralGUI> armSimGUI(new GeneralGUI(*mgr));
00197 mgr->addSubComponent(armSimGUI);
00198
00199 mgr->exportOptions(MC_RECURSE);
00200
00201 if (mgr->parseCommandLine(
00202 (const int)argc, (const char**)argv, "", 0, 0) == false)
00203 return 1;
00204
00205 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00206 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00207 signal(SIGALRM, terminate);
00208
00209 mgr->start();
00210
00211 initRandomNumbers();
00212
00213
00214 armSimGUI->startThread(ofs);
00215 sleep(1);
00216
00217
00218 armSimGUI->addMeter(armControllerArmSim->getBasePtr(),
00219 "Sim_Base", -1000, PixRGB<byte>(0, 255, 0));
00220 armSimGUI->addMeter(armControllerArmSim->getSholderPtr(),
00221 "Sim_Sholder", -1000, PixRGB<byte>(0, 255, 0));
00222 armSimGUI->addMeter(armControllerArmSim->getElbowPtr(),
00223 "Sim_Elbow", -1000, PixRGB<byte>(0, 255, 0));
00224 armSimGUI->addMeter(armControllerArmSim->getWrist1Ptr(),
00225 "Sim_Wrist1", -1000, PixRGB<byte>(0, 255, 0));
00226 armSimGUI->addMeter(armControllerArmSim->getWrist2Ptr(),
00227 "Sim_Wrist2", -1000, PixRGB<byte>(0, 255, 0));
00228
00229 armSimGUI->addImage(armControllerArmSim->getPIDImagePtr());
00230
00231 armControllerArmSim->setMotorsOn(true);
00232 armControllerArmSim->setPidOn(true);
00233 bool isGibbs = false;
00234 while(1)
00235 {
00236 armSim->simLoop();
00237 Image<PixRGB<byte> > armCam = flipVertic(armSim->getFrame(-1));
00238 ofs->writeRGB(armCam, "Output", FrameInfo("Output", SRC_POS));
00239
00240 int key = getKey(ofs);
00241 if (key != -1)
00242 {
00243 switch(key)
00244 {
00245
00246
00247 case 10:
00248 armControllerArmSim->setBasePos(10, true);
00249 LINFO("Sim Base: %d",armControllerArmSim->getBase());
00250 break;
00251 case 24:
00252 armControllerArmSim->setBasePos(-10, true);
00253 break;
00254 case 11:
00255 armControllerArmSim->setSholderPos(-10, true);
00256 break;
00257 case 25:
00258 armControllerArmSim->setSholderPos(10, true);
00259 break;
00260 case 12:
00261 armControllerArmSim->setElbowPos(10, true);
00262 break;
00263 case 26:
00264 armControllerArmSim->setElbowPos(-10, true);
00265 break;
00266 case 13:
00267 armControllerArmSim->setWrist1Pos(10, true);
00268 break;
00269 case 27:
00270 armControllerArmSim->setWrist1Pos(-10, true);
00271 break;
00272 case 14:
00273 armControllerArmSim->setWrist2Pos(10, true);
00274 break;
00275 case 28:
00276 armControllerArmSim->setWrist2Pos(-10, true);
00277 break;
00278 case 15:
00279 armControllerArmSim->setGripper(0);
00280 break;
00281 case 29:
00282 armControllerArmSim->setGripper(1);
00283 break;
00284 case 65:
00285 armControllerArmSim->killMotors();
00286 break;
00287 case 41:
00288 break;
00289 case 55:
00290 break;
00291 case 42:
00292 break;
00293 case 56:
00294 break;
00295 case 57:
00296 isGibbs = ~isGibbs;
00297 break;
00298
00299 }
00300 output();
00301 if(gibbsSampling() && isGibbs)
00302 sync();
00303
00304 LINFO("Key = %i", key);
00305 }
00306 if(isGibbs){
00307 gibbsSampling();
00308
00309 }
00310
00311 }
00312 mgr->stop();
00313
00314 return 0;
00315
00316 }
00317