/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #pragma once #include #include #include #include #include #include #include #include #include #include #include namespace ROS2Sensors { //! An IMU (Inertial Measurement Unit) sensor Component. //! IMUs typically include gyroscopes, accelerometers and magnetometers. This component encapsulates data //! acquisition and its publishing to ROS2 ecosystem. IMU Component requires ROS2FrameComponent. class ROS2ImuSensorComponent : public ROS2SensorComponentBase , protected ImuConfigurationRequestBus::Handler { public: AZ_COMPONENT(ROS2ImuSensorComponent, ROS2Sensors::ROS2ImuSensorComponentTypeId, SensorBaseType); ROS2ImuSensorComponent(); ROS2ImuSensorComponent(const SensorConfiguration& sensorConfiguration, const ImuSensorConfiguration& imuConfiguration); ~ROS2ImuSensorComponent() = default; static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); static void Reflect(AZ::ReflectContext* context); ////////////////////////////////////////////////////////////////////////// // Component overrides void Activate() override; void Deactivate() override; ////////////////////////////////////////////////////////////////////////// private: ////////////////////////////////////////////////////////////////////////// // ImuConfigurationRequestBus::Handler overrides void SetConfiguration(const ImuSensorConfiguration& configuration) override; const ImuSensorConfiguration GetConfiguration() override; int GetFilterSize() override; void SetFilterSize(int filterSize) override; bool GetIncludeGravity() override; void SetIncludeGravity(bool includeGravity) override; bool GetAbsoluteRotation() override; void SetAbsoluteRotation(bool absoluteRotation) override; AZ::Vector3 GetOrientationVariance() override; void SetOrientationVariance(const AZ::Vector3& orientationVariance) override; AZ::Vector3 GetAngularVelocityVariance() override; void SetAngularVelocityVariance(const AZ::Vector3& angularVelocityVariance) override; AZ::Vector3 GetLinearAccelerationVariance() override; void SetLinearAccelerationVariance(const AZ::Vector3& linearAccelerationVariance) override; ////////////////////////////////////////////////////////////////////////// void ConfigureSensor(); ImuSensorConfiguration m_imuConfiguration; std::shared_ptr> m_imuPublisher; sensor_msgs::msg::Imu m_imuMsg; AZ::Vector3 m_previousLinearVelocity = AZ::Vector3::CreateZero(); AZ::Vector3 m_acceleration{ 0 }; AZStd::deque m_filterAcceleration; AZStd::deque m_filterAngularVelocity; AZ::Matrix3x3 m_orientationCovariance = AZ::Matrix3x3::CreateZero(); AZ::Matrix3x3 m_angularVelocityCovariance = AZ::Matrix3x3::CreateZero(); AZ::Matrix3x3 m_linearAccelerationCovariance = AZ::Matrix3x3::CreateZero(); void OnPhysicsEvent(AzPhysics::SceneHandle sceneHandle); void OnImuEvent(float imuDeltaTime, AzPhysics::SceneHandle sceneHandle, float physicsDeltaTime); AZ::Matrix3x3 ToDiagonalCovarianceMatrix(const AZ::Vector3& variance); // Handle to the simulated physical body AzPhysics::SimulatedBodyHandle m_bodyHandle = AzPhysics::InvalidSimulatedBodyHandle; }; } // namespace ROS2Sensors