@Override public String getTrajectoryDescription() { StringBuilder sb = new StringBuilder(); Point2D last = null; double lastOrientation = 0; double lastTimestamp = 0; Map<String, String> params = new HashMap<String, String>(); for (KeyFrame frame : frames) { writeLine(sb, frame); if (frame.hasComments()) { ArrayList<String> comments = frame.getComments(); for (String s : comments) { addParameters(params, s); } } TrajectoryMovement movement = frame.getMovement(); switch (movement) { case START: last = frame.getPosition(); lastOrientation = frame.getOrientation(); sb.append(String.format("// start at %s\r\n", last.toString())); break; case BEZIER: break; case CLOTHOID: break; case LINE: Point2D p = frame.getPosition(); double distance = p.distance(last); double speed = frame.getMovementSpeed(); String direction = speed > 0 ? "forward" : "backward"; addComments( params, String.format( "// move %s of %.0f mm (%.0f)", direction, distance, 9.557 * distance * Math.signum(speed)), true); addValue(params, KEY_DISTANCE, 9.557 * distance * Math.signum(speed)); last = p; break; case NONE: // double delay = frame.getTimestamp() - lastTimestamp; // addComments(params, String.format("delay_ms(%.0f);", delay * 1000), true); break; case ROTATION: double o = frame.getOrientation(); double angle = Angle.getRotationAngle(lastOrientation, o); if (frame.useRelativeAngle()) { // the angle is a relative angle that can be > 180° angle = frame.getRelativeAngle(); } angle = Math.toDegrees(angle); addComments( params, String.format("// rotation of %.0f° (%.0f)", angle, 22527.5d / 360d * angle), true); addValue(params, KEY_ANGLE, 22527.5d / 360d * angle); if (params.containsKey(KEY_ORIENTATION)) { double opposite = getDoubleValue(params, KEY_ORIENTATION); opposite = Math.toDegrees(opposite); addValue(params, KEY_ORIENTATION, 22527.5d / 360d * opposite); } lastOrientation = o; break; default: break; } lastTimestamp = frame.getTimestamp(); writeCommands(sb, params); } return sb.toString(); }