28 #include <eigen3/Eigen/Core> 34 using namespace Eigen;
38 DmpContextualOneStep::DmpContextualOneStep(
int n_dims_dmp, std::vector<FunctionApproximator*> function_approximators,
46 const Eigen::Ref<const Eigen::MatrixXd>& phase_state, Eigen::MatrixXd& fa_output)
const 48 int n_time_steps = phase_state.rows();
49 fa_output.resize(n_time_steps,
dim_orig());
53 if (task_parameters.rows()==1)
55 task_parameters = task_parameters.row(0).replicate(n_time_steps,1).eval();
57 else if (task_parameters.cols()==1)
59 task_parameters = task_parameters.col(0).transpose().replicate(n_time_steps,1).eval();
64 assert(n_time_steps==task_parameters.rows());
66 int n_task_parameters = task_parameters.cols();
67 MatrixXd fa_input(n_time_steps,n_task_parameters+1);
68 fa_input << phase_state, task_parameters;
71 MatrixXd output(n_time_steps,1);
81 fa_output.col(dd) = output;
88 void DmpContextualOneStep::train(
const vector<Trajectory>& trajectories,
const vector<MatrixXd>& task_parameters,
string save_directory,
bool overwrite)
91 unsigned int n_demonstrations = trajectories.size();
92 assert(n_demonstrations==task_parameters.size());
99 set_tau(trajectories[0].duration());
103 MatrixXd all_fa_inputs(0,0);
104 MatrixXd all_fa_targets(0,0);
105 int n_task_parameters = -1;
106 int n_time_steps_total = 0;
108 VectorXd cur_fa_input_phase;
109 MatrixXd cur_fa_target;
110 MatrixXd cur_task_parameters;
111 for (
unsigned int i_demo=0; i_demo<n_demonstrations; i_demo++)
113 cur_task_parameters = task_parameters[i_demo];
116 n_task_parameters = cur_task_parameters.cols();
125 assert(n_task_parameters==cur_task_parameters.cols());
128 int n_time_steps = trajectories[i_demo].length();
129 n_time_steps_total += n_time_steps;
132 if (cur_task_parameters.rows()==1 && n_time_steps>1) {
133 MatrixXd cur_task_parameters_tmp = cur_task_parameters.replicate(n_time_steps,1);
134 cur_task_parameters = cur_task_parameters_tmp;
136 assert(n_time_steps==cur_task_parameters.rows());
140 all_fa_inputs.conservativeResize(n_time_steps_total,1+n_task_parameters);
142 all_fa_inputs.bottomLeftCorner(n_time_steps,1) = cur_fa_input_phase;
143 all_fa_inputs.bottomRightCorner(n_time_steps,n_task_parameters) = cur_task_parameters;
145 all_fa_targets.conservativeResize(n_time_steps_total,
dim_orig());
146 all_fa_targets.bottomRows(n_time_steps) = cur_fa_target;
155 string save_directory_dim;
156 if (!save_directory.empty())
159 save_directory_dim = save_directory;
161 save_directory_dim = save_directory +
"/dim" + to_string(dd);
164 VectorXd fa_target = all_fa_targets.col(dd);
virtual void set_attractor_state(const Eigen::VectorXd &y_attr)
Accessor function for the attractor state of the system.
Contextual Dmp class header file.
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.
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.
void computeFunctionApproximatorInputsAndTargets(const Trajectory &trajectory, Eigen::VectorXd &fa_inputs_phase, Eigen::MatrixXd &fa_targets) const
Given a trajectory, compute the inputs and targets for the function approximators.
void train(const std::vector< Trajectory > &trajectories, const std::vector< Eigen::MatrixXd > &task_parameters, std::string save_directory="", bool overwrite=false)
Train a contextual Dmp with a set of trajectories (and save results to file) This function is useful ...
bool isTrained(void) const
Determine whether the function approximator has already been trained with data or not...
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 computeFunctionApproximatorOutput(const Eigen::Ref< const Eigen::MatrixXd > &phase_state, Eigen::MatrixXd &fa_output) const
Compute the outputs of the function approximators.
FunctionApproximator * function_approximator(int i_dim) const
Get a pointer to the function approximator for a certain dimension.
Eigen::MatrixXd task_parameters_
The current task parameters.
virtual void set_initial_state(const Eigen::VectorXd &y_init)
Accessor function for the initial state of the system.
void checkTrainTrajectories(const std::vector< Trajectory > &trajectories)
Check if several trajectories have the same duration and initial/final states.