CalibrationRecorderBehavior.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Assets.StreetLight;
  2. using Assets.StreetLight.Scripts;
  3. using Newtonsoft.Json;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Concurrent;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Threading.Tasks;
  11. using Unity.VisualScripting;
  12. using UnityEngine;
  13. namespace Assets
  14. {
  15. public class CalibrationRecorderBehavior : MonoBehaviour
  16. {
  17. PersonManager PersonManager => personManagerLazy.Value;
  18. Lazy<PersonManager> personManagerLazy;
  19. string calibrationFileName;
  20. private void Awake()
  21. {
  22. personManagerLazy = new Lazy<PersonManager>(FindObjectOfType<PersonManager>);
  23. }
  24. BlockingCollection<Action> taskQueue;
  25. GameObject marker;
  26. void Start()
  27. {
  28. taskQueue = new BlockingCollection<Action>();
  29. calibrationFileName = Path.Combine(Configuration.Instance.OutputCalibrationFilesDirectory, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.csv");
  30. if (!File.Exists(calibrationFileName))
  31. {
  32. File.WriteAllLines(calibrationFileName, new string[] { "Time,WorldX,WorldY,WorldZ,UnityX,UnityY,UnityZ" });
  33. }
  34. enabled = false;
  35. PersonManager.DetectionReady += PersonManager_DetectionReady;
  36. marker = GameObject.Find("CalibrationMarker");
  37. var markerBehavior = FindObjectOfType<CalibrationMarkerBehavior>();
  38. markerBehavior.PathFinished += MarkerBehavior_PathFinished;
  39. }
  40. private void MarkerBehavior_PathFinished(object sender, EventArgs e)
  41. {
  42. enabled = false;
  43. }
  44. private void PersonManager_DetectionReady(object sender, EventArgs e)
  45. {
  46. enabled = true;
  47. }
  48. void Update()
  49. {
  50. var persons = PersonManager.Persons;
  51. if (PersonManager.Persons.Count == 1)
  52. {
  53. var person = PersonManager.Persons.Single();
  54. var personPosition = person.WorldPosition;
  55. var markerPosition = marker.transform.position;
  56. taskQueue.Add(() => File.AppendAllLines(calibrationFileName, new string[] { FormattableString.Invariant($"{DateTime.Now:yyyy-MM-dd-HH-mm-ss-ff},{personPosition.x},{personPosition.y},{personPosition.z},{markerPosition.x},{markerPosition.y},{markerPosition.z}") }));
  57. Task.Run(() => taskQueue.Take().Invoke());
  58. }
  59. }
  60. }
  61. }