00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __InvKinWalkingEngine_h_
00010 #define __InvKinWalkingEngine_h_
00011
00012 #include "WalkingEngine.h"
00013 #include "InvKinWalkingParameterSets.h"
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 class InvKinWalkingEngine : public WalkingEngine
00025 {
00026 public:
00027
00028
00029
00030
00031 InvKinWalkingEngine(const WalkingEngineInterfaces& interfaces);
00032
00033
00034
00035
00036 ~InvKinWalkingEngine();
00037
00038
00039 virtual bool executeParameterized(JointData& jointData, const WalkRequest& walkRequest, double positionInWalkingCycle);
00040
00041
00042
00043
00044
00045
00046 virtual bool handleMessage(InMessage& message);
00047
00048
00049
00050
00051
00052
00053 void setParameters(InvKinWalkingParameters* p, int changeSteps=32);
00054
00055
00056
00057
00058 const InvKinWalkingParameters& getParameters() const {return currentParameters;}
00059
00060 private:
00061
00062
00063
00064
00065 InvKinWalkingParameters currentParameters;
00066
00067
00068 InvKinWalkingParameters *requestedParameters;
00069
00070
00071 InvKinWalkingParameters nextParameters;
00072
00073
00074 InvKinWalkingParameters lastParameters;
00075
00076
00077 int paramInterpolCount;
00078
00079
00080 int paramInterpolLength;
00081
00082
00083 double positionInWalkCycle;
00084
00085
00086 void initParametersInterpolation(int changeSteps);
00087
00088
00089 void nextParametersInterpolation(bool walk);
00090
00091
00092 unsigned long lastParametersFromPackageTimeStamp;
00093
00094
00095
00096 double legSpeedX[4];
00097 double legSpeedY[4];
00098
00099 bool footOnGround[4];
00100 double x[4];
00101 double y[4];
00102 double z[4];
00103
00104
00105
00106
00107
00108 Pose2D currentRequest;
00109
00110
00111
00112
00113 Pose2D odometry;
00114
00115
00116 void calculateLegSpeeds();
00117
00118
00119
00120
00121
00122
00123 void calculateRelativeFootPosition(int step, int leg, double &rx, double &ry, double &rz);
00124
00125
00126 void calculateData(JointData &j);
00127
00128
00129 void calculateFootPositions();
00130
00131
00132 int calculateLegJoints(Kinematics::LegIndex leg,
00133 double &j1, double &j2, double &j3,
00134 double bodyTilt=0);
00135
00136
00137
00138
00139 void smoothMotionRequest(const Pose2D& request, Pose2D& currentRequest);
00140
00141
00142
00143
00144
00145 void limitToMaxSpeed(double& stepSizeX, double& stepSizeY, double& stepSizeR);
00146
00147
00148
00149
00150
00151
00152 double getLegPositionCurve(double& rz,double index);
00153 };
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 class ParamInvKinWalkingEngine : public WalkingEngine
00166 {
00167 public:
00168 ParamInvKinWalkingEngine(InvKinWalkingParameters* pParams, InvKinWalkingEngine* pEngine) :
00169 WalkingEngine(*pEngine),
00170 pEngine(pEngine),
00171 pParams(pParams)
00172 {}
00173
00174 ~ParamInvKinWalkingEngine()
00175 {
00176 delete pParams;
00177 }
00178
00179 InvKinWalkingEngine* pEngine;
00180 InvKinWalkingParameters* pParams;
00181
00182 virtual bool executeParameterized(JointData& jointData,
00183 const WalkRequest& walkRequest, double positionInWalkingCycle)
00184 {
00185 pEngine->setParameters(pParams);
00186 return pEngine->executeParameterized(jointData, walkRequest, positionInWalkingCycle);
00187 }
00188
00189 bool handleMessage(InMessage& message)
00190 {
00191 if (message.getMessageID() == idInvKinWalkingParameters)
00192 {
00193 InvKinWalkingParameters* newParams = new InvKinWalkingParameters;
00194 delete pParams;
00195 pParams = newParams;
00196 message.bin >> *pParams;
00197 pParams->readValues();
00198 return true;
00199 }
00200 return pEngine->handleMessage(message);
00201 }
00202 };
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 class ParamRearOnlyInvKinWalkingEngine : public WalkingEngine
00217 {
00218 public:
00219 ParamRearOnlyInvKinWalkingEngine(
00220 InvKinWalkingParameters *pParams,
00221 InvKinWalkingEngine *pEngine
00222 ) :
00223 WalkingEngine(*pEngine),
00224 pEngine(pEngine),
00225 pParams(pParams)
00226 {}
00227
00228 ~ParamRearOnlyInvKinWalkingEngine()
00229 {
00230 delete pParams;
00231 }
00232
00233 InvKinWalkingEngine *pEngine;
00234 InvKinWalkingParameters *pParams;
00235
00236 virtual bool executeParameterized(
00237 JointData &jointData,
00238 const WalkRequest &walkRequest,
00239 double positionInWalkingCycle
00240 ) {
00241 pEngine->setParameters(pParams);
00242
00243 JointData jd = jointData;
00244 bool result = pEngine->executeParameterized(jd, walkRequest, positionInWalkingCycle);
00245
00246
00247
00248 jointData.data[JointData::legHL1] = jd.data[JointData::legHL1];
00249 jointData.data[JointData::legHL2] = jd.data[JointData::legHL2];
00250 jointData.data[JointData::legHL3] = jd.data[JointData::legHL3];
00251 jointData.data[JointData::legHR1] = jd.data[JointData::legHR1];
00252 jointData.data[JointData::legHR2] = jd.data[JointData::legHR2];
00253 jointData.data[JointData::legHR3] = jd.data[JointData::legHR3];
00254 return result;
00255 }
00256
00257 bool handleMessage(InMessage &message)
00258 {
00259 if (message.getMessageID() == idInvKinWalkingParameters)
00260 {
00261 InvKinWalkingParameters* newParams = new InvKinWalkingParameters;
00262 delete pParams;
00263 pParams = newParams;
00264 message.bin >> *pParams;
00265 return true;
00266 }
00267 return pEngine->handleMessage(message);
00268 }
00269 };
00270
00271 #endif// __InvKinWalkingEngine_h_