ROS2SpawnerComponent.h 4.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #ifndef WITH_GAZEBO_MSGS
  10. static_assert(false, "This file should not be included in the build, without WITH_GAZEBO_MSGS defined.");
  11. #endif
  12. #include "ROS2SpawnPointComponent.h"
  13. #include "Spawner/ROS2SpawnerComponentController.h"
  14. #include <AzCore/Asset/AssetCommon.h>
  15. #include <AzCore/Asset/AssetSerializer.h>
  16. #include <AzCore/Component/Component.h>
  17. #include <AzCore/std/containers/unordered_map.h>
  18. #include <AzFramework/Components/ComponentAdapter.h>
  19. #include <AzFramework/Spawnable/Spawnable.h>
  20. #include <AzFramework/Spawnable/SpawnableEntitiesInterface.h>
  21. #include <gazebo_msgs/srv/delete_entity.hpp>
  22. #include <gazebo_msgs/srv/get_model_state.hpp>
  23. #include <gazebo_msgs/srv/get_world_properties.hpp>
  24. #include <gazebo_msgs/srv/spawn_entity.hpp>
  25. #include <rclcpp/rclcpp.hpp>
  26. namespace ROS2
  27. {
  28. using GetAvailableSpawnableNamesRequest = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Request>;
  29. using GetAvailableSpawnableNamesResponse = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Response>;
  30. using SpawnEntityRequest = std::shared_ptr<gazebo_msgs::srv::SpawnEntity::Request>;
  31. using SpawnEntityResponse = gazebo_msgs::srv::SpawnEntity::Response;
  32. using SpawnEntityServiceHandle = std::shared_ptr<rclcpp::Service<gazebo_msgs::srv::SpawnEntity>>;
  33. using DeleteEntityRequest = std::shared_ptr<gazebo_msgs::srv::DeleteEntity::Request>;
  34. using DeleteEntityServiceHandle = std::shared_ptr<rclcpp::Service<gazebo_msgs::srv::DeleteEntity>>;
  35. using DeleteEntityResponse = gazebo_msgs::srv::DeleteEntity::Response;
  36. using GetSpawnPointInfoRequest = std::shared_ptr<gazebo_msgs::srv::GetModelState::Request>;
  37. using GetSpawnPointInfoResponse = std::shared_ptr<gazebo_msgs::srv::GetModelState::Response>;
  38. using GetSpawnPointsNamesRequest = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Request>;
  39. using GetSpawnPointsNamesResponse = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Response>;
  40. using ROS2SpawnerComponentBase = AzFramework::Components::ComponentAdapter<ROS2SpawnerComponentController, ROS2SpawnerComponentConfig>;
  41. //! Manages robots spawning.
  42. //! Allows user to set spawnable prefabs in the Editor and spawn them using ROS2 service during the simulation.
  43. class ROS2SpawnerComponent : public ROS2SpawnerComponentBase
  44. {
  45. public:
  46. AZ_COMPONENT(ROS2SpawnerComponent, "{8ea91880-0067-11ee-be56-0242ac120002}", AZ::Component);
  47. // ROS2SpawnerComponentBase interface implementation.
  48. ROS2SpawnerComponent() = default;
  49. ROS2SpawnerComponent(const ROS2SpawnerComponentConfig& properties);
  50. ~ROS2SpawnerComponent() = default;
  51. //////////////////////////////////////////////////////////////////////////
  52. // Component overrides
  53. void Activate() override;
  54. void Deactivate() override;
  55. //////////////////////////////////////////////////////////////////////////
  56. static void Reflect(AZ::ReflectContext* context);
  57. private:
  58. int m_counter = 1;
  59. AZStd::unordered_map<AZStd::string, AzFramework::EntitySpawnTicket> m_tickets;
  60. rclcpp::Service<gazebo_msgs::srv::GetWorldProperties>::SharedPtr m_getSpawnablesNamesService;
  61. rclcpp::Service<gazebo_msgs::srv::GetWorldProperties>::SharedPtr m_getSpawnPointsNamesService;
  62. rclcpp::Service<gazebo_msgs::srv::SpawnEntity>::SharedPtr m_spawnService;
  63. rclcpp::Service<gazebo_msgs::srv::DeleteEntity>::SharedPtr m_deleteService;
  64. rclcpp::Service<gazebo_msgs::srv::GetModelState>::SharedPtr m_getSpawnPointInfoService;
  65. void GetAvailableSpawnableNames(const GetAvailableSpawnableNamesRequest request, GetAvailableSpawnableNamesResponse response);
  66. void SpawnEntity(
  67. const SpawnEntityServiceHandle service_handle,
  68. const std::shared_ptr<rmw_request_id_t> header,
  69. const SpawnEntityRequest request);
  70. void PreSpawn(
  71. AzFramework::EntitySpawnTicket::Id,
  72. AzFramework::SpawnableEntityContainerView,
  73. const AZ::Transform&,
  74. const AZStd::string& spawnableName,
  75. const AZStd::string& spawnableNamespace);
  76. void DeleteEntity(
  77. const DeleteEntityServiceHandle service_handle, const std::shared_ptr<rmw_request_id_t> header, DeleteEntityRequest request);
  78. void GetSpawnPointsNames(const GetSpawnPointsNamesRequest request, GetSpawnPointsNamesResponse response);
  79. void GetSpawnPointInfo(const GetSpawnPointInfoRequest request, GetSpawnPointInfoResponse response);
  80. AZStd::unordered_map<AZStd::string, SpawnPointInfo> GetSpawnPoints();
  81. };
  82. } // namespace ROS2