示例#1
0
    def __init__(self):
        rospy.init_node('Experiment')
        
        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()
        
        self.experimentparams.experiment.description = 'Regressive Motion'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = -1
        
        self.experimentparams.save.filenamebase = 'regress'
        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = True
        
        self.experimentparams.robotspec.nRobots = 1
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True                            # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = 'unspecified'
        
        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [Point(x=0.0, y=0.0)]
        self.experimentparams.tracking.exclusionzones.radius_list = [0.0]
        
        self.experimentparams.home.enabled = True
        self.experimentparams.home.x = 0.0
        self.experimentparams.home.y = 0.0
        self.experimentparams.home.speed = 20
        self.experimentparams.home.tolerance = 2

        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False
        
        self.experimentparams.pre.wait1 = 0.0
        
        self.experimentparams.pre.trigger.enabled = True
        self.experimentparams.pre.trigger.frameidParent = 'Fly01'
        self.experimentparams.pre.trigger.frameidChild = 'Robot'
        self.experimentparams.pre.trigger.speedAbsParentMin =   4.0
        self.experimentparams.pre.trigger.speedAbsParentMax =  40.0
        self.experimentparams.pre.trigger.speedAbsChildMin  =   0.0
        self.experimentparams.pre.trigger.speedAbsChildMax  = 999.0
        self.experimentparams.pre.trigger.speedRelMin       =   0.0
        self.experimentparams.pre.trigger.speedRelMax       = 999.0
        self.experimentparams.pre.trigger.distanceMin =  5.0
        self.experimentparams.pre.trigger.distanceMax = 60.0
        self.experimentparams.pre.trigger.angleMin = 85.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleMax =95.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'
        self.experimentparams.pre.trigger.angleTestBilateral = True
        self.experimentparams.pre.trigger.timeHold = 0.2
        self.experimentparams.pre.trigger.timeout = -1
        
        self.experimentparams.pre.wait2 = 0.0
        

        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = True
        self.experimentparams.trial.robot.move.mode = 'relative'        
        #self.experimentparams.trial.robot.move.relative.tracking = [False]
        #self.experimentparams.trial.robot.move.relative.frameidOriginPosition = ['Robot']
        #self.experimentparams.trial.robot.move.relative.frameidOriginAngle = ['Fly01']
        #self.experimentparams.trial.robot.move.relative.distance = [60]
        #self.experimentparams.trial.robot.move.relative.angleType = ['constant']
        #self.experimentparams.trial.robot.move.relative.angleOffset = [0]
        #self.experimentparams.trial.robot.move.relative.angleOscMag = [0] # Radians
        #self.experimentparams.trial.robot.move.relative.angleOscFreq = [0]   # Hz
        #self.experimentparams.trial.robot.move.relative.speed = [30]
        #self.experimentparams.trial.robot.move.relative.speedType = ['random']
        #self.experimentparams.trial.robot.move.relative.tolerance = [2]
        self.experimentparams.trial.robot.move.relative.tracking            = [False]
        self.experimentparams.trial.robot.move.relative.frameidOrigin       = ['Fly01']
        self.experimentparams.trial.robot.move.relative.distance            = [60]  # mm
        self.experimentparams.trial.robot.move.relative.angleOffset         = [0]   # Angular offset to target point in given frame (radians).
        self.experimentparams.trial.robot.move.relative.angleVelocity       = [-2*np.pi*1/40, 2*np.pi*1/40]  # 2pi*freq # Angular velocity of target point in given frame (radians per sec).
        self.experimentparams.trial.robot.move.relative.angleOscMag         = [0]  # Oscillatory addition to angular velocity.
        self.experimentparams.trial.robot.move.relative.angleOscFreq        = [0]  # Hz of the added oscillation.
        self.experimentparams.trial.robot.move.relative.speedMax            = [30]  # Maximum allowed speed of travel (mm/sec).
        self.experimentparams.trial.robot.move.relative.tolerance           = [2]  # mm
        self.experimentparams.trial.robot.move.relative.typeAngleOffset     = ['constant']  # 'constant' or 'random' (on range [0,2pi]) or 'current' (use current angle from frameidOrigin to robot)
        self.experimentparams.trial.robot.move.relative.typeAngleVelocity   = ['constant']  # 'constant' or 'random' (on range [0,angleVelocity])
        self.experimentparams.trial.robot.move.relative.typeAngleOscMag     = ['constant']  # 'constant' or 'random' (on range [0,angleOscMag])
        self.experimentparams.trial.robot.move.relative.typeAngleOscFreq    = ['constant']  # 'constant' or 'random' (on range [0,angleOscFreq])
        self.experimentparams.trial.robot.move.relative.typeSpeedMax        = ['random']  # 'constant' or 'random' (on range [0,speedMax])
        
        
        self.experimentparams.trial.lasergalvos.enabled = False
        
        self.experimentparams.trial.ledpanels.enabled = False
        self.experimentparams.trial.ledpanels.command = ['fixed']  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint). 
        self.experimentparams.trial.ledpanels.idPattern = [1]
        self.experimentparams.trial.ledpanels.frame_id = ['Fly01Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = False
        self.experimentparams.post.trigger.frameidParent = 'Fly01'
        self.experimentparams.post.trigger.frameidChild = 'Robot'
        self.experimentparams.post.trigger.distanceMin = 0.0
        self.experimentparams.post.trigger.distanceMax = 999.0
        self.experimentparams.post.trigger.speedAbsParentMin = 999.0
        self.experimentparams.post.trigger.speedAbsParentMax = 111.0 # i.e. NEVER
        self.experimentparams.post.trigger.speedAbsChildMin  =   0.0
        self.experimentparams.post.trigger.speedAbsChildMax  = 999.0
        self.experimentparams.post.trigger.speedRelMin       =   0.0
        self.experimentparams.post.trigger.speedRelMax       = 999.0
        self.experimentparams.post.trigger.angleMin =  0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax =180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = 3

        self.experimentparams.post.wait = 0.0
        
        self.experimentlib = ExperimentLib.ExperimentLib(self.experimentparams, 
                                                         startexperiment_callback = self.StartExperiment_callback, 
                                                         starttrial_callback = self.StartTrial_callback, 
                                                         endtrial_callback = self.EndTrial_callback)
示例#2
0
    def __init__(self):
        rospy.init_node('Experiment')

        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()

        self.experimentparams.experiment.description = 'Testing Robot Movement'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = -1

        self.experimentparams.save.filenamebase = 'test'
        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = True
        self.experimentparams.save.mov = True
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = True

        self.experimentparams.robotspec.nRobots = 1
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True  # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 0
        self.experimentparams.flyspec.description = 'unspecified'

        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [
            Point(x=50.0, y=68.0)
        ]
        self.experimentparams.tracking.exclusionzones.radius_list = [3.0]

        self.experimentparams.home.enabled = True
        self.experimentparams.home.x = 0.0
        self.experimentparams.home.y = 0.0
        self.experimentparams.home.speed = 20
        self.experimentparams.home.tolerance = 35

        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False

        self.experimentparams.pre.wait1 = 0.0
        self.experimentparams.pre.trigger.enabled = False
        self.experimentparams.pre.wait2 = 0.0

        # .robot.move, .lasergalvos, and .triggerExit all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = True
        self.experimentparams.trial.robot.move.mode = 'pattern'
        self.experimentparams.trial.robot.move.relative.tracking = [False]
        self.experimentparams.trial.robot.move.relative.frameidOrigin = [
            'Arena'
        ]
        self.experimentparams.trial.robot.move.relative.distance = [20]  # mm
        self.experimentparams.trial.robot.move.relative.angleOffset = [
            0
        ]  # Angular offset to target point in given frame (radians).
        self.experimentparams.trial.robot.move.relative.angleVelocity = [
            0
        ]  # 2pi*freq # Angular velocity of target point in given frame (radians per sec).
        self.experimentparams.trial.robot.move.relative.angleOscMag = [
            0
        ]  # Oscillatory addition to angular velocity.
        self.experimentparams.trial.robot.move.relative.angleOscFreq = [
            0
        ]  # Hz of the added oscillation.
        self.experimentparams.trial.robot.move.relative.speedMax = [
            20
        ]  # Maximum allowed speed of travel (mm/sec).
        self.experimentparams.trial.robot.move.relative.tolerance = [-1]  # mm
        self.experimentparams.trial.robot.move.relative.typeAngleOffset = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,2pi]) or 'current' (use current angle from frameidOrigin to robot)
        self.experimentparams.trial.robot.move.relative.typeAngleVelocity = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,angleVelocity])
        self.experimentparams.trial.robot.move.relative.typeAngleOscMag = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,angleOscMag])
        self.experimentparams.trial.robot.move.relative.typeAngleOscFreq = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,angleOscFreq])
        self.experimentparams.trial.robot.move.relative.typeSpeedMax = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,speedMax])

        if (False):
            # Four points step response.
            self.experimentparams.trial.robot.move.pattern.shape = [
                'square'
            ]  # 'constant' or 'circle' or 'square' or 'flylogo' or 'spiral' or 'grid'
            self.experimentparams.trial.robot.move.pattern.hzPattern = [
                1 / 16
            ]  # Patterns per second.
            self.experimentparams.trial.robot.move.pattern.hzPoint = [
                1 / 4
            ]  # Points per second in the pattern.
        else:
            # Smooth circle.
            self.experimentparams.trial.robot.move.pattern.shape = [
                'circle'
            ]  # 'constant' or 'circle' or 'square' or 'flylogo' or 'spiral' or 'grid'
            self.experimentparams.trial.robot.move.pattern.hzPattern = [
                1 / 20
            ]  # Patterns per second.
            self.experimentparams.trial.robot.move.pattern.hzPoint = [
                50
            ]  # Points per second in the pattern.

        self.experimentparams.trial.robot.move.pattern.count = [-1]
        self.experimentparams.trial.robot.move.pattern.size = [
            Point(x=32, y=0)
        ]
        self.experimentparams.trial.robot.move.pattern.param = [0]
        self.experimentparams.trial.robot.move.pattern.direction = [1]

        self.experimentparams.trial.lasergalvos.enabled = False
        self.experimentparams.trial.ledpanels.enabled = False

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.frameidParent = 'Arena'
        self.experimentparams.post.trigger.frameidChild = 'Robot'
        self.experimentparams.post.trigger.speedAbsParentMin = 999.0
        self.experimentparams.post.trigger.speedAbsParentMax = 111.0  # i.e. Never.
        self.experimentparams.post.trigger.speedAbsChildMin = 0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin = 0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 0.0
        self.experimentparams.post.trigger.distanceMax = 999.0
        self.experimentparams.post.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = -1
        self.experimentparams.post.wait = 0.0

        self.experimentlib = ExperimentLib.ExperimentLib(
            self.experimentparams,
            startexperiment_callback=self.StartExperiment_callback,
            starttrial_callback=self.StartTrial_callback,
            endtrial_callback=self.EndTrial_callback)
示例#3
0
    def __init__(self):
        rospy.init_node('Experiment')

        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()

        self.experimentparams.experiment.description = 'Open Loop Pattern Following'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = -1

        self.experimentparams.save.filenamebase = 'pattern'
        self.experimentparams.save.csv = False
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = True

        self.experimentparams.robotspec.nRobots = 1
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True  # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 0
        self.experimentparams.flyspec.description = 'unspecified'

        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [
            Point(x=-75, y=25)
        ]
        self.experimentparams.tracking.exclusionzones.radius_list = [3.0]

        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False

        self.experimentparams.pre.wait1 = 0.0

        self.experimentparams.home.enabled = False
        self.experimentparams.home.x = 0.0
        self.experimentparams.home.y = 0.0
        self.experimentparams.home.speed = 20
        self.experimentparams.home.tolerance = 2

        self.experimentparams.pre.trigger.enabled = False
        self.experimentparams.pre.trigger.frameidParent = 'Fly01'
        self.experimentparams.pre.trigger.frameidChild = 'Robot'
        self.experimentparams.pre.trigger.speedAbsParentMin = 0.0
        self.experimentparams.pre.trigger.speedAbsParentMax = 999.0
        self.experimentparams.pre.trigger.speedAbsChildMin = 0.0
        self.experimentparams.pre.trigger.speedAbsChildMax = 999.0
        self.experimentparams.pre.trigger.speedRelMin = 0.0
        self.experimentparams.pre.trigger.speedRelMax = 999.0
        self.experimentparams.pre.trigger.distanceMin = 0.0
        self.experimentparams.pre.trigger.distanceMax = 999.0
        self.experimentparams.pre.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'
        self.experimentparams.pre.trigger.angleTestBilateral = True
        self.experimentparams.pre.trigger.timeHold = 0.0
        self.experimentparams.pre.trigger.timeout = -1
        self.experimentparams.pre.wait2 = 0.0

        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = True
        self.experimentparams.trial.robot.move.mode = 'pattern'  # 'pattern' or 'relative'
        self.experimentparams.trial.robot.move.pattern.frameidPosition = [
            'Arena'
        ]  #
        self.experimentparams.trial.robot.move.pattern.frameidAngle = [
            'Arena'
        ]  #
        self.experimentparams.trial.robot.move.pattern.shape = [
            'circle'
        ]  # 'constant' or 'circle' or 'square' or 'flylogo' or 'spiral' or 'grid'
        self.experimentparams.trial.robot.move.pattern.hzPattern = [
            1 / 20
        ]  # Patterns per second.
        nPoints = 400
        self.experimentparams.trial.robot.move.pattern.hzPoint = [
            nPoints * self.experimentparams.trial.robot.move.pattern.hzPattern
        ]
        self.experimentparams.trial.robot.move.pattern.count = [-1]
        self.experimentparams.trial.robot.move.pattern.size = [
            Point(x=32, y=0)
        ]
        self.experimentparams.trial.robot.move.pattern.param = [0]
        self.experimentparams.trial.robot.move.pattern.direction = [1]

        self.experimentparams.trial.lasergalvos.enabled = False

        self.experimentparams.trial.ledpanels.enabled = False
        self.experimentparams.trial.ledpanels.command = [
            'fixed'
        ]  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint).
        self.experimentparams.trial.ledpanels.idPattern = [1]
        self.experimentparams.trial.ledpanels.frame_id = ['Fly01Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = False
        self.experimentparams.post.trigger.frameidParent = 'Fly01'
        self.experimentparams.post.trigger.frameidChild = 'Robot'
        self.experimentparams.post.trigger.speedAbsParentMin = 0.0
        self.experimentparams.post.trigger.speedAbsParentMax = 999.0
        self.experimentparams.post.trigger.speedAbsChildMin = 0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin = 0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 0.0
        self.experimentparams.post.trigger.distanceMax = 999.0
        self.experimentparams.post.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = -1

        self.experimentparams.post.wait = 0.0

        self.experimentlib = ExperimentLib.ExperimentLib(
            self.experimentparams,
            startexperiment_callback=self.StartExperiment_callback,
            starttrial_callback=self.StartTrial_callback,
            endtrial_callback=self.EndTrial_callback)
示例#4
0
    def __init__(self):
        rospy.init_node('Experiment')

        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()

        flies = 'TrpA1_sugar'
        radius = 50
        t0 = 10  # off
        t1 = 3  # on
        t2 = 117  # off
        laserpower = '260mW'

        self.experimentparams.experiment.description = 'Lasers the fly when within %dmm of center, for %d secs, then off for %d secs.' % (
            radius, t1, t2)
        self.experimentparams.experiment.maxTrials = 10
        self.experimentparams.experiment.timeout = -1

        #self.experimentparams.save.filenamebase = 'HCS_normal_150mW_'
        #self.experimentparams.save.filenamebase = 'TrpA1neg_AristaeIntact_150mW_' #
        #self.experimentparams.save.filenamebase = 'UAS_TrpA1_parentalcontrol_180mW_'
        #self.experimentparams.save.filenamebase = 'posvel_TrpA1_geosmin_fed_120mW_'
        #self.experimentparams.save.filenamebase = 'posvel_TrpA1_CVA_260mW_'
        self.experimentparams.save.filenamebase = 'zapresponsearea_%s_%dmm_%02ds_%02ds_%s_' % (
            flies, radius, t1, t2, laserpower)

        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = False  # Saves always.

        self.experimentparams.robotspec.nRobots = 0
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True  # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'none'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = flies

        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [
            Point(x=45.0, y=48.0)
        ]
        self.experimentparams.tracking.exclusionzones.radius_list = [8.0]

        self.experimentparams.home.enabled = False

        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False

        self.experimentparams.pre.wait1 = t0

        self.experimentparams.pre.trigger.enabled = True
        self.experimentparams.pre.trigger.frameidParent = 'Arena'
        self.experimentparams.pre.trigger.frameidChild = 'Fly01'
        self.experimentparams.pre.trigger.speedAbsParentMin = 0.0
        self.experimentparams.pre.trigger.speedAbsParentMax = 999.0
        self.experimentparams.pre.trigger.speedAbsChildMin = 0.0
        self.experimentparams.pre.trigger.speedAbsChildMax = 999.0
        self.experimentparams.pre.trigger.speedRelMin = 0.0
        self.experimentparams.pre.trigger.speedRelMax = 999.0
        self.experimentparams.pre.trigger.distanceMin = 0.0
        self.experimentparams.pre.trigger.distanceMax = radius
        self.experimentparams.pre.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'
        self.experimentparams.pre.trigger.angleTestBilateral = True
        self.experimentparams.pre.trigger.timeHold = 0.0
        self.experimentparams.pre.trigger.timeout = -1

        self.experimentparams.pre.wait2 = 0.0

        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = False

        flies_list = range(1, 1 + self.experimentparams.flyspec.nFlies)

        self.experimentparams.trial.lasergalvos.enabled = True
        self.experimentparams.trial.lasergalvos.pattern_list = []
        self.experimentparams.trial.lasergalvos.statefilterHi_list = []
        self.experimentparams.trial.lasergalvos.statefilterLo_list = []
        self.experimentparams.trial.lasergalvos.statefilterCriteria_list = []
        for iFly in flies_list:
            self.experimentparams.trial.lasergalvos.pattern_list.append(
                MsgPattern(
                    frameidPosition='Fly%02dForecast' % iFly,
                    frameidAngle='Fly%02dForecast' % iFly,
                    shape='grid',
                    hzPattern=40.0,
                    hzPoint=1000.0,
                    count=1,
                    size=Point(x=2, y=2),
                    restart=False,
                    param=3,  # Peano curve level.
                    direction=1), )
            #self.experimentparams.trial.lasergalvos.statefilterHi_list.append("{'speed':5.0}")
            #self.experimentparams.trial.lasergalvos.statefilterLo_list.append("{'speed':0.0}")
            #self.experimentparams.trial.lasergalvos.statefilterHi_list.append("{'velocity':{'linear':{'x':1,'y':9999}}}")
            #self.experimentparams.trial.lasergalvos.statefilterLo_list.append("{'velocity':{'linear':{'x':-9999,'y':-9999}}}")
            #self.experimentparams.trial.lasergalvos.statefilterHi_list.append("{'velocity':{'linear':{'x':1,'y':9999}},'pose':{'position':{'x':0, 'y':100}}}")
            #self.experimentparams.trial.lasergalvos.statefilterLo_list.append("{'velocity':{'linear':{'x':-9999,'y':-9999}},'pose':{'position':{'x':-100, 'y':-100}}}")
            #self.experimentparams.trial.lasergalvos.statefilterHi_list.append("{'velocity':{'angular':{'z':999}}}")
            #self.experimentparams.trial.lasergalvos.statefilterLo_list.append("{'velocity':{'angular':{'z':0.5}}}")
            #self.experimentparams.trial.lasergalvos.statefilterHi_list.append("{'pose':{'position':{'x':40, 'y':40}}}")
            #self.experimentparams.trial.lasergalvos.statefilterLo_list.append("{'pose':{'position':{'x':-40, 'y':-40}}}")
            #self.experimentparams.trial.lasergalvos.statefilterCriteria_list.append('inclusive') # 'inclusive'=laserOn if all criteria are satisfied, laserOff if any criteria is violated.

        self.experimentparams.trial.ledpanels.enabled = True
        self.experimentparams.trial.ledpanels.command = [
            'fixed'
        ]  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint).
        self.experimentparams.trial.ledpanels.idPattern = [3]
        self.experimentparams.trial.ledpanels.frame_id = ['Fly01Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.frameidParent = 'Arena'
        self.experimentparams.post.trigger.frameidChild = 'Fly01'
        self.experimentparams.post.trigger.speedAbsParentMin = 0.0
        self.experimentparams.post.trigger.speedAbsParentMax = 999.0
        self.experimentparams.post.trigger.speedAbsChildMin = 0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin = 0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 999.0
        self.experimentparams.post.trigger.distanceMax = 111.0  # i.e. never
        self.experimentparams.post.trigger.angleMin = 0.0000 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax = 359.9999 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = False
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = t1

        self.experimentparams.post.wait = t2

        self.experimentlib = ExperimentLib.ExperimentLib(
            self.experimentparams,
            startexperiment_callback=self.StartExperiment_callback,
            starttrial_callback=self.StartTrial_callback,
            endtrial_callback=self.EndTrial_callback)
示例#5
0
    def __init__(self):
        rospy.init_node('Experiment')
        
        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()
        
        self.experimentparams.experiment.description = 'See how long the fly lives with Laser (200mW)'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = -1
        
        self.experimentparams.save.filenamebase = 'HCS_trytokill_'
        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = False
        
        self.experimentparams.robotspec.nRobots = 0
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True                            # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = 'HCS normal'
        
        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [Point(x=0.00304053, y=0.00015492)]
        self.experimentparams.tracking.exclusionzones.radius_list = [0]
        
        self.experimentparams.home.enabled = False
        
        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False
        self.experimentparams.pre.wait1 = 0.0
        
        self.experimentparams.pre.trigger.enabled = False
        self.experimentparams.pre.trigger.frameidParent = 'Arena'
        self.experimentparams.pre.trigger.frameidChild = 'Fly01'
        self.experimentparams.pre.trigger.speedAbsParentMin =   0.0
        self.experimentparams.pre.trigger.speedAbsParentMax = 999.0
        self.experimentparams.pre.trigger.speedAbsChildMin =   0.0
        self.experimentparams.pre.trigger.speedAbsChildMax = 999.0
        self.experimentparams.pre.trigger.speedRelMin =   0.0
        self.experimentparams.pre.trigger.speedRelMax = 999.0
        self.experimentparams.pre.trigger.distanceMin =   0.0
        self.experimentparams.pre.trigger.distanceMax = 999.0
        self.experimentparams.pre.trigger.angleMin =  0.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleMax =180.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'
        self.experimentparams.pre.trigger.angleTestBilateral = True
        self.experimentparams.pre.trigger.timeHold = 0.0
        self.experimentparams.pre.trigger.timeout = -1
        
        self.experimentparams.pre.wait2 = 0.0
        
        
        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = False
        
        
        #mode='fixedpointlist'    # Laser to specific locations.
        #mode='fixedcircle'
        #mode='fixedgrid' 
        mode='trackgrid'        # Small grid tracks flies.
        #mode='tracknumber'      # Draw a numeral on flies.
        #mode='trackflylogo'
        flies_list = range(1,1+self.experimentparams.flyspec.nFlies)
        
        
        self.experimentparams.trial.lasergalvos.enabled = True
        self.experimentparams.trial.lasergalvos.pattern_list = []
        self.experimentparams.trial.lasergalvos.statefilterLo_list = []
        self.experimentparams.trial.lasergalvos.statefilterHi_list = []
        self.experimentparams.trial.lasergalvos.statefilterCriteria_list = []
        if mode=='fixedpointlist':
            # Draw a point.
            self.experimentparams.trial.lasergalvos.pattern_list.append(MsgPattern(
                                                                            frameidPosition   = 'Arena',
                                                                            frameidAngle   = 'Arena',
                                                                            shape      = 'bypoints',
                                                                            hzPattern  = 40.0,
                                                                            hzPoint    = 1000.0,
                                                                            count      = 1,
                                                                            points     = [#Point(x=0  ,y=0)],
                                                                                          Point(x=34  ,y=34),
                                                                                          Point(x=34  ,y=34+6),
                                                                                          Point(x=34  ,y=34-6),
                                                                                          Point(x=34+6,y=34),
                                                                                          Point(x=34-6,y=34)],
                                                                            size       = Point(x=0,
                                                                                               y=0),
                                                                            restart    = False,
                                                                            param      = 3, # Peano curve level.
                                                                            direction  = 1),
                                                                 )
        if mode=='fixedcircle':
            # Draw a point.
            self.experimentparams.trial.lasergalvos.pattern_list.append(MsgPattern(
                                                                            frameidPosition   = 'Arena',
                                                                            frameidAngle   = 'Arena',
                                                                            shape      = 'circle',
                                                                            hzPattern  = 40.0,
                                                                            hzPoint    = 1000.0,
                                                                            count      = 1,
                                                                            size       = Point(x=80,
                                                                                               y= 0),
                                                                            restart    = False,
                                                                            param      = 3,
                                                                            direction  = 1), # Peano curve level.
                                                                 )
        if mode=='fixedgrid':
            # Draw a maze.
            self.experimentparams.trial.lasergalvos.pattern_list.append(MsgPattern(
                                                                            frameidPosition   = 'Arena',
                                                                            frameidAngle   = 'Arena',
                                                                            shape      = 'grid',
                                                                            hzPattern  = 40.0,
                                                                            hzPoint    = 1000.0,
                                                                            count      = 1,
                                                                            size       = Point(x=0,
                                                                                               y=0),
                                                                            restart    = False,
                                                                            param      = 3, # Peano curve level.
                                                                            direction  = 1),
                                                                 )
        if mode=='trackgrid':
            for iFly in flies_list:
                self.experimentparams.trial.lasergalvos.pattern_list.append(MsgPattern(
                                                                                frameidPosition   = 'Fly%02dForecast' % iFly,
                                                                                frameidAngle   = 'Fly%02dForecast' % iFly,
                                                                                shape      = 'grid',
                                                                                hzPattern  = 40.0,
                                                                                hzPoint    = 1000.0,
                                                                                count      = 1,
                                                                                size       = Point(x=2,
                                                                                                   y=2),
                                                                                restart    = False,
                                                                                param      = 3, # Peano curve level.
                                                                                direction  = 1),
                                                                     )
        if mode=='tracknumber':
            for iFly in flies_list:
                self.experimentparams.trial.lasergalvos.pattern_list.append(MsgPattern(
                                                                                frameidPosition   = 'Fly%02dForecast' % iFly,
                                                                                frameidAngle   = 'Fly%02dForecast' % iFly,
                                                                                shape      = '%s' % iFly,
                                                                                hzPattern  = 10.0,
                                                                                hzPoint    = 1000.0,
                                                                                count      = 1,
                                                                                size       = Point(x=8,
                                                                                                   y=8),
                                                                                restart    = False,
                                                                                param      = 0,
                                                                                direction  = 1), # Peano curve level.
                                                                     )
        if mode=='trackflylogo':
            for iFly in flies_list:
                self.experimentparams.trial.lasergalvos.pattern_list.append(MsgPattern(
                                                                                frameidPosition   = 'Fly%02dForecast' % iFly,
                                                                                frameidAngle   = 'Fly%02dForecast' % iFly,
                                                                                shape      = 'flylogo',
                                                                                hzPattern  = 40.0,
                                                                                hzPoint    = 1000.0,
                                                                                count      = 1,
                                                                                size       = Point(x=6,
                                                                                                   y=6),
                                                                                restart    = False,
                                                                                param      = 0,
                                                                                direction  = 1), # Peano curve level.
                                                                     )
        
        
        self.experimentparams.trial.ledpanels.enabled = False
        self.experimentparams.trial.ledpanels.command = ['fixed']  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint). 
        self.experimentparams.trial.ledpanels.idPattern = [1]
        self.experimentparams.trial.ledpanels.frame_id = ['Fly01Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.frameidParent = 'Arena'
        self.experimentparams.post.trigger.frameidChild = 'Fly01'
        self.experimentparams.post.trigger.speedAbsParentMin =   0.0
        self.experimentparams.post.trigger.speedAbsParentMax = 999.0
        self.experimentparams.post.trigger.speedAbsChildMin =   0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin =   0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 999.0
        self.experimentparams.post.trigger.distanceMax = 888.0 # i.e. never
        self.experimentparams.post.trigger.angleMin =  0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax =180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = 1800

        self.experimentparams.post.wait = 0.0
        
        self.experimentlib = ExperimentLib.ExperimentLib(self.experimentparams, 
                                                         startexperiment_callback = self.StartExperiment_callback, 
                                                         starttrial_callback = self.StartTrial_callback, 
                                                         endtrial_callback = self.EndTrial_callback)
示例#6
0
    def __init__(self):
        rospy.init_node('Experiment')
        rospy.sleep(1)

        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()

        self.experimentparams.experiment.description = 'Dodgeball'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = -1

        self.experimentparams.save.filenamebase = 'dodgeball'
        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = True
        self.experimentparams.save.mov = True
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = True

        self.experimentparams.robotspec.nRobots = 1
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True  # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = 'unspecified'

        self.experimentparams.tracking.exclusionzones.enabled = True
        self.experimentparams.tracking.exclusionzones.point_list = [
            Point(x=45.0, y=70), Point(x=-79, y=28)
        ]
        self.experimentparams.tracking.exclusionzones.radius_list = [3.5, 3.0]

        self.experimentparams.home.enabled = True
        self.experimentparams.home.x = 10.0
        self.experimentparams.home.y = 0.0
        self.experimentparams.home.speed = 20
        self.experimentparams.home.tolerance = 2

        self.experimentparams.pre.robot.enabled = True
        self.experimentparams.pre.robot.move.mode = 'pattern'  # 'relative' or 'pattern'.  Move relative to the given frame, or move in a preset pattern.
        self.experimentparams.pre.robot.move.relative.tracking = [True]
        self.experimentparams.pre.robot.move.relative.frameidOrigin = [
            'Fly01Forecast'
        ]
        self.experimentparams.pre.robot.move.relative.distance = [35]  # mm
        self.experimentparams.pre.robot.move.relative.angleOffset = [
            0
        ]  # Angular offset to target point in given frame (radians).
        self.experimentparams.pre.robot.move.relative.angleVelocity = [
            0
        ]  # 2pi*freq # Angular velocity of target point in given frame (radians per sec).
        self.experimentparams.pre.robot.move.relative.angleOscMag = [
            0
        ]  # Oscillatory addition to angular velocity.
        self.experimentparams.pre.robot.move.relative.angleOscFreq = [
            0
        ]  # Hz of the added oscillation.
        self.experimentparams.pre.robot.move.relative.speedMax = [
            20
        ]  # Maximum allowed speed of travel (mm/sec).
        self.experimentparams.pre.robot.move.relative.tolerance = [2]  # mm
        self.experimentparams.pre.robot.move.relative.typeAngleOffset = [
            'random'
        ]  # 'constant' or 'random' (on range [0,2pi]) or 'current' (use current angle from frameidOrigin to robot)
        self.experimentparams.pre.robot.move.relative.typeAngleVelocity = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,angleVelocity])
        self.experimentparams.pre.robot.move.relative.typeAngleOscMag = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,angleOscMag])
        self.experimentparams.pre.robot.move.relative.typeAngleOscFreq = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,angleOscFreq])
        self.experimentparams.pre.robot.move.relative.typeSpeedMax = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,speedMax])
        self.experimentparams.pre.robot.move.pattern.frameidPosition = [
            'Arena'
        ]  #
        self.experimentparams.pre.robot.move.pattern.frameidAngle = ['Arena'
                                                                     ]  #
        self.experimentparams.pre.robot.move.pattern.shape = [
            'circle'
        ]  # 'constant' or 'circle' or 'square' or 'flylogo' or 'spiral' or 'grid'
        self.experimentparams.pre.robot.move.pattern.hzPattern = [
            1 / 6
        ]  # Patterns per second.
        self.experimentparams.pre.robot.move.pattern.hzPoint = [
            20
        ]  # The update rate for the actuator.
        self.experimentparams.pre.robot.move.pattern.count = [-1]
        self.experimentparams.pre.robot.move.pattern.size = [Point(x=10, y=0)]
        self.experimentparams.pre.robot.move.pattern.param = [0]
        self.experimentparams.pre.robot.move.pattern.direction = [1]

        self.experimentparams.pre.lasergalvos.enabled = False

        self.experimentparams.pre.ledpanels.enabled = True
        self.experimentparams.pre.ledpanels.command = [
            'fixed'
        ]  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint).
        self.experimentparams.pre.ledpanels.idPattern = [1]
        self.experimentparams.pre.ledpanels.origin = [Point(x=0, y=0)]
        self.experimentparams.pre.ledpanels.frame_id = ['Fly01']
        self.experimentparams.pre.ledpanels.statefilterHi = ['']
        self.experimentparams.pre.ledpanels.statefilterLo = ['']
        self.experimentparams.pre.ledpanels.statefilterCriteria = ['']

        self.experimentparams.pre.wait1 = 0.0
        self.experimentparams.pre.trigger.enabled = True
        self.experimentparams.pre.trigger.frameidParent = 'Fly01'
        self.experimentparams.pre.trigger.frameidChild = 'Robot'
        self.experimentparams.pre.trigger.speedAbsParentMin = 10.0  # Absolute speed of the parent in fixed frame.
        self.experimentparams.pre.trigger.speedAbsParentMax = 60.0
        self.experimentparams.pre.trigger.speedAbsChildMin = 0.0  # Absolute speed of the child in fixed frame.
        self.experimentparams.pre.trigger.speedAbsChildMax = 999.0
        self.experimentparams.pre.trigger.speedRelMin = 0.0  # Relative speed of child to parent.
        self.experimentparams.pre.trigger.speedRelMax = 999.0
        self.experimentparams.pre.trigger.distanceMin = 20.0  # Distance between child and parent frames.
        self.experimentparams.pre.trigger.distanceMax = 40.0
        self.experimentparams.pre.trigger.angleMin = 00.0 * np.pi / 180.0  # Angle of the child frame from the perspective of the parent frame.
        self.experimentparams.pre.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'  # 'inclusive' or 'exclusive' of the given angle range.
        self.experimentparams.pre.trigger.angleTestBilateral = True  # True=bilateral, False=unilateral.
        self.experimentparams.pre.trigger.timeHold = 0.1  # How long the conditions must be continually met before the trigger happens.
        self.experimentparams.pre.trigger.timeout = -1
        self.experimentparams.pre.wait2 = 0.0

        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = True
        self.experimentparams.trial.robot.move.mode = 'relative'  # 'relative' or 'pattern'.  Move relative to the given frame, or move in a preset pattern.
        self.experimentparams.trial.robot.move.relative.tracking = [True]
        self.experimentparams.trial.robot.move.relative.frameidOrigin = [
            'Fly01Forecast'
        ]
        self.experimentparams.trial.robot.move.relative.distance = [6]  # mm
        self.experimentparams.trial.robot.move.relative.angleOffset = [
            0
        ]  # Angular offset to target point in given frame (radians).
        self.experimentparams.trial.robot.move.relative.angleVelocity = [
            0
        ]  # 2pi*freq # Angular velocity of target point in given frame (radians per sec).
        self.experimentparams.trial.robot.move.relative.angleOscMag = [
            0
        ]  # Oscillatory addition to angular velocity.
        self.experimentparams.trial.robot.move.relative.angleOscFreq = [
            0
        ]  # Hz of the added oscillation.
        self.experimentparams.trial.robot.move.relative.speedMax = [
            20
        ]  # Maximum allowed speed of travel (mm/sec).
        self.experimentparams.trial.robot.move.relative.tolerance = [2]  # mm
        self.experimentparams.trial.robot.move.relative.typeAngleOffset = [
            'current'
        ]  # 'constant' or 'random' (on range [0,2pi]) or 'current' (use current angle from frameidOrigin to robot)
        self.experimentparams.trial.robot.move.relative.typeAngleVelocity = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,angleVelocity])
        self.experimentparams.trial.robot.move.relative.typeAngleOscMag = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,angleOscMag])
        self.experimentparams.trial.robot.move.relative.typeAngleOscFreq = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,angleOscFreq])
        self.experimentparams.trial.robot.move.relative.typeSpeedMax = [
            'constant'
        ]  # 'constant' or 'random' (on range [0,speedMax])

        self.experimentparams.trial.lasergalvos.enabled = False

        self.experimentparams.trial.ledpanels.enabled = True
        self.experimentparams.trial.ledpanels.command = [
            'fixed'
        ]  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint).
        self.experimentparams.trial.ledpanels.idPattern = [1]
        self.experimentparams.trial.ledpanels.origin = [Point(x=0, y=0)]
        self.experimentparams.trial.ledpanels.frame_id = ['Fly01Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = False
        self.experimentparams.post.trigger.frameidParent = 'Fly01'
        self.experimentparams.post.trigger.frameidChild = 'Robot'
        self.experimentparams.post.trigger.speedAbsParentMin = 999.0
        self.experimentparams.post.trigger.speedAbsParentMax = 111.0  # i.e. NEVER
        self.experimentparams.post.trigger.speedAbsChildMin = 0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin = 0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 0.0
        self.experimentparams.post.trigger.distanceMax = 999.0
        self.experimentparams.post.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 1.0
        self.experimentparams.post.trigger.timeout = 2

        self.experimentparams.post.wait = 0.0

        self.experimentlib = ExperimentLib.ExperimentLib(
            self.experimentparams,
            startexperiment_callback=self.StartExperiment_callback,
            starttrial_callback=self.StartTrial_callback,
            endtrial_callback=self.EndTrial_callback)
示例#7
0
    def __init__(self):
        rospy.init_node('Experiment')
        
        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()
        
        #flies = 'HCS'
        flies = 'TrpA1_sugar'
        #flies = 'TrpA1_paralysis'
        #flies = 'TrpA1_wingextender'
        t0 = 120     # off 
        t1 = 3      # on
        t2 = 117    # off
        laserpower = '260mW'
        
        
        self.experimentparams.experiment.description = 'Laser is off for %d secs, on for %d secs, and off for %d secs' % (t0, t1, t2)
        self.experimentparams.experiment.maxTrials = 100
        self.experimentparams.experiment.timeout = -1
        
        self.experimentparams.save.filenamebase = 'zapresponse_%s_%02ds_%02ds_%02ds_%s_' % (flies, t0, t1, t2, laserpower)
        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = False
        
        self.experimentparams.robotspec.nRobots = 0
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True                            # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = flies
        
        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [Point(x=0.0, y=0.0)]
        self.experimentparams.tracking.exclusionzones.radius_list = [0.0]
        
        self.experimentparams.home.enabled = False
        
        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False
        
        self.experimentparams.pre.wait1 = t0
        self.experimentparams.pre.trigger.enabled = False
        self.experimentparams.pre.trigger.frameidParent = 'Arena'
        self.experimentparams.pre.trigger.frameidChild = 'Fly01'
        self.experimentparams.pre.trigger.speedAbsParentMin =   0.0
        self.experimentparams.pre.trigger.speedAbsParentMax = 999.0
        self.experimentparams.pre.trigger.speedAbsChildMin =   0.0
        self.experimentparams.pre.trigger.speedAbsChildMax = 999.0
        self.experimentparams.pre.trigger.speedRelMin =   0.0
        self.experimentparams.pre.trigger.speedRelMax = 999.0
        self.experimentparams.pre.trigger.distanceMin =   0.0
        self.experimentparams.pre.trigger.distanceMax = 999.0
        self.experimentparams.pre.trigger.angleMin =  0.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleMax =180.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'
        self.experimentparams.pre.trigger.angleTestBilateral = True
        self.experimentparams.pre.trigger.timeHold = 0.0
        self.experimentparams.pre.trigger.timeout = -1
        self.experimentparams.pre.wait2 = 0.0
        
        
        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = False
        
        
        flies_list = range(1,1+self.experimentparams.flyspec.nFlies)
        
        self.experimentparams.trial.lasergalvos.enabled = True
        self.experimentparams.trial.lasergalvos.pattern_list = []
        self.experimentparams.trial.lasergalvos.statefilterHi_list = []
        self.experimentparams.trial.lasergalvos.statefilterLo_list = []
        self.experimentparams.trial.lasergalvos.statefilterCriteria_list = []
        for iFly in flies_list:
            self.experimentparams.trial.lasergalvos.pattern_list.append(MsgPattern(
                                                                            frameidPosition   = 'Fly%02dForecast' % iFly,
                                                                            frameidAngle   = 'Fly%02dForecast' % iFly,
                                                                            shape      = 'grid',
                                                                            hzPattern  = 40.0,
                                                                            hzPoint    = 1000.0,
                                                                            count      = 1,
                                                                            size       = Point(x=2,
                                                                                               y=2),
                                                                            restart    = False,
                                                                            param      = 3, # Peano curve level.
                                                                            direction  = 1),
                                                                 )
        
        
        self.experimentparams.trial.ledpanels.enabled = True
        self.experimentparams.trial.ledpanels.command = ['fixed']  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint). 
        self.experimentparams.trial.ledpanels.idPattern = [3]
        self.experimentparams.trial.ledpanels.frame_id = ['Fly01Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.frameidParent = 'Arena'
        self.experimentparams.post.trigger.frameidChild = 'Fly01'
        self.experimentparams.post.trigger.speedAbsParentMin =   0.0
        self.experimentparams.post.trigger.speedAbsParentMax = 999.0
        self.experimentparams.post.trigger.speedAbsChildMin =   0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin =   0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 999.0
        self.experimentparams.post.trigger.distanceMax = 888.0 # i.e. never
        self.experimentparams.post.trigger.angleMin =  0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax =180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = t1

        self.experimentparams.post.wait = t2
        
        self.experimentlib = ExperimentLib.ExperimentLib(self.experimentparams, 
                                                         startexperiment_callback = self.StartExperiment_callback, 
                                                         starttrial_callback = self.StartTrial_callback, 
                                                         endtrial_callback = self.EndTrial_callback)
示例#8
0
    def __init__(self):
        rospy.init_node('Experiment')

        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()

        self.experimentparams.experiment.description = 'Food is in the hot zone.'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = -1

        self.experimentparams.save.filenamebase = 'zaphotfood'
        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = False  # Saves always.

        self.experimentparams.robotspec.nRobots = 0
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True  # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = 'unspecified'

        self.experimentparams.tracking.exclusionzones.enabled = True
        self.experimentparams.tracking.exclusionzones.point_list = [
            Point(x=52.3, y=-51.0)
        ]
        self.experimentparams.tracking.exclusionzones.radius_list = [7.0]

        self.experimentparams.home.enabled = False

        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False
        self.experimentparams.pre.wait1 = 0.0

        self.experimentparams.pre.trigger.enabled = False
        self.experimentparams.pre.trigger.frameidParent = 'Arena'
        self.experimentparams.pre.trigger.frameidChild = 'Fly01'
        self.experimentparams.pre.trigger.speedAbsParentMin = 0.0
        self.experimentparams.pre.trigger.speedAbsParentMax = 999.0
        self.experimentparams.pre.trigger.speedAbsChildMin = 0.0
        self.experimentparams.pre.trigger.speedAbsChildMax = 999.0
        self.experimentparams.pre.trigger.speedRelMin = 0.0
        self.experimentparams.pre.trigger.speedRelMax = 999.0
        self.experimentparams.pre.trigger.distanceMin = 0.0
        self.experimentparams.pre.trigger.distanceMax = 999.0
        self.experimentparams.pre.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'
        self.experimentparams.pre.trigger.angleTestBilateral = False
        self.experimentparams.pre.trigger.timeHold = 0.0
        self.experimentparams.pre.trigger.timeout = -1

        self.experimentparams.pre.wait2 = 0.0

        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = False

        self.experimentparams.trial.lasergalvos.enabled = True
        self.experimentparams.trial.lasergalvos.pattern_list = []
        self.experimentparams.trial.lasergalvos.statefilterHi_list = []
        self.experimentparams.trial.lasergalvos.statefilterLo_list = []
        self.experimentparams.trial.lasergalvos.statefilterCriteria_list = []
        for iFly in range(self.experimentparams.flyspec.nFlies):  #range(3):#
            self.experimentparams.trial.lasergalvos.pattern_list.append(
                MsgPattern(frameidPosition='Fly%02dForecast' % (iFly + 1),
                           frameidAngle='Fly%02dForecast' % (iFly + 1),
                           shape='grid',
                           hzPattern=40.0,
                           hzPoint=1000.0,
                           count=1,
                           size=Point(x=2, y=2),
                           restart=False,
                           param=3,
                           direction=1),  # Peano curve level.
            )
            #self.experimentparams.trial.lasergalvos.statefilterHi_list.append("{'speed':5.0}")
            #self.experimentparams.trial.lasergalvos.statefilterLo_list.append("{'speed':0.0}")
            #self.experimentparams.trial.lasergalvos.statefilterHi_list.append("{'velocity':{'linear':{'x':+6,'y':+6}}}")
            #self.experimentparams.trial.lasergalvos.statefilterLo_list.append("{'velocity':{'linear':{'x':-6,'y':-6}}}")
            #self.experimentparams.trial.lasergalvos.statefilterHi_list.append("{'velocity':{'angular':{'z':999}}}")
            #self.experimentparams.trial.lasergalvos.statefilterLo_list.append("{'velocity':{'angular':{'z':0.5}}}")
            self.experimentparams.trial.lasergalvos.statefilterHi_list.append(
                "{'pose':{'position':{'x':-30, 'y':50}}}"
            )  # This is the cool zone.
            self.experimentparams.trial.lasergalvos.statefilterLo_list.append(
                "{'pose':{'position':{'x':-50, 'y':30}}}")
            self.experimentparams.trial.lasergalvos.statefilterCriteria_list.append(
                "exclusive")

        self.experimentparams.trial.ledpanels.enabled = False
        self.experimentparams.trial.ledpanels.command = [
            'fixed'
        ]  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint).
        self.experimentparams.trial.ledpanels.idPattern = [1]
        self.experimentparams.trial.ledpanels.frame_id = ['Fly01Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.frameidParent = 'Arena'
        self.experimentparams.post.trigger.frameidChild = 'Fly01'
        self.experimentparams.post.trigger.speedAbsParentMin = 0.0
        self.experimentparams.post.trigger.speedAbsParentMax = 999.0
        self.experimentparams.post.trigger.speedAbsChildMin = 0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin = 0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 999.0
        self.experimentparams.post.trigger.distanceMax = 111.0  # i.e. never
        self.experimentparams.post.trigger.angleMin = 0.0000 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax = 359.9999 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = False
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = 3600

        self.experimentparams.post.wait = 0.0

        self.experimentlib = ExperimentLib.ExperimentLib(
            self.experimentparams,
            startexperiment_callback=self.StartExperiment_callback,
            starttrial_callback=self.StartTrial_callback,
            endtrial_callback=self.EndTrial_callback)
示例#9
0
    def __init__(self):
        rospy.init_node('Experiment')

        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()

        self.experimentparams.experiment.description = 'Navigation around a food spot'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = -1

        self.experimentparams.save.filenamebase = 'flydance'
        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = False

        self.experimentparams.robotspec.nRobots = 0
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True  # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 4
        self.experimentparams.flyspec.description = "unspecified"

        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [
            Point(x=0.00304053, y=0.00015492)
        ]
        self.experimentparams.tracking.exclusionzones.radius_list = [0]

        self.experimentparams.home.enabled = False

        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False
        self.experimentparams.pre.wait1 = 0.0

        self.experimentparams.pre.trigger.enabled = False
        self.experimentparams.pre.trigger.frameidParent = 'Arena'
        self.experimentparams.pre.trigger.frameidChild = 'Fly1'
        self.experimentparams.pre.trigger.speedAbsParentMin = 0.0
        self.experimentparams.pre.trigger.speedAbsParentMax = 999.0
        self.experimentparams.pre.trigger.speedAbsChildMin = 0.0
        self.experimentparams.pre.trigger.speedAbsChildMax = 999.0
        self.experimentparams.pre.trigger.speedRelMin = 0.0
        self.experimentparams.pre.trigger.speedRelMax = 999.0
        self.experimentparams.pre.trigger.distanceMin = 0.0
        self.experimentparams.pre.trigger.distanceMax = 999.0
        self.experimentparams.pre.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'
        self.experimentparams.pre.trigger.angleTestBilateral = True
        self.experimentparams.pre.trigger.timeHold = 0.0
        self.experimentparams.pre.trigger.timeout = -1

        self.experimentparams.pre.wait2 = 0.0

        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = False

        self.experimentparams.trial.lasergalvos.enabled = False

        self.experimentparams.trial.ledpanels.enabled = False
        self.experimentparams.trial.ledpanels.command = [
            'fixed'
        ]  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint).
        self.experimentparams.trial.ledpanels.idPattern = [1]
        self.experimentparams.trial.ledpanels.frame_id = ['Fly1Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.frameidParent = 'Arena'
        self.experimentparams.post.trigger.frameidChild = 'Fly1'
        self.experimentparams.post.trigger.speedAbsParentMin = 0.0
        self.experimentparams.post.trigger.speedAbsParentMax = 999.0
        self.experimentparams.post.trigger.speedAbsChildMin = 0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin = 0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 999.0
        self.experimentparams.post.trigger.distanceMax = 888.0  # i.e. never
        self.experimentparams.post.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = 7200  # 5400 = 1.5 hr
        self.experimentparams.post.wait = 0.0

        self.experimentlib = ExperimentLib.ExperimentLib(
            self.experimentparams,
            startexperiment_callback=self.StartExperiment_callback,
            starttrial_callback=self.StartTrial_callback,
            endtrial_callback=self.EndTrial_callback)
示例#10
0
    def __init__(self):
        rospy.init_node('Experiment')

        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()

        self.experimentparams.experiment.description = 'Aim laser at fly'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = -1

        self.experimentparams.save.filenamebase = 'zap'
        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = True

        self.experimentparams.robotspec.nRobots = 0
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True  # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = 'unspecified'

        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [
            Point(x=0.0, y=0.0)
        ]
        self.experimentparams.tracking.exclusionzones.radius_list = [0.0]

        self.experimentparams.home.enabled = False

        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False

        self.experimentparams.pre.wait1 = 0.0
        self.experimentparams.pre.trigger.enabled = False
        self.experimentparams.pre.trigger.frameidParent = 'Arena'
        self.experimentparams.pre.trigger.frameidChild = 'Fly01'
        self.experimentparams.pre.trigger.speedAbsParentMin = 0.0
        self.experimentparams.pre.trigger.speedAbsParentMax = 999.0
        self.experimentparams.pre.trigger.speedAbsChildMin = 0.0
        self.experimentparams.pre.trigger.speedAbsChildMax = 999.0
        self.experimentparams.pre.trigger.speedRelMin = 0.0
        self.experimentparams.pre.trigger.speedRelMax = 999.0
        self.experimentparams.pre.trigger.distanceMin = 0.0
        self.experimentparams.pre.trigger.distanceMax = 999.0
        self.experimentparams.pre.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'
        self.experimentparams.pre.trigger.angleTestBilateral = True
        self.experimentparams.pre.trigger.timeHold = 0.0
        self.experimentparams.pre.trigger.timeout = -1
        self.experimentparams.pre.wait2 = 0.0

        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = False

        mode = 'platepoint'  # 'platepoint' or 'plategrid' or 'trackgrid1' or 'trackgrid' or 'tracknumber' or 'trackflylogo' or 'fixedmaze' or 'fixedpoint'

        self.experimentparams.trial.lasergalvos.enabled = True
        self.experimentparams.trial.lasergalvos.pattern_list = []
        if mode == 'platepoint':
            # Draw a point.
            self.experimentparams.trial.lasergalvos.pattern_list.append(
                MsgPattern(frameidPosition='Arena',
                           frameidAngle='Arena',
                           shape='constant',
                           hzPattern=40.0,
                           hzPoint=1000.0,
                           count=1,
                           size=Point(x=0, y=0),
                           restart=False,
                           param=2,
                           direction=1),  # Peano curve level.
            )
        if mode == 'plategrid':
            self.experimentparams.trial.lasergalvos.pattern_list.append(
                MsgPattern(frameidPosition='Arena',
                           frameidAngle='Arena',
                           shape='grid',
                           hzPattern=40.0,
                           hzPoint=1000.0,
                           count=1,
                           size=Point(x=1, y=1),
                           restart=False,
                           param=3,
                           direction=1),  # Peano curve level.
            )
        if mode == 'trackgrid1':
            self.experimentparams.trial.lasergalvos.pattern_list.append(
                MsgPattern(frameidPosition='Fly01',
                           frameidAngle='Fly01',
                           shape='grid',
                           hzPattern=40.0,
                           hzPoint=1000.0,
                           count=1,
                           size=Point(x=3, y=3),
                           restart=False,
                           param=2,
                           direction=1),  # Peano curve level.
            )
        if mode == 'trackgrid':
            for iFly in range(self.experimentparams.flyspec.nFlies):
                self.experimentparams.trial.lasergalvos.pattern_list.append(
                    MsgPattern(frameidPosition='Fly%02dForecast' % (iFly + 1),
                               frameidAngle='Fly%02dForecast' % (iFly + 1),
                               shape='grid',
                               hzPattern=40.0,
                               hzPoint=1000.0,
                               count=1,
                               size=Point(x=3, y=3),
                               restart=False,
                               param=2,
                               direction=1),  # Peano curve level.
                )
        if mode == 'tracknumber':
            for iFly in range(self.experimentparams.flyspec.nFlies):
                self.experimentparams.trial.lasergalvos.pattern_list.append(
                    MsgPattern(frameidPosition='Fly%02dForecast' % (iFly + 1),
                               frameidAngle='Fly%02dForecast' % (iFly + 1),
                               shape='%s' % (iFly + 1),
                               hzPattern=40.0,
                               hzPoint=1000.0,
                               count=1,
                               size=Point(x=6, y=6),
                               restart=False,
                               param=2,
                               direction=1),  # Peano curve level.
                )
        if mode == 'trackflylogo':
            for iFly in range(self.experimentparams.flyspec.nFlies):
                self.experimentparams.trial.lasergalvos.pattern_list.append(
                    MsgPattern(frameidPosition='Fly%02dForecast' % (iFly + 1),
                               frameidAngle='Fly%02dForecast' % (iFly + 1),
                               shape='flylogo',
                               hzPattern=40.0,
                               hzPoint=1000.0,
                               count=1,
                               size=Point(x=6, y=6),
                               restart=False,
                               param=2,
                               direction=1),  # Peano curve level.
                )
        if mode == 'fixedmaze':
            # Draw a maze.
            self.experimentparams.trial.lasergalvos.pattern_list.append(
                MsgPattern(frameidPosition='Arena',
                           frameidAngle='Arena',
                           shape='grid',
                           hzPattern=40.0,
                           hzPoint=1000.0,
                           count=1,
                           size=Point(x=140, y=140),
                           restart=False,
                           param=2,
                           direction=1),  # Peano curve level.
            )
        if mode == 'fixedpoint':
            # Draw a point.
            self.experimentparams.trial.lasergalvos.pattern_list.append(
                MsgPattern(frameidPosition='Arena',
                           frameidAngle='Arena',
                           shape='constant',
                           hzPattern=40.0,
                           hzPoint=1000.0,
                           count=1,
                           size=Point(x=0, y=0),
                           restart=False,
                           param=2,
                           direction=1),  # Peano curve level.
            )

        self.experimentparams.trial.ledpanels.enabled = False
        self.experimentparams.trial.ledpanels.command = [
            'fixed'
        ]  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint).
        self.experimentparams.trial.ledpanels.idPattern = [1]
        self.experimentparams.trial.ledpanels.frame_id = ['Fly01Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.distanceMin = 999.0
        self.experimentparams.post.trigger.distanceMax = 888.0  # i.e. never
        self.experimentparams.post.trigger.speedAbsParentMin = 0.0
        self.experimentparams.post.trigger.speedAbsParentMax = 999.0
        self.experimentparams.post.trigger.speedAbsChildMin = 0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin = 0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = 660

        self.experimentparams.post.wait = 0.0

        self.experimentlib = ExperimentLib.ExperimentLib(
            self.experimentparams,
            startexperiment_callback=self.StartExperiment_callback,
            starttrial_callback=self.StartTrial_callback,
            endtrial_callback=self.EndTrial_callback)
示例#11
0
    def __init__(self):
        rospy.init_node('Experiment')
        rospy.sleep(1)

        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()

        self.experimentparams.experiment.description = 'Retrack a bag file.'
        self.experimentparams.experiment.maxTrials = 1
        self.experimentparams.experiment.timeout = -1

        self.experimentparams.save.filenamebase = 'retrack'
        self.experimentparams.save.csv = False
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = False

        self.experimentparams.robotspec.nRobots = 0
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True  # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = 'unspecified'

        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [
            Point(x=-79, y=28)
        ]
        self.experimentparams.tracking.exclusionzones.radius_list = [3.0]

        self.experimentparams.home.enabled = False
        self.experimentparams.home.x = 0.0
        self.experimentparams.home.y = 0.0
        self.experimentparams.home.speed = 20
        self.experimentparams.home.tolerance = 2

        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False
        self.experimentparams.pre.wait1 = 0.0
        self.experimentparams.pre.trigger.enabled = False
        self.experimentparams.pre.wait2 = 0.0

        self.experimentparams.trial.robot.enabled = False
        self.experimentparams.trial.lasergalvos.enabled = False
        self.experimentparams.trial.ledpanels.enabled = False

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.frameidParent = 'Fly1'
        self.experimentparams.post.trigger.frameidChild = 'Robot'
        self.experimentparams.post.trigger.speedAbsParentMin = 999.0
        self.experimentparams.post.trigger.speedAbsParentMax = 111.0  # i.e. NEVER
        self.experimentparams.post.trigger.speedAbsChildMin = 0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin = 0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 0.0
        self.experimentparams.post.trigger.distanceMax = 999.0
        self.experimentparams.post.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = -1

        self.experimentparams.post.wait = 0.0

        self.experimentlib = ExperimentLib.ExperimentLib(
            self.experimentparams,
            startexperiment_callback=self.StartExperiment_callback,
            starttrial_callback=self.StartTrial_callback,
            endtrial_callback=self.EndTrial_callback)
示例#12
0
    def __init__(self):
        rospy.init_node('Experiment')

        self.pubLEDPanels = rospy.Publisher('ledpanels/command',
                                            MsgPanelsCommand,
                                            latch=True)
        self.xPanelPattern = 0
        self.yPanelPattern = 0

        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()

        self.experimentparams.experiment.description = 'Rotate Panels to Track a Fly'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = -1

        self.experimentparams.save.filenamebase = 'paneltracking'
        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.fmf = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = False  # Saves always.

        self.experimentparams.robotspec.nRobots = 0
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True  # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = 'unspecified'

        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [
            Point(x=52.3, y=-51.0)
        ]
        self.experimentparams.tracking.exclusionzones.radius_list = [7.0]

        self.experimentparams.home.enabled = False
        self.experimentparams.home.x = 0.0
        self.experimentparams.home.y = 0.0
        self.experimentparams.home.speed = 20
        self.experimentparams.home.tolerance = 2

        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False
        self.experimentparams.pre.wait1 = 0.5
        self.experimentparams.pre.trigger.enabled = False
        self.experimentparams.pre.trigger.frameidParent = 'Arena'
        self.experimentparams.pre.trigger.frameidChild = 'Fly01'
        self.experimentparams.pre.trigger.speedAbsParentMin = 0.0
        self.experimentparams.pre.trigger.speedAbsParentMax = 999.0
        self.experimentparams.pre.trigger.speedAbsChildMin = 0.0
        self.experimentparams.pre.trigger.speedAbsChildMax = 999.0
        self.experimentparams.pre.trigger.speedRelMin = 0.0
        self.experimentparams.pre.trigger.speedRelMax = 999.0
        self.experimentparams.pre.trigger.distanceMin = 0.0
        self.experimentparams.pre.trigger.distanceMax = 999.0
        self.experimentparams.pre.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'
        self.experimentparams.pre.trigger.angleTestBilateral = False
        self.experimentparams.pre.trigger.timeHold = 0.0
        self.experimentparams.pre.trigger.timeout = -1
        self.experimentparams.pre.wait2 = 0.0

        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = False

        self.experimentparams.trial.lasergalvos.enabled = False

        self.experimentparams.trial.ledpanels.enabled = True
        self.experimentparams.trial.ledpanels.command = [
            'trackview'
        ]  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint).
        self.experimentparams.trial.ledpanels.idPattern = [1]
        self.experimentparams.trial.ledpanels.origin = [Point(x=10, y=0)]
        self.experimentparams.trial.ledpanels.frame_id = ['Fly01Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.frameidParent = 'Arena'
        self.experimentparams.post.trigger.frameidChild = 'Fly01'
        self.experimentparams.post.trigger.speedAbsParentMin = 0.0
        self.experimentparams.post.trigger.speedAbsParentMax = 999.0
        self.experimentparams.post.trigger.speedAbsChildMin = 0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin = 0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 999.0
        self.experimentparams.post.trigger.distanceMax = 111.0  # i.e. NEVER
        self.experimentparams.post.trigger.angleMin = 0.0000 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax = 359.9999 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = False
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = 300  # 5 minute trials.

        self.experimentparams.post.wait = 0.0

        self.experimentlib = ExperimentLib.ExperimentLib(
            self.experimentparams,
            startexperiment_callback=self.StartExperiment_callback,
            starttrial_callback=self.StartTrial_callback,
            endtrial_callback=self.EndTrial_callback)
示例#13
0
    def __init__(self):
        rospy.init_node('Experiment')

        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()

        self.experimentparams.experiment.description = 'Measure the temperature via the laser.'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = 600

        self.experimentparams.save.filenamebase = 'lasertemp'
        self.experimentparams.save.csv = False
        self.experimentparams.save.bag = False
        self.experimentparams.save.mov = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = True

        self.experimentparams.robotspec.nRobots = 0
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True  # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = 'unspecified'

        self.experimentparams.tracking.exclusionzones.enabled = True
        self.experimentparams.tracking.exclusionzones.point_list = [
            Point(x=28.0, y=0.0)
        ]
        self.experimentparams.tracking.exclusionzones.radius_list = [20.0]

        self.experimentparams.home.enabled = False
        self.experimentparams.home.x = rospy.get_param('motorarm/L1', 999)
        self.experimentparams.home.y = 0.0
        self.experimentparams.home.speed = 20
        self.experimentparams.home.tolerance = 4

        self.experimentparams.pre.robot.enabled = False
        self.experimentparams.pre.lasergalvos.enabled = False
        self.experimentparams.pre.ledpanels.enabled = False
        self.experimentparams.pre.wait1 = 0
        self.experimentparams.pre.trigger.enabled = False
        self.experimentparams.pre.wait2 = 0.0

        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = False

        self.experimentparams.trial.lasergalvos.enabled = True
        self.experimentparams.trial.lasergalvos.statefilterLo_list = []
        self.experimentparams.trial.lasergalvos.statefilterHi_list = []
        self.experimentparams.trial.lasergalvos.statefilterCriteria_list = []
        iFly = 1
        self.experimentparams.trial.lasergalvos.pattern_list = []
        self.experimentparams.trial.lasergalvos.pattern_list.append(
            MsgPattern(
                frameidPosition='Fly%02d' % iFly,
                frameidAngle='Fly%02d' % iFly,
                shape='grid',
                hzPattern=40.0,
                hzPoint=1000.0,
                count=1,
                points=[],
                size=Point(x=3, y=3),
                restart=False,
                param=3,  # Peano curve level.
                direction=1), )

        self.experimentparams.trial.ledpanels.enabled = False

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.frameidParent = 'Fly01'
        self.experimentparams.post.trigger.frameidChild = 'Robot'
        self.experimentparams.post.trigger.speedAbsParentMin = 0.0
        self.experimentparams.post.trigger.speedAbsParentMax = 999.0
        self.experimentparams.post.trigger.speedAbsChildMin = 0.0
        self.experimentparams.post.trigger.speedAbsChildMax = 999.0
        self.experimentparams.post.trigger.speedRelMin = 0.0
        self.experimentparams.post.trigger.speedRelMax = 999.0
        self.experimentparams.post.trigger.distanceMin = 999.0
        self.experimentparams.post.trigger.distanceMax = 111.0  # Never
        self.experimentparams.post.trigger.angleMin = 0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax = 180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = 600

        self.experimentparams.post.wait = 0.0

        self.experimentlib = ExperimentLib.ExperimentLib(
            self.experimentparams,
            startexperiment_callback=self.StartExperiment_callback,
            starttrial_callback=self.StartTrial_callback,
            endtrial_callback=self.EndTrial_callback)
示例#14
0
    def __init__(self):
        rospy.init_node('Experiment')
        
        # Fill out the data structure that defines the experiment.
        self.experimentparams = ExperimentParamsChoicesRequest()
        
        self.experimentparams.experiment.description = 'Fly Chases Robot Moving in Circle, with laser activation.'
        self.experimentparams.experiment.maxTrials = -1
        self.experimentparams.experiment.timeout = 600
        
        self.experimentparams.save.filenamebase = 'lasertag'
        self.experimentparams.save.csv = True
        self.experimentparams.save.bag = True
        self.experimentparams.save.mov = False
        self.experimentparams.save.imagetopic_list = ['camera/image_rect']
        self.experimentparams.save.onlyWhileTriggered = True
        
        self.experimentparams.robotspec.nRobots = 1
        self.experimentparams.robotspec.width = 1.5875
        self.experimentparams.robotspec.height = 1.5875
        self.experimentparams.robotspec.isPresent = True                            # Set this to False if you remove the robot, but still want the actuation.
        self.experimentparams.robotspec.description = 'Black oxide magnet'

        self.experimentparams.flyspec.nFlies = 1
        self.experimentparams.flyspec.description = 'unspecified'
        
        self.experimentparams.tracking.exclusionzones.enabled = False
        self.experimentparams.tracking.exclusionzones.point_list = [Point(x=0.0, y=0.0)]
        self.experimentparams.tracking.exclusionzones.radius_list = [0.0]
        
        self.experimentparams.home.enabled = False
        self.experimentparams.home.x = rospy.get_param('motorarm/L1', 999)
        self.experimentparams.home.y = 0.0
        self.experimentparams.home.speed = 20
        self.experimentparams.home.tolerance = 4

        self.experimentparams.pre.robot.enabled                         = True
        self.experimentparams.pre.robot.move.mode                       = 'pattern' # 'pattern' or 'relative'
        self.experimentparams.pre.robot.move.pattern.frameidPosition    = ['Arena'] 
        self.experimentparams.pre.robot.move.pattern.frameidAngle       = ['Arena'] 
        self.experimentparams.pre.robot.move.pattern.shape              = ['circle'] # 'constant' or 'circle' or 'square' or 'flylogo' or 'spiral' or 'ramp'
        self.experimentparams.pre.robot.move.pattern.hzPattern          = [1/40]
        self.experimentparams.pre.robot.move.pattern.hzPoint            = [100]
        self.experimentparams.pre.robot.move.pattern.count              = [-1]
        self.experimentparams.pre.robot.move.pattern.size               = [Point(x=rospy.get_param('motorarm/L1', 999),
                                                                                 y=0)]
        self.experimentparams.pre.robot.move.pattern.param              = [0]
        self.experimentparams.pre.robot.move.pattern.direction          = [1]
        self.experimentparams.pre.robot.move.pattern.restart            = [False]

        self.experimentparams.pre.lasergalvos.enabled = True
        self.experimentparams.pre.lasergalvos.statefilterLo_list = []
        self.experimentparams.pre.lasergalvos.statefilterHi_list = []
        self.experimentparams.pre.lasergalvos.statefilterCriteria_list = []
        iFly = 1
        self.experimentparams.pre.lasergalvos.pattern_list = []
        self.experimentparams.pre.lasergalvos.pattern_list.append(MsgPattern(
                                                                    frameidPosition   = 'Fly%02dForecast' % iFly,
                                                                    frameidAngle   = 'Fly%02dForecast' % iFly,
                                                                    shape      = 'grid',
                                                                    hzPattern  = 40.0,
                                                                    hzPoint    = 1000.0,
                                                                    count      = 1,
                                                                    size       = Point(x=2,
                                                                                       y=2),
                                                                    restart    = False,
                                                                    param      = 3, # Peano curve level.
                                                                    direction  = 1),
                                                                   )

        self.experimentparams.pre.ledpanels.enabled = False

        self.experimentparams.pre.wait1 = 0#150.0

        self.experimentparams.pre.trigger.enabled = True
        self.experimentparams.pre.trigger.frameidParent = 'Fly01'
        self.experimentparams.pre.trigger.frameidChild = 'Robot'
        self.experimentparams.pre.trigger.speedAbsParentMin =   4.0
        self.experimentparams.pre.trigger.speedAbsParentMax = 999.0
        self.experimentparams.pre.trigger.speedAbsChildMin  =   0.0
        self.experimentparams.pre.trigger.speedAbsChildMax  = 999.0
        self.experimentparams.pre.trigger.speedRelMin       =   0.0
        self.experimentparams.pre.trigger.speedRelMax       = 999.0
        self.experimentparams.pre.trigger.distanceMin =   0.0
        self.experimentparams.pre.trigger.distanceMax =   7.0
        self.experimentparams.pre.trigger.angleMin =  0.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleMax = 60.0 * np.pi / 180.0
        self.experimentparams.pre.trigger.angleTest = 'inclusive'
        self.experimentparams.pre.trigger.angleTestBilateral = True
        self.experimentparams.pre.trigger.timeHold = 0.0
        self.experimentparams.pre.trigger.timeout = -1

        self.experimentparams.pre.wait2 = 0.0
        

        # .robot, .lasergalvos, .ledpanels, and .post.trigger all run concurrently.
        # The first one to finish preempts the others.
        self.experimentparams.trial.robot.enabled = True
        self.experimentparams.trial.robot.move.mode = 'pattern' # 'pattern' or 'relative'
        self.experimentparams.trial.robot.move.pattern.frameidPosition = ['Arena']            # 
        self.experimentparams.trial.robot.move.pattern.frameidAngle = ['Arena']               # 
        self.experimentparams.trial.robot.move.pattern.shape = ['circle'] # 'constant' or 'circle' or 'square' or 'flylogo' or 'spiral' or 'ramp'
        self.experimentparams.trial.robot.move.pattern.hzPattern = [1/40]
        self.experimentparams.trial.robot.move.pattern.hzPoint = [100]
        self.experimentparams.trial.robot.move.pattern.count = [-1]
        self.experimentparams.trial.robot.move.pattern.size = [Point(x=rospy.get_param('motorarm/L1', 999),
                                                                     y=0)]
        self.experimentparams.trial.robot.move.pattern.param = [0]
        self.experimentparams.trial.robot.move.pattern.direction = [1]
        
        
        self.experimentparams.trial.lasergalvos.enabled = False
        self.experimentparams.trial.lasergalvos.statefilterLo_list = []
        self.experimentparams.trial.lasergalvos.statefilterHi_list = []
        self.experimentparams.trial.lasergalvos.statefilterCriteria_list = []
        iFly = 1
        self.experimentparams.trial.lasergalvos.pattern_list = []
        self.experimentparams.trial.lasergalvos.pattern_list.append(MsgPattern(
                                                                    frameidPosition   = 'Fly%02dForecast' % iFly,
                                                                    frameidAngle   = 'Fly%02dForecast' % iFly,
                                                                    shape      = 'grid',
                                                                    hzPattern  = 40.0,
                                                                    hzPoint    = 1000.0,
                                                                    count      = 1,
                                                                    size       = Point(x=2,
                                                                                       y=2),
                                                                    restart    = False,
                                                                    param      = 3, # Peano curve level.
                                                                    direction  = 1),
                                                                   )

        
        self.experimentparams.trial.ledpanels.enabled = True
        self.experimentparams.trial.ledpanels.command = ['fixed']  # 'fixed', 'trackposition' (panel position follows fly position), or 'trackview' (panel position follows fly's viewpoint). 
        self.experimentparams.trial.ledpanels.idPattern = [1]
        self.experimentparams.trial.ledpanels.origin = [Point(x=0, y=0)] 
        self.experimentparams.trial.ledpanels.frame_id = ['Fly01Forecast']
        self.experimentparams.trial.ledpanels.statefilterHi = ['']
        self.experimentparams.trial.ledpanels.statefilterLo = ['']
        self.experimentparams.trial.ledpanels.statefilterCriteria = ['']

        self.experimentparams.post.trigger.enabled = True
        self.experimentparams.post.trigger.frameidParent = 'Fly01'
        self.experimentparams.post.trigger.frameidChild = 'Robot'
        self.experimentparams.post.trigger.speedAbsParentMin =   0.0
        self.experimentparams.post.trigger.speedAbsParentMax = 999.0
        self.experimentparams.post.trigger.speedAbsChildMin  =   0.0
        self.experimentparams.post.trigger.speedAbsChildMax  = 999.0
        self.experimentparams.post.trigger.speedRelMin       =   0.0
        self.experimentparams.post.trigger.speedRelMax       = 999.0
        self.experimentparams.post.trigger.distanceMin =  15.0
        self.experimentparams.post.trigger.distanceMax = 999.0
        self.experimentparams.post.trigger.angleMin =  0.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleMax =180.0 * np.pi / 180.0
        self.experimentparams.post.trigger.angleTest = 'inclusive'
        self.experimentparams.post.trigger.angleTestBilateral = True
        self.experimentparams.post.trigger.timeHold = 0.0
        self.experimentparams.post.trigger.timeout = 600

        self.experimentparams.post.wait = 0.0
        
        self.experimentlib = ExperimentLib.ExperimentLib(self.experimentparams, 
                                                         startexperiment_callback = self.StartExperiment_callback, 
                                                         starttrial_callback = self.StartTrial_callback, 
                                                         endtrial_callback = self.EndTrial_callback)