00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "GT2004MotionControl.h"
00010
00011 #include "Modules/WalkingEngine/WalkingEngineSelector.h"
00012 #include "Modules/WalkingEngine/InvKinWalkingEngine.h"
00013 #include "Modules/WalkingEngine/InvKinWalkingParameterSets.h"
00014 #include "Modules/SpecialActions/GT2003MotionNetSpecialActions/GT2003MotionNetSpecialActions.h"
00015
00016 #include "Platform/SystemCall.h"
00017 #include "Tools/Actorics/Kinematics.h"
00018 #include "Tools/Debugging/Debugging.h"
00019 #include "Tools/Debugging/GenericDebugData.h"
00020 #include "Tools/RobotConfiguration.h"
00021
00022 GT2004MotionControl::GT2004MotionControl(ModuleHandler& moduleHandler,
00023 const MotionControlInterfaces& interfaces)
00024 :MotionControl(interfaces),
00025 moduleHandler(moduleHandler),
00026 changeOfMotionControlStatePossible(true),
00027 lastMotionType(MotionRequest::playDead),
00028 motionControlState(GT2004MotionControl::playDead)
00029 {
00030
00031 MotionRequest defaultRequest;
00032
00033 lastHeadTilt = lastHeadPan = lastHeadRoll = 0;
00034
00035 WalkingEngineInterfaces walkingEngineInterfaces
00036 (sensorDataBuffer, invKinWalkingParameters, gt2004Parameters, walkParameterTimeStamp, receivedNewSensorData, lastMotionType, pidData, odometryData, motionInfo);
00037
00038
00039
00040 pInvKinWalkingEngine = new InvKinWalkingEngine(walkingEngineInterfaces);
00041
00042
00043 pWalkingEngine[WalkRequest::normal] =
00044 new WalkingEngineSelector(moduleHandler, SolutionRequest::walkingEngineNormal,
00045 walkingEngineInterfaces, pInvKinWalkingEngine);
00046
00047 pWalkingEngine[WalkRequest::upsideDown] =
00048 new ParamInvKinWalkingEngine(new UpsideDownWalkingParameters, pInvKinWalkingEngine);
00049
00050 pWalkingEngine[WalkRequest::turnWithBall] =
00051 new ParamInvKinWalkingEngine(new TurnWithBallWalkingParameters, pInvKinWalkingEngine);
00052
00053 pWalkingEngine[WalkRequest::turnKick] =
00054 new ParamInvKinWalkingEngine(new TurnWithBallWalkingParameters, pInvKinWalkingEngine);
00055
00056 pWalkingEngine[WalkRequest::dash] =
00057 new BB2004InvKinWalkingEngine(pInvKinWalkingEngine);
00058
00059 pWalkingEngine[WalkRequest::debug] =
00060 new ParamInvKinWalkingEngine(new ERS7EvolveWalkingParameters, pInvKinWalkingEngine);
00061
00062 SpecialActionsInterfaces specialActionsInterfaces(motionRequest,lastMotionType,
00063 pidData, odometryData, motionInfo);
00064 pSpecialActions = new GT2003MotionNetSpecialActions(specialActionsInterfaces);
00065
00066 GetupEngineInterfaces getupEngineInterfaces(lastMotionType, sensorDataBuffer, motionRequest, bodyPosture, pidData, odometryData,
00067 motionInfo);
00068 pGetupEngine = new GetupEngineSelector(moduleHandler,getupEngineInterfaces);
00069
00070 wakingUp = false;
00071
00072 }
00073
00074 GT2004MotionControl::~GT2004MotionControl()
00075 {
00076 delete pWalkingEngine[WalkRequest::normal];
00077 delete pWalkingEngine[WalkRequest::upsideDown];
00078 delete pWalkingEngine[WalkRequest::turnWithBall];
00079 delete pWalkingEngine[WalkRequest::turnKick];
00080 delete pWalkingEngine[WalkRequest::dash];
00081 delete pWalkingEngine[WalkRequest::debug];
00082 delete pSpecialActions;
00083 delete pGetupEngine;
00084 delete pInvKinWalkingEngine;
00085
00086 moduleHandler.setModuleSelector(SolutionRequest::walkingEngineNormal,0);
00087 moduleHandler.setModuleSelector(SolutionRequest::getupEngine,0);
00088 }
00089
00090 void GT2004MotionControl::determineMotionControlState()
00091 {
00092 switch(motionControlState)
00093 {
00094 case GT2004MotionControl::playDead:
00095 {
00096 if(motionRequest.motionType != MotionRequest::playDead)
00097 {
00098 motionControlState = GT2004MotionControl::wakeUp;
00099 }
00100 return;
00101 }
00102 case GT2004MotionControl::getup:
00103 if(changeOfMotionControlStatePossible)
00104 {
00105 setMotionControlState();
00106
00107 }
00108 return;
00109 case GT2004MotionControl::wakeUp:
00110 if(changeOfMotionControlStatePossible)
00111 {
00112 setMotionControlState();
00113
00114 }
00115 return;
00116 case GT2004MotionControl::stand:
00117 if(changeOfMotionControlStatePossible)
00118 {
00119 setMotionControlState();
00120 }
00121 return;
00122 case GT2004MotionControl::specialAction:
00123 if(changeOfMotionControlStatePossible)
00124 {
00125 setMotionControlState();
00126 }
00127 return;
00128 case GT2004MotionControl::walk:
00129 if(
00130 changeOfMotionControlStatePossible &&
00131 ((motionRequest.motionType != MotionRequest::specialAction ||
00132 pSpecialActions->specialActionIsExecutableInWalkingCycle(motionRequest.specialActionRequest.specialActionType, positionInWalkCycle))
00133 ))
00134 {
00135 setMotionControlState();
00136 }
00137 return;
00138 }
00139 }
00140
00141 void GT2004MotionControl::setMotionControlState()
00142 {
00143 switch(motionRequest.motionType)
00144 {
00145 case MotionRequest::playDead:
00146 motionControlState = GT2004MotionControl::playDead;
00147 return;
00148 case MotionRequest::getup:
00149 motionControlState = GT2004MotionControl::getup;
00150 return;
00151 case MotionRequest::stand:
00152 motionControlState = GT2004MotionControl::stand;
00153 return;
00154 case MotionRequest::specialAction:
00155 motionControlState = GT2004MotionControl::specialAction;
00156 return;
00157 case MotionRequest::walk:
00158 motionControlState = GT2004MotionControl::walk;
00159 return;
00160 }
00161 }
00162 void GT2004MotionControl::execute()
00163 {
00164 for (int i = 0; i < jointDataBufferNumOfFrames; i++)
00165 {
00166
00167 JointData ¤tFrame = jointDataBuffer.frame[i];
00168
00169
00170 if(motionRequest.motionType == MotionRequest::walk)
00171 latestWalkRequest = motionRequest.walkRequest;
00172 else if(motionRequest.motionType == MotionRequest::specialAction)
00173 latestSpecialActionRequest = motionRequest.specialActionRequest;
00174
00175
00176
00177 determineMotionControlState();
00178
00179
00180 switch(motionControlState)
00181 {
00182 case GT2004MotionControl::playDead:
00183 {
00184 changeOfMotionControlStatePossible = true;
00185 for(int i = 0; i<JointData::numOfJoint; ++i)
00186 {
00187 pidData.p[i]=0;pidData.i[i]=0;pidData.d[i]=0;
00188 }
00189 motionInfo.executedMotionRequest.motionType = MotionRequest::playDead;
00190 lastMotionType = MotionRequest::playDead;
00191 break;
00192 }
00193 case GT2004MotionControl::wakeUp:
00194 {
00195 changeOfMotionControlStatePossible
00196 = !wakeUpEngine.execute(frameNumber, sensorDataBuffer.frame[0], currentFrame, pidData);
00197 lastMotionType = MotionRequest::playDead;
00198 break;
00199 }
00200 case GT2004MotionControl::getup:
00201 {
00202 changeOfMotionControlStatePossible = !pGetupEngine->executeParameterized(currentFrame);
00203 lastMotionType = MotionRequest::getup;
00204 break;
00205 }
00206 case GT2004MotionControl::stand:
00207 {
00208 WalkRequest standRequest;
00209 standRequest.walkType = WalkRequest::normal;
00210 standRequest.walkParams = Pose2D(0,0,0);
00211 changeOfMotionControlStatePossible
00212 = !pWalkingEngine[WalkRequest::normal]->executeParameterized(currentFrame,standRequest,0);
00213 motionInfo.executedMotionRequest.motionType = MotionRequest::stand;
00214 positionInWalkCycle = motionInfo.positionInWalkCycle;
00215 lastMotionType = MotionRequest::stand;
00216 break;
00217 }
00218
00219 case GT2004MotionControl::specialAction:
00220 changeOfMotionControlStatePossible
00221 = !pSpecialActions->executeParameterized(latestSpecialActionRequest, currentFrame);
00222 lastMotionType = MotionRequest::specialAction;
00223 break;
00224
00225 case GT2004MotionControl::walk:
00226 {
00227 changeOfMotionControlStatePossible
00228 = !pWalkingEngine[latestWalkRequest.walkType]->executeParameterized(currentFrame, latestWalkRequest, positionInWalkCycle);
00229 positionInWalkCycle = motionInfo.positionInWalkCycle;
00230 lastMotionType = MotionRequest::walk;
00231 break;
00232 }
00233 }
00234
00235 if(motionControlState != GT2004MotionControl::walk){
00236 positionInWalkCycle = 0;
00237 }
00238
00239
00240
00241 headIsBlockedBySpecialActionOrWalk =
00242 (
00243 currentFrame.data[JointData::neckTilt] != jointDataInvalidValue &&
00244 currentFrame.data[JointData::headPan] != jointDataInvalidValue &&
00245 currentFrame.data[JointData::headTilt] != jointDataInvalidValue
00246 );
00247
00248
00249 const long maxdiff=50000;
00250 long diff;
00251 if (currentFrame.data[JointData::neckTilt] == jointDataInvalidValue)
00252 {
00253 diff=headMotionRequest.tilt-lastHeadTilt;
00254 if (diff<-maxdiff)
00255 {
00256 currentFrame.data[JointData::neckTilt] = lastHeadTilt-maxdiff;
00257 }
00258 else if (diff<maxdiff)
00259 {
00260 currentFrame.data[JointData::neckTilt] = headMotionRequest.tilt;
00261 }
00262 else
00263 {
00264 currentFrame.data[JointData::neckTilt] = lastHeadTilt+maxdiff;
00265 }
00266 }
00267 if (currentFrame.data[JointData::headPan] == jointDataInvalidValue)
00268 {
00269 diff=headMotionRequest.pan-lastHeadPan;
00270 if (diff<-maxdiff)
00271 {
00272 currentFrame.data[JointData::headPan] = lastHeadPan-maxdiff;
00273 }
00274 else if (diff<maxdiff)
00275 {
00276 currentFrame.data[JointData::headPan] = headMotionRequest.pan;
00277 }
00278 else
00279 {
00280 currentFrame.data[JointData::headPan] = lastHeadPan+maxdiff;
00281 }
00282 }
00283 if (currentFrame.data[JointData::headTilt] == jointDataInvalidValue)
00284 {
00285 diff=headMotionRequest.roll-lastHeadRoll;
00286 if (diff<-maxdiff)
00287 {
00288 currentFrame.data[JointData::headTilt] = lastHeadRoll-maxdiff;
00289 }
00290 else if (diff<maxdiff)
00291 {
00292 currentFrame.data[JointData::headTilt] = headMotionRequest.roll;
00293 }
00294 else
00295 {
00296 currentFrame.data[JointData::headTilt] = lastHeadRoll+maxdiff;
00297 }
00298 }
00299 if (currentFrame.data[JointData::mouth] == jointDataInvalidValue)
00300 {
00301 currentFrame.data[JointData::mouth] = headMotionRequest.mouth;
00302 }
00303
00304 lastHeadTilt=currentFrame.data[JointData::neckTilt];
00305 lastHeadPan =currentFrame.data[JointData::headPan];
00306 lastHeadRoll=currentFrame.data[JointData::headTilt];
00307
00308
00309
00310
00311
00312
00313
00314
00315 stabilize(lastMotionType, motionRequest, currentFrame, odometryData, sensorDataBuffer);
00316 }
00317 }
00318
00319 void GT2004MotionControl::wagTail(
00320 const MotionRequest& motionRequest,
00321 const SensorData& sensorData,
00322 JointData& jointData
00323 )
00324 {
00325 if ((jointData.data[JointData::tailPan] != jointDataInvalidValue) ||
00326 (jointData.data[JointData::tailTilt] != jointDataInvalidValue))
00327 return;
00328
00329 switch (motionRequest.tailRequest.tailRequestID)
00330 {
00331 case TailRequest::wagHorizontal:
00332 {
00333 int framesPerPeriod = 200;
00334 tailCount %= framesPerPeriod;
00335 tailCount++;
00336 jointData.data[JointData::tailPan] = toMicroRad(jointLimitTailPanP * sin(tailCount * 2 * pi / framesPerPeriod));
00337 jointData.data[JointData::tailTilt] = toMicroRad(jointLimitTailTiltN);
00338 }
00339 break;
00340 case TailRequest::wagLeftRightHorizontal:
00341 {
00342 int framesPerPeriod = 125;
00343 tailCount %= framesPerPeriod;
00344 tailCount++;
00345 jointData.data[JointData::tailPan] = toMicroRad(jointLimitTailPanP * sin(tailCount * 2 * pi / framesPerPeriod));
00346 jointData.data[JointData::tailTilt] = toMicroRad(jointLimitTailTiltN);
00347 }
00348 break;
00349 case TailRequest::wagLeftRightVertical:
00350 {
00351 int framesPerPeriod = 125;
00352 tailCount %= framesPerPeriod;
00353 tailCount++;
00354 jointData.data[JointData::tailPan] = toMicroRad(jointLimitTailPanP * sin(tailCount * 2 * pi / framesPerPeriod));
00355 jointData.data[JointData::tailTilt] = toMicroRad(jointLimitTailTiltN);
00356 }
00357 break;
00358 case TailRequest::wagHorizontalFast:
00359 {
00360 int framesPerPeriod = 30;
00361 tailCount %= framesPerPeriod;
00362 tailCount++;
00363 jointData.data[JointData::tailPan] = toMicroRad((jointLimitTailPanP/2) * sgn(sin(tailCount * 2 * pi / framesPerPeriod)));
00364 jointData.data[JointData::tailTilt] = toMicroRad(jointLimitTailTiltN);
00365 }
00366 break;
00367 case TailRequest::wagVertical:
00368 {
00369 int framesPerPeriod = 125;
00370 tailCount %= framesPerPeriod;
00371 tailCount++;
00372 jointData.data[JointData::tailTilt] =
00373 toMicroRad(
00374 (jointLimitTailTiltP + jointLimitTailTiltN) / 2 +
00375 (jointLimitTailTiltP - jointLimitTailTiltN) / 2 * sin(tailCount * 2 * pi / framesPerPeriod)
00376 );
00377 jointData.data[JointData::tailPan] = 0;
00378 }
00379 break;
00380 case TailRequest::wagUpDownLeft:
00381 {
00382 int framesPerPeriod = 125;
00383 tailCount %= framesPerPeriod;
00384 tailCount++;
00385 jointData.data[JointData::tailTilt] =
00386 toMicroRad(
00387 (jointLimitTailTiltP + jointLimitTailTiltN) / 2 +
00388 (jointLimitTailTiltP - jointLimitTailTiltN) / 2 * sin(tailCount * 2 * pi / framesPerPeriod)
00389 );
00390 jointData.data[JointData::tailPan] = toMicroRad(jointLimitTailPanN);
00391 }
00392 break;
00393 case TailRequest::wagUpDownRight:
00394 {
00395 int framesPerPeriod = 125;
00396 tailCount %= framesPerPeriod;
00397 tailCount++;
00398 jointData.data[JointData::tailTilt] =
00399 toMicroRad(
00400 (jointLimitTailTiltP + jointLimitTailTiltN) / 2 +
00401 (jointLimitTailTiltP - jointLimitTailTiltN) / 2 * sin(tailCount * 2 * pi / framesPerPeriod)
00402 );
00403 jointData.data[JointData::tailPan] = toMicroRad(jointLimitTailPanP);
00404 }
00405 break;
00406 case TailRequest::wagVerticalFast:
00407 {
00408 tailCount &= 7;
00409 int j=tailCount++;
00410 if (j>3) j = 8-j;
00411 jointData.data[JointData::tailTilt] = 160000*(j - 2);
00412 jointData.data[JointData::tailPan] = 0;
00413 }
00414 break;
00415 case TailRequest::stayAsForced:
00416 jointData.data[JointData::tailTilt] = sensorData.data[SensorData::tailTilt];
00417 jointData.data[JointData::tailPan] = sensorData.data[SensorData::tailPan];
00418 break;
00419 case TailRequest::stayAsForcedPan:
00420 jointData.data[JointData::tailTilt] = toMicroRad(jointLimitTailTiltP);
00421 jointData.data[JointData::tailPan] = sensorData.data[SensorData::tailPan];
00422 break;
00423 case TailRequest::stayAsForcedTilt:
00424 jointData.data[JointData::tailTilt] = sensorData.data[SensorData::tailTilt];
00425 jointData.data[JointData::tailPan] = 0;
00426 break;
00427 case TailRequest::tailFollowsHead:
00428 jointData.data[JointData::tailTilt] = sensorData.data[SensorData::neckTilt];
00429 jointData.data[JointData::tailPan] = -sensorData.data[SensorData::headPan];
00430 break;
00431 case TailRequest::tailParallelToGround:
00432 jointData.data[JointData::tailTilt] = 0;
00433 jointData.data[JointData::tailPan] = 0;
00434 break;
00435 case TailRequest::noTailWag:
00436 jointData.data[JointData::tailTilt] = 0;
00437 jointData.data[JointData::tailPan] = 0;
00438 break;
00439 case TailRequest::twoPositionSwitchVertical:
00440 jointData.data[JointData::tailPan] = 0;
00441 if (sensorData.data[SensorData::tailTilt] > 0)
00442 jointData.data[JointData::tailTilt] = 380000;
00443 else
00444 jointData.data[JointData::tailTilt] = -380000;
00445 break;
00446 case TailRequest::twoPositionSwitchHorizontal:
00447 jointData.data[JointData::tailTilt] = 0;
00448 if (sensorData.data[SensorData::tailPan] > 0)
00449 jointData.data[JointData::tailPan] = 380000;
00450 else
00451 jointData.data[JointData::tailPan] = -380000;
00452 break;
00453 case TailRequest::threePositionSwitchVertical:
00454 jointData.data[JointData::tailPan] = 0;
00455 if (sensorData.data[SensorData::tailTilt] > 130000)
00456 jointData.data[JointData::tailTilt] = 380000;
00457 else if(sensorData.data[SensorData::tailTilt] > -130000)
00458 jointData.data[JointData::tailTilt] = 0;
00459 else
00460 jointData.data[JointData::tailTilt] = -380000;
00461 break;
00462 case TailRequest::threePositionSwitchHorizontal:
00463 jointData.data[JointData::tailTilt] = 0;
00464 if (sensorData.data[SensorData::tailPan] > 130000)
00465 jointData.data[JointData::tailPan] = 380000;
00466 else if(sensorData.data[SensorData::tailPan] > -130000)
00467 jointData.data[JointData::tailPan] = 0;
00468 else
00469 jointData.data[JointData::tailPan] = -380000;
00470 break;
00471 case TailRequest::fourPositionSwitchUpDownLeftRight:
00472 if(sensorData.data[SensorData::tailPan] > sensorData.data[SensorData::tailTilt])
00473 {
00474 if(sensorData.data[SensorData::tailPan] > -sensorData.data[SensorData::tailTilt])
00475 {
00476
00477 jointData.data[JointData::tailPan] = 380000;
00478 jointData.data[JointData::tailTilt] = 0;
00479 }
00480 else
00481 {
00482
00483 jointData.data[JointData::tailPan] = 0;
00484 jointData.data[JointData::tailTilt] = -380000;
00485 }
00486 }
00487 else
00488 {
00489 if(sensorData.data[SensorData::tailPan] > -sensorData.data[SensorData::tailTilt])
00490 {
00491
00492 jointData.data[JointData::tailPan] = 0;
00493 jointData.data[JointData::tailTilt] = 380000;
00494 }
00495 else
00496 {
00497
00498 jointData.data[JointData::tailPan] = -380000;
00499 jointData.data[JointData::tailTilt] = 0;
00500 }
00501 }
00502 break;
00503 case TailRequest::fourPositionSwitchCorners:
00504 if (sensorData.data[SensorData::tailTilt] > 0)
00505 jointData.data[JointData::tailTilt] = 380000;
00506 else
00507 jointData.data[JointData::tailTilt] = -380000;
00508
00509 if (sensorData.data[SensorData::tailPan] > 0)
00510 jointData.data[JointData::tailPan] = 380000;
00511 else
00512 jointData.data[JointData::tailPan] = -380000;
00513 break;
00514 case TailRequest::fivePositionSwitch:
00515 if(sensorData.data[SensorData::tailTilt] > -130000 &&
00516 sensorData.data[SensorData::tailTilt] < 130000 &&
00517 sensorData.data[SensorData::tailPan] > -130000 &&
00518 sensorData.data[SensorData::tailPan] < 130000)
00519 {
00520 jointData.data[JointData::tailPan] = 0;
00521 jointData.data[JointData::tailTilt] = 0;
00522 }
00523 else
00524 {
00525 if (sensorData.data[SensorData::tailTilt] > 0)
00526 jointData.data[JointData::tailTilt] = 380000;
00527 else
00528 jointData.data[JointData::tailTilt] = -380000;
00529
00530 if (sensorData.data[SensorData::tailPan] > 0)
00531 jointData.data[JointData::tailPan] = 380000;
00532 else
00533 jointData.data[JointData::tailPan] = -380000;
00534 }
00535 break;
00536 case TailRequest::eightPositionSwitch:
00537
00538 jointData.data[JointData::tailPan] = 0;
00539 if (sensorData.data[SensorData::tailTilt] > 130000)
00540 {
00541 jointData.data[JointData::tailTilt] = 380000;
00542 if (sensorData.data[SensorData::tailPan] > 130000)
00543 jointData.data[JointData::tailPan] = 380000;
00544 else if(sensorData.data[SensorData::tailPan] > -130000)
00545 jointData.data[JointData::tailPan] = 0;
00546 else
00547 jointData.data[JointData::tailPan] = -380000;
00548 }
00549 else if(sensorData.data[SensorData::tailTilt] > -130000)
00550 {
00551 jointData.data[JointData::tailTilt] = 0;
00552 if (sensorData.data[SensorData::tailPan] > 130000)
00553 jointData.data[JointData::tailPan] = 380000;
00554 else if(sensorData.data[SensorData::tailPan] > -130000)
00555 {
00556
00557 jointData.data[JointData::tailPan] = 0;
00558 jointData.data[JointData::tailTilt] = 380000;
00559 }
00560 else
00561 jointData.data[JointData::tailPan] = -380000;
00562 }
00563 else
00564 {
00565 jointData.data[JointData::tailTilt] = -380000;
00566 if (sensorData.data[SensorData::tailPan] > 130000)
00567 jointData.data[JointData::tailPan] = 380000;
00568 else if(sensorData.data[SensorData::tailPan] > -130000)
00569 jointData.data[JointData::tailPan] = 0;
00570 else
00571 jointData.data[JointData::tailPan] = -380000;
00572 }
00573 break;
00574 case TailRequest::tailLeftTop:
00575 jointData.data[JointData::tailPan] = -380000;
00576 jointData.data[JointData::tailTilt] = 380000;
00577 break;
00578 case TailRequest::tailCenterTop:
00579 jointData.data[JointData::tailPan] = 0;
00580 jointData.data[JointData::tailTilt] = 380000;
00581 break;
00582 case TailRequest::tailRightTop:
00583 jointData.data[JointData::tailPan] = 380000;
00584 jointData.data[JointData::tailTilt] = 380000;
00585 break;
00586 case TailRequest::tailLeftCenter:
00587 jointData.data[JointData::tailPan] = -380000;
00588 jointData.data[JointData::tailTilt] = 0;
00589 break;
00590 case TailRequest::tailCenterCenter:
00591 jointData.data[JointData::tailPan] = 0;
00592 jointData.data[JointData::tailTilt] = 0;
00593 break;
00594 case TailRequest::tailRightCenter:
00595 jointData.data[JointData::tailPan] = 380000;
00596 jointData.data[JointData::tailTilt] = 0;
00597 break;
00598 case TailRequest::tailLeftBottom:
00599 jointData.data[JointData::tailPan] = -380000;
00600 jointData.data[JointData::tailTilt] = -380000;
00601 break;
00602 case TailRequest::tailCenterBottom:
00603 jointData.data[JointData::tailPan] = 0;
00604 jointData.data[JointData::tailTilt] = -380000;
00605 break;
00606 case TailRequest::tailRightBottom:
00607 jointData.data[JointData::tailPan] = 380000;
00608 jointData.data[JointData::tailTilt] = -380000;
00609 break;
00610 }
00611 }
00612
00613 bool GT2004MotionControl::handleMessage(InMessage& message)
00614 {
00615 switch(message.getMessageID())
00616 {
00617 case idGenericDebugData:
00618 {
00619 GenericDebugData d;
00620 message.bin >> d;
00621 if(d.id == GenericDebugData::motionStabilizer)
00622 {
00623 OUTPUT(idText,text,"generic debug message (motionStabilizer) handled by module motionStabilizer");
00624
00625 xFore.setWeightP(d.data[0]);
00626 xHind.setWeightP(d.data[0]);
00627 yLeft.setWeightP(d.data[1]);
00628 yRight.setWeightP(d.data[1]);
00629
00630 stabilizerScale = d.data[2];
00631 }
00632 }
00633 break;
00634 case idMotionNet:
00635 return pSpecialActions->handleMessage(message);
00636 case idOdometryScale:
00637 return pWalkingEngine[WalkRequest::normal]->handleMessage(message);
00638 case idInvKinWalkingParameters:
00639 return pWalkingEngine[WalkRequest::debug]->handleMessage(message);
00640 }
00641 return false;
00642 }
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081