ROSConDemoSystemComponent.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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 "ROSConDemoSystemComponent.h"
  9. #include "ApplePicker/GatheringRowRequests.h"
  10. #include <AzCore/Component/TickBus.h>
  11. #include <AzCore/Serialization/EditContext.h>
  12. #include <AzCore/Serialization/EditContextConstants.inl>
  13. #include <AzCore/RTTI/BehaviorContext.h>
  14. #include <AzCore/Serialization/SerializeContext.h>
  15. #include <ROS2/ROS2Bus.h>
  16. #include <ROS2/Utilities/ROS2Conversions.h>
  17. #include <ILevelSystem.h>
  18. #include <ISystem.h>
  19. namespace ROSConDemo
  20. {
  21. void ROSConDemoSystemComponent::Reflect(AZ::ReflectContext* context)
  22. {
  23. if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  24. {
  25. serialize->Class<ROSConDemoSystemComponent, AZ::Component>()->Version(0);
  26. if (AZ::EditContext* ec = serialize->GetEditContext())
  27. {
  28. ec->Class<ROSConDemoSystemComponent>("ROSConDemo", "[Description of functionality provided by this System Component]")
  29. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  30. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("System"))
  31. ->Attribute(AZ::Edit::Attributes::AutoExpand, true);
  32. }
  33. }
  34. if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
  35. {
  36. behaviorContext->EBus<ROSConDemoRequestBus>("ROSConDemoRequestBus")
  37. ->Event("ReloadLevel", &ROSConDemoRequestBus::Events::ReloadLevel);
  38. }
  39. }
  40. void ROSConDemoSystemComponent::ReloadLevel()
  41. {
  42. ISystem* systemInterface = nullptr;
  43. CrySystemRequestBus::BroadcastResult(systemInterface, &CrySystemRequests::GetCrySystem);
  44. if(systemInterface && systemInterface->GetILevelSystem())
  45. {
  46. ILevelSystem* levelSystem = systemInterface->GetILevelSystem();
  47. AZStd::string currentLevelName = levelSystem->GetCurrentLevelName();
  48. levelSystem->UnloadLevel();
  49. AZ::TickBus::QueueFunction([levelSystem, currentLevelName]() {
  50. levelSystem->LoadLevel(currentLevelName.c_str());
  51. });
  52. }
  53. }
  54. void ROSConDemoSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  55. {
  56. provided.push_back(AZ_CRC("ROSConDemoService"));
  57. }
  58. void ROSConDemoSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  59. {
  60. incompatible.push_back(AZ_CRC("ROSConDemoService"));
  61. }
  62. void ROSConDemoSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  63. {
  64. }
  65. void ROSConDemoSystemComponent::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent)
  66. {
  67. }
  68. ROSConDemoSystemComponent::ROSConDemoSystemComponent()
  69. {
  70. if (ROSConDemoInterface::Get() == nullptr)
  71. {
  72. ROSConDemoInterface::Register(this);
  73. }
  74. }
  75. ROSConDemoSystemComponent::~ROSConDemoSystemComponent()
  76. {
  77. if (ROSConDemoInterface::Get() == this)
  78. {
  79. ROSConDemoInterface::Unregister(this);
  80. }
  81. }
  82. void ROSConDemoSystemComponent::ProcessGetPlanServiceCall(const GetPlanRequestPtr req, GetPlanResponsePtr resp)
  83. {
  84. AZ::EBusAggregateResults<AppleKraken::GatheringPoses> results;
  85. AppleKraken::GatheringRowRequestBus::BroadcastResult(results, &AppleKraken::GatheringRowRequests::GetGatheringPoses);
  86. // remove all empty rows to avoid checking it later
  87. results.values.erase(
  88. std::remove_if(
  89. results.values.begin(),
  90. results.values.end(),
  91. [](const auto& row){ return row.empty(); }),
  92. results.values.end());
  93. if (results.values.empty())
  94. {
  95. // there are no gathering rows containing at least one pose detected
  96. return;
  97. }
  98. auto startTransform = ROS2::ROS2Conversions::FromROS2Pose(req->start.pose);
  99. auto nearest_row = *std::min_element(
  100. results.values.begin(),
  101. results.values.end(),
  102. [startTranslation = startTransform.GetTranslation()](const auto& row1,const auto& row2)
  103. {
  104. if (row1[0].GetTranslation().GetDistance(startTranslation) < row2[0].GetTranslation().GetDistance(startTranslation))
  105. {
  106. return true;
  107. }
  108. return false;
  109. });
  110. for( const auto& pose : nearest_row)
  111. {
  112. geometry_msgs::msg::PoseStamped stampedPose; // TODO - fill in header
  113. stampedPose.pose = ROS2::ROS2Conversions::ToROS2Pose(pose);
  114. resp->plan.poses.push_back(stampedPose);
  115. }
  116. }
  117. void ROSConDemoSystemComponent::Activate()
  118. {
  119. ROSConDemoRequestBus::Handler::BusConnect();
  120. auto ros2Node = ROS2::ROS2Interface::Get()->GetNode();
  121. m_pathPlanService = ros2Node->create_service<nav_msgs::srv::GetPlan>(
  122. m_planTopic.c_str(),
  123. [this](const GetPlanRequestPtr request, GetPlanResponsePtr response)
  124. {
  125. this->ProcessGetPlanServiceCall(request, response);
  126. });
  127. }
  128. void ROSConDemoSystemComponent::Deactivate()
  129. {
  130. m_pathPlanService.reset();
  131. ROSConDemoRequestBus::Handler::BusDisconnect();
  132. }
  133. } // namespace ROSConDemo