using System; using Unity.MLAgents.Sensors; namespace Unity.MLAgents.Extensions.Sensors { /// /// Settings that define the observations generated for physics-based 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) rotations 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; /// /// Whether to use model space (relative to the root body) linear velocities as observations. /// public bool UseModelSpaceLinearVelocity; /// /// Whether to use local space (relative to the parent body) linear velocities as observations. /// public bool UseLocalSpaceLinearVelocity; /// /// Whether to use joint-specific positions and angles as observations. /// public bool UseJointPositionsAndAngles; /// /// Whether to use the joint forces and torques that are applied by the solver as observations. /// public bool UseJointForces; /// /// 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 || UseModelSpaceLinearVelocity; } } /// /// Whether any local space observations are being used. /// public bool UseLocalSpace { get { return UseLocalSpaceTranslations || UseLocalSpaceRotations || UseLocalSpaceLinearVelocity; } } } 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.GetEnabledModelSpacePoses()) { if (settings.UseModelSpaceTranslations) { writer.Add(pose.position, offset); offset += 3; } if (settings.UseModelSpaceRotations) { writer.Add(pose.rotation, offset); offset += 4; } } foreach (var vel in poseExtractor.GetEnabledModelSpaceVelocities()) { if (settings.UseModelSpaceLinearVelocity) { writer.Add(vel, offset); offset += 3; } } } if (settings.UseLocalSpace) { foreach (var pose in poseExtractor.GetEnabledLocalSpacePoses()) { if (settings.UseLocalSpaceTranslations) { writer.Add(pose.position, offset); offset += 3; } if (settings.UseLocalSpaceRotations) { writer.Add(pose.rotation, offset); offset += 4; } } foreach (var vel in poseExtractor.GetEnabledLocalSpaceVelocities()) { if (settings.UseLocalSpaceLinearVelocity) { writer.Add(vel, offset); offset += 3; } } } return offset - baseOffset; } } }