1
+ """
2
+ @author: Peter Corke
3
+ """
4
+
5
+ import numpy .testing as nt
6
+ import numpy as np
7
+ import roboticstoolbox as rp
8
+ import spatialmath as sm
9
+ import unittest
10
+
11
+ class TestRobot (unittest .TestCase ):
12
+
13
+ def test_links (self ):
14
+
15
+ l0 = rp .PrismaticDH ()
16
+ l1 = rp .RevoluteDH ()
17
+ l2 = rp .PrismaticDH ()
18
+ l3 = rp .RevoluteDH ()
19
+
20
+ r0 = rp .DHRobot ([l0 , l1 , l2 , l3 ])
21
+
22
+ self .assertIs (r0 [0 ], l0 )
23
+ self .assertIs (r0 [1 ], l1 )
24
+ self .assertIs (r0 [2 ], l2 )
25
+ self .assertIs (r0 [3 ], l3 )
26
+
27
+
28
+ def test_ikine (self ):
29
+ panda = rp .models .DH .Panda ()
30
+ q = np .array ([0 , - 0.3 , 0 , - 2.2 , 0 , 2.0 , np .pi / 4 ])
31
+ T = panda .fkine (q )
32
+ Tt = sm .SE3 ([T , T ])
33
+
34
+ l0 = rp .RevoluteDH (d = 2.0 )
35
+ l1 = rp .PrismaticDH (theta = 1.0 )
36
+ l2 = rp .PrismaticDH (theta = 1 , qlim = [0 , 2 ])
37
+ r0 = rp .DHRobot ([l0 , l1 ])
38
+ r1 = rp .DHRobot ([l0 , l2 ])
39
+
40
+ qr = [0.0342 , 1.6482 , 0.0312 , 1.2658 , - 0.0734 , 0.4836 , 0.7489 ]
41
+
42
+ qa , success , err = panda .ikine (T )
43
+ qa2 , success , err = panda .ikine (Tt )
44
+ qa3 , success , err = panda .ikine (Tt , q0 = np .zeros ((2 , 7 )))
45
+ qa4 , success , err = panda .ikine (T , q0 = np .zeros (7 ))
46
+
47
+ # Untested
48
+ qa5 , success , err = r0 .ikine (
49
+ T .A , mask = [1 , 1 , 0 , 0 , 0 , 0 ],
50
+ transpose = 5 , ilimit = 5 )
51
+ qa5 , success , err = r0 .ikine (T , mask = [1 , 1 , 0 , 0 , 0 , 0 ])
52
+ qa6 , success , err = r0 .ikine (T , mask = [1 , 1 , 0 , 0 , 0 , 0 ], ilimit = 1 )
53
+ qa7 , success , err = r1 .ikine (
54
+ T , mask = [1 , 1 , 0 , 0 , 0 , 0 ],
55
+ ilimit = 1 , search = True , slimit = 1 )
56
+
57
+ nt .assert_array_almost_equal (qa , qr , decimal = 4 )
58
+ nt .assert_array_almost_equal (qa2 [0 , :], qr , decimal = 4 )
59
+ nt .assert_array_almost_equal (qa2 [1 , :], qr , decimal = 4 )
60
+ nt .assert_array_almost_equal (qa3 [1 , :], qr , decimal = 4 )
61
+ nt .assert_array_almost_equal (qa4 , qr , decimal = 4 )
62
+
63
+ with self .assertRaises (ValueError ):
64
+ panda .ikine (Tt , q0 = np .zeros (7 ))
65
+
66
+ with self .assertRaises (ValueError ):
67
+ r0 .ikine (T )
68
+
69
+ with self .assertRaises (ValueError ):
70
+ r0 .ikine (
71
+ T , mask = [1 , 1 , 0 , 0 , 0 , 0 ], ilimit = 1 ,
72
+ search = True , slimit = 1 )
73
+
74
+ def test_ikcon (self ):
75
+ panda = rp .models .DH .Panda ()
76
+ q = np .array ([0 , - 0.3 , 0 , - 2.2 , 0 , 2.0 , np .pi / 4 ])
77
+ T = panda .fkine (q )
78
+ Tt = sm .SE3 ([T , T , T ])
79
+
80
+ qr = [7.69161412e-04 , 9.01409257e-01 , - 1.46372859e-02 ,
81
+ - 6.98000000e-02 , 1.38978915e-02 , 9.62104811e-01 ,
82
+ 7.84926515e-01 ]
83
+
84
+ qa , success , err = panda .ikcon (T .A , q0 = np .zeros (7 ))
85
+ qa2 , success , err = panda .ikcon (Tt )
86
+ qa3 , _ , _ = panda .ikcon (Tt , q0 = np .zeros ((3 , 7 )))
87
+
88
+ nt .assert_array_almost_equal (qa , qr , decimal = 4 )
89
+ nt .assert_array_almost_equal (qa2 [0 , :], qr , decimal = 4 )
90
+ nt .assert_array_almost_equal (qa2 [1 , :], qr , decimal = 4 )
91
+ nt .assert_array_almost_equal (qa3 [0 , :], qr , decimal = 4 )
92
+ nt .assert_array_almost_equal (qa3 [1 , :], qr , decimal = 4 )
93
+
94
+ def test_ikunc (self ):
95
+ puma = rp .models .DH .Puma560 ()
96
+ q = puma .qr
97
+ T = puma .fkine (q )
98
+ Tt = sm .SE3 ([T , T ])
99
+
100
+ q0 , _ , _ = puma .ikunc (Tt )
101
+ q1 , success , _ = puma .ikunc (T .A )
102
+ q2 , success , _ = puma .ikunc (T , ilimit = 1 )
103
+
104
+ nt .assert_array_almost_equal (
105
+ T .A - puma .fkine (q0 [0 , :]).A , np .zeros ((4 , 4 )), decimal = 4 )
106
+
107
+ nt .assert_array_almost_equal (
108
+ T .A - puma .fkine (q0 [1 , :]).A , np .zeros ((4 , 4 )), decimal = 4 )
109
+
110
+ nt .assert_array_almost_equal (
111
+ T .A - puma .fkine (q1 ).A , np .zeros ((4 , 4 )), decimal = 4 )
112
+
113
+ if __name__ == '__main__' :
114
+ unittest .main ()
115
+ # pytest.main(['tests/test_SerialLink.py'])
0 commit comments