3 #include <VirtualRobot/TimeOptimalTrajectory/Path.h>
10 #define TRAJECTORYCALCULATION_TIMESTEP 0.001
13 environment(environment)
19 std::vector<std::vector<double>>& trajectory,
20 std::vector<std::vector<double>>& userPoints,
21 VirtualRobot::RobotNodeSetPtr rns,
23 double accuracyFactor)
28 if (!environment->getRobot()->hasRobotNodeSet(rns))
30 throw InvalidArgumentException(
"Robot does not have the supplied robotnodeset!");
36 if (path.getLength() == 0)
39 std::vector<double> timestamps;
41 for (
unsigned int i = 0; i < userPoints.size(); i++)
43 timestamps.push_back(0.01 * i);
47 std::vector<std::vector<double>> nodeData;
48 for (
unsigned int i = 0; i < userPoints[0].size(); i++)
50 nodeData.push_back({userPoints[0][i]});
52 for (
unsigned int i = 1; i < userPoints.size(); i++)
54 for (
unsigned int j = 0; j < userPoints[0].size(); j++)
56 nodeData[j].push_back(userPoints[i][j]);
60 Ice::StringSeq dimensionNames = rns->getNodeNames();
72 std::vector<double> timestamps = std::vector<double>();
73 for (
unsigned int j = 0; j < trajectory.size(); j++)
75 timestamps.push_back(j * 0.01);
77 std::vector<std::vector<double>> nodeData = std::vector<std::vector<double>>();
78 for (
unsigned int i = 0; i < rns->getAllRobotNodes().size(); i++)
80 std::vector<double> node = std::vector<double>();
81 for (
unsigned int j = 0; j < trajectory.size(); j++)
83 node.push_back(trajectory[j][i]);
85 nodeData.push_back(node);
88 Ice::StringSeq dimensionNames = rns->getNodeNames();
92 LimitlessStateSeq state;
93 for (VirtualRobot::RobotNodePtr node : rns->getAllRobotNodes())
95 LimitlessState current;
96 current.enabled = node->isLimitless();
97 current.limitLo = node->getJointLimitLow();
98 current.limitHi = node->getJointLimitHigh();
99 state.push_back(current);
101 traj->setLimitless(state);
105 std::vector<std::vector<double>> newPathVector = std::vector<std::vector<double>>();
108 Eigen::MatrixXd trajMatrix = traj->toEigen();
109 for (
int i = 0; i < trajMatrix.rows(); i++)
112 std::vector<double> jA = std::vector<double>();
113 for (
int j = 0; j < trajMatrix.cols(); j++)
115 jA.push_back(trajMatrix(i, j));
118 newPathVector.push_back(jA);
124 std::vector<double> mVelocity;
125 std::vector<double> mAcceleration;
126 for (VirtualRobot::RobotNodePtr rn : rns->getAllRobotNodes())
128 if (rn->getMaxVelocity() == -1.0)
130 mVelocity.push_back(10);
134 mVelocity.push_back(rn->getMaxVelocity());
136 if (rn->getMaxAcceleration() == -1.0)
138 mAcceleration.push_back(10);
142 mAcceleration.push_back(rn->getMaxAcceleration());
146 const Eigen::VectorXd maxAcceleration =
153 VirtualRobot::TimeOptimalTrajectory timeOptimalTrajectory = VirtualRobot::TimeOptimalTrajectory(
154 unfoldedPath, maxVelocity, maxAcceleration, timeStep / accuracyFactor);
156 if (timeOptimalTrajectory.isValid() == 0)
159 throw InvalidArgumentException(
"Input trajectory can not generate a continuous path");
162 if (timeOptimalTrajectory.getDuration() <= 0 ||
163 std::isnan(timeOptimalTrajectory.getDuration()) ||
164 timeOptimalTrajectory.getDuration() >= HUGE_VAL)
167 throw InvalidArgumentException(
168 "Input trajectory can not generate a continuous path with positive real duration");
173 timeOptimalTrajectory, userPoints, rns, maxDeviation);