ROS2CameraSensorEditorComponent.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "ROS2CameraSensorEditorComponent.h"
  9. #include "ROS2CameraSensorComponent.h"
  10. #include <AzCore/Component/TransformBus.h>
  11. #include <ROS2/Frame/ROS2FrameComponent.h>
  12. namespace ROS2
  13. {
  14. ROS2CameraSensorEditorComponent::ROS2CameraSensorEditorComponent()
  15. {
  16. m_sensorConfiguration.m_frequency = 10;
  17. m_sensorConfiguration.m_publishersConfigurations.insert(
  18. MakeTopicConfigurationPair("camera_image_color", CameraConstants::ImageMessageType, CameraConstants::ColorImageConfig));
  19. m_sensorConfiguration.m_publishersConfigurations.insert(
  20. MakeTopicConfigurationPair("camera_image_depth", CameraConstants::ImageMessageType, CameraConstants::DepthImageConfig));
  21. m_sensorConfiguration.m_publishersConfigurations.insert(
  22. MakeTopicConfigurationPair("camera_info", CameraConstants::CameraInfoMessageType, CameraConstants::InfoConfig));
  23. }
  24. void ROS2CameraSensorEditorComponent::Reflect(AZ::ReflectContext* context)
  25. {
  26. if (auto* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  27. {
  28. serialize->Class<ROS2CameraSensorEditorComponent, AzToolsFramework::Components::EditorComponentBase>()
  29. ->Version(4)
  30. ->Field("VerticalFieldOfViewDeg", &ROS2CameraSensorEditorComponent::m_VerticalFieldOfViewDeg)
  31. ->Field("Width", &ROS2CameraSensorEditorComponent::m_width)
  32. ->Field("Height", &ROS2CameraSensorEditorComponent::m_height)
  33. ->Field("Depth", &ROS2CameraSensorEditorComponent::m_depthCamera)
  34. ->Field("Color", &ROS2CameraSensorEditorComponent::m_colorCamera)
  35. ->Field("SensorConfig", &ROS2CameraSensorEditorComponent::m_sensorConfiguration);
  36. if (AZ::EditContext* editContext = serialize->GetEditContext())
  37. {
  38. editContext->Class<ROS2CameraSensorEditorComponent>("ROS2 Camera Sensor", "[Camera component]")
  39. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  40. ->Attribute(AZ::Edit::Attributes::Category, "ROS2")
  41. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game"))
  42. ->DataElement(
  43. AZ::Edit::UIHandlers::Default,
  44. &ROS2CameraSensorEditorComponent::m_sensorConfiguration,
  45. "Sensor configuration",
  46. "Sensor configuration")
  47. ->DataElement(
  48. AZ::Edit::UIHandlers::Default,
  49. &ROS2CameraSensorEditorComponent::m_VerticalFieldOfViewDeg,
  50. "Vertical field of view",
  51. "Camera's vertical (y axis) field of view in degrees.")
  52. ->DataElement(AZ::Edit::UIHandlers::Default, &ROS2CameraSensorEditorComponent::m_width, "Image width", "Image width")
  53. ->DataElement(AZ::Edit::UIHandlers::Default, &ROS2CameraSensorEditorComponent::m_height, "Image height", "Image height")
  54. ->DataElement(
  55. AZ::Edit::UIHandlers::Default, &ROS2CameraSensorEditorComponent::m_colorCamera, "Color Camera", "Color Camera")
  56. ->DataElement(
  57. AZ::Edit::UIHandlers::Default, &ROS2CameraSensorEditorComponent::m_depthCamera, "Depth Camera", "Depth Camera");
  58. }
  59. }
  60. }
  61. void ROS2CameraSensorEditorComponent::Activate()
  62. {
  63. AzFramework::EntityDebugDisplayEventBus::Handler::BusConnect(this->GetEntityId());
  64. AzToolsFramework::Components::EditorComponentBase::Activate();
  65. }
  66. void ROS2CameraSensorEditorComponent::Deactivate()
  67. {
  68. AzToolsFramework::Components::EditorComponentBase::Deactivate();
  69. AzFramework::EntityDebugDisplayEventBus::Handler::BusDisconnect();
  70. }
  71. void ROS2CameraSensorEditorComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  72. {
  73. required.push_back(AZ_CRC("ROS2Frame"));
  74. }
  75. void ROS2CameraSensorEditorComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  76. {
  77. incompatible.push_back(AZ_CRC_CE("ROS2SensorCamera"));
  78. }
  79. void ROS2CameraSensorEditorComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  80. {
  81. required.push_back(AZ_CRC_CE("ROS2SensorCamera"));
  82. }
  83. void ROS2CameraSensorEditorComponent::BuildGameEntity(AZ::Entity* gameEntity)
  84. {
  85. gameEntity->CreateComponent<ROS2::ROS2CameraSensorComponent>(
  86. m_sensorConfiguration, m_VerticalFieldOfViewDeg, m_width, m_height, m_colorCamera, m_depthCamera);
  87. }
  88. void ROS2CameraSensorEditorComponent::DisplayEntityViewport(
  89. [[maybe_unused]] const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay)
  90. {
  91. if (!m_sensorConfiguration.m_visualise)
  92. {
  93. return;
  94. }
  95. const AZ::u32 stateBefore = debugDisplay.GetState();
  96. AZ::Transform transform = GetEntity()->GetTransform()->GetWorldTM();
  97. // dimension of drawing
  98. const float arrowRise = 1.1f;
  99. const float arrowSize = 0.5f;
  100. const float frustumScale = 0.1f;
  101. transform.SetUniformScale(frustumScale);
  102. debugDisplay.DepthTestOff();
  103. const float ver = 0.5f * AZStd::tan((AZ::DegToRad(m_VerticalFieldOfViewDeg * 0.5f)));
  104. const float hor = m_height * ver / m_width;
  105. // frustum drawing
  106. const AZ::Vector3 p1(-ver, -hor, 1.f);
  107. const AZ::Vector3 p2(ver, -hor, 1.f);
  108. const AZ::Vector3 p3(ver, hor, 1.f);
  109. const AZ::Vector3 p4(-ver, hor, 1.f);
  110. const AZ::Vector3 p0(0, 0, 0);
  111. const AZ::Vector3 py(0.1, 0, 0);
  112. const auto pt1 = transform.TransformPoint(p1);
  113. const auto pt2 = transform.TransformPoint(p2);
  114. const auto pt3 = transform.TransformPoint(p3);
  115. const auto pt4 = transform.TransformPoint(p4);
  116. const auto pt0 = transform.TransformPoint(p0);
  117. const auto ptz = transform.TransformPoint(AZ::Vector3::CreateAxisZ(0.2f));
  118. const auto pty = transform.TransformPoint(AZ::Vector3::CreateAxisY(0.2f));
  119. const auto ptx = transform.TransformPoint(AZ::Vector3::CreateAxisX(0.2f));
  120. debugDisplay.SetColor(AZ::Color(0.f, 1.f, 1.f, 1.f));
  121. debugDisplay.SetLineWidth(1);
  122. debugDisplay.DrawLine(pt1, pt2);
  123. debugDisplay.DrawLine(pt2, pt3);
  124. debugDisplay.DrawLine(pt3, pt4);
  125. debugDisplay.DrawLine(pt4, pt1);
  126. debugDisplay.DrawLine(pt1, pt0);
  127. debugDisplay.DrawLine(pt2, pt0);
  128. debugDisplay.DrawLine(pt3, pt0);
  129. debugDisplay.DrawLine(pt4, pt0);
  130. // up-arrow drawing
  131. const AZ::Vector3 pa1(-arrowSize * ver, -arrowRise * hor, 1.f);
  132. const AZ::Vector3 pa2(arrowSize * ver, -arrowRise * hor, 1.f);
  133. const AZ::Vector3 pa3(0, (-arrowRise - arrowSize) * hor, 1.f);
  134. const auto pat1 = transform.TransformPoint(pa1);
  135. const auto pat2 = transform.TransformPoint(pa2);
  136. const auto pat3 = transform.TransformPoint(pa3);
  137. debugDisplay.SetColor(AZ::Color(0.f, 0.6f, 1.f, 1.f));
  138. debugDisplay.SetLineWidth(1);
  139. debugDisplay.DrawLine(pat1, pat2);
  140. debugDisplay.DrawLine(pat2, pat3);
  141. debugDisplay.DrawLine(pat3, pat1);
  142. // coordinate system drawing
  143. debugDisplay.SetColor(AZ::Color(1.f, 0.f, 0.f, 1.f));
  144. debugDisplay.SetLineWidth(2);
  145. debugDisplay.DrawLine(ptx, pt0);
  146. debugDisplay.SetColor(AZ::Color(0.f, 1.f, 0.f, 1.f));
  147. debugDisplay.SetLineWidth(2);
  148. debugDisplay.DrawLine(pty, pt0);
  149. debugDisplay.SetColor(AZ::Color(0.f, 0.f, 1.f, 1.f));
  150. debugDisplay.SetLineWidth(2);
  151. debugDisplay.DrawLine(ptz, pt0);
  152. debugDisplay.SetState(stateBefore);
  153. }
  154. AZStd::pair<AZStd::string, TopicConfiguration> ROS2CameraSensorEditorComponent::MakeTopicConfigurationPair(
  155. const AZStd::string& topic, const AZStd::string& messageType, const AZStd::string& configName) const
  156. {
  157. TopicConfiguration config;
  158. config.m_topic = topic;
  159. config.m_type = messageType;
  160. return AZStd::make_pair(configName, config);
  161. }
  162. } // namespace ROS2