From bc0c6e281a359b7a678a0a684ea6b5bca9c1c33b Mon Sep 17 00:00:00 2001
From: Valenza Florian <fvalenza@laas.fr>
Date: Fri, 29 Apr 2016 12:27:25 +0200
Subject: [PATCH] [Python] Added test of exposition of spatial classes

---
 python/bindings_SE3.py             | 96 ++++++++++++++++++++++++++++++
 python/bindings_force.py           | 74 +++++++++++++++++++++++
 python/bindings_frame.py           | 44 ++++++++++++++
 python/bindings_geometry_object.py | 47 +++++++++++++++
 python/bindings_inertia.py         | 89 +++++++++++++++++++++++++++
 python/bindings_motion.py          | 72 ++++++++++++++++++++++
 python/tests.py                    |  6 ++
 7 files changed, 428 insertions(+)
 create mode 100644 python/bindings_SE3.py
 create mode 100644 python/bindings_force.py
 create mode 100644 python/bindings_frame.py
 create mode 100644 python/bindings_geometry_object.py
 create mode 100644 python/bindings_inertia.py
 create mode 100644 python/bindings_motion.py

diff --git a/python/bindings_SE3.py b/python/bindings_SE3.py
new file mode 100644
index 000000000..d8430ecfc
--- /dev/null
+++ b/python/bindings_SE3.py
@@ -0,0 +1,96 @@
+import unittest
+import pinocchio as se3
+import numpy as np
+from pinocchio.utils import eye,zero,rand
+
+ones = lambda n: np.matrix(np.ones([n, 1] if isinstance(n, int) else n), np.double)
+
+class TestSE3Bindings(unittest.TestCase):
+
+    v3zero = zero(3)
+    v3ones = ones(3)
+    m3zero = zero([3,3])
+    m3ones = eye(3)
+    m4ones = eye(4)
+
+    def test_identity(self):
+        transform = se3.SE3.Identity()
+        self.assertTrue(np.allclose(self.v3zero,transform.translation))
+        self.assertTrue(np.allclose(self.m3ones, transform.rotation))
+        self.assertTrue(np.allclose(self.m4ones, transform.homogeneous))
+        transform.setRandom()
+        transform.setIdentity()
+        self.assertTrue(np.allclose(self.m4ones, transform.homogeneous))
+
+    def test_get_translation(self):
+        transform = se3.SE3.Identity()
+        self.assertTrue(np.allclose(transform.translation, self.v3zero))
+
+    def test_get_rotation(self):
+        transform = se3.SE3.Identity()
+        self.assertTrue(np.allclose(transform.rotation, self.m3ones))
+
+    def test_set_translation(self):
+        transform = se3.SE3.Identity()
+        transform.translation = self.v3ones
+        self.assertFalse(np.allclose(transform.translation, self.v3zero))
+        self.assertTrue(np.allclose(transform.translation, self.v3ones))
+
+    def test_set_rotation(self):
+        transform = se3.SE3.Identity()
+        transform.rotation = self.m3zero
+        self.assertFalse(np.allclose(transform.rotation, self.m3ones))
+        self.assertTrue(np.allclose(transform.rotation, self.m3zero))
+
+    def test_homogeneous(self):
+        amb = se3.SE3.Random()
+        aMb = amb.homogeneous
+        self.assertTrue(np.allclose(aMb[0:3,0:3], amb.rotation)) # bloc 33 = rotation de amb
+        self.assertTrue(np.allclose(aMb[0:3,3], amb.translation)) # derniere colonne = translation de amb
+
+    def test_inverse(self):
+        amb = se3.SE3.Random()
+        aMb = amb.homogeneous
+        bma = amb.inverse()
+        self.assertTrue(np.allclose(np.linalg.inv(aMb), bma.homogeneous))
+
+    def test_internal_product(self):
+        amb = se3.SE3.Random()
+        aMb = amb.homogeneous
+        bmc = se3.SE3.Random()
+        bMc = bmc.homogeneous
+        amc = amb*bmc
+        cma = amc.inverse()
+        aMc = amc.homogeneous
+
+        self.assertTrue(np.allclose(aMb*bMc, aMc))
+        self.assertTrue(np.allclose(cma.homogeneous,np.linalg.inv(aMc)))
+
+    def test_point_action(self):
+        amb = se3.SE3.Random()
+        aMb = amb.homogeneous
+        p_homogeneous = rand(4)
+        p_homogeneous[3] = 1
+        p = p_homogeneous[0:3].copy()
+
+        # act
+        self.assertTrue(np.allclose(amb.act_point(p),(aMb*p_homogeneous)[0:3]))
+
+        # actinv
+        bMa = np.linalg.inv(aMb)
+        bma = amb.inverse()
+        self.assertTrue(np.allclose(bma.act_point(p), (bMa * p_homogeneous)[0:3]))
+
+
+    def test_action_matrix(self):
+        amb = se3.SE3.Random()
+        bmc = se3.SE3.Random()
+        amc = amb * bmc
+        aXb = amb.action
+        bXc = bmc.action
+        aXc = aXb * bXc
+        self.assertTrue(np.allclose(amc.action,aXc))
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/python/bindings_force.py b/python/bindings_force.py
new file mode 100644
index 000000000..6e8a75c81
--- /dev/null
+++ b/python/bindings_force.py
@@ -0,0 +1,74 @@
+import unittest
+import pinocchio as se3
+import numpy as np
+from pinocchio.utils import eye,zero,rand
+
+ones = lambda n: np.matrix(np.ones([n, 1] if isinstance(n, int) else n), np.double)
+
+class TestForceBindings(unittest.TestCase):
+
+    v3zero = zero(3)
+    v6zero = zero(6)
+    v3ones = ones(3)
+    m3zero = zero([3,3])
+    m3ones = eye(3)
+    m4ones = eye(4)
+
+    def test_zero_getters(self):
+        f = se3.Force.Zero()
+        self.assertTrue(np.allclose(self.v3zero, f.linear))
+        self.assertTrue(np.allclose(self.v3zero, f.angular))
+        self.assertTrue(np.allclose(self.v6zero, f.vector))
+
+    def test_setRandom(self):
+        f = se3.Force.Zero()
+        f.setRandom()
+        self.assertFalse(np.allclose(self.v3zero, f.linear))
+        self.assertFalse(np.allclose(self.v3zero, f.angular))
+        self.assertFalse(np.allclose(self.v6zero, f.vector))
+
+    def test_setZero(self):
+        f = se3.Force.Zero()
+        f.setRandom()
+        f.setZero()
+        self.assertTrue(np.allclose(self.v3zero, f.linear))
+        self.assertTrue(np.allclose(self.v3zero, f.angular))
+        self.assertTrue(np.allclose(self.v6zero, f.vector))
+
+    def test_set_linear(self):
+        f = se3.Force.Zero()
+        lin =  rand(3)  # TODO np.matrix([1,2,3],np.double) OR np.matrix( np.array([1,2,3], np.double), np.double)
+        f.linear = lin
+        self.assertTrue(np.allclose(f.linear, lin))
+
+    def test_set_angular(self):
+        f = se3.Force.Zero()
+        ang = rand(3)
+        f.angular = ang
+        self.assertTrue(np.allclose(f.angular, ang))
+
+    def test_set_vector(self):
+        f = se3.Force.Zero()
+        vec =  rand(6)
+        f.vector = vec
+        self.assertTrue(np.allclose(f.vector, vec))
+
+    def test_internal_sums(self):
+        f1 = se3.Force.Random()
+        f2 = se3.Force.Random()
+        self.assertTrue(np.allclose((f1+f2).vector,f1.vector + f2.vector))
+        self.assertTrue(np.allclose((f1 - f2).vector, f1.vector - f2.vector))
+
+    def test_se3_action(self):
+        f = se3.Force.Random()
+        m = se3.SE3.Random()
+        self.assertTrue(np.allclose((m * f).vector, np.linalg.inv(m.action.T) * f.vector))
+        self.assertTrue(np.allclose((m.actInv(f)).vector, m.action.T * f.vector))
+        v = se3.Motion.Random()
+        f = se3.Force(np.vstack([v.vector[3:], v.vector[:3]]))
+        self.assertTrue(np.allclose((v ** f).vector, zero(6)))
+
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/python/bindings_frame.py b/python/bindings_frame.py
new file mode 100644
index 000000000..8367945e6
--- /dev/null
+++ b/python/bindings_frame.py
@@ -0,0 +1,44 @@
+import unittest
+import pinocchio as se3
+import numpy as np
+from pinocchio.utils import eye,zero,rand
+from pinocchio.robot_wrapper import RobotWrapper
+
+ones = lambda n: np.matrix(np.ones([n, 1] if isinstance(n, int) else n), np.double)
+
+class TestFrameBindings(unittest.TestCase):
+
+    v3zero = zero(3)
+    v6zero = zero(6)
+    v3ones = ones(3)
+    m3zero = zero([3,3])
+    m6zero = zero([6,6])
+    m3ones = eye(3)
+    m4ones = eye(4)
+
+    hint_list = ["/local/fvalenza/devel/src/pinocchio/models", "wrong/hint"] # hint list
+    robot = RobotWrapper("/local/fvalenza/devel/src/pinocchio/models/romeo.urdf", hint_list, se3.JointModelFreeFlyer())
+
+    def test_name_get_set(self):
+        f = self.robot.model.operational_frames[1]
+        self.assertTrue(f.name == 'r_sole_joint')
+        f.name = 'new_sole_joint'
+        self.assertTrue(f.name == 'new_sole_joint')
+
+    def test_parent_get_set(self):
+        f = self.robot.model.operational_frames[1]
+        self.assertTrue(f.parent == 13)
+        f.parent = 5
+        self.assertTrue(f.parent == 5)
+
+    def test_placement_get_set(self):
+        m = se3.SE3(self.m3ones, np.array([0,0,-0.0684],np.double))
+        new_m = se3.SE3(rand([3,3]), rand(3))
+        f = self.robot.model.operational_frames[1]
+        self.assertTrue(np.allclose(f.placement.homogeneous,m.homogeneous))
+        f.placement = new_m
+        self.assertTrue(np.allclose(f.placement.homogeneous , new_m.homogeneous))
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/python/bindings_geometry_object.py b/python/bindings_geometry_object.py
new file mode 100644
index 000000000..9bbf74eca
--- /dev/null
+++ b/python/bindings_geometry_object.py
@@ -0,0 +1,47 @@
+import unittest
+import pinocchio as se3
+import numpy as np
+from pinocchio.utils import eye,zero,rand
+from pinocchio.robot_wrapper import RobotWrapper
+
+ones = lambda n: np.matrix(np.ones([n, 1] if isinstance(n, int) else n), np.double)
+
+class TestGeometryObjectBindings(unittest.TestCase):
+
+    v3zero = zero(3)
+    v6zero = zero(6)
+    v3ones = ones(3)
+    m3zero = zero([3,3])
+    m6zero = zero([6,6])
+    m3ones = eye(3)
+    m4ones = eye(4)
+
+    hint_list = ["/local/fvalenza/devel/src/pinocchio/models", "wrong/hint"] # hint list
+    robot = RobotWrapper("/local/fvalenza/devel/src/pinocchio/models/romeo.urdf", hint_list, se3.JointModelFreeFlyer())
+
+    def test_name_get_set(self):
+        col = self.robot.geometry_model.collision_objects[1]
+        self.assertTrue(col.name == '') # See in parser why name is empty
+        col.name = 'new_collision_name'
+        self.assertTrue(col.name == 'new_collision_name')
+
+    def test_parent_get_set(self):
+        col = self.robot.geometry_model.collision_objects[1]
+        self.assertTrue(col.parent == 3)
+        col.parent = 5
+        self.assertTrue(col.parent == 5)
+
+    def test_placement_get_set(self):
+        m = se3.SE3(self.m3ones, self.v3zero)
+        new_m = se3.SE3(rand([3,3]), rand(3))
+        col = self.robot.geometry_model.collision_objects[1]
+        self.assertTrue(np.allclose(col.placement.homogeneous,m.homogeneous))
+        col.placement = new_m
+        self.assertTrue(np.allclose(col.placement.homogeneous , new_m.homogeneous))
+
+    def test_meshpath_get(self):
+        col = self.robot.geometry_model.collision_objects[1]
+        self.assertTrue(col.mesh_path == '/local/fvalenza/devel/src/pinocchio/models/meshes/romeo/collision/LHipPitch.dae')
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/python/bindings_inertia.py b/python/bindings_inertia.py
new file mode 100644
index 000000000..9c0062235
--- /dev/null
+++ b/python/bindings_inertia.py
@@ -0,0 +1,89 @@
+import unittest
+import pinocchio as se3
+import numpy as np
+from pinocchio.utils import eye,zero,rand
+
+ones = lambda n: np.matrix(np.ones([n, 1] if isinstance(n, int) else n), np.double)
+
+class TestInertiaBindings(unittest.TestCase):
+
+    v3zero = zero(3)
+    v6zero = zero(6)
+    v3ones = ones(3)
+    m3zero = zero([3,3])
+    m6zero = zero([6,6])
+    m3ones = eye(3)
+    m4ones = eye(4)
+
+    def test_zero_getters(self):
+        Y = se3.Inertia.Zero()
+        self.assertTrue(Y.mass == 0)
+        self.assertTrue(np.allclose(self.v3zero, Y.lever))
+        self.assertTrue(np.allclose(self.m3zero, Y.inertia))
+
+    def test_identity_getters(self):
+        Y = se3.Inertia.Identity()
+        self.assertTrue(Y.mass == 1)
+        self.assertTrue(np.allclose(self.v3zero, Y.lever))
+        self.assertTrue(np.allclose(self.m3ones, Y.inertia))
+
+
+    def test_setRandom(self):
+        Y = se3.Inertia.Identity()
+        Y.setRandom()
+        self.assertFalse(Y.mass == 1)
+        self.assertFalse(np.allclose(self.v3zero, Y.lever))
+        self.assertFalse(np.allclose(self.m3ones, Y.inertia))
+
+    def test_setZero(self):
+        Y = se3.Inertia.Zero()
+        Y.setRandom()
+        Y.setZero()
+        self.assertTrue(Y.mass == 0)
+        self.assertTrue(np.allclose(self.v3zero, Y.lever))
+        self.assertTrue(np.allclose(self.m3zero, Y.inertia))
+
+    def test_setIdentity(self):
+        Y = se3.Inertia.Zero()
+        Y.setIdentity()
+        self.assertTrue(Y.mass == 1)
+        self.assertTrue(np.allclose(self.v3zero, Y.lever))
+        self.assertTrue(np.allclose(self.m3ones, Y.inertia))
+
+    def test_set_mass(self):
+        Y = se3.Inertia.Zero()
+        Y.mass = 10
+        self.assertTrue(np.allclose(Y.mass, 10))
+
+    def test_set_lever(self):
+        Y = se3.Inertia.Zero()
+        lev = rand(3)
+        Y.lever = lev
+        self.assertTrue(np.allclose(Y.lever, lev))
+
+    def test_set_inertia(self):
+        Y = se3.Inertia.Zero()
+        iner = rand([3,3])
+        iner = (iner + iner.T) / 2.  # Symmetrize the matrix
+        vec6_iner = np.matrix([iner[0,0],iner[0,1], iner[1,1], iner[0,2], iner[1,2], iner[2,2]], np.double)
+        Y.inertia = vec6_iner
+        self.assertTrue(np.allclose(Y.inertia, iner))
+
+    def test_internal_sums(self):
+        Y1 = se3.Inertia.Random()
+        Y2 = se3.Inertia.Random()
+        Y = Y1 + Y2
+        self.assertTrue(np.allclose(Y1.matrix() + Y2.matrix(), Y.matrix()))
+
+    def test_se3_action(self):
+        m = se3.SE3.Random()
+        Y = se3.Inertia.Random()
+        v = se3.Motion.Random()
+        self.assertTrue(np.allclose((Y * v).vector, Y.matrix() * v.vector))
+        self.assertTrue(np.allclose((m * Y).matrix(), m.inverse().action.T * Y.matrix() * m.inverse().action))
+        self.assertTrue(np.allclose((m.actInv(Y)).matrix(), m.action.T * Y.matrix() * m.action))
+
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/python/bindings_motion.py b/python/bindings_motion.py
new file mode 100644
index 000000000..794fd5e41
--- /dev/null
+++ b/python/bindings_motion.py
@@ -0,0 +1,72 @@
+import unittest
+import pinocchio as se3
+import numpy as np
+from pinocchio.utils import eye,zero,rand
+
+ones = lambda n: np.matrix(np.ones([n, 1] if isinstance(n, int) else n), np.double)
+
+class TestMotionBindings(unittest.TestCase):
+
+    v3zero = zero(3)
+    v6zero = zero(6)
+    v3ones = ones(3)
+    m3zero = zero([3,3])
+    m3ones = eye(3)
+    m4ones = eye(4)
+
+    def test_zero_getters(self):
+        v = se3.Motion.Zero()
+        self.assertTrue(np.allclose(self.v3zero, v.linear))
+        self.assertTrue(np.allclose(self.v3zero, v.angular))
+        self.assertTrue(np.allclose(self.v6zero, v.vector))
+
+    def test_setRandom(self):
+        v = se3.Motion.Zero()
+        v.setRandom()
+        self.assertFalse(np.allclose(self.v3zero, v.linear))
+        self.assertFalse(np.allclose(self.v3zero, v.angular))
+        self.assertFalse(np.allclose(self.v6zero, v.vector))
+
+    def test_setZero(self):
+        v = se3.Motion.Zero()
+        v.setRandom()
+        v.setZero()
+        self.assertTrue(np.allclose(self.v3zero, v.linear))
+        self.assertTrue(np.allclose(self.v3zero, v.angular))
+        self.assertTrue(np.allclose(self.v6zero, v.vector))
+
+    def test_set_linear(self):
+        v = se3.Motion.Zero()
+        lin =  rand(3)  # TODO np.matrix([1,2,3],np.double) OR np.matrix( np.array([1,2,3], np.double), np.double)
+        v.linear = lin
+        self.assertTrue(np.allclose(v.linear, lin))
+
+    def test_set_angular(self):
+        v = se3.Motion.Zero()
+        ang = rand(3)
+        v.angular = ang
+        self.assertTrue(np.allclose(v.angular, ang))
+
+    def test_set_vector(self):
+        v = se3.Motion.Zero()
+        vec = rand(6)
+        v.vector = vec
+        self.assertTrue(np.allclose(v.vector, vec))
+
+    def test_internal_sums(self):
+        v1 = se3.Motion.Random()
+        v2 = se3.Motion.Random()
+        self.assertTrue(np.allclose((v1+v2).vector,v1.vector + v2.vector))
+        self.assertTrue(np.allclose((v1 - v2).vector, v1.vector - v2.vector))
+
+    def test_se3_action(self):
+        m = se3.SE3.Random()
+        v = se3.Motion.Random()
+        self.assertTrue(np.allclose((m * v).vector, m.action * v.vector))
+        self.assertTrue(np.allclose((m.actInv(v)).vector, np.linalg.inv(m.action) * v.vector))
+        self.assertTrue(np.allclose((v ** v).vector, zero(6)))
+
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/python/tests.py b/python/tests.py
index 78173ce84..156c8f2aa 100755
--- a/python/tests.py
+++ b/python/tests.py
@@ -3,6 +3,12 @@
 import unittest, sys
 
 from bindings import TestSE3  # noqa
+from bindings_SE3 import TestSE3Bindings
+from bindings_force import TestForceBindings
+from bindings_motion import TestMotionBindings
+from bindings_inertia import TestInertiaBindings
+from bindings_frame import TestFrameBindings
+from bindings_geometry_object import TestGeometryObjectBindings
 from explog import TestExpLog  # noqa
 from model import TestModel  # noqa
 from rpy import TestRPY  # noqa
-- 
GitLab