CalibrationRecorderBehavior.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. void Start()
  26. {
  27. taskQueue = new BlockingCollection<Action>();
  28. calibrationFileName = Path.Combine(Configuration.Instance.OutputCalibrationFilesDirectory, $"{DateTime.Now:yyyy-dd-M_HH-mm-ss}.csv");
  29. if (!File.Exists(calibrationFileName))
  30. {
  31. File.WriteAllLines(calibrationFileName, new string[] { "Time,WorldX,WorldY,WorldZ,UnityX,UnityY,UnityZ" });
  32. }
  33. }
  34. void Update()
  35. {
  36. var persons = PersonManager.Persons;
  37. if (PersonManager.Persons.Count == 1)
  38. {
  39. var person = PersonManager.Persons.Single();
  40. var marker = GameObject.Find("CalibrationMarker");
  41. var personPosition = person.WorldPosition;
  42. var markerPosition = marker.transform.position;
  43. 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}") }));
  44. Task.Run(() => taskQueue.Take().Invoke());
  45. }
  46. }
  47. }
  48. }