using UnityEngine; using Unity.MLAgents.Sensors; namespace Unity.MLAgents.Extensions.Sensors { /// /// ISensor implementation that generates observations for a group of Rigidbodies or ArticulationBodies. /// public class PhysicsBodySensor : ISensor { int[] m_Shape; string m_SensorName; PoseExtractor m_PoseExtractor; PhysicsSensorSettings m_Settings; /// /// Construct a new PhysicsBodySensor /// /// /// /// public PhysicsBodySensor(Rigidbody rootBody, GameObject rootGameObject, PhysicsSensorSettings settings, string sensorName=null) { m_PoseExtractor = new RigidBodyPoseExtractor(rootBody, rootGameObject); m_SensorName = string.IsNullOrEmpty(sensorName) ? $"PhysicsBodySensor:{rootBody?.name}" : sensorName; m_Settings = settings; var numTransformObservations = settings.TransformSize(m_PoseExtractor.NumPoses); m_Shape = new[] { numTransformObservations }; } #if UNITY_2020_1_OR_NEWER public PhysicsBodySensor(ArticulationBody rootBody, PhysicsSensorSettings settings, string sensorName=null) { m_PoseExtractor = new ArticulationBodyPoseExtractor(rootBody); m_SensorName = string.IsNullOrEmpty(sensorName) ? $"ArticulationBodySensor:{rootBody?.name}" : sensorName; m_Settings = settings; var numTransformObservations = settings.TransformSize(m_PoseExtractor.NumPoses); m_Shape = new[] { numTransformObservations }; } #endif /// public int[] GetObservationShape() { return m_Shape; } /// public int Write(ObservationWriter writer) { var numWritten = writer.WritePoses(m_Settings, m_PoseExtractor); return numWritten; } /// public byte[] GetCompressedObservation() { return null; } /// public void Update() { if (m_Settings.UseModelSpace) { m_PoseExtractor.UpdateModelSpacePoses(); } if (m_Settings.UseLocalSpace) { m_PoseExtractor.UpdateLocalSpacePoses(); } } /// public void Reset() {} /// public SensorCompressionType GetCompressionType() { return SensorCompressionType.None; } /// public string GetName() { return m_SensorName; } } }