using System; using Unity.MLAgents.Sensors; namespace Unity.MLAgents.Extensions.Sensors { [Serializable] public struct PhysicsSensorSettings { /// /// Whether to use model space (relative to the root body) translations as observations. /// public bool UseModelSpaceTranslations; /// /// Whether to use model space (relative to the root body) rotatoins as observations. /// public bool UseModelSpaceRotations; /// /// Whether to use local space (relative to the parent body) translations as observations. /// public bool UseLocalSpaceTranslations; /// /// Whether to use local space (relative to the parent body) translations as observations. /// public bool UseLocalSpaceRotations; /// /// Creates a PhysicsSensorSettings with reasonable default values. /// /// public static PhysicsSensorSettings Default() { return new PhysicsSensorSettings { UseModelSpaceTranslations = true, UseModelSpaceRotations = true, }; } /// /// Whether any model space observations are being used. /// public bool UseModelSpace { get { return UseModelSpaceTranslations || UseModelSpaceRotations; } } /// /// Whether any local space observations are being used. /// public bool UseLocalSpace { get { return UseLocalSpaceTranslations || UseLocalSpaceRotations; } } /// /// The number of floats needed to represent a given number of transforms. /// /// /// public int TransformSize(int numTransforms) { int obsPerTransform = 0; obsPerTransform += UseModelSpaceTranslations ? 3 : 0; obsPerTransform += UseModelSpaceRotations ? 4 : 0; obsPerTransform += UseLocalSpaceTranslations ? 3 : 0; obsPerTransform += UseLocalSpaceRotations ? 4 : 0; return numTransforms * obsPerTransform; } } internal static class ObservationWriterPhysicsExtensions { /// /// Utility method for writing a PoseExtractor to an ObservationWriter. /// /// /// /// /// The offset into the ObservationWriter to start writing at. /// The number of observations written. public static int WritePoses(this ObservationWriter writer, PhysicsSensorSettings settings, PoseExtractor poseExtractor, int baseOffset = 0) { var offset = baseOffset; if (settings.UseModelSpace) { foreach (var pose in poseExtractor.ModelSpacePoses) { if(settings.UseModelSpaceTranslations) { writer.Add(pose.position, offset); offset += 3; } if (settings.UseModelSpaceRotations) { writer.Add(pose.rotation, offset); offset += 4; } } } if (settings.UseLocalSpace) { foreach (var pose in poseExtractor.LocalSpacePoses) { if(settings.UseLocalSpaceTranslations) { writer.Add(pose.position, offset); offset += 3; } if (settings.UseLocalSpaceRotations) { writer.Add(pose.rotation, offset); offset += 4; } } } return offset - baseOffset; } } }