00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 #ifndef __JOINT_H
00088 #define __JOINT_H
00089
00090 #include <assert.h>
00091 #include <list>
00092
00093 #include "primitive.h"
00094 #include "osgforwarddecl.h"
00095 #include "axis.h"
00096 #include "osghandle.h"
00097 #include "odehandle.h"
00098
00099 namespace lpzrobots {
00100
00101
00102
00103
00104 class Joint {
00105 public:
00106 Joint(Primitive* part1, Primitive* part2, const osg::Vec3& anchor)
00107 : joint(0), part1(part1), part2(part2), anchor(anchor) {
00108 assert(part1 && part2);
00109 }
00110 virtual ~Joint();
00111
00112
00113
00114
00115
00116 virtual void init(const OdeHandle& odeHandle, const OsgHandle& osgHandle,
00117 bool withVisual = true, double visualSize = 0.2);
00118
00119
00120 virtual void update() = 0;
00121
00122 virtual void setParam(int parameter, double value) = 0;
00123
00124 virtual double getParam(int parameter) const = 0;
00125
00126 dJointID getJoint() const { return joint; }
00127 const Primitive* getPart1() const { return part1; }
00128 Primitive* getPart1() { return part1; }
00129 const Primitive* getPart2() const { return part2; }
00130 Primitive* getPart2() { return part2; }
00131 const osg::Vec3 getAnchor() const { return anchor; }
00132
00133
00134 virtual int getNumberAxes() const = 0;
00135
00136 virtual std::list<double> getPositions() const { return std::list<double>(); }
00137
00138 virtual std::list<double> getPositionRates() const { return std::list<double>(); }
00139
00140 virtual int getPositions(double* sensorarray) const { return 0; }
00141
00142
00143
00144 virtual int getPositionRates(double* sensorarray) const { return 0; }
00145
00146 static osg::Matrix anchorAxisPose(const osg::Vec3& anchor, const Axis& axis);
00147 protected:
00148 dJointID joint;
00149 Primitive* part1;
00150 Primitive* part2;
00151 osg::Vec3 anchor;
00152 public:
00153 OdeHandle odeHandle;
00154 };
00155
00156 class OneAxisJoint : public Joint {
00157 public:
00158 OneAxisJoint(Primitive* part1, Primitive* part2, const osg::Vec3& anchor, const Axis axis1)
00159 : Joint(part1, part2, anchor), axis1(axis1) {}
00160 virtual Axis getAxis1() const { return axis1; };
00161
00162 virtual double getPosition1() const = 0;
00163 virtual double getPosition1Rate() const = 0;
00164 virtual void addForce1(double force) = 0;
00165
00166 virtual int getNumberAxes() const { return 1;};
00167 virtual std::list<double> getPositions() const;
00168 virtual std::list<double> getPositionRates() const;
00169 virtual int getPositions(double* sensorarray) const;
00170 virtual int getPositionRates(double* sensorarray) const;
00171 protected:
00172 Axis axis1;
00173 };
00174
00175 class TwoAxisJoint : public OneAxisJoint {
00176 public:
00177 TwoAxisJoint(Primitive* part1, Primitive* part2, const osg::Vec3& anchor, const Axis axis1,
00178 const Axis axis2 )
00179 : OneAxisJoint(part1, part2, anchor, axis1), axis2(axis2) {}
00180 virtual Axis getAxis2() const { return axis2; };
00181
00182 virtual double getPosition2() const = 0;
00183 virtual double getPosition2Rate() const = 0;
00184 virtual void addForce2(double force) = 0;
00185 void addForces(double force1,double force2){
00186 addForce1(force1); addForce2(force2);
00187 }
00188
00189 virtual int getNumberAxes() const { return 2;};
00190 virtual std::list<double> getPositions() const;
00191 virtual std::list<double> getPositionRates() const;
00192 virtual int getPositions(double* sensorarray) const;
00193 virtual int getPositionRates(double* sensorarray) const;
00194
00195 protected:
00196 Axis axis2;
00197 };
00198
00199
00200
00201 class FixedJoint : public Joint {
00202 public:
00203 FixedJoint(Primitive* part1, Primitive* part2);
00204
00205 virtual ~FixedJoint();
00206
00207
00208
00209 virtual void init(const OdeHandle& odeHandle, const OsgHandle& osgHandle,
00210 bool withVisual = true, double visualSize = 0.2);
00211
00212 virtual void update();
00213 virtual void setParam(int parameter, double value);
00214 virtual double getParam(int parameter) const;
00215
00216 virtual int getNumberAxes() const { return 0; }
00217
00218 };
00219
00220
00221
00222
00223 class HingeJoint : public OneAxisJoint {
00224 public:
00225 HingeJoint(Primitive* part1, Primitive* part2, const osg::Vec3& anchor,
00226 const Axis& axis1);
00227
00228 virtual ~HingeJoint();
00229
00230
00231
00232
00233 virtual void init(const OdeHandle& odeHandle, const OsgHandle& osgHandle,
00234 bool withVisual = true, double visualSize = 0.2);
00235
00236 virtual void update();
00237
00238 virtual void addForce1(double t);
00239 virtual double getPosition1() const;
00240 virtual double getPosition1Rate() const;
00241 virtual void setParam(int parameter, double value);
00242 virtual double getParam(int parameter) const;
00243
00244 protected:
00245 OSGPrimitive* visual;
00246 };
00247
00248
00249
00250 class Hinge2Joint : public TwoAxisJoint {
00251 public:
00252 Hinge2Joint(Primitive* part1, Primitive* part2, const osg::Vec3& anchor,
00253 const Axis& axis1, const Axis& axis2);
00254
00255 virtual ~Hinge2Joint();
00256
00257
00258
00259
00260 virtual void init(const OdeHandle& odeHandle, const OsgHandle& osgHandle,
00261 bool withVisual = true, double visualSize = 0.2);
00262
00263 virtual void update();
00264
00265
00266 virtual void addForce1(double t1);
00267 virtual void addForce2(double t2);
00268 virtual double getPosition1() const;
00269 virtual double getPosition2() const;
00270 virtual double getPosition1Rate() const;
00271 virtual double getPosition2Rate() const;
00272 virtual void setParam(int parameter, double value);
00273 virtual double getParam(int parameter) const;
00274
00275 protected:
00276 OSGPrimitive* visual;
00277 };
00278
00279
00280
00281 class UniversalJoint : public TwoAxisJoint {
00282 public:
00283 UniversalJoint(Primitive* part1, Primitive* part2, const osg::Vec3& anchor,
00284 const Axis& axis1, const Axis& axis2);
00285
00286 virtual ~UniversalJoint();
00287
00288
00289
00290
00291 virtual void init(const OdeHandle& odeHandle, const OsgHandle& osgHandle,
00292 bool withVisual = true, double visualSize = 0.2);
00293
00294 virtual void update();
00295
00296
00297 virtual void addForce1(double t1);
00298 virtual void addForce2(double t2);
00299 virtual double getPosition1() const;
00300 virtual double getPosition2() const;
00301 virtual double getPosition1Rate() const;
00302 virtual double getPosition2Rate() const;
00303
00304 virtual void setParam(int parameter, double value);
00305 virtual double getParam(int parameter) const;
00306
00307 protected:
00308 OSGPrimitive* visual1;
00309 OSGPrimitive* visual2;
00310 };
00311
00312
00313
00314 class BallJoint : public Joint {
00315 public:
00316 BallJoint(Primitive* part1, Primitive* part2, const osg::Vec3& anchor);
00317
00318 virtual ~BallJoint();
00319
00320
00321
00322
00323 virtual void init(const OdeHandle& odeHandle, const OsgHandle& osgHandle,
00324 bool withVisual = true, double visualSize = 0.2);
00325
00326 virtual void update();
00327
00328 virtual int getNumberAxes() const { return 0; }
00329
00330 virtual void setParam(int parameter, double value);
00331 virtual double getParam(int parameter) const;
00332
00333 protected:
00334 OSGPrimitive* visual;
00335 };
00336
00337
00338
00339 class SliderJoint : public OneAxisJoint {
00340 public:
00341 SliderJoint(Primitive* part1, Primitive* part2, const osg::Vec3& anchor,
00342 const Axis& axis1);
00343
00344 virtual ~SliderJoint();
00345
00346
00347
00348
00349
00350 virtual void init(const OdeHandle& odeHandle, const OsgHandle& osgHandle,
00351 bool withVisual = true, double visualSize = 0.1);
00352
00353 virtual void update();
00354
00355 virtual void addForce1(double t);
00356 virtual double getPosition1() const;
00357 virtual double getPosition1Rate() const;
00358 virtual void setParam(int parameter, double value);
00359 virtual double getParam(int parameter) const;
00360
00361 protected:
00362 OSGPrimitive* visual;
00363 double visualSize;
00364 OsgHandle osgHandle;
00365 };
00366
00367
00368
00369
00370
00371 }
00372
00373 #endif