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 "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 ;
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], ¤t);
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], ¤t);
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 }