SimulationTimeSource.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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/Settings/SettingsRegistry.h>
  9. #include <AzCore/Time/ITime.h>
  10. #include <ROS2/Clock/SimulationTimeSource.h>
  11. #include <ROS2/ROS2Bus.h>
  12. namespace ROS2
  13. {
  14. namespace
  15. {
  16. constexpr AZStd::string_view ResetTimestampOnLevelReload = "/O3DE/ROS2/SteadyClock/ResetTimestampOnLevelReload";
  17. }
  18. void SimulationTimeSource::Activate()
  19. {
  20. auto* registry = AZ::SettingsRegistry::Get();
  21. AZ_Assert(registry, "No Registry available");
  22. if (registry)
  23. {
  24. registry->Get(m_resetTimeOnRestart, ResetTimestampOnLevelReload);
  25. }
  26. auto* systemInterface = AZ::Interface<AzPhysics::SystemInterface>::Get();
  27. if (!systemInterface)
  28. {
  29. AZ_Warning("SimulationTimeSource", false, "Failed to get AzPhysics::SystemInterface");
  30. return;
  31. }
  32. m_onSceneSimulationEvent = AzPhysics::SceneEvents::OnSceneSimulationFinishHandler(
  33. [this](AzPhysics::SceneHandle sceneHandle, float deltaTime)
  34. {
  35. m_elapsed += static_cast<double>(deltaTime);
  36. });
  37. m_onSceneAdded = AzPhysics::SystemEvents::OnSceneAddedEvent::Handler(
  38. [this](AzPhysics::SceneHandle sceneHandle)
  39. {
  40. auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get();
  41. AzPhysics::SceneHandle defaultSceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName);
  42. if (sceneHandle == defaultSceneHandle)
  43. {
  44. AZ_Printf("SimulationTimeSource", "Registering clock to default scene");
  45. if (m_resetTimeOnRestart)
  46. {
  47. AZ_Printf("SimulationTimeSource", "Reseting clock");
  48. m_elapsed = 0.0;
  49. }
  50. sceneInterface->RegisterSceneSimulationFinishHandler(sceneHandle, m_onSceneSimulationEvent);
  51. }
  52. });
  53. systemInterface->RegisterSceneAddedEvent(m_onSceneAdded);
  54. m_onSceneRemoved = AzPhysics::SystemEvents::OnSceneRemovedEvent::Handler(
  55. [this](AzPhysics::SceneHandle sceneHandle)
  56. {
  57. auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get();
  58. AzPhysics::SceneHandle defaultSceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName);
  59. if (sceneHandle == defaultSceneHandle)
  60. {
  61. AZ_Printf("SimulationTimeSource", "Removing clock to default scene");
  62. m_onSceneSimulationEvent.Disconnect();
  63. }
  64. });
  65. systemInterface->RegisterSceneRemovedEvent(m_onSceneRemoved);
  66. }
  67. void SimulationTimeSource::Deactivate()
  68. {
  69. m_onSceneSimulationEvent.Disconnect();
  70. };
  71. builtin_interfaces::msg::Time SimulationTimeSource::GetROSTimestamp() const
  72. {
  73. builtin_interfaces::msg::Time timeStamp;
  74. timeStamp.sec = static_cast<int32_t>(AZStd::floor(m_elapsed));
  75. timeStamp.nanosec = static_cast<uint32_t>((m_elapsed - timeStamp.sec) * 1e9);
  76. return timeStamp;
  77. }
  78. AZ::Outcome<void, AZStd::string> SimulationTimeSource::AdjustTime(const builtin_interfaces::msg::Time& time)
  79. {
  80. const double timeSec = static_cast<double>(time.sec) + static_cast<double>(time.nanosec) * 1e-9;
  81. m_elapsed = timeSec;
  82. return AZ::Success();
  83. }
  84. } // namespace ROS2