32 #include "../config/PropertySource.h" 33 #include "../util/eigen_matnd.h" 35 #include <Rcs_macros.h> 57 Eigen::MatrixXd& out,
PropertySource* ps,
const char* property,
unsigned int expectedRows,
58 unsigned int expectedCols)
64 if (mat->m != expectedRows || mat->n != expectedCols) {
65 if (mat->size == expectedRows*expectedCols) {
67 mat->m = expectedRows;
68 mat->n = expectedCols;
73 std::ostringstream os;
74 os <<
"matrix dimension mismatch for " << property;
75 os <<
": expected " << expectedRows <<
"x" << expectedCols <<
" but got " << mat->m <<
"x" << mat->n;
76 throw std::invalid_argument(os.str());
101 if (mat->m != expectedSize || mat->n != 1) {
103 std::ostringstream os;
104 os <<
"vector dimension mismatch for " << property;
105 os <<
": expected " << expectedSize <<
"(x1)" <<
" but got " << mat->m <<
"x" << mat->n;
106 throw std::invalid_argument(os.str());
117 std::string functionName;
118 if (!properties->
getProperty(functionName,
"function")) {
119 throw std::invalid_argument(
"Missing function specification for the DynamicalSystem!");
123 std::unique_ptr<DynamicalSystem> ds;
125 if (functionName ==
"const") {
126 Eigen::VectorXd constVelocity;
128 throw std::invalid_argument(
"Missing constVelocity argument for DSVelocity dynamical system!");
130 ds.reset(
new DSConst(constVelocity));
132 else if (functionName ==
"lin") {
133 Eigen::MatrixXd errorDynamics;
134 if (!
getMatrixProperty(errorDynamics, properties,
"errorDynamics", innerTaskDim, innerTaskDim)) {
135 throw std::invalid_argument(
"Missing errorDynamics argument for DSLinear dynamical system!");
137 ds.reset(
new DSLinear(errorDynamics, Eigen::VectorXd::Zero(innerTaskDim)));
139 else if (functionName ==
"msd" or functionName ==
"msd_nlin") {
140 double attractorStiffness = 1;
141 properties->
getProperty(attractorStiffness,
"attractorStiffness");
150 std::vector<DSMassSpringDamper::Spring> repellers;
152 for (
auto rep:repSpec) {
155 throw std::invalid_argument(
"Missing position for repeller for DSMassSpringDamper dynamical system!");
158 rep->getProperty(s,
"stiffness");
159 repellers.emplace_back(zp, s);
162 if (functionName ==
"msd") {
167 else if (functionName ==
"msd_nlin") {
174 std::ostringstream os;
175 os <<
"Unsupported task function name: " << functionName;
176 throw std::invalid_argument(os.str());
180 Eigen::VectorXd goal;
190 return (
getGoal() - x_curr).norm();
205 Eigen::VectorXd x_ddot;
208 step(x_ddot, x_dot, x, dt);
225 void DSConst::step(Eigen::VectorXd& x_dot,
const Eigen::VectorXd& x,
double dt)
const 229 std::cout <<
"x =" << std::endl << x << std::endl;
230 std::cout <<
"constVelocity (DSConst) =" << std::endl <<
constVelocity << std::endl;
249 errorDynamics(errorDynamics), equilibriumPoint(equilibriumPoint) {}
256 void DSLinear::step(Eigen::VectorXd& x_dot,
const Eigen::VectorXd& x,
double dt)
const 260 std::cout <<
"x =" << std::endl << x << std::endl;
261 std::cout <<
"diff to goal (DSLinear) =" << std::endl <<
equilibriumPoint - x << std::endl;
281 const std::vector<DSMassSpringDamper::Spring>& repellers,
282 const double damping,
284 : attractorSpring(attractor), repellerSprings(repellers), damping(damping), mass(mass) {}
292 Eigen::VectorXd& x_ddot,
const Eigen::VectorXd& x_dot,
const Eigen::VectorXd& x,
295 Eigen::VectorXd sumSprings = Eigen::VectorXd::Zero(x.size());
299 double dist = diff.norm() + 1e-3;
302 sumSprings += stiffness*dist*diff/dist;
306 diff = spring.equilibriumPoint - x;
307 dist = diff.norm() + 1e-3;
308 stiffness = spring.stiffness;
310 sumSprings += -stiffness/dist*diff/dist;
318 std::cout <<
"diff to goal (DSMassSpringDamper) =" << std::endl << diff << std::endl;
319 std::cout <<
"x_ddot (DSMassSpringDamper) =" << std::endl << x_ddot << std::endl;
339 const std::vector<DSMassSpringDamperNonlinear::Spring>& repellers,
349 Eigen::VectorXd& x_ddot,
const Eigen::VectorXd& x_dot,
const Eigen::VectorXd& x,
352 Eigen::VectorXd sumSprings = Eigen::VectorXd::Zero(x.size());
356 double dist = fmax(diff.norm(), 5e-2);
359 sumSprings += stiffness*pow(dist, 0.5)*diff/dist;
363 diff = spring.equilibriumPoint - x;
364 dist = fmax(diff.norm(), 5e-2);
365 stiffness = spring.stiffness;
367 sumSprings += stiffness*pow(dist, 0.5)*diff/dist;
375 std::cout <<
"diff to goal (DSMassSpringDamperNonlinear) =" << std::endl << diff << std::endl;
376 std::cout <<
"x_ddot (DSMassSpringDamperNonlinear) =" << std::endl << x_ddot << std::endl;
398 void DSSlice::step(Eigen::VectorXd& x_dot,
const Eigen::VectorXd& x,
double dt)
const 401 Eigen::VectorXd x_dot_s = x_dot.segment(
offset,
length);
409 x_dot.setZero(x.size());
unsigned int getStateDim() const
virtual bool getProperty(std::string &out, const char *property)=0
void setGoal(const Eigen::VectorXd &x_des)
void copyMatNd2Eigen(M &dst, const MatNd *src)
DSMassSpringDamper(const Spring &attractor, const std::vector< Spring > &repellers, const double damping, const double mass=1.0)
DSSlice(DynamicalSystem *wrapped, unsigned int offset, unsigned int length)
constructor
virtual DynamicalSystem * clone() const =0
void step(Eigen::VectorXd &x_ddot, const Eigen::VectorXd &x_dot, const Eigen::VectorXd &x, double dt) const
DSConst(const Eigen::VectorXd &constVelocity)
static bool getMatrixProperty(Eigen::MatrixXd &out, PropertySource *ps, const char *property, unsigned int expectedRows, unsigned int expectedCols)
virtual double goalDistance(const Eigen::VectorXd &x_cur) const
std::vector< Spring > repellerSprings
repeller springs pushing the mass away from points in space (e.g. obstacles)
void step(Eigen::VectorXd &x_dot, const Eigen::VectorXd &x, double dt) const
virtual DynamicalSystem * clone() const
virtual void step(Eigen::VectorXd &x_dot, const Eigen::VectorXd &x, double dt) const
DSLinear(const Eigen::MatrixXd &errorDynamics, const Eigen::VectorXd &equilibriumPoint)
void setGoal(const Eigen::VectorXd &x_des)
virtual void setGoal(const Eigen::VectorXd &x_des)
virtual void step(Eigen::VectorXd &x_dot, const Eigen::VectorXd &x, double dt) const =0
Eigen::VectorXd equilibriumPoint
Zero position of the spring, force is applied to reach this state.
DynamicalSystem * getWrapped() const
Eigen::VectorXd x_dot_des
virtual DynamicalSystem * clone() const
virtual DynamicalSystem * clone() const
Eigen::MatrixXd errorDynamics
virtual DynamicalSystem * clone() const
virtual DynamicalSystem * clone() const
virtual const std::vector< PropertySource * > & getChildList(const char *prefix)=0
Eigen::VectorXd constVelocity
Eigen::VectorXd getGoal() const
static DynamicalSystem * create(PropertySource *properties, unsigned int innerTaskDim)
virtual void setGoal(const Eigen::VectorXd &x_des)=0
Spring attractorSpring
attractor spring pulling the mass to the goal poisiton (there is only one for every dynamical system)...
virtual Eigen::VectorXd getGoal() const =0
void step(Eigen::VectorXd &x_ddot, const Eigen::VectorXd &x_dot, const Eigen::VectorXd &x, double dt) const
virtual Eigen::VectorXd getGoal() const
Eigen::VectorXd getGoal() const
virtual void step(Eigen::VectorXd &x_dot, const Eigen::VectorXd &x, double dt) const
void step(Eigen::VectorXd &x_dot, const Eigen::VectorXd &x, double dt) const
double stiffness
Stiffness of the spring.
DSMassSpringDamperNonlinear(const Spring &attractor, const std::vector< Spring > &repellers, const double damping, const double mass=1.0)
void setGoal(const Eigen::VectorXd &x_des)
DynamicalSystem * wrapped
Eigen::VectorXd equilibriumPoint
virtual double goalDistance(const Eigen::VectorXd &x_curr) const
double damping
daming of the dynamical system (there is only one for every dynamical system)
Eigen::VectorXd getGoal() const
double mass
mass of the particle
static bool getVectorProperty(Eigen::VectorXd &out, PropertySource *ps, const char *property, unsigned int expectedSize)
Properties for one spring component.