public void TestSingleBody()
        {
            var gameObj          = new GameObject();
            var articulationBody = gameObj.AddComponent <ArticulationBody>();
            var sensorComponent  = gameObj.AddComponent <ArticulationBodySensorComponent>();

            sensorComponent.RootBody = articulationBody;
            sensorComponent.Settings = new PhysicsSensorSettings
            {
                UseModelSpaceLinearVelocity = true,
                UseLocalSpaceTranslations   = true,
                UseLocalSpaceRotations      = true
            };

            var sensor = sensorComponent.CreateSensor();

            sensor.Update();
            var expected = new[]
            {
                0f, 0f, 0f,    // ModelSpaceLinearVelocity
                0f, 0f, 0f,    // LocalSpaceTranslations
                0f, 0f, 0f, 1f // LocalSpaceRotations
            };

            SensorTestHelper.CompareObservation(sensor, expected);
            Assert.AreEqual(expected.Length, sensorComponent.GetObservationShape()[0]);
        }
Example #2
0
        public void TestSingleRigidbody()
        {
            var gameObj         = new GameObject();
            var rootRb          = gameObj.AddComponent <Rigidbody>();
            var sensorComponent = gameObj.AddComponent <RigidBodySensorComponent>();

            sensorComponent.RootBody = rootRb;
            sensorComponent.Settings = new PhysicsSensorSettings
            {
                UseModelSpaceLinearVelocity = true,
                UseLocalSpaceTranslations   = true,
                UseLocalSpaceRotations      = true
            };

            var sensor = sensorComponent.CreateSensors()[0];

            sensor.Update();

            // The root body is ignored since it always generates identity values
            // and there are no other bodies to generate observations.
            var expected = new float[0];

            Assert.AreEqual(expected.Length, sensor.GetObservationSpec().Shape[0]);
            SensorTestHelper.CompareObservation(sensor, expected);
        }
Example #3
0
        public void TestSingleRigidbody()
        {
            var gameObj         = new GameObject();
            var rootRb          = gameObj.AddComponent <Rigidbody>();
            var sensorComponent = gameObj.AddComponent <RigidBodySensorComponent>();

            sensorComponent.RootBody = rootRb;
            sensorComponent.Settings = new PhysicsSensorSettings
            {
                UseModelSpaceLinearVelocity = true,
                UseLocalSpaceTranslations   = true,
                UseLocalSpaceRotations      = true
            };

            var sensor = sensorComponent.CreateSensor();

            sensor.Update();
            var expected = new[]
            {
                0f, 0f, 0f,    // ModelSpaceLinearVelocity
                0f, 0f, 0f,    // LocalSpaceTranslations
                0f, 0f, 0f, 1f // LocalSpaceRotations
            };

            SensorTestHelper.CompareObservation(sensor, expected);
        }
        public void TestNullRootBody()
        {
            var gameObj = new GameObject();

            var sensorComponent = gameObj.AddComponent <ArticulationBodySensorComponent>();
            var sensor          = sensorComponent.CreateSensor();

            SensorTestHelper.CompareObservation(sensor, new float[0]);
        }
        public void TestNullRootBody()
        {
            var gameObj = new GameObject();

            var sensorComponent = gameObj.AddComponent <RigidBodySensorComponent>();

            Assert.IsFalse(sensorComponent.IsTrivial());
            var sensor = sensorComponent.CreateSensors()[0];

            SensorTestHelper.CompareObservation(sensor, new float[0]);
        }
        public void TestBodiesWithJoint()
        {
            var rootObj       = new GameObject();
            var rootArticBody = rootObj.AddComponent <ArticulationBody>();

            var middleGamObj    = new GameObject();
            var middleArticBody = middleGamObj.AddComponent <ArticulationBody>();

            middleArticBody.AddForce(new Vector3(0f, 1f, 0f));
            middleGamObj.transform.SetParent(rootObj.transform);
            middleGamObj.transform.localPosition = new Vector3(13.37f, 0f, 0f);
            middleArticBody.jointType            = ArticulationJointType.RevoluteJoint;

            var leafGameObj   = new GameObject();
            var leafArticBody = leafGameObj.AddComponent <ArticulationBody>();

            leafGameObj.transform.SetParent(middleGamObj.transform);
            leafGameObj.transform.localPosition = new Vector3(4.2f, 0f, 0f);
            leafArticBody.jointType             = ArticulationJointType.PrismaticJoint;
            leafArticBody.linearLockZ           = ArticulationDofLock.LimitedMotion;
            leafArticBody.zDrive = new ArticulationDrive
            {
                lowerLimit = -3,
                upperLimit = 1
            };


#if UNITY_2020_2_OR_NEWER
            // ArticulationBody.velocity is read-only in 2020.1
            rootArticBody.velocity   = new Vector3(1f, 0f, 0f);
            middleArticBody.velocity = new Vector3(0f, 1f, 0f);
            leafArticBody.velocity   = new Vector3(0f, 0f, 1f);
#endif

            var sensorComponent = rootObj.AddComponent <ArticulationBodySensorComponent>();
            sensorComponent.RootBody = rootArticBody;
            sensorComponent.Settings = new PhysicsSensorSettings
            {
                UseModelSpaceTranslations = true,
                UseLocalSpaceTranslations = true,
#if UNITY_2020_2_OR_NEWER
                UseLocalSpaceLinearVelocity = true
#endif
            };

            var sensor = sensorComponent.CreateSensor();
            sensor.Update();
            var expected = new[]
            {
                // Model space
                0f, 0f, 0f,                               // Root pos
                13.37f, 0f, 0f,                           // Middle pos
                leafGameObj.transform.position.x, 0f, 0f, // Leaf pos

                // Local space
                0f, 0f, 0f,     // Root pos
                13.37f, 0f, 0f, // Attached pos
                4.2f, 0f, 0f,   // Leaf pos

#if UNITY_2020_2_OR_NEWER
                0f, 0f, 0f,  // Root vel
                -1f, 1f, 0f, // Attached vel
                0f, -1f, 1f  // Leaf vel
#endif
            };
            SensorTestHelper.CompareObservation(sensor, expected);
            Assert.AreEqual(expected.Length, sensorComponent.GetObservationShape()[0]);

            // Update the settings to only process joint observations
            sensorComponent.Settings = new PhysicsSensorSettings
            {
                UseJointForces             = true,
                UseJointPositionsAndAngles = true,
            };

            sensor = sensorComponent.CreateSensor();
            sensor.Update();

            expected = new[]
            {
                // revolute
                0f, 1f, // joint1.position (sin and cos)
                0f,     // joint1.force

                // prismatic
                0.5f, // joint2.position (interpolate between limits)
                0f,   // joint2.force
            };
            SensorTestHelper.CompareObservation(sensor, expected);
            Assert.AreEqual(expected.Length, sensorComponent.GetObservationShape()[0]);
        }
Example #7
0
        public void TestBodiesWithJoint()
        {
            var rootObj = new GameObject();
            var rootRb  = rootObj.AddComponent <Rigidbody>();

            rootRb.velocity = new Vector3(1f, 0f, 0f);

            var middleGamObj = new GameObject();
            var middleRb     = middleGamObj.AddComponent <Rigidbody>();

            middleRb.velocity = new Vector3(0f, 1f, 0f);
            middleGamObj.transform.SetParent(rootObj.transform);
            middleGamObj.transform.localPosition = new Vector3(13.37f, 0f, 0f);
            var joint = middleGamObj.AddComponent <ConfigurableJoint>();

            joint.connectedBody = rootRb;

            var leafGameObj = new GameObject();
            var leafRb      = leafGameObj.AddComponent <Rigidbody>();

            leafRb.velocity = new Vector3(0f, 0f, 1f);
            leafGameObj.transform.SetParent(middleGamObj.transform);
            leafGameObj.transform.localPosition = new Vector3(4.2f, 0f, 0f);
            var joint2 = leafGameObj.AddComponent <ConfigurableJoint>();

            joint2.connectedBody = middleRb;

            var virtualRoot = new GameObject();

            var sensorComponent = rootObj.AddComponent <RigidBodySensorComponent>();

            sensorComponent.RootBody = rootRb;
            sensorComponent.Settings = new PhysicsSensorSettings
            {
                UseModelSpaceTranslations   = true,
                UseLocalSpaceTranslations   = true,
                UseLocalSpaceLinearVelocity = true
            };
            sensorComponent.VirtualRoot = virtualRoot;

            var sensor = sensorComponent.CreateSensors()[0];

            sensor.Update();

            // Note that the VirtualRoot is ignored from the observations
            var expected = new[]
            {
                // Model space
                0f, 0f, 0f,                               // Root pos
                13.37f, 0f, 0f,                           // Middle pos
                leafGameObj.transform.position.x, 0f, 0f, // Leaf pos

                // Local space
                0f, 0f, 0f,     // Root pos
                13.37f, 0f, 0f, // Attached pos
                4.2f, 0f, 0f,   // Leaf pos

                1f, 0f, 0f,     // Root vel (relative to virtual root)
                -1f, 1f, 0f,    // Attached vel
                0f, -1f, 1f     // Leaf vel
            };

            Assert.AreEqual(expected.Length, sensor.GetObservationSpec().Shape[0]);
            SensorTestHelper.CompareObservation(sensor, expected);

            // Update the settings to only process joint observations
            sensorComponent.Settings = new PhysicsSensorSettings
            {
                UseJointPositionsAndAngles = true,
                UseJointForces             = true,
            };

            sensor = sensorComponent.CreateSensors()[0];
            sensor.Update();

            expected = new[]
            {
                0f, 0f, 0f, // joint1.force
                0f, 0f, 0f, // joint1.torque
                0f, 0f, 0f, // joint2.force
                0f, 0f, 0f, // joint2.torque
            };
            SensorTestHelper.CompareObservation(sensor, expected);
            Assert.AreEqual(expected.Length, sensor.GetObservationSpec().Shape[0]);
        }
Example #8
0
        public void TestBodiesWithJoint()
        {
            var rootObj = new GameObject();
            var rootRb  = rootObj.AddComponent <Rigidbody>();

            rootRb.velocity = new Vector3(1f, 0f, 0f);

            var middleGamObj = new GameObject();
            var middleRb     = middleGamObj.AddComponent <Rigidbody>();

            middleRb.velocity = new Vector3(0f, 1f, 0f);
            middleGamObj.transform.SetParent(rootObj.transform);
            middleGamObj.transform.localPosition = new Vector3(13.37f, 0f, 0f);
            var joint = middleGamObj.AddComponent <ConfigurableJoint>();

            joint.connectedBody = rootRb;

            var leafGameObj = new GameObject();
            var leafRb      = leafGameObj.AddComponent <Rigidbody>();

            leafRb.velocity = new Vector3(0f, 0f, 1f);
            leafGameObj.transform.SetParent(middleGamObj.transform);
            leafGameObj.transform.localPosition = new Vector3(4.2f, 0f, 0f);
            var joint2 = leafGameObj.AddComponent <ConfigurableJoint>();

            joint2.connectedBody = middleRb;


            var sensorComponent = rootObj.AddComponent <RigidBodySensorComponent>();

            sensorComponent.RootBody = rootRb;
            sensorComponent.Settings = new PhysicsSensorSettings
            {
                UseModelSpaceTranslations   = true,
                UseLocalSpaceTranslations   = true,
                UseLocalSpaceLinearVelocity = true
            };

            var sensor = sensorComponent.CreateSensor();

            sensor.Update();
            var expected = new[]
            {
                // Model space
                0f, 0f, 0f,                               // Root pos
                13.37f, 0f, 0f,                           // Middle pos
                leafGameObj.transform.position.x, 0f, 0f, // Leaf pos

                // Local space
                0f, 0f, 0f,     // Root pos
                0f, 0f, 0f,     // Root vel

                13.37f, 0f, 0f, // Attached pos
                -1f, 1f, 0f,    // Attached vel

                4.2f, 0f, 0f,   // Leaf pos
                0f, -1f, 1f     // Leaf vel
            };

            SensorTestHelper.CompareObservation(sensor, expected);
        }
        public void TestBodiesWithJoint()
        {
            var rootObj       = new GameObject();
            var rootArticBody = rootObj.AddComponent <ArticulationBody>();

            var middleGamObj    = new GameObject();
            var middleArticBody = middleGamObj.AddComponent <ArticulationBody>();

            middleArticBody.AddForce(new Vector3(0f, 1f, 0f));
            middleGamObj.transform.SetParent(rootObj.transform);
            middleGamObj.transform.localPosition = new Vector3(13.37f, 0f, 0f);
            middleArticBody.jointType            = ArticulationJointType.RevoluteJoint;

            var leafGameObj   = new GameObject();
            var leafArticBody = leafGameObj.AddComponent <ArticulationBody>();

            leafGameObj.transform.SetParent(middleGamObj.transform);
            leafGameObj.transform.localPosition = new Vector3(4.2f, 0f, 0f);
            leafArticBody.jointType             = ArticulationJointType.RevoluteJoint;

#if UNITY_2020_2_OR_NEWER
            // ArticulationBody.velocity is read-only in 2020.1
            rootArticBody.velocity   = new Vector3(1f, 0f, 0f);
            middleArticBody.velocity = new Vector3(0f, 1f, 0f);
            leafArticBody.velocity   = new Vector3(0f, 0f, 1f);
#endif

            var sensorComponent = rootObj.AddComponent <ArticulationBodySensorComponent>();
            sensorComponent.RootBody = rootArticBody;
            sensorComponent.Settings = new PhysicsSensorSettings
            {
                UseModelSpaceTranslations = true,
                UseLocalSpaceTranslations = true,
#if UNITY_2020_2_OR_NEWER
                UseLocalSpaceLinearVelocity = true
#endif
            };

            var sensor = sensorComponent.CreateSensor();
            sensor.Update();
            var expected = new[]
            {
                // Model space
                0f, 0f, 0f,                               // Root pos
                13.37f, 0f, 0f,                           // Middle pos
                leafGameObj.transform.position.x, 0f, 0f, // Leaf pos

                // Local space
                0f, 0f, 0f, // Root pos
#if UNITY_2020_2_OR_NEWER
                0f, 0f, 0f, // Root vel
#endif

                13.37f, 0f, 0f, // Attached pos
#if UNITY_2020_2_OR_NEWER
                -1f, 1f, 0f,    // Attached vel
#endif

                4.2f, 0f, 0f, // Leaf pos
#if UNITY_2020_2_OR_NEWER
                0f, -1f, 1f   // Leaf vel
#endif
            };
            SensorTestHelper.CompareObservation(sensor, expected);
        }