37 TimeIndexedSamplingProblem::TimeIndexedSamplingProblem()
42 TimeIndexedSamplingProblem::~TimeIndexedSamplingProblem() =
default;
44 std::vector<double> TimeIndexedSamplingProblem::GetBounds()
46 std::vector<double> bounds;
47 auto joint_limits = scene_->GetKinematicTree().GetJointLimits();
50 for (
unsigned int i = 0; i < N; ++i)
52 bounds[i] = joint_limits(i, 0);
53 bounds[i + N] = joint_limits(i, 1);
59 void TimeIndexedSamplingProblem::Instantiate(
const TimeIndexedSamplingProblemInitializer& init)
63 if (init.Goal.size() == N)
67 else if (init.Goal.size() == 0)
69 goal_ = Eigen::VectorXd::Zero(N);
73 ThrowNamed(
"Dimension mismatch: problem N=" << N <<
", but goal state has dimension " << goal_.rows());
76 t_goal_ = init.GoalTime;
77 if (t_goal_ <= t_start)
78 ThrowNamed(
"Invalid goal time t_goal= " << t_goal_ <<
", where t_start=" << t_start);
80 if (init.JointVelocityLimits.size() == N)
82 vel_limits = init.JointVelocityLimits;
84 else if (init.JointVelocityLimits.size() == 1)
86 vel_limits = init.JointVelocityLimits(0) * Eigen::VectorXd::Ones(N);
90 ThrowNamed(
"Dimension mismatch: problem N=" << N <<
", but joint velocity limits has dimension " << vel_limits.rows());
93 num_tasks = tasks_.size();
96 for (
int i = 0; i < num_tasks; ++i)
99 length_Phi += tasks_[i]->length;
100 length_jacobian += tasks_[i]->length_jacobian;
102 Phi.SetZero(length_Phi);
104 inequality.Initialize(init.Inequality, shared_from_this(), constraint_phi);
105 inequality.tolerance = init.ConstraintTolerance;
106 equality.Initialize(init.Equality, shared_from_this(), constraint_phi);
107 equality.tolerance = init.ConstraintTolerance;
109 ApplyStartState(
false);
111 if (scene_->GetKinematicTree().GetControlledBaseType() !=
exotica::BaseType::FIXED && init.FloatingBaseLowerLimits.rows() > 0 && init.FloatingBaseUpperLimits.rows() > 0)
113 if (scene_->GetKinematicTree().GetControlledBaseType() ==
exotica::BaseType::FLOATING && init.FloatingBaseLowerLimits.rows() == 6 && init.FloatingBaseUpperLimits.rows() == 6)
115 scene_->GetKinematicTree().SetFloatingBaseLimitsPosXYZEulerZYX(
116 std::vector<double>(init.FloatingBaseLowerLimits.data(), init.FloatingBaseLowerLimits.data() + init.FloatingBaseLowerLimits.size()),
117 std::vector<double>(init.FloatingBaseUpperLimits.data(), init.FloatingBaseUpperLimits.data() + init.FloatingBaseUpperLimits.size()));
119 else if (scene_->GetKinematicTree().GetControlledBaseType() ==
exotica::BaseType::PLANAR && init.FloatingBaseLowerLimits.rows() == 3 && init.FloatingBaseUpperLimits.rows() == 3)
121 scene_->GetKinematicTree().SetPlanarBaseLimitsPosXYEulerZ(
122 std::vector<double>(init.FloatingBaseLowerLimits.data(), init.FloatingBaseLowerLimits.data() + init.FloatingBaseLowerLimits.size()),
123 std::vector<double>(init.FloatingBaseUpperLimits.data(), init.FloatingBaseUpperLimits.data() + init.FloatingBaseUpperLimits.size()));
134 double TimeIndexedSamplingProblem::GetGoalTime()
const 139 void TimeIndexedSamplingProblem::SetGoalTime(
const double& t)
144 Eigen::VectorXd TimeIndexedSamplingProblem::GetGoalState()
const 152 ThrowPretty(
"Dimensionality of goal state wrong: Got " << qT.rows() <<
", expected " << N);
158 for (
int i = 0; i < equality.indexing.size(); ++i)
160 if (equality.tasks[i]->GetObjectName() == task_name)
162 if (goal.rows() != equality.indexing[i].length)
ThrowPretty(
"Expected length of " << equality.indexing[i].length <<
" and got " << goal.rows());
163 equality.y.data.segment(equality.indexing[i].start, equality.indexing[i].length) = goal;
167 ThrowPretty(
"Cannot set Goal. Task map '" << task_name <<
"' does not exist.");
170 void TimeIndexedSamplingProblem::SetRhoEQ(
const std::string& task_name,
const double& rho)
172 for (
int i = 0; i < equality.indexing.size(); ++i)
174 if (equality.tasks[i]->GetObjectName() == task_name)
176 equality.rho(equality.indexing[i].id) = rho;
181 ThrowPretty(
"Cannot set rho. Task map '" << task_name <<
"' does not exist.");
184 Eigen::VectorXd TimeIndexedSamplingProblem::GetGoalEQ(
const std::string& task_name)
186 for (
int i = 0; i < equality.indexing.size(); ++i)
188 if (equality.tasks[i]->GetObjectName() == task_name)
190 return equality.y.data.segment(equality.indexing[i].start, equality.indexing[i].length);
193 ThrowPretty(
"Cannot get Goal. Task map '" << task_name <<
"' does not exist.");
196 double TimeIndexedSamplingProblem::GetRhoEQ(
const std::string& task_name)
198 for (
int i = 0; i < equality.indexing.size(); ++i)
200 if (equality.tasks[i]->GetObjectName() == task_name)
202 return equality.rho(equality.indexing[i].id);
205 ThrowPretty(
"Cannot get rho. Task map '" << task_name <<
"' does not exist.");
210 for (
int i = 0; i < inequality.indexing.size(); ++i)
212 if (inequality.tasks[i]->GetObjectName() == task_name)
214 if (goal.rows() != inequality.indexing[i].length)
ThrowPretty(
"Expected length of " << inequality.indexing[i].length <<
" and got " << goal.rows());
215 inequality.y.data.segment(inequality.indexing[i].start, inequality.indexing[i].length) = goal;
219 ThrowPretty(
"Cannot set Goal. Task map '" << task_name <<
"' does not exist.");
222 void TimeIndexedSamplingProblem::SetRhoNEQ(
const std::string& task_name,
const double& rho)
224 for (
int i = 0; i < inequality.indexing.size(); ++i)
226 if (inequality.tasks[i]->GetObjectName() == task_name)
228 inequality.rho(inequality.indexing[i].id) = rho;
233 ThrowPretty(
"Cannot set rho. Task map '" << task_name <<
"' does not exist.");
236 Eigen::VectorXd TimeIndexedSamplingProblem::GetGoalNEQ(
const std::string& task_name)
238 for (
int i = 0; i < inequality.indexing.size(); ++i)
240 if (inequality.tasks[i]->GetObjectName() == task_name)
242 return inequality.y.data.segment(inequality.indexing[i].start, inequality.indexing[i].length);
245 ThrowPretty(
"Cannot get Goal. Task map '" << task_name <<
"' does not exist.");
248 double TimeIndexedSamplingProblem::GetRhoNEQ(
const std::string& task_name)
250 for (
int i = 0; i < inequality.indexing.size(); ++i)
252 if (inequality.tasks[i]->GetObjectName() == task_name)
254 return inequality.rho(inequality.indexing[i].id);
257 ThrowPretty(
"Cannot get rho. Task map '" << task_name <<
"' does not exist.");
262 scene_->Update(x, t);
263 for (
int i = 0; i < num_tasks; ++i)
265 if (tasks_[i]->is_used)
266 tasks_[i]->Update(x, Phi.data.segment(tasks_[i]->start, tasks_[i]->length));
268 inequality.Update(Phi);
269 equality.Update(Phi);
270 ++number_of_problem_updates_;
272 bool inequality_is_valid = ((inequality.S * inequality.ydiff).array() <= 0.0).all();
273 bool equality_is_valid = ((equality.S * equality.ydiff).array().abs() == 0.0).all();
277 HIGHLIGHT_NAMED(
"TimeIndexedSamplingProblem::IsValid",
"Equality valid? = " << equality_is_valid <<
"\tInequality valid? = " << inequality_is_valid);
280 return (inequality_is_valid && equality_is_valid);
283 void TimeIndexedSamplingProblem::PreUpdate()
285 PlanningProblem::PreUpdate();
286 for (
int i = 0; i < tasks_.size(); ++i) tasks_[i]->is_used =
false;
287 inequality.UpdateS();
294 ++number_of_problem_updates_;
297 int TimeIndexedSamplingProblem::GetSpaceDim()
const Eigen::Ref< const Eigen::VectorXd > & VectorXdRefConst
Convenience wrapper for storing references to sub-matrices/vectors.
#define HIGHLIGHT_NAMED(name, x)
void AppendVector(std::vector< Val > &orig, const std::vector< Val > &extra)
#define REGISTER_PROBLEM_TYPE(TYPE, DERIV)