ROS2GNSSSensorComponent.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 "ROS2GNSSSensorComponent.h"
  9. #include <ROS2/Frame/ROS2FrameComponent.h>
  10. #include <ROS2/ROS2Bus.h>
  11. #include <ROS2/ROS2GemUtilities.h>
  12. #include <ROS2/Utilities/ROS2Conversions.h>
  13. #include <ROS2/Utilities/ROS2Names.h>
  14. #include <AzCore/Math/Matrix4x4.h>
  15. #include <AzCore/Serialization/EditContext.h>
  16. #include <AzCore/Serialization/EditContextConstants.inl>
  17. #include "GNSSFormatConversions.h"
  18. namespace ROS2
  19. {
  20. namespace Internal
  21. {
  22. const char* kGNSSMsgType = "sensor_msgs::msg::NavSatFix";
  23. }
  24. void ROS2GNSSSensorComponent::Reflect(AZ::ReflectContext* context)
  25. {
  26. if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  27. {
  28. serialize->Class<ROS2GNSSSensorComponent, ROS2SensorComponent>()
  29. ->Version(1)
  30. ->Field("gnssOriginLatitude", &ROS2GNSSSensorComponent::m_gnssOriginLatitudeDeg)
  31. ->Field("gnssOriginLongitude", &ROS2GNSSSensorComponent::m_gnssOriginLongitudeDeg)
  32. ->Field("gnssOriginAltitude", &ROS2GNSSSensorComponent::m_gnssOriginAltitude);
  33. if (AZ::EditContext* ec = serialize->GetEditContext())
  34. {
  35. ec->Class<ROS2GNSSSensorComponent>("ROS2 GNSS Sensor", "GNSS sensor component")
  36. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  37. ->Attribute(AZ::Edit::Attributes::Category, "ROS2")
  38. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game"))
  39. ->DataElement(
  40. AZ::Edit::UIHandlers::Default,
  41. &ROS2GNSSSensorComponent::m_gnssOriginLatitudeDeg,
  42. "Latitude offset",
  43. "GNSS latitude position offset in degrees")
  44. ->DataElement(
  45. AZ::Edit::UIHandlers::Default,
  46. &ROS2GNSSSensorComponent::m_gnssOriginLongitudeDeg,
  47. "Longitude offset",
  48. "GNSS longitude position offset in degrees")
  49. ->DataElement(
  50. AZ::Edit::UIHandlers::Default,
  51. &ROS2GNSSSensorComponent::m_gnssOriginAltitude,
  52. "Altitude offset",
  53. "GNSS altitude position offset in meters");
  54. }
  55. }
  56. }
  57. ROS2GNSSSensorComponent::ROS2GNSSSensorComponent()
  58. {
  59. TopicConfiguration pc;
  60. pc.m_type = Internal::kGNSSMsgType;
  61. pc.m_topic = "gnss";
  62. m_sensorConfiguration.m_frequency = 10;
  63. m_sensorConfiguration.m_publishersConfigurations.insert(AZStd::make_pair(Internal::kGNSSMsgType, pc));
  64. }
  65. void ROS2GNSSSensorComponent::Activate()
  66. {
  67. ROS2SensorComponent::Activate();
  68. auto ros2Node = ROS2Interface::Get()->GetNode();
  69. AZ_Assert(m_sensorConfiguration.m_publishersConfigurations.size() == 1, "Invalid configuration of publishers for GNSS sensor");
  70. const auto publisherConfig = m_sensorConfiguration.m_publishersConfigurations[Internal::kGNSSMsgType];
  71. const auto fullTopic = ROS2Names::GetNamespacedName(GetNamespace(), publisherConfig.m_topic);
  72. m_gnssPublisher = ros2Node->create_publisher<sensor_msgs::msg::NavSatFix>(fullTopic.data(), publisherConfig.GetQoS());
  73. m_gnssMsg.header.frame_id = "gnss_frame_id";
  74. }
  75. void ROS2GNSSSensorComponent::Deactivate()
  76. {
  77. ROS2SensorComponent::Deactivate();
  78. m_gnssPublisher.reset();
  79. }
  80. void ROS2GNSSSensorComponent::FrequencyTick()
  81. {
  82. const AZ::Vector3 currentPosition = GetCurrentPose().GetTranslation();
  83. const AZ::Vector3 currentPositionECEF =
  84. GNSS::ENUToECEF({ m_gnssOriginLatitudeDeg, m_gnssOriginLongitudeDeg, m_gnssOriginAltitude }, currentPosition);
  85. const AZ::Vector3 currentPositionWGS84 = GNSS::ECEFToWGS84(currentPositionECEF);
  86. m_gnssMsg.latitude = currentPositionWGS84.GetX();
  87. m_gnssMsg.longitude = currentPositionWGS84.GetY();
  88. m_gnssMsg.altitude = currentPositionWGS84.GetZ();
  89. m_gnssMsg.status.status = sensor_msgs::msg::NavSatStatus::STATUS_SBAS_FIX;
  90. m_gnssMsg.status.service = sensor_msgs::msg::NavSatStatus::SERVICE_GALILEO;
  91. m_gnssPublisher->publish(m_gnssMsg);
  92. }
  93. AZ::Transform ROS2GNSSSensorComponent::GetCurrentPose() const
  94. {
  95. auto* ros2Frame = Utils::GetGameOrEditorComponent<ROS2FrameComponent>(GetEntity());
  96. return ros2Frame->GetFrameTransform();
  97. }
  98. } // namespace ROS2