Преглед изворни кода

Backport multiple commits from stabilization/2305 to development (#237)

* Fleet of Robots template (#186)

* Introduce fleet robot template.

Signed-off-by: Michał Pełka <[email protected]>

* New template name and some fixes

- Changed template name
- Updated `template.json` file
- Added render passes folder
- Some visual fixes in the main level

Signed-off-by: Paweł Budziszewski <[email protected]>

* Extended readme

Signed-off-by: Paweł Budziszewski <[email protected]>

* Added license file

Signed-off-by: Paweł Budziszewski <[email protected]>

* Update README.md

Signed-off-by: Paweł Budziszewski <[email protected]>

* Adjusted to review

Signed-off-by: Paweł Budziszewski <[email protected]>

* Reverted {BEGIN/END_LICENSE} removal

Signed-off-by: Paweł Budziszewski <[email protected]>

* Fix: missing entry

Signed-off-by: Paweł Budziszewski <[email protected]>

* Adjustments to review, minor changes to readme

Signed-off-by: Michał Pełka <[email protected]>

* Apply suggestions from code review

Co-authored-by: Steve Pham <[email protected]>
Signed-off-by: Michał Pełka <[email protected]>

* Further adjusments to review.

Signed-off-by: Michał Pełka <[email protected]>

---------

Signed-off-by: Michał Pełka <[email protected]>
Signed-off-by: Paweł Budziszewski <[email protected]>
Signed-off-by: Michał Pełka <[email protected]>
Co-authored-by: Paweł Budziszewski <[email protected]>
Co-authored-by: Steve Pham <[email protected]>

* Added missing headers to `URDFPrefabMaker.h` (#218)

Signed-off-by: Michał Pełka <[email protected]>

* As part of fixing https://github.com/o3de/o3de-extras/issues/118 (#227)

it was discovered that the error log from xacro is cut off on the
first angle bracket, making it impossible to see the actual error
problem fully if it occurs.

This change surrounds the error text with a code macro (three
backticks) so that it shows up in markdown as the actual literal code,
which causes Qt to ignore any angle brackets and other markdown inside
the text.

https://github.com/o3de/o3de-extras/issues/118

(Will attach a screenshot)

Signed-off-by: Nicholas Lawson <[email protected]>

* Fix bug with wheel base handling in Vehicle Dynamics in ROS 2. (#229)

Signed-off-by: Michał Pełka <[email protected]>

* Removed incorrect camera sensor (#215)

Signed-off-by: Paweł Budziszewski <[email protected]>

---------

Signed-off-by: Michał Pełka <[email protected]>
Signed-off-by: Paweł Budziszewski <[email protected]>
Signed-off-by: Michał Pełka <[email protected]>
Signed-off-by: Nicholas Lawson <[email protected]>
Co-authored-by: Paweł Budziszewski <[email protected]>
Co-authored-by: Steve Pham <[email protected]>
Co-authored-by: Nicholas Lawson <[email protected]>
Michał Pełka пре 2 година
родитељ
комит
9bf51f06df
75 измењених фајлова са 3761 додато и 36 уклоњено
  1. 1 30
      Gems/ProteusRobot/Assets/Proteus.prefab
  2. 24 5
      Gems/ROS2/Code/Source/RobotImporter/RobotImporterWidget.cpp
  3. 2 0
      Gems/ROS2/Code/Source/RobotImporter/URDF/URDFPrefabMaker.h
  4. 1 1
      Gems/ROS2/Code/Source/VehicleDynamics/DriveModels/SkidSteeringDriveModel.cpp
  5. 132 0
      Templates/Ros2FleetRobotTemplate/README.md
  6. 6 0
      Templates/Ros2FleetRobotTemplate/Template/.gitignore
  7. 11 0
      Templates/Ros2FleetRobotTemplate/Template/CMakeLists.txt
  8. 11 0
      Templates/Ros2FleetRobotTemplate/Template/Config/shader_global_build_options.json
  9. 18 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/${Name}_files.cmake
  10. 15 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/${Name}_shared_files.cmake
  11. 103 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/CMakeLists.txt
  12. 40 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Include/${Name}/${Name}Bus.h
  13. 15 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Linux/${Name}_linux_files.cmake
  14. 14 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Linux/${Name}_shared_linux_files.cmake
  15. 13 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Linux/PAL_linux.cmake
  16. 16 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Mac/${Name}_mac_files.cmake
  17. 15 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Mac/${Name}_shared_mac_files.cmake
  18. 13 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Mac/PAL_mac.cmake
  19. 14 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Windows/${Name}_shared_windows_files.cmake
  20. 15 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Windows/${Name}_windows_files.cmake
  21. 14 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Windows/PAL_windows.cmake
  22. 18 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Registry/assetprocessor_settings.setreg
  23. 46 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Source/${Name}Module.cpp
  24. 85 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Source/${Name}SystemComponent.cpp
  25. 49 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/Source/${Name}SystemComponent.h
  26. 35 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/enabled_gems.cmake
  27. 29 0
      Templates/Ros2FleetRobotTemplate/Template/Gem/gem.json
  28. 201 0
      Templates/Ros2FleetRobotTemplate/Template/LICENSE.txt
  29. 761 0
      Templates/Ros2FleetRobotTemplate/Template/Levels/WarehouseScene/Warehouse.prefab
  30. 616 0
      Templates/Ros2FleetRobotTemplate/Template/Levels/playground/playground.prefab
  31. 81 0
      Templates/Ros2FleetRobotTemplate/Template/Passes/ContrastAdaptiveSharpening.pass
  32. 18 0
      Templates/Ros2FleetRobotTemplate/Template/Passes/MainRenderPipeline.azasset
  33. 200 0
      Templates/Ros2FleetRobotTemplate/Template/Passes/PostProcessParent.pass
  34. 12 0
      Templates/Ros2FleetRobotTemplate/Template/Passes/SMAAConfiguration.azasset
  35. 113 0
      Templates/Ros2FleetRobotTemplate/Template/Passes/Taa.pass
  36. 8 0
      Templates/Ros2FleetRobotTemplate/Template/Platform/Android/android_project.cmake
  37. 9 0
      Templates/Ros2FleetRobotTemplate/Template/Platform/Android/android_project.json
  38. 8 0
      Templates/Ros2FleetRobotTemplate/Template/Platform/Linux/linux_project.cmake
  39. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Platform/Linux/linux_project.json
  40. 8 0
      Templates/Ros2FleetRobotTemplate/Template/Platform/Mac/mac_project.cmake
  41. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Platform/Mac/mac_project.json
  42. 8 0
      Templates/Ros2FleetRobotTemplate/Template/Platform/Windows/windows_project.cmake
  43. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Platform/Windows/windows_project.json
  44. 8 0
      Templates/Ros2FleetRobotTemplate/Template/Platform/iOS/ios_project.cmake
  45. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Platform/iOS/ios_project.json
  46. 23 0
      Templates/Ros2FleetRobotTemplate/Template/Registry/assetprocessor_settings.setreg
  47. 10 0
      Templates/Ros2FleetRobotTemplate/Template/Registry/awscoreconfiguration.setreg
  48. 11 0
      Templates/Ros2FleetRobotTemplate/Template/Registry/physxdebugconfiguration.setreg
  49. 9 0
      Templates/Ros2FleetRobotTemplate/Template/Registry/physxdefaultsceneconfiguration.setreg
  50. 98 0
      Templates/Ros2FleetRobotTemplate/Template/Registry/physxsystemconfiguration.setreg
  51. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/GameSDK.ico
  52. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/LegacyLogoLauncher.bmp
  53. 68 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json
  54. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128.png
  55. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128_2x.png
  56. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16.png
  57. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16_2x.png
  58. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256.png
  59. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256_2x.png
  60. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32.png
  61. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32_2x.png
  62. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512.png
  63. 3 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512_2x.png
  64. 6 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/Contents.json
  65. 24 0
      Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Info.plist
  66. 5 0
      Templates/Ros2FleetRobotTemplate/Template/ShaderLib/README.md
  67. 26 0
      Templates/Ros2FleetRobotTemplate/Template/ShaderLib/scenesrg.srgi
  68. 26 0
      Templates/Ros2FleetRobotTemplate/Template/ShaderLib/viewsrg.srgi
  69. 0 0
      Templates/Ros2FleetRobotTemplate/Template/autoexec.cfg
  70. 170 0
      Templates/Ros2FleetRobotTemplate/Template/cmake/EngineFinder.cmake
  71. 3 0
      Templates/Ros2FleetRobotTemplate/Template/game.cfg
  72. 3 0
      Templates/Ros2FleetRobotTemplate/Template/preview.png
  73. 27 0
      Templates/Ros2FleetRobotTemplate/Template/project.json
  74. 3 0
      Templates/Ros2FleetRobotTemplate/preview.png
  75. 395 0
      Templates/Ros2FleetRobotTemplate/template.json

+ 1 - 30
Gems/ProteusRobot/Assets/Proteus.prefab

@@ -291,41 +291,12 @@
         },
         "Entity_[15633949178400]": {
             "Id": "Entity_[15633949178400]",
-            "Name": "Camera sensor",
+            "Name": "Camera sensor mount",
             "Components": {
                 "Component_[10184098142535992885]": {
                     "$type": "EditorVisibilityComponent",
                     "Id": 10184098142535992885
                 },
-                "Component_[10929675154631365285]": {
-                    "$type": "EditorDisabledCompositionComponent",
-                    "Id": 10929675154631365285,
-                    "DisabledComponents": [
-                        {
-                            "$type": "GenericComponentWrapper",
-                            "Id": 8264120652960513662,
-                            "m_template": {
-                                "$type": "ROS2CameraSensorComponent",
-                                "SensorConfiguration": {
-                                    "Publishers": {
-                                        "Camera Info": {
-                                            "Type": "sensor_msgs::msg::CameraInfo",
-                                            "Topic": "camera_info"
-                                        },
-                                        "Color Image": {
-                                            "Type": "sensor_msgs::msg::Image",
-                                            "Topic": "camera_image_color"
-                                        },
-                                        "Depth Image": {
-                                            "Type": "sensor_msgs::msg::Image",
-                                            "Topic": "camera_image_depth"
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    ]
-                },
                 "Component_[14019497545971552389]": {
                     "$type": "EditorPendingCompositionComponent",
                     "Id": 14019497545971552389

+ 24 - 5
Gems/ROS2/Code/Source/RobotImporter/RobotImporterWidget.cpp

@@ -89,16 +89,35 @@ namespace ROS2
                 if (outcome)
                 {
                     m_parsedUrdf = outcome.m_urdfHandle;
-                    report += "# " + tr("XACRO execution succeed") + "\n";
+                    report += "# " + tr("XACRO execution succeeded") + "\n";
                 }
                 else
                 {
                     report += "# " + tr("XACRO parsing failed") + "\n";
-                    report += "\n\n" + tr("Command called : \n'") + QString::fromUtf8(outcome.m_called.data()) + "'";
+                    report += "\n\n## " + tr("Command called") +  "\n\n`" + QString::fromUtf8(outcome.m_called.data()) + "`";
                     report += "\n\n" + tr("Process failed");
-                    report += "\n\n" + tr("error output") + " :\n\n";
-                    report +=
-                        QString::fromLocal8Bit(outcome.m_logErrorOutput.data(), static_cast<int>(outcome.m_logErrorOutput.size())) + "\n";
+                    report += "\n\n## " + tr("Error output") + "\n\n";
+                    report += "```\n";
+                    if (outcome.m_logErrorOutput.size())
+                    {
+                        report += QString::fromLocal8Bit(outcome.m_logErrorOutput.data(), static_cast<int>(outcome.m_logErrorOutput.size()));
+                    }
+                    else
+                    {
+                        report += tr("(EMPTY)");
+                    }
+                    report += "\n```";
+                    report += "\n\n## " + tr("Standard output") + "\n\n";
+                    report += "```\n";
+                    if (outcome.m_logStandardOutput.size())
+                    {
+                        report += QString::fromLocal8Bit(outcome.m_logStandardOutput.data(), static_cast<int>(outcome.m_logStandardOutput.size()));
+                    }
+                    else
+                    {
+                        report += tr("(EMPTY)");
+                    }
+                    report += "\n```";
                     m_checkUrdfPage->ReportURDFResult(report, false);
                     m_parsedUrdf = nullptr;
                     return;

+ 2 - 0
Gems/ROS2/Code/Source/RobotImporter/URDF/URDFPrefabMaker.h

@@ -14,6 +14,8 @@
 #include "UrdfParser.h"
 #include "VisualsMaker.h"
 #include <AzCore/Component/EntityId.h>
+#include <AzCore/std/string/string.h>
+#include <AzCore/std/containers/map.h>
 #include <AzCore/std/smart_ptr/make_shared.h>
 #include <AzCore/std/smart_ptr/shared_ptr.h>
 #include <AzToolsFramework/Prefab/PrefabPublicInterface.h>

+ 1 - 1
Gems/ROS2/Code/Source/VehicleDynamics/DriveModels/SkidSteeringDriveModel.cpp

@@ -99,7 +99,7 @@ namespace ROS2::VehicleDynamics
                     continue;
                 }
                 float normalizedWheelId = -1.f + 2.f * wheelId / (wheelCount - 1);
-                float wheelBase = normalizedWheelId * m_config.m_wheelbase;
+                float wheelBase = normalizedWheelId * m_config.m_wheelbase / 2.f;
                 AZ_Assert(axle.m_wheelRadius != 0, "axle.m_wheelRadius must be non-zero");
                 float wheelRate = (m_currentLinearVelocity + m_currentAngularVelocity * wheelBase) / axle.m_wheelRadius;
                 PhysX::JointRequestBus::Event(hingePtr->second, &PhysX::JointRequests::SetVelocity, wheelRate);

+ 132 - 0
Templates/Ros2FleetRobotTemplate/README.md

@@ -0,0 +1,132 @@
+# ROS2 Fleet Robot Template
+
+A project template that allows building a multi-robot ROS2-enabled simulation. The template contains a level with a large warehouse scene called `Warehouse.prefab`. 
+
+## Requirements
+
+Due to ROS2 dependency, this project was prepared and tested on Linux operating system. It is recomended to use Ubuntu [22.04](https://www.releases.ubuntu.com/22.04/), however any distribution meeting following requirements may be used.
+
+Refer to the [O3DE System Requirements](https://www.o3de.org/docs/welcome-guide/requirements/) documentation to make sure that the system/hardware requirements are met. 
+This project has the following dependencies:
+
+- [O3DE](https://github.com/o3de/o3de)
+- [ROS2 Humble](https://docs.ros.org/en/humble/index.html)
+- [ROS2 Gem](https://github.com/o3de/o3de-extras/tree/development/Gems/ROS2)
+- [Proteus robot](https://github.com/o3de/o3de-extras/tree/development/Gems/ProteusRobot)
+- [WarehouseAssets](https://github.com/o3de/o3de-extras/tree/development/Gems/WarehouseAssets)
+
+Please make sure that `clang` was installed and configured. For details refer to [this section](https://www.o3de.org/docs/welcome-guide/requirements/#linux) of O3DE documentation.
+
+## Setup Instructions
+
+The following steps will assume the following:
+
+- You have ROS2 Humble [installed](https://docs.ros.org/en/humble/Installation.html) and environment is [sourced](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Configuring-ROS2-Environment.html#source-the-setup-files).
+- The O3DE gems, projects and templates will be placed in the O3DE home folder: `${HOME}/O3DE`.
+- You have the O3DE engine [downloaded and built](https://www.o3de.org/docs/welcome-guide/setup/setup-from-github) and it is located in `/home/${USER}/O3DE/Engines/Development`.
+
+In this tutorial, CLI tools will be used. It is also possible to use O3DE GUI to set up a project from template. See the [O3DE Project manager documentation](https://www.o3de.org/docs/user-guide/project-config/project-manager/) for more details. In such cases it is required to source your ROS2 distribution before launching O3DE manager:
+
+```shell
+source /opt/ros/humble/setup.bash
+./build/linux/bin/profile/o3de
+```
+
+### 1. Install ROS2 packages
+
+```shell
+sudo apt install ros-${ROS_DISTRO}-ackermann-msgs ros-${ROS_DISTRO}-gazebo-msgs ros-${ROS_DISTRO}-control-toolbox
+```
+
+### 2. Download the template and asset gems
+
+For convenienience, we'll define a shell variables with O3DE folders:
+
+```shell
+export O3DE_HOME=${HOME}/O3DE
+```
+
+Clone the `o3de-extras` repository containing the template and asset gems
+
+```shell
+mkdir -p ${O3DE_HOME}/Projects
+cd ${O3DE_HOME}/Projects
+git clone https://github.com/o3de/o3de-extras.git 
+cd o3de-extras 
+git lfs install && git lfs pull
+```
+
+
+Register gems and project template.
+
+```shell
+${O3DE_HOME}/scripts/o3de.sh register --gem-path ${O3DE_HOME}/Projects/o3de-extras/Gems/ROS2
+${O3DE_HOME}/scripts/o3de.sh register --gem-path ${O3DE_HOME}/Projects/o3de-extras/Gems/WarehouseAssets
+${O3DE_HOME}/scripts/o3de.sh register --gem-path ${O3DE_HOME}/Projects/o3de-extras/Gems/ProteusRobot
+${O3DE_HOME}/scripts/o3de.sh register --template-path ${O3DE_HOME}/Projects/o3de-extras/Templates/Ros2FleetRobotTemplate
+```
+
+### 3. Create a ROS2 project from the template
+
+Assign a name for the new project. In this example, it is assumed that it will be: `Ros2FleetRobotTest`, and it will be located in `${O3DE_HOME}/Projects/Ros2FleetRobotTest` folder. 
+
+```shell
+export PROJECT_NAME=Ros2FleetRobotTest
+export PROJECT_PATH=${O3DE_HOME}/Projects/${PROJECT_NAME}
+${O3DE_HOME}/scripts/o3de.sh create-project --project-path $PROJECT_PATH --template-name Ros2FleetRobotTemplate
+```
+
+### 4. Build the project
+
+Next, let us build the project with necessary elements of the O3DE engine and ROS2 Gem.
+
+```shell
+cd $PROJECT_PATH
+source /opt/ros/humble/setup.bash
+cmake -B build/linux -G "Ninja Multi-Config" -DLY_STRIP_DEBUG_SYMBOLS=TRUE -DLY_DISABLE_TEST_MODULES=ON
+cmake --build build/linux --config profile --target $PROJECT_NAME.GameLauncher Editor
+```
+
+### 5. Launch Editor
+
+Finally, the O3DE with preloaded gems can be run:
+
+```shell
+$PROJECT_PATH/build/linux/bin/profile/Editor
+```
+
+## Spawning robots
+
+The level contains spawn points configured to spawn Proteus robots.
+To spawn all spawn points call the following services in ROS2:
+
+```shell
+source /opt/ros/humble/setup.bash
+ros2 service call /spawn_entity gazebo_msgs/srv/SpawnEntity '{name: 'proteus', xml: 'spawnPoint1'}'& \
+ros2 service call /spawn_entity gazebo_msgs/srv/SpawnEntity '{name: 'proteus', xml: 'spawnPoint2'}'& \
+ros2 service call /spawn_entity gazebo_msgs/srv/SpawnEntity '{name: 'proteus', xml: 'spawnPoint3'}'& \
+ros2 service call /spawn_entity gazebo_msgs/srv/SpawnEntity '{name: 'proteus', xml: 'spawnPoint4'}'
+```
+
+## Topics and frames
+
+Every spawned robot has its namespace.
+The first spawned robot publishes and subscribes to topics:
+
+- `/proteus_1/cmd_vel` - the requested velocity
+- `/proteus_1/pc` - the LiDAR pointcloud
+
+The first spawned robot also provides the following transformations:
+
+- `/proteus_1/odom`
+- `/proteus_1/base_link`
+- `/proteus_1/lidar`
+
+### Example
+
+To drive the second spawned robot use the following tool with topic name `/proteus_2/cmd_vel`:
+
+```shell
+source /opt/ros/humble/setup.bash
+ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args --remap /cmd_vel:=/proteus_2/cmd_vel
+```

+ 6 - 0
Templates/Ros2FleetRobotTemplate/Template/.gitignore

@@ -0,0 +1,6 @@
+[Bb]uild/
+[Cc]ache/
+[Uu]ser/
+[Uu]ser_test*/
+_savebackup/
+CMakeUserPresets.json

+ 11 - 0
Templates/Ros2FleetRobotTemplate/Template/CMakeLists.txt

@@ -0,0 +1,11 @@
+
+if(NOT PROJECT_NAME)
+    cmake_minimum_required(VERSION 3.22)
+    include(cmake/EngineFinder.cmake OPTIONAL)
+    find_package(o3de REQUIRED)
+    project(${Name}
+        LANGUAGES C CXX
+        VERSION 1.0.0.0
+    )
+    o3de_initialize()
+endif()

+ 11 - 0
Templates/Ros2FleetRobotTemplate/Template/Config/shader_global_build_options.json

@@ -0,0 +1,11 @@
+{
+    "Type": "JsonSerialization",
+    "Version": 1,
+    "ClassName": "GlobalBuildOptions",
+    "ClassData": {
+        "ShaderCompilerArguments" : {
+            "DefaultMatrixOrder" : "Row",
+            "AzslcAdditionalFreeArguments" : "--strip-unused-srgs"
+        }
+    }
+}

+ 18 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/${Name}_files.cmake

@@ -0,0 +1,18 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(FILES
+    Include/${Name}/${Name}Bus.h
+    Source/${Name}SystemComponent.cpp
+    Source/${Name}SystemComponent.h
+    enabled_gems.cmake
+)

+ 15 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/${Name}_shared_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(FILES
+    Source/${Name}Module.cpp
+)

+ 103 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/CMakeLists.txt

@@ -0,0 +1,103 @@
+#
+# 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
+#
+#
+
+# Query the gem name from the gem.json file if possible
+# otherwise fallback to using ${Name}
+o3de_find_ancestor_gem_root(gem_path gem_name "${CMAKE_CURRENT_SOURCE_DIR}")
+if (NOT gem_name)
+    set(gem_name "${Name}")
+endif()
+
+# Fallback to using the current source CMakeLists.txt directory as the gem root path
+if (NOT gem_path)
+    set(gem_path ${CMAKE_CURRENT_SOURCE_DIR})
+endif()
+
+set(gem_json ${gem_path}/gem.json)
+
+o3de_restricted_path(${gem_json} gem_restricted_path gem_parent_relative_path)
+
+# Currently we are in the ${Name}/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 : ${Name}/Code/Platform/<platform_name>  or
+#            <restricted_folder>/<platform_name>/${Name}/Code
+o3de_pal_dir(pal_dir ${CMAKE_CURRENT_SOURCE_DIR}/Platform/${PAL_PLATFORM_NAME} "${gem_restricted_path}" "${gem_path}" "${gem_parent_relative_path}")
+
+# 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 project
+# is supported by this platform.
+include(${pal_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
+
+# Now that we have loaded our project traits for this platform, see if this project is even supported on this platform.
+# If its not supported we just return after including the unsupported.
+if(NOT PAL_TRAIT_${Name}_SUPPORTED)
+    return()
+endif()
+
+# We are on a supported platform, so add the ${gem_name} target
+# Note: We include the common files and the platform specific files which are set in ${Name}_files.cmake and
+# in ${pal_dir}/${Name}_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
+
+# The ${gem_name}.Private.Object target is an internal target
+# It should not be used outside of this CMakeLists.txt
+ly_add_target(
+    NAME ${gem_name}.Private.Object STATIC
+    NAMESPACE Gem
+    FILES_CMAKE
+        ${Name}_files.cmake
+        ${pal_dir}/${Name}_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
+    INCLUDE_DIRECTORIES
+        PUBLIC
+            Include
+    BUILD_DEPENDENCIES
+        PRIVATE
+            AZ::AzGameFramework
+            Gem::Atom_AtomBridge.Static
+)
+
+ly_add_target(
+    NAME ${gem_name} ${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE}
+    NAMESPACE Gem
+    FILES_CMAKE
+        ${Name}_shared_files.cmake
+        ${pal_dir}/${Name}_shared_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
+    INCLUDE_DIRECTORIES
+        PUBLIC
+            Include
+    BUILD_DEPENDENCIES
+        PRIVATE
+            Gem::${gem_name}.Private.Object
+            AZ::AzCore
+)
+
+# if enabled, ${gem_name} is used by all kinds of applications
+ly_create_alias(NAME ${gem_name}.Builders NAMESPACE Gem TARGETS Gem::${gem_name})
+ly_create_alias(NAME ${gem_name}.Tools    NAMESPACE Gem TARGETS Gem::${gem_name})
+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})
+
+################################################################################
+# Gem dependencies
+################################################################################
+
+# Query the project name from the nearest project.json file in a directory at or above
+# the current one.
+# This gem is the project gem and therefore should be part of the project that is using it
+o3de_find_ancestor_project_root(project_path project_name "${CMAKE_CURRENT_SOURCE_DIR}")
+
+# If the project name could not be queried from a project.json file, then fallback
+# to using the name of the project provided when the project template was instantiated
+if (NOT project_name)
+    set(project_name ${Name})
+endif()
+
+# Enable the specified list of gems from GEM_FILE or GEMS list for this specific project:
+ly_enable_gems(PROJECT_NAME ${project_name} GEM_FILE enabled_gems.cmake)

+ 40 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Include/${Name}/${Name}Bus.h

@@ -0,0 +1,40 @@
+// {BEGIN_LICENSE}
+/*
+ * 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
+ *
+ */
+// {END_LICENSE}
+
+#pragma once
+
+#include <AzCore/EBus/EBus.h>
+#include <AzCore/Interface/Interface.h>
+
+namespace ${Name}
+{
+    class ${Name}Requests
+    {
+    public:
+        AZ_RTTI(${Name}Requests, "{${Random_Uuid}}");
+        virtual ~${Name}Requests() = default;
+        // Put your public methods here
+    };
+
+    class ${Name}BusTraits
+        : public AZ::EBusTraits
+    {
+    public:
+        //////////////////////////////////////////////////////////////////////////
+        // EBusTraits overrides
+        static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
+        static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
+        //////////////////////////////////////////////////////////////////////////
+    };
+
+    using ${Name}RequestBus = AZ::EBus<${Name}Requests, ${Name}BusTraits>;
+    using ${Name}Interface = AZ::Interface<${Name}Requests>;
+
+} // namespace ${Name}

+ 15 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Linux/${Name}_linux_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(FILES
+    PAL_linux.cmake
+)

+ 14 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Linux/${Name}_shared_linux_files.cmake

@@ -0,0 +1,14 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(FILES
+)

+ 13 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Linux/PAL_linux.cmake

@@ -0,0 +1,13 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(PAL_TRAIT_${Name}_SUPPORTED TRUE)

+ 16 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Mac/${Name}_mac_files.cmake

@@ -0,0 +1,16 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(FILES
+    ../../../Resources/Platform/Mac/Info.plist
+    PAL_mac.cmake
+)

+ 15 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Mac/${Name}_shared_mac_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(FILES
+    ../../../Resources/Platform/Mac/Info.plist
+)

+ 13 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Mac/PAL_mac.cmake

@@ -0,0 +1,13 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(PAL_TRAIT_${Name}_SUPPORTED TRUE)

+ 14 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Windows/${Name}_shared_windows_files.cmake

@@ -0,0 +1,14 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(FILES
+)

+ 15 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Windows/${Name}_windows_files.cmake

@@ -0,0 +1,15 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(FILES
+    PAL_windows.cmake
+)

+ 14 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Platform/Windows/PAL_windows.cmake

@@ -0,0 +1,14 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+
+set(PAL_TRAIT_${Name}_SUPPORTED TRUE)

+ 18 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Registry/assetprocessor_settings.setreg

@@ -0,0 +1,18 @@
+{
+    "Amazon": {
+        "AssetProcessor": {
+            "Settings": {
+                "ScanFolder ${Name}/Assets": {
+                    "watch": "@GEMROOT:${Name}@/Assets",
+                    "recursive": 1,
+                    "order": 101
+                },
+                "ScanFolder ${Name}/Registry": {
+                    "watch": "@GEMROOT:${Name}@/Registry",
+                    "recursive": 1,
+                    "order": 102
+                }
+            }
+        }
+    }
+}

+ 46 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Source/${Name}Module.cpp

@@ -0,0 +1,46 @@
+// {BEGIN_LICENSE}
+/*
+ * 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
+ *
+ */
+// {END_LICENSE}
+
+#include <AzCore/Memory/SystemAllocator.h>
+#include <AzCore/Module/Module.h>
+
+#include "${Name}SystemComponent.h"
+
+namespace ${Name}
+{
+    class ${Name}Module
+        : public AZ::Module
+    {
+    public:
+        AZ_RTTI(${Name}Module, "{${Random_Uuid}}", AZ::Module);
+        AZ_CLASS_ALLOCATOR(${Name}Module, AZ::SystemAllocator, 0);
+
+        ${Name}Module()
+            : AZ::Module()
+        {
+            // Push results of [MyComponent]::CreateDescriptor() into m_descriptors here.
+            m_descriptors.insert(m_descriptors.end(), {
+                ${Name}SystemComponent::CreateDescriptor(),
+            });
+        }
+
+        /**
+         * Add required SystemComponents to the SystemEntity.
+         */
+        AZ::ComponentTypeList GetRequiredSystemComponents() const override
+        {
+            return AZ::ComponentTypeList{
+                azrtti_typeid<${Name}SystemComponent>(),
+            };
+        }
+    };
+}// namespace ${Name}
+
+AZ_DECLARE_MODULE_CLASS(Gem_${Name}, ${Name}::${Name}Module)

+ 85 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Source/${Name}SystemComponent.cpp

@@ -0,0 +1,85 @@
+// {BEGIN_LICENSE}
+/*
+ * 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
+ *
+ */
+// {END_LICENSE}
+
+#include <AzCore/Serialization/SerializeContext.h>
+#include <AzCore/Serialization/EditContext.h>
+#include <AzCore/Serialization/EditContextConstants.inl>
+
+#include "${Name}SystemComponent.h"
+
+namespace ${Name}
+{
+    void ${Name}SystemComponent::Reflect(AZ::ReflectContext* context)
+    {
+        if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serialize->Class<${Name}SystemComponent, AZ::Component>()
+                ->Version(0)
+                ;
+
+            if (AZ::EditContext* ec = serialize->GetEditContext())
+            {
+                ec->Class<${Name}SystemComponent>("${Name}", "[Description of functionality provided by this System Component]")
+                    ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
+                        ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("System"))
+                        ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
+                    ;
+            }
+        }
+    }
+
+    void ${Name}SystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
+    {
+        provided.push_back(AZ_CRC("${Name}Service"));
+    }
+
+    void ${Name}SystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
+    {
+        incompatible.push_back(AZ_CRC("${Name}Service"));
+    }
+
+    void ${Name}SystemComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required)
+    {
+    }
+
+    void ${Name}SystemComponent::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent)
+    {
+    }
+
+    ${Name}SystemComponent::${Name}SystemComponent()
+    {
+        if (${Name}Interface::Get() == nullptr)
+        {
+            ${Name}Interface::Register(this);
+        }
+    }
+
+    ${Name}SystemComponent::~${Name}SystemComponent()
+    {
+        if (${Name}Interface::Get() == this)
+        {
+            ${Name}Interface::Unregister(this);
+        }
+    }
+
+    void ${Name}SystemComponent::Init()
+    {
+    }
+
+    void ${Name}SystemComponent::Activate()
+    {
+        ${Name}RequestBus::Handler::BusConnect();
+    }
+
+    void ${Name}SystemComponent::Deactivate()
+    {
+        ${Name}RequestBus::Handler::BusDisconnect();
+    }
+}

+ 49 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/Source/${Name}SystemComponent.h

@@ -0,0 +1,49 @@
+// {BEGIN_LICENSE}
+/*
+ * 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
+ *
+ */
+// {END_LICENSE}
+
+#pragma once
+
+#include <AzCore/Component/Component.h>
+
+#include <${Name}/${Name}Bus.h>
+
+namespace ${Name}
+{
+    class ${Name}SystemComponent
+        : public AZ::Component
+        , protected ${Name}RequestBus::Handler
+    {
+    public:
+        AZ_COMPONENT(${Name}SystemComponent, "{B8794DFF-877B-4FE3-B268-2C6090259157}");
+
+        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);
+
+        ${Name}SystemComponent();
+        ~${Name}SystemComponent();
+
+    protected:
+        ////////////////////////////////////////////////////////////////////////
+        // ${Name}RequestBus interface implementation
+
+        ////////////////////////////////////////////////////////////////////////
+
+        ////////////////////////////////////////////////////////////////////////
+        // AZ::Component interface implementation
+        void Init() override;
+        void Activate() override;
+        void Deactivate() override;
+        ////////////////////////////////////////////////////////////////////////
+    };
+}

+ 35 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/enabled_gems.cmake

@@ -0,0 +1,35 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# This file is copied during engine registration. Edits to this file will be lost next
+# time a registration happens.
+
+set(ENABLED_GEMS
+    ${Name}
+    Atom
+    CameraFramework
+    DebugDraw
+    EditorPythonBindings
+    EMotionFX
+    ImGui
+    LyShine
+    PhysX
+    PrimitiveAssets
+    PrefabBuilder
+    ScriptCanvasPhysics
+    ScriptEvents
+    StartingPointInput
+    TextureAtlas
+    WhiteBox
+    DiffuseProbeGrid
+    Compression
+    ProteusRobot
+    WarehouseAssets
+    ROS2
+)

+ 29 - 0
Templates/Ros2FleetRobotTemplate/Template/Gem/gem.json

@@ -0,0 +1,29 @@
+{
+    "gem_name": "${Name}",
+    "version": "1.0.0",
+    "display_name": "${Name}",
+    "license": "What license ${Name} uses goes here: i.e. Apache-2.0 or MIT",
+    "license_url": "Link to the license web site goes here: i.e. https://opensource.org/licenses/Apache-2.0 Or https://opensource.org/licenses/MIT",
+    "origin": "The name of the originator goes here. i.e. XYZ Inc.",
+    "origin_url": "The primary repo for ${Name} goes here: i.e. http://www.mydomain.com",
+    "type": "",
+    "summary": "A short description of ${Name}.",
+    "canonical_tags": [
+        "Gem"
+    ],
+    "user_tags": [
+        "${Name}"
+    ],
+    "platforms": [
+        "${Platforms}"
+    ],
+    "icon_path": "preview.png",
+    "requirements": "",
+    "documentation_url": "",
+    "dependencies": [
+    ],
+    "compatible_engines": [
+    ],
+    "engine_api_dependencies":[
+    ]
+}

+ 201 - 0
Templates/Ros2FleetRobotTemplate/Template/LICENSE.txt

@@ -0,0 +1,201 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction,
+and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by
+the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all
+other entities that control, are controlled by, or are under common
+control with that entity. For the purposes of this definition,
+"control" means (i) the power, direct or indirect, to cause the
+direction or management of such entity, whether by contract or
+otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity
+exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications,
+including but not limited to software source code, documentation
+source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical
+transformation or translation of a Source form, including but
+not limited to compiled object code, generated documentation,
+and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or
+Object form, made available under the License, as indicated by a
+copyright notice that is included in or attached to the work
+(an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object
+form, that is based on (or derived from) the Work and for which the
+editorial revisions, annotations, elaborations, or other modifications
+represent, as a whole, an original work of authorship. For the purposes
+of this License, Derivative Works shall not include works that remain
+separable from, or merely link (or bind by name) to the interfaces of,
+the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including
+the original version of the Work and any modifications or additions
+to that Work or Derivative Works thereof, that is intentionally
+submitted to Licensor for inclusion in the Work by the copyright owner
+or by an individual or Legal Entity authorized to submit on behalf of
+the copyright owner. For the purposes of this definition, "submitted"
+means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems,
+and issue tracking systems that are managed by, or on behalf of, the
+Licensor for the purpose of discussing and improving the Work, but
+excluding communication that is conspicuously marked or otherwise
+designated in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity
+on behalf of whom a Contribution has been received by Licensor and
+subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+this License, each Contributor hereby grants to You a perpetual,
+worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the
+Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+this License, each Contributor hereby grants to You a perpetual,
+worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+(except as stated in this section) patent license to make, have made,
+use, offer to sell, sell, import, and otherwise transfer the Work,
+where such license applies only to those patent claims licensable
+by such Contributor that are necessarily infringed by their
+Contribution(s) alone or by combination of their Contribution(s)
+with the Work to which such Contribution(s) was submitted. If You
+institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work
+or a Contribution incorporated within the Work constitutes direct
+or contributory patent infringement, then any patent licenses
+granted to You under this License for that Work shall terminate
+as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+Work or Derivative Works thereof in any medium, with or without
+modifications, and in Source or Object form, provided that You
+meet the following conditions:
+
+(a) You must give any other recipients of the Work or
+Derivative Works a copy of this License; and
+
+(b) You must cause any modified files to carry prominent notices
+stating that You changed the files; and
+
+(c) You must retain, in the Source form of any Derivative Works
+that You distribute, all copyright, patent, trademark, and
+attribution notices from the Source form of the Work,
+excluding those notices that do not pertain to any part of
+the Derivative Works; and
+
+(d) If the Work includes a "NOTICE" text file as part of its
+distribution, then any Derivative Works that You distribute must
+include a readable copy of the attribution notices contained
+within such NOTICE file, excluding those notices that do not
+pertain to any part of the Derivative Works, in at least one
+of the following places: within a NOTICE text file distributed
+as part of the Derivative Works; within the Source form or
+documentation, if provided along with the Derivative Works; or,
+within a display generated by the Derivative Works, if and
+wherever such third-party notices normally appear. The contents
+of the NOTICE file are for informational purposes only and
+do not modify the License. You may add Your own attribution
+notices within Derivative Works that You distribute, alongside
+or as an addendum to the NOTICE text from the Work, provided
+that such additional attribution notices cannot be construed
+as modifying the License.
+
+You may add Your own copyright statement to Your modifications and
+may provide additional or different license terms and conditions
+for use, reproduction, or distribution of Your modifications, or
+for any such Derivative Works as a whole, provided Your use,
+reproduction, and distribution of the Work otherwise complies with
+the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+any Contribution intentionally submitted for inclusion in the Work
+by You to the Licensor shall be under the terms and conditions of
+this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify
+the terms of any separate license agreement you may have executed
+with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+names, trademarks, service marks, or product names of the Licensor,
+except as required for reasonable and customary use in describing the
+origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+agreed to in writing, Licensor provides the Work (and each
+Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+implied, including, without limitation, any warranties or conditions
+of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+PARTICULAR PURPOSE. You are solely responsible for determining the
+appropriateness of using or redistributing the Work and assume any
+risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+whether in tort (including negligence), contract, or otherwise,
+unless required by applicable law (such as deliberate and grossly
+negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special,
+incidental, or consequential damages of any character arising as a
+result of this License or out of the use or inability to use the
+Work (including but not limited to damages for loss of goodwill,
+work stoppage, computer failure or malfunction, or any and all
+other commercial damages or losses), even if such Contributor
+has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+the Work or Derivative Works thereof, You may choose to offer,
+and charge a fee for, acceptance of support, warranty, indemnity,
+or other liability obligations and/or rights consistent with this
+License. However, in accepting such obligations, You may act only
+on Your own behalf and on Your sole responsibility, not on behalf
+of any other Contributor, and only if You agree to indemnify,
+defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason
+of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+To apply the Apache License to your work, attach the following
+boilerplate notice, with the fields enclosed by brackets "[]"
+replaced with your own identifying information. (Don't include
+the brackets!)  The text should be enclosed in the appropriate
+comment syntax for the file format. We also recommend that a
+file or class name and description of purpose be included on the
+same "printed page" as the copyright notice for easier
+identification within third-party archives.
+
+Copyright (c) Contributors to the Open 3D Engine Project.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.

+ 761 - 0
Templates/Ros2FleetRobotTemplate/Template/Levels/WarehouseScene/Warehouse.prefab

@@ -0,0 +1,761 @@
+{
+    "ContainerEntity": {
+        "Id": "Entity_[1146574390643]",
+        "Name": "Level",
+        "Components": {
+            "Component_[10641544592923449938]": {
+                "$type": "EditorInspectorComponent",
+                "Id": 10641544592923449938
+            },
+            "Component_[12039882709170782873]": {
+                "$type": "EditorOnlyEntityComponent",
+                "Id": 12039882709170782873
+            },
+            "Component_[12265484671603697631]": {
+                "$type": "EditorPendingCompositionComponent",
+                "Id": 12265484671603697631
+            },
+            "Component_[14126657869720434043]": {
+                "$type": "EditorEntitySortComponent",
+                "Id": 14126657869720434043,
+                "Child Entity Order": [
+                    "Entity_[49189724403731]",
+                    "Entity_[112314723493220]",
+                    "Instance_[50967208312615]/ContainerEntity"
+                ]
+            },
+            "Component_[15230859088967841193]": {
+                "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                "Id": 15230859088967841193,
+                "Parent Entity": ""
+            },
+            "Component_[16239496886950819870]": {
+                "$type": "EditorDisabledCompositionComponent",
+                "Id": 16239496886950819870
+            },
+            "Component_[5688118765544765547]": {
+                "$type": "EditorEntityIconComponent",
+                "Id": 5688118765544765547
+            },
+            "Component_[5736895446553447924]": {
+                "$type": "LocalViewBookmarkComponent",
+                "Id": 5736895446553447924,
+                "LocalBookmarkFileName": "Warehouse1_1673519190397080804.setreg"
+            },
+            "Component_[7247035804068349658]": {
+                "$type": "EditorPrefabComponent",
+                "Id": 7247035804068349658
+            },
+            "Component_[9307224322037797205]": {
+                "$type": "EditorLockComponent",
+                "Id": 9307224322037797205
+            },
+            "Component_[9562516168917670048]": {
+                "$type": "EditorVisibilityComponent",
+                "Id": 9562516168917670048
+            }
+        }
+    },
+    "Entities": {
+        "Entity_[112314723493220]": {
+            "Id": "Entity_[112314723493220]",
+            "Name": "RobotSpawner",
+            "Components": {
+                "Component_[11496703102337902766]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 11496703102337902766
+                },
+                "Component_[12540075090465040503]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 12540075090465040503,
+                    "Child Entity Order": [
+                        "Entity_[112319018460516]",
+                        "Entity_[112323313427812]",
+                        "Entity_[112340493296996]",
+                        "Entity_[112336198329700]"
+                    ]
+                },
+                "Component_[13322094671052928914]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 13322094671052928914
+                },
+                "Component_[15745812112668649245]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 15745812112668649245
+                },
+                "Component_[4373493893052679413]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 4373493893052679413
+                },
+                "Component_[4933737581982406853]": {
+                    "$type": "GenericComponentWrapper",
+                    "Id": 4933737581982406853,
+                    "m_template": {
+                        "$type": "ROS2SpawnerComponent",
+                        "Spawnables": {
+                            "proteus": {
+                                "assetId": {
+                                    "guid": "{80419AAD-14CF-528D-A477-8B202D4C9B6D}",
+                                    "subId": 1966583575
+                                },
+                                "assetHint": "proteus.spawnable"
+                            }
+                        }
+                    }
+                },
+                "Component_[5675755823016497202]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 5675755823016497202
+                },
+                "Component_[5989616171722404551]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 5989616171722404551
+                },
+                "Component_[7036651691737517739]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 7036651691737517739
+                },
+                "Component_[7977681995843054515]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 7977681995843054515,
+                    "Parent Entity": "Entity_[1146574390643]"
+                }
+            }
+        },
+        "Entity_[112319018460516]": {
+            "Id": "Entity_[112319018460516]",
+            "Name": "spawnPoint2",
+            "Components": {
+                "Component_[12038672769353472710]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 12038672769353472710
+                },
+                "Component_[12255187604662792642]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 12255187604662792642
+                },
+                "Component_[13013658745469555880]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 13013658745469555880
+                },
+                "Component_[18286115678760435739]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 18286115678760435739,
+                    "Parent Entity": "Entity_[112314723493220]",
+                    "Transform Data": {
+                        "Translate": [
+                            45.09824752807617,
+                            2.5,
+                            0.1479640007019043
+                        ],
+                        "Rotate": [
+                            0.0,
+                            0.0,
+                            180.0
+                        ]
+                    }
+                },
+                "Component_[2115342656585992410]": {
+                    "$type": "GenericComponentWrapper",
+                    "Id": 2115342656585992410,
+                    "m_template": {
+                        "$type": "ROS2SpawnPointComponent",
+                        "Name": "spawnPoint2",
+                        "Info": "spawnPoint2"
+                    }
+                },
+                "Component_[4848442694260332496]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 4848442694260332496
+                },
+                "Component_[4864443065789896214]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 4864443065789896214
+                },
+                "Component_[6931046156563885287]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 6931046156563885287
+                },
+                "Component_[7023949458099299980]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 7023949458099299980
+                },
+                "Component_[8619546883183719655]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 8619546883183719655
+                }
+            }
+        },
+        "Entity_[112323313427812]": {
+            "Id": "Entity_[112323313427812]",
+            "Name": "spawnPoint3",
+            "Components": {
+                "Component_[12038672769353472710]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 12038672769353472710
+                },
+                "Component_[12255187604662792642]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 12255187604662792642
+                },
+                "Component_[13013658745469555880]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 13013658745469555880
+                },
+                "Component_[18286115678760435739]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 18286115678760435739,
+                    "Parent Entity": "Entity_[112314723493220]",
+                    "Transform Data": {
+                        "Translate": [
+                            45.09824752807617,
+                            0.0,
+                            0.1479640007019043
+                        ],
+                        "Rotate": [
+                            0.0,
+                            0.0,
+                            180.0
+                        ]
+                    }
+                },
+                "Component_[2115342656585992410]": {
+                    "$type": "GenericComponentWrapper",
+                    "Id": 2115342656585992410,
+                    "m_template": {
+                        "$type": "ROS2SpawnPointComponent",
+                        "Name": "spawnPoint3",
+                        "Info": "spawnPoint3"
+                    }
+                },
+                "Component_[4848442694260332496]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 4848442694260332496
+                },
+                "Component_[4864443065789896214]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 4864443065789896214
+                },
+                "Component_[6931046156563885287]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 6931046156563885287
+                },
+                "Component_[7023949458099299980]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 7023949458099299980
+                },
+                "Component_[8619546883183719655]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 8619546883183719655
+                }
+            }
+        },
+        "Entity_[112336198329700]": {
+            "Id": "Entity_[112336198329700]",
+            "Name": "spawnPoint1",
+            "Components": {
+                "Component_[12038672769353472710]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 12038672769353472710
+                },
+                "Component_[12255187604662792642]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 12255187604662792642
+                },
+                "Component_[13013658745469555880]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 13013658745469555880
+                },
+                "Component_[18286115678760435739]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 18286115678760435739,
+                    "Parent Entity": "Entity_[112314723493220]",
+                    "Transform Data": {
+                        "Translate": [
+                            42.66361999511719,
+                            2.5,
+                            0.1479640007019043
+                        ],
+                        "Rotate": [
+                            0.0,
+                            0.0,
+                            180.0
+                        ]
+                    }
+                },
+                "Component_[2115342656585992410]": {
+                    "$type": "GenericComponentWrapper",
+                    "Id": 2115342656585992410,
+                    "m_template": {
+                        "$type": "ROS2SpawnPointComponent",
+                        "Name": "spawnPoint1",
+                        "Info": "spawnPoint1"
+                    }
+                },
+                "Component_[4848442694260332496]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 4848442694260332496
+                },
+                "Component_[4864443065789896214]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 4864443065789896214
+                },
+                "Component_[6931046156563885287]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 6931046156563885287
+                },
+                "Component_[7023949458099299980]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 7023949458099299980
+                },
+                "Component_[8619546883183719655]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 8619546883183719655
+                }
+            }
+        },
+        "Entity_[112340493296996]": {
+            "Id": "Entity_[112340493296996]",
+            "Name": "spawnPoint4",
+            "Components": {
+                "Component_[12038672769353472710]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 12038672769353472710
+                },
+                "Component_[12255187604662792642]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 12255187604662792642
+                },
+                "Component_[13013658745469555880]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 13013658745469555880
+                },
+                "Component_[18286115678760435739]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 18286115678760435739,
+                    "Parent Entity": "Entity_[112314723493220]",
+                    "Transform Data": {
+                        "Translate": [
+                            42.66361999511719,
+                            0.0,
+                            0.1479640007019043
+                        ],
+                        "Rotate": [
+                            0.0,
+                            0.0,
+                            180.0
+                        ]
+                    }
+                },
+                "Component_[2115342656585992410]": {
+                    "$type": "GenericComponentWrapper",
+                    "Id": 2115342656585992410,
+                    "m_template": {
+                        "$type": "ROS2SpawnPointComponent",
+                        "Name": "spawnPoint4",
+                        "Info": "spawnPoint4"
+                    }
+                },
+                "Component_[4848442694260332496]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 4848442694260332496
+                },
+                "Component_[4864443065789896214]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 4864443065789896214
+                },
+                "Component_[6931046156563885287]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 6931046156563885287
+                },
+                "Component_[7023949458099299980]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 7023949458099299980
+                },
+                "Component_[8619546883183719655]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 8619546883183719655
+                }
+            }
+        },
+        "Entity_[49189724403731]": {
+            "Id": "Entity_[49189724403731]",
+            "Name": "FlyCamera",
+            "Components": {
+                "Component_[11895140916889160460]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 11895140916889160460
+                },
+                "Component_[16880285896855930892]": {
+                    "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
+                    "Id": 16880285896855930892,
+                    "Controller": {
+                        "Configuration": {
+                            "Field of View": 60.0,
+                            "EditorEntityId": 13315486001867137160
+                        }
+                    }
+                },
+                "Component_[17187464423780271193]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 17187464423780271193
+                },
+                "Component_[17495696818315413311]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 17495696818315413311
+                },
+                "Component_[18058601193338340056]": {
+                    "$type": "AZ::Render::EditorDeferredFogComponent",
+                    "Id": 18058601193338340056,
+                    "Controller": {
+                        "Configuration": {
+                            "FogColor": [
+                                0.5795986652374268,
+                                0.7207446694374084,
+                                0.9183642268180847
+                            ],
+                            "FogStartDistance": 10.0,
+                            "FogEndDistance": 900.0
+                        }
+                    }
+                },
+                "Component_[18086214374043522055]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 18086214374043522055,
+                    "Parent Entity": "Entity_[1146574390643]",
+                    "Transform Data": {
+                        "Translate": [
+                            48.325172424316406,
+                            1.5949296951293945,
+                            0.8091797828674316
+                        ],
+                        "Rotate": [
+                            0.0,
+                            0.0,
+                            99.82526397705078
+                        ]
+                    }
+                },
+                "Component_[2654521436129313160]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 2654521436129313160
+                },
+                "Component_[5013743763039887629]": {
+                    "$type": "AZ::Render::EditorPostFxLayerComponent",
+                    "Id": 5013743763039887629
+                },
+                "Component_[5265045084611556958]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 5265045084611556958,
+                    "DisabledComponents": [
+                        {
+                            "$type": "EditorLookAtComponent",
+                            "Id": 3614169361981986523,
+                            "Target": "",
+                            "ForwardAxis": 2
+                        },
+                        {
+                            "$type": "AZ::Render::EditorDepthOfFieldComponent",
+                            "Id": 17802058751617023810,
+                            "Controller": {
+                                "Configuration": {
+                                    "CameraEntityId": "Entity_[49189724403731]",
+                                    "Enabled": true,
+                                    "ApertureF": 0.05000000074505806,
+                                    "FNumber": 2.3788135051727295,
+                                    "FocusDistance": 1.7999999523162842,
+                                    "EnableAutoFocus": false,
+                                    "AutoFocusScreenPosition": [
+                                        0.5,
+                                        0.800000011920929
+                                    ]
+                                }
+                            }
+                        }
+                    ]
+                },
+                "Component_[5532915187718966079]": {
+                    "$type": "AZ::Render::EditorBloomComponent",
+                    "Id": 5532915187718966079,
+                    "Controller": {
+                        "Configuration": {
+                            "Enabled": true,
+                            "Intensity": 0.4000000059604645,
+                            "KernelSizeScale": 0.10000000149011612,
+                            "KernelSizeStage0": 0.12999999523162842,
+                            "KernelSizeStage1": 0.14000000059604645,
+                            "KernelSizeStage2": 0.3100000023841858,
+                            "KernelSizeStage3": 1.0,
+                            "KernelSizeStage4": 1.0
+                        }
+                    }
+                },
+                "Component_[7169798125182238623]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 7169798125182238623
+                },
+                "Component_[7924945588973048223]": {
+                    "$type": "AZ::Render::EditorSsaoComponent",
+                    "Id": 7924945588973048223,
+                    "Controller": {
+                        "Configuration": {
+                            "Strength": 0.6200000047683716,
+                            "SamplingRadius": 0.029999999329447746,
+                            "BlurConstFalloff": 0.5320000052452087,
+                            "BlurDepthFalloffThreshold": 0.09000000357627869,
+                            "BlurDepthFalloffStrength": 148.0
+                        }
+                    }
+                },
+                "Component_[8866210352157164042]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 8866210352157164042
+                },
+                "Component_[8992381556236738556]": {
+                    "$type": "GenericComponentWrapper",
+                    "Id": 8992381556236738556,
+                    "m_template": {
+                        "$type": "FlyCameraInputComponent",
+                        "Move Speed": 5.0,
+                        "Rotation Speed": 10.0
+                    }
+                },
+                "Component_[9129253381063760879]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 9129253381063760879
+                }
+            }
+        }
+    },
+    "Instances": {
+        "Instance_[50967208312615]": {
+            "Source": "Prefabs/WarehouseScene.prefab",
+            "Patches": [
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/20",
+                    "value": "Instance_[71745424086877]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/21",
+                    "value": "Instance_[71758308988765]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/22",
+                    "value": "Instance_[71706769381213]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/23",
+                    "value": "Instance_[71749719054173]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/24",
+                    "value": "Instance_[71754014021469]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/25",
+                    "value": "Instance_[71736834152285]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/26",
+                    "value": "Instance_[71723949250397]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/27",
+                    "value": "Instance_[71942992582493]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/28",
+                    "value": "Instance_[71925812713309]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/29",
+                    "value": "Instance_[71934402647901]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/30",
+                    "value": "Instance_[72011712059229]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/31",
+                    "value": "Instance_[72024596961117]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/32",
+                    "value": "Instance_[71938697615197]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/33",
+                    "value": "Instance_[71917222778717]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/34",
+                    "value": "Instance_[72007417091933]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/35",
+                    "value": "Instance_[71921517746013]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/36",
+                    "value": "Instance_[72016007026525]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/37",
+                    "value": "Instance_[71930107680605]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/38",
+                    "value": "Instance_[72020301993821]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/39",
+                    "value": "Instance_[378088261441373]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/40",
+                    "value": "Instance_[378062491637597]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/41",
+                    "value": "Instance_[378101146343261]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/42",
+                    "value": "Instance_[378028131899229]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/43",
+                    "value": "Instance_[378114031245149]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/44",
+                    "value": "Instance_[378045311768413]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/45",
+                    "value": "Instance_[378083966474077]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/46",
+                    "value": "Instance_[378032426866525]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/47",
+                    "value": "Instance_[378092556408669]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/48",
+                    "value": "Instance_[378131211114333]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/49",
+                    "value": "Instance_[378036721833821]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/50",
+                    "value": "Instance_[378109736277853]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/51",
+                    "value": "Instance_[378105441310557]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/52",
+                    "value": "Instance_[378053901703005]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/53",
+                    "value": "Instance_[378126916147037]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/54",
+                    "value": "Instance_[378075376539485]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/55",
+                    "value": "Instance_[378071081572189]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/56",
+                    "value": "Instance_[378079671506781]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/57",
+                    "value": "Instance_[378118326212445]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/58",
+                    "value": "Instance_[378049606735709]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/59",
+                    "value": "Instance_[378122621179741]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/60",
+                    "value": "Instance_[378058196670301]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/61",
+                    "value": "Instance_[378096851375965]/ContainerEntity"
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/62",
+                    "value": "Instance_[378066786604893]/ContainerEntity"
+                },
+                {
+                    "op": "remove",
+                    "path": "/Entities/Entity_[81452578909678]/Components/Component_[10681537930500446053]/Child Entity Order/63"
+                },
+                {
+                    "op": "replace",
+                    "path": "/ContainerEntity/Components/Component_[4986831547534594928]/Parent Entity",
+                    "value": "../Entity_[1146574390643]"
+                }
+            ]
+        }
+    }
+}

+ 616 - 0
Templates/Ros2FleetRobotTemplate/Template/Levels/playground/playground.prefab

@@ -0,0 +1,616 @@
+{
+    "ContainerEntity": {
+        "Id": "Entity_[1146574390643]",
+        "Name": "Level",
+        "Components": {
+            "Component_[10641544592923449938]": {
+                "$type": "EditorInspectorComponent",
+                "Id": 10641544592923449938
+            },
+            "Component_[12039882709170782873]": {
+                "$type": "EditorOnlyEntityComponent",
+                "Id": 12039882709170782873
+            },
+            "Component_[12265484671603697631]": {
+                "$type": "EditorPendingCompositionComponent",
+                "Id": 12265484671603697631
+            },
+            "Component_[14126657869720434043]": {
+                "$type": "EditorEntitySortComponent",
+                "Id": 14126657869720434043,
+                "Child Entity Order": [
+                    "Entity_[1176639161715]",
+                    "Instance_[814543674064679]/ContainerEntity"
+                ]
+            },
+            "Component_[15230859088967841193]": {
+                "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                "Id": 15230859088967841193,
+                "Parent Entity": ""
+            },
+            "Component_[16239496886950819870]": {
+                "$type": "EditorDisabledCompositionComponent",
+                "Id": 16239496886950819870
+            },
+            "Component_[5688118765544765547]": {
+                "$type": "EditorEntityIconComponent",
+                "Id": 5688118765544765547
+            },
+            "Component_[7247035804068349658]": {
+                "$type": "EditorPrefabComponent",
+                "Id": 7247035804068349658
+            },
+            "Component_[9307224322037797205]": {
+                "$type": "EditorLockComponent",
+                "Id": 9307224322037797205
+            },
+            "Component_[9562516168917670048]": {
+                "$type": "EditorVisibilityComponent",
+                "Id": 9562516168917670048
+            },
+            "Component_[965267361243414175]": {
+                "$type": "LocalViewBookmarkComponent",
+                "Id": 965267361243414175,
+                "LocalBookmarkFileName": "playground_1676984540715599188.setreg"
+            }
+        }
+    },
+    "Entities": {
+        "Entity_[1155164325235]": {
+            "Id": "Entity_[1155164325235]",
+            "Name": "Sun",
+            "Components": {
+                "Component_[13620450453324765907]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 13620450453324765907
+                },
+                "Component_[2134313378593666258]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 2134313378593666258
+                },
+                "Component_[234010807770404186]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 234010807770404186
+                },
+                "Component_[2970359110423865725]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 2970359110423865725
+                },
+                "Component_[3722854130373041803]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 3722854130373041803
+                },
+                "Component_[5992533738676323195]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 5992533738676323195
+                },
+                "Component_[7378860763541895402]": {
+                    "$type": "AZ::Render::EditorDirectionalLightComponent",
+                    "Id": 7378860763541895402,
+                    "Controller": {
+                        "Configuration": {
+                            "Intensity": 1.0,
+                            "CameraEntityId": "",
+                            "ShadowFilterMethod": 1
+                        }
+                    }
+                },
+                "Component_[7892834440890947578]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 7892834440890947578,
+                    "Parent Entity": "Entity_[1176639161715]",
+                    "Transform Data": {
+                        "Translate": [
+                            0.0,
+                            0.0,
+                            13.487043380737305
+                        ],
+                        "Rotate": [
+                            -76.13099670410156,
+                            -0.847000002861023,
+                            -15.8100004196167
+                        ]
+                    }
+                },
+                "Component_[8599729549570828259]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 8599729549570828259
+                },
+                "Component_[952797371922080273]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 952797371922080273
+                }
+            }
+        },
+        "Entity_[1159459292531]": {
+            "Id": "Entity_[1159459292531]",
+            "Name": "Ground",
+            "Components": {
+                "Component_[12260880513256986252]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 12260880513256986252
+                },
+                "Component_[13711420870643673468]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 13711420870643673468
+                },
+                "Component_[138002849734991713]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 138002849734991713
+                },
+                "Component_[16578565737331764849]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 16578565737331764849,
+                    "Parent Entity": "Entity_[1176639161715]"
+                },
+                "Component_[16919232076966545697]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 16919232076966545697
+                },
+                "Component_[4228479570410194639]": {
+                    "$type": "EditorStaticRigidBodyComponent",
+                    "Id": 4228479570410194639
+                },
+                "Component_[5182430712893438093]": {
+                    "$type": "EditorMaterialComponent",
+                    "Id": 5182430712893438093
+                },
+                "Component_[5245524694917323904]": {
+                    "$type": "EditorColliderComponent",
+                    "Id": 5245524694917323904,
+                    "ColliderConfiguration": {
+                        "Position": [
+                            0.0,
+                            0.0,
+                            -0.5
+                        ],
+                        "MaterialSlots": {
+                            "Slots": [
+                                {
+                                    "Name": "Entire object"
+                                }
+                            ]
+                        }
+                    },
+                    "ShapeConfiguration": {
+                        "ShapeType": 1,
+                        "Box": {
+                            "Configuration": [
+                                512.0,
+                                512.0,
+                                1.0
+                            ]
+                        }
+                    },
+                    "DebugDrawSettings": {
+                        "LocallyEnabled": false
+                    }
+                },
+                "Component_[5675108321710651991]": {
+                    "$type": "AZ::Render::EditorMeshComponent",
+                    "Id": 5675108321710651991,
+                    "Controller": {
+                        "Configuration": {
+                            "ModelAsset": {
+                                "assetId": {
+                                    "guid": "{0CD745C0-6AA8-569A-A68A-73A3270986C4}",
+                                    "subId": 277889906
+                                },
+                                "assetHint": "objects/groudplane/groundplane_512x512m.azmodel"
+                            }
+                        }
+                    }
+                },
+                "Component_[5681893399601237518]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 5681893399601237518
+                },
+                "Component_[592692962543397545]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 592692962543397545
+                },
+                "Component_[7090012899106946164]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 7090012899106946164
+                },
+                "Component_[9410832619875640998]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 9410832619875640998
+                }
+            }
+        },
+        "Entity_[1163754259827]": {
+            "Id": "Entity_[1163754259827]",
+            "Name": "Camera",
+            "Components": {
+                "Component_[11895140916889160460]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 11895140916889160460
+                },
+                "Component_[16880285896855930892]": {
+                    "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
+                    "Id": 16880285896855930892,
+                    "Controller": {
+                        "Configuration": {
+                            "Field of View": 55.0,
+                            "EditorEntityId": 8929576024571800510
+                        }
+                    }
+                },
+                "Component_[17187464423780271193]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 17187464423780271193
+                },
+                "Component_[17495696818315413311]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 17495696818315413311
+                },
+                "Component_[18086214374043522055]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 18086214374043522055,
+                    "Parent Entity": "Entity_[1176639161715]",
+                    "Transform Data": {
+                        "Translate": [
+                            -2.3000001907348633,
+                            -3.9368600845336914,
+                            1.0
+                        ],
+                        "Rotate": [
+                            -2.050307512283325,
+                            1.9552897214889526,
+                            -43.623355865478516
+                        ]
+                    }
+                },
+                "Component_[2654521436129313160]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 2654521436129313160
+                },
+                "Component_[5265045084611556958]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 5265045084611556958
+                },
+                "Component_[7169798125182238623]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 7169798125182238623
+                },
+                "Component_[7255796294953281766]": {
+                    "$type": "GenericComponentWrapper",
+                    "Id": 7255796294953281766,
+                    "m_template": {
+                        "$type": "FlyCameraInputComponent"
+                    }
+                },
+                "Component_[8866210352157164042]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 8866210352157164042
+                },
+                "Component_[9129253381063760879]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 9129253381063760879
+                }
+            }
+        },
+        "Entity_[1168049227123]": {
+            "Id": "Entity_[1168049227123]",
+            "Name": "Grid",
+            "Components": {
+                "Component_[11443347433215807130]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 11443347433215807130
+                },
+                "Component_[14249419413039427459]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 14249419413039427459
+                },
+                "Component_[15448581635946161318]": {
+                    "$type": "AZ::Render::EditorGridComponent",
+                    "Id": 15448581635946161318,
+                    "Controller": {
+                        "Configuration": {
+                            "primarySpacing": 4.0,
+                            "primaryColor": [
+                                0.501960813999176,
+                                0.501960813999176,
+                                0.501960813999176
+                            ],
+                            "secondarySpacing": 0.5,
+                            "secondaryColor": [
+                                0.250980406999588,
+                                0.250980406999588,
+                                0.250980406999588
+                            ]
+                        }
+                    }
+                },
+                "Component_[1843303322527297409]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 1843303322527297409
+                },
+                "Component_[380249072065273654]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 380249072065273654,
+                    "Parent Entity": "Entity_[1176639161715]"
+                },
+                "Component_[7476660583684339787]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 7476660583684339787
+                },
+                "Component_[7557626501215118375]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 7557626501215118375
+                },
+                "Component_[7984048488947365511]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 7984048488947365511
+                },
+                "Component_[8118181039276487398]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 8118181039276487398
+                },
+                "Component_[9189909764215270515]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 9189909764215270515
+                }
+            }
+        },
+        "Entity_[1172344194419]": {
+            "Id": "Entity_[1172344194419]",
+            "Name": "Shader Ball",
+            "Components": {
+                "Component_[10789351944715265527]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 10789351944715265527
+                },
+                "Component_[12037033284781049225]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 12037033284781049225
+                },
+                "Component_[13759153306105970079]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 13759153306105970079
+                },
+                "Component_[14135560884830586279]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 14135560884830586279
+                },
+                "Component_[16247165675903986673]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 16247165675903986673
+                },
+                "Component_[18082433625958885247]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 18082433625958885247
+                },
+                "Component_[6472623349872972660]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 6472623349872972660,
+                    "Parent Entity": "Entity_[1176639161715]",
+                    "Transform Data": {
+                        "Rotate": [
+                            0.0,
+                            0.10000000149011612,
+                            180.0
+                        ]
+                    }
+                },
+                "Component_[6495255223970673916]": {
+                    "$type": "AZ::Render::EditorMeshComponent",
+                    "Id": 6495255223970673916,
+                    "Controller": {
+                        "Configuration": {
+                            "ModelAsset": {
+                                "assetId": {
+                                    "guid": "{FD340C30-755C-5911-92A3-19A3F7A77931}",
+                                    "subId": 281415304
+                                },
+                                "assetHint": "objects/shaderball/shaderball_default_1m.azmodel"
+                            }
+                        }
+                    }
+                },
+                "Component_[8550141614185782969]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 8550141614185782969
+                },
+                "Component_[9439770997198325425]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 9439770997198325425
+                }
+            }
+        },
+        "Entity_[1176639161715]": {
+            "Id": "Entity_[1176639161715]",
+            "Name": "Atom Default Environment",
+            "Components": {
+                "Component_[10757302973393310045]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 10757302973393310045,
+                    "Parent Entity": "Entity_[1146574390643]"
+                },
+                "Component_[14505817420424255464]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 14505817420424255464,
+                    "ComponentOrderEntryArray": [
+                        {
+                            "ComponentId": 10757302973393310045
+                        }
+                    ]
+                },
+                "Component_[14988041764659020032]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 14988041764659020032
+                },
+                "Component_[15900837685796817138]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 15900837685796817138
+                },
+                "Component_[3298767348226484884]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 3298767348226484884
+                },
+                "Component_[4076975109609220594]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 4076975109609220594
+                },
+                "Component_[5679760548946028854]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 5679760548946028854
+                },
+                "Component_[5855590796136709437]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 5855590796136709437,
+                    "Child Entity Order": [
+                        "Entity_[1155164325235]",
+                        "Entity_[1180934129011]",
+                        "Entity_[1172344194419]",
+                        "Entity_[1168049227123]",
+                        "Entity_[1163754259827]",
+                        "Entity_[1159459292531]"
+                    ]
+                },
+                "Component_[9277695270015777859]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 9277695270015777859
+                }
+            }
+        },
+        "Entity_[1180934129011]": {
+            "Id": "Entity_[1180934129011]",
+            "Name": "Global Sky",
+            "Components": {
+                "Component_[11231930600558681245]": {
+                    "$type": "AZ::Render::EditorHDRiSkyboxComponent",
+                    "Id": 11231930600558681245,
+                    "Controller": {
+                        "Configuration": {
+                            "CubemapAsset": {
+                                "assetId": {
+                                    "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
+                                    "subId": 1000
+                                },
+                                "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
+                            }
+                        }
+                    }
+                },
+                "Component_[1428633914413949476]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 1428633914413949476
+                },
+                "Component_[14936200426671614999]": {
+                    "$type": "AZ::Render::EditorImageBasedLightComponent",
+                    "Id": 14936200426671614999,
+                    "Controller": {
+                        "Configuration": {
+                            "diffuseImageAsset": {
+                                "assetId": {
+                                    "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+                                    "subId": 3000
+                                },
+                                "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
+                            },
+                            "specularImageAsset": {
+                                "assetId": {
+                                    "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+                                    "subId": 2000
+                                },
+                                "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
+                            }
+                        }
+                    }
+                },
+                "Component_[14994774102579326069]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 14994774102579326069
+                },
+                "Component_[15417479889044493340]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 15417479889044493340
+                },
+                "Component_[15826613364991382688]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 15826613364991382688
+                },
+                "Component_[1665003113283562343]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 1665003113283562343
+                },
+                "Component_[3704934735944502280]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 3704934735944502280
+                },
+                "Component_[5698542331457326479]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 5698542331457326479
+                },
+                "Component_[6644513399057217122]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 6644513399057217122,
+                    "Parent Entity": "Entity_[1176639161715]"
+                },
+                "Component_[931091830724002070]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 931091830724002070
+                }
+            }
+        }
+    },
+    "Instances": {
+        "Instance_[814543674064679]": {
+            "Source": "Proteus.prefab",
+            "Patches": [
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[15629654211104]/Components/Component_[17075084475750345983]/Configuration/Centre of mass offset/0",
+                    "value": -1.6654873036259232e-9
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[15629654211104]/Components/Component_[17075084475750345983]/Configuration/Centre of mass offset/1",
+                    "value": -2.462736958808165e-10
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[15629654211104]/Components/Component_[17075084475750345983]/Configuration/Centre of mass offset/2",
+                    "value": 6.2086658036975e-10
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[15629654211104]/Components/Component_[17075084475750345983]/Configuration/Inertia tensor/4",
+                    "value": 0.0028837586287409067
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[15672603884064]/Components/Component_[11685358238844952494]/Configuration/Centre of mass offset/0",
+                    "value": -1.6654873036259232e-9
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[15672603884064]/Components/Component_[11685358238844952494]/Configuration/Centre of mass offset/1",
+                    "value": -2.462736958808165e-10
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[15672603884064]/Components/Component_[11685358238844952494]/Configuration/Centre of mass offset/2",
+                    "value": 6.2086658036975e-10
+                },
+                {
+                    "op": "replace",
+                    "path": "/Entities/Entity_[15672603884064]/Components/Component_[11685358238844952494]/Configuration/Inertia tensor/4",
+                    "value": 0.0028837586287409067
+                },
+                {
+                    "op": "replace",
+                    "path": "/ContainerEntity/Components/Component_[15237572906287023176]/Parent Entity",
+                    "value": "../Entity_[1146574390643]"
+                },
+                {
+                    "op": "replace",
+                    "path": "/ContainerEntity/Components/Component_[15237572906287023176]/Transform Data/Translate/0",
+                    "value": -2.053994655609131
+                }
+            ]
+        }
+    }
+}

+ 81 - 0
Templates/Ros2FleetRobotTemplate/Template/Passes/ContrastAdaptiveSharpening.pass

@@ -0,0 +1,81 @@
+{
+    "Type": "JsonSerialization",
+    "Version": 1,
+    "ClassName": "PassAsset",
+    "ClassData": {
+        "PassTemplate": {
+            "Name": "ContrastAdaptiveSharpeningTemplate",
+            "PassClass": "ComputePass",
+            "Slots": [
+                {
+                    "Name": "InputColor",
+                    "SlotType": "Input",
+                    "ShaderInputName": "m_inputColor",
+                    "ScopeAttachmentUsage": "Shader"
+                },
+                {
+                    "Name": "OutputColor",
+                    "SlotType": "Output",
+                    "ShaderInputName": "m_outputColor",
+                    "ScopeAttachmentUsage": "Shader"
+                }
+            ],
+            "ImageAttachments": [
+                {
+                    "Name": "Output",
+                    "FormatSource": {
+                        "Pass": "This",
+                        "Attachment": "InputColor"
+                    },
+                    "SizeSource": {
+                        "Source": {
+                            "Pass": "This",
+                            "Attachment": "InputColor"
+                        }
+                    },
+                    "ImageDescriptor": {
+                        "Format": "R16G16B16A16_FLOAT",
+                        "BindFlags": [
+                            "CopyRead",
+                            "Color",
+                            "ShaderReadWrite",
+                            "ShaderWrite",
+                            "ShaderRead"
+                        ],
+                        "SharedQueueMask": "Graphics"
+                    }
+                }
+            ],
+            "Connections": [
+                {
+                    "LocalSlot": "OutputColor",
+                    "AttachmentRef": {
+                        "Pass": "This",
+                        "Attachment": "Output"
+                    }
+                }
+            ],
+            "FallbackConnections": [
+                {
+                    "Input": "InputColor",
+                    "Output": "OutputColor"
+                }
+            ],
+            "PassData": {
+                "$type": "ComputePassData",
+                "ShaderAsset": {
+                    "FilePath": "Shaders/PostProcessing/ContrastAdaptiveSharpening.shader"
+                },
+                "Make Fullscreen Pass": true,
+                "ShaderDataMappings": {
+                    "FloatMappings": [
+                        {
+                            "Name": "m_strength",
+                            "Value": 0.5
+                        }
+                    ]
+                }
+            }
+        }
+    }
+}

+ 18 - 0
Templates/Ros2FleetRobotTemplate/Template/Passes/MainRenderPipeline.azasset

@@ -0,0 +1,18 @@
+{
+    "Type": "JsonSerialization",
+    "Version": 1,
+    "ClassName": "RenderPipelineDescriptor",
+    "ClassData": {
+        "Name": "MainPipeline",
+        "MainViewTag": "MainCamera",
+        "RootPassTemplate": "MainPipeline",
+        "MaterialPipelineTag": "MainPipeline",
+        "AllowModification": true,
+        "RenderSettings": {
+            "MultisampleState": {
+                "samples": 2
+            
+            }
+        }
+    }
+}

+ 200 - 0
Templates/Ros2FleetRobotTemplate/Template/Passes/PostProcessParent.pass

@@ -0,0 +1,200 @@
+{
+    "Type": "JsonSerialization",
+    "Version": 1,
+    "ClassName": "PassAsset",
+    "ClassData": {
+        "PassTemplate": {
+            "Name": "PostProcessParentTemplate",
+            "PassClass": "ParentPass",
+            "Slots": [
+                // Inputs...
+                {
+                    "Name": "LightingInput",
+                    "SlotType": "Input"
+                },
+                {
+                    "Name": "Depth",
+                    "SlotType": "Input"
+                },
+                {
+                    "Name": "MotionVectors",
+                    "SlotType": "Input"
+                },
+                // SwapChain here is only used to reference the frame height and format
+                {
+                    "Name": "PipelineOutput",
+                    "SlotType": "InputOutput"
+                },
+                // Outputs...
+                {
+                    "Name": "Output",
+                    "SlotType": "Output"
+                },
+                // Debug Outputs...
+                {
+                    "Name": "RawLightingOutput",
+                    "SlotType": "Output"
+                },
+                {
+                    "Name": "LuminanceMipChainOutput",
+                    "SlotType": "Output"
+                }
+            ],
+            "Connections": [
+                {
+                    "LocalSlot": "Output",
+                    "AttachmentRef": {
+                        "Pass": "ChromaticAberrationPass",
+                        "Attachment": "Output"
+                    }
+                },
+                {
+                    "LocalSlot": "RawLightingOutput",
+                    "AttachmentRef": {
+                        "Pass": "BloomPass",
+                        "Attachment": "InputOutput"
+                    }
+                },
+                {
+                    "LocalSlot": "LuminanceMipChainOutput",
+                    "AttachmentRef": {
+                        "Pass": "LightAdaptation",
+                        "Attachment": "LuminanceMipChainOutput"
+                    }
+                }
+            ],
+            "PassRequests": [
+                {
+                    "Name": "SMAA1xApplyLinearHDRColorPass",
+                    "TemplateName": "SMAA1xApplyLinearHDRColorTemplate",
+                    "Connections": [
+                        {
+                            "LocalSlot": "InputColor",
+                            "AttachmentRef": {
+                                "Pass": "Parent",
+                                "Attachment": "LightingInput"
+                            }
+                        },
+                        {
+                            "LocalSlot": "InputDepth",
+                            "AttachmentRef": {
+                                "Pass": "Parent",
+                                "Attachment": "Depth"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "Name": "TaaPass",
+                    "TemplateName": "TaaTemplate",
+                    "Enabled": true,
+                    "Connections": [
+                        {
+                            "LocalSlot": "InputColor",
+                            "AttachmentRef": {
+                                "Pass": "SMAA1xApplyLinearHDRColorPass",
+                                "Attachment": "OutputColor"
+                            }
+                        },
+                        {
+                            "LocalSlot": "InputDepth",
+                            "AttachmentRef": {
+                                "Pass": "Parent",
+                                "Attachment": "Depth"
+                            }
+                        },
+                        {
+                            "LocalSlot": "MotionVectors",
+                            "AttachmentRef": {
+                                "Pass": "Parent",
+                                "Attachment": "MotionVectors"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "Name": "DepthOfFieldPass",
+                    "TemplateName": "NewDepthOfFieldTemplate",
+                    "Enabled": true,
+                    "Connections": [
+                        {
+                            "LocalSlot": "LightingBuffer",
+                            "AttachmentRef": {
+                                "Pass": "TaaPass",
+                                "Attachment": "OutputColor"
+                            }
+                        },
+                        {
+                            "LocalSlot": "Depth",
+                            "AttachmentRef": {
+                                "Pass": "Parent",
+                                "Attachment": "Depth"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "Name": "BloomPass",
+                    "TemplateName": "BloomPassTemplate",
+                    "Enabled": true,
+                    "Connections": [
+                        {
+                            "LocalSlot": "InputOutput",
+                            "AttachmentRef": {
+                                "Pass": "DepthOfFieldPass",
+                                "Attachment": "LightingBuffer"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "Name": "LightAdaptation",
+                    "TemplateName": "LightAdaptationParentTemplate",
+                    "Connections": [
+                        {
+                            "LocalSlot": "LightingInput",
+                            "AttachmentRef": {
+                                "Pass": "BloomPass",
+                                "Attachment": "InputOutput"
+                            }
+                        },
+                        {
+                            "LocalSlot": "PipelineOutput",
+                            "AttachmentRef": {
+                                "Pass": "Parent",
+                                "Attachment": "PipelineOutput"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "Name": "ContrastAdaptiveSharpeningPass",
+                    "TemplateName": "ContrastAdaptiveSharpeningTemplate",
+                    "Enabled": true,
+                    "Connections": [
+                        {
+                            "LocalSlot": "InputColor",
+                            "AttachmentRef": {
+                                "Pass": "LightAdaptation",
+                                "Attachment": "Output"
+                            }
+                        }
+                    ]
+                },
+                {
+                    "Name": "ChromaticAberrationPass",
+                    "TemplateName": "ChromaticAberrationTemplate",
+                    "Connections": [
+                        {
+                            "LocalSlot": "Input",
+			                "AttachmentRef": {
+                                "Pass": "ContrastAdaptiveSharpeningPass",
+                                "Attachment": "OutputColor"
+			                }
+			            }
+		            ]
+		        }
+            ]
+        }
+    }
+}

+ 12 - 0
Templates/Ros2FleetRobotTemplate/Template/Passes/SMAAConfiguration.azasset

@@ -0,0 +1,12 @@
+{
+  "Type": "JsonSerialization",
+  "Version": 1,
+  "ClassName": "SMAAConfigurationDescriptor",
+  "ClassData": {
+    "Name": "Default",
+    "Enable": 0,
+    "EdgeDetectionMode": 2,
+    "OutputMode": 0,
+    "Quality": 6
+  }
+}

+ 113 - 0
Templates/Ros2FleetRobotTemplate/Template/Passes/Taa.pass

@@ -0,0 +1,113 @@
+{
+    "Type": "JsonSerialization",
+    "Version": 1,
+    "ClassName": "PassAsset",
+    "ClassData": {
+        "PassTemplate": {
+            "Name": "TaaTemplate",
+            "PassClass": "TaaPass",
+            "Slots": [
+                {
+                    "Name": "InputColor",
+                    "SlotType": "Input",
+                    "ShaderInputName": "m_inputColor",
+                    "ScopeAttachmentUsage": "Shader"
+                },
+                {
+                    "Name": "InputDepth",
+                    "SlotType": "Input",
+                    "ShaderInputName": "m_inputDepth",
+                    "ScopeAttachmentUsage": "Shader"
+                },
+                {
+                    "Name": "MotionVectors",
+                    "SlotType": "Input",
+                    "ShaderInputName": "m_motionVectors",
+                    "ScopeAttachmentUsage": "Shader"
+                },
+                {
+                    "Name": "LastFrameAccumulation",
+                    "SlotType": "Input",
+                    "ShaderInputName": "m_lastFrameAccumulation",
+                    "ScopeAttachmentUsage": "Shader"
+                },
+                {
+                    "Name": "OutputColor",
+                    "SlotType": "Output",
+                    "ShaderInputName": "m_outputColor",
+                    "ScopeAttachmentUsage": "Shader"
+                }
+            ],
+            "ImageAttachments": [
+                {
+                    "Name": "Accumulation1",
+                    "Lifetime": "Imported",
+                    "FormatSource": {
+                        "Pass": "This",
+                        "Attachment": "InputColor"
+                    },
+                    "SizeSource": {
+                        "Source": {
+                            "Pass": "This",
+                            "Attachment": "InputColor"
+                        }
+                    },
+                    "ImageDescriptor": {
+                        "Format": "R16G16B16A16_FLOAT",
+                        "BindFlags": "3",
+                        "SharedQueueMask": "1"
+                    }
+                },
+                {
+                    "Name": "Accumulation2",
+                    "Lifetime": "Imported",
+                    "FormatSource": {
+                        "Pass": "This",
+                        "Attachment": "InputColor"
+                    },
+                    "SizeSource": {
+                        "Source": {
+                            "Pass": "This",
+                            "Attachment": "InputColor"
+                        }
+                    },
+                    "ImageDescriptor": {
+                        "Format": "R16G16B16A16_FLOAT",
+                        "BindFlags": "3",
+                        "SharedQueueMask": "1"
+                    }
+                }
+            ],
+            "FallbackConnections": [
+                {
+                    "Input": "InputColor",
+                    "Output": "OutputColor"
+                }
+            ],
+            "PassData": {
+                "$type": "TaaPassData",
+                "ShaderAsset": {
+                    "FilePath": "Shaders/PostProcessing/Taa.shader"
+                },
+                "Make Fullscreen Pass": true,
+                "ShaderDataMappings": {
+                    "FloatMappings": [
+                        {
+                            "Name": "m_currentFrameContribution",
+                            "Value": 0.1
+                        },
+                        {
+                            "Name": "m_clampGamma",
+                            "Value": 1.0
+                        },
+                        {
+                            "Name": "m_maxDeviationBeforeDampening",
+                            "Value": 0.5
+                        }
+                    ]
+                },
+                "NumJitterPositions": 1
+            }
+        }
+    }
+}

+ 8 - 0
Templates/Ros2FleetRobotTemplate/Template/Platform/Android/android_project.cmake

@@ -0,0 +1,8 @@
+# {BEGIN_LICENSE}
+# 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
+#
+# {END_LICENSE}
+

+ 9 - 0
Templates/Ros2FleetRobotTemplate/Template/Platform/Android/android_project.json

@@ -0,0 +1,9 @@
+{
+    "Tags": ["Android"],
+    "android_settings" : {
+        "package_name" : "org.o3de.${Name}",
+        "version_number" : 1,
+        "version_name" : "1.0.0.0",
+        "orientation" : "landscape"
+    }
+}

+ 8 - 0
Templates/Ros2FleetRobotTemplate/Template/Platform/Linux/linux_project.cmake

@@ -0,0 +1,8 @@
+# {BEGIN_LICENSE}
+# 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
+#
+# {END_LICENSE}
+

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Platform/Linux/linux_project.json

@@ -0,0 +1,3 @@
+{
+  "Tags": ["Linux"]
+}

+ 8 - 0
Templates/Ros2FleetRobotTemplate/Template/Platform/Mac/mac_project.cmake

@@ -0,0 +1,8 @@
+# {BEGIN_LICENSE}
+# 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
+#
+# {END_LICENSE}
+

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Platform/Mac/mac_project.json

@@ -0,0 +1,3 @@
+{
+  "Tags": ["Mac"]
+}

+ 8 - 0
Templates/Ros2FleetRobotTemplate/Template/Platform/Windows/windows_project.cmake

@@ -0,0 +1,8 @@
+# {BEGIN_LICENSE}
+# 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
+#
+# {END_LICENSE}
+

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Platform/Windows/windows_project.json

@@ -0,0 +1,3 @@
+{
+  "Tags": ["Windows"]
+}

+ 8 - 0
Templates/Ros2FleetRobotTemplate/Template/Platform/iOS/ios_project.cmake

@@ -0,0 +1,8 @@
+# {BEGIN_LICENSE}
+# 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
+#
+# {END_LICENSE}
+

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Platform/iOS/ios_project.json

@@ -0,0 +1,3 @@
+{
+    "Tags": ["iOS"]
+}

+ 23 - 0
Templates/Ros2FleetRobotTemplate/Template/Registry/assetprocessor_settings.setreg

@@ -0,0 +1,23 @@
+{
+    "Amazon": {
+        "AssetProcessor": {
+            "Settings": {
+                "ScanFolder Project/ShaderLib": {
+                    "watch": "@PROJECTROOT@/ShaderLib",
+                    "recursive": 1,
+                    "order": 1
+                },
+                "ScanFolder Project/Shaders": {
+                    "watch": "@PROJECTROOT@/Shaders",
+                    "recursive": 1,
+                    "order": 2
+                },
+                "ScanFolder Project/Registry": {
+                    "watch": "@PROJECTROOT@/Registry",
+                    "recursive": 1,
+                    "order": 3
+                }
+            }
+        }
+    }
+}

+ 10 - 0
Templates/Ros2FleetRobotTemplate/Template/Registry/awscoreconfiguration.setreg

@@ -0,0 +1,10 @@
+{
+    "Amazon":
+    {
+        "AWSCore":
+        {
+            "ProfileName": "default",
+            "ResourceMappingConfigFileName": "default_aws_resource_mappings.json"
+        }
+    }
+}

+ 11 - 0
Templates/Ros2FleetRobotTemplate/Template/Registry/physxdebugconfiguration.setreg

@@ -0,0 +1,11 @@
+{
+    "Amazon": {
+        "Gems": {
+            "PhysX": {
+                "Debug": {
+                    "PhysXDebugConfiguration": {}
+                }
+            }
+        }
+    }
+}

+ 9 - 0
Templates/Ros2FleetRobotTemplate/Template/Registry/physxdefaultsceneconfiguration.setreg

@@ -0,0 +1,9 @@
+{
+    "Amazon": {
+        "Gems": {
+            "PhysX": {
+                "DefaultSceneConfiguration": {}
+            }
+        }
+    }
+}

+ 98 - 0
Templates/Ros2FleetRobotTemplate/Template/Registry/physxsystemconfiguration.setreg

@@ -0,0 +1,98 @@
+{
+    "Amazon": {
+        "Gems": {
+            "PhysX": {
+                "PhysXSystemConfiguration": {
+                    "CollisionConfig": {
+                        "Layers": {
+                            "LayerNames": [
+                                "Default",
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {},
+                                {}
+                            ]
+                        },
+                        "Groups": {
+                            "GroupPresets": [
+                                {
+                                    "Name": "All",
+                                    "ReadOnly": true
+                                },
+                                {
+                                    "Id": {
+                                        "GroupId": "{E68FAA37-AE19-4093-939A-A4B92759B4F6}"
+                                    },
+                                    "Name": "None",
+                                    "Group": {
+                                        "Mask": 0
+                                    },
+                                    "ReadOnly": true
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/GameSDK.ico

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ba0704efd586fee72b3d45b19163a1b67cd5594bcbf57cb28d796e2919502aba
+size 148143

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/LegacyLogoLauncher.bmp

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ef3584c695998fd5f2d137148a11f68602523c817af5d18fdd6c56b0b5278a6c
+size 462760

+ 68 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,68 @@
+{
+  "images" : [
+    {
+      "size" : "16x16",
+      "idiom" : "mac",
+      "filename" : "icon_16.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "16x16",
+      "idiom" : "mac",
+      "filename" : "icon_16_2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "32x32",
+      "idiom" : "mac",
+      "filename" : "icon_32.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "32x32",
+      "idiom" : "mac",
+      "filename" : "icon_32_2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "128x128",
+      "idiom" : "mac",
+      "filename" : "icon_128.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "128x128",
+      "idiom" : "mac",
+      "filename" : "icon_128_2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "256x256",
+      "idiom" : "mac",
+      "filename" : "icon_256.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "256x256",
+      "idiom" : "mac",
+      "filename" : "icon_256_2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "512x512",
+      "idiom" : "mac",
+      "filename" : "icon_512.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "512x512",
+      "idiom" : "mac",
+      "filename" : "icon_512_2x.png",
+      "scale" : "2x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2a3c136f7b2a511eed671ebb00dd3cc60e4accd511caade4fc7813a1ea2ae6a8
+size 6731

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128_2x.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4d841d75c32539c3364f37815bc69699ab27ca064ba1c70f4700aef369851f34
+size 6731

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8f42f51ad40e2fe400002473a5dc60d11fe003a9280a16c85b6f4611a90c3049
+size 1290

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16_2x.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a15e80648085e63ca2504cd88b9dcc2ea9bd568a4fc094bf4b2b6332293665e4
+size 1290

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d5a16c796e26a7de4bca532bf9547d0e20d643f7f3fabd6cc7fe55e0a8de674
+size 13328

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256_2x.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:902c53d384ec0abbafdb9fc169c0c0e629b0011522fcc344178fc91e5507080b
+size 13328

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:116fb5ac7ccbe734e1a233b263651a62956176ba227e3227dde8b9e582f9df84
+size 2006

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32_2x.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5b0f2f08c999ae797ed013ed9656f2817caf18a6c109b09f917b2571ac0882cf
+size 4032

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5466a6281c4103c0efa30bb41e727d076280fbb2bff0f871598523fce53004c3
+size 27527

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512_2x.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e9aaf5d13439a7c0466d99951a2db96882299af6beaabdffdc639bad22fc0e57
+size 27527

+ 6 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Images.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 24 - 0
Templates/Ros2FleetRobotTemplate/Template/Resources/Platform/Mac/Info.plist

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<false/>
+	<key>CFBundleDisplayName</key>
+	<string>${Name}</string>
+	<key>CFBundleExecutable</key>
+	<string>${Name}.GameLauncher</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.amazon.${Name}</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0.0</string>
+	<key>CFBundleSignature</key>
+	<string>03DE</string>
+	<key>CFBundleVersion</key>
+	<string>1.0.0</string>
+	<key>LSApplicationCategoryType</key>
+	<string>public.app-category.puzzle-games</string>
+</dict>
+</plist>

+ 5 - 0
Templates/Ros2FleetRobotTemplate/Template/ShaderLib/README.md

@@ -0,0 +1,5 @@
+# Customizing Shader Resource Groups
+
+Please read:  
+*\<engine\>/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/README.md*  
+for details on how to customize scenesrg.srgi and viewsrg.srgi.  

+ 26 - 0
Templates/Ros2FleetRobotTemplate/Template/ShaderLib/scenesrg.srgi

@@ -0,0 +1,26 @@
+// {BEGIN_LICENSE}
+/*
+ * 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
+ *
+ */
+// {END_LICENSE}
+
+#pragma once
+
+// Please read README.md for an explanation on why scenesrg.srgi and viewsrg.srgi are
+// located in this folder (And how you can optionally customize your own scenesrg.srgi
+// and viewsrg.srgi in your game project).
+
+#include <Atom/Features/SrgSemantics.azsli>
+
+partial ShaderResourceGroup SceneSrg : SRG_PerScene
+{
+/* Intentionally Empty. Helps define the SrgSemantic for SceneSrg once.*/
+};
+
+#define AZ_COLLECTING_PARTIAL_SRGS
+#include <Atom/Feature/Common/Assets/ShaderResourceGroups/SceneSrgAll.azsli>
+#undef AZ_COLLECTING_PARTIAL_SRGS

+ 26 - 0
Templates/Ros2FleetRobotTemplate/Template/ShaderLib/viewsrg.srgi

@@ -0,0 +1,26 @@
+// {BEGIN_LICENSE}
+/*
+ * 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
+ *
+ */
+// {END_LICENSE}
+
+#pragma once
+
+// Please read README.md for an explanation on why scenesrg.srgi and viewsrg.srgi are
+// located in this folder (And how you can optionally customize your own scenesrg.srgi
+// and viewsrg.srgi in your game project).
+
+#include <Atom/Features/SrgSemantics.azsli>
+
+partial ShaderResourceGroup ViewSrg : SRG_PerView
+{
+/* Intentionally Empty. Helps define the SrgSemantic for ViewSrg once.*/
+};
+
+#define AZ_COLLECTING_PARTIAL_SRGS
+#include <Atom/Feature/Common/Assets/ShaderResourceGroups/ViewSrgAll.azsli>
+#undef AZ_COLLECTING_PARTIAL_SRGS

+ 0 - 0
Templates/Ros2FleetRobotTemplate/Template/autoexec.cfg


+ 170 - 0
Templates/Ros2FleetRobotTemplate/Template/cmake/EngineFinder.cmake

@@ -0,0 +1,170 @@
+# {BEGIN_LICENSE}
+#
+# 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
+#
+#
+# {END_LICENSE}
+# Edits to this file may be lost in upgrades. Instead of changing this file, use 
+# the 'engine_finder_cmake_path' key in your project.json or user/project.json to specify 
+# an alternate .cmake file to use instead of this one.
+
+include_guard()
+
+set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/project.json)
+
+# Option 1: Use engine manually set in CMAKE_MODULE_PATH
+# CMAKE_MODULE_PATH must contain a path to an engine's cmake folder 
+if(CMAKE_MODULE_PATH)
+    foreach(module_path ${CMAKE_MODULE_PATH})
+        cmake_path(SET module_engine_version_cmake_path "${module_path}/o3deConfigVersion.cmake")
+        if(EXISTS "${module_engine_version_cmake_path}")
+            include("${module_engine_version_cmake_path}")
+            if(PACKAGE_VERSION_COMPATIBLE)
+                message(STATUS "Selecting engine from CMAKE_MODULE_PATH '${module_path}'")
+                return()
+            else()
+                message(WARNING "Not using engine from CMAKE_MODULE_PATH '${module_path}' because it is not compatible with this project.")
+            endif()
+        endif()
+    endforeach()
+    message(VERBOSE "No compatible engine found from CMAKE_MODULE_PATH '${CMAKE_MODULE_PATH}'.")
+endif()
+
+# Option 2: Use the engine from the 'engine_path' field in <project>/user/project.json
+cmake_path(SET O3DE_USER_PROJECT_JSON_PATH ${CMAKE_CURRENT_SOURCE_DIR}/user/project.json)
+if(EXISTS "${O3DE_USER_PROJECT_JSON_PATH}")
+    file(READ "${O3DE_USER_PROJECT_JSON_PATH}" user_project_json)
+    if(user_project_json)
+        string(JSON user_project_engine_path ERROR_VARIABLE json_error GET ${user_project_json} engine_path)
+        if(user_project_engine_path AND NOT json_error)
+            cmake_path(SET user_engine_version_cmake_path "${user_project_engine_path}/cmake/o3deConfigVersion.cmake")
+            if(EXISTS "${user_engine_version_cmake_path}")
+                include("${user_engine_version_cmake_path}")
+                if(PACKAGE_VERSION_COMPATIBLE)
+                    message(STATUS "Selecting engine '${user_project_engine_path}' from 'engine_path' in '<project>/user/project.json'.")
+                    list(APPEND CMAKE_MODULE_PATH "${user_project_engine_path}/cmake")
+                    return()
+                else()
+                    message(FATAL_ERROR "The engine at '${user_project_engine_path}' from 'engine_path' in '${O3DE_USER_PROJECT_JSON_PATH}' is not compatible with this project. Please register this project with a compatible engine, or remove the local override by running:\nscripts\\o3de edit-project-properties -pp ${CMAKE_CURRENT_SOURCE_DIR} --user --engine-path \"\"")
+                endif()
+            else()
+                message(FATAL_ERROR "This project cannot use the engine at '${user_project_engine_path}' because the version cmake file '${user_engine_version_cmake_path}' needed to check compatibility is missing.  \nPlease register this project with a compatible engine, or remove the local override by running:\nscripts\\o3de edit-project-properties -pp ${CMAKE_CURRENT_SOURCE_DIR} --user --engine-path \"\"\nIf you want this project to use an older engine(not recommended), provide a custom EngineFinder.cmake using the o3de CLI's --engine-finder-cmake-path option. ")
+            endif()
+        elseif(json_error AND ${user_project_engine_path} STREQUAL "NOTFOUND")
+            # When the value is just NOTFOUND that means there is a JSON
+            # parsing error, and not simply a missing key 
+            message(FATAL_ERROR "Unable to read 'engine_path' from '${user_project_engine_path}'\nError: ${json-error}")
+        endif()
+    endif()
+endif()
+
+
+# Option 3: Find a compatible engine registered in ~/.o3de/o3de_manifest.json 
+if(DEFINED ENV{USERPROFILE} AND EXISTS $ENV{USERPROFILE})
+    set(manifest_path $ENV{USERPROFILE}/.o3de/o3de_manifest.json) # Windows
+else()
+    set(manifest_path $ENV{HOME}/.o3de/o3de_manifest.json) # Unix
+endif()
+
+set(registration_error [=[
+To enable more verbose logging, run the cmake command again with '--log-level VERBOSE'
+Engine registration is required before configuring a project.
+Run 'scripts/o3de register --this-engine' from the engine root.
+]=])
+
+# Create a list of all engines
+if(EXISTS ${manifest_path})
+    file(READ ${manifest_path} manifest_json)
+    set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${manifest_path})
+
+    string(JSON engines_count ERROR_VARIABLE json_error LENGTH ${manifest_json} engines)
+    if(json_error)
+        message(FATAL_ERROR "Unable to read key 'engines' from '${manifest_path}'\nError: ${json_error}\n${registration_error}")
+    endif()
+
+    string(JSON engines_type ERROR_VARIABLE json_error TYPE ${manifest_json} engines)
+    if(json_error OR NOT ${engines_type} STREQUAL "ARRAY")
+        message(FATAL_ERROR "Type of 'engines' in '${manifest_path}' is not a JSON ARRAY\nError: ${json_error}\n${registration_error}")
+    endif()
+
+    math(EXPR engines_count "${engines_count}-1")
+    foreach(array_index RANGE ${engines_count})
+        string(JSON manifest_engine_path ERROR_VARIABLE json_error GET ${manifest_json} engines "${array_index}")
+        if(json_error)
+            message(FATAL_ERROR "Unable to read 'engines/${array_index}' from '${manifest_path}'\nError: ${json_error}\n${registration_error}")
+        endif()
+        list(APPEND O3DE_ENGINE_PATHS ${manifest_engine_path})
+    endforeach()
+elseif(NOT CMAKE_MODULE_PATH)
+    message(FATAL_ERROR "O3DE Manifest file not found at '${manifest_path}'.\n${registration_error}")
+endif()
+
+# We cannot just run find_package() on the list of engine paths because
+# CMAKE_FIND_PACKAGE_SORT_ORDER sorts based on file name and chooses
+# the first package that returns PACKAGE_VERSION_COMPATIBLE 
+set(O3DE_MOST_COMPATIBLE_ENGINE_PATH "")
+set(O3DE_MOST_COMPATIBLE_ENGINE_VERSION "")
+foreach(manifest_engine_path IN LISTS O3DE_ENGINE_PATHS) 
+    # Does this engine have a config version cmake file?
+    cmake_path(SET version_cmake_path "${manifest_engine_path}/cmake/o3deConfigVersion.cmake")
+    if(NOT EXISTS "${version_cmake_path}") 
+        message(VERBOSE "Ignoring '${manifest_engine_path}' because no config version cmake file was found at '${version_cmake_path}'")
+        continue()
+    endif()
+
+    unset(PACKAGE_VERSION)
+    unset(PACKAGE_VERSION_COMPATIBLE)
+    include("${version_cmake_path}")
+
+    # Follow the version checking convention from find_package(CONFIG)
+    if(PACKAGE_VERSION_COMPATIBLE)
+        if(NOT O3DE_MOST_COMPATIBLE_ENGINE_PATH) 
+            set(O3DE_MOST_COMPATIBLE_ENGINE_PATH "${manifest_engine_path}") 
+            set(O3DE_MOST_COMPATIBLE_ENGINE_VERSION ${PACKAGE_VERSION}) 
+            message(VERBOSE "Found compatible engine '${manifest_engine_path}' with version '${PACKAGE_VERSION}'")
+        elseif(${PACKAGE_VERSION} VERSION_GREATER ${O3DE_MOST_COMPATIBLE_ENGINE_VERSION})
+            set(O3DE_MOST_COMPATIBLE_ENGINE_PATH "${manifest_engine_path}")
+            set(O3DE_MOST_COMPATIBLE_ENGINE_VERSION ${PACKAGE_VERSION})
+            message(VERBOSE "Found more compatible engine '${manifest_engine_path}' with version '${PACKAGE_VERSION}' because it has a greater version number.")
+        else()
+            message(VERBOSE "Not using engine '${manifest_engine_path}' with version '${PACKAGE_VERSION}' because it doesn't have a greater version number or has a different engine name.")
+        endif()
+    else()
+        message(VERBOSE "Ignoring '${manifest_engine_path}' because it is not a compatible engine.")
+    endif()
+endforeach()
+
+if(O3DE_MOST_COMPATIBLE_ENGINE_PATH)
+    message(STATUS "Selecting engine '${O3DE_MOST_COMPATIBLE_ENGINE_PATH}'")
+    list(APPEND CMAKE_MODULE_PATH "${O3DE_MOST_COMPATIBLE_ENGINE_PATH}/cmake")
+    return()
+endif()
+
+# No compatible engine was found.
+# Read the 'engine' field in project.json or user/project.json for more helpful messages 
+if(user_project_json)
+    string(JSON user_project_engine ERROR_VARIABLE json_error GET ${user_project_json} engine)
+endif()
+
+if(NOT user_project_engine)
+    file(READ ${CMAKE_CURRENT_SOURCE_DIR}/project.json o3de_project_json)
+    string(JSON project_engine ERROR_VARIABLE json_error GET ${o3de_project_json} engine)
+    if(json_error AND ${project_engine} STREQUAL "NOTFOUND")
+        message(FATAL_ERROR "Unable to read key 'engine' from 'project.json'\nError: ${json_error}")
+    endif()
+endif()
+
+if(user_project_engine)
+    message(FATAL_ERROR "The local '${O3DE_USER_PROJECT_JSON_PATH}' engine is '${user_project_engine}' but no compatible engine with that name and version was found.  Please register the compatible engine, or remove the local engine override.\n${registration_error}")
+elseif(project_engine)
+    message(FATAL_ERROR "The project.json engine is '${project_engine}' but no engine with that name and version was found.\n${registration_error}")
+else()
+    set(project_registration_error [=[
+    Project registration is required before configuring a project.
+    Run 'scripts/o3de register -pp PROJECT_PATH --engine-path ENGINE_PATH' from the engine root.
+    ]=])
+    message(FATAL_ERROR "${project_registration_error}")
+endif()

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/game.cfg

@@ -0,0 +1,3 @@
+-- Enable warnings when asset loads take longer than the given millisecond threshold
+cl_assetLoadWarningEnable=true
+cl_assetLoadWarningMsThreshold=100

+ 3 - 0
Templates/Ros2FleetRobotTemplate/Template/preview.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d5ab0ef9a5f10c57ff5582f7cad6799996071d37a037badc9c33014f81ee93e6
+size 238173

+ 27 - 0
Templates/Ros2FleetRobotTemplate/Template/project.json

@@ -0,0 +1,27 @@
+{
+    "project_name": "${Name}",
+    "version": "1.0.0",
+    "project_id": "{C930C5B9-4B70-40B7-88F4-A7E927D6A677}",
+    "origin": "The primary repo for ${Name} goes here: i.e. http://www.mydomain.com",
+    "license": "What license ${Name} uses goes here: i.e. https://opensource.org/licenses/Apache-2.0 Or https://opensource.org/licenses/MIT etc.",
+    "display_name": "${Name}",
+    "summary": "A short description of ${Name}.",
+    "canonical_tags": [
+        "Project"
+    ],
+    "user_tags": [
+        "${Name}"
+    ],
+    "icon_path": "preview.png",
+    "engine": "o3de",
+    "external_subdirectories": [
+        "Gem"
+    ],
+    "restricted": "${Name}",
+    "engine_version": "1.0.0",
+    "gem_names": [
+        "ProteusRobot",
+        "WarehouseAssets",
+        "ROS2"
+    ]
+}

+ 3 - 0
Templates/Ros2FleetRobotTemplate/preview.png

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d5ab0ef9a5f10c57ff5582f7cad6799996071d37a037badc9c33014f81ee93e6
+size 238173

+ 395 - 0
Templates/Ros2FleetRobotTemplate/template.json

@@ -0,0 +1,395 @@
+{
+    "template_name": "Ros2FleetRobotTemplate",
+    "origin": "Open 3D Engine Extras",
+    "origin_url": "https://github.com/o3de/o3de-extras",
+    "license_url": "https://github.com/o3de/o3de-extras/tree/development/Templates/Ros2FleetRobotTemplate/Template/LICENSE.txt",
+    "display_name": "Ros2FleetRobotTemplate",
+    "summary": "Template for ROS2 multi-robot project.",
+    "canonical_tags": [],
+    "user_tags": [
+        "Ros2FleetRobotTemplate", "ROS2", "ROS"
+    ],
+    "icon_path": "preview.png",
+    "copyFiles": [
+        {
+            "file": ".gitignore",
+            "isTemplated": false
+        },
+        {
+            "file": "CMakeLists.txt",
+            "isTemplated": true
+        },
+        {
+            "file": "Config/shader_global_build_options.json",
+            "isTemplated": false
+        },
+        {
+            "file": "Gem/${Name}_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/${Name}_shared_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/CMakeLists.txt",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Include/${Name}/${Name}Bus.h",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Platform/Linux/${Name}_linux_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Platform/Linux/${Name}_shared_linux_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Platform/Linux/PAL_linux.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Platform/Mac/${Name}_mac_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Platform/Mac/${Name}_shared_mac_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Platform/Mac/PAL_mac.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Platform/Windows/${Name}_shared_windows_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Platform/Windows/${Name}_windows_files.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Platform/Windows/PAL_windows.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Registry/assetprocessor_settings.setreg",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Source/${Name}Module.cpp",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Source/${Name}SystemComponent.cpp",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/Source/${Name}SystemComponent.h",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/enabled_gems.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Gem/gem.json",
+            "isTemplated": true
+        },
+        {
+            "file": "Levels/WarehouseScene/Warehouse.prefab",
+            "isTemplated": false
+        },
+        {
+            "file": "Levels/playground/playground.prefab",
+            "isTemplated": false
+        },
+        {
+            "file": "Platform/Linux/linux_project.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Platform/Linux/linux_project.json",
+            "isTemplated": false
+        },
+        {
+            "file": "Platform/Mac/mac_project.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Platform/Mac/mac_project.json",
+            "isTemplated": false
+        },
+        {
+            "file": "Platform/Windows/windows_project.cmake",
+            "isTemplated": true
+        },
+        {
+            "file": "Platform/Windows/windows_project.json",
+            "isTemplated": false
+        },
+        {
+            "file": "Registry/assetprocessor_settings.setreg",
+            "isTemplated": false
+        },
+        {
+            "file": "Registry/awscoreconfiguration.setreg",
+            "isTemplated": false
+        },
+        {
+            "file": "Registry/physxdebugconfiguration.setreg",
+            "isTemplated": false
+        },
+        {
+            "file": "Registry/physxdefaultsceneconfiguration.setreg",
+            "isTemplated": false
+        },
+        {
+            "file": "Registry/physxsystemconfiguration.setreg",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/GameSDK.ico",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/LegacyLogoLauncher.bmp",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128_2x.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16_2x.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256_2x.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32_2x.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512_2x.png",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Images.xcassets/Contents.json",
+            "isTemplated": false
+        },
+        {
+            "file": "Resources/Platform/Mac/Info.plist",
+            "isTemplated": true
+        },
+        {
+            "file": "ShaderLib/README.md",
+            "isTemplated": false
+        },
+        {
+            "file": "ShaderLib/scenesrg.srgi",
+            "isTemplated": true
+        },
+        {
+            "file": "ShaderLib/viewsrg.srgi",
+            "isTemplated": true
+        },
+        {
+            "file": "Passes/ContrastAdaptiveSharpening.pass",
+            "isTemplated": false
+        },
+        {
+            "file": "Passes/MainRenderPipeline.azasset",
+            "isTemplated": false
+        },
+        {
+            "file": "Passes/PostProcessParent.pass",
+            "isTemplated": false
+        },
+        {
+            "file": "Passes/SMAAConfiguration.azasset",
+            "isTemplated": false
+        },
+        {
+            "file": "Passes/Taa.pass",
+            "isTemplated": false
+        },
+        {
+            "file": "autoexec.cfg",
+            "isTemplated": false
+        },
+        {
+            "file": "cmake/EngineFinder.cmake",
+            "isTemplated": false
+        },
+        {
+            "file": "game.cfg",
+            "isTemplated": false
+        },
+        {
+            "file": "preview.png",
+            "isTemplated": false
+        },
+        {
+            "file": "project.json",
+            "isTemplated": true
+        }
+    ],
+    "createDirectories": [
+        {
+            "dir": "Assets"
+        },
+        {
+            "dir": "Config"
+        },
+        {
+            "dir": "Gem"
+        },
+        {
+            "dir": "Gem/Include"
+        },
+        {
+            "dir": "Gem/Include/${Name}"
+        },
+        {
+            "dir": "Gem/Platform"
+        },
+        {
+            "dir": "Gem/Platform/Linux"
+        },
+        {
+            "dir": "Gem/Platform/Mac"
+        },
+        {
+            "dir": "Gem/Platform/Windows"
+        },
+        {
+            "dir": "Gem/Registry"
+        },
+        {
+            "dir": "Gem/Source"
+        },
+        {
+            "dir": "Levels"
+        },
+        {
+            "dir": "Levels/WarehouseScene"
+        },
+        {
+            "dir": "Levels/playground"
+        },
+        {
+            "dir": "Levels/playground/_savebackup"
+        },
+        {
+            "dir": "Levels/playground/_savebackup/2023-02-21 [13.25.33]"
+        },
+        {
+            "dir": "Passes"
+        },
+        {
+            "dir": "Platform"
+        },
+        {
+            "dir": "Platform/Android"
+        },
+        {
+            "dir": "Platform/Linux"
+        },
+        {
+            "dir": "Platform/Mac"
+        },
+        {
+            "dir": "Platform/Windows"
+        },
+        {
+            "dir": "Registry"
+        },
+        {
+            "dir": "Resources"
+        },
+        {
+            "dir": "Resources/Platform"
+        },
+        {
+            "dir": "Resources/Platform/Mac"
+        },
+        {
+            "dir": "Resources/Platform/Mac/Images.xcassets"
+        },
+        {
+            "dir": "Resources/Platform/Mac/Images.xcassets/AppIcon.appiconset"
+        },
+        {
+            "dir": "ShaderLib"
+        },
+        {
+            "dir": "Shaders"
+        },
+        {
+            "dir": "Shaders/ShaderResourceGroups"
+        },
+        {
+            "dir": "cmake"
+        },
+        {
+            "dir": "proteus_nav"
+        },
+        {
+            "dir": "proteus_nav/src"
+        },
+        {
+            "dir": "proteus_nav/src/proteus_nav"
+        },
+        {
+            "dir": "proteus_nav/src/proteus_nav/launch"
+        },
+        {
+            "dir": "proteus_nav/src/proteus_nav/launch/__pycache__"
+        },
+        {
+            "dir": "proteus_nav/src/proteus_nav/launch/config"
+        },
+        {
+            "dir": "proteus_nav/src/proteus_nav/proteus_nav"
+        },
+        {
+            "dir": "proteus_nav/src/proteus_nav/resource"
+        },
+        {
+            "dir": "proteus_nav/src/proteus_nav/test"
+        },
+        {
+            "dir": "proteus_nav/src/proteus_nav/test/__pycache__"
+        }
+    ]
+}