00001
00002
00003
00004
00005
00006
00007
00008
00009
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
00040
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 ;
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 {
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], ¤t[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], ¤t);
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], ¤t);
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], ¤t);
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;
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 }