def test_complex(self):
        l0 = ELink(rtb.ETS.tx(0.1), rtb.ETS.rx())
        l1 = ELink(rtb.ETS.tx(0.1), rtb.ETS.ry(), parent=l0)
        l2 = ELink(rtb.ETS.tx(0.1), rtb.ETS.rz(), parent=l1)
        l3 = ELink(rtb.ETS.tx(0.1), rtb.ETS.tx(), parent=l2)
        l4 = ELink(rtb.ETS.tx(0.1), rtb.ETS.ty(), parent=l3)
        l5 = ELink(rtb.ETS.tx(0.1), rtb.ETS.tz(), parent=l4)

        r = ERobot([l0, l1, l2, l3, l4, l5])
        q = [1, 2, 3, 1, 2, 3]

        ans = np.array([[
            -0., 0.08752679, -0.74761985, 0.41198225, 0.05872664, 0.90929743
        ],
                        [
                            1.46443609, 2.80993063, 0.52675075, -0.68124272,
                            -0.64287284, 0.35017549
                        ],
                        [
                            -1.04432, -1.80423571, -2.20308833, 0.60512725,
                            -0.76371834, -0.2248451
                        ], [1., 0., 0.90929743, 0., 0., 0.],
                        [0., 0.54030231, 0.35017549, 0., 0., 0.],
                        [0., 0.84147098, -0.2248451, 0., 0., 0.]])

        nt.assert_array_almost_equal(r.jacob0(q), ans)
    def test_init(self):
        l0 = ELink()
        l1 = ELink(parent=l0)
        r = ERobot([l0, l1], base=sm.SE3.Rx(1.3), base_link=l1)
        r.base_link = l1

        with self.assertRaises(TypeError):
            ERobot(l0, base=sm.SE3.Rx(1.3))

        with self.assertRaises(TypeError):
            ERobot([1, 2], base=sm.SE3.Rx(1.3))
    def test_jindex_fail(self):
        e1 = ELink(rtb.ETS.rz(), jindex=0)
        e2 = ELink(rtb.ETS.rz(), jindex=1, parent=e1)
        e3 = ELink(rtb.ETS.rz(), jindex=2, parent=e2)
        e4 = ELink(rtb.ETS.rz(), jindex=5, parent=e3)

        with self.assertRaises(ValueError):
            ERobot([e1, e2, e3, e4])

        e1 = ELink(rtb.ETS.rz(), jindex=0)
        e2 = ELink(rtb.ETS.rz(), jindex=1, parent=e1)
        e3 = ELink(rtb.ETS.rz(), jindex=2, parent=e2)
        e4 = ELink(rtb.ETS.rz(), parent=e3)

        with self.assertRaises(ValueError):
            ERobot([e1, e2, e3, e4])
    def test_init_elink_branched(self):
        robot = ERobot([
            ELink(ETS.rz(), name='link1'),
            ELink(ETS.tx(1) * ETS.ty(-0.5) * ETS.rz(),
                  name='link2',
                  parent='link1'),
            ELink(ETS.tx(1), name='ee_1', parent='link2'),
            ELink(ETS.tx(1) * ETS.ty(0.5) * ETS.rz(),
                  name='link3',
                  parent='link1'),
            ELink(ETS.tx(1), name='ee_2', parent='link3')
        ])
        self.assertEqual(robot.n, 3)
        for i in range(5):
            self.assertIsInstance(robot[i], ELink)
        self.assertTrue(robot[0].isrevolute)
        self.assertTrue(robot[1].isrevolute)
        self.assertTrue(robot[3].isrevolute)

        self.assertIs(robot[0].parent, None)
        self.assertIs(robot[1].parent, robot[0])
        self.assertIs(robot[2].parent, robot[1])
        self.assertIs(robot[3].parent, robot[0])
        self.assertIs(robot[4].parent, robot[3])

        self.assertEqual(robot[0].children, [robot[1], robot[3]])
        self.assertEqual(robot[1].children, [robot[2]])
        self.assertEqual(robot[2].children, [])
        self.assertEqual(robot[3].children, [robot[4]])
        self.assertEqual(robot[2].children, [])
    def test_jindex(self):
        e1 = ELink(rtb.ETS.rz(), jindex=0)
        e2 = ELink(rtb.ETS.rz(), jindex=1, parent=e1)
        e3 = ELink(rtb.ETS.rz(), jindex=2, parent=e2)
        e4 = ELink(rtb.ETS.rz(), jindex=0, parent=e3)

        # with self.assertRaises(ValueError):
        ERobot([e1, e2, e3, e4], gripper_links=e4)
    def test_init_bases(self):
        e1 = ELink()
        e2 = ELink()
        e3 = ELink(parent=e1)
        e4 = ELink(parent=e2)

        with self.assertRaises(ValueError):
            ERobot([e1, e2, e3, e4])
    def test_init_elink(self):
        link1 = ELink(ETS.rx(), name='link1')
        link2 = ELink(ETS.tx(1) * ETS.ty(-0.5) * ETS.tz(),
                      name='link2',
                      parent=link1)
        link3 = ELink(ETS.tx(1), name='ee_1', parent=link2)
        robot = ERobot([link1, link2, link3])
        self.assertEqual(robot.n, 2)
        self.assertIsInstance(robot[0], ELink)
        self.assertIsInstance(robot[1], ELink)
        self.assertIsInstance(robot[2], ELink)
        self.assertTrue(robot[0].isrevolute)
        self.assertTrue(robot[1].isprismatic)

        self.assertFalse(robot[2].isrevolute)
        self.assertFalse(robot[2].isprismatic)

        self.assertIs(robot[0].parent, None)
        self.assertIs(robot[1].parent, robot[0])
        self.assertIs(robot[2].parent, robot[1])

        self.assertEqual(robot[0].children, [robot[1]])
        self.assertEqual(robot[1].children, [robot[2]])
        self.assertEqual(robot[2].children, [])

        link1 = ELink(ETS.rx(), name='link1')
        link2 = ELink(ETS.tx(1) * ETS.ty(-0.5) * ETS.tz(),
                      name='link2',
                      parent='link1')
        link3 = ELink(ETS.tx(1), name='ee_1', parent='link2')
        robot = ERobot([link1, link2, link3])
        self.assertEqual(robot.n, 2)
        self.assertIsInstance(robot[0], ELink)
        self.assertIsInstance(robot[1], ELink)
        self.assertIsInstance(robot[2], ELink)
        self.assertTrue(robot[0].isrevolute)
        self.assertTrue(robot[1].isprismatic)

        self.assertIs(robot[0].parent, None)
        self.assertIs(robot[1].parent, robot[0])
        self.assertIs(robot[2].parent, robot[1])

        self.assertEqual(robot[0].children, [robot[1]])
        self.assertEqual(robot[1].children, [robot[2]])
        self.assertEqual(robot[2].children, [])
 def test_init(self):
     ets = tb.ETS.rz()
     robot = ERobot(ets,
                    name='myname',
                    manufacturer='I made it',
                    comment='other stuff')
     self.assertEqual(robot.name, 'myname')
     self.assertEqual(robot.manufacturer, 'I made it')
     self.assertEqual(robot.comment, 'other stuff')
    def test_init_ets(self):
        ets = rtb.ETS.tx(-0.0825) * rtb.ETS.rz() * rtb.ETS.tx(-0.0825) \
            * rtb.ETS.tz() * rtb.ETS.tx(0.1)

        robot = ERobot(ets)
        self.assertEqual(robot.n, 2)
        self.assertIsInstance(robot[0], ELink)
        self.assertIsInstance(robot[1], ELink)
        self.assertTrue(robot[0].isrevolute)
        self.assertTrue(robot[1].isprismatic)

        self.assertIs(robot[0].parent, None)
        self.assertIs(robot[1].parent, robot[0])
        self.assertIs(robot[2].parent, robot[1])

        self.assertEqual(robot[0].children, [robot[1]])
        self.assertEqual(robot[1].children, [robot[2]])
        self.assertEqual(robot[2].children, [])
    def test_init_elink_autoparent(self):
        links = [
            ELink(ETS.rx(), name='link1'),
            ELink(ETS.tx(1) * ETS.ty(-0.5) * ETS.tz(), name='link2'),
            ELink(ETS.tx(1), name='ee_1')
        ]
        robot = ERobot(links)
        self.assertEqual(robot.n, 2)
        self.assertIsInstance(robot[0], ELink)
        self.assertIsInstance(robot[1], ELink)
        self.assertIsInstance(robot[2], ELink)
        self.assertTrue(robot[0].isrevolute)
        self.assertTrue(robot[1].isprismatic)
        self.assertIs(robot[0].parent, None)
        self.assertIs(robot[1].parent, robot[0])
        self.assertIs(robot[2].parent, robot[1])

        self.assertEqual(robot[0].children, [robot[1]])
        self.assertEqual(robot[1].children, [robot[2]])
        self.assertEqual(robot[2].children, [])
    def test_invdyn(self):
        # create a 2 link robot
        # Example from Spong etal. 2nd edition, p. 260
        E = rtb.ETS
        l1 = ELink(ets=E.ry(), m=1, r=[0.5, 0, 0], name='l1')
        l2 = ELink(ets=E.tx(1) * E.ry(),
                   m=1,
                   r=[0.5, 0, 0],
                   parent=l1,
                   name='l2')
        robot = ERobot([l1, l2], name="simple 2 link")
        z = np.zeros(robot.n)

        # check gravity load
        tau = robot.rne(z, z, z) / 9.81
        nt.assert_array_almost_equal(tau, np.r_[-2, -0.5])

        tau = robot.rne([0, -pi / 2], z, z) / 9.81
        nt.assert_array_almost_equal(tau, np.r_[-1.5, 0])

        tau = robot.rne([-pi / 2, pi / 2], z, z) / 9.81
        nt.assert_array_almost_equal(tau, np.r_[-0.5, -0.5])

        tau = robot.rne([-pi / 2, 0], z, z) / 9.81
        nt.assert_array_almost_equal(tau, np.r_[0, 0])

        # check velocity terms
        robot.gravity = [0, 0, 0]
        q = [0, -pi / 2]
        h = -0.5 * sin(q[1])

        tau = robot.rne(q, [0, 0], z)
        nt.assert_array_almost_equal(tau, np.r_[0, 0] * h)

        tau = robot.rne(q, [1, 0], z)
        nt.assert_array_almost_equal(tau, np.r_[0, -1] * h)

        tau = robot.rne(q, [0, 1], z)
        nt.assert_array_almost_equal(tau, np.r_[1, 0] * h)

        tau = robot.rne(q, [1, 1], z)
        nt.assert_array_almost_equal(tau, np.r_[3, -1] * h)

        # check inertial terms

        d11 = 1.5 + cos(q[1])
        d12 = 0.25 + 0.5 * cos(q[1])
        d21 = d12
        d22 = 0.25

        tau = robot.rne(q, z, [0, 0])
        nt.assert_array_almost_equal(tau, np.r_[0, 0])

        tau = robot.rne(q, z, [1, 0])
        nt.assert_array_almost_equal(tau, np.r_[d11, d21])

        tau = robot.rne(q, z, [0, 1])
        nt.assert_array_almost_equal(tau, np.r_[d12, d22])

        tau = robot.rne(q, z, [1, 1])
        nt.assert_array_almost_equal(tau, np.r_[d11 + d12, d21 + d22])