def substitute_to_z(self):
        # substitute all non Z joint transforms according to rules
        nchanges = 0
        out = ETS()
        for e in self:
            if e.isjoint:
                out *= e
            else:
                # do a substitution
                if e.axis == 'Rx':
                    new = ETS.ry(pi2) * ETS.rz(e.eta) * ETS.ry(-pi2)
                elif e.axis == 'Ry':
                    new = ETS.rx(-pi2) * ETS.rz(e.eta) * ETS.rx(pi2)
                elif e.axis == 'tx':
                    new = ETS.ry(pi2) * ETS.tz(e.eta) * ETS.ry(-pi2)
                elif e.axis == 'ty':
                    new = ETS.rx(-pi2) * ETS.tz(e.eta) * ETS.rx(pi2)
                else:
                    out *= e
                    continue
                out *= new
                nchanges += 1

        self.data = out.data
        return nchanges
    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_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 __init__(self, s):
        et_re = re.compile(r"([RT][xyz])\(([^)]*)\)")

        super().__init__()
        # self.data = []

        for axis, eta in et_re.findall(s):
            print(axis, eta)
            if eta[0] == 'q':
                eta = None
                unit = None
            else:
                # eta can be given as a variable or a number
                try:
                    # first attempt to create symbolic number
                    eta = sympy.Number(eta)
                except:
                    # failing that, a symbolic variable
                    eta = sympy.symbols(eta)
                if axis[0] == 'R':
                    # convert to degrees, assumed unit in input string
                    eta = sympy.simplify(eta * deg)

            if axis == 'Rx':
                e = ETS.rx(eta)
            elif axis == 'Ry':
                e = ETS.ry(eta)
            elif axis == 'Rz':
                e = ETS.rz(eta)
            elif axis == 'Tx':
                e = ETS.tx(eta)
            elif axis == 'Ty':
                e = ETS.ty(eta)
            elif axis == 'Tz':
                e = ETS.tz(eta)

            self.data.append(e.data[0])
예제 #5
0
    e = ETS.rx(45, 'deg') * ETS.tz(0.75)
    print(e)
    print(e.eval())

    from roboticstoolbox import ETS
    e = ETS.rz() * ETS.tx(1) * ETS.rz() * ETS.tx(1)
    print(e.eval([0, 0]))
    print(e.eval([90, -90], 'deg'))
    a = e.pop()
    print(a)

    from spatialmath.base import symbol

    theta, d = symbol('theta, d')

    e = ETS.rx(theta) * ETS.tx(2) * ETS.rx(45, 'deg') * ETS.ry(0.2) * ETS.ty(d)
    print(e)

    e = ETS()
    e *= ETS.rx()
    e *= ETS.tz()
    print(e)

    print(e.__str__("θ{0}"))
    print(e.__str__("θ{1}"))

    e = ETS.rx() * ETS._CONST(SE3()) * ETS.tx(0.3)
    print(e)

    l1 = 0.672
    l2 = -0.2337