27 #include <boost/make_shared.hpp>
34 #include "../Model/DesignerTrajectory.h"
35 #include "../Model/UserWaypoint.h"
36 #include <MMM/Model/Model.h>
37 #include <MMM/Model/ModelReaderXML.h>
38 #include <MMM/Motion/Motion.h>
39 #include <MMM/Motion/MotionWriterXML.h>
40 #include <MMM/Motion/Plugin/KinematicPlugin/KinematicSensor.h>
41 #include <MMM/Motion/Plugin/ModelPosePlugin/ModelPoseSensor.h>
42 #include <MMM/RapidXML/rapidxml.hpp>
46 this->environment = environment;
51 const std::string file)
54 setlocale(LC_NUMERIC,
"en_US.UTF-8");
57 MMM::ModelReaderXMLPtr modelReader(
new MMM::ModelReaderXML());
58 MMM::ModelPtr modelptr = modelReader->loadModel(environment->getRobot()->getFilename());
59 MMM::MotionWriterXML motionWriter;
60 MMM::MotionList motions;
61 MMM::RapidXMLWriter writer;
62 MMM::RapidXMLWriterNodePtr metaDataNode = writer.createRootNode(
"RobotTrajectoryDesignerData");
63 metaDataNode->append_string_node(
"Robot", environment->getRobot()->getFilename());
64 MMM::Motion* kinematicMotion =
65 new MMM::Motion(
"RobotTrajectoryDesigner", modelptr, modelptr,
nullptr);
67 MMM::ModelPoseSensor kinematicModelPoseSensor = MMM::ModelPoseSensor(
"Model");
68 MMM::ModelPoseSensorMeasurementPtr kinematicModelPoseSensorMeasurement =
69 boost::make_shared<MMM::ModelPoseSensorMeasurement>(MMM::ModelPoseSensorMeasurement(
71 Eigen::Vector3f(1, 1, 1),
72 MMM::Math::matrix4fToEulerXZY(MMM::Math::quat2eigen4f(0, 0, 0, 0))));
73 kinematicModelPoseSensor.addSensorMeasurement(kinematicModelPoseSensorMeasurement);
74 kinematicMotion->addSensor(boost::make_shared<MMM::ModelPoseSensor>(kinematicModelPoseSensor),
77 MMM::MotionPtr mptr(kinematicMotion);
78 motions.push_back(mptr);
83 std::string location(TRAJECTORYDESIGNER_SOURCEDIR);
84 location +=
"/data/RobotTrajectoryDesigner/Resources/UserWaypoint.xml";
85 MMM::ModelPtr modelptr = modelReader->loadModel(location);
87 new MMM::Motion(trajectory->getRns()->getName(), modelptr, modelptr,
nullptr);
88 MMM::ModelPoseSensor modelPoseSensor =
89 MMM::ModelPoseSensor(trajectory->getRns()->getName());
91 std::vector<armarx::UserWaypointPtr> userWayPoints = trajectory->getAllUserWaypoints();
101 MMM::RapidXMLWriterNodePtr trajectoryNode =
102 metaDataNode->append_node(trajectory->getRns()->getName());
103 MMM::RapidXMLWriterNodePtr userWaypointsNode = trajectoryNode->append_node(
"UserWaypoints");
104 MMM::RapidXMLWriterNodePtr transitionsNode = trajectoryNode->append_node(
"Transitions");
109 armarx::Vector3BasePtr pos = userWayPoint->getPose()->position;
110 Eigen::Vector3f position = Eigen::Vector3f(pos->x, pos->y, pos->z);
111 armarx::QuaternionBasePtr quaternion = userWayPoint->getPose()->orientation;
113 quaternion->qx, quaternion->qy, quaternion->qz, quaternion->qw);
114 Eigen::Vector3f orientation = MMM::Math::matrix4fToEulerXZY(matrix);
116 MMM::ModelPoseSensorMeasurementPtr measurement =
117 boost::make_shared<MMM::ModelPoseSensorMeasurement>(MMM::ModelPoseSensorMeasurement(
118 userWayPoint->getUserTimestamp(), position, orientation));
120 modelPoseSensor.addSensorMeasurement(measurement);
121 MMM::RapidXMLWriterNodePtr userpointNode =
122 userWaypointsNode->append_node(
"UserWaypoint");
123 std::string jointAngleString;
124 for (
unsigned int j = 0; j < userWayPoints[
index]->getJointAngles().size(); j++)
127 boost::lexical_cast<std::string>(userWayPoints[
index]->getJointAngles()[j]) +
130 MMM::RapidXMLWriterNodePtr jointAngleNode = userpointNode->append_string_node(
131 "JointAngles", jointAngleString.substr(0, jointAngleString.size() - 1));
132 MMM::RapidXMLWriterNodePtr timeOptimalTimeStampNode = userpointNode->append_string_node(
133 "TimeOptimalTimeStamp",
134 boost::lexical_cast<std::string>(
135 (userWayPoints[
index]->getTimeOptimalTimestamp())));
136 MMM::RapidXMLWriterNodePtr breakpointNode = userpointNode->append_string_node(
139 MMM::RapidXMLWriterNodePtr cartesianSelectionNode = userpointNode->append_string_node(
140 "CartesianSelection",
143 for (
unsigned int index = 0;
index < trajectory->getNrOfUserWaypoints() - 1;
index++)
145 MMM::RapidXMLWriterNodePtr transitionNode = transitionsNode->append_node(
"Transition");
146 MMM::RapidXMLWriterNodePtr timeOptimalDurationNode = transitionNode->append_string_node(
147 "TimeOptimalDuration",
148 boost::lexical_cast<std::string>(
149 trajectory->getTransition(
index)->getTimeOptimalDuration()));
150 MMM::RapidXMLWriterNodePtr userDurationNode = transitionNode->append_string_node(
152 boost::lexical_cast<std::string>(
153 trajectory->getTransition(
index)->getUserDuration()));
154 MMM::RapidXMLWriterNodePtr interpolationTypeNode = transitionNode->append_string_node(
158 MMM::RapidXMLWriterNodePtr interBreakpointTrajectoriesNode =
159 trajectoryNode->append_node(
"InterBreakpointTrajectories");
160 for (
unsigned int index = 0;
index < trajectory->getInterBreakpointTrajectories().size();
163 MMM::RapidXMLWriterNodePtr interBreakpointTrajectoryNode =
164 interBreakpointTrajectoriesNode->append_node(
"InterBreakpointTrajectory");
165 MMM::KinematicSensorPtr interBreakpointSensor(
new MMM::KinematicSensor(
166 trajectory->getRns()->getNodeNames(), trajectory->getRns()->getName()));
167 for (
double t : trajectory->getInterBreakpointTrajectories()[
index]->getTimestamps())
169 std::vector<double> positions =
170 trajectory->getInterBreakpointTrajectories()[
index]->getStates(t, 0);
171 const Eigen::VectorXd vectord =
173 const Eigen::VectorXf vector = vectord.cast<
float>();
174 MMM::KinematicSensorMeasurement* measurement =
175 new MMM::KinematicSensorMeasurement(t, vector);
176 MMM::KinematicSensorMeasurementPtr measurementptr(measurement);
177 interBreakpointSensor->addSensorMeasurement(measurementptr);
179 interBreakpointSensor->setName(trajectory->getRns()->getName());
180 interBreakpointSensor->appendSensorXML(interBreakpointTrajectoryNode);
182 modelPoseSensor.setName(trajectory->getRns()->getName());
184 m->addSensor(boost::make_shared<MMM::ModelPoseSensor>(modelPoseSensor), 0);
186 MMM::MotionPtr mptr(m);
187 motions.push_back(mptr);
189 MMM::KinematicSensorPtr kinematicSensor(
new MMM::KinematicSensor(
190 trajectory->getRns()->getNodeNames(), trajectory->getRns()->getName()));
193 for (
double t : trajectory->getFinalTrajectory()->getTimestamps())
195 std::vector<double> positions = trajectory->getFinalTrajectory()->getStates(t, 0);
196 const Eigen::VectorXd vectord =
198 const Eigen::VectorXf vector = vectord.cast<
float>();
199 MMM::KinematicSensorMeasurement* measurement =
200 new MMM::KinematicSensorMeasurement(t, vector);
201 MMM::KinematicSensorMeasurementPtr measurementptr(measurement);
202 kinematicSensor->addSensorMeasurement(measurementptr);
204 kinematicSensor->setName(trajectory->getRns()->getName());
205 kinematicMotion->addSensor(kinematicSensor, 0);
211 std::string motionString = motionWriter.toXMLString(motions, file);
213 std::string metaDataString = writer.print(
false);
216 motionString = motionString.substr(0, motionString.find(
"</MMM>"));
218 metaDataString = metaDataString.substr(metaDataString.find(
"<RobotTrajectoryDesignerData"));
219 motionString = motionString + metaDataString +
'\n' +
"</MMM>";
222 QString xmlInput = QString::fromStdString(motionString);
224 QXmlStreamReader qxmlreader(xmlInput);
225 QXmlStreamWriter qxmlwriter(&xmlOutput);
226 qxmlwriter.setAutoFormatting(
true);
227 while (!qxmlreader.atEnd())
229 qxmlreader.readNext();
230 if (!qxmlreader.isWhitespace())
232 qxmlwriter.writeCurrentToken(qxmlreader);
236 std::ofstream output;
238 output << xmlOutput.toStdString();