CalibrationRecorderBehavior.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. enabled = false;
  34. PersonManager.DetectionReady += PersonManager_DetectionReady;
  35. }
  36. private void PersonManager_DetectionReady(object sender, EventArgs e)
  37. {
  38. enabled = true;
  39. }
  40. void Update()
  41. {
  42. var persons = PersonManager.Persons;
  43. if (PersonManager.Persons.Count == 1)
  44. {
  45. var person = PersonManager.Persons.Single();
  46. var marker = GameObject.Find("CalibrationMarker");
  47. var personPosition = person.WorldPosition;
  48. var markerPosition = marker.transform.position;
  49. 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}") }));
  50. Task.Run(() => taskQueue.Take().Invoke());
  51. }
  52. }
  53. }
  54. }