SimulationTimeSource.cpp 3.6 KB

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