Пример #1
0
 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>();
 }
Пример #2
0
        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;
        }
Пример #3
0
        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;
            }
        }