LMasterRSlave7.cc

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

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