25 return Goal(Eigen::VectorXd(0),
29 Eigen::MatrixXd(0, 0));
34 return Goal(toVector(time),
38 Eigen::MatrixXd(0, 0));
44 return Goal(Eigen::VectorXd(0),
48 Eigen::MatrixXd(0, 0));
55 return Goal(toVector(time),
59 Eigen::MatrixXd(0, 0));
66 return Goal(Eigen::VectorXd(0),
70 Eigen::MatrixXd(0, 0));
78 return Goal(toVector(time),
82 Eigen::MatrixXd(0, 0));
87 const Eigen::VectorXd&
aux) {
88 return Goal(Eigen::VectorXd(0),
98 const Eigen::VectorXd&
aux) {
99 return Goal(toVector(time),
109 const Eigen::VectorXd&
aux) {
110 return Goal(Eigen::VectorXd(0),
121 const Eigen::VectorXd&
aux) {
122 return Goal(toVector(time),
133 const Eigen::VectorXd&
aux) {
134 return Goal(Eigen::VectorXd(0),
146 const Eigen::VectorXd&
aux) {
147 return Goal(toVector(time),
160 return Goal(Eigen::VectorXd(0),
164 Eigen::MatrixXd(0, 0));
174 Eigen::MatrixXd(0, 0));
180 return Goal(Eigen::VectorXd(0),
184 Eigen::MatrixXd(0, 0));
195 Eigen::MatrixXd(0, 0));
202 return Goal(Eigen::VectorXd(0),
206 Eigen::MatrixXd(0, 0));
218 Eigen::MatrixXd(0, 0));
223 const Eigen::MatrixXd&
aux) {
224 return Goal(Eigen::VectorXd(0),
234 const Eigen::MatrixXd&
aux) {
245 const Eigen::MatrixXd&
aux) {
246 return Goal(Eigen::VectorXd(0),
257 const Eigen::MatrixXd&
aux) {
269 const Eigen::MatrixXd&
aux) {
270 return Goal(Eigen::VectorXd(0),
282 const Eigen::MatrixXd&
aux) {
290 const Eigen::VectorXd&
times()
const {
return times_; }
291 const Eigen::MatrixXd&
positions()
const {
return positions_; }
292 const Eigen::MatrixXd&
velocities()
const {
return velocities_; }
294 const Eigen::MatrixXd&
aux()
const {
return aux_; }
301 std::tuple<std::shared_ptr<hebi::trajectory::Trajectory>, Eigen::MatrixXd, Eigen::VectorXd>
buildTrajectoryFrom(
const Eigen::VectorXd& start_pos,
302 const Eigen::VectorXd* start_vel,
303 const Eigen::VectorXd* start_accel,
304 const Eigen::VectorXd* vel_limits =
nullptr,
305 const Eigen::VectorXd* accel_limits =
nullptr)
const {
307 const auto num_joints = positions_.rows();
308 auto num_waypoints = positions_.cols() + 1;
309 if (start_pos.size() != num_joints) {
310 throw std::invalid_argument(
"start positions size must match number of joints in Goal object");
311 }
else if (start_vel !=
nullptr && start_vel->size() != num_joints) {
312 throw std::invalid_argument(
"start velocities size must match number of joints in Goal object");
313 }
else if (start_accel !=
nullptr && start_accel->size() != num_joints) {
314 throw std::invalid_argument(
"start accelerations size must match number of joints in Goal object");
315 }
else if (vel_limits !=
nullptr && vel_limits->size() != num_joints) {
316 throw std::invalid_argument(
"velocity limits size must match number of joints in Goal object");
317 }
else if (accel_limits !=
nullptr && accel_limits->size() != num_joints) {
318 throw std::invalid_argument(
"acceleration limits size must match number of joints in Goal object");
322 auto getWaypointTimes = [](
const Eigen::MatrixXd&
positions,
const Eigen::MatrixXd& ,
323 const Eigen::MatrixXd& ) {
324 double rampTime = 1.2;
328 Eigen::VectorXd
times(num_waypoints);
329 for (
size_t i = 0; i < num_waypoints; ++i)
330 times[i] = rampTime * (
double)i;
336 Eigen::VectorXd curr_vel = Eigen::VectorXd::Zero(num_joints);
337 Eigen::VectorXd curr_accel = Eigen::VectorXd::Zero(num_joints);
339 curr_vel = *start_vel;
341 curr_accel = *start_accel;
343 Eigen::MatrixXd
positions(num_joints, num_waypoints);
344 Eigen::MatrixXd
velocities(num_joints, num_waypoints);
353 positions.rightCols(num_waypoints - 1) = positions_;
354 velocities.rightCols(num_waypoints - 1) = velocities_;
358 Eigen::VectorXd waypoint_times(num_waypoints);
360 if (times_.size() == 0) {
363 waypoint_times(0) = 0;
364 waypoint_times.tail(num_waypoints - 1) = times_;
372 double vel_scaling = 1.0, accel_scaling = 1.0;
373 if (vel_limits !=
nullptr) {
375 Eigen::VectorXd vel_lim = vel_limits->unaryExpr([](
double x) {
376 return std::isnan(x) ? std::numeric_limits<double>::infinity() : x;
380 Eigen::VectorXd max_vel(num_joints);
381 trajectory->getMaxVelocity(max_vel);
384 vel_scaling = (max_vel.array() / vel_lim.array()).eval().maxCoeff();
385 vel_scaling = std::max(vel_scaling, 1.0);
387 if (accel_limits !=
nullptr) {
389 Eigen::VectorXd accel_lim = accel_limits->unaryExpr([](
double x) {
390 return std::isnan(x) ? std::numeric_limits<double>::infinity() : x;
394 Eigen::VectorXd max_acc(num_joints);
395 trajectory->getMaxAcceleration(max_acc);
398 accel_scaling = (max_acc.array() / accel_lim.array()).eval().maxCoeff();
399 accel_scaling = std::sqrt(std::max(accel_scaling, 1.0));
402 if (vel_scaling > 1.0 || accel_scaling > 1.0) {
403 double scaling_factor = std::max(vel_scaling, accel_scaling);
404 trajectory->rescale(scaling_factor);
407 Eigen::MatrixXd
aux(0,0);
408 Eigen::VectorXd aux_times(0);
411 if (aux_.rows() > 0 && (aux_.cols() + 1) == num_waypoints) {
412 aux.resize(aux_.rows(), aux_.cols() + 1);
413 aux.col(0).setConstant(std::numeric_limits<double>::quiet_NaN());
414 aux.rightCols(num_waypoints - 1) = aux_;
415 aux_times = waypoint_times;
418 return {trajectory,
aux, aux_times};
427 const Eigen::MatrixXd&
aux)
433 if (positions_.rows() != velocities_.rows() || positions_.rows() != accelerations_.rows() ||
434 positions_.cols() != velocities_.cols() || positions_.cols() != accelerations_.cols())
435 throw std::invalid_argument(
"Goal must have consistent position/velocity/acceleration sizes");
436 if (aux_.cols() != 0 && positions_.cols() != aux_.cols())
437 throw std::invalid_argument(
"Goal must have empty aux or aux consistent with number of waypoints");
441 static Eigen::MatrixXd nanWithZeroRight(
size_t num_joints,
size_t num_waypoints) {
442 double nan = std::numeric_limits<double>::quiet_NaN();
443 Eigen::MatrixXd matrix(num_joints, num_waypoints);
444 matrix.setConstant(nan);
445 matrix.rightCols<1>().setZero();
449 static Eigen::VectorXd toVector(
double scalar) {
450 Eigen::VectorXd vector(1);
455 static Eigen::MatrixXd toMatrix(
const Eigen::VectorXd& vector) {
456 Eigen::MatrixXd matrix(vector.size(), 1);
457 matrix.col(0) = vector;
461 const Eigen::VectorXd times_{0};
462 const Eigen::MatrixXd positions_{0, 0};
463 const Eigen::MatrixXd velocities_{0, 0};
464 const Eigen::MatrixXd accelerations_{0, 0};
465 const Eigen::MatrixXd aux_{0, 0};
static Goal createFromPositions(const Eigen::VectorXd ×, const Eigen::MatrixXd &positions)
Definition: goal.hpp:168
static Goal createFromPositionWithAux(const Eigen::VectorXd &positions, const Eigen::VectorXd &aux)
Definition: goal.hpp:86
static Goal createFromWaypoint(const Eigen::VectorXd &positions, const Eigen::VectorXd &velocities, const Eigen::VectorXd &accelerations)
Definition: goal.hpp:63
static Goal createFromWaypoint(double time, const Eigen::VectorXd &positions, const Eigen::VectorXd &velocities, const Eigen::VectorXd &accelerations)
Definition: goal.hpp:74
static Goal createFromPositionsWithAux(const Eigen::VectorXd ×, const Eigen::MatrixXd &positions, const Eigen::MatrixXd &aux)
Definition: goal.hpp:232
static Goal createFromWaypointsWithAux(const Eigen::MatrixXd &positions, const Eigen::MatrixXd &velocities, const Eigen::MatrixXd &aux)
Definition: goal.hpp:243
static Goal createFromWaypoints(const Eigen::VectorXd ×, const Eigen::MatrixXd &positions, const Eigen::MatrixXd &velocities)
Definition: goal.hpp:188
const Eigen::MatrixXd & positions() const
Definition: goal.hpp:291
static Goal createFromWaypointWithAux(double time, const Eigen::VectorXd &positions, const Eigen::VectorXd &velocities, const Eigen::VectorXd &accelerations, const Eigen::VectorXd &aux)
Definition: goal.hpp:142
static Goal createFromWaypointWithAux(double time, const Eigen::VectorXd &positions, const Eigen::VectorXd &velocities, const Eigen::VectorXd &aux)
Definition: goal.hpp:118
static Goal createFromPosition(const Eigen::VectorXd &positions)
Definition: goal.hpp:24
std::tuple< std::shared_ptr< hebi::trajectory::Trajectory >, Eigen::MatrixXd, Eigen::VectorXd > buildTrajectoryFrom(const Eigen::VectorXd &start_pos, const Eigen::VectorXd *start_vel, const Eigen::VectorXd *start_accel, const Eigen::VectorXd *vel_limits=nullptr, const Eigen::VectorXd *accel_limits=nullptr) const
Definition: goal.hpp:301
static Goal createFromWaypointsWithAux(const Eigen::VectorXd ×, const Eigen::MatrixXd &positions, const Eigen::MatrixXd &velocities, const Eigen::MatrixXd &accelerations, const Eigen::MatrixXd &aux)
Definition: goal.hpp:278
static Goal createFromWaypointsWithAux(const Eigen::MatrixXd &positions, const Eigen::MatrixXd &velocities, const Eigen::MatrixXd &accelerations, const Eigen::MatrixXd &aux)
Definition: goal.hpp:266
static Goal createFromWaypoints(const Eigen::VectorXd ×, const Eigen::MatrixXd &positions, const Eigen::MatrixXd &velocities, const Eigen::MatrixXd &accelerations)
Definition: goal.hpp:210
static Goal createFromWaypoint(const Eigen::VectorXd &positions, const Eigen::VectorXd &velocities)
Definition: goal.hpp:42
const Eigen::VectorXd & times() const
Definition: goal.hpp:290
static Goal createFromPositionWithAux(double time, const Eigen::VectorXd &positions, const Eigen::VectorXd &aux)
Definition: goal.hpp:96
const Eigen::MatrixXd & accelerations() const
Definition: goal.hpp:293
const Eigen::MatrixXd & aux() const
Definition: goal.hpp:294
static Goal createFromWaypoint(double time, const Eigen::VectorXd &positions, const Eigen::VectorXd &velocities)
Definition: goal.hpp:52
static Goal createFromPositions(const Eigen::MatrixXd &positions)
Definition: goal.hpp:159
static Goal createFromWaypoints(const Eigen::MatrixXd &positions, const Eigen::MatrixXd &velocities)
Definition: goal.hpp:178
static Goal createFromWaypointsWithAux(const Eigen::VectorXd ×, const Eigen::MatrixXd &positions, const Eigen::MatrixXd &velocities, const Eigen::MatrixXd &aux)
Definition: goal.hpp:254
static Goal createFromPositionsWithAux(const Eigen::MatrixXd &positions, const Eigen::MatrixXd &aux)
Definition: goal.hpp:222
static Goal createFromWaypointWithAux(const Eigen::VectorXd &positions, const Eigen::VectorXd &velocities, const Eigen::VectorXd &aux)
Definition: goal.hpp:107
static Goal createFromWaypoints(const Eigen::MatrixXd &positions, const Eigen::MatrixXd &velocities, const Eigen::MatrixXd &accelerations)
Definition: goal.hpp:199
static Goal createFromPosition(double time, const Eigen::VectorXd &positions)
Definition: goal.hpp:33
static std::shared_ptr< Trajectory > createUnconstrainedQp(const Eigen::VectorXd &time_vector, const Eigen::MatrixXd &positions, const Eigen::MatrixXd *velocities=nullptr, const Eigen::MatrixXd *accelerations=nullptr)
Creates a smooth trajectory through a set of waypoints (position velocity and accelerations defined a...
Definition: trajectory.cpp:17
const Eigen::MatrixXd & velocities() const
Definition: goal.hpp:292
static Goal createFromWaypointWithAux(const Eigen::VectorXd &positions, const Eigen::VectorXd &velocities, const Eigen::VectorXd &accelerations, const Eigen::VectorXd &aux)
Definition: goal.hpp:130