Skip to content

Commit 0f16aa2

Browse files
Add callback to spawn entity service (o3de#611)
Signed-off-by: Artur Kamieniecki <[email protected]>
1 parent 153d83c commit 0f16aa2

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

Gems/ROS2/Code/Source/Spawner/ROS2SpawnerComponent.cpp

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,12 @@ namespace ROS2
4040

4141
m_spawnService = ros2Node->create_service<gazebo_msgs::srv::SpawnEntity>(
4242
"spawn_entity",
43-
[this](const SpawnEntityRequest request, SpawnEntityResponse response)
43+
[this](
44+
const SpawnEntityServiceHandle service_handle,
45+
const std::shared_ptr<rmw_request_id_t> header,
46+
const SpawnEntityRequest request)
4447
{
45-
SpawnEntity(request, response);
48+
SpawnEntity(service_handle, header, request);
4649
});
4750

4851
m_getSpawnPointInfoService = ros2Node->create_service<gazebo_msgs::srv::GetModelState>(
@@ -89,26 +92,31 @@ namespace ROS2
8992
}
9093
}
9194

92-
void ROS2SpawnerComponent::SpawnEntity(const SpawnEntityRequest request, SpawnEntityResponse response)
95+
void ROS2SpawnerComponent::SpawnEntity(
96+
const SpawnEntityServiceHandle service_handle, const std::shared_ptr<rmw_request_id_t> header, const SpawnEntityRequest request)
9397
{
9498
AZStd::string spawnableName(request->name.c_str());
9599
AZStd::string spawnableNamespace(request->robot_namespace.c_str());
96100
AZStd::string spawnPointName(request->xml.c_str(), request->xml.size());
97101

102+
SpawnEntityResponse response;
103+
98104
auto namespaceValidation = ROS2Names::ValidateNamespace(spawnableNamespace);
99105
if (!namespaceValidation.IsSuccess())
100106
{
101-
response->success = false;
102-
response->status_message = namespaceValidation.GetError().data();
107+
response.success = false;
108+
response.status_message = namespaceValidation.GetError().data();
109+
service_handle->send_response(*header, response);
103110
return;
104111
}
105112

106113
auto spawnPoints = GetSpawnPoints();
107114

108115
if (!m_controller.GetSpawnables().contains(spawnableName))
109116
{
110-
response->success = false;
111-
response->status_message = "Could not find spawnable with given name: " + request->name;
117+
response.success = false;
118+
response.status_message = "Could not find spawnable with given name: " + request->name;
119+
service_handle->send_response(*header, response);
112120
return;
113121
}
114122

@@ -146,9 +154,14 @@ namespace ROS2
146154
PreSpawn(id, view, transform, spawnableName, spawnableNamespace);
147155
};
148156

149-
spawner->SpawnAllEntities(m_tickets.at(spawnableName), optionalArgs);
157+
optionalArgs.m_completionCallback = [service_handle, header](auto id, auto view)
158+
{
159+
SpawnEntityResponse response;
160+
response.success = true;
161+
service_handle->send_response(*header, response);
162+
};
150163

151-
response->success = true;
164+
spawner->SpawnAllEntities(m_tickets.at(spawnableName), optionalArgs);
152165
}
153166

154167
void ROS2SpawnerComponent::PreSpawn(

Gems/ROS2/Code/Source/Spawner/ROS2SpawnerComponent.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ namespace ROS2
2626
using GetAvailableSpawnableNamesRequest = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Request>;
2727
using GetAvailableSpawnableNamesResponse = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Response>;
2828
using SpawnEntityRequest = std::shared_ptr<gazebo_msgs::srv::SpawnEntity::Request>;
29-
using SpawnEntityResponse = std::shared_ptr<gazebo_msgs::srv::SpawnEntity::Response>;
29+
using SpawnEntityResponse = gazebo_msgs::srv::SpawnEntity::Response;
30+
using SpawnEntityServiceHandle = std::shared_ptr<rclcpp::Service<gazebo_msgs::srv::SpawnEntity>>;
3031
using GetSpawnPointInfoRequest = std::shared_ptr<gazebo_msgs::srv::GetModelState::Request>;
3132
using GetSpawnPointInfoResponse = std::shared_ptr<gazebo_msgs::srv::GetModelState::Response>;
3233
using GetSpawnPointsNamesRequest = std::shared_ptr<gazebo_msgs::srv::GetWorldProperties::Request>;
@@ -61,7 +62,11 @@ namespace ROS2
6162
rclcpp::Service<gazebo_msgs::srv::GetModelState>::SharedPtr m_getSpawnPointInfoService;
6263

6364
void GetAvailableSpawnableNames(const GetAvailableSpawnableNamesRequest request, GetAvailableSpawnableNamesResponse response);
64-
void SpawnEntity(const SpawnEntityRequest request, SpawnEntityResponse response);
65+
void SpawnEntity(
66+
const SpawnEntityServiceHandle service_handle,
67+
const std::shared_ptr<rmw_request_id_t> header,
68+
const SpawnEntityRequest request);
69+
6570
void PreSpawn(
6671
AzFramework::EntitySpawnTicket::Id,
6772
AzFramework::SpawnableEntityContainerView,

0 commit comments

Comments
 (0)