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;
}
}
}