Program Listing for File diff_drive_dynamics.h

Return to documentation for file (src/rlenvs/dynamics/diff_drive_dynamics.h)

#ifndef DIFF_DRIVE_DYNAMICS_H
#define DIFF_DRIVE_DYNAMICS_H

#include "rlenvs/rlenvs_types_v2.h"
#include "rlenvs/dynamics/system_state.h"
#include "rlenvs/dynamics/motion_model_base.h"
#include "rlenvs/dynamics/dynamics_matrix_descriptor.h"

#include <array>
#include <map>
#include <any>

namespace rlenvscpp{
namespace dynamics{

class DiffDriveDynamics: public MotionModelDynamicsBase<SysState<3>,
                                                        DynamicsMatrixDescriptor,
                                                        std::map<std::string, std::any>>
{
public:

    enum class DynamicVersion{V1, V2, V3};

    typedef MotionModelDynamicsBase<SysState<3>,
                            DynamicsMatrixDescriptor,
                            std::map<std::string, std::any> >::state_type state_type;

    typedef MotionModelDynamicsBase<SysState<3>,
                            DynamicsMatrixDescriptor,
                            std::map<std::string, std::any> >::input_type input_type;

    typedef MotionModelDynamicsBase<SysState<3>,
                            DynamicsMatrixDescriptor,
                            std::map<std::string, std::any> >::matrix_type matrix_type;

    typedef MotionModelDynamicsBase<SysState<3>,
                            DynamicsMatrixDescriptor,
                            std::map<std::string, std::any> >::vector_type vector_type;

    static SysState<3> integrate_state_v1(const SysState<3>& state, real_t tol, real_t dt,
                                                real_t v, real_t w, const std::array<real_t, 2>& errors);


    static SysState<3> integrate_state_v2(const SysState<3>& state, real_t dt,
                                                real_t v, real_t w, const std::array<real_t, 2>& errors);

    static SysState<3> integrate_state_v3(const SysState<3>& state, real_t r, real_t l, real_t dt, real_t w1,
                                                real_t w2, const std::array<real_t, 2>& errors);

    static SysState<3> integrate(const SysState<3>& state,
                                 const input_type& input, const DynamicVersion version);

    explicit DiffDriveDynamics(DynamicVersion type = DynamicVersion::V1,
                               bool update_description_matrices_on_evaluate = true);

    explicit DiffDriveDynamics(state_type&& state);

    virtual state_type& evaluate(const input_type& input )override;

    void integrate(const input_type& input);

    real_t get_x_position()const{return this->state_.get("X");}

    void set_x_position(real_t x){this->state_.set("X", x);}

    real_t get_y_position()const{return this->state_.get("Y");}

    void set_y_position(real_t y){this->state_.set("Y", y);}

    real_t get_orientation()const{return this->state_.get("Theta");}

    void set_orientation(real_t theta){this->state_.set("Theta", theta);}

    real_t get_velocity()const{return v_;}

    real_t get_angular_velocity()const{return w_;}

    void update_matrices(const input_type& input);

    void initialize_matrices(const input_type& input);

private:

    real_t v_;

    real_t w_;

    DynamicVersion type_;

};

}

}

#endif // DIFF_DRIVE_DYNAMICS_H