Beispiel #1
1
        public void ReportCapture_ReportsProperJson()
        {
            var filename = "my/file.png";

            var egoPosition = new float3(.02f, .03f, .04f);
            var egoRotation = new quaternion(.1f, .2f, .3f, .4f);

            var egoVelocity = new Vector3(.1f, .2f, .3f);

            var position   = new float3(.2f, 1.1f, .3f);
            var rotation   = new quaternion(.3f, .2f, .1f, .5f);
            var intrinsics = new float3x3(.1f, .2f, .3f, 1f, 2f, 3f, 10f, 20f, 30f);


            var capturesJsonExpected =
                $@"{{
  ""version"": ""{DatasetCapture.SchemaVersion}"",
  ""captures"": [
    {{
      ""id"": <guid>,
      ""sequence_id"": <guid>,
      ""step"": 0,
      ""timestamp"": 0.0,
      ""sensor"": {{
        ""sensor_id"": <guid>,
        ""ego_id"": <guid>,
        ""modality"": ""camera"",
        ""translation"": [
          {Format(position.x)},
          {Format(position.y)},
          {Format(position.z)}
        ],
        ""rotation"": [
          {Format(rotation.value.x)},
          {Format(rotation.value.y)},
          {Format(rotation.value.z)},
          {Format(rotation.value.w)}
        ],
        ""camera_intrinsic"": [
          [
            {Format(intrinsics.c0.x)},
            {Format(intrinsics.c0.y)},
            {Format(intrinsics.c0.z)}
          ],
          [
            {Format(intrinsics.c1.x)},
            {Format(intrinsics.c1.y)},
            {Format(intrinsics.c1.z)}
          ],
          [
            {Format(intrinsics.c2.x)},
            {Format(intrinsics.c2.y)},
            {Format(intrinsics.c2.z)}
          ]
        ]
      }},
      ""ego"": {{
        ""ego_id"": <guid>,
        ""translation"": [
          {Format(egoPosition.x)},
          {Format(egoPosition.y)},
          {Format(egoPosition.z)}
        ],
        ""rotation"": [
          {Format(egoRotation.value.x)},
          {Format(egoRotation.value.y)},
          {Format(egoRotation.value.z)},
          {Format(egoRotation.value.w)}
        ],
        ""velocity"": [
          {Format(egoVelocity.x)},
          {Format(egoVelocity.y)},
          {Format(egoVelocity.z)}
        ],
        ""acceleration"": null
      }},
      ""filename"": ""{filename}"",
      ""format"": ""PNG""
    }}
  ]
}}";

            var ego               = DatasetCapture.RegisterEgo("");
            var sensorHandle      = DatasetCapture.RegisterSensor(ego, "camera", "", 1, 0);
            var sensorSpatialData = new SensorSpatialData(new Pose(egoPosition, egoRotation), new Pose(position, rotation), egoVelocity, null);

            sensorHandle.ReportCapture(filename, sensorSpatialData, ("camera_intrinsic", intrinsics));

            DatasetCapture.ResetSimulation();
            Assert.IsFalse(sensorHandle.IsValid);

            var capturesPath = Path.Combine(DatasetCapture.OutputDirectory, "captures_000.json");

            FileAssert.Exists(capturesPath);

            AssertJsonFileEquals(capturesJsonExpected, capturesPath);
        }
Beispiel #2
0
        public IEnumerator FramesScheduled_WithTimeScale_ResultsInProperDeltaTime()
        {
            var ego = DatasetCapture.RegisterEgo("ego");
            var firstCaptureTime = 2f;
            var period           = 1f;

            var timeScale = 2;

            Time.timeScale = timeScale;
            DatasetCapture.RegisterSensor(ego, "cam", "", period, firstCaptureTime);

            float[] deltaTimeSamplesExpected =
            {
                timeScale *firstCaptureTime,
                timeScale *period,
                timeScale *period,
                timeScale *period
            };
            float[] deltaTimeSamples = new float[deltaTimeSamplesExpected.Length];
            for (int i = 0; i < deltaTimeSamples.Length; i++)
            {
                yield return(null);

                Assert.AreEqual(deltaTimeSamplesExpected[i], Time.deltaTime, 0.0001f);
            }
        }
Beispiel #3
0
        public IEnumerator FramesScheduled_WithChangingTimeScale_ResultsInProperDeltaTime()
        {
            var ego = DatasetCapture.RegisterEgo("ego");
            var firstCaptureTime = 2f;
            var period           = 1f;

            float[] newTimeScalesPerFrame =
            {
                2f,
                10f,
                .01f,
                1f
            };
            DatasetCapture.RegisterSensor(ego, "cam", "", period, firstCaptureTime);

            float[] deltaTimeSamplesExpected =
            {
                newTimeScalesPerFrame[0] * firstCaptureTime,
                newTimeScalesPerFrame[1] * period,
                newTimeScalesPerFrame[2] * period,
                newTimeScalesPerFrame[3] * period
            };
            float[] deltaTimeSamples = new float[deltaTimeSamplesExpected.Length];
            for (int i = 0; i < deltaTimeSamples.Length; i++)
            {
                Time.timeScale = newTimeScalesPerFrame[i];
                yield return(null);

                Assert.AreEqual(deltaTimeSamplesExpected[i], Time.deltaTime, 0.0001f);
            }
        }
        public IEnumerator SequenceTimeOfNextCapture_ReportsCorrectTime()
        {
            var ego = DatasetCapture.RegisterEgo("ego");
            var firstCaptureFrame   = 2f;
            var simulationDeltaTime = .4f;
            var sensorHandle        = DatasetCapture.RegisterSensor(ego, "cam", "", firstCaptureFrame, CaptureTriggerMode.Scheduled, simulationDeltaTime, 0);

            var startTime = firstCaptureFrame * simulationDeltaTime;

            float[] sequenceTimesExpected =
            {
                startTime,
                simulationDeltaTime + startTime,
                simulationDeltaTime * 2 + startTime,
                simulationDeltaTime * 3 + startTime
            };

            for (var i = 0; i < firstCaptureFrame; i++)
            {
                //render the non-captured frames before firstCaptureFrame
                yield return(null);
            }

            for (var i = 0; i < sequenceTimesExpected.Length; i++)
            {
                var sensorData         = m_TestHelper.GetSensorData(sensorHandle);
                var sequenceTimeActual = m_TestHelper.CallSequenceTimeOfNextCapture(sensorData);
                Assert.AreEqual(sequenceTimesExpected[i], sequenceTimeActual, 0.0001f);
                yield return(null);
            }
        }
Beispiel #5
0
        public IEnumerator ResetSimulation_ResetsCaptureDeltaTime()
        {
            var ego = DatasetCapture.RegisterEgo("ego");

            DatasetCapture.RegisterSensor(ego, "cam", "", 4, 10);
            yield return(null);

            Assert.AreEqual(10, Time.captureDeltaTime);
            DatasetCapture.ResetSimulation();
            Assert.AreEqual(0, Time.captureDeltaTime);
        }
        public IEnumerator ResetSimulation_ResetsCaptureDeltaTime()
        {
            var ego = DatasetCapture.RegisterEgo("ego");

            DatasetCapture.RegisterSensor(ego, "cam", "", 0, CaptureTriggerMode.Scheduled, 5, 0);
            yield return(null);

            Assert.AreEqual(5, Time.captureDeltaTime);
            DatasetCapture.ResetSimulation();
            Assert.AreEqual(0, Time.captureDeltaTime);
        }
Beispiel #7
0
        public IEnumerator ChangingTimeScale_DuringStartNewSequence_Succeeds()
        {
            var ego = DatasetCapture.RegisterEgo("ego");

            DatasetCapture.RegisterSensor(ego, "cam", "", 1f, 2f);

            yield return(null);

            Time.timeScale = 1;
            DatasetCapture.StartNewSequence();
            yield return(null);
        }
Beispiel #8
0
        public IEnumerator ChangingTimeScale_CausesDebugError()
        {
            var ego = DatasetCapture.RegisterEgo("ego");

            DatasetCapture.RegisterSensor(ego, "cam", "", 1f, 2f);

            yield return(null);

            Time.timeScale = 5;
            yield return(null);

            LogAssert.Expect(LogType.Error, new Regex("Time\\.timeScale may not change mid-sequence.*"));
        }
Beispiel #9
0
        public IEnumerator SimpleData_GeneratesFullDataset_OnExitPlaymode()
        {
            yield return(new EnterPlayMode());

            var ego    = DatasetCapture.RegisterEgo("ego");
            var sensor = DatasetCapture.RegisterSensor(ego, "camera", "", 0.1f, 0);

            sensor.ReportCapture("file.txt", new SensorSpatialData());
            expectedDatasetPath = DatasetCapture.OutputDirectory;
            yield return(new ExitPlayMode());

            FileAssert.Exists(Path.Combine(expectedDatasetPath, "sensors.json"));
        }
Beispiel #10
0
        public IEnumerator ShouldCaptureThisFrame_ReturnsTrueOnProperFrames()
        {
            var ego = DatasetCapture.RegisterEgo("ego");
            var firstCaptureTime1 = 10;
            var frequencyInMs1    = 4;
            var sensor1           = DatasetCapture.RegisterSensor(ego, "cam", "1", frequencyInMs1, firstCaptureTime1);

            var firstCaptureTime2 = 10;
            var frequencyInMs2    = 6;
            var sensor2           = DatasetCapture.RegisterSensor(ego, "cam", "2", frequencyInMs2, firstCaptureTime2);

            var sensor3 = DatasetCapture.RegisterSensor(ego, "cam", "3", 1, 1);

            sensor3.Enabled = false;

            (float deltaTime, bool sensor1ShouldCapture, bool sensor2ShouldCapture)[] samplesExpected =
        public IEnumerator SequenceTimeOfNextCapture_WithInBetweenFrames_ReportsCorrectTime()
        {
            var ego = DatasetCapture.RegisterEgo("ego");
            var firstCaptureFrame     = 2;
            var simulationDeltaTime   = .4f;
            var framesBetweenCaptures = 2;
            var sensorHandle          = DatasetCapture.RegisterSensor(ego, "cam", "", firstCaptureFrame, CaptureTriggerMode.Scheduled, simulationDeltaTime, framesBetweenCaptures);
            var startingFrame         = Time.frameCount;

            var startTime = firstCaptureFrame * simulationDeltaTime;
            var interval  = (framesBetweenCaptures + 1) * simulationDeltaTime;

            float[] sequenceTimesExpected =
            {
                startTime,
                interval + startTime,
                interval * 2 + startTime,
                interval * 3 + startTime
            };

            int[] simulationFramesToCheck =
            {
                firstCaptureFrame,
                firstCaptureFrame + (framesBetweenCaptures + 1),
                firstCaptureFrame + (framesBetweenCaptures + 1) * 2,
                firstCaptureFrame + (framesBetweenCaptures + 1) * 3,
            };

            int checkedFrame    = 0;
            var currentSimFrame = Time.frameCount - startingFrame;

            while (currentSimFrame <= simulationFramesToCheck[simulationFramesToCheck.Length - 1] && checkedFrame < simulationFramesToCheck.Length)
            {
                currentSimFrame = Time.frameCount - startingFrame;
                if (currentSimFrame == simulationFramesToCheck[checkedFrame])
                {
                    var sensorData         = m_TestHelper.GetSensorData(sensorHandle);
                    var sequenceTimeActual = m_TestHelper.CallSequenceTimeOfNextCapture(sensorData);
                    Assert.AreEqual(sequenceTimesExpected[checkedFrame], sequenceTimeActual, 0.0001f);
                    checkedFrame++;
                }
                else
                {
                    yield return(null);
                }
            }
        }
Beispiel #12
0
        public void RegisterSensor_ReportsProperJson()
        {
            var egoDescription    = @"the main car driving in simulation";
            var sensorDescription = "Cam (FL2-14S3M-C)";
            var modality          = "camera";

            var egoJsonExpected =
                $@"{{
  ""version"": ""{DatasetCapture.SchemaVersion}"",
  ""egos"": [
    {{
      ""id"": <guid>,
      ""description"": ""{egoDescription}""
    }}
  ]
}}";
            var sensorJsonExpected =
                $@"{{
  ""version"": ""{DatasetCapture.SchemaVersion}"",
  ""sensors"": [
    {{
      ""id"": <guid>,
      ""ego_id"": <guid>,
      ""modality"": ""{modality}"",
      ""description"": ""{sensorDescription}""
    }}
  ]
}}";

            var ego          = DatasetCapture.RegisterEgo(egoDescription);
            var sensorHandle = DatasetCapture.RegisterSensor(ego, modality, sensorDescription, 1, 1);

            Assert.IsTrue(sensorHandle.IsValid);
            DatasetCapture.ResetSimulation();
            Assert.IsFalse(sensorHandle.IsValid);

            var sensorsPath = Path.Combine(DatasetCapture.OutputDirectory, "sensors.json");
            var egosPath    = Path.Combine(DatasetCapture.OutputDirectory, "egos.json");

            FileAssert.Exists(egosPath);
            FileAssert.Exists(sensorsPath);

            AssertJsonFileEquals(egoJsonExpected, egosPath);
            AssertJsonFileEquals(sensorJsonExpected, sensorsPath);
        }
        public IEnumerator ShouldCaptureFlagsAndRenderTimesAreCorrectWithMultipleSensors()
        {
            var ego = DatasetCapture.RegisterEgo("ego");
            var firstCaptureFrame1     = 2;
            var simDeltaTime1          = 4;
            var framesBetweenCaptures1 = 2;
            var sensor1 = DatasetCapture.RegisterSensor(ego, "cam", "1", firstCaptureFrame1, CaptureTriggerMode.Scheduled, simDeltaTime1, framesBetweenCaptures1);

            var firstCaptureFrame2     = 1;
            var simDeltaTime2          = 6;
            var framesBetweenCaptures2 = 1;
            var sensor2 = DatasetCapture.RegisterSensor(ego, "cam", "2", firstCaptureFrame2, CaptureTriggerMode.Scheduled, simDeltaTime2, framesBetweenCaptures2);

            //Third sensor is a manually triggered one. All it does in this test is affect delta times.
            var simDeltaTime3 = 5;
            var sensor3       = DatasetCapture.RegisterSensor(ego, "cam", "3", 0, CaptureTriggerMode.Manual, simDeltaTime3, 0, true);

            (float deltaTime, bool sensor1ShouldCapture, bool sensor2ShouldCapture, bool sensor3ShouldCapture)[] samplesExpected =
        public IEnumerator StepFunction_OverridesSimulationDeltaTime_AndRunsSensors()
        {
            yield return(new EnterPlayMode());

            DatasetCapture.ResetSimulation();
            var ego    = DatasetCapture.RegisterEgo("ego");
            var sensor = DatasetCapture.RegisterSensor(ego, "camera", "", 0, CaptureTriggerMode.Scheduled, 2f, 0);

            yield return(null);

            var timeBeforeStep = Time.time;

            EditorApplication.isPaused = true;
            EditorApplication.Step();
            Assert.True(Time.time - timeBeforeStep < .3f);
            Assert.True(sensor.ShouldCaptureThisFrame);
            yield return(new ExitPlayMode());
        }
Beispiel #15
0
        public IEnumerator FramesScheduledBySensorConfig()
        {
            var ego = DatasetCapture.RegisterEgo("ego");
            var firstCaptureTime = 1.5f;
            var period           = .4f;

            DatasetCapture.RegisterSensor(ego, "cam", "", period, firstCaptureTime);

            float[] deltaTimeSamplesExpected =
            {
                firstCaptureTime,
                period,
                period,
                period
            };
            float[] deltaTimeSamples = new float[deltaTimeSamplesExpected.Length];
            for (int i = 0; i < deltaTimeSamples.Length; i++)
            {
                yield return(null);

                Assert.AreEqual(deltaTimeSamplesExpected[i], Time.deltaTime, 0.0001f);
            }
        }
        public IEnumerator FramesScheduledBySensorConfig()
        {
            var ego = DatasetCapture.RegisterEgo("ego");
            var firstCaptureFrame   = 2f;
            var simulationDeltaTime = .4f;

            DatasetCapture.RegisterSensor(ego, "cam", "", firstCaptureFrame, CaptureTriggerMode.Scheduled, simulationDeltaTime, 0);

            float[] deltaTimeSamplesExpected =
            {
                simulationDeltaTime,
                simulationDeltaTime,
                simulationDeltaTime,
                simulationDeltaTime
            };
            float[] deltaTimeSamples = new float[deltaTimeSamplesExpected.Length];
            for (int i = 0; i < deltaTimeSamples.Length; i++)
            {
                yield return(null);

                Assert.AreEqual(deltaTimeSamplesExpected[i], Time.deltaTime, 0.0001f);
            }
        }
        public IEnumerator SequenceTimeOfNextCapture_ReportsCorrectTime()
        {
            var ego = DatasetCapture.RegisterEgo("ego");
            var firstCaptureTime = 1.5f;
            var period           = .4f;
            var sensorHandle     = DatasetCapture.RegisterSensor(ego, "cam", "", period, firstCaptureTime);

            float[] sequenceTimesExpected =
            {
                firstCaptureTime,
                period + firstCaptureTime,
                period * 2 + firstCaptureTime,
                period * 3 + firstCaptureTime
            };
            for (var i = 0; i < sequenceTimesExpected.Length; i++)
            {
                yield return(null);

                var sensorData         = m_TestHelper.GetSensorData(sensorHandle);
                var sequenceTimeActual = m_TestHelper.CallSequenceTimeOfNextCapture(sensorData);
                Assert.AreEqual(sequenceTimesExpected[i], sequenceTimeActual, 0.0001f);
            }
        }
Beispiel #18
0
 public void RegisterEgo_InEditMode_Throws()
 {
     Assert.Throws <InvalidOperationException>(() => DatasetCapture.RegisterEgo(""));
 }