LidarSensorConfiguration.cpp 9.0 KB

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