00001
00002 #ifndef INCLUDED_WalkNode_h_
00003 #define INCLUDED_WalkNode_h_
00004
00005 #include "MCNode.h"
00006 #include "Motion/MotionManager.h"
00007 #include "Motion/WalkMC.h"
00008 #include "Motion/MMAccessor.h"
00009 #include "Events/LocomotionEvent.h"
00010 #include "Events/EventRouter.h"
00011
00012
00013
00014 extern const char defWalkNodeName[];
00015
00016
00017 extern const char defWalkNodeDesc[];
00018
00019
00020 template<typename W, const char* mcName=defWalkNodeName, const char* mcDesc=defWalkNodeDesc>
00021 class WalkEngineNode : public MCNode<W,mcName,mcDesc> {
00022 public:
00023
00024 enum WalkMode_t {
00025 VelocityWalkMode,
00026 DistanceWalkMode
00027 };
00028
00029 public:
00030
00031 WalkEngineNode()
00032 : MCNode<W,mcName,mcDesc>(), x(0), y(0), a(0), n(-1), walkMode()
00033 {}
00034
00035
00036 WalkEngineNode(float xvel, float yvel, float avel)
00037 : MCNode<W,mcName,mcDesc>(), x(xvel), y(yvel), a(avel), n(-1), walkMode(VelocityWalkMode)
00038 {}
00039
00040
00041 WalkEngineNode(float xdist, float ydist, float adist, int steps)
00042 : MCNode<W,mcName,mcDesc>(), x(xdist), y(ydist), a(adist), n(steps), walkMode(DistanceWalkMode)
00043 {}
00044
00045
00046 WalkEngineNode(const std::string& name, float xvel, float yvel, float avel)
00047 : MCNode<W,mcName,mcDesc>(name), x(xvel), y(yvel), a(avel), n(-1), walkMode(VelocityWalkMode)
00048 {}
00049
00050
00051 WalkEngineNode(const std::string& name, float xdist, float ydist, float adist, int steps)
00052 : MCNode<W,mcName,mcDesc>(name), x(xdist), y(ydist), a(adist), n(steps), walkMode(DistanceWalkMode)
00053 {}
00054
00055
00056 ~WalkEngineNode() {}
00057
00058
00059
00060
00061
00062
00063 void setDisplacement(float xdist, float ydist, float adist, int steps = -1) {
00064 storeValues(xdist, ydist, adist, steps, DistanceWalkMode);
00065 }
00066
00067
00068
00069
00070
00071
00072 void setVelocity(float xvel, float yvel, float avel, int np = -1) {
00073 storeValues(xvel, yvel, avel, np, VelocityWalkMode);
00074 }
00075
00076
00077 void setXVelocity(float xvel) { x=xvel; storeValues(xvel, y, a, n, VelocityWalkMode); }
00078
00079
00080 float getX() { return x; }
00081
00082
00083 void setYVelocity(float yvel) { y=yvel; storeValues(x, yvel, a, n, VelocityWalkMode); }
00084
00085
00086 float getY() { return y; }
00087
00088
00089 void setAVelocity(float avel) { a=avel; storeValues(x, y, avel, n, VelocityWalkMode); }
00090
00091
00092 float getA() { return a; }
00093
00094
00095 int getSteps() { return n; }
00096
00097 virtual void DoStart() {
00098 MCNode<W,mcName,mcDesc>::DoStart();
00099 updateWMC();
00100 }
00101
00102 protected:
00103
00104 WalkEngineNode(const std::string& className, const std::string& instanceName, float xvel, float yvel, float avel)
00105 : MCNode<W,mcName,mcDesc>(className,instanceName), x(xvel), y(yvel), a(avel), n(-1), walkMode(VelocityWalkMode)
00106 {}
00107
00108
00109 WalkEngineNode(const std::string& className, const std::string& instanceName, float xdist, float ydist, float adist, int steps)
00110 : MCNode<W,mcName,mcDesc>(className,instanceName), x(xdist), y(ydist), a(adist), n(steps), walkMode(DistanceWalkMode)
00111 {}
00112
00113
00114 void storeValues(float xp, float yp, float ap, int np, WalkMode_t wmode) {
00115 x = xp;
00116 y = yp;
00117 a = ap;
00118 n = np;
00119 walkMode = wmode;
00120
00121 if(MCNode<W,mcName,mcDesc>::isActive())
00122 updateWMC();
00123 }
00124
00125
00126 void updateWMC() {
00127 MMAccessor<W> walk = MCNode<W,mcName,mcDesc>::getMC();
00128 switch(walkMode) {
00129 case VelocityWalkMode:
00130 walk->setTargetVelocity(x,y,a,n);
00131 break;
00132 case DistanceWalkMode:
00133 walk->setTargetDisplacement(x,y,a,n);
00134 break;
00135 default:
00136 std::cout << "Unknown Walk Mode" << std::endl;
00137 break;
00138 }
00139 }
00140
00141 float x;
00142 float y;
00143 float a;
00144 int n;
00145 WalkMode_t walkMode;
00146 };
00147
00148
00149 typedef WalkEngineNode<WalkMC> WalkNode;
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 #endif