GetNamedPosesServiceHandler.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. #include "GetNamedPosesServiceHandler.h"
  9. #include "SimulationInterfaces/ROS2SimulationInterfacesRequestBus.h"
  10. #include <AzCore/Outcome/Outcome.h>
  11. #include <AzCore/std/string/string.h>
  12. #include <ROS2/Utilities/ROS2Conversions.h>
  13. #include <SimulationInterfaces/NamedPoseManagerRequestBus.h>
  14. #include <SimulationInterfaces/Result.h>
  15. #include <SimulationInterfaces/TagFilter.h>
  16. #include <simulation_interfaces/msg/named_pose.hpp>
  17. namespace ROS2SimulationInterfaces
  18. {
  19. AZStd::unordered_set<SimulationFeatureType> GetNamedPosesServiceHandler::GetProvidedFeatures()
  20. {
  21. return AZStd::unordered_set<SimulationFeatureType>{ SimulationFeatures::NAMED_POSES, SimulationFeatures::POSE_BOUNDS };
  22. }
  23. AZStd::optional<GetNamedPosesServiceHandler::Response> GetNamedPosesServiceHandler::HandleServiceRequest(
  24. const std::shared_ptr<rmw_request_id_t> header, const Request& request)
  25. {
  26. using namespace SimulationInterfaces;
  27. AZ::Outcome<NamedPoseList, FailedResult> namedPosesO3DE;
  28. TagFilter tagFilter;
  29. tagFilter.m_mode = request.tags.filter_mode;
  30. AZStd::ranges::transform(request.tags.tags, AZStd::inserter(tagFilter.m_tags, tagFilter.m_tags.end()), &std::string::c_str);
  31. NamedPoseManagerRequestBus::BroadcastResult(namedPosesO3DE, &NamedPoseManagerRequests::GetNamedPoses, tagFilter);
  32. Response response;
  33. if (!namedPosesO3DE.IsSuccess())
  34. {
  35. response.result.result = namedPosesO3DE.GetError().m_errorCode;
  36. response.result.error_message = namedPosesO3DE.GetError().m_errorString.c_str();
  37. }
  38. else
  39. {
  40. response.result.result = simulation_interfaces::msg::Result::RESULT_OK;
  41. for (const auto& namedPose : namedPosesO3DE.GetValue())
  42. {
  43. simulation_interfaces::msg::NamedPose ros2NamedPose;
  44. ros2NamedPose.pose = ROS2::ROS2Conversions::ToROS2Pose(namedPose.m_pose);
  45. ros2NamedPose.description = namedPose.m_description.c_str();
  46. ros2NamedPose.name = namedPose.m_name.c_str();
  47. for (const auto& tag : namedPose.m_tags)
  48. {
  49. ros2NamedPose.tags.emplace_back(tag.c_str());
  50. }
  51. response.poses.push_back(ros2NamedPose);
  52. }
  53. }
  54. return response;
  55. }
  56. } // namespace ROS2SimulationInterfaces