public void ResetEnvironment() { if (useRandomEnvironment) { // Generate environment environmentGeneration.GenerateEnvironment(); // If environmentGeneration resets debris, reinitialize the list if (environmentGeneration.createNewDebris) { InitializeDebrisList(); } } else // If random generation is disabled { // Reset debris positions foreach (Debris debris in debrisInEnvironment) { debris.transform.position = debris.GetStartPosition(); debris.GetComponent <Rigidbody>().velocity = Vector3.zero; } // Reset robot position robot.ResetPosition(); } // Update DropZone's debris list dropZone.SetDebrisList(debrisInEnvironment); if (randomizeDropZonePosition) { float xPos = Random.Range(boundsMinimumX, boundsMaximumX); float zPos = Random.Range(boundsMinimumZ, boundsMaximumZ); dropZone.transform.position = new Vector3(transform.position.x + xPos, -0.24f, transform.position.z + zPos); } // Initialize debrisInZone values foreach (Debris debris in debrisInEnvironment) { currentDebrisInZone.Add(dropZone.IsInZone(debris.transform.position)); } previousDebrisInZone = currentDebrisInZone; ResetDebrisInZone(); iterations++; }
public override void CollectObservations() { // Robot position in each environment AddVectorObs(this.transform.position - environment.transform.position); // Robot position Vector3 currentPosition = transform.position - environment.transform.position; AddVectorObs(currentPosition.x, "robot_position_x"); AddVectorObs(currentPosition.z, "robot_position_z"); // Robot rotation AddVectorObs(transform.rotation.eulerAngles.y, "robot_rotation"); // Robot velocity Vector3 localVelocity = rb.transform.InverseTransformDirection(rb.velocity); AddVectorObs(localVelocity.x, "robot_velocity_x"); AddVectorObs(localVelocity.z, "robot_velocity_z"); // Shovel position AddVectorObs(shovel.GetShovelPos(), "shovel_position"); // Comment out these observations if using PPO AddVectorObs(timesWon, "times_won"); AddVectorObs(timeElapsed, "time_elapsed"); // DropZone position and radius dropZonePosition = transform.InverseTransformPoint(dropZone.transform.position); AddVectorObs(dropZonePosition.x, "dropzone_position_x"); AddVectorObs(dropZonePosition.z, "dropzone_position_z"); AddVectorObs(dropZone.GetRadius(), "dropzone_radius"); // Distance sensor measurements float[] distances = sensors.GetMeasuredDistances(); for (int dist = 0; dist < distances.Length; dist++) { AddVectorObs(distances[dist], "sensor_measurement_" + (dist + 1)); } // Debris positions debrisInfos = vision.UpdateVision(); if (limitedObservations) { // Debris Position debrisPosition = Vector3.zero; if (debrisInfos != null && debrisInfos.Count > 0 && debrisInfos[0].transform != null) { debrisPosition = transform.InverseTransformPoint(debrisInfos[0].transform.position); } AddVectorObs(debrisPosition.x, "debris_position_x"); AddVectorObs(debrisPosition.z, "debris_position_z"); } else { for (int debris = 0; debris < debrisInfos.Count; debris++) { AddVectorObs(debrisInfos[debris].lastKnownPosition.x, "debris_" + (debris + 1) + "_position_x"); AddVectorObs(debrisInfos[debris].lastKnownPosition.z, "debris_" + (debris + 1) + "_position_z"); } for (int i = 0; i < DebrisCount - debrisInfos.Count; i++) { AddVectorObs(0f, "debris_" + (i + debrisInfos.Count + 1) + "_position_x"); AddVectorObs(0f, "debris_" + (i + debrisInfos.Count + 1) + "_position_z"); } // Simulation time AddVectorObs(timeElapsed, "simulation_time"); // Features: //Check if robot is within dropZone, Returns boolean bool isInDropZone = dropZone.IsInZone(transform.position); AddVectorObs(isInDropZone, "robot_in_dropzone"); ObsDistanceToDebris(); ObsDebrisIsInShovel(); ObsAngleToDebris(); ObsDebrisInFront(); ObsFacingDebris(); ObsGettingCloserToDebris(); // Angle to dropzone float angleToDropZone = Vector3.Angle(dropZonePosition, transform.forward); if (transform.rotation.eulerAngles.y > 180) { angleToDropZone = -angleToDropZone; } AddVectorObs(angleToDropZone, "angle_to_dropzone"); ObsDebrisToDropZone(); ObsNextAngleToDebris(); } #if UNITY_EDITOR // AUTO GENERATE RobotObservations.py if (!observationsLogged && !limitedObservations) { DirectoryInfo mlAgentsRootDir = new DirectoryInfo(Application.dataPath).Parent.Parent; string filePath = Path.Combine(mlAgentsRootDir.ToString(), "project/RobotObservations.py"); using (StreamWriter sw = new StreamWriter(filePath)) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("# This file was generated by RobotAgent.cs"); stringBuilder.AppendLine("from enum import IntEnum"); stringBuilder.AppendLine(""); stringBuilder.AppendLine(""); stringBuilder.AppendLine("class RobotObservations(IntEnum):"); stringBuilder.AppendLine(" # Accessible by self.obs.'field_name'"); for (int i = 0; i < observationNames.Count; i++) { stringBuilder.AppendLine(" " + observationNames[i] + " = " + i); } sw.Write(stringBuilder.ToString()); } } observationsLogged = true; #endif }