6 Trajectory::Trajectory(std::vector<HebiTrajectoryPtr> trajectories,
size_t number_of_waypoints,
double start_time,
8 : trajectories_(trajectories),
9 number_of_joints_(trajectories.size()),
10 number_of_waypoints_(number_of_waypoints),
11 start_time_(start_time),
12 end_time_(end_time) {}
15 const MatrixXd* velocities,
16 const MatrixXd* accelerations) {
17 std::shared_ptr<Trajectory> res;
20 size_t num_joints = positions.rows();
21 size_t num_waypoints = positions.cols();
22 if (time_vector.size() != num_waypoints)
24 if (velocities !=
nullptr && (velocities->rows() != num_joints && velocities->cols() != num_waypoints))
26 if (accelerations !=
nullptr && (accelerations->rows() != num_joints && accelerations->cols() != num_waypoints))
28 if (num_waypoints < 2)
32 double* time_vector_c =
nullptr;
33 double* positions_c =
nullptr;
34 double* velocities_c =
nullptr;
35 double* accelerations_c =
nullptr;
36 time_vector_c =
new double[num_joints * num_waypoints];
38 Map<Matrix<double, Dynamic, Dynamic, RowMajor>> tmp(time_vector_c, num_waypoints, 1);
41 positions_c =
new double[num_joints * num_waypoints];
43 Map<Matrix<double, Dynamic, Dynamic, RowMajor>> tmp(positions_c, num_joints, num_waypoints);
46 if (velocities !=
nullptr) {
47 velocities_c =
new double[num_joints * num_waypoints];
48 Map<Matrix<double, Dynamic, Dynamic, RowMajor>> tmp(velocities_c, num_joints, num_waypoints);
51 if (accelerations !=
nullptr) {
52 accelerations_c =
new double[num_joints * num_waypoints];
53 Map<Matrix<double, Dynamic, Dynamic, RowMajor>> tmp(accelerations_c, num_joints, num_waypoints);
58 std::vector<HebiTrajectoryPtr> trajectories(num_joints,
nullptr);
59 for (
size_t i = 0; i < num_joints; ++i) {
61 num_waypoints, (positions_c + i * num_waypoints),
62 velocities_c ==
nullptr ?
nullptr : (velocities_c + i * num_waypoints),
63 accelerations_c ==
nullptr ?
nullptr : (accelerations_c + i * num_waypoints), time_vector_c);
65 if (trajectory ==
nullptr) {
66 for (
size_t j = 0; j < i; ++j) {
71 trajectories[i] = trajectory;
75 if (velocities_c !=
nullptr)
76 delete[] velocities_c;
77 if (accelerations_c !=
nullptr)
78 delete[] accelerations_c;
81 return std::shared_ptr<Trajectory>(
82 new Trajectory(trajectories, num_waypoints, time_vector[0], time_vector[time_vector.size() - 1]));
95 bool Trajectory::getState(
double time, VectorXd* position, VectorXd* velocity, VectorXd* acceleration)
const {
96 double tmp_p, tmp_v, tmp_a;
100 velocity ==
nullptr ? &tmp_v : &(*velocity)[i],
101 acceleration ==
nullptr ? &tmp_a : &(*acceleration)[i]) == 0) &&
HebiTrajectoryPtr hebiTrajectoryCreateUnconstrainedQp(size_t num_waypoints, const double *positions, const double *velocities, const double *accelerations, const double *time_vector)
Trajectory API.
double getDuration() const
The time (in seconds) between the start and end of this trajectory.
Trajectory(std::vector< HebiTrajectoryPtr > trajectories, size_t number_of_waypoints, double start_time, double end_time)
static std::shared_ptr< Trajectory > createUnconstrainedQp(const VectorXd &time_vector, const MatrixXd &positions, const MatrixXd *velocities=nullptr, const MatrixXd *accelerations=nullptr)
Creates a smooth trajectory through a set of waypoints (position velocity and accelerations defined a...
HebiStatusCode hebiTrajectoryGetState(HebiTrajectoryPtr trajectory, double time, double *position, double *velocity, double *acceleration)
Gets the value of the trajectory at a given time.
double hebiTrajectoryGetDuration(HebiTrajectoryPtr trajectory)
Returns the length of this trajectory (in seconds).
void hebiTrajectoryRelease(HebiTrajectoryPtr trajectory)
Frees resources created by this trajectory.
struct HebiTrajectory_ * HebiTrajectoryPtr
The C-style's API representation of a trajectory.
bool getState(double time, VectorXd *position, VectorXd *velocity, VectorXd *acceleration) const
Returns the position, velocity, and acceleration for a given point in time along the trajectory...
~Trajectory() noexcept
Destructor cleans up resources for trajectory.
std::vector< HebiTrajectoryPtr > trajectories_