diff --git a/src/PreviewControl/rigid-body-system.cpp b/src/PreviewControl/rigid-body-system.cpp index 93bf72cbf016444e121460cfee8a0745ad61fd18..c78af9c2e0aa5784979e8439166748c4a03dd955 100644 --- a/src/PreviewControl/rigid-body-system.cpp +++ b/src/PreviewControl/rigid-body-system.cpp @@ -27,15 +27,18 @@ using namespace PatternGeneratorJRL; using namespace std; -RigidBodySystem::RigidBodySystem() +RigidBodySystem::RigidBodySystem(): + Mass_(0),CoMHeight_(0),T_(0),Tr_(0),Ta_(0),N_(0) { + initialize(); + } RigidBodySystem::~RigidBodySystem() { - + } @@ -43,6 +46,12 @@ void RigidBodySystem::initialize() { + // Initialize total mass + CoM_.Mass( Mass_ ); + + // Initialize dynamics + RigidBody::linear_dynamics_t & Position = CoM_.Dynamics( RigidBody::POSITION ); + initialize_dynamics( Position ); RigidBody::linear_dynamics_t & Velocity = CoM_.Dynamics( RigidBody::VELOCITY ); initialize_dynamics( Velocity ); RigidBody::linear_dynamics_t & COP = CoM_.Dynamics( RigidBody::COP ); @@ -54,7 +63,7 @@ RigidBodySystem::initialize() void -RigidBodySystem::initialize_dynamics( RigidBody::linear_dynamics_t & Dynamics) +RigidBodySystem::initialize_dynamics( RigidBody::linear_dynamics_t & Dynamics ) { bool preserve = true; @@ -66,62 +75,73 @@ RigidBodySystem::initialize_dynamics( RigidBody::linear_dynamics_t & Dynamics) Dynamics.S.clear(); switch(Dynamics.Type) - { - case RigidBody::VELOCITY: - for(unsigned int i=0;i<N_;i++) - { - Dynamics.S(i,0) = 0.0; Dynamics.S(i,1) = 1.0; Dynamics.S(i,2) = (i+1)*T_; - for(unsigned int j=0;j<N_;j++) - if (j<=i) - Dynamics.U(i,j) = Dynamics.UT(j,i) = (2*(i-j)+1)*T_*T_*0.5 ; - else - Dynamics.U(i,j) = Dynamics.UT(j,i) = 0.0; - } - break; - - case RigidBody::COP: - for(unsigned int i=0;i<N_;i++) - { - Dynamics.S(i,0) = 1.0; Dynamics.S(i,1) = (i+1)*T_; Dynamics.S(i,2) = (i+1)*(i+1)*T_*T_*0.5-CoMHeight_/9.81; - for(unsigned int j=0;j<N_;j++) - if (j<=i) - Dynamics.U(i,j) = Dynamics.UT(j,i) = (1 + 3*(i-j) + 3*(i-j)*(i-j)) * T_*T_*T_/6.0 - T_*CoMHeight_/9.81; - else - Dynamics.U(i,j) = Dynamics.UT(j,i) = 0.0; - } - break; - - case RigidBody::JERK: - for(unsigned int i=0;i<N_;i++) - { - Dynamics.S(i,0) = 0.0; Dynamics.S(i,1) = 0.0; Dynamics.S(i,2) = 0.0; - for(unsigned int j=0;j<N_;j++) - if (j==i) - Dynamics.U(i,j) = Dynamics.UT(j,i) = 1.0; - else - Dynamics.U(i,j) = Dynamics.UT(j,i) = 0.0; - } - break; - - } + { + case RigidBody::POSITION: + for(unsigned int i=0;i<N_;i++) + { + Dynamics.S(i,0) = 1; Dynamics.S(i,1) =(i+1)* T_; Dynamics.S(i,2) = ((i+1)* T_)*((i+1)* T_)/2; + for(unsigned int j=0;j<N_;j++) + if (j<=i) + Dynamics.U(i,j) = Dynamics.UT(j,i) =(1+3*(i-j)+3*(i-j)*(i-j))*(T_*T_*T_)/6 ; + else + Dynamics.U(i,j) = Dynamics.UT(j,i) = 0.0; + } + break; + case RigidBody::VELOCITY: + for(unsigned int i=0;i<N_;i++) + { + Dynamics.S(i,0) = 0.0; Dynamics.S(i,1) = 1.0; Dynamics.S(i,2) = (i+1)*T_; + for(unsigned int j=0;j<N_;j++) + if (j<=i) + Dynamics.U(i,j) = Dynamics.UT(j,i) = (2*(i-j)+1)*T_*T_*0.5 ; + else + Dynamics.U(i,j) = Dynamics.UT(j,i) = 0.0; + } + break; + + case RigidBody::COP: + for(unsigned int i=0;i<N_;i++) + { + Dynamics.S(i,0) = 1.0; Dynamics.S(i,1) = (i+1)*T_; Dynamics.S(i,2) = (i+1)*(i+1)*T_*T_*0.5-CoMHeight_/9.81; + for(unsigned int j=0;j<N_;j++) + if (j<=i) + Dynamics.U(i,j) = Dynamics.UT(j,i) = (1 + 3*(i-j) + 3*(i-j)*(i-j)) * T_*T_*T_/6.0 - T_*CoMHeight_/9.81; + else + Dynamics.U(i,j) = Dynamics.UT(j,i) = 0.0; + } + break; + + case RigidBody::JERK: + for(unsigned int i=0;i<N_;i++) + { + Dynamics.S(i,0) = 0.0; Dynamics.S(i,1) = 0.0; Dynamics.S(i,2) = 0.0; + for(unsigned int j=0;j<N_;j++) + if (j==i) + Dynamics.U(i,j) = Dynamics.UT(j,i) = 1.0; + else + Dynamics.U(i,j) = Dynamics.UT(j,i) = 0.0; + } + break; + + } } -int -RigidBodySystem::interpolate(deque<COMState> &COMStates, - deque<ZMPPosition> &ZMPRefPositions, - int CurrentPosition, - double CX, double CY) -{ - - return 0; - -} - - -void -RigidBodySystem::increment_state(double Control) -{ - -} +//int +//RigidBodySystem::interpolate(deque<COMState> &COMStates, +// deque<ZMPPosition> &ZMPRefPositions, +// int CurrentPosition, +// double CX, double CY) +//{ +// +// return 0; +// +//} +// +// +//void +//RigidBodySystem::increment_state(double Control) +//{ +// +//} diff --git a/src/PreviewControl/rigid-body-system.hh b/src/PreviewControl/rigid-body-system.hh index 0359ab7fc52205eff4f7895eb43d9112c7eedf93..93a597bb6c9abaec81b280e8debc7f5b0d05721d 100644 --- a/src/PreviewControl/rigid-body-system.hh +++ b/src/PreviewControl/rigid-body-system.hh @@ -43,30 +43,28 @@ namespace PatternGeneratorJRL ~RigidBodySystem(); /// \brief Initialize - /// - /// \return 0 void initialize(); - /// \brief Interpolate - int interpolate(std::deque<COMState> &COMStates, - std::deque<ZMPPosition> &ZMPRefPositions, - int CurrentPosition, - double CX, double CY); - - /// \brief Increment the state - /// - /// \param[in] Control Control vector - void increment_state( double Control ); - - /// \brief Decouple degree of freedom by injected trajectory - /// - /// \param[in] Axis The axis to be decoupled - /// \param[in] Trajectory The injected trajectory - /// - /// \return 0 - int inject_trajectory( unsigned int Axis, boost_ublas::vector<double> Trajectory ); - - /// \name Accessors +// /// \brief Interpolate +// int interpolate(std::deque<COMState> &COMStates, +// std::deque<ZMPPosition> &ZMPRefPositions, +// int CurrentPosition, +// double CX, double CY); +// +// /// \brief Increment the state +// /// +// /// \param[in] Control Control vector +// void increment_state( double Control ); +// +// /// \brief Decouple degree of freedom by injected trajectory +// /// +// /// \param[in] Axis The axis to be decoupled +// /// \param[in] Trajectory The injected trajectory +// /// +// /// \return 0 +// int inject_trajectory( unsigned int Axis, boost_ublas::vector<double> Trajectory ); + + /// \name Accessors and mutators /// \{ inline const RigidBody operator ()() const {return CoM_;}; @@ -82,6 +80,21 @@ namespace PatternGeneratorJRL { return Ta_; } inline void SamplingPeriodAct( double Ta ) { Ta_ = Ta; } + + inline unsigned const & NbSamplingsPreviewed( ) const + { return N_; } + inline void NbSamplingsPreviewed( unsigned N ) + { N_ = N; } + + inline double const & Mass( ) const + { return Mass_; } + inline void Mass( double Mass ) + { Mass_ = Mass; } + + inline double const & CoMHeight( ) const + { return CoMHeight_; } + inline void CoMHeight( double Height ) + { CoMHeight_ = Height; } /// \} @@ -93,7 +106,7 @@ namespace PatternGeneratorJRL /// \brief Initialize dynamics matrices /// /// \param[in] Dynamics Matrices to be filled - void initialize_dynamics( RigidBody::linear_dynamics_t & Dynamics); + void initialize_dynamics( RigidBody::linear_dynamics_t & Dynamics ); // // Private members @@ -103,6 +116,9 @@ namespace PatternGeneratorJRL /// \brief Body RigidBody CoM_; + /// \brief Total robot mass + double Mass_; + /// \brief CoMHeight double CoMHeight_;