public RobotSample GetSample(bool force = false) { RobotSample sample = null; if (Time.time > nextRecordTime || force) { if (m_saveLocation != "") { // Debug.Log ( "Recording!" ); sample = new RobotSample(); sample.timestamp = System.DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fff"); sample.steerAngle = SteerAngle; // sample.steerAngle = m_SteerAngle / m_MaximumSteerAngle; sample.verticalAngle = VerticalAngle; sample.throttle = ThrottleInput; sample.brake = BrakeInput; sample.speed = Speed; sample.pitch = Pitch; // new: convert yaw angle to CCW, x-based sample.yaw = ConvertAngleToCCWXBased(Yaw); sample.roll = Roll; sample.position = transform.position; sample.rotation = transform.rotation; // Debug.Log ( "Throt " + sample.throttle + " brake " + sample.brake + " pos " + sample.position + " yaw " + sample.yaw ); samples.Enqueue(sample); // ObjectiveSpawner.Sample (); } nextRecordTime = Time.time + recordTime; } return(sample); }
public void StopPickup() { RobotSample s = GetSample(true); s.stopPickup = true; // var iter = samples.GetEnumerator (); // RobotSample s = null; // while ( iter.MoveNext () ) // { // s = iter.Current; // } // s.stopPickup = true; }
public void TriggerPickup() { RobotSample s = GetSample(true); s.triggerPickup = true; s.curSample = curObjective.gameObject; // var iter = samples.GetEnumerator (); // RobotSample s = null; // while ( iter.MoveNext () ) // { // s = iter.Current; // } // s.triggerPickup = true; // s.curSample = curObjective.gameObject; }
//Changed the WriteSamplesToDisk to a IEnumerator method that plays back recording along with percent status from UISystem script //instead of showing frozen screen until all data is recorded public IEnumerator WriteSamplesToDisk() { string newLine = "\n"; if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer) { newLine = "\r\n"; } if (string.IsNullOrEmpty(csvSeparatorChar)) { Debug.LogWarning("Warning: empty/null separator. using `,`"); csvSeparatorChar = ","; } yield return(null); if (samples.Count > 0) { string row = "Path" + csvSeparatorChar + "SteerAngle" + csvSeparatorChar + "Throttle" + csvSeparatorChar + "Brake" + csvSeparatorChar + "Speed" + csvSeparatorChar + "X_Position" + csvSeparatorChar + "Y_Position" + csvSeparatorChar + "Pitch" + csvSeparatorChar + "Yaw" + csvSeparatorChar + "Roll" + newLine; File.AppendAllText(Path.Combine(m_saveLocation, CSVFileName), row); ObjectiveSpawner.SetInitialPositions(); int count = samples.Count; RobotSample sample = null; int badPickupCount = 0; bool isPickingUp = false; for (int i = 0; i < count; i++) { // hack: for some reason there are lots of extra samples during the pickup, so artificially advance and drop them if (!IsPickingUpSample && isPickingUp) { do { sample = samples.Dequeue(); i++; badPickupCount++; } while (!sample.stopPickup && samples.Count > 0 && i < count); isPickingUp = false; IsPickingUpSample = false; } sample = samples.Dequeue(); transform.position = sample.position; transform.rotation = sample.rotation; if (sample.triggerPickup) { isPickingUp = true; // Debug.Log ( "recorded pickup" ); curObjective = sample.curSample.GetComponent <PickupSample> (); curObjective.transform.parent = null; curObjective.Collider.enabled = true; PickupObjective(null); } if (sample.stopPickup) { Debug.Log("STOP!!"); isPickingUp = false; IsPickingUpSample = false; } string camPath = WriteImage(recordingCam, "robocam", sample.timestamp); row = camPath + csvSeparatorChar + sample.steerAngle + csvSeparatorChar + sample.throttle + csvSeparatorChar + sample.brake + csvSeparatorChar + sample.speed + csvSeparatorChar + sample.position.x + csvSeparatorChar + sample.position.z + csvSeparatorChar + sample.pitch + csvSeparatorChar + sample.yaw + csvSeparatorChar + sample.roll + newLine; File.AppendAllText(Path.Combine(m_saveLocation, CSVFileName), row); yield return(null); } Debug.Log("bad pickup count: " + badPickupCount); isSaving = false; //need to reset the car back to its position before ending recording, otherwise sometimes the car ended up in strange areas transform.position = saved_position; transform.rotation = saved_rotation; Vector3 euler = cameraVAxis.localEulerAngles; euler.x = saved_vAngle; cameraVAxis.localEulerAngles = euler; Move(0); Rotate(0); RotateCamera(0, 0); } }
//Changed the WriteSamplesToDisk to a IEnumerator method that plays back recording along with percent status from UISystem script //instead of showing frozen screen until all data is recorded public IEnumerator WriteSamplesToDisk() { string newLine = "\n"; if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer) { newLine = "\r\n"; } yield return(null); if (samples.Count > 0) { string row = "Path,SteerAngle,Throttle,Brake,Speed,X_Position,Y_Position,Pitch,Yaw,Roll" + newLine; File.AppendAllText(Path.Combine(m_saveLocation, CSVFileName), row); ObjectiveSpawner.SetInitialPositions(); int count = samples.Count; RobotSample sample = null; int badPickupCount = 0; bool isPickingUp = false; for (int i = 0; i < count; i++) { // hack: for some reason there are lots of extra samples during the pickup, so artificially advance and drop them if (!IsPickingUpSample && isPickingUp) { do { sample = samples.Dequeue(); i++; badPickupCount++; } while (!sample.stopPickup && samples.Count > 0 && i < count); isPickingUp = false; } sample = samples.Dequeue(); transform.position = sample.position; transform.rotation = sample.rotation; if (sample.triggerPickup) { isPickingUp = true; // Debug.Log ( "recorded pickup" ); curObjective = sample.curSample.GetComponent <PickupSample> (); curObjective.transform.parent = null; curObjective.Collider.enabled = true; PickupObjective(null); } if (sample.stopPickup) { Debug.Log("STOP!!"); isPickingUp = false; } string camPath = WriteImage(recordingCam, "robocam", sample.timestamp); row = camPath + "," + sample.steerAngle + "," + sample.throttle + "," + sample.brake + "," + sample.speed + "," + sample.position.x + "," + sample.position.z + "," + sample.pitch + "," + sample.yaw + "," + sample.roll + newLine; File.AppendAllText(Path.Combine(m_saveLocation, CSVFileName), row); yield return(null); } Debug.Log("bad pickup count: " + badPickupCount); isSaving = false; //need to reset the car back to its position before ending recording, otherwise sometimes the car ended up in strange areas transform.position = saved_position; transform.rotation = saved_rotation; Vector3 euler = cameraVAxis.localEulerAngles; euler.x = saved_vAngle; cameraVAxis.localEulerAngles = euler; Move(0); Rotate(0); RotateCamera(0, 0); } /* yield return new WaitForSeconds(0.000f); //retrieve as fast as we can but still allow communication of main thread to screen and UISystem * if (samples.Count > 0) { * //pull off a sample from the que * RobotSample sample = samples.Dequeue(); * * //pysically moving the car to get the right camera position * transform.position = sample.position; * transform.rotation = sample.rotation; * // Vector3 euler = cameraVAxis.localEulerAngles; * // euler.x = sample.verticalAngle; * // cameraVAxis.localEulerAngles = euler; * * // Capture and Persist Image * string camPath = WriteImage ( recordingCam, "robocam", sample.timestamp ); * * string row = camPath + "," + sample.steerAngle + "," + sample.throttle + "," + sample.brake + "," + sample.speed + "," + * sample.position.x + "," + sample.position.y + "," + sample.position.z + "," + sample.yaw + "\r\n"; * // string row = string.Format ("{0},{1},{2},{3},{4},{5},{6}\n", centerPath, leftPath, rightPath, sample.steeringAngle, sample.throttle, sample.brake, sample.speed); * File.AppendAllText (Path.Combine (m_saveLocation, CSVFileName), row); * } * if (samples.Count > 0) { * //request if there are more samples to pull * StartCoroutine(WriteSamplesToDisk()); * } * else * { * //all samples have been pulled * StopCoroutine(WriteSamplesToDisk()); * isSaving = false; * * //need to reset the car back to its position before ending recording, otherwise sometimes the car ended up in strange areas * transform.position = saved_position; * transform.rotation = saved_rotation; * Vector3 euler = cameraVAxis.localEulerAngles; * euler.x = saved_vAngle; * cameraVAxis.localEulerAngles = euler; * Move ( 0 ); * Rotate ( 0 ); * RotateCamera ( 0, 0 ); * }*/ }