namespace Unity.MLAgents.Sensors
{
///
/// The compression setting for visual/camera observations.
///
public enum SensorCompressionType
{
///
/// No compression. Data is preserved as float arrays.
///
None,
///
/// PNG format. Data will be stored in binary format.
///
PNG
}
///
/// The semantic meaning of the sensor.
///
public enum SensorType
{
///
/// Sensor represents an agent's observation.
///
Observation,
///
/// Sensor represents an agent's task/goal parameterization.
///
Goal,
///
/// Sensor represents one or more reward signals.
///
Reward
}
///
/// Sensor interface for generating observations.
///
public interface ISensor
{
///
/// Returns the size of the observations that will be generated.
/// For example, a sensor that observes the velocity of a rigid body (in 3D) would return
/// new {3}. A sensor that returns an RGB image would return new [] {Height, Width, 3}
///
/// Size of the observations that will be generated.
int[] GetObservationShape();
///
/// Write the observation data directly to the .
/// Note that this (and ) may
/// be called multiple times per agent step, so should not mutate any internal state.
///
/// Where the observations will be written to.
/// The number of elements written.
int Write(ObservationWriter writer);
///
/// Return a compressed representation of the observation. For small observations,
/// this should generally not be implemented. However, compressing large observations
/// (such as visual results) can significantly improve model training time.
///
/// Compressed observation.
byte[] GetCompressedObservation();
///
/// Update any internal state of the sensor. This is called once per each agent step.
///
void Update();
///
/// Resets the internal state of the sensor. This is called at the end of an Agent's episode.
/// Most implementations can leave this empty.
///
void Reset();
///
/// Return the compression type being used. If no compression is used, return
/// .
///
/// Compression type used by the sensor.
SensorCompressionType GetCompressionType();
///
/// Get the name of the sensor. This is used to ensure deterministic sorting of the sensors
/// on an Agent, so the naming must be consistent across all sensors and agents.
///
/// The name of the sensor.
string GetName();
///
/// Get the semantic meaning of the sensor, i.e. whether it is an observation or other type
/// of data to be sent to the Agent.
///
/// The type of the sensor.
SensorType GetSensorType();
}
///
/// Helper methods to be shared by all classes that implement .
///
public static class SensorExtensions
{
///
/// Get the total number of elements in the ISensor's observation (i.e. the product of the
/// shape elements).
///
///
///
public static int ObservationSize(this ISensor sensor)
{
var shape = sensor.GetObservationShape();
var count = 1;
foreach (var dim in shape)
{
count *= dim;
}
return count;
}
}
}