forked from SchapplM/robsynth-parroblib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
parroblib_create_robot_class.m
145 lines (131 loc) · 5.1 KB
/
parroblib_create_robot_class.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
% Instanz der Roboterklasse für gegebenen Roboter initialisieren
%
% Eingabe:
% Name
% Name des PKM-Robotermodells nach dem Schema "PxRRRyyGuuPvvAzz"
% p_Base
% Parameter der Gestell-Koppelpunkte. Z.B. Radius des Kreises.
% Siehe ParRob/align_base_coupling
% p_platform
% Parameter der Plattform-Koppelpunkte. Z.B. Radius des Kreises der
% Plattform-Koppelpunkte
% Siehe ParRob/align_platform_coupling
% phi_RS_EE (optional)
% Orientierung des Beinketten-Koppel-KS. Bei einigen planaren Systemen
% muss eine Drehung um Pi erfolgen, damit das Bein-Koppel-KS mit dem
% Plattform-KS übereinstimmen kann.
% Diese Drehung ist eigentlich schon in der SerRobLib gespeichert
%
% Ausgabe:
% RP [ParRob]
% Instanz der ParRob-Klasse mit den Eigenschaften und Funktionen des zu
% ladenden Roboters
%
% TODO:
% * EE-FG für 5FG-Roboter anders definieren
% * Nicht-symmetrische PKM berücksichtigen
%
% Siehe auch serroblib_create_robot_class
% Moritz Schappler, [email protected], 2018-12
% (C) Institut für Mechatronische Systeme, Universität Hannover
function RP = parroblib_create_robot_class(Name, p_Base, p_platform, phi_RS_EE)
if nargin < 4
phi_RS_EE = [];
end
assert(isa(Name,'char'), 'Eingabe Name muss Name als char sein');
%% Daten laden
[NLEG,LEG_Names,Actuation,Coupling,~,~, EE_dof0]=parroblib_load_robot(Name);
%% Instanz der seriellen Roboterklasse erstellen
% TODO: Nicht-symmetrische PKM fehlen noch
RS = serroblib_create_robot_class(LEG_Names{1});
RS.fill_fcn_handles(false);
RS.update_pkin();
% Entferne die gespeicherte EE-Transformation der seriellen Kette.
% Diese Transformation ist nur für serielle Roboter relevant. Für PKM wird
% die Transformation durch die virtuellen KS "P->Bi" erledigt.
% Nur eine Drehung um 180° ist teilweise noch notwendig. Das betrifft
% Beinketten mit nur einem rotatorischen FG.
if sum(RS.I_EE(4:6)) > 1
RS.update_EE(zeros(3,1),zeros(3,1));
end
% Manuelle Eingabe verarbeiten
if ~isempty(phi_RS_EE)
RS.update_EE([], phi_RS_EE);
end
%% Technische Gelenke in Beinkette eintragen
% Das wird nicht direkt beim Erstellen der seriellen Beinkette gemacht, da
% dort noch nicht bekannt ist, ob die serielle Kette ein serieller Roboter
% oder eine PKM-Beinkette ist. Siehe serroblib_gen_bitarrays.m.
% Laden der Seriellroboter-Datenbank und extrahieren der Information:
N = str2double(LEG_Names{1}(2));
mdllistfile_Ndof = fullfile(fileparts(which('serroblib_path_init.m')), ...
sprintf('mdl_%ddof', N), sprintf('S%d_list.mat',N));
l = load(mdllistfile_Ndof, 'Names_Ndof', 'AdditionalInfo');
I_robot = strcmp(l.Names_Ndof,LEG_Names{1});
SName_TechJoint = fliplr(regexprep(num2str(l.AdditionalInfo(I_robot,7)), ...
{'1','2','3','4','5'}, {'R','P','C','U','S'}));
RS.set_techjoints(SName_TechJoint);
%% Instanz der parallelen Roboterklasse erstellen
parroblib_addtopath({Name})
RP = ParRob(Name);
RP.create_symmetric_robot(NLEG, RS);
RP.I_EE = logical(EE_dof0); % Schon hier belegnDient zu Logik-Prüfungen in Methode initialize
RP.initialize();
% Vervollständige Koppelpunkt-Parameter mit Standard-Einstellungen
if length(p_Base) > 1
% Annahme: Bei Vorgabe mehrere Parameter hat der Benutzer alle
% notwendigen Parameter angegeben und weiß was er tut.
p_Base_all = p_Base;
elseif any(Coupling(1) == [1,2,3])
% Einziger Parameter ist der Gestell-Radius
p_Base_all = p_Base;
elseif Coupling(1) == 4
% Pyramide symmetrische Anordnung. Nehme standardmäßig halben
% Punktradius als Punktabstand und 30 Grad Steigung
p_Base_all = [p_Base; 30*pi/180];
elseif any(Coupling(1) == [5,6,7])
% Paarweiser Anordnung. Nehme standardmäßig halben Radius als
% Paar-Abstand
p_Base_all = [p_Base; p_Base/2];
elseif Coupling(1) == 8
% Pyramide mit paarweiser Anordnung. Nehme standardmäßig halben
% Punktradius als Punktabstand und 30 Grad Steigung
p_Base_all = [p_Base; p_Base/2; 30*pi/180];
elseif any(Coupling(1) == [9 10])
% Einziger Parameter ist der Gestell-Radius
p_Base_all = p_Base;
else
error('Gestell-Methode %d nicht definiert', Coupling(1));
end
RP.align_base_coupling(Coupling(1), p_Base_all);
if length(p_platform) > 1
% Annahme: Bei Vorgabe mehrere Parameter hat der Benutzer alle
% notwendigen Parameter angegeben und weiß was er tut.
p_platform_all = p_platform;
elseif any(Coupling(2) == [1,2,3])
p_platform_all = p_platform;
elseif any(Coupling(2) == [4,5,6])
p_platform_all = [p_platform; p_platform/2];
elseif Coupling(2) == 7
p_platform_all = p_platform;
elseif Coupling(2) == 8
p_platform_all = [p_platform; 0];
else
error('Plattform-Methode %d nicht definiert', Coupling(2));
end
RP.align_platform_coupling(Coupling(2), p_platform_all);
% EE-FG eintragen. Die Logik für die Zuordnung der Beinketten-FG liegt in
% der Klassenmethode. Sonderfall von PKM mit Beinketten, deren FG identisch
% zur Plattform sind, noch nicht implementiert (für 3T0R, 3T1R)
RP.update_EE_FG(logical(EE_dof0), logical(EE_dof0));
% Aktuierung eintragen
I_qa = false(RP.NJ,1);
for i = 1:NLEG
if isempty(Actuation{i})
continue
end
I_Legi = RP.I1J_LEG(i):RP.I2J_LEG(i);
I_qa(I_Legi(Actuation{i})) = true;
end
RP.update_actuation(I_qa);
RP.fill_fcn_handles(false);