q؎A2lH{0bL,|uᩅߞ1mnti%8t_QA=R(j T>}.Fχ!
qN~WIegYAr!rKw D.q@9ݦC̸>84:0J\N\ч#?'F^|uF1}0GC>5D(WDx_=jAyl%q|"8Br))vӠWppOo;anJ^͞c!D*\Ɨ<H(ǧ,ChÉ3zd_=3rzyݴ6u:bD݂!:;1k8vqZnX^1nw1_V^r'5F#iHLN~v@VL?`:mn#"p7<?8VW:T
rtѯ2
oOl]g,tHlnx xVMlW:6 iD%p@
ā*UH8qlj6`Ur@8
*Bz( !wiB"bfޏkoMNzYfvf~3o>,]<9X+bi
V*ti>(z0ͷ}4^9a
vB\\Jדw KD]>+*ka?(|[(H5?~a$/tDkSۑC@{FnDnBnFny@DԞaCȟV?yc@{SaW¾ ǓI'̙X.%${>x;'ӲِqZְINz*UJ4bFSυz?P袊Ђ*{X2BU4Xw䒬,@Sn6
h\*lRfn&'' :1ssS݀ g 'O_ϡA-}T7,QIi3 QN*/)nW받u!ߏVк|bl"GIYZ'J~U-_gJ~9/J~UW-iYwBIY{0T,
g9yq^熴B;XWF&P{kU>\sd>"r<\-T.Uı}]
S$ev:5ï77YSx7E}")_WXbvD$vT[ۋ(pc`˲n8(vxF9MdHN!: gA4S?x?'~ hbt:^`ʇ&zkSr8; O0mP5
>E+f:fSͦjRR}ȡś+JFxVkA3vS~X?HIA9)=bI&5nOҪڃA?@
A/"
Ei{3K6Mt=-;y7E+^Cm*cIgY{8Ha3/y/M]'&t@C`嗂R3zs9Q{rמl6tC&h®)"%%8ݏWF`c%~C^>Z>~ZR~(uBK4ύv
* Uc[[-+
|J^~c[o%q&'~KOV*sG%18NEqsSJ1^6hDmvJ|4 sr*9KRcFv֢κj~)cZ+j13)2ػm8ZS
é!kO̽6LRO]MCz;GlfI`zrzqz$;΅ޛxKu Co(V8Ct+e?w^zRi^ixU8~ʉe$RrMmτ#Qn($HJq(J.r6y3
-ߪ%|Kj|yv#ޔe/n|ާpܷ0+ìf;tg5
-r^{DvLջn~f+BS̖?tƂqH8?uG;nWrpO>كfBj_E|(=
1IF0lrڠ@c6'ېiy&*fm0HACd*-NxWMlSG}vg8iϫNTj
Jr@ :qc,)Q*UPEԪjpi+CH=$h%ڪ@3^LJ*cM~onn\o|UPG{A@,)5j5um)Z@6 Y5 +0<[ACꄀ[5.ϩ}^ى·^f曝rF!*^23z~WpYȡ#prhz Ր_$cѓ']U A^Eny@
TL;r`=rs#o@ިmmƧr"EdnNKwN*kr`x.?~*Yc֮2^rr@.{~2H\oN@LI,+HsX "&9KHu1NaQ/®\C*fK+CŘ*iGaI3TőL&'9l1F5/@)|p)@~/~gAP9;bBOP
)(O]r'_GŲ$`Þ0i_olE1ߴZ53w5C pUN1w?jSO̶qã(ئm_Okwپ&Rqԗ^ݟw-Jș^E;ՈGNTbQY5~Xv/ ++}ak|}{\v7>nWT#fAE0%f՜{m8MT1oΌ;G|Ha9r$r[QSËD;Sxq|'O#+πؤ@eἋ?l?`
|$v}xxĸ#w6m
RmtM <1T.SYB&Nߕ{qR}L<|J
;ti61Ƨ!/8_jC˂D0&O%ub hQtcJIBz@9:'m'3?ƩhAGcZQdXƳm|ɏ3г|>mD16xXKlTe>翏{w赉 4YaR*vA$,2Cm&&4 ōDA.hB!;,nisuʝ s^yLO~S`rf5Kj/WU]]-;O:i
)B0A)(Uܯ/Ԟ:_gup
%{`?G ٱ7sϏ뵥n菓%koi{SIb8)&77*mhN-Azor/1sVtr9r
Ӆb08y(S&-iJϏ{2ll2N&l^;ݦPc%LJ+rx¬T
[sMbƻs<6C\IZO.i|Sg`(S|u|dZpM^ތJv)Wza;Kɷ@Ar~oL?ӐM[ڷ8bl~QACɓ7AshXñBC|.Ԩ;MمR8|[9?&8uvӇ}b6ȇG15sV d<:(}9ף}ql7c{x&p+1BF6gW;K6^.߮kg_
֯PxWMlE~IJ(!,JRhpS%Ғ zh@I6.$v~FBS
H=U\8@"@J(ĩQ@pZۼ7;qxMQ<7͛7Wr~{(C#$5h/EAwQ9:#&)
s YȖnfךh_r Zo9/_2N1oOy&!Y x굀iLccB@SX$?!591I69~
Ũ]'1j4euzDh@39m {Dl" C#Gt @X#AlEm&SM!ەJe~_jc\jcś:+l_>>jL=nN^.9\sRco-=G%1؟O
!Wv%(01(0Ua:5kCQCZճ[{qqU?U+\wخT^00DL$<G"j^s\帪0Ua:#*]{y3pbotU~L $(ޚc9$3~Fqt|p(O{R˦]r__xVOQ]R,
p8@9H"Hc)JKCcj?^&x(%ܼVA/ă1&
um61f3vޛs4|:
]ZdN*z>7h
)gvx%]$J[TBͳ~@Q>_W_~S8i%
(cw~0D#C;Ruz ɮ~&?*TߏA|OG/gNO^z
dT""ܥKDE9N0M^i7|q҈ oT06VOO/O'mmgDJy0a"){-t5GوP܂ZI,ȹiZM;u5U kUBGo(֭a2n
&ƆR1lr1tua];
GBqo_(0"(̽^Hf٥$vN_5yX9=%RĥHY~%0E{
q1\ҒYHI/ǴAt(^Td'n;kEGXK
Qq[Ӓ" $@;!ҦT<0AŅg/$K#sTv6˝ʚ8B9!zfMIό1G^oGû` '(It֩EZڤrmLj33A
;Ik!8^$uo"ErVȘXHz}
w16ul\S U;]Ω߹oϪxdjӵZGCKC]>8\9xb]k-xVMHTQ>qԧ3jx"tH2(RCv#M83:36=BHjբZ 梈vRR({OKg9s=;Uo vt>mcLT:봦h٭Ѕ%q\:f3
fv+X6bXXI9n;2}#|Sڠ+i'8{`߅A/V߃Қ'n%sĠASZk)SjA.rr>P
7 !@)PFPMHyb3>oT93iM}7_KH4tǍ~<
vwdDyYJ}#|v1P=S2ei-h?ĉ)氒ZRsK$BHRd
өⷸJ9: IC64{͊37@]$v9RJsRPa"=>sb2D6OCb2k~7 އ\}xq<.6Qp
{FD&]bFk aGB0,
7nд.E{Τ.JI9RFMK&4Jv&Ǳ>}v}MJ\2E|1Nz҇Nq2e⾠츩Yg֊D>M]U I_%bai:l3n}d";G,N;[
A^>tb3>zz3G"q'Ή~N443Bӏ?#~;7ys8tP0ޡB3>Z+|V_k>?x
=Ui̞;xEܽ;1tH+i-
f0WxW]hW>&;YԎy
&[ Դ$"8)+?l\7c'鋥\C-!RDA56
b]Ϲ0d9ٙsss9we֝->0<:XP3WrT*9+ZBSk{ּ^ko/
AX0)gPJX1-C.s!XO/g>O;{Wp5 yѝ2cN?itꙫazťOUSjc/u+h@9h@ oBnDn i;PM|$t"oAފܥl'v۠!&?>nOW%g{jHlz"}2g
OڹD:eRbՉr^xov\_Ⱦ8ԻY,Q ;dՠp[0wd6=fkpE nuRe6]<'6;j;&+B+?<ʝ~K/iߏ{ӫif~:Zh/[-NeX^cOu>٠vhG5A}~,+2λx$Wݿ?_ϗȀ4adĺ
W=|vEZ?_;57v
L<0`?tVTna9ʪӦZkZfddQ5VTm,r9doW'7>͟'Y.UaA*1҄3h#
i VDDmA*HQ-igԢA0{'D%x{9{ν훒>@
O`3/〻Ʉ _kl7sq]{7T*ʕ IvC-7;"!+k)r7ޠz&cKIiX#vs_%QwDi^#l)fL/cunGx9x_ӗOsM
k]2pߴ+pqPģ6Tv$iX+Z1@,"d(ugf1`ujvXrCgYIXsJr$oc3VHp?
8܅V !h&Z^6#s@Hѕb(7Y|VyrrWe9ƮgYebrpE [_?7 ރxlS謫[e'.~w+n]FiYxUkA̶ڤR<=) (ILe&6a/"(
GD!EA=(DPM|1V7 Jo7oewߢ CZD{
pj\[54Z_6ÿx}*A#uo6t,iF|V'S@O>uObGx1k㌟RS)5QOY2LEJ_Ø-z$'E,\e4-nvW}MeOEAЬ?
wxUAkSAv%bS!ؓ
ES((i=%$DA 'Tԛ7mb_(cwggf߷3ޣ"f+0MQflZէ}E[{ߣ\HDcTK:vs>o7zӶqGח"@rE@'N E?~
?GB=s /">4j{eyܛ8Q;~>I2H;w{K^Ho;R*\8Ugɵ՜[pJT</eܛħ̓q=JfHpڴ`]}J/=$=NG1sBŨvyY"F!MиI,ll"Hl}\BakMAhPWtfgbg6j
jvuױD\y[łM"U1a)/ԫn3pOx795!NM&Չ&ɏ#k@;=rW s%{s|r=SM#Km)gTU*Q=pLuU\+\>G9MUbX$Q*ٹdei3*tDL1I5gXxUkAlҚMiZJk=)(5B-zh[Mim5,^*O"!EA=T<7D)-ow͛7>>~Tk5ȘfI1yV*%>;C)[\
~K缨ZkԭY|53kU,n LpO}'㏒y,92~E
z̵m0(ԣ/:~w@vc;Z'>BS,1Tל(:%gR+Y7+Su/·A"YxA<^{AwibrFl}rUDz#bĸp[Gˢu>g8:ѫs.&bP01B{{["7+pKD
qĦsyde5<U[ePE
0mΜVW1ݩ]e[yRު݄.ؔsQ&vAV8L,qGĀg[3HadM}d'kPf$3'/"ٯmTyWu1ZmCF'C.Ʃf0M<4/ʮT~T^JEppY!'uJr4[
3숕Bz.(YFyXOlqAR3/Ȣ+xUkQ۴5Bj)E__*gMrmmmӨ}ڐ"ZQ4Z!ٶk{wdTP >bZ)hJiTKA|B(b̮]ｦ{?rw̙s9sw!zh4 C͒zfn=E+zM&y;u_ƷN.B~Ua7|I)c<[|/쯫P[/ޙ<b,~@=Qe4߁c^?M5Eu[@/4_tڢoX都-\|&u8Ex#q+cM9px׃"u 5GǑvΰTks`tpOZCg$.L -{:c4*Kݱf3bhx猘F3Be:zc\Y1"ʈZXS,!Y>R
3Mz|fVBV*B1X2F$֒;~:ǯcp.%+\
EYqy1כNܫ#-Dp}{E-;`p珋ABh]w̹}8*n.w,_p=|2?A{9w2i9q>gd@߀&ˢW{=G!rctd[eN*߹ӰxsVSg܄zW7+uj hanIӯe}`(f fҹuIy~;jk 0 '@/&kTWMwq)q۪EiK/1߱$;$Nl$,m2eo]W;J~MĵJ`TP`P#"K91;2JS*ܯb{'!WxUkSAv%bC!ؓES((m=4J!QǞT<<BzS&IP+J%ط3y3GO?f+0CQflZ5E
Cfnch=H@s R'P;wRZ=i(=Z_nM[IQ(;7ϵkCԃn;G9. !>K߽?NdZ);+;Q\TrN"ŶAZ~}Vr5.g?t^)?nwiL?;|t3'$\LYm&`\&nmcAcB2SR+r=|slNeVNî>9yƂh5ˠX0I1*]!Z <{9[U!WnM6&Ml6ߣ'OXBW_~in>ɞs }SHӘEՕ
u+)
!rʦvMcKowX,k(b*de)+tDbt6xUkAlҚmiZJk5EQImS(Q{h*iLim/zIEAEA=yRAcI⛏iQ}yf~zv=&Z
2YRz^jvDmEb>;ѿa!}pKoR'uVObX7ܚr+HH&8k뾓p,VXn?L
s%=k
wZwRI;ǯ@Nc]AwB6~,_o=K"0U5izMg킽TkbY#aJu/wOּD+ynb"Ks䪈wG*ňqaEYumwL;T?@V`%F`*s$2WNY.YzqrxlLŅL7HV"Py%ϡuOIq&&:dK;,"҃,#ƅbc- 24ǐιF-BT>̥Kד-}[5JfvJekɦsxrCl.*o-cZ`.?98"
pm@^-+G_hĪX@)`CP}<^F?EcM}e8^KY>Tw5/}=Iջ@}
@1ЎVoVӻqVXν?ȯ䥌ugsNti9Kig(<fTzU7!|=pK&k2}u0{LƛO$y7pWfz@T1]#!ÖXz
&!"H!Ǝ;gj.(f.+zObL㹹"7ws]QV}d*ub3i<~/rJ/ ;F&OTR&Z_=U~zGHa7ӠwBj]@>
}s'?^2ziCSͩ0ǠmUϩ@BLDJl-Bxo!Gb#1ݎ߯2/{nSO"nd绷: ~v>]}ϟs3~JM4LG=R*g3eI%U
cILo#9Q,ar,i1i*;|z/zfiIdxUkQ4mih"k4T{h
SIuKm</Aϊ O=Y}$&
R,ow|7_ly0-p~
_#`WÐVO`
?8H"Z[o:5/x)M'GhªXD-`CPcVOp7ڰ/}=Iջ@@1Љ?1N^ӻqVXν?̯IʊNry5]p3FOi*j~$]!R~}&Ig2Aŕ5LWHȰ%~Cu(Scnʨ+ޓ)ӅtLieep̹)!茛TLyto+ʋ"#NS&}WѺ%\*?#T[қnѻFXt);-`»Z/Q[ͩ0ǠmEUϩ@BMLVlm1JuHCc ].p'V08łc\-ӲH.,NduDM-mE*֩-J|<|)e
ŜmsUs*fKxzZaw ;TN1h5CЧI0b2=be3on~vUa0:)d4&&k(>6Tu
0`z[~}=1A
1eW*Q?twT](WXӜ%<
Ɩ_bKoYtGh(cQ^ՕM:z8't)LxUkQ4mih"k4T{h
SIuKm</Aϊ O=Y}$&
R,ow|7_ly0-p~
_#`WÐVO`
?8H"Z[o:5/x)M'GhªXD-`CPcVOp7ڰ/}=Iջ@@1Љ?1N^ӻqVXν?̯IʊNry5]p3FOi*j~$]!R~}&Ig2Aŕ5LWHȰ%~Cu(Scnʨ+ޓ)ӅtLieep̹)!茛TLyto+ʋ"#NS&}WѺ%\*?#T[қnѻFXt);-`»Z/Q[ͩ0ǠmEUϩ@BMLVlm1R;7܃O+)1 .`jF1su돑~YOaK s y9/<:K[TsYd͏h
y@vo7`cm|
8VO%K@:js+M#3^Λ;T>eAJ
`10/{OdWƳWDڸE8doS2[y,m
^Ckak܉>sQ5ah"ޯBgiH*v̟"r'`ɴn>̈́%s;
n(-X:朄[pFL*g"
Z&Sv۟[u2kyKU3$
Ò"Pr'~+5roE٩1}βfV&,Um^ʆ+`qޟsy7#W6bݏ1<^X,$։@G|aҪN1l&:+_us!:XRgQ/ۋx8Cs:CM8zLtМU;qLcģi :+;d}u= qa ۰r0G! G}k@?AgO3 # #9','P*0.'RY2 /Fi` {6,: =ni07~_zK| =p*6*08@D/0:=H9,;P]IbQTA@5=FXI
M@\V`GRVcX th}f }iik03loPaUA osu wyW|{@2͌-,ԔΗi[@cYL0D#Oǃ%
}ume]UٰѲɴwe(
,
.*Oh+'0Uhp
8D
P\dInverse Kinematics 2Steve RotenbergLC:\Program Files\Microsoft Office\Templates\Presentation Designs\Artsy.potSteve49Microsoft PowerPoint@fYa@Κ@0ࡄ1GSg )' """)))UUUMMMBBB999|PP3f333f3333f3ffffff3f̙3ff333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffff3ffff̙fff3fffff3fff333f3f3ff3ff33f̙̙3̙ff̙̙̙3f̙3f333f3333f3ffffff3f̙3f3f3f333f3333f3ffffff3f̙3f3ffffffffff!___www4'A x(xKʦ""")))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___wwwCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCCCCCCmCCCCCmCmCmCCmmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCCmmCmCmCmCmCmCCmmCCmCCmCmCmCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCCCCCCmCCCCCCCCmCCmCmCmCCCmmmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCCCCmCmCCmCmCmCmmCmCmCmCmCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCmCCmCmmmmmCmmCCCCmCCCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCCmCCCCmmCCmmmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCmCmCmCCmmCmCmmCCCmCCmCmCmCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCmCCCCCCmCCCCCCmCCCCCCCmCCCmCmCmCCCmCmCmCmmCmCmCmCCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCmCmCCCCmmmCmCmCmCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCmCCCmCCmCmCmCmmCmCCmmCCCmCmCmCCCmmmmCmCCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmmCmCmCmmCmmCmCmCmmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCmCmCCCmCCCCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCmCmCmCmmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCCCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCmCCCCCCCm#J#D#J"J"D#J"D"D"DDK"J#K#E#J"J"K"K#DDDE#J"J"JK#K"J"J#EDJ"J"D#K"J"J#K#K#mCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCK*K#E)J"J#E#D"C"I"D#K#D"K)E#E#J"J*K$EEEDE$K#J"E#K#K#J#K$ED"J"DD#D"J#J#K*KCmCmCmmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmC8C8CmCmCmCmCmCmCmCmCmCmCmCm8mCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCCCCCmCCCmC8Cm8CCmCCCmCCCmCmCmCCCmCmCmCm8mCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC8CC8CC8CCC8CCC888CC8C888CCC888CCCCC8CCCC88CC8CC8CC888CC8CC8mC8C8888mC888CmC88m888mCmC8CmC888Cm8888Cm8mC88mCm88888mCm8mCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC8CC8CC8CC8C8C8CCCCC8CCCC8C8CCCCCCCC8CCC8C8CC8CC8C8CCCCC8CC8CC8C8CC8CC8m8CC8CC8mCm8mCC8mCm8mC8C8Cm8mC8Cm8mCmCm8mCmCmC8CmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC8CC8CC8CC8C8C8888CC8CC88CC8888CCCCC88m8CC8CC8mC8C8888mC8Cm8mC8Cm888mC8C8Cm8mCmC88mCmC8CmC8Cm8mC888Cm8mC8CmCmCm8mCmCm8mCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCC8C8C8CC8C8C8CC8C8C8CCC8CC8CCCCC8C8CCC8CC8CC8C8CC8CC8CC8CC8CCCC8CC8C8CC8Cm88CmCCCm8CCm8CC8CCCm8CC8CC8mCmCmCC8mCmC8CmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC8CC888CC8CCC8C88CCC88C888CC88CCCCCC8CC8CC8CC888CCC88CCC888888mCm888m8888CmC88mC888CmC8CmC888CmC888Cm88888mCmCmCm8mCm8mCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCC8CCCCCCCCCCCCCCCCCCCCCCCCCCC8CCC8CCCCCCCCCCCCCCCCCCCCCCCCCCmCC8mCCCmCCCmCCCmCCC8CCCmCmCmCmCmCmCm8mCmC8CmC8Cm8mCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC8CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC8CCCC88CCCmCCCmCmCmCmCmCmCmCmCmCmC8C8CmCmCmCmCmCmCmC8CmCmCmCmCmCmCmC8CmCmC888Cm8mCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCCCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCCCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCCCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCCCCCmCCCmCCCmCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCmCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCmCCCmCCCmCCCmCCCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmC$#E#DD"D#DDDCCDCDDJD"JCDCJ#oEK#K#EDDnDKKKDDCDCCDDEKL$$$CCCC"C"CCCCCCCCCCCCCCmCDCmDDDm"C"m"D"J"D"J"m"m"C"J"J"m"m"m"mCmLELFLFLFL$LELELLLELKLEKELEKDKEoLKEnKnKoLoLtKoEoKnKoLtLtLoLoKLKtooLuLoKLEEEKKLELLL$$#$$$$EEE#mCmCmD$$$#*#**0**)0**#*#D#J)*#K#***#*#nCDKEEEKELFL$L%L$L%L$E$E$EELELLLLLKKEEEKELLLKKKnEKKKKLLoKKEKEKKoLoLuLLLK#E$EELEKEL$##$$$$$$$$#$#*)***)*)*#$##"))###*#$#$##EEKELELFLFLFLLLELFLELEE$LELLLLLKnEnEnEoLoLLKoKnKoKoLtLoKoKoKtLuLuLuLoEEEEEKELELEE$#$$$+$$$$$$$$$$$$#*********)*#K#D#K)*)**$#**$##EEKEEEL$EELELEL$LEL$E$E$E$L$LEKEKEKEEEKEKKLEKEKKKKLKLKKEKKLELLtLLLL$E#E#EEK$EEK$$$$$##)#*#)#*#)#D"###"##*#*#*#$##DDEEKELELELELELELELELEKEKELEKEKEKEnEKEKEKEoKoEnKoKoLtLoKLKLKoLoLtLuLKEEEKEoEKELE###$$$$$$$$$$$#$$#$#$###*#*#*)*)K#D#D#DD#D#D#D#D>#DDEDEELELELELELEE$L$E$EELELEL$EEKEKEnEKEnKnKKEKEnELLoELKLELLoLoLoLL$E#EEKEKEKE$#$$$$$$$$#####)#*#)#)##"D"##DD=D=D=D=aDDEDEDKELKLLLLLKoEEEKEKELELKoLLKLELEKKoKtLLLtKnKnEnEnKoLoLLLuLoLtooEKEEEKEKEKEK#D#$$$$%$$$$$$$######$##D###J#)#*#J#J#D#D#D#DDD#E#D##DDDDD#E#EELFLLLEE#EEEE#EELEKELKLKL*LKLKLLLKLKKEEDKDKKL$LFLLLKLELEE#E#E#EEEEKE#$$$$$"#"""#"###")")###"D#######)EDDDDDEDEELKLLLKKDEEEDKDEDEELELKKEoKLLLLLLLLRLoEKEKEKELLLLLLLLLELEE$E#EDEEKEKEK#"##$$$$$$$$$$E$$######D"D#D"#")#)#)##"J#J#J)J#J)*)K##D#DDD#E#E#E$K$EDDDDDD#D#EEEE$KEKELLL$L$K$LKLEEDEDEEKEKKLKLLLKKEE#E#E#E$EEEEK#"###$$$$$$$$$######C"""#"#"##)##########"))J)))J"DDDDDDDD#E#E#EDKEEDDDDDD"DDD#E#DEKEKKRLL$L$L$LKLEKEEDKEKEKKLKLKKEK#E$E$E$EEKEKE##D"##D#$#K$K$K$EE$EE$E$$EE#DD#D"D"D"D#D#D"J"J#J#J))))#$#$#$#$#))P)J)PIJC#D"D"####$#E#D"CDC"C"##E#E#K$K$E#E$K#K$E#E$E$E#E#K#K#K#K""#E#$#E#D#EE##$##$###*#*$K$*#D#D##$$$$#$D##C"C"D"#"D"I"I))#))))*##$###$##/)/)/(I(IJ#J#D"##$#E$$#C"C"CC"C"DDD#D#DKK$K#E#K*K#K#E$E*K#D#J)K#D#K#D"E$E$E$EEDD$EE$K###K*QKQQQ*RQR*K#DD#D#D#L*L*R*K*K$KCCCJIJ"JCJ(I)Q0Q0Q/Q0$#$$###K/Q/Q/P(P(#)"#""$#$#$#""C""CC##EJ#D###D#K#K#$$$$$$##)"""#$*#*#$$$$DDE###K$###K*XQQQQQXRR#DDDDD#K*K1R*L*K#ICI(III"ICJ"P/Q/00X07$$##*$$$+*Q0W0Q(P/QJ#)"D"####$###C!"!CC!C"DC##KKD#K#D"D#K*K#$$K$$#%$#J))"D#1*+**$$$$$EDD$K"KKK"K#KKXQXQWQXXXQKCDCDCDCDCKKR*R1R1RKKIIIJIIIPIlIP/Q7X0X7X7K$+$L%2++$Q6X6X/PPW0Root EntrydO)`Zp!ċ
PicturesߘCurrent User'5SummaryInformation(DU
!"#$%&
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Building the JacobianUnits & ScalingUnits & ScalingEnd Effector OrientationEnd Effector OrientationScaled Rotation Axis6-DOF End EffectorDesired Change in Orientation
End EffectorRotational DOFsRotational DOFsTranslational DOFsFonts UsedDesign TemplateEmbedded OLE Servers
Slide TitlesO_mayeznbmayeznbRoot EntrydO)
PicturesߘCurrent User'8SummaryInformation(DU
!"#$%&Building the JacobianUnits & ScalingUnits & ScalingEnd Effector OrientationEnd Effector OrientationScaled Rotation Axis6-DOF End EffectorDesired Change in Orientation
End EffectorRotational DOFsRotational DOFsTranslational DOFsFonts UsedDesign TemplateEmbedded OLE Servers
Slide TitlesO _Dr MayezDr Mayez
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root EntrydO)ǭ
PicturesߘCurrent User'/SummaryInformation(DUPowerPoint Document(MDocumentSummaryInformation8 Equation Equation.30,Microsoft Equation 3.0Equation Equation.30,Microsoft Equation 3.0Equation Equation.30,Microsoft Equation 3.0Equation Equation.30,Microsoft Equation 3.0Equation Equation.30,Microsoft Equation 3.0Equation Equation.30,Microsoft Equation 3.0Equation Equation.30,Microsoft Equation 3.0Equation Equation.30,Microsoft Equation 3.0Equation Equation.30,Microsoft Equation 3.0Equation Equation.30,Microsoft Equation 3.0Equation Equation.30,Microsoft Equation 3.0I+Equation Equation.30,Microsoft Equation 3.0N,Equation Equation.30,Microsoft Equation 3.01Equation Equation.30,Microsoft Equation 3.0>Equation Equation.30,Microsoft Equation 3.0?Equation Equation.30,Microsoft Equation 3.0BFEquation Equation.30,Microsoft Equation 3.0MEquation Equation.30,Microsoft Equation 3.0NEquation Equation.30,Microsoft Equation 3.0VEquation Equation.30,Microsoft Equation 3.0XEquation Equation.30,Microsoft Equation 3.0mEquation Equation.30,Microsoft Equation 3.0-rEquation Equation.30,Microsoft Equation 3.00sEquation Equation.30,Microsoft Equation 3.0:vEquation Equation.30,Microsoft Equation 3.0=yEquation Equation.30,Microsoft Equation 3.0HEquation Equation.30,Microsoft Equation 3.0@Equation Equation.30,Microsoft Equation 3.0CEquation Equation.30,Microsoft Equation 3.0FEquation Equation.30,Microsoft Equation 3.0KEquation Equation.30,Microsoft Equation 3.0REquation Equation.30,Microsoft Equation 3.0XEquation Equation.30,Microsoft Equation 3.0TEquation Equation.30,Microsoft Equation 3.0\Equation Equation.30,Microsoft Equation 3.0ZEquation Equation.30,Microsoft Equation 3.0]Equation Equation.30,Microsoft Equation 3.0lEquation Equation.30,Microsoft Equation 3.0jEquation Equation.30,Microsoft Equation 3.0hEquation Equation.30,Microsoft Equation 3.0fEquation Equation.30,Microsoft Equation 3.0dEquation Equation.30,Microsoft Equation 3.0oEquation Equation.30,Microsoft Equation 3.0tEquation Equation.30,Microsoft Equation 3.0xEquation Equation.30,Microsoft Equation 3.0/0DTimes New RomanTTܖ0ܖTDArialNew RomanTTܖ0ܖ DWingdingsRomanTTܖ0ܖT@.
@n?" dd@ @@``D<@Q+H
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Xaa1
#$*+!#%,%;')6
395!./'$&"(-i
&[
b$ە/+h;K_b$XOw/\c
b$`B;;˃i;2$b|юα=GjXK2$eIn;V"e^M2$-R\OqAd+P2$C+ǝVz}R2$4ɠ"JPe(ra$T2$a]wV&lU2$ڢjOZl襴WbW2$(03Y7=iY2$/8z
eُ[2$\]5Ye+omVv]2$9Z qd܃a^2$2[r½f2""`2$ߺ8&L3a;[@b2$SrX; ϲRy/e2$cVCe"XsSg2$
Ã5c6j2$!o:X]LcGl2$&hwlVE˙%*n2$jɲ4<ߟXH,Nq2$567j+dO*^(s2$?IwQ vCICu2$m%'+S֊_k(w2$ӑ6Uup)5x>y2$eʤ;BKmAQ}2$h`bbsS2$2?ʀr;Wa!:2$g,y2$p`
WĈ,2$u:$JTYC2$r-h 2,"*Jacobian for a 2D Robot Arm
Jacobian MatricesFJust as a scalar derivative df/dx of a function f(x) can vary over the domain of possible values for x, the Jacobian matrix J(e,) varies over the domain of all possible poses for
For any given joint pose vector , we can explicitly compute the individual components of the Jacobian matrix~$~ 3 ! L |Incremental Change in PoseLets say we have a vector that represents a small change in joint DOF values
We can approximate what the resulting change in e would be:R d
Incremental Change in EffectorWhat if we wanted to move the end effector by a small amount e. What small change will achieve this?Ti= =*Incremental Change in eGiven some desired incremental change in end effector configuration e, we can compute an appropriate incremental change in joint DOFs LD""B""DDIncremental ChangesRemember that forward kinematics is a nonlinear function (as it involves sin s and cos s of the input variables)
This implies that we can only use the Jacobian as an approximation that is valid near the current configuration
Therefore, we must repeat the process of computing a Jacobian and then taking a small step towards the goal until we get to where we want to beqZqSChoosing e0
"("("( We want to choose a value for e that will move e closer to g. A reasonable place to start is with
e = g - e
We would hope then, that the corresponding value of would bring the end effector exactly to the goal
Unfortunately, the nonlinearity prevents this from happening, but it should get us closer
Also, for safety, we will take smaller steps:
e = (g - e)
where 0d" d"1cZZZ!Z""""""&""""""""5""""""""""""">GBasic Jacobian IK Techniquewhile (e is too far from g) {
Compute J(e,) for the current pose
Compute J-1 // invert the Jacobian matrix
e = (g - e) // pick approximate step to take
= J-1 e // compute change in joint DOFs
= + // apply change to DOFs
Compute new e vector // apply forward
// kinematics to see
// where we ended up
}YZ"""
""""""'"""
"""""
""""""""" H Inverting the Jacobian Matrix
Inverting the JacobianIf the Jacobian is square (number of joint DOFs equals the number of DOFs in the end effector), then we might be able to invert the matrix
Most likely, it won t be square, and even if it is, it s definitely possible that it will be singular and non-invertable
Even if it is invertable, as the pose vector changes, the properties of the matrix will change and may become singular or near-singular in certain configurations
The bottom line is that just relying on inverting the matrix is not going to work,Zh,
Underconstrained Systems
If the system has more degrees of freedom in the joints than in the end effector, then it is likely that there will be a continuum of redundant solutions (i.e., an infinite number of solutions)
In this situation, it is said to be underconstrained or redundant
These should still be solvable, and might not even be too hard to find a solution, but it may be tricky to find a best solutionOverconstrained SystemsIf there are more degrees of freedom in the end effector than in the joints, then the system is said to be overconstrained, and it is likely that there will not be any possible solution
In these situations, we might still want to get as close as possible
However, in practice, overconstrained systems are not as common, as they are not a very useful way to build an animal or robot (they might still show up in some special cases though)ZWell-Constrained SystemsGIf the number of DOFs in the end effector equals the number of DOFs in the joints, the system could be well constrained and invertable
In practice, this will require the joints to be arranged in a way so their axes are not redundant
This property may vary as the pose changes, and even well-constrained systems may have troubleHH|
Pseudo-InverseIf we have a non-square matrix arising from an overconstrained or underconstrained system, we can try using the pseudoinverse:
J*=(JTJ)-1JT
This is a method for finding a matrix that effectively inverts a non-square matrixZZSZp
SDegenerate CasesOccasionally, we will get into a configuration that suffers from degeneracy
If the derivative vectors line up, they lose their linear independence Single Value DecompositionThe SVD is an algorithm that decomposes a matrix into a form whose properties can be analyzed easily
It allows us to identify when the matrix is singular, near singular, or well formed
It also tells us about what regions of the multidimensional space are not adequately covered in the singular or near singular configurations
The bottom line is that it is a more sophisticated, but expensive technique that can be useful both for analyzing the matrix and inverting itZ
Jacobian TransposeAnother technique is to simply take the transpose of the Jacobian matrix!
Surprisingly, this technique actually works pretty well
It is much faster than computing the inverse or pseudo-inverse
Also, it has the effect of localizing the computations. To compute i for joint i, we compute the column in the Jacobian matrix Ji as before, and then just use:
i = JiT ecZZx"*;""*"
"*""**"b;#Jacobian TransposeWith the Jacobian transpose (JT) method, we can just loop through each DOF and compute the change to that DOF directly
With the inverse (JI) or pseudo-inverse (JP) methods, we must first loop through the DOFs, compute and store the Jacobian, invert (or pseudo-invert) it, then compute the change in DOFs, and then apply the change
The JT method is far friendlier on memory access & caching, as well as computations
However, if one prefers quality over performance, the JP method might be better& ZIterating to the Solution
IterationWhether we use the JI, JP, or JT method, we must address the issue of iteration towards the solution
We should consider how to choose an appropriate step size and how to decide when the iteration should stop( 2When to StopThere are three main stopping conditions we should account for
Finding a successful solution (or close enough)
Getting stuck in a condition where we can t improve (local minimum)
Taking too long (for interactive systems)
All three of these are fairly easy to identify by monitoring the progress of
These rules are just coded into the while() statement for the controlling loopj?ZZZ?M"O"Finding a Successful SolutionWe really just want to get close enough within some tolerance
If we re not in a big hurry, we can just iterate until we get within some floating point error range
Alternately, we could choose to stop when we get within some tolerance measurable in pixels
For example, we could position an end effector to 0.1 pixel accuracy
This gives us a scheme that should look good and automatically adapt to spend more time when we are looking at the end effector up close (level-of-detail)ZLocal MinimaIf we get stuck in a local minimum, we have several options
Don t worry about it and just accept it as the best we can do
Switch to a different algorithm (CCD& )
Randomize the pose vector slightly (or a lot) and try again
Send an error to whatever is controlling the end effector and tell it to try something else
Basically, there are few options that are truly appealing, as they are likely to cause either an error in the solution or a possible discontinuity in the motionB<ZZZ<Taking Too LongIn a time critical situation, we might just limit the iteration to a maximum number of steps
Alternately, we could use internal timers to limit it to an actual time in secondsIteration SteppingStep size
Stability
PerformanceOther IK Issues
Joint LimitsA simple and reasonably effective way to handle joint limits is to simply clamp the pose vector as a final step in each iteration
One can t compute a proper derivative at the limits, as the function is effectively discontinuous at the boundary
The derivative going towards the limit will be 0, but coming away from the limit will be non-zero. This leads to an inequality condition, which can t be handled in a continuous manner
We could just choose whether to set the derivative to 0 or non-zero based on a reasonable guess as to which way the joint would go. This is easy in the JT method, but can potentially cause trouble in JI or JP}Z}Higher Order ApproximationThe first derivative gives us a linear approximation to the function
We can also take higher order derivatives and construct higher order approximations to the function
This is analogous to approximating a function with a Taylor series
Repeatability If a given goal vector g always generates the same pose vector , then the system is said to be repeatable
This is not likely to be the case for redundant systems unless we specifically try to enforce it
If we always compute the new pose by starting from the last pose, the system will probably not be repeatable
If, however, we always reset it to a comfortable default pose, then the solution should be repeatable
One potential problem with this approach however is that it may introduce sharp discontinuities in the solutionR'""Multiple End EffectorsmRemember, that the Jacobian matrix relates each DOF in the skeleton to each scalar value in the e vector
The components of the matrix are based on quantities that are all expressed in world space, and the matrix itself does not contain any actual information about the connectivity of the skeleton
Therefore, we extend the IK approach to handle tree structures and multiple end effectors without much difficulty
We simply add more DOFs to the end effector vector to represent the other quantities that we want to constrain
However, the issue of scaling the derivatives becomes more important as more joints are considered,nZ`
Multiple ChainsAnother approach to handling tree structures and multiple end effectors is to simply treat it as several individual chains
This works for characters often, as we can animate the body with a forward kinematic approach, and then animate each limb with IK by positioning the hand/foot as the end effector goal
This can be faster and simpler, and actually offer a nicer way to control the characterZGeometric ConstraintsOne can also add more abstract geometric constraints to the system
Constrain distances, angles within the skeleton
Prevent bones from intersecting each other or the environment
Apply different weights to the constraints to signify their importance
Have additional controls that try to maximize the comfort of a solution
Etc.
Welman talks about this in section 5BCZZ%ZC%GOther IK TechniquesCyclic Coordinate Descent
This technique is more of a trigonometric approach and is more heuristic. It does, however, tend to converge in fewer iterations than the Jacobian methods, even though each iteration is a bit more expensive. Welman talks about this method in section 4.2
Analytical Methods
For simple chains, one can directly invert the forward kinematic equations to obtain an exact solution. This method can be very fast, very predictable, and precisely controllable. With some finesse, one can even formulate good analytical solvers for more complex chains with multiple DOFs and redundancy
Other Numerical Methods
There are lots of other general purpose numerical methods for solving problems that can be cast into f(x)=g formatZZZ0ZZsZ0eJacobian Method as a Black BoxThe Jacobian methods were not invented for solving IK. They are a far more general purpose technique for solving systems of non-linear equations
The Jacobian solver itself is a black box that is designed to solve systems that can be expressed as f(x)=g ( e()=g )
All we need is a method of evaluating f and J for a given value of x to plug it into the solver
If we design it this way, we could conceivably swap in different numerical solvers (JI, JP, JT, damped least-squares, conjugate gradient& )Z"(;Computing the Jacobian
<Computing the Jacobian MatrixrWe can take a geometric approach to computing the Jacobian matrix
Rather than look at it in 2D, let s just go straight to 3D
Let s say we are just concerned with the end effector position for now. Therefore, e is just a 3D vector representing the end effector position in world space. This also implies that the Jacobian will be an 3xN matrix where N is the number of DOFs
For each joint DOF, we analyze how e would change if the DOF changedNZ =1-DOF Rotational Joints@We will first consider DOFs that represents a rotation around a single axis (1-DOF hinge joint)
We want to know how the world space position e will change if we rotate around the axis. Therefore, we will need to find the axis and the pivot point in world space
Let s say i represents a rotational DOF of a joint. We also have the offset ri of that joint relative to it s parent and we have the rotation axis ai relative to the parent as well
We can find the world space offset and axis by transforming them by their parent joint s world matrix!Z"
A
E
>AEA1-DOF Rotational JointsTo find the pivot point and axis in world space:
Remember these transform as homogeneous vectors. r transforms as a position [rx ry rz 1] and a transforms as a direction [ax ay az 0]f
>+BRotational DOFsNow that we have the axis and pivot point of the joint in world space, we can use them to find how e would change if we rotated around that axis
This gives us a column in the Jacobian matrix*c^Rotational DOFs
a i: unit length rotation axis in world space
r i: position of joint pivot in world space
e: end effector position in world spaceZ
+
)(, +RI3-DOF Rotational JointsFor a 2-DOF or 3-DOF joint, it is actually a little trickier to get the world space axis
Consider how we would find the world space x-axis of a 3-DOF ball joint
Not only do we need to consider the parent s world matrix, but we need to include the rotation around the next two axes (y and z-axis) as well
This is because those following rotations will rotate the first axis itself||3-DOF Rotational JointsFor example, assuming we have a 3-DOF ball joint that rotates in XYZ order:
Where Ry(y) and Rz(z) are y and z rotation matricesZZ
"
"
,Y J3-DOF Rotational JointsRemember that a 3-DOF XYZ ball joint s local matrix will look something like this:
Where Rx(x), Ry(y), and Rz(z) are x, y, and z rotation matrices, and T(r) is a translation by the (constant) joint offset
So it s world matrix looks like this:\
"
"
"
+X>[3-DOF Rotational JointsOnce we have each axis in world space, each one will get a column in the Jacobian matrix
At this point, it is essentially handled as three 1-DOF joints, so we can use the same formula for computing the derivative as we did earlier:
We repeat this for each of the three axesZRQuaternion JointsWhat about a quaternion joint? How do we incorporate them into our IK formulation?
We will assume that a quaternion joint is capable of rotating around any axis
However, since we are trying to find a way to move e towards g, we should pick the best possible axis for achieving this @ <Quaternion Joints
YQuaternion JointsXWe compute ai directly in world space, so we don t need to transform it
Now that we have ai , we can just compute the derivative the same way we would do with any other rotational axis
We must remember what axis we use, so that later, when we ve computed i, we know how to update the quaternion-
M
"*&">M'CTranslational DOFsFor translational DOFs, we start in the same way, namely by finding the translation axis in world space
If we had a prismatic joint (1-DOF translation) that could translate along an arbitrary axis ai defined in the parent s space, we can use:8+,DTranslational DOFsFor a more general 3-DOF translational joint that just translates along the local x, y, and z-axes, we don t need to do the same thing that we did for rotation
The reason is that for translations, a change in one axis doesn t affect the other axes at all, so we can just use the same formula and plug in the x, y, and z axes [1 0 0 0], [0 1 0 0], [0 0 1 0] to get the 3 world space axes
Note: this will just return the a, b, and c axes of the parent s world space matrix, and so we don t actually have to compute them!XZYOTranslational DOFsAs with rotation, each translational DOF is still treated separately and gets its own column in the Jacobian matrix
A change in the DOF value results in a simple translation along the world space axis, making the computation trivial:Translational DOFs
PBuilding the JacobianTo build the entire Jacobian matrix, we just loop through each DOF and compute a corresponding column in the matrix
If we wanted, we could use more elaborate joint types (scaling, translation along a path, shearing& ) and still compute an appropriate derivative
If absolutely necessary, we could always resort to computing a numerical approximation to the derivativenZnkUnits & ScalingWhat about units?
Rotational DOFs use radians and translational DOFs use meters (or some other measure of distance)
How can we combine their derivatives into the same matrix?
Well, it s really a bit of a hack, but we just combine them anyway
If desired, we can scale any column to adjust how much the IK will favor using that DOFJZJlUnits & ScalingFor example, we could scale all rotations by some constant that causes the IK to behave how we would like
Also, we could use this as an additional way to get control over the behavior of the IK
We can store an additional parameter for each DOF that defines how stiff it should behave
If we scale the derivative larger (but preserve direction), the solution will compensate with a smaller value for i, therefore making it act stiff
There are several proposed methods for automatically setting the stiffness to a reasonable default value. They generally work based on some function of the length of the actual bone. The Welman paper talks about this.0Z#"End Effector Orientation
fEnd Effector OrientationWe ve examined how to form the columns of a Jacobian matrix for a position end effector with 3 DOFs
How do we incorporate orientation of the end effector?
We will add more DOFs to the end effector vector e
Which method should we use to represent the orientation? (Euler angles? Quaternions?& )
Actually, a popular method is to use the 3 DOF scaled axis representation!,pZiScaled Rotation AxisWe learned that any orientation can be represented as a single rotation around some axis
Therefore, we can store an orientation as an 3D vector
The direction of the vector is the rotation axis
The length of the vector is the angle to rotate in radians
This method has some properties that work well with the Jacobian approach
Continuous and consistent
No redundancy or extra constraints
It s also a nice method to store incremental changes in rotation\ZlZJZ~ZlJ~p6-DOF End EffectorIf we are concerned about both the position and orientation of the end effector, then our e vector should contain 6 numbers
But remember, we don t actually need the e vector, we really just need the e vector
To generate e, we compare the current end effector position/orientation (matrix E) to the goal position/orientation (matrix G)
The first 3 components of e represent the desired change in position: (G.d - E.d)
The next 3 represent a desired change in orientation, which we will express as a scaled axis vector: ZZJ!""C+"+" e >qDesired Change in Orientation^We want to choose a rotation axis that rotates E in to G
We can compute this using some quaternions:
M=E-1G
q.FromMatrix(M);
This gives us a quaternion that represents a rotation from E to G
To extract out the rotation axis and angle, we just remember that:
We can then scale the final axis by *eZZZ//
">j"quEnd Effector0So we now can define our goal with a matrix and come up with some desired change in end effector values that will bring us closer to that goal:
We must now compute a Nx6 Jacobian matrix, where each column represents how a particular DOF will affect both the position and orientation of the end effector1Z1gRotational DOFsWe need to compute additional derivatives that show how the end effector orientation changes with respect to an incremental change in each DOF
We will use the scaled axis to represent the incremental change
For a rotational DOF, we first find the rotation axis in world space (as we did earlier)
Then- we re done! That axis already represents the incremental rotation caused by that DOF
By default, the length of the axis should be 1, indicating that a change of 1 in the DOF value results in a rotation of 1 radian around the axis. We can scale this by a stiffness value if desiredGZG{Rotational DOFsThe column in the Nx6 Jacobian matrix corresponding to a rotational DOF is:
a is the rotation axis in world space
r is the pivot point in world space
epos is the position of the end effector in world spacerZP&$
3
oTranslational DOFsTranslational DOFs don t affect the end effector orientation, so their contribution to the derivative of orientation will be [0 0 0]p0 (
x
c$*p*
H
0h ? MMM̙fp0 (
x
c$ˈp
H
0h ? MMM̙f
0@0(
@x
@ c$9
x
@ c$9
H
@0h ? MMM̙fp0 D(
Dx
D c$Hp
H
D0h ? MMM̙fp0 0`(
`x
` c$p
H
`0h ? MMM̙fp0 H (
H x
H c$p
H
H 0h ? MMM̙f
00 $(
r
S/
r
S0
H
0h ? MMM̙fj0Pt
(
t
r
t
S>p
H
t
0h ? MMM̙frD{;l8$` HWw
!"#$%&՜.+,0t
On-screen ShowOTTimes New RomanArial
WingdingsArtsyMicrosoft Equation 3.0Inverse Kinematics (part 2)Forward KinematicsForward & Inverse KinematicsGradient DescentGradient Descent for f(x)=g
MinimizationTaking Safe StepsInverse of the DerivativeGradient Descent Algorithm
Jacobians
JacobiansJacobian Inverse Kinematics
Jacobians
Jacobians
Jacobians
JacobiansJacobian for a 2D Robot ArmJacobian MatricesIncremental Change in PoseIncremental Change in EffectorIncremental Change in eIncremental Changes
Choosing ΔeBasic Jacobian IK TechniqueInverting the Jacobian MatrixInverting the JacobianUnderconstrained SystemsOverconstrained SystemsWell-Constrained SystemsPseudo-InverseDegenerate CasesSingle Value DecompositionJacobian TransposeJacobian TransposeIterating to the Solution
Iteration
When to StopFinding a Successful Solution
Local MinimaTaking Too LongIteration SteppingOther IK Issues
Joint LimitsHigher Order ApproximationRepeatabilityMultiple End EffectorsMultiple ChainsGeometric ConstraintsOther IK TechniquesJacobian Method as a Black BoxComputing the JacobianComputing the Jacobian Matrix1-DOF Rotational Joints1-DOF Rotational JointsRotational DOFsRotational DOFs3-DOF Rotational Joints3-DOF Rotational Joints3-DOF Rotational Joints3-DOF Rotational JointsQuaternion JointsQuaternion JointsQuaternion JointsTranslational DOFsTranslational DOFsTranslational DOFsTranslational DOFs*