DepthPostprocessor.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using ROS2;
  5. [RequireComponent(typeof(Camera))]
  6. public class DepthPostprocessor : MonoBehaviour
  7. {
  8. public float timeBetweenRequests = 0.2f;
  9. public string TopicName = "rt/depth_processor";
  10. public string frame_id = null;
  11. //material that's applied when doing postprocessing
  12. [SerializeField]
  13. private Material mater;
  14. private RenderTexture m_RenderTexture;
  15. private ComputeBuffer buffer;
  16. private float[] output;
  17. private float timer = 0.0f;
  18. private ROS2UnityComponent ros2Unity;
  19. private ROS2Node ros2Node;
  20. private IPublisher<sensor_msgs.msg.Image> chatter_pub;
  21. private void Start()
  22. {
  23. ros2Unity = GetComponent<ROS2UnityComponent>();
  24. if (ros2Unity.Ok())
  25. {
  26. if (ros2Node == null)
  27. {
  28. ros2Node = ros2Unity.CreateNode("ROS2LFRdepthprocessor");
  29. }
  30. chatter_pub = ros2Node.CreatePublisher<sensor_msgs.msg.Image>(TopicName);
  31. }
  32. Camera camera = GetComponent<Camera>();
  33. camera.depthTextureMode = camera.depthTextureMode | DepthTextureMode.Depth;
  34. m_RenderTexture = camera.targetTexture;
  35. m_RenderTexture.depth = 32;
  36. m_RenderTexture.enableRandomWrite = true; // ik wijzig texture niet dus niet nodig?
  37. buffer = new ComputeBuffer(m_RenderTexture.width * m_RenderTexture.height, sizeof(float));
  38. output = new float[m_RenderTexture.width * m_RenderTexture.height];
  39. output[0] = 0.2f;
  40. output[30000] = 0.212f;
  41. buffer.SetData(output); // nodig?
  42. Graphics.SetRandomWriteTarget(1, buffer, true); // 1?
  43. mater.SetInt("_width", m_RenderTexture.width);
  44. mater.SetInt("_height", m_RenderTexture.height);
  45. mater.SetBuffer("_myBuffer", buffer);
  46. }
  47. private sensor_msgs.msg.Image CreateImageWithoutData()
  48. {
  49. sensor_msgs.msg.Image img = new sensor_msgs.msg.Image();
  50. // Image Header
  51. std_msgs.msg.Header header = new std_msgs.msg.Header();
  52. builtin_interfaces.msg.Time time = new builtin_interfaces.msg.Time();
  53. System.DateTime now = System.DateTime.UtcNow;
  54. time.Sec = now.Second;
  55. header.Stamp = time;
  56. header.Frame_id = frame_id;
  57. // Image Details
  58. img.Height = (uint) m_RenderTexture.height;
  59. img.Width = (uint) m_RenderTexture.width;
  60. img.Encoding = "32FC1";
  61. img.Is_bigendian = 0;
  62. img.Step = img.Width * 4; // 4 want float is 4 bytes
  63. return img;
  64. }
  65. private byte[] GetBytes(float[] input)
  66. {
  67. byte[] messageinput = new byte[input.Length * 4];
  68. for (int i = 0; i < input.Length; i++)
  69. {
  70. byte[] newbytes = System.BitConverter.GetBytes(input[i]);
  71. for (int j = 0; j < newbytes.Length; j++)
  72. {
  73. messageinput[i * 4 + j] = newbytes[j];
  74. }
  75. }
  76. return messageinput;
  77. }
  78. //method which is automatically called by unity after the camera is done rendering
  79. void OnRenderImage(RenderTexture source, RenderTexture destination)
  80. {
  81. Graphics.Blit(source, destination, mater);
  82. timer += Time.deltaTime;
  83. if (timer > timeBetweenRequests)
  84. {
  85. //draws the pixels from the source texture to the destination texture
  86. buffer.GetData(output);
  87. sensor_msgs.msg.Image img = CreateImageWithoutData();
  88. img.Data = GetBytes(output);
  89. if (ros2Unity.Ok())
  90. {
  91. chatter_pub.Publish(img);
  92. }
  93. timer = timer - timeBetweenRequests;
  94. }
  95. }
  96. private void OnDestroy()
  97. {
  98. buffer.Dispose();
  99. }
  100. }