jAER project on SourceForge

ch.unizh.ini.jaer.projects.wingtracker
Class WingTracker

java.lang.Object
  extended by net.sf.jaer.eventprocessing.EventFilter
      extended by net.sf.jaer.eventprocessing.EventFilter2D
          extended by ch.unizh.ini.jaer.projects.wingtracker.WingTracker
All Implemented Interfaces:
java.util.Observer, FrameAnnotater

public class WingTracker
extends EventFilter2D
implements FrameAnnotater, java.util.Observer

Tracks a fruit fly wing beat in two different ways, after a initialization phase. Begin with the method track, there the events are classified to the right edge and depending on the state the evaluation goes on. So there are different states in this "filter": initialization: data are recorded(a hardcoded number of events in the method track() with state = Init) and then an analysis is done for this data. First there is a 2-means algorithm(method kmeans) to localize the 2 wings. afterwards basic geometry is used to calculate the bodyposition and the heading of the fly. This is done in the method findFly(). Tracking: every event changes the actual position of the correspoinding wingedge with a lowpassfilter. This is done in the method track() with the state = TRACKING. Kalman: the second way to track is with a extended Kalman Filter. Every event is taken as an measurement for the filter. First in the method track the events is classified in left/right wing and leading/trailing edge. There are 4 instances of the inner class EKF which supports data for each wingedge. The prediction and update are methods of this inner class.


Nested Class Summary
 class WingTracker.EKF
          This class serves as datastructure for the Kalman Filter for all the wing-edges.
 class WingTracker.EKFParameterWindow
           
 
Field Summary
 
Fields inherited from class net.sf.jaer.eventprocessing.EventFilter2D
enclosedFilter, out
 
Fields inherited from class net.sf.jaer.eventprocessing.EventFilter
annotationEnabled, enclosedFilterChain, filterEnabled, log, perf, propertyTooltipMap, support
 
Constructor Summary
WingTracker(AEChip chip)
           
 
Method Summary
 void annotate(float[][][] frame)
          annotate the rendered retina frame to show locations of clusters
 void annotate(javax.media.opengl.GLAutoDrawable drawable)
          Each annotator enters annotate with graphics context current, in coordinates with pixel 0,0 in LL corner (note opposite from Java2D) and pixel spacing 1 unit after the scaling transform (which is already active).
 void annotate(java.awt.Graphics2D g)
          each annotator is called by the relevant class (e.g.
 EventPacket filterPacket(EventPacket in)
          Subclasses implement this method to define custom processing.
 boolean getdoBodyUpdate()
           
 boolean getdoHeadingUpdate()
           
 boolean getDoLog()
           
 java.lang.Object getFilterState()
          should return the filter state in some useful form
 boolean getFlipHeading()
           
 float getHysteresis()
           
 float getMixingFactor()
           
 int getNbEventsToCollectPerEdge()
           
 float getSearchRangeOffset()
           
 boolean getShowEKFParameterWindow()
           
 boolean getUseKalmanFiltering()
           
 void initFilter()
          Does nothing.
 boolean isGeneratingFilter()
           
 void resetFilter()
          should reset the filter to initial state
 void setdoBodyUpdate(boolean doBodyUpdate)
           
 void setdoHeadingUpdate(boolean doHeadingUpdate)
           
 void setDoLog(boolean doLog)
           
 void setFlipHeading(boolean flipHeading)
           
 void setHysteresis(float hysteresis)
           
 void setMixingFactor(float mixingFactor)
           
 void setNbEventsToCollectPerEdge(int nbEventsToCollectPerEdge)
           
 void setSearchRangeOffset(float searchRangeOffset)
           
 void setShowEKFParameterWindow(boolean showEKFParameterWindow)
           
 void setUseKalmanFiltering(boolean useKalmanFiltering)
           
 void update(java.util.Observable o, java.lang.Object arg)
           
 
Methods inherited from class net.sf.jaer.eventprocessing.EventFilter2D
checkOutputPacketEventType, checkOutputPacketEventType, getEnclosedFilter, resetOut, setEnclosedFilter, setFilterEnabled
 
Methods inherited from class net.sf.jaer.eventprocessing.EventFilter
getChip, getDescription, getEnclosedFilterChain, getEnclosingFilter, getPrefs, getPropertyChangeSupport, getPropertyTooltip, isAnnotationEnabled, isEnclosed, isFilterEnabled, prefsEnabledKey, setAnnotationEnabled, setChip, setEnclosed, setEnclosedFilter, setEnclosedFilterChain, setEnclosingFilter, setPreferredEnabledState, setPrefs, setPropertyTooltip
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface net.sf.jaer.graphics.FrameAnnotater
isAnnotationEnabled, setAnnotationEnabled
 

Constructor Detail

WingTracker

public WingTracker(AEChip chip)
Method Detail

initFilter

public void initFilter()
Does nothing.

Specified by:
initFilter in class EventFilter

getFilterState

public java.lang.Object getFilterState()
Description copied from class: EventFilter
should return the filter state in some useful form

Specified by:
getFilterState in class EventFilter
Returns:
The state of the tracker. The state is an element of an enumaration.

isGeneratingFilter

public boolean isGeneratingFilter()

resetFilter

public void resetFilter()
Description copied from class: EventFilter
should reset the filter to initial state

Specified by:
resetFilter in class EventFilter

filterPacket

public EventPacket filterPacket(EventPacket in)
Description copied from class: EventFilter2D
Subclasses implement this method to define custom processing.

Specified by:
filterPacket in class EventFilter2D
Parameters:
in - the input packet
Returns:
the output packet

update

public void update(java.util.Observable o,
                   java.lang.Object arg)
Specified by:
update in interface java.util.Observer

annotate

public void annotate(java.awt.Graphics2D g)
Description copied from interface: FrameAnnotater
each annotator is called by the relevant class (e.g. EyeTracker) and enters annotate with graphics context current, in coordinates with pixel 0,0 in UL corner and pixel spacing 1 unit before scaling transform (which is already active).

Specified by:
annotate in interface FrameAnnotater
Parameters:
g - the Graphics2D context

annotate

public void annotate(javax.media.opengl.GLAutoDrawable drawable)
Description copied from interface: FrameAnnotater
Each annotator enters annotate with graphics context current, in coordinates with pixel 0,0 in LL corner (note opposite from Java2D) and pixel spacing 1 unit after the scaling transform (which is already active). The FrameAnnotater then can use JOGL calls to render to the screen by getting the GL context, e.g. the following code, used in the context of an AEChip object, draws a golden lines from LL to UR of the pixel array.
        GL gl = drawable.getGL();
        gl.glBegin(GL.GL_LINES);
        gl.glColor3f(.5f, .5f, 0);
        gl.glVertex2f(0, 0);
        gl.glVertex2f(getSizeX() - 1, getSizeY() - 1);
        gl.glEnd();
 

Specified by:
annotate in interface FrameAnnotater
Parameters:
drawable - the OpenGL drawable components, e.g., GLCanvas

annotate

public void annotate(float[][][] frame)
annotate the rendered retina frame to show locations of clusters

Specified by:
annotate in interface FrameAnnotater
Parameters:
frame - the RGB pixel information. First dimension is Y, second is X, third is RGB

setDoLog

public void setDoLog(boolean doLog)

getDoLog

public boolean getDoLog()

getMixingFactor

public float getMixingFactor()

setMixingFactor

public void setMixingFactor(float mixingFactor)

getHysteresis

public float getHysteresis()

setHysteresis

public void setHysteresis(float hysteresis)

getSearchRangeOffset

public float getSearchRangeOffset()

setSearchRangeOffset

public void setSearchRangeOffset(float searchRangeOffset)

setdoBodyUpdate

public void setdoBodyUpdate(boolean doBodyUpdate)

getdoBodyUpdate

public boolean getdoBodyUpdate()

setdoHeadingUpdate

public void setdoHeadingUpdate(boolean doHeadingUpdate)

getdoHeadingUpdate

public boolean getdoHeadingUpdate()

setUseKalmanFiltering

public void setUseKalmanFiltering(boolean useKalmanFiltering)

getUseKalmanFiltering

public boolean getUseKalmanFiltering()

getNbEventsToCollectPerEdge

public int getNbEventsToCollectPerEdge()

setNbEventsToCollectPerEdge

public void setNbEventsToCollectPerEdge(int nbEventsToCollectPerEdge)

setFlipHeading

public void setFlipHeading(boolean flipHeading)

getFlipHeading

public boolean getFlipHeading()

setShowEKFParameterWindow

public void setShowEKFParameterWindow(boolean showEKFParameterWindow)

getShowEKFParameterWindow

public boolean getShowEKFParameterWindow()

jAER project on SourceForge