浏览代码

Merge pull request #923 from RobotecAI/jh/sync_develop

This PR is to merge work completed based on the RFC 96, which splits ROS2 Gem into the following Gems:
- ROS2 (base Gem with ROS 2 node and some ROS 2 utilities)
- ROS2Sensors (a collection of ROS 2 sensors implementations)
- ROS2Controllers (a collection of ROS 2 joint manipulation, vehicle dynamics and robot control methods)
- ROS2RobotImporter (URDF/SDF robot importer wizard and asset builder)

The PR was reviewed as a set of PRs targeting a feature branch:
- [RFC 96] Move sensors from ROS2 Gem into new ROS2Sensors #847
- [RFC 96] Create new Gem ROS2Controllers out of ROS2 Gem #881
- [RFC 96] Create new Gem ROS2RobotImporter out of ROS2 Gem #895
- [RFC 96] Change namespaces in ROS2Sensors, ROS2RobotImporter and ROS2Controllers #898
- [RFC 96] Redo ROS2 Gem (system components; cmake) #897
- [RFC 96] Add sensor configuration API #914
- [RFC 96] Add temporal ROS2.Editor.Static target #918
- [RFC 96] Re-enable ROS2WheelOdometrySensorComponent within ROS2Controllers Gem #917
- [RFC 96] Re-enable sensor hooks in RobotImporter Gem #920
- [RFC 96] Re-enable Skid and Ackermann model hooks in RobotImporter Gem #922
Jan Hanca 3 周之前
父节点
当前提交
5a506ac543
共有 100 个文件被更改,包括 833 次插入1596 次删除
  1. 0 5
      Gems/ROS2/Assets/Editor/Images/Icons/ROS2.qrc
  2. 0 7
      Gems/ROS2/Assets/Sdf/empty.sdf
  3. 2 14
      Gems/ROS2/Assets/seedList.seed
  4. 179 105
      Gems/ROS2/Code/CMakeLists.txt
  5. 1 1
      Gems/ROS2/Code/FindROS2.cmake
  6. 0 44
      Gems/ROS2/Code/Include/ROS2/Camera/CameraCalibrationRequestBus.h
  7. 8 7
      Gems/ROS2/Code/Include/ROS2/Communication/PublisherConfiguration.h
  8. 2 1
      Gems/ROS2/Code/Include/ROS2/Communication/QoS.h
  9. 5 4
      Gems/ROS2/Code/Include/ROS2/Communication/TopicConfiguration.h
  10. 2 1
      Gems/ROS2/Code/Include/ROS2/Frame/NamespaceConfiguration.h
  11. 2 1
      Gems/ROS2/Code/Include/ROS2/Frame/ROS2FrameComponent.h
  12. 2 1
      Gems/ROS2/Code/Include/ROS2/Frame/ROS2FrameConfiguration.h
  13. 2 1
      Gems/ROS2/Code/Include/ROS2/Frame/ROS2FrameEditorComponent.h
  14. 3 1
      Gems/ROS2/Code/Include/ROS2/ROS2Bus.h
  15. 0 20
      Gems/ROS2/Code/Include/ROS2/ROS2SensorTypesIds.h
  16. 49 0
      Gems/ROS2/Code/Include/ROS2/ROS2TypeIds.h
  17. 3 3
      Gems/ROS2/Code/Include/ROS2/Sensor/Events/EventSourceAdapter.h
  18. 2 1
      Gems/ROS2/Code/Include/ROS2/Sensor/Events/PhysicsBasedSource.h
  19. 4 2
      Gems/ROS2/Code/Include/ROS2/Sensor/Events/TickBasedSource.h
  20. 5 6
      Gems/ROS2/Code/Include/ROS2/Sensor/ROS2SensorComponentBase.h
  21. 40 3
      Gems/ROS2/Code/Include/ROS2/Sensor/SensorConfiguration.h
  22. 3 2
      Gems/ROS2/Code/Include/ROS2/Sensor/SensorConfigurationRequestBus.h
  23. 0 30
      Gems/ROS2/Code/Include/ROS2/Sensor/SensorHelper.h
  24. 3 2
      Gems/ROS2/Code/Include/ROS2/Spawner/SpawnerBus.h
  25. 3 3
      Gems/ROS2/Code/Include/ROS2/Spawner/SpawnerBusHandler.h
  26. 3 1
      Gems/ROS2/Code/Platform/Android/PAL_android.cmake
  27. 3 0
      Gems/ROS2/Code/Platform/Android/ros2_api_files.cmake
  28. 8 0
      Gems/ROS2/Code/Platform/Android/ros2_private_files.cmake
  29. 8 0
      Gems/ROS2/Code/Platform/Android/ros2_shared_files.cmake
  30. 3 11
      Gems/ROS2/Code/Platform/Linux/PAL_linux.cmake
  31. 3 0
      Gems/ROS2/Code/Platform/Linux/ros2_api_files.cmake
  32. 3 0
      Gems/ROS2/Code/Platform/Linux/ros2_editor_api_files.cmake
  33. 8 0
      Gems/ROS2/Code/Platform/Linux/ros2_private_files.cmake
  34. 8 0
      Gems/ROS2/Code/Platform/Linux/ros2_shared_files.cmake
  35. 3 1
      Gems/ROS2/Code/Platform/Mac/PAL_mac.cmake
  36. 3 0
      Gems/ROS2/Code/Platform/Mac/ros2_api_files.cmake
  37. 3 0
      Gems/ROS2/Code/Platform/Mac/ros2_editor_api_files.cmake
  38. 8 0
      Gems/ROS2/Code/Platform/Mac/ros2_private_files.cmake
  39. 8 0
      Gems/ROS2/Code/Platform/Mac/ros2_shared_files.cmake
  40. 3 1
      Gems/ROS2/Code/Platform/Windows/PAL_windows.cmake
  41. 3 0
      Gems/ROS2/Code/Platform/Windows/ros2_api_files.cmake
  42. 3 0
      Gems/ROS2/Code/Platform/Windows/ros2_editor_api_files.cmake
  43. 8 0
      Gems/ROS2/Code/Platform/Windows/ros2_private_files.cmake
  44. 8 0
      Gems/ROS2/Code/Platform/Windows/ros2_shared_files.cmake
  45. 3 1
      Gems/ROS2/Code/Platform/iOS/PAL_ios.cmake
  46. 3 0
      Gems/ROS2/Code/Platform/iOS/ros2_api_files.cmake
  47. 8 0
      Gems/ROS2/Code/Platform/iOS/ros2_private_files.cmake
  48. 8 0
      Gems/ROS2/Code/Platform/iOS/ros2_shared_files.cmake
  49. 0 21
      Gems/ROS2/Code/Source/Camera/CameraConstants.h
  50. 0 139
      Gems/ROS2/Code/Source/Camera/ROS2CameraSensorComponent.cpp
  51. 0 89
      Gems/ROS2/Code/Source/Camera/ROS2CameraSystemComponent.cpp
  52. 0 43
      Gems/ROS2/Code/Source/Camera/ROS2CameraSystemComponent.h
  53. 6 1
      Gems/ROS2/Code/Source/Clients/ROS2Module.cpp
  54. 16 18
      Gems/ROS2/Code/Source/Clients/ROS2SystemComponent.cpp
  55. 9 9
      Gems/ROS2/Code/Source/Clients/ROS2SystemComponent.h
  56. 8 6
      Gems/ROS2/Code/Source/Frame/ROS2FrameComponent.cpp
  57. 0 147
      Gems/ROS2/Code/Source/Lidar/ROS2Lidar2DSensorComponent.cpp
  58. 0 53
      Gems/ROS2/Code/Source/Lidar/ROS2Lidar2DSensorComponent.h
  59. 0 58
      Gems/ROS2/Code/Source/Lidar/ROS2LidarSensorComponent.h
  60. 0 140
      Gems/ROS2/Code/Source/Odometry/ROS2WheelOdometry.cpp
  61. 0 50
      Gems/ROS2/Code/Source/Odometry/ROS2WheelOdometry.h
  62. 53 0
      Gems/ROS2/Code/Source/ROS2ModuleInterface.cpp
  63. 9 98
      Gems/ROS2/Code/Source/ROS2ModuleInterface.h
  64. 0 38
      Gems/ROS2/Code/Source/RobotImporter/Pages/IntroPage.cpp
  65. 2 3
      Gems/ROS2/Code/Source/Sensor/Events/PhysicsBasedSource.cpp
  66. 9 10
      Gems/ROS2/Code/Source/Sensor/Events/TickBasedSource.cpp
  67. 0 75
      Gems/ROS2/Code/Source/Sensor/SensorHelpers.cpp
  68. 54 0
      Gems/ROS2/Code/Source/Tools/ROS2EditorModule.cpp
  69. 6 1
      Gems/ROS2/Code/Source/Tools/ROS2EditorSystemComponent.cpp
  70. 6 3
      Gems/ROS2/Code/Source/Tools/ROS2EditorSystemComponent.h
  71. 1 1
      Gems/ROS2/Code/Tests/Frame/ROS2FrameComponentTest.cpp
  72. 0 3
      Gems/ROS2/Code/frame_test_files.cmake
  73. 32 0
      Gems/ROS2/Code/ros2_api_files.cmake
  74. 9 0
      Gems/ROS2/Code/ros2_editor_api_files.cmake
  75. 22 0
      Gems/ROS2/Code/ros2_editor_private_files.cmake
  76. 9 0
      Gems/ROS2/Code/ros2_editor_shared_api_files.cmake
  77. 1 1
      Gems/ROS2/Code/ros2_editor_shared_files.cmake
  78. 1 3
      Gems/ROS2/Code/ros2_editor_tests_files.cmake
  79. 0 186
      Gems/ROS2/Code/ros2_files.cmake
  80. 0 60
      Gems/ROS2/Code/ros2_header_files.cmake
  81. 30 0
      Gems/ROS2/Code/ros2_private_files.cmake
  82. 26 0
      Gems/ROS2/Code/ros2_shared_api_files.cmake
  83. 1 1
      Gems/ROS2/Code/ros2_shared_files.cmake
  84. 19 0
      Gems/ROS2/Code/ros2_target_depends.cmake
  85. 0 2
      Gems/ROS2/Code/ros2_tests_files.cmake
  86. 0 3
      Gems/ROS2/Registry/assetprocessor_settings.setreg
  87. 0 41
      Gems/ROS2/Registry/sceneassetimporter.setreg
  88. 4 11
      Gems/ROS2/gem.json
  89. 0 2
      Gems/ROS2/requirements.txt
  90. 61 0
      Gems/ROS2Controllers/.clang-format
  91. 0 0
      Gems/ROS2Controllers/.gitignore
  92. 0 0
      Gems/ROS2Controllers/Assets/Editor/Icons/Components/AckermannControl.svg
  93. 0 0
      Gems/ROS2Controllers/Assets/Editor/Icons/Components/AckermannVehicleModel.svg
  94. 0 0
      Gems/ROS2Controllers/Assets/Editor/Icons/Components/FingerGripperComponent.svg
  95. 0 0
      Gems/ROS2Controllers/Assets/Editor/Icons/Components/GripperActionServerComponent.svg
  96. 0 0
      Gems/ROS2Controllers/Assets/Editor/Icons/Components/JointsArticulationControllerComponent.svg
  97. 0 0
      Gems/ROS2Controllers/Assets/Editor/Icons/Components/JointsManipulationEditorComponent.svg
  98. 0 0
      Gems/ROS2Controllers/Assets/Editor/Icons/Components/JointsPIDControllerComponent.svg
  99. 0 0
      Gems/ROS2Controllers/Assets/Editor/Icons/Components/JointsTrajectoryComponent.svg
  100. 0 0
      Gems/ROS2Controllers/Assets/Editor/Icons/Components/ManualMotorController.svg

+ 0 - 5
Gems/ROS2/Assets/Editor/Images/Icons/ROS2.qrc

@@ -1,5 +0,0 @@
-<RCC>
-    <qresource prefix="/ROS2">
-     <file>ROS_import_icon.svg</file>
-    </qresource>
-</RCC>

+ 0 - 7
Gems/ROS2/Assets/Sdf/empty.sdf

@@ -1,7 +0,0 @@
-<?xml version='1.0'?>
-<sdf version="1.4">
-  <model name="empty_model">
-    <link name="empty_link">
-    </link>
-  </model>
-</sdf>

+ 2 - 14
Gems/ROS2/Assets/seedList.seed

@@ -3,24 +3,12 @@
 #
 # SPDX-License-Identifier: Apache-2.0 OR MIT
 
-# Query the gem name from the gem.json file if possible
-# otherwise fallback to using ${Name}
-o3de_find_ancestor_gem_root(gempath gem_name "${CMAKE_CURRENT_SOURCE_DIR}")
-if (NOT gem_name)
-    set(gem_name "ROS2")
-endif()
-
-# Add pip requirements required for ros2 packages.
-update_pip_requirements(${CMAKE_CURRENT_LIST_DIR}/requirements.txt ROS2)
+o3de_gem_setup("ROS2")
 
 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/Code")
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} PARENT_SCOPE)
 
-set(gem_path ${CMAKE_CURRENT_LIST_DIR})
-set(gem_json ${gem_path}/gem.json)
-o3de_restricted_path(${gem_json} gem_restricted_path gem_parent_relative_path)
-
-ly_add_external_target_path(${CMAKE_CURRENT_LIST_DIR}/3rdParty)
+ly_add_external_target_path(${CMAKE_CURRENT_SOURCE_DIR}/3rdParty)
 
 # Include ROS2 target function here so that every Project with this Gem can make use of it
 # Currently only affects the Gem itself but this likely will change in the future

+ 179 - 105
Gems/ROS2/Code/CMakeLists.txt

@@ -3,11 +3,22 @@
 #
 # SPDX-License-Identifier: Apache-2.0 OR MIT
 
+# Currently we are in the Code folder: ${CMAKE_CURRENT_LIST_DIR}
+# Get the platform specific folder ${pal_dir} for the current folder: ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}
+# Note: o3de_pal_dir will take care of the details for us, as this may be a restricted platform
+#       in which case it will see if that platform is present here or in the restricted folder.
+#       i.e. It could here in our gem : Gems/ROS2/Code/Platform/<platorm_name>  or
+#            <restricted_folder>/<platform_name>/Gems/ROS2/Code
+o3de_pal_dir(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} "${gem_restricted_path}" "${gem_path}" "${gem_parent_relative_path}")
 
-# Only allow this gem to be configured on platforms that are currently supported
-include(${CMAKE_CURRENT_SOURCE_DIR}/Platform/${PAL_PLATFORM_NAME}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
-if(NOT PAL_TRAIT_BUILD_ROS2_GEM_SUPPORTED)
-    message(FATAL_ERROR "The ROS2 Gem is not currently supported on ${PAL_PLATFORM_NAME}")
+# Now that we have the platform abstraction layer (PAL) folder for this folder, thats where we will find the
+# traits for this platform. Traits for a platform are defines for things like whether or not something in this gem
+# is supported by this platform.
+include(${pal_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
+
+# Check to see if building the Gem Modules are supported for the current platform
+if(NOT PAL_TRAIT_ROS2_SUPPORTED)
+    message(FATAL_ERROR "The ROS2 Gem is not supported on ${PAL_PLATFORM_NAME}")
     return()
 endif()
 
@@ -49,131 +60,190 @@ find_package(gazebo_msgs QUIET)
 if (gazebo_msgs_FOUND)
     message(STATUS "Found gazebo_msgs package, enabling legacy features like ContactSensor Component and ROS2 Spawner Component")
     SET (WITH_GAZEBO_MSGS TRUE)
-    if(NOT (ROS_DISTRO STREQUAL "humble" OR ROS_DISTRO STREQUAL "jazzy"))
-        message(WARNING
-                "The support for deprecated gazebo_msgs package is not supported in ROS 2 Kilted or newer. "
-                "Please consider migration to Simulation Interfaces. "
-                "If you do not intend to use Gazebo messages, please make sure that this package is not sourced in your environment." )
-
-    endif()
 else()
     message(STATUS "Could not find gazebo_msgs package, disabling legacy features like ContactSensor Component and ROS2 Spawner Component")
     SET(WITH_GAZEBO_MSGS FALSE)
 endif()
 
-# Add the ROS2.Static target
-# Note: We include the common files and the platform specific files which are set in ros2_common_files.cmake
-# and in ${pal_dir}/ros2_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
+# Add the static target with the API Interface and the code
+# TODO: This target should be removed after API is fully implemented with buses
 ly_add_target(
     NAME ${gem_name}.Static STATIC
     NAMESPACE Gem
     FILES_CMAKE
-        ros2_header_files.cmake
-        ros2_files.cmake
+        ros2_api_files.cmake
+        ros2_shared_api_files.cmake
     INCLUDE_DIRECTORIES
         PUBLIC
             Include
         PRIVATE
             Source
-            Source/VehicleDynamics
     BUILD_DEPENDENCIES
         PUBLIC
             AZ::AzCore
-            AZ::AzFramework
-            Gem::Atom_RPI.Public
-            Gem::Atom_Feature_Common.Public
-            Gem::Atom_Component_DebugCamera.Static
-            Gem::Atom_AtomBridge.Static
-            Gem::StartingPointInput
-            Gem::PhysX5.Static
-            Gem::LmbrCentral.API
-            Gem::LevelGeoreferencing.API
+            AZ::AzToolsFramework
+            Gem::${gem_name}.Private.Object
+)
+ly_add_target(
+    NAME ${gem_name}.Editor.Static STATIC
+    NAMESPACE Gem
+    FILES_CMAKE
+        ros2_editor_api_files.cmake
+        ros2_editor_shared_api_files.cmake
+    INCLUDE_DIRECTORIES
+        PUBLIC
+            Include
+        PRIVATE
+            Source
+    BUILD_DEPENDENCIES
+        PUBLIC
+            AZ::AzCore
+            AZ::AzToolsFramework
+            Gem::${gem_name}.Editor.Private.Object
 )
 
-target_depends_on_ros2_packages(${gem_name}.Static rclcpp builtin_interfaces std_msgs sensor_msgs nav_msgs tf2_ros ackermann_msgs vision_msgs control_msgs)
-
-if (WITH_GAZEBO_MSGS)
-    target_depends_on_ros2_package(${gem_name}.Static gazebo_msgs REQUIRED)
-    target_compile_definitions(${gem_name}.Static PUBLIC "WITH_GAZEBO_MSGS")
-endif()
 
+# The ${gem_name}.API target declares the common interface that users of this gem should depend on in their targets
 ly_add_target(
-    NAME ${gem_name}.API HEADERONLY
+    NAME ${gem_name}.API INTERFACE
     NAMESPACE Gem
     FILES_CMAKE
-        ros2_header_files.cmake
+        ros2_api_files.cmake
+        ${pal_dir}/ros2_api_files.cmake
     INCLUDE_DIRECTORIES
         INTERFACE
             Include
+    BUILD_DEPENDENCIES
+        INTERFACE
+            AZ::AzCore
+)
+
+target_interface_depends_on_ros2_packages(${gem_name}.API rclcpp builtin_interfaces control_msgs geometry_msgs)
+
+# The ${gem_name}.Private.Object target is an internal target
+# It should not be used outside of this Gems CMakeLists.txt
+ly_add_target(
+    NAME ${gem_name}.Private.Object STATIC
+    NAMESPACE Gem
+    FILES_CMAKE
+        ros2_private_files.cmake
+        ${pal_dir}/ros2_private_files.cmake
+    TARGET_PROPERTIES
+        O3DE_PRIVATE_TARGET TRUE
+    INCLUDE_DIRECTORIES
+        PRIVATE
+            Include
+            Source
+    BUILD_DEPENDENCIES
+        PUBLIC
+            AZ::AzCore
+            AZ::AzFramework
+            Gem::Atom_AtomBridge.Static # FollowingCameraComponent
+            Gem::LevelGeoreferencing.API # ROS2SpawnerComponent
 )
 
-# Here add ROS2 target, it depends on the ROS2.Static
+target_depends_on_ros2_packages(${gem_name}.Private.Object rclcpp builtin_interfaces std_msgs sensor_msgs nav_msgs tf2_ros ackermann_msgs vision_msgs control_msgs)
+
+if (WITH_GAZEBO_MSGS)
+    target_depends_on_ros2_package(${gem_name}.Private.Object gazebo_msgs REQUIRED)
+    target_compile_definitions(${gem_name}.Private.Object PUBLIC "WITH_GAZEBO_MSGS")
+endif()
+
+# Here add ${gem_name} target, it depends on the Private Object library and Public API interface
 ly_add_target(
     NAME ${gem_name} ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE}
     NAMESPACE Gem
     FILES_CMAKE
         ros2_shared_files.cmake
+        ${pal_dir}/ros2_shared_files.cmake
     INCLUDE_DIRECTORIES
         PUBLIC
             Include
         PRIVATE
             Source
     BUILD_DEPENDENCIES
+        PUBLIC
+            Gem::${gem_name}.API
         PRIVATE
             Gem::${gem_name}.Static
-            Gem::Atom_Feature_Common.Public
+            Gem::${gem_name}.Private.Object
 )
 
-# By default, we will specify that the above target ROS2 would be used by
-# Client, Server and Unified type targets when this gem is enabled.  If you don't want it
-# active in Clients, Servers or Unified by default, delete one or more of the following lines:
+# Include the gem name into the Client Module source file
+# for use with the AZ_DECLARE_MODULE_CLASS macro
+# This is to allow renaming of the gem to also cause
+# the CreateModuleClass_Gem_<gem-name> function which
+# is used to bootstrap the gem in monolithic builds to link to the new gem name
+ly_add_source_properties(
+SOURCES
+    Source/Clients/ROS2Module.cpp
+PROPERTY COMPILE_DEFINITIONS
+    VALUES
+        O3DE_GEM_NAME=${gem_name}
+        O3DE_GEM_VERSION=${gem_version})
+
+# By default, we will specify that the above target ${gem_name} would be used by
+# Client and Server type targets when this gem is enabled.  If you don't want it
+# active in Clients or Servers by default, delete one of both of the following lines:
 ly_create_alias(NAME ${gem_name}.Clients NAMESPACE Gem TARGETS Gem::${gem_name})
 ly_create_alias(NAME ${gem_name}.Servers NAMESPACE Gem TARGETS Gem::${gem_name})
 ly_create_alias(NAME ${gem_name}.Unified NAMESPACE Gem TARGETS Gem::${gem_name})
 
-# If we are on a host platform, we want to add the host tools targets like the ${gem_name}.Editor target which
-# will also depend on ${gem_name}.Static
+# For the Client and Server variants of ${gem_name} Gem, an alias to the ${gem_name}.API target will be made
+ly_create_alias(NAME ${gem_name}.Clients.API NAMESPACE Gem TARGETS Gem::${gem_name}.API)
+ly_create_alias(NAME ${gem_name}.Servers.API NAMESPACE Gem TARGETS Gem::${gem_name}.API)
+ly_create_alias(NAME ${gem_name}.Unified.API NAMESPACE Gem TARGETS Gem::${gem_name}.API)
+
+# Add in CMake dependencies for each gem dependency listed in this gem's gem.json file
+# for the Clients, Servers, Unified gem variants
+o3de_add_variant_dependencies_for_gem_dependencies(GEM_NAME ${gem_name} VARIANTS Clients Servers Unified)
+
+# If we are on a host platform, we want to add the host tools targets like the ${gem_name}.Editor MODULE target
 if(PAL_TRAIT_BUILD_HOST_TOOLS)
+    # The ${gem_name}.Editor.API target can be used by other gems that want to interact with the ${gem_name}.Editor module
     ly_add_target(
-        NAME ${gem_name}.Editor.Static STATIC
+        NAME ${gem_name}.Editor.API INTERFACE
         NAMESPACE Gem
-        AUTOMOC
-        AUTORCC
         FILES_CMAKE
-            ros2_editor_files.cmake
-        PLATFORM_INCLUDE_FILES
-            ${CMAKE_CURRENT_LIST_DIR}/Platform/Common/${PAL_TRAIT_COMPILER_ID}/ros2_static_editor_${PAL_TRAIT_COMPILER_ID_LOWERCASE}.cmake
+            ros2_editor_api_files.cmake
+            ${pal_dir}/ros2_editor_api_files.cmake
+        INCLUDE_DIRECTORIES
+            INTERFACE
+                Include
+        BUILD_DEPENDENCIES
+            INTERFACE
+                AZ::AzToolsFramework
+    )
+
+    # The ${gem_name}.Editor.Private.Object target is an internal target
+    # which is only to be used by this gems CMakeLists.txt and any subdirectories
+    # Other gems should not use this target
+    ly_add_target(
+        NAME ${gem_name}.Editor.Private.Object STATIC
+        NAMESPACE Gem
+        FILES_CMAKE
+            ros2_editor_private_files.cmake
+        TARGET_PROPERTIES
+            O3DE_PRIVATE_TARGET TRUE
         INCLUDE_DIRECTORIES
             PRIVATE
-                Source
-                Source/RobotImporter
-            PUBLIC
                 Include
+                Source
         COMPILE_DEFINITIONS
             PRIVATE
                 ROS2_EDITOR
         BUILD_DEPENDENCIES
             PUBLIC
                 AZ::AzToolsFramework
-                Gem::CommonFeaturesAtom.Editor.Static
-                Gem::LmbrCentral.API
-                Gem::PhysX5.Editor.Static
                 Gem::${gem_name}.Static
-            PRIVATE
-                AZ::AssetBuilderSDK
-                3rdParty::sdformat
     )
 
     ly_add_target(
         NAME ${gem_name}.Editor GEM_MODULE
         NAMESPACE Gem
+        AUTOMOC
         FILES_CMAKE
             ros2_editor_shared_files.cmake
-        PLATFORM_INCLUDE_FILES
-            ${CMAKE_CURRENT_LIST_DIR}/Platform/Common/${PAL_TRAIT_COMPILER_ID}/ros2_static_editor_${PAL_TRAIT_COMPILER_ID_LOWERCASE}.cmake
-        COMPILE_DEFINITIONS
-            PRIVATE
-                ROS2_EDITOR
         INCLUDE_DIRECTORIES
             PRIVATE
                 Source
@@ -181,15 +251,38 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS)
                 Include
         BUILD_DEPENDENCIES
             PUBLIC
+                Gem::${gem_name}.Editor.API
+            PRIVATE
+                Gem::${gem_name}.Editor.Private.Object
                 Gem::${gem_name}.Editor.Static
-                Gem::Atom_Feature_Common.Public
     )
 
-    # By default, we will specify that the above target ROS2 would be used by
-    # Tool and Builder type targets when this gem is enabled. If you don't want it
-    # active in Tools or Builders by default, delete one or both of the following lines:
+    # Include the gem name into the Editor Module source file
+    # for use with the AZ_DECLARE_MODULE_CLASS macro
+    # This is to allow renaming of the gem to also cause
+    # the CreateModuleClass_Gem_<gem-name> function which
+    # is used to bootstrap the gem in monolithic builds to link to the new gem name
+    ly_add_source_properties(
+    SOURCES
+        Source/Tools/ROS2EditorModule.cpp
+    PROPERTY COMPILE_DEFINITIONS
+        VALUES
+            O3DE_GEM_NAME=${gem_name}
+            O3DE_GEM_VERSION=${gem_version})
+
+    # By default, we will specify that the above target ${gem_name} would be used by
+    # Tool and Builder type targets when this gem is enabled.  If you don't want it
+    # active in Tools or Builders by default, delete one of both of the following lines:
     ly_create_alias(NAME ${gem_name}.Tools    NAMESPACE Gem TARGETS Gem::${gem_name}.Editor)
     ly_create_alias(NAME ${gem_name}.Builders NAMESPACE Gem TARGETS Gem::${gem_name}.Editor)
+
+    # For the Tools and Builders variants of ${gem_name} Gem, an alias to the ${gem_name}.Editor API target will be made
+    ly_create_alias(NAME ${gem_name}.Tools.API NAMESPACE Gem TARGETS Gem::${gem_name}.Editor.API)
+    ly_create_alias(NAME ${gem_name}.Builders.API NAMESPACE Gem TARGETS Gem::${gem_name}.Editor.API)
+
+    # Add in CMake dependencies for each gem dependency listed in this gem's gem.json file
+    # for the Tools and Builders gem variants
+    o3de_add_variant_dependencies_for_gem_dependencies(GEM_NAME ${gem_name} VARIANTS Tools Builders)
 endif()
 
 ################################################################################
@@ -197,8 +290,9 @@ endif()
 ################################################################################
 # See if globally, tests are supported
 if(PAL_TRAIT_BUILD_TESTS_SUPPORTED)
-    if(PAL_TRAIT_TEST_GOOGLE_TEST_SUPPORTED)
-        # We support ROS2.Tests on this platform, add ROS2.Tests target which depends on ROS2.Static
+    # We globally support tests, see if we support tests on this platform for ${gem_name}.Tests
+    if(PAL_TRAIT_ROS2_TEST_SUPPORTED)
+        # We support ${gem_name}.Tests on this platform, add dependency on the Private Object target
         ly_add_target(
             NAME ${gem_name}.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
             NAMESPACE Gem
@@ -208,75 +302,55 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED)
                 PRIVATE
                     Tests
                     Source
+                    Include
             BUILD_DEPENDENCIES
                 PRIVATE
                     AZ::AzTest
-                    Gem::${gem_name}.Static
+                    AZ::AzFramework
+                    Gem::${gem_name}.Private.Object
         )
 
-        # Add ROS2.Tests to googletest
+        # Add ${gem_name}.Tests to googletest
         ly_add_googletest(
             NAME Gem::${gem_name}.Tests
         )
-        
-        # integration test for URDF importer
-        ly_add_target(
-            NAME ROS2.Frame.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
-                NAMESPACE Gem
-            FILES_CMAKE
-                frame_test_files.cmake
-            INCLUDE_DIRECTORIES
-                PRIVATE
-                    Source
-                    Tests
-            BUILD_DEPENDENCIES
-                PRIVATE
-                    AZ::AzTestShared
-                    AZ::AzToolsFramework
-                    Legacy::CryCommon
-                    Legacy::EditorCommon
-                    Legacy::Editor.Headers
-                    AZ::AzManipulatorTestFramework.Static
-                    Gem::ROS2.Static
-                RUNTIME_DEPENDENCIES
-                    Gem::PhysX5.Editor
-        )
-
-        ly_add_googletest(
-                NAME Gem::ROS2.Frame.Tests
-        )
-
     endif()
 
     # If we are a host platform we want to add tools test like editor tests here
     if(PAL_TRAIT_BUILD_HOST_TOOLS)
-        if(PAL_TRAIT_TEST_GOOGLE_TEST_SUPPORTED)
-            # We support ROS2.Editor.Tests on this platform, add ROS2.Editor.Tests target which depends on ROS2.Editor
+        # We are a host platform, see if Editor tests are supported on this platform
+        if(PAL_TRAIT_ROS2_EDITOR_TEST_SUPPORTED)
+            # We support ${gem_name}.Editor.Tests on this platform, add ${gem_name}.Editor.Tests target which depends on
+            # private ${gem_name}.Editor.Private.Object target
             ly_add_target(
                 NAME ${gem_name}.Editor.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
                 NAMESPACE Gem
                 FILES_CMAKE
                     ros2_editor_tests_files.cmake
-                PLATFORM_INCLUDE_FILES
-                    ${CMAKE_CURRENT_LIST_DIR}/Platform/Common/${PAL_TRAIT_COMPILER_ID}/ros2_static_editor_${PAL_TRAIT_COMPILER_ID_LOWERCASE}.cmake
                 INCLUDE_DIRECTORIES
                     PRIVATE
                         Tests
                         Source
+                        Include
                 BUILD_DEPENDENCIES
                     PRIVATE
                         AZ::AzTest
                         AZ::AzTestShared
-                        AZ::AzToolsFramework
+                        Legacy::CryCommon
+                        Legacy::EditorCommon
+                        Legacy::Editor.Headers
+                        AZ::AzManipulatorTestFramework.Static
+                        Gem::${gem_name}.Editor.Private.Object
                         Gem::${gem_name}.Editor.Static
-                        3rdParty::sdformat
+                        Gem::${gem_name}.Static
+                RUNTIME_DEPENDENCIES
+                    Legacy::Editor
             )
 
-            # Add ROS2.Editor.Tests to googletest
+            # Add ${gem_name}.Editor.Tests to googletest
             ly_add_googletest(
                 NAME Gem::${gem_name}.Editor.Tests
             )
         endif()
     endif()
 endif()
-

+ 1 - 1
Gems/ROS2/Code/FindROS2.cmake

@@ -5,10 +5,10 @@
 
 # Note that this does not find any ros2 package in particular, but determines whether a distro is sourced properly
 # Can be extended to handle supported / unsupported distros
-message(STATUS "Ros Distro is \"$ENV{ROS_DISTRO}\"")
 if (NOT DEFINED ENV{ROS_DISTRO} OR NOT DEFINED ENV{AMENT_PREFIX_PATH})
     message(WARNING, "To build ROS2 Gem a ROS distribution needs to be sourced, but none detected")
     set(ROS2_FOUND FALSE)
     return()
 endif()
+message(STATUS "Ros Distro is \"$ENV{ROS_DISTRO}\"")
 set(ROS2_FOUND TRUE)

+ 0 - 44
Gems/ROS2/Code/Include/ROS2/Camera/CameraCalibrationRequestBus.h

@@ -1,44 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#pragma once
-
-#include <AzCore/Component/EntityId.h>
-#include <AzCore/EBus/EBus.h>
-#include <AzCore/Interface/Interface.h>
-#include <AzCore/Math/Matrix4x4.h>
-
-namespace ROS2
-{
-    //! Interface allows to obtain intrinsic parameters of the camera. To obtain extrinsic parameters use TransformProviderRequestBus.
-    class CameraCalibrationRequest : public AZ::EBusTraits
-    {
-    public:
-        using BusIdType = AZ::EntityId;
-        static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
-
-        //! Returns the intrinsic calibration matrix of the camera as:
-        //!  [fx  0 cx]
-        //!  [ 0 fy cy]
-        //!  [ 0  0  1]
-        //! where:
-        //!  - fx, fy : the focal lengths in meters
-        //!  - cx, cy : principal point in pixels.
-        virtual AZ::Matrix3x3 GetCameraMatrix() const = 0;
-
-        //! Returns the width of the camera sensor in pixels
-        virtual int GetWidth() const = 0;
-
-        //! Returns the height of the camera sensor in pixels
-        virtual int GetHeight() const = 0;
-
-        //! Returns the vertical field of view of the camera in degrees
-        virtual float GetVerticalFOV() const = 0;
-    };
-
-    using CameraCalibrationRequestBus = AZ::EBus<CameraCalibrationRequest>;
-} // namespace ROS2

+ 8 - 7
Gems/ROS2/Code/Include/ROS2/Communication/PublisherConfiguration.h

@@ -1,9 +1,9 @@
 /*
-* Copyright (c) Contributors to the Open 3D Engine Project.
-* For complete copyright and license terms please see the LICENSE at the root of this distribution.
-*
-* SPDX-License-Identifier: Apache-2.0 OR MIT
-*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
  */
 
 #pragma once
@@ -11,16 +11,17 @@
 #include <AzCore/RTTI/RTTI.h>
 #include <AzCore/Serialization/SerializeContext.h>
 #include <ROS2/Communication/TopicConfiguration.h>
+#include <ROS2/ROS2TypeIds.h>
 #include <rclcpp/publisher.hpp>
 
 namespace ROS2
 {
     struct PublisherConfiguration
     {
-        AZ_TYPE_INFO(PublisherConfiguration, "{E50D1926-0322-4832-BD72-C48F854131C8}");
+        AZ_TYPE_INFO(PublisherConfiguration, PublisherConfigurationTypeId);
         static void Reflect(AZ::ReflectContext* context);
 
-        bool m_publish = true;  //!< A switch controlling whether publishing happens.
+        bool m_publish = true; //!< A switch controlling whether publishing happens.
         TopicConfiguration m_topicConfiguration; //!< Configuration of the published topic.
         float m_frequency = 10.0f; //!< Frequency of the published topic (Hz)
     };

+ 2 - 1
Gems/ROS2/Code/Include/ROS2/Communication/QoS.h

@@ -10,6 +10,7 @@
 
 #include <AzCore/RTTI/RTTI.h>
 #include <AzCore/Serialization/SerializeContext.h>
+#include <ROS2/ROS2TypeIds.h>
 #include <rclcpp/qos.hpp>
 
 namespace ROS2
@@ -19,7 +20,7 @@ namespace ROS2
     struct QoS
     {
     public:
-        AZ_TYPE_INFO(QoS, "{46692EA4-EA4C-495E-AD3C-426EAB8954D3}");
+        AZ_TYPE_INFO(QoS, QoSTypeId);
         QoS(const rclcpp::QoS& qos = rclcpp::QoS(rmw_qos_profile_default.depth));
         static void Reflect(AZ::ReflectContext* context);
 

+ 5 - 4
Gems/ROS2/Code/Include/ROS2/Communication/TopicConfiguration.h

@@ -7,10 +7,11 @@
  */
 #pragma once
 
-#include "QoS.h"
 #include <AzCore/RTTI/RTTI.h>
 #include <AzCore/Serialization/SerializeContext.h>
 #include <AzCore/std/string/string.h>
+#include <ROS2/Communication/QoS.h>
+#include <ROS2/ROS2TypeIds.h>
 
 namespace ROS2
 {
@@ -18,12 +19,12 @@ namespace ROS2
     struct TopicConfiguration
     {
     public:
-        AZ_TYPE_INFO(TopicConfiguration, "{7535D58F-5284-4657-A799-1F69D3F5AA42}");
+        AZ_TYPE_INFO(TopicConfiguration, TopicConfigurationTypeId);
         static void Reflect(AZ::ReflectContext* context);
 
         TopicConfiguration() = default;
-        TopicConfiguration(const QoS& qos) :
-            m_qos(qos)
+        TopicConfiguration(const QoS& qos)
+            : m_qos(qos)
         {
         }
 

+ 2 - 1
Gems/ROS2/Code/Include/ROS2/Frame/NamespaceConfiguration.h

@@ -10,6 +10,7 @@
 #include <AzCore/RTTI/RTTI.h>
 #include <AzCore/Serialization/SerializeContext.h>
 #include <AzCore/std/string/string.h>
+#include <ROS2/ROS2TypeIds.h>
 
 namespace ROS2
 {
@@ -20,7 +21,7 @@ namespace ROS2
     struct NamespaceConfiguration
     {
     public:
-        AZ_TYPE_INFO(NamespaceConfiguration, "{5E5BC6EA-DD01-480E-A4D1-6857CF70FDC8}");
+        AZ_TYPE_INFO(NamespaceConfiguration, NamespaceConfigurationTypeId);
         static void Reflect(AZ::ReflectContext* context);
 
         //! A choice of methods to handle namespaces.

+ 2 - 1
Gems/ROS2/Code/Include/ROS2/Frame/ROS2FrameComponent.h

@@ -16,6 +16,7 @@
 #include <ROS2/Frame/ROS2FrameConfiguration.h>
 #include <ROS2/Frame/ROS2Transform.h>
 #include <ROS2/ROS2GemUtilities.h>
+#include <ROS2/ROS2TypeIds.h>
 
 namespace ROS2
 {
@@ -23,7 +24,7 @@ namespace ROS2
     class JsonFrameComponentConfigSerializer : public AZ::BaseJsonSerializer
     {
     public:
-        AZ_RTTI(ROS2::JsonFrameComponentConfigSerializer, "{ac74cbc1-a5dc-4014-85d7-0e7934f352bd}", AZ::BaseJsonSerializer);
+        AZ_RTTI(ROS2::JsonFrameComponentConfigSerializer, ROS2FrameComponentTypeId, AZ::BaseJsonSerializer);
         AZ_CLASS_ALLOCATOR_DECL;
 
         AZ::JsonSerializationResult::Result Load(

+ 2 - 1
Gems/ROS2/Code/Include/ROS2/Frame/ROS2FrameConfiguration.h

@@ -12,13 +12,14 @@
 #include <AzCore/Serialization/SerializeContext.h>
 #include <AzCore/std/string/string.h>
 #include <ROS2/Frame/NamespaceConfiguration.h>
+#include <ROS2/ROS2TypeIds.h>
 
 namespace ROS2
 {
     class ROS2FrameConfiguration final : public AZ::ComponentConfig
     {
     public:
-        AZ_TYPE_INFO(ROS2FrameConfiguration, "{04882f01-5451-4efa-b4f8-cd57e4b6cadf}");
+        AZ_TYPE_INFO(ROS2FrameConfiguration, ROS2FrameConfigurationTypeId);
         static void Reflect(AZ::ReflectContext* context);
 
         NamespaceConfiguration m_namespaceConfiguration;

+ 2 - 1
Gems/ROS2/Code/Include/ROS2/Frame/ROS2FrameEditorComponent.h

@@ -16,6 +16,7 @@
 #include <ROS2/Frame/ROS2FrameConfiguration.h>
 #include <ROS2/Frame/ROS2Transform.h>
 #include <ROS2/ROS2GemUtilities.h>
+#include <ROS2/ROS2TypeIds.h>
 
 namespace ROS2
 {
@@ -30,7 +31,7 @@ namespace ROS2
         , public AZ::EntityBus::Handler
     {
     public:
-        AZ_COMPONENT(ROS2FrameEditorComponent, "{f76d6f29-73c3-40b2-bcc2-47fc824c25df}", AzToolsFramework::Components::EditorComponentBase);
+        AZ_COMPONENT(ROS2FrameEditorComponent, ROS2FrameEditorComponentTypeId, AzToolsFramework::Components::EditorComponentBase);
 
         ROS2FrameEditorComponent() = default;
         ~ROS2FrameEditorComponent() = default;

+ 3 - 1
Gems/ROS2/Code/Include/ROS2/ROS2Bus.h

@@ -7,6 +7,8 @@
  */
 #pragma once
 
+#include <ROS2/ROS2TypeIds.h>
+
 #include <AzCore/EBus/EBus.h>
 #include <AzCore/EBus/Event.h>
 #include <AzCore/Interface/Interface.h>
@@ -27,7 +29,7 @@ namespace ROS2
     public:
         using NodeChangedEvent = AZ::Event<std::shared_ptr<rclcpp::Node>>;
 
-        AZ_RTTI(ROS2Requests, "{a9bdbff6-e644-430d-8096-cdb53c88e8fc}");
+        AZ_RTTI(ROS2Requests, ROS2RequestsTypeId);
         virtual ~ROS2Requests() = default;
 
         //! Get a central ROS2 node of the Gem.

+ 0 - 20
Gems/ROS2/Code/Include/ROS2/ROS2SensorTypesIds.h

@@ -1,20 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#pragma once
-
-namespace ROS2
-{
-    inline constexpr const char* ROS2CameraSensorComponentTypeId = "{3C6B8AE6-9721-4639-B8F9-D8D28FD7A071}";
-    inline constexpr const char* ROS2ContactSensorComponentTypeId = "{91272e66-c9f1-4aa2-a9d5-98eaa4ef4e9a}";
-    inline constexpr const char* ROS2GNSSSensorComponentTypeId = "{55B4A299-7FA3-496A-88F0-764C75B0E9A7}";
-    inline constexpr const char* ROS2ImuSensorComponentTypeId = "{502A955E-7742-4E23-AD77-5E4063739DCA}";
-    inline constexpr const char* ROS2LidarSensorComponentTypeId = "{502A955F-7742-4E23-AD77-5E4063739DCA}";
-    inline constexpr const char* ROS2Lidar2DSensorComponentTypeId = "{F4C2D970-1D69-40F2-9D4D-B52DCFDD2704}";
-    inline constexpr const char* ROS2WheelOdometryComponentTypeId = "{9bdb8c23-ac76-4c25-8d35-37aaa9f43fac}";
-    inline constexpr const char* ROS2OdometrySensorComponent = "{61387448-63AA-4563-AF87-60C72B05B863}";
-} // namespace ROS2

+ 49 - 0
Gems/ROS2/Code/Include/ROS2/ROS2TypeIds.h

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+#pragma once
+
+namespace ROS2
+{
+    // System Component TypeIds
+    inline constexpr const char* ROS2SystemComponentTypeId = "{CB28D486-AFA4-4A9F-A237-AC5EB42E1C87}";
+    inline constexpr const char* ROS2EditorSystemComponentTypeId = "{349883C1-C66E-45F5-90D7-884565FCFA7E}";
+
+    // Module derived classes TypeIds
+    inline constexpr const char* ROS2ModuleInterfaceTypeId = "{8B5567CB-1DE9-49AF-9CD4-9750D4ABCD6B}";
+    inline constexpr const char* ROS2ModuleTypeId = "{3DDFC98F-D1CC-4658-BAF8-2CC34A9D39F3}";
+    // The Editor Module by default is mutually exclusive with the Client Module
+    // so they use the Same TypeId
+    inline constexpr const char* ROS2EditorModuleTypeId = ROS2ModuleTypeId;
+
+    // Interface TypeIds
+    inline constexpr const char* ROS2RequestsTypeId = "{A9BDBFF6-E644-430D-8096-CDB53C88E8FC}";
+
+    // Communication Interface TypeIds
+    inline constexpr const char* PublisherConfigurationTypeId = "{E50D1926-0322-4832-BD72-C48F854131C8}";
+    inline constexpr const char* QoSTypeId = "{46692EA4-EA4C-495E-AD3C-426EAB8954D3}";
+    inline constexpr const char* TopicConfigurationTypeId = "{7535D58F-5284-4657-A799-1F69D3F5AA42}";
+
+    // Frame Interface TypeIds
+    inline constexpr const char* NamespaceConfigurationTypeId = "{5E5BC6EA-DD01-480E-A4D1-6857CF70FDC8}";
+    inline constexpr const char* ROS2FrameComponentTypeId = "{AC74CBC1-A5DC-4014-85D7-0E7934F352BD}";
+    inline constexpr const char* ROS2FrameConfigurationTypeId = "{04882F01-5451-4EFA-B4F8-CD57E4B6CADF}";
+    inline constexpr const char* ROS2FrameEditorComponentTypeId = "{F76D6F29-73C3-40B2-BCC2-47FC824C25DF}";
+
+    // Sensors Interface TypeIds
+    inline constexpr const char* SensorConfigurationTypeId = "{4755363D-0B5A-42D7-BBEF-152D87BA10D7}";
+    inline constexpr const char* SensorConfigurationRequestTypeId = "{01904EAB-FA33-7487-B634-E3F8361EB5FB}";
+    inline constexpr const char* ROS2SensorComponentBaseTypeId = "{2DF9A652-DF5D-43B1-932F-B6A838E36E97}";
+    inline constexpr const char* EventSourceAdapterTypeId = "{DC8BB5F7-8E0E-42A1-BD82-5FCD9D31B9DD}";
+    inline constexpr const char* TickBasedSourceTypeId = "{AD3CC041-5F7C-45E8-AA2D-5D8A1D4CC466}";
+    inline constexpr const char* PhysicsBasedSourceTypeId = "{48BB21A8-F14E-4869-95DC-28EEA279Cf53}";
+
+    // Spawner Bus TypeIds
+    inline constexpr const char* SpawnerRequestsTypeId = "{3C42A3A1-1B8E-4800-9473-E4441315D7C8}";
+    inline constexpr const char* SpawnerNotificationTypeId = "{0D22B024-48C7-457C-BFFB-D292045B68EC}";
+    inline constexpr const char* SpawnerBusHandlerTypeId = "{9EB89664-0BE5-4E89-8E17-01B21073EBB8}";
+} // namespace ROS2

+ 3 - 3
Gems/ROS2/Code/Include/ROS2/Sensor/Events/EventSourceAdapter.h

@@ -10,8 +10,8 @@
 
 #include <AzCore/Serialization/EditContext.h>
 #include <ROS2/ROS2Bus.h>
+#include <ROS2/ROS2TypeIds.h>
 #include <ROS2/Sensor/Events/SensorEventSource.h>
-#include <ROS2/Sensor/SensorConfiguration.h>
 
 namespace ROS2
 {
@@ -107,7 +107,7 @@ namespace ROS2
                         return;
                     }
 
-                    m_lastDeltaTime =  m_adaptedDeltaTime;
+                    m_lastDeltaTime = m_adaptedDeltaTime;
                     m_sensorAdaptedEvent.Signal(m_adaptedDeltaTime, AZStd::forward<decltype(args)>(args)...);
                     m_adaptedDeltaTime = 0.0f;
                 });
@@ -202,5 +202,5 @@ namespace ROS2
         int m_tickCounter{ 0 }; ///< Internal counter for controlling adapter frequency.
     };
 
-    AZ_TYPE_INFO_TEMPLATE(EventSourceAdapter, "{DC8BB5F7-8E0E-42A1-BD82-5FCD9D31B9DD}", AZ_TYPE_INFO_CLASS)
+    AZ_TYPE_INFO_TEMPLATE(EventSourceAdapter, EventSourceAdapterTypeId, AZ_TYPE_INFO_CLASS)
 } // namespace ROS2

+ 2 - 1
Gems/ROS2/Code/Include/ROS2/Sensor/Events/PhysicsBasedSource.h

@@ -12,6 +12,7 @@
 #include <AzFramework/Physics/Common/PhysicsEvents.h>
 #include <AzFramework/Physics/Common/PhysicsTypes.h>
 #include <ROS2/ROS2Bus.h>
+#include <ROS2/ROS2TypeIds.h>
 #include <ROS2/Sensor/Events/SensorEventSource.h>
 
 namespace ROS2
@@ -23,7 +24,7 @@ namespace ROS2
     class PhysicsBasedSource final : public SensorEventSource<AZ::OrderedEvent, AZ::OrderedEventHandler, AzPhysics::SceneHandle, float>
     {
     public:
-        AZ_TYPE_INFO(PhysicsBasedSource, "{48BB21A8-F14E-4869-95DC-28EEA279Cf53}");
+        AZ_TYPE_INFO(PhysicsBasedSource, PhysicsBasedSourceTypeId);
         static void Reflect(AZ::ReflectContext* context);
 
         // Overrides of ROS2::SensorEventSource.

+ 4 - 2
Gems/ROS2/Code/Include/ROS2/Sensor/Events/TickBasedSource.h

@@ -10,8 +10,10 @@
 
 #include <AzCore/Component/TickBus.h>
 #include <AzCore/EBus/Event.h>
-#include <ROS2/Sensor/Events/SensorEventSource.h>
 #include <ROS2/ROS2Bus.h>
+#include <ROS2/ROS2TypeIds.h>
+#include <ROS2/Sensor/Events/SensorEventSource.h>
+
 namespace ROS2
 {
     //! Class implementing system TickBus (draw calls) as sensor event source. Source event (ROS2::SensorEventSource) is signalled based on
@@ -22,7 +24,7 @@ namespace ROS2
         , protected AZ::TickBus::Handler
     {
     public:
-        AZ_TYPE_INFO(TickBasedSource, "{AD3CC041-5F7C-45E8-AA2D-5D8A1D4CC466}");
+        AZ_TYPE_INFO(TickBasedSource, TickBasedSourceTypeId);
         static void Reflect(AZ::ReflectContext* context);
 
         // Overrides of ROS2::SensorEventSource.

+ 5 - 6
Gems/ROS2/Code/Include/ROS2/Sensor/ROS2SensorComponentBase.h

@@ -12,7 +12,7 @@
 #include <AzCore/Serialization/EditContext.h>
 #include <ROS2/Frame/ROS2FrameComponent.h>
 #include <ROS2/ROS2GemUtilities.h>
-#include <ROS2/ROS2SensorTypesIds.h>
+#include <ROS2/ROS2TypeIds.h>
 #include <ROS2/Sensor/Events/EventSourceAdapter.h>
 #include <ROS2/Sensor/SensorConfiguration.h>
 #include <ROS2/Sensor/SensorConfigurationRequestBus.h>
@@ -21,8 +21,8 @@ namespace ROS2
 {
     //! Base sensor component class for all specific sensor implementations. Developer working on the new sensor should derive from this
     //! class, defining necessary event source type (EventSourceT template parameter). Available sources are e.g. TickBasedSource or
-    //! PhysicsBasedSource. Chosen event source is wrapped into EventSourceAdapter, making it possible to work with specific frequency.
-    //! Derived implementation should call ROS2::ROS2SensorComponentBase::StartSensor at the end of Activate (or whenever sensor
+    //! PhysicsBasedSource. Chosen event source is wrapped into ROS2::EventSourceAdapter, making it possible to work with specific
+    //! frequency. Derived implementation should call ROS2::ROS2SensorComponentBase::StartSensor at the end of Activate (or whenever sensor
     //! configuration is already set up) and StopSensor in Deactivate. Starting sensor base requires passing two parameters:
     //!  - sensor working frequency - how often sensor logic should be processed,
     //!  - adapted event callback - what should be done in sensor logic processing.
@@ -142,7 +142,7 @@ namespace ROS2
             m_eventSourceAdapter.Start();
         }
 
-        //! Stops sensor and disconnects event callbacks passed through RSO2::ROS2SensorComponentBase::StartSensor.
+        //! Stops sensor and disconnects event callbacks passed through ROS2::ROS2SensorComponentBase::StartSensor.
         void StopSensor()
         {
             m_eventSourceAdapter.Stop();
@@ -175,6 +175,5 @@ namespace ROS2
         typename EventSourceT::AdaptedEventHandlerType m_adaptedEventHandler;
     };
 
-    AZ_COMPONENT_IMPL_INLINE(
-        (ROS2SensorComponentBase, AZ_CLASS), "ROS2SensorComponentBase", "{2DF9A652-DF5D-43B1-932F-B6A838E36E97}", AZ::Component)
+    AZ_COMPONENT_IMPL_INLINE((ROS2SensorComponentBase, AZ_CLASS), "ROS2SensorComponentBase", ROS2SensorComponentBaseTypeId, AZ::Component)
 } // namespace ROS2

+ 40 - 3
Gems/ROS2/Code/Include/ROS2/Sensor/SensorConfiguration.h

@@ -8,10 +8,12 @@
 #pragma once
 
 #include <AzCore/RTTI/RTTI.h>
+#include <AzCore/Serialization/EditContext.h>
 #include <AzCore/Serialization/SerializeContext.h>
 #include <AzCore/std/containers/map.h>
 #include <AzCore/std/string/string.h>
 #include <ROS2/Communication/TopicConfiguration.h>
+#include <ROS2/ROS2TypeIds.h>
 
 namespace ROS2
 {
@@ -21,13 +23,48 @@ namespace ROS2
     struct SensorConfiguration
     {
     public:
-        AZ_TYPE_INFO(SensorConfiguration, "{4755363D-0B5A-42D7-BBEF-152D87BA10D7}");
-        static void Reflect(AZ::ReflectContext* context);
+        AZ_TYPE_INFO(SensorConfiguration, SensorConfigurationTypeId);
+        static void Reflect(AZ::ReflectContext* context)
+        {
+            if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+            {
+                serializeContext->RegisterGenericType<AZStd::shared_ptr<ROS2::TopicConfiguration>>();
+                serializeContext->RegisterGenericType<AZStd::map<AZStd::string, AZStd::shared_ptr<ROS2::TopicConfiguration>>>();
+                serializeContext->Class<SensorConfiguration>()
+                    ->Version(2)
+                    ->Field("Visualize", &SensorConfiguration::m_visualize)
+                    ->Field("Publishing Enabled", &SensorConfiguration::m_publishingEnabled)
+                    ->Field("Frequency (HZ)", &SensorConfiguration::m_frequency)
+                    ->Field("Publishers", &SensorConfiguration::m_publishersConfigurations);
+
+                if (AZ::EditContext* ec = serializeContext->GetEditContext())
+                {
+                    ec->Class<SensorConfiguration>("ROS2 Sensor Configuration", "Sensor configuration")
+                        ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
+                        ->DataElement(AZ::Edit::UIHandlers::Default, &SensorConfiguration::m_visualize, "Visualize", "Visualize")
+                        ->DataElement(
+                            AZ::Edit::UIHandlers::Default,
+                            &SensorConfiguration::m_publishingEnabled,
+                            "Publishing Enabled",
+                            "Toggle publishing for topic")
+                        ->DataElement(
+                            AZ::Edit::UIHandlers::Default, &SensorConfiguration::m_frequency, "Frequency", "Frequency of publishing [Hz]")
+                        ->Attribute(AZ::Edit::Attributes::Min, SensorConfiguration::m_minFrequency)
+                        ->DataElement(
+                            AZ::Edit::UIHandlers::Default, &SensorConfiguration::m_publishersConfigurations, "Publishers", "Publishers")
+                        ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
+                        ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
+                        ->Attribute(AZ::Edit::Attributes::ContainerCanBeModified, false)
+                        ->ElementAttribute(AZ::Edit::Attributes::AutoExpand, true)
+                        ->ElementAttribute(AZ::Edit::Attributes::NameLabelOverride, "Publisher configuration");
+                }
+            }
+        }
 
         //! ROS2 Publishers of this sensor.
         //! Some sensors can have more than one publisher (example: Camera).
         //! @note This map will typically hold 1-3 elements.
-        AZStd::map<AZStd::string, TopicConfiguration> m_publishersConfigurations;
+        AZStd::map<AZStd::string, ROS2::TopicConfiguration> m_publishersConfigurations;
 
         //! Frequency in Hz (1/s).
         //! Applies both to data acquisition and publishing.

+ 3 - 2
Gems/ROS2/Code/Include/ROS2/Sensor/SensorConfigurationRequestBus.h

@@ -10,15 +10,16 @@
 #include <AzCore/Component/ComponentBus.h>
 #include <AzCore/Component/EntityId.h>
 #include <AzCore/EBus/EBus.h>
-#include <AzCore/Interface/Interface.h>
+#include <ROS2/ROS2TypeIds.h>
 #include <ROS2/Sensor/SensorConfiguration.h>
+
 namespace ROS2
 {
     //! Interface that allows to get sensor configuration and switch publish state.
     class SensorConfigurationRequest : public AZ::EBusTraits
     {
     public:
-        AZ_RTTI(SensorConfigurationRequest, "{01904eab-fa33-7487-b634-e3f8361eb5fb}");
+        AZ_RTTI(SensorConfigurationRequest, SensorConfigurationRequestTypeId);
         using BusIdType = AZ::EntityComponentIdPair;
         static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
 

+ 0 - 30
Gems/ROS2/Code/Include/ROS2/Sensor/SensorHelper.h

@@ -1,30 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#pragma once
-
-#include <AzCore/Component/Component.h>
-
-namespace ROS2
-{
-    //! Function to check if the component is a sensor component.
-    //! @param component Component to check
-    //! @return True if the component is a sensor component
-    bool IsComponentROS2Sensor(const AZ::Component* component);
-
-    //! Function to get Ids of all sensors attached to the entity.
-    //! @param entityId Id of the entity
-    //! @return Vector of EntityComponentIdPair of all sensors attached to the entity
-    AZStd::vector<AZ::EntityComponentIdPair> GetSensorsForEntity(const AZ::EntityId& entityId);
-
-    //! Function to get Ids of all sensors attached to the entity
-    //! @param entityId Id of the entity
-    //! @param sensorType Type of the sensor, see @file ROS2SensorTypesIds.h
-    //! @return Vector of EntityComponentIdPair of all sensors attached to the entity
-    AZStd::vector<AZ::EntityComponentIdPair> GetSensorsOfType(const AZ::EntityId& entityId, const AZ::Uuid& sensorType);
-
-} // namespace ROS2

+ 3 - 2
Gems/ROS2/Code/Include/ROS2/Spawner/SpawnerBus.h

@@ -12,6 +12,7 @@
 #include <AzCore/EBus/EBus.h>
 #include <AzCore/Math/Transform.h>
 #include <AzCore/RTTI/BehaviorContext.h>
+#include <ROS2/ROS2TypeIds.h>
 #include <ROS2/Spawner/SpawnerInfo.h>
 
 namespace ROS2
@@ -20,7 +21,7 @@ namespace ROS2
     class SpawnerRequests : public AZ::ComponentBus
     {
     public:
-        AZ_RTTI(SpawnerRequests, "{3C42A3A1-1B8E-4800-9473-E4441315D7C8}");
+        AZ_RTTI(SpawnerRequests, SpawnerRequestsTypeId);
 
         static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
 
@@ -37,7 +38,7 @@ namespace ROS2
     class SpawnerNotifications : public AZ::EBusTraits
     {
     public:
-        AZ_RTTI(SpawnerNotifications, "{0D22B024-48C7-457C-BFFB-D292045B68EC}");
+        AZ_RTTI(SpawnerNotifications, SpawnerNotificationTypeId);
 
         static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple;
         static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;

+ 3 - 3
Gems/ROS2/Code/Include/ROS2/Spawner/SpawnerBusHandler.h

@@ -7,10 +7,11 @@
  */
 #pragma once
 
-#include "AzCore/RTTI/BehaviorContext.h"
 #include <AzCore/Component/ComponentBus.h>
 #include <AzCore/Component/EntityId.h>
 #include <AzCore/EBus/EBus.h>
+#include <AzCore/RTTI/BehaviorContext.h>
+#include <ROS2/ROS2TypeIds.h>
 #include <ROS2/Spawner/SpawnerBus.h>
 
 namespace ROS2
@@ -20,8 +21,7 @@ namespace ROS2
         , public AZ::BehaviorEBusHandler
     {
     public:
-        AZ_EBUS_BEHAVIOR_BINDER(
-            SpawnerNotificationsBusHandler, "{9EB89664-0BE5-4E89-8E17-01B21073EBB8}", AZ::SystemAllocator, OnSpawned, OnDespawned);
+        AZ_EBUS_BEHAVIOR_BINDER(SpawnerNotificationsBusHandler, SpawnerBusHandlerTypeId, AZ::SystemAllocator, OnSpawned, OnDespawned);
 
         void OnSpawned(const AZStd::string& spawnableName, const AZ::EntityId& rootEntity, const AZStd::string& ticketName) override
         {

+ 3 - 1
Gems/ROS2/Code/Platform/Android/PAL_android.cmake

@@ -6,4 +6,6 @@
 #
 #
 
-set(PAL_TRAIT_BUILD_ROS2_GEM_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/ROS2/Code/Platform/Android/ros2_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/ROS2/Code/Platform/Android/ros2_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Android
+# i.e. ../Source/Android/ROS2Android.cpp
+#      ../Source/Android/ROS2Android.h
+#      ../Include/Android/ROS2Android.h
+
+set(FILES
+)

+ 8 - 0
Gems/ROS2/Code/Platform/Android/ros2_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Android
+# i.e. ../Source/Android/ROS2Android.cpp
+#      ../Source/Android/ROS2Android.h
+#      ../Include/Android/ROS2Android.h
+
+set(FILES
+)

+ 3 - 11
Gems/ROS2/Code/Platform/Linux/PAL_linux.cmake

@@ -6,14 +6,6 @@
 #
 #
 
-set(PAL_TRAIT_BUILD_ROS2_GEM_SUPPORTED TRUE)
-
-if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
-    ly_associate_package(PACKAGE_NAME sdformat-13.5.0-rev2-linux
-        TARGETS sdformat
-        PACKAGE_HASH b8e988954c07f41b99ba0950da3f4d3e8489ffabaaff157f79ab0c716e2142e0)
-elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
-    ly_associate_package(PACKAGE_NAME sdformat-13.5.0-rev2-linux-aarch64
-        TARGETS sdformat
-        PACKAGE_HASH 7e51cc60c61a058c1f8aba7277574946ab974af3ff4601884e72380e8585c0ea)
-endif()
+set(PAL_TRAIT_ROS2_SUPPORTED TRUE)
+set(PAL_TRAIT_ROS2_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/ROS2/Code/Platform/Linux/ros2_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 3 - 0
Gems/ROS2/Code/Platform/Linux/ros2_editor_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/ROS2/Code/Platform/Linux/ros2_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Linux
+# i.e. ../Source/Linux/ROS2Linux.cpp
+#      ../Source/Linux/ROS2Linux.h
+#      ../Include/Linux/ROS2Linux.h
+
+set(FILES
+)

+ 8 - 0
Gems/ROS2/Code/Platform/Linux/ros2_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Linux
+# i.e. ../Source/Linux/ROS2Linux.cpp
+#      ../Source/Linux/ROS2Linux.h
+#      ../Include/Linux/ROS2Linux.h
+
+set(FILES
+)

+ 3 - 1
Gems/ROS2/Code/Platform/Mac/PAL_mac.cmake

@@ -6,4 +6,6 @@
 #
 #
 
-set(PAL_TRAIT_BUILD_ROS2_GEM_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/ROS2/Code/Platform/Mac/ros2_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 3 - 0
Gems/ROS2/Code/Platform/Mac/ros2_editor_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/ROS2/Code/Platform/Mac/ros2_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Mac
+# i.e. ../Source/Mac/ROS2Mac.cpp
+#      ../Source/Mac/ROS2Mac.h
+#      ../Include/Mac/ROS2Mac.h
+
+set(FILES
+)

+ 8 - 0
Gems/ROS2/Code/Platform/Mac/ros2_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Mac
+# i.e. ../Source/Mac/ROS2Mac.cpp
+#      ../Source/Mac/ROS2Mac.h
+#      ../Include/Mac/ROS2Mac.h
+
+set(FILES
+)

+ 3 - 1
Gems/ROS2/Code/Platform/Windows/PAL_windows.cmake

@@ -6,4 +6,6 @@
 #
 #
 
-set(PAL_TRAIT_BUILD_ROS2_GEM_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/ROS2/Code/Platform/Windows/ros2_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 3 - 0
Gems/ROS2/Code/Platform/Windows/ros2_editor_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/ROS2/Code/Platform/Windows/ros2_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Windows
+# i.e. ../Source/Windows/ROS2Windows.cpp
+#      ../Source/Windows/ROS2Windows.h
+#      ../Include/Windows/ROS2Windows.h
+
+set(FILES
+)

+ 8 - 0
Gems/ROS2/Code/Platform/Windows/ros2_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for Windows
+# i.e. ../Source/Windows/ROS2Windows.cpp
+#      ../Source/Windows/ROS2Windows.h
+#      ../Include/Windows/ROS2Windows.h
+
+set(FILES
+)

+ 3 - 1
Gems/ROS2/Code/Platform/iOS/PAL_ios.cmake

@@ -6,4 +6,6 @@
 #
 #
 
-set(PAL_TRAIT_BUILD_ROS2_GEM_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_TEST_SUPPORTED FALSE)
+set(PAL_TRAIT_ROS2_EDITOR_TEST_SUPPORTED FALSE)

+ 3 - 0
Gems/ROS2/Code/Platform/iOS/ros2_api_files.cmake

@@ -0,0 +1,3 @@
+
+set(FILES
+)

+ 8 - 0
Gems/ROS2/Code/Platform/iOS/ros2_private_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for iOS
+# i.e. ../Source/iOS/ROS2iOS.cpp
+#      ../Source/iOS/ROS2iOS.h
+#      ../Include/iOS/ROS2iOS.h
+
+set(FILES
+)

+ 8 - 0
Gems/ROS2/Code/Platform/iOS/ros2_shared_files.cmake

@@ -0,0 +1,8 @@
+
+# Platform specific files for iOS
+# i.e. ../Source/iOS/ROS2iOS.cpp
+#      ../Source/iOS/ROS2iOS.h
+#      ../Include/iOS/ROS2iOS.h
+
+set(FILES
+)

+ 0 - 21
Gems/ROS2/Code/Source/Camera/CameraConstants.h

@@ -1,21 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#pragma once
-
-namespace ROS2
-{
-    namespace CameraConstants
-    {
-        inline constexpr char ImageMessageType[] = "sensor_msgs::msg::Image";
-        inline constexpr char DepthImageConfig[] = "Depth Image";
-        inline constexpr char ColorImageConfig[] = "Color Image";
-        inline constexpr char DepthInfoConfig[] = "Depth Camera Info";
-        inline constexpr char ColorInfoConfig[] = "Color Camera Info";
-        inline constexpr char CameraInfoMessageType[] = "sensor_msgs::msg::CameraInfo";
-    } // namespace CameraConstants
-} // namespace ROS2

+ 0 - 139
Gems/ROS2/Code/Source/Camera/ROS2CameraSensorComponent.cpp

@@ -1,139 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "ROS2CameraSensorComponent.h"
-#include "CameraUtilities.h"
-#include <ROS2/Frame/ROS2FrameComponent.h>
-
-namespace ROS2
-{
-    ROS2CameraSensorComponent::ROS2CameraSensorComponent(
-        const SensorConfiguration& sensorConfiguration, const CameraSensorConfiguration& cameraConfiguration)
-        : m_cameraConfiguration(cameraConfiguration)
-    {
-        m_sensorConfiguration = sensorConfiguration;
-    }
-
-    void ROS2CameraSensorComponent::Reflect(AZ::ReflectContext* context)
-    {
-        CameraSensorConfiguration::Reflect(context);
-
-        auto* serialize = azrtti_cast<AZ::SerializeContext*>(context);
-        if (serialize)
-        {
-            serialize->Class<ROS2CameraSensorComponent, SensorBaseType>()->Version(5)->Field(
-                "CameraSensorConfig", &ROS2CameraSensorComponent::m_cameraConfiguration);
-        }
-    }
-
-    void ROS2CameraSensorComponent::Activate()
-    {
-        ROS2SensorComponentBase::Activate();
-        if (m_cameraConfiguration.m_colorCamera && m_cameraConfiguration.m_depthCamera)
-        {
-            SetImageSource<CameraRGBDSensor>();
-        }
-        else if (m_cameraConfiguration.m_colorCamera)
-        {
-            SetImageSource<CameraColorSensor>();
-        }
-        else if (m_cameraConfiguration.m_depthCamera)
-        {
-            SetImageSource<CameraDepthSensor>();
-        }
-
-        const auto* component = GetEntity()->FindComponent<ROS2FrameComponent>();
-        AZ_Assert(component, "Entity has no ROS2FrameComponent");
-        m_frameName = component->GetFrameID();
-        ROS2::CameraCalibrationRequestBus::Handler::BusConnect(GetEntityId());
-
-        StartSensor(
-            m_sensorConfiguration.m_frequency,
-            [this]([[maybe_unused]] auto&&... args)
-            {
-                if (!m_sensorConfiguration.m_publishingEnabled)
-                {
-                    return;
-                }
-                FrequencyTick();
-            });
-    }
-
-    void ROS2CameraSensorComponent::Deactivate()
-    {
-        StopSensor();
-        m_cameraSensor.reset();
-        ROS2::CameraCalibrationRequestBus::Handler::BusDisconnect(GetEntityId());
-        ROS2SensorComponentBase::Deactivate();
-    }
-
-    AZ::Matrix3x3 ROS2CameraSensorComponent::GetCameraMatrix() const
-    {
-        return CameraUtils::MakeCameraIntrinsics(
-            m_cameraConfiguration.m_width, m_cameraConfiguration.m_height, m_cameraConfiguration.m_verticalFieldOfViewDeg);
-    }
-
-    int ROS2CameraSensorComponent::GetWidth() const
-    {
-        return m_cameraConfiguration.m_width;
-    }
-
-    int ROS2CameraSensorComponent::GetHeight() const
-    {
-        return m_cameraConfiguration.m_height;
-    }
-
-    float ROS2CameraSensorComponent::GetVerticalFOV() const
-    {
-        return m_cameraConfiguration.m_verticalFieldOfViewDeg;
-    }
-
-    void ROS2CameraSensorComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
-    {
-        required.push_back(AZ_CRC("ROS2Frame"));
-    }
-
-    void ROS2CameraSensorComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
-    {
-        incompatible.push_back(AZ_CRC_CE("ROS2CameraSensor"));
-    }
-
-    void ROS2CameraSensorComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
-    {
-        provided.push_back(AZ_CRC_CE("ROS2CameraSensor"));
-    }
-
-    void ROS2CameraSensorComponent::FrequencyTick()
-    {
-        if (!m_cameraSensor)
-        {
-            return;
-        }
-
-        const AZ::Transform& transform = GetEntity()->GetTransform()->GetWorldTM();
-        const auto timestamp = ROS2Interface::Get()->GetROSTimestamp();
-
-        std_msgs::msg::Header messageHeader;
-        messageHeader.stamp = timestamp;
-        messageHeader.frame_id = m_frameName.c_str();
-        m_cameraSensor->RequestMessagePublication(transform, messageHeader);
-    }
-
-    AZStd::string ROS2CameraSensorComponent::GetCameraNameFromFrame(const AZ::Entity* entity) const
-    {
-        const auto* component = GetEntity()->FindComponent<ROS2FrameComponent>();
-        AZ_Assert(component, "Entity %s has no ROS2CameraSensorComponent", entity->GetName().c_str());
-        if (component)
-        {
-            AZStd::string cameraName = component->GetFrameID();
-            AZStd::replace(cameraName.begin(), cameraName.end(), '/', '_');
-            return cameraName;
-        }
-        return AZStd::string{};
-    }
-} // namespace ROS2

+ 0 - 89
Gems/ROS2/Code/Source/Camera/ROS2CameraSystemComponent.cpp

@@ -1,89 +0,0 @@
-/*
-* Copyright (c) Contributors to the Open 3D Engine Project.
-* For complete copyright and license terms please see the LICENSE at the root of this distribution.
-*
-* SPDX-License-Identifier: Apache-2.0 OR MIT
-*
-*/
-
-#include "ROS2CameraSystemComponent.h"
-#include <Atom/RPI.Public/Pass/PassSystemInterface.h>
-
-namespace ROS2
-{
-   void ROS2SystemCameraComponent::Reflect(AZ::ReflectContext* context)
-   {
-       if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
-       {
-           serialize->Class<ROS2SystemCameraComponent, AZ::Component>()->Version(0);
-
-           if (AZ::EditContext* ec = serialize->GetEditContext())
-           {
-               ec->Class<ROS2SystemCameraComponent>("ROS 2 System Camera Component", "This system component is responsible for setting a pass template for simulation of camera sensors.")
-                   ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
-                   ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System"))
-                   ->Attribute(AZ::Edit::Attributes::Category, "ROS2")
-                   ->Attribute(AZ::Edit::Attributes::AutoExpand, true);
-           }
-       }
-   }
-
-   void ROS2SystemCameraComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
-   {
-       provided.push_back(AZ_CRC_CE("ROS2CameraSystemService"));
-   }
-
-   void ROS2SystemCameraComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
-   {
-       incompatible.push_back(AZ_CRC_CE("ROS2CameraSystemService"));
-   }
-
-   void ROS2SystemCameraComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required)
-   {
-       required.push_back(AZ_CRC_CE("ROS2Service"));
-   }
-
-   void ROS2SystemCameraComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
-   {
-       dependent.push_back(AZ_CRC_CE("RPISystem"));
-   }
-
-   void ROS2SystemCameraComponent::InitPassTemplateMappingsHandler()
-   {
-       auto* passSystem = AZ::RPI::PassSystemInterface::Get();
-       AZ_Assert(passSystem, "Cannot get the pass system.");
-
-       m_loadTemplatesHandler = AZ::RPI::PassSystemInterface::OnReadyLoadTemplatesEvent::Handler(
-           [this]()
-           {
-               this->LoadPassTemplateMappings();
-           });
-       passSystem->ConnectEvent(m_loadTemplatesHandler);
-   }
-
-   void ROS2SystemCameraComponent::Activate()
-   {
-       AZ::ApplicationTypeQuery appType;
-       AZ::ComponentApplicationBus::Broadcast(&AZ::ComponentApplicationBus::Events::QueryApplicationType, appType);
-       if (appType.IsGame() || appType.IsEditor())
-       {
-           InitPassTemplateMappingsHandler();
-       }
-   }
-
-   void ROS2SystemCameraComponent::Deactivate()
-   {
-       m_loadTemplatesHandler.Disconnect();
-   }
-
-   void ROS2SystemCameraComponent::LoadPassTemplateMappings()
-   {
-       AZ_Printf("ROS2SystemCameraComponent", "LoadPassTemplateMappings\n");
-       auto* passSystem = AZ::RPI::PassSystemInterface::Get();
-       AZ_Assert(passSystem, "PassSystemInterface is null");
-
-       const char* passTemplatesFile = "Passes/ROSPassTemplates.azasset";
-       [[maybe_unused]] const bool isOk = passSystem->LoadPassTemplateMappings(passTemplatesFile);
-       AZ_Assert(isOk, "LoadPassTemplateMappings return false ");
-   }
-} // namespace ROS2

+ 0 - 43
Gems/ROS2/Code/Source/Camera/ROS2CameraSystemComponent.h

@@ -1,43 +0,0 @@
-/*
-* Copyright (c) Contributors to the Open 3D Engine Project.
-* For complete copyright and license terms please see the LICENSE at the root of this distribution.
-*
-* SPDX-License-Identifier: Apache-2.0 OR MIT
-*
-*/
-#pragma once
-
-#include <Atom/RPI.Public/Pass/PassSystemInterface.h>
-#include <AzCore/Component/Component.h>
-
-namespace ROS2
-{
-    //! System Component for Camera simulation in ROS 2.
-   class ROS2SystemCameraComponent
-       : public AZ::Component
-   {
-   public:
-       AZ_COMPONENT(ROS2SystemCameraComponent, "{b4665d39-78fd-40de-8518-2f6bd345a831}");
-
-       static void Reflect(AZ::ReflectContext* context);
-
-       static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
-       static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
-       static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
-       static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
-
-       void InitPassTemplateMappingsHandler();
-
-   protected:
-       ////////////////////////////////////////////////////////////////////////
-       // AZ::Component override
-       void Activate() override;
-       void Deactivate() override;
-       ////////////////////////////////////////////////////////////////////////
-
-   private:
-       //! Load the pass templates of the ROS 2 Camera.
-       void LoadPassTemplateMappings();
-       AZ::RPI::PassSystemInterface::OnReadyLoadTemplatesEvent::Handler m_loadTemplatesHandler;
-   };
-} // namespace ROS2

+ 6 - 1
Gems/ROS2/Code/Source/ROS2Module.cpp → Gems/ROS2/Code/Source/Clients/ROS2Module.cpp

@@ -6,6 +6,7 @@
  *
  */
 
+#include <ROS2/ROS2TypeIds.h>
 #include <ROS2ModuleInterface.h>
 
 namespace ROS2
@@ -13,9 +14,13 @@ namespace ROS2
     class ROS2Module : public ROS2ModuleInterface
     {
     public:
-        AZ_RTTI(ROS2Module, "{e23a1379-787c-481e-ad83-c0e04a3d06fe}", ROS2ModuleInterface);
+        AZ_RTTI(ROS2Module, ROS2ModuleTypeId, ROS2ModuleInterface);
         AZ_CLASS_ALLOCATOR(ROS2Module, AZ::SystemAllocator);
     };
 } // namespace ROS2
 
+#if defined(O3DE_GEM_NAME)
+AZ_DECLARE_MODULE_CLASS(AZ_JOIN(Gem_, O3DE_GEM_NAME), ROS2::ROS2Module)
+#else
 AZ_DECLARE_MODULE_CLASS(Gem_ROS2, ROS2::ROS2Module)
+#endif

+ 16 - 18
Gems/ROS2/Code/Source/SystemComponents/ROS2SystemComponent.cpp → Gems/ROS2/Code/Source/Clients/ROS2SystemComponent.cpp

@@ -8,18 +8,15 @@
 #include <signal.h>
 
 #include "ROS2SystemComponent.h"
-#include <Lidar/LidarCore.h>
 #include <ROS2/Clock/ROS2TimeSource.h>
 #include <ROS2/Clock/RealTimeSource.h>
 #include <ROS2/Clock/SimulationTimeSource.h>
 #include <ROS2/Communication/PublisherConfiguration.h>
 #include <ROS2/Communication/QoS.h>
 #include <ROS2/Communication/TopicConfiguration.h>
+#include <ROS2/ROS2TypeIds.h>
 #include <ROS2/Sensor/SensorConfiguration.h>
-#include <ROS2/Utilities/Controllers/PidConfiguration.h>
-#include <VehicleDynamics/VehicleModelComponent.h>
-
-#include <Atom/RPI.Public/Pass/PassSystemInterface.h>
+#include <ROS2/Utilities/ROS2Conversions.h>
 
 #include <AzCore/Serialization/EditContext.h>
 #include <AzCore/Serialization/EditContextConstants.inl>
@@ -30,8 +27,6 @@
 #include <AzCore/std/sort.h>
 #include <AzCore/std/string/string_view.h>
 #include <AzFramework/API/ApplicationAPI.h>
-#include <ROS2/Sensor/SensorConfigurationRequestBus.h>
-#include <ROS2/Utilities/ROS2Conversions.h>
 
 namespace ROS2
 {
@@ -39,16 +34,15 @@ namespace ROS2
     constexpr AZStd::string_view PublishClockConfigurationKey = "/O3DE/ROS2/PublishClock";
     constexpr size_t FramesNumberForStats = 60;
 
+    AZ_COMPONENT_IMPL(ROS2SystemComponent, "ROS2SystemComponent", ROS2SystemComponentTypeId);
+
     void ROS2SystemComponent::Reflect(AZ::ReflectContext* context)
     {
         // Reflect structs not strictly owned by any single component
         QoS::Reflect(context);
         TopicConfiguration::Reflect(context);
         PublisherConfiguration::Reflect(context);
-        LidarCore::Reflect(context);
         SensorConfiguration::Reflect(context);
-        VehicleDynamics::VehicleModelComponent::Reflect(context);
-        ROS2::Controllers::PidConfiguration::Reflect(context);
 
         if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
         {
@@ -58,8 +52,8 @@ namespace ROS2
             {
                 ec->Class<ROS2SystemComponent>(
                       "ROS 2 System Component",
-                      "This component is responsible for creating ROS 2 node and executor, provides ROS 2 interfaces, manages ROS 2 clock and "
-                      "publishes transforms.")
+                      "This component is responsible for creating ROS 2 node and executor, provides ROS 2 interfaces, manages ROS 2 clock "
+                      "and publishes transforms.")
                     ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
                     ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System"))
                     ->Attribute(AZ::Edit::Attributes::Category, "ROS2")
@@ -78,7 +72,7 @@ namespace ROS2
         incompatible.push_back(AZ_CRC_CE("ROS2Service"));
     }
 
-    void ROS2SystemComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required)
+    void ROS2SystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
     {
         required.push_back(AZ_CRC("AssetDatabaseService", 0x3abf5601));
     }
@@ -109,10 +103,11 @@ namespace ROS2
         rclcpp::init(0, 0);
 
         // handle signals, e.g. via `Ctrl+C` hotkey or `kill` command
-        auto handler = [](int sig){
+        auto handler = [](int sig)
+        {
             rclcpp::shutdown(); // shutdown rclcpp
             std::raise(sig); // shutdown o3de
-            };
+        };
         signal(SIGINT, handler);
         signal(SIGTERM, handler);
     }
@@ -149,7 +144,8 @@ namespace ROS2
                 return;
             }
         }
-        AZ_Info("ROS2SystemComponent", "Cannot read registry or the clock type '%s' is unknown, enabling simulation clock.", clockType.c_str());
+        AZ_Info(
+            "ROS2SystemComponent", "Cannot read registry or the clock type '%s' is unknown, enabling simulation clock.", clockType.c_str());
         m_simulationClock = AZStd::make_unique<ROS2Clock>(clocksMap["simulation"](), publishClock);
     }
 
@@ -173,14 +169,16 @@ namespace ROS2
     {
         AZ::TickBus::Handler::BusDisconnect();
         ROS2RequestBus::Handler::BusDisconnect();
-        if (m_simulationClock) {
+        if (m_simulationClock)
+        {
             m_simulationClock->Deactivate();
         }
         m_dynamicTFBroadcaster.reset();
         m_staticTFBroadcaster.reset();
         if (m_executor)
         {
-            if (m_ros2Node) {
+            if (m_ros2Node)
+            {
                 m_executor->remove_node(m_ros2Node);
             }
             m_executor.reset();

+ 9 - 9
Gems/ROS2/Code/Source/SystemComponents/ROS2SystemComponent.h → Gems/ROS2/Code/Source/Clients/ROS2SystemComponent.h

@@ -10,7 +10,6 @@
 #include <AzCore/Component/Component.h>
 #include <AzCore/Component/TickBus.h>
 #include <AzCore/std/smart_ptr/unique_ptr.h>
-#include <Lidar/LidarSystem.h>
 #include <ROS2/Clock/ROS2Clock.h>
 #include <ROS2/ROS2Bus.h>
 #include <builtin_interfaces/msg/time.hpp>
@@ -45,7 +44,7 @@ namespace ROS2
         , protected ROS2RequestBus::Handler
     {
     public:
-        AZ_COMPONENT(ROS2SystemComponent, "{cb28d486-afa4-4a9f-a237-ac5eb42e1c87}");
+        AZ_COMPONENT_DECL(ROS2SystemComponent);
 
         static void Reflect(AZ::ReflectContext* context);
 
@@ -55,21 +54,22 @@ namespace ROS2
         static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
 
         ROS2SystemComponent();
-        ~ROS2SystemComponent() override;
+        ~ROS2SystemComponent();
 
-        //////////////////////////////////////////////////////////////////////////
-        // ROS2RequestBus::Handler overrides
+
+    protected:
+        ////////////////////////////////////////////////////////////////////////
+        // ROS2RequestBus interface implementation
         std::shared_ptr<rclcpp::Node> GetNode() const override;
         void ConnectOnNodeChanged(NodeChangedEvent::Handler& handler) override;
         builtin_interfaces::msg::Time GetROSTimestamp() const override;
         void BroadcastTransform(const geometry_msgs::msg::TransformStamped& t, bool isDynamic) override;
         const ROS2Clock& GetSimulationClock() const override;
         float GetExpectedSimulationLoopTime() const override;
-        //////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////
 
-    protected:
         ////////////////////////////////////////////////////////////////////////
-        // AZ::Component override
+        // AZ::Component interface implementation
         void Init() override;
         void Activate() override;
         void Deactivate() override;
@@ -93,6 +93,6 @@ namespace ROS2
 
         AZStd::deque<float> m_simulationLoopTimes;
         builtin_interfaces::msg::Time m_lastSimulationTime;
-        float m_simulationLoopTimeMedian = 1.f / 60.0f;
+        float m_simulationLoopTimeMedian = 1.0f / 60.0f;
     };
 } // namespace ROS2

+ 8 - 6
Gems/ROS2/Code/Source/Frame/ROS2FrameComponent.cpp

@@ -8,6 +8,7 @@
 
 #include "ROS2FrameSystemComponent.h"
 #include <AzCore/Component/Entity.h>
+#include <AzCore/Component/EntityUtils.h>
 #include <AzCore/RTTI/ReflectContext.h>
 #include <AzCore/Serialization/EditContext.h>
 #include <AzCore/Serialization/EditContextConstants.inl>
@@ -20,9 +21,6 @@
 #include <ROS2/ROS2Bus.h>
 #include <ROS2/ROS2GemUtilities.h>
 #include <ROS2/Utilities/ROS2Names.h>
-#include <Source/ArticulationLinkComponent.h>
-#include <Source/FixedJointComponent.h>
-#include <Source/JointComponent.h>
 #include <rapidjson/document.h>
 #include <rapidjson/stringbuffer.h>
 
@@ -151,9 +149,13 @@ namespace ROS2
             // Otherwise it'll be dynamic when it has joints and it's not a fixed joint.
             else
             {
-                const bool hasJoints = Utils::HasComponentOfType(m_entity, PhysX::JointComponent::TYPEINFO_Uuid());
-                const bool hasFixedJoints = Utils::HasComponentOfType(m_entity, PhysX::FixedJointComponent::TYPEINFO_Uuid());
-                const bool hasArticulations = Utils::HasComponentOfType(m_entity, PhysX::ArticulationLinkComponent::TYPEINFO_Uuid());
+                // Quickfix: Use hard-coded uuids to avoid linking to PhysX.
+                const bool hasJoints =
+                    Utils::HasComponentOfType(m_entity, AZ::Uuid("{B01FD1D2-1D91-438D-874A-BF5EB7E919A8}")); // PhysX::JointComponent;
+                const bool hasFixedJoints =
+                    Utils::HasComponentOfType(m_entity, AZ::Uuid("{02E6C633-8F44-4CEE-AE94-DCB06DE36422}")); // PhysX::FixedJointComponent
+                const bool hasArticulations =
+                    Utils::HasComponentOfType(m_entity, AZ::Uuid("{48751E98-B35F-4A2F-A908-D9CDD5230264}")); // PhysX::ArticulationComponent
                 m_isDynamic = (hasJoints && !hasFixedJoints) || hasArticulations;
             }
 

+ 0 - 147
Gems/ROS2/Code/Source/Lidar/ROS2Lidar2DSensorComponent.cpp

@@ -1,147 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include <Atom/RPI.Public/AuxGeom/AuxGeomFeatureProcessorInterface.h>
-#include <Atom/RPI.Public/Scene.h>
-#include <AzFramework/Physics/PhysicsSystem.h>
-#include <Lidar/LidarRegistrarSystemComponent.h>
-#include <Lidar/ROS2Lidar2DSensorComponent.h>
-#include <ROS2/Frame/ROS2FrameComponent.h>
-#include <ROS2/Utilities/ROS2Names.h>
-
-namespace ROS2
-{
-    namespace
-    {
-        const char* LaserScanType = "sensor_msgs::msg::LaserScan";
-    }
-
-    void ROS2Lidar2DSensorComponent::Reflect(AZ::ReflectContext* context)
-    {
-        if (auto* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
-        {
-            serializeContext->Class<ROS2Lidar2DSensorComponent, SensorBaseType>()->Version(3)->Field(
-                "lidarCore", &ROS2Lidar2DSensorComponent::m_lidarCore);
-
-            if (auto* editContext = serializeContext->GetEditContext())
-            {
-                editContext->Class<ROS2Lidar2DSensorComponent>("ROS2 Lidar 2D Sensor", "Lidar 2D sensor component")
-                    ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
-                    ->Attribute(AZ::Edit::Attributes::Category, "ROS2")
-                    ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game"))
-                    ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/ROS2Lidar2DSensor.svg")
-                    ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/ROS2Lidar2DSensor.svg")
-                    ->DataElement(
-                        AZ::Edit::UIHandlers::ComboBox,
-                        &ROS2Lidar2DSensorComponent::m_lidarCore,
-                        "Lidar configuration",
-                        "Lidar configuration")
-                    ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly);
-            }
-        }
-    }
-
-    ROS2Lidar2DSensorComponent::ROS2Lidar2DSensorComponent()
-        : m_lidarCore(LidarTemplateUtils::Get2DModels())
-    {
-        TopicConfiguration ls;
-        AZStd::string type = LaserScanType;
-        ls.m_type = type;
-        ls.m_topic = "scan";
-        m_sensorConfiguration.m_frequency = 10.f;
-        m_sensorConfiguration.m_publishersConfigurations.insert(AZStd::make_pair(type, ls));
-    }
-    ROS2Lidar2DSensorComponent::ROS2Lidar2DSensorComponent(
-        const SensorConfiguration& sensorConfiguration, const LidarSensorConfiguration& lidarConfiguration)
-        : m_lidarCore(lidarConfiguration)
-    {
-        m_sensorConfiguration = sensorConfiguration;
-    }
-
-    void ROS2Lidar2DSensorComponent::Activate()
-    {
-        ROS2SensorComponentBase::Activate();
-        m_lidarCore.Init(GetEntityId());
-
-        auto ros2Node = ROS2Interface::Get()->GetNode();
-        AZ_Assert(m_sensorConfiguration.m_publishersConfigurations.size() == 1, "Invalid configuration of publishers for lidar sensor");
-
-        const TopicConfiguration& publisherConfig = m_sensorConfiguration.m_publishersConfigurations[LaserScanType];
-        AZStd::string fullTopic = ROS2Names::GetNamespacedName(GetNamespace(), publisherConfig.m_topic);
-        m_laserScanPublisher = ros2Node->create_publisher<sensor_msgs::msg::LaserScan>(fullTopic.data(), publisherConfig.GetQoS());
-
-        StartSensor(
-            m_sensorConfiguration.m_frequency,
-            [this]([[maybe_unused]] auto&&... args)
-            {
-                FrequencyTick();
-            },
-            [this]([[maybe_unused]] auto&&... args)
-            {
-                if (!m_sensorConfiguration.m_visualize)
-                {
-                    return;
-                }
-                m_lidarCore.VisualizeResults();
-            });
-    }
-
-    void ROS2Lidar2DSensorComponent::Deactivate()
-    {
-        StopSensor();
-        m_laserScanPublisher.reset();
-        m_lidarCore.Deinit();
-        ROS2SensorComponentBase::Deactivate();
-    }
-
-    void ROS2Lidar2DSensorComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
-    {
-        required.push_back(AZ_CRC_CE("ROS2Frame"));
-    }
-
-    void ROS2Lidar2DSensorComponent::FrequencyTick()
-    {
-        AZStd::optional<RaycastResults> results = m_lidarCore.PerformRaycast();
-
-        if (!results.has_value() || !m_sensorConfiguration.m_publishingEnabled)
-        {
-            return;
-        }
-
-        PublishRaycastResults(results.value());
-    }
-
-    void ROS2Lidar2DSensorComponent::PublishRaycastResults(const RaycastResults& results)
-    {
-        const bool isIntensityEnabled = m_lidarCore.m_lidarConfiguration.m_lidarSystemFeatures & LidarSystemFeatures::Intensity;
-
-        auto* ros2Frame = GetEntity()->FindComponent<ROS2FrameComponent>();
-        auto message = sensor_msgs::msg::LaserScan();
-        message.header.frame_id = ros2Frame->GetFrameID().data();
-        message.header.stamp = ROS2Interface::Get()->GetROSTimestamp();
-        message.angle_min = AZ::DegToRad(m_lidarCore.m_lidarConfiguration.m_lidarParameters.m_minHAngle);
-        message.angle_max = AZ::DegToRad(m_lidarCore.m_lidarConfiguration.m_lidarParameters.m_maxHAngle);
-        message.angle_increment = (message.angle_max - message.angle_min) /
-            aznumeric_cast<float>(m_lidarCore.m_lidarConfiguration.m_lidarParameters.m_numberOfIncrements);
-
-        message.range_min = m_lidarCore.m_lidarConfiguration.m_lidarParameters.m_minRange;
-        message.range_max = m_lidarCore.m_lidarConfiguration.m_lidarParameters.m_maxRange;
-        message.scan_time = 1.f / m_sensorConfiguration.m_frequency;
-        message.time_increment = 0.0f;
-
-        const auto rangeField = results.GetConstFieldSpan<RaycastResultFlags::Range>().value();
-        message.ranges.assign(rangeField.begin(), rangeField.end());
-        if (isIntensityEnabled)
-        {
-            const auto intensityField = results.GetConstFieldSpan<RaycastResultFlags::Intensity>().value();
-            message.intensities.assign(intensityField.begin(), intensityField.end());
-        }
-
-        m_laserScanPublisher->publish(message);
-    }
-} // namespace ROS2

+ 0 - 53
Gems/ROS2/Code/Source/Lidar/ROS2Lidar2DSensorComponent.h

@@ -1,53 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#pragma once
-
-#include <Atom/RPI.Public/AuxGeom/AuxGeomDraw.h>
-#include <AzCore/Serialization/SerializeContext.h>
-#include <ROS2/Lidar/LidarRegistrarBus.h>
-#include <ROS2/Lidar/LidarSystemBus.h>
-#include <ROS2/Sensor/Events/TickBasedSource.h>
-#include <ROS2/Sensor/ROS2SensorComponentBase.h>
-#include <rclcpp/publisher.hpp>
-#include <sensor_msgs/msg/laser_scan.hpp>
-
-#include "LidarCore.h"
-#include "LidarRaycaster.h"
-
-namespace ROS2
-{
-    //! Lidar 2D sensor Component.
-    //! Lidars (Light Detection and Ranging) emit laser light and measure it after reflection.
-    //! Lidar Component allows customization of lidar type and behavior and encapsulates both simulation
-    //! and data publishing. It requires ROS2FrameComponent.
-    class ROS2Lidar2DSensorComponent : public ROS2SensorComponentBase<TickBasedSource>
-    {
-    public:
-        AZ_COMPONENT(ROS2Lidar2DSensorComponent, ROS2Lidar2DSensorComponentTypeId, SensorBaseType);
-        ROS2Lidar2DSensorComponent();
-        ROS2Lidar2DSensorComponent(const SensorConfiguration& sensorConfiguration, const LidarSensorConfiguration& lidarConfiguration);
-        ~ROS2Lidar2DSensorComponent() = default;
-        static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
-        static void Reflect(AZ::ReflectContext* context);
-        //////////////////////////////////////////////////////////////////////////
-        // Component overrides
-        void Activate() override;
-        void Deactivate() override;
-        //////////////////////////////////////////////////////////////////////////
-
-    private:
-        //////////////////////////////////////////////////////////////////////////
-        void FrequencyTick();
-
-        void PublishRaycastResults(const RaycastResults& results);
-
-        std::shared_ptr<rclcpp::Publisher<sensor_msgs::msg::LaserScan>> m_laserScanPublisher;
-
-        LidarCore m_lidarCore;
-    };
-} // namespace ROS2

+ 0 - 58
Gems/ROS2/Code/Source/Lidar/ROS2LidarSensorComponent.h

@@ -1,58 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#pragma once
-
-#include <Atom/RPI.Public/AuxGeom/AuxGeomDraw.h>
-#include <AzCore/Serialization/SerializeContext.h>
-#include <ROS2/Lidar/LidarRegistrarBus.h>
-#include <ROS2/Lidar/LidarSystemBus.h>
-#include <ROS2/Sensor/Events/TickBasedSource.h>
-#include <ROS2/Sensor/ROS2SensorComponentBase.h>
-#include <rclcpp/publisher.hpp>
-#include <sensor_msgs/msg/point_cloud2.hpp>
-#include <vision_msgs/msg/label_info.hpp>
-
-#include "LidarCore.h"
-#include "LidarRaycaster.h"
-#include "LidarSensorConfiguration.h"
-
-namespace ROS2
-{
-    //! Lidar sensor Component.
-    //! Lidars (Light Detection and Ranging) emit laser light and measure it after reflection.
-    //! Lidar Component allows customization of lidar type and behavior and encapsulates both simulation
-    //! and data publishing. It requires ROS2FrameComponent.
-    class ROS2LidarSensorComponent : public ROS2SensorComponentBase<TickBasedSource>
-    {
-    public:
-        AZ_COMPONENT(ROS2LidarSensorComponent, ROS2LidarSensorComponentTypeId, SensorBaseType);
-        ROS2LidarSensorComponent();
-        ROS2LidarSensorComponent(const SensorConfiguration& sensorConfiguration, const LidarSensorConfiguration& lidarConfiguration);
-        ~ROS2LidarSensorComponent() = default;
-        static void Reflect(AZ::ReflectContext* context);
-        static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
-        //////////////////////////////////////////////////////////////////////////
-        // Component overrides
-        void Activate() override;
-        void Deactivate() override;
-        //////////////////////////////////////////////////////////////////////////
-
-    private:
-        //////////////////////////////////////////////////////////////////////////
-        void FrequencyTick();
-        void PublishRaycastResults(const RaycastResults& results);
-
-        bool m_canRaycasterPublish = false;
-        std::shared_ptr<rclcpp::Publisher<sensor_msgs::msg::PointCloud2>> m_pointCloudPublisher;
-        std::shared_ptr<rclcpp::Publisher<vision_msgs::msg::LabelInfo>> m_segmentationClassesPublisher;
-
-        LidarCore m_lidarCore;
-
-        LidarId m_lidarRaycasterId;
-    };
-} // namespace ROS2

+ 0 - 140
Gems/ROS2/Code/Source/Odometry/ROS2WheelOdometry.cpp

@@ -1,140 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "ROS2WheelOdometry.h"
-#include "Odometry/ROS2OdometryCovariance.h"
-#include "VehicleModelComponent.h"
-#include <ROS2/Utilities/ROS2Conversions.h>
-#include <ROS2/Utilities/ROS2Names.h>
-
-namespace ROS2
-{
-    namespace
-    {
-        const char* WheelOdometryMsgType = "nav_msgs::msg::Odometry";
-    }
-
-    void ROS2WheelOdometryComponent::Reflect(AZ::ReflectContext* context)
-    {
-        ROS2OdometryCovariance::Reflect(context);
-
-        if (auto* serialize = azrtti_cast<AZ::SerializeContext*>(context))
-        {
-            serialize->Class<ROS2WheelOdometryComponent, SensorBaseType>()
-                ->Version(2)
-                ->Field("Twist covariance", &ROS2WheelOdometryComponent::m_twistCovariance)
-                ->Field("Pose covariance", &ROS2WheelOdometryComponent::m_poseCovariance);
-
-            if (auto* editContext = serialize->GetEditContext())
-            {
-                editContext->Class<ROS2WheelOdometryComponent>("ROS2 Wheel Odometry Sensor", "Odometry sensor component")
-                    ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
-                    ->Attribute(AZ::Edit::Attributes::Category, "ROS2")
-                    ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game"))
-                    ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/ROS2WheelOdometrySensor.svg")
-                    ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/ROS2WheelOdometrySensor.svg")
-                    ->DataElement(
-                        AZ::Edit::UIHandlers::Default,
-                        &ROS2WheelOdometryComponent::m_twistCovariance,
-                        "Twist covariance",
-                        "Set ROS twist covariance")
-                    ->DataElement(
-                        AZ::Edit::UIHandlers::Default,
-                        &ROS2WheelOdometryComponent::m_poseCovariance,
-                        "Pose covariance",
-                        "Set ROS pose covariance");
-            }
-        }
-    }
-
-    ROS2WheelOdometryComponent::ROS2WheelOdometryComponent()
-    {
-        TopicConfiguration tc;
-        const AZStd::string type = WheelOdometryMsgType;
-        tc.m_type = type;
-        tc.m_topic = "odom";
-        m_sensorConfiguration.m_frequency = 10;
-        m_sensorConfiguration.m_publishersConfigurations.insert(AZStd::make_pair(type, tc));
-    }
-
-    void ROS2WheelOdometryComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
-    {
-        required.push_back(AZ_CRC_CE("ROS2Frame"));
-        required.push_back(AZ_CRC_CE("SkidSteeringModelService"));
-    }
-
-    void ROS2WheelOdometryComponent::OnOdometryEvent()
-    {
-        m_odometryMsg.pose.pose.position = ROS2Conversions::ToROS2Point(m_robotPose);
-        m_odometryMsg.pose.pose.orientation = ROS2Conversions::ToROS2Quaternion(m_robotRotation);
-        m_odometryMsg.pose.covariance = m_poseCovariance.GetRosCovariance();
-
-        m_odometryPublisher->publish(m_odometryMsg);
-    }
-
-    void ROS2WheelOdometryComponent::OnPhysicsEvent(float physicsDeltaTime)
-    {
-        AZStd::pair<AZ::Vector3, AZ::Vector3> vt;
-
-        VehicleDynamics::VehicleInputControlRequestBus::EventResult(
-            vt, GetEntityId(), &VehicleDynamics::VehicleInputControlRequests::GetWheelsOdometry);
-
-        m_odometryMsg.header.stamp = ROS2Interface::Get()->GetROSTimestamp();
-        m_odometryMsg.twist.twist.linear = ROS2Conversions::ToROS2Vector3(vt.first);
-        m_odometryMsg.twist.twist.angular = ROS2Conversions::ToROS2Vector3(vt.second);
-        m_odometryMsg.twist.covariance = m_twistCovariance.GetRosCovariance();
-
-        if (m_sensorConfiguration.m_frequency > 0)
-        {
-            const auto updatePos = physicsDeltaTime * vt.first; // in meters
-            const auto updateRot = physicsDeltaTime * vt.second; // in radians
-            m_robotPose += m_robotRotation.TransformVector(updatePos);
-            m_robotRotation *= AZ::Quaternion::CreateFromScaledAxisAngle(updateRot);
-        }
-    }
-
-    void ROS2WheelOdometryComponent::Activate()
-    {
-        ROS2SensorComponentBase::Activate();
-        m_robotPose = AZ::Vector3{ 0 };
-        m_robotRotation = AZ::Quaternion{ 0, 0, 0, 1 };
-
-        // "odom" is globally fixed frame for all robots, no matter the namespace
-        m_odometryMsg.header.frame_id = ROS2Names::GetNamespacedName(GetNamespace(), "odom").c_str();
-        m_odometryMsg.child_frame_id = GetFrameID().c_str();
-
-        auto ros2Node = ROS2Interface::Get()->GetNode();
-        AZ_Assert(m_sensorConfiguration.m_publishersConfigurations.size() == 1, "Invalid configuration of publishers for Odometry sensor");
-
-        const auto& publisherConfig = m_sensorConfiguration.m_publishersConfigurations[WheelOdometryMsgType];
-        const auto fullTopic = ROS2Names::GetNamespacedName(GetNamespace(), publisherConfig.m_topic);
-        m_odometryPublisher = ros2Node->create_publisher<nav_msgs::msg::Odometry>(fullTopic.data(), publisherConfig.GetQoS());
-
-        StartSensor(
-            m_sensorConfiguration.m_frequency,
-            [this]([[maybe_unused]] auto&&... args)
-            {
-                if (!m_sensorConfiguration.m_publishingEnabled)
-                {
-                    return;
-                }
-                OnOdometryEvent();
-            },
-            [this]([[maybe_unused]] AzPhysics::SceneHandle sceneHandle, float physicsDeltaTime)
-            {
-                OnPhysicsEvent(physicsDeltaTime);
-            });
-    }
-
-    void ROS2WheelOdometryComponent::Deactivate()
-    {
-        StopSensor();
-        m_odometryPublisher.reset();
-        ROS2SensorComponentBase::Deactivate();
-    }
-} // namespace ROS2

+ 0 - 50
Gems/ROS2/Code/Source/Odometry/ROS2WheelOdometry.h

@@ -1,50 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#pragma once
-
-#include <AzCore/Math/Transform.h>
-#include <nav_msgs/msg/odometry.hpp>
-#include <rclcpp/publisher.hpp>
-#include <ROS2/Sensor/Events/PhysicsBasedSource.h>
-#include <ROS2/Sensor/ROS2SensorComponentBase.h>
-
-#include "ROS2OdometryCovariance.h"
-
-namespace ROS2
-{
-    //! Wheel odometry sensor component.
-    //! It constructs and publishes an odometry message, which contains information about the vehicle's velocity and position in space.
-    //! This is a physical sensor that takes a vehicle's configuration and computes updates from the wheels' rotations.
-    //! @see <a href="https://index.ros.org/p/nav_msgs/">nav_msgs package</a>.
-    class ROS2WheelOdometryComponent
-        : public ROS2SensorComponentBase<PhysicsBasedSource>
-    {
-    public:
-        AZ_COMPONENT(ROS2WheelOdometryComponent, ROS2WheelOdometryComponentTypeId, SensorBaseType);
-        ROS2WheelOdometryComponent();
-        ~ROS2WheelOdometryComponent() = default;
-        static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
-        static void Reflect(AZ::ReflectContext* context);
-        //////////////////////////////////////////////////////////////////////////
-        // Component overrides
-        void Activate() override;
-        void Deactivate() override;
-        //////////////////////////////////////////////////////////////////////////
-
-    private:
-        std::shared_ptr<rclcpp::Publisher<nav_msgs::msg::Odometry>> m_odometryPublisher;
-        nav_msgs::msg::Odometry m_odometryMsg;
-        AZ::Vector3 m_robotPose{ 0 };
-        AZ::Quaternion m_robotRotation{ 0, 0, 0, 1 };
-        ROS2OdometryCovariance m_poseCovariance;
-        ROS2OdometryCovariance m_twistCovariance;
-
-        void OnOdometryEvent();
-        void OnPhysicsEvent(float physicsDeltaTime);
-    };
-} // namespace ROS2

+ 53 - 0
Gems/ROS2/Code/Source/ROS2ModuleInterface.cpp

@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include "ROS2ModuleInterface.h"
+#include <AzCore/Memory/Memory.h>
+
+#include <Clients/ROS2SystemComponent.h>
+#include <ROS2/Frame/ROS2FrameComponent.h>
+#include <ROS2/ROS2TypeIds.h>
+#include <ROS2/Sensor/Events/PhysicsBasedSource.h>
+#include <ROS2/Sensor/Events/TickBasedSource.h>
+#include <ROS2/Sensor/ROS2SensorComponentBase.h>
+#include <SimulationUtils/FollowingCameraComponent.h>
+#ifdef WITH_GAZEBO_MSGS
+#include <Spawner/ROS2SpawnPointComponent.h>
+#include <Spawner/ROS2SpawnerComponent.h>
+#endif
+
+namespace ROS2
+{
+    AZ_TYPE_INFO_WITH_NAME_IMPL(ROS2ModuleInterface, "ROS2ModuleInterface", ROS2ModuleInterfaceTypeId);
+    AZ_RTTI_NO_TYPE_INFO_IMPL(ROS2ModuleInterface, AZ::Module);
+    AZ_CLASS_ALLOCATOR_IMPL(ROS2ModuleInterface, AZ::SystemAllocator);
+
+    ROS2ModuleInterface::ROS2ModuleInterface()
+    {
+        m_descriptors.insert(
+            m_descriptors.end(),
+            {
+                ROS2SystemComponent::CreateDescriptor(),
+                ROS2FrameComponent::CreateDescriptor(),
+                FollowingCameraComponent::CreateDescriptor(),
+                ROS2SensorComponentBase<TickBasedSource>::CreateDescriptor(),
+                ROS2SensorComponentBase<PhysicsBasedSource>::CreateDescriptor(),
+#ifdef WITH_GAZEBO_MSGS
+                ROS2SpawnerComponent::CreateDescriptor(),
+                ROS2SpawnPointComponent::CreateDescriptor(),
+#endif
+            });
+    }
+
+    AZ::ComponentTypeList ROS2ModuleInterface::GetRequiredSystemComponents() const
+    {
+        return AZ::ComponentTypeList{
+            azrtti_typeid<ROS2SystemComponent>(),
+        };
+    }
+} // namespace ROS2

+ 9 - 98
Gems/ROS2/Code/Source/ROS2ModuleInterface.h

@@ -7,111 +7,22 @@
  */
 #pragma once
 
-#include <AzCore/Memory/SystemAllocator.h>
+#include <AzCore/Memory/Memory_fwd.h>
 #include <AzCore/Module/Module.h>
-#include <Camera/PostProcessing/ROS2ImageEncodingConversionComponent.h>
-#include <Camera/ROS2CameraSensorComponent.h>
-#include <Camera/ROS2CameraSystemComponent.h>
-#include <GNSS/ROS2GNSSSensorComponent.h>
-#include <Gripper/FingerGripperComponent.h>
-#include <Gripper/GripperActionServerComponent.h>
-#include <Gripper/VacuumGripperComponent.h>
-#include <Imu/ROS2ImuSensorComponent.h>
-#include <Lidar/ClassSegmentationConfigurationComponent.h>
-#include <Lidar/LidarRegistrarSystemComponent.h>
-#include <Lidar/ROS2Lidar2DSensorComponent.h>
-#include <Lidar/ROS2LidarSensorComponent.h>
-#include <Manipulation/Controllers/JointsArticulationControllerComponent.h>
-#include <Manipulation/Controllers/JointsPIDControllerComponent.h>
-#include <Manipulation/JointsManipulationComponent.h>
-#include <Manipulation/JointsPositionsComponent.h>
-#include <Manipulation/JointsTrajectoryComponent.h>
-#include <Odometry/ROS2OdometrySensorComponent.h>
-#include <Odometry/ROS2WheelOdometry.h>
-#include <ROS2/Frame/ROS2FrameComponent.h>
-#include <ROS2/Manipulation/MotorizedJoints/JointMotorControllerComponent.h>
-#include <ROS2/Manipulation/MotorizedJoints/ManualMotorControllerComponent.h>
-#include <ROS2/Manipulation/MotorizedJoints/PidMotorControllerComponent.h>
-#include <RobotControl/Controllers/AckermannController/AckermannControlComponent.h>
-#include <RobotControl/Controllers/RigidBodyController/RigidBodyTwistControlComponent.h>
-#include <RobotControl/Controllers/SkidSteeringController/SkidSteeringControlComponent.h>
-#include <RobotControl/ROS2RobotControlComponent.h>
-#include <RobotImporter/ROS2RobotImporterSystemComponent.h>
-#include <SimulationUtils/FollowingCameraComponent.h>
-#include <SystemComponents/ROS2SystemComponent.h>
-#include <VehicleDynamics/ModelComponents/AckermannModelComponent.h>
-#include <VehicleDynamics/ModelComponents/SkidSteeringModelComponent.h>
-#include <VehicleDynamics/VehicleModelComponent.h>
-#include <VehicleDynamics/WheelControllerComponent.h>
-#ifdef WITH_GAZEBO_MSGS
-#include <Spawner/ROS2SpawnPointComponent.h>
-#include <Spawner/ROS2SpawnerComponent.h>
-#include <ContactSensor/ROS2ContactSensorComponent.h>
-#endif
+#include <AzCore/RTTI/RTTIMacros.h>
+#include <AzCore/RTTI/TypeInfoSimple.h>
+
 namespace ROS2
 {
     class ROS2ModuleInterface : public AZ::Module
     {
     public:
-        AZ_RTTI(ROS2ModuleInterface, "{8b5567cb-1de9-49af-9cd4-9750d4abcd6b}", AZ::Module);
-        AZ_CLASS_ALLOCATOR(ROS2ModuleInterface, AZ::SystemAllocator);
+        AZ_TYPE_INFO_WITH_NAME_DECL(ROS2ModuleInterface)
+        AZ_RTTI_NO_TYPE_INFO_DECL()
+        AZ_CLASS_ALLOCATOR_DECL
 
-        ROS2ModuleInterface()
-        {
-            m_descriptors.insert(
-                m_descriptors.end(),
-                {
-                    ROS2SystemComponent::CreateDescriptor(),
-                    ROS2SystemCameraComponent::CreateDescriptor(),
-                    ROS2SensorComponentBase<TickBasedSource>::CreateDescriptor(),
-                    ROS2SensorComponentBase<PhysicsBasedSource>::CreateDescriptor(),
-                    LidarRegistrarSystemComponent::CreateDescriptor(),
-                    ROS2RobotImporterSystemComponent::CreateDescriptor(),
-                    ROS2ImuSensorComponent::CreateDescriptor(),
-                    ROS2GNSSSensorComponent::CreateDescriptor(),
-                    ROS2LidarSensorComponent::CreateDescriptor(),
-                    ROS2Lidar2DSensorComponent::CreateDescriptor(),
-                    ROS2OdometrySensorComponent::CreateDescriptor(),
-                    ROS2WheelOdometryComponent::CreateDescriptor(),
-                    ROS2FrameComponent::CreateDescriptor(),
-                    ROS2RobotControlComponent::CreateDescriptor(),
-                    ROS2ImageEncodingConversionComponent::CreateDescriptor(),
-                    AckermannControlComponent::CreateDescriptor(),
-                    RigidBodyTwistControlComponent::CreateDescriptor(),
-                    SkidSteeringControlComponent::CreateDescriptor(),
-                    ROS2CameraSensorComponent::CreateDescriptor(),
-                    VehicleDynamics::AckermannVehicleModelComponent::CreateDescriptor(),
-                    VehicleDynamics::WheelControllerComponent::CreateDescriptor(),
-                    VehicleDynamics::SkidSteeringModelComponent::CreateDescriptor(),
-                    JointMotorControllerComponent::CreateDescriptor(),
-                    ManualMotorControllerComponent::CreateDescriptor(),
-                    JointsManipulationComponent::CreateDescriptor(),
-                    JointsPositionsComponent::CreateDescriptor(),
-                    JointsArticulationControllerComponent::CreateDescriptor(),
-                    JointsPIDControllerComponent::CreateDescriptor(),
-                    JointsTrajectoryComponent::CreateDescriptor(),
-                    PidMotorControllerComponent::CreateDescriptor(),
-                    GripperActionServerComponent::CreateDescriptor(),
-                    VacuumGripperComponent::CreateDescriptor(),
-                    FingerGripperComponent::CreateDescriptor(),
-                    FollowingCameraComponent::CreateDescriptor(),
-                    ClassSegmentationConfigurationComponent::CreateDescriptor(),
-#ifdef WITH_GAZEBO_MSGS
-                    ROS2SpawnerComponent::CreateDescriptor(),
-                    ROS2SpawnPointComponent::CreateDescriptor(),
-                    ROS2ContactSensorComponent::CreateDescriptor(),
-#endif
-                });
-        }
+        ROS2ModuleInterface();
 
-        AZ::ComponentTypeList GetRequiredSystemComponents() const override
-        {
-            return AZ::ComponentTypeList{
-                azrtti_typeid<ROS2SystemComponent>(),
-                azrtti_typeid<ROS2SystemCameraComponent>(),
-                azrtti_typeid<LidarRegistrarSystemComponent>(),
-                azrtti_typeid<ROS2RobotImporterSystemComponent>(),
-            };
-        }
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override;
     };
 } // namespace ROS2

+ 0 - 38
Gems/ROS2/Code/Source/RobotImporter/Pages/IntroPage.cpp

@@ -1,38 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "IntroPage.h"
-#include <QVBoxLayout>
-
-namespace ROS2
-{
-    IntroPage::IntroPage(QWizard* parent)
-        : QWizardPage(parent)
-    {
-        setTitle(QObject::tr("Introduction"));
-
-        m_label = new QLabel(
-            QObject::tr("This wizard allows you to build a robot prefab using a URDF description file or object/environment prefab using an SDF file."
-                        " Before processing, please make sure that all of the robot's description packages have been built and sourced."
-                        " Details can be found <a "
-                        "href=\"https://www.o3de.org/docs/user-guide/interactivity/robotics/importing-robot/"
-                        "#loading-the-robot-definition-file-with-robot-importer\">here</a>."
-                        " The Open 3D Engine can only use files in its internal <a "
-                        "href=\"https://www.o3de.org/docs/user-guide/assets/asset-types/\">format</a>."
-                        "During the import process, the assets will be imported and processed."
-                        "A level must be opened before using the URDF/SDF Importer."));
-        m_label->setTextFormat(Qt::RichText);
-        m_label->setOpenExternalLinks(true);
-        m_label->setWordWrap(true);
-
-        QVBoxLayout* layout = new QVBoxLayout;
-        layout->addWidget(m_label);
-        setLayout(layout);
-    }
-
-} // namespace ROS2

+ 2 - 3
Gems/ROS2/Code/Source/Sensor/Events/PhysicsBasedSource.cpp

@@ -6,11 +6,10 @@
  *
  */
 
+#include <AzCore/Serialization/SerializeContext.h>
 #include <AzFramework/Physics/PhysicsSystem.h>
-
-#include <ROS2/Utilities/ROS2Conversions.h>
 #include <ROS2/Sensor/Events/PhysicsBasedSource.h>
-#include <ROS2/Sensor/SensorConfiguration.h>
+#include <ROS2/Utilities/ROS2Conversions.h>
 
 namespace ROS2
 {

+ 9 - 10
Gems/ROS2/Code/Source/Sensor/Events/TickBasedSource.cpp

@@ -1,16 +1,16 @@
 /*
-* Copyright (c) Contributors to the Open 3D Engine Project.
-* For complete copyright and license terms please see the LICENSE at the root of this distribution.
-*
-* SPDX-License-Identifier: Apache-2.0 OR MIT
-*
-*/
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
 
-#include <ROS2/Sensor/Events/TickBasedSource.h>
-#include <ROS2/Sensor/SensorConfiguration.h>
+#include <AzCore/Serialization/SerializeContext.h>
+#include <AzCore/std/numeric.h>
 #include <ROS2/ROS2Bus.h>
+#include <ROS2/Sensor/Events/TickBasedSource.h>
 #include <ROS2/Utilities/ROS2Conversions.h>
-#include <AzCore/std/numeric.h>
 namespace ROS2
 {
     void TickBasedSource::Reflect(AZ::ReflectContext* context)
@@ -42,6 +42,5 @@ namespace ROS2
         AZ_UNUSED(deltaTime);
         const auto expectedSimulationLoopTime = ROS2Interface::Get()->GetExpectedSimulationLoopTime();
         m_sourceEvent.Signal(expectedSimulationLoopTime);
-
     }
 } // namespace ROS2

+ 0 - 75
Gems/ROS2/Code/Source/Sensor/SensorHelpers.cpp

@@ -1,75 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include <ROS2/Sensor/Events/PhysicsBasedSource.h>
-#include <ROS2/Sensor/Events/TickBasedSource.h>
-#include <ROS2/Sensor/ROS2SensorComponentBase.h>
-#include <ROS2/Sensor/SensorHelper.h>
-
-namespace ROS2
-{
-
-    AZStd::vector<AZ::EntityComponentIdPair> GetSensorsForEntity(const AZ::EntityId& entityId)
-    {
-        AZStd::vector<AZ::EntityComponentIdPair> sensors;
-        if (AZ::Entity* entity = AZ::Interface<AZ::ComponentApplicationRequests>::Get()->FindEntity(entityId))
-        {
-            auto components = entity->GetComponents();
-            for (const auto* component : components)
-            {
-                AZ_Assert(component, "Component not found");
-                if (IsComponentROS2Sensor(component))
-                {
-                    sensors.push_back(AZ::EntityComponentIdPair(entityId, component->GetId()));
-                }
-            }
-        }
-        else
-        {
-            AZ_Warning("SensorHelpers", false, "Entity not found");
-        }
-        return sensors;
-    }
-
-    AZStd::vector<AZ::EntityComponentIdPair> GetSensorsOfType(const AZ::EntityId& entityId, const AZ::Uuid& sensorType)
-    {
-        AZStd::vector<AZ::EntityComponentIdPair> sensors;
-        if (AZ::Entity* entity = AZ::Interface<AZ::ComponentApplicationRequests>::Get()->FindEntity(entityId))
-        {
-            auto components = entity->GetComponents();
-            for (const auto* component : components)
-            {
-                AZ_Assert(component, "Component not found");
-                if (component->RTTI_IsTypeOf(sensorType))
-                {
-                    sensors.push_back(AZ::EntityComponentIdPair(entityId, component->GetId()));
-                }
-            }
-        }
-        else
-        {
-            AZ_Warning("SensorHelpers", false, "Entity not found");
-        }
-        return sensors;
-    }
-
-    bool IsComponentROS2Sensor(const AZ::Component* component)
-    {
-        // In ROS2 gem we have at this moment two types of base classes for sensors, we need to check if the component is derived from one
-        // of them. If we add more base classes for sensors in the future, we need to update this function.
-        if (azrtti_cast<const ROS2::ROS2SensorComponentBase<ROS2::TickBasedSource>*>(component))
-        {
-            return true;
-        }
-        if (azrtti_cast<const ROS2::ROS2SensorComponentBase<ROS2::PhysicsBasedSource>*>(component))
-        {
-            return true;
-        }
-        return false;
-    }
-}; // namespace ROS2

+ 54 - 0
Gems/ROS2/Code/Source/Tools/ROS2EditorModule.cpp

@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include "ROS2EditorSystemComponent.h"
+#include <Frame/ROS2FrameSystemComponent.h>
+#include <ROS2/Frame/ROS2FrameEditorComponent.h>
+#include <ROS2/ROS2TypeIds.h>
+#include <ROS2ModuleInterface.h>
+#ifdef WITH_GAZEBO_MSGS
+#include <Spawner/ROS2SpawnPointEditorComponent.h>
+#include <Spawner/ROS2SpawnerEditorComponent.h>
+#endif
+
+namespace ROS2
+{
+    class ROS2EditorModule : public ROS2ModuleInterface
+    {
+    public:
+        AZ_RTTI(ROS2EditorModule, ROS2EditorModuleTypeId, ROS2ModuleInterface);
+        AZ_CLASS_ALLOCATOR(ROS2EditorModule, AZ::SystemAllocator);
+
+        ROS2EditorModule()
+        {
+            m_descriptors.insert(
+                m_descriptors.end(),
+                { ROS2EditorSystemComponent::CreateDescriptor(),
+#ifdef WITH_GAZEBO_MSGS
+                  ROS2SpawnerEditorComponent::CreateDescriptor(),
+                  ROS2SpawnPointEditorComponent::CreateDescriptor(),
+#endif
+                  ROS2FrameSystemComponent::CreateDescriptor(),
+                  ROS2FrameEditorComponent::CreateDescriptor() });
+        }
+
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override
+        {
+            return AZ::ComponentTypeList{
+                azrtti_typeid<ROS2EditorSystemComponent>(),
+                azrtti_typeid<ROS2FrameSystemComponent>(),
+            };
+        }
+    };
+} // namespace ROS2
+
+#if defined(O3DE_GEM_NAME)
+AZ_DECLARE_MODULE_CLASS(AZ_JOIN(Gem_, O3DE_GEM_NAME, _Editor), ROS2::ROS2EditorModule)
+#else
+AZ_DECLARE_MODULE_CLASS(Gem_ROS2_Editor, ROS2::ROS2EditorModule)
+#endif

+ 6 - 1
Gems/ROS2/Code/Source/SystemComponents/ROS2EditorSystemComponent.cpp → Gems/ROS2/Code/Source/Tools/ROS2EditorSystemComponent.cpp

@@ -6,11 +6,14 @@
  *
  */
 #include "ROS2EditorSystemComponent.h"
-#include <AzCore/Component/ComponentApplicationBus.h>
 #include <AzCore/Serialization/SerializeContext.h>
 
+#include <ROS2/ROS2TypeIds.h>
+
 namespace ROS2
 {
+    AZ_COMPONENT_IMPL(ROS2EditorSystemComponent, "ROS2EditorSystemComponent", ROS2EditorSystemComponentTypeId, BaseSystemComponent);
+
     void ROS2EditorSystemComponent::Reflect(AZ::ReflectContext* context)
     {
         if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
@@ -48,10 +51,12 @@ namespace ROS2
     void ROS2EditorSystemComponent::Activate()
     {
         AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusConnect();
+        AzToolsFramework::EditorEvents::Bus::Handler::BusConnect();
     }
 
     void ROS2EditorSystemComponent::Deactivate()
     {
+        AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect();
         AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusDisconnect();
     }
 

+ 6 - 3
Gems/ROS2/Code/Source/SystemComponents/ROS2EditorSystemComponent.h → Gems/ROS2/Code/Source/Tools/ROS2EditorSystemComponent.h

@@ -7,20 +7,23 @@
  */
 #pragma once
 
-#include "ROS2SystemComponent.h"
+#include <AzToolsFramework/API/ToolsApplicationAPI.h>
 #include <AzToolsFramework/Entity/EditorEntityContextBus.h>
+#include <Clients/ROS2SystemComponent.h>
 
 namespace ROS2
 {
     /// System component for ROS2 editor
     class ROS2EditorSystemComponent
         : public ROS2SystemComponent
+        , protected AzToolsFramework::EditorEvents::Bus::Handler
         , private AzToolsFramework::EditorEntityContextNotificationBus::Handler
     {
         using BaseSystemComponent = ROS2SystemComponent;
 
     public:
-        AZ_COMPONENT(ROS2EditorSystemComponent, "{34fa5d9a-956b-4655-a6bc-1d57dce8e7a2}", BaseSystemComponent);
+        AZ_COMPONENT_DECL(ROS2EditorSystemComponent);
+
         static void Reflect(AZ::ReflectContext* context);
 
         ROS2EditorSystemComponent();
@@ -33,7 +36,7 @@ namespace ROS2
         static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
 
         //////////////////////////////////////////////////////////////////////////
-        // Component overrides
+        // AZ::Component overrides
         void Activate() override;
         void Deactivate() override;
         //////////////////////////////////////////////////////////////////////////

+ 1 - 1
Gems/ROS2/Code/Tests/Frame/ROS2FrameComponentTest.cpp

@@ -24,9 +24,9 @@
 #include <AzToolsFramework/ToolsComponents/TransformComponent.h>
 #include <AzToolsFramework/UnitTest/AzToolsFrameworkTestHelpers.h>
 #include <AzToolsFramework/UnitTest/ToolsTestApplication.h>
+#include <Clients/ROS2SystemComponent.h>
 #include <ROS2/Frame/ROS2FrameComponent.h>
 #include <ROS2/ROS2Bus.h>
-#include <SystemComponents/ROS2SystemComponent.h>
 
 #include <QApplication>
 #include <gtest/gtest.h>

+ 0 - 3
Gems/ROS2/Code/frame_test_files.cmake

@@ -1,3 +0,0 @@
-set(FILES
-        Tests/Frame/ROS2FrameComponentTest.cpp
-        )

+ 32 - 0
Gems/ROS2/Code/ros2_api_files.cmake

@@ -0,0 +1,32 @@
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+
+set(FILES
+    Include/ROS2/ROS2Bus.h
+    Include/ROS2/ROS2TypeIds.h
+    Include/ROS2/Clock/ROS2Clock.h
+    Include/ROS2/Clock/ITimeSource.h
+    Include/ROS2/Clock/ROS2TimeSource.h
+    Include/ROS2/Clock/SimulationTimeSource.h
+    Include/ROS2/Clock/RealTimeSource.h
+    Include/ROS2/Communication/PublisherConfiguration.h
+    Include/ROS2/Communication/TopicConfiguration.h
+    Include/ROS2/Communication/QoS.h
+    Include/ROS2/Frame/NamespaceConfiguration.h
+    Include/ROS2/Frame/ROS2FrameComponent.h
+    Include/ROS2/Frame/ROS2FrameConfiguration.h
+    Include/ROS2/Frame/ROS2Transform.h
+    Include/ROS2/Sensor/SensorConfiguration.h
+    Include/ROS2/Sensor/SensorConfigurationRequestBus.h
+    Include/ROS2/Sensor/ROS2SensorComponentBase.h
+    Include/ROS2/Sensor/Events/EventSourceAdapter.h
+    Include/ROS2/Sensor/Events/SensorEventSource.h
+    Include/ROS2/Sensor/Events/PhysicsBasedSource.h
+    Include/ROS2/Sensor/Events/TickBasedSource.h
+    Include/ROS2/Spawner/SpawnerBus.h
+    Include/ROS2/Spawner/SpawnerBusHandler.h
+    Include/ROS2/Utilities/ROS2Conversions.h
+    Include/ROS2/Utilities/ROS2Names.h
+)

+ 9 - 0
Gems/ROS2/Code/ros2_editor_api_files.cmake

@@ -0,0 +1,9 @@
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+
+set(FILES
+    Include/ROS2/Frame/ROS2FrameEditorComponent.h
+    Include/ROS2/ROS2GemUtilities.h
+)

+ 22 - 0
Gems/ROS2/Code/ros2_editor_private_files.cmake

@@ -0,0 +1,22 @@
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+
+set(FILES
+    Source/Frame/ROS2FrameSystemComponent.cpp
+    Source/Frame/ROS2FrameSystemComponent.h
+    Source/Frame/ROS2FrameSystemBus.h
+    Source/Tools/ROS2EditorSystemComponent.cpp
+    Source/Tools/ROS2EditorSystemComponent.h
+)
+
+# optional, legacy features compilation
+if (WITH_GAZEBO_MSGS)
+    list(APPEND FILES
+        Source/Spawner/ROS2SpawnerEditorComponent.cpp
+        Source/Spawner/ROS2SpawnerEditorComponent.h
+        Source/Spawner/ROS2SpawnPointEditorComponent.cpp
+        Source/Spawner/ROS2SpawnPointEditorComponent.h
+    )
+endif ()

+ 9 - 0
Gems/ROS2/Code/ros2_editor_shared_api_files.cmake

@@ -0,0 +1,9 @@
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+
+set(FILES
+    Source/Frame/ROS2FrameEditorComponent.cpp
+    Source/ROS2GemUtilities.cpp
+)

+ 1 - 1
Gems/ROS2/Code/ros2_editor_shared_files.cmake

@@ -4,5 +4,5 @@
 # SPDX-License-Identifier: Apache-2.0 OR MIT
 
 set(FILES
-    Source/ROS2EditorModule.cpp
+    Source/Tools/ROS2EditorModule.cpp
 )

+ 1 - 3
Gems/ROS2/Code/ros2_editor_tests_files.cmake

@@ -4,7 +4,5 @@
 # SPDX-License-Identifier: Apache-2.0 OR MIT
 
 set(FILES
-    Tests/ROS2EditorTest.cpp
-    Tests/SdfParserTest.cpp
-    Tests/UrdfParserTest.cpp
+    Tests/Frame/ROS2FrameComponentTest.cpp
 )

+ 0 - 186
Gems/ROS2/Code/ros2_files.cmake

@@ -1,186 +0,0 @@
-# Copyright (c) Contributors to the Open 3D Engine Project.
-# For complete copyright and license terms please see the LICENSE at the root of this distribution.
-#
-# SPDX-License-Identifier: Apache-2.0 OR MIT
-
-set(FILES
-        ../Assets/Passes/PipelineRenderToTextureROSColor.pass
-        ../Assets/Passes/PipelineRenderToTextureROSDepth.pass
-        ../Assets/Passes/PipelineROSColor.pass
-        ../Assets/Passes/PipelineROSDepth.pass
-        ../Assets/Passes/ROSPassTemplates.azasset
-        Source/Camera/CameraConstants.h
-        Source/Camera/CameraPublishers.cpp
-        Source/Camera/CameraPublishers.h
-        Source/Camera/CameraSensor.cpp
-        Source/Camera/CameraSensor.h
-        Source/Camera/CameraSensorDescription.cpp
-        Source/Camera/CameraSensorDescription.h
-        Source/Camera/CameraSensorConfiguration.cpp
-        Source/Camera/CameraSensorConfiguration.h
-        Source/Camera/ROS2CameraSensorComponent.cpp
-        Source/Camera/ROS2CameraSensorComponent.h
-        Source/Camera/ROS2CameraSystemComponent.cpp
-        Source/Camera/ROS2CameraSystemComponent.h
-        Source/Camera/PostProcessing/ROS2ImageEncodingConversionComponent.cpp
-        Source/Camera/PostProcessing/ROS2ImageEncodingConversionComponent.h
-        Source/Camera/CameraUtilities.cpp
-        Source/Camera/CameraUtilities.h
-        Source/Clock/ROS2Clock.cpp
-        Source/Clock/ROS2TimeSource.cpp
-        Source/Clock/SimulationTimeSource.cpp
-        Source/Clock/RealTimeSource.cpp
-        Source/Communication/QoS.cpp
-        Source/Communication/PublisherConfiguration.cpp
-        Source/Communication/TopicConfiguration.cpp
-        Source/Frame/NamespaceConfiguration.cpp
-        Source/Frame/ROS2FrameComponent.cpp
-        Source/Frame/ROS2FrameConfiguration.cpp
-        Source/Frame/ROS2Transform.cpp
-        Source/Gripper/GripperActionServer.cpp
-        Source/Gripper/GripperActionServer.h
-        Source/Gripper/GripperActionServerComponent.cpp
-        Source/Gripper/GripperActionServerComponent.h
-        Source/Gripper/VacuumGripperComponent.h
-        Source/Gripper/VacuumGripperComponent.cpp
-        Source/Gripper/FingerGripperComponent.h
-        Source/Gripper/FingerGripperComponent.cpp
-        Source/GNSS/ROS2GNSSSensorComponent.cpp
-        Source/GNSS/ROS2GNSSSensorComponent.h
-        Source/Imu/ImuSensorConfiguration.cpp
-        Source/Imu/ImuSensorConfiguration.h
-        Source/Imu/ROS2ImuSensorComponent.cpp
-        Source/Imu/ROS2ImuSensorComponent.h
-        Source/Lidar/LidarRaycaster.cpp
-        Source/Lidar/LidarRaycaster.h
-        Source/Lidar/LidarRegistrarSystemComponent.cpp
-        Source/Lidar/LidarRegistrarSystemComponent.h
-        Source/Lidar/LidarSensorConfiguration.cpp
-        Source/Lidar/LidarSensorConfiguration.h
-        Source/Lidar/LidarSystem.cpp
-        Source/Lidar/LidarSystem.h
-        Source/Lidar/LidarTemplate.cpp
-        Source/Lidar/LidarTemplate.h
-        Source/Lidar/LidarTemplateUtils.cpp
-        Source/Lidar/LidarTemplateUtils.h
-        Source/Lidar/PointCloudMessageBuilder.cpp
-        Source/Lidar/PointCloudMessageBuilder.h
-        Source/Lidar/RaycastResults.cpp
-        Source/Lidar/LidarCore.cpp
-        Source/Lidar/LidarCore.h
-        Source/Lidar/ROS2Lidar2DSensorComponent.cpp
-        Source/Lidar/ROS2Lidar2DSensorComponent.h
-        Source/Lidar/ROS2LidarSensorComponent.cpp
-        Source/Lidar/ROS2LidarSensorComponent.h
-        Source/Lidar/ClassSegmentationConfigurationComponent.cpp
-        Source/Lidar/ClassSegmentationConfigurationComponent.h
-        Source/Lidar/SegmentationClassConfiguration.cpp
-        Source/Lidar/SegmentationUtils.cpp
-        Source/Manipulation/Controllers/JointsArticulationControllerComponent.cpp
-        Source/Manipulation/Controllers/JointsArticulationControllerComponent.h
-        Source/Manipulation/Controllers/JointsPIDControllerComponent.cpp
-        Source/Manipulation/Controllers/JointsPIDControllerComponent.h
-        Source/Manipulation/JointInfo.cpp
-        Source/Manipulation/JointStatePublisher.cpp
-        Source/Manipulation/JointStatePublisher.h
-        Source/Manipulation/JointPositionsSubscriptionHandler.cpp
-        Source/Manipulation/JointPositionsSubscriptionHandler.h
-        Source/Manipulation/JointsPositionsComponent.cpp
-        Source/Manipulation/JointsPositionsComponent.h
-        Source/Manipulation/JointsManipulationComponent.cpp
-        Source/Manipulation/JointsManipulationComponent.h
-        Source/Manipulation/JointsTrajectoryComponent.cpp
-        Source/Manipulation/JointsTrajectoryComponent.h
-        Source/Manipulation/FollowJointTrajectoryActionServer.cpp
-        Source/Manipulation/FollowJointTrajectoryActionServer.h
-        Source/Manipulation/ManipulationUtils.h
-        Source/Manipulation/ManipulationUtils.cpp
-        Source/Manipulation/MotorizedJoints/JointMotorControllerComponent.cpp
-        Source/Manipulation/MotorizedJoints/JointMotorControllerConfiguration.cpp
-        Source/Manipulation/MotorizedJoints/ManualMotorControllerComponent.cpp
-        Source/Manipulation/MotorizedJoints/PidMotorControllerComponent.cpp
-        Source/Odometry/ROS2OdometrySensorComponent.cpp
-        Source/Odometry/ROS2OdometrySensorComponent.h
-        Source/Odometry/ROS2WheelOdometry.cpp
-        Source/Odometry/ROS2WheelOdometry.h
-        Source/Odometry/ROS2OdometryCovariance.cpp
-        Source/Odometry/ROS2OdometryCovariance.h
-        Source/RobotControl/Ackermann/AckermannSubscriptionHandler.cpp
-        Source/RobotControl/Ackermann/AckermannSubscriptionHandler.h
-        Source/RobotControl/ControlConfiguration.cpp
-        Source/RobotControl/Controllers/AckermannController/AckermannControlComponent.cpp
-        Source/RobotControl/Controllers/AckermannController/AckermannControlComponent.h
-        Source/RobotControl/Controllers/RigidBodyController/RigidBodyTwistControlComponent.cpp
-        Source/RobotControl/Controllers/RigidBodyController/RigidBodyTwistControlComponent.h
-        Source/RobotControl/Controllers/SkidSteeringController/SkidSteeringControlComponent.cpp
-        Source/RobotControl/Controllers/SkidSteeringController/SkidSteeringControlComponent.h
-        Source/RobotControl/ROS2RobotControlComponent.cpp
-        Source/RobotControl/ROS2RobotControlComponent.h
-        Source/RobotControl/Twist/TwistSubscriptionHandler.cpp
-        Source/RobotImporter/ROS2RobotImporterSystemComponent.cpp
-        Source/RobotImporter/ROS2RobotImporterSystemComponent.h
-        Source/ROS2ModuleInterface.h
-        Source/Sensor/Events/PhysicsBasedSource.cpp
-        Source/Sensor/Events/TickBasedSource.cpp
-        Source/Sensor/SensorConfiguration.cpp
-        Source/Sensor/SensorHelpers.cpp
-        Source/SimulationUtils/FollowingCameraConfiguration.cpp
-        Source/SimulationUtils/FollowingCameraConfiguration.h
-        Source/SimulationUtils/FollowingCameraComponent.cpp
-        Source/SimulationUtils/FollowingCameraComponent.h
-        Source/SystemComponents/ROS2SystemComponent.cpp
-        Source/SystemComponents/ROS2SystemComponent.h
-        Source/Utilities/ArticulationsUtilities.cpp
-        Source/Utilities/ArticulationsUtilities.h
-        Source/Utilities/JointUtilities.cpp
-        Source/Utilities/JointUtilities.h
-        Source/Utilities/Controllers/PidConfiguration.cpp
-        Source/Utilities/ROS2Conversions.cpp
-        Source/Utilities/ROS2Names.cpp
-        Source/VehicleDynamics/AxleConfiguration.cpp
-        Source/VehicleDynamics/AxleConfiguration.h
-        Source/VehicleDynamics/DriveModel.cpp
-        Source/VehicleDynamics/DriveModel.h
-        Source/VehicleDynamics/DriveModels/AckermannDriveModel.cpp
-        Source/VehicleDynamics/DriveModels/AckermannDriveModel.h
-        Source/VehicleDynamics/DriveModels/SkidSteeringDriveModel.cpp
-        Source/VehicleDynamics/DriveModels/SkidSteeringDriveModel.h
-        Source/VehicleDynamics/ManualControlEventHandler.h
-        Source/VehicleDynamics/Utilities.cpp
-        Source/VehicleDynamics/Utilities.h
-        Source/VehicleDynamics/VehicleConfiguration.cpp
-        Source/VehicleDynamics/VehicleConfiguration.h
-        Source/VehicleDynamics/VehicleInputs.cpp
-        Source/VehicleDynamics/VehicleInputs.h
-        Source/VehicleDynamics/VehicleModelComponent.cpp
-        Source/VehicleDynamics/VehicleModelComponent.h
-        Source/VehicleDynamics/ModelComponents/AckermannModelComponent.cpp
-        Source/VehicleDynamics/ModelComponents/AckermannModelComponent.h
-        Source/VehicleDynamics/ModelComponents/SkidSteeringModelComponent.cpp
-        Source/VehicleDynamics/ModelComponents/SkidSteeringModelComponent.h
-        Source/VehicleDynamics/VehicleModelLimits.cpp
-        Source/VehicleDynamics/VehicleModelLimits.h
-        Source/VehicleDynamics/ModelLimits/AckermannModelLimits.cpp
-        Source/VehicleDynamics/ModelLimits/AckermannModelLimits.h
-        Source/VehicleDynamics/ModelLimits/SkidSteeringModelLimits.cpp
-        Source/VehicleDynamics/ModelLimits/SkidSteeringModelLimits.h
-        Source/VehicleDynamics/WheelControllerComponent.cpp
-        Source/VehicleDynamics/WheelControllerComponent.h
-        Source/VehicleDynamics/WheelDynamicsData.h
-        )
-
-# optional, legacy features compilation
-if (WITH_GAZEBO_MSGS)
-        list(APPEND FILES
-                Source/ContactSensor/ROS2ContactSensorComponent.cpp
-                Source/ContactSensor/ROS2ContactSensorComponent.h
-                Source/Spawner/ROS2SpawnerComponent.cpp
-                Source/Spawner/ROS2SpawnerComponent.h
-                Source/Spawner/ROS2SpawnPointComponent.cpp
-                Source/Spawner/ROS2SpawnPointComponent.h
-                Source/Spawner/ROS2SpawnerComponentController.cpp
-                Source/Spawner/ROS2SpawnerComponentController.h
-                Source/Spawner/ROS2SpawnPointComponentController.cpp
-                Source/Spawner/ROS2SpawnPointComponentController.h
-        )
-endif ()

+ 0 - 60
Gems/ROS2/Code/ros2_header_files.cmake

@@ -1,60 +0,0 @@
-# Copyright (c) Contributors to the Open 3D Engine Project.
-# For complete copyright and license terms please see the LICENSE at the root of this distribution.
-#
-# SPDX-License-Identifier: Apache-2.0 OR MIT
-
-set(FILES
-        Include/ROS2/Camera/CameraCalibrationRequestBus.h
-        Include/ROS2/Camera/CameraPostProcessingRequestBus.h
-        Include/ROS2/Clock/ROS2Clock.h
-        Include/ROS2/Clock/ITimeSource.h
-        Include/ROS2/Clock/ROS2TimeSource.h
-        Include/ROS2/Clock/SimulationTimeSource.h
-        Include/ROS2/Clock/RealTimeSource.h
-        Include/ROS2/Communication/PublisherConfiguration.h
-        Include/ROS2/Communication/TopicConfiguration.h
-        Include/ROS2/Communication/QoS.h
-        Include/ROS2/Frame/NamespaceConfiguration.h
-        Include/ROS2/Frame/ROS2FrameComponent.h
-        Include/ROS2/Frame/ROS2FrameConfiguration.h
-        Include/ROS2/Frame/ROS2Transform.h
-        Include/ROS2/GNSS/GNSSPostProcessingRequestBus.h
-        Include/ROS2/Gripper/GripperRequestBus.h
-        Include/ROS2/Manipulation/Controllers/JointsPositionControllerRequests.h
-        Include/ROS2/Manipulation/JointInfo.h
-        Include/ROS2/Manipulation/JointsManipulationRequests.h
-        Include/ROS2/Manipulation/JointsTrajectoryRequests.h
-        Include/ROS2/Manipulation/MotorizedJoints/JointMotorControllerComponent.h
-        Include/ROS2/Manipulation/MotorizedJoints/JointMotorControllerConfiguration.h
-        Include/ROS2/Manipulation/MotorizedJoints/ManualMotorControllerComponent.h
-        Include/ROS2/Manipulation/MotorizedJoints/PidMotorControllerBus.h
-        Include/ROS2/Manipulation/MotorizedJoints/PidMotorControllerComponent.h
-        Include/ROS2/RobotControl/ControlConfiguration.h
-        Include/ROS2/RobotControl/ControlSubscriptionHandler.h
-        Include/ROS2/RobotImporter/SDFormatModelPluginImporterHook.h
-        Include/ROS2/RobotImporter/SDFormatSensorImporterHook.h
-        Include/ROS2/ROS2SensorTypesIds.h
-        Include/ROS2/Lidar/ClassSegmentationBus.h
-        Include/ROS2/Lidar/LidarRaycasterBus.h
-        Include/ROS2/Lidar/LidarSystemBus.h
-        Include/ROS2/Lidar/LidarRegistrarBus.h
-        Include/ROS2/Lidar/RaycastResults.h
-        Include/ROS2/Lidar/SegmentationClassConfiguration.h
-        Include/ROS2/Lidar/SegmentationUtils.h
-        Include/ROS2/ROS2Bus.h
-        Include/ROS2/ROS2GemUtilities.h
-        Include/ROS2/Sensor/Events/EventSourceAdapter.h
-        Include/ROS2/Sensor/Events/SensorEventSource.h
-        Include/ROS2/Sensor/Events/PhysicsBasedSource.h
-        Include/ROS2/Sensor/Events/TickBasedSource.h
-        Include/ROS2/Sensor/ROS2SensorComponentBase.h
-        Include/ROS2/Sensor/SensorConfiguration.h
-        Include/ROS2/Sensor/SensorConfigurationRequestBus.h
-        Include/ROS2/Sensor/SensorHelper.h
-        Include/ROS2/Spawner/SpawnerBus.h
-        Include/ROS2/Spawner/SpawnerBusHandler.h
-        Include/ROS2/Utilities/Controllers/PidConfiguration.h
-        Include/ROS2/Utilities/ROS2Conversions.h
-        Include/ROS2/Utilities/ROS2Names.h
-        Include/ROS2/VehicleDynamics/VehicleInputControlBus.h
-)

+ 30 - 0
Gems/ROS2/Code/ros2_private_files.cmake

@@ -0,0 +1,30 @@
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+
+set(FILES
+    ../Assets/Passes/PipelineRenderToTextureROSColor.pass
+    ../Assets/Passes/PipelineRenderToTextureROSDepth.pass
+    ../Assets/Passes/PipelineROSColor.pass
+    ../Assets/Passes/PipelineROSDepth.pass
+    ../Assets/Passes/ROSPassTemplates.azasset
+    Source/SimulationUtils/FollowingCameraConfiguration.cpp
+    Source/SimulationUtils/FollowingCameraConfiguration.h
+    Source/SimulationUtils/FollowingCameraComponent.cpp
+    Source/SimulationUtils/FollowingCameraComponent.h
+)
+
+# optional, legacy features compilation
+if (WITH_GAZEBO_MSGS)
+        list(APPEND FILES
+                Source/Spawner/ROS2SpawnerComponent.cpp
+                Source/Spawner/ROS2SpawnerComponent.h
+                Source/Spawner/ROS2SpawnPointComponent.cpp
+                Source/Spawner/ROS2SpawnPointComponent.h
+                Source/Spawner/ROS2SpawnerComponentController.cpp
+                Source/Spawner/ROS2SpawnerComponentController.h
+                Source/Spawner/ROS2SpawnPointComponentController.cpp
+                Source/Spawner/ROS2SpawnPointComponentController.h
+        )
+endif ()

+ 26 - 0
Gems/ROS2/Code/ros2_shared_api_files.cmake

@@ -0,0 +1,26 @@
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+
+set(FILES
+    Source/Clients/ROS2SystemComponent.cpp
+    Source/Clients/ROS2SystemComponent.h
+    Source/Clock/ROS2Clock.cpp
+    Source/Clock/ROS2TimeSource.cpp
+    Source/Clock/SimulationTimeSource.cpp
+    Source/Clock/RealTimeSource.cpp
+    Source/Communication/QoS.cpp
+    Source/Communication/PublisherConfiguration.cpp
+    Source/Communication/TopicConfiguration.cpp
+    Source/Frame/NamespaceConfiguration.cpp
+    Source/Frame/ROS2FrameComponent.cpp
+    Source/Frame/ROS2FrameConfiguration.cpp
+    Source/Frame/ROS2Transform.cpp
+    Source/ROS2ModuleInterface.cpp
+    Source/ROS2ModuleInterface.h
+    Source/Sensor/Events/PhysicsBasedSource.cpp
+    Source/Sensor/Events/TickBasedSource.cpp
+    Source/Utilities/ROS2Conversions.cpp
+    Source/Utilities/ROS2Names.cpp
+)

+ 1 - 1
Gems/ROS2/Code/ros2_shared_files.cmake

@@ -4,5 +4,5 @@
 # SPDX-License-Identifier: Apache-2.0 OR MIT
 
 set(FILES
-    Source/ROS2Module.cpp
+    Source/Clients/ROS2Module.cpp
 )

+ 19 - 0
Gems/ROS2/Code/ros2_target_depends.cmake

@@ -24,3 +24,22 @@ function(target_depends_on_ros2_packages TARGET_NAME)
         target_depends_on_ros2_package(${TARGET_NAME} ${_package} REQUIRED)
     endforeach ()
 endfunction()
+
+
+function(target_interface_depends_on_ros2_package TARGET_NAME)
+    list(GET ARGN 0 _package)
+    find_package(${ARGN})
+    include(${${_package}_DIR}/${_package}Config.cmake OPTIONAL)
+    if (${${_package}_FOUND_AMENT_PACKAGE})
+        message(DEBUG "Package ${_package} was found (${${_package}_DIR}) version ${${_package}_VERSION} targets : ${${_package}_TARGETS}")
+        target_link_libraries(${TARGET_NAME} INTERFACE ${${_package}_TARGETS})
+    else ()
+        message(FATAL_ERROR "Package ${_package} was found (${${_package}_DIR}), but package is not an Ament package.")
+    endif ()
+endfunction()
+
+function(target_interface_depends_on_ros2_packages TARGET_NAME)
+    foreach (_package IN LISTS ARGN)
+        target_interface_depends_on_ros2_package(${TARGET_NAME} ${_package} REQUIRED)
+    endforeach ()
+endfunction()

+ 0 - 2
Gems/ROS2/Code/ros2_tests_files.cmake

@@ -4,6 +4,4 @@
 # SPDX-License-Identifier: Apache-2.0 OR MIT
 
 set(FILES
-    Tests/ROS2Test.cpp
-    Tests/PIDTest.cpp
 )

+ 0 - 3
Gems/ROS2/Registry/assetprocessor_settings.setreg

@@ -1,8 +1,5 @@
 {
     "Amazon": {
-      "Physics": {
-            "EnableReducedCoordinateArticulations": true
-        },
         "AssetProcessor": {
             "Settings": {
                 "ScanFolder ROS2/Assets": {

+ 0 - 41
Gems/ROS2/Registry/sceneassetimporter.setreg

@@ -1,41 +0,0 @@
-{
-    "O3DE":
-    {
-        "SceneAPI":
-        {
-            "AssetImporter":
-            {
-            	// This list controls the set of file types that will get processed
-            	// by the Scene asset builder.
-            	// All supported file types need to be listed here because setreg
-            	// merges will completely replace the contents of the array.
-                "SupportedFileTypeExtensions":
-                [
-                    ".dae",
-                    ".fbx",
-                    ".stl",
-                    ".gltf",
-                    ".glb",
-                    ".obj"
-                ]
-            }
-        }
-    },
-    "Amazon": {
-        "AssetProcessor": {
-            "Settings": {
-            	// Only the newly-exposed Scene types need to be listed here, as
-            	// these will get appended to any MetaDataTypes that have been
-            	// previously listed.
-            	// This setting ensures that changes to an .assetinfo file will cause
-            	// the source asset to automatically rebuild itself.
-                "MetaDataTypes": {
-                    "dae.assetinfo": "dae",
-                    "obj.assetinfo": "obj"
-                }
-            }
-        }
-    }
-}    
-}
-

+ 4 - 11
Gems/ROS2/gem.json

@@ -1,6 +1,6 @@
 {
     "gem_name": "ROS2",
-    "version": "3.3.0",
+    "version": "4.0.0",
     "display_name": "ROS2",
     "license": "Apache-2.0",
     "license_url": "https://opensource.org/licenses/Apache-2.0",
@@ -19,16 +19,9 @@
         "Linux"
     ],
     "icon_path": "preview.png",
-    "requirements": "Requires ROS 2 installation (supported distributions: Humble, Jazzy). Source your workspace before building the Gem",
+    "requirements": "Requires ROS 2 installation (supported distributions: Humble, Jazzy). Source your workspace before building the Gem.",
     "documentation_url": "https://docs.o3de.org/docs/user-guide/gems/reference/robotics/ros2/",
     "dependencies": [
-        "Atom_RPI",
-        "Atom_Feature_Common",
-        "Atom_Component_DebugCamera",
-        "CommonFeaturesAtom",
-        "PhysX5",
-        "PrimitiveAssets",
-        "StartingPointInput",
         "LevelGeoreferencing"
     ],
     "compatible_engines": [
@@ -37,6 +30,6 @@
     ],
     "engine_api_dependencies": [],
     "restricted": "ROS2",
-    "repo_uri": "https://raw.githubusercontent.com/o3de/o3de-extras/development",
-    "download_source_uri": "https://github.com/o3de/o3de-extras/releases/download/2.0/ros2-3.3.0-gem.zip"
+    "repo_uri": "https://github.com/o3de/o3de-extras",
+    "download_source_uri": "https://github.com/o3de/o3de-extras/releases/download/2.0/ros2-4.0.0-gem.zip"
 }

+ 0 - 2
Gems/ROS2/requirements.txt

@@ -1,2 +0,0 @@
-pyyaml==5.3
-lark==1.1.1

+ 61 - 0
Gems/ROS2Controllers/.clang-format

@@ -0,0 +1,61 @@
+Language: Cpp
+
+AccessModifierOffset: -4
+AlignAfterOpenBracket: AlwaysBreak
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlines: Right
+AlignOperands: false
+AlignTrailingComments: false
+AllowAllArgumentsOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortFunctionsOnASingleLine: None
+AllowShortLambdasOnASingleLine: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakTemplateDeclarations: true
+BinPackArguments: false
+BinPackParameters: false
+BreakBeforeBraces: Custom
+BraceWrapping:
+    AfterClass: true
+    AfterControlStatement: true
+    AfterEnum: true
+    AfterFunction: true
+    AfterNamespace: true
+    BeforeLambdaBody: true
+    AfterStruct: true
+    BeforeElse: true
+    SplitEmptyFunction: true
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializers: BeforeComma
+BreakInheritanceList: BeforeComma
+ColumnLimit: 140
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: false
+FixNamespaceComments: true
+IncludeBlocks: Preserve
+IndentCaseBlocks: true
+IndentCaseLabels: false
+IndentPPDirectives: None
+IndentWidth: 4
+KeepEmptyLinesAtTheStartOfBlocks: false
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: All
+PenaltyReturnTypeOnItsOwnLine: 1000
+PointerAlignment: Left
+SortIncludes: true
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: false
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: ControlStatements
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceInEmptyParentheses: false
+SpacesInAngles: false
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+Standard: c++17
+UseTab: Never

+ 0 - 0
Gems/ROS2Controllers/.gitignore


+ 0 - 0
Gems/ROS2/Assets/Editor/Icons/Components/AckermannControl.svg → Gems/ROS2Controllers/Assets/Editor/Icons/Components/AckermannControl.svg


+ 0 - 0
Gems/ROS2/Assets/Editor/Icons/Components/AckermannVehicleModel.svg → Gems/ROS2Controllers/Assets/Editor/Icons/Components/AckermannVehicleModel.svg


+ 0 - 0
Gems/ROS2/Assets/Editor/Icons/Components/FingerGripperComponent.svg → Gems/ROS2Controllers/Assets/Editor/Icons/Components/FingerGripperComponent.svg


+ 0 - 0
Gems/ROS2/Assets/Editor/Icons/Components/GripperActionServerComponent.svg → Gems/ROS2Controllers/Assets/Editor/Icons/Components/GripperActionServerComponent.svg


+ 0 - 0
Gems/ROS2/Assets/Editor/Icons/Components/JointsArticulationControllerComponent.svg → Gems/ROS2Controllers/Assets/Editor/Icons/Components/JointsArticulationControllerComponent.svg


+ 0 - 0
Gems/ROS2/Assets/Editor/Icons/Components/JointsManipulationEditorComponent.svg → Gems/ROS2Controllers/Assets/Editor/Icons/Components/JointsManipulationEditorComponent.svg


+ 0 - 0
Gems/ROS2/Assets/Editor/Icons/Components/JointsPIDControllerComponent.svg → Gems/ROS2Controllers/Assets/Editor/Icons/Components/JointsPIDControllerComponent.svg


+ 0 - 0
Gems/ROS2/Assets/Editor/Icons/Components/JointsTrajectoryComponent.svg → Gems/ROS2Controllers/Assets/Editor/Icons/Components/JointsTrajectoryComponent.svg


+ 0 - 0
Gems/ROS2/Assets/Editor/Icons/Components/ManualMotorController.svg → Gems/ROS2Controllers/Assets/Editor/Icons/Components/ManualMotorController.svg


部分文件因为文件数量过多而无法显示