public void SetupMujoco() { _mujocoController = GetComponent <MujocoController>(); _numJoints = _mujocoController.qpos.Count; _numSensors = _mujocoController.MujocoSensors.Count; _jointSize = 2; _sensorSize = 1; _sensorOffset = _jointSize * _numJoints; _observationSize = _sensorOffset + (_sensorSize * _numSensors); _observation1D = Enumerable.Repeat <float>(0f, _observationSize).ToArray(); Low = _internalLow = Enumerable.Repeat <float>(float.MinValue, _observationSize).ToArray(); High = _internalHigh = Enumerable.Repeat <float>(float.MaxValue, _observationSize).ToArray(); for (int j = 0; j < _numJoints; j++) { var offset = j * _jointSize; _internalLow[offset + 0] = -5; //-10; _internalHigh[offset + 0] = 5; //10; _internalLow[offset + 1] = -5; //-500; _internalHigh[offset + 1] = 5; //500; // _internalLow[offset+2] = -5;//-500; // _internalHigh[offset+3] = 5;//500; } for (int j = 0; j < _numSensors; j++) { var offset = _sensorOffset + (j * _sensorSize); _internalLow[offset + 0] = -1; //-10; _internalHigh[offset + 0] = 1; //10; } _lastSenorState = Enumerable.Repeat <float>(0f, _numSensors).ToList(); _phase = 0; _phaseBonus = 0f; _nextPhaseBonus = 0f; this.brain = GameObject.Find("MujocoBrain").GetComponent <Brain>(); }
public override void AgentAction(float[] vectorAction, string textAction) { Actions = vectorAction .Select(x => Mathf.Clamp(x, -3, 3f) / 3) .ToList(); //KillJointPower(new []{"shoulder", "elbow"}); // HACK // if (ShowMonitor) // Monitor.Log("actions", _actions, MonitorType.hist); for (int i = 0; i < _mujocoController.MujocoJoints.Count; i++) { var inp = (float)Actions[i]; MujocoController.ApplyAction(_mujocoController.MujocoJoints[i], inp); } _mujocoController.UpdateFromExternalComponent(); var done = _terminate();//Terminate_HopperOai(); if (done) { Done(); //var reward = 0; var reward = -1f; SetReward(reward); } if (!IsDone()) { var reward = _stepReward();//StepReward_OaiHopper(); SetReward(reward); } _footHitTerrain = false; _nonFootHitTerrain = false; }
public override void AgentReset() { Monitor.SetActive(true); _mujocoController = GetComponent <MujocoController>(); _mujocoController.MujocoJoints = null; _mujocoController.MujocoSensors = null; // var joints = this.GetComponentsInChildren<Joint>().ToList(); // foreach (var item in joints) // Destroy(item.gameObject); var rbs = this.GetComponentsInChildren <Rigidbody>().ToList(); foreach (var item in rbs) { if (item != null) { DestroyImmediate(item.gameObject); } } Resources.UnloadUnusedAssets(); var mujocoSpawner = this.GetComponent <MujocoUnity.MujocoSpawner>(); if (mujocoSpawner != null) { mujocoSpawner.MujocoXml = MujocoXml; } mujocoSpawner.SpawnFromXml(); SetupMujoco(); _mujocoController.UpdateFromExternalComponent(); switch (ActorId) { case "a_oai_walker2d-v0": _stepReward = StepReward_OaiWalker; _terminate = Terminate_OnNonFootHitTerrain; _observations = Observations_Default; break; case "a_dm_walker-v0": _stepReward = StepReward_DmWalker; _terminate = Terminate_OnNonFootHitTerrain; _observations = Observations_Default; break; case "a_oai_hopper-v0": _stepReward = StepReward_OaiHopper; _terminate = Terminate_HopperOai; _observations = Observations_Default; break; case "a_oai_humanoid-v0": _stepReward = StepReward_OaiHumanoidRun; // _stepReward = StepReward_OaiHumanoidStand; // _stepReward = StepReward_OaiHumanoidPureRun; _terminate = Terminate_OnNonFootHitTerrain; _observations = Observations_Humanoid; _bodyParts["pelvis"] = GetComponentsInChildren <Rigidbody>().FirstOrDefault(x => x.name == "butt"); _bodyParts["shoulders"] = GetComponentsInChildren <Rigidbody>().FirstOrDefault(x => x.name == "torso1"); _bodyParts["head"] = GetComponentsInChildren <Rigidbody>().FirstOrDefault(x => x.name == "head"); _bodyParts["left_thigh"] = GetComponentsInChildren <Rigidbody>().FirstOrDefault(x => x.name == "left_thigh1"); _bodyParts["right_thigh"] = GetComponentsInChildren <Rigidbody>().FirstOrDefault(x => x.name == "right_thigh1"); _bodyParts["left_uarm"] = GetComponentsInChildren <Rigidbody>().FirstOrDefault(x => x.name == "left_uarm1"); _bodyParts["right_uarm"] = GetComponentsInChildren <Rigidbody>().FirstOrDefault(x => x.name == "right_uarm1"); break; case "a_ant-v0": case "a_oai_half_cheetah-v0": default: throw new NotImplementedException(); } // set body part directions foreach (var bodyPart in _bodyParts) { var name = bodyPart.Key; var rigidbody = bodyPart.Value; // find up var focalPoint = rigidbody.position; focalPoint.x += 10; var focalPointRotation = rigidbody.rotation; focalPointRotation.SetLookRotation(focalPoint - rigidbody.position); _bodyPartsToFocalRoation[name] = focalPointRotation; } }