RigidBodyTwistControlComponentConfig.cpp 4.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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 "RigidBodyTwistControlComponentConfig.h"
  9. #include <AzCore/Serialization/EditContext.h>
  10. #include <AzCore/Serialization/EditContextConstants.inl>
  11. namespace ROS2Controllers
  12. {
  13. void RigidBodyTwistControlComponentConfig::Reflect(AZ::ReflectContext* context)
  14. {
  15. if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  16. {
  17. serialize->Class<RigidBodyTwistControlComponentConfig>()
  18. ->Version(1)
  19. ->Field("PhysicalApi", &RigidBodyTwistControlComponentConfig::m_physicalApi)
  20. ->Field("LinerControllers", &RigidBodyTwistControlComponentConfig::m_linearControllers)
  21. ->Field("AngularControllers", &RigidBodyTwistControlComponentConfig::m_angularControllers);
  22. if (AZ::EditContext* ec = serialize->GetEditContext())
  23. {
  24. ec->Class<RigidBodyTwistControlComponentConfig>(
  25. "Rigid Body Twist Control Config", "Configuration for Rigid Body Twist Control Component")
  26. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  27. ->Attribute(AZ::Edit::Attributes::Category, "ROS2")
  28. ->DataElement(
  29. AZ::Edit::UIHandlers::ComboBox,
  30. &RigidBodyTwistControlComponentConfig::m_physicalApi,
  31. "Physical API",
  32. "API to use for applying velocities. Velocity mode directly sets velocities (limited control). Force mode uses PID "
  33. "controllers for better control.")
  34. ->EnumAttribute(PhysicalApi::Kinematic, "Kinematic - Directly sets the kinematic state of the rigid body")
  35. ->EnumAttribute(PhysicalApi::Velocity, "Velocity - Direct velocity control")
  36. ->EnumAttribute(PhysicalApi::Force, "Force - PID controlled force application per axis")
  37. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree)
  38. ->UIElement(AZ::Edit::UIHandlers::Label, "", "")
  39. ->Attribute(AZ::Edit::Attributes::NameLabelOverride, "")
  40. ->Attribute(AZ::Edit::Attributes::ValueText, &RigidBodyTwistControlComponentConfig::GetNote)
  41. ->DataElement(
  42. AZ::Edit::UIHandlers::Default,
  43. &RigidBodyTwistControlComponentConfig::m_linearControllers,
  44. "Linear Controllers",
  45. "PID controllers for linear velocities (only used in Force mode)")
  46. ->Attribute(AZ::Edit::Attributes::AutoExpand, false)
  47. ->Attribute(AZ::Edit::Attributes::Visibility, &RigidBodyTwistControlComponentConfig::GetPidControllersVisibility)
  48. ->DataElement(
  49. AZ::Edit::UIHandlers::Default,
  50. &RigidBodyTwistControlComponentConfig::m_angularControllers,
  51. "Angular Controllers",
  52. "PID controllers for angular velocities (only used in Force mode)")
  53. ->Attribute(AZ::Edit::Attributes::AutoExpand, false)
  54. ->Attribute(AZ::Edit::Attributes::Visibility, &RigidBodyTwistControlComponentConfig::GetPidControllersVisibility);
  55. }
  56. }
  57. }
  58. AZ::u32 RigidBodyTwistControlComponentConfig::GetPidControllersVisibility() const
  59. {
  60. return m_physicalApi == PhysicalApi::Force ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide;
  61. }
  62. AZStd::string RigidBodyTwistControlComponentConfig::GetNote() const
  63. {
  64. if (m_physicalApi == PhysicalApi::Force)
  65. {
  66. return "User defined PID controllers for linear and angular velocities. "
  67. "These controllers are used to apply forces to the rigid body in order to achieve the desired twist control.";
  68. }
  69. if (m_physicalApi == PhysicalApi::Velocity)
  70. {
  71. return "Direct velocity control, with collision response. "
  72. "The rigid body will be set to the desired linear and angular velocities."
  73. "This mode limits the usage of odometry and IMU components";
  74. }
  75. if (m_physicalApi == PhysicalApi::Kinematic)
  76. {
  77. return "Kinematic mode directly sets the kinematic state of the rigid body. "
  78. "No collision response is applied, and the rigid body will not be affected by physics simulation.";
  79. }
  80. return "";
  81. }
  82. } // namespace ROS2Controllers