123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /*
- * CopyPose.h
- *
- * Created on: Mar 17, 2009
- * Author: benoit bolsee
- */
- #ifndef COPYPOSE_H_
- #define COPYPOSE_H_
- #include "ConstraintSet.hpp"
- namespace iTaSC{
- using namespace KDL;
- class CopyPose: public iTaSC::ConstraintSet
- {
- protected:
- virtual void updateKinematics(const Timestamp& timestamp);
- virtual void pushCache(const Timestamp& timestamp);
- virtual void updateJacobian();
- virtual bool initialise(Frame& init_pose);
- virtual void initCache(Cache *_cache);
- virtual void updateControlOutput(const Timestamp& timestamp);
- virtual void modelUpdate(Frame& _external_pose,const Timestamp& timestamp);
- virtual double getMaxTimestep(double& timestep);
- public:
- enum ID { // constraint ID in callback and setControlParameter
- ID_POSITION=0,
- ID_POSITIONX=1,
- ID_POSITIONY=2,
- ID_POSITIONZ=3,
- ID_ROTATION=4,
- ID_ROTATIONX=5,
- ID_ROTATIONY=6,
- ID_ROTATIONZ=7,
- };
- enum CTL { // control ID in constructor to specify which output is constrainted
- CTL_NONE=0x00,
- CTL_POSITIONX=0x01, // the bit order is important: it matches the y output order
- CTL_POSITIONY=0x02,
- CTL_POSITIONZ=0x04,
- CTL_POSITION=0x07,
- CTL_ROTATIONX=0x08,
- CTL_ROTATIONY=0x10,
- CTL_ROTATIONZ=0x20,
- CTL_ROTATION=0x38,
- CTL_ALL=0x3F,
- };
- // use a combination of CTL_.. in control_output to specify which
- CopyPose(unsigned int control_output=CTL_ALL, unsigned int dynamic_output=CTL_NONE, double armlength=1.0, double accuracy=1e-6, unsigned int maximum_iterations=100);
- virtual ~CopyPose();
- virtual bool setControlParameters(struct ConstraintValues* _values, unsigned int _nvalues, double timestep);
- virtual const ConstraintValues* getControlParameters(unsigned int* _nvalues);
- private:
- struct ConstraintSingleValue m_posData[3]; // index = controlled output in X,Y,Z order
- struct ConstraintSingleValue m_rotData[3];
- struct ConstraintValues m_values[2]; // index = group of controlled output, in position, rotation order
- Cache* m_cache;
- int m_poseCCh;
- CacheTS m_poseCTs;
- unsigned int m_poseCacheSize;
- unsigned int m_outputDynamic; // combination of CTL_... determine which variables are dynamically controlled by the application
- unsigned int m_outputControl; // combination of CTL_... determine which output are constrained
- unsigned int m_nvalues; // number of elements used in m_values[]
- double m_maxerror;
- struct ControlState {
- int firsty; // first y index
- int ny; // number of y in output
- double alpha;
- double K;
- double tolerance;
- struct ControlValue {
- double yddot;
- double yd;
- double nextyd;
- double nextyddot;
- } output[3]; // inded numbex = same as m_rotData
- } m_rot, m_pos;
- void pushPose(CacheTS timestamp);
- bool popPose(CacheTS timestamp);
- int nBitsOn(unsigned int v)
- { int n=0; while(v) { if (v&1) n++; v>>=1; } return n; }
- double* restoreValues(double* item, ConstraintValues* _values, ControlState* _state, unsigned int mask);
- double* pushValues(double* item, ControlState* _state, unsigned int mask);
- void updateState(ConstraintValues* _values, ControlState* _state, unsigned int mask, double timestep);
- void updateValues(Vector& vel, ConstraintValues* _values, ControlState* _state, unsigned int mask);
- void updateOutput(Vector& vel, ControlState* _state, unsigned int mask);
- void interpolateOutput(ControlState* _state, unsigned int mask, const Timestamp& timestamp);
- };
- }
- #endif /* COPYROTATION_H_ */
|