Class Triangulator

  • All Implemented Interfaces:
    java.lang.Cloneable, Actor, Executable, FiringsRecordable, Initializable, TypedActor, Changeable, Debuggable, DebugListener, Derivable, Instantiable, ModelErrorHandler, MoMLExportable, Moveable, Nameable

    public class Triangulator
    extends TypedAtomicActor
    Given inputs that represent the location of a sensor and the time at which those sensors detect an event, this actor outputs the location of the source of the event. It uses the specified signalPropagationSpeed and triangulates.

    The input is a record with two fields named "location" and "time". The location field is an array of doubles, and the time is a double. In the current implementation, the actor assumes a two-dimensional space, so the location field is assumed to be an array with two doubles, which represent the horizontal (east-west) and vertical (north-south) location of the sensor. The time field is assumed to be a double representing the time at which the event was detected by the sensor.

    The triangulation algorithm requires three distinct sensor inputs for the same event in order to be able to calculate the location of the origin of the event. Suppose that the event occurred at time t and location x. Suppose that three sensors at locations y1, y2, and y3 have each detected events at times t1, t2, and t3, respectively. Then this actor looks for a solution for x and t in the following equations:

    distance(x, y1)/v = t1 - t,
    distance(x, y2)/v = t2 - t,
    distance(x, y3)/v = t3 - t,
    where v is the value of propagationSpeed. If such a solution is found, then the output x is produced.

    Since three distinct observations are required, this actor will produce no output until it has received three distinct observations. The observations are distinct if the sensor locations are distinct. If the three observations yield no solution, then this actor will produce no output. However, it is possible for the three observations to come from distinct events, in which case the output may be erroneous. To guard against this, this actor provides a timeWindow parameter. The times of the three observations must be within the value of timeWindow, or no output will be produced. The output is an array of doubles, which in this implementation represent the X and Y locations of the event.

    Since:
    Ptolemy II 4.0
    Version:
    $Id$
    Author:
    Xiaojun Liu, Edward A. Lee
    Pt.AcceptedRating:
    Red (ptolemy)
    Pt.ProposedRating:
    Yellow (eal)
    • Field Detail

      • input

        public TypedIOPort input
        The input port for an event detection, which is a record containing the location of a sensor that has detected the event and the time at which the sensor detected the event. This has type {location = {double}, time = double} The location is assumed to have two entries.
      • output

        public TypedIOPort output
        The output producing the calculated event location. This has type {double}, a double array with two entries.
      • signalPropagationSpeed

        public Parameter signalPropagationSpeed
        Speed of propagation of the signal to be used for triangulation. This is a double that defaults to 344.0 (the speed of sound in air at room temperature, in meters per second).
      • timeWindow

        public Parameter timeWindow
        Time window within which observations are assumed to come from the same sound event. This is a double that defaults to 0.5 (in seconds).
    • Method Detail

      • clone

        public java.lang.Object clone​(Workspace workspace)
                               throws java.lang.CloneNotSupportedException
        Clone this actor into the specified workspace. This overrides the base class to handle private variables.
        Overrides:
        clone in class TypedAtomicActor
        Parameters:
        workspace - The workspace for the cloned object.
        Returns:
        A new ComponentEntity.
        Throws:
        java.lang.CloneNotSupportedException - If cloned ports cannot have as their container the cloned entity (this should not occur), or if one of the attributes cannot be cloned.
        See Also:
        NamedObj.exportMoML(Writer, int, String), NamedObj.setDeferringChangeRequests(boolean)
      • fire

        public void fire()
                  throws IllegalActionException
        Read all available input tokens and attempt to use them to triangulate the signal source. If the attempt is successful, then output the location of the signal source. Otherwise, output nothing. This method keeps a buffer of the three most recently seen inputs from distinct sensors (as determined by their locations). If a new input token has a location field that matches a location already in the buffer, then the new input simply replaces that previous observation. Otherwise, it replaces the oldest observation in the buffer. If there are three observations in the buffer with time stamps within the timeWindow parameter value, then triangulation is performed, and if the the three observations are consistent, then an output is produced.
        Specified by:
        fire in interface Executable
        Overrides:
        fire in class AtomicActor<TypedIOPort>
        Throws:
        IllegalActionException - If there is no director, or if the parameters cannot be evaluated.