27 #include <boost/lexical_cast.hpp>
28 #include <boost/make_shared.hpp>
30 #include <VirtualRobot/RobotNodeSet.h>
32 #include "../Environment.h"
33 #include "../KinematicSolver.h"
34 #include "../Model/UserWaypoint.h"
35 #include <MMM/Motion/MotionReaderXML.h>
36 #include <MMM/Motion/Plugin/KinematicPlugin/KinematicSensor.h>
37 #include <MMM/Motion/Plugin/KinematicPlugin/KinematicSensorFactory.h>
38 #include <MMM/Motion/Plugin/ModelPosePlugin/ModelPoseSensor.h>
39 #include <MMM/RapidXML/RapidXMLReader.h>
40 #include <MMM/RapidXML/rapidxml.hpp>
42 static constexpr
const char* NODE_METADATA =
"RobotTrajectoryDesignerData";
43 static constexpr
const char* NODE_USERWAYPOINTS =
"UserWaypoints";
44 static constexpr
const char* NODE_USERWAYPOINT =
"UserWaypoint";
45 static constexpr
const char* NODE_JOINTANGLES =
"JointAngles";
46 static constexpr
const char* NODE_TIMEOPTIMALTIMESTAMP =
"TimeOptimalTimeStamp";
47 static constexpr
const char* NODE_ISBREAKPOINT =
"IsBreakPoint";
48 static constexpr
const char* NODE_IKSELECTION =
"CartesianSelection";
50 static constexpr
const char* NODE_TRANSITIONS =
"Transitions";
51 static constexpr
const char* NODE_TRANSITION =
"Transition";
52 static constexpr
const char* NODE_TIMEOPTIMALDURATION =
"TimeOptimalDuration";
53 static constexpr
const char* NODE_USERDURATION =
"UserDuration";
54 static constexpr
const char* NODE_INTERPOLATIONTYPE =
"InterpolationType";
56 static constexpr
const char* NODE_INTERBREAKPOINTTRAJECTORIES =
"InterBreakpointTrajectories";
57 static constexpr
const char* NODE_INTERBREAKPOINTTRAJECTORY =
"InterBreakpointTrajectory";
59 static constexpr
const char* NODE_ROBOT =
"Robot";
65 std::vector<armarx::DesignerTrajectoryPtr>
69 std::vector<std::string> libpaths;
70 MMM::MotionReaderXMLPtr motionReader = boost::make_shared<MMM::MotionReaderXML>(libpaths);
72 MMM::MotionList motions = motionReader->loadAllMotions(file,
true);
75 std::vector<DesignerTrajectoryPtr> trajectories;
76 std::set<std::string> nodeSets;
78 MMM::RapidXMLReaderPtr metaDataReader = MMM::RapidXMLReader::FromFile(file);
79 MMM::RapidXMLReaderNodePtr mmmNode = metaDataReader->getRoot();
80 MMM::RapidXMLReaderNodePtr metaDataNode = mmmNode->first_node(NODE_METADATA);
81 MMM::RapidXMLReaderNodePtr robotNode = metaDataNode->first_node(NODE_ROBOT);
82 if (robotNode->value() != environment->getRobot()->getFilename())
85 throw InvalidArgumentException(
"MMM file was exported for another robot");
87 for (MMM::MotionPtr motion : motions)
89 if (motion->getSensorsByType(
"ModelPoseSensor").size() >
96 MMM::SensorPtr sensor = motion->getSensorsByType(
"ModelPose")[0];
101 MMM::ModelPoseSensor mp =
dynamic_cast<MMM::ModelPoseSensor&
>(
103 MMM::ModelPoseSensorPtr modelPoseSensor = boost::make_shared<MMM::ModelPoseSensor>(mp);
104 if (!environment->getRobot()->hasRobotNodeSet(motion->getName()))
111 VirtualRobot::RobotNodeSetPtr rns =
112 environment->getRobot()->getRobotNodeSet(motion->getName());
113 MMM::RapidXMLReaderNodePtr trajectoryNode =
114 metaDataNode->first_node(motion->getName().c_str());
115 MMM::RapidXMLReaderNodePtr userWaypointsNode =
116 trajectoryNode->first_node(NODE_USERWAYPOINTS);
117 MMM::RapidXMLReaderNodePtr transitionsNode = trajectoryNode->first_node(NODE_TRANSITIONS);
119 MMM::RapidXMLReaderNodePtr userWaypointNode =
120 userWaypointsNode->first_node(NODE_USERWAYPOINT);
121 MMM::RapidXMLReaderNodePtr transitionNode = transitionsNode->first_node(NODE_TRANSITION);
122 std::vector<float> times = modelPoseSensor->getTimesteps();
123 std::vector<UserWaypointPtr> userPoints;
124 unsigned int breakpoints = 1;
126 for (
double t : times)
130 userWaypointNode = userWaypointNode->next_sibling(NODE_USERWAYPOINT);
132 MMM::ModelPoseSensorMeasurementPtr measurement =
133 modelPoseSensor->getDerivedMeasurement(t);
138 MMM::RapidXMLReaderNodePtr jointAnglesNode =
139 userWaypointNode->first_node(NODE_JOINTANGLES);
140 std::string jointAngleValues = jointAnglesNode->value();
142 std::istringstream js(jointAngleValues);
145 while (getline(js, j,
' '))
147 jointAngles.push_back(boost::lexical_cast<double>(j));
150 PoseBasePtr pose = ks->doForwardKinematicRelative(rns,
jointAngles);
152 userPoint->setUserTimestamp(t);
155 MMM::RapidXMLReaderNodePtr timeOptimalTimeStampNode =
156 userWaypointNode->first_node(NODE_TIMEOPTIMALTIMESTAMP);
157 userPoint->setTimeOptimalTimestamp(
158 boost::lexical_cast<double>(timeOptimalTimeStampNode->value()));
160 MMM::RapidXMLReaderNodePtr ikSelectionNode =
161 userWaypointNode->first_node(NODE_IKSELECTION);
162 userPoint->setIKSelection((
IKSelection)(std::stoi(ikSelectionNode->value())));
164 MMM::RapidXMLReaderNodePtr isTimeOptimalBreakPointNode =
165 userWaypointNode->first_node(NODE_ISBREAKPOINT);
166 userPoint->setIsTimeOptimalBreakpoint(
167 boost::lexical_cast<bool>(isTimeOptimalBreakPointNode->value()));
168 if (boost::lexical_cast<bool>(isTimeOptimalBreakPointNode->value()))
170 if (t > 0 && t != times.back())
175 userPoints.push_back(userPoint);
179 for (
unsigned int i = 0; i < userPoints.size(); i++)
183 trajectory->addLastUserWaypoint(userPoints[i]);
187 for (
unsigned int i = 0; i < userPoints.size() - 1; i++)
191 transitionNode = transitionNode->next_sibling(NODE_TRANSITION);
195 MMM::RapidXMLReaderNodePtr timeOptimalDurationNode =
196 transitionNode->first_node(NODE_TIMEOPTIMALDURATION);
197 transition->setTimeOptimalDuration(
198 boost::lexical_cast<double>(timeOptimalDurationNode->value()));
200 MMM::RapidXMLReaderNodePtr userDurationNode =
201 transitionNode->first_node(NODE_USERDURATION);
202 transition->setUserDuration(boost::lexical_cast<double>(userDurationNode->value()));
204 MMM::RapidXMLReaderNodePtr interpolationTypeNode =
205 transitionNode->first_node(NODE_INTERPOLATIONTYPE);
206 transition->setInterpolationType(
210 std::vector<armarx::TrajectoryPtr> interBreakpointTrajectories;
211 MMM::RapidXMLReaderNodePtr interBreakpointTrajectoriesNode =
212 trajectoryNode->first_node(NODE_INTERBREAKPOINTTRAJECTORIES);
213 MMM::RapidXMLReaderNodePtr interBreakpointTrajectoryNode =
214 interBreakpointTrajectoriesNode->first_node(NODE_INTERBREAKPOINTTRAJECTORY);
216 for (
unsigned int i = 0; i < breakpoints; i++)
220 interBreakpointTrajectoryNode =
221 interBreakpointTrajectoryNode->next_sibling(NODE_INTERBREAKPOINTTRAJECTORY);
223 MMM::KinematicSensorFactory factory;
224 MMM::SensorPtr sensorPtr = factory.createSensor(
225 interBreakpointTrajectoryNode->first_node(MMM::XML::NODE_SENSOR));
226 MMM::KinematicSensor interBreakpointTrajectorySensor =
227 dynamic_cast<MMM::KinematicSensor&
>(*sensorPtr);
228 std::vector<float> interBreakpointTimeStamps =
229 interBreakpointTrajectorySensor.getTimesteps();
230 std::vector<std::vector<double>> nodeData;
232 for (
unsigned int i = 0; i < rns->getSize(); i++)
234 MMM::KinematicSensorMeasurementPtr measurement =
235 interBreakpointTrajectorySensor.getDerivedMeasurement(0);
236 nodeData.push_back({measurement->getJointAngles()[i]});
239 for (
float t : interBreakpointTimeStamps)
241 if (t == interBreakpointTimeStamps[0])
245 MMM::KinematicSensorMeasurementPtr measurement =
246 interBreakpointTrajectorySensor.getDerivedMeasurement(t);
247 Eigen::VectorXf floatPositions = measurement->getJointAngles();
248 std::vector<double> doublePositions;
249 for (
int j = 0; j < floatPositions.size(); j++)
251 doublePositions.push_back(floatPositions[j]);
253 Eigen::VectorXd positions =
255 for (
unsigned int i = 0; i < positions.size(); i++)
257 nodeData[i].push_back(positions[i]);
261 Ice::StringSeq dimensionNames = rns->getNodeNames();
263 std::vector<double> doubleTimeStamps(interBreakpointTimeStamps.begin(),
264 interBreakpointTimeStamps.end());
266 interBreakpointTrajectories.push_back(traj);
268 trajectory->setInterBreakpointTrajectories(interBreakpointTrajectories);
269 trajectories.push_back(trajectory);
270 if (nodeSets.find(rns->getName()) != nodeSets.end())
273 trajectories.clear();
276 nodeSets.insert(rns->getName());
284 throw(
"Not implemented");