SimulationTimeSource.cpp 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. } // namespace ROS2