예제 #1
0
 @Override
 public String toString() {
   return "Place " + nozzle + " " + nozzle.getNozzleTip().getName();
 }
  @Override
  public void feed(Nozzle nozzle) throws Exception {
    logger.debug("feed({})", nozzle);

    if (actuatorName == null) {
      throw new Exception("No actuator name set.");
    }

    Head head = nozzle.getHead();

    /*
     * TODO: We can optimize the feed process:
     * If we are already higher than the Z we will move to to index plus
     * the height of the tape, we don't need to Safe Z first.
     * There is also probably no reason to Safe Z after extracting the
     * pin since if the tool was going to hit it would have already hit.
     */

    Actuator actuator = head.getActuatorByName(actuatorName);

    if (actuator == null) {
      throw new Exception(
          String.format(
              "No Actuator found with name %s on feed Head %s", actuatorName, head.getName()));
    }

    head.moveToSafeZ(1.0);

    if (vision.isEnabled()) {
      if (visionOffset == null) {
        // This is the first feed with vision, or the offset has
        // been invalidated for some reason. We need to get an offset,
        // complete the feed operation and then get a new offset
        // for the next operation. By front loading this we make sure
        // that all future calls can go directly to the feed operation
        // and skip checking the vision first.
        logger.debug("First feed, running vision pre-flight.");

        visionOffset = getVisionOffsets(head, location);
      }
      logger.debug("visionOffsets " + visionOffset);
    }

    // Now we have visionOffsets (if we're using them) so we
    // need to create a local, offset version of the feedStartLocation,
    // feedEndLocation and pickLocation. pickLocation will be saved
    // for the pick operation while feed start and end are used
    // here and then discarded.
    Location feedStartLocation = this.feedStartLocation;
    Location feedEndLocation = this.feedEndLocation;
    pickLocation = this.location;
    if (visionOffset != null) {
      feedStartLocation = feedStartLocation.subtract(visionOffset);
      feedEndLocation = feedEndLocation.subtract(visionOffset);
      pickLocation = pickLocation.subtract(visionOffset);
    }

    // Move the actuator to the feed start location.
    actuator.moveTo(feedStartLocation.derive(null, null, Double.NaN, Double.NaN), 1.0);

    // extend the pin
    actuator.actuate(true);

    // insert the pin
    actuator.moveTo(feedStartLocation, 1.0);

    // drag the tape
    actuator.moveTo(feedEndLocation, feedSpeed);

    head.moveToSafeZ(1.0);

    // retract the pin
    actuator.actuate(false);

    if (vision.isEnabled()) {
      visionOffset = getVisionOffsets(head, location);

      logger.debug("final visionOffsets " + visionOffset);
    }

    logger.debug("Modified pickLocation {}", pickLocation);
  }