${Name}SampleComponent.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // {BEGIN_LICENSE}
  2. /*
  3. * Copyright (c) Contributors to the Open 3D Engine Project.
  4. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  5. *
  6. * SPDX-License-Identifier: Apache-2.0 OR MIT
  7. *
  8. */
  9. // {END_LICENSE}
  10. #include "${Name}SampleComponent.h"
  11. #include <AzCore/Component/ComponentApplicationBus.h>
  12. #include <AzCore/Component/TransformBus.h>
  13. #include <AzCore/Math/Transform.h>
  14. #include <AzCore/Serialization/EditContext.h>
  15. #include <AzCore/Serialization/SerializeContext.h>
  16. #include <imgui/imgui.h>
  17. #include <ROS2/ROS2Bus.h>
  18. #include <ROS2/Utilities/ROS2Conversions.h>
  19. namespace ${SanitizedCppName}
  20. {
  21. ${SanitizedCppName}SampleComponent::${SanitizedCppName}SampleComponent()
  22. {
  23. m_goalTopicConfiguration.m_topic = "/goal_pose";
  24. m_goalTopicConfiguration.m_type = "geometry_msgs::msg::PoseStamped";
  25. }
  26. void ${SanitizedCppName}SampleComponent::Activate()
  27. {
  28. auto ros2Node = ROS2::ROS2Interface::Get()->GetNode();
  29. m_goalPublisher = ros2Node->create_publisher<geometry_msgs::msg::PoseStamped>(m_goalTopicConfiguration.m_topic.data(), m_goalTopicConfiguration.GetQoS());
  30. ImGui::ImGuiUpdateListenerBus::Handler::BusConnect();
  31. }
  32. void ${SanitizedCppName}SampleComponent::Deactivate()
  33. {
  34. m_goalPublisher.reset();
  35. ImGui::ImGuiUpdateListenerBus::Handler::BusDisconnect();
  36. }
  37. void ${SanitizedCppName}SampleComponent::Reflect(AZ::ReflectContext* context)
  38. {
  39. if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  40. {
  41. serialize->Class<${SanitizedCppName}SampleComponent, AZ::Component>()
  42. ->Version(1)
  43. ->Field("goals", &${SanitizedCppName}SampleComponent::m_goalEntities)
  44. ->Field("goalMessageTopic", &${SanitizedCppName}SampleComponent::m_goalTopicConfiguration);
  45. if (AZ::EditContext* ec = serialize->GetEditContext())
  46. {
  47. ec->Class<${SanitizedCppName}SampleComponent>("${SanitizedCppName}SampleComponent", "A sample component that sends goal")
  48. ->ClassElement(AZ::Edit::ClassElements::EditorData, "${SanitizedCppName}SampleComponent")
  49. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game"))
  50. ->Attribute(AZ::Edit::Attributes::Category, "Sample ROS2 Project")
  51. ->DataElement(AZ::Edit::UIHandlers::Default, &${SanitizedCppName}SampleComponent::m_goalEntities, "Goals", "Entities goals")
  52. ->DataElement(
  53. AZ::Edit::UIHandlers::Default,
  54. &${SanitizedCppName}SampleComponent::m_goalTopicConfiguration,
  55. "Topic for goal message",
  56. "Configuration for ROS2 topic to send goal message to");
  57. }
  58. }
  59. }
  60. void ${SanitizedCppName}SampleComponent::OnImGuiUpdate()
  61. {
  62. ImGui::Begin("${SanitizedCppName}SampleComponent");
  63. for (const auto& entityId : m_goalEntities)
  64. {
  65. AZStd::string entityName;
  66. AZ::ComponentApplicationBus::BroadcastResult(entityName, &AZ::ComponentApplicationRequests::GetEntityName, entityId);
  67. const AZStd::string buttonName = AZStd::string::format("Send goal %s", entityName.c_str());
  68. if (ImGui::Button(buttonName.c_str()))
  69. {
  70. AZ::Transform transform;
  71. AZ::TransformBus::EventResult(transform, entityId, &AZ::TransformBus::Events::GetWorldTM);
  72. geometry_msgs::msg::PoseStamped poseStamped;
  73. poseStamped.header.frame_id = "odom";
  74. poseStamped.pose = ROS2::ROS2Conversions::ToROS2Pose(transform);
  75. m_goalPublisher->publish(poseStamped);
  76. }
  77. }
  78. ImGui::End();
  79. }
  80. } // namespace ${SanitizedCppName}