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