LidarSensorConfiguration.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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 "Lidar/LidarRegistrarSystemComponent.h"
  9. #include <AzCore/Serialization/EditContext.h>
  10. #include <AzCore/Serialization/EditContextConstants.inl>
  11. #include <ROS2Sensors/Lidar/LidarSensorConfiguration.h>
  12. namespace ROS2Sensors
  13. {
  14. void LidarSensorConfiguration::Reflect(AZ::ReflectContext* context)
  15. {
  16. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  17. {
  18. serializeContext->Class<LidarSensorConfiguration>()
  19. ->Version(2)
  20. ->Field("lidarModelName", &LidarSensorConfiguration::m_lidarModelName)
  21. ->Field("lidarImplementation", &LidarSensorConfiguration::m_lidarSystem)
  22. ->Field("LidarParameters", &LidarSensorConfiguration::m_lidarParameters)
  23. ->Field("IgnoredLayerIndices", &LidarSensorConfiguration::m_ignoredCollisionLayers)
  24. ->Field("ExcludedEntities", &LidarSensorConfiguration::m_excludedEntities)
  25. ->Field("IsSegmentationEnabled", &LidarSensorConfiguration::m_isSegmentationEnabled)
  26. ->Field("PointsAtMax", &LidarSensorConfiguration::m_addPointsAtMax);
  27. if (AZ::EditContext* ec = serializeContext->GetEditContext())
  28. {
  29. ec->Class<LidarSensorConfiguration>("Lidar Sensor configuration", "Lidar sensor configuration")
  30. ->DataElement(AZ::Edit::UIHandlers::ComboBox, &LidarSensorConfiguration::m_lidarModelName, "Lidar Model", "Lidar model")
  31. ->Attribute(AZ::Edit::Attributes::ChangeNotify, &LidarSensorConfiguration::OnLidarModelSelected)
  32. ->Attribute(AZ::Edit::Attributes::StringList, &LidarSensorConfiguration::GetAvailableModels)
  33. ->DataElement(
  34. AZ::Edit::UIHandlers::ComboBox,
  35. &LidarSensorConfiguration::m_lidarSystem,
  36. "Lidar Implementation",
  37. "Select a lidar implementation out of registered ones.")
  38. ->Attribute(AZ::Edit::Attributes::ChangeNotify, &LidarSensorConfiguration::OnLidarImplementationSelected)
  39. ->Attribute(AZ::Edit::Attributes::StringList, &LidarSensorConfiguration::FetchLidarSystemList)
  40. ->DataElement(
  41. AZ::Edit::UIHandlers::EntityId,
  42. &LidarSensorConfiguration::m_lidarParameters,
  43. "Lidar parameters",
  44. "Configuration of Custom lidar")
  45. ->Attribute(AZ::Edit::Attributes::Visibility, &LidarSensorConfiguration::IsConfigurationVisible)
  46. ->DataElement(
  47. AZ::Edit::UIHandlers::Default,
  48. &LidarSensorConfiguration::m_ignoredCollisionLayers,
  49. "Ignored collision layers",
  50. "Indices of collision layers to ignore")
  51. ->Attribute(AZ::Edit::Attributes::Visibility, &LidarSensorConfiguration::IsIgnoredLayerConfigurationVisible)
  52. ->DataElement(
  53. AZ::Edit::UIHandlers::Default,
  54. &LidarSensorConfiguration::m_excludedEntities,
  55. "Excluded Entities",
  56. "List of entities excluded from raycasting.")
  57. ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
  58. ->Attribute(AZ::Edit::Attributes::ContainerCanBeModified, true)
  59. ->Attribute(AZ::Edit::Attributes::Visibility, &LidarSensorConfiguration::IsEntityExclusionVisible)
  60. ->DataElement(
  61. AZ::Edit::UIHandlers::Default,
  62. &LidarSensorConfiguration::m_isSegmentationEnabled,
  63. "Enable Segmentation",
  64. "Enable point cloud segmentation. Note: Make sure to add the Class Segmentation Configuration Component to the "
  65. "level entity.")
  66. ->Attribute(AZ::Edit::Attributes::Visibility, &LidarSensorConfiguration::IsSegmentationConfigurationVisible)
  67. ->DataElement(
  68. AZ::Edit::UIHandlers::Default,
  69. &LidarSensorConfiguration::m_addPointsAtMax,
  70. "Points at Max",
  71. "If set true LiDAR will produce points at max range for free space")
  72. ->Attribute(AZ::Edit::Attributes::Visibility, &LidarSensorConfiguration::IsMaxPointsConfigurationVisible);
  73. }
  74. }
  75. }
  76. LidarSensorConfiguration::LidarSensorConfiguration(AZStd::vector<LidarTemplate::LidarModel> availableModels)
  77. : m_availableModels(AZStd::move(availableModels))
  78. {
  79. if (m_availableModels.empty())
  80. {
  81. AZ_Warning("LidarSensorConfiguration", false, "Lidar configuration created with an empty models list");
  82. return;
  83. }
  84. m_lidarModel = m_availableModels.front();
  85. m_lidarParameters = LidarTemplateUtils::GetTemplate(m_lidarModel);
  86. m_lidarModelName = m_lidarParameters.m_name;
  87. }
  88. void LidarSensorConfiguration::FetchLidarImplementationFeatures()
  89. {
  90. if (m_lidarSystem.empty())
  91. {
  92. m_lidarSystem = Details::GetDefaultLidarSystem();
  93. }
  94. const auto* lidarMetaData = LidarRegistrarInterface::Get()->GetLidarSystemMetaData(m_lidarSystem);
  95. AZ_Warning("LidarSensorConfiguration", lidarMetaData, "No metadata for \"%s\"", m_lidarSystem.c_str());
  96. if (lidarMetaData)
  97. {
  98. m_lidarSystemFeatures = LidarRegistrarInterface::Get()->GetLidarSystemMetaData(m_lidarSystem)->m_features;
  99. }
  100. }
  101. AZStd::vector<AZStd::string> LidarSensorConfiguration::GetAvailableModels() const
  102. {
  103. AZStd::vector<AZStd::string> result;
  104. for (const auto& model : m_availableModels)
  105. {
  106. auto templ = LidarTemplateUtils::GetTemplate(model);
  107. result.push_back({ templ.m_name });
  108. }
  109. return result;
  110. }
  111. void LidarSensorConfiguration::FetchLidarModelConfiguration()
  112. {
  113. if (m_availableModels.empty())
  114. {
  115. AZ_Warning("LidarSensorConfiguration", false, "Lidar configuration created with an empty models list");
  116. return;
  117. }
  118. m_lidarModel = m_availableModels.front();
  119. for (const auto& model : m_availableModels)
  120. {
  121. auto templ = LidarTemplateUtils::GetTemplate(model);
  122. if (m_lidarModelName == templ.m_name)
  123. {
  124. m_lidarModel = model;
  125. break;
  126. }
  127. }
  128. m_lidarParameters = LidarTemplateUtils::GetTemplate(m_lidarModel);
  129. }
  130. bool LidarSensorConfiguration::IsConfigurationVisible() const
  131. {
  132. return m_lidarModel == LidarTemplate::LidarModel::Custom3DLidar || m_lidarModel == LidarTemplate::LidarModel::Custom2DLidar;
  133. }
  134. bool LidarSensorConfiguration::IsIgnoredLayerConfigurationVisible() const
  135. {
  136. return m_lidarSystemFeatures & LidarSystemFeatures::CollisionLayers;
  137. }
  138. bool LidarSensorConfiguration::IsEntityExclusionVisible() const
  139. {
  140. return m_lidarSystemFeatures & LidarSystemFeatures::EntityExclusion;
  141. }
  142. bool LidarSensorConfiguration::IsMaxPointsConfigurationVisible() const
  143. {
  144. return m_lidarSystemFeatures & LidarSystemFeatures::MaxRangePoints;
  145. }
  146. bool LidarSensorConfiguration::IsSegmentationConfigurationVisible() const
  147. {
  148. return m_lidarSystemFeatures & LidarSystemFeatures::Segmentation;
  149. }
  150. AZ::Crc32 LidarSensorConfiguration::OnLidarModelSelected()
  151. {
  152. FetchLidarModelConfiguration();
  153. UpdateShowNoise();
  154. return AZ::Edit::PropertyRefreshLevels::EntireTree;
  155. }
  156. AZ::Crc32 LidarSensorConfiguration::OnLidarImplementationSelected()
  157. {
  158. FetchLidarImplementationFeatures();
  159. UpdateShowNoise();
  160. return AZ::Edit::PropertyRefreshLevels::EntireTree;
  161. }
  162. AZStd::vector<AZStd::string> LidarSensorConfiguration::FetchLidarSystemList()
  163. {
  164. FetchLidarImplementationFeatures();
  165. UpdateShowNoise();
  166. return LidarRegistrarInterface::Get()->GetRegisteredLidarSystems();
  167. }
  168. void LidarSensorConfiguration::UpdateShowNoise()
  169. {
  170. m_lidarParameters.m_showNoiseConfig = m_lidarSystemFeatures & LidarSystemFeatures::Noise;
  171. }
  172. } // namespace ROS2Sensors