ROS2SpawnerComponent.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. #include "ROS2SpawnPointComponent.h"
  10. #include "Spawner/ROS2SpawnerComponentController.h"
  11. #include <AzCore/Asset/AssetCommon.h>
  12. #include <AzCore/Asset/AssetSerializer.h>
  13. #include <AzCore/Component/Component.h>
  14. #include <AzCore/std/containers/unordered_map.h>
  15. #include <AzFramework/Components/ComponentAdapter.h>
  16. #include <AzFramework/Spawnable/Spawnable.h>
  17. #include <AzFramework/Spawnable/SpawnableEntitiesInterface.h>
  18. #include <gazebo_msgs/srv/delete_entity.hpp>
  19. #include <gazebo_msgs/srv/get_model_state.hpp>
  20. #include <gazebo_msgs/srv/get_world_properties.hpp>
  21. #include <gazebo_msgs/srv/spawn_entity.hpp>
  22. #include <rclcpp/rclcpp.hpp>
  23. namespace ROS2
  24. {
  25. using GetAvailableSpawnableNamesRequest = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Request>;
  26. using GetAvailableSpawnableNamesResponse = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Response>;
  27. using SpawnEntityRequest = std::shared_ptr<gazebo_msgs::srv::SpawnEntity::Request>;
  28. using SpawnEntityResponse = gazebo_msgs::srv::SpawnEntity::Response;
  29. using SpawnEntityServiceHandle = std::shared_ptr<rclcpp::Service<gazebo_msgs::srv::SpawnEntity>>;
  30. using DeleteEntityRequest = std::shared_ptr<gazebo_msgs::srv::DeleteEntity::Request>;
  31. using DeleteEntityServiceHandle = std::shared_ptr<rclcpp::Service<gazebo_msgs::srv::DeleteEntity>>;
  32. using DeleteEntityResponse = gazebo_msgs::srv::DeleteEntity::Response;
  33. using GetSpawnPointInfoRequest = std::shared_ptr<gazebo_msgs::srv::GetModelState::Request>;
  34. using GetSpawnPointInfoResponse = std::shared_ptr<gazebo_msgs::srv::GetModelState::Response>;
  35. using GetSpawnPointsNamesRequest = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Request>;
  36. using GetSpawnPointsNamesResponse = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Response>;
  37. using ROS2SpawnerComponentBase = AzFramework::Components::ComponentAdapter<ROS2SpawnerComponentController, ROS2SpawnerComponentConfig>;
  38. //! Manages robots spawning.
  39. //! Allows user to set spawnable prefabs in the Editor and spawn them using ROS2 service during the simulation.
  40. class ROS2SpawnerComponent : public ROS2SpawnerComponentBase
  41. {
  42. public:
  43. AZ_COMPONENT(ROS2SpawnerComponent, "{8ea91880-0067-11ee-be56-0242ac120002}", AZ::Component);
  44. // ROS2SpawnerComponentBase interface implementation.
  45. ROS2SpawnerComponent() = default;
  46. ROS2SpawnerComponent(const ROS2SpawnerComponentConfig& properties);
  47. ~ROS2SpawnerComponent() = default;
  48. //////////////////////////////////////////////////////////////////////////
  49. // Component overrides
  50. void Activate() override;
  51. void Deactivate() override;
  52. //////////////////////////////////////////////////////////////////////////
  53. static void Reflect(AZ::ReflectContext* context);
  54. private:
  55. int m_counter = 1;
  56. AZStd::unordered_map<AZStd::string, AzFramework::EntitySpawnTicket> m_tickets;
  57. rclcpp::Service<gazebo_msgs::srv::GetWorldProperties>::SharedPtr m_getSpawnablesNamesService;
  58. rclcpp::Service<gazebo_msgs::srv::GetWorldProperties>::SharedPtr m_getSpawnPointsNamesService;
  59. rclcpp::Service<gazebo_msgs::srv::SpawnEntity>::SharedPtr m_spawnService;
  60. rclcpp::Service<gazebo_msgs::srv::DeleteEntity>::SharedPtr m_deleteService;
  61. rclcpp::Service<gazebo_msgs::srv::GetModelState>::SharedPtr m_getSpawnPointInfoService;
  62. void GetAvailableSpawnableNames(const GetAvailableSpawnableNamesRequest request, GetAvailableSpawnableNamesResponse response);
  63. void SpawnEntity(
  64. const SpawnEntityServiceHandle service_handle,
  65. const std::shared_ptr<rmw_request_id_t> header,
  66. const SpawnEntityRequest request);
  67. void PreSpawn(
  68. AzFramework::EntitySpawnTicket::Id,
  69. AzFramework::SpawnableEntityContainerView,
  70. const AZ::Transform&,
  71. const AZStd::string& spawnableName,
  72. const AZStd::string& spawnableNamespace);
  73. void DeleteEntity(
  74. const DeleteEntityServiceHandle service_handle, const std::shared_ptr<rmw_request_id_t> header, DeleteEntityRequest request);
  75. void GetSpawnPointsNames(const GetSpawnPointsNamesRequest request, GetSpawnPointsNamesResponse response);
  76. void GetSpawnPointInfo(const GetSpawnPointInfoRequest request, GetSpawnPointInfoResponse response);
  77. AZStd::unordered_map<AZStd::string, SpawnPointInfo> GetSpawnPoints();
  78. };
  79. } // namespace ROS2