Beispiel #1
0
 void determineInitialConfigurations(ref List <ExperimentSetup> experimentSetups)
 {
     for (int i = 0; i < experimentSetups.Count; i++)
     {
         ExperimentSetup setup = experimentSetups[i];
         if (setup.initialConfiguration.isRandom)
         {
             if (!onlyRandomizeForward)
             {
                 setup.initialConfiguration.initialPosition = VirtualPathGenerator.getRandomPositionWithinBounds(-0.5f * setup.trackingSizeShape.x, 0.5f * setup.trackingSizeShape.x, -0.5f * setup.trackingSizeShape.z, 0.5f * setup.trackingSizeShape.z);
             }
             setup.initialConfiguration.initialForward = VirtualPathGenerator.getRandomForward();
             //Debug.LogWarning("Random Initial Configuration for size (" + trackingSizeShape.x + ", " + trackingSizeShape.z + "): Pos" + initialConfiguration.initialPosition.ToString("f2") + " Forward" + initialConfiguration.initialForward.ToString("f2"));
             experimentSetups[i] = setup;
         }
         else if (Mathf.Abs(setup.initialConfiguration.initialPosition.x) > 0.5f * setup.trackingSizeShape.x || Mathf.Abs(setup.initialConfiguration.initialPosition.y) > 0.5f * setup.trackingSizeShape.z)
         {
             Debug.LogError("Invalid beginning position selected. Defaulting Initial Configuration to (0, 0) and (0, 1).");
             setup.initialConfiguration.initialPosition = Vector2.zero;
             setup.initialConfiguration.initialForward  = Vector2.up;
             experimentSetups[i] = setup;
         }
         if (!setup.initialConfiguration.isRandom)
         {
             // Deal with diagonal hack
             if (setup.initialConfiguration.initialForward == Vector2.one)
             {
                 setup.initialConfiguration.initialForward = (new Vector2(setup.trackingSizeShape.x, setup.trackingSizeShape.z)).normalized;
                 experimentSetups[i] = setup;
             }
         }
     }
 }
Beispiel #2
0
    Dictionary <string, string> getExperimentDescriptor(ExperimentSetup setup)
    {
        Dictionary <string, string> descriptor = new Dictionary <string, string>();

        descriptor["redirector"]      = setup.redirector.ToString();
        descriptor["resetter"]        = setup.resetter == null ? "no_reset" : setup.resetter.ToString();
        descriptor["tracking_size_x"] = setup.trackingSizeShape.x.ToString();
        descriptor["tracking_size_z"] = setup.trackingSizeShape.z.ToString();

        return(descriptor);
    }
Beispiel #3
0
    void endExperiment()
    {
        //Debug.LogWarning("Last Experiment Length: " + (Time.realtimeSinceStartup - lastExperimentRealStartTime));

        ExperimentSetup setup = experimentSetups[experimentIterator];

        // Stop Trail Drawing
        simulationManager.trailDrawer.enabled = false;

        // Delete Virtual Path
        // THIS CAN BE MADE OPTIONAL IF NECESSARY
        simulationManager.trailDrawer.ClearTrail(TrailDrawer.VIRTUAL_TRAIL_NAME);

        // Disable Waypoint
        simulationManager.motionManager.targetWaypoint.gameObject.SetActive(true);

        // Disallow Walking
        simulationManager.userIsWalking = false;

        // Stop Logging
        simulationManager.statisticsLogger.EndLogging();

        // Gather Summary Statistics
        simulationManager.statisticsLogger.experimentResults.Add(simulationManager.statisticsLogger.GetExperimentResultForSummaryStatistics(getExperimentDescriptor(setup)));

        // Log Sampled Metrics
        if (simulationManager.statisticsLogger.logSampleVariables)
        {
            Dictionary <string, List <float> >   oneDimensionalSamples;
            Dictionary <string, List <Vector2> > twoDimensionalSamples;
            simulationManager.statisticsLogger.GetExperimentResultsForSampledVariables(out oneDimensionalSamples, out twoDimensionalSamples);
            simulationManager.statisticsLogger.LogAllExperimentSamples(experimentDescriptorToString(getExperimentDescriptor(setup)), oneDimensionalSamples, twoDimensionalSamples);
        }

        // Take Snapshot In Next Frame (After User and Virtual Path Is Disabled)
        if (!simulationManager.runAtFullSpeed)
        {
            simulationManager.takeScreenshot = true;
        }

        // Prepared for new experiment
        experimentIterator++;
        //lastExperimentEndTime = Time.time;
        experimentInProgress = false;

        // Log All Summary Statistics To File
        if (experimentIterator == experimentSetups.Count)
        {
            if (simulationManager.averageTrialResults)
            {
                simulationManager.statisticsLogger.experimentResults = mergeTrialSummaryStatistics(simulationManager.statisticsLogger.experimentResults);
            }
            simulationManager.statisticsLogger.LogExperimentSummaryStatisticsResultsSCSV(simulationManager.statisticsLogger.experimentResults);
            Debug.Log("Last Experiment Complete");
            experimentComplete = true;
        }

        // Disabling Redirectors
        simulationManager.redirectionManager.RemoveRedirector();
        simulationManager.redirectionManager.RemoveResetter();
    }
Beispiel #4
0
    void startNextExperiment()
    {
        Debug.Log("---------- EXPERIMENT STARTED ----------");

        ExperimentSetup setup = experimentSetups[experimentIterator];

        printExperimentDescriptor(getExperimentDescriptor(setup));

        // Setting Gain Scale Factors
        //RedirectionManager.SCALE_G_T = setup.gainScaleFactor.x;
        //RedirectionManager.SCALE_G_R = setup.gainScaleFactor.y;
        //RedirectionManager.SCALE_G_C = setup.gainScaleFactor.z;

        // Enabling/Disabling Redirectors
        simulationManager.redirectionManager.UpdateRedirector(setup.redirector);
        simulationManager.redirectionManager.UpdateResetter(setup.resetter);

        // Setup Trail Drawing
        simulationManager.trailDrawer.enabled = !simulationManager.runAtFullSpeed;

        // Enable Waypoint
        simulationManager.motionManager.targetWaypoint.gameObject.SetActive(true);

        // Resetting User and World Positions and Orientations
        this.transform.position = Vector3.zero;
        this.transform.rotation = Quaternion.identity;
        // ESSENTIAL BUG FOUND: If you set the user first and then the redirection recipient, then the user will be moved, so you have to make sure to do it afterwards!
        //Debug.Log("Target User Position: " + setup.initialConfiguration.initialPosition.ToString("f4"));
        simulationManager.redirectionManager.headTransform.position = Utilities.UnFlatten(setup.initialConfiguration.initialPosition, simulationManager.redirectionManager.headTransform.position.y);
        //Debug.Log("Result User Position: " + redirectionManager.userHeadTransform.transform.position.ToString("f4"));
        simulationManager.redirectionManager.headTransform.rotation = Quaternion.LookRotation(Utilities.UnFlatten(setup.initialConfiguration.initialForward), Vector3.up);

        // Set up Tracking Area Dimensions
        simulationManager.envManager.UpdateTrackedSpaceDimensions(setup.trackingSizeShape.x, setup.trackingSizeShape.z);

        // Set up Virtual Path
        float sumOfDistances, sumOfRotations;

        simulationManager.motionManager.waypoints = VirtualPathGenerator.generatePath(setup.pathSeed, setup.initialConfiguration.initialPosition, setup.initialConfiguration.initialForward, out sumOfDistances, out sumOfRotations);
        Debug.Log("sumOfDistances: " + sumOfDistances);
        Debug.Log("sumOfRotations: " + sumOfRotations);
        if (setup.redirector == typeof(ZigZagRedirector))
        {
            // Create Fake POIs
            Transform poiRoot = (new GameObject()).transform;
            poiRoot.name          = "ZigZag Redirector Waypoints";
            poiRoot.localPosition = Vector3.zero;
            poiRoot.localRotation = Quaternion.identity;
            Transform poi0 = (new GameObject()).transform;
            poi0.localPosition = Vector3.zero;
            poi0.parent        = poiRoot;
            List <Transform> zigzagRedirectorWaypoints = new List <Transform>();
            zigzagRedirectorWaypoints.Add(poi0);
            foreach (Vector2 waypoint in simulationManager.motionManager.waypoints)
            {
                Transform poi = (new GameObject()).transform;
                poi.localPosition = Utilities.UnFlatten(waypoint);
                poi.parent        = poiRoot;
                zigzagRedirectorWaypoints.Add(poi);
            }
            ((ZigZagRedirector)simulationManager.redirectionManager.redirector).waypoints = zigzagRedirectorWaypoints;
        }


        // Set First Waypoint Position and Enable It
        simulationManager.motionManager.targetWaypoint.position = new Vector3(simulationManager.motionManager.waypoints[0].x, simulationManager.motionManager.targetWaypoint.position.y, simulationManager.motionManager.waypoints[0].y);
        simulationManager.motionManager.waypointIterator        = 0;

        // POSTPONING THESE FOR SAFETY REASONS!
        //// Allow Walking
        //UserController.allowWalking = true;

        //// Start Logging
        //redirectionManager.redirectionStatistics.beginLogging();
        //redirectionManager.statisticsLogger.beginLogging();

        //lastExperimentRealStartTime = Time.realtimeSinceStartup;
        experimentInProgress = true;
    }