LMasterRSlave.cc

Go to the documentation of this file.
00001 //
00002 // Copyright 2002 Sony Corporation 
00003 //
00004 // Permission to use, copy, modify, and redistribute this software for
00005 // non-commercial use is hereby granted.
00006 //
00007 // This software is provided "as is" without warranty of any kind,
00008 // either expressed or implied, including but not limited to the
00009 // implied warranties of fitness for a particular purpose.
00010 //
00011 
00012 #include <math.h>
00013 #include <OPENR/OPENRAPI.h>
00014 #include <OPENR/OUnits.h>
00015 #include <OPENR/OSyslog.h>
00016 #include <OPENR/core_macro.h>
00017 #include "LMasterRSlave.h"
00018 
00019 LMasterRSlave::LMasterRSlave() : lmasterRSlaveState(LMRS_IDLE),
00020                                  initSensorIndex(false), latestSensorRegion(0)
00021 {
00022     for (int i = 0; i < NUM_JOINTS; i++) jointID[i] = oprimitiveID_UNDEF;
00023     for (int i = 0; i < NUM_COMMAND_VECTOR; i++) region[i] = 0;
00024     for (int i = 0; i < NUM_JOINTS; i++) sensorIndex[i] = -1;
00025 }
00026 
00027 OStatus
00028 LMasterRSlave::DoInit(const OSystemEvent& event)
00029 {
00030     OSYSDEBUG(("LMasterRSlave::DoInit()\n"));
00031 
00032     NEW_ALL_SUBJECT_AND_OBSERVER;
00033     REGISTER_ALL_ENTRY;
00034     SET_ALL_READY_AND_NOTIFY_ENTRY;
00035 
00036     OpenPrimitives();
00037     NewCommandVectorData();
00038     OPENR::SetMotorPower(opowerON);
00039     
00040     return oSUCCESS;
00041 }
00042 
00043 OStatus
00044 LMasterRSlave::DoStart(const OSystemEvent& event)
00045 {
00046     OSYSDEBUG(("LMasterRSlave::DoStart()\n"));
00047 
00048     if (subject[sbjEffector]->IsReady() == true) {
00049         AdjustDiffJointValue();
00050         lmasterRSlaveState = LMRS_ADJUSTING_DIFF_JOINT_VALUE;
00051     } else {
00052         lmasterRSlaveState = LMRS_START;
00053     }
00054 
00055     ENABLE_ALL_SUBJECT;
00056     ASSERT_READY_TO_ALL_OBSERVER;
00057 
00058     return oSUCCESS;
00059 }
00060 
00061 OStatus
00062 LMasterRSlave::DoStop(const OSystemEvent& event)
00063 {
00064     OSYSDEBUG(("LMasterRSlave::DoStop()\n"));
00065 
00066     lmasterRSlaveState = LMRS_IDLE;
00067 
00068     DISABLE_ALL_SUBJECT;
00069     DEASSERT_READY_TO_ALL_OBSERVER;
00070 
00071     return oSUCCESS;
00072 }
00073 
00074 OStatus
00075 LMasterRSlave::DoDestroy(const OSystemEvent& event)
00076 {
00077     DELETE_ALL_SUBJECT_AND_OBSERVER;
00078     return oSUCCESS;
00079 }
00080 
00081 void
00082 LMasterRSlave::ReadyEffector(const OReadyEvent& event)
00083 {
00084     OSYSDEBUG(("LMasterRSlave::Ready()\n"));
00085 
00086     if (lmasterRSlaveState == LMRS_IDLE) {
00087 
00088         OSYSDEBUG(("LMRS_IDLE\n"));
00089         ; // do nothing
00090 
00091     } else if (lmasterRSlaveState == LMRS_START) {
00092 
00093         OSYSDEBUG(("LMRS_START\n"));
00094         AdjustDiffJointValue();
00095         lmasterRSlaveState = LMRS_ADJUSTING_DIFF_JOINT_VALUE;
00096 
00097     } else if (lmasterRSlaveState == LMRS_ADJUSTING_DIFF_JOINT_VALUE) {
00098 
00099         OSYSDEBUG(("LMRS_ADJUSTING_DIFF_JOINT_VALUE\n"));
00100         SetJointGain();
00101         MovingResult r = MoveToBroadBase();
00102         lmasterRSlaveState = LMRS_MOVING_TO_BROADBASE;
00103 
00104     } else if (lmasterRSlaveState == LMRS_MOVING_TO_BROADBASE) {
00105 
00106         OSYSDEBUG(("LMRS_MOVING_TO_BROADBASE\n"));
00107         MovingResult r = MoveToBroadBase();
00108         if (r == MOVING_FINISH) {
00109             lmasterRSlaveState = LMRS_MOVING_TO_SLEEPING;
00110         }
00111 
00112     } else if (lmasterRSlaveState == LMRS_MOVING_TO_SLEEPING) {
00113 
00114         OSYSDEBUG(("LMRS_MOVING_TO_SLEEPING\n"));
00115         MovingResult r = MoveToSleeping();
00116         if (r == MOVING_FINISH) {
00117             lmasterRSlaveState = LMRS_MASTER_SLAVE;
00118         }
00119 
00120     } else if (lmasterRSlaveState == LMRS_MASTER_SLAVE) {
00121 
00122         OSYSDEBUG(("LMRS_MASTER_SLAVE\n"));
00123         MasterSlave();
00124         
00125     }
00126 }
00127 
00128 void
00129 LMasterRSlave::NotifySensor(const ONotifyEvent& event)
00130 {
00131     if (lmasterRSlaveState != LMRS_IDLE) {
00132         
00133         RCRegion* rgn = event.RCData(0);
00134         rgn->AddReference();
00135 
00136         if (initSensorIndex == false) {
00137             OSensorFrameVectorData* sensorVec
00138                 = (OSensorFrameVectorData*)rgn->Base();
00139             InitSensorIndex(sensorVec);
00140             initSensorIndex = true;
00141         }
00142 
00143         if (latestSensorRegion != 0) latestSensorRegion->RemoveReference();
00144         latestSensorRegion = rgn;
00145 
00146         observer[event.ObsIndex()]->AssertReady();
00147     }
00148 }
00149 
00150 void
00151 LMasterRSlave::OpenPrimitives()
00152 {
00153     for (int i = 0; i < NUM_JOINTS; i++) {
00154         OStatus result = OPENR::OpenPrimitive(JOINT_LOCATOR[i], &jointID[i]);
00155         if (result != oSUCCESS) {
00156             OSYSLOG1((osyslogERROR, "%s : %s %d",
00157                       "LMasterRSlave::DoInit()",
00158                       "OPENR::OpenPrimitive() FAILED", result));
00159         }
00160     }
00161 }
00162 
00163 void
00164 LMasterRSlave::NewCommandVectorData()
00165 {
00166     OStatus result;
00167     MemoryRegionID      cmdVecDataID;
00168     OCommandVectorData* cmdVecData;
00169     OCommandInfo*       info;
00170 
00171     for (int i = 0; i < NUM_COMMAND_VECTOR; i++) {
00172 
00173         result = OPENR::NewCommandVectorData(NUM_JOINTS, 
00174                                              &cmdVecDataID, &cmdVecData);
00175         if (result != oSUCCESS) {
00176             OSYSLOG1((osyslogERROR, "%s : %s %d",
00177                       "LMasterRSlave::NewCommandVectorData()",
00178                       "OPENR::NewCommandVectorData() FAILED", result));
00179         }
00180 
00181         region[i] = new RCRegion(cmdVecData->vectorInfo.memRegionID,
00182                                  cmdVecData->vectorInfo.offset,
00183                                  (void*)cmdVecData,
00184                                  cmdVecData->vectorInfo.totalSize);
00185 
00186         cmdVecData->SetNumData(NUM_JOINTS);
00187 
00188         for (int j = 0; j < NUM_JOINTS; j++) {
00189             info = cmdVecData->GetInfo(j);
00190             info->Set(odataJOINT_COMMAND2, jointID[j], ocommandMAX_FRAMES);
00191         }
00192     }
00193 }
00194 
00195 void
00196 LMasterRSlave::SetJointGain()
00197 {
00198     OPENR::EnableJointGain(jointID[HEAD_TILT]);
00199     OPENR::SetJointGain(jointID[HEAD_TILT],
00200                         TILT_PGAIN, TILT_IGAIN, TILT_DGAIN,
00201                         PSHIFT, ISHIFT, DSHIFT);
00202     
00203     OPENR::EnableJointGain(jointID[HEAD_PAN]);
00204     OPENR::SetJointGain(jointID[HEAD_PAN],
00205                         PAN_PGAIN, PAN_IGAIN, PAN_DGAIN,
00206                         PSHIFT, ISHIFT, DSHIFT);
00207 
00208     OPENR::EnableJointGain(jointID[HEAD_ROLL]);
00209     OPENR::SetJointGain(jointID[HEAD_ROLL],
00210                         ROLL_PGAIN, ROLL_IGAIN, ROLL_DGAIN,
00211                         PSHIFT, ISHIFT, DSHIFT);
00212 
00213     int base = RFLEG_J1;
00214     for (int i = 0; i < 4; i++) {
00215 
00216         int j1 = base + 3 * i;
00217         int j2 = base + 3 * i + 1;
00218         int j3 = base + 3 * i + 2; 
00219             
00220         OPENR::EnableJointGain(jointID[j1]);        
00221         OPENR::SetJointGain(jointID[j1],
00222                             J1_PGAIN, J1_IGAIN, J1_DGAIN,
00223                             PSHIFT, ISHIFT, DSHIFT);
00224 
00225         OPENR::EnableJointGain(jointID[j2]);        
00226         OPENR::SetJointGain(jointID[j2],
00227                             J2_PGAIN, J2_IGAIN, J2_DGAIN,
00228                             PSHIFT, ISHIFT, DSHIFT);
00229 
00230         OPENR::EnableJointGain(jointID[j3]);        
00231         OPENR::SetJointGain(jointID[j3],
00232                             J3_PGAIN, J3_IGAIN, J3_DGAIN,
00233                             PSHIFT, ISHIFT, DSHIFT);
00234     }
00235 }
00236 
00237 MovingResult
00238 LMasterRSlave::AdjustDiffJointValue()
00239 {
00240     OJointValue current[NUM_JOINTS];
00241 
00242     for (int i = 0; i < NUM_JOINTS; i++) {
00243         OJointValue current;
00244         OPENR::GetJointValue(jointID[i], &current);
00245         SetJointValue(region[0], i,
00246                       degrees(current.value/1000000.0),
00247                       degrees(current.value/1000000.0));
00248     }
00249 
00250     subject[sbjEffector]->SetData(region[0]);
00251     subject[sbjEffector]->NotifyObservers();
00252 
00253     return MOVING_FINISH;
00254 }
00255 
00256 MovingResult
00257 LMasterRSlave::MoveToBroadBase()
00258 {
00259     static int counter = -1;
00260     static double start[NUM_JOINTS];
00261     static double delta[NUM_JOINTS];
00262     double ndiv = (double)BROADBASE_MAX_COUNTER;
00263 
00264     if (counter == -1) {
00265 
00266         for (int i = 0; i < NUM_JOINTS; i++) {
00267             OJointValue current;
00268             OPENR::GetJointValue(jointID[i], &current);
00269             start[i] = degrees(current.value/1000000.0);
00270             delta[i] = (BROADBASE_ANGLE[i] - start[i]) / ndiv;
00271         }
00272 
00273         counter = 0;
00274 
00275         RCRegion* rgn = FindFreeRegion();
00276         for (int i = 0; i < NUM_JOINTS; i++) {
00277             SetJointValue(rgn, i, start[i], start[i] + delta[i]);
00278             start[i] += delta[i];
00279         }
00280 
00281         subject[sbjEffector]->SetData(rgn);
00282         counter ++;
00283     }
00284 
00285     RCRegion* rgn = FindFreeRegion();
00286     for (int i = 0; i < NUM_JOINTS; i++) {
00287         SetJointValue(rgn, i, start[i], start[i] + delta[i]);
00288         start[i] += delta[i];
00289     }
00290 
00291     subject[sbjEffector]->SetData(rgn);
00292     subject[sbjEffector]->NotifyObservers();
00293 
00294     counter++;
00295     return (counter == BROADBASE_MAX_COUNTER) ? MOVING_FINISH : MOVING_CONT;
00296 }
00297 
00298 MovingResult
00299 LMasterRSlave::MoveToSleeping()
00300 {
00301     static int counter = -1;
00302     static double start[NUM_JOINTS];
00303     static double delta[NUM_JOINTS];
00304     double ndiv = (double)SLEEPING_MAX_COUNTER;
00305 
00306     if (counter == -1) {
00307 
00308         for (int i = 0; i < NUM_JOINTS; i++) {
00309             start[i] = BROADBASE_ANGLE[i];
00310             delta[i] = (SLEEPING_ANGLE[i] - start[i]) / ndiv;
00311         }
00312 
00313         counter = 0;
00314     }
00315 
00316     RCRegion* rgn = FindFreeRegion();
00317     for (int i = 0; i < NUM_JOINTS; i++) {
00318         SetJointValue(rgn, i, start[i], start[i] + delta[i]);
00319         start[i] += delta[i];
00320     }
00321 
00322     subject[sbjEffector]->SetData(rgn);
00323     subject[sbjEffector]->NotifyObservers();
00324 
00325     counter++;
00326     return (counter == SLEEPING_MAX_COUNTER) ? MOVING_FINISH : MOVING_CONT;
00327 }
00328 
00329 MovingResult
00330 LMasterRSlave::MasterSlave()
00331 {
00332     OSYSDEBUG(("LMasterRSlave::MasterSlave()\n"));
00333 
00334     static bool isFirstTime = true;
00335 
00336     if (isFirstTime == true) {
00337         OPENR::DisableJointGain(jointID[LFLEG_J1]);
00338         OPENR::DisableJointGain(jointID[LFLEG_J2]);
00339         OPENR::DisableJointGain(jointID[LFLEG_J3]);
00340         OPENR::DisableJointGain(jointID[LRLEG_J1]);
00341         OPENR::DisableJointGain(jointID[LRLEG_J2]);
00342         OPENR::DisableJointGain(jointID[LRLEG_J3]);
00343         isFirstTime = false;
00344     }
00345 
00346     RCRegion* rgn = FindFreeRegion();
00347     OCommandVectorData* commandVec = (OCommandVectorData*)rgn->Base();
00348     OSensorFrameVectorData* sensorVec
00349         = (OSensorFrameVectorData*)latestSensorRegion->Base();
00350     
00351     int cmdIdx = 0;
00352 
00353     Sensor2Command(sensorVec, sensorIndex[LFLEG_J1],
00354                    commandVec, cmdIdx++, jointID[RFLEG_J1]);
00355 
00356     Sensor2Command(sensorVec, sensorIndex[LFLEG_J2],
00357                    commandVec, cmdIdx++, jointID[RFLEG_J2]);
00358 
00359     Sensor2Command(sensorVec, sensorIndex[LFLEG_J3],
00360                    commandVec, cmdIdx++, jointID[RFLEG_J3]);
00361 
00362     Sensor2Command(sensorVec, sensorIndex[LRLEG_J1],
00363                    commandVec, cmdIdx++, jointID[RRLEG_J1]);
00364 
00365     Sensor2Command(sensorVec, sensorIndex[LRLEG_J2],
00366                    commandVec, cmdIdx++, jointID[RRLEG_J2]);
00367 
00368     Sensor2Command(sensorVec, sensorIndex[LRLEG_J3],
00369                    commandVec, cmdIdx++, jointID[RRLEG_J3]);
00370 
00371     commandVec->SetNumData(cmdIdx);
00372 
00373     subject[sbjEffector]->SetData(rgn);
00374     subject[sbjEffector]->NotifyObservers();
00375 
00376     return MOVING_CONT;
00377 }
00378 
00379 RCRegion*
00380 LMasterRSlave::FindFreeRegion()
00381 {
00382     for (int i = 0; i < NUM_COMMAND_VECTOR; i++) {
00383         if (region[i]->NumberOfReference() == 1) return region[i];
00384     }
00385 
00386     return 0;
00387 }
00388 
00389 void
00390 LMasterRSlave::SetJointValue(RCRegion* rgn, int idx, double start, double end)
00391 {
00392     OCommandVectorData* cmdVecData = (OCommandVectorData*)rgn->Base();
00393 
00394     OCommandInfo* info = cmdVecData->GetInfo(idx);
00395     info->Set(odataJOINT_COMMAND2, jointID[idx], ocommandMAX_FRAMES);
00396 
00397     OCommandData* data = cmdVecData->GetData(idx);
00398     OJointCommandValue2* jval = (OJointCommandValue2*)data->value;
00399 
00400     double delta = end - start;
00401     for (int i = 0; i < ocommandMAX_FRAMES; i++) {
00402         double dval = start + (delta * i) / (double)ocommandMAX_FRAMES;
00403         jval[i].value = oradians(dval);
00404     }
00405 }
00406 
00407 void 
00408 LMasterRSlave::InitSensorIndex(OSensorFrameVectorData* sensorVec)
00409 {
00410     for (int i = 0; i < NUM_JOINTS; i++) {
00411         for (int j = 0; j < sensorVec->vectorInfo.numData; j++) {
00412             OSensorFrameInfo* info = sensorVec->GetInfo(j);
00413             if (info->primitiveID == jointID[i]) {
00414                 sensorIndex[i] = j;
00415                 OSYSDEBUG(("[%2d] %s\n", sensorIndex[i], JOINT_LOCATOR[i]));
00416                 break;
00417             }
00418         }
00419     }
00420 }
00421 
00422 void
00423 LMasterRSlave::Sensor2Command(OSensorFrameVectorData* sensorVec, int sensorIdx,
00424                               OCommandVectorData* commandVec, int commandIndex,
00425                               OPrimitiveID id)
00426 {
00427     OSensorFrameInfo* sinfo = sensorVec->GetInfo(sensorIdx);
00428     OSensorFrameData* sdata = sensorVec->GetData(sensorIdx);
00429 
00430     OCommandInfo* cinfo = commandVec->GetInfo(commandIndex);
00431     OCommandData* cdata = commandVec->GetData(commandIndex);
00432 
00433     for (int i = 0; i < sinfo->numFrames; i++) {
00434         OJointCommandValue2* jval = (OJointCommandValue2*)cdata->value;
00435         jval[i].value = sdata->frame[i].value;
00436     }
00437 
00438     cinfo->Set(odataJOINT_COMMAND2, id, sinfo->numFrames);
00439 }

Generated on Sun Dec 2 23:04:28 2007 for openSDK by  doxygen 1.3.9.1