Institut “Joˇzef Stefan” Ljubljana, Slovenija
yy
yy
y y
y
DP 10232
Phantom Omni driver for Matlab/Simulink
Phntom Omni gonilnik za Matlab/Simulink
Tadej Petriˇc
Ljubljana, junij 2009
Kazalo
1
2
Uvod
3
1.1
Specifikacije haptiˇcnega vmesnika Phantom Ohmni . . . . . . . . . . . . . . .
3
1.2
Zahteve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.3
Namestitev . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.4
Prevajanje izvorne kode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
Matlab/Simulink knjiˇznica
6
2.1
Omni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.2
Omni MaxForce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.3
Omni Torque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.4
Vector to matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3
Primer
14
4
Izvorna koda za gonilnik: Omni
15
2
1 Uvod
Haptiˇcni vmesniki so robotske naprave, ki omogoˇcajo interakcijo z okoljem. Okolje je lahko bodisi navidezno ali telemanipulacijsko. Haptiˇcni vmesniki so zato uporabni predvsem za naloge,
ki se obiˇcajno izvajajo roˇcno. Primer takˇsne naloge je raziskovanje ali manipuliranje objektov.
Naprava v sploˇsnem dobiva motoriˇcne ukaze od uporabnika, vraˇca pa silo oziroma navor kot
posledico interakcije z okoljem. Tem interakcijam so pogosto dodane sˇe dodatne stimulacije.
To so naprimer cˇ utila, vid in sluh. Primer haptiˇcne naprave je na sliki 1.
Slika 1: Haptiˇcna naprava podjetja SensAble, znamka Phantom Omni
1.1 Specifikacije haptiˇcnega vmesnika Phantom Ohmni
Force feedback workspace
Footprint
Weight
Range of motion
Nominal position resolution
Backdrive friction
Maximum exertable force at nominal position
Continuous exertable force (24 hrs.)
Stiffness
Inertia (apparent mass at tip)
Force feedback
Position sensing [Stylus gimbal]
Interface
Supported platforms
OpenHaptics Toolkit compatibility
3
160 W x 120 H x 70 D mm.
168 W x 203 D mm.
1.36kg
Hand movement pivoting at wrist
0.055 mm.
0.26 N
3.3 N
0.88 N
X axis > 1.26 N/mm
Y axis > 2.31 N/mm
Z axis > 1.02 N/mm
45 g
x, y, z
x, y, z (digital encoders)
Pitch, roll, yaw (linearity potentiometers)
IEEE-1394 FireWire
Intel or AMD-based PCs
Yes
1.2 Zahteve
Omni gonilnik zahteva programsko okolje Matla/Simulink ter OpenHaptic Toolkit. Preizkuˇseno
je bilo na sistemih:
• Operacijski sistem: Microsoft Windows Vista (Service Pack 1)
• MATLAB Version 7.7.0.471 (R2008b)
• OpenHaptics Toolkit 3 (Academic edition)
Ter na sistemu:
• Operacijski sistem: Microsoft Windows XP (Service Pack 2)
• MATLAB Version 7.5 (R2007b)
• OpenHaptics Toolkit 3 (Academic edition)
1.3 Namestitev
Za zadnjo verzijo gonilnikov za povezavo haptiˇcne naprave Phantom Omni in Matlab/Simulinka je potrebno poslati e-mail na naslov: tadej.petric@ijs.si, kjer boste prejeli Omni_matlabXX.zip.
Arhiv Omni_matlabXX.zip vsebuje naslednje datoteke:
•
•
•
•
•
•
•
•
..\Omni_matlab\IJS_omni.mdl
..\Omni_matlab\omni_driver.mexw32
..\Omni_matlab\omni_driver_maxforce.mexw32
..\Omni_matlab\omni_driver_torque.mexw32
..\Omni_matlab\source\omni_driver.c
..\Omni_matlab\source\omni_driver_maxforce.c
..\Omni_matlab\source\omni_driver_torque.c
..\Omni_matlab\demo\omni_demo.mdl
Datoteke je potrebno dodati v MATLAB PATH. Priloˇzena izvorna koda je pod licenco GPL,
verzije 3.
1.4 Prevajanje izvorne kode
Izvorna koda posameznega modula je v mapi ..\Omni_matlab\source\. Prevaja se z
prevajalnikom c kode (preizkuˇseno s prevajalnikom Microsoft Visual C++ 2005). Omogoˇcit je
potrebno dostop prevajalnika, do zaglavnih dokumentov v mapah:
• ..\SensAble\3DTouch\include\
• ..\SensAble\3DTouch\utilities\include\
4
in uporabiti knjiˇzice (.lib), ki se nahajajo v:
• ..\SensAble\3DTouch\lib\win32\
• ..\SensAble\3DTouch\utilities\lib\Win32\ReleaseAcademicEdition\
Kar storimo tako, da uredimo datoterko:
• ..\Users\user\AppData\Roaming\MathWorks\MATLAB\R2008b\mexopts.bat.
Vanjo dodamo poti do zaglavnih datotek v vrstico set INCLUDE in poti do knjiˇznic v vrstico
set LIB. Primer popravljenega dela datoteke mexopts.bat:
1
3
5
7
9
11
13
...
rem ********************************************************************
rem General parameters
rem ********************************************************************
set
set
set
set
set
MATLAB=%MATLAB%
VS80COMNTOOLS=%VS80COMNTOOLS%
VSINSTALLDIR=C : \ Program Files\Microsoft Visual Studio 8
VCINSTALLDIR=%VSINSTALLDIR%\VC
PATH=%VCINSTALLDIR%\BIN\;%VCINSTALLDIR%\PlatformSDK\bin;%VSINSTALLDIR%\Common7\IDE;%←VSINSTALLDIR%\SDK\v2 . 0 \ bin;%VSINSTALLDIR%\Common7\Tools;%VSINSTALLDIR%\Common7\Tools\bin←;%VCINSTALLDIR%\VCPackages;%MATLAB_BIN%;%PATH%
set INCLUDE=%VCINSTALLDIR%\ATLMFC\INCLUDE;%VCINSTALLDIR%\INCLUDE;%VCINSTALLDIR%\PlatformSDK\←INCLUDE;%VSINSTALLDIR%\SDK\v2 . 0 \ include ; c : \ program Files\sensAble\3DTouch\include \ ; c : \ ←program Files\sensAble\3DTouch\utilities\include\;%INCLUDE%
set LIB=%VCINSTALLDIR%\ATLMFC\LIB;%VCINSTALLDIR%\LIB;%VCINSTALLDIR%\PlatformSDK\lib;%←VSINSTALLDIR%\SDK\v2 . 0 \ lib;%MATLAB%\ e x t e r n \lib\win32 ; c : \ program Files\sensAble\3DTouch\←utilities\lib\Win32\ReleaseAcademicEdition \ ; c : \ program Files\sensAble\3DTouch\lib\win32←;%LIB%
set MW_TARGET_ARCH=win32
...
V enajsto vrstico smo dodali poti do zaglavnih datotek. V dvanajsto vrstico smo dodali poti do
knjiˇznic potrebnih za prevajanje gonilnika.
Sintaksa za prevajanje gonilnika v Matlabu je:
• >> mex omni_driver*.c hd.lib hdu.lib
5
2 Matlab/Simulink knjiˇznica
Matlab/Simulink knjiˇznico sestavljajo sˇtirje elementi. Pri cˇ emer so trije elementi samostojni
ˇ
gonilniki za haptiˇcno napravo Phantom Omni z razliˇcnimi lastnostmi. Cetrti
element knjiˇznice
transformira vektor v matriko. Vsi trije gonilniki so v celoti samostojni. Razlikujejo se glede
na obliko vhodnega signala. Prvi gonilnik imenovan Omni T orque ima vhodni signal velikosti
3x1. Vrednost vhodnega signala predstavlja navore na posameznih oseh haptiˇcne naprave. Gonilnika Omni in Omni M axF orce imata vhodni signal velikosti 3x1. Vrednost tega vektorja
pa predstavlja sile v karteziˇcnih koordinatah. Gonilnika se razlikujeta po omejitvi maksimalne
sile. Ta je pri gonilniku Omni nastavljena na takˇsno vrednost, ki omogoˇca 24 urno delovanje naprave Phantom Omni pod konstantno obremenitvijo. Pri gonilniku Omni M axF orce pa
je dovoljena maksimalna sila, ki jo naprava zmore. Slika 2 prikazuje knjiˇznico z gonilniki za
haptiˇcno napravo Phantom Ohmi.
(c) 2009Tadej Petric
The Jozef Stefan Institute
Slovenia
Drivers for Phantom Omni
Raw
SensAble
Raw
p
Phantom
Omni
T
M
Torque
p
p
Phantom
Omni
pd
pd
T(1x16) T(4x4)
pd
M
q
F
MaxForce
> WARNING <
But
Omni Torque
Raw
SensAble
SensAble
T
F
F
T
Phantom
Omni
Vector > Matrix
F
q
q
But
But
Omni MaxForce
Omni
Slika 2: Knjiˇznica gonilnikov za haptiˇcno napravo Phantom Omni v okolju Matlab/Simulink
S pomoˇcjo teh gonilnikov se odpirajo nove moˇznosti interakcije s programskim okoljem Matlab/Simulink. Interakcija z okoljem je lahko virtualna ali pa se interakcija z realnim okoljem
izvaja na daljavo s pomoˇcjo robota(teleoperiranje). Grafiˇcen primer teleoperacije ter povezave
med posameznimi elementi prikazuje slika 3. Sile in navori, ki se pojavijo na vrhu robota,
se prenaˇsajo preko programskega okolja Matlab/Simulink na cˇ loveˇskega operaterja s pomoˇcjo
haptiˇcne napreve.
MATLAB
Slika 3: Povezava haptiˇcne naprave, Matlab/Simulink okolja in robotske roke
6
2.1 Omni
Namen
Gonilnik haptiˇcne naprave Phantom Omni. Vhodni signal je
sila.
Knjiˇznica
Omni_matlab
Opis
Gonilnik za vzpostavitev povezave med hapriˇcno napravo
Phantom Omni in programskim paketom Matlab/Simulink.
Vhod je vektor sile F dimenzije 3x1. Vrednosti vektorja so
velikost sile v smereh karteziˇcnih koordinat. Maksimalna velikost sile je omejena na vrednost, ki jo naprava lahko oddaja 24
ur. Vrednosti sile so v enoti N .
Gonilnik sestavlja 7 izhodnih signalov v naslednjem vrstnem
redu:
Raw
p
SensAble
F
Phantom
Omni
pd
T
F
q
But
Omni
Parametri
okno
in
1. Raw velikosti 6x1. Predstavlja neobdelane vrednosti inkrementalnih senzorjev v posameznih osi.
2. p velikosti 3x1. Predstavlja poloˇzaj vrha haptiˇcne naprave v karteziˇcnih koordinatah. Vrednosti so v mm.
3. pd velikosti 3x1. Predstavlja hitrost gibanja vrha robota
v karteziˇcnih koordinatah v enoti mm/s.
4. T velikosti 16x1. Predstavlja vrednosti transformacijske
matrike 0 T6 .
5. F je dimenzij 3x1. Predstavlja vrednosti trenutne sile, ki
jo naprava oddaja v enoti N .
6. q je vektor dimenzije 6x1. Opisuje vrednosti notranjih
koordinat v enoti rad.
7. But velikosti 2x1. Predstavlja stanje stikal na roˇcaju
haptiˇcne naprave.
ˇ
korak (tipiˇcno 0.01s)
pogovorno Casovni
7
Karakteristike
•
•
•
•
Direct Feedthrough: Da
Stanja: Ne
Velikost vektorjev: Konstantna
Zero Crossing: Ne
8
2.2 Omni MaxForce
Namen
Gonilnik haptiˇcne naprave Phantom Omni. Vhodni signal je
sila.
Knjiˇznica
Omni_matlab
Opis
Gonilnik za vzpostavitev povezave med hapriˇcno napravo
Phantom Omni in programskim paketom Matlab/Simulink.
Vhod je vektor sile F dimenzije 3x1. Vrednosti vektorja so
velikost sile v smereh karteziˇcnih koordinat. Maksimalna velikost ni omejena. Vrednosti sile so v enoti N .
Gonilnik sestavlja 7 izhodnih signalov v naslednjem vrstnem
redu:
Raw
SensAble
F
p
Phantom
Omni
pd
MaxForce
F
> WARNING <
T
q
But
Omni MaxForce
Parametri
okno
in
1. Raw velikosti 6x1. Predstavlja neobdelane vrednosti inkrementalnih senzorjev v posameznih osi.
2. p velikosti 3x1. Predstavlja poloˇzaj vrha haptiˇcne naprave v karteziˇcnih koordinatah. Vrednosti so v mm.
3. pd velikosti 3x1. Predstavlja hitrost gibanja vrha robota
v karteziˇcnih koordinatah v enoti mm/s.
4. T velikosti 16x1. Predstavlja vrednosti transformacijske
matrike 0 T6 .
5. F je dimenzij 3x1. Predstavlja vrednosti trenutne sile, ki
jo naprava oddaja v enoti N .
6. q je vektor dimenzije 6x1. Opisuje vrednosti notranjih
koordinat v enoti rad.
7. But velikosti 2x1. Predstavlja stanje stikal na roˇcaju
haptiˇcne naprave.
ˇ
korak (tipiˇcno 0.01s)
pogovorno Casovni
9
Karakteristike
•
•
•
•
Opozorilo
Direct Feedthrough: Da
Stanja: Ne
Velikost vektorjev: Konstantna
Zero Crossing: Ne
Maksimalna vrednost sile ni omejena. Prekoraˇcitev maksimalne vrednosti doloˇcene za trajno obremenitev (0.88N),
lahko poˇskoduje napravo.
10
2.3 Omni Torque
Namen
Gonilnik haptiˇcne naprave Phantom Omni. Vhodni signal je
navor.
Knjiˇznica
Omni_matlab
Opis
Gonilnik za vzpostavitev povezave med hapriˇcno napravo
Phantom Omni in programskim paketom Matlab/Simulink.
Vhod je vektor navora M na glavne tri osi naprave. Vektor
je dimenzije 3x1. Maksimalna velikost je doloˇcena z parametrom vrednosti [200 350 200]. Vrednosti so v enoti mN m.
Gonilnik sestavlja 7 izhodnih signalov v naslednjem vrstnem
redu:
Raw
SensAble
p
pd
M
Phantom
Omni
T
M
Torque
q
But
Omni Torque
Parametri
okno
in
1. Raw velikosti 6x1. Predstavlja neobdelane vrednosti inkrementalnih senzorjev v posameznih osi.
2. p velikosti 3x1. Predstavlja poloˇzaj vrha haptiˇcne naprave v karteziˇcnih koordinatah. Vrednosti so v mm.
3. pd velikosti 3x1. Predstavlja hitrost gibanja vrha robota
v karteziˇcnih koordinatah v enoti mm/s.
4. T velikosti 16x1. Predstavlja vrednosti transformacijske
matrike 0 T6 .
5. M je dimenzij 3x1. Predstavlja vrednosti trenutnega navora, ki jo naprava oddaja v enoti mN m.
6. q je vektor dimenzije 6x1. Opisuje vrednosti notranjih
koordinat v enoti rad.
7. But velikosti 2x1. Predstavlja stanje stikal na roˇcaju
haptiˇcne naprave.
ˇ
korak (tipiˇcno 0.01s) in omejitev maksimalnega napogovorno Casovni
vora (tipiˇcno [200 350 200] mNm)
11
Karakteristike
•
•
•
•
Opozorilo
Direct Feedthrough: Da
Stanja: Ne
Velikost vektorjev: Konstantna
Zero Crossing: Ne
Maksimalna vrednost navora ni omejena. Uporaba navorov na
v bliˇzini maksimalnih vrednosti , lahko poˇskoduje napravo.
12
2.4 Vector to matrix
Namen
Pretvorba transformacijskega vektorja v transformacijsko matriko.
Knjiˇznica
Omni_matlab
Opis
pretvorba transformacijskega vektorja v transformacijsko matriko. Preslikava elementov je ponazorjena z:
T(1x16) T(4x4)
Vector > Matrix
Parametri
okno
in
t1
t2
t3
t4
t5
t6
t7
t8
t9
t10
t11
t12
t13
t14
t15
t16
=
t1
t2
t3
t4
t5 t9
t6 t10
t7 t11
t8 t12
t13
t14
t15
t16
ˇ
korak je podedovan po osnovnih nastavitvah simulapogovorno Casovni
cijskega koraka
13
3 Primer
Za ilustracijo delovanja gonilnika smo uporabili gonilnik Omni. Vhod v gonilnik je 3x1 vektor
sil. Predstavljen primer prikazuje enostavno regulacijo poloˇzaja vrha haptiˇcne naprave. Ob
pritisku na prvo tipko sili vrh haptiˇcne naprave proti koordinati (0,0,0). Na sliki 4 je prikazana
simulacijska shema.
RT synchro
Real −time
Synchronization
Raw
Gain
SensAble
p
−K−
Phantom
Omni
pd
MaxForce
F
F
[0 0 0 ]
Switch
Position
Scope
Scope 1
T
> WARNING <
Scope 2
Scope 3
q
Scope 4
But
Scope 5
Omni MaxForce
Selector
Scope 6
Memory 1
Memory
Polozaj (mm)
Slika 4: Simulacijska shema primera
X
Z
Stikalo
Sila (N)
Y
Cas (t)
Slika 5: Poloˇzaj vrha haptiˇcne naprave, sila na haptiˇcni napravi in stanje stikala (0-Off, 1-On)
Na sliki 5 je prikazan poloˇzaj vrha haptiˇcne naprave. Ob pritisku na stikalo se pojavi sila,
ki deluje v smeri izhodiˇscˇ ne toˇcke (0,0,0). Velikost sile je linearna glede na oddaljenost od
izhodiˇscˇ ne toˇcke (P regulator).
14
4 Izvorna koda za gonilnik: Omni
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
/*
* o m n i d r i v e r . c : M a t l a b / S i m u l i n k module f o r Phantom Ohmni
*
* −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
* −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
*
* C o p y r i g h t 1990 −2009 T a d e j P e t r i cˇ
*
* E−m a i l : t a d e j . p e t r i c @ i j s . s i
*
* I n s t i t u t ” J o zˇ e f S t e f a n ”
* $Revision : 1.0 $
*
* B u i l d w i t h : mex o m n i d r i v e r . c −l hd . l i b hdu . l i b
*
*
* −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
GPL − G e n e r a l P u b l i c L i c e n s e
*
* −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
T h i s p r o g r a m i s f r e e s o f t w a r e ; you c a n r e d i s t r i b u t e i t and / o r m o d i f y
*
i t u n d e r t h e t e r m s o f t h e GNU G e n e r a l P u b l i c L i c e n s e a s p u b l i s h e d by
*
the Free Software Foundation ; version 3 of the License .
*
*
T h i s p r o g r a m i s d i s t r i b u t e d i n t h e hope t h a t i t w i l l be u s e f u l ,
*
b u t WITHOUT ANY WARRANTY; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f
*
MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE . See t h e
*
GNU G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s .
*
*/
# d e f i n e S FUNCTION NAME o m n i d r i v e r
# d e f i n e S FUNCTION LEVEL 2
32
34
/ * Need t o i n c l u d e s i m s t r u c . h f o r t h e d e f i n i t i o n o f t h e S i m S t r u c t and
* i t s a s s o c i a t e d macro d e f i n i t i o n s . * /
# include ” simstruc . h”
36
38
40
42
44
46
/* General include */
# i n c l u d e < s t d i o . h>
# i n c l u d e < s t d l i b . h>
# i n c l u d e < a s s e r t . h>
# i n c l u d e <windows . h>
# i n c l u d e <c o n i o . h>
/ * S e n s a b l e Phantom Omni i n c l u d e * /
# i n c l u d e <HD/ hd . h>
# i n c l u d e <HDU/ h d u E r r o r . h>
# i n c l u d e <HDU/ h d u V e c t o r . h>
48
50
52
54
56
58
/ * Assumes t h e u n i t i s a PHANTOM from S e n s A b l e T e c h n o l o g i e s , I n c . * /
# d e f i n e MAX INPUT DOF
6
/ / Enkoders
# d e f i n e MAX OUTPUT DOF 3
/ / Motor ' s
/ * Maximal c o n t i n o u s f o r c e
* h d G e t D o u b l e v ( HD NOMINAL MAX CONTINUOUS FORCE , &n o m i n a l M a x C o n t i n u o u s F o r c e ) ; * /
# d e f i n e DEF nominalMaxContinuousForce 0.88
/ * G l o b a l v a r i a b l s ======================================================= * /
s t a t i c f l o a t alMotorDACValuesApp [ MAX_OUTPUT_DOF ] ;
s t a t i c f l o a t alMotorDACValuesServo [ MAX_OUTPUT_DOF ] ;
i n t buttons_y = 0 ;
60
62
/ * Number o f S−f u n c t i o n P a r a m e t e r s and m a c r o s t o a c c e s s from t h e S i m S t r u c t * /
# d e f i n e NUM PARAMS
(1)
# d e f i n e SAMPLE TIME PARAM
( ssGetSFcnParam ( S , 0) )
64
66
/ * Macros t o a c c e s s t h e S−f u n c t i o n p a r a m e t e r v a l u e s * /
# d e f i n e SAMPLE TIME
( ( r e a l T ) mxGetPr ( SAMPLE TIME PARAM ) [ 0 ] )
68
/ * F u n c t i o n : m d l C h e c k P a r a m e t e r s ========================================= * /
15
70
# d e f i n e MDL CHECK PARAMETERS
/ * Change t o # u n d e f t o remove f u n c t i o n * /
# i f d e f i n e d (MDL CHECK PARAMETERS) && d e f i n e d ( MATLAB MEX FILE )
72
74
76
78
80
82
84
86
88
90
92
94
96
98
s t a t i c v o i d mdlCheckParameters ( SimStruct * S ) {
}
# e n d i f / * MDL CHECK PARAMETERS * /
/ * F u n c t i o n : m d l I n i t i a l i z e S i z e s ===========================================
* Abstract :
The s i z e s i n f o r m a t i o n i s u s e d by S i m u l i n k t o d e t e r m i n e t h e S−f u n c t i o n
*
b l o c k ' s c h a r a c t e r i s t i c s ( number o f i n p u t s , o u t p u t s , s t a t e s , e t c . ) . * /
*
s t a t i c v o i d mdlInitializeSizes ( SimStruct * S ) {
ssSetNumSFcnParams ( S , NUM_PARAMS ) ;
i f ( ssGetNumSFcnParams ( S ) == ssGetSFcnParamsCount ( S ) ) {
#ifdef MATLAB_MEX_FILE
mdlCheckParameters ( S ) ;
#endif
i f ( ssGetErrorStatus ( S ) ! = NULL ) {
return ;
/* Error r e p o r t e d in mdlCheckParameters */
}
} else {
r e t u r n ; / * P a r a m e t e r m i s m a t c h w i l l be r e p o r t e d by S i m u l i n k * /
}
/ * None o f t h i s s−f u n c t i o n s ' s p a r a m e t e r s a r e t u n a b l e d u r i n g s i m u l a t i o n * /
{
int_T i ;
f o r ( i = 0 ; i < NUM_PARAMS ; i++) {
ssSetSFcnParamNotTunable ( S , i ) ;
}
}
100
/ * I n p u t s e t i n g s ==================================================== * /
ssSetNumSampleTimes ( S , 1 ) ;
ssSetNumInputPorts ( S , 1 ) ;
ssSetInputPortWidth ( S , 0 , 3 ) ;
ssSetInputPortDirectFeedThrough ( S , 0 , 1 ) ;
/ * O u t p u t s e t i n g s =================================================== * /
ssSetNumOutputPorts ( S , 7 ) ;
ssSetOutputPortWidth ( S , 0 , 6 ) ;
/ / Raw − e n k o d e r j i
ssSetOutputPortWidth ( S , 1 , 3 ) ;
/ / C a r t a s i a n p o s i z i o n xyz
ssSetOutputPortWidth ( S , 2 , 3 ) ;
/ / Velocity
ssSetOutputPortWidth ( S , 3 , 1 6 ) ; / / T r a n s f o r m
ssSetOutputPortWidth ( S , 4 , 3 ) ;
/ / Force
ssSetOutputPortWidth ( S , 5 , 6 ) ; / / J o i n t ' s q
ssSetOutputPortWidth ( S , 6 , 2 ) ; / / B u t t o n ' s
ssSetNumIWork ( S , 0 ) ;
ssSetNumRWork ( S , 0 ) ;
ssSetNumPWork ( S , 0 ) ;
102
104
106
108
110
112
114
116
118
}
120
/ * F u n c t i o n : m d l I n i t i a l i z e S a m p l e T i m e s =====================================
* Abstract :
This f u n c t i o n i s used to s p e c i f y t h e sample time ( s ) f o r your
*
S−f u n c t i o n . You must r e g i s t e r t h e same number o f s a m p l e t i m e s a s
*
s p e c i f i e d i n ssSetNumSampleTimes .
*
*/
s t a t i c v o i d mdlInitializeSampleTimes ( SimStruct * S ) {
ssSetSampleTime ( S , 0 , SAMPLE_TIME ) ;
ssSetOffsetTime ( S , 0 , 0 . 0 ) ;
}
122
124
126
128
130
132
134
136
138
140
# u n d e f MDL INITIALIZE CONDITIONS
/ * Change t o # u n d e f t o remove f u n c t i o n * /
/ / # d e f i n e MDL INITIALIZE CONDITIONS
/ * Change t o # u n d e f t o remove f u n c t i o n * /
# i f d e f i n e d ( MDL INITIALIZE CONDITIONS )
/ * F u n c t i o n : m d l I n i t i a l i z e C o n d i t i o n s ======================================
* Abstract :
I n t h i s f u n c t i o n , you s h o u l d i n i t i a l i z e t h e c o n t i n u o u s and d i s c r e t e
*
s t a t e s f o r y o u r S−f u n c t i o n b l o c k . The i n i t i a l s t a t e s a r e p l a c e d
*
in the s t a t e vector , ssGetContStates (S) or ssGetRealDiscStates (S) .
*
You c a n a l s o p e r f o r m any o t h e r i n i t i a l i z a t i o n a c t i v i t i e s t h a t y o u r
*
S−f u n c t i o n may r e q u i r e . Note , t h i s r o u t i n e w i l l be c a l l e d a t t h e
*
s t a r t o f s i m u l a t i o n and i f i t i s p r e s e n t i n an e n a b l e d s u b s y s t e m
*
16
142
144
146
148
150
*
*
*/
static
}
# endif
c o n f i g u r e d t o r e s e t s t a t e s , i t w i l l be c a l l when t h e e n a b l e d s u b s y s t e m
r e s t a r t s execution to r e s e t the s t a t e s .
v o i d mdlInitializeConditions ( SimStruct * S ) {
/ * MDL INITIALIZE CONDITIONS * /
/ * F u n c t i o n s f o r Phantom ================================================ * /
HDSchedulerHandle gCallbackHandle = HD_INVALID_HANDLE ;
152
154
156
158
160
162
164
166
168
170
172
174
176
178
180
182
184
186
188
190
192
194
/ * *****************************************************************
* D i r e c t l y s e t s t h e DAC v a l u e s .
***************************************************************** * /
HDCallbackCode HDCALLBACK ServoSchedulerCallback ( v o i d * pUserData ) {
HDErrorInfo error ;
hdBeginFrame ( hdGetCurrentDevice ( ) ) ;
assert ( alMotorDACValuesServo ) ;
hdSetFloatv ( HD_CURRENT_FORCE , alMotorDACValuesServo ) ;
/ / Force !
hdEndFrame ( hdGetCurrentDevice ( ) ) ;
i f ( HD_DEVICE_ERROR ( error = hdGetError ( ) ) ) {
hduPrintError ( stderr , &error , ” E r r o r w h i l e commanding DAC v a l u e s ” ) ;
memset ( alMotorDACValuesServo , 0 , s i z e o f ( f l o a t ) * MAX_OUTPUT_DOF ) ;
i f ( hduIsSchedulerError(&error ) ) {
r e t u r n HD_CALLBACK_DONE ;
}
}
r e t u r n HD_CALLBACK_CONTINUE ;
}
/ * *****************************************************************
* C o p i e s s t a t e i n t h r e a d −s a f e manner .
****************************************************************** * /
HDCallbackCode HDCALLBACK UpdateMotorDACValuesCallback ( v o i d * pUserData ) {
memcpy ( alMotorDACValuesServo , alMotorDACValuesApp , s i z e o f ( f l o a t ) * MAX_OUTPUT_DOF ) ;
r e t u r n HD_CALLBACK_DONE ;
}
/ * *****************************************************************
* Synchronization structure .
* **************************************************************** * /
typedef s t r u c t {
/ * Raw v a l u e s * /
HDlong encoder_values [ MAX_INPUT_DOF ] ;
/* Cartesian space values */
d o u b l e position [ 3 ] ;
d o u b l e velocity [ 3 ] ;
d o u b l e transform [ 1 6 ] ;
HDfloat force_xyz [ MAX_OUTPUT_DOF ] ;
/* J o i n t space values */
d o u b l e jointAngles [ 3 ] ;
d o u b l e gimbalAngles [ 3 ] ;
} DeviceStateStruct ;
196
198
200
202
204
206
208
210
212
214
/ * *******************************************************************
* Callback tha t r e t r i e v e s s t a t e .
******************************************************************** * /
HDCallbackCode HDCALLBACK GetDeviceStateCallback ( v o i d * pUserData ) {
DeviceStateStruct * pState = ( DeviceStateStruct * ) pUserData ;
/ * Raw v a l u e s * /
hdGetLongv ( HD_CURRENT_ENCODER_VALUES , pState−>encoder_values ) ;
/* Cartesian space values */
hdGetDoublev ( HD_CURRENT_POSITION , pState−>position ) ;
hdGetDoublev ( HD_CURRENT_VELOCITY , pState−>velocity ) ;
hdGetDoublev ( HD_CURRENT_TRANSFORM , pState−>transform ) ;
hdGetFloatv ( HD_CURRENT_FORCE , pState−>force_xyz ) ;
/* J o i n t space values */
hdGetDoublev ( HD_CURRENT_JOINT_ANGLES , pState−>jointAngles ) ;
hdGetDoublev ( HD_CURRENT_GIMBAL_ANGLES , pState−>gimbalAngles ) ;
buttons_y = buttons ( ) ;
r e t u r n HD_CALLBACK_DONE ;
}
17
216
218
220
222
/ * *******************************************************************
* Callback t h a t r e t r i e v e s s t a t e of buttons .
******************************************************************** * /
i n t buttons ( ) {
i n t buttons ;
hdGetIntegerv ( HD_CURRENT_BUTTONS , &buttons ) ;
r e t u r n buttons ;
}
224
226
228
230
232
234
236
# d e f i n e MDL START / * Change t o # u n d e f t o remove f u n c t i o n * /
# i f d e f i n e d (MDL START )
/ * F u n c t i o n : m d l S t a r t ==================================================
* Abstract :
T h i s f u n c t i o n i s c a l l e d o n c e a t s t a r t o f model e x e c u t i o n . I f you
*
h a v e s t a t e s t h a t s h o u l d be i n i t i a l i z e d once , t h i s i s t h e p l a c e
*
t o do i t .
*
*/
s t a t i c v o i d mdlStart ( SimStruct * S ) {
HDErrorInfo error ;
HDstring model ;
HDboolean bDone = FALSE ;
238
240
242
244
246
248
250
252
254
256
258
260
262
264
266
HHD hHD = hdInitDevice ( HD_DEFAULT_DEVICE ) ;
i f ( HD_DEVICE_ERROR ( error = hdGetError ( ) ) ) {
ssSetErrorStatus ( S , ” F a i l e d t o i n i t i a l i z e h a p t i c d e v i c e ” ) ;
return ;
}
model = hdGetString ( HD_DEVICE_MODEL_TYPE ) ;
printf ( ” I n i t i a l i z e d : %s \n ” , model ) ;
/* Schedule the h a p t i c callback function for continuously monitoring the
* b u t t o n s t a t e and r e n d e r i n g t h e a n c h o r e d s p r i n g f o r c e * /
gCallbackHandle = hdScheduleAsynchronous (
ServoSchedulerCallback , 0 , HD_MAX_SCHEDULER_PRIORITY ) ;
i f ( HD_DEVICE_ERROR ( error = hdGetError ( ) ) ) {
ssSetErrorStatus ( S , ” F a i l e d t o s c h e d u l e s e r v o l o o p c a l l b a c k ” ) ;
printf ( ” F a i l e d t o s c h e d u l e s e r v o l o o p c a l l b a c k ” ) ;
hdDisableDevice ( hHD ) ;
return ;
}
hdEnable ( HD_FORCE_OUTPUT ) ;
/* S t a r t the h a p t i c rendering loop */
hdStartScheduler ( ) ;
i f ( HD_DEVICE_ERROR ( error = hdGetError ( ) ) ) {
ssSetErrorStatus ( S , ” F a i l e d t o s t a r t s e r v o l o o p ” ) ;
printf ( ” F a i l e d t o s t a r t s e r v o l o o p ” ) ;
hdDisableDevice ( hHD ) ;
return ;
}
}
# endif /*
MDL START * /
268
270
272
274
276
278
280
282
284
286
/ * F u n c t i o n : m d l O u t p u t s ===================================================
* Abstract :
I n t h i s f u n c t i o n , you compute t h e o u t p u t s o f y o u r S−f u n c t i o n
*
block .
*
*/
s t a t i c v o i d mdlOutputs ( SimStruct * S , int_T tid ) {
int i;
HDfloat nValue [ 3 ] ;
DeviceStateStruct state ;
real_T
* y_raw = ssGetOutputPortSignal ( S , 0 ) ;
real_T
* y_position = ssGetOutputPortSignal ( S , 1 ) ;
real_T
* y_velocity = ssGetOutputPortSignal ( S , 2 ) ;
real_T
* y_transform = ssGetOutputPortSignal ( S , 3 ) ;
real_T
* y_force_xyz = ssGetOutputPortSignal ( S , 4 ) ;
real_T
* y_joint_angle = ssGetOutputPortSignal ( S , 5 ) ;
real_T
* y_butt = ssGetOutputPortSignal ( S , 6 ) ;
InputRealPtrsType u = ssGetInputPortRealSignalPtrs ( S , 0 ) ;
memset(&state , 0 , s i z e o f ( DeviceStateStruct ) ) ;
/ * Hap tic c a l l back s c h e d u l e r * /
18
288
hdScheduleSynchronous ( GetDeviceStateCallback , &state , HD_DEFAULT_SCHEDULER_PRIORITY ) ;
/ * Raw * /
f o r ( i = 0 ; i<6; i++) {
y_raw [ i ] = state . encoder_values [ i ] ;
}
/ * C a r t e s i a n s p a c e and j o i t a n g l e s * /
f o r ( i = 0 ; i<3; i++) {
y_position [ i ] = state . position [ i ] ;
y_velocity [ i ] = state . velocity [ i ] ;
y_force_xyz [ i ] = state . force_xyz [ i ] ;
y_joint_angle [ i ] = state . jointAngles [ i ] ;
y_joint_angle [ i + 3 ] = state . gimbalAngles [ i ] ;
}
/ * T r a n s f o r m a t i o n a l m a t r i x 4 x4 * /
f o r ( i = 0 ; i<16 ; i++) {
y_transform [ i ] = state . transform [ i ] ;
}
/* Button s t a t e s */
y_butt [ 0 ] = buttons_y & HD_DEVICE_BUTTON_1 ;
y_butt [ 1 ] = buttons_y & HD_DEVICE_BUTTON_2 ;
/ * L i m i t f o r c e c a l c u l a t e d t o Max c o n t i n u o u i s . T h i s i s v e r y i m p o r t a n t
* b e c a u s e f o r c e v a l u e s e x c e e d i n g t h i s v a l u e c a n damage t h e d e v i c e
* motors . */
f o r ( i = 0 ; i < 3 ; i++) {
nValue [ i ] = * u [ i ] ;
i f ( nValue [ i]> DEF_nominalMaxContinuousForce ) {
nValue [ i ] = 0 . 8 8 ; }
i f ( nValue [ i]< −DEF_nominalMaxContinuousForce ) {
nValue [ i ] = −0.88;}
alMotorDACValuesApp [ i ] = nValue [ i ] ;
}
/* Force update */
hdScheduleSynchronous ( UpdateMotorDACValuesCallback , 0 , HD_DEFAULT_SCHEDULER_PRIORITY ) ;
290
292
294
296
298
300
302
304
306
308
310
312
314
316
318
320
}
322
324
326
328
330
332
334
336
338
340
342
# u n d e f MDL UPDATE / * Change t o # u n d e f t o remove f u n c t i o n * /
# i f d e f i n e d (MDL UPDATE)
s t a t i c v o i d mdlUpdate ( SimStruct * S , int_T tid ) { }
# e n d i f / * MDL UPDATE * /
# u n d e f MDL DERIVATIVES / * Change t o # u n d e f t o remove f u n c t i o n * /
# i f d e f i n e d ( MDL DERIVATIVES )
s t a t i c v o i d mdlDerivatives ( SimStruct * S ) {}
# e n d i f / * MDL DERIVATIVES * /
/ * F u n c t i o n : m d l T e r m i n a t e =====================================================
* Abstract :
I n t h i s f u n c t i o n , you s h o u l d p e r f o r m any a c t i o n s t h a t a r e n e c e s s a r y
*
a t t h e t e r m i n a t i o n o f a s i m u l a t i o n . F o r example , i f memory was
*
a l l o c a t e d in mdlStart , t h i s i s the place to free i t .
*
*/
s t a t i c v o i d mdlTerminate ( SimStruct * S ) {
hdStopScheduler ( ) ;
hdUnschedule ( gCallbackHandle ) ;
hdDisableDevice ( hdGetCurrentDevice ( ) ) ;
}
344
346
348
350
352
/ * ============================= *
* R e q u i r e d S−f u n c t i o n t r a i l e r *
* ============================= * /
# i f d e f MATLAB MEX FILE
# include ” simulink . c”
#else
# include ” cg sfun . h”
# endif
/ * I s t h i s f i l e b e i n g c o m p i l e d a s a MEX−f i l e ? * /
/ * MEX− f i l e i n t e r f a c e mechanism * /
/ * Code g e n e r a t i o n r e g i s t r a t i o n f u n c t i o n * /
19
© Copyright 2026