BallTrackingHead/MovingHead2/MovingHead.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 <BallTrackingHeadData.h>
00018 #include "MovingHead.h"
00019 
00020 MovingHead::MovingHead() : movingHeadState(MHS_IDLE)
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 }
00025 
00026 OStatus
00027 MovingHead::DoInit(const OSystemEvent& event)
00028 {
00029     OSYSDEBUG(("MovingHead::DoInit()\n"));
00030 
00031     NEW_ALL_SUBJECT_AND_OBSERVER;
00032     REGISTER_ALL_ENTRY;
00033     SET_ALL_READY_AND_NOTIFY_ENTRY;
00034 
00035     OpenPrimitives();
00036     NewCommandVectorData();
00037 
00038     // 
00039     // OPENR::SetMotorPower(opowerON) is executed in lostFoundSound.
00040     // So, it isn't necessary here.
00041     //
00042     
00043     return oSUCCESS;
00044 }
00045 
00046 OStatus
00047 MovingHead::DoStart(const OSystemEvent& event)
00048 {
00049     OSYSDEBUG(("MovingHead::DoStart()\n"));
00050 
00051     ENABLE_ALL_SUBJECT;
00052     ASSERT_READY_TO_ALL_OBSERVER;
00053 
00054     return oSUCCESS;
00055 }
00056 
00057 OStatus
00058 MovingHead::DoStop(const OSystemEvent& event)
00059 {
00060     OSYSDEBUG(("MovingHead::DoStop()\n"));
00061     movingHeadState = MHS_IDLE;
00062 
00063     DISABLE_ALL_SUBJECT;
00064     DEASSERT_READY_TO_ALL_OBSERVER;
00065 
00066     return oSUCCESS;
00067 }
00068 
00069 OStatus
00070 MovingHead::DoDestroy(const OSystemEvent& event)
00071 {
00072     DELETE_ALL_SUBJECT_AND_OBSERVER;
00073     return oSUCCESS;
00074 }
00075 
00076 void
00077 MovingHead::NotifyCommand(const ONotifyEvent& event)
00078 {
00079     OSYSDEBUG(("MovingHead::NotifyCommand()\n"));
00080 
00081     BallTrackingHeadCommand* cmd = (BallTrackingHeadCommand*)event.Data(0);
00082     if (cmd->type == BTHCMD_MOVE_TO_ZERO_POS) {
00083         
00084         if (subject[sbjMove]->IsReady() == true) {
00085             AdjustDiffJointValue();
00086             movingHeadState = MHS_ADJUSTING_DIFF_JOINT_VALUE;
00087         } else {
00088             movingHeadState = MHS_START;
00089         }
00090 
00091     } else {
00092 
00093         BallTrackingHeadResult result(BTH_INVALID_ARG);
00094         subject[sbjResult]->SetData(&result, sizeof(result));
00095         subject[sbjResult]->NotifyObservers();
00096         
00097     }
00098 
00099     observer[event.ObsIndex()]->AssertReady();
00100 }
00101 
00102 void
00103 MovingHead::ReadyMove(const OReadyEvent& event)
00104 {
00105     OSYSDEBUG(("MovingHead::ReadyMove()\n"));
00106 
00107     if (movingHeadState == MHS_IDLE) {
00108 
00109         OSYSDEBUG(("MHS_IDLE\n"));
00110         ; // do nothing
00111 
00112     } else if (movingHeadState == MHS_START) {
00113 
00114         OSYSDEBUG(("MHS_START\n"));
00115         AdjustDiffJointValue();
00116         movingHeadState = MHS_ADJUSTING_DIFF_JOINT_VALUE;
00117 
00118     } else if (movingHeadState == MHS_ADJUSTING_DIFF_JOINT_VALUE) {
00119 
00120         OSYSDEBUG(("MHS_ADJUSTING_DIFF_JOINT_VALUE\n"));
00121         SetJointGain();
00122         MovingResult r = MoveToZeroPos();
00123         movingHeadState = MHS_MOVING_TO_ZERO_POS;
00124 
00125     } else if (movingHeadState == MHS_MOVING_TO_ZERO_POS) {
00126 
00127         OSYSDEBUG(("MHS_MOVING_TO_ZERO_POS\n"));
00128         MovingResult r = MoveToZeroPos();
00129         if (r == MOVING_FINISH) {
00130             BallTrackingHeadResult result(BTH_SUCCESS);
00131             subject[sbjResult]->SetData(&result, sizeof(result));
00132             subject[sbjResult]->NotifyObservers();
00133             movingHeadState = MHS_IDLE;
00134         }
00135 
00136     } else { // movingHeadState == MHS_SWING_HEAD
00137 
00138         OSYSDEBUG(("MHS_SWING_HEAD\n"));
00139         MovingResult r = SwingHead();
00140         if (r == MOVING_FINISH) {
00141             movingHeadState = MHS_IDLE;
00142         }
00143     }
00144 }
00145 
00146 void
00147 MovingHead::OpenPrimitives()
00148 {
00149     for (int i = 0; i < NUM_JOINTS; i++) {
00150         OStatus result = OPENR::OpenPrimitive(JOINT_LOCATOR[i], &jointID[i]);
00151         if (result != oSUCCESS) {
00152             OSYSLOG1((osyslogERROR, "%s : %s %d",
00153                       "MovingHead::OpenPrimitives()",
00154                       "OPENR::OpenPrimitive() FAILED", result));
00155         }
00156     }
00157 }
00158 
00159 void
00160 MovingHead::NewCommandVectorData()
00161 {
00162     OStatus result;
00163     MemoryRegionID      cmdVecDataID;
00164     OCommandVectorData* cmdVecData;
00165     OCommandInfo*       info;
00166 
00167     for (int i = 0; i < NUM_COMMAND_VECTOR; i++) {
00168 
00169         result = OPENR::NewCommandVectorData(NUM_JOINTS, 
00170                                              &cmdVecDataID, &cmdVecData);
00171         if (result != oSUCCESS) {
00172             OSYSLOG1((osyslogERROR, "%s : %s %d",
00173                       "MovingHead::NewCommandVectorData()",
00174                       "OPENR::NewCommandVectorData() FAILED", result));
00175         }
00176 
00177         region[i] = new RCRegion(cmdVecData->vectorInfo.memRegionID,
00178                                  cmdVecData->vectorInfo.offset,
00179                                  (void*)cmdVecData,
00180                                  cmdVecData->vectorInfo.totalSize);
00181 
00182         cmdVecData->SetNumData(NUM_JOINTS);
00183 
00184         for (int j = 0; j < NUM_JOINTS; j++) {
00185             info = cmdVecData->GetInfo(j);
00186             info->Set(odataJOINT_COMMAND2, jointID[j], ocommandMAX_FRAMES);
00187         }
00188     }
00189 }
00190 
00191 void
00192 MovingHead::SetJointGain()
00193 {
00194     OPENR::EnableJointGain(jointID[TILT_INDEX]);
00195     OPENR::SetJointGain(jointID[TILT_INDEX],
00196                         TILT_PGAIN,
00197                         TILT_IGAIN,
00198                         TILT_DGAIN,
00199                         PSHIFT, ISHIFT, DSHIFT);
00200     
00201     OPENR::EnableJointGain(jointID[PAN_INDEX]);
00202     OPENR::SetJointGain(jointID[PAN_INDEX],
00203                         PAN_PGAIN,
00204                         PAN_IGAIN,
00205                         PAN_DGAIN,
00206                         PSHIFT, ISHIFT, DSHIFT);
00207 
00208     OPENR::EnableJointGain(jointID[ROLL_INDEX]);
00209     OPENR::SetJointGain(jointID[ROLL_INDEX],
00210                         ROLL_PGAIN,
00211                         ROLL_IGAIN,
00212                         ROLL_DGAIN,
00213                         PSHIFT, ISHIFT, DSHIFT);
00214 }
00215 
00216 MovingResult
00217 MovingHead::AdjustDiffJointValue()
00218 {
00219     OJointValue current[NUM_JOINTS];
00220     for (int i = 0; i < NUM_JOINTS; i++) {
00221         OPENR::GetJointValue(jointID[i], &current[i]);
00222         SetJointValue(region[0], i,
00223                       degrees(current[i].value/1000000.0),
00224                       degrees(current[i].value/1000000.0));
00225     }
00226 
00227     subject[sbjMove]->SetData(region[0]);
00228     subject[sbjMove]->NotifyObservers();
00229 
00230     return MOVING_FINISH;
00231 }
00232 
00233 MovingResult
00234 MovingHead::MoveToZeroPos()
00235 {
00236     static int counter = -1;
00237     static double s_tilt, d_tilt;
00238     static double s_pan,  d_pan;
00239     static double s_roll, d_roll;
00240 
00241     if (counter == -1) {
00242 
00243         OJointValue current;
00244 
00245         OPENR::GetJointValue(jointID[TILT_INDEX], &current);
00246         s_tilt = degrees(current.value/1000000.0);
00247         d_tilt = (0.0 - s_tilt) / (double)ZERO_POS_MAX_COUNTER;
00248 
00249         OPENR::GetJointValue(jointID[PAN_INDEX], &current);
00250         s_pan = degrees(current.value/1000000.0);
00251         d_pan = (0.0 - s_pan) / (double)ZERO_POS_MAX_COUNTER;
00252 
00253         OPENR::GetJointValue(jointID[ROLL_INDEX], &current);
00254         s_roll = degrees(current.value/1000000.0);
00255         d_roll = (0.0 - s_roll) / (double)ZERO_POS_MAX_COUNTER;
00256 
00257         counter = 0;
00258 
00259         RCRegion* rgn = FindFreeRegion();
00260         OSYSDEBUG(("FindFreeRegion() %x \n", rgn));
00261         SetJointValue(rgn, TILT_INDEX, s_tilt, s_tilt + d_tilt);
00262         SetJointValue(rgn, PAN_INDEX,  s_pan,  s_pan  + d_pan);
00263         SetJointValue(rgn, ROLL_INDEX, s_roll, s_roll + d_roll);
00264         subject[sbjMove]->SetData(rgn);
00265 
00266         s_tilt += d_tilt;
00267         s_pan  += d_pan;
00268         s_roll += d_roll;
00269 
00270         counter++;
00271     } 
00272 
00273     RCRegion* rgn = FindFreeRegion();
00274     OSYSDEBUG(("FindFreeRegion()%x \n", rgn));
00275     SetJointValue(rgn, TILT_INDEX, s_tilt, s_tilt + d_tilt);
00276     SetJointValue(rgn, PAN_INDEX,  s_pan,  s_pan  + d_pan);
00277     SetJointValue(rgn, ROLL_INDEX, s_roll, s_roll + d_roll);
00278     subject[sbjMove]->SetData(rgn);
00279     subject[sbjMove]->NotifyObservers();
00280 
00281     s_tilt += d_tilt;
00282     s_pan  += d_pan;
00283     s_roll += d_roll;
00284 
00285     counter++;
00286     return (counter == ZERO_POS_MAX_COUNTER) ? MOVING_FINISH : MOVING_CONT;
00287 }
00288 
00289 MovingResult
00290 MovingHead::SwingHead()
00291 {
00292     static int phase = 0; // [0:127]
00293 
00294     OSYSDEBUG(("MovingHead::SwingHead() phase %d\n", phase));
00295 
00296     RCRegion* rgn = FindFreeRegion();
00297     if (rgn == 0) {
00298         OSYSLOG1((osyslogERROR, "%s : %s",
00299                   "MovingHead::SwingHead()", "FindFreeRegion() FAILED"));
00300         return MOVING_FINISH;
00301     }
00302 
00303     SetJointValue(rgn, TILT_INDEX, 0.0, 0.0);
00304     SetJointValue(rgn, PAN_INDEX,  phase);
00305     SetJointValue(rgn, ROLL_INDEX, 0.0, 0.0);
00306     subject[sbjMove]->SetData(rgn);
00307     subject[sbjMove]->NotifyObservers();
00308 
00309     phase = (phase + 1) % MAX_PHASE;
00310     return MOVING_CONT;
00311 }
00312 
00313 RCRegion*
00314 MovingHead::FindFreeRegion()
00315 {
00316     for (int i = 0; i < NUM_COMMAND_VECTOR; i++) {
00317         if (region[i]->NumberOfReference() == 1) return region[i];
00318     }
00319 
00320     return 0;
00321 }
00322 
00323 void
00324 MovingHead::SetJointValue(RCRegion* rgn, int idx, double start, double end)
00325 {
00326     OCommandVectorData* cmdVecData = (OCommandVectorData*)rgn->Base();
00327 
00328     OCommandInfo* info = cmdVecData->GetInfo(idx);
00329     info->Set(odataJOINT_COMMAND2, jointID[idx], ocommandMAX_FRAMES);
00330 
00331     OCommandData* data = cmdVecData->GetData(idx);
00332     OJointCommandValue2* jval = (OJointCommandValue2*)data->value;
00333 
00334     double delta = end - start;
00335     for (int i = 0; i < ocommandMAX_FRAMES; i++) {
00336         double dval = start + (delta * i) / (double)ocommandMAX_FRAMES;
00337         jval[i].value = oradians(dval);
00338     }
00339 }
00340 
00341 void
00342 MovingHead::SetJointValue(RCRegion* rgn, int idx, int phase)
00343 {
00344     OCommandVectorData* cmdVecData = (OCommandVectorData*)rgn->Base();
00345 
00346     OCommandInfo* info = cmdVecData->GetInfo(idx);
00347     info->Set(odataJOINT_COMMAND2, jointID[idx], ocommandMAX_FRAMES);
00348 
00349     OCommandData* data = cmdVecData->GetData(idx);
00350     OJointCommandValue2* jval = (OJointCommandValue2*)data->value;
00351 
00352     double delta = M_PI / 64.0 / (double)ocommandMAX_FRAMES;
00353     for (int i = 0; i < ocommandMAX_FRAMES; i++) {
00354         double dval = 80.0 * sin(M_PI / 64.0 * phase + delta * i);
00355         jval[i].value = oradians(dval);
00356     }
00357 }

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