Esempio n. 1
0
        public override void CollectObservations(VectorSensor sensor)
        {
            sensor.AddObservation(m_Ship.Throttle);
            sensor.AddObservation(m_Ship.Pitch);
            sensor.AddObservation(m_Ship.Roll);
            sensor.AddObservation(m_Ship.NormPosition);
            sensor.AddObservation(m_Ship.NormOrientation);
            sensor.AddObservation(Normalization.Sigmoid(m_Ship.LocalSpin));
            sensor.AddObservation(Normalization.Sigmoid(m_Ship.LocalVelocity));

            Vector3 pos = m_Ship.transform.position;
            Vector3 fwd = m_Ship.transform.forward;

            m_Targets.Clear();

            foreach (var target in m_SensorComponent.GetDetectedGameObjects(m_TargetTag))
            {
                Vector3 delta = target.transform.position - pos;
                if (Vector3.Angle(fwd, delta) < m_TargetFollowAngle &&
                    delta.sqrMagnitude < m_TargetFollowDistanceSqr)
                {
                    m_Targets.Add(target);
                }
            }
        }
Esempio n. 2
0
        public override void CollectObservations(VectorSensor sensor)
        {
            if (opponent == null)
            {
                return;
            }

            actionStep = 0;
            Transform rt          = root.transform;
            Vector3   inclination = new Vector3(rt.right.y, rt.up.y, rt.forward.y);

            sensor.AddObservation(inclination);
            sensor.AddObservation(Normalization.Sigmoid(CrntForce, 0.25f) * 2f - 1f);
            CrntForce = 0;
            // Observe positions relative to this agent's root (hips).
            // All vectors are localized (root.InverseTransformVector(v))
            // and normalized using a sigmoid function. The idea here is
            // that small value changes matter less the farther away an
            // observed object is, or the faster it is moving.
            // The sigmoid function provides a higher value resolution
            // for small vectors and asymptotes towards -1/+1.
            Vector3 rootPos = rt.position;

            // This agent.
            // Hips position = root position. Since all positions are relative to
            // this agent's root, we don't observe this, as it will always be 0/0/0.
            AddVectorObs(sensor, Hips.Velocity);
            AddVectorObs(sensor, Hips.AngularVelocity);
            AddVectorObs(sensor, Head.Position - rootPos);
            AddVectorObs(sensor, Head.Velocity);
            AddVectorObs(sensor, LeftHand.Position - rootPos);
            AddVectorObs(sensor, LeftHand.Velocity);
            AddVectorObs(sensor, RightHand.Position - rootPos);
            AddVectorObs(sensor, RightHand.Velocity);
            AddVectorObs(sensor, LeftFoot.Position - rootPos);
            AddVectorObs(sensor, LeftFoot.Velocity);
            AddVectorObs(sensor, RightFoot.Position - rootPos);
            AddVectorObs(sensor, RightFoot.Velocity);
            // Opponent agent.
            AddVectorObs(sensor, opponent.Hips.Position - rootPos);
            AddVectorObs(sensor, opponent.Hips.Velocity);
            AddVectorObs(sensor, opponent.Hips.AngularVelocity);
            AddVectorObs(sensor, opponent.Head.Position - rootPos);
            AddVectorObs(sensor, opponent.Head.Velocity);
            AddVectorObs(sensor, opponent.LeftHand.Position - rootPos);
            AddVectorObs(sensor, opponent.LeftHand.Velocity);
            AddVectorObs(sensor, opponent.RightHand.Position - rootPos);
            AddVectorObs(sensor, opponent.RightHand.Velocity);
            AddVectorObs(sensor, opponent.LeftFoot.Position - rootPos);
            AddVectorObs(sensor, opponent.LeftFoot.Velocity);
            AddVectorObs(sensor, opponent.RightFoot.Position - rootPos);
            AddVectorObs(sensor, opponent.RightFoot.Velocity);
            // Normalized rotations (wrapped eulers / 180).
            sensor.AddObservation(GetJointObs());
            // Normalized distances.
            sensor.AddObservation(GetRayObs());

            // TODO AddObservation DownStepCount / MaxDownSteps
        }
Esempio n. 3
0
 public override void CollectObservations(VectorSensor sensor)
 {
     sensor.AddObservation(m_Car.Throttle);
     sensor.AddObservation(m_Car.Steering);
     sensor.AddObservation(m_Car.Gyro);
     sensor.AddObservation(Normalization.Sigmoid(m_Car.LocalSpin));
     sensor.AddObservation(Normalization.Sigmoid(m_Car.LocalVelocity));
 }
Esempio n. 4
0
        public override void CollectObservations(VectorSensor sensor)
        {
            sensor.AddObservation(m_Ship.Throttle);
            sensor.AddObservation(m_Ship.Pitch);
            sensor.AddObservation(m_Ship.Roll);
            sensor.AddObservation(m_Ship.NormPosition);
            sensor.AddObservation(m_Ship.NormOrientation);
            sensor.AddObservation(Normalization.Sigmoid(m_Ship.LocalSpin));
            sensor.AddObservation(Normalization.Sigmoid(m_Ship.LocalVelocity));


            Vector3 shipPos = m_Ship.transform.position;
            Vector3 shipFwd = m_Ship.transform.forward;

            if (HasTargetLock(shipPos, shipFwd, out Vector3 targetPos) && CanShoot())
            {
                GunPosition  = shipPos + shipFwd;
                GunDirection = (targetPos - shipPos).normalized;

                m_Bullets.Shoot(this);
                m_ShotTime = Time.time;
            }
        }
Esempio n. 5
0
 private void AddVectorObs(VectorSensor sensor, Vector3 v)
 {
     sensor.AddObservation(Normalization.Sigmoid(root.Localize(v)));
 }
        public override void CollectObservations(VectorSensor sensor)
        {
            // Sort by relative lead.
            foreach (BikeAgent other in allAgents)
            {
                other.Shared.TmpDelta = Mathf.DeltaAngle(
                    Shared.CrntPos.PosDeg, other.Shared.CrntPos.PosDeg);
            }
            Array.Sort(allAgents);

            int index = Array.IndexOf(allAgents, this);

            if (index < crntRank)
            {
                AddReward(loosingRankPenalty);
            }
            crntRank = index;

            // Filter closest.
            observedAgents.Clear();
            observedAgents.AddRange(allAgents);
            observedAgents.RemoveAt(index);
            while (observedAgents.Count > observedAgentsCount)
            {
                if (Mathf.Abs(observedAgents[0].Shared.TmpDelta) >
                    Mathf.Abs(observedAgents[observedAgents.Count - 1].Shared.TmpDelta))
                {
                    observedAgents.RemoveAt(0);
                }
                else
                {
                    observedAgents.RemoveAt(observedAgents.Count - 1);
                }
            }

            foreach (BikeAgent other in observedAgents)
            {
                bool ignore = Mathf.Abs(other.Shared.TmpDelta) > maxAgentDistance;
                sensor.AddObservation(Mathf.Clamp(
                                          other.Shared.TmpDelta / maxAgentDistance, -1f, 1f));
                sensor.AddObservation(ignore ? 0 : other.Shared.NormXPos);
                // Relative velocity in local space.
                sensor.AddObservation(ignore ? Vector3.zero : Normalization
                                      .Sigmoid(Bike.Localize(other.Shared.Velocity - Bike.Body.velocity)));
            }

            // Bike physics.
            Vector3 pV3            = Position;
            Vector3 fwd            = Bike.transform.forward;
            Vector3 locVelocity    = Bike.Localize(Bike.Body.velocity);
            Vector3 locAngVelocity = Bike.Localize(Bike.Body.angularVelocity);

            sensor.AddObservation(Mathf.Clamp(locVelocity.z / 30f - 1f, -1f, 1f)); // 0/+60
            sensor.AddObservation(Normalization.Sigmoid(locVelocity.x));
            sensor.AddObservation(Normalization.Sigmoid(locVelocity.y));
            sensor.AddObservation(Normalization.Sigmoid(locAngVelocity));
            sensor.AddObservation(crntPos.GetNormLocalXPos(pV3));
            sensor.AddObservation(crntPos.GetNormLocalYAngle(fwd));
            sensor.AddObservation(Bike.Inclination);
            if (isDiscrete)
            {
                sensor.AddObservation(Bike.Throttle);
                sensor.AddObservation(Bike.Steer);
            }

            // Modify boost.
            crntSeg = track.Segments.FindClosest(pV3, crntSeg);
            if (track.NormLanes.Contains(crntSeg.GetNormLocalXPos(pV3), out index))
            {
                crntBoost = Mathf.Clamp(crntBoost +
                                        crntSeg.BoostValues[index] * boostStrength, -1f, 1f);
            }
            sensor.AddObservation(crntBoost);

            // Look ahead.
            index = crntSeg.Index;
            foreach (int offset in lookAheadBoost)
            {
                Segment seg = track.Segments[index + offset];
                sensor.AddObservation(seg.BoostValues);
            }
            foreach (int offset in lookAheadCurve)
            {
                Segment seg   = track.Segments[index + offset];
                float   curve = Vector3.SignedAngle(crntSeg.TangentXZ, seg.TangentXZ, Vector3.up);
                sensor.AddObservation(curve / maxCurve);
                float slope = seg.PosV3.y - crntSeg.PosV3.y;
                sensor.AddObservation(slope / maxSlope);
            }
        }
Esempio n. 7
0
 /// <inheritdoc/>
 public override void CollectObservations(VectorSensor sensor)
 {
     sensor.AddObservation(m_Car.NormSteer);
     sensor.AddObservation(Normalization.Sigmoid(m_Car.LocalSpin));
     sensor.AddObservation(Normalization.Sigmoid(m_Car.LocalVelocity));
 }