31 #include <eigen3/Eigen/Core> 35 using namespace Eigen;
39 DmpContextual::DmpContextual(
int n_dims_dmp, std::vector<FunctionApproximator*> function_approximators,
DmpType dmp_type)
40 :
Dmp(n_dims_dmp, function_approximators, dmp_type)
68 void DmpContextual::train(
const std::vector<Trajectory>& trajectories,
const std::vector<Eigen::MatrixXd>& task_parameters, std::string save_directory)
70 bool overwrite =
false;
71 train(trajectories, task_parameters, save_directory, overwrite);
74 void DmpContextual::train(
const std::vector<Trajectory>& trajectories,
const std::vector<Eigen::MatrixXd>& task_parameters)
77 string save_directory(
"");
78 train(trajectories, task_parameters, save_directory, overwrite);
82 void DmpContextual::trainLocal(
const std::vector<Trajectory>& trajectories,
const std::vector<Eigen::MatrixXd>& task_parameters, std::string save_directory,
bool overwrite)
86 unsigned int n_demonstrations = trajectories.size();
87 assert(n_demonstrations==task_parameters.size());
90 int n_task_parameters = task_parameters[0].cols();
91 MatrixXd inputs(n_demonstrations,n_task_parameters);
92 for (
unsigned int i_demo=0; i_demo<n_demonstrations; i_demo++)
94 inputs.row(i_demo) = task_parameters[i_demo].row(0);
99 MatrixXd targets(n_demonstrations,
dim_orig());
100 for (
unsigned int i_demo=0; i_demo<n_demonstrations; i_demo++)
101 targets.row(i_demo) = trajectories[i_demo].final_y();
107 for (
int i_dim=0; i_dim<
dim_orig(); i_dim++)
109 string save_directory_cur;
110 if (!save_directory.empty())
111 save_directory_cur = save_directory +
"/dim" + to_string(i_dim) +
"_goal";
120 VectorXd targets(n_demonstrations);
121 for (
unsigned int i_demo=0; i_demo<n_demonstrations; i_demo++)
122 targets(i_demo) = trajectories[i_demo].duration();
127 string save_directory_cur;
128 if (!save_directory.empty())
129 save_directory_cur = save_directory +
"/_duration";
137 train(trajectories, task_parameters, save_directory, overwrite);
151 for (
int i_dim=0; i_dim<
dim_orig(); i_dim++)
154 goal(i_dim) = outputs(0,0);
163 MatrixXd duration_as_matrix;
165 set_tau(duration_as_matrix(0,0));
170 void DmpContextual::train(
const std::vector<Trajectory>& trajectories, std::string save_directory,
bool overwrite)
172 vector<MatrixXd> task_parameters(trajectories.size());
173 for (
unsigned int i_traj=0; i_traj<trajectories.size(); i_traj++)
175 task_parameters[i_traj] = trajectories[i_traj].misc();
176 assert(task_parameters[i_traj].cols()>0);
178 assert(task_parameters[i_traj].cols() == task_parameters[i_traj].cols());
180 trainLocal(trajectories, task_parameters, save_directory, overwrite);
185 bool overwrite=
false;
186 train(trajectories, save_directory, overwrite);
191 bool overwrite=
false;
192 string save_directory(
"");
193 train(trajectories, save_directory, overwrite);
200 unsigned int n_demonstrations = trajectories.size();
203 double first_duration = trajectories[0].duration();
204 VectorXd first_y_init = trajectories[0].initial_y();
205 VectorXd first_y_attr = trajectories[0].final_y();
206 for (
unsigned int i_demo=1; i_demo<n_demonstrations; i_demo++)
209 if (fabs(first_duration-trajectories[i_demo].duration())>10e-4)
213 cerr << __FILE__ <<
":" << __LINE__ <<
":";
214 cerr <<
"WARNING: Duration of demonstrations differ (" << first_duration <<
"!=" << trajectories[i_demo].duration() <<
")" << endl;
215 cerr <<
" See DmpContextual::set_policy_parameter_function_duration(...) on how to fix this. " << endl;
220 double sum_abs_diff = (first_y_init.array()-trajectories[i_demo].initial_y().array()).abs().sum();
221 if (sum_abs_diff>10e-7)
223 cerr << __FILE__ <<
":" << __LINE__ <<
":";
224 cerr <<
"WARNING: Initial states of demonstrations differ ( [" << first_y_init.transpose() <<
"] != [ " << trajectories[i_demo].initial_y().transpose() <<
"] )" << endl;
228 sum_abs_diff = (first_y_attr.array()-trajectories[i_demo].final_y().array()).abs().sum();
231 cerr << __FILE__ <<
":" << __LINE__ <<
":";
232 cerr <<
"WARNING: Final states of demonstrations differ ( [" << first_y_attr.transpose() <<
"] != [ " << trajectories[i_demo].final_y().transpose() <<
"] )" << endl;
233 cerr <<
" See DmpContextual::set_policy_parameter_function_goal(...) on how to fix this. " << endl;
virtual void set_attractor_state(const Eigen::VectorXd &y_attr)
Accessor function for the attractor state of the system.
Trajectory class header file.
Implementation of Dynamical Movement Primitives.
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.
virtual void train(const Eigen::Ref< const Eigen::MatrixXd > &inputs, const Eigen::Ref< const Eigen::MatrixXd > &targets)=0
Train the function approximator with corresponding input and target examples.
std::vector< FunctionApproximator * > policy_parameter_function_goal_
FunctionApproximators that relate task parameters the goal of the DMP.
FunctionApproximator * policy_parameter_function_duration_
FunctionApproximator that relates task parameters the duration of the DMP.
void set_policy_parameter_function_goal(FunctionApproximator *function_approximator)
Set a function approximator to predict the goal from the task parameters.
virtual void train(const std::vector< Trajectory > &trajectories, const std::vector< Eigen::MatrixXd > &task_parameters, std::string save_directory, bool overwrite)=0
Train a contextual Dmp with a set of trajectories (and save results to file) This function is useful ...
int getExpectedOutputDim(void) const
The expected dimensionality of the output data.
Base class for all function approximators.
void trainLocal(const std::vector< Trajectory > &trajectories, const std::vector< Eigen::MatrixXd > &task_parameters, std::string save_directory, bool overwrite)
Train a contextual DMP.
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.
Contextual Dmp class header file.
void set_policy_parameter_function_duration(FunctionApproximator *function_approximator)
Set a function approximator to predict the duration from the task parameters.
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 checkTrainTrajectories(const std::vector< Trajectory > &trajectories)
Check if several trajectories have the same duration and initial/final states.
void set_task_parameters(const Eigen::MatrixXd &task_parameters)
Set the current task parameters.