ppo-Pyramids-Training / com.unity.ml-agents.extensions /Runtime /Sensors /RigidBodySensorComponent.cs
| using System.Collections.Generic; | |
| using UnityEngine; | |
| using Unity.MLAgents.Sensors; | |
| namespace Unity.MLAgents.Extensions.Sensors | |
| { | |
| /// <summary> | |
| /// Editor component that creates a PhysicsBodySensor for the Agent. | |
| /// </summary> | |
| public class RigidBodySensorComponent : SensorComponent | |
| { | |
| /// <summary> | |
| /// The root Rigidbody of the system. | |
| /// </summary> | |
| public Rigidbody RootBody; | |
| /// <summary> | |
| /// Optional GameObject used to determine the root of the poses. | |
| /// </summary> | |
| public GameObject VirtualRoot; | |
| /// <summary> | |
| /// Settings defining what types of observations will be generated. | |
| /// </summary> | |
| [] | |
| public PhysicsSensorSettings Settings = PhysicsSensorSettings.Default(); | |
| /// <summary> | |
| /// Optional sensor name. This must be unique for each Agent. | |
| /// </summary> | |
| [] | |
| public string sensorName; | |
| [] | |
| [] | |
| RigidBodyPoseExtractor m_PoseExtractor; | |
| /// <summary> | |
| /// Creates a PhysicsBodySensor. | |
| /// </summary> | |
| /// <returns></returns> | |
| public override ISensor[] CreateSensors() | |
| { | |
| var _sensorName = string.IsNullOrEmpty(sensorName) ? $"PhysicsBodySensor:{RootBody?.name}" : sensorName; | |
| return new ISensor[] { new PhysicsBodySensor(GetPoseExtractor(), Settings, _sensorName) }; | |
| } | |
| /// <summary> | |
| /// Get the DisplayNodes of the hierarchy. | |
| /// </summary> | |
| /// <returns></returns> | |
| internal IList<PoseExtractor.DisplayNode> GetDisplayNodes() | |
| { | |
| return GetPoseExtractor().GetDisplayNodes(); | |
| } | |
| /// <summary> | |
| /// Lazy construction of the PoseExtractor. | |
| /// </summary> | |
| /// <returns></returns> | |
| RigidBodyPoseExtractor GetPoseExtractor() | |
| { | |
| if (m_PoseExtractor == null) | |
| { | |
| ResetPoseExtractor(); | |
| } | |
| return m_PoseExtractor; | |
| } | |
| /// <summary> | |
| /// Reset the pose extractor, trying to keep the enabled state of the corresponding poses the same. | |
| /// </summary> | |
| internal void ResetPoseExtractor() | |
| { | |
| // Get the current enabled state of each body, so that we can reinitialize with them. | |
| Dictionary<Rigidbody, bool> bodyPosesEnabled = null; | |
| if (m_PoseExtractor != null) | |
| { | |
| bodyPosesEnabled = m_PoseExtractor.GetBodyPosesEnabled(); | |
| } | |
| m_PoseExtractor = new RigidBodyPoseExtractor(RootBody, gameObject, VirtualRoot, bodyPosesEnabled); | |
| } | |
| /// <summary> | |
| /// Toggle the pose at the given index. | |
| /// </summary> | |
| /// <param name="index"></param> | |
| /// <param name="enabled"></param> | |
| internal void SetPoseEnabled(int index, bool enabled) | |
| { | |
| GetPoseExtractor().SetPoseEnabled(index, enabled); | |
| } | |
| internal bool IsTrivial() | |
| { | |
| if (ReferenceEquals(RootBody, null)) | |
| { | |
| // It *is* trivial, but this will happen when the sensor is being set up, so don't warn then. | |
| return false; | |
| } | |
| var joints = RootBody.GetComponentsInChildren<Joint>(); | |
| if (joints.Length == 0) | |
| { | |
| if (ReferenceEquals(VirtualRoot, null) || ReferenceEquals(VirtualRoot, RootBody.gameObject)) | |
| { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| } | |
| } | |