31 #include <boost/serialization/vector.hpp> 34 #include <eigen3/Eigen/Core> 37 using namespace Eigen;
41 DmpContextualTwoStep::DmpContextualTwoStep(
int n_dims_dmp, std::vector<FunctionApproximator*> function_approximators,
FunctionApproximator* policy_parameter_function,
DmpType dmp_type)
44 policy_parameter_function_ = vector<vector<FunctionApproximator*> >(
dim_orig());
47 policy_parameter_function_[dd] = vector<FunctionApproximator*>(1);
48 policy_parameter_function_[dd][0] = policy_parameter_function->
clone();
54 const Eigen::Ref<const Eigen::MatrixXd>& phase_state, Eigen::MatrixXd& fa_output)
const 56 int n_time_steps = phase_state.rows();
57 fa_output.resize(n_time_steps,
dim_orig());
67 if (task_parameters.rows()==1)
69 task_parameters = task_parameters.row(0).replicate(n_time_steps,1).eval();
71 else if (task_parameters.cols()==1)
73 task_parameters = task_parameters.col(0).transpose().replicate(n_time_steps,1).eval();
76 assert(n_time_steps==task_parameters.rows());
80 VectorXd model_parameters;
85 model_parameters.resize(n_parameters);
86 for (
int pp=0; pp<n_parameters; pp++)
88 policy_parameter_function_[dd][pp]->predict(task_parameters,output);
89 model_parameters[pp] = output(0,0);
100 fa_output.col(dd) = output;
109 for (
unsigned int pp=0; pp<policy_parameter_function_[dd].size(); pp++)
110 if (!policy_parameter_function_[dd][pp]->
isTrained())
116 void DmpContextualTwoStep::train(
const vector<Trajectory>& trajectories,
const vector<MatrixXd>& task_parameters,
string save_directory,
bool overwrite)
129 unsigned int n_demonstrations = trajectories.size();
130 assert(n_demonstrations==task_parameters.size());
138 set_tau(trajectories[0].duration());
144 std::set<std::string> selected;
145 selected.insert(
"offsets");
146 selected.insert(
"slopes");
148 MatrixXd cur_task_parameters;
149 VectorXd cur_model_parameters;
150 vector<MatrixXd> all_model_parameters(n_demonstrations);
151 for (
unsigned int i_demo=0; i_demo<n_demonstrations; i_demo++)
154 string save_directory_demo;
155 if (!save_directory.empty())
156 save_directory_demo = save_directory +
"/demo" + to_string(i_demo);
158 Dmp::train(trajectories[i_demo],save_directory_demo,overwrite);
160 for (
int i_dim=0; i_dim<
dim_orig(); i_dim++)
169 all_model_parameters[i_dim].resize(n_demonstrations,cur_model_parameters.size());
171 assert(cur_model_parameters.size()==all_model_parameters[i_dim].cols());
173 all_model_parameters[i_dim].row(i_demo) = cur_model_parameters;
183 int n_task_parameters = task_parameters[0].cols();
188 VectorXd cur_task_parameters_t0;
190 MatrixXd inputs(n_demonstrations,n_task_parameters);
191 for (
unsigned int i_demo=0; i_demo<n_demonstrations; i_demo++)
194 cur_task_parameters_t0 = task_parameters[i_demo].row(0);
198 for (
int i_time=1; i_time<task_parameters[i_demo].rows(); i_time++)
200 if ( (cur_task_parameters_t0.array() != task_parameters[i_demo].row(i_time).array()).any())
202 cerr << __FILE__ <<
":" << __LINE__ <<
":";
203 cerr <<
"WARNING. For DmpContextualTwoStep, task parameters may not vary over time during training. Using task parameters at t=0 only." << endl;
208 inputs.row(i_demo) = cur_task_parameters_t0;
217 for (
int i_dim=0; i_dim<
dim_orig(); i_dim++)
219 int n_pol_pars = all_model_parameters[i_dim].cols();
220 for (
int i_pol_par=1; i_pol_par<n_pol_pars; i_pol_par++)
222 policy_parameter_function_[i_dim].push_back(policy_parameter_function_[i_dim][0]->
clone());
226 for (
int i_pol_par=0; i_pol_par<n_pol_pars; i_pol_par++)
228 MatrixXd targets = all_model_parameters[i_dim].col(i_pol_par);
233 string save_directory_cur;
234 if (!save_directory.empty())
235 save_directory_cur = save_directory +
"/dim" + to_string(i_dim) +
"_polpar" + to_string(i_pol_par);
237 policy_parameter_function_[i_dim][i_pol_par]->train(inputs,targets,save_directory_cur,overwrite);
245 template<
class Archive>
246 void DmpContextualTwoStep::serialize(Archive & ar,
const unsigned int version)
251 ar & BOOST_SERIALIZATION_NVP(policy_parameter_function_);
virtual void set_attractor_state(const Eigen::VectorXd &y_attr)
Accessor function for the attractor state of the system.
Trajectory class header file.
int dim_orig(void) const
Get the dimensionality of the dynamical system, i.e.
FunctionApproximator class header file.
virtual void set_tau(double tau)
Accessor function for the time constant.
bool isTrained(void) const
Return whether the DMP is trained or not.
void setParameterVectorSelected(const Eigen::VectorXd &values, bool normalized=false)
Set all the values of the selected parameters with one vector.
void computeFunctionApproximatorOutput(const Eigen::Ref< const Eigen::MatrixXd > &phase_state, Eigen::MatrixXd &fa_output) const
Compute the outputs of the function approximators.
void getParameterVectorSelected(Eigen::VectorXd &values, bool normalized=false) const
Get the values of the selected parameters in one vector.
Base class for all function approximators.
Implementation of Contextual Dynamical Movement Primitives.
virtual void predict(const Eigen::Ref< const Eigen::MatrixXd > &inputs, Eigen::MatrixXd &outputs)=0
Query the function approximator to make a prediction.
DmpType
Different types of DMPs that can be initialized.
void train(const std::vector< Trajectory > &trajectories, const std::vector< Eigen::MatrixXd > &task_parameters, std::string save_directory="", bool overwrite=true)
Train a contextual Dmp with a set of trajectories (and save results to file) This function is useful ...
virtual void train(const Trajectory &trajectory)
Train a DMP with a trajectory.
Contextual Dmp class header file.
Dmp * clone(void) const
Return a deep copy of this object.
FunctionApproximator * function_approximator(int i_dim) const
Get a pointer to the function approximator for a certain dimension.
virtual FunctionApproximator * clone(void) const =0
Return a pointer to a deep copy of the FunctionApproximator object.
Eigen::MatrixXd task_parameters_
The current task parameters.
void setSelectedParameters(const std::set< std::string > &selected_values_labels)
Determine which subset of parameters is represented in the vector returned by Parameterizable::getPar...
virtual void set_initial_state(const Eigen::VectorXd &y_init)
Accessor function for the initial state of the system.
int getParameterVectorSelectedSize(void) const
Get the size of the vector of selected parameters, as returned by getParameterVectorSelected(.
void checkTrainTrajectories(const std::vector< Trajectory > &trajectories)
Check if several trajectories have the same duration and initial/final states.
FunctionApproximatorLWR class header file.