<%BANNER%>

Design and Implementation of a Modular Manipulator Architecture

xml version 1.0 encoding UTF-8
REPORT xmlns http:www.fcla.edudlsmddaitss xmlns:xsi http:www.w3.org2001XMLSchema-instance xsi:schemaLocation http:www.fcla.edudlsmddaitssdaitssReport.xsd
INGEST IEID E20110320_AAAAEO INGEST_TIME 2011-03-21T00:08:56Z PACKAGE UFE0008983_00001
AGREEMENT_INFO ACCOUNT UF PROJECT UFDC
FILES
FILE SIZE 434 DFID F20110320_AACSAP ORIGIN DEPOSITOR PATH sosa_o_Page_201.pro GLOBAL false PRESERVATION BIT MESSAGE_DIGEST ALGORITHM MD5
bc6bc7b530ee6ce06b7bf4b037f2a14d
SHA-1
f6d3b910276273f0eee1a6a01927ca3b3ceb8eb7
31957 F20110320_AACQZG sosa_o_Page_132.jpg
9e3bea592114c3a86335b46ecaffab23
1bfc52f7617504c7b737e688eed3d99600e33d1a
68711 F20110320_AACRDW sosa_o_Page_032.jp2
9b3239753da7a94b6a1a04ce98aaa202
903e38f99f3f197909e26051a0fdba8a3a2a6f81
34528 F20110320_AACRWA sosa_o_Page_071.pro
400e0b224ade1e688046c005584ff9ae
69956a422c9221c18a8544c6ffc7420f8eafa695
450 F20110320_AACSAQ sosa_o_Page_202.pro
c1bde106fe25616ec91d4e138350ad5e
f0a8f544b49035843f31b62c0b8666ab369b9a38
44489 F20110320_AACQZH sosa_o_Page_133.jpg
7497c25d4fa42694c35799cb81d9cfb8
b6f8931e2195462fef94a88a9a850800d9d1f59d
85000 F20110320_AACRDX sosa_o_Page_033.jp2
91cba915b05dcc9e4a0939c7b7694443
7ea176b73135274e7b5f7c97e04929206f99f3be
29694 F20110320_AACRWB sosa_o_Page_072.pro
5da68fca380602e15a68c4b822359635
870dce69778e84aff7dca23986e736d5c8f30a5e
37588 F20110320_AACSAR sosa_o_Page_203.pro
93f798c1d7c62ff39e473af12b86d5f7
c9a234783f1a0b40cf9accb94df46c6c98ee1b87
50025 F20110320_AACQZI sosa_o_Page_134.jpg
9662f2f42e91f1ad545b2ccad855c14b
0ac7195b2efb27c7659604e7e5e112a63c7a4eac
57423 F20110320_AACRDY sosa_o_Page_034.jp2
daba76f4ad742e346e79a57346a76557
c3fbf3bbefc82cdd39590dfc3eedaa74ff303b62
43148 F20110320_AACRWC sosa_o_Page_073.pro
0659c312ecd5fd012d5b4ec2a49e59a5
3f4bdeaab0eb6a547dd917459d83aba4142c4edc
22052 F20110320_AACSAS sosa_o_Page_204.pro
97b994ff6f9f3b5683a9c7982a016188
cabe5028bfc4a462c6667f1839f3bce23931cf6f
41367 F20110320_AACQZJ sosa_o_Page_135.jpg
8a3b9d76850a530591caa5c967037b10
28efdbbe1845458e3e9db04b40918dfd714571a1
72888 F20110320_AACRDZ sosa_o_Page_035.jp2
f84b6dea5a166d764aa694dcb7a89463
968fe006d8ed47e79063d68cb21391f2ece6a044
40365 F20110320_AACRWD sosa_o_Page_074.pro
9bc57b3810d0edaf22cf03b1150635b6
fad662c769fd870fb54c53c28f80daf1642c5fda
56673 F20110320_AACSAT sosa_o_Page_205.pro
4520ea4841469ad6e589a9e255a8ed51
41c0e4ee87986c5b84f87b70d553789e0be0a299
41790 F20110320_AACQZK sosa_o_Page_136.jpg
ef0b7a9571ba6f64cf3abf76fdb0149b
c34a9d5422d04fe04ec9eb1e7429d2072da4381d
46506 F20110320_AACRWE sosa_o_Page_075.pro
efff98b20b805b1973a00a29a1837632
2868b982348994e9848c1d2cd3ee0cb0af3caf8f
17943 F20110320_AACSAU sosa_o_Page_206.pro
f242a19d694afc43c26944c63e62090c
0bbe27b508312a9d6f6fda64364eb49e6f1812fc
38850 F20110320_AACQZL sosa_o_Page_137.jpg
bad50048e1c59326ff29bb8e8346ba9e
14aef801d2dccb621102c9486de80493132fecd1
6663 F20110320_AACSAV sosa_o_Page_207.pro
a0dd6cc2418a32a6f67e935b8299b055
dd4f83f8a90fd602850566490a29d57d47876adb
35429 F20110320_AACQZM sosa_o_Page_138.jpg
9694c9b96d7b687f222c00f301a9a241
92fd510a04283a14d2061c0b3ff31798fa066e6f
28391 F20110320_AACRWF sosa_o_Page_076.pro
c5828f5ed75a06616152484e49c6cf11
a566bc8d70936c0cc49841faf17287c8bb9b7b5b
66015 F20110320_AACQZN sosa_o_Page_139.jpg
910bfdaaa6f0547fdf4c4a01caeb877b
6484136abeea0eae8c976d50e1ff53f4375c4d1a
38168 F20110320_AACRWG sosa_o_Page_077.pro
04bdf037b980e90f17efdb515317a468
af4d59c43348a6d23830b25cb563e823714de8cf
21564 F20110320_AACSTA sosa_o_Page_082.QC.jpg
45d6bb9182529849f5c15e1c77fe967e
d32d2b2f9adb0eaa7ae2d081db5b13ce0d73faea
57007 F20110320_AACQZO sosa_o_Page_140.jpg
8186368960e4d84c7e4673802c8783d7
453403228e0952cdfa1b8f4f9161a9633b294342
29485 F20110320_AACRWH sosa_o_Page_078.pro
8d183cde0f7bd61cb43a3d62f19bf22f
f8e8718288894910f61f221e7806658712592917
40909 F20110320_AACSAW sosa_o_Page_208.pro
dcc813ff7bfacd3c5c56398b03d884e1
7c8f62aa4e6131915d146281fc09bc6e040a10a7
17780 F20110320_AACSTB sosa_o_Page_083.QC.jpg
ce5b267d1fe1125a2d464a04ffd47eeb
50adf411de29fc7b817db2557cb95ffcf00dd0d5
35994 F20110320_AACQZP sosa_o_Page_141.jpg
ea8749a1177d969a8c5e374e43893df7
57b47890c415e20885156fbd689f297ed899a705
35494 F20110320_AACRWI sosa_o_Page_079.pro
0e3eec621e754372e58a63ea621e0c15
84149b2118e68f9e62c875da09d0c6117a532795
44003 F20110320_AACSAX sosa_o_Page_209.pro
5baf1d940f142c7d58d8453b44272c26
4c48bcbf68d14f5dbaaaf45a2cb5900098e2e7e3
11705 F20110320_AACSTC sosa_o_Page_084.QC.jpg
bc77e9ec08accc978368a34950c546ad
faa26db0e876fae663228e52593745839ee238ec
41169 F20110320_AACQZQ sosa_o_Page_142.jpg
508cdf7980e7fff2c1ce5d62a3a89ec0
b111bd4b56919b07c4ae8d5488718c36b8453580
27896 F20110320_AACRWJ sosa_o_Page_080.pro
7528759b9e8766fcb398f8dfe2a1f928
fdd7e9e777b930bcb00cbd615198954d476ef9e4
42749 F20110320_AACSAY sosa_o_Page_210.pro
3f33f10689d3a65b88eda07af87259ae
2896954e25eb66007c5f6cefd29ced37d6a15bc9
19618 F20110320_AACSTD sosa_o_Page_085.QC.jpg
dd2e4008dc6655948b7e51196334ba3f
9ff7651b5b28844b836f9bfcae3db7a93785b523
32262 F20110320_AACRWK sosa_o_Page_081.pro
213613f5d8c30218fe112330f75db10b
ba673b24aa3035add54434fb1eac3f6cf34b435a
1167 F20110320_AACSAZ sosa_o_Page_211.pro
89743e5ddacb12e64f1ab3dfb736f502
4e6800b3a96608e53dca5d9e8b18bc94e9e0f5e9
24219 F20110320_AACSTE sosa_o_Page_087.QC.jpg
af772ec360442721bf4c20217aac5b7c
80c844ee90a26845efc08c630e3fe1da61071f53
44531 F20110320_AACQZR sosa_o_Page_143.jpg
f55c063b265a1f28248201955f9eecb4
02e95de4ee39cf027f0d56f7628117c697c42c61
45250 F20110320_AACRWL sosa_o_Page_082.pro
a812381fb5af0671006101d2f69b837d
8335e3cf63fea60c2e2b08ea4c11126c071de9c5
18492 F20110320_AACSTF sosa_o_Page_088.QC.jpg
da815848d1c3218d5bab8354bcfb4da0
ae2b0daf61521bd2dc79698a288f20e07379c2d7
64482 F20110320_AACRJA sosa_o_Page_171.jp2
159c2d16b64e8789864f208e1dee3faf
467bf66407813f77eb405dbea806e839b4842f5f
36859 F20110320_AACQZS sosa_o_Page_144.jpg
dcdd3dcb30e72acfb7f9d5263d697c5a
2e4f86ae298ace8067edeb29b8761dd83db2db91
38406 F20110320_AACRWM sosa_o_Page_083.pro
06a7808cfbdbe46fb3315e233a91e338
66a2242c295bd7f48922eafc472255783aa9714c
18543 F20110320_AACSTG sosa_o_Page_089.QC.jpg
1135b5d68a6f8ac499c231a6d8489b37
7b65e1823ac1a7743b6ef3d1a5bfcb644a35cbcc
63793 F20110320_AACRJB sosa_o_Page_172.jp2
98fae4a2716816ec09950fd1e16d7923
d1bf8eb1a95c35d6ca3cc426b795c9abe6ebeb26
36842 F20110320_AACQZT sosa_o_Page_145.jpg
faa2f17036c85405cf0b0794ea9dfc71
5357465aab7d65c601f8a8eaa2acfa4fd237addd
18466 F20110320_AACSTH sosa_o_Page_090.QC.jpg
278a8c245c18a284f0047f290c7510e6
3379f2bd7b95a19a1836f092a950253fdf19d7de
58049 F20110320_AACRJC sosa_o_Page_173.jp2
73658adc9a6a6576bfeb3329a309fde0
f7cec9aefa4b3233f7731e813b0778250139e459
51060 F20110320_AACQZU sosa_o_Page_146.jpg
bef03c20e81e4f34924bd9e640b45fc1
f50c0d5d88a9d08201ca3b88e53f47c02f1fc68a
20909 F20110320_AACRWN sosa_o_Page_084.pro
f1855444914c59de4db255d9dee172a9
f079c7655a6ff9b26363add2d7e968b806831be7
19884 F20110320_AACSTI sosa_o_Page_091.QC.jpg
2f8e92d31388508aecc2f6dafc9f7229
98acd0fb35ff11ac1a1dddbb72e45a1171184cf5
39336 F20110320_AACRJD sosa_o_Page_174.jp2
c97db351b61c4d87d1bf74bf8a1e2b67
433cf3722a32e84c4259f3e087d0d31851589cf4
47477 F20110320_AACQZV sosa_o_Page_147.jpg
889a278767f3f0c7206c2f991b8ddfb9
ca075fc7b5ec9279c70ef458a38cf3fc5b197814
40712 F20110320_AACRWO sosa_o_Page_085.pro
d0376a226c873ee8c5daf66595a52cc0
c076c7b322afea54d0fc1d85709362d10a354e75
59980 F20110320_AACRJE sosa_o_Page_175.jp2
0c5ecf81a414d4771a840c8081cceba7
11f3baa72f350da0ad0af0abea75f59f81a2d60b
35935 F20110320_AACQZW sosa_o_Page_148.jpg
3ff8a43e64ce5d811e806b7ba62deab4
73ac8549eaa4e611e39954de3adae90372acc1f1
37614 F20110320_AACRWP sosa_o_Page_086.pro
35c23708078c0841c1fd455a12c5e750
0d67eddc181798e76d94f00d0ea18d4be20d257f
14733 F20110320_AACSTJ sosa_o_Page_093.QC.jpg
ce084fcda0d41f406306f14d58103595
3ad7d947aa0a84c1787f6230d34bb94a7cdbcbe6
79987 F20110320_AACRJF sosa_o_Page_176.jp2
cc05797be549cf773b6ebf462c51d211
9746822c5be9d95e05766290f22308e55846207c
44188 F20110320_AACQZX sosa_o_Page_149.jpg
ba7821817b322388e1fd29126a5b8eff
05eddeca8debc6492cb6867bee8b6b5cca7e665e
51344 F20110320_AACRWQ sosa_o_Page_087.pro
3e2af01617791a6777ecf1e9ed1c68af
f78062838c9d3a5b0cd1fafd865b4895cc05dbe5
20735 F20110320_AACSTK sosa_o_Page_094.QC.jpg
718cb5c384b4724055115078dce47527
b2b437cf40d3447d8472badadc019364d5a97233
71970 F20110320_AACRJG sosa_o_Page_177.jp2
30091f9f2aaf3a579261a075bf3420a5
ac551fc9135c9263a767b9eabe7609cc3f133cda
31871 F20110320_AACQZY sosa_o_Page_150.jpg
9485824d870a054ecefd9eda1ce70437
6867ec589d0de076fef559afe77c32305e78d13a
39751 F20110320_AACRWR sosa_o_Page_088.pro
573c57352c3765ef74d122359cd2b918
cbcc6b6202d6f60daf511ff52ffa1939c85ecd15
22140 F20110320_AACSTL sosa_o_Page_095.QC.jpg
93230cd49369f4bf6518c170fcc90fb3
f258ffcbcbaaddd4a2383b377dca88f898ab1955
64892 F20110320_AACRJH sosa_o_Page_178.jp2
f81c5d5b32d60a92558c296cfc06244a
c0c713b37ea65765abd1558aa887016a8a18bed5
51635 F20110320_AACQZZ sosa_o_Page_151.jpg
30463e79d8331be09a4d8aa2ae8f3266
44fd0ff699c990a24ec3c8da592e15d10410f9b5
106 F20110320_AACSGA sosa_o_Page_125.txt
f4275679e66cc573c6ab6eaebea8b254
6dd13c135bb0702aeccb5cff7e24afff3a77817f
30885 F20110320_AACRWS sosa_o_Page_089.pro
669ca08bcbf68ef70f4dd8316e8c73b3
0eb90bfd67a528a44c681f215c332d46ff02da9d
18944 F20110320_AACSTM sosa_o_Page_098.QC.jpg
d16ab0aa1070bcc7c9c08aec8f34fed9
c01a2a77137e217f0860d0179ca6bf8d8072a2fe
71887 F20110320_AACRJI sosa_o_Page_179.jp2
82f160f5ffbcdabe642788ecf1d76689
94b4bb3d9759554f33971c3c4fefcd9327e02e64
2739 F20110320_AACSGB sosa_o_Page_126.txt
fa849aab30b65fe9bef7ca111b93a02e
18fddb17abcaf2107ae571de7bfbcdb3d4c92904
26243 F20110320_AACRWT sosa_o_Page_090.pro
a256782ce44fa928d8caf45551045240
eefedc6a9c8193f36b050206b1bab0a49c9a229c
17456 F20110320_AACSTN sosa_o_Page_099.QC.jpg
6c3bfc91fe4eca64f8570af56d9bf2c5
80f6fe572cf0cc21c4ac8360f357eb8482b87200
66049 F20110320_AACRJJ sosa_o_Page_180.jp2
1198a884ab446e0a8e70179079e11cf9
969c593a8c0caf2b7d93e2dae307bf81f5d51e56
1513 F20110320_AACSGC sosa_o_Page_127.txt
7852e66c2fa70662df69e6419cf6a0cd
91565bb4503c67bb2f9822e702c82de820e35119
48610 F20110320_AACRWU sosa_o_Page_092.pro
3ce9e3af2141d55461d1c144d54e702d
a65467c93ede16a8418503dcd9a94a4d5a4ec709
17251 F20110320_AACSTO sosa_o_Page_102.QC.jpg
72fd56a7a4de41ea8f15bf377e8b994f
eea43ca2d3f6ea6033049db0f8c6185c423a8324
49143 F20110320_AACRJK sosa_o_Page_181.jp2
3cb28e622354aa5ca38ccc848d8f87a3
a522401a75e81c854b8306601f8f06156be52a7e
685 F20110320_AACSGD sosa_o_Page_128.txt
a3d864d8bed07c2a530118bf44944213
0b817354042ccb7163d5648b5ea54b8f3b628c62
27807 F20110320_AACRWV sosa_o_Page_093.pro
3be20cf9d11b6e5e3107dc0b0109bc64
580256064e9a55b9237756f12ae2536a10312c8f
20605 F20110320_AACSTP sosa_o_Page_103.QC.jpg
e4862d11d1fa2d2bd9c9b19cb4914c50
1c644c18fe2892e0b9d855c69aab08b8fa0bf94f
55411 F20110320_AACRJL sosa_o_Page_182.jp2
68bef6ef9f700b1765f536df79938ef8
5eeb928f40938036236955b51ca7a5533a2a5ef9
261 F20110320_AACSGE sosa_o_Page_129.txt
40f916da308938c498e80abb9ce2b1bd
3c5c1d6a118854d6d2f01bbd000999e97fab4eb7
43883 F20110320_AACRWW sosa_o_Page_094.pro
a6d7af1a2e060c6a9a3991e152c0220b
683c468a8293256921a254015c3ca1d8245e0f0f
20497 F20110320_AACSTQ sosa_o_Page_104.QC.jpg
f223087f25cc59749618f56cc8e05b98
bd005bea9caadfc07434bbbcf0f89a78451e505b
48214 F20110320_AACRJM sosa_o_Page_183.jp2
58f8ac9921afa8dbbe8deb7453f905c4
884703c06bb924d18ac181fa822e4f754f223ded
1924 F20110320_AACSGF sosa_o_Page_130.txt
31db029a7e57f84eb6d6f70c92134fe7
ae7b45d3f3add5029d2bce9d12ffef75c8ed87ec
32963 F20110320_AACRWX sosa_o_Page_095.pro
44f37995ca34b40937be05d7f4304b6a
bd37ab29fdb8905e641a6d039785ad77f9033051
22033 F20110320_AACSTR sosa_o_Page_105.QC.jpg
327a96a89fa3f799c447a8804d527116
45cd52c3c88b5b16a289a6cef1c42ce3dacf7a9e
74591 F20110320_AACRJN sosa_o_Page_184.jp2
952bdaebcd4958c2e85249db1650aa2b
9b282a9f57ededb8bf30f46b0aa119c2725cedfc
1929 F20110320_AACSGG sosa_o_Page_131.txt
372b47461db2c1e41ed66bfadbac3ab6
6e8fd432339cb2416cb4137ef0cf706215ee758d
60907 F20110320_AACRWY sosa_o_Page_096.pro
c864a4a89d21d4d0a8c6692aadb1c11c
3f63eff6ae83d6506bcef9c02d2caeece80b1bd0
19867 F20110320_AACSTS sosa_o_Page_108.QC.jpg
d505ed9dddf8d90373ee876fbb4b63af
d68821c31088b3123f3ae859082e13ad34513de7
64272 F20110320_AACRJO sosa_o_Page_185.jp2
387c8ce870398f5af22e7aa0d9863687
54854be3ca897b35d8af416aabaa4801b644c650
117 F20110320_AACSGH sosa_o_Page_132.txt
60ba2e71f3bd4410850778036658154f
7e6373741ec42927c447414a21e4071cb54f0c58
41183 F20110320_AACRWZ sosa_o_Page_098.pro
46c7aca164e178797ea02003f44fcda4
8941c3da88e824772c3e28e605b8d0354f453c24
18953 F20110320_AACSTT sosa_o_Page_111.QC.jpg
241e60ad4d3cb3e6b5b483921b883dc7
2d6e2edeed66c36c25e287222a489e9bc26ef651
61183 F20110320_AACRJP sosa_o_Page_186.jp2
944be2b402a97c66dbbba660582350ad
7b09f45560c422825078072eb72bf7837d9e22c6
259 F20110320_AACSGI sosa_o_Page_133.txt
59676d33bb010896ff4bef373580bd7c
fb18ca1338cbf5e8abc810031c0624a25285726d
22046 F20110320_AACSTU sosa_o_Page_116.QC.jpg
06cebb406d860c9f5e0b10392a060229
fb13f8748c068d6cc58d6cb7064063d7e9384c0e
64253 F20110320_AACRJQ sosa_o_Page_187.jp2
768ffa4f77760a6041f4c89a1e2eb11e
700079a0fdd0adb706e90d2fd1d36a3582c9498c
108 F20110320_AACSGJ sosa_o_Page_134.txt
1a6aa642d3084b2c1acc82186ddfccae
fb370c427d1e9adf48945d7424259cc1ba6f7ddd
21425 F20110320_AACSTV sosa_o_Page_117.QC.jpg
eb353821e960b1bb3384d7e3adaa96ff
cd3da85a343aadd74322cd8e83d65bc555e9e8f9
66192 F20110320_AACRJR sosa_o_Page_188.jp2
b00f10fa78e269514ebb73d99a209572
31905aff675ca2314df0a9b138e4b993f1783f7b
162 F20110320_AACSGK sosa_o_Page_135.txt
235a9c108a410f7cd3e8e13c56af3ba3
186b0b6b05493b1bda60ad9ad039af63bd893fb6
9593 F20110320_AACSTW sosa_o_Page_118.QC.jpg
c8cb178d26d7c6c178cc2eb6b2cf4724
ed207f776d46bea378c54a47036440ac9ba8d1af
64792 F20110320_AACRJS sosa_o_Page_189.jp2
32e2e1c1c25ba5a1c082f0c39dba059f
c91e985d7dcd336b0cc3c5be4cb7e0a7e62d7719
165 F20110320_AACSGL sosa_o_Page_136.txt
d7dc9093263d141edf8d8146928c4b0c
895a97503e1a388775dcd6f376ac34f1c9ccd7c6
10101 F20110320_AACSTX sosa_o_Page_119.QC.jpg
7d1711f3425857085c0bff1dbbb31780
4eea080b4e8230c621edc6ba9fac83a9de254502
64554 F20110320_AACRJT sosa_o_Page_190.jp2
b8af8cfc36b0d5cad9ddc2a930a0df0f
5eea2007882a1ce1c4772ec945bf5ae17f6aabd6
139 F20110320_AACSGM sosa_o_Page_137.txt
84fe4a167794524f9b7d67a9cfe3e2d0
a2928674decbfd15f4384dd96b3fd78468489bd9
13236 F20110320_AACSTY sosa_o_Page_120.QC.jpg
0d3c9c216a6b499c4b063485295eb4be
158fd8718b0c187815fc2e058a3fa4d485908542
61916 F20110320_AACRJU sosa_o_Page_191.jp2
6710c603d12d20c13c0ce05ed5edfd8f
1e86d9197ff707883a4ae9e940757b64029d3ca8
245 F20110320_AACSGN sosa_o_Page_138.txt
b10eeed098ade5173bc0714f538d17d0
69b5fce28513bc5297037c752be4c2ae881a9ac8
11615 F20110320_AACSTZ sosa_o_Page_124.QC.jpg
abe412ab5b5aec80c5ee0090d55efbb0
f16917e908ed8203c9def64ed9b564ee5221b8ea
46025 F20110320_AACRJV sosa_o_Page_192.jp2
3b0a4c36847cce1c6f80757df47c77d6
7b7e17e291ed451746b3b7464874d2a2a7482d74
134 F20110320_AACSGO sosa_o_Page_139.txt
d51dfd724ee4ba0b53dffae2e401eea2
cb5e85955a8e9a79c9e40b055f4adc1d4d50f280
43573 F20110320_AACRJW sosa_o_Page_193.jp2
e77a14e6a911076080165355b8aa34e0
318f489a68f0c2d06885bec1206a83f160a5d17d
297 F20110320_AACSGP sosa_o_Page_141.txt
e40f146a28dfc2cf2cedae92ea8f2726
a9262f20646aa2f754b374f9cf50862e690b4fbc
65390 F20110320_AACRJX sosa_o_Page_194.jp2
92d47a4978950f22a558039ed4255d00
4b1ec61e9cb3de51e9d3053c9fb3d20569e5ed49
188 F20110320_AACSGQ sosa_o_Page_142.txt
db0b71ded3bfe73a2228fe73d8fbb141
ae320b1bc73b2d213233915b26e7ae2777a545af
44057 F20110320_AACRJY sosa_o_Page_195.jp2
d9ac7b82ad5a370dca00bf22a5ab538c
1115ce974325c60f2802572bfea701eede4216b8
312 F20110320_AACSGR sosa_o_Page_143.txt
27a65a51ae569fe0b10934e6d59f421e
ca0839d08a12afb1584a29089eeb116252da9e4b
31171 F20110320_AACRJZ sosa_o_Page_196.jp2
9f8d1eb28b74ebdab9c8aca44144c289
10db1ea1aa163665a94febd4f44873ccb960c2aa
156 F20110320_AACSGS sosa_o_Page_144.txt
ba877a6731621176fceca1dd26972dd2
42bd1bf39466db17f824fdde966a789a2ac0cc72
112 F20110320_AACSGT sosa_o_Page_145.txt
a73cd85efa83574987f9cc0d1667b855
94110203ad3e8ed88ce1c2eab20bdcb47ad6f6f0
47665 F20110320_AACQSA sosa_o_Page_054.pro
35ad8f0f8a65aa963d41b45d77e5cceb
4fbae7cce15dd7aaa010a981952e5a37a9086b07
1868 F20110320_AACSGU sosa_o_Page_146.txt
ef4c3e794a776278df1aa5800fa9a334
3dc3fa8e10fdb212d29bad8fb5be99e08035d8aa
6506 F20110320_AACQSB sosa_o_Page_114.QC.jpg
f9dbb6dfc80f36a34ec09dc2125e674e
c195f3870f9afc6d7af2a618176253f91cde5d2d
216 F20110320_AACSGV sosa_o_Page_147.txt
d426682e9d25be91c64c8a065a7ed093
5071999f6cc366a08c530d38789af3219e252566
1590 F20110320_AACQSC sosa_o_Page_077.txt
f0ecada6cc09a9eecc2a51e900a00109
f897ca57129ca5bc1629da300da587091776b975
174 F20110320_AACSGW sosa_o_Page_148.txt
7c1481ba1e7df6ac48475a73aa994a72
492844f8546f23be38cd17ab049a2c9545b3a517
3126 F20110320_AACSZA sosa_o_Page_152thm.jpg
9ece58259e154e7005fa73696b1438f0
6de9f03f750da8b6c431d2f794aaf17b3a1428f8
4404 F20110320_AACQSD sosa_o_Page_138.pro
39ebe5b9d8a04916b96cb570602ae1be
4686b150827912e030751a773234a47f752f7867
2106 F20110320_AACSGX sosa_o_Page_149.txt
517bc664c79f59bbbbb02dfb2450c5c1
690ffcdceecc0c571e4bdd6fc61e9ea81c283c75
3533 F20110320_AACSZB sosa_o_Page_153thm.jpg
848351b08976b2578d838649bd888044
4d0fb3dc474d7a33595cf76cf43d8c3f2955a95f
43338 F20110320_AACQSE sosa_o_Page_037.jpg
952e8f1a41982a03fc8c58a2b38d483b
3ffc82c1d6fb3dfb1d97bf14238f3fd53e475d0f
304 F20110320_AACSGY sosa_o_Page_150.txt
a835f3d6dcbd249908cd014e36f22ff5
94c6981cf4c476bfeee50c532d7f733a111db7fd
3319 F20110320_AACSZC sosa_o_Page_155thm.jpg
9123daa25eb8da415eef74ace9cbce90
56f9aff35af03e935c9c2f327d22d71f31a79f1f
6339 F20110320_AACQSF sosa_o_Page_163.pro
99af28fa36d8e0fc77052d261778d061
5406166f0b2a77f23dd5cd86f91e4dd3ce951960
233 F20110320_AACSGZ sosa_o_Page_151.txt
26ad5fc78afa164e50b8211a9e6a2bcc
55def7ac256c9b88802b91c51380222f21e741de
3053 F20110320_AACSZD sosa_o_Page_156thm.jpg
d994c3bd64a14f7aa35c7df9a24baf37
f7d4ebe9b69d1f02bc6febb64ac616c08a27c4e5
40755 F20110320_AACQSG sosa_o_Page_097.pro
0380356adbaa8f650c1cc50ed5fd5468
229d36015d297633cf137da0fed16a1fbca62ab3
3578 F20110320_AACSZE sosa_o_Page_157thm.jpg
fc5b7b2e71502c9b294258558cc6f90a
b3fb1b841b5c29073dd007885404450c0cfad6d5
46719 F20110320_AACQSH sosa_o_Page_157.pro
b7dd1f25e953f95b7fa04f9de2e11853
26676a55dc9f13bb6e29d5c8fd73d84b7b611eb8
25271604 F20110320_AACRPA sosa_o_Page_108.tif
8d060b3841ebfc55c6024cb29e5736eb
9298c2abcaf286403e1be2575a35cf3c88d2a6c6
3446 F20110320_AACSZF sosa_o_Page_158thm.jpg
012f0dec672164d5042e8b68d5e905fc
4d483cbe7f133eaa3c5f6bfffc6b1af90f2b7ced
16755 F20110320_AACQSI sosa_o_Page_139.QC.jpg
53d5b86f4ba552987f0be4b5104029fa
cd1afdeb5481c1104c94000839da0fc890091770
F20110320_AACRPB sosa_o_Page_109.tif
664600b249f79b8427ed212c1fcfc21e
a026b16b2efd1c16e5abd90540b12e48808a7832
3569 F20110320_AACSZG sosa_o_Page_159thm.jpg
4cd882b15a2ecedcae32dea11565a909
bcfbc2e765644a3ff47a2005372f2fee5de7aa40
64600 F20110320_AACQSJ sosa_o_Page_017.jpg
8ce53acec55f850ff78eecac7a924574
977f81592841a6cbd9962b7c222aca9871928aa2
F20110320_AACRPC sosa_o_Page_110.tif
e5082a6a178d89af2af0bfa19c1864dc
57012a386ba82a73d66aa879b4735ea77029952b
F20110320_AACRPD sosa_o_Page_111.tif
75cca02b353d15d7784552bffffda85e
a80de2ea676ec8a643f8acdbe447c0d1c2cd754d
3302 F20110320_AACSZH sosa_o_Page_165thm.jpg
46303572a2ce1df7175f5a7152a5f634
a277fe376d891da113b2378e1f76ca966749325a
3026 F20110320_AACQSK sosa_o_Page_181thm.jpg
068756250c9b92bc7d875da14c41f38c
30746cdd72960a55fff20fdd3b8b9c662308eabe
F20110320_AACRPE sosa_o_Page_112.tif
87da71de9208a29b137c5e9d8ec93b97
52bc38cb4ea7d29137a20245a6e524c86e736cb1
3299 F20110320_AACSZI sosa_o_Page_166thm.jpg
ba0686af53c35f0bfa156be54e293dae
6dd4297586f17cec910858cd13dc5a3bf7924683
51484 F20110320_AACQSL sosa_o_Page_039.jpg
b62ee68d0af5a2e96dfaf4a4c2da0c70
5b0e8ea09ad0a2223ef6b4cf3b6398f82e703a60
F20110320_AACRPF sosa_o_Page_113.tif
6183a8a7f2847462f49d8af15e311d47
78b72035162ee7212daabcc582e37b3d18a431fe
3646 F20110320_AACSZJ sosa_o_Page_167thm.jpg
ead910def9b681f8da17f1c175c73338
1cd86d736bd42db5122715b8d97f6ea1ca3291db
5488 F20110320_AACQSM sosa_o_Page_002.jp2
ba9265bd5e8f70bf61ea57a7ce547e49
b0d496aef366bad68cd251f47104f032d36faefe
3310 F20110320_AACSZK sosa_o_Page_168thm.jpg
c9da1a7188c886ae5dd736d93d818d80
fd970141a8f86c5f9153731fac9c294ac3904bab
F20110320_AACQSN sosa_o_Page_031.tif
ffb3f616e8518546ecbcc46c1fe265e4
8c468d3b1a141a313bf90c1c3e868ca07ea2f976
1053954 F20110320_AACRPG sosa_o_Page_114.tif
4c252478441afc5564622077de811532
80b0fdaaf2d2e6e76bd0f3f13701889b2e603742
11081 F20110320_AACSMA sosa_o_Page_219.QC.jpg
087641b29f4234a86e2face38b3a24e0
e27a27c3722b1c1196481729c287799a104047dc
3432 F20110320_AACSZL sosa_o_Page_169thm.jpg
de74f368e8c09417c7792f7a469e3bf7
6d42298bae88f19dccc6ad2dc7ac81e15e837355
F20110320_AACRPH sosa_o_Page_115.tif
6f5396cbda1c63a33322925ba0a9bded
e93a079b71a27ae3037db6b655601edf408a8225
22891 F20110320_AACSMB sosa_o_Page_223.QC.jpg
aec96daab35d34665c95edba4cdf1f94
bc77e2e97786de556492a7eeabb4155153720c9e
3004 F20110320_AACSZM sosa_o_Page_171thm.jpg
28a004c38e2a1e900e9ea7f9e92be1c9
c1d9154e3c1d82b1fe8064b267c67741c9b02cc1
3209 F20110320_AACQSO sosa_o_Page_218thm.jpg
01cd75973a52f4568063a61968065d02
d246af93ace116e355a64dd57ffbca9eac31a889
F20110320_AACRPI sosa_o_Page_116.tif
0e77704bb5372a3d4bdb3d16a1486776
b13cb3a4f7d5fcd0281c782de407930253e7593a
3191 F20110320_AACSZN sosa_o_Page_173thm.jpg
4be9ea45a34993daf2c53ccd055492a9
55c568154c420ba8fb607b73f4c1ee012f16eceb
32804 F20110320_AACQSP sosa_o_Page_091.pro
cd8c9eff1092b7ef044ef99e010b8187
7407a91942a7cd86848df6d081b56d937a976811
F20110320_AACRPJ sosa_o_Page_117.tif
21f081e06edd4e4332203b6e3cec1fbd
cf74c761ce635ffbc30e8fc127591c61283efd88
6006 F20110320_AACSMC sosa_o_Page_008thm.jpg
e2a715712cd7c4e445cbd9f61cfaa80a
672a9ac0a9c4bdbf1871876dd8805cf3184f583e
3275 F20110320_AACSZO sosa_o_Page_175thm.jpg
63e0263929689ced0ca3857235c54b5c
a44f64abca1182fce98c0e855280cd3f85f615dd
2021 F20110320_AACQSQ sosa_o_Page_087.txt
cb627b9bfb5d935ffb9385e32fbd8685
9ef20ec3bb4420125839cc0acc9dcc926493224d
F20110320_AACRPK sosa_o_Page_118.tif
c859e4cbfd32d89c690c0aedb271b07e
ea609da5fcc8a7d82e8918db3c1b31fa2f5fdcb3
3676 F20110320_AACSMD sosa_o_Page_176thm.jpg
5245f556de342789d36c881050cbc425
354d30406dd9a496e8106f49ec569ee36be6c6d5
6961 F20110320_AACQSR sosa_o_Page_011.QC.jpg
c992ef4363cde018f3f60c6e24ad1b7b
ca83133f57f28e773848a2f98fb67725bf30404c
F20110320_AACRPL sosa_o_Page_119.tif
38687ebee39660d69672e7bf3f08fde1
128f419e463a1ba270f27532a5a5f565ac48d949
9896 F20110320_AACSME sosa_o_Page_195.QC.jpg
3c020ce4b51b9fb9eedf7c4d180bd3dd
a5ddd75c06559feb7652acd4f10e759ac00dbe4f
51767 F20110320_AACRCA sosa_o_Page_206.jpg
ead1791c95cde32e192fd58ba495a8f6
768bfb7d4ac09ec9638dfe2578b0abac1f6ba290
3614 F20110320_AACSZP sosa_o_Page_177thm.jpg
659b8ca53b96c6f7817c46aa367cde05
93652a73e7c8c55260da7c3f91f0459b692c0455
221 F20110320_AACQSS sosa_o_Page_140.txt
57c0cfc071a16b9b48ad92e5a3fecde9
08dc6b324578d3289cf9b38fb41bc11a7f6fc5ba
F20110320_AACRPM sosa_o_Page_120.tif
5b1f18be3f43eb3685758021c8fda72b
a9c3b0616ab275450e7ceea35941996011a63a05
3055 F20110320_AACSMF sosa_o_Page_162thm.jpg
6f0ec7fb16980013c9ccec839509d4cc
f8575999b8a5334a8040d750d16196f58c58f873
49703 F20110320_AACRCB sosa_o_Page_207.jpg
63080af3421e40c463c52475f4c27fa2
0f0cd145de16f40d82d1f0fcbb4e8a0774f95815
3626 F20110320_AACSZQ sosa_o_Page_178thm.jpg
a51aea58685c76a53cf304d40561e058
03bb3c791cdb3a06044bae20e86142140efc4a50
51279 F20110320_AACQST sosa_o_Page_062.jpg
605f0c05e7b9cdef32bd7f167c5c65e1
7848bf78b7d013d1c8b53baef02f4f372f025cc6
F20110320_AACRPN sosa_o_Page_121.tif
1a7de06318913e6aa83d358472b460f6
a68be7b0479fbad787c4a73a4226de14567bfd51
5154 F20110320_AACSMG sosa_o_Page_047thm.jpg
c90ded47850e51b4ee511ac4a29a20c2
c6b2bde8217782b0b1a4cc29befd27b8907e7d61
46836 F20110320_AACRCC sosa_o_Page_208.jpg
8a62f1c8fa2304dc3cb7dfa515eece39
8bf7fe9408771f755d28ffe8e366aa0b0feb2031
3515 F20110320_AACSZR sosa_o_Page_179thm.jpg
d8f9cb9a31a65b5e43f36ea50d1abdcb
fed1dc9b44013c9b7788e3dcad396d6309063769
F20110320_AACQSU sosa_o_Page_129.tif
59261fac37faf20423fd7257dc6e1a58
5d35c1d69200d82e257ae2b685560b23a2e9436e
F20110320_AACRPO sosa_o_Page_122.tif
4e108bcfa3e02e3fa6e02225db0d1602
238d1e67c3ae23e6880dcdb99281a0ce904bcb59
3187 F20110320_AACSMH sosa_o_Page_182thm.jpg
3753e9bd469bdf1cfa18b34f6fb8d419
ed0639ceba1e0882f2351fcfb0b0da2d701fa693
45243 F20110320_AACRCD sosa_o_Page_209.jpg
822b115ff7e3abff2dacce7de550a320
af4c2ee65ac381728d692276646651ba32f5e2e2
3394 F20110320_AACSZS sosa_o_Page_186thm.jpg
d2827cd91e6591757ceb6394a6029dbe
3f1a900050a6cae042e2dbe03a520fa0633977df
65663 F20110320_AACQSV sosa_o_Page_094.jpg
28abbd96ac7966ce413ac56ecd8f3386
36c4b57319cf0172fcd288ec0b4bf49b83656f58
F20110320_AACRPP sosa_o_Page_123.tif
49007640593e4e802005449213753a33
3216cca00868f0b567e94de65a194c305f2b4294
3561 F20110320_AACSMI sosa_o_Page_184thm.jpg
4e71ac1da5ff30f681aa603c96c1aec7
d0f6a602f1e689acf0a478ac4f9a00a2182672c9
48607 F20110320_AACRCE sosa_o_Page_211.jpg
f7b695351de0bc6478e303e110e49053
75a07b147848aa665420486eaf46b14c8faf856a
3443 F20110320_AACSZT sosa_o_Page_188thm.jpg
57ad73f396b52b38bdf741a6ee897d1f
7c33a516da07e5a8614493283490cfcaedea742f
F20110320_AACQSW sosa_o_Page_173.tif
a8b766ffcba8bb95b36bada2a68c81e5
0217e0670556a394c278feefba0a0f29e0de00e1
F20110320_AACRPQ sosa_o_Page_124.tif
54db39947ec938c291fb057aec7c2407
73bbe427e269372cbf72c3dbf6cb4ecc16aefc1a
18817 F20110320_AACSMJ sosa_o_Page_115.QC.jpg
b84507e351587d314f17faec65f9f34e
a8e7cc1c525a8b6e7cb7bb93991dad3e22842eb9
55184 F20110320_AACRCF sosa_o_Page_212.jpg
ea70e7af84d9e65f70fb7622745a68c4
3cf4111a2bf90c37c04d89148c05984f75e0e64e
2960 F20110320_AACSZU sosa_o_Page_191thm.jpg
638beff6c2aa4988e885a8750c0f6e9a
072ef939d66a46ac5f9ee7d66dc747a47a2bd2e4
1819 F20110320_AACQSX sosa_o_Page_120.txt
48c4c41b11444545524b32228dc3ca18
1ff1f0eb370ef34a4f54aeb6cc9d9b9393c01a4d
F20110320_AACRPR sosa_o_Page_125.tif
c24ee975e2cf89c7adc098efcf7e0b6c
ac9487f28f9115b2ef2cf16e83c6800f4becf635
7914 F20110320_AACSMK sosa_o_Page_009.QC.jpg
19a6b07ec05c5a473093d61a20e9492b
e39fb51fd13445bac509b4851a51f592fe89c027
44579 F20110320_AACRCG sosa_o_Page_213.jpg
0273321c247cb1bf4051903239345828
411f16a3b00af85583a1220571c629a9924744e8
2841 F20110320_AACSZV sosa_o_Page_192thm.jpg
ac51f23ca3dca9968011aa601d34abe2
d05bd05751046da591658208e49d0a52f433deda
49909 F20110320_AACQSY sosa_o_Page_126.pro
8b21731c42026182a0569465d17590b7
dde52e18996e977580dd7d991394a114ab94691e
F20110320_AACRPS sosa_o_Page_126.tif
312a944c5716bbd4b117a24c7ebcdf97
74e06066f7e5a86a3509aec882b8b6d9f04cbfea
11116 F20110320_AACSML sosa_o_Page_156.QC.jpg
cf5fb084221126c682eb4c900072ec0e
c8b30a4a3e48c82f72ab8853de23e023f0b2d2e4
45154 F20110320_AACRCH sosa_o_Page_214.jpg
71caa499fdc316d233b20e1766c7080f
912eae2c95532988cb2cb49dd3c084a8da043207
2705 F20110320_AACSZW sosa_o_Page_198thm.jpg
f62a85e471840e232a420d4129359276
5bdcd2791b42327beaeef18c7d7ebcf02ca9be9b
27113 F20110320_AACQSZ sosa_o_Page_009.jpg
8e1ecaed57355968056446605821eb15
e784ffb9eebd45a450ba7873bf90a24425bb6ce8
F20110320_AACRPT sosa_o_Page_127.tif
70afa9945a21106083096cd5ff79a107
a3693c989d4f8fcc1e365e8907dc2f3d6c02d769
9427 F20110320_AACSMM sosa_o_Page_121.QC.jpg
bb266c09783ac4ab99f8195a04ea0977
aedb84ba289af29f19b24119a79f2f149645ec8e
16562 F20110320_AACRCI sosa_o_Page_215.jpg
bfb0c97bc3bde1b72c256b3023b1ec57
f78087a0160f83c790b2755dc35861c3b0109d99
2926 F20110320_AACSZX sosa_o_Page_200thm.jpg
2c81b090ad638f93144a5d074dbc8b19
f8ce1a69b1556a92792be473feab526dd9fd22f6
F20110320_AACRPU sosa_o_Page_128.tif
52aef9517b9450307facfc7eef185e34
0bb7c884a319494878459b5090a44caabb1e6b87
5063 F20110320_AACSMN sosa_o_Page_063thm.jpg
89ee0ec6b8a147ccbe976b15914b4d30
e4218df17007ae7f5b2b43ffdac59dea054c2df7
41409 F20110320_AACRCJ sosa_o_Page_216.jpg
23a0541a2551471b818957af887a62d5
72454621e06d0966c107df779d4ef149899ad28e
2420 F20110320_AACSZY sosa_o_Page_201thm.jpg
0150fc34b4918e265cc2aec542f91675
b52324b9902afca771568810ae3ae58860c4fa03
F20110320_AACRPV sosa_o_Page_130.tif
c174b18cb85d9152d28db12ef7305159
83a8c0b6d3bda7f1835e733b2ac5313c562eb8e3
3264 F20110320_AACSMO sosa_o_Page_119thm.jpg
3b4095c26aa267580644da63f77223e5
b28b37a2ffb59b183ddf9dbf136d02d9b21139ce
40212 F20110320_AACRCK sosa_o_Page_217.jpg
4167163988f3e29407278085b61318be
a00f4acfa9a34b2fba96be7f3820aa0df5844adb
3494 F20110320_AACSZZ sosa_o_Page_203thm.jpg
dda06a5ae4660e2583b4837781907fdf
bf8f79cd1e54fbdbdfdb2a15798bf143c9bc708a
F20110320_AACRPW sosa_o_Page_131.tif
9a5b514f6f9f1233c0245c81d3ad8e89
e49ef9c39f9ba42aa19f7518be47110141578158
5850 F20110320_AACSMP sosa_o_Page_055thm.jpg
0bfaa738f45da0e52c66da30ed15f503
3bf0179d5e11ce69a1db456de03071ac68142b52
42638 F20110320_AACRCL sosa_o_Page_218.jpg
f64f9911185ef4bc3e2da2a6f9b95bdb
e84d16f25b8f0bc3a40eebc91172a6d6461ef30c
F20110320_AACRPX sosa_o_Page_132.tif
73e64cb27e9a0b3ec39b9a17ddcdc860
3adac0ee33e8b664a76e32f091ccf23b8a1086bb
2575 F20110320_AACSMQ sosa_o_Page_016thm.jpg
578ad30db0a74d5bcf207a739517e105
9615094db46b55685b69f413a818db5b278b5bd1
40007 F20110320_AACRCM sosa_o_Page_219.jpg
c28df19b3f32142b62950c99505f6765
b172bbdff67d3623cb65be051f3f6fabff9dd061
F20110320_AACRPY sosa_o_Page_133.tif
3bd88aff773f11f9e7637f39e18ba248
9209ddc6a3ebb62f4b1f82505b5e61c95f21faa9
3741 F20110320_AACSMR sosa_o_Page_147thm.jpg
c8a9d2c5ecaf84ee021945affba37530
80486c1bc9886d973373cee9ce63c2041715b715
45009 F20110320_AACRCN sosa_o_Page_220.jpg
8dfa8b5581689d49a3ec40d8d37c32fb
f5e876a1ff23787f81fb3830fecf5c67945bcd5c
F20110320_AACRPZ sosa_o_Page_134.tif
9ac9b919da1c6034e94d924a30a3f8c0
cd74bdc6dd0215b53019571135c2a725a0ef54c6
12131 F20110320_AACSMS sosa_o_Page_143.QC.jpg
f1951830f3b0fe2a10395651d4ddf2f2
9d113d73cd867d8860639bc665c065e354d07976
33526 F20110320_AACRCO sosa_o_Page_221.jpg
76db518e01610b07fef72ffcbb853480
214383dad4209e7b513c5c14829cfc9b626a4a20
2582 F20110320_AACSMT sosa_o_Page_197thm.jpg
a3f6b9026b8616e10fafe08040226799
4cc04d85be799859c9aee88de3227700e576efeb
25042 F20110320_AACRCP sosa_o_Page_222.jpg
eea5953ce8be2e24f0117368e274d2f7
cb6c44cdf5153799f15b5e4ee2f96438b00477ee
9026 F20110320_AACSMU sosa_o_Page_129.QC.jpg
8e4cb2f634d70812599e44feae4c1622
322c6e24209848b3ce5cb353a445a088ca0f0223
60501 F20110320_AACQYA sosa_o_Page_098.jpg
a4c1cd17b7ff2d0211770174d59f9298
79fa2a05b3868fb93dbdb74c4553a47f73bf0835
79648 F20110320_AACRCQ sosa_o_Page_223.jpg
5c03652211aa153ac98a6d4d8bfe0339
f8a6eb6d7da37ea9111f6fde92b8f7deee5b36b1
21708 F20110320_AACSMV sosa_o_Page_045.QC.jpg
7b8dbda17e4d8b6604ce0b46cd0ca00c
30b2e1ab36674619b7e0dd8a11c0116874a49632
56348 F20110320_AACQYB sosa_o_Page_099.jpg
73684e212828723043aae08e8eb68900
027cfe5227667528aa65c05154a8e9d314e180d1
40257 F20110320_AACRCR sosa_o_Page_224.jpg
58610cb746d0bb7c655c066e11b09173
ebe12b9233d27434ed4d503143c31a8f9888e587
6039 F20110320_AACSMW sosa_o_Page_223thm.jpg
611bf91ba915a3d20310711704f5f0fe
526f04f348309d97c5e0d7750b7f93641b76ddb9
70901 F20110320_AACQYC sosa_o_Page_100.jpg
dddb40f613684cced785364f0601fdc7
1bc2f5fd5786d3870f947a27da32318dfdb63c52
F20110320_AACRCS sosa_o_Page_225.jpg
f312defe2299e9d4e704b1c4783b37a4
de5efa47f26439d61f4e6a4681705010607b14af
12662 F20110320_AACSMX sosa_o_Page_178.QC.jpg
389603056bb3d48b1091f8f99d13e77a
7941a4cd406004fe8cbe29dff682f836be36bb5e
55241 F20110320_AACQYD sosa_o_Page_101.jpg
03dd0843b46da15915794fb5d2714ac4
9c4878651025ba2f707a016cf96f5d05d9bd7181
22924 F20110320_AACRCT sosa_o_Page_001.jp2
5b16c34c1a970605727ff45171badf50
c7ebedc5d4d018bdb8d66ac8204475534506342d
3396 F20110320_AACSMY sosa_o_Page_133thm.jpg
4956ca1622ddaad4b3c565033105cb1e
f965f175284dd63324c12e0c945477824bdd0aff
53880 F20110320_AACQYE sosa_o_Page_102.jpg
ddc8c23647ed22d97b2fc408e3051bee
1b834e801a4585e08162cb33d50da10be3ff64dc
13883 F20110320_AACRCU sosa_o_Page_003.jp2
56513e99fe0dae35c663172a59d179db
a2adb6d991766be847ed203fe62eaf796538dd7b
3214 F20110320_AACSMZ sosa_o_Page_163thm.jpg
5e3a7a2236a13012311da7818938d1a8
6b7ea8725de0e628012c2a6a3ab80358243d84de
66670 F20110320_AACQYF sosa_o_Page_103.jpg
5e56629cacccdbd3f23b21c5e8b5b51e
6bb7bc173b5a7d783f1707f675c024c6039af301
75618 F20110320_AACRCV sosa_o_Page_004.jp2
a9565a9d9ee6d9389c44aa746fa03d3b
73f4d2904f24d94fa653bf387054c6e6ea8bdd0f
62528 F20110320_AACQYG sosa_o_Page_104.jpg
8c560ce98ec478c15cb1c2d868d0293e
05a93bb574c20c0970d7d35adefa6b7fb92b75c7
1051984 F20110320_AACRCW sosa_o_Page_005.jp2
da289d420eaf88387bffd4d4964c7f9f
1a92eecf8694e1c109820aa5a3855e6816559641
10883 F20110320_AACRVA sosa_o_Page_043.pro
915d7803fc560936fc102fb1d746230b
8976186e2e312d64af22458037752ba23b6e107d
74318 F20110320_AACQYH sosa_o_Page_105.jpg
a36ab2a4259da532c18e3411f76fdf58
5655c348789e8d9899db41583e9c5eb0fe525851
1051977 F20110320_AACRCX sosa_o_Page_006.jp2
8ad6af0be528b6dd81a7b5a7dcb63f39
859355e8313148436fcfaadb253df90fa0328f7d
40384 F20110320_AACRVB sosa_o_Page_044.pro
e741cd56fcf0e8001ef652c9e20a7ade
ca3b1deca83d21ccb04013046d1a69ba9df14f7e
73623 F20110320_AACQYI sosa_o_Page_106.jpg
fe366fab608a802f12f125a76ffcf932
6ecc4f5c68a6725b6f8489a2e620fbeca5a38681
1051986 F20110320_AACRCY sosa_o_Page_008.jp2
f15d9654413957260a9a753c6f9ac933
45c8b729edb5ec45004fdbbf2562f21a5cd3c797
39406 F20110320_AACRVC sosa_o_Page_045.pro
8960645960e17d1becd9dd63ee9c3ed2
42ec1e70d7dd2bbb204b336fcde93a7023803ddf
68090 F20110320_AACQYJ sosa_o_Page_107.jpg
7bf797d33070d6b6785433aabdac35ee
86eea64010fa63c33f7c802c53508ab0cba47677
27154 F20110320_AACRVD sosa_o_Page_046.pro
bb651c2103522fb356458d92d700d9d5
a2655e3585cb0be8427790b67ecdd29fae87599c
62585 F20110320_AACQYK sosa_o_Page_108.jpg
1506fa8ce902fa988d523d822e87e459
7cfc9644b2175764a4488c8b93acabef089ca927
552607 F20110320_AACRCZ sosa_o_Page_009.jp2
b4170fc324a68d07b77a043ca5cef856
69287c49e2451e0345173dbf463be06739b7d7dd
38522 F20110320_AACRVE sosa_o_Page_047.pro
d85b0ffc0b5f3d9f443d0587e278b07a
f14fddb205f110ac58e0339141873e6ee450ce95
74050 F20110320_AACQYL sosa_o_Page_109.jpg
a96f0c378a395990fe2d8acb8ce19ee5
5abd56aaf03ac51ae865ded60f5857d3909ec3f0
37596 F20110320_AACRVF sosa_o_Page_048.pro
d3dd75e222191860a83b585c8e58d6b5
81757cb5ea09ceee1050b01076f7bb43b0df7a7a
59836 F20110320_AACQYM sosa_o_Page_110.jpg
8e8ba7eb87c48ab99ff290d268b597b5
6af51a84a7e6932ecf9bb20ea87f61475d3c25ff
41550 F20110320_AACRVG sosa_o_Page_049.pro
496fce6423cdb1f46e5c9534dbbce1e2
acb4e552486c15816ca4b7e67572580b6cfb03a0
62233 F20110320_AACQYN sosa_o_Page_111.jpg
0191bca25d6372b6e02dca5693e8d6e4
5aa6f4fdeac10788bf809390f947cc47d682077e
35676 F20110320_AACRVH sosa_o_Page_050.pro
3d6c048f5513d564b605b1d6f4c52695
eece1e68f561126358ee81ac18fa592fd4d41155
16370 F20110320_AACSSA sosa_o_Page_039.QC.jpg
81b85886f839ddaf26f31083506044f4
cdd0eb862cb7c585ed351f6fcc825893f1a8b5cd
68943 F20110320_AACQYO sosa_o_Page_112.jpg
acdb06178e7dd487fb114615a237ccc1
1e6ecfca0f7c1cd93d2b370001018206120b48be
44446 F20110320_AACRVI sosa_o_Page_051.pro
b96f7e58c9acd5e3104aa4a9acc1fcf9
d64a3061492d204237c14f758d97f9ff4a8def07
18708 F20110320_AACSSB sosa_o_Page_041.QC.jpg
31aab915a56772b47935a896b7ecfb1e
914e2b602eec795e56da3555ce2d9df223d9c09a
66823 F20110320_AACQYP sosa_o_Page_113.jpg
7430c228848df15147a3eaa7158916f9
74d86a2112eb2ac88ed4c42888fa3ead673192a7
38794 F20110320_AACRVJ sosa_o_Page_053.pro
385c5200404bdd786a8cf9b7a04bd0a5
c5768b500dcb1764fc6ad4d5a0ef1ab8bc5e92ee
20618 F20110320_AACSSC sosa_o_Page_042.QC.jpg
7010c24c13c3b163e4ea59c5b99eed02
8b978d6a8654bf942cde1ef4b8c62f289d20ee04
41752 F20110320_AACRVK sosa_o_Page_055.pro
b77e033e20a4cc6052d94e3a85cdef76
15851b169316e136086e9ec700ed5045f2e67601
7200 F20110320_AACSSD sosa_o_Page_043.QC.jpg
1612fe219c67a8865dceaf3a62a3e2d2
3ea6d0b057e3257e438d22ce54ebdde382e704b5
19940 F20110320_AACQYQ sosa_o_Page_114.jpg
8b27738300252c6e1c198ecd5194ee0d
f2e83da6106cd9e44a9a58615a5aeb5e37f80cd0
36010 F20110320_AACRVL sosa_o_Page_056.pro
1489f3df04bf8f06caef2a272d3e1adf
c48fff36222429e04e1c70ac6a8feb93dffa10d4
19644 F20110320_AACSSE sosa_o_Page_044.QC.jpg
35ae3941e6abeeac8a106343aec8b1c6
5aa6473018ad98aa611422b00fda531c6e580fa5
58495 F20110320_AACQYR sosa_o_Page_115.jpg
682fb97c09a283b85f260c82dd3b0728
c1143c905696117d047adcf238f6a7707e8f6a4d
17662 F20110320_AACSSF sosa_o_Page_047.QC.jpg
312c69b13e23f1ef4d879eb554f2822e
1382e6a6997872e7dc84a92691514057b05fc76f
55855 F20110320_AACRIA sosa_o_Page_144.jp2
c40f5ef267337cde8045d21f815018ab
a486164aa298800fbb2e4445ee0d6d0850c69d7a
68445 F20110320_AACQYS sosa_o_Page_116.jpg
bc215373f4b675da29f37ddc5355b444
8884397097dd0800c6754c14eeb62df6d2450f20
24401 F20110320_AACRVM sosa_o_Page_057.pro
443fd2c95946c2f0a033f8004d2f2384
f6863cc2debb38a7c528cb4d068307f2fc114fe7
19702 F20110320_AACSSG sosa_o_Page_050.QC.jpg
68ae7f62d5f6f44fe72a2ba2b178a6b8
330b73450e5d6487ff7b8d4dd535b5e75ea250c7
52083 F20110320_AACRIB sosa_o_Page_145.jp2
435bc059460ddfc98ca8fd603343d833
25b8ade2f041699eec46fd8d4d0ae7c0429c5c11
63957 F20110320_AACQYT sosa_o_Page_117.jpg
72a8eea4764296f707e5d84820bdc54a
a432dd95bd6c720bb37b801e608b4bdc76f124cc
40026 F20110320_AACRVN sosa_o_Page_058.pro
8743bc9a1ad46f3ad614b00732fb6d14
fb6d7e2840cc7bf99110bb9346eb277d96301443
20634 F20110320_AACSSH sosa_o_Page_053.QC.jpg
49545de4ded558a3a62a6a46cd3a0977
eb969fcc98008ada8abc2e3ac41742748d2c0236
75397 F20110320_AACRIC sosa_o_Page_146.jp2
99d37823a4f4dff31390b5443f476c74
9b8113ac6fcd244be40bc0e191ba00c165c1d153
29830 F20110320_AACQYU sosa_o_Page_118.jpg
c9c055da0af0321b2c1c92a30be1f2be
fb7f64ae2699fc1e840d84eec9d53eb15c7f97ca
38257 F20110320_AACRVO sosa_o_Page_059.pro
29535041888cfb6b78eb5a75f55363ff
48adb1d616f9d08ee92b022cd49a4b34f54ccbe2
68299 F20110320_AACRID sosa_o_Page_147.jp2
6e0c3a88c86253bde2b5e1207a8a1525
f6c818d1f72b4fbefee2ef963a9cc79510c53c53
31843 F20110320_AACQYV sosa_o_Page_119.jpg
331c3393f20652ad0119be9af758aa40
6fbb30dc0fd00469efa05f0f2bfe381d91bd36a8
30771 F20110320_AACRVP sosa_o_Page_060.pro
9f02963caff24930a2715d5ad41da8bd
2d6f26a03bc3aa34624714029bd2b9a7ceedb2f6
19498 F20110320_AACSSI sosa_o_Page_055.QC.jpg
0461368999548ddb41cc554a6a593f2c
b19123368b350839b9bd8866f25392e96d00507a
51729 F20110320_AACRIE sosa_o_Page_148.jp2
8ffd80b31288fc79de2212cd051762cd
c6c17fb6ba44fea9f17c0d10cb0f6374d287d746
46810 F20110320_AACQYW sosa_o_Page_120.jpg
9c1d41c2d1d67fa17d469e3b8a966819
461f4b4169ddc07b4793c926b4cd3bc072ab4876
18701 F20110320_AACSSJ sosa_o_Page_056.QC.jpg
d0fd5e95c913e4f9fdb18f363a930863
3f5503ce200ff0bcc4dcece640377a956b9c65a7
65792 F20110320_AACRIF sosa_o_Page_149.jp2
f2050b8a06283a483916032d429f53bc
363df46a44c0165414a5738f0754f3a746f823fb
34346 F20110320_AACQYX sosa_o_Page_121.jpg
286c732ebbf02c689708323ea35a7c9d
e93995a6790c7c21c0b7a1b854201c5f3899ecb8
29021 F20110320_AACRVQ sosa_o_Page_061.pro
d590d4a72d5db329378d037b84dd7f23
5a305b9ce334c186ac020b6aad8928f08165eb5a
F20110320_AACSSK sosa_o_Page_057.QC.jpg
227fa30515a67a1b9990364bd419a237
0a32f2c4e8e60c340b6876d684300b764ddd3a34
43994 F20110320_AACRIG sosa_o_Page_150.jp2
661ddcda1841433d49e7008a052a6a7c
0b984d20ff631efc43d6d66b3c1f5f1c71340833
28992 F20110320_AACQYY sosa_o_Page_122.jpg
30114d042e4e2df3ac5110803f0b5b88
039913a0565124890a7a6f92ee58a0b7d5b89e53
32663 F20110320_AACRVR sosa_o_Page_062.pro
ca840ac96b19dca46573f98675f38098
8e4dacf34ae40a523ec056818cb5b1052b55d0ea
16195 F20110320_AACSSL sosa_o_Page_058.QC.jpg
635010355bd1d6b1590c77b34d6da3ab
484afb5061c70d5ca7335b2dbf2f7b96a25f9158
76944 F20110320_AACRIH sosa_o_Page_151.jp2
18c74489c0bd77a92f0e32881b0567e7
d74c0326df427511c41f6ffd2472af13f527206c
45782 F20110320_AACQYZ sosa_o_Page_123.jpg
581a768a82efee446dd80baee278af8f
f4054dfb86df7f862e00dbcee1dad2e894011a7f
1925 F20110320_AACSFA sosa_o_Page_097.txt
efdda89cc89880d0ad89c89701c23e54
26b407d6ac359cf16771183ad65d835c1a3b8043
31243 F20110320_AACRVS sosa_o_Page_063.pro
02f4f602b2ae590dacd513ca9ec987c9
fe55c3a6fb98ededba6d9792d6f573efb429f5d6
16252 F20110320_AACSSM sosa_o_Page_059.QC.jpg
8badfa0feed530c40f75a7ff49da11b9
6af495cab921d431341beee36580be0a7edc163d
57699 F20110320_AACRII sosa_o_Page_152.jp2
41a5a207bbb2f46a3e228512db30d5c0
ea1dd37bf4dd6d5b5a196f0590944469d2025617
2029 F20110320_AACSFB sosa_o_Page_098.txt
887f5d6c2205fa5d1208a0139c4d2b2e
01864f043f77ae396e820614becff149c934fc65
34331 F20110320_AACRVT sosa_o_Page_064.pro
dd5a684c9226da9674eab76d11c0659b
f40c5c772eb57eabe814a6cd2cdcbf5cdea0b57b
15755 F20110320_AACSSN sosa_o_Page_060.QC.jpg
308da9b9b4fe840c5347171e971327ab
86a4f23f79b8500534b0f70d21deff50bdb187cd
67272 F20110320_AACRIJ sosa_o_Page_153.jp2
c9d0d658a20ec6554eed315f36891eb2
2957cddb19774d7bd8dd5623bea2647cb364e2a7
1657 F20110320_AACSFC sosa_o_Page_099.txt
b17ffc6db7a25d609b9cd146fea79863
41f8305009d1223ca4844c0cd46e4a9cd5552cc7
36743 F20110320_AACRVU sosa_o_Page_065.pro
ac57a2c5e3f28beabc8de31836192c9b
6ef642984c7018f6889cf6a3b435878f6901ac51
15965 F20110320_AACSSO sosa_o_Page_062.QC.jpg
eae1421404012ba625af0fc665386318
9175f4b2a74448c04c52e676da64093b42056cf9
64010 F20110320_AACRIK sosa_o_Page_154.jp2
5b3f806a7a390550ec71b923720ea78c
578ea2083b7563b226063b1c58ab6d01c4ec8173
2755 F20110320_AACSFD sosa_o_Page_100.txt
fbee2af85dd4e036b0d06a84afbac4d9
4beb3bd01fef09d21db5e8f392b4ff7755691bdd
41941 F20110320_AACRVV sosa_o_Page_066.pro
2e79b32655dad8118af3f1fc1d84526c
a56e5c6bcf1555e579093a18f7465c56f915f24a
15874 F20110320_AACSSP sosa_o_Page_063.QC.jpg
c7bb62f800ccc471659a6d7db296fee2
4f738fd426c4592a3ab32b21515712c4dc522fe5
67935 F20110320_AACRIL sosa_o_Page_155.jp2
c5ad1ffd7897fafea28a64b803c856ec
ec00db8b44e47752b7696d72d1dc58df44665f60
1088 F20110320_AACSFE sosa_o_Page_101.txt
5eb9f001dea3fdeccf83dc49252a30d2
5a590d4efad937934865d1b5a6a1f6dcda17b9aa
32114 F20110320_AACRVW sosa_o_Page_067.pro
42c6cdc1a1845aba2a41280aabbc7a49
397c7bc34a8538678376048400956267e976183f
20051 F20110320_AACSSQ sosa_o_Page_066.QC.jpg
abf9ab708089a8c6191da9e06b37b9d0
ccd5cb513dfaf56d8084d4efc42947b5d4bd9d42
63432 F20110320_AACRIM sosa_o_Page_156.jp2
016ea59b0dc9bd33b2050b32feff3881
0604b486dea150c16cb333eae4d3d03010bcaa91
1717 F20110320_AACSFF sosa_o_Page_102.txt
3dcef9a3cd39f6b93ad72319768b7423
2f69a50335656d159c2ab0693029ae75332815e7
32566 F20110320_AACRVX sosa_o_Page_068.pro
71e91e7a7451279c141d7cd298d1c952
2eccf347b0a5e171ddb86f76d855c0ef959df627
16255 F20110320_AACSSR sosa_o_Page_068.QC.jpg
06ec6c1d3d1835265e3617e3cedfac81
8b3576cefdf2c61f118fe4033b50bb2eb1f56c73
71944 F20110320_AACRIN sosa_o_Page_157.jp2
416b2d9113a517a46e2d1716e75a626f
1db09862def3ed7ea0318f891b095e774e3b0277
2467 F20110320_AACSFG sosa_o_Page_103.txt
3cf4ce02de50d4de4a541fadb67ead81
0b47b93ee463c3884b5827fc5ad970506aa41a64
33355 F20110320_AACRVY sosa_o_Page_069.pro
b4c08b286f6773c6c520487777a45de7
ae8493df732ab1959af6f0e16bc68e10ee932446
15746 F20110320_AACSSS sosa_o_Page_069.QC.jpg
e2bfb1af66e30f5a87d8787749856390
52af0f063395876dce0c5aab4fbfff65f299ad9a
73331 F20110320_AACRIO sosa_o_Page_158.jp2
7f6b8535049ba3fc7bb9500c0d2e4329
ac9751bd648f5c42f57ebf767610b76af8eea588
1823 F20110320_AACSFH sosa_o_Page_104.txt
31e831fed88c201356c42f3861a9103a
d455765b6167419bfa70496ad07ed8c04d969d71
46678 F20110320_AACRVZ sosa_o_Page_070.pro
c29e6052371962e6ca498173308f218e
f2ea7e36436edeae368143a37c9ab0ac647ff9cb
15367 F20110320_AACSST sosa_o_Page_072.QC.jpg
6458cbaa62729a4ef64f1ac92b22c1dc
0ad4002e6486ff72bfbb29d3669f6bfc9181c485
64588 F20110320_AACRIP sosa_o_Page_159.jp2
ae6ff7079b265711962be4a6ead8ddb2
54b474878724aca1e77d1b121135503c8bdaae74
2673 F20110320_AACSFI sosa_o_Page_105.txt
e2c7bfcf8d3c0f56241fa0e4a1de73cd
46f4ceb2e43484d1d650e340ab3a8535e1505952
18949 F20110320_AACSSU sosa_o_Page_073.QC.jpg
756572d7dc11ab95a43e923048e79d3d
c9dc341a2ec7abc43de8a12f90fa54a23374db05
64845 F20110320_AACRIQ sosa_o_Page_160.jp2
5ddc00dba067a0d189f79f42fe3914fa
f1f2a94700a31c0b30c81106d24db04d1dd4d5df
2502 F20110320_AACSFJ sosa_o_Page_106.txt
a8bf8d62dda6b41d864655367056d66f
187ff29dca6ab651c83d6244504b32f0d7788499
21097 F20110320_AACSSV sosa_o_Page_075.QC.jpg
dc49ef9542d35baa07f7b2d811d429c8
15936920991d1daafc026f07a054c0c4c173ab2a
71131 F20110320_AACRIR sosa_o_Page_161.jp2
191698cf3f29c287f9c616bbfc7df72b
14aaf6c00920b300211bd7b8fd5f93225f266721
2665 F20110320_AACSFK sosa_o_Page_107.txt
b237e229f905a380e50dd57a3e916d73
b1293dc6eb55bc6447bdb88abdaa36b38535ec3c
20908 F20110320_AACSSW sosa_o_Page_077.QC.jpg
53481208e89cccea916a1b34e4ea288d
5ea664ffcc9def819a1891415c84c05d6272be47
49008 F20110320_AACRIS sosa_o_Page_162.jp2
97232c72eb5421fc41431539716bc9ee
9374d05726dec81e7a3c8cb3445d53ca1cb3711c
2858 F20110320_AACSFL sosa_o_Page_109.txt
24eb522eaf414282dd5a83fa29ce9266
58bacd20f288b6bd65a990872066c90480b715b7
16434 F20110320_AACSSX sosa_o_Page_078.QC.jpg
098f30f5ad0ffc259a5f8dd2d1e645c4
fc39032fde2dcd3e1059e4a138006a7933150527
56075 F20110320_AACRIT sosa_o_Page_164.jp2
25c7516a636ea381a39c4fbceaa2e38f
36fd03aee5b8d317cff01bcee788462bdf10ab24
2089 F20110320_AACSFM sosa_o_Page_110.txt
abb41626ea3f67e1468f584b7f19a88e
ff45de225f7df510d23d410889ef8f2f1cf6c0a0
15988 F20110320_AACSSY sosa_o_Page_079.QC.jpg
d01c9e089fe2208a384269d50173f148
32ec934e69c0a01e565f07154ee1d09115a89f4a
64435 F20110320_AACRIU sosa_o_Page_165.jp2
174e14c29281f681c63d7c61f1bb37c0
d25b1b18e6bab5c61d904bc6539060b7ceaa8210
1810 F20110320_AACSFN sosa_o_Page_111.txt
153dc2e45b0c3ba3c7f69c9c403fe779
61787d1d40c50d3435133492b94db155726998ff
15999 F20110320_AACSSZ sosa_o_Page_081.QC.jpg
c86958168c123d2ecc5b91d603d4d1db
4d857308f8a4932747057c2235f911a34f5ec731
59934 F20110320_AACRIV sosa_o_Page_166.jp2
7d6dcd0e28aedddec4bb95f01ba86bc4
4f580ba6d59c5d752a30650a8e5f89b501edeaad
1980 F20110320_AACSFO sosa_o_Page_112.txt
4d85f0d7128389fb6ed4017feca0fab9
fa53e77d9e53d0d7d2b3d4ab5dd41ea95c928ab7
71513 F20110320_AACRIW sosa_o_Page_167.jp2
4046a82bf92239520560f7595ad50382
d931213e5bd4262bd3ad08a6873ffabb08a86fee
2369 F20110320_AACSFP sosa_o_Page_113.txt
569cead9b7d2cc0d5f8a8870e09cdf13
3b09fc18a037c0b2d1162a94ae827456d5815b19
62106 F20110320_AACRIX sosa_o_Page_168.jp2
06a0193d1295f87bfb8342a8dc9eca7e
f399dfc0d37c1601cef7dfbff42fa1f4f968c5d1
410 F20110320_AACSFQ sosa_o_Page_114.txt
edbf100acbad8523fd4dd816a0587d97
07c7b601cdedeb3d319f4f6e7cf7e53ada7f690c
72225 F20110320_AACRIY sosa_o_Page_169.jp2
8dff0834c99d34678c3779f03a6a6617
3e90a5257944208ed8fb000f87719b041e0682aa
1611 F20110320_AACSFR sosa_o_Page_115.txt
237e84d13759693b10ee0d7150172c99
45b2961a5bb5cfb57b2f3e572ef4e2c78e071a22
60845 F20110320_AACRIZ sosa_o_Page_170.jp2
052291915c65f3bd24b135bd65b04c27
248267b7baaa0af3d07350e8948f3d2298d098cb
1888 F20110320_AACSFS sosa_o_Page_116.txt
44bab2e6c2920c6d3adaec5ac011b717
cda855d9dc4809c2cf75171cea0130ab5e99e65a
1801 F20110320_AACSFT sosa_o_Page_117.txt
e5c8934832b1fc3c3e0c37b89a25c61b
5b8a9cb516e94e8464ce86dc2aa3b2f624a999c0
1283 F20110320_AACSFU sosa_o_Page_118.txt
062f958ea863145d0841d91e36b2bbb7
1eda49b8045dc6c2a501c84ceb3a754fb0fc9ce1
1327 F20110320_AACSFV sosa_o_Page_119.txt
480906b3ee5ac30a6396dd774374f4c0
d40870a3cb77fc251dc9df3537134b95fb64fccc
78 F20110320_AACSFW sosa_o_Page_121.txt
b3cc6390d2a0dcea924e68b446fea432
0bccd17807368ffcf7151ec39d66e0cb164d17b9
5233 F20110320_AACSYA sosa_o_Page_102thm.jpg
78d257094b4e1487b88adee9ad550ced
345bc89b6fd502f5a3b54c9f40778d6282279ff3
82 F20110320_AACSFX sosa_o_Page_122.txt
0487c78a4d3dc4021942e7308238d905
9d9b9d3c5039b1a956e9db5c23faf2d393390e93
5964 F20110320_AACSYB sosa_o_Page_104thm.jpg
fb1d194dde4f0220dfcfd9f3e122fabd
ef9b7cd2556b1f4aa9e48f08ab703f211f69b06c
2468 F20110320_AACSFY sosa_o_Page_123.txt
ba29b2d544a7b297e6be7cc121061e5d
6c4035637eff657d670794f9a1b11dc51bd0e5ed
6746 F20110320_AACSYC sosa_o_Page_105thm.jpg
f40064f61c1bc0a56e6107bbdc304c9b
3a707f2f0e7726b25f7a18f2643a88a8cc564628
2813 F20110320_AACSFZ sosa_o_Page_124.txt
cc9ab0a76eeac3a464a95e6ec77d8b6c
19429a5b27b1da8252448570a018dd332606dc18
6209 F20110320_AACSYD sosa_o_Page_106thm.jpg
668139e3f9a08843093a0f3cc192ac79
edc25de69babc3a970ad4440ed45f072184b3ec3
5582 F20110320_AACSYE sosa_o_Page_110thm.jpg
33e84892a29333a2fdfcad91ff617f44
a1eca791bd9bdeead8be8c8063136a638eb244b9
F20110320_AACROA sosa_o_Page_080.tif
aadddc5a6499416ce613621fdd21091a
ab38fc603713e8a7a61e69c298ef3af98fc63379
6315 F20110320_AACSYF sosa_o_Page_112thm.jpg
743fec0442532a31da808cc70ec52012
d367475926a58e6d2126a46678742f7d90825aee
F20110320_AACROB sosa_o_Page_081.tif
e17ba7c0a25d935310db6e03628dcb65
baa3a489f4e5b33eb2b09573a663b54c2e1141bb
5274 F20110320_AACSYG sosa_o_Page_115thm.jpg
240b4a3bd4bbe647bf7831cb07e35a1d
a40fc831412b0df989c39b9cc670ab4fcedec5f7
F20110320_AACROC sosa_o_Page_082.tif
431d358f107b4ebd08e71a18b562fb46
b140343a2e3252eb4e3fa02327ba01fa207d8c74
6246 F20110320_AACSYH sosa_o_Page_116thm.jpg
d6c763ad8074332b4c7bb4954e2f77eb
54ebe4fd0247622d2e6756c60c3313e94d447d9b
F20110320_AACROD sosa_o_Page_083.tif
35556e8e470add05885d56e81f37714c
cdea9e5567e5fc15d43235cb122853954edc9e6c
6218 F20110320_AACSYI sosa_o_Page_117thm.jpg
c960adbb85c02830bf428a63a5f24afe
7f5fa69031872c746ef268285d31a55de7f73454
F20110320_AACROE sosa_o_Page_084.tif
d23f366c70ec9c8638e49547378fa592
3d9a9445a0c8b6782724c9eef97beea4491c649f
2789 F20110320_AACSYJ sosa_o_Page_121thm.jpg
b6163a5976eb50702c69cdf3ba02ce41
208a5202cd43057c8211d3eceedc819e0d88c03a
3104 F20110320_AACSYK sosa_o_Page_124thm.jpg
0d48a92dc15ab107d5ce0b70becfc173
f9b63d48c3e9275696a5c56900f48b0b1b81d112
F20110320_AACROF sosa_o_Page_085.tif
bae79aa1e7aa167b80de4fe4724772f6
b2f4a87201a6c76d79df883c6e6b60b7c7821691
3229 F20110320_AACSYL sosa_o_Page_126thm.jpg
c104622e33a816dcc9e3ec3d54dd90da
cd3c08f88bbbb4db1bcd93f8a1f327ff27ddbab3
F20110320_AACROG sosa_o_Page_086.tif
0ffb6e56c4fc3efc53471793be73c982
580ba2fecba32ace031f91397d5e3506d02ff8fb
4937 F20110320_AACSLA sosa_o_Page_028thm.jpg
83bf38ef101c7a0c3e4326e8488112c8
e35ab5ce645affff9d8a2602855fa2b0382f7c16
2915 F20110320_AACSYM sosa_o_Page_128thm.jpg
e97d81c64028c32a26e76bbe6507ca74
f24e208d749f59fe67042296e1772c5091d68fa0
F20110320_AACROH sosa_o_Page_087.tif
984a4dd40e62abe684fe63af213d117b
627204f654f57992a8907eee5f9d07da531a3951
3131 F20110320_AACSYN sosa_o_Page_131thm.jpg
b4a70913b9f17586b0828cff6ad2d53d
c9127460112af18e266674a046661631761a1448
F20110320_AACROI sosa_o_Page_088.tif
6c3f6249e6b9421e31dfc980acc3475a
794deba0aca95bfcd78595e76e62424d5f7bc9f7
10256 F20110320_AACSLB sosa_o_Page_141.QC.jpg
34718bb36abe1538bb138e7f9ef0eb1b
f5ad149964188c7aa466bd6dc1db940ddbb67558
1264 F20110320_AACQRQ sosa_o_Page_061.txt
aa8b1f393c0a0a9e65da1922b4649e15
63d009a47d31198df46962c5cb3f16198fe233f1
F20110320_AACROJ sosa_o_Page_089.tif
9a76e09eda90452f702cb0126fda4807
ae26b853d6c1ac7208761cfdaec3d68ee64d2c66
13263 F20110320_AACSLC sosa_o_Page_022.QC.jpg
deddf9ff18a6e064c5bc2ebcf89d8ce1
e9092415cb68ddb314dbfaa28111bba12bf6a95c
3733 F20110320_AACSYO sosa_o_Page_134thm.jpg
60882afd81ed3f9c944649ae31a0d10f
f8cb32ab41efd3c163cafd57b6f580392b2b67aa
F20110320_AACQRR sosa_o_Page_099.tif
c134b691006cfafc19368196319c9d02
68a13743d94a0bcceb79e7315802ee6d3f464584
F20110320_AACROK sosa_o_Page_090.tif
1ce5f251e33e79fbf6de616d0177ff96
c10a795b591ae40eb906a3a4ddd3ad8562ee1204
3167 F20110320_AACSLD sosa_o_Page_154thm.jpg
e00f24f48a563844a76ea6d3afaed31d
9d8abc38fac352e3b255b64841302d0b2fd95542
3368 F20110320_AACSYP sosa_o_Page_135thm.jpg
5e2a990330f1fdddfb196e38cc559b4e
65eb456f6df045809215e882754a21724e8d8e05
F20110320_AACQRS sosa_o_Page_058.tif
2328f8224ebdb547eee1c5f5b3d39374
b896841491831fb722e29b9937e0d5ce2a1f7db5
F20110320_AACROL sosa_o_Page_091.tif
8e7873334902c815b7cfd8501d449baa
4321321893332ae64cad76283e1cfa4f9ff2b609
19987 F20110320_AACSLE sosa_o_Page_113.QC.jpg
126e24bd3538b4ed1d0a48d853e0d5aa
1e6f6ce121e7dfb56fb9826d92c45cd29f3c92a5
44905 F20110320_AACRBA sosa_o_Page_178.jpg
48efbec10737d92a40aa85ff718e9477
a8baca3c4f2563d68796bd0459a60495ede50c34
3238 F20110320_AACSYQ sosa_o_Page_136thm.jpg
a57fd765a2585cfc712fcb3c34507031
48c0c079d0d038003c08bb1c489916dcef52279f
51741 F20110320_AACQRT sosa_o_Page_059.jpg
2d3d69c3452dc1db5ca589786afe8959
45881e438fb68473f587d5c99525934dab6a6217
F20110320_AACROM sosa_o_Page_092.tif
9d7a199d1e33204f597232df06371e9b
e9c619de53fbdbc03727f109a98496e98e882146
2791 F20110320_AACSLF sosa_o_Page_150thm.jpg
4e5715fb0c434dc71a94042f367226ed
910e5a47b52283faac4117859642cda56f4b3cb5
47418 F20110320_AACRBB sosa_o_Page_179.jpg
adfe93649a0d5e183ae31c1f3d5c5835
94b53573c64442b7cda02891cb5cfb1f088ac96b
3015 F20110320_AACSYR sosa_o_Page_138thm.jpg
c684455344cb55041fa3a0e2dbe35809
df1e41c17b514f3a5b78316f307b330616fb6883
F20110320_AACQRU sosa_o_Page_096.tif
69c0b70373bad5de517e0bd71c72ada5
f46afb122bb5699b55227a84f997c30adabb9c58
F20110320_AACRON sosa_o_Page_093.tif
eab421df65f0006bf233aaee8aa9d22d
24100b4cd1fdfccee4480f78206199dc00272f04
22186 F20110320_AACSLG sosa_o_Page_100.QC.jpg
963fda9002d5b4fc9ffd20a4149c4e8b
8f552f7a13fe025392c72cffc47c38c5383c9b93
44665 F20110320_AACRBC sosa_o_Page_180.jpg
8d4410113f450f0150494b906cc4ded1
73855bd79dffe6557d1f24d8627941fcee033e00
F20110320_AACQRV sosa_o_Page_037.tif
64db02fb10f537cc6df4b5d58e97e001
6b43b4494d01116a90740e197046f6cd33c6391f
F20110320_AACROO sosa_o_Page_094.tif
03ed5725dcfee06df85c7e6f93a22fdd
9ba99378dad73c937f8332351eaffe9d403888a0
3232 F20110320_AACSLH sosa_o_Page_211thm.jpg
605d8430185c5cae835a928ce43b6a67
e20095f386abba73262daeb6af2b9a6e7eb28c43
35138 F20110320_AACRBD sosa_o_Page_181.jpg
105642a974de5ab7a2c13cdd5a6f750e
55bf93f932d3f3ae58ece3c9c904e22c7dff743a
4052 F20110320_AACSYS sosa_o_Page_139thm.jpg
2474c94d0d033139ae0970006514033e
b8e5a4796a41cbd33ad33f8c9d8840081bab9988
1182 F20110320_AACQRW sosa_o_Page_022.txt
c17429e6136dfaa9c9fbdf80f5f4c36b
b67df9fe52d12247127735681ff4d9b32c3c7655
F20110320_AACROP sosa_o_Page_095.tif
eb752a7b16991551140aa6a6cbfc0faa
0583bf91a1fe5af74f2e8de8126a46ee933e2015
2738 F20110320_AACSLI sosa_o_Page_221thm.jpg
6d2d685f7a9c519a4d11640e741778f0
6f1518ca1dde4f907555f5e6f0934d97d19bd564
40435 F20110320_AACRBE sosa_o_Page_182.jpg
87c2814b52bc4920b73dcac53c5f71ba
b57a858a7965c04cb10f731cfd37d714cbc5806b
3142 F20110320_AACSYT sosa_o_Page_141thm.jpg
92b8ff8cd314abcff51985c685ffd971
4b03ca34cc0d850de3a119b473f0403490d5cd3d
6253 F20110320_AACQRX sosa_o_Page_006thm.jpg
e4d3e1c2d0f74e1bacbec67faacfbc58
1a8c39517497b997720ffac740ab5f671954d1ef
F20110320_AACROQ sosa_o_Page_097.tif
7fab7af62a410ff0e9e7af987921f6fc
18b15ac1043db22c015ad277d113d5a9a850a9de
6271 F20110320_AACSLJ sosa_o_Page_092thm.jpg
886768e91f88916b4ffe02168c330eaa
04a2f0d34843ec2b2475dc3106816fcfd0e8541c
34120 F20110320_AACRBF sosa_o_Page_183.jpg
302b77ad25bf35842910ee53872a8b7b
0c884d6407d5db36c2b19b67d44ea6356a679ba5
3460 F20110320_AACSYU sosa_o_Page_143thm.jpg
544227d1d08dbe387d18668e03ad5f58
b6d20c12e2a48a8ad3989fa8d6ab2a4016edead8
F20110320_AACQRY sosa_o_Page_001.tif
2be587181d382740aefcc91ac2a82d62
64b1c1d509e9027069a011636e55e959366fdd4d
F20110320_AACROR sosa_o_Page_098.tif
c0c1f69ace13a391b8a823304a24a37e
177d65c00a153e214675c4533622ade2ffb2de5c
18340 F20110320_AACSLK sosa_o_Page_065.QC.jpg
ced13816d6d2e68d50a2e144a04b44c5
5d0767a6bc485a5ed8721b299a504fc68a58ac18
49705 F20110320_AACRBG sosa_o_Page_184.jpg
47bed2ba5932eb6905fd7f95f5484c97
7a6e9c186abf5bd70d621dd3a8f21cc047f9160d
2830 F20110320_AACSYV sosa_o_Page_145thm.jpg
d4b4f70df644ac9b41b79c2545fbf945
0efdf5dd95d26fbbfc374853677db965e9de007a
17446 F20110320_AACQRZ sosa_o_Page_064.QC.jpg
f3a6bc0b69e9679855e8c0434f735867
0b95428fc1b4ace8667c3a56e746cf3f171b57e5
F20110320_AACROS sosa_o_Page_100.tif
8c725e6578c0e8bd02468ce1ba4fcb49
f1b88e65c99e5d9e8f18c4370ab702525c40e73f
19198 F20110320_AACSLL sosa_o_Page_040.QC.jpg
1bab2b12830e02b9a53ceedbc0faff94
1e956da1fd14189707e39b85420e8512698bff60
40501 F20110320_AACRBH sosa_o_Page_186.jpg
62f61700f46ada0f84e34ceac1ed48bf
3250545c64bef24e9a2e16dfc9090117bddda468
3844 F20110320_AACSYW sosa_o_Page_146thm.jpg
faa70b0b42260202c1ed56d53ad031bd
b902af205be02ef8ef209ace088e27ca7cfdbaae
F20110320_AACROT sosa_o_Page_101.tif
8e4c7d5e127f202764279e1d60e0d82e
1a96085dacee60d1ee2cc617346428c81b91aff1
17256 F20110320_AACSLM sosa_o_Page_004.QC.jpg
1c7ed734b7f236b5aed650cf32acfd29
4d0f82a21a86ec9d2fbc11745dd9eea4623d8bbc
41695 F20110320_AACRBI sosa_o_Page_187.jpg
66a1194ab495804f1037c9e92d705df7
3e5a46bd18184fd61a928cf87943efea307f24ff
3117 F20110320_AACSYX sosa_o_Page_148thm.jpg
ffca47446b13e282831a4215aeee7253
684b0c4c64175e3cc6d5a49425a0cbf98696a7c9
F20110320_AACROU sosa_o_Page_102.tif
d5dcde00a4bc81df7f333cb475e5560c
562c8653f786f7c2dfd8c11d0b1f36cff7038d70
6558 F20110320_AACSLN sosa_o_Page_020thm.jpg
f0f8f247ec3d0042342040b1ac5590f9
10222ed1b9af871ee8dcd6d31382f3484cce09a0
43917 F20110320_AACRBJ sosa_o_Page_188.jpg
6dcea785ee243ad24ee8a710bc0a80e9
76e39e024cc9becf4ed62f8129d206f3d33a0452
3351 F20110320_AACSYY sosa_o_Page_149thm.jpg
d6b9c295b8b41740fb98a910e2ab28e1
f0bd6e89f7f20d65b0a54aa4eac925eee5d3ef9c
F20110320_AACROV sosa_o_Page_103.tif
a494528ba13d02ce4bd034587afe47e8
6ea89f88b4c90d82cfc40c549fb24c4e0835bbd2
3664 F20110320_AACSLO sosa_o_Page_125thm.jpg
bbad15174b1e132442470aab164265b8
0f350873792ff61043cfc9a360466b0cd595f5b1
44068 F20110320_AACRBK sosa_o_Page_189.jpg
9fc76f6e38d0256c6721fa6e2f5f6818
7e599c933e2a4fa663f65bb74965c80a36747b76
3499 F20110320_AACSYZ sosa_o_Page_151thm.jpg
6aac216acce113a7f07bb9f183638aa2
25a9cfddf5ea1ea1fc8a1c3eec20b4f98c928b98
F20110320_AACROW sosa_o_Page_104.tif
7b451e5e398f8e97fbd26b4fccffc136
a6d4c8f7371a87762a91fcd6b405247f5dbc0364
6327 F20110320_AACSLP sosa_o_Page_075thm.jpg
b00976e4fe24d9d9e03ab309ab98b495
83d733b6e566ec9649e6b67b1089d140413cb694
42545 F20110320_AACRBL sosa_o_Page_190.jpg
6b58c7ed3988cf7813af2b638b9eab76
77747ac457936542ea2e13c8cde66176e480f4d3
F20110320_AACROX sosa_o_Page_105.tif
c29e2d814bbf740c30c48faf119780c7
96340ddc0c4e92ef2297d1522ccb01c06731cc5f
4185 F20110320_AACSLQ sosa_o_Page_057thm.jpg
f99ee345c29500e344573c602d7efa93
d7be7abc284c71d383d0288705ec435d38833232
36026 F20110320_AACRBM sosa_o_Page_192.jpg
e66c1f0e6ba3df05a42a64d225ab6882
14a2bad92e6fae3e6b79bec7f28aec48e99267e4
F20110320_AACROY sosa_o_Page_106.tif
79a52af38f724448aea1bea968619f35
250ea26c6520e48739f1db289d0dfb8096161fc4
2833 F20110320_AACSLR sosa_o_Page_195thm.jpg
32a2719da40aff79b6519a1cf60ed52a
b540568dfdae7ab90ebfbebecdce80b8b35f7b96
33157 F20110320_AACRBN sosa_o_Page_193.jpg
f375548d34a94a07900bac35eaae9a89
4980c9e3be5c82524908e38ece3c56bb32374f6d
F20110320_AACROZ sosa_o_Page_107.tif
b5ef1b6e7011f171395b4c86af764d21
70003e4aacdfc7034d041b7edf737b2b522777f5
3146 F20110320_AACSLS sosa_o_Page_123thm.jpg
9b2896454b1b67bce0fcdb7e4794a3b1
bb1772c0ec2406b98f954a2661cefd3fe6457ff8
45058 F20110320_AACRBO sosa_o_Page_194.jpg
47ef751b453f41809738f0b4ed8479c5
e8e6ae00e8851a16bfeaf11fbda24cdfb3286b44
2313 F20110320_AACSLT sosa_o_Page_196thm.jpg
4eb91242d1718db3c2acf9870aa5a6f0
fc38d097d11022bf0b6a54886a802d922a35139d
33506 F20110320_AACRBP sosa_o_Page_195.jpg
b265aa603787250111e2d57b0e5745d4
fc4a0ccba81ebc46fcd176d820325f9d718fa5b2
5271 F20110320_AACSLU sosa_o_Page_015thm.jpg
80384a1c88647a8fc94902dccdb2b215
bacfdc82a38523827216b3ec69731e6849e7f499
67114 F20110320_AACQXA sosa_o_Page_070.jpg
8f2d94e049bcc437a1e69b9288df45bd
b36b550f6f461461a3d47c47c77ebcce23e29106
24740 F20110320_AACRBQ sosa_o_Page_196.jpg
a3f37ae76abf6b95322099b742f63bb8
3c80f597f6b7cbe09884484cf306ea31f1084fcd
18386 F20110320_AACSLV sosa_o_Page_110.QC.jpg
8733ce995a49a34fe46b21200a16d393
54b68d384def9784cf22a4db4668892397fd7b13
52039 F20110320_AACQXB sosa_o_Page_071.jpg
b1ecd7daf8b979218e9bdaaf5fa785be
e67fcaa0458d2e2cc290157bf34156d17587698e
30483 F20110320_AACRBR sosa_o_Page_197.jpg
8b7bce954291ddd76c7be3873abff512
2b9d517b796055c31d64fbf3a66bc92433b1362c
11933 F20110320_AACSLW sosa_o_Page_149.QC.jpg
416729dd670d6845980479bf7f2fce3e
7306e25198bac8f9541e91091a66b699467cf782
47462 F20110320_AACQXC sosa_o_Page_072.jpg
f52d265f25ec0df52c5f28be45dafc20
2ed7fd99f7cd3a0a36938d5b054049af4c87e4de
31859 F20110320_AACRBS sosa_o_Page_198.jpg
aa0dda726af4f2a807cc2d6c15d17743
458b6c7f399e08d1b0be364a8cc07f1af1230c0e
5970 F20110320_AACSLX sosa_o_Page_108thm.jpg
1435f6b7154fbc4871d6b36c1feb84a7
dd1c56dfcb10637ac3b07ed2b775eb6c8eda1bdd
63868 F20110320_AACQXD sosa_o_Page_073.jpg
13732aece073fdc6716b5a0b12ed7666
283c6af7c017c1c201ded567c9a4d1355d022064
27945 F20110320_AACRBT sosa_o_Page_199.jpg
b10df4f67669973dbc5044410fea1f15
b8791e1d7791ecd159784e907335f75f22909f3f
3277 F20110320_AACSLY sosa_o_Page_160thm.jpg
5fe76e12633c00a9fdd55d48b1f1511f
222dba978f7731c946e46afe6f9fd04e536a5543
57821 F20110320_AACQXE sosa_o_Page_074.jpg
a352b56c061270eec7b7d327c76b3356
5507fe60e84f346a8bf8efeff431f21e9c8c32c5
34702 F20110320_AACRBU sosa_o_Page_200.jpg
9e2e419329667d0647634c7c26cb39bc
633c6df10cd7bf986cd733374f797978c8199f32
17374 F20110320_AACSLZ sosa_o_Page_101.QC.jpg
25cbd3d03b49db102236786192275c8f
47c8cf87fd1664a696312b033caaa3980e40cb7e
44179 F20110320_AACQXF sosa_o_Page_076.jpg
7c40c7153b00abce123e24c02c55bda7
655c95fdd02ea2d230a4e8ea3d96f9255aa00428
23975 F20110320_AACRBV sosa_o_Page_201.jpg
b4543f16271b0123ad3ac6da41f84313
3de00864ad5718ea798e87bb979cc0cbe62b5247
64680 F20110320_AACQXG sosa_o_Page_077.jpg
63551d5de4936a81336b35ee6b6b40f8
de088b9accd2c88f14ab04bc29197c91a0efd2fb
39852 F20110320_AACRBW sosa_o_Page_202.jpg
63a5e241a77b92539c633e4a8c031cc3
f6f07bc469fc916ac73e37fef803745b2dfdc9df
12684 F20110320_AACRUA sosa_o_Page_016.pro
2cb200d4c9e61edcb3cb7f952d8b4e9e
016ab9cf0c8b8daf136739b17141bf855720e7d7
50723 F20110320_AACQXH sosa_o_Page_078.jpg
822e52207b897ec25e43e1c0349a5f5f
8a5765915ed5591b0256c870c050cae5ae380bab
52716 F20110320_AACRBX sosa_o_Page_203.jpg
8368b12935ad815fa9220eda8627eb0a
87b44f19bc38c7da517bcb00885d18abf8d13761
43756 F20110320_AACRUB sosa_o_Page_017.pro
4b11ac19bbfd2a10ea9fc80afdb3d737
c11e66be6d2c234a5c6c29273cd59320d4e37504
50645 F20110320_AACQXI sosa_o_Page_079.jpg
2f53a64dab31499c0344feaf8b37a9e1
c146db48a1dc01a776ec7d7049ffe8e86cccfe10
53034 F20110320_AACRUC sosa_o_Page_018.pro
7253bd6cf874025df0a397748b15cd8f
6625a2d0df7a594b13278e0679277cfc76c5a57d
42772 F20110320_AACQXJ sosa_o_Page_080.jpg
3ffbe34e126d33f5adf224c7a4c95adc
6df84c45a622b763b6752732aa8d61061938f9db
52327 F20110320_AACRBY sosa_o_Page_204.jpg
78db1f4b9da8a6887f912c35ffaf183e
d835cd43e3a2c382d2ff180cbb3203081b057721
47848 F20110320_AACRUD sosa_o_Page_019.pro
892bdfd2b02d4af5ac5a47be5290b273
ad3526bec45ae5da705c06d6b72e2b7b3e8ae528
50451 F20110320_AACQXK sosa_o_Page_081.jpg
70a73e377984a1e8db0fb9dd29fb3ad6
0347eaf67cde6312b99974ec8b2491adf01ece7f
49742 F20110320_AACRBZ sosa_o_Page_205.jpg
a1425955d02314f882affae60a8cdb2e
c7343da9eb3519a322fd5cc3b5ba0eb762ae2dfa
48975 F20110320_AACRUE sosa_o_Page_020.pro
d906690ecabcfe4620f5aa205bed7f1f
284f8f2a170b8309ccd1b2fcecab9c693a598715
68315 F20110320_AACQXL sosa_o_Page_082.jpg
fbf0e830f0443e256176220f9b6ca764
0138697272f176ec61352157e914800742085969
56132 F20110320_AACRUF sosa_o_Page_021.pro
6fca6b26ce6c8254455feda712ebb11b
325d2c3e8aaaef65b35afc1161ff1bf7bb6a217b
57241 F20110320_AACQXM sosa_o_Page_083.jpg
d3b0d8764665e3d81ebf0a2bcde78e87
458a8ee38bb2ce903a5ac1a8a92a5d8bf31c4223
24452 F20110320_AACRUG sosa_o_Page_022.pro
b20f134cfc865f22f6c1337d8aa1c0c9
a4058e9a58fc1547afc270778fae2e5e461704c0
35739 F20110320_AACQXN sosa_o_Page_084.jpg
f105ee23319b00e7b2f86b6e9aab7227
90a66d5571927394a88de97792337a2a9efec417
36208 F20110320_AACRUH sosa_o_Page_023.pro
73fa3697669c89ed9442e28a5d4b43cb
e97af020bb234451d826976cf7d7d9c4b29871f2
5825 F20110320_AACSRA sosa_o_Page_103thm.jpg
3e4c7e35d5221cfd5ab374f2c8785a1e
f90978aae71f64ceca3976000310bd35d39162b4
60182 F20110320_AACQXO sosa_o_Page_085.jpg
4bf46a4ed8e514d34a6f1ce23c38f059
042e35b584c3ea84602433706f4535dae21be773
13347 F20110320_AACRUI sosa_o_Page_024.pro
144b76987eab78498feceb2fa79bbc9a
843a0ca4ab638a155a9ebda00cd65f9cc9301de4
7633 F20110320_AACSRB sosa_o_Page_027thm.jpg
3cbcbba44c4da14cb03fcded95f2b734
fe997d600a1e3bc48475ec99e449ab5957cffb95
38678 F20110320_AACRUJ sosa_o_Page_025.pro
d6cda36c63eab739921d7fe7e7ffb48e
d30a6bd888611d32d166cbf35d37bf0195115259
358202 F20110320_AACSRC UFE0008983_00001.xml FULL
59aa5488881305ab6900d7bd45c7e5a9
e5e868628753932166900c3f560f7e87bec41182
57082 F20110320_AACQXP sosa_o_Page_086.jpg
30ab560ad0788fa37f95ad877173efc2
f9693b1e827a07afc2781989a7b3cb2aaa81d849
43110 F20110320_AACRUK sosa_o_Page_026.pro
4b5b905d586c484e3e97b864e3758f96
716acf2504fddc337723598de6ff90737c66bc31
4503 F20110320_AACSRD sosa_o_Page_003.QC.jpg
196cacc9d94eb08db036af22311131d6
fc72681418a14c364a75ac792e37bf10f24a62dd
73634 F20110320_AACQXQ sosa_o_Page_087.jpg
ce26968bd83d4cba2b21ed03e92c9383
eb03ae9001febb6e02b62f807ccf794e6f43591d
25804 F20110320_AACSRE sosa_o_Page_006.QC.jpg
d0b926f2392afa56e6fa8948d523b589
23e7735a055ab8347ba2318f65cb60cd87ca981e
58078 F20110320_AACQXR sosa_o_Page_088.jpg
aee190150e5eb3646328b4f3b1f8b1ef
18a3d5bbc331f32be57e408648ff64a004c98003
45920 F20110320_AACRUL sosa_o_Page_027.pro
8aea3146f1dac94f4e8bf355487e9ef9
cd92386f8f890be3724c05d6e5c1c03f34545b60
24753 F20110320_AACSRF sosa_o_Page_008.QC.jpg
7ef5b5045ede0e7e9e77f24ca61a9182
e2aeabf417fe2ac3cbe0a3379bd955e0306d962c
97482 F20110320_AACRHA sosa_o_Page_117.jp2
1339a5736200cb5ebce7173ad881d7e4
40c775954641263d2862ad820f6b2fb87aea455a
57102 F20110320_AACQXS sosa_o_Page_089.jpg
b520c016683bcc3f5fcfc3f0d0174bd2
dea2abb5cc1fa88864d644a04ddf757c16576d50
38061 F20110320_AACRUM sosa_o_Page_028.pro
33f11331838c47042c368e3f9cf5bad7
570a0df95acaa7c4d4d814307b2ceb729553a345
18814 F20110320_AACSRG sosa_o_Page_010.QC.jpg
bdee51b3dbafe0ffc67f6f853ea5cd9e
14fe9fe0922fb4d4a9f0b9756b2a6ac927341885
36739 F20110320_AACRHB sosa_o_Page_118.jp2
72739cb259c1998b12f567db95ef355b
dada93be5de249c4eb6daa62da196b81ecd3fc9f
58819 F20110320_AACQXT sosa_o_Page_090.jpg
25e8265b56386a45461bc15f80df303c
ef03cabeeadfd9070a50826d9a3170ee2c24ee04
20898 F20110320_AACRUN sosa_o_Page_029.pro
330cb118994ad7c37ac543c36a538ff5
36f4701799245297aa8b40e31952bbfbdd010158
41087 F20110320_AACRHC sosa_o_Page_119.jp2
fa661c403604eae3ebd79dc2b01a3c52
bf1a5b140228115ebf857cb6b3f96b5d3f79b3ae
63980 F20110320_AACQXU sosa_o_Page_091.jpg
8d90ea196609a61b64eddff1d8e1b03d
ef6e17b7758ec6d8cfeb75d4bd8f02b5a31b2151
39724 F20110320_AACRUO sosa_o_Page_030.pro
d93008ab4c77f57217ba317276251f4b
60ee9ae9992366920a0112074a12a83ecddbcd59
18904 F20110320_AACSRH sosa_o_Page_012.QC.jpg
81cb97107893ab2d5083d7c9d6726b8e
feb3b7f67e76045084f1563b52b2adffe7d715e2
67379 F20110320_AACRHD sosa_o_Page_120.jp2
4232ea75536aa5b199ece5beabc7179c
42170534cf0b727daa7569945d9b8fceddc4cc2f
70090 F20110320_AACQXV sosa_o_Page_092.jpg
ce6fbe2c3880e520542f77a2f1f183d4
d6d09f02355624fb94cb116bf91a8cf0ab2db231
21474 F20110320_AACRUP sosa_o_Page_031.pro
ca93dea52f8c980ab03d2921fa06e92c
4965cf93f1a5c02450a517983eed5576c146b116
13841 F20110320_AACSRI sosa_o_Page_014.QC.jpg
1a3d915b49d14e86b0440b399dd7a625
f256600163031c94ef46d4ee09bf36a31682455b
46961 F20110320_AACRHE sosa_o_Page_121.jp2
46879425fcc5dfc2219fb47d88074883
1d40180223c1dd225cdd2c6bf49c05d9f9079084
44471 F20110320_AACQXW sosa_o_Page_093.jpg
d70137a09bf7e5cb40f7510c6a2dedce
4c2860b4e6f874cd6dbed9a1952a5c07f70ab32b
34292 F20110320_AACRUQ sosa_o_Page_032.pro
9d83bffc52cda5565890df7a0954676d
19a32bb11e7c5f6c641f493114ff94e5cac177c4
17910 F20110320_AACSRJ sosa_o_Page_015.QC.jpg
4bfa25092461bdaeeeefe2ceb6c897b0
578baedfef556ae9907edfbdc5e9974039bd5656
38053 F20110320_AACRHF sosa_o_Page_122.jp2
96e44f7600588c675824418062b73990
acf4634c6d2d90dee150b9093d79aacadf4f36d6
69137 F20110320_AACQXX sosa_o_Page_095.jpg
0fb5a4137a23208f4fd103d4d431fc67
7e998cfe1758716f5944a14becdfc4523b1fcf67
42827 F20110320_AACRUR sosa_o_Page_033.pro
991bfd5ce170adc4b0cceb59c25957ca
e539df156b5c22c838dfca94ecbfd13bc9fc7f34
8241 F20110320_AACSRK sosa_o_Page_016.QC.jpg
8b3689e17a86bedb0690c152a69ede12
a4aea2f7f80781e405d208622aae95f733810940
67317 F20110320_AACRHG sosa_o_Page_123.jp2
2d8c3595355f6945b020e2730ab7ad4c
9df8c7f77f0b281a0a02cf1169baf2d5f7cfdf45
76520 F20110320_AACQXY sosa_o_Page_096.jpg
f642571e3b72a46b6db512ad08af1ea2
90d78940d892751a5791e29edd20524f7c83769b
29079 F20110320_AACRUS sosa_o_Page_034.pro
165e01802801e7a21227a8156cc4833c
74014a2b8657f5163d214a281be0543ec6734257
20524 F20110320_AACSRL sosa_o_Page_017.QC.jpg
6daf2ab7136f830e85d83f2a19667d0f
0bfcbe0d44ca339823b34fec68693fbe5a162ed0
54419 F20110320_AACRHH sosa_o_Page_124.jp2
900169608ca97308983297aabb31257b
958c1d580bd65930f0e9d6b399ee9f3945c02a36
64134 F20110320_AACQXZ sosa_o_Page_097.jpg
d28649b054ac3631fd3ffd15929d6bac
00bde3b713e8a18cd81a7a8e094c0599b3e60416
1770 F20110320_AACSEA sosa_o_Page_069.txt
1a25d6cd8b98fb87f6852f553d64183c
ff1d6a05c3311b7d0bb4bbfbe22f99b0673451c0
33763 F20110320_AACRUT sosa_o_Page_036.pro
02c96c4b91cdebe040ee60bfc4873908
14b4bc0772dd8f3c912fdccb08fba909a32d1bc5
22195 F20110320_AACSRM sosa_o_Page_018.QC.jpg
0896fc8b51ee7d52ee1502d134d691e5
05c88725a481857380e10ab29bbc9dc03f82566a
64824 F20110320_AACRHI sosa_o_Page_125.jp2
ccf46d403d1d1f9a2333472f58bc18cd
47371abd296528af19b34b6e7473e6b36fc7af4f
2378 F20110320_AACSEB sosa_o_Page_070.txt
982be6085f310c2e692c043bcf190896
1948e2d70bfcd5af78252e0fddcffb9b6d2ec022
31047 F20110320_AACRUU sosa_o_Page_037.pro
532268e0fa09e653b0eceafaf0e6172b
cceee17c8ca0258c4d30999b455cca8c3a4855fd
22697 F20110320_AACSRN sosa_o_Page_019.QC.jpg
8a2d4573854d644987559e09afa11962
baf9ecc5210ead33c27780f92c52fd6e77a052a7
63005 F20110320_AACRHJ sosa_o_Page_126.jp2
2be5b1e2fb19833f93e713422b181fc9
cf709630fa8f74adcd3dda1293b78ac65068394f
1415 F20110320_AACSEC sosa_o_Page_071.txt
fe35a34c55a0bd551f7871ec91e1509e
911409fcdf390fe57b7b820349204228945fc636
23735 F20110320_AACRUV sosa_o_Page_038.pro
5c5a7a7feaf19b11ab78407c50a0796e
410ee0a87a739434cdd545a85ca60436d8279e20
18753 F20110320_AACSRO sosa_o_Page_023.QC.jpg
7e02e11e5aa6497c04f8d71de0bf089c
03ec7d96f6eb57fb34dad59897d94b933744f0af
53638 F20110320_AACRHK sosa_o_Page_127.jp2
47e9d544172f1082ee1cadb03d247a84
c6b18cfc8964902addc10ccad6002aaedae302ed
1683 F20110320_AACSED sosa_o_Page_072.txt
b7c0fe6d045505249d524907c1e4cfa2
4608a139f463f4c39e41833b5bd92d24a850a0f9
37260 F20110320_AACRUW sosa_o_Page_039.pro
39219b7bd68138364a29bf85ca140538
e587242d05663937dd052cb807876612e087fb75
17398 F20110320_AACSRP sosa_o_Page_024.QC.jpg
edca1933d446a2dd07c6d14acbf2a0ea
aa8c8d86ac28fe556e480c83397945bc9836a062
53175 F20110320_AACRHL sosa_o_Page_128.jp2
eb2a462443c85953875689e2938e8e3a
878156b9bddfbae2036161eeb06315bdac0a898a
2273 F20110320_AACSEE sosa_o_Page_073.txt
5fa02d4a7d72a72cb046dbbcd0c80241
5d5790a83ed577a8f9643e3ceafd88990a8d3fa2
41390 F20110320_AACRUX sosa_o_Page_040.pro
d4e8e6e633923bb4dc6c53dd360e1176
4c689c1995ee4b4f1e5ad75256d97dec605b406b
17929 F20110320_AACSRQ sosa_o_Page_025.QC.jpg
0628e92279a3f79021b6585d55718415
9f7d54a3ef8ed23cc2861535e93915e7f9b557e9
40546 F20110320_AACRHM sosa_o_Page_129.jp2
4c097b8299e4376e1638b849cc632fbe
623e058b6294aa0d49bfe0d5adb1736dc075ad58
1937 F20110320_AACSEF sosa_o_Page_074.txt
44458a8c3fe91351385169bb567d6330
f78e872277e2b9f60faceda931585b14777876a2
15629 F20110320_AACRUY sosa_o_Page_041.pro
f5e5d807641ced032e4af483640b44bf
68307b53cf4e0059d4306f2f1530d18b2f91e8b9
20522 F20110320_AACSRR sosa_o_Page_026.QC.jpg
8bb426af15e22d9656df598d5a93dd3c
7306966204433ff62c6b0dba74814a96a4d7676f
45404 F20110320_AACRHN sosa_o_Page_130.jp2
95ce003b621cf4d538c770664dbea7f4
58fd2aa9db0162f0f8bbb754786dbb9d7615c092
1920 F20110320_AACSEG sosa_o_Page_075.txt
fe375c76645166d7ecaeeec1d8cac42b
a92d5e153c39e316acc8ef25311e64f94b8781e1
26786 F20110320_AACRUZ sosa_o_Page_042.pro
ae22ee8d59acd413849b76e788e76178
08cc46bc76334ed6fb430e166136c565ecef09c5
27931 F20110320_AACSRS sosa_o_Page_027.QC.jpg
3f0d782240cda6d52209b18a242a1d92
eed5a2b997ede80a91fb5e7abb8fd435cc9ddf09
52416 F20110320_AACRHO sosa_o_Page_131.jp2
2dbda004bab0268eba5852ee14c1d19c
928116f3d5f5cda10ee8beaabe101af610dfb8ea
1220 F20110320_AACSEH sosa_o_Page_076.txt
6ca4a061e5cad15f6d6580c0b0177c2c
6dd1011a7fbeb2f45257e19b7c94f8cd11ef6289
16703 F20110320_AACSRT sosa_o_Page_028.QC.jpg
f56af24c05e9bdc4eb1191c0bb810e6e
c9be296dcaed442374c8e8948c866b98f7ac2628
41826 F20110320_AACRHP sosa_o_Page_132.jp2
c5856dadbe2396ee62ba2aa667980ada
bc383f5a295849cc9209d0910c39c4a64b7007cd
1366 F20110320_AACSEI sosa_o_Page_078.txt
6d51bc9d49de511bc6f17ef7bb926396
324b12c245936030b6be7e2f863ccc6b34a96916
19015 F20110320_AACSRU sosa_o_Page_030.QC.jpg
1ae1795ae0890cce99e6d81933da8b34
9657eb87ccfc93c5f25f513c52edf568a7d3db47
62703 F20110320_AACRHQ sosa_o_Page_133.jp2
68c4b08198d029e829f0842b99c73b6a
ca36e17d465e1ebfc673b69d4a5aaa0ec1c598f1
1560 F20110320_AACSEJ sosa_o_Page_079.txt
f43fbd7a62a34b9fe68113ed10623a47
da4f2496fb6c6270db828fcd6871c97c5f26999f
13538 F20110320_AACSRV sosa_o_Page_031.QC.jpg
8c9b3d6e4d2e808fcf1b43a1175fd8b4
8affbe09b43cd091933573811a15e954f7e16da4
58317 F20110320_AACRHR sosa_o_Page_135.jp2
63f4ad2cacf87ac2003ebc356b6a885d
c68a6bf109e44067bcf09cf159a6b2a9bedb7919
1463 F20110320_AACSEK sosa_o_Page_080.txt
56a0bcd4e5bd0ec52f5e99f81074a19d
fd0861966c84a286260916e3fb7ce2e6b5251294
18806 F20110320_AACSRW sosa_o_Page_033.QC.jpg
56b32f000d63eea795a33158a23869ee
6524bdf2796d26a38c2d6ade25ef751c472c0483
59179 F20110320_AACRHS sosa_o_Page_136.jp2
f7778f9dadeb7bd7c34e05160edebb6f
9b1c45761db5f87299ad4df897f0fa65cef2784b
1315 F20110320_AACSEL sosa_o_Page_081.txt
02fcc44a296d15e6a9a92f430f7e00dd
d26c54216d5f16bb59064937d8b224a71a039c2c
13636 F20110320_AACSRX sosa_o_Page_034.QC.jpg
2e45407183f63cadfd7d92f70fc11ddd
45044063cc48ced6048656eb0b9c531d68a11d5c
54385 F20110320_AACRHT sosa_o_Page_137.jp2
0fa1f5bb2d0bf1131c847b6ae5162596
0dec1e22e8ff7391f117a4d67ca58a8b1d54fb44
2549 F20110320_AACSEM sosa_o_Page_082.txt
a512be98885d23d9162e524cf06be095
923e2c31f097d31f7e54d69413f9cfd6d989f045
13967 F20110320_AACSRY sosa_o_Page_037.QC.jpg
4e4d2613b1bf20dba73fbf87e251ebaf
a8971d1770f6eba2055bfaef5f72b96cac5d0e52
50307 F20110320_AACRHU sosa_o_Page_138.jp2
92d0c4b0a483ab698294bf4dc7865ab8
49c1d070e77f787443fccf69b78ad871af67ddb9
1754 F20110320_AACSEN sosa_o_Page_083.txt
c959c650d0e48fe88033edb7b84aa261
7cf892dea6d85ecbec0e9705523207bc4047e49b
12937 F20110320_AACSRZ sosa_o_Page_038.QC.jpg
056857f2ea7f8b657d2f86c98da12dd0
6a7d39c81590e402bcdea99a62c733af124809c8
96573 F20110320_AACRHV sosa_o_Page_139.jp2
11553de74dd874d282bdb24fd01bac96
4d150526295713453f3ea2f503cb8d86c1312caa
838 F20110320_AACSEO sosa_o_Page_084.txt
1f12f987c26ab818654ac90519b32654
9fea2b88f8b2e54bdbee2101adb8d9de89f890c8
84133 F20110320_AACRHW sosa_o_Page_140.jp2
502cebf4c47c3316161824e5be000dbb
82c0aba16846a5535362a9467b2a9626941ddf3c
1712 F20110320_AACSEP sosa_o_Page_085.txt
200d9b0f3259af9646843368357c2dba
c3ffbc68de1e01aabf7fda3cf4c46a5a5829417a
52025 F20110320_AACRHX sosa_o_Page_141.jp2
36448e53e681e4ff2896bff71f37eaec
8258209f97d1aa7c22ab7b82c3b09bae8a8bff91
2382 F20110320_AACSEQ sosa_o_Page_086.txt
56886119d074d41d2540f78bf4dab4b6
6b82e2b47bcc58e243cb3e5c88e5c94739ab0752
63018 F20110320_AACRHY sosa_o_Page_142.jp2
46367c6b96b82802bb40cfce2f7f268e
aeb7e0ca4d65a9843b9e65a22a5fdb8f7a299713
1997 F20110320_AACSER sosa_o_Page_088.txt
0b7ea60f070924a904d8e82b3e4890b1
62853b795378aa8f81a2cc89147b10dfd346217a
70171 F20110320_AACRHZ sosa_o_Page_143.jp2
9e1beba4aee67c1a3b6a83fde6ac44d7
9f8e66f2d2a59765563ca804073bc17bb6803ddc
1457 F20110320_AACSES sosa_o_Page_089.txt
ad594a0b922f32ac7bb2b2ad24992b76
6ae02f30cefe132f52552599e0dbfc7f20e04be7
1084 F20110320_AACSET sosa_o_Page_090.txt
3966536536bcd4814f951f06a9bd1941
daf43d4a1688805619ffc0f84636e6496d686b85
1330 F20110320_AACSEU sosa_o_Page_091.txt
3d76dd3766061ed4ad47b7c57989b498
182100a3d8163a84f7217e475e096f2f7db8c8fc
1968 F20110320_AACSEV sosa_o_Page_092.txt
b910b7265d5faa98d97a7d27d122bdbb
8b61bf309475e6866eb36b6c8b4863cdf10da2fb
1139 F20110320_AACSEW sosa_o_Page_093.txt
ef24faff11363479d50c2e6ca15b1895
b2da87ebd9265b107cddf65d8d09a0753aa6eeaa
6224 F20110320_AACSXA sosa_o_Page_051thm.jpg
ca964f81817bc7e7c7dde51fbd371c57
58a2c40b446c27b019aa3e2f7b34795d8551f434
1818 F20110320_AACSEX sosa_o_Page_094.txt
92f86cc9298fe29cbe8bdf5304406651
9822f0186f2130f9d31267bf9fb5c229f23cc062
5682 F20110320_AACSXB sosa_o_Page_053thm.jpg
3e79aa47cebee95c8c99b3f613eec84d
28008fee3aa3a7b2db78d0b69f6304603d78f690
1500 F20110320_AACSEY sosa_o_Page_095.txt
3824df0e74757defff979339690338f4
87ffccaf2e0a05a20ae115a7152f5cf684c9b28f
6306 F20110320_AACSXC sosa_o_Page_054thm.jpg
01a9155a1b23f4ae5f0bc2ea362acfe8
511f181465587164de718f7ebdbae8d506610265
2839 F20110320_AACSEZ sosa_o_Page_096.txt
0e2399ed8849d4e4e5a6db55f8bbeb2d
1230254cfc98d36a83418588aa520cf2bba2e726
5587 F20110320_AACSXD sosa_o_Page_056thm.jpg
a7074916f03b7cb0324babdbffd87db9
e9b3b8fb24d312243ea75f61657a82e39fd64a76
5227 F20110320_AACSXE sosa_o_Page_059thm.jpg
068118fed0be0b3ba149db09e9a4478e
29758598f05921e933a3c7c6701dac7647d1a10d
F20110320_AACRNA sosa_o_Page_053.tif
4dcf394621d9c233ce362078ff0c2a82
cf9c11adf16b6ae8f08e71d7283994f5616ca63a
4512 F20110320_AACSXF sosa_o_Page_060thm.jpg
14561b7f6d316fd7883fd38512722148
370d25e8a6b79d0b5aa78abe460c3595f8d46b42
F20110320_AACRNB sosa_o_Page_054.tif
79beeac7c58c761bb1d1ad6ddfb281d9
763abfb05d61abf3baf96e0d8ed2e97f83722a6c
4618 F20110320_AACSXG sosa_o_Page_061thm.jpg
9bceffd50a4e78f669bcfe323a386561
fb50ef8ae675acffac2bab2fbe73bc99f27c688a
F20110320_AACRNC sosa_o_Page_055.tif
6c2a0cad73c6d96f414a27732a611396
c948f98e6aa04c5151df0f8b55223a7a7f51c02e
5357 F20110320_AACSXH sosa_o_Page_065thm.jpg
533da18b9f8ec6fb518a15453fcda191
6d9229a7b477d1a18eda32e1e501b6a06aa25d21
F20110320_AACRND sosa_o_Page_056.tif
5f548e78ea0fc47516d44ac2371c59cc
465c6ab8b9e5025db504fa6e5b485c25a372b81e
5789 F20110320_AACSXI sosa_o_Page_066thm.jpg
9bb3fab8de937e2499070bfb526adf3d
b6f1f1fc2b0253398bf6459264a5cf0a0343265f
5240 F20110320_AACSXJ sosa_o_Page_067thm.jpg
e1fe1b3f954e9aff62178add810515b6
9fb0fdd84a0470a483b57c91a63a0bc20e3c728e
F20110320_AACRNE sosa_o_Page_057.tif
9b99a20f51717716a007e6687dd07498
a8a78e88a96c5fb6770bc6c8178527d072a0b7e0
4998 F20110320_AACSXK sosa_o_Page_068thm.jpg
e55eb4d028d01e2bac1b61ca01eccdd2
dd6e7a2fbcab3c5ce5397ffe86e85070ff5c7219
F20110320_AACRNF sosa_o_Page_059.tif
0189d1a23f2cca9a479c6f9d67fa4e47
3b190b7275daa1e6c07edc9c493d03978224ae69
6108 F20110320_AACSXL sosa_o_Page_070thm.jpg
dd151c9cf392b091d18da2f958621c87
819a79b33f554de934c92319dd2b17a4e300053f
F20110320_AACRNG sosa_o_Page_060.tif
57249e64d006d569cb3cf8d93f4b5035
572583fc44aae0e29eab5e1d9d6f851c188203a4
F20110320_AACSXM sosa_o_Page_071thm.jpg
bd238c4bdfd1d13a6d6c81690201ba08
ec2287b0afb811c143317c65ff95c267bd9e65d2
F20110320_AACRNH sosa_o_Page_061.tif
c5da4ef13b3f3a94d6eb74bac64b5790
d285318db0f3287a1bce166c0e3cd61a24b6c646
3086 F20110320_AACSKA sosa_o_Page_172thm.jpg
798668eb00332ef9b57ae02e3731ca34
b0edf9e1aa445fd9449e6d89aeabae6946b6678b
F20110320_AACRNI sosa_o_Page_062.tif
523080276eb0d34efcdeb728b167d259
ec977c19a7337166d27e7ea61cbda8f8bcf4c235
2994 F20110320_AACSKB sosa_o_Page_127thm.jpg
949c1cf09240368b25a53998265c1676
52ff2fce50695403f770249a9da92831eaf9f66f
4732 F20110320_AACSXN sosa_o_Page_072thm.jpg
00cdeaca1a3af1c481aaec1279670831
6fb7d75486ac2dbe92129241ac7cd8ff1dd82de5
F20110320_AACRNJ sosa_o_Page_063.tif
3f0932d86a813d3d542a9ca4a89cff1b
4ab5ed3bd44dedc459309e66810b40a5a12d2562
11944 F20110320_AACSKC sosa_o_Page_218.QC.jpg
ccd0bb05c48692e3d90200bec0988594
2565dece9cc9be42c91687b8230220821361bf91
4350 F20110320_AACSXO sosa_o_Page_076thm.jpg
54bc9ba624243babfa1bd7a1253e9c29
a22e51ae24b6db1ab90e30b4cb5f63696fa12563
F20110320_AACRNK sosa_o_Page_064.tif
f62aa96e05f3c8dcc04606d12fc103c8
bad1046aef31151ac0b40359d8456baa90a0864d
11297 F20110320_AACSKD sosa_o_Page_163.QC.jpg
794905956dfc091dfd17e2ea7197d9c9
1ec727d5a9e8d5fbb6e0beaa8466b342f4876c1e
5937 F20110320_AACSXP sosa_o_Page_077thm.jpg
5084c4896d8d5c89626590e2b71aafea
9550e9789db05e4a5116e66cb70b1301eb54a5ff
F20110320_AACRNL sosa_o_Page_065.tif
e493d5794ddcc1c2fce01d41499d7cbc
b26e79752e13dc90e37cb01ec4f2c8de474fd497
5718 F20110320_AACSKE sosa_o_Page_033thm.jpg
c499c5a9799d2370b3db6ff26d10e648
d4613e9872d3acab6303220ba05092f6a2b448fc
39457 F20110320_AACRAA sosa_o_Page_152.jpg
498f03a64e97e1f00aebecc4cf76e623
05ffd7c93ae8bd420864e792db2d3be1f7d6b5f5
4951 F20110320_AACSXQ sosa_o_Page_079thm.jpg
4abb6e7153aabbc7cd46f96f873e20a3
e57984120265f9d7e2d5c9c46c71bc977c9d2ec4
F20110320_AACRNM sosa_o_Page_066.tif
3b4189234a7dcbd16bb41ca9896bf180
9a72995f5f79a5ad0b10cb68d1d195c4ea77d516
3242 F20110320_AACSKF sosa_o_Page_002.QC.jpg
2d252018a48f71cfd1c1683858b8e2a3
bd37f08612dd44e7a7515cbfbd786d6a611dda8a
44538 F20110320_AACRAB sosa_o_Page_153.jpg
65906bdd8c0e1afaeb6065423458c9af
17beaad7f23f83e00fef3bf02815ef5f51966185
4644 F20110320_AACSXR sosa_o_Page_080thm.jpg
83eccd6c1add6662892e133c16ddc875
311a79a60b847db4a91c384d9a9c2d156d1e32cf
F20110320_AACRNN sosa_o_Page_067.tif
55f422dd10290ad825f82b6ee2834a14
4c2d434fd7cb97be995eda80ae8f7526e18d5ffe
3250 F20110320_AACSKG sosa_o_Page_194thm.jpg
4a29b5aa00d5267bf6bd774dc2963c53
91559fc160d39aa673c57076602dacd8bcae53c7
42407 F20110320_AACRAC sosa_o_Page_154.jpg
e1a910f3e7223df892fac1b0031eeb40
e53b163d166443fb67006f4092959741d827a6e8
6049 F20110320_AACSXS sosa_o_Page_082thm.jpg
54c5ea5b2e7ed91c34eb3a23dddf8e6b
7ea104cd4a5ae788d985ce7cd68c797c22dab751
F20110320_AACRNO sosa_o_Page_068.tif
3236c6087e8d0bd8ec1502f7f478c347
d46beef17a1eb2a30ec9da0dd33c63d18e67a0bf
2646 F20110320_AACSKH sosa_o_Page_193thm.jpg
0e3b813a82bdb190ff007608103316f2
0913bac3ebab9bc0e801ca2d5967eac7782d2c01
44322 F20110320_AACRAD sosa_o_Page_155.jpg
01ade9d517d6ae0bca1377c5287ce570
3dcbbe75a4be190c43f3fdcbe89b64f64f192b7b
3655 F20110320_AACSXT sosa_o_Page_084thm.jpg
e9e8d514ccf1c13e23fd813ecf1ce63d
ca750d0b3fe4ba2e3053457aabcfa48cfa82aec0
F20110320_AACRNP sosa_o_Page_069.tif
3a566c99ea7a94ed7d79389fb7a23dab
ca666aa84d5bc9ba1ad36059735d4fc96a285701
5278 F20110320_AACSKI sosa_o_Page_012thm.jpg
83eda59fe16c931b78d0253f78567cef
0fb94593ee472ad81fe9fba97ba907cdede46451
41747 F20110320_AACRAE sosa_o_Page_156.jpg
a21e1035d4954ff97e4099ad4cfd3c5f
a2f80c8d99e01e86498a64a704015d102113f278
5487 F20110320_AACSXU sosa_o_Page_088thm.jpg
3fe6ae43b53c404ac442b8472dd32e68
0717ac86625e2bfbca5f5850a4c5c124ada82eb5
F20110320_AACRNQ sosa_o_Page_070.tif
67838d9eab3707aa38f49979e7c659c6
938c44e6a6883e97ea6990b4e5ec6ecbdae23312
5250 F20110320_AACSKJ sosa_o_Page_086thm.jpg
35639e0d94c18992546f0a8c6856d852
ebec6d72d59d8fcc3f3c221396c2dab4769777a3
48785 F20110320_AACRAF sosa_o_Page_157.jpg
f7fd6a4ac41a94f24a7f64d5571eb541
fc62307814defb63f293941ecc6698c40314dccd
4301 F20110320_AACSXV sosa_o_Page_093thm.jpg
06640997e01716221653cbef1c23b8e4
5373d3614e78dc5046fdbe86119a2245c2056cb9
F20110320_AACRNR sosa_o_Page_071.tif
d73b395b6f2df86ebbfc468e88c6d124
67bb81069f4454b6d17c9824deffebd4bbfd30fd
3476 F20110320_AACSKK sosa_o_Page_212thm.jpg
9df20b6964d6b85ef6f1c08a22746ffa
878fe94f3f1193765433d0fe299466f85420c48d
49124 F20110320_AACRAG sosa_o_Page_158.jpg
850ccf41a16cfb3b51e2e22a00c04614
78f9a5667614c075b52e9a3e27dc5eec951e9873
5935 F20110320_AACSXW sosa_o_Page_094thm.jpg
6489bc2ede4abffcba1d6280608e4019
45e3e80702e8b7f463d335c14318cb7886beb9e9
F20110320_AACRNS sosa_o_Page_072.tif
cf5b0229ebe11f5aff24b4bee67b3124
3d303e6ed08dee4a6d35f57f83b2a8ac5c9cea4c
5631 F20110320_AACSKL sosa_o_Page_073thm.jpg
4c3c7a936a63709929c46ff2aaa68f86
d8d18776ca7564acdc447b1c806f831d36b9e161
44668 F20110320_AACRAH sosa_o_Page_159.jpg
0397441020a69d2e56daa0f9424bfa68
e3e0156eaf094ce254c88c83aca14591dca4dcb0
6450 F20110320_AACSXX sosa_o_Page_095thm.jpg
e4c1a313cf5d6260c9aef05eec8cd2cb
2137d4d9fc03ab129ce1c0936bb033ad78cfde57
F20110320_AACRNT sosa_o_Page_073.tif
74b2d3483d0fba23a362711f22b69e04
c945e31be9f5ab5fed1041d309565b19d3c4f1e9
5014 F20110320_AACSKM sosa_o_Page_036thm.jpg
34740515bfd83e313727b1956f96205c
66636d979ddaf83f602c63d1635d3eacf18a97f0
43467 F20110320_AACRAI sosa_o_Page_160.jpg
68a371809aa6b2d5cf60e02796fe763b
5186d43d3ea56c65ff6a1e80549e1fe022087b8a
5901 F20110320_AACSXY sosa_o_Page_097thm.jpg
a38b5359ee2ac0ce1f7d318bc7a2f687
d7bcb1eef599c64194de69bd555980f51c6b1953
F20110320_AACRNU sosa_o_Page_074.tif
ddd3c11391ae5d9a0ba8b007d2e1242a
8bb54af9834631cfc94dd9288e73d1811113efc8
4809 F20110320_AACSKN sosa_o_Page_062thm.jpg
82d4b7595ef6ef1ea47ca487c7586cbd
e6df926c852baa0db33283e45a8ef3f082e1b97f
47731 F20110320_AACRAJ sosa_o_Page_161.jpg
db83d0b86af472f013166208e391a03f
46766b8487a5bbfda7507abc648934ba69acb310
6042 F20110320_AACSXZ sosa_o_Page_100thm.jpg
f2df77df128bcf13b04515e4eb606d3d
a7432d1f3f66d93a6585aeffca32d278b8747411
F20110320_AACRNV sosa_o_Page_075.tif
373e9fa18cd1a8a9b42af273128c6925
0bf5d6b0198a50a6da3e6f1f77150b62ca07e126
12220 F20110320_AACSKO sosa_o_Page_052.QC.jpg
1e4737c7ab797b67f899dccf18caa395
91725ebb76f87434cb1f0f784533f45078832ebd
34511 F20110320_AACRAK sosa_o_Page_162.jpg
5d4e45d4d9204f2c862dcd9ec5557644
5a6d8777022aa1f7c0054ae1abdf6c30d7e65c25
F20110320_AACRNW sosa_o_Page_076.tif
438d54177803c624aa3976c8212e23da
4565e9bbc9c7c2c55e444270c2f7f2961b2a6303
17591 F20110320_AACSKP sosa_o_Page_029.QC.jpg
21fc595206d8b722e702bd9288289a5a
73d33dfd3f06cae9c22fd8c829aa1f8dbda333b2
41685 F20110320_AACRAL sosa_o_Page_163.jpg
fa9425cd7c8d7302d4df05bcb47d1d1e
57d8252fd37b297506ec029e36e07e2677205a06
F20110320_AACRNX sosa_o_Page_077.tif
8c94fcb28fc7af573a9b74e2275ab69f
2e60923dc5802956f8f7202cf8195e60911579df
12042 F20110320_AACSKQ sosa_o_Page_180.QC.jpg
55999e902d9e885a054c89a22bda2fcd
0709db013c2045d05eb3d1fc2ddc57c7c0a96937
39651 F20110320_AACRAM sosa_o_Page_164.jpg
781a3bf24c10490700fb30dd2e7b7485
4b25826c6462a83a7b5c66824bd360f8ca69aa9f
F20110320_AACRNY sosa_o_Page_078.tif
e79151b487a17cea5569b545ea6a1c0a
531b795f58f0f63371d54d370f1b48968036421d
21417 F20110320_AACSKR sosa_o_Page_107.QC.jpg
fde2dc0c07cc87cb7151ba8904034a8b
2324207c0024e99f8e9926eece7938385030626f
43494 F20110320_AACRAN sosa_o_Page_165.jpg
d1fa3e7d0779ee7be6c06d6e42268b9c
76323ccc3536d18d7f6b769518b45f819018a4d0
F20110320_AACRNZ sosa_o_Page_079.tif
c633de0fada3efc58f2988e266f18fa2
d72457cff1735b1a478099d94afc68ac5101c5a2
11339 F20110320_AACSKS sosa_o_Page_173.QC.jpg
34fbe7826d55f572d51f645d7895914c
8c15f7a16ad70d5d88c3af002b48eac12f7d22f7
40721 F20110320_AACRAO sosa_o_Page_166.jpg
668b3f722f6f065675b43d898cb8b943
7af84a4b7d00daea16b91d171286f1b63fd79d67
6190 F20110320_AACSKT sosa_o_Page_045thm.jpg
c071def8df01a5d50a49bf354db6ad15
7e9d0a3d3ff1cf70082bb595dc9e26e8fd1ca76f
46969 F20110320_AACRAP sosa_o_Page_167.jpg
8108341342471fce8cc73c9346cde760
f761bdcd2870d494f6e322ce52fd59806a8ec773
22927 F20110320_AACSKU sosa_o_Page_092.QC.jpg
5fff334b3e03be3169a33ea581f0d153
6ea96fbb1b71891c3ae75e84d0b9b470f7948bf9
64457 F20110320_AACQWA sosa_o_Page_042.jpg
7b7d4e2ab2cf477673846dab700732b8
2f1c2c529e7670a731ec1601e697f2cf14bd2cea
41432 F20110320_AACRAQ sosa_o_Page_168.jpg
895eef6637b8a6d7607c53d9f4267557
9c70230701f44a5bd927c57a27c6373f7164b5c2
10716 F20110320_AACSKV sosa_o_Page_127.QC.jpg
f39c66936c5c527c22a3e8de06b8b673
7dd29638a4abd5f1ed39190f4c2a4c82389ab581
22295 F20110320_AACQWB sosa_o_Page_043.jpg
129fce831d915b9c6c170b01be5c32f8
9926a78d8f79cf7431803a7675f8759debe30911
47420 F20110320_AACRAR sosa_o_Page_169.jpg
2ecd6ba91ae78c724d44ad0d430686a6
a451543a3f8602ac3c23c6319a837a44954a434b
12240 F20110320_AACSKW sosa_o_Page_194.QC.jpg
26f3655ca1a1634a00834fde9c52b456
744b55b518e4ef93c18fc86190723af840b1a9d5
60496 F20110320_AACQWC sosa_o_Page_044.jpg
b903f5d2b99bf62c61e7e34df08c8d4b
a5322870c372d2d815369b51d3d0bb502ee035de
40605 F20110320_AACRAS sosa_o_Page_170.jpg
ee38ea2505101df159959a38803ae497
9309f7c88d82edb5d7243162aa4e68df2b83d25e
14375 F20110320_AACSKX sosa_o_Page_076.QC.jpg
933e3faec5f480242a4ca0083311fdc6
0a934d9fc493b3f2461807f400869e9549c26593
66880 F20110320_AACQWD sosa_o_Page_045.jpg
1d8802add90fa8f06edacd8b206ac319
0fba605e6726a4171082613968fa0561ee5455cb
42989 F20110320_AACRAT sosa_o_Page_171.jpg
93f25b8b100ca0d594f38f8be4b22f8c
23595ec897f05cb58fd946e99a05c7099a73625e
2934 F20110320_AACSKY sosa_o_Page_118thm.jpg
cb366ab2c0fda973852826fa136360ab
f9a5d0ed0785da893997783fa1041e15c61922fa
56760 F20110320_AACQWE sosa_o_Page_046.jpg
4345472997f0931b455a22ba6c0227ec
6ca25c3733d89783cac8ac3ae790c4823ba7975e
43131 F20110320_AACRAU sosa_o_Page_172.jpg
49c12263f02f61e073f1196134579daa
1a0bb2576bc95ba6df56892decdd4f99bf169b30
21829 F20110320_AACSKZ sosa_o_Page_054.QC.jpg
4e97cdfed68d3840778ca8bc2deec927
c3ef78d02f3d2d968713448b73aff6ff8538b7a1
55103 F20110320_AACQWF sosa_o_Page_047.jpg
9e8400b8d48c6c3b1e118acff0f100f9
b11191c5b24971987a7b1996d77e97c9a85ba9f5
41571 F20110320_AACRAV sosa_o_Page_173.jpg
8a637501cb489c2d61e2962b623ac33f
bd5ea8f12e51da9a5780622d39d0df382053d163
65717 F20110320_AACQWG sosa_o_Page_048.jpg
0e1302ed5c613ed55c700efc43357b9c
d486e438a9235d32a36a8c9a67994582eb14534c
29479 F20110320_AACRAW sosa_o_Page_174.jpg
6e8903e601d9f60933732a3890f9356b
8c17a4e1aadb6b39ebc642cf4d01e05ed7638f77
F20110320_AACRTA sosa_o_Page_215.tif
afd87faf027752d1e38515d39258e7d4
3cb2e9e1f71a2a6b388d058eb7e145131a9118e2
61631 F20110320_AACQWH sosa_o_Page_049.jpg
0fb0f878da79ccd6a985419fcca6085f
47c61ee22d61d1f368a3eb326211566e385eae4b
F20110320_AACRTB sosa_o_Page_216.tif
98f66af2b233605df7610ad39fc4d862
a93030a6d1a26fef1c45dbd99250b259729e4170
59239 F20110320_AACQWI sosa_o_Page_050.jpg
b1af377fa578c581963776c850d50460
2d70ca06a825dd987b602074d59027404b5db9c3
41159 F20110320_AACRAX sosa_o_Page_175.jpg
abf49c0ed6c461739fcdfeb66135b334
66bd151ad07f695f4ba8b38b8d66e044dc2ad475
F20110320_AACRTC sosa_o_Page_217.tif
192821a50d546f31ff9e29652dbe2dae
258352f496e810c1936df65953cf8b19bcf95d69
71196 F20110320_AACQWJ sosa_o_Page_051.jpg
e0677bd6c235a1f84dad3faf84309491
d8df77224f5d4720e78621daa1791e754f47a6ce
52294 F20110320_AACRAY sosa_o_Page_176.jpg
4659324506c2c859f51d268c20255d63
3971c325106ccd6fe3f6aa73e5047969f4f01152
F20110320_AACRTD sosa_o_Page_218.tif
1d099db22b0de69a82cc3bc57682685c
0837f67a0148aa80be1c7fa59cdbb512a70514c2
38474 F20110320_AACQWK sosa_o_Page_052.jpg
6fa0b6ea49233e1f12b4d6fd1aa8860f
97c74004eb4d6a827cc77f48a5388dfb4513261a
49812 F20110320_AACRAZ sosa_o_Page_177.jpg
902341cc123d41fc7df65fa7590b43ce
34cf1348b10d44f78b4633259a04512e0cdcbd24
F20110320_AACRTE sosa_o_Page_219.tif
cfb990c40023bdd5cffb05d0ede22ec9
14c2008b84ae1d10fbd9eced195edc5f84e1e04b
59208 F20110320_AACQWL sosa_o_Page_053.jpg
1661df64924e598bd71b840e02c02690
01d4bc459c3837119f3fba57bae88d89c0594263
F20110320_AACRTF sosa_o_Page_220.tif
3fb0a7d4c3a8a0689986ecbf31182c96
e497b7bb6f5a86cf7d31c146cf3d62d3972971c0
67228 F20110320_AACQWM sosa_o_Page_054.jpg
c094ef52edbeea7e355acfb2d4e38e54
23e31845431c6d51cab34264b639c7b7d2656547
F20110320_AACRTG sosa_o_Page_221.tif
facca77697390426861d3f90e867870d
e36b4740d36c6157fc7cbe302d390069f50168c3
60568 F20110320_AACQWN sosa_o_Page_055.jpg
a5fb7dfae53a33cc65fa1d6d1b3e6098
2cd6049b6ae14601b1c01c2418ecbf893abba4c8
F20110320_AACRTH sosa_o_Page_222.tif
a7e949c18c7e61f9a35d28a8ec8175e9
d58a4c7e2f82f1285f5aed77fc5a92068cbe4550
15036 F20110320_AACSQA sosa_o_Page_061.QC.jpg
35d361510373a12c41e771af2cd9f4be
bc61328bc032480f9e3c74880279043323ebabbd
F20110320_AACRTI sosa_o_Page_223.tif
c5771ccf28c1c9a6218bdb952607415a
70fd489542a37878f23990436d09506864fe438b
20256 F20110320_AACSQB sosa_o_Page_097.QC.jpg
d3fed2b921881d8870ec690ae51e647a
d02103d3965601b94f37e600b268f0e0b70b6546
59702 F20110320_AACQWO sosa_o_Page_056.jpg
3d72b1c1392e2f4daa308c7e4a34eada
635afee7542124a5f6900c930ed9c37c66508a14
F20110320_AACRTJ sosa_o_Page_224.tif
1442b89582035359b37716f726726ec3
859a1d1e3c8e5946ed9a7f28269e586720d44a02
3125 F20110320_AACSQC sosa_o_Page_225thm.jpg
d797e200aeb14b43b5c72bb8f7fc9770
107f7fda1c1886c4b96fdb075093a23c38ccccc3
41890 F20110320_AACQWP sosa_o_Page_057.jpg
b2dc3786a6d76e6eb351403efde29bb8
fcb45e494f75343e8d889083e56d0e8f1e4548bc
5050 F20110320_AACSQD sosa_o_Page_069thm.jpg
f09fddd2458475bf45b15ac9b1b20606
a022942bc896371b4065d97a256f090ca8d5c716
54302 F20110320_AACQWQ sosa_o_Page_058.jpg
4bed0648239481fbd145ea8b1c83fc02
30eb34831f85860c5801e723e82804130d0ce6ab
F20110320_AACRTK sosa_o_Page_225.tif
c5b337c9cbd40c82f3bfa30d8d7fac0a
8784f0b02b26182da2a1511d7bdedd282202e5ec
6545 F20110320_AACSQE sosa_o_Page_087thm.jpg
fbc32a034a366ac31ebbfaa55c6b2483
385705566d3e22dbaec4e6495a11d297763d1118
48143 F20110320_AACQWR sosa_o_Page_060.jpg
20db50ff12723cd8677d82e1248ed5b3
811e3585f3ce25b80bb3626540293909c8065374
7654 F20110320_AACRTL sosa_o_Page_001.pro
fc85e97e8cef6013e7cd8bf510bce54e
5b33617564a675b45ab4dbd49580a93640516007
5973 F20110320_AACSQF sosa_o_Page_113thm.jpg
de3e45ed066b10d983e5c4d57d3efbcc
4fa1ac02fbdf91b16360bfffa3151e8227bf45c9
902283 F20110320_AACRGA sosa_o_Page_090.jp2
04cd9f7280ac8a04331eec1ddcf0c698
35cec5308d26656bd92618d8c117e5a3f4313504
46651 F20110320_AACQWS sosa_o_Page_061.jpg
e5204b4b734036335ddc46e31600a1d0
b95c061d604e7784000f3273dcdb1596bdd25ad8
1069 F20110320_AACRTM sosa_o_Page_002.pro
7f184f9fc6b55bafe0b25e8f0294e6df
0e210b22e4baba08ab89e1bc6553eb72de54e6df
914812 F20110320_AACRGB sosa_o_Page_091.jp2
caea4111f3c660c7b4f0ec302162fdbf
cdd0d3bd5f27396f182902f57edeef3e93929de8
49820 F20110320_AACQWT sosa_o_Page_063.jpg
f50c654762b9563f3ed502b2b06c3928
67e6c3a641185c633a6620e1342fdcef60cc7aea
5244 F20110320_AACRTN sosa_o_Page_003.pro
b30da3d3d7a3e4bd7801d7253847b119
58afd920e34e192b62288deb2aaa184ecbba8cf8
2470 F20110320_AACSQG sosa_o_Page_122thm.jpg
38b4b29c3d53bd1cf092bcb34ed3f853
d92f76545a75b611173be6fae9581cff05afba67
105113 F20110320_AACRGC sosa_o_Page_092.jp2
adf270800be40117ce39c3690e695d95
480a1dd043a306f3fb1519d2269aff1c38164281
55789 F20110320_AACQWU sosa_o_Page_064.jpg
89defe654036f24141fab79d0986b18a
a267f6f985c80e684d6fcb193a1768829a7b8f28
33723 F20110320_AACRTO sosa_o_Page_004.pro
4cb1d33a008d5614f261d5301e157872
1a9540e4e8f0d5a35052301dd25eb1de13900f9e
10797 F20110320_AACSQH sosa_o_Page_137.QC.jpg
824627fe0593ad2f97ab177e779a012b
fa04e80d7bdfe001270225169acca99898bb8688
63671 F20110320_AACRGD sosa_o_Page_093.jp2
7621357a9f6f03839ae45a739e816156
3a6e3636eec3fb4c0287d08ff12462340f132295
55809 F20110320_AACQWV sosa_o_Page_065.jpg
961d64920670d7ab76055df8c1748f51
516ee0838e8aa1b38052306f2bb8fa0379826fef
72109 F20110320_AACRTP sosa_o_Page_005.pro
c63590f847b4f9f0e215429e73cc7c6c
1f1735b93fa8b5c7b0ced0fba073e4399e2de9a2
1621 F20110320_AACSQI sosa_o_Page_215thm.jpg
a812e84ffc3b996a176df90e0d066488
caab26bf0cbe05b7b9fc2664464a0c6defdc1c88
96368 F20110320_AACRGE sosa_o_Page_094.jp2
02bab758aef9390bf5e0de7751de73c4
223e938ef8a4cb360cc7daa5fe41dffc84b6c22a
61198 F20110320_AACQWW sosa_o_Page_066.jpg
45e398b6026eafe27dbc6b05c8f1a22e
9f8773467b9097aa6a80cf853dfb848e85aa97a8
114280 F20110320_AACRTQ sosa_o_Page_006.pro
0a46c2ceb502bb513720087ecbd1b4a5
853418064f7bcd2bd8845902d65883c604c6b844
9360 F20110320_AACSQJ sosa_o_Page_221.QC.jpg
0233a512a5d2088f31b662a52d1a05ef
b8ab4b3e1c3af99bdc3eef0a724edc912e8b2e8b
1051957 F20110320_AACRGF sosa_o_Page_095.jp2
ce0edd6a2b046b7abf42bd5399d57138
a28ea352f79ab09877afb42fae24017b21579b73
56623 F20110320_AACQWX sosa_o_Page_067.jpg
2b16519c7b81b2402c6c5e7ed342fec2
43bc960a032f4def5449e8337e9714c600c13d20
104018 F20110320_AACRTR sosa_o_Page_007.pro
15fb7cc8ad2a691b796e4300071a23e0
25b53b680d94f0bb8caf21a3657d84c4804e9429
3077 F20110320_AACSQK sosa_o_Page_170thm.jpg
c917b26ca0c97dbf0192bf3b3cb4b223
c330eb19a142b35c6a5df02150a84b3e246e1836
F20110320_AACRGG sosa_o_Page_096.jp2
3e541d50eee460f92c6568b4049f972e
7fdfe3b9017c7680e01ffe2c17c897931d373973
50064 F20110320_AACQWY sosa_o_Page_068.jpg
71ce6e17d1b89d3a502329ead4a3441f
12c1b4e74ec1296327beb5a1baeb4a7044fe4da3
98755 F20110320_AACRTS sosa_o_Page_008.pro
f167708cfa4df3091abb30b976f4ee74
d762976852eb24f9a440073260d921f25eb8a7cb
4012 F20110320_AACSQL sosa_o_Page_022thm.jpg
10f6e790985bb0819bc76c1717426648
142991b8feeecc307074d53bbe6a8f5a1ba1efb5
859237 F20110320_AACRGH sosa_o_Page_097.jp2
063cc306fc525bf014947b801a35b4fa
cd5a99344f6378175679a02aebc482df7df92bb8
50889 F20110320_AACQWZ sosa_o_Page_069.jpg
e53f10957b70e858dbd817e743314d17
17651117185885d2d381fa011fd3d6ef24efa7c4
F20110320_AACSDA sosa_o_Page_042.txt
fc72a7faba594fe316ee2c9484919b36
24341a05d21061c0402932e3e7f6f22c94c5189f
15346 F20110320_AACRTT sosa_o_Page_009.pro
731c3a137c3187806af10d40a0a014c6
41fe91845085f5b308f828a22c426e7e28db777c
2794 F20110320_AACSQM sosa_o_Page_144thm.jpg
0fbb028c4e8464c5a4f4e0e41ef44bbd
dc714e21f91071d93ffbd3c27a6f6534c4c0150c
87866 F20110320_AACRGI sosa_o_Page_098.jp2
770f2dc0131425bf5d753907d7b6bbc2
47dbfcaa94e4b364b668b963382fa30fd2439fb7
479 F20110320_AACSDB sosa_o_Page_043.txt
d34572053a741ce88f252f6ac8da02ff
a7951ec51a33bd56b853cfedde38071d17af423e
55273 F20110320_AACRTU sosa_o_Page_010.pro
0b74d4330325931dfb6205189fcebfdc
792ce228640f1a06ee6118b416a12c677356f864
18578 F20110320_AACSQN sosa_o_Page_074.QC.jpg
985f345abfe243ab4bc88c126255f349
d3c11c9378ddfef3e166fe394190b929242c4295
754782 F20110320_AACRGJ sosa_o_Page_099.jp2
112c60fbab362d4539fdb6787c79da84
7eca420048063e517ff345449bf35e7cae0febe3
1699 F20110320_AACSDC sosa_o_Page_044.txt
9d50189b3aeffc1896342004851553c3
7139555cff7cd2a202f5326432f5b66c80a3b7b4
12945 F20110320_AACRTV sosa_o_Page_011.pro
c673187d1e642a8b21bb46dca1a5afa3
7504c4d5bb3dca5475b1d23f056aac530cd852f4
5442 F20110320_AACSQO sosa_o_Page_083thm.jpg
4586154263211db21bb05efb4e2ccf5d
1496e6114fac10e6dbe5a45ffb87f8c004c9bbb2
946641 F20110320_AACRGK sosa_o_Page_100.jp2
ef8af91882ec898c8e8591e0312031c1
ef3b4468152ae25754493ddf2357674767682634
1698 F20110320_AACSDD sosa_o_Page_045.txt
b780885f732dc3893f9c30c68b1e4831
7dbf979a2bc19fad56bc0a59bf996dcc6eee33f1
57223 F20110320_AACRTW sosa_o_Page_012.pro
42742bb9e17e89ab60658358dedb39dd
1527adafd45db7ea8e9709a5776afe454ae57576
11920 F20110320_AACSQP sosa_o_Page_123.QC.jpg
1e0802ce5d58444727e30d4191c4ae2a
399c7ac47bc7eb0ff2dd4bdb01d8398f40e300df
674949 F20110320_AACRGL sosa_o_Page_101.jp2
4c1efaa983f38de231682fa874f85cf2
739f5c1594b98c225d61e0048169dae99e986324
F20110320_AACSDE sosa_o_Page_046.txt
8f276bd0812a043c2572c9fc17c095f1
f1cff199c36bac7d9d96591fb48119e3812d0296
67257 F20110320_AACRTX sosa_o_Page_013.pro
c47d46e064f79d221107536e80398e5b
425e70552bc11bd2556d3bfd5e21aaeebc629697
22809 F20110320_AACSQQ sosa_o_Page_051.QC.jpg
e46dd05d60454c73b55d614b929a46fb
b542e0e6e505d3a4e435320f9382628de20d14c8
681878 F20110320_AACRGM sosa_o_Page_102.jp2
e39d9806e36c1db5826147fb0d10477d
831246b5d62f1c5d00e4e27b4d308ae6a87a4c65
1762 F20110320_AACSDF sosa_o_Page_047.txt
3f7defb6bc56a7150c9a00001ffc8547
1163e77857c1c9c5b65a91537352a5728d9f4871
29383 F20110320_AACRTY sosa_o_Page_014.pro
09f738424151ee1729176a63f3290d9b
6e2be5a92b15013fc56c07446d6124fd01a14e11
8010 F20110320_AACSQR sosa_o_Page_122.QC.jpg
f0bc36e1334074ab8e1dd4d055f98e8d
d2b65ec530bea189dbf9cef063205fd81d2a7b22
1051945 F20110320_AACRGN sosa_o_Page_103.jp2
cdc4d20f8582749729170064f0a1f5a9
7607eddebad86a142301adb46f25347ca1dd9625
1625 F20110320_AACSDG sosa_o_Page_048.txt
fb3a6f8c2a63c25aab38b37d19a7ea4a
c14362ca9c3d3c213e75f33340505ffc685b3e15
36912 F20110320_AACRTZ sosa_o_Page_015.pro
6108462a6959d789f2f343cef28803ae
48438c9b202530ff201a298374fcf2f7da71cb94
3452 F20110320_AACTAA sosa_o_Page_204thm.jpg
a420c75a49d51554d5274f11a597eb8f
44843e63d7373d2d9f702839be72b7ec436e1409
2986 F20110320_AACSQS sosa_o_Page_183thm.jpg
bc8e662b32adbc8069897d67569cd4b1
d0148a591cea52d32a43848e16c5342e1211cc72
91342 F20110320_AACRGO sosa_o_Page_104.jp2
6d4349431f021c2f51ae7dc9ccfeecf7
c072f01856415c1ed3825dbdc60d77e8a5db7ba5
1743 F20110320_AACSDH sosa_o_Page_049.txt
8339fb1c01c9208a11e0a4f4294d8798
cafe9e7d3f1215eea9f084bc86f30c5adc57728b
3406 F20110320_AACTAB sosa_o_Page_205thm.jpg
00aca3aab5bb0df84069193d9ee89f7d
6d204154b629d3b3133799e424fa71380f162e90
5453 F20110320_AACSQT sosa_o_Page_085thm.jpg
9014386cca8909e6003e85346e976aa5
8d4da69fcc3f227cccce00694be3925d760ba86d
1033573 F20110320_AACRGP sosa_o_Page_105.jp2
0762cfe492ba1865af4fefda89ff0fef
8e9395c1caedfe1066f3e2f5b010f91b0f6ab1af
1597 F20110320_AACSDI sosa_o_Page_050.txt
424113418c0ddd7d5b5c629639cd406b
00dfef34348e2c295557e9775490686b06afdeac
F20110320_AACTAC sosa_o_Page_207thm.jpg
85efb456673d6c37aadd7380597f9a61
0fd6710b909851088f358425ad880f614870fedf
3185 F20110320_AACSQU sosa_o_Page_137thm.jpg
0c1225fa4d2f08ba1ab514c47cb0d141
57e9611f5a264e82c50569bc9d5592704a97db98
1014933 F20110320_AACRGQ sosa_o_Page_106.jp2
8cc1fb1d7339650c8ed82624d1a086db
ef887da846003bd4bccafee83ce7a07ddc9dac02
1806 F20110320_AACSDJ sosa_o_Page_051.txt
8b72795ac721599e14293387e0a8b39f
5b6de57013433fbaab8ae91a7c5579c955a4d323
3202 F20110320_AACTAD sosa_o_Page_208thm.jpg
dd9cc3e4e06409e1d3ee603c9eacc352
8e07751e01777673b10beb687b7c2499121dc7f8
13694 F20110320_AACSQV sosa_o_Page_176.QC.jpg
c8db377959c3e05594cd7769d349ba08
6f559dcd516f42fc7ff3e7e7435273e43e2e6cf9
982696 F20110320_AACRGR sosa_o_Page_107.jp2
f3478e4a1dc71cb0b8dc6edaa0dad698
d5582d28b0490362be7aec3567c99f7c0395596e
806 F20110320_AACSDK sosa_o_Page_052.txt
016887196fae816339a0e0e1faad78b9
9809f2c41d6ec926c15294eaad76f507f02b8a36
3033 F20110320_AACTAE sosa_o_Page_209thm.jpg
9578ee4209d42ed04df505bec1e30db9
4a1e8eb7c1ae26fba802bfd9c4268589375195c5
13748 F20110320_AACSQW sosa_o_Page_204.QC.jpg
6e7bab79d3be57785bb401c75256abc2
fe570d6f197dfa14fbb27bd80414049c9553b879
840847 F20110320_AACRGS sosa_o_Page_108.jp2
c0fe551650c2c5a7a3c55588515bfc44
d716bb2d6b9755357a0e4667a1c4d2d8328edc3f
1632 F20110320_AACSDL sosa_o_Page_053.txt
35280c7ca855898d599e854298137287
47364ed81c03c66cfe05f57e28b4c9f2c90b851e
3088 F20110320_AACTAF sosa_o_Page_213thm.jpg
fcb5e2d3707b6e834c98d95c892d7b5e
817856fb58b1b132d9ef5f86e0a508eecc45ad39
5676 F20110320_AACSQX sosa_o_Page_074thm.jpg
ec6c20cd236e604b9436b5ff89b38f05
321e83e93c00b0dbdfe21fe38d3c360278e0e24d
832544 F20110320_AACRGT sosa_o_Page_110.jp2
8acafbb222f5dbc475f108b4a7d1f30e
e840c8d4e9120f96a49e7bb2de0b64acab189f09
1892 F20110320_AACSDM sosa_o_Page_054.txt
9bba64fe0b8ebfe5be1bb6f533ede78b
73f99c099b6c6add91eaec302b344b02841a1e57
3272 F20110320_AACTAG sosa_o_Page_216thm.jpg
3cc6c1b2899616faa2de2c5b4c545d4a
1cfdb58f0314ae05df65ed15b36a71c5af1a2fd7
20994 F20110320_AACSQY sosa_o_Page_049.QC.jpg
6df565752a640ded09c7dedb68e21ee4
37f3b23fa90575b14358fe41d5d17b6ced48e240
899262 F20110320_AACRGU sosa_o_Page_111.jp2
4885c20f54f699c76f3fc09882a52ab6
3503a1df95041038c3369c56c3e7ae0298a17d38
1664 F20110320_AACSDN sosa_o_Page_055.txt
379a7c0fd32d05f010d86c8aca169367
eacfe5a627d515323a6aef61ea2d00d8e13eeaf5
3184 F20110320_AACTAH sosa_o_Page_217thm.jpg
cc2e64bcaf2accbcf0f26772f5a0c4f6
9a7cc72660e66799e918af4b309e5a561a11e5d9
4258 F20110320_AACSQZ sosa_o_Page_034thm.jpg
97fac4a26456de34f385ead210f58051
dd0d9c06808cc22284802a3b9521002d1ecc111d
959267 F20110320_AACRGV sosa_o_Page_112.jp2
7c56dc980c71670f20f8bb2200dec77b
4120d759e7e8a2b8a48b32c982ec97fb119ce41e
1778 F20110320_AACSDO sosa_o_Page_056.txt
f133eaffba3575d42b7717fc3ed64652
8b8235a674291ca17885b8c41f4a967ac55f58a6
3206 F20110320_AACTAI sosa_o_Page_219thm.jpg
9299907f3521e4ca48c225a4afcb2ea8
f3fbfc687c670f3dc90578981d6476ef044dd1a7
925982 F20110320_AACRGW sosa_o_Page_113.jp2
90540906eafcd71ec6e4005914194575
b8cce797aa851320e9adabf721d8baaaad5e2957
998 F20110320_AACSDP sosa_o_Page_057.txt
003afb28274860031410c32174643cc3
07539fc3449b5383d7ec35d4dd68319f900e43e5
3410 F20110320_AACTAJ sosa_o_Page_220thm.jpg
a411ead0fae0e8ae2bb43c111c2cc3b9
140acf2f01fa83aba667497b1459def1dd96bf3c
22812 F20110320_AACRGX sosa_o_Page_114.jp2
e9a6f10957dfd24ace05635e8c740859
0bd33654dcce8e83c40102a1456ea1634d88d03a
4959 F20110320_AACRZA sosa_o_Page_154.pro
b9f14f949e5d33fda0080fa59e7cc016
6f9b7bf75bbe8fcdad5992f683e5e068571ed8c5
1998 F20110320_AACSDQ sosa_o_Page_058.txt
2fa4ad763aac785c0f14db021ff24ba6
927589e8e3d72181df537df1836398842e83ddff
84526 F20110320_AACRGY sosa_o_Page_115.jp2
24b538a79c87bf048b750eb7b4c19cc3
619728d34d9736e6a1be3dd187676bc84ebc6566
5142 F20110320_AACRZB sosa_o_Page_155.pro
5997647f21c05ce27ca21a89462f91a7
ee7c7fff3a558ae572c253324825b6f3d2586ecb
1969 F20110320_AACSDR sosa_o_Page_059.txt
b326c98983efbc976ec1b4b7bd745a1b
3ed99b7adfd56187a37eadc769ac273079bf9b89
103758 F20110320_AACRGZ sosa_o_Page_116.jp2
4a5381f84ea3eb985a417b2ab180cae2
a6ac5eb4b95bb13d10b26eba3a33cab104b9b17c
24429 F20110320_AACRZC sosa_o_Page_156.pro
f2164750ed6659521b878ecec2c48a2e
4e02b2c585ba272b0a6f98e78c5dac4117a34473
1239 F20110320_AACSDS sosa_o_Page_060.txt
8cbe39687aaafc3aa3f6edd9020b2f10
d8b9df6ce3b469d2e9e7ff3f489be0175a5cd6d0
F20110320_AACRZD sosa_o_Page_158.pro
a777191b346754a19cddc822ae301411
f0a5f3d6328afdf82db70a5d4fc1108a4e6b28cc
1910 F20110320_AACSDT sosa_o_Page_062.txt
b023d9c87629f865f437ff27bdf7df4f
572eb08777ef053fe241aa290920476e4cadb275
1361 F20110320_AACRZE sosa_o_Page_159.pro
2c96033b2314464fbf153f403066101b
09802ef7828fa8f7c9848f7320bbeaa277a77507
1297 F20110320_AACSDU sosa_o_Page_063.txt
fd0a1c03397c772eee2e404fa5e4d01a
8c02977ea97174b3055798d79e6a6afe3516ff08
F20110320_AACRZF sosa_o_Page_160.pro
e9a96c5bd144c999e602404ce8b6dc12
c219d043cb79d4a0b9e5c33b5f68a5d4a40aa3ac
1944 F20110320_AACSDV sosa_o_Page_064.txt
8a066326a8ba6a5cce7c8fe3c387abb8
322175e683975ae8dd8f98a61e1980d713b6befd
1302 F20110320_AACRZG sosa_o_Page_161.pro
33faf06af85494d0f7a931b950d9079c
3252336310d69cc2bcdad0f511d1f4bdbc867c8c
F20110320_AACSDW sosa_o_Page_065.txt
a43dfca19bb2957f0142ffe8f6020ba8
3fd06caf886fcfceb5f8945169e63a9df67f41bb
7018 F20110320_AACSWA sosa_o_Page_222.QC.jpg
13c6c422878d3167464007c0d12e5f24
e50114bfff9909a000af89e1c8eaf55d4f986e17
1829 F20110320_AACRZH sosa_o_Page_162.pro
bbcb5b99b5b949f42b6235b330edd811
9fd6eb5e43f4d4ff21a5d216a8e1f094954d45a2
2177 F20110320_AACSDX sosa_o_Page_066.txt
79068afe7534694ef9d8a2b53fcbd686
2dbc7d4e69e95dc5a19dbbd3666b67b51ac030cc
11621 F20110320_AACSWB sosa_o_Page_224.QC.jpg
1cca72bd526d996eddb20a2beb71f599
765c986bb9ff1b7860b30d9673ba248bd7094734
3959 F20110320_AACRZI sosa_o_Page_164.pro
e751e8f697d1beceffd8e909a94d708d
7e45275ad373b99bf950ec63de7fabd0bd1f46e2
1397 F20110320_AACSDY sosa_o_Page_067.txt
52bba969c6c7f8f4950a24b0a06d4854
169da12ada0afadb9a8cc42855708fad91fe6fca
4616 F20110320_AACSWC sosa_o_Page_005thm.jpg
309973d4db7db0f2931ca3850dcde037
05f928a2f529d24fddd90da0dd20f0d5a4b494df
41466 F20110320_AACRZJ sosa_o_Page_166.pro
c8d7d7281ce646b3214be8267996ea36
2b017b308d546abc7ab6ef7616acb79a9ba12110
F20110320_AACSWD sosa_o_Page_007thm.jpg
4ffdd4482687d80a9f4d9435eb3c406a
9364b9b9c81f2474e7162f5f2ced401e4049d232
3074 F20110320_AACRZK sosa_o_Page_167.pro
401aba83e3551bc9094d54e5c1fd4fe4
19ebb2c4389771d6a5f018f9106646115006d773
1692 F20110320_AACSDZ sosa_o_Page_068.txt
2dbb9dda85979ffa684550a630c58e1f
d4925e01de3572b7b8be3297fadfb965c01ae57f
2550 F20110320_AACSWE sosa_o_Page_009thm.jpg
f231458f7e75a7912c0676dd80e4850f
a97564b27d073a526c68e0b309813a3583c5bacc
F20110320_AACRMA sosa_o_Page_025.tif
74e3eb292262444f4c65b7bbb7175a86
264120fd7c4c9c665f25720b9c29d88cc8c04f71
2454 F20110320_AACRZL sosa_o_Page_168.pro
7d53a653bcf4844a2cb3db4b3ed0964e
3092f12c3524f2797fa9e024ec258f504bcf7841
5285 F20110320_AACSWF sosa_o_Page_010thm.jpg
6ebca0282319a4fbf137aaf20afce291
c1b4e032b6753998d53f2f8c97aa89c4d9191ed0
F20110320_AACRMB sosa_o_Page_026.tif
3ec6147514d7a616565e5492d036b71f
d689e05294a12f1e12e5addbfe10d376f5bd7b3e
6459 F20110320_AACRZM sosa_o_Page_169.pro
99935d367d836c3492629073b28b33dc
75bd9da1009e56fc1e5a2f37f6966271eb55cf1b
2374 F20110320_AACSWG sosa_o_Page_011thm.jpg
0aa75916708ae4283f1242af12574310
72bdf1fab7fb7c2abf874ca940dd5d4676265909
F20110320_AACRMC sosa_o_Page_027.tif
73012e46fea0485301f8705b1cae823a
5418768359f08d70bb378a0801606dd3ed8bbd2b
1839 F20110320_AACRZN sosa_o_Page_171.pro
efd869a7b20a94553f8f76c6b1384867
74744a737689dd76376a4e104dbb30cfa2d6511b
6470 F20110320_AACSWH sosa_o_Page_013thm.jpg
fc6459f23b2c8349a385d065dfd2b728
39be3282119f873c4664bc44eb1df6e88aa384d4
1847 F20110320_AACRZO sosa_o_Page_172.pro
ace2e23d75e722c8de2f253d98b829ca
c0f7a0b48631599008ccc5233ef61a34369c1a70
4198 F20110320_AACSWI sosa_o_Page_014thm.jpg
7dbbd74e63ddb3506b815c79a9e501e3
cd391d6f5207cc07b5bbf7f36cf5f62fa8717268
F20110320_AACRMD sosa_o_Page_028.tif
1afc6ca07ae491ff739109a06879efe8
f4fe1113550a45ce040b811728a5cb7b0ead2b1b
1575 F20110320_AACRZP sosa_o_Page_173.pro
b19d073509db1ecae2d2a655b6cff8b4
efa112c4e540322920dc84dca785e38d686b4c20
5781 F20110320_AACSWJ sosa_o_Page_017thm.jpg
4800033ef19e0ed4e12af38c06d795ee
f16c093e1e759fe23f6e0c8c7d37acc4a680f2b2
F20110320_AACRME sosa_o_Page_029.tif
3a256c768988361c3371997b7b7d35eb
a593a2f39885935194cb798d472f2d2c4ca1ce90
5806 F20110320_AACSWK sosa_o_Page_018thm.jpg
e181398936761ac565c17dc6e6086391
773b8fdbcd43564533cb579ba9d4f253b9f505cf
F20110320_AACRMF sosa_o_Page_030.tif
532c9c4b6fd23ccc54a3d00b1d7ffe71
ab9dcfe7c0c568921797a7f6acfeca93e8db1e4d
17771 F20110320_AACRZQ sosa_o_Page_174.pro
b8212b3d987c2de24f6d63366a5fd678
2cb99a59d07cfc73f217c6f1a191a539977ace89
6273 F20110320_AACSWL sosa_o_Page_019thm.jpg
2f0c2515e7791c424277f8a89185fc70
b6fde08e09fe6fbccdbc19c5693a383a26f6391f
F20110320_AACRMG sosa_o_Page_032.tif
a505c0e27da40da67cc020737443403d
8660d48453d043b986aa99713603afa4cdddf14d
42073 F20110320_AACRZR sosa_o_Page_175.pro
abce8a2dfebd30bbb0b413ab421222cc
6a92fd7fe902e0bad52d9b78ecedfa48932b0a13
F20110320_AACRMH sosa_o_Page_033.tif
057f3d1bb39000420987433b8659afb4
0bfd88c7eba144590107e93f419c04ed4e0546e0
303 F20110320_AACSJA sosa_o_Page_207.txt
8c4beb5b990a102c42505da94a144228
064f486e6fbf6a67a9c9064b5d5f422cbe97705f
1723 F20110320_AACRZS sosa_o_Page_176.pro
6342b07eb8d2b742cd2ae405f6c50ba0
008d2c0870de17f3858998400cbbc12c2557a9d0
5235 F20110320_AACSWM sosa_o_Page_023thm.jpg
c5a3b1536034f2c6c04d84702911659b
ca44096148ad196c1bd851ca472429202b5127fa
F20110320_AACRMI sosa_o_Page_034.tif
c7514fcd5f7e5efa33ac02db54d6f41e
d9b03465c2a203df6e9f377f50b9fa726b750966
2276 F20110320_AACSJB sosa_o_Page_208.txt
3b09e7df7f5ec8ec24eecb57c8501796
0c1ec267b051de3f3a4837c0e5fbfd60e72f970d
666 F20110320_AACRZT sosa_o_Page_177.pro
439521a3ca28dc94a172812c8055cc55
90b4d0e02acca688aa7a5ad395fea44df57262ad
5260 F20110320_AACSWN sosa_o_Page_024thm.jpg
b9b7382dd4578aa51c99dbf72db90657
6ae3428c2e656aa6430f901178667fe17b491f64
F20110320_AACRMJ sosa_o_Page_035.tif
44395dd9fc8484732d5d79e1bffc8914
1cc5f501e00e31fd117d8a73aabe83d8a229fafa
1815 F20110320_AACSJC sosa_o_Page_209.txt
11f8cc62965f0d4d02b325ea076af87b
82418046096f6b03a9a6602ead7ab288155a9576
2421 F20110320_AACRZU sosa_o_Page_179.pro
23c1fe1fd216547a2a4242ad72d18f4f
c19511baf49b77b32d9e384b9c0eb3d32fbafb5e
5353 F20110320_AACSWO sosa_o_Page_029thm.jpg
0536e839db256b4f08af2ca41e581df2
81ada21e44b23a5ffec8fafa02845dc4e5321847
F20110320_AACRMK sosa_o_Page_036.tif
8e6d2b076d3fb3b67793e6df2920bb69
23984c4440d5b7a19e5a99a03453e5a1a76155c1
2387 F20110320_AACSJD sosa_o_Page_210.txt
e5bb9e4c7cc8f1a93e763a6b6f293029
32cffdae9d05743776556099628cfb372de95234
1465 F20110320_AACRZV sosa_o_Page_180.pro
b6a7ea033ae9080f55befecb2d6bb6f3
fb252bfe9bec7949af23fa53aca3a2f6ab277176
4598 F20110320_AACSWP sosa_o_Page_031thm.jpg
49a3a76b1a7b59d2250eebadd972c71d
da2b871c7a4baf0efea802eec4271be3f4417856
F20110320_AACRML sosa_o_Page_038.tif
3da735ad32591061c5a3a69f415d8daf
e4855ec99736060831d85589602e1426bd0e7a8f
62 F20110320_AACSJE sosa_o_Page_211.txt
fa6760def4e5afa5201c166e5a718c2a
cbd898f045e03bc62f88a34b13df406969005e35
F20110320_AACRZW sosa_o_Page_181.pro
d0387bd5dd362a3c7ef8bd3c24b16648
76c057edd608775a6a6369e5ce06b16e4529f02b
4989 F20110320_AACSWQ sosa_o_Page_032thm.jpg
6a306a6a8c51c042962557e888fd804b
9f5350f285a4cc20268d543c81ef1a7f04af8a34
F20110320_AACRMM sosa_o_Page_039.tif
9e69a5b0878ea6cab2348f0cf0aed3c7
c4977fecf24ea2b9508f26b30ac121494d2744ab
1358 F20110320_AACSJF sosa_o_Page_212.txt
a7b5596ea13d1350bb8a3c60ce1f8878
46dc27535a99e979bc6d12bc9d19c889d6a970ce
50750 F20110320_AACRZX sosa_o_Page_182.pro
d96ca784cac7556085ec60504087396b
82835fb5d736612d6d313c9ad30cb7c873b548ee
4661 F20110320_AACSWR sosa_o_Page_037thm.jpg
351cb9d7893e9422a32e54a63c0a24bd
19d8bc4ebf6d23aa065083ebbfed08f240dfee6f
F20110320_AACRMN sosa_o_Page_040.tif
2fa047f7b6f769b03b16d9b1d225f558
7a26ab0e1de300f87f5adf670311176048036430
744 F20110320_AACSJG sosa_o_Page_214.txt
7f9618752b7f3bf59948a0d124569b5c
dd063a748a23cf413b81427de9426722a9396dc7
1877 F20110320_AACRZY sosa_o_Page_183.pro
ebc3b8f718cff00cde322a5828654e8b
b13a86fc3b5a89bf52e44f2476e986bfb5f5f84d
5655 F20110320_AACSWS sosa_o_Page_040thm.jpg
f954a6db09cf0b18d460ac9dcc2bd965
ed516461950756566dfb6b53d9cd64ca53c24fb1
F20110320_AACRMO sosa_o_Page_041.tif
6bfea7bc6fc94e24d86527c804b6b8b0
34be801832b7604f59ac353d417291be3ef95864
211 F20110320_AACSJH sosa_o_Page_215.txt
a3bcaa40c5062183aa99d5cad06ecd04
1ad7b933a3e6282bdb2bd08472a0082f579baaec
52245 F20110320_AACRZZ sosa_o_Page_184.pro
ff62b174089439b8cf792d96fef89a9a
605fdeb2e4af82782c8462f2efa304630767295a
6127 F20110320_AACSWT sosa_o_Page_041thm.jpg
4ae44c31d3829b7ae9763109448e5037
42720199296b290299569dc299d8afd50bac8283
F20110320_AACRMP sosa_o_Page_042.tif
36ac879fed4010dc0ff4f1147a3bd268
87782b398d7c04db969bd482dcb53ae475290be5
1965 F20110320_AACSJI sosa_o_Page_216.txt
ed44666f4a8634534b4e7e9f50ab2775
eba649bcd1e49a6589561c076000e6c1c1d9defc
6062 F20110320_AACSWU sosa_o_Page_042thm.jpg
f8257d002600efd2bc6d841c2e5b3e17
de5e8f89345ebb295058a38909d6704d91e18873
F20110320_AACRMQ sosa_o_Page_043.tif
1850deeffe02a2def5be453f53afdca2
c47c83a153f6dccf62f76cbb6f97cc85db1b8b92
239 F20110320_AACSJJ sosa_o_Page_217.txt
0f065e3d66a0763b85f43bb918fb2d93
d9162d46938bae5327a919dcd0c0b2a04804fc7f
2325 F20110320_AACSWV sosa_o_Page_043thm.jpg
e8f1024516f25ba45e0050f38fb38e02
55b086205a0ed23c77a617ed988b4e587ad52769
F20110320_AACRMR sosa_o_Page_044.tif
c57420edb2644d76df44adfa5711d6c8
4ce64b7809daa254934da9eaf9d99f061df8949a
2181 F20110320_AACSJK sosa_o_Page_218.txt
a430204708c956c232631ad7a4e8fd7a
c7242a9688db33ec349baf8891203894cf459ccd
5705 F20110320_AACSWW sosa_o_Page_044thm.jpg
3a4270460dd62d78e974a69183b99c70
57ab0a8355d5a278a1a57ec0bb81a38ed3fbf126
F20110320_AACRMS sosa_o_Page_045.tif
61f1d20f094baec6d8bb47462d9881b7
15d03860b0cbf09d910df3ea1a0a1acc69fadaa6
F20110320_AACSJL sosa_o_Page_219.txt
678eda0bb766959585b315e38e7fa44b
0eacafddba70260e2923408e7c2bb4d98af9d592
6060 F20110320_AACSWX sosa_o_Page_048thm.jpg
b9e89671cb32fe6422096cc8e8f30e81
ae9e4890f83d125a5bea453b8293fbd2d3238487
F20110320_AACRMT sosa_o_Page_046.tif
0a06e2dda56cb37efa6bf8eaba8ebd28
a993e430a312c0ac9e42b8d2c89da1c0835892f4
F20110320_AACSJM sosa_o_Page_220.txt
b3744e3b1732f4ddf79c116bd65bd48f
5ce59d7195ae608f93d8f6ca50600cbbfe409b8e
5756 F20110320_AACSWY sosa_o_Page_049thm.jpg
b8c581235300fc8956bda223a47253d3
29ae3d35b7ebb74d8a7059ff2b985e2f66b16be4
F20110320_AACRMU sosa_o_Page_047.tif
230524269c1e3df6008c49b5c8646035
e5ed930d1d3e427145f700ef48898919ee9026d4
2130 F20110320_AACSJN sosa_o_Page_221.txt
20c607a6549441d1186b99ecefa4602f
bb2837cb826b88352e88034fb48aa1de11b6bfe1
5771 F20110320_AACSWZ sosa_o_Page_050thm.jpg
6df5f30efab83f21f179fb6729009f5e
a029f2ce6da0661d52622d2d7537d76c979b1de6
F20110320_AACRMV sosa_o_Page_048.tif
dd2a62ad9cb35163964c56d2c41647b3
134f88cf779c913626c7f7c8312263658458f840
149 F20110320_AACSJO sosa_o_Page_222.txt
4015171338ca40b1b27bad7408fc9b66
6f29df524f335a92caa6a0b123f005481835334e
F20110320_AACRMW sosa_o_Page_049.tif
12c2c1f1fb149ddf38e635fb09d0900c
392d29bdc0ed9fca594ffdb15067e5c936628c70
2059 F20110320_AACSJP sosa_o_Page_223.txt
15d05ae20e2b93795752dcb43a1f43c3
d6aa2235e7ab793901faa6836215ad564d04e68e
F20110320_AACRMX sosa_o_Page_050.tif
c406b675ea0dacd2342a147823030d17
b94812d9e9b81d41ac0677386fbf0dc40c78fe98
870 F20110320_AACSJQ sosa_o_Page_224.txt
edc2ca5c5868cdc662cd9f0a4676736b
51f6c4092859d4c60907d503208f71a77613590d
F20110320_AACRMY sosa_o_Page_051.tif
a8e614affd8cc483c5a0fe5e9ef1caaf
d7c5bfe755cdce5d25427fe227277e1d12bf435f
F20110320_AACSJR sosa_o_Page_225.txt
d33f2b79308aa6b64208654e9ba5068b
72de78f6d3a4f4acd203ff8ab58e3267a9a9e858
F20110320_AACRMZ sosa_o_Page_052.tif
7edd6ce446647f1bd91616e1afa6f788
4f0157b34bc44a61abf46bf264ab1baa094aa1e5
3269400 F20110320_AACSJS sosa_o.pdf
f4e8e75f57183e3eef4b6a9dc213580f
eac89e8662fb7b231e0a2e16d17f737e0b0ad111
10404 F20110320_AACSJT sosa_o_Page_225.QC.jpg
0860b5da990108f98d122b8607603b3f
bf31a3b0353882867bcca63d5e081ef6d75eb220
3257 F20110320_AACSJU sosa_o_Page_185thm.jpg
e5ea59e7cd217beed1ef1e4a9bef49e7
9192e49609150fb4f573f797c8c55e4d1dd95a5e
64381 F20110320_AACQVA sosa_o_Page_012.jpg
73a61ec11c14e7f907b3e59ec94399bc
0126f995de8719ac2da568f21f9625c150f43d03
12268 F20110320_AACSJV sosa_o_Page_208.QC.jpg
0da78982d9437034f032a774112811ae
5dc2f82d62978a8a1c98f6b41f90895fb8e0a801
77978 F20110320_AACQVB sosa_o_Page_013.jpg
335ad33781a3803627c6c3976b8e2365
ab335993a73389f23639d46726a19d25c0883e42
13467 F20110320_AACSJW sosa_o_Page_151.QC.jpg
37d831efcf42b6d930018d08b7116f17
bfe4010f52e0bf78660977dd627d881af3a667df
46679 F20110320_AACQVC sosa_o_Page_014.jpg
35430072044f6a1dc4068bf37eeb6aa0
c5c9715799efb3c9d23f8430a0eb10a0e6fcc863
4836 F20110320_AACSJX sosa_o_Page_078thm.jpg
7eaa2aea42683939168c384870182c47
d317c6b1f1ed47388f99e0550d3b29f6d7253a22
58107 F20110320_AACQVD sosa_o_Page_015.jpg
91e65454211e421f6a054ba3ada93d04
b0833ea2557ad658090cc88660e9cb59fd1d1626
12780 F20110320_AACSJY sosa_o_Page_184.QC.jpg
3bcdae363897f6175da1b5395dfdbbcd
b4bc0c8873249bad0bca7350642d3b655a2c6f8b
24301 F20110320_AACQVE sosa_o_Page_016.jpg
22b522ba658cbfb7ccd189bb7e971517
fa8ae2c08ad5ae0dc21bbeadab3ddc5c23a44fae
13709 F20110320_AACSJZ sosa_o_Page_080.QC.jpg
50c9459cd0dbf30be739f58f9b1b3f54
c71edbcf52fa2686754dfdf375eaa3a60ac8761e
73788 F20110320_AACQVF sosa_o_Page_018.jpg
717b2a49fdd772ccfcf118a98ed88713
f3d4b96ddaaacfdd2e05340da706e037673d0a4d
69600 F20110320_AACQVG sosa_o_Page_019.jpg
49acb39c7b2ddbc682fdedade55dd12c
ec42488e7ff17cb89da5ad089aab3e7a12042dac
F20110320_AACRSA sosa_o_Page_189.tif
423335c47d137b31ffa8fd6d18f3c8e8
3179cb19152f151ee6d064a59048e536f3b589ab
71862 F20110320_AACQVH sosa_o_Page_020.jpg
e20c86bdb67079ea33c5324d11e9f8dd
c6da7995ddd749308032c010f70fcfd426aa6b84
F20110320_AACRSB sosa_o_Page_190.tif
a15ec42b837b2eca069c74757365fab2
d9b57038e5584ddd087d5e58c1394c30e2eff007
76763 F20110320_AACQVI sosa_o_Page_021.jpg
fa4a0dc4515f018aa6dd757cc931d4d7
487a201316f81b5371c2b5867549b30b2adc4801
F20110320_AACRSC sosa_o_Page_191.tif
4bb3f3f48379043034895e58045a83ac
18384b4b26b52c1abe68d4d9c8e5d198a29d6ed6
40600 F20110320_AACQVJ sosa_o_Page_022.jpg
0190a507a42c97cd41a8f75d58ffba0f
c1f73a4a13a8030a9c4834c90338ca6d2eb498a2
F20110320_AACRSD sosa_o_Page_192.tif
c8571b61f063617fe50ac71dc4997631
bddaf44b33e428c17c975322dc40386382921429
54185 F20110320_AACQVK sosa_o_Page_023.jpg
e986c81f4889d91bd815314c2a43232c
36d35ee1047c8a60737f1f86eba5cd9c810a7543
F20110320_AACRSE sosa_o_Page_193.tif
b817aa35d11a9939177057233d65801e
9e8e88d138739d62aa5a01f43ec1269bbe713a4b
52047 F20110320_AACQVL sosa_o_Page_024.jpg
b8eea354ef44df5ebaf6dce519038303
ca3e03dece8e0d2d224c00bc0f765277b6b2f4c6
F20110320_AACRSF sosa_o_Page_194.tif
17c670e761b726d318afc6c36b2db071
a6a4260f8815faf6da979c7f0405fca028051fff
54613 F20110320_AACQVM sosa_o_Page_025.jpg
17715de2fd77a53238f0dc9991a329fe
cc104aa76c100781807383940f693b253f4337f2
F20110320_AACRSG sosa_o_Page_195.tif
18734c4e83135dfcfed4470099401baa
3e681e64ca08232c014728e09b85ee257b48ddda
F20110320_AACRSH sosa_o_Page_196.tif
0313103a6b77896d5b85b4aef534952f
bd61577149c85a64a89d541917cfe1f3918aac04
22236 F20110320_AACSPA sosa_o_Page_109.QC.jpg
4d8a80190c918e00f88574c7566b7d5c
a38f2aa124ba7432003058007ac12c8137d15534
63909 F20110320_AACQVN sosa_o_Page_026.jpg
0704c1a5c52c937c095e386b49c773ac
5526ca1d819c40390608d872e14b7400259fdc99
F20110320_AACRSI sosa_o_Page_197.tif
09277ea3caeffef47f738608586ee8d8
5b57b53f7cc1d32979cf63656cdf43562145c534
8457 F20110320_AACSPB sosa_o_Page_197.QC.jpg
6d5d849ed17d9faf3508d6ca8aa681bb
73c8c180a56424244deb00edce269aafda83e4c8
96250 F20110320_AACQVO sosa_o_Page_027.jpg
e6387967e138d13e8c147807860320b8
4c0ecf9d79b6fe429c026b3908115d47ca381d19
5057 F20110320_AACSPC sosa_o_Page_058thm.jpg
0191da41df1c36ea3ffc4c48c83788ed
0b9241765f2ca251ac01735a6739e850d546f369
53123 F20110320_AACQVP sosa_o_Page_029.jpg
b8d410c5ed0b3fe53c35649ff1f89bf0
7485808b75562f8d22d1625d9cbdb9b4778960d0
F20110320_AACRSJ sosa_o_Page_198.tif
ef47c901d918addd19147f906f163bbb
ef702160d598738c01393a8dffebb7c2e381da7b
5207 F20110320_AACSPD sosa_o_Page_081thm.jpg
fdfa38d0f6bb58ee74b64880f290b07a
08c0009fc81984f94cde404de30b8c6135817df5
58019 F20110320_AACQVQ sosa_o_Page_030.jpg
c0c7329e34d5c3fae3ce24468b862a4b
2515c49ee64e6d36e91d2ae4941905c8e87bd8fb
F20110320_AACRSK sosa_o_Page_199.tif
89fcaa857cd3cc81b5327406510fc6bd
bcc93a1f3be2ba3f94ec6a4e8a9fbcb297e26d28
5080 F20110320_AACSPE sosa_o_Page_004thm.jpg
4590f8a80493c2780bcce4cbd83b68a6
08c2f0370c9e4a0ce7319030c291d0cb931b8772
43773 F20110320_AACQVR sosa_o_Page_031.jpg
251faf6e93b4160e95502f2b7ced6d18
c039f02c11a7ab944278913d0d29bfbf859e5ed9
F20110320_AACRSL sosa_o_Page_200.tif
e2db81f62c3699dd8af6d1554f77ec3d
a677ac053d3e310c9ccdb101549b2be3b6368be2
71481 F20110320_AACRFA sosa_o_Page_063.jp2
27bb909b072eb1028e0458bb4a2924a1
ac66f288121b4b8686e7f40e8d0853fbff30bd7d
47870 F20110320_AACQVS sosa_o_Page_032.jpg
d1e7135f6c2750633d9d9150305e645b
9ed9b4f3b91539f3266315a44cccd47611f4b37c
F20110320_AACRSM sosa_o_Page_201.tif
251bbee27f3651e3739596438292ba62
9e199a96ff737864fbe2980448a763a097a4e577
11883 F20110320_AACSPF sosa_o_Page_155.QC.jpg
55c25172681365a402354e3dc8f1b981
61c792376b04467a9d54c0fe2f196532cd57aa07
736208 F20110320_AACRFB sosa_o_Page_064.jp2
2859fb969ab82be8bc1160a2f4664894
42cc75809dba7e32e570638e915a96c1e66de335
57328 F20110320_AACQVT sosa_o_Page_033.jpg
000901046d2479652355f2916255f407
9506f3e9e136d76424423f2327eb711c922f69dd
F20110320_AACRSN sosa_o_Page_202.tif
1cdcfc0191a83419dff5908de316a402
0e3ab05edccae521b8f21958f0f6952f7d00e19b
3058 F20110320_AACSPG sosa_o_Page_202thm.jpg
18817c7a93e89a88a2759a9ab5e18d71
2eca1f7213010d8cc86ee1236ae76fd20f75dbca
81060 F20110320_AACRFC sosa_o_Page_065.jp2
50401c8f16a6217292243784f112f05f
18c13abf3b8b0454a796196152ec874e74255a21
40149 F20110320_AACQVU sosa_o_Page_034.jpg
9d99c0f614c807af5f6371279d6f880b
97d9d5dfe6c227e810d4d5b1495386bf5ede55d2
F20110320_AACRSO sosa_o_Page_203.tif
9e2a70507b5aec28d90eae57edb2ab62
0c5da4e3607accf1f95beab72e65cd356b4a401c
18231 F20110320_AACSPH sosa_o_Page_046.QC.jpg
2140edbc0fa2653981051ca261529dac
8b1b9429ff04b9085daceb2b14c50bd0bd388c37
87313 F20110320_AACRFD sosa_o_Page_066.jp2
48f791cd76eefbcfdf32625aaa947cf9
acd8df368f7df70e786e2cdfc4c930bb5bd11913
53981 F20110320_AACQVV sosa_o_Page_035.jpg
b332f193be4627f06ae06363bb84484b
af3e940300fc8d158dd23110f86f0013a511ce3f
F20110320_AACRSP sosa_o_Page_204.tif
b820acf719e48b5f3fec05f2b9e7ab38
a93a4de58a70be0b44555259bbcc4aee0375404d
20683 F20110320_AACSPI sosa_o_Page_048.QC.jpg
d2e411b5e1fa2bd316d845c8b2edf86c
43bc3fafce2862430d256768f0237dcb314c16d0
749281 F20110320_AACRFE sosa_o_Page_067.jp2
419584edbca193d416f458c4a1cc4875
be41b76a527da2ddc67ecee12d18837bbf397099
48140 F20110320_AACQVW sosa_o_Page_036.jpg
7df55623a0bdf072f1f49191e9c8bfda
d6eda17cc45f895ebc233e77a109b42f6ba1c718
F20110320_AACRSQ sosa_o_Page_205.tif
79c1fa27f6a3316617bbfc0adc6c30f9
0d2462b922c3cfeb74de001148d09d822c8854fb
6835 F20110320_AACSPJ sosa_o_Page_001.QC.jpg
3bbbe3e06e28ab8e1fd5706e1529dc19
23fd857ddfd5154132bfd439a92437dadedb6e97
786795 F20110320_AACRFF sosa_o_Page_068.jp2
a4994990ecf033c08ee5c18b1ddf7ca5
a2d3382db095961dfe3c73e32110700c1fb9ec60
40543 F20110320_AACQVX sosa_o_Page_038.jpg
317a403b169eebf80943dbb0fc2ccbb5
f29c1c9256faef31edc04469c7af200418b2251a
F20110320_AACRSR sosa_o_Page_206.tif
a01243f9a567b2ac5434f1c0edb6ded4
20feb095886e836b238e022ccf200e433b68fa28
10831 F20110320_AACSPK sosa_o_Page_170.QC.jpg
48ea837198372de49975baf7f96200f5
141c64f796af1510a643c1935b529c6385766432
773084 F20110320_AACRFG sosa_o_Page_069.jp2
e5ecb28c0a5a994d9faea440b7e16439
ed47f237100ff81a1ef999ca133b7533cd773762
57318 F20110320_AACQVY sosa_o_Page_040.jpg
3984b7e13046aa4778084f896d14ce9e
d04cb30a6568c83ab1466927c2a90fc103aa7eac
F20110320_AACRSS sosa_o_Page_207.tif
c1bc2e21a4bf25d134da5c6829dd14fd
2880ed188459a95150bae47a1fefc03f4f2aa921
5329 F20110320_AACSPL sosa_o_Page_099thm.jpg
dae3600516c84eba49aa7e774b266bcf
33c20f6a64befb05db2099ad7419e6fd9db9393f
93245 F20110320_AACRFH sosa_o_Page_070.jp2
8009381ac99f426862b097caf47b53a8
062da12539fbc12216bb78574572ad0b88ca8124
56913 F20110320_AACQVZ sosa_o_Page_041.jpg
0f8a8f1d2ea1379fde38462073851a96
77f653b776f473fddabc3178fdef3a6409dfbb24
F20110320_AACSCA sosa_o_Page_015.txt
187703d030979418dfb6f67998f68376
bee0a5d844ea96d8fe5a780b018288feb633be08
F20110320_AACRST sosa_o_Page_208.tif
2b20588521f4f18c4fb04e2bff5d39a5
7ee749b0aa0b03547282710a9da5d4954df4ef9f
6393 F20110320_AACSPM sosa_o_Page_107thm.jpg
0f3c870c57f27101a1ceccd144fe3745
2cfcacd6a88bc634360bd3150a9866c568188163
75572 F20110320_AACRFI sosa_o_Page_071.jp2
9f62a5bb0f0ee1094b6e8a7e82dcc525
7216861de31162461e9f78fe6387ef25ad20273f
506 F20110320_AACSCB sosa_o_Page_016.txt
59a3fd0351b6791e50d4660a5fa21fe3
8197cbc74023dd5a5e8672e8e1aaac1d21b62f72
F20110320_AACRSU sosa_o_Page_209.tif
2d6941ec1288eda27ae69ce6cb044430
5df5572405b256b80a0e28ea56bb0c6bc40b52ec
17528 F20110320_AACSPN sosa_o_Page_086.QC.jpg
f815fd844d0647ee0a5582bf5c44d258
505df3ee6931040966e851167ac66a3ccc19ccee
719527 F20110320_AACRFJ sosa_o_Page_072.jp2
b0fe96b21fdb0cfcdd9161461e0509b6
ceb69440046b2871ef24e528b73b6013f06cef40
1832 F20110320_AACSCC sosa_o_Page_017.txt
81f600b550622bd397810b4bf4bb6570
c7019df2d416b122c8f39ca939524a95b37fd2d5
F20110320_AACRSV sosa_o_Page_210.tif
d41918af8f31822585f343f7c38acf47
5bffc6e10dfbadfb9111a196d93ef62efee405f2
3418 F20110320_AACSPO sosa_o_Page_180thm.jpg
77c199b019c17ca8b1639c7be9b35d2e
f86791cca5f5af9e8201e5f5a2f41efc354ce827
996037 F20110320_AACRFK sosa_o_Page_073.jp2
b4077e45993aba50467b9e8599f597cb
25653542e8b71b9ace01920733b1063a19c4808a
2219 F20110320_AACSCD sosa_o_Page_018.txt
632e260b5c622bc3d066151a35516905
526aaa86fe364b3fc4c18c6e0d9dd185fb909011
F20110320_AACRSW sosa_o_Page_211.tif
1327c16e7e15736265e1776c9d771373
197a92100e3839abcaa29d9c5ba993190a4186dc
6862 F20110320_AACSPP sosa_o_Page_096thm.jpg
9244e2495d329dfebdd6e41cbb42b326
a4693306b6dd9f707f08ce7fd652fe8667637ed4
84266 F20110320_AACRFL sosa_o_Page_074.jp2
56136ce2e8f0b0d9b6f131dfa1ff6fea
fa782e6d9255eb260f5cecec0e2cfa7fa1f8249a
1921 F20110320_AACSCE sosa_o_Page_019.txt
6bc6b7d1c3998950bcd424ea445b1041
47107aaff13644232c8caf62972cdbc51a1f782e
F20110320_AACRSX sosa_o_Page_212.tif
e18228ca383a692efe25b82452d00c39
f4ba55d7b13546d3819897328c8092d19f0b4d04
5030 F20110320_AACSPQ sosa_o_Page_064thm.jpg
20718709d5509ffa8cab610d67b2f688
8ef10c78177e09dc222864236019048aabfa67eb
98785 F20110320_AACRFM sosa_o_Page_075.jp2
b710e854223569db35ee072963e33094
7b90b439e421db90c17dccbd239079e49f2de0da
1947 F20110320_AACSCF sosa_o_Page_020.txt
c2f78c598857b6e2a44e318548225cbe
8fb66859a2444f75acdb3a614515fecb315a7100
F20110320_AACRSY sosa_o_Page_213.tif
901a0ffc580302e829e8c5b7559f44ce
f25bc2bd4ddf04c66d4ebab6b4e3d82110b4d4f6
12399 F20110320_AACSPR sosa_o_Page_220.QC.jpg
ea266e53143d4446c79e09f9a442160d
9047a0221576c98847e1dcc2177e06cdc8656f88
62887 F20110320_AACRFN sosa_o_Page_076.jp2
e8718398b920ff86a7125da86d576d81
40a6d4deaaf2281240de3b164890ad1259d0412d
2272 F20110320_AACSCG sosa_o_Page_021.txt
22b3bfb157cc53783c36d678144ec553
10b8cd1556168ac36a1872448a522b33125c5db2
F20110320_AACRSZ sosa_o_Page_214.tif
b1f6e54485900c3738fcc7a59ad0af62
caef0a3db1f0000cde509555b2c36768bb23d4bb
10986 F20110320_AACSPS sosa_o_Page_166.QC.jpg
af7ebd0551adb26255fb52505a9dd036
d951310177d269de718266dfae6316422c0beb43
873490 F20110320_AACRFO sosa_o_Page_077.jp2
5ff19602c167e2aac85e41eae867ef85
a7e217c9c0166da6072ebbeeb1e49f054da53b7a
1638 F20110320_AACSCH sosa_o_Page_023.txt
c3d5689192884e3f3e9a6211a2abd4b1
31e27b676d7b60b2fd0ae787b8590a4c0f5f5117
3431 F20110320_AACSPT sosa_o_Page_206thm.jpg
c484f97786de14541e3e05f59e16fe23
0f88c0942d348df7590660ce3bb73b073ec7a896
795366 F20110320_AACRFP sosa_o_Page_078.jp2
95abc6797bb7594cf0e42e5a411f92db
9f21dd4f322a606a94bd49c4673995be073c5f77
588 F20110320_AACSCI sosa_o_Page_024.txt
2ef98e656b6121119605ced2e95a3b88
7222706c9876464f94601ce2f84b38c5ea6cdcdb
23137 F20110320_AACSPU sosa_o_Page_013.QC.jpg
1e22d1293008de5a811be89e26ca811f
f79d5214300e09c8fddba9979a5e9f3c33f6fcf8
70432 F20110320_AACRFQ sosa_o_Page_079.jp2
b080ec048a31abf6f981b37754f5060d
2f7909e60a51a8bb03da26b40365f0fe48709284
1833 F20110320_AACSCJ sosa_o_Page_025.txt
52104dd2fbb316cae8fba9895359381f
54a970c674d47a4db8cb767f91361b6d36f279b8
3254 F20110320_AACSPV sosa_o_Page_187thm.jpg
1a222328d5e2aafb38ab40e4579bdf60
49355d8abf9eea8da92187ce8731c4ed0d06958e
57308 F20110320_AACRFR sosa_o_Page_080.jp2
2475a8ab7097fd67ec882224e9b9afd7
11cdb78d09d0d6033e96b4de6fac315b647e6152
1855 F20110320_AACSCK sosa_o_Page_026.txt
8c2207ccade79b5d1ffd528d27e365f8
11bf50f73d8b962c137d1dd7532d324e5922b410
5365 F20110320_AACSPW sosa_o_Page_046thm.jpg
12f03a4b3442906196592850796556f0
f21a448c83856b0d7ee26c4b1a5e0a7163d7bbe6
71395 F20110320_AACRFS sosa_o_Page_081.jp2
6b11c1eb8692602c1a8b431b15180eba
abacf15615c0c9270715e3364614df7ba9d69130
2237 F20110320_AACSCL sosa_o_Page_027.txt
c9469967bf0f31e2118af7a8fb7de9c1
f5f660788611d42136cc1684e190fd04f0df8b3b
5003 F20110320_AACSPX sosa_o_Page_025thm.jpg
1c0d9bef3dede57c7bdc58625d2c4f1f
53021a9d489a23a689a5e64a3b65ee6fb3465c00
1051974 F20110320_AACRFT sosa_o_Page_082.jp2
e9431941c1a9141829fe03aae8bb7207
b418a2752872b70acebb6c2f1276d2843eb6219a
1848 F20110320_AACSCM sosa_o_Page_028.txt
42116b5910f3be63823b30f5ab609400
5b088420f234743920cc70cfe33d1c25d20f919d
9181 F20110320_AACSPY sosa_o_Page_150.QC.jpg
7e09b081d1496ed45fc612d9b9d92ac1
96762621684b38cba93098f92d576ea14b2f3ba4
80935 F20110320_AACRFU sosa_o_Page_083.jp2
cdfe581e8aa23433e2f2e59748243f85
28ee9755bb29d465e2df85920feefae0de08db23
938 F20110320_AACSCN sosa_o_Page_029.txt
0c33d59b3dd3632e64d115a0c2836ca0
1efe27fece26e23312848240fa90d0f6c199be7e
23542 F20110320_AACSPZ sosa_o_Page_021.QC.jpg
cf64a763e9b9484cec51b2a233c4a2f7
94a10e71d7eb86eb719662f92d90e28ce5525bfc
48410 F20110320_AACRFV sosa_o_Page_084.jp2
b537eaebb0e7780b5b08cfa0350ed871
e0894eff2ad60912b4aff7c40d996381610c80c8
1782 F20110320_AACSCO sosa_o_Page_030.txt
d27783a609fc7752707ba86bedc3443a
5b8a114653dbb7cb92ee4410f3ea5d928f38b2f1
90477 F20110320_AACRFW sosa_o_Page_085.jp2
e8ad1c56881caa6c1102a0773e80ec83
9cb3960dd86e41080d02d5c9e55c8af9ac0194ff
1094 F20110320_AACSCP sosa_o_Page_031.txt
5061d3ef385d60329412e7dd0dad2b13
34a141c4d957b66804541d5be4103d3317685754
111153 F20110320_AACRFX sosa_o_Page_087.jp2
5d1669b7d2d9dd4907e393566c935a6a
68b651066a0308550719cd67587887d3011f3d8d
914 F20110320_AACRYA sosa_o_Page_125.pro
b754c3c9c58dabf07501f0528aac2a72
c9421e85781f546431036c15a6c70a32d1b0faa6
1685 F20110320_AACSCQ sosa_o_Page_032.txt
d851655a12757e1b9748dfcd120404f1
c71573b3ee63baee0b935981a48ddd6ca22c97ab
941142 F20110320_AACRFY sosa_o_Page_088.jp2
26eb9600d2322550b477d04cd594daaf
15c116bcac3a867a73fa454ad2e6c17993dd3d5b
34309 F20110320_AACRYB sosa_o_Page_127.pro
c06edb767d799d4a54aef1f73815bd24
c3c167bcfffe142e1d9c4936c44c0a403ca8dd98
1886 F20110320_AACSCR sosa_o_Page_033.txt
83656431eaa82fe528382ad825ad3e45
4507cfc31b6f34996918852dd785bd55b7de80f8
833897 F20110320_AACRFZ sosa_o_Page_089.jp2
81ee2959f7e661d531d8b6ba617fb356
dab3fa61c88ff903cb7a66108eb95e69198765e8
14551 F20110320_AACRYC sosa_o_Page_128.pro
30fe5af251bf473f571356ef99e04256
cdfa29d9ba70efe7f6facd5277785673b6aca774
1479 F20110320_AACSCS sosa_o_Page_034.txt
c7901ce87277dc795dc725038ac284f6
72a5cd556a286c9a096d92599f901aeced9fcfca
732 F20110320_AACRYD sosa_o_Page_129.pro
7b1469f842a981e238a26e78c18ab456
4285cc5e91495cfcba9f06f586a9e375e13c4da2
1830 F20110320_AACSCT sosa_o_Page_035.txt
bb6c6a320288b7ac47aeee0adb6da1cd
0687d988f937d8d8b8b003c119c6becf93e88033
37197 F20110320_AACRYE sosa_o_Page_130.pro
e969d475c83403fc2158357799e9cbe6
6358c27d6dcfe6d1d18a9afe4fb58074a97851b4
1552 F20110320_AACSCU sosa_o_Page_036.txt
fd20df9fcfdc2bf9843567885dcf5ebe
de271946a83bf70924efd42498e5987c602d86e2
36045 F20110320_AACRYF sosa_o_Page_131.pro
afd66100c8847f97d03f354ce8a03d4f
aa226558302278698f46c9131419605badfe3008
1507 F20110320_AACSCV sosa_o_Page_037.txt
1d7809e032c061549b3d8f9838242f80
fbb7748dded5a9813dfabbe287bbcf762ea6ea5a
1165 F20110320_AACRYG sosa_o_Page_132.pro
fa75e6da9b1d21db1da6959d4ad025a8
2fffbbc13171d66cebb09412ab01916bca1ed0bf
1381 F20110320_AACSCW sosa_o_Page_038.txt
21caec99c07707c0ecabbae793a8a137
8b9e4d8847d7a7c37137c44ac871d45fa4dabdb4
13570 F20110320_AACSVA sosa_o_Page_177.QC.jpg
c6fa6a266df46f8e52109eab524267f1
ed8ef9bac6135c4108c09e0dbd5933c647914003
4289 F20110320_AACRYH sosa_o_Page_133.pro
1b50da0dd76fb625465cb7a264657774
8bf6ca40e90cd910423c860efde86c53f6a3096e
1679 F20110320_AACSCX sosa_o_Page_039.txt
b38f3459edea79d1c1d44f851408ae04
c19daac8cf8e41ea7b9730f320419a637e897c1d
10189 F20110320_AACSVB sosa_o_Page_181.QC.jpg
2d03b60ff4827d579baf9eaaed8ffa99
7d17a26aeabb633c8348ccce3415a4e5066752ac
2080 F20110320_AACRYI sosa_o_Page_134.pro
1c3329c4a85a04f474534e7d4bbbcb20
fdf9c19cff9f0f7dcf2bc6637a561a8f218ba416
11567 F20110320_AACSVC sosa_o_Page_182.QC.jpg
08ce9e1fcda5fa74509137f966f7dad7
9f679f9d8911d9c74e05724765678df2de6e0f01
2954 F20110320_AACRYJ sosa_o_Page_135.pro
084b774b475638ff34ac385bbe7b9c48
fba83976725051c73c82914f55e072b6d853b013
1846 F20110320_AACSCY sosa_o_Page_040.txt
ec07e05e56082dfd8a93e934c8b26d85
28674ab1d3105715cf5547f86a6fb370f2563d37
11230 F20110320_AACSVD sosa_o_Page_185.QC.jpg
42d7c9276cb1c6ce9dc70b09f4e32ea9
ab4517e64cb55ff69c593a7a73ee791cca4bf669
2419 F20110320_AACRYK sosa_o_Page_136.pro
0fb5e5aea8c63f2d814017c429c741a1
4859951310d490b8a7b3877444e8675f48162874
646 F20110320_AACSCZ sosa_o_Page_041.txt
d3606e4bf5e49cf5b6851b6ee12b91a4
ac0eea797b9dbae2517760b30e490ceffd92dd7b
11422 F20110320_AACSVE sosa_o_Page_186.QC.jpg
e31e4e1de54f425c93bdb2e143cf679a
d7c5763a85c0e80c9eb9024f203b2c1b62d08d40
1051979 F20110320_AACRLA sosa_o_Page_223.jp2
cbf412ca92a8f82bbcb10330eddeaea2
49f1dd97efac8f73e1990b375f8af2518637f571
1660 F20110320_AACRYL sosa_o_Page_137.pro
bb8133fd0ca401f2123f6c249ce7aabd
c33ec4f96ed999eefe5189ffc43b53cbe9ae1b4e
11415 F20110320_AACSVF sosa_o_Page_187.QC.jpg
d50a41e7f04ee8520e0d9f0066f09d6c
da9508fcd145b9dc38ee5af1c94ab5fb401d1a40
516920 F20110320_AACRLB sosa_o_Page_224.jp2
4fdd2ef1053469f37765e7aee2ed70de
cfca69c2c0ae1e9beb4db58d5a3306d23cdc7281
F20110320_AACRYM sosa_o_Page_139.pro
b6c2638ffe8974615811a8d19e024350
a9e652eede64620c8f5ffa2be2a9ad5e1a52e153
11869 F20110320_AACSVG sosa_o_Page_188.QC.jpg
311a670b1cf2a4d8aa4e74f1caeec4a6
269c65d950df6cd3b44e42eb50bd08fe69bc00d4
2212 F20110320_AACRYN sosa_o_Page_140.pro
be75a692dc714209d029680d1679c1a9
de8dc40bfca138c8c3041f589bccdd513890e03e
11439 F20110320_AACSVH sosa_o_Page_189.QC.jpg
b77deade33bd80d4769b8a1f4668641a
9cf3c5be9fdb9ac19cf3b9c243dd2913380e8759
41703 F20110320_AACRLC sosa_o_Page_225.jp2
8b1e23f799341ba1d032bc4c71af876e
76995c115488fce6f31351571e58fc6fc16e222e
5342 F20110320_AACRYO sosa_o_Page_141.pro
34c8a7b41d413d44edd9ed2b5a80ea52
ab9da0b560150931a7373d99e2cacc26fa936e23
11164 F20110320_AACSVI sosa_o_Page_190.QC.jpg
43ba4f2abdfb0dbd89e3842537b8860f
5e5b5fc78eef77e5213c1f8b7603040ba145a86e
F20110320_AACRLD sosa_o_Page_002.tif
f66b3ca3193b7af181f70c51070d504b
dff01c78ff5e15b006f0c9ea4c7e46aebcd358bc
10075 F20110320_AACSVJ sosa_o_Page_192.QC.jpg
3e95e85ebd3e57ff0cdffcec36733260
cabd2d8ddb2e55ee3f3bb72674be473ea106b6a0
F20110320_AACRLE sosa_o_Page_003.tif
02ebfb26140f34998071c631723da0c1
5f84ae466ff7759dcdb488fb1699c82a0327d02d
3261 F20110320_AACRYP sosa_o_Page_142.pro
de52ec8eb15e25ee4292643ff7216ce8
1bdfb22d68502da49870ace41fb665a26777a90d
9394 F20110320_AACSVK sosa_o_Page_193.QC.jpg
9a3126f928224bed0d9849b4eabde585
90882c707efac085e8c1f78052b0647a8e3b7577
F20110320_AACRLF sosa_o_Page_004.tif
29aca4916cb673e9be11cdda911a9209
9aabcdc7c7e60924f4624dbedce305718fe2612f
6147 F20110320_AACRYQ sosa_o_Page_143.pro
7e8ed7995de258ba86a3a45d7cb0324a
b58742cb01e39a8f8913f5eac0ceac1df2faaf5a
F20110320_AACRLG sosa_o_Page_005.tif
cbc358cfb33c7d65403be4fd6d196aac
72655e2ce702fc85d7868cdc090a22539b1e687d
3070 F20110320_AACRYR sosa_o_Page_144.pro
e396925dae2fdb260c14fb4ff5943361
c21a473b1cb1bc69b49162f393fbbeb290b199fc
7425 F20110320_AACSVL sosa_o_Page_196.QC.jpg
bf17bad24da00b655a7ec41d55cd2367
c4ec35a55ec1ce69a962a452de2e6260c74f3798
F20110320_AACRLH sosa_o_Page_006.tif
7c1eba940b2079c2f9131048fe735996
484e1b10bfd85b5371c424f827e01c9c908bf5c9
153 F20110320_AACSIA sosa_o_Page_180.txt
fc25cbbe6749c142bb60157df7204ac7
64b67de996189a7cfed9a723eea01de874f0513c
41038 F20110320_AACRYS sosa_o_Page_146.pro
543d10126723290985042d70cc29fcfe
c92fa60578c7f8e83911b1cdba066f3f3a566b31
8581 F20110320_AACSVM sosa_o_Page_198.QC.jpg
06524bd78413ec7375e0f2cb642f3c25
79c65555c696a8b9531e5d9317e39ad5426e6838
F20110320_AACRLI sosa_o_Page_007.tif
345bf55676fc9019ca58e7c399f9c933
9ab5ba0ae0de233804d02fc8a36a85d8eb2a0f11
33 F20110320_AACSIB sosa_o_Page_181.txt
6b3bccf36d07a5dfd8670c10be3f0fe2
8027986baa75852253e0a543b3c7077045c5e641
1262 F20110320_AACRYT sosa_o_Page_147.pro
85d08283645737a246951e8bae05b4cc
61dc4067377433b8d5adb5c98b299d33b0d1d242
8289 F20110320_AACSVN sosa_o_Page_199.QC.jpg
e8b3840ff5a761babab0e310ec8f217c
04af8f34181bd91789f0ebfaea146064fb538e39
F20110320_AACRLJ sosa_o_Page_008.tif
d61fb8a6e80a6a459fc3c35d37195912
c4cd9638f66a4c875ed0730bbc8e8f67b93f08a4
3473 F20110320_AACSIC sosa_o_Page_182.txt
23c03f13122d622bf5440aac84a3ed7b
b48bbba52695c06d9beb2a24079350c93992823e
2592 F20110320_AACRYU sosa_o_Page_148.pro
baeb57e4febd407c3fe0befa25587f45
95748e2b67280ea5f097f8e469cfdbcc6a27e102
10007 F20110320_AACSVO sosa_o_Page_200.QC.jpg
ea410e0ca99b3efb3376842e5afd2661
c657e42ab4ca144027913e5ff0b28074f94e8fbf
F20110320_AACRLK sosa_o_Page_009.tif
3c0308e80643da73d67a2969bad8096e
5849c4d167e40309a1bb7891b2430f96deb3b68c
189 F20110320_AACSID sosa_o_Page_183.txt
380a0a87f8dd4d725f93b8247be021b3
1ae63be75df91c7f7a151f148c2dd6c69a86a72a
44567 F20110320_AACRYV sosa_o_Page_149.pro
324f1207e86376d547129985dcd00383
cf12d2fb2b47ef0ddce92f80453df1c2eea68c1f
7115 F20110320_AACSVP sosa_o_Page_201.QC.jpg
0c9f574621993fcc0307e55d79c4e890
61bb8bdd52a7ae1a577c82791cb0906c5b4f0a64
F20110320_AACRLL sosa_o_Page_010.tif
9bc73084d5888d83d4e3af834ca3543d
a58ba00c7cf3b8983f77c76b69c2fcb78ea8e377
2316 F20110320_AACSIE sosa_o_Page_184.txt
2debc69b31cbe34fa9d160deb02a3ed9
3de5e7b95963f34a7954b5004e723ffd2263b036
4420 F20110320_AACRYW sosa_o_Page_150.pro
5f01205e60b62dc005e8ebf596fe7cb8
e89db8b91c074e4877c7cecc0cbec101d9fb25bd
11054 F20110320_AACSVQ sosa_o_Page_202.QC.jpg
338219ac1cea75781fa4fabd1eccdbe9
30939b00add557a2b703b1411722279db3bda45a
F20110320_AACRLM sosa_o_Page_011.tif
c12a3f29db4a0a650ad51227d8581c8c
52abeb66c93479eb80d205606e32287c4835c965
326 F20110320_AACSIF sosa_o_Page_185.txt
33044c07ccde8d1cade915dc9123f7a0
8b4a0307fffe52f198a46d775a127ee8bceff0e3
2070 F20110320_AACRYX sosa_o_Page_151.pro
443b90e58be684119e741ea1b6ee34b1
958af4ecac47e97a6802e62053d7f5f657747157
13080 F20110320_AACSVR sosa_o_Page_205.QC.jpg
ee0dcd4d0548b8c46b0adacb2f0b04ea
6de1c836853cdc52ac527594072201261eebbe3d
F20110320_AACRLN sosa_o_Page_012.tif
337bc85e75cdbae3f0464d6ad328bb34
ec4991e4a4c5c6568bcb9ece386d888760b77691
111 F20110320_AACSIG sosa_o_Page_186.txt
09b3129d3d835e958d822079b202b69c
5d1c9a712231131bf142e98d51c541f9b7a445f8
7404 F20110320_AACRYY sosa_o_Page_152.pro
a52f38bba37e41d641746845d29b1356
f74cc1d584665c501750a9e0d23fcd792aaca568
13537 F20110320_AACSVS sosa_o_Page_206.QC.jpg
e4d9c0f37784362b60db6303a5b92048
94ba59f958ecfbe3742e94a46b8526cdb8d1c70c
F20110320_AACRLO sosa_o_Page_013.tif
6fc1b343007c3501a5d4319c0771fdb5
f63d9f4ea47805192733905f9c10f7e229c1f7f4
265 F20110320_AACSIH sosa_o_Page_187.txt
6fcd7b7fe27965b07151617515c89251
84d99d03a02fd3e0573e1836e6df7266cd346542
55212 F20110320_AACRYZ sosa_o_Page_153.pro
0806e3af1ccb1a087faaa263710b7553
91abd3d60f176202593174104acc15af0fcb246c
12603 F20110320_AACSVT sosa_o_Page_207.QC.jpg
2aacbb59d96f2ac8f7a43e45e022b582
5a7506e247b284d343d98b80cd6e65d90e9441ee
F20110320_AACRLP sosa_o_Page_014.tif
96f575fd162bd5e120c10a644b5f8f8f
940d200391d5566d714e76bad1d619ddc2609b42
F20110320_AACSII sosa_o_Page_188.txt
0aa285df4b1989382b732a86f46ddc42
976358cc538d98eed711078d6b693f41dce04f05
12641 F20110320_AACSVU sosa_o_Page_210.QC.jpg
b57bbcb47aa8be0bd100b698c84d312e
64855b21b93b6a3017cc5f7f209bf281c56c1126
F20110320_AACRLQ sosa_o_Page_015.tif
cb6ac0707510bb66b2cde30c0076d36e
34e38279d0d4d058e021dfb11bbf01b8253c1ccb
F20110320_AACSIJ sosa_o_Page_189.txt
bac9554362ca1acb2ab3d2b2600204d4
d1876542db1991aa3a7b8b868920ad9c4e6f32de
12403 F20110320_AACSVV sosa_o_Page_211.QC.jpg
4532e19a623c8fafd3cef9e29b39c570
6a8c2e6bc992a1edb83878e914c8ea1f36e0a3d3
F20110320_AACRLR sosa_o_Page_016.tif
81a13e52b9b7e85ef65e5cbf62ad5791
235e3dd11fcc62a7d67a933ff0da06006fb5459a
278 F20110320_AACSIK sosa_o_Page_190.txt
1b797dc8c1857807e3273cf9293bcd71
456fd60f9d72054dfc3b049fd32b8b7a2161d182
13921 F20110320_AACSVW sosa_o_Page_212.QC.jpg
ce129461a43caf093cb6215ecc9c13da
4957bda1627c0d20cf305690f01f6b88e7e12a37
F20110320_AACRLS sosa_o_Page_017.tif
d45521e3f3c2ce6dae33d5213c234646
f039922d67d2fa7d03238400fb166d007d25bd8b
1518 F20110320_AACSIL sosa_o_Page_191.txt
19121d8c8874a0810942119d26e72357
9f69921f81db23e8c026c2ef3ad0ccb75476cfce
11785 F20110320_AACSVX sosa_o_Page_213.QC.jpg
91374f006f1a7b3e21ef04713ba7012a
1b30c04300aca36053c7111be35024e27fe4bfbc
F20110320_AACRLT sosa_o_Page_018.tif
6c9e8fc921883456d9f47cc1639ef87d
efe72fc02e99cccc3d9f699209ce9249ce4abbbd
206 F20110320_AACSIM sosa_o_Page_193.txt
078dc74c1b5a0ab36d0717ec0e5163f0
5bc5876f2d0fc8685821ac07777b74c0832b96c1
11522 F20110320_AACSVY sosa_o_Page_214.QC.jpg
af9d5240a813d543cd5f5fbf88b9e536
9689477c9bcf7875a4d33b8bebe2bb7c9637a1e1
F20110320_AACRLU sosa_o_Page_019.tif
b62884250bf67644167be5bb8455849a
b81334fec11429178867d3eceadba795cc28b4a3
130 F20110320_AACSIN sosa_o_Page_194.txt
3e4728a8f34458c39f8dc81497111188
f6193a7b532c930042ef2b5c56dfb1a7ef3a93da
10850 F20110320_AACSVZ sosa_o_Page_217.QC.jpg
1b656c71e649960ea3d2d2b8090b3150
30c791e54494d7158a1d45cd4202b05d38c0e3e8
F20110320_AACRLV sosa_o_Page_020.tif
f4794754ce9c3108e7f22ed85cf831f5
18555f67618cfd5c077217b4b6cc583511f391cd
F20110320_AACSIO sosa_o_Page_195.txt
bef42e519aa00306d84c7c67428fe00e
b437e7f74b4040a9c77e479de114c395da89ecd0
F20110320_AACRLW sosa_o_Page_021.tif
04f6f7e521b12f1e2259ae4a27342068
0ae983e012390183819efc9e1ddd8b33e947d1a1
1201 F20110320_AACSIP sosa_o_Page_196.txt
ee0afeb74006c464e03f8fd2d466c335
f4d85f1ac99c055e62eb421d61ade120a22e8584
F20110320_AACRLX sosa_o_Page_022.tif
7fa1cc55b566e33fda4f186d8a8e9086
746d66e70f3a69d617ea8ecd10f7a6ce9a947796
1505 F20110320_AACSIQ sosa_o_Page_197.txt
2ec33c457fa0a133d6ac2bdf4bb5d02e
91e5f5884189197e6544b5694b490979311feda5
F20110320_AACRLY sosa_o_Page_023.tif
bdcc8bb7d784cd2a873fb7aa92d55b5c
64a9f36303fcea800bb8e8a9d5b2bbb7a02f4df6
319 F20110320_AACSIR sosa_o_Page_198.txt
18201cb87c3944f4ac5a7d5ada2741fd
9483fc23422da43531887a75673e92ccc0c83d97
F20110320_AACRLZ sosa_o_Page_024.tif
b270ee1604032725722087b40cceb465
740e125a88a4ba769996f32865abc6de053be3b7
71 F20110320_AACSIS sosa_o_Page_199.txt
6a9ec536d542a20475a8c8bace276bb9
1eb3bddec825c8d3c983bcf1be316b3b6c0ac308
F20110320_AACSIT sosa_o_Page_200.txt
cd5513b84db2a28b847f7ea322de84dc
a496e2ef63a6c4de77df22f9d0023b8f9e7c8333
135 F20110320_AACSIU sosa_o_Page_201.txt
dd3f78c61347a6ca75cd2cf811585975
408ec9cafe42069fc34d04cef3f5afe55437ea63
851008 F20110320_AACQUA sosa_o_Page_086.jp2
d1b2c9720c9022ef4afedcc7e175d781
75b8b48a6ff6b400282831123f528cc3a5587be8
213 F20110320_AACSIV sosa_o_Page_202.txt
958d4c58dce25b96a14c4d3dabc16193
7083b237c1ce4a5ed71fde79d2db6f3f09440cf3
F20110320_AACQUB sosa_o_Page_167.tif
55a0ddc7289768c34be7661143409f7f
36a76f01bd5cfacdaa7768a3df5b3368e8848d2a
F20110320_AACSIW sosa_o_Page_203.txt
9c154a232c819ea3b5df9508a2657d31
00c5f696e43a0c5c344ca855bea18e237a8fb3fd
72753 F20110320_AACQUC sosa_o_Page_134.jp2
6f848e0e97661fe579cbd79c36830328
60fb6a0d7d0071f4b00b9d9ee438aa60cc652943
986 F20110320_AACSIX sosa_o_Page_204.txt
999aa37d20aacc2641a37ec381e20b92
cdb17af9277e6dcb404f7934a2af26fb2c4a5cd3
1169 F20110320_AACQUD sosa_o_Page_145.pro
39d82e4c86ef69005fdb11e6fab6fb6a
88016a2261adf36c70ae9d4548a5ea5842b96a30
2939 F20110320_AACSIY sosa_o_Page_205.txt
4762de582e62aaf78ffe3484fdd475ce
faa72ad7031c8a71feeff9a47c7e1a5dbd4e7a89
32290 F20110320_AACQUE sosa_o_Page_212.pro
17bab7512286c74e09e97b979f06df60
7ea817a29790e095ea7d07469eec8253bdfe0d90
821 F20110320_AACSIZ sosa_o_Page_206.txt
39c348d326c99fb8a0ee6b8f3a1a15d4
ce7afed71b0c75f1d994371d0bd3df52a41610ef
22877 F20110320_AACQUF sosa_o_Page_011.jpg
472c146ee5363e337e02c96166bbe51f
71b73400d404c1a5b1ac46c091aea1cb9e8f2436
34027 F20110320_AACQUG sosa_o_Page_130.jpg
86f6431c9869aecb424777df67308c68
94fdbfb6469aec19bfada6c31aa0c77bcf264292
F20110320_AACRRA sosa_o_Page_161.tif
c37aae68478c6244221e360c1d98580a
d845bb2cf259245b6281f7fd00a9602ed53044e8
3658 F20110320_AACQUH sosa_o_Page_170.pro
eaf385ad39a64b7e0eb6c823033c47c1
b97d0a84b20048e7bd14c8fd73045109e46ceed5
F20110320_AACRRB sosa_o_Page_162.tif
f13e40fc3226dd6ab5ea47c078b7c63f
09a1c0c7065a93373c7ccb5e5a480dc76b16c955
137 F20110320_AACQUI sosa_o_Page_176.txt
e43b9e8a39fb4eac1f1ab9ab1c0252e1
d7ed023570b9347592bbd92f0bff65565a1bf745
F20110320_AACRRC sosa_o_Page_163.tif
0f751476935896176d14d9bfb7d1fdff
00dea80bcc38f7b579255547b541326fdaa56734
48203 F20110320_AACQUJ sosa_o_Page_210.jpg
bddc7c80174023ca71e12e35a2553823
77597cea3308be9899b581214d7f65eeade494e9
F20110320_AACRRD sosa_o_Page_164.tif
d7696ea1474dc7ebdad6817f9820314f
701069f52aaaec6109b704ab4b3885bbe127ad80
822309 F20110320_AACQUK sosa_o_Page_056.jp2
1d42f94c170ba402b1f15135d256bc7d
91ece7f4ddc6b2a73790c05906e32a6989073878
F20110320_AACRRE sosa_o_Page_165.tif
578ff52b5d8eab580ca84bfc015e9a9f
9f7f7dba3919291483de443270c1c439e9fd5b21
56957 F20110320_AACQUL sosa_o_Page_163.jp2
afe511435f1f0b8e760cbac7b543a696
23f36c8dbca0d126d73b257f77f6ebbf8bc7910b
F20110320_AACRRF sosa_o_Page_166.tif
1561dc9e8c983a3ad46ad0fa7c031daf
f54d295bdcf08e3f25279341e10ee3e9693b69c5
F20110320_AACRRG sosa_o_Page_168.tif
41795872f5b7bfe17885a7d949012531
3717af9adc8c0cd1b32c2679297b288816db2b1d
F20110320_AACQUM sosa_o_Page_164thm.jpg
b17742368f6f587f12c31fc28a8b1e86
debd6ebc9c06a2b541ea70774e5241312e0b74fe
F20110320_AACRRH sosa_o_Page_169.tif
6ab9fda592bc13bee8f64749100dd947
08efe379c333f92149605328d4990bbc2cc26b9e
12606 F20110320_AACSOA sosa_o_Page_159.QC.jpg
ec28f96a2aa5b94f07a5b57a5a92a572
c6fd3d370217052ea82199acd1c7fea611d840d8
2519 F20110320_AACQUN sosa_o_Page_199thm.jpg
d87fdacb4a85e621ce51c98a1e0b8dae
4ac6dce0555138f1a870972662121dad8f6f82c5
9752 F20110320_AACSOB sosa_o_Page_144.QC.jpg
14abde9ec857fbc1e408396ec6cfcbea
ed0e453cf905df3903c9b81399ea24856dfe2ee7
255363 F20110320_AACQUO UFE0008983_00001.mets
7db1cc0fafc9509c92fb5c70d51b94cf
aba640228b52edf787ca3869c470bbe7f87ad553
F20110320_AACRRI sosa_o_Page_170.tif
6a28d6937804049657a7d405d98dfd05
74134df56dcb3ebfc026c25b6098181b37e9b10a
13298 F20110320_AACSOC sosa_o_Page_147.QC.jpg
ac8a04762ad6fee5c33b4e5d28a4f59e
1b593207519cafbcc9284fec2c056fd1fec948f2
F20110320_AACRRJ sosa_o_Page_171.tif
17fceeaaf1f0b8c52ccae3af9d87a497
698a06628deb2a3fd7d21ad869bf7097d254f3c0
12851 F20110320_AACSOD sosa_o_Page_167.QC.jpg
12d25c6e4cb7a08b27285c9f086559e2
f1b61a22a1020a98d226df8018d5d9a35d50942e
F20110320_AACRRK sosa_o_Page_172.tif
68dbdd8ce6e2ba0e70922143399d3c29
8be810e9e699b70c3b86f7a2c6db2a49583ff6e4
21937 F20110320_AACQUR sosa_o_Page_001.jpg
b7a1cf326f3efc61bad6dd2edef09c11
e4f8738a5fad84f382c820ef338715feebbbdbe6
F20110320_AACRRL sosa_o_Page_174.tif
4aaaefed55a85945fab7671bb486d8ac
ec24c53b9841bd3dc690d1bd2ad332722d004420
3121 F20110320_AACSOE sosa_o_Page_189thm.jpg
8e43668bf114d5a7c9148881f13dbe97
97ac298c60548e401d92223b3f4346b921c908a7
69091 F20110320_AACREA sosa_o_Page_036.jp2
335b3e90d08afb009d66de2b5e1c7a3f
88ecd0faa1f3ee33855cafbeaf8ba34e7e35dba3
10190 F20110320_AACQUS sosa_o_Page_002.jpg
176e24bf1877292c7d7a2617142b626f
a7dabe60ff6af38947aa4740d83c39a829ac1823
F20110320_AACRRM sosa_o_Page_175.tif
2994f4a1b4ee3c3c44d1394e433f75c2
e10cf6973898bdd2bfed0e97a223e6cf7e0e0d26
F20110320_AACSOF sosa_o_Page_190thm.jpg
9007b11eddc8d82f955a29be68de9ff9
eac31bfabffebb26cc9da4c1f1a1289db6cc158a
62383 F20110320_AACREB sosa_o_Page_037.jp2
2c68d14af1b5d107822f668d3f9300e8
7dfbc8db2cb9d072c65b2342887667b1e0e450ab
15588 F20110320_AACQUT sosa_o_Page_003.jpg
d3482e7a5dfadc9e9eb323351907a23e
5087a28fcc78154709dc8f619e39bbcd1e9dab21
F20110320_AACRRN sosa_o_Page_176.tif
eae49bc662d9516df03d526ededa956f
bcf210652b9edfa58da50eb0ab2286355a6cedb1
3519 F20110320_AACSOG sosa_o_Page_052thm.jpg
47ec8ad0ccebd2c666e005b5dbab726f
b6f9261d334b2df579066559de80d8a918b77a91
510470 F20110320_AACREC sosa_o_Page_038.jp2
1f7a22e3a6ced4ee69ba0ccbb0e3b21e
0c0590cd4b7bd257e039478cafb681a30b9a2ce7
52586 F20110320_AACQUU sosa_o_Page_004.jpg
d6bf5f8736c71b760d1b3ae498d710af
4b85ab9715cc21bdcef532aa7f0bc2b0e6e7c534
F20110320_AACRRO sosa_o_Page_177.tif
32924a5a6138a9de4d73148602d88933
7be4d0f29caf58e9a58dc0cf43eee2300d603f8c
5388 F20110320_AACSOH sosa_o_Page_089thm.jpg
db69535956854d2d1aecd41349543c75
3ff1cd212d73d77b603e5eb3c05bd531869778d4
77322 F20110320_AACRED sosa_o_Page_039.jp2
6317bdb63e47336f4c8d49ef5a960315
74575a2bb38fbea83472ccec940aff103666009c
68159 F20110320_AACQUV sosa_o_Page_005.jpg
7de3898cfb21a4ccd9e2fc5fe27738f2
1a431518dfc7241e58bb75857320c23e8d5df33c
F20110320_AACRRP sosa_o_Page_178.tif
d1cbdb7531945d91a283d33e41845e75
4bbdad6479722f55e96c5d0953c6b43b1820c779
4430 F20110320_AACSOI sosa_o_Page_038thm.jpg
c1f8c5e4f1ed4da5c2f05ae21935e206
96f897da0f4abc48cd3c3ef9fbc2f59f5d15a437
84881 F20110320_AACREE sosa_o_Page_040.jp2
3f5f765da25c9f87b7c1a02156f4e926
7079851487e3c273cbe08fa3694e1a5fce234353
106715 F20110320_AACQUW sosa_o_Page_006.jpg
da51ab3c8ec71097a56ce6027a2b193c
fd421c4e5843b4e80828c52191ad572b31b21687
F20110320_AACRRQ sosa_o_Page_179.tif
6b8468a835f2a5be0a47366c9d664fcb
af3b994686ea47843aafefa60803d87b23db73d6
5564 F20110320_AACSOJ sosa_o_Page_098thm.jpg
60a2d859c980f5c50c0585ccbbd9f6ed
1ab0eed3526cc01856f044075765121781bddc1a
914989 F20110320_AACREF sosa_o_Page_041.jp2
1cba654d4b37cfa4611f9292b3b927b9
0faa8c2ae9b4d36c11496b8e9f6af53616b42303
107109 F20110320_AACQUX sosa_o_Page_007.jpg
da5f2c344cdb5ef0ad5dd222b015334a
ebc005ed34f8a00882490a327afc06ca2c890031
F20110320_AACRRR sosa_o_Page_180.tif
47e86e3a2e4f6e217e9b9b594602b6e4
ae0091db0478dc17153633a975f74fff8ab1cd5e
5795 F20110320_AACSOK sosa_o_Page_030thm.jpg
08805c420381db6b1cf66b5b6db805f3
b940edfe7ca9ef5451cb5c102ba56ad69dfbcfdc
978397 F20110320_AACREG sosa_o_Page_042.jp2
6adb6e137f616a2ae3398282a27813b2
70e511cf464e34d50e7ff5fece2e0ecde405a0af
100403 F20110320_AACQUY sosa_o_Page_008.jpg
a7234a8dcc897494141075e19fdeca76
d0ff2bf5b4af4ce250d86af9d098a142f86d7837
2650 F20110320_AACSBA sosa_o_Page_213.pro
6a77c77ee5e4b600b06841489d0fed23
4b5202412195c29497d922032f09ecb21df26e45
F20110320_AACRRS sosa_o_Page_181.tif
70de52ad7dd541678e3d1c2021bc2039
3f13e6805e088b623eff6ddcdec2a6499513236b
23046 F20110320_AACSOL sosa_o_Page_106.QC.jpg
b41d5aa28ad296cce5ce1b8376959c6d
5af159fa5a9f5b98d57d40c3951eb1bf2248f152
26937 F20110320_AACREH sosa_o_Page_043.jp2
f0c994e7913b655c29b851e1e4a9b8ba
5ebb20386c84180b4619c71f9de3145a35b5b360
64586 F20110320_AACQUZ sosa_o_Page_010.jpg
30d20962896d6522355df1a248185a4b
2f84595db02ab320fdfc9a985c85a033b113835c
15887 F20110320_AACSBB sosa_o_Page_214.pro
d6c93c20ea7b9f9638795dcd36e1265e
d7c93c92150c248d1af17bd5e0ffe060a6002ed3
F20110320_AACRRT sosa_o_Page_182.tif
5af1edceb1bf8b0336fbb00635d75e17
f736b481d13422dcbc2542b0aabc5e8ee4ac303d
3584 F20110320_AACSOM sosa_o_Page_120thm.jpg
fe8eef9251ebf27f9b17375cbe043832
a031d66fa8233e30507f7142bb8588cd8c6c2c33
88942 F20110320_AACREI sosa_o_Page_044.jp2
2ac7f8199bdf27bed8adaea73047085f
7dcbc315937d80c1dd78776c61f9f3c084bab9a3
4611 F20110320_AACSBC sosa_o_Page_215.pro
6ee8842434ca0ec0679644c7468b0473
719996cf447dda5b27b4683680865625262e59c5
F20110320_AACRRU sosa_o_Page_183.tif
a1313b1dae1cc13ff0091aa22d9eeae8
4578a0845316ea4a4055833a034fb6a134b8ba0e
12261 F20110320_AACSON sosa_o_Page_179.QC.jpg
3db8537e26d5e309abfac1064fb09fd4
80d38760b4ee91c76e0d36e4bc84275ecf9d3465
981662 F20110320_AACREJ sosa_o_Page_045.jp2
fe5b85fba47cbe680f7c41f87b2e3bbb
30e5886fe535dca69c74dfecb37a7ff2c5a51a7f
40690 F20110320_AACSBD sosa_o_Page_216.pro
13cff4049e85f371612bc1b6d35eaa0a
c5dced6d6a9a86b20f927611d0c3a5cb5a9be433
F20110320_AACRRV sosa_o_Page_184.tif
5533adbb92ecdae93294acd1bd2fad91
92c4373d64c84e0791c7fee123f908a519ea0eef
6408 F20110320_AACSOO sosa_o_Page_021thm.jpg
b4f45527a94396b35f4901c2f0a0e1df
361ffd91c0dbc9d100674edcb6c9b59b816aad7e
734448 F20110320_AACREK sosa_o_Page_046.jp2
4941bbd38cbfcb6f1798516b659c79cc
2a1d360a55eb49455ef4982da00f36a13464e4d2
2816 F20110320_AACSBE sosa_o_Page_217.pro
d09eeca9304b0306aa792790236aa477
e5e9ca1ee2a7e7bafd4528d1151a4d0c46357726
F20110320_AACRRW sosa_o_Page_185.tif
13a5c9d4ed10bc462f9eeab760278b9d
dd2ea1a14fb99be5426e4810a6b5c828ec7987ea
25375 F20110320_AACSOP sosa_o_Page_007.QC.jpg
50007536b1a627c5d353f5163ef62a29
799f6f1a67e62055e62a79e6835e3e34b97672ec
73787 F20110320_AACREL sosa_o_Page_047.jp2
b5547657049f7d4ce7b18d58df16a8bd
ca7d338bfb4ddbf9600abf0dbce8817d4aca5fe4
3150 F20110320_AACSBF sosa_o_Page_219.pro
a293eb38fa7cda450d5b4e68a85a1250
f07b65aed791cc74ea9ee780d816170a5f5a4701
F20110320_AACRRX sosa_o_Page_186.tif
cd240382cbe4a285f82e2ef357991786
d50230e118644a8d65999f374cf402e889ddd37e
2180 F20110320_AACSOQ sosa_o_Page_222thm.jpg
c55fe03b88bc85e407fa554fb4051850
f3a97326192b0cef1a11662e26598ae57af0d6dc
873603 F20110320_AACREM sosa_o_Page_048.jp2
1bc7cd98e1574d312c5e6db523cf17a7
be848baec1a4c17b0cc6ff3a82618b33b5ed0948
55345 F20110320_AACSBG sosa_o_Page_220.pro
86a19c3ad8e449ddcf787acd8cca8384
9c27f9cab441cb390e4a8b08bee3273b01335fef
F20110320_AACRRY sosa_o_Page_187.tif
9ef88b60d3ca144aef4d601169db99f1
bdf540f518d95febffdfe2db6350f19a622b6108
18228 F20110320_AACSOR sosa_o_Page_067.QC.jpg
c7c0c921e03e47823f8c3c64a17cffcd
adc527bae222c69157ff99554bc56248bfb56b3b
89208 F20110320_AACREN sosa_o_Page_049.jp2
786f2665783e0f658f507cbbf637b5d7
5d9e81e701f55d22481177a2e8f706927382a47d
38916 F20110320_AACSBH sosa_o_Page_221.pro
09f33b17dcf2aaf146d6a241eb0d12fa
1b53669143f3076b9489fd4e5acf17ab22e98e8f
F20110320_AACRRZ sosa_o_Page_188.tif
5cbf2ae12889caf0ff224ec127e1a437
53f12d6c92f6ca2055ecd3754f9720a76a85c7e3
14898 F20110320_AACSOS sosa_o_Page_036.QC.jpg
2047f7301f6af47745df41b450143dc0
6aeaa54862e453b0dbd018b0d2d13e58de03ada0
820509 F20110320_AACREO sosa_o_Page_050.jp2
9bdaeb2b3b5a7fe1e848acd147847a17
c1ea230ddf63a3d962ea4faa98a857d312a80e8a
2743 F20110320_AACSBI sosa_o_Page_222.pro
0cac8bc5b470593b6bd2b4f597bb0f73
253b89acd9d429c056430b669ddb048d1904b086
2767 F20110320_AACSOT sosa_o_Page_129thm.jpg
8de5c60f053b7d44e95bae26d0b52e31
b6161900859afd44cff6e94044aa939f8c814ee1
97860 F20110320_AACREP sosa_o_Page_051.jp2
fdc8ef2b892bd41e32087a886055dcbf
6c45182e97953422bd570d840de7301bf1316cfc
49477 F20110320_AACSBJ sosa_o_Page_223.pro
cf2c81c57ce38b46713631073b49bbb1
37db87fe1118d4cdaa74ecb5bf1f950ffdfd0dc6
24281 F20110320_AACSOU sosa_o_Page_096.QC.jpg
b6cedb1f24122702b234018ee3ef7eb9
9c28bb871bc8d73e7ffa228ddd1f48049241cc2c
47013 F20110320_AACREQ sosa_o_Page_052.jp2
a6cb6871c250f7082d16532642da1154
2873d41c1047bdfb784ab131ea791cfc0a72b22b
20134 F20110320_AACSBK sosa_o_Page_224.pro
4a5f093f12f8d4d62b3d3f9dff6ba2da
955ca06961d6e824e76c4221880c70b0bc728915
21249 F20110320_AACSOV sosa_o_Page_070.QC.jpg
ee82ebca87e8121ee037b293f3c0eae0
53d1424b52f7d86374a74d3d09aa8da62094dae7
84636 F20110320_AACRER sosa_o_Page_053.jp2
80f3fa87558cbb18a87b99451a7b4bc8
3b1f0b06f52fb0128710e4ea9925d9024f679308
3255 F20110320_AACSOW sosa_o_Page_210thm.jpg
4006ab3c7695b3d514eee5665604c6d5
f9004786e95b5a630c02356228dc7a30efc0f4d2
100913 F20110320_AACRES sosa_o_Page_054.jp2
2b78c008f66e766dd2ece8a116b3d07b
fee037aad841c220661bb63bdb5bef807acd5490
17497 F20110320_AACSBL sosa_o_Page_225.pro
e716e92a9400edbe353d9ad0ef152e0e
ddb667e873d7864c750a377a6649eadc3a09900e
5660 F20110320_AACSOX sosa_o_Page_026thm.jpg
671c7cd5c2efc0db86ffd7c9e89230f2
22416ce7a2ec18566ba93f796d0efd99fd4410c7
90353 F20110320_AACRET sosa_o_Page_055.jp2
2997e2b6cb6ed35836f20144f4892fbd
91d673ef9553b17bde78c51fbd4b6a6b92e2b306
F20110320_AACSBM sosa_o_Page_001.txt
35b1ba28eba825da7797dc5c856de31a
1e36424f14e996ba172d7759378456a729692bf3
4692 F20110320_AACSOY sosa_o_Page_215.QC.jpg
7b331f41d88732858237954cc47b9c8c
bfdfc5369e99459070c5903f0a09940ad3662015
56531 F20110320_AACREU sosa_o_Page_057.jp2
dab0da16cacda9adf5f26b4fdb4bd080
c0fc8a1cf7bd7115ef0038bf6eef980114d81c10
107 F20110320_AACSBN sosa_o_Page_002.txt
2441301b6b65fb59cd1e92058bee19ac
9b7944ab0ea5fd7b6d2c48958928e49e5f0bb98b
F20110320_AACSOZ sosa_o_Page_002thm.jpg
77688d13e270407ff60c559e07553f0e
fa7b1eaa49a8f4f4297224fcecd40754d694fd57
76254 F20110320_AACREV sosa_o_Page_058.jp2
808f13699907aa5441dcb5e79910b6c8
dad3126eb508969e524c1d1a8f427586ef6ac112
262 F20110320_AACSBO sosa_o_Page_003.txt
4171ae4c2fb114408cdb90aa1469eb47
f7a0180fa674e4bb507d7d1207dc0a56766f2c88
70420 F20110320_AACREW sosa_o_Page_059.jp2
a3b5da1b8ef2f4ca7f3c12e15ceb2f78
231d91bfb370836332345ea588f19868c027fa13
1394 F20110320_AACSBP sosa_o_Page_004.txt
5761ea89b0b2ea66e0a54fe0f4fed881
2d7fa7c607f73b6a018d1b70ff82b1154774d100
67975 F20110320_AACREX sosa_o_Page_060.jp2
1be56e4b7d81215c8adb996696ac017c
7978633976e647f5ebb03be56b1b33b5ed31d70e
30230 F20110320_AACRXA sosa_o_Page_099.pro
49213d46d6cd33ca45a2a0cd6c33ed4f
5227c515493e7d9735cee383d5079b66c40ebc98
3013 F20110320_AACSBQ sosa_o_Page_005.txt
6c76affe519d8ee2a4c0563c2bbba07e
a91f7d65495a76771f2be31aabd052bf01086677
66553 F20110320_AACREY sosa_o_Page_061.jp2
b29019683e8078b9127e4e0959b40403
a20579e19ffca9919dbebdfb99e41257fdcc626e
55786 F20110320_AACRXB sosa_o_Page_100.pro
b5c57dcb299d23fada14b6718bc4b8b8
fb65aaa915d1eaedfc97cc6ce9130512b7c648ea
4711 F20110320_AACSBR sosa_o_Page_006.txt
f13b1200783ff550e12593a0dc50bc07
34d8ace3a3f4ec0cfe1806a99bb78751eef70fe7
704123 F20110320_AACREZ sosa_o_Page_062.jp2
35f8edd36a050e6b0e4ad466c79b3877
dfee2571c397c7fc218a37df872af212262b302d
19916 F20110320_AACRXC sosa_o_Page_101.pro
256dd546f5965f2d6648e58f6eee83a0
41c444f4387bae91151eaf9fe5662559a33c2d0b
4292 F20110320_AACSBS sosa_o_Page_007.txt
5d1cf928aee7b26bf67b510cd93ae4c5
46905fb48ae43c543fc0ae4505cc7f5c1bad6937
24164 F20110320_AACRXD sosa_o_Page_102.pro
515eabb53b0406e84611e6008c77d3d4
4cb1cff72c57abdadf0e11211aa24c7c41da7d72
3962 F20110320_AACSBT sosa_o_Page_008.txt
27ea69acacba1c0b965571ccc6e910a1
eaeac5ce43ac6b3ca6bc2cc438451851259943b2
50294 F20110320_AACRXE sosa_o_Page_103.pro
2f8130dda1e3e241e28c5f9b445d9a27
b402ef91b15a0f0e31bf5d54fcc63bf715ac8472
621 F20110320_AACSBU sosa_o_Page_009.txt
fe24aa284aa15e20681bd68497767841
0dd1ca38b9ff32c619740edd2190d9cbcdd99203
43179 F20110320_AACRXF sosa_o_Page_104.pro
397285a28c540f9ab4f7c678f641538b
8151ca41b566479e679460d20412ddc2ad7137e2
2222 F20110320_AACSBV sosa_o_Page_010.txt
d555c7c5445ebcf32ede0c778b1314bc
aca0901be02621a5939f04c3197dc98bbd470f55
54815 F20110320_AACRXG sosa_o_Page_105.pro
373cc16f1aac09a99169b522f5ebbd10
d69a6b411065dd98d128f36ed7cc706f5d5f110b
520 F20110320_AACSBW sosa_o_Page_011.txt
f7c12159e6ac9e1db650ef57dc26bdd6
6df9053d748dbdab6af25a8c0d47a3e53fbc21e5
13185 F20110320_AACSUA sosa_o_Page_125.QC.jpg
5e0e15567300b1f9c47aada529e96e83
fc9be4b6168bbfe3e6e01b0527c255fc6061242c
54529 F20110320_AACRXH sosa_o_Page_106.pro
a8e8e7e6f5b2cd75fec5f967226824ba
c95b17d18328343392365219d1abd0b302448227
12034 F20110320_AACSUB sosa_o_Page_126.QC.jpg
2ad763e8e1e762a90705031596a78fbb
3f7cd09de3dd817bcdc90895963b92f6cd82b705
54382 F20110320_AACRXI sosa_o_Page_107.pro
bd51cd20d87eb448293e6ee143319762
0f3b7d74c09d102c5fc76073854150d730bd1432
2295 F20110320_AACSBX sosa_o_Page_012.txt
84c58a1f959d26ce1b38fda5a9809830
1d54bb9105fe7eefce679de34bc90931decd4ed9
10032 F20110320_AACSUC sosa_o_Page_130.QC.jpg
4e4683ddc855b5e5232d8c60b7a7ab2c
e4e382181bc1a3ff1aff7a3a67fcc41dddc035cb
37054 F20110320_AACRXJ sosa_o_Page_108.pro
9f81c6fa3ce9ecf329478d94e52696ff
7559813ac418e06e83ee5ed859aed2913cf1868b
2645 F20110320_AACSBY sosa_o_Page_013.txt
70a8ddb1992e5521ff59200b638b5ca7
927c510fd5f923a7673ecd784eff3d743e0ca74a
11656 F20110320_AACSUD sosa_o_Page_133.QC.jpg
ccda159f12137305ca4018acd40363a7
09758f9c8f9e2298327a53744a54e5307841ff75
58900 F20110320_AACRXK sosa_o_Page_109.pro
d9ebc95a86211cf206b7273cc61f4031
22527fccc1c3d576a5b641ea5e8b6c895ece20b8
1172 F20110320_AACSBZ sosa_o_Page_014.txt
671801b5769ebe2975f768e86d34e762
f996fe62abfe19ebbe834f62667b77338bc90080
13592 F20110320_AACSUE sosa_o_Page_134.QC.jpg
0ee46614517f5c520e11831c64657277
32ca59818934afbef809f6e0df9cae5af23ff0ec
42618 F20110320_AACRKA sosa_o_Page_197.jp2
eb6b0def33c2516c68d7934837ee5121
84810e42ad0a73b23b7c457f0f1e854f6249b286
37035 F20110320_AACRXL sosa_o_Page_110.pro
f576eda2053cbdaa0f59bbda31a173ab
033a2205a6c0f346c3090acab638c702f6ba02aa
11886 F20110320_AACSUF sosa_o_Page_135.QC.jpg
f67412648fcbef95607a8daa18574f06
b368330e1f122ac47da6dda0b6bd9dfbcb585711
36981 F20110320_AACRXM sosa_o_Page_111.pro
af7101b63b6ef6b31e5fbc39e1976785
8a9626423d5be9ae5dfde8ae4c5baa4e0bde0bc3
10011 F20110320_AACSUG sosa_o_Page_138.QC.jpg
16801ae47b572d2019dc5f5ceb88e8de
0f2b93d2af1f46298634580fc67c10e43d4e3de8
43207 F20110320_AACRKB sosa_o_Page_198.jp2
ad2333ee70fdb41014b1d2a1eebc2bbd
799457e467de9122ab3821f2775f86b9af1ea6b1
43920 F20110320_AACRXN sosa_o_Page_112.pro
4f84b19fcbf1f80189c57000c14ede80
1ae8aa6b5d98276ed44286624cefec5d10be6007
14970 F20110320_AACSUH sosa_o_Page_140.QC.jpg
229568b3bc8211ddcaf0238a17f11054
301213263a5ec5bc9687c67124223ac015942510
35635 F20110320_AACRKC sosa_o_Page_199.jp2
abb5314fb8c9ab3fe89708b24a6cb320
6a5a3e0988fb90e3f1d862bc763a71b26cca7196
11565 F20110320_AACSUI sosa_o_Page_142.QC.jpg
92d7c777448389a8b69c43eb4e799f0c
927347d9435c1d1df4a340537753163f0563c13b
45129 F20110320_AACRKD sosa_o_Page_200.jp2
39ab7fa60d68677b2630431c647f426a
6f7fb19a2c550828c298ab1b325a329712f5b8dd
45545 F20110320_AACRXO sosa_o_Page_113.pro
3e5fe95fbd8735c3ed63a57c33a2b936
aa69e3a28b9f7422266b98f73277cd818f044fcc
9856 F20110320_AACSUJ sosa_o_Page_145.QC.jpg
cf0f1caa4a2e359885c9e27b262c99a3
1bacb47316c1bbf37fbdf68ae6d2a20ff2186a36
32237 F20110320_AACRKE sosa_o_Page_201.jp2
7cefe79ce0fcd2f46fa4dee7f358ff76
53a0377d882020e01627854b4d26ed0522765560
9126 F20110320_AACRXP sosa_o_Page_114.pro
ed5175ecac7d6fe9fd600bc7c53cd76a
f6ad37dd0d6ef98f0433d4c5fad7add72944a4da
54025 F20110320_AACRKF sosa_o_Page_202.jp2
cd11e41b17c4f6f70b78a50e7cc51ef8
c75ce2ea833aa823ed92715111281a841d544793
38058 F20110320_AACRXQ sosa_o_Page_115.pro
60ddd9eef5a0254552e1c6e06fd1e4d8
ce0c5cd5cc40db3093fdb4c4a119e2d833a3d6d1
13984 F20110320_AACSUK sosa_o_Page_146.QC.jpg
a34de8326505eff0f40f15b50161a1c3
afca6ca23e0d0fa2b16f9ba42273bd5edf00b0fe
74200 F20110320_AACRKG sosa_o_Page_203.jp2
5678258c190a01768112011b45329118
59ef1aef7fe08009a362c901167230c7ce2682a3
47554 F20110320_AACRXR sosa_o_Page_116.pro
dc76b4257a80fa6a96feb1f417be9f63
56bb42c52f72395a7b909f6077dd94d36abd8ceb
10207 F20110320_AACSUL sosa_o_Page_148.QC.jpg
57f834623314b59400259ef2e2b1a896
a58b5e7648d8ff176d327e4cbde93dee38056cba
77033 F20110320_AACRKH sosa_o_Page_204.jp2
516d28b81c09dff341189c4cdda0c37d
00a663f15a50b62cf0b0ae1728249b437054d5cf
350 F20110320_AACSHA sosa_o_Page_152.txt
c2b2d33cdbe5a2dd359b7b1e6de68d89
8735f85eca68a3832cae4bfbf640bbbfd0be16ce
44600 F20110320_AACRXS sosa_o_Page_117.pro
c60f4ef0c03a847f13b7ab503bd57b88
d5db6040578b9868d847afb4498963fd21e1c3b4
10624 F20110320_AACSUM sosa_o_Page_152.QC.jpg
9c43eb7b8650ebc685fe60dd11fbca39
c43313ce2e7446394000bca31da17ed607b71895
70928 F20110320_AACRKI sosa_o_Page_205.jp2
1cd3be4eb85b577bbbefda4ae852cf4b
5625a3b936c85fc53124483fcc82bd6f361ab2aa
3786 F20110320_AACSHB sosa_o_Page_153.txt
8c663131120c3bbcf44ab6e428bed1c1
63303c6c2a0c1801548505448f122798133c2a56
26305 F20110320_AACRXT sosa_o_Page_118.pro
521c112bb5c65c09fd566a7f20834db7
00d295f823f94167628b760868d277d688ad260f
11880 F20110320_AACSUN sosa_o_Page_153.QC.jpg
dd18ec3566f206b950e1b38c00872742
5997637740b89ac3acebc1dcd677cff9ab7d2fdb
73015 F20110320_AACRKJ sosa_o_Page_206.jp2
0d574f3fdf54fa4ede0a257e8239ea70
498a96c1a240a3b636bcdee25a74259d416db0e1
247 F20110320_AACSHC sosa_o_Page_154.txt
b6268c57d5e5d62b72047cc2fd06fc88
a72c31c156a34ff319ca5985357fda713def01ce
26573 F20110320_AACRXU sosa_o_Page_119.pro
8fedbd4513d076e4e7e242e20554e4d3
ecff1767f431d8cfaaffd5083b5a01122b7cca1e
11678 F20110320_AACSUO sosa_o_Page_154.QC.jpg
bb789e930891bb64352ecb4b615c57d3
24e8fb449b98c6c4128409f72303c504a5533ac8
71086 F20110320_AACRKK sosa_o_Page_207.jp2
1021f0e372ef430c6d0f50eeb0e86d21
33d15ca4bb575ffae3ea2732f6c41e8bd3dc2f1b
F20110320_AACSHD sosa_o_Page_155.txt
1615494068744a789f2c0b9d000d4f7f
18a4e2b1058abd7992edc5776078cf6d4bfa2bdc
37405 F20110320_AACRXV sosa_o_Page_120.pro
9ca99267e07f7f5811bfac5f6e774949
14a29d455c17d017cc4c8eee6df43f19e11e47e2
13002 F20110320_AACSUP sosa_o_Page_157.QC.jpg
729d14be0bb6afe390d93515e106f16c
6b017c24efe3e8cbdb5439dd352894f294951dd0
66006 F20110320_AACRKL sosa_o_Page_208.jp2
57e31e6abe2380b5a9847cc1390e197e
f54ebcaa2ac02bb4a16d37d629677a736a949fef
1116 F20110320_AACSHE sosa_o_Page_156.txt
7a9d9de52b392f2844e24f715d9ccc4b
11855533f2a585a5c2166c2eeea1e3aca0ad1c3c
1472 F20110320_AACRXW sosa_o_Page_121.pro
eed367b3b135526eac1af2d28fbc55c4
be6861c8d9ff2a272b1308c86258f189d9757b75
12835 F20110320_AACSUQ sosa_o_Page_158.QC.jpg
cbff6b44c1430e3e782072ac3f1a9f10
dff56e52992d5f282e223d8679ec55504f532b02
63923 F20110320_AACRKM sosa_o_Page_209.jp2
f72515255ea9d7adee03c6f9c7f1d3ee
a6ba31658580360ed19b0cb96c92cb4282e843b5
2121 F20110320_AACSHF sosa_o_Page_157.txt
b71392efb9088166b16f8e3383a71d4e
a4e952c0139a19d3dfa93e9fb4e02e06518143fe
1277 F20110320_AACRXX sosa_o_Page_122.pro
d36c7e7214018e82853cd6f572067053
963571cd6c30cbe2ff6ab33c2ff9aed90de68207
11472 F20110320_AACSUR sosa_o_Page_160.QC.jpg
f87a4d9cfaaef37df6d1121dcfde3ca2
dd55398b605343c4fe8865de13d44d6d30a24d9f
68676 F20110320_AACRKN sosa_o_Page_210.jp2
8aa8566495b920c935575f6734ba7548
014aa3aea345b273994f503343494294e54681e6
F20110320_AACSHG sosa_o_Page_158.txt
0f0bfc6734f7aab7cebedc62d5861dc0
bfa52fe95f96f621e51144c285970cc4af593daf
50213 F20110320_AACRXY sosa_o_Page_123.pro
b95a141400a1c0686bb16ee0d042712c
32898704ffe8f5b53a7594699b6b43a7c819259d
12860 F20110320_AACSUS sosa_o_Page_161.QC.jpg
aadc40ce5d6cb1e66d3a78da213362b5
b37937132f695b43b72094ce2847484ed699e483
69179 F20110320_AACRKO sosa_o_Page_211.jp2
f8f1b14183f79d8283b2588a06e70c09
4b2467c2866411dbcfa51ed6141ea4e6af404a13
113 F20110320_AACSHH sosa_o_Page_159.txt
b814416c9ea3582ad112147c683fd891
66792afa32ab004a7a8d7dc55acc5aad1d0cf833
46806 F20110320_AACRXZ sosa_o_Page_124.pro
a5427686031dc9d06aebb7e5cfe539ce
375ca865229f72a22cdbddfcfd4669ab86c67735
9814 F20110320_AACSUT sosa_o_Page_162.QC.jpg
e7b2b64661a55e80302f5832d45b481a
ac87c3152bf4adc08f5542c2e1985969e0ca7591
80877 F20110320_AACRKP sosa_o_Page_212.jp2
2e62f0084c6536f8eb1bac039798088b
ad74d40d4afc1ec04a537bfe835d333d95224f23
237 F20110320_AACSHI sosa_o_Page_160.txt
a6ecdc054b0ab07fb017d4bbca3fd260
614961881541997424c314a8e12f80671a7cfe5f
F20110320_AACSUU sosa_o_Page_165.QC.jpg
1e026acbcb24da0641528628df576d20
25ef7fa61ca587e5cc2177031f9e9433694c87f0
63833 F20110320_AACRKQ sosa_o_Page_213.jp2
f46006d32ddcb756f5374f8a6ac95ba1
0218d17848137f92a18fc1e279bc3de58ff10e02
161 F20110320_AACSHJ sosa_o_Page_161.txt
d385b3b6aacb9f5621922a38b5ac18fb
2c6a50148f3508a650b39cb0a393d28d7865ac01
11318 F20110320_AACSUV sosa_o_Page_168.QC.jpg
92a560ff8e4ebde25c4543cffe3ea9de
f367f797e054e6d14eb74159491a533ba2118240
63108 F20110320_AACRKR sosa_o_Page_214.jp2
9ca1ae0db722655e74265198efb6c2f0
c989bb4bb0f9b846f6feb114285e3263a975cca3
115 F20110320_AACSHK sosa_o_Page_162.txt
d44f58c898799f3704aa58964d6934ab
c6591a2d3a26554790262ce70ed813a1152dcf30
12657 F20110320_AACSUW sosa_o_Page_169.QC.jpg
b53f6360f24bd2bbe7bf0b0f89ea2150
81de8f4b0eee63349d11dc0b10a02f25948221fc
16584 F20110320_AACRKS sosa_o_Page_215.jp2
ccae52bafa99a080e61644baa59391fc
e2f53f17e205274fc7215aa2bbd2cdddc86ef057
366 F20110320_AACSHL sosa_o_Page_163.txt
e29a4968970d79335d0ac01a02000627
5744e86f4d1de10f72207a3865e8e8a97575af3c
11231 F20110320_AACSUX sosa_o_Page_171.QC.jpg
882d4c1cc4b07cbaa2ed4cd87df09a8e
d552ea5d281f3026e99c3fe426a0a7cd446b42aa
51203 F20110320_AACRKT sosa_o_Page_216.jp2
83b9626e720c5d97f3f37fb6073c2b91
2097119bdc7a933d8fb0ce0196c53a5e80f4ceb4
282 F20110320_AACSHM sosa_o_Page_164.txt
468eb74c1f8fe4bdcad14cb189f91775
2205eb58bbec6d9dd5bb16e05e171b276c5364fb
8333 F20110320_AACSUY sosa_o_Page_174.QC.jpg
318da27a2fb4ee3801e59c2df2082435
e8e97361400442ec7fbdaeb215cad0e54336cdea
55987 F20110320_AACRKU sosa_o_Page_217.jp2
000827d8c2b741d776fe5f57290cfb44
69d892232347cb01d12d8654db238f4d4a739ff1
2863 F20110320_AACSHN sosa_o_Page_166.txt
2a28157bb73b64c34499ebbf5544a409
16ed59a9673542bf2d198ad39818352044121be6
11130 F20110320_AACSUZ sosa_o_Page_175.QC.jpg
127797e7380b55056e5478dce8d8e3f2
0b9acc90280ec27a7569df6e1a2149027974c533
54053 F20110320_AACRKV sosa_o_Page_218.jp2
788ca2bde79b6c9af5c0d27083e98b2e
ab106613540493d8bfba56010c9485f09ab863c6
185 F20110320_AACSHO sosa_o_Page_167.txt
976ded1c85acf64ce3c83770b5c0ac72
b0f170cf263ba6f5a1f75c0ca01d2ac8c4cc68b7
56105 F20110320_AACRKW sosa_o_Page_219.jp2
fa1d05e7fb9e152b7b39968ced790a71
eecb6201e892f4056a0e5e258928028a0284cb71
126 F20110320_AACSHP sosa_o_Page_168.txt
e46e2ed90d706da87ca7f9c8a903f23f
9741f303846ee14e477b3b7d5bd2f2cdbb11cad9
59510 F20110320_AACRKX sosa_o_Page_220.jp2
5bdd8860ca73e6eb255d9cb79809aa48
f6a2aadf1c523b628f406ae8dcd9ecdc435a1160
308 F20110320_AACSHQ sosa_o_Page_169.txt
507c5509413ca54e1c82f882a5e5ee66
b5a1ae55a447d09cb6fcc7c8020150b344bc65b6
45354 F20110320_AACRKY sosa_o_Page_221.jp2
040d1af994ed74c85b8aff7c56118589
430bbc5da2050192e0bc38c641c2b93359840f3f
198 F20110320_AACSHR sosa_o_Page_170.txt
914bdaaab56eb205a9dcc5a0995abbc0
e9d2992032b997c734caf315ae136feb99058a6d
30378 F20110320_AACRKZ sosa_o_Page_222.jp2
f364a6bf3163faa16bd9b4202a30f6cb
76b823a3fa914998380548189af53a9e08786d18
102 F20110320_AACSHS sosa_o_Page_171.txt
e3074612dc3a1533cf287980e97ed06e
23ba1205f65d2d26dd321ffcb2c868f9cf7ec4cc
110 F20110320_AACSHT sosa_o_Page_172.txt
9a37d99c67b9567376611a2e09ea9327
3912a7688e7e5fb566149d9fc28d21ce4c8c9fcf
3537 F20110320_AACQTA sosa_o_Page_161thm.jpg
f61ce2d12b5ef765b425107ca55667fd
7fff99f2c7ddadfe06d4757988cd232d7e1dd6cb
119 F20110320_AACSHU sosa_o_Page_173.txt
d8bf4bd477e398e06ecc1401710fef0f
e4c9db8c735b34677241c1d65e49fe5cbe3b579a
43840 F20110320_AACQTB sosa_o_Page_218.pro
fcabb9d5a4e1d1147dc6891ea38d2dc6
60e1fe5a90f4151aa0061d8431465c72fca08070
781 F20110320_AACSHV sosa_o_Page_174.txt
2f183acb0f528aa5096706e056bb4fd1
c2a274ffe878b1f02f0db581c1c6f0750d286c6b
1051968 F20110320_AACQTC sosa_o_Page_109.jp2
3ac2cb710d2f423e03520517f5685ed3
8505222f408868ee12871a265171e95ada7cf9a8
F20110320_AACSHW sosa_o_Page_175.txt
44389033c5e21001702884580552d408
ca749f81d435f604a0dcba9019c19ca555fc188a
F20110320_AACSHX sosa_o_Page_177.txt
db28aa710e49f9fcb07c0e4c47c9dab7
7581644f141398ebf88bc738828692154130f317
41893 F20110320_AACQTD sosa_o_Page_191.jpg
31d7add8407c83997d828733db64dec2
059323c8931da366b2fd2cc095c32f9bd1d19d3f
F20110320_AACSHY sosa_o_Page_178.txt
907a8645be65d72006aceb94af6aec21
fd624ecf4ed82a7047f9ccb7113ec955c4c4b7e4
F20110320_AACQTE sosa_o_Page_194.pro
b86ec00f41e9de50cd83172ab8fbbd1e
2f10e816c1712e20c6abee6b0b20c56bb23e4404
163 F20110320_AACSHZ sosa_o_Page_179.txt
7b224d467828be1492c8e79b9e9dfacf
8960d4478ef8756caad6760c52605107943492fe
10492 F20110320_AACQTF sosa_o_Page_131.QC.jpg
c18419064932b1e64eab2e77c94b8343
8fb8fcdc7e56d3e700dedcdadd37e816ede56850
105 F20110320_AACQTG sosa_o_Page_192.txt
1f309a5a8dff87ed6ee8d9590fbed487
03bc2b82b138a09b33bd6c3d1f0ec9be4f12de19
F20110320_AACRQA sosa_o_Page_135.tif
66791114857532fad9c747614327da46
ace2a13d1622acc082347a4a9541a53bdd6a4ab1
45208 F20110320_AACQTH sosa_o_Page_178.pro
ba020dc084a4e0f0b32ee6d3400f81c9
a2c30b4cd1eddf609a739e722bf565839e2c08d0
F20110320_AACRQB sosa_o_Page_136.tif
35f455a452f92757db82e540c4b065eb
fe0776bdd155b9d335fe8477a67931105c7fedd6
2083 F20110320_AACQTI sosa_o_Page_165.pro
28689c478b337579f162642b3ec02767
c64cdbf76e56d5a426ce69f32fc9cf3854697c83
F20110320_AACRQC sosa_o_Page_137.tif
b1ab6ea62c9dc5460a78b10ef47b1418
3df3e4dee9a3edf6ce29b0298e48815fa0338c2c
F20110320_AACQTJ sosa_o_Page_165.txt
c607e61d170aa7c349a924aeb4e6de4a
22330a95bd09720ccba6def12ed12f0ffd6358ed
F20110320_AACRQD sosa_o_Page_138.tif
973b85bf0a58e6ec88dd5c786c0b3847
fc4cfa2bfb2d1232c34e8bf7306029b851897b28
17339 F20110320_AACQTK sosa_o_Page_005.QC.jpg
d9af548c3f803d1b5d2ed7514f36182a
ce789b25e6268c1ab476d0c48e04bcd542d55314
F20110320_AACRQE sosa_o_Page_139.tif
55744a1e205f79a93d74067d77c474f5
b7c15c55c0ba6b395da4f55fb3eeceb955980a1b
F20110320_AACRQF sosa_o_Page_140.tif
cdbd32b3754f2c079c67d9710bc0f064
13c4244587e61273f7d29c6815d801ce04f0ac53
23910 F20110320_AACQTL sosa_o_Page_020.QC.jpg
faf210b0b786d73ce8918cd4e8940ecd
e04687991f3b9c701f407239945f5545ac861c7a
F20110320_AACRQG sosa_o_Page_141.tif
c1c0e84002497dcc1a8086ae3084fa76
173b1b2484126cdd2a9780febfbdae2a87e133db
19268 F20110320_AACQTM sosa_o_Page_052.pro
99979bf1350d5510b2ebe198f6ea8a9a
6e2ac8bc3e44d7b77eb55198db6025ee2421627d
9266 F20110320_AACSNA sosa_o_Page_132.QC.jpg
73d5445b64eecd2466b18bbb250147b2
097775ad99009f8c42163973c95331af6c4dedf3
11087 F20110320_AACQTN sosa_o_Page_136.QC.jpg
9660cd0a9c064c5c01ce9d6e94b0af8f
cf5deb4c507fec0ff2641a569f7af9a195be70f9
F20110320_AACRQH sosa_o_Page_142.tif
3a6450eb7026380a5e6362f6a80f1a92
487d47c81370a673f829c703ec8f754334d6275d
11354 F20110320_AACSNB sosa_o_Page_164.QC.jpg
1499182142ed53f14224f4b15314af68
75f7ac98ac69bef07beff3cf53e9e3758e2392e4
54323 F20110320_AACQTO sosa_o_Page_028.jpg
fd1d6858cd3b66245833e9ec43fb5450
4b43789f93fffa1f781a801bb921f9ff51dc48ea
F20110320_AACRQI sosa_o_Page_143.tif
c8c3d6fff41af8f59ae31913d788b611
ae85523e28af2e43e71306fd0c8a5a8c22faf921
9945 F20110320_AACSNC sosa_o_Page_183.QC.jpg
c5891edb66d2b6da2ee672d69d1df389
2e1fafbb31b2251f8ad1007d98593209d97f7054
64977 F20110320_AACQTP sosa_o_Page_075.jpg
83f49e571202740f6dc9e457c2472c20
9b1d51d8b7a9006fffd99578e15f680b0d922490
F20110320_AACRQJ sosa_o_Page_144.tif
32d9aeae3fb925cceb9b6aadf72a4973
52ba7160979d47c44f2ee53e6af8220519c5732e
10734 F20110320_AACQTQ sosa_o_Page_128.QC.jpg
b5ad2903b81bfd9b3da4e0acf21526e4
0bbe7a0c3ee330e7c736467256e9f0568abfd3fc
F20110320_AACRQK sosa_o_Page_145.tif
7ce7478aa5961f5c5379743878a04afe
2755d69d852c840dff73c58019ff05c8437c2b02
11254 F20110320_AACSND sosa_o_Page_172.QC.jpg
2455cec681e430692de7ce69ddd51bd8
456bcee06627dcad6fa319af2275b8de38e80315
46890 F20110320_AACQTR sosa_o_Page_125.jpg
f93a8be02864ee44edcc6d5cc1d091fd
deb3983cc11bc59b613f4d65f6f4a5c7c0b066d1
F20110320_AACRQL sosa_o_Page_146.tif
ca7096c6b54ad1f497e08711ce59a3cd
76daa7018ac937752936630cab39a39fdd904d5a
5406 F20110320_AACSNE sosa_o_Page_101thm.jpg
3a6072f594d0452036ae1e4c3120c6a7
4465ccbde2c404ffdcded0e8b49e60cf0fa64d21
1051981 F20110320_AACRDA sosa_o_Page_010.jp2
f5e1b359e2671e32f033afff1db13906
d59330814fbb484dc04682fcb8964421842ca421
2110 F20110320_AACQTS sosa_o_Page_108.txt
a7feb050277a2fa0799ac0e8a332611d
b20e07b75b9c803566e660125dc01999bcc008c2
F20110320_AACRQM sosa_o_Page_147.tif
457d997f2c79bbcab852748aa8bac8e8
40eee15c6bc3fea258084d8463f9ef6ff75e236f
3878 F20110320_AACSNF sosa_o_Page_140thm.jpg
73e3784f9513ab5b2d2dfe58bae5e543
bfa284ce7e8614fe3f27d58b3c6662627f194397
510233 F20110320_AACRDB sosa_o_Page_011.jp2
0bccafa7b116d20bb36efe4fd058799c
8b08a008c2f1578063438571159020485fe55fba
151 F20110320_AACQTT sosa_o_Page_213.txt
a9a95fa4695a4aa19fdf1b5b81155040
c98e118958f2046b6bde52374686ae1720b881f6
F20110320_AACRQN sosa_o_Page_148.tif
cd7d5930424033502c4689ecc06d7007
a9e8eb7130ac34a94ceff234f7e3396b74f728d3
2928 F20110320_AACSNG sosa_o_Page_130thm.jpg
53e1a5ae31f7ef12f48c794c4dcdc38f
0e674fed8e34e27844425c21d1a33e3798917b13
1051980 F20110320_AACRDC sosa_o_Page_012.jp2
660a29d445451f7364971fb3d4d9506c
2af361491b258388b72e3a86b05b991991207031
1051959 F20110320_AACQTU sosa_o_Page_007.jp2
88b5f1630a4001ed94fb58c6fc28e2c0
b8a1c6328b7e3db2222094abd22843130ed5d470
F20110320_AACRQO sosa_o_Page_149.tif
1ede40de7b1f765f90bd12a9d3bead89
5596df9b568af243a820311e0c4c5cbe74c7a7aa
17915 F20110320_AACSNH sosa_o_Page_035.QC.jpg
516cd8f1c4e5b202df5966055ce53a5a
ec45db686453f400b1f251ba96c7b0db459b9557
1051940 F20110320_AACRDD sosa_o_Page_013.jp2
442dc171d6ed9b7f47b225481882b889
232dc7cf7d6b6ef9b88931d011473104e114fe45
2305 F20110320_AACQTV sosa_o_Page_001thm.jpg
be6e64107c692ae395e1e7e076a35c4d
496c9d1f65387cdb5aeccc76017c5a5aa6c4e313
F20110320_AACRQP sosa_o_Page_150.tif
8e42fde2ea6acbf1e908bd4471056f44
388c1152b69a8b515aa08ffe8869fc8853b839e8
F20110320_AACSNI sosa_o_Page_142thm.jpg
42e4819cd6779ef7399990e29931c495
519f1e937464ef05bc4f11657c23b8485360f33b
1051970 F20110320_AACRDE sosa_o_Page_014.jp2
3e309acd9bca3c52267f63f94dd9de7b
33a63c76a2b25d343ac879a72e8440bf3fab3ab7
13356 F20110320_AACQTW sosa_o_Page_203.QC.jpg
e930e402a13bdd76712472b266dc48cd
b34c1d27534d5756fc2e753a96367b847f7ae21b
F20110320_AACRQQ sosa_o_Page_151.tif
a2ca85d42118a7edc56ab7739027f193
0d089fa47c33f64e5ad1a1713d101b3b164d5a30
17326 F20110320_AACSNJ sosa_o_Page_071.QC.jpg
bdf9726af00633a592a5f64512db1e84
fcdb4fb2ba4ef62560737af95fa253a13c84a6bd
82868 F20110320_AACRDF sosa_o_Page_015.jp2
acc1b91f568fc91fd9e65e5151506af1
e79704cfec11a1af86ea395023f2efc4e1a9d0e9
42095 F20110320_AACQTX sosa_o_Page_185.jpg
308c6ed76a8e406ff09450a3967d3c6b
080aee0a154d42a4b32a133a893001f22d170911
F20110320_AACRQR sosa_o_Page_152.tif
218b986b4739e771bb4ddb7df9c914b5
5d9c896c834d702c81f5e7395d66cd2d859fa856
F20110320_AACSNK sosa_o_Page_003thm.jpg
4d5d1bd9a3664c2ed8758b4fdf200091
c9ed1c848398ef4f8cad8657572b7ac845ee5d75
30632 F20110320_AACRDG sosa_o_Page_016.jp2
46f8fb3cbb023dd715029aebf60a1bd4
ddfbef55549150988294a9474d71096b76368110
6515 F20110320_AACQTY sosa_o_Page_109thm.jpg
645057e03f6d2a49e888108ae53c24bf
9d830d948d4d17cd0bb8b1d8d7c3118eb96a207b
5596 F20110320_AACSAA sosa_o_Page_185.pro
4f572e1fe00e8cb8b93196b91d2bba15
09faef643fc459dc5134459bdf7be9c73855838c
F20110320_AACRQS sosa_o_Page_153.tif
8c9ae5d863e5e112e8de7047405b26b7
67fb73a9e9ad4b596e11f0d5448ffe7538aea6e7
3369 F20110320_AACSNL sosa_o_Page_224thm.jpg
398f05803ab867cb5f69de30ec5b2e80
a538660ad9aaeeba766e3b8d271407a2a62f1078
94369 F20110320_AACRDH sosa_o_Page_017.jp2
cf1096cb8ac0e032b9629d20ca5961ef
7e3cc06dc7c2a47596c6b7b91b9f024ed55f4d9e
37759 F20110320_AACQTZ sosa_o_Page_035.pro
6a3be22559d3dce9e540d610af95be9b
bb339936dcc77a91f24460e7b8bec643816d7dc6
1956 F20110320_AACSAB sosa_o_Page_186.pro
a5ef262bdf4660857a739cdd3144f35b
a885a795117cf27caa8da530b6003d5fb02a237a
F20110320_AACRQT sosa_o_Page_154.tif
fa96aa98dd5f5681d76e6e7f41963400
67086dd0f56693624977d30ab21f3f0bf036d213
5245 F20110320_AACSNM sosa_o_Page_039thm.jpg
0ffa861d066dbcc3f5d6d70e8d3a0187
0130a08f105d9f3408f7127d8074f6a476f680c1
109417 F20110320_AACRDI sosa_o_Page_018.jp2
38a142c4f875959da0acb6950c9f389d
07442cabca414be24f6bc7259bba79eccd268d56
4182 F20110320_AACSAC sosa_o_Page_187.pro
511c1f285c68f14fc67693fbc6db2528
47ecfb391d286190bd69026e0013da70c7325ae9
F20110320_AACRQU sosa_o_Page_155.tif
a213ea563a905cc75404c7d4da02af6d
1ff189996851e09c90b6ca7dcdd05ac55ded5fd4
3014 F20110320_AACSNN sosa_o_Page_214thm.jpg
66a77208022f10a582095ec62544191a
4f3bf4c80740357fa32345d3f4271958e3072a46
105373 F20110320_AACRDJ sosa_o_Page_019.jp2
d7463177bb87fd748243e65ca3fd40f9
20a9963edb8b8f910d99c02f6f63a555fb947b5e
4628 F20110320_AACSAD sosa_o_Page_188.pro
a6c8db25c327ace024eb9afa5b9c02a5
b720ed283d571986f0a0742efa6e7896c4a3bd44
F20110320_AACRQV sosa_o_Page_156.tif
f8fe1c74cb2cb845592d8b0297a2a9dd
819161622362f5abe10bf770a8c3c895a48901fa
11792 F20110320_AACSNO sosa_o_Page_216.QC.jpg
86a88643ec40e17094b67e38ece795fa
7e0d5cfe67dd17818e79716818f898ef0b8aee43
108330 F20110320_AACRDK sosa_o_Page_020.jp2
f0c02efabab94d7dbc87acd50ecc1c00
9ff0ed63c748887c7237ac751fd93660e69942d8
1926 F20110320_AACSAE sosa_o_Page_189.pro
7844ebed8b1debdbbabfcaccced31bfa
57b9676c4d6cbfdc06031f8757936c195831f1f0
F20110320_AACRQW sosa_o_Page_157.tif
809e2231d064aa87de2ec71cea10e84f
3a34651202b858e825d0831e689d3f7dc0b60281
2304 F20110320_AACSNP sosa_o_Page_114thm.jpg
9d9e38ea9db3994e12fbe448b1cbd632
222da4b677f78e6ed8a67300537d84ebbe60d24a
117868 F20110320_AACRDL sosa_o_Page_021.jp2
1dcadaeefa80bdbd92e1a1d1e6f9b9be
b0d13408d66aa8ca35880ff7fc4f746b095c578a
5026 F20110320_AACSAF sosa_o_Page_190.pro
9858c58fea24ae389b455fb5e2bb5840
2ad8d7f4636384fff109d17b1a7d7d5a2c6cf547
F20110320_AACRQX sosa_o_Page_158.tif
05589451cae1742ae34b83587596dbdf
39611eb9e50c2aa12c592f56217d91dcf9aaa8d5
5202 F20110320_AACSNQ sosa_o_Page_090thm.jpg
7ddd072ae116c022d484cf739a758768
250bdfd818caf89d526c44324ce184163fc3bae4
59405 F20110320_AACRDM sosa_o_Page_022.jp2
4284f8675a2009b052230e5ee798e41b
dca8e3981535b22ce10c5667133dd3169fde7ab0
35544 F20110320_AACSAG sosa_o_Page_191.pro
72d916c4cafabd3e214f5b4e76f57c24
92efb73a31d08bf9782d502e9cfca093cff2078c
F20110320_AACRQY sosa_o_Page_159.tif
4f66468907dcddf2be6b4d654b22c772
9319dc4f85496857ab53218539ae9b65d895bef1
22519 F20110320_AACSNR sosa_o_Page_112.QC.jpg
eaabedf0a23b90575cdac5ef6841f6bb
d141e0d48f59752a19f8045f6fc87f151a38ee9c
80677 F20110320_AACRDN sosa_o_Page_023.jp2
131fb71172bf4b76d6764aacc432864d
f93cdba0715e48152d7f24dce8f66b66959f74c9
1771 F20110320_AACSAH sosa_o_Page_192.pro
feff664277d4b280cd19c772125d4f7e
5021f7cea99545a56d49e72e0aa638b374cae6ad
F20110320_AACRQZ sosa_o_Page_160.tif
2745c557c1d829f330dbaf5a047f1713
ae544b09041fc09df4dee107d9896e59c9a58881
11622 F20110320_AACSNS sosa_o_Page_209.QC.jpg
05cb6c0133cad4920167053ffc38fed3
dcd74da41240e0362d13a15d141b76f50dd88822
922913 F20110320_AACRDO sosa_o_Page_024.jp2
aadd9a8f89a1a25b49b56d619dae9019
bb0a4d08d5b5d7b8757364c1d5bab585b72d05e9
3894 F20110320_AACSAI sosa_o_Page_193.pro
9cbc8cf8b70f52353942d61643dbac69
93a72489a94b68cf281ae1b3eb9b16bc9714d5b7
2451 F20110320_AACSNT sosa_o_Page_174thm.jpg
2715ad1a797807a37e29c46361b34308
c274167d341c8ed12d8d3cbc2ee47458130359c2
83020 F20110320_AACRDP sosa_o_Page_025.jp2
e0b75db58e28a0ada5cec3ce5a89e67d
8a009f91e3cbba571477c2977d0537edc168d255
4188 F20110320_AACSAJ sosa_o_Page_195.pro
1f73ad8d64d471b828d11524d6b672c5
ed1f10040d23dec1876cfb3af55e8b3607219b16
10759 F20110320_AACSNU sosa_o_Page_191.QC.jpg
0ee0eca78f93280ffcca5a9df24aac47
21b91157483ceda1096dc0dd168bf91ecd6714d3
41590 F20110320_AACQZA sosa_o_Page_124.jpg
03c38ef15529e1580d19f36505cd8412
c3ac95ebdc5642e92e559d3df009a07f59b5e146
93101 F20110320_AACRDQ sosa_o_Page_026.jp2
1b9856c588da8068414e379985a11141
10148a2f3957533b226316ef58137e6e108461dc
22351 F20110320_AACSAK sosa_o_Page_196.pro
1adc62a5bec496cb3fdc65cb5889e07b
a44ebbd3e21bcc007f32d78c70f1d2b2b863a69b
5294 F20110320_AACSNV sosa_o_Page_035thm.jpg
254ab57a34afddb479ef1609965a1a00
8119ab372675ead64c2e11a67ae0e86471ec255d
45315 F20110320_AACQZB sosa_o_Page_126.jpg
5e32c2e87b5a041c0fe09b8695f3768c
52a658238ab543df2f0e79d4eefa7d8a820f01f6
F20110320_AACRDR sosa_o_Page_027.jp2
72ec1cc1dbfb6d2551616febaff5bbfe
ea3b9e99dd4306a516a640b83b8c5d16030cc885
31319 F20110320_AACSAL sosa_o_Page_197.pro
3a23d976a282a2ff9b013876bb092f86
8dbb10d2240e235ce59b85ae791bb1c2fcfbd69a
16065 F20110320_AACSNW sosa_o_Page_032.QC.jpg
41b18c01d89d800d6077bc4c1e3fd766
eee025d1eec284384bba1064ebd99a77568ac109
38990 F20110320_AACQZC sosa_o_Page_127.jpg
ce71a4d9176eb66fc500f20dfeeac067
71e6573215c4e48092c707ac032ca3ad461c85a4
75516 F20110320_AACRDS sosa_o_Page_028.jp2
8c276425daa60c2d4716b5b387bb928c
59f60acdb26fa47dcc2cb93f4e7b5a370273c5be
6931 F20110320_AACSAM sosa_o_Page_198.pro
1dab21f626cec654a89546b1a28d78fa
058c4e9601b647b1056c6f627c7671a3b9b1806e
5728 F20110320_AACSNX sosa_o_Page_091thm.jpg
db2480705c943efb4ee63e419b1ed005
67a0672d931e03af84a174961a2f40560cd65e12
38051 F20110320_AACQZD sosa_o_Page_128.jpg
1fc05ba4fcfd305c469c34616b46472b
f4713bdd34d0436174d3a831fb0b575d49b391fd
1051899 F20110320_AACRDT sosa_o_Page_029.jp2
512c722d03d1625815b2e2d725b22a60
8bd9adc855546a3d37da15f9999eccc3ee34157b
1060 F20110320_AACSAN sosa_o_Page_199.pro
7f9819927d7cc3a0166d7270a6cefdeb
0074dc66ab8cf79c65d103b23fe6a203fc458e27
2707 F20110320_AACSNY sosa_o_Page_132thm.jpg
63073f6929c84bda35c66a31225b133b
29bb9ad6da663550f906f993197bbae8b06c17b0
31384 F20110320_AACQZE sosa_o_Page_129.jpg
ff0ba02fe6250009260fbe6751606a79
9e224b33fa458deaf8d434aff54dcb1158eb0543
84414 F20110320_AACRDU sosa_o_Page_030.jp2
f73ccc3a954348342e6e805133cf22aa
c0971acb89ac65e70f10946e2bbafba7708e3422
1342 F20110320_AACSAO sosa_o_Page_200.pro
982bab591c31ae91b75bb95533b9061b
0d98153d458a0a55cf410cf794b01b72e3ab702f
6065 F20110320_AACSNZ sosa_o_Page_111thm.jpg
e7c77339ced6c050cb73396e1b7e1f49
5e1ad60f8ad99b91cc026876e04c98988d608b24
37472 F20110320_AACQZF sosa_o_Page_131.jpg
4df11185171cf9385dd3a14d17d6f86d
274e8cef01a1538bd8b2c9ab9d418147b5eefd58
543867 F20110320_AACRDV sosa_o_Page_031.jp2
358ed605a6a8e131a34a615bda676d3b
d7dfccc8b46f2d7e433d8855e365091bac3cb284



PAGE 1

DESIGN AND IMPLEMENTATION OF A MODULAR MANIPULATOR ARCHITECTURE By OGNJEN SOSA A THESIS PRESENTED TO THE GRADUATE SCHOOL OF THE UNIVERSITY OF FLOR IDA IN PARTIAL FULLFILMENT OF THE REQUIREMENTS FOR THE DEGREE OF MASTER OF ENGINEERING UNIVERSITY OF FLORIDA 2004

PAGE 2

Copyright 2004 by Ognjen Sosa

PAGE 3

To my mother, father and brother. If a man empties his purse into his hea d, no man can take it away from him. An investment in knowledge always pa ys the best interest. Benjamin Franklin

PAGE 4

ACKNOWLEDGMENTS I would like to express my thanks to my entire committee (Dr. Carl Crane, Dr. John Schueller, and Dr. John Ziegert) for their support of my study. Furthermore, I would like to extend my thanks to Dr. Robert Bicker (of the University of Newcastle upon Tyne) for his insightful ideas and hands-on support. Special thanks go to my advisor Prof. Carl Crane, for his patience with my endeavors; to Mr. Dave Armstrong, our project manager, for always trying to keep me on track; and to Tyndall Airforce Base (contract # F08637-00-C6008) for providing financial support for my studies. I am also grateful to the entire staff of the Center for Intelligent Machines and Robotics (with distinguished contributions from David Kent, Tom Galluzzo, Shannon Ridgeway, and Hyun Kwon Jung). Finally I would like to thank all of my friends and extended family for their moral support and guidance over the last 7 years. However, without the love and patience of those closest to me, this work would have never been accomplished. Thus, my greatest appreciation goes to my mother, Jadranka; my father Darko; and my brother Vedran. Their pride and recognition of my accomplishments had an immense impact on my motivation and provided a strong driving mechanism during my studies. iv

PAGE 5

TABLE OF CONTENTS page ACKNOWLEDGMENTS .................................................................................................iv LIST OF TABLES ...............................................................................................................x LIST OF FIGURES ..........................................................................................................xii ABSTRACT .......................................................................................................................xv CHAPTER 1 INTRODUCTION........................................................................................................1 1.1 Introduction.............................................................................................................1 1.2 Background.............................................................................................................3 1.3 Joint Architecture for Unmanned Systems (JAUS)................................................4 1.3.1 Overview .....................................................................................................4 1.3.2 Standards .....................................................................................................5 1.3.3 System Topology..........................................................................................7 1.3.4 Component Definition..................................................................................9 1.3.5 Message Specification................................................................................10 2 SYSTEM ANALYSIS AND OVERVIEW................................................................13 2.1 Mechanism Overview...........................................................................................14 2.2 Kinematic Analysis of the Puma 762 Robot.........................................................14 2.2.1 Notation......................................................................................................14 2.2.2 Forward and Reverse Position Analysis.....................................................17 2.2.3 Forward and Reverse Velocity Analysis....................................................23 2.2.4 Singularity Determination..........................................................................24 2.3.5 Quaternion Representations........................................................................26 3 PUMA 762 CONTROLLER SYSTEM......................................................................28 3.1 Overview...............................................................................................................28 3.2 Reverse Engineering the Puma 762 Robot...........................................................29 3.2.1 Existing Architecture..................................................................................29 3.2.2 Encoder and Potentiometer Val Interface...................................................30 3.2.3 Amplifier Digital-to-Analog Converter Signals and Control Lines...........31 v

PAGE 6

3.2.4 Safety..........................................................................................................32 3.2.5 Tuning.........................................................................................................32 3.3 Galil DMC-2100 Functionality.............................................................................33 3.3.1 Command Modes........................................................................................33 3.3.2 Theory of Operation...................................................................................34 3.4 Galil C/C++ Application Programming Interface (API)......................................35 4 LOW-LEVEL MANIPULATOR CONTROL COMPONENT.................................37 4.1 Primitive Manipulator Component.......................................................................37 4.1.1 Definition of Coordinate Systems..............................................................37 4.1.1.1 Global coordinate system.................................................................37 4.1.1.2 Vehicle coordinate system...............................................................37 4.1.1.3 Manipulator base coordinate system................................................38 4.1.1.4 End-effector coordinate system........................................................38 4.1.2 Component Function..................................................................................38 4.1.3 Associated Messages..................................................................................39 4.1.4 Component Description..............................................................................39 4.1.5 Input and Output Messages........................................................................40 4.1.5.1 Code 0601h: Set Joint Effort............................................................40 4.1.5.2 Code 2600h: Query Manipulator Specifications..............................41 4.1.5.3 Code 2601h: Query Joint Effort.......................................................41 4.1.5.4 Code 4600h: Report Manipulator Specifications.............................41 4.1.5.5 Code 4601h: Report Joint Effort......................................................41 4.2 Primitive Manipulator Applications to the Puma system.....................................44 5 MANIPULATOR SENSOR COMPONENTS...........................................................45 5.1 Manipulator Joint Position Sensor Component....................................................45 5.1.1 Component Function..................................................................................45 5.1.2 Associated Messages..................................................................................45 5.1.3 Component Description..............................................................................46 5.1.4 Input and Output Messages........................................................................46 5.1.4.1 Code 0602h: Set Joint Positions message........................................46 5.1.4.2 Code 2602h: Query Joint Positions message...................................47 5.1.4.3 Code 4602h: Report Joint Positions message..................................47 5.2 Manipulator Joint Velocity Sensor Component...................................................47 5.2.1 Component Function..................................................................................47 5.2.2 Associated Messages..................................................................................47 5.2.3 Component Description..............................................................................47 5.2.4 Input and Output Messages........................................................................48 5.2.4.1 Code 0603h: Set Joint Velocities message.......................................48 5.2.4.3 Code 4603h: Report Joint Velocities message.................................48 5.3 Manipulator Joint Force/Torque Sensor Component...........................................49 5.3.1 Component Function..................................................................................49 5.3.2 Associated Messages..................................................................................49 5.3.3 Component Description..............................................................................49 vi

PAGE 7

5.3.4 Input and Output Messages........................................................................49 5.3.4.1 Code 2605: Query Joint Force/Torques...........................................49 5.3.4.2 Code 4605h: Report Joint Force/Torques........................................49 5.4 Sensor Component Applications to the Puma System.........................................50 6 MANIPULATOR LOW-LEVEL POSITION AND VELOCITY DRIVER COMPONENTS.........................................................................................................51 6.1 Manipulator Joint Positions Driver Component...................................................51 6.1.1 Component Function..................................................................................51 6.1.2 Associated Messages..................................................................................51 6.1.3 Component Description..............................................................................52 6.2 Manipulator End-Effector Pose Driver Component.............................................52 6.2.1 Component Function..................................................................................52 6.2.2 Associated Messages..................................................................................52 6.2.3 Component Description..............................................................................53 6.2.4 Input and Output Messages........................................................................53 6.2.4.1 Code 0604h: Set Tool Point message...............................................53 6.2.4.2 Code 0605h: Set End-Effector Pose message..................................54 6.2.4.3 Code 2604h: Query Tool Point........................................................54 6.2.4.4 Code 4604h: Report Tool Point.......................................................55 6.3 Manipulator Joint Velocities Driver Component.................................................55 6.3.1 Component Function..................................................................................55 6.3.2 Associated Messages..................................................................................55 6.3.3 Component Description..............................................................................55 6.4 Manipulator End-Effector Velocity State Driver Component..............................56 6.4.1 Component Function..................................................................................56 6.4.2 Associated Messages..................................................................................56 6.4.3 Component Description..............................................................................57 6.4.4 Code 0606h: Set End-Effector Velocity State message.............................57 6.5 Applications of the Low-Level Driver Components to the Puma System...........58 7 MID-LEVEL POSITION AND VELOCITY DRIVER COMPONENTS.................61 7.1 Manipulator Joint Move Driver Component........................................................61 7.1.1 Component Function..................................................................................61 7.1.2 Associated Messages..................................................................................61 7.1.3 Component Description..............................................................................62 7.1.4 Code 0607: Set Joint Motion......................................................................63 7.2 Manipulator End-Effector Discrete Pose Driver Component...............................65 7.2.1 Component Function..................................................................................65 7.2.2 Associated Messages..................................................................................65 7.2.3 Component Description..............................................................................65 7.2.4 Code 0608h: Set End-Effector Path Motion...............................................66 7.3 Applications of the Mid-Level Driver Components to the Puma System............66 vii

PAGE 8

8 OVERVIEW OF SOFTWARE DESIGN...................................................................69 8.1 Overview...............................................................................................................69 8.2 The Interface to the Galil Controller....................................................................70 8.3 Component Level Software Development............................................................72 8.3.1 Primitive Manipulator State Thread...........................................................73 8.3.2 Manipulator Sensor Components...............................................................74 8.3.3 Low-Level Position and Velocity Drivers..................................................75 8.4 Message Level Software Development................................................................76 8.5 Node Level Software Development......................................................................76 8.6 Node Manager and Communicator.......................................................................77 9 TESTING AND RESULTS........................................................................................78 9.1 Subsystem Commander Component Overview....................................................78 9.2 Case 1: Set Joint Effort.........................................................................................79 9.3 Case 2: Set Joint Position.....................................................................................81 9.3.1 The Average Set......................................................................................82 9.3.2 The Low Set............................................................................................84 9.3.3 The High Set...........................................................................................85 9.4 Case 3: Set End-Effector Pose..............................................................................88 9.5 Case 4: Set Joint Velocities..................................................................................89 9.6 Case 5: Set End-Effector Velocity State...............................................................90 9.7 Case 6: Set Joint Motion.......................................................................................91 9.7.1 Set Joint Motion: Pose 1.............................................................................91 9.7.2 Set Joint Motion: Pose 2.............................................................................93 9.7.3 Set Joint Motion: Pose 3.............................................................................94 9.8 Case 7: Set End-Effector Path Motion..................................................................96 10 CONCLUSIONS AND FUTURE WORK.................................................................99 10.1 Conclusions.........................................................................................................99 10.2 Future Work......................................................................................................101 APPENDIX A EQUATIONS FOR A SPHERICAL HEPTAGON.................................................102 B JAUS MANIPULATOR COMPONENTS: SOURCE CODE.................................104 B.1 The GalilInterface.c File and the Corresponding Header GalilInterface.h........104 B.2 The Pm.c File and the Corresponding Header Pm.h..........................................117 B.3 The Mjps.c File and the Corresponding Header Mjps.h....................................130 B.4 The Meepd.c File and the Corresponding Header Meepd.h..............................141 B.5 The Meedpd.c File and the Corresponding Header Meedpd.h..........................159 B.6 The Mc.c File and the Corresponding Header Mc.h..........................................178 B.7 The Main.c File..................................................................................................182 viii

PAGE 9

C SOURCE CODE FOR THE USER DEFINED JAUS MESSAGES.......................200 C.1 The JointEffort.c File and the Corresponding Header JointEffort.h..................200 C.2 The JointPosition.c File and the Corresponding Header JointPosition.h...........202 C.3 The EndEffectorPose.c File...............................................................................204 LIST OF REFERENCES.................................................................................................207 BIOGRAPHICAL SKETCH...........................................................................................209 ix

PAGE 10

LIST OF TABLES Table page 1-1 The JAUS core message set.....................................................................................9 1-2 Segmentation of command codes by class.............................................................10 1-3 Message header data format...................................................................................12 2-1 Mechanical specifications of the Puma 762 robot.................................................14 2-2 Mechanism parameters of the Puma 762 robot......................................................15 2-3 Closed-loop mechanism parameters of the Puma 762 robot.................................19 3-1 Pin connections between Val and Galil ICM-2900 interconnect modules............31 3-2 Controller gain values............................................................................................33 4-1 Set Joint Effort message parameters......................................................................40 4-2 Report Manipulator Specifications parameters......................................................42 5-1 Set Joint Positions message parameters.................................................................46 5-2 Set Joint Velocities message parameters...............................................................48 5-3 Report Joint Force/Torque message parameters....................................................50 6-1 Set Tool Point message parameters.......................................................................54 6-2 Set End-Effector Pose message parameters...........................................................54 6-3 Set End-Effector Velocity State message parameters............................................58 7-1 Set Joint Motion message parameters....................................................................63 7-2 Set End-Effector Path Motion message parameters...............................................67 9-1 The Puma 762 platform specific conversion factors..............................................81 9-2 Values of the K constant and corresponding range of motion parameters............82 x

PAGE 11

9-3 Values of the K constant and average set of motion parameters........................82 9-4 Values of the K constant and low set of motion parameters..............................84 9-5 Values of the K constant and high set of motion parameters.............................86 A-1 Fundamental formulas for a Spherical Heptagon................................................102 A-2 Subsidiary formulas for a Spherical Heptagon Set 1...........................................103 xi

PAGE 12

LIST OF FIGURES Figure page 1-1 Manipulator linkage parameters for link ij..............................................................6 1-2 Manipulator linkage parameters for revolute joint j................................................6 1-3 Manipulator linkage parameters for prismatic joint j..............................................7 1-4 Architecture hierarchy.............................................................................................8 1-5 Architecture hierarchy of the manipulator control node..........................................8 1-6 The JAUS message header detail...........................................................................11 1-7 Bit layout of message properties............................................................................11 2-1 Puma 762, 6-DOF robot manipulator....................................................................13 2-2 Labeled kinematic model of the Puma 762 manipulator.......................................15 2-3 Reverse analysis solution tree for Puma 762 robot................................................22 2-4 Wrist singularity of Puma 762 robot......................................................................25 2-5 Forearm boundary singularity of Puma 762 robot.................................................25 2-6 Forearm interior singularity of Puma 762 robot....................................................26 3-1 Schematic representation entire manipulator system.............................................29 3-2 Arm signal interconnects between Val and ICM-2900 modules...........................30 3-3 BRK-ON-HI connection diagram..........................................................................32 3-4 Functional elements of a motion control system...................................................34 3-5 Initializing the Galil libraries.................................................................................35 3-6 Establishing communications with the Galil Controller........................................35 3-7 Closing the connection to the Galil Controller......................................................35 xii

PAGE 13

3-8 Sending commands to the Galil Controller............................................................36 3-9 Resetting the controller..........................................................................................36 4-1 Joint effort provides basic manipulator mobility...................................................40 5-1 Joint position sensor component............................................................................46 5-2 Joint velocity sensor component............................................................................48 6-1 Manipulator Joint Positions Driver component.....................................................52 6-2 Manipulator End-Effector Pose Driver component...............................................53 6-3 Manipulator Joint Velocities Driver component....................................................56 6-4 Manipulator End-Effector Velocity State Driver component................................57 7-1 Manipulator Joint Move Driver component..........................................................62 7-2 Manipulator End-Effector Discrete Pose Driver component.................................66 8-1 The galilInterface.c logic flow diagram.................................................................70 8-2 Generic component logic flow diagram.................................................................72 8-3 The Primitive Manipulator state thread logic flow diagram..................................73 8-4 Manipulator Joint Position Sensor logic flow diagram..........................................74 8-5 Manipulator End-Effector Pose Driver logic flow diagram..................................75 9-1 Subsystem Commander operator graphical user interface.....................................79 9-2 Primitive Manipulator Screen as it responds to the Set Joint Effort message.......80 9-3 External closed-loop control diagram....................................................................81 9-4 Joint step responses using average motion parameters......................................83 9-5 The MJPD screen as motion is completed under the average set......................83 9-6 The MJPD screen as motion is completed under the low set.............................84 9-7 Joint step responses using low motion parameters.............................................85 9-8 Joint step responses using high motion parameters............................................86 9-9 The MJPD screen as motion is completed under the high set............................87 xiii

PAGE 14

9-10 Subsystem Commander screen showing the final configuration of Puma 762.....87 9-11 The MEEPD screen as it responds to Set End-Effector Pose message..................89 9-12 The MJVD Screen as it responds to Set Joint Velocities message........................90 9-13 The MJMD screen showing component status upon completion of pose 1..........91 9-14 Joint performance plots for motion parameters set in pose 1................................92 9-15 The MJMD screen showing component status upon completion of pose 2..........93 9-16 Joint performance plots for motion parameters set in pose 2................................94 9-17 The MJMD screen showing component status upon completion of pose 3..........95 9-18a Joint performance plots for motion parameters set in pose 3................................95 9-18b Joint performance plots for motion parameters set in pose 3................................96 9-19 The MEEDPD screen after completion of pose 1..................................................97 9-20 The MEEDPD screen after completion of pose 5..................................................97 xiv

PAGE 15

Abstract of Dissertation Presented to the Graduate School of the University of Florida in Partial Fulfillment of the Requirements for the Degree of Master of Engineering DESIGN AND IMPLEMENTATION OF A MODULAR MANIPULATOR ARCHITECTURE By Ognjen Sosa December 2004 Chair: Carl D. Crane, III Major Department: Mechanical and Aerospace Engineering The Joint Architecture for Unmanned Systems (JAUS) has successfully established a well-defined component interface for unmanned mobile systems, but has yet to address the implications of such systems requiring an on-board robot manipulator. This configuration is seen in many applications including planetary exploration, hazardous materials removal, and marine research and is frequently referred to as the vehicle-manipulator system. The purpose of our study was to develop and implement a set of JAUS components that will allow for tele-operational (teleop) and autonomous control of a vehicle-manipulator platform. Teleop control is the control of a system by the direct input of a human or a computer. Autonomous control is a cooperative mode between the vehicle and the manipulator. Testing and implementation of these components was performed on a 6-degree-of-freedom (6-DOF) Puma 762 robot manipulator (Unimation Westinghouse, Danbury, Connecticut) outfitted with a commercially available Galil motion controller (Galil xv

PAGE 16

Motion Control, Inc, Rocklin, California). Successful completion and adequate compatibility to the outlined JAUS performance specifications would ensure the inception of the above mentioned components to the latest version of the documents Reference Architecture. Even though this modular manipulator architecture is suitable for both autonomous and teleop control, testing and results were based solely on the input provided using a graphical user interface on a computer. xvi

PAGE 17

CHAPTER 1 INTRODUCTION 1.1 Introduction In the past decade, significant technological breakthroughs have led to smarter and more-reliable unmanned systems. Reliability and robustness of these systems depend on many factors, most of which are defined in the early stages of design and development. With an increasing interest in this field and tremendous implications to both civilian and military use, there is a growing demand for a set of well-defined standards that could ensure safety, reliability, and interoperability. The Center for Intelligent Machines and Robotics (CIMAR) at the University of Florida has been involved in developing of one such standard, in cooperation with the Department of Defense. The Joint Architecture for Unmanned Systems (JAUS) has successfully established a well-defined component interface for unmanned mobile systems, but has yet to address the implications of such systems requiring an on-board robot manipulator. This configuration is seen in many applications including planetary exploration, hazardous materials removal, and marine research; and is frequently referred to as a vehicle-manipulator system. The purpose of our study is to develop and implement a set of JAUS components that will allow for tele-operational (teleop) and autonomous control of a vehicle-manipulator platform. Teleop control is defined as the control of a system by the direct input of a human or a computer. Autonomous control is defined as a cooperative mode between the vehicle and the manipulator. The components focus on a serial manipulator comprising of any number of prismatic and revolute joints. Parallel 1

PAGE 18

2 mechanisms are not addressed as a part of our study. The components are grouped according to function into the following categories: Low-level manipulator control components: The one component in this category allows for low-level command of the manipulator joint-actuation efforts. This is an open-loop command that could be used in a simple tele-operation scenario. The component in this category is listed as follows: o Primitive manipulator component Manipulator sensor components: These components, when queried, return instantaneous sensor data. Three components are defined that return respectively joint positions, joint velocities, and joint torques or forces. The components in this category are listed as follows: o Manipulator joint position sensor component o Manipulator joint velocity sensor component o Manipulator joint force/torque sensor component Low-level position and velocity driver components: These components take as inputs the desired joint positions, the desired joint velocities, the desired end-effector pose, or the desired end-effector velocity state. Closed-loop control is implied. No path information is specified. The components in this category are listed as follows: o Manipulator joint positions driver component o Manipulator end-effector pose driver component o Manipulator joint velocities driver component o Manipulator end-effector velocity state driver component Mid-level position and velocity driver components: Two components are grouped under this heading. The first takes as input the goal values for each joint parameter at several time values together with motion constraints (i.e. maximum joint velocity, maximum acceleration, and maximum deceleration). The second takes as input a series of end-effector poses at specified time values. Closed-loop control is implied. The components in this category are: o Manipulator Joint Move Driver Component o Manipulator End-Effector Discrete Pose Driver Component.

PAGE 19

3 Testing and implementation of these components is performed on a 6-degree-of-freedom (6-DOF) Puma 762 robot manipulator outfitted with a commercially available Galil motion controller. Successful completion and adequate compatibility to the outlined JAUS performance specifications would ensure the inception of the above-mentioned components to the latest version of the documents Reference Architecture. Even though this modular-manipulator architecture is suitable for both autonomous and teleop control, testing and results are based solely on input provided using a graphical user interface on a computer. 1.2 Background Robot manipulators are used in a wide variety of applications; but usually follow user-defined paths, thus requiring teleop control. In the case of a manipulator aboard an autonomous mobile system, there is a growing demand for the manipulator and the vehicle to be able to cooperate, allowing the system to autonomously complete more-complex tasks (such as sample acquisition, instrument placement, and mobility assistance). This problem was first addressed by NASA in the mid 1990s as the first rover missions to Mars were planned. Technology developed in 1998 [1] allowed robot manipulators aboard the vehicles to autonomously acquire small rock samples (designated by the user) within 1 meter away; and to place instruments on targets less than 5 meters away. These capabilities are accomplished with onboard vision sensors using stereo processing algorithms developed by Matthies [2]. This application showed the autonomous behavior of the manipulator but did not consider other high-level vehicle functions. The algorithms were designed to be portable, extendible, and reusable across many vehicle platforms. Testing was successfully completed on Rocky 7 [3].

PAGE 20

4 Other inhospitable environments (such as oceans) are frequently explored using underwater vehicle-manipulator systems (UVMS). These systems are mostly used for inspection, drilling, mine countermeasures, and surveying [4]. In most applications, UVMS operates as a master-slave configuration, and as such is prone to a few deficiencies. Challenges include correctly modeling the nonlinear hydrodynamic effects of the environment; and improving the performance of motion control encompassing singularity avoidance, obstacle detection, and power optimization [5]. Recent research [6] in the field of UVMS uses a unified force control approach, which combines impedance control with hybrid position/force control by means of fuzzy switching to perform autonomous underwater manipulation. 1.3 Joint Architecture for Unmanned Systems (JAUS) 1.3.1 Overview The Joint Architecture for Unmanned Systems (JAUS) [7] is being developed in conjunction with the Department of Defense and many other members of industry and academia for use in research, development and acquisition of unmanned systems. The current version of the document is divided into three large volumes; the JAUS Domain Model (Vol. I), JAUS Reference Architecture (RA-Vol. II), and JAUS Document Control Plan (Vol. III). The JAUS Working Group was chartered to reduce lifecycle costs, and integration and development time; to provide a framework for technology insertion; to accommodate expansion of existing systems with new capabilities. Volume I defines known and prospective operational requirements of unmanned systems. Volume III defines the process used to identify and track requested changes to accepted JAUS documentation. Components developed as a part of our study affect all three parts of Volume II because it is concerned with aspects of component design. The

PAGE 21

5 main purpose of the Reference Architecture (RA) is to describe all functions and messages that shall be used to design new components. Joint Architecture for Unmanned Systems defines components for all classifications of Unmanned Systems, from teleop to autonomous. As a particular system evolves, the architecture is already in place to support more-advanced capabilities. To meet this requirement, four technical constraints are imposed on JAUS: Platform independence: Since unmanned systems will be based on a variety of missions, no assumptions are made regarding the vehicle platform. Mission isolation: Joint Architecture for Unmanned Systems defines a mission as the ability to gather information about or to alter the state of the environment in which the platform is operating. This allows the developer to construct the system to support a variety of missions. Computer hardware independence: Advances in computer technology over the past couple of decades have seen rapid growth. The JAUS computer hardware constraint was put in place to ensure software and hardware portability as new systems are developed in the future. Technology independence: This constraint is similar to hardware independence, but focuses more on technical approach [7, 8]. In this particular application, the architecture makes no assumption regarding the method used to obtain joint positions. For example different manipulators could be outfitted by different position sensors that include encoders, potentiometers, or rotational variable differential transformers. 1.3.2 Standards The Reference Architecture (RA) document defines the JAUS specific protocol for transmission of messages. Aside from computer code specifications, this section also standardizes mathematical notations. The notation used in this thesis is standard to many popular robotics textbooks; specifically, we use the definitions covered by Crane and Duffy [9]. To standardize the method of referencing manipulator links (or joints), Figures 1-1 through 1-3 illustrate the notation that will be used later in the document. Figure 1-1

PAGE 22

6 shows the parameters used for link ij. Figure 1-2 and Figure 1-3 show additional parameters used to define rotational joints and prismatic joints, respectively. Si Sj aij aij ij Figure 1-1. Manipulator linkage parameters for link ij (Source: Crane C., Duffy J., Kinematic Analysis of Robot Manipulators, Cambridge University Press, 1998, p. 21, Figure 3.2) Link length aij is measured as the perpendicular distance between joint axis i and joint axis j along the unit vector aij. Note that it can have a negative value. Twist angle ij is the angle between Si (unit vector along joint axis i) and Sj (unit vector along joint axis j) measured in a right hand sense about aij. Sj ajk aij Sj j Figure 1-2. Manipulator linkage parameters fot j (Source: Crane C., Duffy r revolute join J., Kinematic Analysis of Robot Manipulators, Cambridge University Press, 1998, p. 22, Figure 3.5)

PAGE 23

7 Constant joint offset S j is measured as the perpendicular distance between link a ij and Link a jk along the unit vector S j Note that it can have a negative value. Variable joint angle j is the angle between a ij (unit vector along link ij) and a jk (unit vector alink jk) measured in a right hand sense ab long out Sj. Sj ajk aij Sj j J., Kinematic Analysis of Robot Manipulators, Cambridge University Press, Figure 1-3. Manipulator linkage parameters for prismatic joint j (Source: Crane C., Duffy 1998, p. 22, Figure 3.6) Variable joint offset Sj is measured as the perpendicular distance between link aij and link ajk along the unit vector Sj. Note that it can have a negative value. Joint angle j is the angle between aij (unit vector along link ij) and ajk (unit vector along link jk) measured in a right hand sense about Sj. 1.3.3 System Topology The Joint Architecture for Unmanned Systems hierarchy [7] is comprised of four elements: system, subsystem, node, and component/instance. Figures 1-4 and 1-5 show the interaction of the four hierarchical elements in general and with respect to the mnipulator extension. A system is defined as a logical grouping of one or more ents. A subsystem is an independent unit consisting of a number of nodes supporting its functional a subsystems allowing for cooperative advantage between the constitu

PAGE 24

8 requir tion, ements and defining an operational unmanned system. The scope of our study willencompass the use of all but the system element, thus in this particular implementasubsystem would correspond to the vehicle hosting the manipulator. Figure 1-4. Architecture hierarchy Figure 1-5. Architectur e hierarchy of the manipulator control node

PAGE 25

9 A node is defined as a d istinct entity, composed of all the hardware and software necesing on a single node. As it can be seen in Figure 1-5, JAUS is a hierarchical system of components with standarterfaces. Each component has ad identification number and performs a single, cohesive function. Eacho accept the core JAUS message set as well as the input and output methe component itself. The JAessage set [7] is shown in Taable 1-1. The JAUS core message set sary to support a well-defined computing capability. In the case of a vehicle-manipulator system, the manipulator control node contains all of the manipulator components whether they are a part of a single or multiple processors working together. Finally, a component or an instance is a cohesive software process [8]. An instance is a single occurrence runn 1.3.4 Component Definition dized in distinct name an component has t ssages specific to US core m ble 1-1. T Code Description 0x01 0x06 0x0D Set component authority Set emergency Create service connection Request component control 0x02 0x03 0x04 0x05 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0E 0x0F 0x10 Shutdown Standby Resume Reset Clear emergency Confirm service connection Activate service connection Suspend service connection Terminate service connection Release component control Confirm component control Reject component control

PAGE 26

10 1.3.5 Message Specification JAUS can be defined as component based message passing architecture. As such, it uses a well defined set of messages that commence actions, exchange information, and cause events to occur. JAUS defines six classes of messages at the component level, each of which will be used in the manipulator component implementation. Table 1-2 lists the message classes [7]. Table 1-2. Segmentation of command codes by class Message Class Offset Range (0000h to FFFFh) CoQuInfEvent Setup NoResUse6000h 7FFFh mmand ery orm 0000h 1FFFh 2000h 3FFFh 4000h 5FFFh Event Notification de Management erved r Defined Message 8000h 9FFFh A000h BFFFh C000h CFFFh D000h FFFFh All messages are composed of a message header and the message data buffer. The header defines the messages destination node, component, instance, subsystem identification and the messages corresponding source information. The header also contains the JAUS command code, the number of bytes in the data buffer that the destination component can expect to receive, as well as the information pertaining to the message properties [8]. The header format is common to all messages as shown in Table 1-3, allowing JAUS to employ an embedded protocol providing specific information on how to handle encoding before and after the transmission. The message header, at a minimum, should be included in all messages. Figure 1-6 and Figure 1-7 show message header detail, header data format and header bit layout, respectively.

PAGE 27

11 Figure 1 The JAUetail (Source: JAUS Working Group, 2004, Joint Architecems (JAUS): Reference ArchitecturSpecification, Version 3.2, Volume II, The Joint Architecture for Unnned s, October 2004, Part 2, p.11, Figure 3.1) -6. S message header d ture for Unmanned Syst e ma System http://www.jauswg.org 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 ReservedReserved VersionRange 0 .. 63 Version 2.0 = 0Version 3.0 or 3.1 = 1Version 3.2 = 23 .. 63 unusedUser Defined Message Flag0 JAUS, 1 ExperimentalService Connection FlagService Connection, 0 -Notack/nakNone, 1 Request ack/nak2 nak response3 ack responseMessage PriorityRange5Default Priority 6Normal Priority Range0 .. 11Safety Critical Range12 .. 15 Figure 1-7. Bit layout of message properties (Source: JAUS Working Group, 2004, Joint Architecture for Unmanned Systems (JAUS): Reference Architecture Specification, Version 3.2, Volume II, The Joint Architecture for Unmanned Systems, http://www.jauswg.org, October 2004, Part 2, p.13, Figure 3.2) The message data buffer contains packed JAUS control data, and each command code has control data used by the system to command component behavior. If a particular system or subsystem contains multiple components passing multiple messages simultaneously, it can potentially result in system delays due to bandwidth overload. In 1 0 0 ..1

PAGE 28

12 order to prevent this, each component and its subsequent command codes must have the ability to pack and unpack (compress) the control data [8]. Each JAUS component and message is well cd in the sections above. The next four ch of manipulator contro of It re. Field Description Type Size (Bytes) onstrained as describe apters strive to provide adequate definitions l components relative to the JAUS framework. Chapter 8 covers the aspects of software design and details of the component and message implementation onto the PumaA 762 robot. Finally, Chapter 9 provides the results in terms of the compatibilitythe designed JAUS components and messages with the constraints outlined by JAUS. also quantifies the performance specifications of the system using the new architectuTable 1-3. Message header data format Field # 1 2 3 4 5 6 7 8 9 10 11 12 Message Properties Command Code Destination Instance ID Destination Component ID Destination Node ID Destination Subsystem ID Source Instance ID Source Component ID Source Node ID Source Subsystem ID Data Control (bytes) Sequence Number Total Bytes Unsigned Short Unsigned Short Byte Byte Byte Byte Byte Byte Byte Byte Unsigned Short Unsigned Short 2 2 1 1 1 1 1 1 1 1 2 2 16

PAGE 29

CHAPTER 2 SYSTEM ANALYSIS AND OVERVIEW Manipulator JAUS components and messages are designed to work on any sermanipulator regardless of the type or the number of joints. As a result, the choice otest platform for implementation purposes is irrelevant. Due to the availability and its operational condition, a 6-DOF Puma 762 (Figure 2-1) robot arm was chosen for ttask. Even though it was originally design ial f the his ed for industrial purposes, this particular o its robustness and reliability. manipulator can be found in many research laboratories due t Figure 2-1. Puma 762, 6-DOF robot manipulator The purpose of this chapter is to summaseful mechanical properties and escribe the mathematics beind rize the udh position and velocity analysis of the Puma 762 robot. 13

PAGE 30

14 The theoretical approach and notations used in the followi ng sections specifically follow defi. 2.1 Mechanism OverviewThe Puma arm can be compared to a human torso, shoulder, and wrist. It consists of members connected by six revolute joints, each defining an axis about which the members rotate. The major joints are equipped with limit-switch-shutoff-syositioned 2 degrees past the software stops providing additional safety. The Puma 762 weighs 590 kg and has a maximum static payload of 20 kg. Table 2-1 lists useful Table 2-1. Mechanical specifications of the Puma 762 robot 2 3 4 5 6 nitions outlined by Crane and Du ffy [9, 10] stems p mechanical specifications of the system. Joint # 1 Software Movement Limits (deg) 320 220 270 532 220 532 Joint Angular Resolution (deg 10-3) 5.0 Encoder Index Resolution; equal to one motor re4.0 2.78 3.57 6.26 6.26 13.4 3.5 4.5 12.5 6.2 13.4 volution (deg) tic Analysis of the Puma 762 Robot 2.2.1 Notation Figures 1-2 and 1-3 show detailedlabel revolute and prismatic joints, respectively. The mechanism parameters listed in Table 2-2 are used to create a kinematic chain shown in Figure 2-2. The proper analysis of a robot manipulator mandates that a coordinate system is attached to each of the ]. Its 2.2 Kinema definitions of vectors and parameters used to bodies. The coordinate system attached to link ij is called the i th coordinate system [9

PAGE 31

15 origin is located at the intersection of vectors iS and ija ; x-direction is along the vector ija and z-direction is along iS Table 2Li -2. Mechanism parameters of the Puma 762 robot nk Length, mm Twist Angle, deg Jnt Offset, mm Joint Angle, deg 012a 9012 1 variable 65023a 023 1902 S 2 variable 270 034a 34 03 S 3 variable 90 045a 45 600 4 S 4 variable 90 056a 56 05 S 5 variable 6 variable Figure 2-2. Labeled kinemThe transformation matrix relating two of these coordinate systems in a three 1000jijijijjijji atic model of the Puma 762 manipulator dimensional space is given by Equation 2-1. 0jijijijjijjijjijSccscssSsscccsascT (2-1)

PAGE 32

16 The inverse of this transformation is very frequently used and is giv en by the follow0jijijijjjijjijjijjsccsacsscTor, and represent the sine ing 44 transformation: jsc 1000ijjijjjiScassc (2-2) where ija represents a link length of a serial manipulat is ic and cosine of i respectively. Furthermore, and represent the sine and cosine of ij sc ij ij Finally, a fixed coordinate system is defined as having its origin coincident with the origin of the first coordinate system and its axis along the vector1 S The transformation that relates the first coordinate system and the fixed is given in Equation 2-3. 1000010000sincos111T (2General expressions determining the directions of joint vectors with respect to the first coordinate system are given in Equations 2-4 and 2-5. 00cossin11F3) 1011S 122sS 010 12c 2Z2,...,2,1nnZ12c2,...,1,1mnW 23YS 2,...,2,1nnnYS (2-4) 00121a 122ss2,...,1,1mnUwhere ta 21X2,...,2,11nnX 122231csa *2,...,1,11mnnmUa (2-5) he definitions of the X, Y, Z and W, U*, U are presented in Appendix A. Using the coordinate transformation given in Eqution 2-3 and expressions from Equations 2-4

PAGE 33

17 and 2-5, direction vectors can be obtained in terms of the fixed coordinate system and are shown in Equ ations 2-6 and 2-7. iFiFSTS 11ijFijFaTa (2-6) 11 (2-7) 2.2.2 orThe most basic problem in the analysis of serial manipulators is to determine the position and orientation of the end-effector for a specified set of joint angles. Following the method outlinines the transformation that relates the end-effector coordinate system to the fixed coordinate system. In the case of a 6-axis rfollow: (2-8) can be found fro (2-9) All of the terms in Equationmechanism s that are listed in Table 2-2 for the Puma 762 manipulator. A mo complicated problem arises when one is trying to determsible joint-angle configurations for a specific end-effector position and orientation. This on-tf is e kinematic analysis and begins by closing the link-loop with a hypothetical member. For a 6-R (6-revolute-joint) manipulator such as the Puma 762, this Fward and Reverse Position Analysis ed by Crane and Duffy [9], the first step to the solution determ obot, the transformation in question is obtained as s TTTTTTTFF564534231216 The coordinates of the end-effector in the fixed coordinate system m Equation 2-9. toolFtoolFPTP66 2-8, are obtained from known parameter re ine all pos n rivial solution is clearly more difficult, however due to a favorable geometry omost of the industrial manipulators, much of the analysis is simplified. The approach referred to as the revers

PAGE 34

18 results in a 1-degree-of-freedom 7-R spatial mechanism with th e angle 7 known [9]. Detailed derivation of the solution to this problem is provided by Crane and Duffy [thus only the final equations used to obtain the values of the 6-closethe-loop paramare shown below. The twist angle 71 9], -eters can be calculated using Equations 2-10 and 2-1 1771SScFF 1. (2-10) 1 1771SSSsFFF Next, joint angle (2-11) 7 is found using Equations 2-12 and 2-13. 2) 71677 aacFF (2-1 7171677aaasFFF (2-13) eter 1 is defined as the angle between the vector 71a Param and the x-axis of the fixed coordinate system, thus using a similar approach as outlined above, this angle is obtained using Equations 2-14 and 2-15. 01 01sinSaFF 0cos711aF (2-14) 1711 0 (2-15) Finally, the values of7S, 71aand 1Scan be obtained and are given by Equations 2-16, 2-17, and 2-18 respectively. 717sF 7161aPSSotigFF 2-16) (

PAGE 35

19 7171671sSSPaFForigF 2-17) ( 711sSFFF 7176aSPorig (18) Table 2-3. Closed-loop mechanism parameterLink Length, mm Twist Angle, deg Jnt Offset, mm Joint Angle, deg 2-Table 2-3 shows the mechanism parameters for the newly formed closed-loop spatial mechanism. s of the Puma 762 robot 012a 9012 ..1LCS 1 variable 6 5023a 023 1902 S 2 variable 34 0 a 270 34 03 S 3 variable 90 045a 45 6004 S 4 variable 90 056a 56 05 S 5 variable 067 9067 a 1296 S 6 variable ..71LCa ..71LC ..7LCS 7 C.L. Once all of the closed-loop parameters have been calculated, the vector-loop equation for the closed-loop Puma mechanism can be constructed and is represented using Equations 2-19: 071717171664423232211 Exndingthese vctors and exp aaSSSSSSaaSSSS (2-19) pa eressing them in terms of the Set 14 of the table of directn cosines fo00010121711771656714223212UcsaZYSZYSZYSsaSc(2-20) Further simplification is obtained by using subsidiary spatial and polar-sine, sine-cosine, and cosine laws from Equation 2-21. ior the spatial heptagon (Appendix A) results in: 000117156712121cXXXcsS 121715671

PAGE 36

20 325671XXThe representation in Equation 2-20 yields three equations. Further substitution of th 3*3256715671ZXZY (2-21) e knowte n rms and simplification of the Z component of the equation yields Equation 2-22. 021717611 7776 SsaXSc (2-22) This is an equation of the form sSYS 011 DBsAc where A, B, and D are constants. The solution provides two possible values labeled as a1 and b1 Corresponding values of the ated as )(11 aand)(11 b. angle 1 can be calcul Substituting the known values into the X and Y components of the Equatio 2-20 7117716324223 nyields Equations 2-23 and 2-24: 01 c (2-23) (2-24) Moving the terms that do not contain the unknown variables and expanding the direction-cosines results in Equations 2-25 and 2-26: (2-25) (2-26) wherca aXSXSXSca 017716*32432342231YSYSXSVasaS AsSca324223BcSsa324223 e171 17716XSXSA 177161YSYSSB while and represent sine and cosine of 32s 32c )(32 respectively. Squaring both sides of both Equations 2-25 and 2-26 and then adding them yields Equation 2-27. (2-27) 22322322423242232BAsccsSaSa

PAGE 37

21 33 s where 322322322 insinssccs Substituting this term back into t he Equation 2-27 results in Equation 2-28. 0222242234233BASaSas (This equation contains only 3 2-28) as the unknown. For each value of1 2 corresp onding values o f3 are determined. Regrouping Equations 2-25 and 2-26 yields the following relationships: ssSac AcS 34234232 (2-29) BcScsSas ]34234232Equations 2-29 and 2-30 provide a system (2-30) of 2 equations and 2 unknowns. Thus a unique value of 2 is so lved for each corresponding set of 1 and 3 The next step is to solve for 5 usg inEquation 2-31: 57123ZZ (2-31) With corresponding substitutions and expansions, this yields two values of 5 for each set of7 1 3 and 5 as follows: 71235Zc (2-32) Solution of 4 isand 2) (2-34) wher obtained from a system of 2 subsidiary spherical Equations 2-33 -34. 712354XX (2-337123*54YX e 454554sYcXX and 4545*54cYsXX Final form of the solution shown in

PAGE 38

22 Equations 2-35 will result in a uniq ue value of 4 for each of the 8 sets of corresponding angle values. 54sXc ( 71232-35) 57123sY The solution of the last remaining joint angle 6 4s (2-36) is obtained using the followitwo fundamental spherical sine and sine-cosine laws defined by Equations 2-37 a ng nd 2-38. 2-37) (2-38) 65643217ssX ( csY Since 65643217 56 432176Xs and 432176Yc is known, the equations reduce to The final solution tree for the Puma 762 robot is shown below in Figure 2-3. Figure 2-3. Reverse analysis solution tree for Puma 762 robot

PAGE 39

23 2.2.3 Forward and Reverse Velocity Analysis Similar to the forward position analysis, the velocity analysis assumes that the angular velocities of each of the joints are known, and as a result it determines the velocity state of the last link of the manipulator as shown in Equations 2-39. 6565545443433232212160606060606060SSSSSSSSvOjiSare the unitized line coordinates for each of the joint-axes. From Duffy and (2-39) where Crane[10], this equation can be rewritten in the matrix format yielding Equation 2-40. JS v60 606060 (2-40) atrix, is the 6 where J, the Jacobian m 6 matrix formed from the unitized screw 655443322110OOOOOOSSSSSSSSSSSSSS coordinates, which can be written using Equation 2-41. 655443322110 655443322110SSSSJ (2-41) where is the vector of joint velocit ies defined by Equation 2-42. (2-42) Assuming that the position analysis is completed, all members of the Jacobian are known, thus the forward velocity analysis is completed using Equation 2-39. Just as was the case with the position analysis, the reverse velocity problem becomes more complicated and individual joint velocities can be determined by simple arithmetic yielding Equation 2-43. (2-43) T655443322110 60601SJ

PAGE 40

24 It is possible that the manipulator is driven to a configuration in which the Jacobian matrix is singular and the inverse cannot be obtained [10]. Such configurations are the pic of the following section. 2.2.4 h such conditions occur. Such configurations will cause joint velocities to rapidly increase, and there will be no feasible solutions of the manipulator to move in a desired direction. Many computational methods are developed to optimize singularity avoidance. For practical purposes, the line coordinates of the Jacobian matrix shown in Equation 2-44 are expressed in terms of the third coordinate system. This is arithmetically the most favorable selection and allows for easy identification of singular configurations. (2-44) The determinant of this Jacobian yields Equation 2-45. to Singularity Determination A robot is defined to be in a singular configuration when the determinant of the Jacobian is equal to 0. Duffy and Crane [10] also define this special configuration when 1or more of the joint-axis lines as defined in the previous section become linearly dependent to the others. This section identifies those configurations in whic 45444223323322454443233224545324543200000000001100100000csSsScacasSssScSsacSssccccsssJ 32422335423det sScacsSaJ (2-45) The left side of the Equation 2-45 equals zero if: Wrist singularity (s5 = 0): In this case vectors and become collinear. 4S 6S

PAGE 41

25 Forearm boundary singularity [11] (c3 = 0): In this case vectors and are parallel and the elbow is fully extended. Forearm interior singularity [11] ([-a23c2+S4s2+3]=0): The interpretation of this term is rather complicated, but iat the singularity occurs when vector is very close to 2S 23a t can be said th the 1Svector. 6S Figures 2-4, 2-5, and 2-6 show the wrist, forearm interior, and boundary singularities, respectively. Figure 2-4. Wrist singularity of Puma 762 robot Figure 2-5. Forearm boundary singularity of Puma 762 robot

PAGE 42

26 Figure 2-6. Forearm interior s ingularity of Puma 762 robot erest he The above 3 configurations require special attention and will be a matter of intin the upcoming chapters. 2.3.5 Quaternion Representations Crane and Duffy [9] define a real quaternion as a set of 4 real numbers written in definite order as shown in Equation 2-46. ),,,(cbadq (2-46) Chapter 6 will use quaternion representation for the position and orientation of tend-effector. For that reason, this section defines those aspects of the quaternion algebra.The unit quaternion q is defined in Equation 2-47. ksjsisqzyx sin)cos( (2-47)The equivalent rotation matrix is defined by Crane and Duffy [9] as the following: 2cos1(2sin)2cos1(2sin)2cos1(2cos1(2cos)2cos1(2sin)2cos1(sin)2cos1(2sin)2cos1(2cos)2cos1(22zyyzyxyzxzyxxjssssssssssssssssssssR 2cos)2sin_)22zxzyyzxxis

PAGE 43

27 In summary, this chapter provides all the nec essary analysis sufficient for tasks mand 7. ated by the proposed JAUS components. Equations derived in Sections 2.3.3 and 2.3.4 will become essential for component development outlined in Chapters 5, 6 andDetailed information on theory covered in this chapter and more advanced robot manipulator analysis is presented by Crane and Duffy [9] and Duffy [10].

PAGE 44

CHAP TER 3PUMA 762 CONTROLLER SYSTEM hapter resses the capa of an onboard controller system and ties tquients outlined bAUS Cmpliance Specification (JCS) dfore mdular architectulementation, the platform was in operational c allowing user to controtion of the individual joints using commercially available software. Such conditions required no additional changes to the crdware configuration. For cetion pur chapter provides a brief sf modifions to the origem configuration. Further emphasis is put on the functions available in the C/Cicationterface (API) and its u implementation. verviewve to thea 762 is the Vh levanguage. Aside from being a sophisticated development toplete control system. Joint Anstems standard currently dictates the use of a C progr This c add bilities hem into t he re rem y the J o ocument. Be o re imp ondition, the l the mo urrent ha ompl poses, this ummary o cati inal syst ++ Appl Programming In se in this 3.1 O Nati Pum al II hig el programming l ol, Val II is a com rchitecture for U manned Sy amming language for development purposes. Due to some deficiencies in the olderVAL controller and lack of an adequate API, the Puma was outfitted with a Galil DMC-2100 motion controller. Unfortunately, the use of a commercially available motion controller dictates operational constraints. The JCS document mentioned above defines three levels of interoperability. This implementation satisfies inter-nodal, or level II compliance, supporting interoperation between nodes [12]. Figure 3-1 shows the simplest 28

PAGE 45

29 representation of the overall system. Connectivity between Val and Galil is addressed in the following section. Figure 3-1. Schematic representation entire manipulator system 3.2 Reverse Engineering the Puma 762 Robot microcomputer that d program control of the robot using the native pnguJoipoal-integral-derivative (PID) control is provided by dedicated digital axis serardsing an Intel 8748 microcontroller) running at 1 kHz. The 12-bit digital-to-analog converter (DAC) output of the digital servo-boards is input to the individual PWM power aajor PAs are located on the rear-door of the controller, while three minor ones are located in the control rack. As mentiotor e end of the motor shaft are Hardware interfacing between the Val and Galil controllers was done by Prof. Robert Bicker of the University of Newcastle upon Tyne in June of 2001. This section summarizes all the necessary modifications made to effectively outfit the system with anewer Galil controller while maintaining some of the basic Val functionality. 3.2.1 Existing Architecture Val II is a hierarchical controller based on the LSI 11-73 provides a high-level trajectory an rogramming la age. nt pro rtion vo-bo s (u mplifiers (PAs). Three m oned earlier, each joint of the robot is driven by a direct-current (DC) servo-mwith integral electro-magnetic brake. Mounted directly on th

PAGE 46

30 an incremental encoder (25eter providing position feedbhen nector located in the J56 slot directs encoder quadrature (A & Q), in ure 0 lines) and a geared servo-potentiom ack. The initial calibration process requires each joint to be driven through a small angle, sufficient to locate the nearest encoder index. This non-absolute position is tcompared to the values stored in a look-up table via the corresponding analog potentiometer reading [13]. 3.2.2 Encoder and Potentiometer Val Interface The board edge con dex and potentiometer outputs to respective digital servo-boards (J45-50) via aJ-bus backplane. Wire-wrap terminals are provided at the rear of the backplane only onthe J56, and wire-wrap connections are made to a 50-way IDC wire-wrap connector. A 50-way ribbon cable runs to a break-out box, and then single core cables are bundled tothe respective connections on the Galil ICM-2900 modules, designated 1 and 2 (Fig3-2). Figure 3-2. Arm signal i nterconnects between Val and ICM-2900 modules

PAGE 47

31 3.2Amplifier Digital-to-An .3 alog Converter Signals and Control Lines l ines are also present. Table 3-1 shows the pin connections between the Val controller and Galils interconnect modules. Table 3-1. Pin connections between Val and Galil ICM-2900 interconnect modules VAL Signal 34/50 way pin Wire color ICM-2900 The DAC outputs on the Val controller for each axis are derived by the digitaservo boards. The DAC (+/-) signals are presented to a 34-way IDC connector on the control backplane, and are linked to the power amplifier backplane via a 34-way ribbon cable (J103 => J79). Additional control l _teach-error 1 white _stop 2 white 1/14/INPUT1 Hnd-sig1 3 white Hnd-sig2 4 white Brk-on-hi 5 white E-sto_ox-inhibit 8 white 1/14/INPUT3 DAC-1 12 blue 1/3/GND blue 1/4/GND DAC+3 15 orange 1/1/MOCMDZ DAC-3 DACDAC-4 18 blue 1/1/GND DAC+6 21 orange 1/4/MOCMDY _Encoder fault 34 white 1/14/INPUT2 Deadman-sw 6 white p b 7 white Servo E-stop 9 white DAC+1 11 orange 1/3/MOCMDX DAC+2 13 orange 1/4/MOCMDY DAC-2 14 16 blue 1/1/GND +4 17 orange 1/2/MOCMDW DAC+5 19 orange 2/3/MOCMDX DAC-5 20 blue 2/3/GND DAC-6 22 blue 1/4/GND Remote +ve 33 white

PAGE 48

32 In order to retai n Val safety functionality, all control lines are connected straight 0-34 interconnection cabling. Stop, Encoder-fault and Ox-inhibit pectively of the ICM module 1. The amplifier ed by a single control line BRK-ON-HI (brake on high). This is a TTL controller, which is pulled low on VAL being initiao drive this line low v through via the 34-50-5 signals are linked to digital inputs 1-3, res enable signal is provid open-collector output from the LSI-11 lized. A 7406 hex-inverter (with open-collector outputs) is used t ia the Galil digital output 1 as is shown in Figure 3-3. F igure 3-3. BRK-ON-HI connection diagram using the Galil commmote ON/OFF switch box (e arm essential to apply either the SH or orOff) Galil commands prior to powering up the arm to prevent any ck mode (AFn=1). Step response tests ere carried out using the Servo-Design Kit software. Small and large steps (100 and 3.2.4 Safety fiers are enabled by pulling-low BRK-ON-HI The power ampli and OP1 (OutPut 1 set). Arm power is applied using the re if motion control set to REMOTE) or via the front panel (if set to LOCAL). Th will attempt to go into closed loop at this time, and it is MO (ServoHere, Mot run-away. 3.2.5 Tuning Axis tuning was carried out sequentially, initially in the digital feedback mode (AFn=0), and subsequently in the analog feedba w

PAGE 49

33 1000 counts using encoder feedback) as well as manual tuning and auto-tuning features were used, although manual tuning was preferred. Proportional (KPn), Derivative (KDn) and Integral action gains (KIn) are set as shown in Table 3-2. Table 3-2. CoAxi ntroller gain values s/Joint # KP KD KI A/1 80 500 1 B/2 60 500 1 C/3 100 200 1 D/4 100 500 1 E/5 100 500 1 F/6 100 500 1 Once adequately tendly computer interf res including high-speed communications, non-volatile d improved cabling for noise reduction. It is desigctor ommand motion using the Galil controller. The requirf the lute or relative position and selects the values of maxim uned, this configuration provides a user fri ace and allows for simple control of the manipulator. 3.3 Galil DMC-2100 Functionality DMC-2100 is one of Galils highest performance stand-alone controllers outfittedwith many enhanced featu program memory, faster encoder speeds an ned to solve complex problems involving jogging, point-to-point positioning, vepositioning, electronic gearing, multiple move sequences, and contouring [14]. 3.3.1 Command Modes There are several of ways to c ements of this project are simple and only take advantage of two motion modes. Independent axis positioning generates an independent trajectory profile for each o axes. The user commands either abso um speed, acceleration and deceleration. The second, and more relevant, is independent jogging. This mode is very flexible and allows the user to change all of the

PAGE 50

34 above-mentioned values during motion and specify the direction. The controller operatesas a closed-loop position con troller while in the jog mode. It converts the velocity profile et is generated with every sample period [14]. ee ming. servo system. On the lowest level, the contro into a position trajectory and a new position targ 3.3.2 Theory of Operation This section only offers a brief overview of the operation of a motion control system. Detailed information can be found in many control theory books and controller manuals. The operation of a system (such as the DMC-2100) could be divided in thrlevels as follows: Closing the loop Motion profiling Motion program Figure 3-4 shows the elements of the ller ensures that the motor follows the commanded position. This is accomplishedusing a feedback provided by a sensor. In the case of the Puma system, position feedback is provided by an incremental encoder. Figure 3-4. Functional elemen ts of a motion control system Most of the commercially available motion controllers use trajectory generators. This function describes where the motor should be at every sampling period. Finally, at

PAGE 51

35 the highest level of control, the program describes the tasks such as desired distances orspeed [14]. A detailed mathematical model of each of the various components presented below can be found in [14]. 3.4 Galil C/C++ Application Programming Interface (API) Engineers at Galil Motion Control Inc. have developed a set of API function calls evelopment on various computer platforms. These calls provires is section lists only the calls and es used in our study (Figure 3-5 through 3-9). Additional function ned in the interface document [15]. extern LONG FAR GALILCALL DMCInitLibrary(void); that can be used in software d de an effective link between the Galil machine code and standard C or C++ programming languages. Manipulator JAUS implementation more specifically requilibraries running on the Linux operating system. Th corresponding prototyp calls and installation procedures are outli Function Prototype: Function Description: This function must be called prior to using the library. Figure 3-5. Initializing the Galil libraries Function Prototype: extern LONG FAR GALILCALL DMCOpen(PCONTROLLERINFO pcontrollerinfo, PHANDLE phdmc); Function Description: The handle to the controller is returned in the argument phdmc. Pcontrollerinfo: Structure holding information about the controller. Phdmc: Buffer to recelive the to the Galil controller to be used in all subsequcalls. ent Figure 3-6. Establishing communications with the Galil Controller Function Prototype: extern LONG FAR GALILCALL DMCClose(HANDLEDMC hdmc); Function Description: This function closes the Ethernet connection to the controller. Figure 3-7. Closing the connection to the Galil Controller

PAGE 52

36 Function Prototype: pszCommand, PCHAR pchResponse, ULONG cbResponse); extern LONG FAR GALILCALL DMCCommand(HANDLEDMC hdmc, PSZ Function Description: pchResponse: Buffer receiving the response data. This function is used to send commands to the controller. pszCommand: The command send to the controller in the machine language. cbResponse: Length of the buffer. Figure 3-8. Sending commands to the Galil Controller extern LONG FAR GALILCALL DMCReset(HANDLEMC hdmc); Function Prototype: Function Description: This f unction is used to reset the controller. Figur e 3-9. Resetting the controller The use of these calls will become more apparent in Chapter 9 as the aspects of software design on a node level are introduced.

PAGE 53

CHAPTER 4 COMPONENT s the latest Reference Architecture Document. The chapt9) allows for low-level command f the manipulator joint efforts. This is an open-loop command that could be used in a simple tele-operated scenario. This component is currently in version 3.2 of the JAUS Reference Architecture. 4.1.1 Definition of Coordinate Systems A variety of platform configurations on which manipulator components can be implemented might require data to be interpreted in terms of different coordinate systems either to adequately define the geometry or allow for easier task completion. 4.1.1.1 Global coordinate system Points that are defined in this coordinate system are defined in units of longitude, latitude, and elevation. The x-axis points North and the z-axis points downward. 4.1.1.2 Vehicle coordinate system This coordinate system is attached to the vehicle frame. The x-axis points in the forward direction and the z-axis points downward. The y-axis is defined so as to have a LOW-LEVEL MANIPULATOR CONTROL This chapter defines the Primitive Manipulator (PM) component in terms of the JAUS architecture. For the purposes of easy insertion, the format used to present the information in the first section of this and the upcoming chapters, follow format outlined in version 3.2 of the JAUS er further details the application of the PM to the Puma system. 4.1 Primitive Manipulator Component The one component in this category (JAUS ID# 4 o 37

PAGE 54

38 right-handed coordinate system (i.e. i j = k where i, j, an d k are unit vectors along the x, y, and z coordinate axes). 4.1. Mabase coate systemIn most cases, this coordinate system is attached to e the vehicle coordinate system. The origin is loct the inter line along the first joint ad the line first12. The z-axis is along S1 and the direction of the x-axis is user defined, but fixed with respect to the vehicle frame. Since the nipulaordinand the vehicle coordinate system are both attached to the vehicle base, the transformation matrix that d position and orientaese two csystee cohere one manipulator may be attached to the end of another mation matrix would vary. 4.1.1.4 End-effector coordinate system This coordinate system is attached to the last link ofr. The origin is located at the point that is a distance Sn (S6 for a ng the last joint axr a manipulator) from thealong the last joint axis and the preceding link axis (S6 and a56 for a six axis manipulator). The Z axis is along the Sn vector. The direction of the x-axis is user defined, but of course must be perpendicular to the z-axis. The y-axis is de. Note that the distance Sn is returned by the Primitive Manthe Report Manipulator Specifications Message. 4.1.2 Component Function This component is concerned only with the remote operation (open-loop control) of a single manipulator system. The manipulator may or ma not have joint measurement 1.3 nipulator ordin the vehicle base just lik ated a section of the xis, S 1 an along the link, a ma tor base co te system a escribes the relative tion of th oordinate ms will b nstant. In somea cases w nipulator, this transform the serial manipulato six axis manipulator) alo intersection of the lines is vector (S 6 fo six axis fined by the right-hand rule ipulator component via y

PAGE 55

39 sensors that would pro vide joint position and joint velocity information. Without joint measuremopen only oint momands to the manipulatnent use aint angle or velocity feedback from the malatoeivessired percentage of mch joi an 4.1.3 Associated Messages The PM accepts the core input and output ssages listed in Table 1-1. The set of user defined input and output ms specifihis coelow. Detailed definitions are providtion 4 et Jo Query Joint Efforts epopetions po mriptioThis the lonterface to a maniis in many respects similar to the Primitiver component for mobility of the platform. When q the will r des of thcification persf motion, and axes velocity limits. The notations used to describe these data are documany popular text books on robotics and were previously presented in Chapter 2. The mechanism specification parameters as reported y the Report Manipulator Specifications Message consist of the number of joints, the pe of each joint (either revolute or prismatic), the link description parameters for each nk (link length and twist angle, Figures 1-1 to 1-3), the constant joint parameter value ent sensors, the rator ca send j tion efforts as com or. This compo t does no ny jo nipu r. It only rec the de aximum joint effort for ea nt as input. mec to t essage mponent are listed b ed in Sec .2.6. S int Effort Query Manipulator Specifications R rt Manipulator S cifica Re rt Joint Efforts 4.1.4 Co ponent Desc n component is w-level i Drive pulator arm and ueried, component eply with a cription e manipulators spe aramet axes range o ented in m b ty li

PAGE 56

40 (offset for a rhapter 1, Figur evolute joint, Figure 1-2), and joint angle for a prismatic joint (C e 1-3). The minimum and maximum allowable value for each joint and the maximum velocity for each joint follow this information. Motion of the arm is accomplished via the Set Joint Effort message (Figure 4-1). In this message, each actuator is commanded to move with a percentage of maximum effort. Primitive Manipulator Commanded joint effort This section provides detailed specifications of user defined messages. It covers data types used for each of the parameters, as well as the upper and lower lim Actuator commandsFigure 4-1. Joint effort provides basic manipulator mobility 4.1.5 Input and Output Messages its. This information becomes very important for software development purposes and is further covered in Chapter 8. 4.1.5.1 Code 0601h: Set Joint Effort Field #1 in Table 4-1 indicates the number of joint effort commands contained in this message. This message sets the desired joint effort values. Table 4-1. Set Joint Effort message parameters Field # Name Type Units Interpretation 1 Num Joints Byte N/A 1 ... 255; 0 is Reserved 2 Joint 1 effort Short int Percent Scaled integer Lower Limit = -100% Upper Limit = +100% 3 ... n n + 1 Joint n effort Short int Percent see field 2

PAGE 57

41 4.1.5.2 Code 2600h: Query Manipulator Specifications This message shall cause the Primitive Manipulator component to reply to the requestor with a Code 4600h: Report Manipulator Specifications message. 4.1.5.3 Code 2601h: Query Joint Effort This message shall cause the receiving component to reply to the requestor with a Code 4601h: Report Joint Efforts message. 4.1.5.4 Code 4600h: Report Manipulator Specifications This message provides the specifications of the manipulator including the number of joints, the link lengths, twist angles, offset or joint angles, minimum and maximum value for each joint, and minimum and maximum speed for each joint. 4.1.5.5 Code 4601h: Report Joint Effort This message provides the receiver with the current values of the commanded joint effort. The message data and mapping of the presence vector for the Report Joint Efforts message are identical to Code 0601h: Set Joint Effort.

PAGE 58

42 Table 4-2. Report Manipulator S pecifications parameters Field # Name Type Units Interpretation 1 Number of Joints Byte N/A 1 255 0 is Reserved For a value of n the messadata area size in bytes is: ge (36 + 13(n-1)) bytes. 2 Joint n Type Byte N/A Joint type of the last joint of the manipulator. 1 = revolute, 2 = prismatic 3 Joint n Offset/Joint Angle rad ommPrismatic joint, 10-3 radians. Revolute joint, mm 4 Joint n Min value 5 Joint n Unsigned Short rad or mm Prismatic joint, mm Revolute joint, value 10-3 radians. Joint n Unsigned rad/s or mm/s Prismatic joint, mm/sec Revolute joint, value 10-3 radians/sec. 7 coordinate Integer m manipulator coordinate Scaled integer: Lower limit = -30 m Upper limit = +30 m 8 coordinate sys. y Integer m y coordinate of origin of system measured with respect to vehicle coordinate system 9 lator sys. z Integer m z coordinate of origin of coordinate measured with respect ordinate system 10 d component of unit quaternion q Integer N/A nes the ulator ured cle it = +1 Unsigned Short r value Max value 6 Max velocity Short manipulator sys. x x coordinate of origin of system measured with respect to vehicle coordinate system manipulator manipulator coordinate manipu coordinate manipulator systemto vehicle co quaternion q defi orientation of the manip coordinate system mease vehi with respect to th coordinate system Scaled integer: Lower limit = -1 Upper lim

PAGE 59

43 Table 4-2. Continued Field # Name Type Units Interpretation 12 see field 10 b component of unit quaternion q Integer N/A 13 /A see field 10 1 = revolute, 2 = prismatic 14Link Length Short Twist Angle Short value 10-3 radians 14c 1 Offset/Joint AnglUnsigned rad or Prismatic joint, value 10-3 radians. m 14eMax value Unsigned rad or Prismatic joint, mm 14f Short mm/s Prismatic joint, mm/sec Revolute joint, value 10-3 radians/sec. n-1 )b Link a(n-1)n Twist Angle Unsigned Short rad Twist Angle value 10-3 radians (n-1)c Offset/Joint Unsigned Short rad or mm Prismatic joint, value 10-3 radians. Revolute joint, mm (n-1mm Prismatic joint, mm Revolute joint, value 10-3 radians. (n-1)f rad/s Revolute joint, c component of Integer N unit quaternion q 14 Joint 1 Type Byte N/A a Link a 12 Unsigned mm Link Length 14b Link a 12 Unsigned rad Twist Angle Joint e Short mm Revolute joint, m 14d Joint 1 Min value Joint 1 Short mm Revolute joint, value 10 -3 radians. Joint 1 Unsigned rad/s or Max velocity Joint (n-1) Type Byte N/A 1 = revolute, 2 = prismatic (n-1)a Link a (n-1)n Link Length Unsigned Short mm Link Length (n-1 Joint (n-1) Angle )d Joint (n-1) Min value Unsigned rad or (n-1)e Joint (n-1) Max value Short Joint (n-1) Max velocity Unsigned Short Prismatic joint, mm/sec value 10 -3 radians/sec.

PAGE 60

44 4.2 Primitive Manipula tor Applications to the Puma system ponent is to allow for tele-op comm. Thus, a Set Joint Effort message commanding values of [50, 50, ts at fifty percent of the maximum velocity in the positive direction thinterpretatioefforts can vary dnding coller provthe es that no sensor feedback is provided, it is possible to drive the robottriggering a fatal Val II error. Either one of the joints reachidriving a mulator to a singular configuration would cause Val to respond in such a way. In order to prevent this from happening during the tasks requiring closed-loop board position ad velocity sensor components covered in the following chapter. As mentioned earlier, the primary function of this com ands of joint efforts. This implementation interprets joint efforts as the percentages of maximum velocity 50, 50, 50, 50] would in effect rotate each of the join Note at the n of joint epe on the type of the ntro ided. Since component assum into an unfavorable state ng a hardware limit, or anip control, this implementation takes advantage of the on Computer logic and software design of this and all other components will be the topic of Chapter 8.

PAGE 61

CHAPTER 5 mponents that when queried, return instantaneous joint sitiue information. Note that a particular manipulator urement sensors onboard. Consequently, the imple e oint Position Sensor Component en queried. 1, ssages specific to this component Query Joint Positions Report Joint Positions. Detailed definitions are provided in Section 5.1.4. MANIPULATOR SENSOR COMPONENTS This chapter describes the co poon, velocity, and force or torq might only have one or two meas mentation of all three components covered in this chapter is seldom necessary. Moreover, the JAUS Reference Architecture is not concerned with the type of the sensorsused, but rather with the format in which the measured information is exchanged with thcomponent requesting it. 5.1 Manipulator J 5.1.1 Component Function The function of the Manipulator Joint Position Sensor Component (MJPS) is to report the values of manipulator joint parameters wh 5.1.2 Associated Messages The MJPS (JAUS ID# 51) accepts the core input and output messages (ChapterTable 1-1). The set of user defined input and output me are: 45

PAGE 62

46 5.1.3 Component Description The Report Joint Positions mssage provides instanions. The positions are given in radians for revolute and in meters for pcomponent is shown in Figure 5-1. e the taneous joint posit rismatic joints. The Joint Position Sensor actualRepo jointions ;rt JositionsMessage t posiint Po requestQuery J joint pooint PosiMessage 5.1.4. sitions ;tions Figure 5-1. Joint position sensor component 5.1.4 Input and Output Messages Similar to Section 4.1.5, this section and Sections 5.2.4 and 5.3.4, are used to provide detailed specifications of user defined messages. They cover data types and value limits for each of the parameters. 1 Code 0602h: Set Joint Positions message Set Joint Positions message is not defined by this component but it is included as a reference. Table 5-1. Set Joint Positions message parametersField # Name Type Units Interpretation 1 Number of Joints Byte N/A 1 ... 255 0 is Reserved 2 Joint 1 position Int rad or m Scaled integer: If revolute joint, Lower limit = -8 rad Upper limit = +8 rad If prismatic joint, Lower limit = -10 m Upper limit = +10 m 3 ... n n + 1 Joint n position Int rad or m see field 2

PAGE 63

47 5.1.4.2 Code 2602h: Query Joint Positions message This message shall cause the receiving component to reply to the requestor with a Code 4602h: Report Joint Positions message. 5.1.4.3 This message provides the receiver with the current values of the joint positions. The message data for the Report Joint Positions message is identical to Code 0602h: Set Joint Positions. 5.2 Manipulator Joint Velocity Sensor Component 5.2.1 Component Function The function of the Manipulator Joint Velocity Sensor (MJVS) is to report the values of instantaneous joint velocities when queried. 5.2.2 Associated Messages The MJVS (JAUS ID# 52) accepts the core input and output messages (Chapter 1, Table 1-1). The set of user defined input and output messages specific to this component are: Query Joint Velocities Report Joint Velocities. Detailed definitions are provided in Section 5.2.4. 5.2.3 Component Description The Report Joint Velocities message provides the instantaneous joint velocities. The velocities are given in radians/sec for revolute and in meters/sec for prismatic joints. The component is depicted in Figure 5-2. Code 4602h: Report Joint Positions message

PAGE 64

48 actual ivelocit nstantaneous jointies ;es Message Report Joint Velociti Joint VelocitySensor request instantaneous jointvelocities ;Query Joint Velocities Message5.2.4 Input and Output Messages 5.2.4.1 Code 0603h: Set Joint Velocities message Set Joint Velocities message is not defined t it is included for reference purposes. Table 5-2. Set Joint Velocities message parameters Field # Name Type Units Interpretation Figure 5-2. Joint velocity sensor component by this component bu 1 Num Joints /A 255 Byte N1 ... 0 is Reserved 2 Joint 1 velocity int rm/sec lute joint, Lower limit = -10 rad/sec Upper limit = +10 rad/sec If prismatic joint, -5 m/sec /sec n + 1 Joint n velocity int rad/sec or see field 2 ad/sec or If revo Lower limit = Upper limit = +5 m 3 ... n m/sec This message shall cause the receiving component to reply to the requestor with a Code 4603h: Report Joint Velocities mThis message provides the receiver with the current values of the joint velocities. The message data for the Report Joint Velocities message is identical to Code 0603h: Set Joint Velocities. 5.2.4.2 Code 2603h: Query Joint Velocities message essage. 5.2.4.3 Code 4603h: Report Joint Velocities message

PAGE 65

49 5.3 Manipula tor Joint Force/Torque Sensor Component .1 ion nt Force/Torque Sensor (MJFTS) is to report torques (for revolute joints) and forces (for prismatic joints) t aual joints of the manipulator kinematic model when queried. .2 ages ID# 53) accepts the core input and output messages (Chapter 1, d input and output messages specific to this component are lisntaneous joint forces or torques acting on each joint of the manipulator kinematic model. Forces are returned for prismatic joints in units of Newtons (N). Torques is returned for revolute joints in units of Newton-meters (Nm). 5.3.4 Input and Output Messages 5.3.4.1 Code 2605: Query Joint Force/Torques This message shall cause the receiving component to reply to the requestor with a Code 4605h: Report Joint Force/Torques message. 5.3.4.2 Code 4605h: Report Joint Force/Torques This message replies to the requestor with the values of current joint forces or tor pc and revolute joints, riv 5.3Component Funct The function of the Manipulator Joi the values of instantaneous thare applied at the individ 5.3Associated Mess The MJFTS (JAUS Table 1-1). The set of user define ted below, while detailed definitions are provided in Section 5.3.4: Query Joint Force/Torques Report Joint Force/Torques 5.3.3 Component Description The Joint Force/Torque Sensor component provides the insta rques fo rismati espect ely.

PAGE 66

50 Table 5-3. Report Joint Force/Torque message parameters Field # Name Type Units I nterpretation 1 N 10 is Reserved um Joints Byte N/A ... 255 2 Joint 1 force or int N or Nm If revolute joint Scaled integer: Lower limit = -1000 Nm 00 Nm If prismatic joint Lower limit = -500 N 3 ... n torque torque Upper limit = +10 Scaled integer: Upper limit = +500 N n + 1 Joint n force or int N or Nm see field 2 5.4 Sensor Component Applications to the Puma System chnboard the Puma 762 manipuesremfor position feedback (Chapter 3, Section 3.2.1). This information is ocontroller iverted to rs. Sarlyy is rerted invernto rs pet JAUS specifications. In many instances, the joint data is converted back to either encoder cts or dl inttiThe position sensor component implemented on the Puma system has additional monitoring joint movement and assuring that no set software limits have been breached. It further uses the acquired information to monitor joint angle values approaching singularity configurations (Chapter 2, Section 2.3.4). Actions taken if either occurs are discussed in Chapter 8. The use of MJPS and MJVS components will become more apparent in the next chapter dealing with closed-loop control of joint positions and velocities. Ea joint o lator us an inc ental encoder btained from the Galil n encoder counts and is con adian imil the velocit po encoder counts per second and con ted i adian er second to me oun egrees for the purposes of more meani ngfu erpreta on. functionality (Section 5.1.1). This involves

PAGE 67

CHAPTER 6 VEL POSITION AND VELOCITY DRIVER COMPONENTS These components take as inputs the desired joint positions or velocities, or the desired end-effector pose or velocity state. They further use platform specific information provided by the PM component, as well as the sensor information obtained from the MJPS and MJVS components to perform closed-loop position and velocity control. It should be noted that in most implementations, these components and the Primitive Manipulator component would be embedded in the same node that will facilitate the control process. The implementation of the low level drivers to the Puma platform becomes nontrivial and is addressed in Section 6.5. river Component 6.1.1 Component Function The function of the Manipulator Joint Positions Driver (MJPD) is to perform closed-loop joint position control. 6.1.2 Associated Messages The MJPD (JAUS ID# 54) accepts the core input and output messages (Chapter 1, Table 1-1). User defined messages that are received or sent by this component were defined in previous chapters and are: Set Joint Positions Report Manipulator Specifications Report Joint Efforts MANIPULATOR LOW-LE 6.1 Manipulator Joint Positions D 51

PAGE 68

52 Report Joint Positions Set Joint Effort. 6.1.3 Component Description The inputs are the desired joint values, current joint angles, and the manipulator specifications report. The output is the joineffort level that is sent to the Primitive Manipulator component. Figure 6-1 shows the MJPD component. t Manipulator JointPositions Driver Joint Position Sensor Set Joint E ffortMessagecommanded joint values ; Set Joint Positions Message Report Manipulator Specifications MessagePositionsMessage Report Joint actual joint effort ;Report Joint Effort Message Figure 6-1. Manipulator Joint Positions Driver component 6.2 Manipulator End-Effector Pose Driver Component 6.2.1 Component Function The function of the Manipulator End-Effector Pose Driver (MEEPD) is to perform closed-loop position and orientation control of the end-effector. 6.2.2 Associated Messages ts the core input and output messages (Chapter 1, Table 1-1). Some of the user defined messages that are received or sent by this component were defined in previous chapters, while others are defined in Section 6.2.4. The following messages are associated with this component: Set Tool Point The MEEPD (JAUS ID# 55) accep

PAGE 69

53 Set End-Effector Pose fort Report Tool Point. ation control of the end-effector. The input is the desired position and orientation of the end-effector specified in Query Tool Point Report Manipulator Specifications Report Joint Efforts Report Joint Positions Set Joint Ef 6.2.3 Component Description This component performs closed-loop position and orient the vehicle coordinate system, the current joint angles, and the data from the manipulator specification report. The output is the joint effort level that is sent to the Primitive Manipulator component. The component is shown in Figure 6-2. Manipulator EndEffector PoseDriver Joint PositionSensor Set Joint Effortcommanded end effector pose ;Set End Effector Pose Message Message Report ManipulatorSpecifications MessageReport JointPositionsMessage actual joint effo rt ;Report Joint Effort Message 6.2.4 Input and Output Messages 6.2.4.1 Code 0604h: Set Tool Point message This message specifies the coordinates of the end-effector the cdinated-effecFor abte system Figure 6-2. Manipulator End-Effector Pose Driver component tool point in terms of oor system attached to the en tor. 6-axis ro ot, this coordina

PAGE 70

54 is defined by having its origin located at the intersection of the S6 joint axis vector and the user defined link vector a67. The z-axis of the coordinate sy6x-axis is along the a67 vector. Tle 6-1.eters ld # Type UnInterpretation stem is along S and the ab Set Tool Point message param Fie Name its 1 e of tool point Int m Scaled integer: 5 m x coordinat Lower limit = -1 Upper limit = +15 m 2 Int m See field 1 3 z coordinate of tool point Int m S y coordinate of tool point ee field 1 64.2 Cor PosessagThisd end-coordinates of the tool point are defined in terms of the vehicle coordinate system. The orienies the axector .2. de 0605h: Set End-Effecto message n e m e defies the desire effector position and orientation. The tation of the end-effector is defined by a unit quaternion (d ; a, b, c) which specif is and angle of rotation that was used to establish the orientation of the end-effcoordinate system with respect to the vehicle coordinate system. Table 6-2: Set End-Effector Pose message parameters Field # Name Type Units Interpretation 1 x component of tool point int m Scaled integer: Lower limit = -30m Upper limit = +30m 2 y co3 z com mponent of tool point int m see field 1 ponent of tool point int m see field 1 4 d component of unit quaternion q int N/A Scaled integer: Lower limit = -1 Upper limit = +1 5 a component of unit quaternion q int N/A see field 4 6 b component of unit quaternion q int N/A see field 4 7 c component of unit quaternion q int N/A see field 4 6.2.4.3 Code 2604h: Query Tool Point This message shall cause the receiving component to reply to the requestor with a Code 4604h: Report Tool Point message.

PAGE 71

55 6.2.4.4 Code 4604h: Report Tool Point This message provides the receiver with the current values of the joint positions. The message data for the Report Joint Positions message is identical to Code 0604h: Set Tool Point. 6.3 Manipulator Joint Velocities Driver Component 6.3.1 Component Function The function of the Manipulator Joint Velocities Driver (MJVD) is to perform closed-loop joint velocity control. 6.3.2 Associated Messages The MJVD (JAUS ID# 56) accepts the core input and output messages (Chapter 1, Table 1-1). User defined messages that are received or sent by this component were defined in previous chapters and are: Set Joint Velocities Report Manipulator Specifications Set Joint Effort 6.3.3 Component Description t a from g the Report Joint Effort Report Joint Velocities The input consists of the desired instantaneous joint velocities, the current joinvelocities (rad/s for revolute and m/s for prismatic joints, respectively), and the datthe manipulator specification report (Puma platform specific parameters, includinorientation of the manipulator base coordinate system). The output is the joint effort level that is sent to the Primitive Manipulator component. The Manipulator Joint Velocities Driver component is shown in Figure 6-3.

PAGE 72

56 Manipulator JointVelocities Driver Joint VelocitySensor Set Joint Effortcommanded joint velocities ;Set Joint Velocities Message Rep Message Report ManipulatorSpecifications MessageMessage ort JointVelocitiesactual joint effort ;Report Joint Effort Message Figure 6-3. Manipulator Joint Velocities Driver component 6.4 Manipulator End-Effector Velocity State Driver Component 6.4.1 Component Function The function of the Manipulator End-Effector Velocity State Driver (MEEVD) is to perform closed-loop velocity control of the end effector. 6.4.2 Associated Messages The MEEPD (JAUS ID# 57) accepts the core input and output messages (Chapter 1, Table 1-1). Some of the user defined messages that are received or sent by this component were defined in previous chapters, while Set End-Effector Velocity State message is defined in Section 6.4.4. The following messages are associated with this component: Set End-Effector Velocity State Report Manipulator Specifications Report Joint Effort Report Joint Positions Report Joint Velocities Set Joint Effort

PAGE 73

57 6.4.3 Component Description The input is the desired end-effector velocity state, specified in the vehicle coordinate system or the end-effector coordinate system, the current joint positions and joint velt is the joint ocities, and the data from the manipulator specifications report. The outpu effort level that is sent to the Primitive Manipulator component. Figure 6-4 depicts this component. Manipulator End-Effector Velocity State Driver Joint VelocitySensor Set Joint Effortcommanded end-effector velocitystate values ;Message MessageSet End-effector Velocity State Report MaReport JointMess Joint PositionReport JointPositionsMessage nipulatorSpecifications MessageVelocitiesage actual joint effort ; Report Joint Effort Message Sensor Figure 6-4. Manipulator End-Effector Velocity State Driver component 6.4.4 Code 0606h: Set End-Effector Velocity State message The velocity state of body B measured with respect to body A is defined as the angular velocity of body B with respect to body A, and the linear velocity of the point in body B that is coincident with the origin of the reference frame measured with respect to body A, Av. From these parameters, the velocity of any point in body B can be de r0P The AB B 0 termined from the equationP0BAB0ABPArvv. Here BPAv is the velocity of some point P, that is embedded in body B, measured with respect to body A andrepresents the vector from the origin of the reference frame to point P, i.e. the coordinates of point P. In this application, body B is the end-effector, and body A is ground

PAGE 74

58 reference coordinate system is embedded in ground, but is aligned with either the end-ect or the vehicle coordinate system at this instant. elocity State message parameters Type Units Interpretation effor coordinate system Table 6-3. Set End-Effector V Field # Name 1 Coordinate system byte N/A 1 = reference coord. system aligned with vehicle coord. sys. 2 = reference coord. system aligned with definition end-effector coord. sys. 2 rad/secvelocity velocity velocity Av Lower limit = -10 Upper limit = +10 6 y component of the linear velocity Av int m/sec see field 5 sec see field 5 x component of angular velocity A B int rad/sec Scaled integer: Lower limit = -20 rad/sec Upper limit = +20 3 y component of angular ABint rad/sec see field 2 4 z component of angular ABint rad/sec see field 2 5 x component of the linear 0int m/sec Scaled integer: m/sec rad/sec B B 07 z component of the linear int m/ velocity B0Av nt implementation revolves around the troller is inherently capable of position d velocity cre es velocity mhe use of ependent jo to pee jootion (Chapter 3, Section 3.3.1). erefore thiss to relate this interpretation to eomponents requirements. 6.5 Applications of the Low-Level Driver Components to the Puma System The complexity of low-level compone concept of joint effort. Even though the Galil con an ontrol, the interp tation of ffort a andates t ind gging mode rpetuat int m Th section strive ach individual c

PAGE 75

59 The Manipulator Joint Positions Driver component receives commanded joint positions and ueries the MJPS for current joint vrmation is rapidly updated, the corresponding joint efforts are determin constantly q alues. As this info ed using Equation 6-1. ][][][][][maxnvelocitynknpositionnpositionneffortpcurrdes -1) where n is the joint number and is a proportional constandetermined experimentally for each of the joints and depend on the chosen values of ximum spe ancelerant e0% to 100%, computed efforts are clipped when received by theinstance, if commanded joint position is -3000 encoder coun omaximum velocity in the negative direction. As the positionbecomes smaller causing the effort to decrease. When the dechedthe fort is zero. This implementation tds anothm. Since the independent jogging mode uses trajectory generator, there is a possibility of ershoot. Equ upuickl andoint back to the esired position. e Manr End-Effese componenesired position and orientation of the end-effector as its inputs. It then uses the reverse position analysis (Section 2.3.2he corresponding joint values. Just as with the MJPD, this ponent coeries forent jons. Once this information is available, the identical approach (Equation 6-1) is used to complete the task. (6 pk t whose values are ma ed, acceleration d de tion. Since joi fforts can vary fr om -10 Primitive Manipulator. Fo r ts, and the current v alue is 6000 encoder counts, then the PM will cause that joint to m ve at a 100% of the gap closes, the difference sired position is rea resulting ef hus ad er control loop to the syste ov ation 6-1 is set to q y fix the error return the j d Th ipulato ctor Po Driver t receives the d ) to compute t com nstantly qu r cur oint positi

PAGE 76

60 D efinitioffor the tts c velocity is much r and ision. n of the joint e rt fo wo componen ommanding simple given by Equat 6-2 ][][][maxn velocityde nvelocityns (6-2) The Maint Velocities Driver component receives the desired joint h usverseysisn 2.3.3 to etheired vf thhesse to thanip effort values ever e0% or 1 (e.g, ing a -2r count per second velocity would be converted to -50%, given the maximum velocity of 5000 encoder ecly up to the Galil controller to close the loop and ensure n aedchall tre functionality of the JAUS manipulator plementation. The following chapter further takes the above capabilities and allows the system to handle multiple sets of joint positions and end-effector positions and orientations. effort nipulator Jo velocities, w ile the MEEVD es re velocity anal from Sectio determine th se values given des elocity state o e end-effector. Once computed, t se values are pa d on e Primitive M ulator. The should n xceed -10 00% command 500 encode counts per s ond). It is entire joint motio t the desired spe This pter explored a he co im

PAGE 77

CHAPTER 7 ELOCITY DRIVER COMPONENTS the last 2 components with respect to the scope of our study. toarchitecture was only concerned with single-goal mpresented in this chapter will extend this interface to allow mive multiple joint position configurations or a tool-point path most implementations, these components and the Primi ecified. The specified motion parameters are the desired values, maximum velocity, maximum acceleration, and maximum deceleration. 7.1.2 Associated Messages The MJMD (JAUS ID# 58) accepts the core input and output messages (Chapter 1, Table 1-1). Some of the user defined messages that are received or sent by this component were defined in previous chapters, while Set Joint Motion message is defined in Section 7.1.4. The following messages are associated with this component: Set Joint Motion MID-LEVEL POSITION AND V This chapter defines Up this point, this modular coletion. The components p theanipulator to rece profile. It should be noted that in tive Manipulator will be embedded in the same node which will facilitate the control process. Finally, the last section will briefly discuss how these 2 components areimplemented on the Puma platform. 7.1 Manipulator Joint Move Driver Component 7.1.1 Component Function The function of the Manipulator Joint Move Driver (MJMD) is to perform closedloop joint level control of the manipulator where motion parameters for each joint are sp 61

PAGE 78

62 Report Manipulator Specifications Report Joint Effort Report Joint Positions Report Joint Velocities Set Joint Effort 7.1.3 Component Description The inputs are the desired joint vaither with data to define a trapezoidal velocity profile (i.e. the maximum joint velocity, maum joint acceleration, and maximum joint deceleration). No explicit path is defined, only the values of the joint angles at distinct times. The time values are measured in units of started. Additional inputs are the current joint values, joint velocities, and the data from the Report Manipulator Specifications message. The output is the joint effort level that is sent t lues at specified tme values toge xim seconds and are relative to the time that the movement to the first joint angle set is o the Primitive Manipulator component. The MJMD is shown in Figure 7-1. Manipulator JointMove Driver Joint PositionSensor Joint VelocitySensorSet Joint Effort Message commanded joint motion profile ;Report ManipulatorReport JointPositions Message Set Joint Motion MessageSpecificaitons MessageVelocities MessageReport Jointactual joint effort ;ffort Message Report Joint E Figure 7-1. Manipulator Joint Move Driver comp onent

PAGE 79

63 7.1.4 Code 0607: Set Joint Motion Note that this message specifies the number of manipmber ooses (difile setsTable 7-1. Sessage parameters Field # pe Units ion ulator joints and the nu f p fferent trapezoidal proet Joint Motion m ). Name Ty Interpretat 1 Byte N/A 1 ... 255 ed Num Joints, n 0 is Reserv 2 of Byte N/A 1 3 Sec ec it = 6000 sec 4 rad or m Scaled integer: joint, Lower limit = -8 rad it = +8 rad If prismatic joint, er limit = -10 m it = +10 m 5t /s or m joint, Lower limit = -10 rad/s it = +10 rad/s If prismatic joint, mit = -5 m/s Upper limit = +5 m/s 62 or joint, Lower limit = -10 rad/s2 it = +10 rad/s2 mit = -20 m/s2 Upper limit = +20 m/s272 or joint, Lower limit = -10 rad/s2 Upper limit = +10 rad/s2 /s2 2 number poses, p pose 1 time int 0 is Reserved Scaled integer: Lower limit = 0 s Upper lim Joint 1 int position at pose 1 If revolute Upper lim Low Upper lim Joint 1 max velocity in rad /s If revolute Upper lim Lower li Joint 1 max acceleration int rad/s m/s 2 If revolute Upper lim If prismatic joint, Lower li Joint 1 max deceleration int rad/s m/s 2 If revolute If prismatic joint, Lower limit = -20 m Upper limit = +20 m/s8 Joint 2 position at pose 1 int rad or m see field 4 9 Joint 2 max velocity int rad/s or m/s see field 5

PAGE 80

64 Table 7-1. Continued Field # Name Type Units Interpretation 10 Joint 2 max int rad/s acceleration 2 or m/s 2 see field 6 11 deceleration 4n Joint n int rad or m see field 4 velocity acceleration deceleration see field 7 -1) 4n+4 pose p time int s see field 3 -1) 4n+5 Joint 1 position at pose p int rad or m see field 4 (p-1) 4n+6 Joint 1 max velocity int rad/s or m/s see field 5 (p-1) 4n+7 Joint 1 max acceleration int rad/s2 or m/s2see field 6 (p-1) 4n+8 Joint 1 max deceleration int rad/s2 or m/s2see field 7 (p-1)8n Joint n position at pose p int rad or m see field 4 (p-1)8n+1 Joint n max velocity int rad/s or m/s see field 5 (p-1)8n+2 Joint n max acceleration int rad/s2 or m/s2see field 6 (p-1)8n+3 Joint n max deceleration int rad/s2 or m/s2see field 7 Joint 2 max int rad/s 2 or m/s 2 see field 7 position at pose 1 4n+1 Joint n max int rad/s or m/s see field 5 4n+2 Joint n max int rad/s 2 or m/s 2 see field 6 4n+3 Joint n max int rad/s 2 or m/s 2 (p (p

PAGE 81

65 7.2 Manipulator End-Effector Discrete Pose Driver Component 7.2.1 Component Func) is hapter s chapters, while Set End-Effector Path Motion message is defined in Section 6.4.4. T the list of all the messages assoccoordinate system which is defined by a point and a quaternion at time t), the current tion The function of the Manipulator End-Effector Discrete Pose Driver (MEEDPDto perform closed-loop control of the end-effector pose through a series of specifiedpositions and orientations. 7.2.2 Associated Messages The MEEDPD (JAUS ID# 59) accepts the core input and output messages (C1, Table 1-1). Some of the user defined messages that are received or sent by thiscomponent were defined in previou he following is iated with this component: Set End-Effector Path Motion Report Manipulator Specifications Report Joint Effort Report Joint Positions Report Joint Velocities Set Joint Effort 7.2.3 Component Description This component performs closed-loop control of the end-effector pose as measured with respect to the vehicle coordinate system. The inputs are a path motion description (discrete end-effector position and orientation at time t measured in the vehicle

PAGE 82

66 joint values, the current joint velocities, and the data from the Report Manipulator Specifications message. The output is the join t effort level that is sent to the Primitive Manipulator componenn in Figure 7-2. t. The functionality of the MEEDPD is show Manipulator EndEffector DiscretePose Driver VCS Joint PositionSensor commanded end-effector path motionprofile in vehiclecoordinate system ;Set End-effector PathPositions Message Motion MessageReport Joint Joint VelocitySensorSet Joint EffortMessage Report JointVelocities Message Report ManipulatorSpecifications Message actual joint effort ;Report Joint Effort Message 7.2.4 Code 0608h: Set End-Effector Path Motion A series of end-effector poses are defined in terms of the vehicle coordinate system at various times. The time is a relative time and is defined in seconds where time equa0 is the moment that the motion towards the first pose begins. 7.3 Applications of the Mid-Level Driver Components to the Puma System The Section 3.3.1 described the independent axis positioning mode inherent tGalil controller. The parameters defining joint motion in this mode are iden Figure 7-2. Manipulator End-Effector Discrete Pose Driver component ls o the tical to those definesed d by Set Joint Motion message. Furthermore, the independent jogging mode uin previous component definitions provides closed-loop position control generating a trapezoidal trajectory based on these parameters. Thus, the MJMD can be defined as a superset of the MJPD component, in that it redefines the maximum speed, acceleration and deceleration with each new pose instead of using the default values.

PAGE 83

67 Field # Name Type Units Interpretation Table 7-2. Set End-Effector Path Motion message parameters 1 number of poses, n Byte N/A 1 ... 255 0 is Reserved 2 time 1 int sec time for pose 1 Lower limit = 0 sec Upper limit = +30 m point for pose 1 for pose 1 quaternion q for pose 1 Lower limit = -1 8 b component of unit int N/A see field 6 9 c component of unit quaternioint N/A see field 6 8n-6int m see field 3 8n-2 d component of unit quaternion q for pose n int N/A see field 6 8n-1 a component of unit quaternion q for pose n int N/A see field 6 8n b component of unit quaternion q for pose n int N/A see field 6 8n+1 c component of unit quaternion q for pose n int N/A see field 6 Scaled integer: Upper limit = 6000 sec 3 X component of tool point for pose 1 int m Scaled integer: Lower limit = -30 m 4 Y component of tool int m see field 3 5 Z component of tool point int m see field 3 6 d component of unit int N/A Scaled integer: Upper limit = +1 7 a component of unit quaternion q for pose 1 int N/A see field 6 quaternion q for pose 1 n q for pose 1 time n int sec see field 2 8n-5 X component of tool point for pose n int m see field 3 8n-4 Y component of tool point for pose n int m see field 3 8n-3 Z component of tool point for pose n An identical approach is taken to determine the corresponding joint efforts (Equation 6-1). Note however, that the proportional constant should change with the pk

PAGE 84

68 magnitude of these parameters. Since this implementation is used to test rather then optimize manipulator performance, previously determined values of are adequate for operating speeds below 10000 encoder counts per second. Tcompleted a new set of parameters is applied to the system. Unlike the MJMD, the functionality of the MEEDPD component is identical to that of the MEEPD. It just allows for a single message to define multiple tool-point positions and orientations to be executed autonomously at a particular time. Nte that this implementation uses generic timing functions provided with the Linux kernel. More precise operation would require the use of a real-time operating system. All aspects of software design are addressed in the following chapter. pkhus after each pose is o

PAGE 85

CHAPTER 8 OVERVIEW OF SOFTWARE DESIGN anipulator comp associated with each of the components and their ts, this chapter begins its analysis at the lowest level and moves up hierarchically. More specifically, it first addresses the logistics behind the interface to the Galil controller, then goes into the component and message development, and finally describes the node level functionality. Due to a high level of redundancy, only one component out of the first three groups will be analyzed in detail. Furthermore, this development takes advantage of multithreading, a powerful tool described in many popular computer science books. From a software development standpoint, each component is treated as a separate thread, and could be The purpose of our study was to design and implement the JAUS m onents. The design aspects were covered in Chapters 4, 5, 6, and 7, while the software implementation is addressed here. Keep in mind that the chapter covers design and logistics aspects rather than computer science technicalities. The source code is rather complicated but well documented and could be easily read. For completion purposes, this chapter gives a brief overview of the node manager and its role in inter-component communications. 8.1 Overview The scope of computer programming corresponding messages reflects the importance of software design in this and any other large scale project. In order to allow for easy and clear understanding behind the process control and data flow in each of the functional elemen 69

PAGE 86

70 compared to a program running a while-loop. An additional thread is used in the interface to the controller. 8.2 The Interface to the Galil Controller The Section 3.4 gave an overview of the C function prototypes that are the core of this development. Only a single program/thread is responsible for communications with the Galil controller eliminating the need for multithread synchronization. The file galilInterface.c is responsible for managing startup and shutdown routines of this particular thread. The interface has a well defined structure that is shown in Figure 8-1: Figure 8-1. The galilInterface.c logic flow diagram

PAGE 87

71 On startup, the code checks whether the Rob oWorks 3-D software tool is used. This p next chapter. RoboTalk is the program that handles Ethernet communications between the computer hosting RoboWorks and the computer providing position data. The file RoboTalk.h contains function prototypes for queried using TP, TV, and TT commands, respectively. Regardless of the fact that the Puma 762 does not have any torque sensplemented for testinthe g the e ackage, developed at the University of Texas, was slightly modified to work with the Linux operating system for both simulation and real-time 3D display purposes. Its application will become more apparent in the the Connect(), SetTagValues(..), and Disconnect() functions shown in Figure 8-1. This is followed by establishing a connection to the Galil controller, resetting it for safety purposes, and calibrating all the joints using stored potentiometer values. After the state thread is started, position, velocity and force/torque values are ors, this component was im g purposes. Commanding an independent jogging motion is accomplished using JG command (e.g. if the Primitive Manipulator commands a 50% effort, this is converted to -2500 encoder counts per second velocity using Equation 6-2, assuminmaximum velocity is 5000 encoder counts per second). In addition to the core functionality, galilInterface.c is used to set up maximum speed, acceleration, and deceleration values using SP, AC, and DC commands generating a trapezoidal profile. The function is set as a sleeper outside the thread and will change the values only if called. Only the Manipulator Joint Motion component is responsible for changes to thdefault parameters. The file also contains a homing function that could take the manipulator to its home position on startup. This capability should be used after recalibration of joint values. The source code for galilInterface.c, RoboTalk.c, and

PAGE 88

72 corresponding header files is listed in Appendix B, Section B.1. The Primitive Manie are is very similar. Figure 8-2 shows the functional elements of a generic component file. pulator component and all of the sensor components acquire data from the interfacfile using external access functions eliminating the need for the use of global variables. 8.3 Component Level Software Development Components are based on standardized interfaces (Section 1.3.4). From a softwdevelopment standpoint, this means that the code structure of the files defining these unique JAUS entities Figure 8-2. Generic component logic flow diagram

PAGE 89

73 Each component follows a standard process flow defining thread startup and shutdown routines. As it is shown in Figure 8-2, each component consists of two threads. The first is responsible for performing comhile the other handles the incoming core and user-definethe state thread that the particmergency, w ponent function w d messages. Therefore it is in ular components behavior is defined. This implementation defines EFailure, and Shutdown states identically across the entire node. In order to better understand the inner workings of these JAUS elements, the state thread of one component from each of the Chapters 4, 5, and 6 is analyzed. 8.3.1 Primitive Manipulator State Thread The best way to represent the processes within a particular file is using a flochart. Therefore, Figure 8-3 shows the PM state thread. Figure 8-3. The Primitive Manipulator state thread logic flow diagram

PAGE 90

74 Each component is set to the Initialize state by default during the startup routine. While at this state, the PM accesses the information provided by the interface to the Galil controller requesting the status on initialization procedures, ensuring all integrity checks are complete and the system is up and running. Once the component enters the Ready state, it talks to the interface file again, but this time accessing the function directly responsible for commanding motion, given the joint effort values. The source code for the file pm.c and its corresponding header is documented in Appendix B.2. 8.3.2 Manipulator Sensor Components The state thread of Manipulator Joint Position Sensor is described in this section as it provides more complex functionality than the other sensor components. Definitions of Initialize, Standby and Ready states are shown in Figure 8-4. Figure 8-4. Manipulator Joint Position Sensor logic flow diagram

PAGE 91

75 The definition of the initialize state in the above diagram is applied to the remainder of the components on this node. If the query statu s message to the Primitive Manipulator returns Ready, it is assumed that the initialization procedure was successful. Once in the Ready state, the MJPS accesses the Galil interface file and queries it for position. Next, it checks those values ensuring that none of the joints are crossing position limits, or getting close to a singularity configuration. In either case, the MJPS changes the status of the Primitive Manipulator to the Emergency state. This instantly causes all the other components to go into the Emergency state as well. The system would now have to be reinitialized. The source code for the mjps.c file and the corresponding header is listed in the Appendix B.3. 8.3.3 Low-Level Position and Velocity Drivers It should be noted, that all states, except Ready, are defined in the same manner as covered in previous sections across all of the remaining components. Figure 8-5 shows the MEEPD state thread (Ready state only). Figure 8-5. Manipulator End-Effector Pose Driver logic flow diagram

PAGE 92

76 The Figure 8-5 simply states that this component perfor ms its unique function as long as thitive Manipulatothe software functionality is defined, and since the timing functional-level components is a trivial addition, it is not discussed in detail. However, ftion purposes, Appendix B.4 and Appendix B.5 list the meepd.c and the meedpd.c files and eir corresponding headers, respectively. 8.4 Message Level SoftwEach manipulator component sends or receives user defined messages. Prior to algorithms are well defined and easy to implement. They are based on converting a preserving correct values. These functions can further clip passing parameters if they lay its. Information being passed is defined as a structure type so that it. For example, joint velocities are sent buma system, it also ensures that both the Val and Galil controllers, as well as the arm itself are powered up before starting the interface thread. The order in which the components are started up is irrelevant, but should be ere is no chang e in thf the Prim e status o r. At this point all of ity of the mid or comple th are Development messages being exchanged, they are compressed (packed) and eventually uncompressed (unpacked) once they reach the destination (Section 1.3.5). Packing and unpacking desired parameter into a byte stream, thus using a correct byte counter is critical for outside the specified lim it is easily accessed by the components requesting y the MJVD component as a part of a jointVelocity_t structure containing six velocity values and a parameter defining the total number of joints. Message files and their corresponding headers are documented in the Appendix C. 8.5 Node Level Software Development The Manipulator Control node is responsible for startup and shutdown of all the manipulator components. In the case of the P

PAGE 93

77 consistent with the order in which they are shutdown. Two files, mc.c and mc.h, are listed in the Appendix B.6. nagerator o JAompsible fonent core the Cmunic and thnger. Thr allowsnt of message entry into a subaintnk betwms. he Nnsible for starting the node itself. ronment for display purposes. How in the is listed in the Appendix B.7. 8.6 Node Ma and Communic Tw US c onents respon r all inter-compo mmunications a om ator e Node Ma e Communicato for a single poi system while m aining the data li een the subsyste T ode Manger component is responsible for routing JAUS messages from one node to another. When a component sends a message [7], it first goes to the Node Manager where the information regarding the destination component is interpreted and passed onto the communicator, which handles the transmission of the message to the proper nod. Finally, at the highest level, the main file is respo This file further uses a curses text-based window envi the information is being displayed for each of the components is discussednext chapter. The main.c file

PAGE 94

CHAPTER 9 TESTING AND RESULTS This chapter covers the methods used to test 2 aspects of this JAUS implementation. The first ensures that the functionality of developed messages and components meets the JAUS specification requirements. The latter looks at how well this architecture handles manipulator control from the view point of accuracy and task completion. In order to adequately test this implementation, an additional component mimicking a Subsystem Commander (SSC) was created. The manipulator sensor components are self tested as the information they provide becomes critical to entially 7 different cases or scenarios pertaining to the functionality of the driver components are evaluated by the SSC. User input is required when choosing the scenario, however the current setup mandates that any parameter change has to be done in the source code. 9.1 Subsystem Commander Component Overview The Subsystem Commander component is defined in the JAUS Reference Architecture document. Its function is to coordinate all activity within a given subsystem. The SSC (JAUS ID# 32) has the responsibility of performing mission planning, issuing commands, and querying status for the subsystem operation. The document states that functions of this component may be performed by humans, or by the computer or both [7]. The capabilities of the RoboWorks software package are integrated with this component to display real-time position data of the manipulator. This could be useful when the commander is located off site. Figure 9-1 shows this operator control setup. components responsible for closed-loop position and velocity control. Ess 78

PAGE 95

79 Figure 9-1. Subsystem Comm operator graphical user interface 9.2 Case 1: Set Joint Effort t without any nsor feedback. In order to ensure that no other components are commanding joint efforts, their status is changed to the Standby state. Note that the case numbers correspond to the items listed in Figure 9-1. Set Joint Effort Message commands the following set of values: ander The first scenario is used to test the Primitive Manipulator componen se 121212151515 effort (9-1) Given the default maximum velocity value of 5000 encoder counts per second (enc/s) for the first three joints and 1000 enc/s for the last three joints, these values are converted back to [750, -750, 750, -120, 120, -120] enc/s as they are passed on to the

PAGE 96

80 Galil controller using Equation 6-2. Figure 9-2 shows a snapshot of the Primitive Manipulator screen during the execution of this command. Figure 9-2. Primitive Manipulator Screen as it responds to the Set Joint Effort message Note that the current effort values are slightly different from the commanded ones. This error ranging between 1% and 4% is inherent to the underlying theory behind the independent jogging mode covered in Chapter 3. Figure 9-2 also shows that the PM screen is used to display the contents of the Manipulator Specifications message. Mechanism and controller information is also available. It is useful to realize that in this and the upcoming sections, any information regarding position and velocity information is displayed in units of encoder counts (enc) and encoder counts per second (enc/s), respectively. This was done for practical purposes to allow for quick interpretation of the corresponding positions with the actual ones. Table 1-1 lists the conversion factors used to go from specified JAUS standard units to enc and enc/s and vice versa:

PAGE 97

81 Table 9-1. The Puma 762 platform specific conversion factors Joint # Radder Coder C ians to Enco unts Enco ounts to Degrees 1 45836.6 0.00125 2 51.9 0.00086875 57.5 0.001115625 52.6 152.6 285.3 659 3 513 4 91 0.00626 5 9 0.00626 6 4 0.01337 9.3 Case 2: Set Joint Position This case tests the capabilities of the Manipulator Joint Position Driver. The SSC simply commands six joint values corresponding to the desired joint positions. That information is then used to determine the corresponding joint efforts (Equation 6-1) that are passed to the PM. Unlike the PM, MJVD, and MEEVD components, this and the other position drivers use the independent jogging mode to command position. This requires an introduction of an additional loop to the existing control system as shown in Figure 9-3. Figure 9-3. External closed-loop control diagram are tuned to provide stablege of f K values and potentially a more complicated control loop. The values of K and motion parameters used in this project are summarized in Table 9-2. The value of K is determined experimentally and its values no-steady-state-error operation of each of the joints within a particular ranmotion parameters. The Puma 762 system is capable of high-speed operation with great accuracy; however such implementation would require a different set o

PAGE 98

82 Table 9-2. Values of the K constant and corresponding range of motion parameters Joint # K Max Speed (end/s) Max Acceleration (enc/s2) Max Deceleration (enc/s2) 1 34 1000-10000 28000-256000 28000-256000 2 34 1000-10000 28000-256000 28000-256000 3 34 1000-10000 28000-256000 28000-256000 4 34 250-1000 28000-256000 28000-256000 5 15 250-1000 28000-256000 28000-256000 6 14 250-1000 28000-256000 28000-256000 To further illustrate the performance of the manipulator system within these ranges, the MJPS is commanded the samters. Keep in mind that when this or any other Manipulator and the senso9.3.1 lues of the K constant and average set of motion parameters JoMax Speed Max Acceleration Max Deceleration e position, [35000, -35000, 50000, 5500, 6500, -4000], with three different sets of motion parame driver component enters the Ready state, all other components except the Primitive rs are set to Standby. The Average Set Table 9-3 shows the set of average motion parameters used to test the performance of the MJPD. Table 9-3. Va int # K (end/s) (enc/s 2 ) (enc/s 2 ) 1 34 5000 128000 128000 2 34 5000 128000 128000 128000 4 34 1000 5 15 1000 128000 128000 3 34 5000 128000 128000 128000 6 14 1000 128000 128000 are shown The step responses of each of the joints as they are commanded motion in Figure 9-4.

PAGE 99

83 Joint 10.50.70.8on (ra 00.1 0.0. 230.40.60.9051015Time (s)Positid) Joint 2-0.3-0.2-0.1051015n (rad -0.4Posit -0.6-0.5 0Time (s)io) Joint 300.2 0.40.811.2Positi (rad) 0.6051015Time (s)on Joint 400.10.20.3 0.40.50.60.7 (rad) 051015Time (s)Position Joint 500.10.20.30.40.50.60.70.8051015Time (s)Position (rad) Joint 6-1-0.9-0.8-0.7-0.6-0.5-0.4-0.3-0.2-0.10051015Time (s)Position (rad) Figure 9-4. Joint step responses using average motion parameters Figure 9-5. The MJPD screen as motion is completed under the average set

PAGE 100

84 Note that only Joint 5 has a slight overshoot, and that all the joints arrive within 1 encoder count of the desire d position as shown in Figure 9-5. This error falls within performance specifications o9.3.2 ance of ration re 9-7. Joint # K Max Speed Max Acceleration 2Max Deceleration 2) f the Galil controller. The Low Set Table 9-4 shows the set of low motion parameters used to test the performthe Manipulator Joint Positions Driver. The step responses are very similar to those in Figure 9-4 with Joint 5 having less overshoot. However low acceleration and decelevalues yield low response time, thus the resulting position falls within a larger margin of error. As Figure 9-6 shows, that magnitude of this error is +/-6 encoder counts. The step responses of each of the joints as they are commanded motion are shown in FiguTable 9-4. Values of the K constant and low set of motion parameters (end/s) (enc/s) (enc/s 1 34 1000 28000 28000 2 34 1000 28000 28000 3 34 1000 28000 28000 5 15 250 28000 28000 6 4 34 250 28000 28000 14 250 28000 28000 Figure 9-6. The MJPD screen as motion is completed under the low set

PAGE 101

85 Joint 100.10.20.3 0.40.60.70.9sitiond) 0.50.8Po (ra 020406080Time (s) Joint 2 -0.3-0.2-0.10020406080ition (ra -0.5-0.4P osd) -0.6Time (s) Joint 300.40.60.81Time (s)Poson (rad) 0.21.20204060iti 80 Joint 400.20.40.6Time (s)Poson (rad) 0.10.30.50.7020406080iti Joint 500.0.020406080Time (s)Position ( 0.70.8 0.50.6rad) 0.10.234 Joint 6-1-0.9-0.8-0.7-0.4-0.3-0.2-0.10020406080Time (s)Poad) -0.6-0.5sition (r Figure 9-7. Joint step responses using low motion parameters 9.3.3 The High Set Table 9-5 shows the set of high motion parameters used to test the performance of the MJPD. The step responses of each of the joints as they are commanded motion are shown in Figure 9-8. High values of maximum speed, acceleration and deceleration govern the quick response to the commanded position.

PAGE 102

86 Table 9-5. Values of the K constant and high set of motion parameters Joint # K Max Speed (end/s) Max Acceleration (enc/s2) Max Deceleration (enc/s2) 1 34 10000 256000 256000 2 34 10000 256000 256000 3 34 10000 256000 256000 4 34 2500 256000 256000 5 15 2500 256000 256000 6 14 2500 256000 256000 Joint 1 0.10.20.30.40.50.60.70.80.9Position (rad) 002468 Time (s) Joint 2-0.6-0.5-0.4-0.3-0.2-0.100246Time (s)Position (rad) 8 Joint 311.2 00.20.40.60.802468Time (s)Position (rad) Joint 400.10.20.30.40.5 0.60.7 02468Time (s)Position (rad) Joint 500.10.20.30.40.50.60.70.80.902468Time (s)Position (rad) Joint 6-1-0.9-0.8-0.7-0.6-0.5-0.4-0.3-0.2-0.100246Time (s)Position (rad) 8 Figure 9-8. Joint step responses using high motion parameters

PAGE 103

87 Unlike the other two cases, this high case starts to show some signs of instability in the initial part of the motion, but quickly recovers with resulting position error within the Galil controller specifications as shown in Figure 9-9. Figure 9-9. The MJPD screen as motion is completed under the high set Figure 9-10 shows the final configuration of the PUMA 762 manipulator as seen by the Subsystem Commander component. Figure 9-10. Sub system Commander screen showing the final configuration of Puma 762

PAGE 104

88 9.4 Case 3: Set End-Effector Pose This section shows the performance of the Manipulator End-Effector Pose Driver Component. As described in Chapter 8, this component is responsible for computation of independent joint efforts based on the commanded position and orientation of the end-effector. In order to adequately perform the forward or reverse position analysis, the joint angles that correspond to the manufacturers specifications need to be converted to the kinematic values or vice versa using the following relationship: 2,1,KKermanufacturikinematici (9-2) where values of correspond to the conversion factors shown in column 3 of Table 9-1, and values ofare [0, 90, 90, 180, 180, 0] for Joints 1, 2, 3, 4, 5, and 6 respectively. The orientation of the end-effector is expressed using a unit quaternion. Simpused to convert the four values defining a quaternion into theand vectors. Once the analysis is complete, the function returns up to eight possible solution sets. An optimization technique is used to pick one solution by defining a total cost function given in Equation 9-3: 1K 2Kle approach outlined in Section 2.3.5 is 67aF 6SF iK,180 curridesippCost,,)(min (9-3) d manufacturers values required in the calculation of the desired joint efforts. Hence, the results of the commanded position [908, -602, 512] mm and orientation [0.4650,-0.1810, -0.8030,-0.3320] are shown in Figure 9-11. Thus, the solution requiring the least amount of encoder counts to get to the desireposition and orientation is chosen. Those angles are then converted back to the

PAGE 105

89 Figure 9-11. The MEEPD screen as it responds to Set End-Effector Pose message The computation of errors associated with the resulting position and orientation is non-trivial and is not covered in this thesis. However, it should be noted that the resulting joint angle positions are within 2 encoder counts with respect to those computed using the reverse position analysis. 9.5 Case 4: Set Joint Velocities This scenario is very similar to that covered in Section 9.2 since joint efforts are interpreted as joint velocities. The only difference is that joint velocities are now converted back to joint efforts and then back to velocities at the interface level. Figure 9-12 shows the Manipulator Joint Velocities Driver screen during the commanded motion. The individual joint velocities are calculated using Equation 6-1 with average parameter set defining maximum joint velocity. Therefore, a Set Joint Velocities message commanding [-3000, 2500, -3500, 500, -300, 250] for joints 1, 2, 3, 4, 5, and 6 respectively yields [-60, 50, -70, 50, -30, 25] joint efforts as shown in Figure 9-12.

PAGE 106

90 Figure 9-12. The MJVD Screen as it responds to Set Joint Velocities message It is apparent that very close values of velocity are obtained with the larges0.5% occurring in motion of joint 1. This e t error of rror is inherent to the theory behind the independent jogging mcontroincluded in this document due to the time constraints. otion, since the JG command is directly passed to the Galil ller. 9.6 Case 5: Set End-Effector Velocity State This section is supposed to evaluate the performance of the Manipulator End-Effector Velocity State Driver. This component takes as input the desired velocity state of the end-effector and computes the resulting joint velocities. Any commanded motion will reach a singularity configuration if not terminated in time; hence the motion has to be constantly monitored and carefully selected. In addition, since the resulting velocities vary as the end-effector moves in a commanded direction, the high set of maximum parameters is used in for this application allowing for a wide range of possible solutions. Once determined, the joint velocities are converted into efforts and passed to the PM. The collection of results for this section is still in progress and might not be

PAGE 107

91 9.7 Case 6: Set Joint Motion This case is in many ways similar to Case 2, in that it uses the same approach to compute the resulting joint efforts. However, the major difference is seen as this component sets the parameters defining the trapezoidal trajectory profile with each pose. As a result, neither of the average, low or high sets are used in this implementation, but rather a custom set is created with each pose. In this example, the SSC sends a message to the Manipulator Joint Move Driver containing three different poses. The results as well as the resulting trajectory profiles are covered in the following sections. 9.7.1 Set Joint Motion: Pose 1 The snapshot of the MJMD screen after the completion of the first pose is shown in Figure 9-13. Figure 9-13. The MJMD screen showing component status upon completion of pose 1

PAGE 108

92 The desired trapezoidal motion parameters are listed above. Figure 9-14 shows the velocity performance plot displaying the actual motion parameters for each of the joints. Joint 2 Joint 1 -0.1-0.06-0.040510152025Time (s) -0.08-0.0200.020.040.060.080.10.12Velocity (rad/s) 0.1 0.08 0.040.06/s) -0.06-0.04-0.0200.020510152025Time (s)locity (r Vead Joint 3-0.08-0.06-0.0200.020.040.080.120510152025Veloy (rad/s -0.040.060.1Time (s)cit) Joint 4-0.0200.020.040.080.1205101520Veloy (rad/s -0.08-0.06-0.040.060.125Time (s)cit) Joint 5-0.08-0.06-0.0400.020.040.060.10510152025Time (s)Velocityd/s) -0.020.080.12 (ra Joint 6-0.15-0.1-0.0500.050.10.2Time (s)Velocityd/s) 0.150.250510152025 (ra Figure 9-14. Joint performance plots for motion parameters set in pose 1 It is apparent that these plots closely follow the desired parameters with the exception to the deceleration stage which is affected by the additional control loop that was introduced in Section 9-3. In this stage, the component constantly reduces commanded velocity values that are then passed to the Galil controller which then once

PAGE 109

93 againall values al o ithin +/-1 encoder counts. 9.7.2 uses a trajectory generator to close the loop. The incremental position parameter used in the Galil JG function is not specified, thus the controller uses very smto set the path by default. The combination of the two control loops provides additiondamping. Similar behavior can be observed in the upcoming sections. Referring back tFigure 9-13, it can be seen that the resulting positions are w Set Joint Motion: Pose 2 The snapshot of the MJMD screen after the completion of the second pose is shown in Figure 9-15. Figure 9-15. The MJM D screen showing component status upon completion of pose 2 performance plot showing the actual motion parameters for each of the joints. The second set of joint positions goes in effect after 30 seconds of the component startup. The Puma was commanded to go back to its home position, which was successfully accomplished in a little over 23 seconds. The desired trapezoidal motion parameters for pose 2 are listed in Figure 9-15. Figure 9-16 depicts the velocity

PAGE 110

94 Joint 1-0.08-0.06-0.0200.020.040.080.128333843485358Time (s)Velocitad/s) -0.1-0.040.060.12y (r Joint 2-0.0400.040.0828333843485358Time (s)Velocityad/s) -0.06-0.020.020.060.1 (r Joint 3-0.08-0.060.0458elo/s -0.04-0.0200.020.060.080.10.12283338434853Vcity (rad) Time (s) Joint 4-0.06-0.04-0.020.0428333843485358Velo/s 00.020.060.080.10.12city (rad) -0.08Time (s) Joint 5-0.06-0.0200.020.040.080.10.1228333843485358Velo (rad/s) -0.08-0.040.06Time (s)city Joint 600.050.10.150.20.2528333843485358Veloc (rad/s) -0.15-0.1-0.05Time (s)ity Figure 9-16. Joint performance ploters set in pose 2 se nt he desired trapezoidal parameters provide a mix of values (Figure 9-16). ts for motion parame The commanded parameters resulting in the above plots are very similar to thodefining the low set, thus implying a higher position error of +/-3 encoder counts. 9.7.3 Set Joint Motion: Pose 3 The snapshot of the MJMD screen after the completion of pose 3 is shown in Figure 9-17. The set of joint positions goes in effect after 60 seconds of the componestartup. T

PAGE 111

95 onent status upon completion of pose 3 Figure 9-17. The MJMD screen showing com p Joint 1-0.04-0.03-0.02-0.0100.010.02587898118138Time (s)Ve /s) locity (rad Joint 2-0.04-0.03-0.02-0.0100.010.02587898118138Time (s)Velocity (rad/s) Joint 3-0.02-0.0100.010.020.030.04587898118138Time (s)Velocity (rad/s) Joint 4-0.04-0.03-0.02-0.0100.010.020.030.04587898118138Time (s)Velocity (rad/s) Figure 9-18a. Joint performance plots for motion parameters set in pose 3

PAGE 112

96 Joint 6-0.08-0.07-0.06-0.05-0.04-0.03-0.02-0.0100.010.025878981 Joint 5 -0 .02-0.0100.010.020.030.04587898118138Time (s)Velocity (rad/s) 18 138Tie (s)Velocity (rad /s) m Figure 9-18b. Joint performance plots for moon parameters set in pose 3 Commreached in approximately 80 seconds with theder couts. Figures 9-18a and 9-18b show the velocity performance plot showing the actual motion parameters for each of the joints. iscrete Pose river. This component can be considered a superset of the MEEPD in that it ndamentally performs the same function with the ability of the user to specify the end-effector path or profile. In other words, this component takes as input the message that specifies multiple positions and orientations of the end-effector at different times. A test sample message contains five different end-effector pose sets, the two of which are shown in Figure 9-19 and Figure 9-20. The average set of motion parameters is used for this component by default and thus the accuracy of +/3 encoder counts was obtained with all the results. This chapter has successfully shown that all the information communicated between the JAUS components is done correctly. It has also illustrated that each component properly performs its required tasks, outlined in Chapters 4-7. ti anded joint positions [-62000, -65000, 65000, 5000, 5000, -5000] are accuracy of +/-5 en co n 9.8 Case 7: Set End-Effector Path Motion This section tests the capabilities of the Manipulator End-Effector D D fu

PAGE 113

97 Figure 9-19. The ME E DPD screen after completion of pose 1 Figure 9-20. The MEEDPD screen after completion of pose 5

PAGE 114

98 Finally, the chapter defined a range of joint motion parameters which will ensure ulator system. The last formation covered in this thesis and offers some ideas evelopment and alternative platform implementations. stable, minimal steady-state-error operation of the Pum 762 manip chapter summarizes all the in regarding future com ponent d

PAGE 115

CHAPTER 10 CONCLUSIONS AND FUTURE WORK 10.1 Conclusions d on the design and development of 9 components used to m. Considering that these components are lo for the Joint Architecture for Unmanned Systems (JAUS), this development each of the components had to meet the ed JAUS component. Second, a testing platform had to be chosen, anipulator components had to be applied to the test ormance of this platform had to be tested under the ew architecture. A standard JAUS component is defined through a set of 4 criteria: the function of utput messages that the component may handle, these terms, all 9 components were fully strahe function was clearly defined for each of the ponents, varying from the simple open-loop control, to the discrete closed-loop and discuessed the specifics of their individual Our study focuse command and control a manipulator ar devepe d had to meet three specific objectives. First c riteria of a fully defin and the functionality of the m platform. Fi nally, the perf implementation of th e n the component, the accepted input and o and the full descriptio n of the component. In conined to the JAUS architec ture. T com end-effector position control. A full set of input and output messages were defined to meet the JAUS message standards. The component description defined the implementation of these components into the JAUS architecture, set the corresponding a nd unique identification numbers, functionality. 99

PAGE 116

100 Tas chosen as the testing platform due to the availability and prior to this otion ontroller was kept to accomplished. r component was used to interpret sed e ace. our study involved the programming lements on 4 levels. The design aspect took advantage of the m vel the rtup and shutdown routines of the Manipulator Control node. This for displaying all of the information pertaining to the tandard to many d in terms of the the J of the components. The results were cations of the Puma robot under the new he Puma 762 robot w acceptable operating condition. The robot was reverse engineered implementation to accommodate a commercially available Galil DMC-2100 m controller. Some of the safety functionality of the native Val II c ensure that proper initialization routines are The implementation of the Primitive Manipulato joint efforts as joint v elocities with respect to the commands that the Galil controller u to perpetuate motion. This approach uses an independent jogging mode inherent to th Galil controller interf The scope of the software development during of the JAUS functional e multithreading tool and applied it to each of the components allowing a single prog ra on a node level to spawn and run all of the manipulator com ponents. On the lowest le a program had to be created to be able to interface the C based JAUS softwa re to Galil machine-based command langu age. On the highest level, the main program was used to handle the sta program was further responsible particular component using the curses windows development tool s Linux distributions. Fally, e perf inthormance of each of the components was teste guidelines set by AUS for component functionality. This was accomplished by passing the specific commanding messages to each used to determine the perfor mance specifi

PAGE 117

101 modular architecture. More specifically, the accuracy of the resulting position and l, are a small rgin of error inherent to the independent jogging mode as it uses the trajectory oop position control. Second, messages sent through the node he process of packing and unpacking. Finally, a ons with s ponents s tested successfully on the Puma 762 Robot. It can be assumed that these components ons. autonomous control of an arm that would be a part of the vehicle-manipulator he aspects of low-level and id-leved both teleop and mplementation was only able to address one of the two v ic and 15 enc/s, respectively. Such errors, even though smal elocityis withn 6 en still significant especially if high pre cision operation is required by the particular application. There are 3 reasons that could explain the inaccuracies. First, there is m a generator for closed-l manager lose so me precision during t small frequency associated with the i nterface thread responsible for communicati the Galil controller provided delayed information to the commanding component running at much higher update rates. Oerall, e Man vthipulator Control node containing 9 JAUS manipulator com w a could be now implemented on any serial manipulator system with slight modificati M oreover, infrastructure in place allows for both teleop and independent m, as well ar as an s ystem. 10.2 Future Work This implementation has succes sfully addressed t mel controls of manipulators. M ore specific messages oriented towards advanc task completion could be added t o the current node. The next major step would be to test thla a vehicle-manipulator system requ is impementtion oniring autonomous control, as this i aspects.

PAGE 118

APPENDIX A EQUATIONS FOR A SPHERICAL HEPTAGON 71s543ss Table A-1. Fundamental formulas for a Spherical Heptagon 66712345ssX csY 67cZ 66712345 12345Z 771ssX 77123456csY 7123456c 1234567cZ 23456 112345ssX 3456Y 67 223 112 7cs 456X s 22345671csY 2345671cZ 334ssX 44567123ssX 56712 33456712csY 44567123csY 3456712cZ 4567123cZ 55671234ssX 55671234csY Z 5671234c 767ssX 76754321csY 6754321cZ 7165432cZ 1276543cZ 54321 17132ss 654X 17165432csY 21276543csY 76X 212 32317654ssX 32317654csY 2317654cZ 43421765ssX 43421765csY 3421765cZ 54532176ssX 54532176csY 4532176sZ 656ssX 65643217csY 5643217cX 43217 102

PAGE 119

103 Table A-2. Subsidiary formulas for a Spherical Heptagon Set 1 612345X X 723456XX 134567X X 245671XX 3 56X 712 X 467123X X 571234XX 754321XX 1XX 65432 276543XX 3 176XX 54 4XX 21765 5XX 32176 6X 43217 X 612345*YX 612345ZZ 723456YX 123456ZZ 134567*YX 234567ZZ 245671*YX 345671ZZ 456712ZZ 567123ZZ 671234 356712*YX 467123*YX 571234YX ZZ 754321*Y X 754321ZZ 165432*YX 276543*YX 3 165432ZZ 276543ZZ 317654ZZ 17654*X Y 6Y 421765ZZ 421765YX * 532176ZZ 643217ZX 3217X 5 6 43217*YX Otion sinesor the ther sets red to this configuration as well as the derivations of the direc late co f spatial heptagon a re listed in the Appendix section of [9].

PAGE 120

APPENDIX B IPULATOR COMPONENTS: SOURCE CODE JAUS MAN B.1 The GalilInterface.c File and the Corresponding Header GalilInterface.h //////////////////////////////////////////////////////////////// terface.c 0.1 Original Creation gnjen Sosa (ognjensosa@hotmail.com) om Galluzzo (galluzzt@ufl.edu) 09/28/2004 This file contains the C code used to interface JAUS to PUMA 762 manipulator and the GALIL DMC2100 controller. //////////// ncludcludInterface to the Galil Controller Interface to the RoboWorks software efines getRoboWorksReady() function rc = 0; // Return code // Response from the controller ] = "";// Command to the controller // Handle to controller fInMotion[NUM_JOINTS]; // Motion complete flag ntrollerinfo; // Controller information structure [] ={0x12,0x16,'\r',0x0}; he computer on ning "Puma_J2", "Puma_J3", "Puma_J4", "Puma_J5", "Puma_J6"}; rfaceRun; ]; /////////////////////// galilIn // // File: sion: // Ver // Written by: OT // Template by: : // Date // Description: /// / ///////////////////////////////////////////////////////////////////////////// #include #include nclude #i #include e #i #include #include #include #include #include "galilInterface.h" #include "mcConstants.h" // Constants used across Manipulator Control Node #include "logLib.h" // Debug functions e "timeLib.h" // Timing functions #in #include "dmclnx.h" // include "RoboTalk.h" // # #include "mc.h" // D s // Controller Variable long char buffer[32] = "";har g[128 c input_strinMC hdmc = -1; HANDLED int CONTROLLERINFO coar RV ch // RoboTalk Variables tive char filename[] = "Puma760Robot"; // Not case-sensi = "192.168.0.86"; // ipAddress of t char ipAddress[] //which RoboWorks is run float tagValues[NUM_JOINTS]; ar* TagNames[] = {"Puma_J1" ch // Ready Variables nt iinterfaceReady = 0, initialReady = 0, homeReady = 0; dy = 0, valReady = 0, armReady = 0; int galilRea // Interface Thread Variables interfaceThreadId; pthread_t int inte int interfaceThreadRunning = FALSE; interfaceThreadHz = 0; double // Other Variable Declarations static double jointCmdEffort[NUM_JOINTS], jointRetEffort[NUM_JOINTS 104

PAGE 121

105 static double r etPosition[NUretPositionAbs[NUM_JOINTS]; M_JOINTS], retPositionEnc[NUM_JOINTS], ], _JOINTS], maxAcceleration[NUM_JOINTS], xDece; fort[i] = 0; 5000; // Use this value as default unless other 0000; } maxDeceleration[i] = 150000; on[i] = 0; dures dy = 0; &attr,PTHREAD_CREATE_DETACHED); proceed t int(void) tSec) terfaceThreadId); stdouble retVelocity[NUM_JOINTS], retForceTorque[NUM_JOINTS atic read_velocity[NUM_JOINTatic S]; stdouble maxSpeed[NUMNUM_JOINTS] maleration[ int interfaceStartup(void) { pthread_attr_t attr; int i; long index[NUM_JOI NTS]; iables // Initia lize var for (i=0; i= timeOu { el(in pthread_canc

PAGE 122

106 interface ThreadRunning = FALSE; cError("interface: interfac eThread Shutdown Improperly\n"); buffer)); //Query actuator status boWorksReady() == 1) // (); } *ierfaceadData) me = ac(retPosition, retPositionEnc, retPositionAbs); ocity(retVelocity); rcetorque(retForceTorque); tng = FALSE; break; } } // Shut down motors rc = DMCCommand(hdmc, "OP ?;", buffer, sizeof( if (rc) PrintError(rc); else { long temp; ol(buffer); temp = at if (temp == 1) { rc = DMCCommand(hdmc, "OP0;", buffer, sizeof(buffer)); if (rc) PrintError(rc); } } interfaceReady = 0; // Close connection to RoboWorks //if (get Ro Disconnect // Reset Galil resetGalil(); // Close connection to Galil = DMCCl rc ose(hdmc); if (rc) { PrintError(rc); return rc; return 0; } void ntThread(void *thre { double time = 0, prevTime = 0; int i; interfaceThreadRunning = TRUE; TimeS; tiget econds() while(interfaceRun) { = time; prevTime = time getTimeSeconds();eThreadHz = 1.0/(time-prevTime); interf motion(jointCmdEffort, jointRetEffort); position vel // fo for (i=0; i
PAGE 123

107 pthread_exit(NULL); } // Accessors ceUpdateRate(void){ double getInterfat getterfac return interfaceThreadHz; } erfaceThreadRunning; } uble tJointCmdEffort[i]; } ead_velocity[i]*100/maxSpeed[i]; } Torque[i]; } homeReady; } //////////////////////////// /////////////////////////////// m the PRIMITIVE MANIPULATOR //////////////////////////// ; =0//////////////////////// sge of maximum elocity for th all but two Somponeally set joint velocities. he function below is currently set up to overwrite the default //////////////////////////////////////////////////////////// eax_speed) maxSpeed[i] = max_speed[i] J2_RAD_TO_ENC; x_speed[i] J6_RAD_TO_ENC; ation) ++) inIneThreadRunning(void){ return intnt dogeCmdEffort(int i) { return joit(int i) { return r double getJointRealEffor double getJointPosition(int i) { return retPosition[i]; } double getJointVelocity(int i) { return retVelocity[i]; } double getJointForceTorque(int i) { return retForce int getGalilReady(void) { return galilReady; } int getValReady(void) { return valReady; } int getArmReady(void) { return armReady; } initialReady; } int getInitialize(void) { return return int getPumaHome (void) { int getInterfaceRead y(void){ return interfaceReady; } /// ///////////////////////// ////////////////////////////// Private Functions //////////////////////////// /////////////////////////on use // Functid to access values of SET_JOINT_EFFORT fro/////////////////////////////// ///////////////////////// int setEffort(double *effort) { int i for (i ; i
PAGE 124

108 maxAcceleration[ i] = max_acceleration[i] J1_RAD_TO_ENC; O_ENC; O_ENC; 3) cceleration[i] = max_acceleration[i] J4_RAD_TO_ENC; cceleration[i] = max_acceleration[i] J5_RAD_TO_ENC; eration[i] = max_deceleration[i] J3_RAD_TO_ENC; ax_deceleration[i] J4_RAD_TO_ENC; e if i] J5_RAD_TO_ENC; NC; /////////////////////////////////// use velocity values and send the ontroller. It returns actual effort values. ////////////////////////////////////////////////////////////////////////// NTS curr_velocity[NUM_JOINTS], OINTS]; i, j=65; CmdEffort[i] < -100) ort[i] = -100; ity values in units of enc/s and command motion (i<3 cmd_velocity[i] = -10000; } else { else if (i==1) ma xAcceleration[i] = max_acceleration[i] J2_RAD_T else (i==2) xAcceleration[i] = max_acceleration[i] J3_RAD_T if ma else if (i==xA maif else (i==4) ma xA else maxAcceleration[i] = max_acceleration[i] J6_RAD_TO_ENC; } } void setMaxDeceleration(double *max_deceleration) { int i; fo0; i 100) ointCmdEffort[i] = 100; j if (joint jointCmdEff } //Convert commands into veloc (i=0; i 10000) cmd_velocity[i] = 10000; else if (cmd_velocity[i] < -10000) if (cmd_velocity[i] > 2500) cmd_velocity[i] = 2500; else if (cmd_velocity[i] < -2500) cmd_velocity[i] = -2500; } sprintf(input_string, "AC%c=?;",j);

PAGE 125

109 rc = DMCCommand(hdmc, input_string, buf fer, sizeof(buffer)); ut_string, "JG %5.0lf,%5.0lf,%5.0lf,%5.0lf,%5.0lf,%5.0lf;", y[1],cmd_velocity[2],cmd_velocity[3],cmd_velocity[4],cmd_veloc buffer, sizeof(buffer)); .0lf,%7.0lf,%7.0lf,%7.0lf,%7.0lf", cceleration[2],maxAcceleration[3],maxAcceleratinput_string, buffer, sizeof(buffer)); (i=0rintfnput_s,%7.0lf,%7.0lf,%7.0lf,%7.0lf,%7.0lf;", ration[2],maxDeceleration[3],maxDecelerati = DMommanding, buffer, sizeof(buffer)); (rc) = DMsizeof(buffer)); (rc) r/////////////////////////////////////////////// sensor data. retPositionAbs is the value used o replicate exact joint positions. ////////////////////////////////////////// retPositionEnc, double *retPositionAbs) int i, j=65; NUM_JOINTS; i++) 1) { ition[i] = read_position[i] / J2_RAD_TO_ENC; //rad ; //rad ad_position[i] / J4_RAD_TO_ENC; //rad ((read_position[i])* JOINT4_ENC_TO_DEG); //deg if (rc) PrintError(rc); ration[i] = atof(buffer); read_ac cele j++; } inp sprintf(d_vel cmocity[0],cmd_velocit ity[5]); rc = DMCCommand(hdmc, in put_string, if (rc) PrintError(rc); sprintf(input_string, "AC %7.0lf,%7],maxAcceleration[1],maxA maxAcceleration[0[4],ma on xAcceleration[5]); rc = DMCCommand(hdmc, i if (rc) PrintError(rc); for ; i
PAGE 126

110 retPosition[i] = read_position[i] / J5_RAD_TO_ENC; //rad ret Positi retPositi onAbs[i] = (read_position[i]) JOINT5_ENC_TO_DEG ; //deg n[i] = retPosition[i] + 0.5*retPosition[i-1]; ion[i] = read_position[i] / J6_RAD_TO_ENC; //rad ionAbs[i] = (read_position[i]) JOINT6_ENC_TO_DEG; //deg ////////////////////////////////////////////////////// elocity sensor data ////////////////////////////////////////////////////// city) i++) string, "TV %c;", j); input_string, buffer, sizeof(buffer)); ); f(buffer); velocity[i] / J1_RAD_TO_ENC; //rad/s ocity[i] = read_velocity[i] / J2_RAD_TO_ENC; //rad/s city[i] / J3_RAD_TO_ENC; //rad/s city[i] / J4_RAD_TO_ENC; //rad/s retVelocity[i] = read_velocity[i] / J5_RAD_TO_ENC; //rad/s retVelocity[i] = read_velocity[i] / J6_RAD_TO_ENC; //rad/s j++; } } nsors built in, thus this al future implementation th tocted below is just noise ed tomaginalues. t i, 65; ers ; //olts .8; //olts /-lb rq[1] =77; //-lb o } else { retPosit retPosit } retPositionEnc[i] = read_position[i]; //enc j++; } } ////////////////////////////// // Function used to look up v//////////////////////////////ity(double *retVelo vo id veloc{ int i, j=65; //Read Velocity M_JOINTS; for (i=0; i
PAGE 127

111 { curr_forcetorque[i] = 0; sprintf(input_string, "TT %c;", j); mand(hdmc, input_string, buffer, sizeof(buffer) rc = DMCCom if (rc) ); cetorque[i] / (high_limit low_limit); //ft-lb/V slope[i] curr_forcetorque[i]*FTLB_TO_NM; //Nm ///////////////////he Gal contller. /////////////////////////////////f the ALIL czIPAdess, "2.168ketinfofProtool = EternetPotocolT &hdmc); ///// y /////////////////////////////////////////////////// ); and(hdmc, "IN_3=@IN[3];", buffer, sizeof(buffer)); PrintError(rc); curr_forcetorque[i] = atof(buffer); slope[i] = stall_for retForceTorque[i] = j++; } } int resetGalil(void) { rc = DMCReset(hdmc); if (rc) { PrintError(rc); return rc; } return 0; } ////////////////////////////////// ////////////////////// // Function opening the connection to tilro/////////// /////////////////////////////// void startGALILController(void) { memset(&controllerinfo, '\0', sizeof(controllerinfo)); controllerinfo.cbSize = sizeof(controllerinfo); controllerinfo .usModelID = MODEL_2100; controllerinfo.fControllerType = ControllerTypeEthernet; controllerinfo00; .ulTimeout = 100 controllerinfo.ulDelay = 5; // IP: 192.168.0.84 is the current IP address oGontroller rdwarefo.soetinfo strcpy(controllerinfo.hainck.sdr19.0.84"); controllerinfo.hardwareinfo.soc.chrCP; DMCInitLibrary(); // Open the connecti on rc = DMCOpen(&controllerinfo, if (rc) { PrintError(rc); galilReady = 0; } else galilReady = 1; } //////////////////////////////////////////////////////////////////// // // Check the status of the VAL II controller maintaing system checks // provided bthe manufacturer. // //////////////////////void startVALController(vo id) { int temp = 0; rc = DMCCommand(hdmc, "MO;", buffer, sizeof(buffer)); if (rc) PrintError(rc); rc = DMCCommand(hdmc, "OP0;", buffer, sizeof(buffer)); if (rc) PrintError(rc rc = DMCCommand(hdmc, "AF0,0,0,0,0,0;", buffer, sizeof(buffer)); if (rc) PrintError(rc); rc = DMCComm

PAGE 128

112 if (rc) PrintError(rc); rc = DMCC(rc) ommand(hdmc, "IN_3=?;", buffer, sizeof(buffer)); if PrintError(rc); else { r); temp = atol(buffe } rc = DMCCommand(hdmc, "AT -1000;", buffer, sizeof(buffer)); if (rc) /// ady = 1; ////// oltage ratio orrespond to a particular index. The function further finds allowing the user to know the exact position of y starting configuration. ///////////////////////////////////////////////////////////////////////// x) = 0; PrintError(rc); rc = DMCCommand(hdmc, "SH;", buffer, sizeof(buffer)); if (rc) PrintError(rc); rc = DMCCommand(h dmc, "OP1;", buffer, sizeof(buffer)); if (rc) PrintError(rc); if (temp == 0) valReady = 0; else valReady = 1; } //////////////////////////////////////////////// /////////////////////////// // Check the status of the arm power (remote switch capable). /////////////////////// /////////////////////////////////////////////////void startARM(void) { int temp = 0; rc = DMCCommand(hdmc, "IN_1=@IN[1];", buffer, sizeof(buffer)); if (rc) PrintError(rc); rc = DMCCommand(hdmc, "IN_1=?;", buf fer, sizeof(buffer)); if (rc) r(rc); PrintErro else { ol(buffer); temp = at } rc = DMCCommand(hdmc, "AT -1000;", b uffer, sizeof(buffer)); if (rc) PrintError(rc); if (temp == 0) armReady = 0; else armRe } ////// ///////////////////////////////////////////////////////////////zation is done by checking agains the stored v // Joint initiali values that c // // the closest index thusthe manipulator in an // // void initManipulator(long *inde{ int i, j; char k = 65; double min=0, diff[NUM_JOINTS][NUM_INDEX], pot[NUM_JOINTS], stored_ratio[NUM_JOINTS][NUM_INDEX], current_rati o[NUM_JOINTS], power[NUM_JOINTS], potpower; long pos[NUM_JOINTS], home_index[NUM_JOINTS], x=0, y=0, z=0, w=0; char index_string[32]; for (i=0; i
PAGE 129

113 if (i<3) home_index[i] = 35; el se if (i==3) home_index[i] = (i==4) 35; sizeof(buffer)); ndex_string, "JG%c=500;",k); ; g, buffer, sizeof(buffer)); EF;"); er)); 1] && fInMotion[2] && fInMotion[3] && else if home_index[4] = 16; else me_index[5] = 15; ho for (j=0; j<70; j++) { stored_ra tio[i][j] = 0; diff[i][j] = 0; } } tpower); averagePotPower(pot, &po for (i=0; i2.4 { sprintf(index_string, "JG%c=-500;",k); ommand(hdmc, index_string, buffer rc = DMCC if (rc) PrintError(rc); } else { sprintf(i rc = DMCCommand(hdmc, index_string, buffer, sizeof(buffer)); if (rc) PrintError(rc); } k++; } sprintf(input_string, "FI ABCDEF")Command(hdmc, input_strin rc = DMC if (rc) PrintError(rc); ring, "BG ABCD sprintf(input_st rcCCommand(hdmc, input_string, buffer, sizeof(buff = DM if (rc) PrintError(rc); while (! rc && fInMotion[0] && fInMotion[fInMotion[4] && fInMotion[5]) { for (i=0; i
PAGE 130

114 collectRatios(stored_ratio ); +) potpwer sj] < min) = j; = df[i][j w = -3200; y 1200, w = -2000; y = 200, w = -800; 300, w = -700; dmc, input_string, buffer, sizeof(buffer)); ,3000,1000,1000,1000;", buffer, //////////////////////////// r, sizeof(buffer)); k = 65; for (i=0; i 112000) homeReady = 0; } else if (i == 3) { if (fabs(curr_position[i]) > 35000) homeReady = 0;

PAGE 131

115 } else if (i == 4) { if (fabs(curr_position[i]) > 16000) home Ready = 0; } else { [i]) > 15500) if (fabs(curr_position homeReady = 0; buffer, of(buffer)); Motion[2] && fInMotion[3] && DEF", buffer, sizeof(buffer)); /////////// ++) sprintf(input_string, "POT%c[%d]=?", k, j); age. This Improper ///// } j++; } rc = DMCCommand(hdmc, "SP 3000,3000,3000,1000,1000,1000;", sizeof(buffer)); if (rc) PrintError(rc); sprintf(input_string, "PA 0,0,0,0,0,0;"); uffer, size rc = DMCCommand(hdmc, input_string, b if (rc) PrintError(rc); sprintf(input_string, "BG ABCDEF;"); ; rc = DMCCommand(hdmc, input_string, buffer, sizeof(buffer)) if (rc) PrintError(rc); while (!rc && fInMotion[0] && fInMotion[1] && fIn fInMotion[4] && fInMotion[5]) { for (i=0; i
PAGE 132

116 void averagePotPower(double *pot, double *potpower) { double pott[NUM_JOINTS], temp[7], power; int i, j; power = 0; for(i=0; i<7; i++) { if (i<6) id Pri( pott[i] = 0; if (i<7) temp[i] = 0; } for (i=0; i<100; i++) { for (j=1; j<8; j++) { sprintf(input_string, "AN_%d=@AN[%d]",j ,j); rc = DMCCommand(hdmc, input_string, buffer, sizeof(buffer)); if (rc) PrintError(rc); sprintf(input_string, "AN_%d=?", j); rc = DMCCommand(hdmc, input_string, buffer, sizeof(buffer)); if (rc) PrintError(rc); temp[j-1]=atof(buffer); if(j<7) pott[j-1]+=temp[j-1]; else power += temp[j-1]; } } for (j=0; j
PAGE 133

117 //private accessors int setEffort(double *); double getJointCmdEffort(int); double getJointRealE ffort(int); double getJointPosition(int); double getJointVelocity(int); double getJointForceTorque(int); int getGalilReady(void); int getValReady( void); int getArmReady(void); int getInitialize(void); int getPumaHome (void); int getInterfaceReady(void); double g id se id pooubl *); id co70]); ////////////// File Creation C code for implementation of a Primitive ///////////// : JAUS libraries nk JAUS etTimeSeconds(void); //private int resetGalil(void); void startGALILController(void); void startVALController(void); void startARM(void); ator(long *); void initManipul void homeManipulator(void); void setMaxSpeed(double *); void setMaxAccele ration(double *);votMaxDeceleration(double *); void motion(double *, double *); vosition(double *, double *,d evoid velocity(double *); void forcetorque(double *); void averagePotPower(double *, double *); vollectRatios(double stored_ratio[6][ void PrintError(long rc); #endif B.2 The Pm.c File and the Corresponding Header Pm .h /////////////// //////////////////////////////////////////////////////////// //: pm.c .1 Original // Version: 0 // Written by: Ognjen Sosa (ognjensosa@hotmail.com) galluzzt@ufl.edu) // Template by: Tom Galluzzo (9/28/2004 // Date: 0/ /This file contains the // Description: / / Manipulator JAUS component in a Linux environment. This code is // designed to work with the node manager and JAUS library software / / written by Jeff Witt. //////////////////////////////////////////////////////////////////////////// // JAUS message set (USER #include must be installed first) #include // Multi-threading functions (standard to unix) #include // Precise timing routines (USER: must li timeLib.c, written by Tom Galluzzo) #include // Unix standard functions #include // Unix standard input-output #include // Mathematical functions ns for sending and receiving #include // Node managment functioager must be installed) messages (USER: Node Man #include "pm.h" // File containing all function and accessor defintions used in this component

PAGE 134

118 #include "galilInterfaceio .h" // Access to setEffort() and getJointPosition() functns#inclu de "logLib.h" // Debug definitions #include "mcConstants.h" #define DATASIZE JDATASIZE // Default size for byte stream buffers in this file // Private function prototypes void *pmStateThread(void *); void *pmNodemgrThread(void *); // State messages set by this componen t void pmStandbySsc(void); void pmResumeSsc(void); // Accessor to incoming information jointEffort_t pmSetJointEffort(void) ; joint efforts // Accessor to the value of latorSpecifications(void); US Instance, Node and // JAUS Authority for this // JAUS State, running // identity of the component es the not is nder ccase SET_JOINT EFFORT eciicationager JAUS Message Service (Jms) for this blic tracted component functionality contained in rce. y one call r the component threads spawned in // Accessors to outgoing information jointEffort_t pmReportJointEffort(void); Manipu manipulatorSpecifications_t pmReport unsigned char pmInstId, pmNodeId, pmSubsId; // JA Subsystem IDs for this component componentAuthority_t pmAuthority = 0; component int pmState = SHUTDOWN_STATE; State, and a thread running count double pmThreadHz; Stores the calculated update rate for main state thr ead unsigned char pmCtrlCmptInstId, pmCtrlCmptCompId; // Stores currently in control unsigned char pmCtrlCmptNodeId, pmCtrl CmptSubsId; // Stores identity of the component currently in control unsigned char pmCtrlCmptAuthority; // Storauthority level of the component currently in control t pmUerContl = FSE; inndroAL // FALSE under control, TRUE uontrol int pmRun = FALSE; int pmStateThreadRunning = FALSE; pthread_t pmStateThreadId; int pmNodemgrThreadRunning = FALSE; ThrdId; pthread_t pmNodemgrea // Structure storing incoming request under static jointEffort_t setJointEffort; // Structure defining data received and sent by this component // Structure storing incoming request under case QUERY JOINT EFFORT static jointEffort_t reportedJointEffort; // Structure storing incoming request under case QUERY MANIPULATOR SPECIFICATIONS static manipulatorSpfns_t reportedManipulatorSpecifications; ode Ma jms_t pmJms; // An accessor to the N component // Function: pmStartup // Access: Pu // Description: This function allows the absthis file to be started from an external sou // It must be called first before the component state machine and node manager interaction will begin // Each call to "cmptStartup" should be followed bto the "cmptShutdown" function int pmStartup(void) { pthread_attr_t attr; // Thread attributed fo this function

PAGE 135

119 if(pmState == SHUTDOWN_STATE) // Execute the startup routines only component is not running if the d Subsystem r jmsRecv, mptNodemgrThread\n"); EATE_ERROR; close the Jms connection to the { n Instance, Node an // Check in to the Node Manager and obtai IDs if(jcmCheckIn(PRIMITIVE_MANIPULATOR, &pmInstId, &pmNodeId, &pmSubsId) < 0) // USER: Insert your component ID define on this line { cError("pm: Could not check in to nodemgr\n"); return PM_NODE_MANAGER_CHECKIN_ERROR; } // Open a conection to the Node Manager and obtain a Jms accessor if((pmJms = jmsOpen(PRIMITIVE_MANIPULATOR, pmInstId, 0)) == NULL) // USER: Insert your component ID define on this line { jcmCheckOut(PRIMITIVE_MANIPULATOR, pmInstId); // USER: Insert youcomponent ID define on th is line return PM_JMS_OPEN_ERROR; } pmJms->timeout.tv_usec = 100000; // Timeout for non-blocking specified in micro seconds pthread_attr_init(&attr); pthread_a ttr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); // Set th e state of the JAUS state machine to INITIALIZE pmState = INITIALIZE_STATE; pmRun = TRUE; = 0 if(pthread_create(&pmStateThreadId, &attr, pmStateThread, NULL) !) { cError("pm: Could not create cmptStateThread\n"); pm Shutdown(); return PM_STATE_THREAD_CREATE_ERROR; } if(pthread_create(&pmNodemgrThreadId, &attr, pmNodemgrThread, NULL) != 0) { cEr ror("pm: Could not create c pmShutdown(); return PM_NODEMGR_THREAD_CR } pthread_attr_destroy(&attr); } else { cError("pm: Attempted startup while not shutdown\n"); return PM_ST ARTUP_BEFORE_SHUTDOWN_ERROR; } return 0; } // Function: pmShutdown // Access: Public // Description: T his function allows the abstracted component functionality contained in this file to be stoped from an external source. // If the component is in the running state, this function will terminate all thread s running in this file // This function will also Node Manager and check out the component from t he Node Manager tdown(id) int pmShuvo{ double timeOutSec; double effort[NUM_JOINTS]; int i;

PAGE 136

120 if (pmState != SHUTDOWN_STATE) // Execute the startup routines only if the component is not running { pmRun = FALSE; timeOutSec = getTimeSeconds() + PM_THREAD_TIMEOUT_SEC; while(pmStateThreadRunning) { usleep(100000); if(getTimeSeconds() >= timeOutSec) { pthread_cancel(pmStateThreadId); pmStateThreadRunning = FALSE; Shutdown cError("p m: cmptStateThread break; Improperly\n"); OUT_SEC; dRunning = FALSE; ptNodemgrThread Shutdown Improperly\n"); minating possibility of jerky motion ATOR, pmInstId); // USER: Insert your igned char)PRIMITIVE_MANIPULATOR; } te(oid){ urn &setJointEffort; } return &reportedJointEffort; } ions(void) { return ty is contained in this thread. nt state machine code can be found } } timeOutSec = getTimeSeconds() + PM_THREAD_TIME while(pmNodemgrThreadRunning) { usleep(100000); if(getTimeSeconds() >= timeOutSec) { pthread_cancel(pmNodemgrThreadId); pmNodemgrThrea cError("pm: cm break; } } // Set jog values to zero eli for (i=0; i
PAGE 137

121 { jmh_t txMsgHeader; unsigned char data[DATASIZE]; uble me, pr dotievTime, effort[NUM_JOINTS], curr_position[NUM_JO INT in S]; t i; tion US state to INITIALIZE e code while not in the SHUTDOWN state = time; se INITIALIZE_STATE: // Check for system initialization terfaceReady()) { tate = READY_STATE; else pmState = STANDBY_STATE; break; break; mmander if in standby mode o the manipulator interface edJointEffort.numJoints = NUM_JOINTS; for(i=0; i fications.jointSpecifications[i].jointMaximumValue / 1000) pmState = EMERGENCY_STATE; pmStateThreadRunning = TRUE; // // Setup transmit header txMsgHeader.isExpMsg = 0; // not experimental msg USER: change to 1 if experimental txMsgHeader.isSvcMsg = 0; // not a service connec txMsgHeader.acknCtrl = 0; // no ack/nak txMsgHeader.priority = 6; // default priority txMsgHeader.reserved = 0; txMsgHeader.version = 1; // JAUS 3.0 txMsgHeader.srcInstId = pmInstId; txMsgHeader.srcCompId = PRIMITIVE_MANIPULATOR; txMsgHeader.srcNodeId = pmNodeId; txMsgHeader.srcSubsId = pmSubsId; txMsgHeader.dataCtrl = 0; txMsgHeader.seqNumber = 0; time = getTimeSeconds(); pmState = INITIALIZE_STATE; // Set JA while(pmRun) // Execute state m achin { prevTime me = getTimeSeconds(); ti pmThreadHz = 1.0/(time-prevTime); // Compute the update rate of this th read switch(pmState) // Switch component behavior based on which state the ma chine is in { ca if(getIn pmS } case STANDBY_STATE: case READY_STATE: // Res ume system co pmResumeSsc(); mand effort t // Com report { reportedJgetJointRealEffort(i); } // Set up fail-safe with software limits a l than mechanical l imits for (i=0; i
PAGE 138

122 e } se f (fabs(curr_position[i]) > mValue / 1000) pmState = EMERGENCY_STATE; } break; case EMERGENCY_STATE: // If emergency occurs, command zero effort for (i=0; i
PAGE 139

123 suspendServiceConnection_t suspendServiceConnection; terminateServiceConnection_t terminateServiceConnection; requestComponentControl_t requestComponentControl; confirmComponentControl_t confirmComponentControl; componentAuthority_t componentAuthority; componentStatus_t componentStatus; int recvCount; pmNodemgrThreadRunning = TRUE; // Increment the number of threads running in this file // Setup Manipulator Specifications reportedManipulatorSpecifications.numJoints = NUM_JOINTS; reportedManipulatorSpecifications.jointNtype = 1; reportedManipulatorSpecifications.jointNoffsetOrAngle = 129; //mm reportedManipulatorSpecifications.jointNminimumValue = 0 / J6_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointNmaximumValue = 31000 / J6_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointNmaximumVelocity = 1000 / J6_RAD_TO_ENC 1000;//10^-3 rad/sec reportedManipulatorSpecifications.manipulatorCoordinateSystemX = 0; reportedManipulatorSpecifications.manipulatorCoordinateSystemY = 0; reportedManipulatorSpecifications.manipulatorCoordinateSystemZ = 0; reportedManipulatorSpecifications.quaternionQcomponentD = 1; reportedManipulatorSpecifications.quaternionQcomponentA = 0; reportedManipulatorSpecifications.quaternionQcomponentB = 0; reportedManipulatorSpecifications.quaternionQcomponentC = 0; reportedManipulatorSpecifications.jointSpecifications[0].jointType = 1; reportedManipulatorSpecifications.jointSpecifications[0].linkLength = 0.0; //mm reportedManipulatorSpecifications.jointSpecifications[0].twistAngle = 90 DEG_TO_RAD 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[0].jointOffsetOrAngle = 0; //mm reportedManipulatorSpecifications.jointSpecifications[0].jointMinimumValue = 0 / J1_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[0].jointMaximumValue = 224000 / J1_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[0].jointMaximumVelocity = 5000 / J1_RAD_TO_ENC 1000; //10^-3 rad/sec reportedManipulatorSpecifications.jointSpecifications[1].jointType = 1; reportedManipulatorSpecifications.jointSpecifications[1].linkLength = 650; //mm reportedManipulatorSpecifications.jointSpecifications[1].twistAngle = 0; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[1].jointOffsetOrAngle = 190;//mm reportedManipulatorSpecifications.jointSpecifications[1].jointMinimumValue = 0 / J2_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[1].jointMaximumValue = 224000 / J2_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[1].jointMaximumVelocity = 5000 / J2_RAD_TO_ENC 1000; //10^-3 rad/sec reportedManipulatorSpecifications.jointSpecifications[2].jointType = 1; reportedManipulatorSpecifications.jointSpecifications[2].linkLength = 0.0;//mm reportedManipulatorSpecifications.jointSpecifications[2].twistAngle = 270 DEG_TO_RAD 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[2].jointOffsetOrAngle = 0; //mm reportedManipulatorSpecifications.jointSpecifications[2].jointMinimumValue = 0 / J3_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[2].jointMaximumValue = 224000 / J3_RAD_TO_ENC 1000;//10^-3 rad reportedManipulatorSpecifications.jointSpecifications[2].jointMaximumVelocity = 5000 / J3_RAD_TO_ENC 1000; //10^-3 rad/sec reportedManipulatorSpecifications.jointSpecifications[3].jointType = 1; reportedManipulatorSpecifications.jointSpecifications[3].linkLength = 0.0; //mm

PAGE 140

124 reportedManipulatorSpecifications.jointSpecifications[3].twistAngle = 90 DEG_TO_RAD 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[3].jointOffsetOrAngle = 600; //mm reportedManipulatorSpecifications.jointSpecifications[3].jointMinimumValue = 0 / J4_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[3].jointMaximumValue = 70000 / J4_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[3].jointMaximumVelocity = 1000 / J4_RAD_TO_ENC 1000; //10^-3 rad/sec reportedManipulatorSpecifications.jointSpecifications[4].jointType = 1; reportedManipulatorSpecifications.jointSpecifications[4].linkLength = 0.0; //mm reportedManipulatorSpecifications.jointSpecifications[4].twistAngle = 90 DEG_TO_RAD 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[4].jointOffsetOrAngle = 0; //mm reportedManipulatorSpecifications.jointSpecifications[4].jointMinimumValue = 0 / J5_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[4].jointMaximumValue = 32000 / J5_RAD_TO_ENC 1000; //10^-3 rad reportedManipulatorSpecifications.jointSpecifications[4].jointMaximumVelocity = 1000 / J5_RAD_TO_ENC 1000; //10^-3 rad/sec // Setup transmit header txMsgHeader.isExpMsg = 0; // not experimental msg USER: change to 1 if experimental txMsgHeader.isSvcMsg = 0; // not a service connection txMsgHeader.acknCtrl = 0; // no ack/nak txMsgHeader.priority = 6; // default priority txMsgHeader.reserved = 0; txMsgHeader.version = 1; // JAUS 3.0 txMsgHeader.srcInstId = pmInstId; txMsgHeader.srcCompId = PRIMITIVE_MANIPULATOR; txMsgHeader.srcNodeId = pmNodeId; txMsgHeader.srcSubsId = pmSubsId; txMsgHeader.dataCtrl = 0; txMsgHeader.seqNumber = 0; while(pmRun) // Execute incoming JAUS message processing while not in the SHUTDOWN state { // Check for a new message in the Node Manager JMS queue // If a message is present then store the header information in rxMsgHeader, and store the message content information in the data buffer recvCount = jmsRecv(pmJms, &rxMsgHeader, data, DATASIZE); if (recvCount < 0) { cError("pm: Node manager jmsRecv returned error: %d\n", recvCount); break; } if (recvCount == 0) continue; // This block of code is intended to reject commands from non-controlling components // However, the one exception allowed is a REQUEST_COMPONENT_CONTROL if(pmUnderControl && rxMsgHeader.cmdCode < 0x2000) // If not currently under control or it's not a command, then go to the switch statement { // If the source component isn't the one in control, and it's not a request to gain control, then exit this iteration of the while loop if(!(pmCtrlCmptInstId==rxMsgHeader.srcInstId && pmCtrlCmptCompId==rxMsgHeader.srcCompId && pmCtrlCmptNodeId==rxMsgHeader.srcNodeId && pmCtrlCmptSubsId==rxMsgHeader.srcSubsId)&& !(rxMsgHeader.cmdCode==REQUEST_COMPONENT_CONTROL) )continue; // to next iteration } switch(rxMsgHeader.cmdCode) // Switch the processing algorithm according to the JAUS message type

PAGE 141

125 { // Set the component authority according to the incoming authority code case SET_COMPONENT_AUTHORITY: convertComponentAuthority(data, &pmAuthority, DATASIZE, UNPACK); // Unpack and store the incoming authority code break; case SHUTDOWN: pmState = SHUTDOWN_STATE; break; case STANDBY: if(pmState == READY_STATE) pmState = STANDBY_STATE; break; case RESUME: if(pmState == STANDBY_STATE) pmState = READY_STATE; break; case RESET: pmState = INITIALIZE_STATE; break; case SET_EMERGENCY: pmState = EMERGENCY_STATE; break; case CLEAR_EMERGENCY: pmState = STANDBY_STATE; break; case CREATE_SERVICE_CONNECTION: convertCreateServiceConnection(data, &createServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the create service connection message break; case CONFIRM_SERVICE_CONNECTION: convertConfirmServiceConnection(data, &confirmServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the confirm service connection message break; case ACTIVATE_SERVICE_CONNECTION: convertActivateServiceConnection(data, &activateServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the activate service connection message break; case SUSPEND_SERVICE_CONNECTION: convertSuspendServiceConnection(data, &suspendServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the suspend service connection message break; case TERMINATE_SERVICE_CONNECTION: convertTerminateServiceConnection(data, &terminateServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the terminate service connection message break; case REQUEST_COMPONENT_CONTROL:

PAGE 142

126 convertRequestComponentControl(data, &requestComponentControl, DATASIZE, UNPACK); if(pmUnderControl) { if(requestComponentControl > pmCtrlCmptAuthority) // Test for higher authority { // Terminate control of current component txMsgHeader.cmdCode = REJECT_COMPONENT_CONTROL; txMsgHeader.dstSubsId = pmCtrlCmptSubsId; txMsgHeader.dstNodeId = pmCtrlCmptNodeId; txMsgHeader.dstCompId = pmCtrlCmptCompId; txMsgHeader.dstInstId = pmCtrlCmptInstId; txMsgHeader.dataBytes = 0; jmsSend(pmJms, &txMsgHeader, data, txMsgHeader.dataBytes); // Accept control of new component txMsgHeader.cmdCode = CONFIRM_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; confirmComponentControl.asByte = 0; txMsgHeader.dataBytes = convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, PACK); jmsSend(pmJms, &txMsgHeader, data, txMsgHeader.dataBytes); pmCtrlCmptInstId = rxMsgHeader.srcInstId; pmCtrlCmptCompId = rxMsgHeader.srcCompId; pmCtrlCmptNodeId = rxMsgHeader.srcNodeId; pmCtrlCmptSubsId = rxMsgHeader.srcSubsId; pmCtrlCmptAuthority = requestComponentControl; } else { if( rxMsgHeader.srcSubsId != pmCtrlCmptSubsId || rxMsgHeader.srcNodeId != pmCtrlCmptNodeId || rxMsgHeader.srcCompId != pmCtrlCmptCompId || rxMsgHeader.srcInstId != pmCtrlCmptInstId ) { txMsgHeader.cmdCode = REJECT_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = 0; jmsSend(pmJms, &txMsgHeader, data, txMsgHeader.dataBytes); } } } else // Not currently under component control, so give control { txMsgHeader.cmdCode = CONFIRM_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId;

PAGE 143

127 txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; confirmComponentControl.asByte = 0; txMsgHeader.dataBytes = convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, PACK); jmsSend(pmJms, &txMsgHeader, data, txMsgHeader.dataBytes); pmCtrlCmptInstId = rxMsgHeader.srcInstId; pmCtrlCmptCompId = rxMsgHeader.srcCompId; pmCtrlCmptNodeId = rxMsgHeader.srcNodeId; pmCtrlCmptSubsId = rxMsgHeader.srcSubsId; pmCtrlCmptAuthority = requestComponentControl; pmUnderControl = TRUE; } break; case RELEASE_COMPONENT_CONTROL: pmUnderControl = FALSE; break; case CONFIRM_COMPONENT_CONTROL: convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, UNPACK); // USER: Insert code here to handle the confirm component control message if needed break; case REJECT_COMPONENT_CONTROL: // USER: Insert code here to handle the reject component control message if needed break; case QUERY_COMPONENT_AUTHORITY: txMsgHeader.cmdCode = REPORT_COMPONENT_AUTHORITY; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; componentAuthority = pmAuthority; txMsgHeader.dataBytes = convertComponentAuthority(data, &componentAuthority, DATASIZE, PACK); jmsSend(pmJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; case QUERY_COMPONENT_STATUS: txMsgHeader.cmdCode = REPORT_COMPONENT_STATUS; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; componentStatus.primaryStatus.asByte = pmState; txMsgHeader.dataBytes = convertComponentStatus(data, &componentStatus, DATASIZE, PACK); jmsSend(pmJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; case REPORT_COMPONENT_AUTHORITY: convertComponentAuthority(data, &componentAuthority, DATASIZE, UNPACK); // USER: Insert code here to handle the report component authority message if needed break; case REPORT_COMPONENT_STATUS: convertComponentStatus(data, &componentStatus, DATASIZE, UNPACK); break; case SET_JOINT_EFFORT: convertJointEffort(data, &setJointEffort, DATASIZE, UNPACK);

PAGE 144

128 break; case QUERY_JOINT_EFFORT: txMsgHeader.cmdCode = REPORT_JOINT_EFFORT; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dataBytes = convertJointEffort(data, &reportedJointEffort, DATASIZE, PACK); jmsSend(pmJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; case QUERY_MANIPULATOR_SPECIFICATIONS: // unpack presence vector txMsgHeader.cmdCode = REPORT_MANIPULATOR_SPECIFICATIONS; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = convertManipulatorSpecifications(data, &reportedManipulatorSpecifications, DATASIZE, PACK); jmsSend(pmJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; default: break; } } pmNodemgrThreadRunning = FALSE; pthread_exit(NULL); } void pmStandbySsc(void) { jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcInstId = pmInstId; txMsg.srcCompId = PRIMITIVE_MANIPULATOR; txMsg.srcNodeId = pmNodeId; txMsg.srcSubsId = pmSubsId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = STANDBY; txMsg.dstInstId = 1; txMsg.dstCompId = SUBSYSTEM_COMMANDER; txMsg.dstNodeId = pmNodeId; txMsg.dstSubsId = pmSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(pmJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } void pmResumeSsc(void) {

PAGE 145

129 jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcInstId = pmInstId; txMsg.srcCompId = PRIMITIVE_MANIPULATOR; txMsg.srcNodeId = pmNodeId; txMsg.srcSubsId = pmSubsId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = RESUME; txMsg.dstInstId = 1; txMsg.dstCompId = SUBSYSTEM_COMMANDER; txMsg.dstNodeId = pmNodeId; txMsg.dstSubsId = pmSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(pmJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } ///////////////////////////////////////////////////////////////////////////////////////// // File: pm.h // Version: 0.1 Original Creation // Written by: Ognjen Sosa (ognjensosa@hotmail.com) // Template by: Tom Galluzzo (galluzzt@ufl.edu) // Date: 09/28/2004 // // Description: This file contains the skeleton C header file code for implementing // the pm.c file ///////////////////////////////////////////////////////////////////////////////////////// #ifndef PM_H #define PM_H #include "jaus.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define PM_NODE_MANAGER_CHECKIN_ERROR -1 #define PM_JMS_OPEN_ERROR -2 #define PM_STARTUP_BEFORE_SHUTDOWN_ERROR -3 #define PM_STATE_THREAD_CREATE_ERROR -4 #define PM_NODEMGR_THREAD_CREATE_ERROR -5 #define PM_THREAD_TIMEOUT_SEC 1.0 // Public int pmStartup(void); int pmShutdown(void); int pmGetState(void); unsigned char pmGetInstanceId(void); unsigned char pmGetCompId(void); unsigned char pmGetNodeId(void); unsigned char pmGetSubsystemId(void);

PAGE 146

130 double pmGetUpdateRate(void); // State messages set by this component void pmResetSsc(void); void pmResumeSsc(void); // Private accessors jointEffort_t pmSetJointEffort(void); jointEffort_t pmReportJointEffort(void); manipulatorSpecifications_t pmReportManipulatorSpecifications(void); #endif // PM_H B.3 The Mjps.c File and the Corresponding Header Mjps.h ///////////////////////////////////////////////////////////////////////////////////////// // File: mjps.c // Version: 0.1 Original Creation // Written by: Ognjen Sosa (ognjensosa@hotmail.com) // Template by: Tom Galluzzo (galluzzt@ufl.edu) // Date: 09/28/2004 // // Description: This file contains the C code for implementation of a Manipulator // Joint Position Sensor JAUS component in a Linux environment. This // code is designed to work with the node manager and JAUS library // software written by Jeff Witt. ///////////////////////////////////////////////////////////////////////////////////////// #include // JAUS message set (USER: JAUS libraries must be installed first) #include // Multi-threading functions (standard to unix) #include // Precise timing routines (USER: must link timeLib.c, written by Tom Galluzzo) #include // Unix standard functions #include // Unix standard input-output #include // Mathematical functions #include // Node managment functions for sending and receiving JAUS messages (USER: Node Manager must be installed) #include "mjps.h" // USER: Implement and rename this header file. Include prototypes for all public functions contained in this file. #include "mcConstants.h" #include "galilInterface.h" // Access to the getJointPosition() function #include "logLib.h" #define DATASIZE JDATASIZE // Default size for byte stream buffers in this file // Private function prototypes void *mjpsStateThread(void *); void *mjpsNodemgrThread(void *); // Query messages requested by this component void mjpsQueryPmComponentStatus(void); // Accessor to outgoing information jointPosition_t mjpsReportJointPosition(void); unsigned char mjpsInstId, mjpsNodeId, mjpsSubsId; // JAUS Instance, Node and Subsystem IDs for this component componentAuthority_t mjpsAuthority = 0; // JAUS Authority for this component int mjpsState = SHUTDOWN_STATE; // JAUS State double mjpsThreadHz; // Stores the calculated update rate for main state thread unsigned char mjpsCtrlCmptInstId, mjpsCtrlCmptCompId; // Stores identity of the component currently in control unsigned char mjpsCtrlCmptNodeId, mjpsCtrlCmptSubsId; // Stores identity of the component currently in control

PAGE 147

131 unsigned char mjpsCtrlCmptAuthority; // Stores the authority level of the component currently in control int mjpsUnderControl = FALSE; // FALSE not under control, TRUE is under control int mjpsRun = FALSE; int mjpsStateThreadRunning = FALSE; pthread_t mjpsStateThreadId; // pthread node manager thread identifier int mjpsNodemgrThreadRunning = FALSE; pthread_t mjpsNodemgrThreadId; // pthread node manager thread identifier // Structure storing incoming request under case QUERY_JOINT_POSITION static jointPosition_t reportedJointPosition; jmh_t mjpsScHeader; int mjpsScActive = FALSE; jms_t mjpsJms; // An accessor to the Node Manager JAUS Message Service (Jms) for this component int mjpsPmState = -1; unsigned char mjpsPmNodeId = 0; int mjpsPmControl = FALSE; static double curr_theta[NUM_JOINTS]; // Function: mjpsStartup // Access: Public // Description: This function allows the abstracted component functionality contained in this file to be started from an external source. // It must be called first before the component state machine and node manager interaction will begin // Each call to "mjpsStartup" should be followed by one call to the "cmptShutdown" function int mjpsStartup(void) { pthread_attr_t attr; // Thread attributed for the component threads spawned in this function if(mjpsState == SHUTDOWN_STATE) // Execute the startup routines only if the component is not running { // Check in to the Node Manager and obtain Instance, Node and Subsystem IDs if(jcmCheckIn(MANIPULATOR_JOINT_POSITION_SENSOR, &mjpsInstId, &mjpsNodeId, &mjpsSubsId) < 0) // USER: Insert your component ID define on this line { cError("mjps: Could not check in to nodemgr\n"); return MJPS_NODE_MANAGER_CHECKIN_ERROR; } // Open a conection to the Node Manager and obtain a Jms accessor if((mjpsJms = jmsOpen(MANIPULATOR_JOINT_POSITION_SENSOR, mjpsInstId, 0)) == NULL) // USER: Insert your component ID define on this line { cError("mjps: Could not open connection to nodemgr\n"); jcmCheckOut(MANIPULATOR_JOINT_POSITION_SENSOR, mjpsInstId); // USER: Insert your component ID define on this line return MJPS_JMS_OPEN_ERROR; } mjpsJms->timeout.tv_usec = 100000; // Timeout for non-blocking jmsRecv, specified in micro seconds pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); mjpsState = INITIALIZE_STATE; // Set the state of the JAUS state machine to INITIALIZE

PAGE 148

132 mjpsRun = TRUE; if(pthread_create(&mjpsStateThreadId, &attr, mjpsStateThread, NULL) != 0) { cError("mjps: Could not create mjpsStateThread\n"); mjpsShutdown(); return MJPS_STATE_THREAD_CREATE_ERROR; } if(pthread_create(&mjpsNodemgrThreadId, &attr, mjpsNodemgrThread, NULL) != 0) { cError("mjps: Could not create mjpsNodemgrThread\n"); mjpsShutdown(); return MJPS_NODEMGR_THREAD_CREATE_ERROR; } pthread_attr_destroy(&attr); } else { cError("mjps: Attempted startup while not shutdown\n"); return MJPS_STARTUP_BEFORE_SHUTDOWN_ERROR; } return 0; } // Function: mjpsShutdown // Access: Public // Description: This function allows the abstracted component functionality contained in this file to be stoped from an external source. // If the component is in the running state, this function will terminate all threads running in this file // This function will also close the Jms connection to the Node Manager and check out the component from the Node Manager int mjpsShutdown(void) { double timeOutSec; if(mjpsState != SHUTDOWN_STATE) // Execute the startup routines only if the component is not running { mjpsRun = FALSE; timeOutSec = getTimeSeconds() + MJPS_THREAD_TIMEOUT_SEC; while(mjpsStateThreadRunning) { usleep(100000); if(getTimeSeconds() >= timeOutSec) { pthread_cancel(mjpsStateThreadId); mjpsStateThreadRunning = FALSE; cError("mjps: mjpsStateThread Shutdown Improperly\n"); break; } } timeOutSec = getTimeSeconds() + MJPS_THREAD_TIMEOUT_SEC; while(mjpsNodemgrThreadRunning) { usleep(100000); if(getTimeSeconds() >= timeOutSec) { pthread_cancel(mjpsNodemgrThreadId); mjpsNodemgrThreadRunning = FALSE; cError("mjps: mjpsNodemgrThread Shutdown Improperly\n"); break; } }

PAGE 149

133 // Close Node Manager Connection and check out jmsClose(mjpsJms); jcmCheckOut(MANIPULATOR_JOINT_POSITION_SENSOR, mjpsInstId); // USER: Insert your component ID define on this line mjpsState = SHUTDOWN_STATE; } return 0; } // The series of functions below allow public access to essential component information // Access: Public (All) int mjpsGetState(void){ return mjpsState; } unsigned char mjpsGetInstanceId(void){ return mjpsInstId; } unsigned char mjpsGetCompId(void){ return (unsigned char)MANIPULATOR_JOINT_POSITION_SENSOR; } unsigned char mjpsGetNodeId(void){ return mjpsNodeId; } unsigned char mjpsGetSubsystemId(void){ return mjpsSubsId; } double mjpsGetUpdateRate(void){ return mjpsThreadHz; } int mjpsGetPmState(void){ return mjpsPmState; } // USER: Insert any additional public variable accessors here jointPosition_t mjpsReportJointPosition(void) { return &reportedJointPosition; } // Function: mjpsThread // Access: Private // Description: All core component functionality is contained in this thread. // All of the JAUS component state machine code can be found here. void *mjpsStateThread(void *threadData) { jmh_t txMsgHeader; double time, prevTime; unsigned char data[DATASIZE]; int i; mjpsStateThreadRunning = TRUE; // // Setup transmit header txMsgHeader.isExpMsg = 0; // not experimental msg USER: change to 1 if experimental txMsgHeader.isSvcMsg = 0; // not a service connection txMsgHeader.acknCtrl = 0; // no ack/nak txMsgHeader.priority = 6; // default priority txMsgHeader.reserved = 0; txMsgHeader.version = 1; // JAUS 3.0 txMsgHeader.srcInstId = mjpsInstId; txMsgHeader.srcCompId = MANIPULATOR_JOINT_POSITION_SENSOR; txMsgHeader.srcNodeId = mjpsNodeId; txMsgHeader.srcSubsId = mjpsSubsId; txMsgHeader.dataCtrl = 0; txMsgHeader.seqNumber = 0; time = getTimeSeconds(); mjpsState = INITIALIZE_STATE; // Set JAUS state to INITIALIZE while(mjpsRun) // Execute state machine code while not in the SHUTDOWN state { prevTime = time; time = getTimeSeconds(); mjpsThreadHz = 1.0/(time-prevTime); // Compute the update rate of this thread switch(mjpsState) // Switch component behavior based on which state the machine is in { case INITIALIZE_STATE: //Check the status of PRIMITIVE MANIPULATOR mjpsQueryPmComponentStatus();

PAGE 150

134 if(mjpsPmState == EMERGENCY_STATE) { cError("mjps: PM in emergency state, switching to emergency state"); mjpsState = EMERGENCY_STATE; } if(mjpsPmState == STANDBY_STATE) { txMsgHeader.cmdCode = RESUME; txMsgHeader.dstInstId = 1; txMsgHeader.dstCompId = PRIMITIVE_MANIPULATOR; txMsgHeader.dstNodeId = mjpsNodeId; txMsgHeader.dstSubsId = mjpsSubsId ; txMsgHeader.dataBytes = 0; jmsSend(mjpsJms, &txMsgHeader, data, txMsgHeader.dataBytes); } if(mjpsPmState == READY_STATE) mjpsState = READY_STATE; break; case STANDBY_STATE: break; case READY_STATE: //Check the status of PRIMITIVE MANIPULATOR mjpsQueryPmComponentStatus(); if(mjpsPmState == EMERGENCY_STATE) { cError("mjps: PM in emergency state, switching to emergency state"); mjpsState = EMERGENCY_STATE; } // Set up the structure returning current sensor data reportedJointPosition.numJoints = NUM_JOINTS; for (i=0; i
PAGE 151

135 // Description: This thread is responsible for handling incoming JAUS messages from the Node Manager JAUS message service (Jms) // incoming messages are processed according to message type. void *mjpsNodemgrThread(void *threadData) { jmh_t rxMsgHeader, txMsgHeader; // Declare JAUS header data structures, where the jmh_t data structure is defined in jaus.h unsigned char data[DATASIZE]; createServiceConnection_t createServiceConnection; confirmServiceConnection_t confirmServiceConnection; activateServiceConnection_t activateServiceConnection; suspendServiceConnection_t suspendServiceConnection; terminateServiceConnection_t terminateServiceConnection; requestComponentControl_t requestComponentControl; confirmComponentControl_t confirmComponentControl; componentAuthority_t componentAuthority; componentStatus_t componentStatus; int recvCount; mjpsNodemgrThreadRunning = TRUE; // // Setup transmit header txMsgHeader.isExpMsg = 0; // not experimental msg USER: change to 1 if experimental txMsgHeader.isSvcMsg = 0; // not a service connection txMsgHeader.acknCtrl = 0; // no ack/nak txMsgHeader.priority = 6; // default priority txMsgHeader.reserved = 0; txMsgHeader.version = 1; // JAUS 3.0 txMsgHeader.srcInstId = mjpsInstId; txMsgHeader.srcCompId = MANIPULATOR_JOINT_POSITION_SENSOR; txMsgHeader.srcNodeId = mjpsNodeId; txMsgHeader.srcSubsId = mjpsSubsId; txMsgHeader.dataCtrl = 0; txMsgHeader.seqNumber = 0; while(mjpsRun) // Execute incoming JAUS message processing while not in the SHUTDOWN state { // Check for a new message in the Node Manager JMS queue // If a message is present then store the header information in rxMsgHeader, and store the message content information in the data buffer recvCount = jmsRecv(mjpsJms, &rxMsgHeader, data, DATASIZE); if(recvCount < 0) { cError("mjps: Node manager jmsRecv returned error: %d\n", recvCount); break; } if(recvCount == 0) continue; // This block of code is intended to reject commands from non-controlling components // However, the one exception allowed is a REQUEST_COMPONENT_CONTROL if(mjpsUnderControl && rxMsgHeader.cmdCode < 0x2000) // If not currently under control or it's not a command, then go to the switch statement { // If the source component isn't the one in control, and it's not a request to gain control, then exit this iteration of the while loop if( !( mjpsCtrlCmptInstId==rxMsgHeader.srcInstId && mjpsCtrlCmptCompId==rxMsgHeader.srcCompId && mjpsCtrlCmptNodeId==rxMsgHeader.srcNodeId && mjpsCtrlCmptSubsId==rxMsgHeader.srcSubsId)&& !( rxMsgHeader.cmdCode==REQUEST_COMPONENT_CONTROL) )continue; // to next iteration } switch(rxMsgHeader.cmdCode) // Switch the processing algorithm according to the JAUS message type {

PAGE 152

136 // Set the component authority according to the incoming authority code case SET_COMPONENT_AUTHORITY: convertComponentAuthority(data, &mjpsAuthority, DATASIZE, UNPACK); // Unpack and store the incoming authority code break; case SHUTDOWN: mjpsState = SHUTDOWN_STATE; break; case STANDBY: if(mjpsState == READY_STATE) mjpsState = STANDBY_STATE; break; case RESUME: if(mjpsState == STANDBY_STATE) mjpsState = READY_STATE; break; case RESET: mjpsState = INITIALIZE_STATE; break; case SET_EMERGENCY: mjpsState = EMERGENCY_STATE; break; case CLEAR_EMERGENCY: mjpsState = STANDBY_STATE; break; case CREATE_SERVICE_CONNECTION: convertCreateServiceConnection(data, &createServiceConnection, DATASIZE, UNPACK); if(createServiceConnection.cmdCode == REPORT_JOINT_POSITION) { mjpsScHeader = txMsgHeader; mjpsScHeader.isSvcMsg = 1; mjpsScHeader.dstInstId = rxMsgHeader.srcInstId; mjpsScHeader.dstCompId = rxMsgHeader.srcCompId; mjpsScHeader.dstNodeId = rxMsgHeader.srcNodeId; mjpsScHeader.dstSubsId = rxMsgHeader.srcSubsId; mjpsScHeader.cmdCode = REPORT_JOINT_POSITION; mjpsScHeader.seqNumber = 1; confirmServiceConnection.cmdCode = REPORT_JOINT_POSITION; confirmServiceConnection.instanceId = 1; confirmServiceConnection.confirmedRate = createServiceConnection.requestedRate; // BUG: The actual rate may not be the same as the request confirmServiceConnection.responseCode = CONNECTION_SUCCESSFUL; txMsgHeader.cmdCode = CONFIRM_SERVICE_CONNECTION; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = convertConfirmServiceConnection(data, &confirmServiceConnection, DATASIZE, PACK); jmsSend(mjpsJms, &txMsgHeader, data, txMsgHeader.dataBytes); mjpsScActive = TRUE; } else {

PAGE 153

137 confirmServiceConnection.cmdCode = createServiceConnection.cmdCode; confirmServiceConnection.instanceId = 1; confirmServiceConnection.confirmedRate = createServiceConnection.requestedRate; confirmServiceConnection.responseCode = CONNECTION_REFUSED; txMsgHeader.cmdCode = CONFIRM_SERVICE_CONNECTION; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = convertConfirmServiceConnection(data, &confirmServiceConnection, DATASIZE, PACK); jmsSend(mjpsJms, &txMsgHeader, data, txMsgHeader.dataBytes); } break; case CONFIRM_SERVICE_CONNECTION: convertConfirmServiceConnection(data, &confirmServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the confirm service connection message break; case ACTIVATE_SERVICE_CONNECTION: convertActivateServiceConnection(data, &activateServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the activate service connection message break; case SUSPEND_SERVICE_CONNECTION: convertSuspendServiceConnection(data, &suspendServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the suspend service connection message break; case TERMINATE_SERVICE_CONNECTION: convertTerminateServiceConnection(data, &terminateServiceConnection, DATASIZE, UNPACK); if (terminateServiceConnection.cmdCode == REPORT_JOINT_POSITION) mjpsScActive = FALSE; break; case REQUEST_COMPONENT_CONTROL: convertRequestComponentControl(data, &requestComponentControl, DATASIZE, UNPACK); if(mjpsUnderControl) { if(requestComponentControl > mjpsCtrlCmptAuthority) // Test for higher authority { // Terminate control of current component txMsgHeader.cmdCode = REJECT_COMPONENT_CONTROL; txMsgHeader.dstSubsId = mjpsCtrlCmptSubsId; txMsgHeader.dstNodeId = mjpsCtrlCmptNodeId; txMsgHeader.dstCompId = mjpsCtrlCmptCompId; txMsgHeader.dstInstId = mjpsCtrlCmptInstId; txMsgHeader.dataBytes = 0; jmsSend(mjpsJms, &txMsgHeader, data, txMsgHeader.dataBytes); // Accept control of new component txMsgHeader.cmdCode = CONFIRM_COMPONENT_CONTROL;

PAGE 154

138 txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; confirmComponentControl.asByte = 0; txMsgHeader.dataBytes = convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, PACK); jmsSend(mjpsJms, &txMsgHeader, data, txMsgHeader.dataBytes); mjpsCtrlCmptInstId = rxMsgHeader.srcInstId; mjpsCtrlCmptCompId = rxMsgHeader.srcCompId; mjpsCtrlCmptNodeId = rxMsgHeader.srcNodeId; mjpsCtrlCmptSubsId = rxMsgHeader.srcSubsId; mjpsCtrlCmptAuthority = requestComponentControl; } else { if( rxMsgHeader.srcSubsId != mjpsCtrlCmptSubsId || rxMsgHeader.srcNodeId != mjpsCtrlCmptNodeId || rxMsgHeader.srcCompId != mjpsCtrlCmptCompId || rxMsgHeader.srcInstId != mjpsCtrlCmptInstId ) { txMsgHeader.cmdCode = REJECT_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = 0; jmsSend(mjpsJms, &txMsgHeader, data, txMsgHeader.dataBytes); } } } else // Not currently under component control, so give control { txMsgHeader.cmdCode = CONFIRM_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; confirmComponentControl.asByte = 0; txMsgHeader.dataBytes = convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, PACK); jmsSend(mjpsJms, &txMsgHeader, data, txMsgHeader.dataBytes); mjpsCtrlCmptInstId = rxMsgHeader.srcInstId; mjpsCtrlCmptCompId = rxMsgHeader.srcCompId; mjpsCtrlCmptNodeId = rxMsgHeader.srcNodeId; mjpsCtrlCmptSubsId = rxMsgHeader.srcSubsId; mjpsCtrlCmptAuthority = requestComponentControl; mjpsUnderControl = TRUE; } break; case RELEASE_COMPONENT_CONTROL: mjpsUnderControl = FALSE; break; case CONFIRM_COMPONENT_CONTROL:

PAGE 155

139 convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, UNPACK); // USER: Insert code here to handle the confirm component control message if needed break; case REJECT_COMPONENT_CONTROL: // USER: Insert code here to handle the reject component control message if needed break; case QUERY_COMPONENT_AUTHORITY: txMsgHeader.cmdCode = REPORT_COMPONENT_AUTHORITY; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; componentAuthority = mjpsAuthority; txMsgHeader.dataBytes = convertComponentAuthority(data, &componentAuthority, DATASIZE, PACK); jmsSend(mjpsJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; case QUERY_COMPONENT_STATUS: txMsgHeader.cmdCode = REPORT_COMPONENT_STATUS; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; componentStatus.primaryStatus.asByte = mjpsState; txMsgHeader.dataBytes = convertComponentStatus(data, &componentStatus, DATASIZE, PACK); jmsSend(mjpsJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; case REPORT_COMPONENT_AUTHORITY: convertComponentAuthority(data, &componentAuthority, DATASIZE, UNPACK); // USER: Insert code here to handle the report component authority message if needed break; case REPORT_COMPONENT_STATUS: convertComponentStatus(data, &componentStatus, DATASIZE, UNPACK); if(rxMsgHeader.srcCompId == PRIMITIVE_MANIPULATOR) mjpsPmState = componentStatus.primaryStatus.asField.primaryStatusCode; break; case QUERY_JOINT_POSITION: txMsgHeader.cmdCode = REPORT_JOINT_POSITION; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dataBytes = convertJointPosition(data, &reportedJointPosition, DATASIZE, PACK); jmsSend(mjpsJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; default: break; } } mjpsNodemgrThreadRunning = FALSE; // pthread_exit(NULL);

PAGE 156

140 } //////////////////////////////////////////////////////////////////////////////////// // Function used to send a message to the primitive manipulator and query for // component status. Only the primitive manipulator component performs the initial // system checks. Thus it is essential that primitive manipulator is running and its // status is ready before any other components are started up. //////////////////////////////////////////////////////////////////////////////////// void mjpsQueryPmComponentStatus(void) { jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcInstId = mjpsInstId; txMsg.srcCompId = MANIPULATOR_JOINT_POSITION_SENSOR; txMsg.srcNodeId = mjpsNodeId; txMsg.srcSubsId = mjpsSubsId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = QUERY_COMPONENT_STATUS; txMsg.dstInstId = 1; txMsg.dstCompId = PRIMITIVE_MANIPULATOR; txMsg.dstNodeId = mjpsNodeId; txMsg.dstSubsId = mjpsSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(mjpsJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } ///////////////////////////////////////////////////////////////////////////////////////// // File: mjps.h // Version: 0.1 Original Creation // Written by: Ognjen Sosa (ognjensosa@hotmail.com) // Template by: Tom Galluzzo (galluzzt@ufl.edu) // Date: 09/28/2004 // // Description: This file contains the skeleton C header file code for implementing // the mjps.c file ///////////////////////////////////////////////////////////////////////////////////////// #ifndef MJPS_H #define MJPS_H #include "jaus.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define MJPS_NODE_MANAGER_CHECKIN_ERROR -1 #define MJPS_JMS_OPEN_ERROR -2 #define MJPS_STARTUP_BEFORE_SHUTDOWN_ERROR -3 #define MJPS_STATE_THREAD_CREATE_ERROR -4 #define MJPS_NODEMGR_THREAD_CREATE_ERROR -5

PAGE 157

141 #define MJPS_THREAD_TIMEOUT_SEC 1.0 // Public int mjpsStartup(void); int mjpsShutdown(void); int mjpsGetState(void); unsigned char mjpsGetInstanceId(void); unsigned char mjpsGetCompId(void); unsigned char mjpsGetNodeId(void); unsigned char mjpsGetSubsystemId(void); double mjpsGetUpdateRate(void); int mjpsGetPmState(void); // Query messages void mjpsQueryPmComponentStatus(void); // Private accessors jointPosition_t mjpsReportJointPosition(void); #endif // MJPS_H B.4 The Meepd.c File and the Corresponding Header Meepd.h ///////////////////////////////////////////////////////////////////////////////////////// // File: meepd.c // Version: 0.1 Original Creation // Written by: Ognjen Sosa (ognjensosa@hotmail.com) // Template by: Tom Galluzzo (galluzzt@ufl.edu) // Date: 09/28/2004 // // Description: This file contains the C code for implementation of a Manipulator // Joint Move Driver JAUS component in a Linux environment. This code // is designed to work with the node manager and JAUS library software // written by Jeff Witt ///////////////////////////////////////////////////////////////////////////////////////// #include // JAUS message set (USER: JAUS libraries must be installed first) #include // Multi-threading functions (standard to unix) #include // Precise timing routines (USER: must link timeLib.c, written by Tom Galluzzo) #include // Unix standard functions #include // Unix standard input-output #include // Mathematical functions #include // Node managment functions for sending and receiving JAUS messages (USER: Node Manager must be installed) #include "meepd.h" // USER: Implement and rename this header file. Include prototypes for all public functions contained in this file. #include "mcConstants.h" #include "galilInterface.h" // Access to setMaxSpeed() function #include "cppInterface.h" #include "logLib.h" #define DATASIZE JDATASIZE // Default size for byte stream buffers in this file // Private function prototypes void *meepdStateThread(void *); void *meepdNodemgrThread(void *); // Query messages requested by this component void meepdQueryPmComponentStatus(void); void meepdQueryPmJointEffort(void); void meepdQueryMjpsJointPosition(void); void meepdQueryPmManipulatorSpecifications(void); // Set messages that this component commands void meepdSetPmJointEffort(void);

PAGE 158

142 // Accessors to incoming information toolPoint_t meepdSetToolPoint(void); endEffectorPose_t meepdSetEndEffectorPose(void); jointEffort_t meepdReportJointEffort(void); manipulatorSpecifications_t meepdReportManipulatorSpecifications(void); jointPosition_t meepdReportJointPosition(void); // Accessors to outgoing information toolPoint_t meepdReportToolPoint(void); jointEffort_t meepdSetJointEffort(void); // Accessots to other information double meepdGetCurrentOrientation(void); unsigned char meepdInstId, meepdNodeId, meepdSubsId; // JAUS Instance, Node and Subsystem IDs for this component componentAuthority_t meepdAuthority = 0; // JAUS Authority for this component int meepdState = SHUTDOWN_STATE; // JAUS State double meepdThreadHz; // Stores the calculated update rate for main state thread unsigned char meepdCtrlCmptInstId, meepdCtrlCmptCompId; // Stores identity of the component currently in control unsigned char meepdCtrlCmptNodeId, meepdCtrlCmptSubsId; // Stores identity of the component currently in control unsigned char meepdCtrlCmptAuthority; // Stores the authority level of the component currently in control int meepdUnderControl = FALSE; // FALSE not under control, TRUE is under control int meepdRun = FALSE; int meepdStateThreadRunning = FALSE; pthread_t meepdStateThreadId; // pthread node manager thread identifier int meepdNodemgrThreadRunning = FALSE; pthread_t meepdNodemgrThreadId; // pthread node manager thread identifier // Structure storing incoming request under case SET TOOL POINT static toolPoint_t setToolPoint_6; // Structure storing incoming request under case SET END EFFECTOR POSE static endEffectorPose_t setEndEffectorPose; // Structure storing incoming request under case QUERY_TOOL_POINT static toolPoint_t reportedToolPoint; // Structures storing queried information static jointEffort_t reportedJointEffort; // Structure storing outgoing request to the PRIMITIVE MANIPULATOR static jointEffort_t setJointEffort; static double max_speed[NUM_JOINTS], max_acceleration[NUM_JOINTS], max_deceleration[NUM_JOINTS]; static double cmd_position[NUM_JOINTS]; static int num_soln; static double orientS[3], orientA[3]; static double des_position[3], des_orientS[3], des_orientA[3], curr_orientation[4]; jmh_t meepdScHeader; jms_t meepdJms; // An accessor to the Node Manager JAUS Message Service (Jms) for this component int meepdScActive = FALSE; int meepdPmState = -1; unsigned char meepdPmNodeId = 0; int meepdPmControl = FALSE; static manipulatorSpecifications_t reportedManipulatorSpecifications; static jointPosition_t reportedJointPosition;

PAGE 159

143 // Function: meepdStartup // Access: Public // Description: This function allows the abstracted component functionality contained in this file to be started from an external source. // It must be called first before the component state machine and node manager interaction will begin // Each call to "meepdStartup" should be followed by one call to the "cmptShutdown" function int meepdStartup(void) { pthread_attr_t attr; // Thread attributed for the component threads spawned in this function if(meepdState == SHUTDOWN_STATE) // Execute the startup routines only if the component is not running { // Check in to the Node Manager and obtain Instance, Node and Subsystem IDs if(jcmCheckIn(MANIPULATOR_END_EFFECTOR_POSE_DRIVER, &meepdInstId, &meepdNodeId, &meepdSubsId) < 0) // USER: Insert your component ID define on this line { cError("meepd: Could not check in to nodemgr\n"); return MEEPD_NODE_MANAGER_CHECKIN_ERROR; } // Open a conection to the Node Manager and obtain a Jms accessor if((meepdJms = jmsOpen(MANIPULATOR_END_EFFECTOR_POSE_DRIVER, meepdInstId, 0)) == NULL) // USER: Insert your component ID define on this line { cError("meepd: Could not open connection to nodemgr\n"); jcmCheckOut(MANIPULATOR_END_EFFECTOR_POSE_DRIVER, meepdInstId); // USER: Insert your component ID define on this line return MEEPD_JMS_OPEN_ERROR; } meepdJms->timeout.tv_usec = 100000; // Timeout for non-blocking jmsRecv, specified in micro seconds pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); meepdState = INITIALIZE_STATE; // Set the state of the JAUS state machine to INITIALIZE meepdRun = TRUE; if(pthread_create(&meepdStateThreadId, &attr, meepdStateThread, NULL) != 0) { cError("meepd: Could not create meepdStateThread\n"); meepdShutdown(); return MEEPD_STATE_THREAD_CREATE_ERROR; } if(pthread_create(&meepdNodemgrThreadId, &attr, meepdNodemgrThread, NULL) != 0) { cError("meepd: Could not create meepdNodemgrThread\n"); meepdShutdown(); return MEEPD_NODEMGR_THREAD_CREATE_ERROR; } pthread_attr_destroy(&attr); } else { cError("meepd: Attempted startup while not shutdown\n"); return MEEPD_STARTUP_BEFORE_SHUTDOWN_ERROR; } return 0;

PAGE 160

144 } // Function: meepdShutdown // Access: Public // Description: This function allows the abstracted component functionality contained in this file to be stoped from an external source. // If the component is in the running state, this function will terminate all threads running in this file // This function will also close the Jms connection to the Node Manager and check out the component from the Node Manager int meepdShutdown(void) { double timeOutSec; if(meepdState != SHUTDOWN_STATE) // Execute the startup routines only if the component is not running { meepdRun = FALSE; timeOutSec = getTimeSeconds() + MEEPD_THREAD_TIMEOUT_SEC; while(meepdStateThreadRunning) { usleep(100000); if(getTimeSeconds() >= timeOutSec) { pthread_cancel(meepdStateThreadId); meepdStateThreadRunning = FALSE; cError("meepd: meepdStateThread Shutdown Improperly\n"); break; } } timeOutSec = getTimeSeconds() + MEEPD_THREAD_TIMEOUT_SEC; while(meepdNodemgrThreadRunning) { usleep(100000); if(getTimeSeconds() >= timeOutSec) { pthread_cancel(meepdNodemgrThreadId); meepdNodemgrThreadRunning = FALSE; cError("meepd: meepdNodemgrThread Shutdown Improperly\n"); break; } } // Close Node Manager Connection and check out jmsClose(meepdJms); jcmCheckOut(MANIPULATOR_END_EFFECTOR_POSE_DRIVER, meepdInstId); // USER: Insert your component ID define on this line meepdState = SHUTDOWN_STATE; } return 0; } // The series of functions below allow public access to essential component information // Access: Public (All) int meepdGetState(void){ return meepdState; } unsigned char meepdGetInstanceId(void){ return meepdInstId; } unsigned char meepdGetCompId(void){ return (unsigned char)MANIPULATOR_END_EFFECTOR_POSE_DRIVER; } unsigned char meepdGetNodeId(void){ return meepdNodeId; } unsigned char meepdGetSubsystemId(void){ return meepdSubsId; } double meepdGetUpdateRate(void){ return meepdThreadHz; } int meepdGetPmState(void){ return meepdPmState; } // USER: Insert any additional public variable accessors here toolPoint_t meepdSetToolPoint(void) {return &setToolPoint_6; } endEffectorPose_t meepdSetEndEffectorPose(void) {return &setEndEffectorPose; } jointEffort_t meepdReportJointEffort(void) { return &reportedJointEffort; }

PAGE 161

145 manipulatorSpecifications_t meepdReportPmManipulatorSpecifications(void) { return &reportedManipulatorSpecifications; } jointPosition_t meepdReportJointPosition(void) { return &reportedJointPosition; } toolPoint_t meepdReportToolPoint(void) { return &reportedToolPoint; } jointEffort_t meepdSetJointEffort(void) { return &setJointEffort; } double meepdGetCurrentOrientation(void) { return curr_orientation; } // Function: meepdThread // Access: Private // Description: All core component functionality is contained in this thread. // All of the JAUS component state machine code can be found here. void *meepdStateThread(void *threadData) { jmh_t txMsgHeader; double time, prevTime; unsigned char data[DATASIZE]; int i; double curr_position[NUM_JOINTS], curr_effort[NUM_JOINTS], cmd_effort[NUM_JOINTS], curr_tool_point[3], tool_point_6[3], cmd_position[3], cmd_orientation[4]; double spec_a[NUM_JOINTS-1], spec_alpha[NUM_JOINTS-1], spec_S[NUM_JOINTS]; meepdStateThreadRunning = TRUE; // // Setup transmit header txMsgHeader.isExpMsg = 0; // not experimental msg USER: change to 1 if experimental txMsgHeader.isSvcMsg = 0; // not a service connection txMsgHeader.acknCtrl = 0; // no ack/nak txMsgHeader.priority = 6; // default priority txMsgHeader.reserved = 0; txMsgHeader.version = 1; // JAUS 3.0u txMsgHeader.srcInstId = meepdInstId; txMsgHeader.srcCompId = MANIPULATOR_END_EFFECTOR_POSE_DRIVER; txMsgHeader.srcNodeId = meepdNodeId; txMsgHeader.srcSubsId = meepdSubsId; txMsgHeader.dataCtrl = 0; txMsgHeader.seqNumber = 0; time = getTimeSeconds(); meepdState = INITIALIZE_STATE; // Set JAUS state to INITIALIZE while(meepdRun) // Execute state machine code while not in the SHUTDOWN state { prevTime = time; time = getTimeSeconds(); meepdThreadHz = 1.0/(time-prevTime); // Compute the update rate of this thread switch(meepdState) // Switch component behavior based on which state the machine is in { case INITIALIZE_STATE: //Check the status of PRIMITIVE MANIPULATOR meepdQueryPmComponentStatus(); if(meepdPmState == EMERGENCY_STATE) { cError("meepd: PM in emergency state, switching to emergency state"); meepdState = EMERGENCY_STATE; } if(meepdPmState == STANDBY_STATE) { txMsgHeader.cmdCode = RESUME; txMsgHeader.dstInstId = 1; txMsgHeader.dstCompId = PRIMITIVE_MANIPULATOR; txMsgHeader.dstNodeId = meepdNodeId; txMsgHeader.dstSubsId = meepdSubsId ; txMsgHeader.dataBytes = 0; jmsSend(meepdJms, &txMsgHeader, data, txMsgHeader.dataBytes);

PAGE 162

146 } if(meepdPmState == READY_STATE) meepdState = STANDBY_STATE; break; case STANDBY_STATE: break; case READY_STATE: // Set up default velocity, acceleration, and deceleration values for (i=0; i
PAGE 163

147 } for(i=0; i
PAGE 164

148 des_orientA[2] = 0.022070; */ /* des_position[0] = 908; des_position[1] = -602; des_position[2] = 512; des_orientS[0] = -0.6229841; des_orientS[1] = 0.68939257; des_orientS[2] = -0.3696331; des_orientA[0] = -0.4888207; des_orientA[1] = -0.02581027; des_orientA[2] = 0.87200234; matrixToQuaternion(des_orientA, des_orientS, cmd_orientation); */ // Extract information about desired position and orientation des_position[0] = setEndEffectorPose.X 1000; // mm des_position[1] = setEndEffectorPose.Y 1000; des_position[2] = setEndEffectorPose.Z 1000; cmd_orientation[0] = setEndEffectorPose.quaternionQcomponentD; cmd_orientation[1] = setEndEffectorPose.quaternionQcomponentA; cmd_orientation[2] = setEndEffectorPose.quaternionQcomponentB; cmd_orientation[3] = setEndEffectorPose.quaternionQcomponentC; cDebug(9, "Set Tool Point %lf\n", des_position[0] ); cDebug(9, "Set Tool Point %lf\n", des_position[1] ); cDebug(9, "Set Tool Point %lf\n", des_position[2] ); cDebug(9, "\n"); quaternionToMatrix(cmd_orientation, des_orientS, des_orientA); // This function returns the joint angles corresponding to the desired pose getDesiredJointAngles(des_position, des_orientS, des_orientA, cmd_position); cDebug(9, "Cmd Positions are: %lf\n", cmd_position[0]*J1_RAD_TO_ENC); cDebug(9, "Cmd Positions are: %lf\n", cmd_position[1]*J2_RAD_TO_ENC); cDebug(9, "Cmd Positions are: %lf\n", cmd_position[2]*J3_RAD_TO_ENC); cDebug(9, "Cmd Positions are: %lf\n", cmd_position[3]*J4_RAD_TO_ENC); cDebug(9, "Cmd Positions are: %lf\n", cmd_position[4]*J5_RAD_TO_ENC); cDebug(9, "Cmd Positions are: %lf\n", cmd_position[5]*J6_RAD_TO_ENC); // This function performs closed loop end effector pose control endEffectorPoseDriver(cmd_position, curr_position, cmd_effort); // Set Joint Efforts setJointEffort.numJoints = NUM_JOINTS; for (i=0; i
PAGE 165

149 case EMERGENCY_STATE: break; case FAILURE_STATE: break; case SHUTDOWN_STATE: break; default: meepdState = FAILURE_STATE; // The default case is undefined, therefore go into Failure State break; } usleep(1000); // Sleep for one millisecond } // Sleep for 50 milliseconds and then exit usleep(50000); meepdStateThreadRunning = FALSE; pthread_exit(NULL); } // Function: meepdNodemgrThread // Access: Private // Description: This thread is responsible for handling incoming JAUS messages from the Node Manager JAUS message service (Jms) // incoming messages are processed according to message type. void *meepdNodemgrThread(void *threadData) { jmh_t rxMsgHeader, txMsgHeader; // Declare JAUS header data structures, where the jmh_t data structure is defined in jaus.h unsigned char data[DATASIZE]; createServiceConnection_t createServiceConnection; confirmServiceConnection_t confirmServiceConnection; activateServiceConnection_t activateServiceConnection; suspendServiceConnection_t suspendServiceConnection; terminateServiceConnection_t terminateServiceConnection; requestComponentControl_t requestComponentControl; confirmComponentControl_t confirmComponentControl; componentAuthority_t componentAuthority; componentStatus_t componentStatus; int recvCount; meepdNodemgrThreadRunning = TRUE; // // Setup transmit header txMsgHeader.isExpMsg = 0; // not experimental msg USER: change to 1 if experimental txMsgHeader.isSvcMsg = 0; // not a service connection txMsgHeader.acknCtrl = 0; // no ack/nak txMsgHeader.priority = 6; // default priority txMsgHeader.reserved = 0; txMsgHeader.version = 1; // JAUS 3.0 txMsgHeader.srcInstId = meepdInstId; txMsgHeader.srcCompId = MANIPULATOR_END_EFFECTOR_POSE_DRIVER; txMsgHeader.srcNodeId = meepdNodeId; txMsgHeader.srcSubsId = meepdSubsId; txMsgHeader.dataCtrl = 0; txMsgHeader.seqNumber = 0; while(meepdRun) // Execute incoming JAUS message processing while not in the SHUTDOWN state { // Check for a new message in the Node Manager JMS queue // If a message is present then store the header information in rxMsgHeader, and store the message content information in the data buffer recvCount = jmsRecv(meepdJms, &rxMsgHeader, data, DATASIZE); if(recvCount < 0)

PAGE 166

150 { cError("meepd: Node manager jmsRecv returned error: %d\n", recvCount); break; } if(recvCount == 0) continue; // This block of code is intended to reject commands from non-controlling components // However, the one exception allowed is a REQUEST_COMPONENT_CONTROL if(meepdUnderControl && rxMsgHeader.cmdCode < 0x2000) // If not currently under control or it's not a command, then go to the switch statement { // If the source component isn't the one in control, and it's not a request to gain control, then exit this iteration of the while loop if( !( meepdCtrlCmptInstId==rxMsgHeader.srcInstId && meepdCtrlCmptCompId==rxMsgHeader.srcCompId && meepdCtrlCmptNodeId==rxMsgHeader.srcNodeId && meepdCtrlCmptSubsId==rxMsgHeader.srcSubsId)&& !( rxMsgHeader.cmdCode==REQUEST_COMPONENT_CONTROL) )continue; // to next iteration } switch(rxMsgHeader.cmdCode) // Switch the processing algorithm according to the JAUS message type { // Set the component authority according to the incoming authority code case SET_COMPONENT_AUTHORITY: convertComponentAuthority(data, &meepdAuthority, DATASIZE, UNPACK); // Unpack and store the incoming authority code break; case SHUTDOWN: meepdState = SHUTDOWN_STATE; break; case STANDBY: if(meepdState == READY_STATE) meepdState = STANDBY_STATE; break; case RESUME: if(meepdState == STANDBY_STATE) meepdState = READY_STATE; break; case RESET: meepdState = INITIALIZE_STATE; break; case SET_EMERGENCY: meepdState = EMERGENCY_STATE; break; case CLEAR_EMERGENCY: meepdState = STANDBY_STATE; break; case CREATE_SERVICE_CONNECTION: convertCreateServiceConnection(data, &createServiceConnection, DATASIZE, UNPACK); if(createServiceConnection.cmdCode == REPORT_JOINT_VELOCITY) { meepdScHeader = txMsgHeader; meepdScHeader.isSvcMsg = 1; meepdScHeader.dstInstId = rxMsgHeader.srcInstId; meepdScHeader.dstCompId = rxMsgHeader.srcCompId; meepdScHeader.dstNodeId = rxMsgHeader.srcNodeId; meepdScHeader.dstSubsId = rxMsgHeader.srcSubsId;

PAGE 167

151 meepdScHeader.cmdCode = REPORT_JOINT_VELOCITY; meepdScHeader.seqNumber = 1; confirmServiceConnection.cmdCode = REPORT_JOINT_VELOCITY; confirmServiceConnection.instanceId = 1; confirmServiceConnection.confirmedRate = createServiceConnection.requestedRate; // BUG: The actual rate may not be the same as the request confirmServiceConnection.responseCode = CONNECTION_SUCCESSFUL; txMsgHeader.cmdCode = CONFIRM_SERVICE_CONNECTION; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = convertConfirmServiceConnection(data, &confirmServiceConnection, DATASIZE, PACK); jmsSend(meepdJms, &txMsgHeader, data, txMsgHeader.dataBytes); meepdScActive = TRUE; } else { confirmServiceConnection.cmdCode = createServiceConnection.cmdCode; confirmServiceConnection.instanceId = 1; confirmServiceConnection.confirmedRate = createServiceConnection.requestedRate; confirmServiceConnection.responseCode = CONNECTION_REFUSED; txMsgHeader.cmdCode = CONFIRM_SERVICE_CONNECTION; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = convertConfirmServiceConnection(data, &confirmServiceConnection, DATASIZE, PACK); jmsSend(meepdJms, &txMsgHeader, data, txMsgHeader.dataBytes); } break; case CONFIRM_SERVICE_CONNECTION: convertConfirmServiceConnection(data, &confirmServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the confirm service connection message break; case ACTIVATE_SERVICE_CONNECTION: convertActivateServiceConnection(data, &activateServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the activate service connection message break; case SUSPEND_SERVICE_CONNECTION: convertSuspendServiceConnection(data, &suspendServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the suspend service connection message break; case TERMINATE_SERVICE_CONNECTION: convertTerminateServiceConnection(data, &terminateServiceConnection, DATASIZE, UNPACK); if (terminateServiceConnection.cmdCode == REPORT_JOINT_VELOCITY) meepdScActive = FALSE;

PAGE 168

152 break; case REQUEST_COMPONENT_CONTROL: convertRequestComponentControl(data, &requestComponentControl, DATASIZE, UNPACK); if(meepdUnderControl) { if(requestComponentControl > meepdCtrlCmptAuthority) // Test for higher authority { // Terminate control of current component txMsgHeader.cmdCode = REJECT_COMPONENT_CONTROL; txMsgHeader.dstSubsId = meepdCtrlCmptSubsId; txMsgHeader.dstNodeId = meepdCtrlCmptNodeId; txMsgHeader.dstCompId = meepdCtrlCmptCompId; txMsgHeader.dstInstId = meepdCtrlCmptInstId; txMsgHeader.dataBytes = 0; jmsSend(meepdJms, &txMsgHeader, data, txMsgHeader.dataBytes); // Accept control of new component txMsgHeader.cmdCode = CONFIRM_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; confirmComponentControl.asByte = 0; txMsgHeader.dataBytes = convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, PACK); jmsSend(meepdJms, &txMsgHeader, data, txMsgHeader.dataBytes); meepdCtrlCmptInstId = rxMsgHeader.srcInstId; meepdCtrlCmptCompId = rxMsgHeader.srcCompId; meepdCtrlCmptNodeId = rxMsgHeader.srcNodeId; meepdCtrlCmptSubsId = rxMsgHeader.srcSubsId; meepdCtrlCmptAuthority = requestComponentControl; } else { if( rxMsgHeader.srcSubsId != meepdCtrlCmptSubsId || rxMsgHeader.srcNodeId != meepdCtrlCmptNodeId || rxMsgHeader.srcCompId != meepdCtrlCmptCompId || rxMsgHeader.srcInstId != meepdCtrlCmptInstId ) { txMsgHeader.cmdCode = REJECT_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = 0; jmsSend(meepdJms, &txMsgHeader, data, txMsgHeader.dataBytes); } } } else // Not currently under component control, so give control {

PAGE 169

153 txMsgHeader.cmdCode = CONFIRM_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; confirmComponentControl.asByte = 0; txMsgHeader.dataBytes = convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, PACK); jmsSend(meepdJms, &txMsgHeader, data, txMsgHeader.dataBytes); meepdCtrlCmptInstId = rxMsgHeader.srcInstId; meepdCtrlCmptCompId = rxMsgHeader.srcCompId; meepdCtrlCmptNodeId = rxMsgHeader.srcNodeId; meepdCtrlCmptSubsId = rxMsgHeader.srcSubsId; meepdCtrlCmptAuthority = requestComponentControl; meepdUnderControl = TRUE; } break; case RELEASE_COMPONENT_CONTROL: meepdUnderControl = FALSE; break; case CONFIRM_COMPONENT_CONTROL: convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, UNPACK); // USER: Insert code here to handle the confirm component control message if needed break; case REJECT_COMPONENT_CONTROL: // USER: Insert code here to handle the reject component control message if needed break; case QUERY_COMPONENT_AUTHORITY: txMsgHeader.cmdCode = REPORT_COMPONENT_AUTHORITY; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; componentAuthority = meepdAuthority; txMsgHeader.dataBytes = convertComponentAuthority(data, &componentAuthority, DATASIZE, PACK); jmsSend(meepdJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; case QUERY_COMPONENT_STATUS: txMsgHeader.cmdCode = REPORT_COMPONENT_STATUS; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; componentStatus.primaryStatus.asByte = meepdState; txMsgHeader.dataBytes = convertComponentStatus(data, &componentStatus, DATASIZE, PACK); jmsSend(meepdJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; case REPORT_COMPONENT_AUTHORITY: convertComponentAuthority(data, &componentAuthority, DATASIZE, UNPACK); // USER: Insert code here to handle the report component authority message if needed break; case REPORT_COMPONENT_STATUS: convertComponentStatus(data, &componentStatus, DATASIZE, UNPACK);

PAGE 170

154 if(rxMsgHeader.srcCompId == PRIMITIVE_MANIPULATOR) meepdPmState = componentStatus.primaryStatus.asField.primaryStatusCode; break; case SET_TOOL_POINT: convertToolPoint(data, &setToolPoint_6, DATASIZE, UNPACK); break; case SET_END_EFFECTOR_POSE: convertEndEffectorPose(data, &setEndEffectorPose, DATASIZE, UNPACK); break; case REPORT_JOINT_EFFORT: convertJointEffort(data, &reportedJointEffort, DATASIZE, UNPACK); break; case REPORT_MANIPULATOR_SPECIFICATIONS: convertManipulatorSpecifications(data, &reportedManipulatorSpecifications, DATASIZE, UNPACK); break; case REPORT_JOINT_POSITION: convertJointPosition(data, &reportedJointPosition, DATASIZE, UNPACK); break; case QUERY_TOOL_POINT: txMsgHeader.cmdCode = REPORT_TOOL_POINT; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dataBytes = convertToolPoint(data, &reportedToolPoint, DATASIZE, PACK); jmsSend(meepdJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; default: break; } } meepdNodemgrThreadRunning = FALSE; pthread_exit(NULL); } //////////////////////////////////////////////////////////////////////////////////// // Function used to send a message to the primitive manipulator and query for // component status. Only the primitive manipulator component performs the initial // system checks. Thus it is essential that primitive manipulator is running and its // status is ready before any other components are started up. //////////////////////////////////////////////////////////////////////////////////// void meepdQueryPmComponentStatus(void) { jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcInstId = meepdInstId;

PAGE 171

155 txMsg.srcCompId = MANIPULATOR_END_EFFECTOR_POSE_DRIVER; txMsg.srcNodeId = meepdNodeId; txMsg.srcSubsId = meepdSubsId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = QUERY_COMPONENT_STATUS; txMsg.dstInstId = 1; txMsg.dstCompId = PRIMITIVE_MANIPULATOR; txMsg.dstNodeId = meepdNodeId; txMsg.dstSubsId = meepdSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(meepdJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } //////////////////////////////////////////////////////////////////////////////////// // Function used to set up a message sent to manipulator joint position sensor // to obtain current joint position data. //////////////////////////////////////////////////////////////////////////////////// void meepdQueryMjpsJointPosition(void) { jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcSubsId = meepdSubsId; txMsg.srcNodeId = meepdNodeId; txMsg.srcCompId = MANIPULATOR_END_EFFECTOR_POSE_DRIVER; txMsg.srcInstId = meepdInstId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = QUERY_JOINT_POSITION; txMsg.dstInstId = 1; txMsg.dstCompId = MANIPULATOR_JOINT_POSITION_SENSOR; txMsg.dstNodeId = meepdNodeId; txMsg.dstSubsId = meepdSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(meepdJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } //////////////////////////////////////////////////////////////////////////////////// // Function used to set up a message sent to the primitive manipulator to obtain // current effort values. //////////////////////////////////////////////////////////////////////////////////// void meepdQueryPmJointEffort(void) { jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6;

PAGE 172

156 txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcSubsId = meepdSubsId; txMsg.srcNodeId = meepdNodeId; txMsg.srcCompId = MANIPULATOR_END_EFFECTOR_POSE_DRIVER; txMsg.srcInstId = meepdInstId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = QUERY_JOINT_EFFORT; txMsg.dstInstId = 1; txMsg.dstCompId = PRIMITIVE_MANIPULATOR; txMsg.dstNodeId = meepdNodeId; txMsg.dstSubsId = meepdSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(meepdJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } //////////////////////////////////////////////////////////////////////////////////// // Function used to set up a message sent to the primitive manipulator to obtain // manipulator specifications. //////////////////////////////////////////////////////////////////////////////////// void meepdQueryPmManipulatorSpecifications(void) { jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcSubsId = meepdSubsId; txMsg.srcNodeId = meepdNodeId; txMsg.srcCompId = MANIPULATOR_END_EFFECTOR_POSE_DRIVER; txMsg.srcInstId = meepdInstId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = QUERY_MANIPULATOR_SPECIFICATIONS; txMsg.dstInstId = 1; txMsg.dstCompId = PRIMITIVE_MANIPULATOR; txMsg.dstNodeId = meepdNodeId; txMsg.dstSubsId = meepdSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(meepdJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } //////////////////////////////////////////////////////////////////////////////////// // Function used to set up a message sent to the primitive manipulator with new // joint effort values. //////////////////////////////////////////////////////////////////////////////////// void meepdSetPmJointEffort(void) { jmh_t txMsg; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0;

PAGE 173

157 unsigned char data[DATASIZE]; //Setup Transmit Message txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcInstId = meepdInstId; txMsg.srcCompId = MANIPULATOR_END_EFFECTOR_POSE_DRIVER; txMsg.srcNodeId = meepdNodeId; txMsg.srcSubsId = meepdSubsId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = SET_JOINT_EFFORT; txMsg.dstInstId = 1; txMsg.dstCompId = PRIMITIVE_MANIPULATOR; txMsg.dstNodeId = meepdNodeId; txMsg.dstSubsId = meepdSubsId; txMsg.dataBytes = convertJointEffort(data, &setJointEffort, DATASIZE, PACK); if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(meepdJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } //////////////////////////////////////////////////////////////////////////////////// // Function used to perform closed loop end-effector position control //////////////////////////////////////////////////////////////////////////////////// void endEffectorPoseDriver(double *cmd_position, double *curr_position, double *cmd_effort) { int i; double k[NUM_JOINTS]; for (i=0; i
PAGE 174

158 double M4, M5, M6; double M8, M9, M10; M0 = orientA[0]; M4 = orientA[1]; M8 = orientA[2]; M1 = orientS[1]*orientA[2] orientS[2]*orientA[1]; M5 = orientS[2]*orientA[0] orientS[0]*orientA[2]; M9 = orientS[0]*orientA[1] orientS[1]*orientA[0]; M2 = orientS[0]; M6 = orientS[1]; M10 = orientS[2]; T = M0 + M5 + M10 + 1; S = 0.5/sqrt(T); W = 0.25/S; X = (M9 M6)*S; Y = (M2 M8)*S; Z = (M4 M1)*S; curr_orientation[0] = W; curr_orientation[1] = X; curr_orientation[2] = Y; curr_orientation[3] = Z; } void quaternionToMatrix(double *cmd_orientation,double *des_orientS, double *des_orientA) { double W, X, Y, Z; double M0, M1, M2; double M4, M5, M6; double M8, M9, M10; W = cmd_orientation[0]; X = cmd_orientation[1]; Y = cmd_orientation[2]; Z = cmd_orientation[3]; M0 = 1 2*Y*Y 2*Z*Z; M4 = 2*X*Y + 2*Z*W; M8 = 2*X*Z 2*Y*W; M1 = 2*X*Y 2*Z*W; M5 = 1 2*X*X 2*Z*Z; M9 = 2*Y*Z + 2*X*W; M2 = 2*X*Z + 2*Y*W; M6 = 2*Y*Z 2*X*W; M10 = 1 2*X*X 2*Y*Y; des_orientA[0] = M0; des_orientA[1] = M4; des_orientA[2] = M8; des_orientS[0] = M2; des_orientS[1] = M6; des_orientS[2] = M10; } ///////////////////////////////////////////////////////////////////////////////////////// // File: meepd.h // Version: 0.1 Original Creation // Written by: Ognjen Sosa (ognjensosa@hotmail.com) // Template by: Tom Galluzzo (galluzzt@ufl.edu)

PAGE 175

159 // Date: 09/28/2004 // // Description: This file contains the skeleton C header file code for implementing // the meepd.c file ///////////////////////////////////////////////////////////////////////////////////////// #ifndef MEEPD_H #define MEEPD_H #include "jaus.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define MEEPD_NODE_MANAGER_CHECKIN_ERROR -1 #define MEEPD_JMS_OPEN_ERROR -2 #define MEEPD_STARTUP_BEFORE_SHUTDOWN_ERROR -3 #define MEEPD_STATE_THREAD_CREATE_ERROR -4 #define MEEPD_NODEMGR_THREAD_CREATE_ERROR -5 #define MEEPD_THREAD_TIMEOUT_SEC 1.0 // Public int meepdStartup(void); int meepdShutdown(void); int meepdGetState(void); unsigned char meepdGetInstanceId(void); unsigned char meepdGetCompId(void); unsigned char meepdGetNodeId(void); unsigned char meepdGetSubsystemId(void); double meepdGetUpdateRate(void); int meepdGetPmState(void); // Query messages requested by this component void meepdQueryPmComponentStatus(void); void meepdQueryPmJointEffort(void); void meepdQueryMjpsJointPosition(void); void meepdQueryPmManipulatorSpecifications(void); // Set messages that this component commands void meepdSetPmJointEffort(void); // Accessors to incoming information toolPoint_t meepdSetToolPoint(void); endEffectorPose_t meepdSetEndEffectorPose(void); jointEffort_t meepdReportJointEffort(void); manipulatorSpecifications_t meepdReportManipulatorSpecifications(void); jointPosition_t meepdReportJointPosition(void); // Accessors to outgoing information toolPoint_t meepdReportToolPoint(void); jointEffort_t meepdSetJointEffort(void); double meepdGetCurrentOrientation(void); void endEffectorPoseDriver(double *, double *, double *); void matrixToQuaternion(double *, double *, double *); void quaternionToMatrix(double *, double *, double *); #endif // MEEPD_H B.5 The Meedpd.c File and the Corresponding Header Meedpd.h ///////////////////////////////////////////////////////////////////////////////////////// // File: meedpd.c

PAGE 176

160 // Version: 0.1 Original Creation // Written by: Ognjen Sosa (ognjensosa@hotmail.com) // Template by: Tom Galluzzo (galluzzt@ufl.edu) // Date: 09/28/2004 // // Description: This file contains the C code for implementation of a Manipulator // End-Effector Discrete Pose Driver JAUS component in a Linux // environment. This code is designed to work with the node manager // and JAUS library software written by Jeff Witt ///////////////////////////////////////////////////////////////////////////////////////// #include // JAUS message set (USER: JAUS libraries must be installed first) #include // Multi-threading functions (standard to unix) #include // Precise timing routines (USER: must link timeLib.c, written by Tom Galluzzo) #include // Unix standard functions #include // Unix standard input-output #include // Mathematical functions #include // Node managment functions for sending and receiving JAUS messages (USER: Node Manager must be installed) #include "meedpd.h" // USER: Implement and rename this header file. Include prototypes for all public functions contained in this file. #include "mcConstants.h" #include "galilInterface.h" // Access to setMaxSpeed() function #include "cppInterface.h" #include "logLib.h" #define DATASIZE JDATASIZE // Default size for byte stream buffers in this file // Private function prototypes void *meedpdStateThread(void *); void *meedpdNodemgrThread(void *); // Query messages requested by this component void meedpdQueryPmComponentStatus(void); void meedpdQueryPmJointEffort(void); void meedpdQueryMjpsJointPosition(void); void meedpdQueryPmManipulatorSpecifications(void); // Set messages that this component commands void meedpdSetPmJointEffort(void); // Accessors to incoming information toolPoint_t meedpdSetToolPoint(void); endEffectorPathMotion_t meedpdSetEndEffectorPathMotion(void); jointEffort_t meedpdReportJointEffort(void); manipulatorSpecifications_t meedpdReportManipulatorSpecifications(void); jointPosition_t meedpdReportJointPosition(void); // Accessors to outgoing information toolPoint_t meedpdReportToolPoint(void); jointEffort_t meedpdSetJointEffort(void); // Accessots to other information double meedpdGetCurrentOrientation(void); int meedpdGetPose(void); double meedpdGetPoseTime(void); double meedpdGetCurrentTime(void); double meedpdGetCurrentEndEffectorPosition(void); double meedpdGetCurrentEndEffectorOrientation(void); unsigned char meedpdInstId, meedpdNodeId, meedpdSubsId; // JAUS Instance, Node and Subsystem IDs for this component componentAuthority_t meedpdAuthority = 0; // JAUS Authority for this component int meedpdState = SHUTDOWN_STATE; // JAUS State double meedpdThreadHz; // Stores the calculated update rate for main state thread

PAGE 177

161 unsigned char meedpdCtrlCmptInstId, meedpdCtrlCmptCompId; // Stores identity of the component currently in control unsigned char meedpdCtrlCmptNodeId, meedpdCtrlCmptSubsId; // Stores identity of the component currently in control unsigned char meedpdCtrlCmptAuthority; // Stores the authority level of the component currently in control int meedpdUnderControl = FALSE; // FALSE not under control, TRUE is under control int meedpdRun = FALSE; int meedpdStateThreadRunning = FALSE; pthread_t meedpdStateThreadId; // pthread node manager thread identifier int meedpdNodemgrThreadRunning = FALSE; pthread_t meedpdNodemgrThreadId; // pthread node manager thread identifier // Structure storing incoming request under case SET TOOL POINT static toolPoint_t setToolPoint_6; // Structure storing incoming request under case SET END EFFECTOR DISCRETE_POSE static endEffectorPathMotion_t setEndEffectorPathMotion; // Structure storing incoming request under case QUERY_TOOL_POINT static toolPoint_t reportedToolPoint; // Structures storing queried information static jointEffort_t reportedJointEffort; static manipulatorSpecifications_t reportedManipulatorSpecifications; static jointPosition_t reportedJointPosition; // Structure storing outgoing request to the PRIMITIVE MANIPULATOR static jointEffort_t setJointEffort; static double max_speed[NUM_JOINTS], max_acceleration[NUM_JOINTS], max_deceleration[NUM_JOINTS]; static double cmd_position[NUM_JOINTS]; static int num_soln; static double orientS[3], orientA[3]; static double des_position[3], des_orientS[3], des_orientA[3], curr_orientation[4], cmd_orientation[4]; static int pose, numPoses; static double ref_time = 0, rel_time = 0, init_pose_time = 0, pose_time = 0; jmh_t meedpdScHeader; jms_t meedpdJms; // An accessor to the Node Manager JAUS Message Service (Jms) for this component int meedpdScActive = FALSE; int meedpdPmState = -1; unsigned char meedpdPmNodeId = 0; int meedpdPmControl = FALSE; // Function: meedpdStartup // Access: Public // Description: This function allows the abstracted component functionality contained in this file to be started from an external source. // It must be called first before the component state machine and node manager interaction will begin // Each call to "meedpdStartup" should be followed by one call to the "cmptShutdown" function int meedpdStartup(void) { pthread_attr_t attr; // Thread attributed for the component threads spawned in this function ref_time = getTimeSeconds(); if(meedpdState == SHUTDOWN_STATE) // Execute the startup routines only if the component is not running {

PAGE 178

162 // Check in to the Node Manager and obtain Instance, Node and Subsystem IDs if(jcmCheckIn(MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER, &meedpdInstId, &meedpdNodeId, &meedpdSubsId) < 0) // USER: Insert your component ID define on this line { cError("meedpd: Could not check in to nodemgr\n"); return MEEDPD_NODE_MANAGER_CHECKIN_ERROR; } // Open a conection to the Node Manager and obtain a Jms accessor if((meedpdJms = jmsOpen(MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER, meedpdInstId, 0)) == NULL) // USER: Insert your component ID define on this line { cError("meedpd: Could not open connection to nodemgr\n"); jcmCheckOut(MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER, meedpdInstId); // USER: Insert your component ID define on this line return MEEDPD_JMS_OPEN_ERROR; } meedpdJms->timeout.tv_usec = 100000; // Timeout for non-blocking jmsRecv, specified in micro seconds pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); meedpdState = INITIALIZE_STATE; // Set the state of the JAUS state machine to INITIALIZE meedpdRun = TRUE; if(pthread_create(&meedpdStateThreadId, &attr, meedpdStateThread, NULL) != 0) { cError("meedpd: Could not create meedpdStateThread\n"); meedpdShutdown(); return MEEDPD_STATE_THREAD_CREATE_ERROR; } if(pthread_create(&meedpdNodemgrThreadId, &attr, meedpdNodemgrThread, NULL) != 0) { cError("meedpd: Could not create meedpdNodemgrThread\n"); meedpdShutdown(); return MEEDPD_NODEMGR_THREAD_CREATE_ERROR; } pthread_attr_destroy(&attr); } else { cError("meedpd: Attempted startup while not shutdown\n"); return MEEDPD_STARTUP_BEFORE_SHUTDOWN_ERROR; } return 0; } // Function: meedpdShutdown // Access: Public // Description: This function allows the abstracted component functionality contained in this file to be stoped from an external source. // If the component is in the running state, this function will terminate all threads running in this file // This function will also close the Jms connection to the Node Manager and check out the component from the Node Manager int meedpdShutdown(void) { double timeOutSec; if(meedpdState != SHUTDOWN_STATE) // Execute the startup routines only if the component is not running

PAGE 179

163 { meedpdRun = FALSE; timeOutSec = getTimeSeconds() + MEEDPD_THREAD_TIMEOUT_SEC; while(meedpdStateThreadRunning) { usleep(100000); if(getTimeSeconds() >= timeOutSec) { pthread_cancel(meedpdStateThreadId); meedpdStateThreadRunning = FALSE; cError("meedpd: meedpdStateThread Shutdown Improperly\n"); break; } } timeOutSec = getTimeSeconds() + MEEDPD_THREAD_TIMEOUT_SEC; while(meedpdNodemgrThreadRunning) { usleep(100000); if(getTimeSeconds() >= timeOutSec) { pthread_cancel(meedpdNodemgrThreadId); meedpdNodemgrThreadRunning = FALSE; cError("meedpd: meedpdNodemgrThread Shutdown Improperly\n"); break; } } // Close Node Manager Connection and check out jmsClose(meedpdJms); jcmCheckOut(MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER, meedpdInstId); // USER: Insert your component ID define on this line meedpdState = SHUTDOWN_STATE; } return 0; } // The series of functions below allow public access to essential component information // Access: Public (All) int meedpdGetState(void){ return meedpdState; } unsigned char meedpdGetInstanceId(void){ return meedpdInstId; } unsigned char meedpdGetCompId(void){ return (unsigned char)MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER; } unsigned char meedpdGetNodeId(void){ return meedpdNodeId; } unsigned char meedpdGetSubsystemId(void){ return meedpdSubsId; } double meedpdGetUpdateRate(void){ return meedpdThreadHz; } int meedpdGetPmState(void){ return meedpdPmState; } // USER: Insert any additional public variable accessors here toolPoint_t meedpdSetToolPoint(void) {return &setToolPoint_6; } endEffectorPathMotion_t meedpdSetEndEffectorPathMotion(void) {return &setEndEffectorPathMotion; } jointEffort_t meedpdReportJointEffort(void) { return &reportedJointEffort; } manipulatorSpecifications_t meedpdReportPmManipulatorSpecifications(void) { return &reportedManipulatorSpecifications; } jointPosition_t meedpdReportJointPosition(void) { return &reportedJointPosition; } toolPoint_t meedpdReportToolPoint(void) { return &reportedToolPoint; } jointEffort_t meedpdSetJointEffort(void) { return &setJointEffort; } double meedpdGetCurrentOrientation(void) { return curr_orientation; } int meedpdGetPose(void) { return pose; } double meedpdGetPoseTime(void) {return pose_time; } double meedpdGetCurrentTime(void) {return rel_time; } double meedpdGetCurrentEndEffectorPosition(void) {return des_position; } double meedpdGetCurrentEndEffectorOrientation(void) {return cmd_orientation; } // Function: meedpdThread

PAGE 180

164 // Access: Private // Description: All core component functionality is contained in this thread. // All of the JAUS component state machine code can be found here. void *meedpdStateThread(void *threadData) { jmh_t txMsgHeader; double time, prevTime; unsigned char data[DATASIZE]; int i, j; double curr_position[NUM_JOINTS], curr_effort[NUM_JOINTS], cmd_effort[NUM_JOINTS], curr_tool_point[3], tool_point_6[3], cmd_position[3]; double spec_a[NUM_JOINTS-1], spec_alpha[NUM_JOINTS-1], spec_S[NUM_JOINTS]; meedpdStateThreadRunning = TRUE; // // Setup transmit header txMsgHeader.isExpMsg = 0; // not experimental msg USER: change to 1 if experimental txMsgHeader.isSvcMsg = 0; // not a service connection txMsgHeader.acknCtrl = 0; // no ack/nak txMsgHeader.priority = 6; // default priority txMsgHeader.reserved = 0; txMsgHeader.version = 1; // JAUS 3.0u txMsgHeader.srcInstId = meedpdInstId; txMsgHeader.srcCompId = MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER; txMsgHeader.srcNodeId = meedpdNodeId; txMsgHeader.srcSubsId = meedpdSubsId; txMsgHeader.dataCtrl = 0; txMsgHeader.seqNumber = 0; time = getTimeSeconds(); meedpdState = INITIALIZE_STATE; // Set JAUS state to INITIALIZE while(meedpdRun) // Execute state machine code while not in the SHUTDOWN state { prevTime = time; time = getTimeSeconds(); meedpdThreadHz = 1.0/(time-prevTime); // Compute the update rate of this thread switch(meedpdState) // Switch component behavior based on which state the machine is in { case INITIALIZE_STATE: //Check the status of PRIMITIVE MANIPULATOR meedpdQueryPmComponentStatus(); if(meedpdPmState == EMERGENCY_STATE) { cError("meedpd: PM in emergency state, switching to emergency state"); meedpdState = EMERGENCY_STATE; } if(meedpdPmState == STANDBY_STATE) { txMsgHeader.cmdCode = RESUME; txMsgHeader.dstInstId = 1; txMsgHeader.dstCompId = PRIMITIVE_MANIPULATOR; txMsgHeader.dstNodeId = meedpdNodeId; txMsgHeader.dstSubsId = meedpdSubsId ; txMsgHeader.dataBytes = 0; jmsSend(meedpdJms, &txMsgHeader, data, txMsgHeader.dataBytes); } if(meedpdPmState == READY_STATE) meedpdState = STANDBY_STATE; break; case STANDBY_STATE: ref_time = getTimeSeconds(); rel_time = getTimeSeconds() ref_time; pose = 0, j = 0;

PAGE 181

165 break; case READY_STATE: // Set up default velocity, acceleration, and deceleration values for (i=0; i
PAGE 182

166 for (i=0; i= pose_time) { // Extract information about desired position and orientation des_position[0] = setEndEffectorPathMotion.endEffectorPoses[j].X 1000; // mm des_position[1] = setEndEffectorPathMotion.endEffectorPoses[j].Y 1000; des_position[2] = setEndEffectorPathMotion.endEffectorPoses[j].Z 1000; cmd_orientation[0] = setEndEffectorPathMotion.endEffectorPoses[j].quaternionQcomponentD; cmd_orientation[1] = setEndEffectorPathMotion.endEffectorPoses[j].quaternionQcomponentA; cmd_orientation[2] = setEndEffectorPathMotion.endEffectorPoses[j].quaternionQcomponentB;

PAGE 183

167 cmd_orientation[3] = setEndEffectorPathMotion.endEffectorPoses[j].quaternionQcomponentC; PquaternionToMatrix(cmd_orientation, des_orientS, des_orientA); // This function returns the joint angles corresponding to the desired pose getDesiredJointAngles(des_position, des_orientS, des_orientA, cmd_position); if (j < numPoses-1){ pose++; j++; } else { j = numPoses-1; pose = numPoses; } } // This function performs closed loop end effector pose control endEffectorDiscretePoseDriver(cmd_position, curr_position, cmd_effort); // Set Joint Efforts setJointEffort.numJoints = NUM_JOINTS; for (i=0; i
PAGE 184

168 confirmServiceConnection_t confirmServiceConnection; activateServiceConnection_t activateServiceConnection; suspendServiceConnection_t suspendServiceConnection; terminateServiceConnection_t terminateServiceConnection; requestComponentControl_t requestComponentControl; confirmComponentControl_t confirmComponentControl; componentAuthority_t componentAuthority; componentStatus_t componentStatus; int recvCount; meedpdNodemgrThreadRunning = TRUE; // // Setup transmit header txMsgHeader.isExpMsg = 0; // not experimental msg USER: change to 1 if experimental txMsgHeader.isSvcMsg = 0; // not a service connection txMsgHeader.acknCtrl = 0; // no ack/nak txMsgHeader.priority = 6; // default priority txMsgHeader.reserved = 0; txMsgHeader.version = 1; // JAUS 3.0 txMsgHeader.srcInstId = meedpdInstId; txMsgHeader.srcCompId = MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER; txMsgHeader.srcNodeId = meedpdNodeId; txMsgHeader.srcSubsId = meedpdSubsId; txMsgHeader.dataCtrl = 0; txMsgHeader.seqNumber = 0; while(meedpdRun) // Execute incoming JAUS message processing while not in the SHUTDOWN state { // Check for a new message in the Node Manager JMS queue // If a message is present then store the header information in rxMsgHeader, and store the message content information in the data buffer recvCount = jmsRecv(meedpdJms, &rxMsgHeader, data, DATASIZE); if(recvCount < 0) { cError("meedpd: Node manager jmsRecv returned error: %d\n", recvCount); break; } if(recvCount == 0) continue; // This block of code is intended to reject commands from non-controlling components // However, the one exception allowed is a REQUEST_COMPONENT_CONTROL if(meedpdUnderControl && rxMsgHeader.cmdCode < 0x2000) // If not currently under control or it's not a command, then go to the switch statement { // If the source component isn't the one in control, and it's not a request to gain control, then exit this iteration of the while loop if( !( meedpdCtrlCmptInstId==rxMsgHeader.srcInstId && meedpdCtrlCmptCompId==rxMsgHeader.srcCompId && meedpdCtrlCmptNodeId==rxMsgHeader.srcNodeId && meedpdCtrlCmptSubsId==rxMsgHeader.srcSubsId)&& !( rxMsgHeader.cmdCode==REQUEST_COMPONENT_CONTROL) )continue; // to next iteration } switch(rxMsgHeader.cmdCode) // Switch the processing algorithm according to the JAUS message type { // Set the component authority according to the incoming authority code case SET_COMPONENT_AUTHORITY: convertComponentAuthority(data, &meedpdAuthority, DATASIZE, UNPACK); // Unpack and store the incoming authority code break; case SHUTDOWN: meedpdState = SHUTDOWN_STATE; break;

PAGE 185

169 case STANDBY: if(meedpdState == READY_STATE) meedpdState = STANDBY_STATE; break; case RESUME: if(meedpdState == STANDBY_STATE) meedpdState = READY_STATE; break; case RESET: meedpdState = INITIALIZE_STATE; break; case SET_EMERGENCY: meedpdState = EMERGENCY_STATE; break; case CLEAR_EMERGENCY: meedpdState = STANDBY_STATE; break; case CREATE_SERVICE_CONNECTION: convertCreateServiceConnection(data, &createServiceConnection, DATASIZE, UNPACK); if(createServiceConnection.cmdCode == REPORT_JOINT_VELOCITY) { meedpdScHeader = txMsgHeader; meedpdScHeader.isSvcMsg = 1; meedpdScHeader.dstInstId = rxMsgHeader.srcInstId; meedpdScHeader.dstCompId = rxMsgHeader.srcCompId; meedpdScHeader.dstNodeId = rxMsgHeader.srcNodeId; meedpdScHeader.dstSubsId = rxMsgHeader.srcSubsId; meedpdScHeader.cmdCode = REPORT_JOINT_VELOCITY; meedpdScHeader.seqNumber = 1; confirmServiceConnection.cmdCode = REPORT_JOINT_VELOCITY; confirmServiceConnection.instanceId = 1; confirmServiceConnection.confirmedRate = createServiceConnection.requestedRate; // BUG: The actual rate may not be the same as the request confirmServiceConnection.responseCode = CONNECTION_SUCCESSFUL; txMsgHeader.cmdCode = CONFIRM_SERVICE_CONNECTION; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = convertConfirmServiceConnection(data, &confirmServiceConnection, DATASIZE, PACK); jmsSend(meedpdJms, &txMsgHeader, data, txMsgHeader.dataBytes); meedpdScActive = TRUE; } else { confirmServiceConnection.cmdCode = createServiceConnection.cmdCode; confirmServiceConnection.instanceId = 1; confirmServiceConnection.confirmedRate = createServiceConnection.requestedRate; confirmServiceConnection.responseCode = CONNECTION_REFUSED; txMsgHeader.cmdCode = CONFIRM_SERVICE_CONNECTION; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId;

PAGE 186

170 txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = convertConfirmServiceConnection(data, &confirmServiceConnection, DATASIZE, PACK); jmsSend(meedpdJms, &txMsgHeader, data, txMsgHeader.dataBytes); } break; case CONFIRM_SERVICE_CONNECTION: convertConfirmServiceConnection(data, &confirmServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the confirm service connection message break; case ACTIVATE_SERVICE_CONNECTION: convertActivateServiceConnection(data, &activateServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the activate service connection message break; case SUSPEND_SERVICE_CONNECTION: convertSuspendServiceConnection(data, &suspendServiceConnection, DATASIZE, UNPACK); // USER: Insert code here to handle the suspend service connection message break; case TERMINATE_SERVICE_CONNECTION: convertTerminateServiceConnection(data, &terminateServiceConnection, DATASIZE, UNPACK); if (terminateServiceConnection.cmdCode == REPORT_JOINT_VELOCITY) meedpdScActive = FALSE; break; case REQUEST_COMPONENT_CONTROL: convertRequestComponentControl(data, &requestComponentControl, DATASIZE, UNPACK); if(meedpdUnderControl) { if(requestComponentControl > meedpdCtrlCmptAuthority) // Test for higher authority { // Terminate control of current component txMsgHeader.cmdCode = REJECT_COMPONENT_CONTROL; txMsgHeader.dstSubsId = meedpdCtrlCmptSubsId; txMsgHeader.dstNodeId = meedpdCtrlCmptNodeId; txMsgHeader.dstCompId = meedpdCtrlCmptCompId; txMsgHeader.dstInstId = meedpdCtrlCmptInstId; txMsgHeader.dataBytes = 0; jmsSend(meedpdJms, &txMsgHeader, data, txMsgHeader.dataBytes); // Accept control of new component txMsgHeader.cmdCode = CONFIRM_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId;

PAGE 187

171 txMsgHeader.dstInstId = rxMsgHeader.srcInstId; confirmComponentControl.asByte = 0; txMsgHeader.dataBytes = convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, PACK); jmsSend(meedpdJms, &txMsgHeader, data, txMsgHeader.dataBytes); meedpdCtrlCmptInstId = rxMsgHeader.srcInstId; meedpdCtrlCmptCompId = rxMsgHeader.srcCompId; meedpdCtrlCmptNodeId = rxMsgHeader.srcNodeId; meedpdCtrlCmptSubsId = rxMsgHeader.srcSubsId; meedpdCtrlCmptAuthority = requestComponentControl; } else { if( rxMsgHeader.srcSubsId != meedpdCtrlCmptSubsId || rxMsgHeader.srcNodeId != meedpdCtrlCmptNodeId || rxMsgHeader.srcCompId != meedpdCtrlCmptCompId || rxMsgHeader.srcInstId != meedpdCtrlCmptInstId ) { txMsgHeader.cmdCode = REJECT_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dataBytes = 0; jmsSend(meedpdJms, &txMsgHeader, data, txMsgHeader.dataBytes); } } } else // Not currently under component control, so give control { txMsgHeader.cmdCode = CONFIRM_COMPONENT_CONTROL; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; confirmComponentControl.asByte = 0; txMsgHeader.dataBytes = convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, PACK); jmsSend(meedpdJms, &txMsgHeader, data, txMsgHeader.dataBytes); meedpdCtrlCmptInstId = rxMsgHeader.srcInstId; meedpdCtrlCmptCompId = rxMsgHeader.srcCompId; meedpdCtrlCmptNodeId = rxMsgHeader.srcNodeId; meedpdCtrlCmptSubsId = rxMsgHeader.srcSubsId; meedpdCtrlCmptAuthority = requestComponentControl; meedpdUnderControl = TRUE; } break; case RELEASE_COMPONENT_CONTROL: meedpdUnderControl = FALSE; break; case CONFIRM_COMPONENT_CONTROL: convertConfirmComponentControl(data, &confirmComponentControl, DATASIZE, UNPACK);

PAGE 188

172 // USER: Insert code here to handle the confirm component control message if needed break; case REJECT_COMPONENT_CONTROL: // USER: Insert code here to handle the reject component control message if needed break; case QUERY_COMPONENT_AUTHORITY: txMsgHeader.cmdCode = REPORT_COMPONENT_AUTHORITY; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; componentAuthority = meedpdAuthority; txMsgHeader.dataBytes = convertComponentAuthority(data, &componentAuthority, DATASIZE, PACK); jmsSend(meedpdJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; case QUERY_COMPONENT_STATUS: txMsgHeader.cmdCode = REPORT_COMPONENT_STATUS; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; componentStatus.primaryStatus.asByte = meedpdState; txMsgHeader.dataBytes = convertComponentStatus(data, &componentStatus, DATASIZE, PACK); jmsSend(meedpdJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; case REPORT_COMPONENT_AUTHORITY: convertComponentAuthority(data, &componentAuthority, DATASIZE, UNPACK); // USER: Insert code here to handle the report component authority message if needed break; case REPORT_COMPONENT_STATUS: convertComponentStatus(data, &componentStatus, DATASIZE, UNPACK); if(rxMsgHeader.srcCompId == PRIMITIVE_MANIPULATOR) meedpdPmState = componentStatus.primaryStatus.asField.primaryStatusCode; break; case SET_END_EFFECTOR_PATH_MOTION: convertEndEffectorPathMotion(data, &setEndEffectorPathMotion, DATASIZE, UNPACK); break; case REPORT_JOINT_EFFORT: convertJointEffort(data, &reportedJointEffort, DATASIZE, UNPACK); break; case REPORT_MANIPULATOR_SPECIFICATIONS: convertManipulatorSpecifications(data, &reportedManipulatorSpecifications, DATASIZE, UNPACK); break; case REPORT_JOINT_POSITION: convertJointPosition(data, &reportedJointPosition, DATASIZE, UNPACK); break; case QUERY_TOOL_POINT:

PAGE 189

173 txMsgHeader.cmdCode = REPORT_TOOL_POINT; txMsgHeader.dstInstId = rxMsgHeader.srcInstId; txMsgHeader.dstCompId = rxMsgHeader.srcCompId; txMsgHeader.dstNodeId = rxMsgHeader.srcNodeId; txMsgHeader.dstSubsId = rxMsgHeader.srcSubsId; txMsgHeader.dataBytes = convertToolPoint(data, &reportedToolPoint, DATASIZE, PACK); jmsSend(meedpdJms, &txMsgHeader, data, txMsgHeader.dataBytes); break; default: break; } } meedpdNodemgrThreadRunning = FALSE; pthread_exit(NULL); } //////////////////////////////////////////////////////////////////////////////////// // Function used to send a message to the primitive manipulator and query for // component status. Only the primitive manipulator component performs the initial // system checks. Thus it is essential that primitive manipulator is running and its // status is ready before any other components are started up. //////////////////////////////////////////////////////////////////////////////////// void meedpdQueryPmComponentStatus(void) { jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcInstId = meedpdInstId; txMsg.srcCompId = MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER; txMsg.srcNodeId = meedpdNodeId; txMsg.srcSubsId = meedpdSubsId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = QUERY_COMPONENT_STATUS; txMsg.dstInstId = 1; txMsg.dstCompId = PRIMITIVE_MANIPULATOR; txMsg.dstNodeId = meedpdNodeId; txMsg.dstSubsId = meedpdSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(meedpdJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } //////////////////////////////////////////////////////////////////////////////////// // Function used to set up a message sent to manipulator joint position sensor // to obtain current joint position data. //////////////////////////////////////////////////////////////////////////////////// void meedpdQueryMjpsJointPosition(void) { jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0;

PAGE 190

174 // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcSubsId = meedpdSubsId; txMsg.srcNodeId = meedpdNodeId; txMsg.srcCompId = MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER; txMsg.srcInstId = meedpdInstId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = QUERY_JOINT_POSITION; txMsg.dstInstId = 1; txMsg.dstCompId = MANIPULATOR_JOINT_POSITION_SENSOR; txMsg.dstNodeId = meedpdNodeId; txMsg.dstSubsId = meedpdSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(meedpdJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } //////////////////////////////////////////////////////////////////////////////////// // Function used to set up a message sent to the primitive manipulator to obtain // current effort values. //////////////////////////////////////////////////////////////////////////////////// void meedpdQueryPmJointEffort(void) { jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcSubsId = meedpdSubsId; txMsg.srcNodeId = meedpdNodeId; txMsg.srcCompId = MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER; txMsg.srcInstId = meedpdInstId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = QUERY_JOINT_EFFORT; txMsg.dstInstId = 1; txMsg.dstCompId = PRIMITIVE_MANIPULATOR; txMsg.dstNodeId = meedpdNodeId; txMsg.dstSubsId = meedpdSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(meedpdJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } //////////////////////////////////////////////////////////////////////////////////// // Function used to set up a message sent to the primitive manipulator to obtain // manipulator specifications. //////////////////////////////////////////////////////////////////////////////////// void meedpdQueryPmManipulatorSpecifications(void) {

PAGE 191

175 jmh_t txMsg; unsigned char data[DATASIZE]; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; // Setup Transmit msg txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcSubsId = meedpdSubsId; txMsg.srcNodeId = meedpdNodeId; txMsg.srcCompId = MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER; txMsg.srcInstId = meedpdInstId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = QUERY_MANIPULATOR_SPECIFICATIONS; txMsg.dstInstId = 1; txMsg.dstCompId = PRIMITIVE_MANIPULATOR; txMsg.dstNodeId = meedpdNodeId; txMsg.dstSubsId = meedpdSubsId ; txMsg.dataBytes = 0; if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(meedpdJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } //////////////////////////////////////////////////////////////////////////////////// // Function used to set up a message sent to the primitive manipulator with new // joint effort values. //////////////////////////////////////////////////////////////////////////////////// void meedpdSetPmJointEffort(void) { jmh_t txMsg; double requestTimeOutSec = 0.1; static double lastRequestTimeSec = 0; unsigned char data[DATASIZE]; //Setup Transmit Message txMsg.isExpMsg = 0; txMsg.priority = 6; txMsg.acknCtrl = 0; txMsg.isSvcMsg = 0; txMsg.version = 1; txMsg.reserved = 0; txMsg.srcInstId = meedpdInstId; txMsg.srcCompId = MANIPULATOR_END_EFFECTOR_DISCRETE_POSE_DRIVER; txMsg.srcNodeId = meedpdNodeId; txMsg.srcSubsId = meedpdSubsId; txMsg.dataCtrl = 0; txMsg.seqNumber = 0; txMsg.cmdCode = SET_JOINT_EFFORT; txMsg.dstInstId = 1; txMsg.dstCompId = PRIMITIVE_MANIPULATOR; txMsg.dstNodeId = meedpdNodeId; txMsg.dstSubsId = meedpdSubsId; txMsg.dataBytes = convertJointEffort(data, &setJointEffort, DATASIZE, PACK); if( (getTimeSeconds() lastRequestTimeSec) >= requestTimeOutSec) { jmsSend(meedpdJms, &txMsg, data, txMsg.dataBytes); lastRequestTimeSec = getTimeSeconds(); } } ////////////////////////////////////////////////////////////////////////////////////

PAGE 192

176 // Function used to perform closed loop end-effector position control //////////////////////////////////////////////////////////////////////////////////// void endEffectorDiscretePoseDriver(double *cmd_position, double *curr_position, double *cmd_effort) { int i; double k[NUM_JOINTS]; for (i=0; i
PAGE 193

177 void PquaternionToMatrix(double *cmd_orientation,double *des_orientS, double *des_orientA) { double W, X, Y, Z; double M0, M1, M2; double M4, M5, M6; double M8, M9, M10; W = cmd_orientation[0]; X = cmd_orientation[1]; Y = cmd_orientation[2]; Z = cmd_orientation[3]; M0 = 1 2*Y*Y 2*Z*Z; M4 = 2*X*Y + 2*Z*W; M8 = 2*X*Z 2*Y*W; M1 = 2*X*Y 2*Z*W; M5 = 1 2*X*X 2*Z*Z; M9 = 2*Y*Z + 2*X*W; M2 = 2*X*Z + 2*Y*W; M6 = 2*Y*Z 2*X*W; M10 = 1 2*X*X 2*Y*Y; des_orientA[0] = M0; des_orientA[1] = M4; des_orientA[2] = M8; des_orientS[0] = M2; des_orientS[1] = M6; des_orientS[2] = M10; } ///////////////////////////////////////////////////////////////////////////////////////// // File: meedpd.h // Version: 0.1 Original Creation // Written by: Ognjen Sosa (ognjensosa@hotmail.com) // Template by: Tom Galluzzo (galluzzt@ufl.edu) // Date: 09/28/2004 // // Description: This file contains the skeleton C header file code for implementing // the meedpd.c file ///////////////////////////////////////////////////////////////////////////////////////// #ifndef MEEDPD_H #define MEEDPD_H #include "jaus.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define MEEDPD_NODE_MANAGER_CHECKIN_ERROR -1 #define MEEDPD_JMS_OPEN_ERROR -2 #define MEEDPD_STARTUP_BEFORE_SHUTDOWN_ERROR -3 #define MEEDPD_STATE_THREAD_CREATE_ERROR -4 #define MEEDPD_NODEMGR_THREAD_CREATE_ERROR -5 #define MEEDPD_THREAD_TIMEOUT_SEC 1.0 // Public int meedpdStartup(void); int meedpdShutdown(void); int meedpdGetState(void);

PAGE 194

178 unsigned char meedpdGetInstanceId(void); unsigned char meedpdGetCompId(void); unsigned char meedpdGetNodeId(void); unsigned char meedpdGetSubsystemId(void); double meedpdGetUpdateRate(void); int meedpdGetPmState(void); // Query messages requested by this component void meedpdQueryPmComponentStatus(void); void meedpdQueryPmJointEffort(void); void meedpdQueryMjpsJointPosition(void); void meedpdQueryPmManipulatorSpecifications(void); // Set messages that this component commands void meedpdSetPmJointEffort(void); // Accessors to incoming information toolPoint_t meedpdSetToolPoint(void); endEffectorPathMotion_t meedpdSetEndEffectorPathMotion(void); jointEffort_t meedpdReportJointEffort(void); manipulatorSpecifications_t meedpdReportManipulatorSpecifications(void); jointPosition_t meedpdReportJointPosition(void); // Accessors to outgoing information toolPoint_t meedpdReportToolPoint(void); jointEffort_t meedpdSetJointEffort(void); double meedpdGetCurrentOrientation(void); int meedpdGetPose(void); double meedpdGetPoseTime(void); double meedpdGetCurrentTime(void); double meedpdGetCurrentEndEffectorPosition(void); double meedpdGetCurrentEndEffectorOrientation(void); void PmatrixToQuaternion(double *, double *, double *); void PquaternionToMatrix(double *, double *, double *); void endEffectorDiscretePoseDriver(double *, double *, double *); #endif // MEEDPD_H B.6 The Mc.c File and the Corresponding Header Mc.h ///////////////////////////////////////////////////////////////////////////////////////// // File: mc.c // Version: 0.1 Original Creation // Written by: Ognjen Sosa (ognjensosa@hotmail.com) // Date: 09/28/2004 // // Description: This file contains node startup and shutdown functions. "Manipulator // Control" (mc) node is used to spawn all the neccessary threads. Due to // very low bandwith to the Galil controller, only one of the driver // components can be running at the time. ///////////////////////////////////////////////////////////////////////////////////////// #include #include #include #include "mc.h" int roboWorksReady = 0; int mcStartup(void) { char choice; int i; // Check if RoboWorks software is being used do {

PAGE 195

179 printf("Are you using RoboWorks 3D visualization tool? (y or n): "); scanf("%c",&choice); } while (choice != 'y' && choice != 'n'); if (choice == 'y') roboWorksReady = 1; else if (choice == 'n') roboWorksReady = 0; // Start controllers startGALILController(); if (getGalilReady() == 0) { printf("Could not establish communications with GALIL controller.\n"); while (getGalilReady() == 0) { startGALILController(); usleep(10000); } printf("Communications with GALIL controller established.\n"); } else printf("Communications with GALIL controller established.\n"); // Reset Galil i = resetGalil(); if (i == 0) printf("GALIL reset successful.\n"); else printf("GALIL reset failed.\n"); startVALController(); if (getValReady() == 1) { printf("VAL controller is not on. Switch main power ON.\n"); while (getValReady() == 1) { startVALController(); usleep(10000); } printf("VAL controller is on.\n"); } else printf("VAL controller is on.\n"); // Allows for remote operation of the manipulator startARM(); if (getArmReady() == 1) { printf("Switch PUMA 762 on.\n"); while (getArmReady() == 1) { startARM(); usleep(1000); } printf("PUMA 762 is on.\n"); } else printf("PUMA 762 is on.\n"); // Start up the interface thread interfaceStartup(); // Start component threads // Primitive manipulator and sensor components should always be running // Comment out startup routines of driver components you are not planning to use if(pmStartup()) { cError("mc: pmStartup failed\n"); mcShutdown();

PAGE 196

180 return MC_PM_STARTUP_FAILED; } if (mjpsStartup()) { cError("mc: mjpsStartup failed\n"); mjpsShutdown(); return MC_MJPS_STARTUP_FAILED; } if (mjvsStartup()) { cError("mc: mjvsStartup failed\n"); mjvsShutdown(); return MC_MJVS_STARTUP_FAILED; } if (mjftsStartup()) { cError("mc: mjftsStartup failed\n"); mjftsShutdown(); return MC_MJFTS_STARTUP_FAILED; } if (mjpdStartup()) { cError("mc: mjpdStartup failed\n"); mjpdShutdown(); return MC_MJPD_STARTUP_FAILED; } if (mjvdStartup()) { cError("mc: mjvdStartup failed\n"); mjvdShutdown(); return MC_MJVD_STARTUP_FAILED; } if (mjmdStartup()) { cError("mc: mjmdStartup failed\n"); mjmdShutdown(); return MC_MJMD_STARTUP_FAILED; } if (meepdStartup()) { cError("mc: meepdStartup failed\n"); meepdShutdown(); return MC_MEEPD_STARTUP_FAILED; } if (meedpdStartup()) { cError("mc: meedpdStartup failed\n"); meedpdShutdown(); return MC_MEEDPD_STARTUP_FAILED; } return 0; }

PAGE 197

181 int mcShutdown(void) { pmShutdown(); mjpsShutdown(); mjvsShutdown(); mjftsShutdown(); mjpdShutdown(); mjvdShutdown(); mjmdShutdown(); meepdShutdown(); meedpdShutdown(); interfaceShutdown(); return 0; } int getRoboWorksReady(void) { return roboWorksReady; } const char *mcGetName(void) { static const char *mcName = MC_NAME_STRING; return mcName; } ///////////////////////////////////////////////////////////////////////////////////////// // File: mc.h // Version: 0.1 Original Creation // Written by: Ognjen Sosa (ognjensosa@hotmail.com) // Date: 09/28/2004 // // Description: This file contians function prototypes required for mc.c ///////////////////////////////////////////////////////////////////////////////////////// #ifndef NODE_H #define NODE_H #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #define MC_NAME_STRING "Manipulator Control" #define MC_PM_STARTUP_FAILED -1 #define MC_MJPS_STARTUP_FAILED -2 #define MC_MJVS_STARTUP_FAILED -3 #define MC_MJFTS_STARTUP_FAILED -4 #define MC_MJPD_STARTUP_FAILED -5 #define MC_MEEPD_STARTUP_FAILED -6 #define MC_MJVD_STARTUP_FAILED -7 #define MC_MJMD_STARTUP_FAILED -9 #define MC_MEEDPD_STARTUP_FAILED -10 int mcStartup(void); int mcShutdown(void); int getRoboWorksReady(void); const char *mcGetName(void); #include "pm.h" #include "mjps.h" #include "mjvs.h" #include "mjfts.h" #include "mjpd.h" #include "mjvd.h"

PAGE 198

182 #include "mjmd.h" #include "meepd.h" #include "meedpd.h" #include "galilInterface.h" #include "mcConstants.h" #include "cppInterface.h" #include "logLib.h" #include "timeLib.h" #include "dmclnx.h" #include "RoboTalk.h" #endif // MC_H B.7 The Main.c File ///////////////////////////////////////////////////////////////////////////////////////// // File: main.c // Version: 0.1 Original Creation // Written by: Ognjen Sosa (ognjensosa@hotmail.com) // Template by: Tom Galluzzo (galluzzt@ufl.edu) // Date: 09/28/2004 // // Description: This file contains the C code used to initiate node startup and display // component information. ///////////////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include #include #include "pm.h" #include "galilInterface.h" #include "cppInterface.h" #include "logLib.h" #include "mc.h" #include "timeLib.h" #include "mcConstants.h" #include "mjvs.h" #include "mjps.h" #include "mjfts.h" #include "mjpd.h" #include "mjvd.h" #include "mjmd.h" #include "meepd.h" #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif void updateScreen(int page); void signalInterventionHandler(int); const char *jausStateString(int); int mainRunning;

PAGE 199

183 int main(int argCount, char **argString) { int i; char choice=0; int verbose = FALSE; int debugLevel = 0; struct termios newTermios; struct termios stored; FILE *logFile = NULL; char logFileStr[128] = {0}; time_t timeStamp; char timeString[64]; int page = 0; //Get and Format Time String time(&timeStamp); strftime(timeString, 63, "%m-%d-%Y %X", localtime(&timeStamp)); system("clear"); printf("main: CIMAR Core Executable: %s\n", timeString); if(mkdir("/var/log/CIMAR/", 0777) < 0) { if(errno != EEXIST) { perror("main: Error"); return -1; } } for(i=1; i
PAGE 200

184 printf("main: Entering debug level: %d\n", debugLevel); setDebugLevel(debugLevel); break; case 'l': if(argCount > i+1 && argString[i+1][0] != '-') { logFile = fopen(argString[i+1], "w"); if(logFile != NULL) { fprintf(logFile, "CIMAR %s Log -%s\n", argString[0], timeString); setLogFile(logFile); } else printf("main: Error creating log file, switching to default\n"); } else printf("main: Incorrect use of arguments\n"); break; default: printf("main: Incorrect use of arguments\n"); break; } } } if(logFile == NULL) { i = strlen(argString[0]) 1; while(i>0 && argString[0][i-1] != '/') i--; sprintf(logFileStr, "/var/log/CIMAR/%s.log", &argString[0][i]); printf("main: Creating log: %s\n", logFileStr); logFile = fopen(logFileStr, "w"); if(logFile != NULL) { fprintf(logFile, "CIMAR %s Log -%s\n", argString[0], timeString); setLogFile(logFile); } else printf("main: ERROR: Could not create log file\n"); // BUG: Else pError here } signal(SIGINT, signalInterventionHandler); cDebug(1, "main: Starting Up %s Node Software\n", mcGetName()); if(mcStartup()) { cError("main: %s Node Startup failed\n", mcGetName()); cDebug(1, "main: Exiting %s Node Software\n", mcGetName()); return 0; } if(verbose) { tcgetattr(0,&stored); memcpy(&newTermios,&stored,sizeof(struct termios)); // Disable canonical mode, and set buffer size to 0 byte(s) newTermios.c_lflag &= (~ICANON); newTermios.c_lflag &= (~ECHO); newTermios.c_cc[VTIME] = 0; newTermios.c_cc[VMIN] = 0; tcsetattr(0,TCSANOW,&newTermios); } else

PAGE 201

185 { // Start up Curses window initscr(); cbreak(); noecho(); nodelay(stdscr, 1); // Don't wait at the getch() function if the user hasn't hit a key } mainRunning = TRUE; while(mainRunning) { if(verbose) { choice = getc(stdin); switch(choice) { case 27: // Escape Key Pressed mainRunning = FALSE; break; default: usleep(1000); break; } } else { choice = getch(); // Get the key that the user has selected switch(choice) { case 27: mainRunning = FALSE; break; default: usleep(1000); if(choice >= '0' && choice <= '9') page = choice '0'; break; } updateScreen(page); } usleep(25000); } if(verbose) tcsetattr(0,TCSANOW,&stored); else { // Stop Curses clear(); endwin(); } cDebug(1, "main: Shutting Down %s Node Software\n", mcGetName()); mcShutdown(); if(logFile != NULL) { fclose(logFile); } return 0; } const char *jausStateString(int jausState) { static const char *jausStateString[7] = { "Initialize", "Ready", "Standby",

PAGE 202

186 "Shutdown", "Failure", "Emergency", "Unknown" }; if(jausState < 0 || jausState > 5) return jausStateString[6]; else return jausStateString[jausState]; } void updateScreen(int page) { int row = 0, column = 0; int pose; int numSoln, optSoln; double totalCost; jointEffort_t *effort; jointPosition_t *position; jointVelocity_t *velocity; jointForceTorque_t *forcetorque; manipulatorSpecifications_t *specs; jointMotion_t *motion; toolPoint_t *toolpoint; endEffectorPose_t *endeffectorpose; endEffectorPathMotion_t *endeffectorpathmotion; double *posePosition, *maxVelocity, *maxAcceleration, *maxDeceleration; double currentTime, poseTime; double *currentOrientation; double *currentEndEffectorPosition; double *currentEndEffectorOrientation; clear(); switch(page) { case 0: mvprintw(row++,column,"CIMAR %s Node Main Screen", mcGetName() ); row++; mvprintw(row++,column,"Low Level Manipulator Control Components:"); row++; mvprintw(row++,column," 1) Primitive Manipulator"); row++; mvprintw(row++,column,"Manipulator Sensor Components:"); row++; mvprintw(row++,column," 2) Manipulator Joint Position and Velocity Sensors"); mvprintw(row++,column," 3) Manipulator Joint Force/Torque Sensor"); row++; mvprintw(row++,column,"Low Level Position and Velocity Driver Components:"); row++; mvprintw(row++,column," 4) Manipulator Joint Positions Driver"); mvprintw(row++,column," 5) Manipulator End-Effector Pose Driver"); mvprintw(row++,column," 6) Manipulator Joint Velocities Driver"); mvprintw(row++,column," 7) Manipulator End_Effector Velocity State Driver"); row++; mvprintw(row++,column,"Mid Level Position and Velocity Driver Components:"); row++; mvprintw(row++,column," 8) Manipulator Joint Move Driver"); mvprintw(row++,column," 9) Manipulator End-Effector Discrete Pose Driver Component"); row++; mvprintw(row++,column," Press Escape To Shutdown Anytime"); break;

PAGE 203

187 case 1: column++; mvprintw(1,column,"Primitive Manipulator Screen"); mvprintw(3,column,"PM State: %s", jausStateString(pmGetState()) ); mvprintw(4,column,"PM Instance ID: %3.0u", pmGetInstanceId()); mvprintw(5,column,"PM Component ID: %3.0u", pmGetCompId()); mvprintw(6,column,"PM Node ID: %3.0u", pmGetNodeId()); mvprintw(7,column,"PM Subsystem ID: %3.0u", pmGetSubsystemId()); mvprintw(8,column,"PM Update Rate: %5.2f", pmGetUpdateRate()); mvprintw(9,column,"Interface Update Rate: %5.2f", getInterfaceUpdateRate()); mvaddstr(10,column,"--------------------------------------------------------------------------------"); mvaddstr(1,65,"Commanded Effort"); mvaddstr(3,65,"Joint 1:"); mvaddstr(4,65,"Joint 2:"); mvaddstr(5,65,"Joint 3:"); mvaddstr(6,65,"Joint 4:"); mvaddstr(7,65,"Joint 5:"); mvaddstr(8,65,"Joint 6:"); effort = pmSetJointEffort(); mvprintw(3,75,"% 6.2f",effort->jointEffort[0]); mvprintw(4,75,"% 6.2f",effort->jointEffort[1]); mvprintw(5,75,"% 6.2f",effort->jointEffort[2]); mvprintw(6,75,"% 6.2f",effort->jointEffort[3]); mvprintw(7,75,"% 6.2f",effort->jointEffort[4]); mvprintw(8,75,"% 6.2f",effort->jointEffort[5]); mvaddstr(11,column,"Manipulator Specifications"); mvaddstr(16,1,"Joint 1:"); mvaddstr(17,1,"Joint 2:"); mvaddstr(18,1,"Joint 3:"); mvaddstr(19,1,"Joint 4:"); mvaddstr(20,1,"Joint 5:"); mvaddstr(21,1,"Joint 6:"); specs = pmReportManipulatorSpecifications(); mvaddstr(13,9,"Type"); mvprintw(16,10,"% 1.0d",specs->jointSpecifications[0].jointType); mvprintw(17,10,"% 1.0d",specs->jointSpecifications[1].jointType); mvprintw(18,10,"% 1.0d",specs->jointSpecifications[2].jointType); mvprintw(19,10,"% 1.0d",specs->jointSpecifications[3].jointType); mvprintw(20,10,"% 1.0d",specs->jointSpecifications[4].jointType); mvprintw(21,10,"% 1.0d",specs->jointNtype); mvaddstr(13,15,"Lnk_L"); mvaddstr(14,16,"(mm)"); mvprintw(16,15,"% 4.0f",specs->jointSpecifications[0].linkLength); mvprintw(17,15,"% 4.0f",specs->jointSpecifications[1].linkLength); mvprintw(18,15,"% 4.0f",specs->jointSpecifications[2].linkLength); mvprintw(19,15,"% 4.0f",specs->jointSpecifications[3].linkLength); mvprintw(20,15,"% 4.0f",specs->jointSpecifications[4].linkLength); mvaddstr(13,21,"Twist_Ang"); mvaddstr(14,23,"(deg)"); mvprintw(16,22,"% 6.1f",specs->jointSpecifications[0].twistAngle RAD_TO_DEG / 1000); mvprintw(17,22,"% 6.1f",specs->jointSpecifications[1].twistAngle RAD_TO_DEG / 1000); mvprintw(18,22,"% 6.1f",specs->jointSpecifications[2].twistAngle RAD_TO_DEG / 1000); mvprintw(19,22,"% 6.1f",specs->jointSpecifications[3].twistAngle RAD_TO_DEG / 1000); mvprintw(20,22,"% 6.1f",specs->jointSpecifications[4].twistAngle RAD_TO_DEG / 1000);

PAGE 204

188 mvaddstr(13,31,"Offset"); mvaddstr(14,32,"(mm)"); mvprintw(16,31,"% 4.0f",specs->jointSpecifications[0].jointOffsetOrAngle); mvprintw(17,31,"% 4.0f",specs->jointSpecifications[1].jointOffsetOrAngle); mvprintw(18,31,"% 4.0f",specs->jointSpecifications[2].jointOffsetOrAngle); mvprintw(19,31,"% 4.0f",specs->jointSpecifications[3].jointOffsetOrAngle); mvprintw(20,31,"% 4.0f",specs->jointSpecifications[4].jointOffsetOrAngle); mvprintw(21,31,"% 4.0f",specs->jointNoffsetOrAngle); mvaddstr(13,38,"Pos_Limit"); mvaddstr(14,40,"(enc)"); mvprintw(16,39,"%7.0f",specs->jointSpecifications[0].jointMaximumValue J1_RAD_TO_ENC / 1000); mvprintw(17,39,"%7.0f",specs->jointSpecifications[1].jointMaximumValue J2_RAD_TO_ENC / 1000); mvprintw(18,39,"%7.0f",specs->jointSpecifications[2].jointMaximumValue J3_RAD_TO_ENC / 1000); mvprintw(19,39,"%7.0f",specs->jointSpecifications[3].jointMaximumValue J4_RAD_TO_ENC / 1000); mvprintw(20,39,"%7.0f",specs->jointSpecifications[4].jointMaximumValue J5_RAD_TO_ENC / 1000); mvprintw(21,39,"%7.0f",specs->jointNmaximumValue J6_RAD_TO_ENC / 1000); mvaddstr(13,48,"Vel_Limit"); mvaddstr(14,48,"(enc/s)"); mvprintw(16,49,"%5.0f",specs->jointSpecifications[0].jointMaximumVelocity J1_RAD_TO_ENC / 1000); mvprintw(17,49,"%5.0f",specs->jointSpecifications[1].jointMaximumVelocity J2_RAD_TO_ENC / 1000); mvprintw(18,49,"%5.0f",specs->jointSpecifications[2].jointMaximumVelocity J3_RAD_TO_ENC / 1000); mvprintw(19,49,"%5.0f",specs->jointSpecifications[3].jointMaximumVelocity J4_RAD_TO_ENC / 1000); mvprintw(20,49,"%5.0f",specs->jointSpecifications[4].jointMaximumVelocity J5_RAD_TO_ENC / 1000); mvprintw(21,49,"%5.0f",specs->jointNmaximumVelocity J6_RAD_TO_ENC / 1000); mvaddstr(23,1,"Manipulator Type:"); mvaddstr(24,3,"PUMA 762 Serial 6DOF"); mvaddstr(26,1,"Controller Type:"); mvaddstr(27,6,"GALIL MC, DMC2100"); mvaddstr(23,27,"Manipulator Coordinate System:"); mvaddstr(24,30, "Position:"); mvaddstr(24,45, "Orientation:"); mvaddstr(25,30,"X"); mvaddstr(26,30,"Y"); mvaddstr(27,30,"Z"); mvaddstr(25,45,"D"); mvaddstr(26,45,"A"); mvaddstr(27,45,"B"); mvaddstr(28,45,"C"); mvprintw(25,32,"% 4.1f",specs->manipulatorCoordinateSystemX); mvprintw(26,32,"% 4.1f",specs->manipulatorCoordinateSystemY); mvprintw(27,32,"% 4.1f",specs->manipulatorCoordinateSystemZ); mvprintw(25,47,"% 4.1f",specs->quaternionQcomponentD); mvprintw(26,47,"% 4.1f",specs->quaternionQcomponentA); mvprintw(27,47,"% 4.1f",specs->quaternionQcomponentB); mvprintw(28,47,"% 4.1f",specs->quaternionQcomponentC); mvaddstr(11,67,"Current Effort"); mvaddstr(13,65,"Joint 1:"); mvaddstr(14,65,"Joint 2:");

PAGE 205

189 mvaddstr(15,65,"Joint 3:"); mvaddstr(16,65,"Joint 4:"); mvaddstr(17,65,"Joint 5:"); mvaddstr(18,65,"Joint 6:"); effort = pmReportJointEffort(); mvprintw(13,75,"% 6.2f",effort->jointEffort[0]); mvprintw(14,75,"% 6.2f",effort->jointEffort[1]); mvprintw(15,75,"% 6.2f",effort->jointEffort[2]); mvprintw(16,75,"% 6.2f",effort->jointEffort[3]); mvprintw(17,75,"% 6.2f",effort->jointEffort[4]); mvprintw(18,75,"% 6.2f",effort->jointEffort[5]); break; case 2: column++; mvprintw(1,column,"Manipulator Joint Position and Velocity Sensors Screen:", mcGetName() ); mvprintw(3,column,"MJPS State: %s", jausStateString(mjpsGetState()) ); mvprintw(4,column,"MJPS Instance ID: %3.0u", mjpsGetInstanceId()); mvprintw(5,column,"MJPS Component ID: %3.0u", mjpsGetCompId()); mvprintw(6,column,"MJPS Node ID: %3.0u", mjpsGetNodeId()); mvprintw(7,column,"MJPS Subsystem ID: %3.0u", mjpsGetSubsystemId()); mvprintw(8,column,"MJPS Update Rate: %5.2f", mjpsGetUpdateRate()); mvprintw(3,40,"MJVS State: %s", jausStateString(mjvsGetState()) ); mvprintw(4,40,"MJVS Instance ID: %3.0u", mjvsGetInstanceId()); mvprintw(5,40,"MJVS Component ID: %3.0u", mjvsGetCompId()); mvprintw(6,40,"MJVS Node ID: %3.0u", mjvsGetNodeId()); mvprintw(7,40,"MJVS Subsystem ID: %3.0u", mjvsGetSubsystemId()); mvprintw(8,40,"MJVS Update Rate: %5.2f", mjvsGetUpdateRate()); mvaddstr(10,column,"--------------------------------------------------------------------------------"); mvaddstr(11,column,"Current position in:"); mvaddstr(13,13,"Joint 1:"); mvaddstr(14,13,"Joint 2:"); mvaddstr(15,13,"Joint 3:"); mvaddstr(16,13,"Joint 4:"); mvaddstr(17,13,"Joint 5:"); mvaddstr(18,13,"Joint 6:"); position = mjpsReportJointPosition(); mvprintw(11,25,"radians"); mvprintw(13,25,"% 6.4f",position->jointPosition[0]); mvprintw(14,25,"% 6.4f",position->jointPosition[1]); mvprintw(15,25,"% 6.4f",position->jointPosition[2]); mvprintw(16,25,"% 6.4f",position->jointPosition[3]); mvprintw(17,25,"% 6.4f",position->jointPosition[4]); mvprintw(18,25,"% 6.4f",position->jointPosition[5]); mvprintw(11,40,"degrees"); mvprintw(13,40,"% 6.2f",position->jointPosition[0] RAD_TO_DEG); mvprintw(14,40,"% 6.2f",position->jointPosition[1] RAD_TO_DEG); mvprintw(15,40,"% 6.2f",position->jointPosition[2] RAD_TO_DEG); mvprintw(16,40,"% 6.2f",position->jointPosition[3] RAD_TO_DEG); mvprintw(17,40,"% 6.2f",position->jointPosition[4] RAD_TO_DEG); mvprintw(18,40,"% 6.2f",position->jointPosition[5] RAD_TO_DEG); mvprintw(11,55,"enc_cnts"); mvprintw(13,55,"% 6.0f",position->jointPosition[0] J1_RAD_TO_ENC);

PAGE 206

190 mvprintw(14,55,"% 6.0f",position->jointPosition[1] J2_RAD_TO_ENC); mvprintw(15,55,"% 6.0f",position->jointPosition[2] J3_RAD_TO_ENC); mvprintw(16,55,"% 6.0f",position->jointPosition[3] J4_RAD_TO_ENC); mvprintw(17,55,"% 6.0f",position->jointPosition[4] J5_RAD_TO_ENC); mvprintw(18,55,"% 6.0f",position->jointPosition[5] J6_RAD_TO_ENC); mvaddstr(20,column,"Current velocity in:"); mvaddstr(22,13,"Joint 1:"); mvaddstr(23,13,"Joint 2:"); mvaddstr(24,13,"Joint 3:"); mvaddstr(25,13,"Joint 4:"); mvaddstr(26,13,"Joint 5:"); mvaddstr(27,13,"Joint 6:"); velocity = mjvsReportJointVelocity(); mvprintw(20,25,"radians/s"); mvprintw(22,25,"% 6.4f",velocity->jointVelocity[0]); mvprintw(23,25,"% 6.4f",velocity->jointVelocity[1]); mvprintw(24,25,"% 6.4f",velocity->jointVelocity[2]); mvprintw(25,25,"% 6.4f",velocity->jointVelocity[3]); mvprintw(26,25,"% 6.4f",velocity->jointVelocity[4]); mvprintw(27,25,"% 6.4f",velocity->jointVelocity[5]); mvprintw(20,40,"degrees/s"); mvprintw(22,40,"% 6.2f",velocity->jointVelocity[0] RAD_TO_DEG); mvprintw(23,40,"% 6.2f",velocity->jointVelocity[1] RAD_TO_DEG); mvprintw(24,40,"% 6.2f",velocity->jointVelocity[2] RAD_TO_DEG); mvprintw(25,40,"% 6.2f",velocity->jointVelocity[3] RAD_TO_DEG); mvprintw(26,40,"% 6.2f",velocity->jointVelocity[4] RAD_TO_DEG); mvprintw(27,40,"% 6.2f",velocity->jointVelocity[5] RAD_TO_DEG); mvprintw(20,55,"enc_cnts/s"); mvprintw(22,55,"% 6.0f",velocity->jointVelocity[0] J1_RAD_TO_ENC); mvprintw(23,55,"% 6.0f",velocity->jointVelocity[1] J2_RAD_TO_ENC); mvprintw(24,55,"% 6.0f",velocity->jointVelocity[2] J3_RAD_TO_ENC); mvprintw(25,55,"% 6.0f",velocity->jointVelocity[3] J4_RAD_TO_ENC); mvprintw(26,55,"% 6.0f",velocity->jointVelocity[4] J5_RAD_TO_ENC); mvprintw(27,55,"% 6.0f",velocity->jointVelocity[5] J6_RAD_TO_ENC); break; case 3: column++; row++; mvprintw(row++,column,"Manipulator Joint Force/Torque Sensor Screen", mcGetName() ); row++; mvprintw(row++,column,"MJFTS State: %s", jausStateString(mjftsGetState()) ); mvprintw(row++,column,"MJFTS Instance ID: %3.0u", mjftsGetInstanceId()); mvprintw(row++,column,"MJFTS Component ID: %3.0u", mjftsGetCompId()); mvprintw(row++,column,"MJFTS Node ID: %3.0u", mjftsGetNodeId()); mvprintw(row++,column,"MJFTS Subsystem ID: %3.0u", mjftsGetSubsystemId()); mvprintw(row++,column,"MJFTS Update Rate: %5.2f", mjftsGetUpdateRate()); row++; mvaddstr(row++,column,"--------------------------------------------------------------------------------"); mvaddstr(row++,column,"Current torque in:"); row++; mvaddstr(13,11,"Joint 1:"); mvaddstr(14,11,"Joint 2:"); mvaddstr(15,11,"Joint 3:");

PAGE 207

191 mvaddstr(16,11,"Joint 4:"); mvaddstr(17,11,"Joint 5:"); mvaddstr(18,11,"Joint 6:"); forcetorque = mjftsReportJointForceTorque(); mvprintw(11,25,"N-m"); mvprintw(13,23,"% 6.4f",forcetorque->jointForceTorque[0]); mvprintw(14,23,"% 6.4f",forcetorque->jointForceTorque[1]); mvprintw(15,23,"% 6.4f",forcetorque->jointForceTorque[2]); mvprintw(16,23,"% 6.4f",forcetorque->jointForceTorque[3]); mvprintw(17,23,"% 6.4f",forcetorque->jointForceTorque[4]); mvprintw(18,23,"% 6.4f",forcetorque->jointForceTorque[5]); mvprintw(11,38,"ft_lbs"); mvprintw(13,38,"% 6.2f",forcetorque->jointForceTorque[0]/FTLB_TO_NM); mvprintw(14,38,"% 6.2f",forcetorque->jointForceTorque[1]/FTLB_TO_NM); mvprintw(15,38,"% 6.2f",forcetorque->jointForceTorque[2]/FTLB_TO_NM); mvprintw(16,38,"% 6.2f",forcetorque->jointForceTorque[3]/FTLB_TO_NM); mvprintw(17,38,"% 6.2f",forcetorque->jointForceTorque[4]/FTLB_TO_NM); mvprintw(18,38,"% 6.2f",forcetorque->jointForceTorque[5]/FTLB_TO_NM); break; case 4: column++; mvprintw(1,column,"Manipulator Joint Positions Driver Screen", mcGetName() ); mvprintw(3,column,"MJPD State: %s", jausStateString(mjpdGetState()) ); mvprintw(4,column,"MJPD Instance ID: %3.0u", mjpdGetInstanceId()); mvprintw(5,column,"MJPD Component ID: %3.0u", mjpdGetCompId()); mvprintw(6,column,"MJPD Node ID: %3.0u", mjpdGetNodeId()); mvprintw(7,column,"MJPD Subsystem ID: %3.0u", mjpdGetSubsystemId()); mvprintw(8,column,"MJPD Update Rate: %5.2f", mjpdGetUpdateRate()); mvaddstr(10,column,"--------------------------------------------------------------------------------"); mvaddstr(1,63,"Commanded Position"); mvaddstr(3,64,"Joint 1:"); mvaddstr(4,64,"Joint 2:"); mvaddstr(5,64,"Joint 3:"); mvaddstr(6,64,"Joint 4:"); mvaddstr(7,64,"Joint 5:"); mvaddstr(8,64,"Joint 6:"); position = mjpdSetJointPosition(); mvprintw(3,75,"% 6.0f",position->jointPosition[0] J1_RAD_TO_ENC); mvprintw(4,75,"% 6.0f",position->jointPosition[1] J2_RAD_TO_ENC); mvprintw(5,75,"% 6.0f",position->jointPosition[2] J3_RAD_TO_ENC); mvprintw(6,75,"% 6.0f",position->jointPosition[3] J4_RAD_TO_ENC); mvprintw(7,75,"% 6.0f",position->jointPosition[4] J5_RAD_TO_ENC); mvprintw(8,75,"% 6.0f",position->jointPosition[5] J6_RAD_TO_ENC); mvaddstr(11,column,"Queried Information:"); mvaddstr(13,13,"Joint 1:"); mvaddstr(14,13,"Joint 2:"); mvaddstr(15,13,"Joint 3:"); mvaddstr(16,13,"Joint 4:"); mvaddstr(17,13,"Joint 5:"); mvaddstr(18,13,"Joint 6:"); effort = mjpdReportJointEffort(); mvaddstr(11,26,"effort"); mvprintw(13,24,"% 7.2f",effort->jointEffort[0]); mvprintw(14,24,"% 7.2f",effort->jointEffort[1]);

PAGE 208

192 mvprintw(15,24,"% 7.2f",effort->jointEffort[2]); mvprintw(16,24,"% 7.2f",effort->jointEffort[3]); mvprintw(17,24,"% 7.2f",effort->jointEffort[4]); mvprintw(18,24,"% 7.2f",effort->jointEffort[5]); position = mjpdReportJointPosition(); mvaddstr(11,35,"position"); mvprintw(13,36,"% 6.0f",position->jointPosition[0] J1_RAD_TO_ENC); mvprintw(14,36,"% 6.0f",position->jointPosition[1] J2_RAD_TO_ENC); mvprintw(15,36,"% 6.0f",position->jointPosition[2] J3_RAD_TO_ENC); mvprintw(16,36,"% 6.0f",position->jointPosition[3] J4_RAD_TO_ENC); mvprintw(17,36,"% 6.0f",position->jointPosition[4] J5_RAD_TO_ENC); mvprintw(18,36,"% 6.0f",position->jointPosition[5] J6_RAD_TO_ENC); mvaddstr(11,65,"Resulting Effort"); mvaddstr(13,64,"Joint 1:"); mvaddstr(14,64,"Joint 2:"); mvaddstr(15,64,"Joint 3:"); mvaddstr(16,64,"Joint 4:"); mvaddstr(17,64,"Joint 5:"); mvaddstr(18,64,"Joint 6:"); effort = mjpdSetJointEffort(); mvprintw(13,73,"% 8.2f",effort->jointEffort[0]); mvprintw(14,73,"% 8.2f",effort->jointEffort[1]); mvprintw(15,73,"% 8.2f",effort->jointEffort[2]); mvprintw(16,73,"% 8.2f",effort->jointEffort[3]); mvprintw(17,73,"% 8.2f",effort->jointEffort[4]); mvprintw(18,73,"% 8.2f",effort->jointEffort[5]); break; case 5: column++; mvprintw(1,column,"Manipulator End-Effector Pose Driver Screen", mcGetName() ); mvprintw(3,column,"MEEPD State: %s", jausStateString(meepdGetState()) ); mvprintw(4,column,"MEEPD Instance ID: %3.0u", meepdGetInstanceId()); mvprintw(5,column,"MEEPD Component ID: %3.0u", meepdGetCompId()); mvprintw(6,column,"MEEPD Node ID: %3.0u", meepdGetNodeId()); mvprintw(7,column,"MEEPD Subsystem ID: %3.0u", meepdGetSubsystemId()); mvprintw(8,column,"MEEPD Update Rate: %5.2f", meepdGetUpdateRate()); mvaddstr(10,column,"--------------------------------------------------------------------------------"); mvaddstr(1,56,"Commanded Pose:"); mvaddstr(3,56,"position"); mvaddstr(5,56,"X:"); mvaddstr(6,56,"Y:"); mvaddstr(7,56,"Z:"); mvaddstr(3,70,"orientation"); mvaddstr(5,70,"D:"); mvaddstr(6,70,"A:"); mvaddstr(7,70,"B:"); mvaddstr(8,70,"C:"); endeffectorpose = meepdSetEndEffectorPose(); mvprintw(5,59,"% 6.2f",endeffectorpose->X*1000); mvprintw(6,59,"% 6.2f",endeffectorpose->Y*1000); mvprintw(7,59,"% 6.2f",endeffectorpose->Z*1000); mvprintw(5,74,"% 6.4f",endeffectorpose->quaternionQcomponentD);

PAGE 209

193 mvprintw(6,74,"% 6.4f",endeffectorpose->quaternionQcomponentA); mvprintw(7,74,"% 6.4f",endeffectorpose->quaternionQcomponentB); mvprintw(8,74,"% 6.4f",endeffectorpose->quaternionQcomponentC); mvaddstr(11,column,"Queried Information:"); mvaddstr(13,13,"Joint 1:"); mvaddstr(14,13,"Joint 2:"); mvaddstr(15,13,"Joint 3:"); mvaddstr(16,13,"Joint 4:"); mvaddstr(17,13,"Joint 5:"); mvaddstr(18,13,"Joint 6:"); effort = meepdReportJointEffort(); mvaddstr(11,26,"effort"); mvprintw(13,24,"% 7.2f",effort->jointEffort[0]); mvprintw(14,24,"% 7.2f",effort->jointEffort[1]); mvprintw(15,24,"% 7.2f",effort->jointEffort[2]); mvprintw(16,24,"% 7.2f",effort->jointEffort[3]); mvprintw(17,24,"% 7.2f",effort->jointEffort[4]); mvprintw(18,24,"% 7.2f",effort->jointEffort[5]); position = meepdReportJointPosition(); mvaddstr(11,35,"position"); mvprintw(13,35,"% 7.0f",position->jointPosition[0] J1_RAD_TO_ENC); mvprintw(14,35,"% 7.0f",position->jointPosition[1] J2_RAD_TO_ENC); mvprintw(15,35,"% 7.0f",position->jointPosition[2] J3_RAD_TO_ENC); mvprintw(16,35,"% 7.0f",position->jointPosition[3] J4_RAD_TO_ENC); mvprintw(17,35,"% 7.0f",position->jointPosition[4] J5_RAD_TO_ENC); mvprintw(18,35,"% 7.0f",position->jointPosition[5] J6_RAD_TO_ENC); toolpoint = meepdReportToolPoint(); mvaddstr(20,27,"pose"); mvaddstr(22,19,"X:"); mvaddstr(23,19,"Y:"); mvaddstr(24,19,"Z:"); mvaddstr(22,33,"D:"); mvaddstr(23,33,"A:"); mvaddstr(24,33,"B:"); mvaddstr(25,33,"C:"); mvprintw(22,24,"% 4.2f",toolpoint->X); mvprintw(23,24,"% 4.2f",toolpoint->Y); mvprintw(24,24,"% 4.2f",toolpoint->Z); currentOrientation = meepdGetCurrentOrientation(); mvprintw(22,35,"% 6.4f",currentOrientation[0]); mvprintw(23,35,"% 6.4f",currentOrientation[1]); mvprintw(24,35,"% 6.4f",currentOrientation[2]); mvprintw(25,35,"% 6.4f",currentOrientation[3]); numSoln = cppGetNumSoln(); mvaddstr(22,55,"Number of solutions:"); mvprintw(22,79,"% 1.0d",numSoln); optSoln = cppGetOptSoln(); mvaddstr(24,55,"Optimal solution is:"); mvprintw(24,79," %1.0d",optSoln); totalCost = cppGetCost(); mvaddstr(26,55,"Current cost:"); mvprintw(26,73," %7.0f",totalCost); mvaddstr(11,65,"Resulting Effort"); mvaddstr(13,64,"Joint 1:"); mvaddstr(14,64,"Joint 2:"); mvaddstr(15,64,"Joint 3:"); mvaddstr(16,64,"Joint 4:");

PAGE 210

194 mvaddstr(17,64,"Joint 5:"); mvaddstr(18,64,"Joint 6:"); effort = meepdSetJointEffort(); mvprintw(13,73,"% 8.2f",effort->jointEffort[0]); mvprintw(14,73,"% 8.2f",effort->jointEffort[1]); mvprintw(15,73,"% 8.2f",effort->jointEffort[2]); mvprintw(16,73,"% 8.2f",effort->jointEffort[3]); mvprintw(17,73,"% 8.2f",effort->jointEffort[4]); mvprintw(18,73,"% 8.2f",effort->jointEffort[5]); break; case 6: column++; mvprintw(1,column,"Manipulator Joint Velocities Driver Screen", mcGetName() ); mvprintw(3,column,"MJVD State: %s", jausStateString(mjvdGetState()) ); mvprintw(4,column,"MJVD Instance ID: %3.0u", mjvdGetInstanceId()); mvprintw(5,column,"MJVD Component ID: %3.0u", mjvdGetCompId()); mvprintw(6,column,"MJVD Node ID: %3.0u", mjvdGetNodeId()); mvprintw(7,column,"MJVD Subsystem ID: %3.0u", mjvdGetSubsystemId()); mvprintw(8,column,"MJVD Update Rate: %5.2f", mjvdGetUpdateRate()); mvaddstr(10,column,"--------------------------------------------------------------------------------"); mvaddstr(1,63,"Commanded Velocity"); mvaddstr(3,64,"Joint 1:"); mvaddstr(4,64,"Joint 2:"); mvaddstr(5,64,"Joint 3:"); mvaddstr(6,64,"Joint 4:"); mvaddstr(7,64,"Joint 5:"); mvaddstr(8,64,"Joint 6:"); velocity = mjvdSetJointVelocity(); mvprintw(3,75,"% 6.0f",velocity->jointVelocity[0] J1_RAD_TO_ENC); mvprintw(4,75,"% 6.0f",velocity->jointVelocity[1] J2_RAD_TO_ENC); mvprintw(5,75,"% 6.0f",velocity->jointVelocity[2] J3_RAD_TO_ENC); mvprintw(6,75,"% 6.0f",velocity->jointVelocity[3] J4_RAD_TO_ENC); mvprintw(7,75,"% 6.0f",velocity->jointVelocity[4] J5_RAD_TO_ENC); mvprintw(8,75,"% 6.0f",velocity->jointVelocity[5] J6_RAD_TO_ENC); mvaddstr(11,column,"Queried Information:"); mvaddstr(13,13,"Joint 1:"); mvaddstr(14,13,"Joint 2:"); mvaddstr(15,13,"Joint 3:"); mvaddstr(16,13,"Joint 4:"); mvaddstr(17,13,"Joint 5:"); mvaddstr(18,13,"Joint 6:"); effort = mjvdReportJointEffort(); mvaddstr(11,26,"effort"); mvprintw(13,24,"% 7.2f",effort->jointEffort[0]); mvprintw(14,24,"% 7.2f",effort->jointEffort[1]); mvprintw(15,24,"% 7.2f",effort->jointEffort[2]); mvprintw(16,24,"% 7.2f",effort->jointEffort[3]); mvprintw(17,24,"% 7.2f",effort->jointEffort[4]); mvprintw(18,24,"% 7.2f",effort->jointEffort[5]); velocity = mjvdReportJointVelocity(); mvaddstr(11,35,"velocity"); mvprintw(13,36,"% 6.0f",velocity->jointVelocity[0] J1_RAD_TO_ENC); mvprintw(14,36,"% 6.0f",velocity->jointVelocity[1] J2_RAD_TO_ENC); mvprintw(15,36,"% 6.0f",velocity->jointVelocity[2] J3_RAD_TO_ENC);

PAGE 211

195 mvprintw(16,36,"% 6.0f",velocity->jointVelocity[3] J4_RAD_TO_ENC); mvprintw(17,36,"% 6.0f",velocity->jointVelocity[4] J5_RAD_TO_ENC); mvprintw(18,36,"% 6.0f",velocity->jointVelocity[5] J6_RAD_TO_ENC); mvaddstr(11,65,"Resulting Effort"); mvaddstr(13,64,"Joint 1:"); mvaddstr(14,64,"Joint 2:"); mvaddstr(15,64,"Joint 3:"); mvaddstr(16,64,"Joint 4:"); mvaddstr(17,64,"Joint 5:"); mvaddstr(18,64,"Joint 6:"); effort = mjvdSetJointEffort(); mvprintw(13,75,"% 6.2f",effort->jointEffort[0]); mvprintw(14,75,"% 6.2f",effort->jointEffort[1]); mvprintw(15,75,"% 6.2f",effort->jointEffort[2]); mvprintw(16,75,"% 6.2f",effort->jointEffort[3]); mvprintw(17,75,"% 6.2f",effort->jointEffort[4]); mvprintw(18,75,"% 6.2f",effort->jointEffort[5]); break; case 8: column++; mvprintw(1,column,"Manipulator Joint Move Driver Screen", mcGetName() ); mvprintw(3,column,"MJMD State: %s", jausStateString(mjmdGetState()) ); mvprintw(4,column,"MJMD Instance ID: %3.0u", mjmdGetInstanceId()); mvprintw(5,column,"MJMD Component ID: %3.0u", mjmdGetCompId()); mvprintw(6,column,"MJMD Node ID: %3.0u", mjmdGetNodeId()); mvprintw(7,column,"MJMD Subsystem ID: %3.0u", mjmdGetSubsystemId()); mvprintw(8,column,"MJMD Update Rate: %5.2f", mjmdGetUpdateRate()); mvaddstr(10,column,"--------------------------------------------------------------------------------"); mvaddstr(1,65,"Commanded Motion"); mvaddstr(3,64,"Joint 1:"); mvaddstr(4,64,"Joint 2:"); mvaddstr(5,64,"Joint 3:"); mvaddstr(6,64,"Joint 4:"); mvaddstr(7,64,"Joint 5:"); mvaddstr(8,64,"Joint 6:"); posePosition = mjmdGetCurrentPosePosition(); mvprintw(3,75,"% 6.0f",posePosition[0] J1_RAD_TO_ENC); mvprintw(4,75,"% 6.0f",posePosition[1] J2_RAD_TO_ENC); mvprintw(5,75,"% 6.0f",posePosition[2] J3_RAD_TO_ENC); mvprintw(6,75,"% 6.0f",posePosition[3] J4_RAD_TO_ENC); mvprintw(7,75,"% 6.0f",posePosition[4] J5_RAD_TO_ENC); mvprintw(8,75,"% 6.0f",posePosition[5] J6_RAD_TO_ENC); mvaddstr(11,column,"Commanded Joint Values:"); mvaddstr(13,13,"Joint 1:"); mvaddstr(14,13,"Joint 2:"); mvaddstr(15,13,"Joint 3:"); mvaddstr(16,13,"Joint 4:"); mvaddstr(17,13,"Joint 5:"); mvaddstr(18,13,"Joint 6:"); maxVelocity = mjmdGetCurrentPoseMaxVelocity(); mvaddstr(11,26,"max_vel"); mvprintw(13,24,"% 7.0f",maxVelocity[0] / JOINT1_ENC_TO_DEG / DEG_TO_RAD); mvprintw(14,24,"% 7.0f",maxVelocity[1] J2_RAD_TO_ENC); mvprintw(15,24,"% 7.0f",maxVelocity[2] J3_RAD_TO_ENC); mvprintw(16,24,"% 7.0f",maxVelocity[3] J4_RAD_TO_ENC);

PAGE 212

196 mvprintw(17,24,"% 7.0f",maxVelocity[4] J5_RAD_TO_ENC); mvprintw(18,24,"% 7.0f",maxVelocity[5] J6_RAD_TO_ENC); maxAcceleration = mjmdGetCurrentPoseMaxAcceleration(); mvaddstr(11,36,"max_acc"); mvprintw(13,36,"% 7.0f",maxAcceleration[0] J1_RAD_TO_ENC); mvprintw(14,36,"% 7.0f",maxAcceleration[1] J2_RAD_TO_ENC); mvprintw(15,36,"% 7.0f",maxAcceleration[2] J3_RAD_TO_ENC); mvprintw(16,36,"% 7.0f",maxAcceleration[3] J4_RAD_TO_ENC); mvprintw(17,36,"% 7.0f",maxAcceleration[4] J5_RAD_TO_ENC); mvprintw(18,36,"% 7.0f",maxAcceleration[5] J6_RAD_TO_ENC); maxDeceleration = mjmdGetCurrentPoseMaxDeceleration(); mvaddstr(11,46,"max_dec"); mvprintw(13,46,"% 7.0f",maxDeceleration[0] J1_RAD_TO_ENC); mvprintw(14,46,"% 7.0f",maxDeceleration[1] J2_RAD_TO_ENC); mvprintw(15,46,"% 7.0f",maxDeceleration[2] J3_RAD_TO_ENC); mvprintw(16,46,"% 7.0f",maxDeceleration[3] J4_RAD_TO_ENC); mvprintw(17,46,"% 7.0f",maxDeceleration[4] J5_RAD_TO_ENC); mvprintw(18,46,"% 7.0f",maxDeceleration[5] J6_RAD_TO_ENC); pose = mjmdGetPose(); motion = mjmdSetJointMotion(); poseTime = mjmdGetPoseTime(); currentTime = mjmdGetCurrentTime(); mvaddstr(12,57,"Current pose:"); mvprintw(12,78,"%3.0d",pose); mvaddstr(14,57,"Number of poses:"); mvprintw(14,78,"%3.0d",motion->numPoses); mvaddstr(16,57,"Next pose time:"); mvprintw(16,78,"%3.0f",poseTime); mvaddstr(18,57,"Relative time: "); mvprintw(18,75,"%6.2f",currentTime); mvaddstr(20,column,"Queried Information:"); mvaddstr(22,13,"Joint 1:"); mvaddstr(23,13,"Joint 2:"); mvaddstr(24,13,"Joint 3:"); mvaddstr(25,13,"Joint 4:"); mvaddstr(26,13,"Joint 5:"); mvaddstr(27,13,"Joint 6:"); effort = mjmdReportJointEffort(); mvaddstr(20,26,"effort"); mvprintw(22,24,"% 7.2f",effort->jointEffort[0]); mvprintw(23,24,"% 7.2f",effort->jointEffort[1]); mvprintw(24,24,"% 7.2f",effort->jointEffort[2]); mvprintw(25,24,"% 7.2f",effort->jointEffort[3]); mvprintw(26,24,"% 7.2f",effort->jointEffort[4]); mvprintw(27,24,"% 7.2f",effort->jointEffort[5]); position = mjmdReportJointPosition(); mvaddstr(20,35,"position"); mvprintw(22,36,"% 6.0f",position->jointPosition[0] J1_RAD_TO_ENC); mvprintw(23,36,"% 6.0f",position->jointPosition[1] J2_RAD_TO_ENC); mvprintw(24,36,"% 6.0f",position->jointPosition[2] J3_RAD_TO_ENC); mvprintw(25,36,"% 6.0f",position->jointPosition[3] J4_RAD_TO_ENC); mvprintw(26,36,"% 6.0f",position->jointPosition[4] J5_RAD_TO_ENC); mvprintw(27,36,"% 6.0f",position->jointPosition[5] J6_RAD_TO_ENC); velocity = mjmdReportJointVelocity(); mvaddstr(20,46,"velocity"); mvprintw(22,46,"% 6.0f",velocity->jointVelocity[0] J1_RAD_TO_ENC); mvprintw(23,46,"% 6.0f",velocity->jointVelocity[1] J2_RAD_TO_ENC); mvprintw(24,46,"% 6.0f",velocity->jointVelocity[2] J3_RAD_TO_ENC); mvprintw(25,46,"% 6.0f",velocity->jointVelocity[3] J4_RAD_TO_ENC); mvprintw(26,46,"% 6.0f",velocity->jointVelocity[4] J5_RAD_TO_ENC); mvprintw(27,46,"% 6.0f",velocity->jointVelocity[5] J6_RAD_TO_ENC);

PAGE 213

197 mvaddstr(20,65,"Resulting Effort"); mvaddstr(22,64,"Joint 1:"); mvaddstr(23,64,"Joint 2:"); mvaddstr(24,64,"Joint 3:"); mvaddstr(25,64,"Joint 4:"); mvaddstr(26,64,"Joint 5:"); mvaddstr(27,64,"Joint 6:"); effort = mjmdSetJointEffort(); mvprintw(22,73,"% 8.2f",effort->jointEffort[0]); mvprintw(23,73,"% 8.2f",effort->jointEffort[1]); mvprintw(24,73,"% 8.2f",effort->jointEffort[2]); mvprintw(25,73,"% 8.2f",effort->jointEffort[3]); mvprintw(26,73,"% 8.2f",effort->jointEffort[4]); mvprintw(27,73,"% 8.2f",effort->jointEffort[5]); break; case 9: column++; mvprintw(1,column,"Manipulator End-Effector DiscretePose Driver Screen", mcGetName() ); mvprintw(3,column,"MEEPD State: %s", jausStateString(meedpdGetState()) ); mvprintw(4,column,"MEEPD Instance ID: %3.0u", meedpdGetInstanceId()); mvprintw(5,column,"MEEPD Component ID: %3.0u", meedpdGetCompId()); mvprintw(6,column,"MEEPD Node ID: %3.0u", meedpdGetNodeId()); mvprintw(7,column,"MEEPD Subsystem ID: %3.0u", meedpdGetSubsystemId()); mvprintw(8,column,"MEEPD Update Rate: %5.2f", meedpdGetUpdateRate()); mvaddstr(10,column,"--------------------------------------------------------------------------------"); mvaddstr(1,56,"Commanded Pose:"); mvaddstr(3,56,"position"); mvaddstr(5,56,"X:"); mvaddstr(6,56,"Y:"); mvaddstr(7,56,"Z:"); mvaddstr(3,70,"orientation"); mvaddstr(5,70,"D:"); mvaddstr(6,70,"A:"); mvaddstr(7,70,"B:"); mvaddstr(8,70,"C:"); pose = meedpdGetPose(); endeffectorpathmotion = meedpdSetEndEffectorPathMotion(); poseTime = meedpdGetPoseTime(); currentTime = meedpdGetCurrentTime(); mvaddstr(22,55,"Current pose:"); mvprintw(22,78,"%3.0d",pose); mvaddstr(23,55,"Number of poses:"); mvprintw(23,78,"%3.0d",endeffectorpathmotion->numPoses); mvaddstr(24,55,"Next pose time:"); mvprintw(24,78,"%3.0f",poseTime); mvaddstr(25,55,"Relative time: "); mvprintw(25,75,"%6.2f",currentTime); currentEndEffectorPosition = meedpdGetCurrentEndEffectorPosition(); currentEndEffectorOrientation = meedpdGetCurrentEndEffectorOrientation(); mvprintw(5,59,"% 6.2f",currentEndEffectorPosition[0]); mvprintw(6,59,"% 6.2f",currentEndEffectorPosition[1]); mvprintw(7,59,"% 6.2f",currentEndEffectorPosition[2]); mvprintw(5,74,"% 6.4f",currentEndEffectorOrientation[0]);

PAGE 214

198 mvprintw(6,74,"% 6.4f",currentEndEffectorOrientation[1]); mvprintw(7,74,"% 6.4f",currentEndEffectorOrientation[2]); mvprintw(8,74,"% 6.4f",currentEndEffectorOrientation[3]); mvaddstr(11,column,"Queried Information:"); mvaddstr(13,13,"Joint 1:"); mvaddstr(14,13,"Joint 2:"); mvaddstr(15,13,"Joint 3:"); mvaddstr(16,13,"Joint 4:"); mvaddstr(17,13,"Joint 5:"); mvaddstr(18,13,"Joint 6:"); effort = meedpdReportJointEffort(); mvaddstr(11,26,"effort"); mvprintw(13,24,"% 7.2f",effort->jointEffort[0]); mvprintw(14,24,"% 7.2f",effort->jointEffort[1]); mvprintw(15,24,"% 7.2f",effort->jointEffort[2]); mvprintw(16,24,"% 7.2f",effort->jointEffort[3]); mvprintw(17,24,"% 7.2f",effort->jointEffort[4]); mvprintw(18,24,"% 7.2f",effort->jointEffort[5]); position = meedpdReportJointPosition(); mvaddstr(11,35,"position"); mvprintw(13,35,"% 7.0f",position->jointPosition[0] J1_RAD_TO_ENC); mvprintw(14,35,"% 7.0f",position->jointPosition[1] J2_RAD_TO_ENC); mvprintw(15,35,"% 7.0f",position->jointPosition[2] J3_RAD_TO_ENC); mvprintw(16,35,"% 7.0f",position->jointPosition[3] J4_RAD_TO_ENC); mvprintw(17,35,"% 7.0f",position->jointPosition[4] J5_RAD_TO_ENC); mvprintw(18,35,"% 7.0f",position->jointPosition[5] J6_RAD_TO_ENC); toolpoint = meedpdReportToolPoint(); mvaddstr(20,27,"pose"); numSoln = cppGetNumSoln(); mvaddstr(26,55,"Number of solutions:"); mvprintw(26,79,"% 1.0d",numSoln); optSoln = cppGetOptSoln(); mvaddstr(27,55,"Optimal solution is:"); mvprintw(27,79," %1.0d",optSoln); totalCost = cppGetCost(); mvaddstr(28,55,"Current cost:"); mvprintw(28,73," %7.0f",totalCost); mvaddstr(11,65,"Resulting Effort"); mvaddstr(13,64,"Joint 1:"); mvaddstr(14,64,"Joint 2:"); mvaddstr(15,64,"Joint 3:"); mvaddstr(16,64,"Joint 4:"); mvaddstr(17,64,"Joint 5:"); mvaddstr(18,64,"Joint 6:"); effort = meedpdSetJointEffort(); mvprintw(13,73,"% 8.2f",effort->jointEffort[0]); mvprintw(14,73,"% 8.2f",effort->jointEffort[1]); mvprintw(15,73,"% 8.2f",effort->jointEffort[2]); mvprintw(16,73,"% 8.2f",effort->jointEffort[3]); mvprintw(17,73,"% 8.2f",effort->jointEffort[4]); mvprintw(18,73,"% 8.2f",effort->jointEffort[5]); mvaddstr(22,19,"X:"); mvaddstr(23,19,"Y:"); mvaddstr(24,19,"Z:"); mvaddstr(22,33,"D:"); mvaddstr(23,33,"A:"); mvaddstr(24,33,"B:"); mvaddstr(25,33,"C:");

PAGE 215

199 mvprintw(22,24,"% 4.2f",toolpoint->X); mvprintw(23,24,"% 4.2f",toolpoint->Y); mvprintw(24,24,"% 4.2f",toolpoint->Z); currentOrientation = meedpdGetCurrentOrientation(); mvprintw(22,35,"% 6.4f",currentOrientation[0]); mvprintw(23,35,"% 6.4f",currentOrientation[1]); mvprintw(24,35,"% 6.4f",currentOrientation[2]); mvprintw(25,35,"% 6.4f",currentOrientation[3]); break; } move(25,0); refresh(); } void signalInterventionHandler(int signal) { mainRunning = FALSE; }

PAGE 216

APPENDIX C SOURCE CODE FOR THE USER DEFINED JAUS MESSAGES C.1 The JointEffort.c File and the Corresponding Header JointEffort.h /*------------------------------------------------------------------------*/ /* File : jointEffort.c */ /* Programmer : Jeff Wit, Ralph English, Nate Mathews, Rommel Mandapat */ /* : Copyright (c) 2003 by WINTEC, Inc. */ /*------------------------------------------------------------------------*/ /* Date : 03/13/2003 original creation */ /*------------------------------------------------------------------------*/ /* Description : */ /*------------------------------------------------------------------------*/ /* Rev History : */ /*------------------------------------------------------------------------*/ #include #include #include #include /********************************************************************* Function : convertJointEffort Input : unsigned char*, jointEffort_t*, unsigned int, unsigned char Output : int number of bytes in buf Synopsis : This function formats the JAUS messages using the jointEffort_t structure. **********************************************************************/ int convertJointEffort(unsigned char *buf, jointEffort_t *data, unsigned int size, unsigned char request) { int i; short tempShort; unsigned short count=0; if (request == PACK) { if (size < (count+1)) return -1; buf[count] = data->numJoints; count++; for (i=0; ((inumJoints) && (ijointEffort[i],-100.0,100.0); memcpy(&(buf[count]),&tempShort,2); count += 2; } return count; } else if (request == UNPACK) { data->numJoints = buf[count]; count++; for (i=0; ((inumJoints) && (ijointEffort[i] = jstohd(tempShort,-100.0,100.0); count += 2; } return count; } else 200

PAGE 217

201 return -1; } /*! \file jointEffort.h \author Jeff Wit \author Ralph English \author Nate Mathews \author Rommel Mandapat \par Copyright: Copyright (c) 2003 by WINTEC, Inc. \date 03/13/2003 \version 0.02 */ #ifndef __jointEffort_h #define __jointEffort_h #include #include /* defines MAX_JOINTS */ #ifdef __cplusplus extern "C" { #endif /*! This message is used to set the joint effort for a serial mainipulator */ #define SET_JOINT_EFFORT 0x0601 /*! This message shall cause the receiving component to reply to the requester with the message \a REPORT_JOINT_EFFORT. */ #define QUERY_JOINT_EFFORT 0x2601 /*! This message provides the receiver the current values of the commanded joint efforts. */ #define REPORT_JOINT_EFFORT 0x4601 /*! \struct _jointEffort This structure contains the data associated with the command codes \a SET_JOINT_EFFORT and \a REPORT_JOINT_EFFORT. */ typedef struct _jointEffort { unsigned char numJoints; /*!< 1 to MAX_JOINTS, 0 reserved */ double jointEffort[MAX_JOINTS]; /*!< -100 to 100 percent */ } jointEffort_t; /*! \fn int convertJointEffort(unsigned char *buf, jointEffort_t *data, unsigned int size, unsigned char request); \brief Packs/Unpacks jointEffort_t to/from the format defined in JAUS Referenc Architecture 3.0 \param buf The buffer that the JAUS data is unpacked from or packed into. \param data The data structure that the JAUS data is packed from or unpacked into. \param size The size of buf. \param request The requested action, \a PACK or \a UNPACK. \return The number of bytes in buf on success, -1 on error */ int convertJointEffort(unsigned char *buf, jointEffort_t *data, unsigned int size, unsigned char request); /*! \fn int printJointEffort(jointEffort_t *data); \brief prints the structure jointEffort_t \param data The data structure that is to be printed. \return 0 on success, -1 on error */ int printJointEffort(jointEffort_t *data); #ifdef __cplusplus } #endif #endif

PAGE 218

202 C.2 The JointPosition.c File and the Corresponding Header JointPosition.h /*------------------------------------------------------------------------*/ /* File : jointPosition.c */ /* Programmer : Ognjen Sosa */ /* : Copyright (c) 2004 by University of Florida */ /*------------------------------------------------------------------------*/ /* Date : 09/14/2004 original creation */ /*------------------------------------------------------------------------*/ /* Description : */ /*------------------------------------------------------------------------*/ /* Rev History : */ /*------------------------------------------------------------------------*/ #include #include #include #include #include //defines jointType /********************************************************************* Function : convertJointPosition Input : unsigned char*, jointPosition_t*, unsigned int, unsigned char Output : int number of bytes in buf Synopsis : This function formats the JAUS messages using the jointPosition_t structure. **********************************************************************/ int convertJointPosition(unsigned char *buf, jointPosition_t *data, unsigned int size, unsigned char request) { int i; int tempInt; unsigned short count=0; if (request == PACK) { if (size < (count+1)) return -1; buf[count] = data->numJoints; count++; for (i=0; ((inumJoints) && (ijointPosition[i],-25.1327,25.1327); // for revolute, from -8_PI to 8_PI rad // else // tempInt = hdtojs(data->jointPosition[i],-10.0, 10.0); // for prismatic, from -10m to 10m memcpy(&(buf[count]),&tempInt,4); count += 4; } return count; } else if (request == UNPACK) { data->numJoints = buf[count]; count++; for (i=0; ((inumJoints) && (ijointPosition[i] = jitohd(tempInt,-25.1327,25.1327); count += 4; } return count; } else return -1; } /*! \file jointPosition.h

PAGE 219

203 \author Ognjen Sosa \par Copyright: Copyright (c) 2004 by University of Florida. \date 09/14/2004 \version 0.02 */ #ifndef __jointPosition_h #define __jointPosition_h #include #include /* defines MAX_JOINTS */ #ifdef __cplusplus extern "C" { #endif /*! This message is used to set the joint position for a serial mainipulator */ #define SET_JOINT_POSITION 0x0602 /*! This message shall cause the receiving component to reply to the requester with the message \a REPORT_JOINT_POSITION. */ #define QUERY_JOINT_POSITION 0x2602 /*! This message provides the receiver the current values of the set joint positions. */ #define REPORT_JOINT_POSITION 0x4602 /*! \struct _jointPosition This structure contains the data associated with the command codes \a SET_JOINT_POSITION and \a REPORT_JOINT_POSITION. */ typedef struct _jointPosition { unsigned char numJoints; /*!< 1 to MAX_JOINTS, 0 reserved */ double jointPosition[MAX_JOINTS]; /* -8_PIrad to 8_PIrad for revolute and -10m to 10m for prismatic */ } jointPosition_t; /*! \fn int convertJointPosition(unsigned char *buf, jointPosition_t *data, unsigned int size, unsigned char request); \brief Packs/Unpacks jointPosition_t to/from the format defined in JAUS Referenc Architecture 3.0 \param buf The buffer that the JAUS data is unpacked from or packed into. \param data The data structure that the JAUS data is packed from or unpacked into. \param size The size of buf. \param request The requested action, \a PACK or \a UNPACK. \return The number of bytes in buf on success, -1 on error */ int convertJointPosition(unsigned char *buf, jointPosition_t *data, unsigned int size, unsigned char request); /*! \fn int printJointPosition(jointPosition_t *data); \brief prints the structure jointPosition_t \param data The data structure that is to be printed. \return 0 on success, -1 on error */ int printJointPosition(jointPosition_t *data); #ifdef __cplusplus } #endif #endif

PAGE 220

204 C.3 The EndEffectorPose.c File and th e Corresponding Header EndEffectorPose.h /*------------------------------------------------------------------------*/ /* File : endEffectorPose.c */ /* Programmer : Ognjen Sosa */ /* : Copyright (c) 2004 by University of Florida */ /*------------------------------------------------------------------------*/ /* Date : 09/14/2004 original creation */ /*------------------------------------------------------------------------*/ /* Description : */ /*------------------------------------------------------------------------*/ /* Rev History : */ /*------------------------------------------------------------------------*/ #include #include #include #include /********************************************************************* Function : convertEndEffectorPose Input : unsigned char*, endEffectorPose_t*, unsigned int, unsigned char Output : int number of bytes in buf Synopsis : This function formats the JAUS messages using the endEffectorPose_t structure. **********************************************************************/ int convertEndEffectorPose(unsigned char *buf, endEffectorPose_t *data, unsigned int size, unsigned char request) { int tempInt; unsigned short count=0; if (request == PACK) { if (size < (count+4)) return -1; tempInt = hdtoji(data->X,-30.0,30.0); // -30m to 30m memcpy(&(buf[count]),&tempInt,4); count += 4; if (size < (count+4)) return -1; tempInt = hdtoji(data->Y,-30.0,30.0); // -30m to 30m memcpy(&(buf[count]),&tempInt,4); count += 4; if (size < (count+4)) return -1; tempInt = hdtoji(data->Z,-30.0,30.0); // -30m to 30m memcpy(&(buf[count]),&tempInt,4); count += 4; if (size < (count+4)) return -1; tempInt = hdtoji(data->quaternionQcomponentD,-1.0,1.0); // -1m to 1m memcpy(&(buf[count]),&tempInt,4); count += 4; if (size < (count+4)) return -1; tempInt = hdtoji(data->quaternionQcomponentA,-1.0,1.0); // -1m to 1m memcpy(&(buf[count]),&tempInt,4); count += 4; if (size < (count+4)) return -1; tempInt = hdtoji(data->quaternionQcomponentB,-1.0,1.0); // -1m to 1m memcpy(&(buf[count]),&tempInt,4); count += 4; if (size < (count+4)) return -1; tempInt = hdtoji(data->quaternionQcomponentC,-1.0,1.0); // -1m to 1m memcpy(&(buf[count]),&tempInt,4); count += 4;

PAGE 221

205 return count; } else if (request == UNPACK) { memcpy(&(tempInt),&(buf[count]),4); data->X = jitohd(tempInt,-30.0,30.0); count += 4; memcpy(&(tempInt),&(buf[count]),4); data->Y = jitohd(tempInt,-30.0,30.0); count += 4; memcpy(&(tempInt),&(buf[count]),4); data->Z = jitohd(tempInt,-30.0,30.0); count += 4; memcpy(&(tempInt),&(buf[count]),4); data->quaternionQcomponentD = jitohd(tempInt,-1.0,1.0); count += 4; memcpy(&(tempInt),&(buf[count]),4); data->quaternionQcomponentA = jitohd(tempInt,-1.0,1.0); count += 4; memcpy(&(tempInt),&(buf[count]),4); data->quaternionQcomponentB = jitohd(tempInt,-1.0,1.0); count += 4; memcpy(&(tempInt),&(buf[count]),4); data->quaternionQcomponentC = jitohd(tempInt,-1.0,1.0); count += 4; return count; } else return -1; } /*! \file endEffectorPose.h \author Ognjen Sosa \par Copyright: Copyright (c) 2004 by University of Florida. \date 09/14/2004 \version 0.02 */ #ifndef __endEffectorPose_h #define __endEffectorPose_h #include #ifdef __cplusplus extern "C" { #endif /*! This message is used to set the end effector pose for a serial mainipulator */ #define SET_END_EFFECTOR_POSE 0x0605 /*! \struct _endEffectorPose This structure contains the data associated with the command code \a SET_END_EFFECTOR_POSE */ typedef struct _endEffectorPose { double X; /* -30m to 30m */ double Y; /* -30m to 30m */ double Z; /* -30m to 30m */ double quaternionQcomponentD; /* -1m to 1m */ double quaternionQcomponentA; /* -1m to 1m */ double quaternionQcomponentB; /* -1m to 1m */

PAGE 222

206 double quaternionQcomponentC; /* -1m to 1m */ } endEffectorPose_t; /*! \fn int convertEndEffectorPose(unsigned char *buf, endEffectorPose_t *data, unsigned int size, unsigned char request); \brief Packs/Unpacks endEffectorPose_t to/from the format defined in JAUS Referenc Architecture 3.0 \param buf The buffer that the JAUS data is unpacked from or packed into. \param data The data structure that the JAUS data is packed from or unpacked into. \param size The size of buf. \param request The requested action, \a PACK or \a UNPACK. \return The number of bytes in buf on success, -1 on error */ int convertEndEffectorPose(unsigned char *buf, endEffectorPose_t *data, unsigned int size, unsigned char request); /*! \fn int printEndEffectorPose(endEffectorPose_t *data); \brief prints the structure endEffectorPose_t \param data The data structure that is to be printed. \return 0 on success, -1 on error */ int printEndEffectorPose(endEffectorPose_t *data); #ifdef __cplusplus } #endif #endif

PAGE 223

207 LIST OF REFERENCES 1. Das H., Bao X. Bar-Cohed Y., Bonitz R ., Lindemann R., Maimone M., Nesnas I., Voorhees C., Robot Manipulator Tec hnologies for Planet ary Exploration, Proceedings of the 6PthP Annual Internationa l Symposium on Smart Structures and Materials, Newport Beach, CA, March 1999. 2. Matthies L., Stereo Vision for Planetary Rovers: Stochastic Modelling to Near Real-time Implementation, International J ournal of Computer Vision, Volume 8, pp 71-91, July 1992. 3. Das H., Maimone M., Nesnas I., Autonom ous Rock Tracking a nd Acquisition from a Mars Rover, Proceedings to the 5PthP International Symposium on Artificial Intelligence, Robotics and Automation in Space, Noordwijk, Netherlands, June 1999. 4. Yuh J., Underwater Robotic Vehicles: Design and Control, TSI Press Series, Albuquerque, NM, 1995. 5. Sarkar N., Podder T., Motion Coordinati on of Underwater Vehicle-Manipulator Systems Subject to Drag Optimization, IEEE International Conference on Robotics and Automation, Detroit, MI, pp 387-392, May 1999. 6. Cui Y., Sarkar N., A Unified Force Contro l Approach to Autonomous Underwater Manipulation, Robotica, Cambridge Univ ersity Press, pp 255-266, September 2000. 7. JAUS Working Group, 2004, Joint Archit ecture for Unmanned Systems (JAUS): Reference Architecture Specification, Version 3.2, Volume II, The Joint Architecture for Unmanned Systems, retrieved October 5, 2004, from Hhttp://www.jauswg.orgH, October 2004. 8. Vinch, P., Design and Implementation of an Intelligent Primitive Driver, M.S. Thesis, 2003. 9. Crane C., Duffy J., Kinematic Analysis of Robot Manipulators, Cambridge University Press, University of Florida, Gainesville, FL, 1998. 10. Duffy, J., Crane C., Screw Theory Based Analysis of Robot Manipulators, Center for Intelligent Machines and Robotics, University of Fl orida, Gainesville, FL, 2000.

PAGE 224

208 11. Dowling, K., What’s Available for Puma Manipulators?, re trieved October 13, 2004, from Hhttp://www.frc.ri.cmu.e du/robotics-faq/12.htmlH, August, 1996. 12. JAUS Working Group, 2004, Joint Archit ecture for Unmanned Systems (JAUS): Compliance Specification, Version 1.0, The Joint Architecture for Unmanned Systems, retrieved October 6, 2004, from Hhttp://www.jauswg.orgH, July 2004. 13. Unimate Industrial Robots, PUMA 700 Series Mark III – VAL II Equipment Manual, Unimation Inc, Danbury, Connecticut, May 1986. 14. Galil MC, DMC-2x00 Manual Rev. 1.3, Galil Motion Control Inc., Rocklin, California, June 2001. 15. Galil MC, Linux Driver and C/C++ API for PCI/ISA/Ethernet Controllers, Galil Motion Control Inc., Rocklin, California, September 2004.

PAGE 225

209 BIOGRAPHICAL SKETCH Ognjen Sosa was born on February 5, 1979, in Sarajevo, Bosnia and Herzegovina, to Darko and Jadranka Sosa. He received his Bachelor of Science degree in mechanical engineering (graduating with honors) from th e University of Florida in May 2001. He then enrolled in the Graduate School of the University of Florida, and obtained a Master of Science degree in management in June 2003; and a Master of Business Administration degree in May of 2004. After completing his Ma ster of Engineering degree in mechanical engineering, he plans to work in the field that will use bot h technical and business skills acquired during his studies.


Permanent Link: http://ufdc.ufl.edu/UFE0008983/00001

Material Information

Title: Design and Implementation of a Modular Manipulator Architecture
Physical Description: Mixed Material
Copyright Date: 2008

Record Information

Source Institution: University of Florida
Holding Location: University of Florida
Rights Management: All rights reserved by the source institution and holding location.
System ID: UFE0008983:00001

Permanent Link: http://ufdc.ufl.edu/UFE0008983/00001

Material Information

Title: Design and Implementation of a Modular Manipulator Architecture
Physical Description: Mixed Material
Copyright Date: 2008

Record Information

Source Institution: University of Florida
Holding Location: University of Florida
Rights Management: All rights reserved by the source institution and holding location.
System ID: UFE0008983:00001


This item has the following downloads:


Full Text












DESIGN AND IMPLEMENTATION OF A MODULAR MANIPULATOR
ARCHITECTURE













By

OGNJEN SOSA


A THESIS PRESENTED TO THE GRADUATE SCHOOL
OF THE UNIVERSITY OF FLORIDA IN PARTIAL FULLFILMENT
OF THE REQUIREMENTS FOR THE DEGREE OF
MASTER OF ENGINEERING

UNIVERSITY OF FLORIDA


2004

































Copyright 2004

by

Ognjen Sosa



























To my mother, father and brother.





"If a man empties his purse into his head, no man can take it away from him. An
investment in knowledge always pays the best interest."
Benjamin Franklin















ACKNOWLEDGMENTS

I would like to express my thanks to my entire committee (Dr. Carl Crane, Dr. John

Schueller, and Dr. John Ziegert) for their support of my study. Furthermore, I would like

to extend my thanks to Dr. Robert Bicker (of the University of Newcastle upon Tyne) for

his insightful ideas and hands-on support.

Special thanks go to my advisor Prof. Carl Crane, for his patience with my

endeavors; to Mr. Dave Armstrong, our project manager, for always trying to keep me on

track; and to Tyndall Airforce Base (contract # F08637-00-C6008) for providing

financial support for my studies. I am also grateful to the entire staff of the Center for

Intelligent Machines and Robotics (with distinguished contributions from David Kent,

Tom Galluzzo, Shannon Ridgeway, and Hyun Kwon Jung).

Finally I would like to thank all of my friends and extended family for their moral

support and guidance over the last 7 years. However, without the love and patience of

those closest to me, this work would have never been accomplished. Thus, my greatest

appreciation goes to my mother, Jadranka; my father Darko; and my brother Vedran.

Their pride and recognition of my accomplishments had an immense impact on my

motivation and provided a strong driving mechanism during my studies.
















TABLE OF CONTENTS

page

A C K N O W L E D G M E N T S ................................................................................................. iv

LIST OF TABLES .............. ................. ........... ........................ .... .x

LIST OF FIGURES ......... ..................................... ....... xii

A B S T R A C T .........v.................................... ....................... ................. xv

CHAPTER

1 IN TR OD U CTION ............................................... .. ......................... ..

1.1 Introduction ........................................................................................ .. .... 1
1.2 Background ............................................................... ..... .......... 3
1.3 Joint Architecture for Unmanned Systems (JAUS)..............................................4
1.3 .1 O v erview ............................................... ....................... 4
1.3.2 Standards .............................................................. 5
1.3.3 System Topology ......... .......................... ...... ... .................
1.3.4 Component Definition ............... ........... .................... 9
1.3.5 M message Specification ......... ................. ........................... ............... 10

2 SYSTEM ANALYSIS AND OVERVIEW............................................ 13

2 .1 M mechanism O v erview ................................................................ ..................... 14
2.2 Kinematic Analysis of the Puma 762 Robot................. ............. ............... 14
2.2.1 N rotation .............. ............. ...................................................... 14
2.2.2 Forward and Reverse Position Analysis.........................................17
2.2.3 Forward and Reverse Velocity Analysis ............................................ 23
2.2.4 Singularity D eterm nation ........................................ ....... ............... 24
2.3.5 Quaternion Representations.................... ...... ......................... 26

3 PUMA 762 CONTROLLER SYSTEM.................................. ....................... 28

3.1 O verview ............................................................................. 28
3.2 Reverse Engineering the Puma 762 Robot.........................................................29
3.2.1 Existing A rchitecture..................................................... ...................29
3.2.2 Encoder and Potentiometer Val Interface.................................................30
3.2.3 Amplifier Digital-to-Analog Converter Signals and Control Lines...........31









3 .2 .4 S a fe ty ................................................................................................3 2
3 .2 .5 T u n in g ................................................................................................... 3 2
3.3 G alil D M C-2100 Functionality....................................... .......................... 33
3.3.1 C om m and M odes............................................... ............................. 33
3.3.2 T heory of O operation ..................................................................................34
3.4 Galil C/C++ Application Programming Interface (API) ....................................35

4 LOW-LEVEL MANIPULATOR CONTROL COMPONENT ..............................37

4.1 Prim itive M anipulator Com ponent ......................................................... ............37
4.1.1 D definition of Coordinate System s ................................... ............... ..37
4.1.1.1 Global coordinate system .............. ............................................37
4.1.1.2 V vehicle coordinate system .................................... ............... 37
4.1.1.3 Manipulator base coordinate system..............................................38
4.1.1.4 End-effector coordinate system .................................................3....8.
4.1.2 Com ponent Function ............................................................................ 38
4.1.3 A associated M messages ..................................................... ...................39
4.1.4 Com ponent D escription.................................... ........................... ......... 39
4.1.5 Input and Output M messages ............................................. ............... 40
4.1.5.1 Code 0601h: Set Joint Effort................................. 40
4.1.5.2 Code 2600h: Query Manipulator Specifications............................41
4.1.5.3 Code 2601h: Query Joint Effort.......................... ..............41
4.1.5.4 Code 4600h: Report Manipulator Specifications...........................41
4.1.5.5 Code 4601h: Report Joint Effort ........... ....................................41
4.2 Primitive Manipulator Applications to the Puma system............... ........... 44

5 MANIPULATOR SENSOR COMPONENTS.............................. ...............45

5.1 Manipulator Joint Position Sensor Component..................... .................45
5.1.1 Com ponent Function ............................................................................ 45
5.1.2 A associated M messages ...................................................................... .. .... 45
5.1.3 Com ponent D escription.................................... ......................... ........... 46
5.1.4 Input and Output M messages .................................... ................................. 46
5.1.4.1 Code 0602h: Set Joint Positions message .............. ...... ........ 46
5.1.4.2 Code 2602h: Query Joint Positions message .............. ...............47
5.1.4.3 Code 4602h: Report Joint Positions message ..............................47
5.2 Manipulator Joint Velocity Sensor Component ................................................47
5.2.1 Com ponent Function ............................................................................ 47
5.2.2 A associated M messages ...................................................................... 47
5.2.3 C om ponent D escription.................................... ........................... ......... 47
5.2.4 Input and Output M messages ............................................. ............... 48
5.2.4.1 Code 0603h: Set Joint Velocities message ....................................48
5.2.4.3 Code 4603h: Report Joint Velocities message..............................48
5.3 Manipulator Joint Force/Torque Sensor Component .......................................49
5.3.1 Com ponent Function ............................................................................ 49
5.3.2 A associated M messages ...................................................................... .. .... 49
5.3.3 Com ponent D escription.................................... ......................... ........... 49









5.3.4 Input and Output M messages ............................................. ............... 49
5.3.4.1 Code 2605: Query Joint Force/Torques .......................................49
5.3.4.2 Code 4605h: Report Joint Force/Torques .....................................49
5.4 Sensor Component Applications to the Puma System ......................................50

6 MANIPULATOR LOW-LEVEL POSITION AND VELOCITY DRIVER
C O M PO N EN T S ....................... .......................... .. .. ...... ....... .. .. 1

6.1 Manipulator Joint Positions Driver Component............................................51
6.1.1 Com ponent Function ............................................................................ 51
6.1.2 A associated M messages ...................................................... ............... 51
6.1.3 Component Description........................ ................... 52
6.2 Manipulator End-Effector Pose Driver Component.................. .. ............. 52
6.2.1 Com ponent Function ............................................................................ 52
6.2.2 A associated M messages ....................................................... .. ................. 52
6.2.3 Component Description............................ ...................53
6.2.4 Input and Output M messages ............................................. ............... 53
6.2.4.1 Code 0604h: Set Tool Point message.......................................53
6.2.4.2 Code 0605h: Set End-Effector Pose message ................................54
6.2.4.3 Code 2604h: Query Tool Point ................................ ............... 54
6.2.4.4 Code 4604h: Report Tool Point ....................................... .......... 55
6.3 Manipulator Joint Velocities Driver Component ...........................................55
6.3.1 Com ponent Function ............................................................................ 55
6.3.2 A associated M messages ............................ ..................................... ..........55
6.3.3 Component Description........................... .... ............... 55
6.4 Manipulator End-Effector Velocity State Driver Component..............................56
6.4.1 Com ponent Function ............................................................................ 56
6.4.2 A associated M messages ........................................................... ..................... 56
6.4.3 Com ponent D escription............................................. ............ ............... 57
6.4.4 Code 0606h: Set End-Effector Velocity State message .............................57
6.5 Applications of the Low-Level Driver Components to the Puma System ..........58

7 MID-LEVEL POSITION AND VELOCITY DRIVER COMPONENTS.................61

7.1 M anipulator Joint M ove Driver Component .............. ............ .....................61
7.1.1 Com ponent Function ............................................................................ 61
7.1.2 A associated M messages ...................................................... ............... 61
7.1.3 Com ponent D escription............................ ............................. ........ ... 62
7.1.4 Code 0607: Set Joint Motion............................ ...............63
7.2 Manipulator End-Effector Discrete Pose Driver Component.............................65
7.2.1 Com ponent Function ............................................................................ 65
7.2.2 A associated M messages ...................................................................... 65
7.2.3 Com ponent D escription.................................... ........................... .. ....... 65
7.2.4 Code 0608h: Set End-Effector Path Motion...................................66
7.3 Applications of the Mid-Level Driver Components to the Puma System ...........66









8 OVERVIEW OF SOFTWARE DESIGN........................................ ............... 69

8 .1 O v erv iew ......................................................................................................... 6 9
8.2 The Interface to the Galil Controller ....................................... ............... 70
8.3 Component Level Software Development................................. ............... 72
8.3.1 Primitive Manipulator State Thread .......................................................73
8.3.2 M anipulator Sensor Components .................................... ............... 74
8.3.3 Low-Level Position and Velocity Drivers.......................................75
8.4 M message Level Software Development ..................................... .................76
8.5 Node Level Software Development............................................. ...............76
8.6 N ode M manager and Com municator.................................... ....................... 77

9 TESTIN G AND RESULTS.............................................. .............................. 78

9.1 Subsystem Commander Component Overview........................................78
9.2 C ase 1: Set Joint E ffort............................................... ......... ............ ............... 79
9.3 Case 2: Set Joint Position .................................. .....................................81
9.3.1 The "A average" Set........................................................... ............... 82
9.3.2 The "Low" Set.................... ............................... 84
9.3.3 The "H igh" Set ............................................. .. .... .... .... .... .. ........ .... 85
9.4 Case 3: Set End-Effector Pose.......................................................... ... ........... 88
9.5 C ase 4: Set Joint V elocities ............................................. ......................... 89
9.6 Case 5: Set End-Effector Velocity State............... ............................................ 90
9.7 Case 6: Set Joint M otion ............................................. ........ .. ............... 91
9.7.1 Set Joint M otion: Pose 1 ........................................ ......... ............... 91
9.7.2 Set Joint M otion: Pose 2....................................... ......................... 93
9.7.3 Set Joint M otion: Pose 3 ................................................................ 94
9.8 Case 7: Set End-Effector Path M otion....................................... ............... 96

10 CONCLUSIONS AND FUTURE WORK.............................................................99

10 .1 C o n clu sio n s................................................ .................. 9 9
10.2 Future W ork .................. .................. ................ .......... .............. .. 101

APPENDIX

A EQUATIONS FOR A SPHERICAL HEPTAGON ...............................................102

B JAUS MANIPULATOR COMPONENTS: SOURCE CODE..............................104

B. 1 The Galillnterface.c File and the Corresponding Header Galillnterface.h........104
B.2 The Pm.c File and the Corresponding Header Pm.h .......................................117
B.3 The Mjps.c File and the Corresponding Header Mjps.h ................................... 130
B.4 The Meepd.c File and the Corresponding Header Meepd.h ............................141
B.5 The Meedpd.c File and the Corresponding Header Meedpd.h ..........................159
B.6 The Mc.c File and the Corresponding Header Mc.h .............. .... ...............178
B .7 T h e M ain .c F ile .................................................................... .. .............. 182










C SOURCE CODE FOR THE USER DEFINED JAUS MESSAGES .....................200

C.1 The JointEffort.c File and the Corresponding Header JointEffort.h................200
C.2 The JointPosition.c File and the Corresponding Header JointPosition.h...........202
C .3 The EndEffectorPose.c File ........................................ .......................... 204

LIST OF REFERENCES ......... ............... ........ ..................... 207

B IO G R A PH IC A L SK E T C H ........................................ ............................................209
















LIST OF TABLES


Table page

1-1 The JA U S core m message set.......................................................... ............... 9

1-2 Segmentation of command codes by class................................................. 10

1-3 M message header data form at........................................................................ .... 12

2-1 M echanical specifications of the Puma 762 robot...............................................14

2-2 M echanism parameters of the Puma 762 robot ................................. ............... 15

2-3 Closed-loop mechanism parameters of the Puma 762 robot ............................. 19

3-1 Pin connections between Val and Galil ICM-2900 interconnect modules............31

3-2 C ontroller gain values ...................... .. .. .................... ................... ............... 33

4-1 Set Joint Effort message parameters.............. ................................ 40

4-2 Report Manipulator Specifications parameters..........................................42

5-1 Set Joint Positions message parameters............................. ..................46

5-2 Set Joint Velocities message parameters .................................... ............... 48

5-3 Report Joint Force/Torque message parameters............................... ...............50

6-1 Set Tool Point m message param eters ............................................ ............... 54

6-2 Set End-Effector Pose message parameters....................................................54

6-3 Set End-Effector Velocity State message parameters................. ... ........... 58

7-1 Set Joint Motion message parameters............................................ ...............63

7-2 Set End-Effector Path Motion message parameters ........... ..........................67

9-1 The Puma 762 platform specific conversion factors.................. ................81

9-2 Values of the K constant and corresponding range of motion parameters ............82









9-3 Values of the K constant and "average" set of motion parameters......................82

9-4 Values of the K constant and "low" set of motion parameters ..............................84

9-5 Values of the K constant and "high" set of motion parameters...........................86

A-1 Fundamental formulas for a Spherical Heptagon ..........................................102

A-2 Subsidiary formulas for a Spherical Heptagon Set 1 .......................................103
















LIST OF FIGURES


Figure p

1-1 M anipulator linkage param eters for link ij ........................................ ...................6

1-2 Manipulator linkage parameters for revolute joint j ................... ................ ...6

1-3 Manipulator linkage parameters for prismatic joint j ................... .................. ..7

1-4 A architecture hierarchy ............................................................. ....................... 8

1-5 Architecture hierarchy of the manipulator control node ..........................................8

1-6 The JAU S m message header detail............................................... ........ ....... 11

1-7 Bit layout of m message properties................................ ......................... ........ 11

2-1 Puma 762, 6-DOF robot manipulator ...................................... ......... ............... 13

2-2 Labeled kinematic model of the Puma 762 manipulator .............. ...................15

2-3 Reverse analysis solution tree for Puma 762 robot..............................................22

2-4 W rist singularity of Pum a 762 robot ..................................... ......... ............... 25

2-5 Forearm boundary singularity of Puma 762 robot .............. .........................25

2-6 Forearm interior singularity of Puma 762 robot .................................................26

3-1 Schematic representation entire manipulator system...........................................29

3-2 Arm signal interconnects between Val and ICM-2900 modules.........................30

3-3 BRK-ON-HI connection diagram ...........................................................32

3-4 Functional elements of a motion control system ................................................34

3-5 Initializing the Galil libraries ........... .................................... 35

3-6 Establishing communications with the Galil Controller............................35

3-7 Closing the connection to the Galil Controller ..................................................35









3-8 Sending commands to the Galil Controller.....................................36

3-9 R setting the controller............. ................................ .................. ............... 36

4-1 Joint effort provides basic manipulator mobility ................ ......... ...............40

5-1 Joint position sensor com ponent.................................... ............................ ......... 46

5-2 Joint velocity sensor com ponent.................................... ............................ ......... 48

6-1 Manipulator Joint Positions Driver component................. ............... ..............52

6-2 Manipulator End-Effector Pose Driver component..............................................53

6-3 Manipulator Joint Velocities Driver component...................................................56

6-4 Manipulator End-Effector Velocity State Driver component............................. 57

7-1 Manipulator Joint Move Driver component .................................. ...............62

7-2 Manipulator End-Effector Discrete Pose Driver component..............................66

8-1 The galillnterface.c logic flow diagram .............................................................. 70

8-2 Generic component logic flow diagram......................................................72

8-3 The Primitive Manipulator state thread logic flow diagram..............................73

8-4 Manipulator Joint Position Sensor logic flow diagram..........................................74

8-5 Manipulator End-Effector Pose Driver logic flow diagram ................................75

9-1 Subsystem Commander operator graphical user interface.............................. 79

9-2 Primitive Manipulator Screen as it responds to the Set Joint Effort message .......80

9-3 External closed-loop control diagram ................................................................ 81

9-4 Joint step responses using "average" motion parameters ......................................83

9-5 The MJPD screen as motion is completed under the "average" set ......................83

9-6 The MJPD screen as motion is completed under the "low" set .............................84

9-7 Joint step responses using "low" motion parameters.....................................85

9-8 Joint step responses using "high" motion parameters ..........................................86

9-9 The MJPD screen as motion is completed under the "high" set............................87









9-10 Subsystem Commander screen showing the final configuration of Puma 762 .....87

9-11 The MEEPD screen as it responds to Set End-Effector Pose message..................89

9-12 The MJVD Screen as it responds to Set Joint Velocities message........................90

9-13 The MJMD screen showing component status upon completion of pose 1 ..........91

9-14 Joint performance plots for motion parameters set in pose 1 .............................92

9-15 The MJMD screen showing component status upon completion of pose 2 ..........93

9-16 Joint performance plots for motion parameters set in pose 2 .............................94

9-17 The MJMD screen showing component status upon completion of pose 3 ..........95

9-18a Joint performance plots for motion parameters set in pose 3 .............................95

9-18b Joint performance plots for motion parameters set in pose 3 .............................96

9-19 The MEEDPD screen after completion of pose 1.........................................97

9-20 The MEEDPD screen after completion of pose 5.............................................97















Abstract of Dissertation Presented to the Graduate School
of the University of Florida in Partial Fulfillment of the
Requirements for the Degree of Master of Engineering

DESIGN AND IMPLEMENTATION OF A MODULAR MANIPULATOR
ARCHITECTURE

By

Ognjen Sosa

December 2004

Chair: Carl D. Crane, III
Major Department: Mechanical and Aerospace Engineering

The Joint Architecture for Unmanned Systems (JAUS) has successfully established

a well-defined component interface for unmanned mobile systems, but has yet to address

the implications of such systems requiring an on-board robot manipulator. This

configuration is seen in many applications including planetary exploration, hazardous

materials removal, and marine research and is frequently referred to as the vehicle-

manipulator system. The purpose of our study was to develop and implement a set of

JAUS components that will allow for tele-operational (teleop) and autonomous control of

a vehicle-manipulator platform. Teleop control is the control of a system by the direct

input of a human or a computer. Autonomous control is a cooperative mode between the

vehicle and the manipulator.

Testing and implementation of these components was performed on a 6-degree-of-

freedom (6-DOF) Puma 762 robot manipulator (Unimation Westinghouse, Danbury,

Connecticut) outfitted with a commercially available Galil motion controller (Galil









Motion Control, Inc, Rocklin, California). Successful completion and adequate

compatibility to the outlined JAUS performance specifications would ensure the

inception of the above mentioned components to the latest version of the document's

Reference Architecture. Even though this modular manipulator architecture is suitable for

both autonomous and teleop control, testing and results were based solely on the input

provided using a graphical user interface on a computer.














CHAPTER 1
INTRODUCTION

1.1 Introduction

In the past decade, significant technological breakthroughs have led to smarter and

more-reliable unmanned systems. Reliability and robustness of these systems depend on

many factors, most of which are defined in the early stages of design and development.

With an increasing interest in this field and tremendous implications to both civilian and

military use, there is a growing demand for a set of well-defined standards that could

ensure safety, reliability, and interoperability. The Center for Intelligent Machines and

Robotics (CIMAR) at the University of Florida has been involved in developing of one

such standard, in cooperation with the Department of Defense.

The Joint Architecture for Unmanned Systems (JAUS) has successfully established

a well-defined component interface for unmanned mobile systems, but has yet to address

the implications of such systems requiring an on-board robot manipulator. This

configuration is seen in many applications including planetary exploration, hazardous

materials removal, and marine research; and is frequently referred to as a

vehicle-manipulator system. The purpose of our study is to develop and implement a set

of JAUS components that will allow for tele-operational (teleop) and autonomous control

of a vehicle-manipulator platform. Teleop control is defined as the control of a system by

the direct input of a human or a computer. Autonomous control is defined as a

cooperative mode between the vehicle and the manipulator. The components focus on a

serial manipulator comprising of any number of prismatic and revolute joints. Parallel









mechanisms are not addressed as a part of our study. The components are grouped

according to function into the following categories:

* Low-level manipulator control components: The one component in this category
allows for low-level command of the manipulator joint-actuation efforts. This is an
open-loop command that could be used in a simple tele-operation scenario. The
component in this category is listed as follows:

o Primitive manipulator component

* Manipulator sensor components: These components, when queried, return
instantaneous sensor data. Three components are defined that return respectively
joint positions, joint velocities, and joint torques or forces. The components in this
category are listed as follows:

o Manipulator joint position sensor component

o Manipulator joint velocity sensor component

o Manipulator joint force/torque sensor component

* Low-level position and velocity driver components: These components take as
inputs the desired joint positions, the desired joint velocities, the desired
end-effector pose, or the desired end-effector velocity state. Closed-loop control is
implied. No path information is specified. The components in this category are
listed as follows:

o Manipulator joint positions driver component

o Manipulator end-effector pose driver component

o Manipulator joint velocities driver component

o Manipulator end-effector velocity state driver component

* Mid-level position and velocity driver components: Two components are
grouped under this heading. The first takes as input the goal values for each joint
parameter at several time values together with motion constraints (i.e. maximum
joint velocity, maximum acceleration, and maximum deceleration). The second
takes as input a series of end-effector poses at specified time values. Closed-loop
control is implied. The components in this category are:

o Manipulator Joint Move Driver Component

o Manipulator End-Effector Discrete Pose Driver Component.









Testing and implementation of these components is performed on a

6-degree-of-freedom (6-DOF) Puma 762 robot manipulator outfitted with a commercially

available Galil motion controller. Successful completion and adequate compatibility to

the outlined JAUS performance specifications would ensure the inception of the

above-mentioned components to the latest version of the document's Reference

Architecture. Even though this modular-manipulator architecture is suitable for both

autonomous and teleop control, testing and results are based solely on input provided

using a graphical user interface on a computer.

1.2 Background

Robot manipulators are used in a wide variety of applications; but usually follow

user-defined paths, thus requiring teleop control. In the case of a manipulator aboard an

autonomous mobile system, there is a growing demand for the manipulator and the

vehicle to be able to cooperate, allowing the system to autonomously complete

more-complex tasks (such as sample acquisition, instrument placement, and mobility

assistance). This problem was first addressed by NASA in the mid 1990s as the first rover

missions to Mars were planned. Technology developed in 1998 [1] allowed robot

manipulators aboard the vehicles to autonomously acquire small rock samples

(designated by the user) within 1 meter away; and to place instruments on targets less

than 5 meters away. These capabilities are accomplished with onboard vision sensors

using stereo processing algorithms developed by Matthies [2]. This application showed

the autonomous behavior of the manipulator but did not consider other high-level vehicle

functions. The algorithms were designed to be portable, extendible, and reusable across

many vehicle platforms. Testing was successfully completed on Rocky 7 [3].









Other inhospitable environments (such as oceans) are frequently explored using

underwater vehicle-manipulator systems (UVMS). These systems are mostly used for

inspection, drilling, mine countermeasures, and surveying [4]. In most applications,

UVMS operates as a master-slave configuration, and as such is prone to a few

deficiencies. Challenges include correctly modeling the nonlinear hydrodynamic effects

of the environment; and improving the performance of motion control encompassing

singularity avoidance, obstacle detection, and power optimization [5]. Recent research [6]

in the field of UVMS uses a unified force control approach, which combines impedance

control with hybrid position/force control by means of fuzzy switching to perform

autonomous underwater manipulation.

1.3 Joint Architecture for Unmanned Systems (JAUS)

1.3.1 Overview

The Joint Architecture for Unmanned Systems (JAUS) [7] is being developed in

conjunction with the Department of Defense and many other members of industry and

academia for use in research, development and acquisition of unmanned systems. The

current version of the document is divided into three large volumes; the JAUS Domain

Model (Vol. I), JAUS Reference Architecture (RA-Vol. II), and JAUS Document Control

Plan (Vol. III). The JAUS Working Group was chartered to reduce lifecycle costs, and

integration and development time; to provide a framework for technology insertion; to

accommodate expansion of existing systems with new capabilities.

Volume I defines known and prospective operational requirements of unmanned

systems. Volume III defines the process used to identify and track requested changes to

accepted JAUS documentation. Components developed as a part of our study affect all

three parts of Volume II because it is concerned with aspects of component design. The









main purpose of the Reference Architecture (RA) is to describe all functions and

messages that shall be used to design new components. Joint Architecture for Unmanned

Systems defines components for all classifications of Unmanned Systems, from teleop to

autonomous. As a particular system evolves, the architecture is already in place to

support more-advanced capabilities. To meet this requirement, four technical constraints

are imposed on JAUS:

* Platform independence: Since unmanned systems will be based on a variety of
missions, no assumptions are made regarding the vehicle platform.

* Mission isolation: Joint Architecture for Unmanned Systems defines a mission as
the ability to gather information about or to alter the state of the environment in
which the platform is operating. This allows the developer to construct the system
to support a variety of missions.

* Computer hardware independence: Advances in computer technology over the
past couple of decades have seen rapid growth. The JAUS computer hardware
constraint was put in place to ensure software and hardware portability as new
systems are developed in the future.

* Technology independence: This constraint is similar to hardware independence,
but focuses more on technical approach [7, 8]. In this particular application, the
architecture makes no assumption regarding the method used to obtain joint
positions. For example different manipulators could be outfitted by different
position sensors that include encoders, potentiometers, or rotational variable
differential transformers.

1.3.2 Standards

The Reference Architecture (RA) document defines the JAUS specific protocol for

transmission of messages. Aside from computer code specifications, this section also

standardizes mathematical notations. The notation used in this thesis is standard to many

popular robotics textbooks; specifically, we use the definitions covered by Crane and

Duffy [9]. To standardize the method of referencing manipulator links (or joints), Figures

1-1 through 1-3 illustrate the notation that will be used later in the document. Figure 1-1









shows the parameters used for link ij. Figure 1-2 and Figure 1-3 show additional

parameters used to define rotational joints and prismatic joints, respectively.


Si



Saij

:;:^ M


S\aij


Figure 1-1. Manipulator linkage parameters for link ij (Source: Crane C., Duffy J.,
Kinematic Analysis of Robot Manipulators, Cambridge University Press,
1998, p. 21, Figure 3.2)

Link length aij is measured as the perpendicular distance between joint axis i and

joint axis j along the unit vector aij. Note that it can have a negative value. Twist angle

ai is the angle between Si (unit vector along joint axis i) and Sj (unit vector along joint

axisj) measured in a right hand sense about aij.


Si


A -- ajk


aij
Figure 1-2. Manipulator linkage parameters for revolute joint j (Source: Crane C., Duffy
J., Kinematic Analysis of Robot Manipulators, Cambridge University Press,
1998, p. 22, Figure 3.5)









Constant joint offset Sj is measured as the perpendicular distance between link aj

and Link ajk along the unit vector Sj. Note that it can have a negative value. Variable

joint angle 0j is the angle between ai (unit vector along link ij) and ajk (unit vector along

link jk) measured in a right hand sense about Sj.


tS

1_rj ajk

Sj





aij
Figure 1-3. Manipulator linkage parameters for prismatic jointj (Source: Crane C., Duffy
J., Kinematic Analysis of Robot Manipulators, Cambridge University Press,
1998, p. 22, Figure 3.6)

Variable joint offset Sj is measured as the perpendicular distance between link aij

and link ajk along the unit vector Sj. Note that it can have a negative value. Joint angle 0j

is the angle between aij (unit vector along link ij) and ajk (unit vector along link jk)

measured in a right hand sense about Sj.

1.3.3 System Topology

The Joint Architecture for Unmanned Systems hierarchy [7] is comprised of four

elements: system, subsystem, node, and component/instance. Figures 1-4 and 1-5 show

the interaction of the four hierarchical elements in general and with respect to the

manipulator extension. A system is defined as a logical grouping of one or more

subsystems allowing for cooperative advantage between the constituents. A subsystem is

an independent unit consisting of a number of nodes supporting its functional











requirements and defining an operational unmanned system. The scope of our study will

encompass the use of all but the system element, thus in this particular implementation,

subsystem would correspond to the vehicle hosting the manipulator.


Figure 1-4. Architecture hierarchy


I --1 I
MMILSIIAT SrInRCrVk.N



I I
-- -13~1
---- --







- -- - -
LWL~.~Ii~ 1h1bLCI3 1m1tjIU1I1
rI


Figure 1-5. Architecture hierarchy of the manipulator control node









A node is defined as a distinct entity, composed of all the hardware and software

necessary to support a well-defined computing capability. In the case of a vehicle-

manipulator system, the manipulator control node contains all of the manipulator

components whether they are a part of a single or multiple processors working together.

Finally, a component or an instance is a cohesive software process [8]. An instance is a

single occurrence running on a single node.

1.3.4 Component Definition

As it can be seen in Figure 1-5, JAUS is a hierarchical system of components with

standardized interfaces. Each component has a distinct name and identification number

and performs a single, cohesive function. Each component has to accept the core JAUS

message set as well as the input and output messages specific to the component itself.

The JAUS core message set [7] is shown in Table 1-1.

Table 1-1. The JAUS core message set
Code Description
Ox01 Set component authority
0x02 Shutdown
0x03 Standby
0x04 Resume
0x05 Reset
0x06 Set emergency
0x07 Clear emergency
0x08 Create service connection
0x09 Confirm service connection
OxOA Activate service connection
OxOB Suspend service connection
OxOC Terminate service connection
OxOD Request component control
OxOE Release component control
OxOF Confirm component control
Ox10 Reject component control









1.3.5 Message Specification

JAUS can be defined as component based message passing architecture. As such, it

uses a well defined set of messages that commence actions, exchange information, and

cause events to occur. JAUS defines six classes of messages at the component level, each

of which will be used in the manipulator component implementation. Table 1-2 lists the

message classes [7].

Table 1-2. Segmentation of command codes by class
Message Class Offset Range (0000h to FFFFh)

Command 0000h 1FFFh
Query 2000h 3FFFh
Inform 4000h 5FFFh
Event Setup 6000h 7FFFh
Event Notification 8000h 9FFFh
Node Management A000h BFFFh
Reserved C000h CFFFh
User Defined Message D000h FFFFh

All messages are composed of a message header and the message data buffer. The

header defines the message's destination node, component, instance, subsystem

identification and the message's corresponding source information. The header also

contains the JAUS command code, the number of bytes in the data buffer that the

destination component can expect to receive, as well as the information pertaining to the

message properties [8]. The header format is common to all messages as shown in Table

1-3, allowing JAUS to employ an embedded protocol providing specific information on

how to handle encoding before and after the transmission. The message header, at a

minimum, should be included in all messages. Figure 1-6 and Figure 1-7 show message

header detail, header data format and header bit layout, respectively.







11


Data Control
Sequence Number Data Flag ta t ...
S I I I I I I I II II 1 IIW II I1 II I I I l II 111: 11 I 11 11 1 111 111 1111 111110 h IIi 1 -, 1

Source ID
Subsystem 'i 'i ... Component .s


Destination ID



Command Code/Core Message iMo.~s iP..p........i i .! N Oi l ls
" I " I Ij" I I I I I i I I I I I I I I0 I I I I I


SPriority Level 0-15 Version

I ,. ,- ,. ,I I I I

Figure 1-6. The JAUS message header detail (Source: JAUS Working Group, 2004, Joint
Architecture for Unmanned Systems (JAUS): Reference Architecture
Specification, Version 3.2, Volume II, The Joint Architecture for Unmanned
Systems, http://www.jauswg.org, October 2004, Part 2, p.11, Figure 3.1)


Version
Range 0.. 63

Version 2.0 = 0

Version 3.0 or 3.1 = 1

Version 3.2 = 2

3 .. 63 unused


Stj




XC,


cic;


c0c
ofl
5*

C


z



on
C,

0F


Message Priority
Range 0 ..15

Default Priority 6

Normal Priority Range
0..11

Safety Critical Range
12 ..15


15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

Figure 1-7. Bit layout of message properties (Source: JAUS Working Group, 2004, Joint
Architecture for Unmanned Systems (JAUS): Reference Architecture
Specification, Version 3.2, Volume II, The Joint Architecture for Unmanned
Systems, http://www.jauswg.org, October 2004, Part 2, p.13, Figure 3.2)

The message data buffer contains packed JAUS control data, and each command


code has control data used by the system to command component behavior. If a particular


system or subsystem contains multiple components passing multiple messages


simultaneously, it can potentially result in system delays due to bandwidth overload. In









order to prevent this, each component and its subsequent command codes must have the

ability to pack and unpack (compress) the control data [8].

Each JAUS component and message is well constrained as described in the sections

above. The next four chapters strive to provide adequate definitions of manipulator

control components relative to the JAUS framework. Chapter 8 covers the aspects of

software design and details of the component and message implementation onto the

PumaA 762 robot. Finally, Chapter 9 provides the results in terms of the compatibility of

the designed JAUS components and messages with the constraints outlined by JAUS. It

also quantifies the performance specifications of the system using the new architecture.

Table 1-3. Message header data format
Field # Field Description Type Size (Bytes)
1 Message Properties Unsigned Short 2
2 Command Code Unsigned Short 2
3 Destination Instance ID Byte 1
4 Destination Component ID Byte 1
5 Destination Node ID Byte 1
6 Destination Subsystem ID Byte 1
7 Source Instance ID Byte 1
8 Source Component ID Byte 1
9 Source Node ID Byte 1
10 Source Subsystem ID Byte 1
11 Data Control (bytes) Unsigned Short 2
12 Sequence Number Unsigned Short 2
Total Bytes 16














CHAPTER 2
SYSTEM ANALYSIS AND OVERVIEW

Manipulator JAUS components and messages are designed to work on any serial

manipulator regardless of the type or the number of joints. As a result, the choice of the

test platform for implementation purposes is irrelevant. Due to the availability and its

operational condition, a 6-DOF Puma 762 (Figure 2-1) robot arm was chosen for this

task. Even though it was originally designed for industrial purposes, this particular

manipulator can be found in many research laboratories due to its robustness and

reliability.























Figure 2-1. Puma 762, 6-DOF robot manipulator

The purpose of this chapter is to summarize the useful mechanical properties and

describe the mathematics behind position and velocity analysis of the Puma 762 robot.









The theoretical approach and notations used in the following sections specifically follow

definitions outlined by Crane and Duffy [9, 10].

2.1 Mechanism Overview

The Puma arm can be compared to a human torso, shoulder, and wrist. It consists

of members connected by six revolute joints, each defining an axis about which the

members rotate. The major joints are equipped with limit-switch-shutoff-systems

positioned 2 degrees past the software stops providing additional safety. The Puma 762

weighs 590 kg and has a maximum static payload of 20 kg. Table 2-1 lists useful

mechanical specifications of the system.

Table 2-1. Mechanical specifications of the Puma 762 robot
Joint # 1 2 3 4 5 6
Software Movement Limits 320 220 270 532 220 532
320 220 270 532 220 532
(deg)
Joint Angular Resolution
(deg* 10-3) 5.0 3.5 4.5 12.5 6.2 13.4
Encoder Index Resolution;
equal to one motor 4.0 2.78 3.57 6.26 6.26 13.4
revolution (deg)

2.2 Kinematic Analysis of the Puma 762 Robot

2.2.1 Notation

Figures 1-2 and 1-3 show detailed definitions of vectors and parameters used to

label revolute and prismatic joints, respectively. The mechanism parameters listed in

Table 2-2 are used to create a kinematic chain shown in Figure 2-2. The proper analysis

of a robot manipulator mandates that a coordinate system is attached to each of the

bodies. The coordinate system attached to link ij is called the ith coordinate system [9]. Its










origin is located at the intersection of vectors S, and a, ; x-direction is along the vector


ai, and z-direction is along S,.

Table 2-2. Mechanism parameters of the Puma 762 robot
Link Length, mm Twist Angle, deg Jnt Offset, mm Joint Angle, deg
a12 = 0 a12 = 90 01 =variable

a23 = 650 a23 = 0 S =190 02 =variable

a34 = 0 a34= 270 S3 =0 03 =variable

a45 = 0 a45 = 90 S4 =600 04 = variable

a56 = 0 56 = 90 S, = 0 60 = variable

6 = variable


a34
Sa
a23r


Figure 2-2. Labeled kinematic model of the Puma 762 manipulator

The transformation matrix relating two of these coordinate systems in a three

dimensional space is given by Equation 2-1.


C
Sc
ST= J 0

0


-S
C CO
CS
0


a
- Sl Si
55
C S
1


(2-1)









The inverse of this transformation is very frequently used and is given by the

following 4 x 4 transformation:

Cj SjCj SjSj -cjaj

'T= s cc cs sa (2-2)
0 Sj Cj S
0 0 0 1


where aJ represents a link length of a serial manipulator, s, and c, represent the sine


and cosine of 0, respectively. Furthermore, sJ and cJ represent the sine and cosine of a.

Finally, a fixed coordinate system is defined as having its origin coincident with the


origin of the first coordinate system and its axis along the vector 1 The transformation

that relates the first coordinate system and the fixed is given in Equation 2-3.

cos -sin 0 0
F =sin 1 cos 1 0 0
0 0 1 0(2-3)
0 0 0 1

General expressions determining the directions of joint vectors with respect to the

first coordinate system are given in Equations 2-4 and 2-5.

F0 0 X 2 --2,
1S,= 0 12= s 3= Y2, 'S Y, n2, 2 (2-4)
12C12 ln-L 2, ,2 n m 2

1 2 Wn n-,m-, ,2
S= 10 --3 = S2C12 = -U*1,m, ,2 (2-5)
l 0 s2s n-12 Ulm,2

where the definitions of the X, Y, Z and W, U*, U are presented in Appendix A. Using

the coordinate transformation given in Equation 2-3 and expressions from Equations 2-4









and 2-5, direction vectors can be obtained in terms of the fixed coordinate system and are

shown in Equations 2-6 and 2-7.

FS =FT1S, (2-6)

Fal=T. (2-7)


2.2.2 Forward and Reverse Position Analysis

The most basic problem in the analysis of serial manipulators is to determine the

position and orientation of the end-effector for a specified set of joint angles. Following

the method outlined by Crane and Duffy [9], the first step to the solution determines the

transformation that relates the end-effector coordinate system to the fixed coordinate

system. In the case of a 6-axis robot, the transformation in question is obtained as

follows:

FT=FT'T. T'23T 4T5TT (2-8)

The coordinates of the end-effector in the fixed coordinate system can be found

from Equation 2-9.

Fp =FT.6P (2-9)
FPtool- 6 tool (2-9)

All of the terms in Equation 2-8, are obtained from known mechanism parameters that

are listed in Table 2-2 for the Puma 762 manipulator.

A more complicated problem arises when one is trying to determine all possible

joint-angle configurations for a specific end-effector position and orientation. This

non-trivial solution is clearly more difficult, however due to a favorable geometry of

most of the industrial manipulators, much of the analysis is simplified. The approach is

referred to as the reverse kinematic analysis and begins by closing the link-loop with a

hypothetical member. For a 6-R (6-revolute-joint) manipulator such as the Puma 762, this









results in a 1-degree-of-freedom 7-R spatial mechanism with the angle 07 known [9].

Detailed derivation of the solution to this problem is provided by Crane and Duffy [9],

thus only the final equations used to obtain the values of the 6-close-the-loop parameters

are shown below. The twist angle a71 can be calculated using Equations 2-10 and 2-11.

C71=F 7 F S1 (2-10)

s71 (F 7xFS}FS 1 (2-11)


Next, joint angle 7 is found using Equations 2-12 and 2-13.

c7 =Fa67 F71 (2-12)

s7 = (F67 XF 71)F 71 (2-13)


Parameter 71 is defined as the angle between the vector a71 and the x-axis of the fixed

coordinate system, thus using a similar approach as outlined above, this angle is obtained

using Equations 2-14 and 2-15.


cos y1 = F 71 0 (2-14)
0



sin, = F 71 x 0 FS1 (2-15)



Finally, the values ofS7, a71 and Si can be obtained and are given by Equations 2-16, 2-

17, and 2-18 respectively.

s (F1xF^0tug}71 F1
S, = F F g 71 (2-16)
S71










a71 = f6g F F7 (2-17)
S71


S, = 6rg F 71 (2-18)
S71

Table 2-3 shows the mechanism parameters for the newly formed closed-loop spatial

mechanism.

Table 2-3. Closed-loop mechanism parameters of the Puma 762 robot
Link Length, mm Twist Angle, deg Jnt Offset, mm Joint Angle, deg
a12 = 0 a1 = 90 S, = C.L. 1 =variable
a23 = 650 a23 = 0 S =190 02 =variable

a34 = 0 a34 = 270 S3 = 0 03 =variable

a45 = 0 a 45= 90 S4 = 600 04 = variable

a56 =0 a56 = 90 S5 = 0 60 = variable

a67 = 0 a67 = 90 S6 = 129 06 =variable

a71 = C.L. a,, = C.L. S, = C.L. 0 = C.L.


Once all of the closed-loop parameters have been calculated, the vector-loop

equation for the closed-loop Puma mechanism can be constructed and is represented

using Equations 2-19:

SS +S2S2 + a3a23 + S4S + SS + S71S71 + a71a7 = 0 (2-19)

Expanding these vectors and expressing them in terms of the Set 14 of the table of

direction cosines for the spatial heptagon (Appendix A) results in:

0 0 c, X5671 X1 X,~ c, 0
S, s12 + S, 0 + a2, s, +S, Y5671 +S6 + S S a71, sc,1 = 0 (2-20)
r C 12] 1 0 Z 567_1 Z, Z, U12 -

Further simplification is obtained by using subsidiary spatial and polar-sine, sine-cosine,

and cosine laws from Equation 2-21.









X5671 X32
Y5671 = X,2 (2-21)
Z5671

The representation in Equation 2-20 yields three equations. Further substitution of the

known terms and simplification of the Z component of the equation yields Equation 2-22.

[S6Y7 S71s1 + [S6X7 + a71 ]s + [S2] = 0 (2-22)

This is an equation of the formAci + Bsl + D = 0, where A, B, and D are constants. The

solution provides two possible values labeled as 01a and 0b1. Corresponding values of the

angle l1 can be calculated as (01, 1 ) and (0lb -1 )

Substituting the known values into the X and Y components of the Equation 2-20

yields Equations 2-23 and 2-24:

a23c, + S4X, + S6X, + SX, + a71c, = 0 (2-23)

S, as + a34V32 S4X32 + S6Y71 + S7Y, = 0 (2-24)

Moving the terms that do not contain the unknown variables and expanding the

direction-cosines results in Equations 2-25 and 2-26:

a23c2 + S42+3 = A (2-25)

az23s S4 2+3 = B (2-26)


where A = -S67 S7X a7c B = S ,Y, S7,Y, while s2+3 and 2+3 represent

sine and cosine of (02 + 03), respectively. Squaring both sides of both Equations 2-25

and 2-26 and then adding them yields Equation 2-27.

a2 + S2 + 2a3S4[s2C2+3 cs2+3 = A2 +B2 (2-27)






21

where [s2c2+ c2s23 ]= sin[02 (02 +03)] = sin(- 03)= -s3. Substituting this term back

into the Equation 2-27 results in Equation 2-28.

s3[- 2a23S4]+[a2 + S2 A2 -B2 = (2-28)

This equation contains only 3 as the unknown. For each value of 1, 2 corresponding

values of03 are determined. Regrouping Equations 2-25 and 2-26 yields the following

relationships:

c2 [a23 S4S3 + S2 [- S43 ] = A (2-29)

s2 [- a23 + S4s 3+ c, [- S4c3 ] = B (2-30)

Equations 2-29 and 2-30 provide a system of 2 equations and 2 unknowns. Thus a unique

value of 2 is solved for each corresponding set of 1 and03. The next step is to solve for

5 using Equation 2-31:

Z7123 = Z, (2-31)

With corresponding substitutions and expansions, this yields two values of 05 for each

set of07, 01, 03, and 05 as follows:

c, = -Z7123 (2-32)

Solution of 04 is obtained from a system of 2 subsidiary spherical Equations 2-33

and 2-34.

X54 = X7123 (2-33)

X54 = -7123 (2-34)

where X54 = X5c4 -5S4 and X54 = X5s4 + C4 Final form of the solution shown in










Equations 2-35 will result in a unique value of 4 for each of the 8 sets of corresponding

angle values.


C4 = (2-35)
S5


S4 = -73 (2-36)
S5


The solution of the last remaining joint angle 6 is obtained using the following

two fundamental spherical sine and sine-cosine laws defined by Equations 2-37 and 2-38.

X43217 = S56S6 (2-37)

Y43217 = 56C6 (2-38)


Since a56 is known, the equations reduce to s6 = X43217 and c6 43217 The final solution

tree for the Puma 762 robot is shown below in Figure 2-3.


07


Ola lb


03a 03b 03c 03d


02a 2b 02c 02d


05a 05b 05c 05d 05e 05f 05g (5h


04a 04b 04c 04d 04e 04f 04g 04h


06a 06b 06e 06d 06e 06f 6g 06h
Figure 2-3. Reverse analysis solution tree for Puma 762 robot










2.2.3 Forward and Reverse Velocity Analysis

Similar to the forward position analysis, the velocity analysis assumes that the

angular velocities of each of the joints are known, and as a result it determines the

velocity state of the last link of the manipulator as shown in Equations 2-39.


O 0 6 0 _! 0,6 06 l o 21 2 s+2C32S3 +3C43S4 +4C54S5 +5 O65S6 (2-39)


where '$ are the unitized line coordinates for each of the joint-axes. From Duffy and

Crane[10], this equation can be rewritten in the matrix format yielding Equation 2-40.

0-6
= 0606 = Jco (2-40)


where J, the Jacobian matrix, is the 6 x 6 matrix formed from the unitized screw

coordinates, which can be written using Equation 2-41.

J--[s s2 2s3 3s s5 5s6 I 2 2 3 3 4 4S5 5S6 1
0= 1 12 23 3 425 56 5 (2-41)
1 $2 J3 04 ol l[OS 2 2S 3 3S 4 4 5 5S6


where 0 is the vector of joint velocities defined by Equation 2-42.

= [ 1 1 2 22 3 33 4 44 05 5 6 (2-42)

Assuming that the position analysis is completed, all members of the Jacobian are

known, thus the forward velocity analysis is completed using Equation 2-39. Just as was

the case with the position analysis, the reverse velocity problem becomes more

complicated and individual joint velocities can be determined by simple arithmetic

yielding Equation 2-43.

) = J1o0 )6 06 (2-43)









It is possible that the manipulator is driven to a configuration in which the Jacobian

matrix is singular and the inverse cannot be obtained [10]. Such configurations are the

topic of the following section.

2.2.4 Singularity Determination

A robot is defined to be in a singular configuration when the determinant of the

Jacobian is equal to 0. Duffy and Crane [10] also define this special configuration when 1

or more of the joint-axis lines as defined in the previous section become linearly

dependent to the others. This section identifies those configurations in which such

conditions occur. Such configurations will cause joint velocities to rapidly increase, and

there will be no feasible solutions of the manipulator to move in a desired direction.

Many computational methods are developed to optimize singularity avoidance.

For practical purposes, the line coordinates of the Jacobian matrix shown in

Equation 2-44 are expressed in terms of the third coordinate system. This is

arithmetically the most favorable selection and allows for easy identification of singular

configurations.

S2+3 0 0 0 S4 S5C4
2+3 0 0 1 0 C5
0 1 1 0 C4 -S5S4
J= 4 (2-44)
S22+3 a23s3 0 0 S4c4 S4s5s4
S22+3 a23c3 0 0 0 0
a23c2 0 0 0 S4s4 S4s5c4

The determinant of this Jacobian yields Equation 2-45.

det[J] = -a23S4 (s )(c3 )[- a232 + SS2+3 ] (2-45)

The left side of the Equation 2-45 equals zero if:

* Wrist singularity (s, = 0): In this case vectors S4 and S become collinear.









* Forearm boundary singularity [11] (c3 = 0): In this case vectors S, and a, are
parallel and the elbow is fully extended.

* Forearm interior singularity [11] ([-a23c2+S4s2+3]=0): The interpretation of this
term is rather complicated, but it can be said that the singularity occurs when vector
S6 is very close to the Svector.

Figures 2-4, 2-5, and 2-6 show the wrist, forearm interior, and boundary

singularities, respectively.


Figure 2-4. Wrist singularity of Puma 762 robot


Singular Directions: x, y, and -z.


Figure 2-5. Forearm boundary singularity of Puma 762 robot









Singular Directions: -x. -y, and z.



-As












Figure 2-6. Forearm interior singularity of Puma 762 robot

The above 3 configurations require special attention and will be a matter of interest

in the upcoming chapters.

2.3.5 Quaternion Representations

Crane and Duffy [9] define a real quaternion as a set of 4 real numbers written in

definite order as shown in Equation 2-46.

q = (d, a, b,c) (2-46)

Chapter 6 will use quaternion representation for the position and orientation of the

end-effector. For that reason, this section defines those aspects of the quaternion algebra.

The unit quaternion q is defined in Equation 2-47.

q = cos() + sin 0O(si + Syj + s k) (2-47)

The equivalent rotation matrix is defined by Crane and Duffy [9] as the following:

Ss(1 -cos20) + cos 20 ss(1-cos20)-ssin20 sxs (1-cos20)+sysin20O
JR= sxs(1-cos20)+ssin20 s 2(1-cos20)+cos 20 sys (1-cos20)_sxsin20
ss (1-cos20)-s sin20 sys (1-cos20)+sxsin20 s (1-cos20) + cos20






27


In summary, this chapter provides all the necessary analysis sufficient for tasks

mandated by the proposed JAUS components. Equations derived in Sections 2.3.3 and

2.3.4 will become essential for component development outlined in Chapters 5, 6 and 7.

Detailed information on theory covered in this chapter and more advanced robot

manipulator analysis is presented by Crane and Duffy [9] and Duffy [10].














CHAPTER 3
PUMA 762 CONTROLLER SYSTEM

This chapter addresses the capabilities of an onboard controller system and ties

them into the requirements outlined by the JAUS Compliance Specification (JCS)

document. Before modular architecture implementation, the platform was in operational

condition, allowing the user to control the motion of the individual joints using

commercially available software. Such conditions required no additional changes to the

current hardware configuration. For completion purposes, this chapter provides a brief

summary of modifications to the original system configuration. Further emphasis is put

on the functions available in the C/C++ Application Programming Interface (API) and its

use in this implementation.

3.1 Overview

Native to the Puma 762 is the Val II high level programming language. Aside from

being a sophisticated development tool, Val II is a complete control system. Joint

Architecture for Unmanned Systems standard currently dictates the use of a C

programming language for development purposes. Due to some deficiencies in the older

VAL controller and lack of an adequate API, the Puma was outfitted with a Galil DMC-

2100 motion controller. Unfortunately, the use of a commercially available motion

controller dictates operational constraints. The JCS document mentioned above defines

three levels of interoperability. This implementation satisfies inter-nodal, or level II

compliance, supporting interoperation between nodes [12]. Figure 3-1 shows the simplest









representation of the overall system. Connectivity between Val and Galil is addressed in

the following section.



-u -+ VAL 1I Controller




Gam D C 00 Ethemet PC
a ; ln]DIVC-2iOQ 100API Interface -.. PC
Conr oolero

Figure 3-1. Schematic representation entire manipulator system

3.2 Reverse Engineering the Puma 762 Robot

Hardware interfacing between the Val and Galil controllers was done by Prof

Robert Bicker of the University of Newcastle upon Tyne in June of 2001. This section

summarizes all the necessary modifications made to effectively outfit the system with a

newer Galil controller while maintaining some of the basic Val functionality.

3.2.1 Existing Architecture

Val II is a hierarchical controller based on the LSI 11-73 microcomputer that

provides a high-level trajectory and program control of the robot using the native

programming language. Joint proportional-integral-derivative (PID) control is provided

by dedicated digital axis servo-boards (using an Intel 8748 microcontroller) running at 1

kHz. The 12-bit digital-to-analog converter (DAC) output of the digital servo-boards is

input to the individual PWM power amplifiers (PAs). Three major PAs are located on the

rear-door of the controller, while three minor ones are located in the control rack. As

mentioned earlier, each joint of the robot is driven by a direct-current (DC) servo-motor

with integral electro-magnetic brake. Mounted directly on the end of the motor shaft are









an incremental encoder (250 lines) and a geared servo-potentiometer providing position

feedback. The initial calibration process requires each joint to be driven through a small

angle, sufficient to locate the nearest encoder index. This non-absolute position is then

compared to the values stored in a look-up table via the corresponding analog

potentiometer reading [13].

3.2.2 Encoder and Potentiometer Val Interface

The board edge connector located in the J56 slot directs encoder quadrature (A &

Q), index and potentiometer outputs to respective digital servo-boards (J45-50) via a

J-bus backplane. Wire-wrap terminals are provided at the rear of the backplane only on

the J56, and wire-wrap connections are made to a 50-way IDC wire-wrap connector. A

50-way ribbon cable runs to a break-out box, and then single core cables are bundled to

the respective connections on the Galil ICM-2900 modules, designated 1 and 2 (Figure

3-2).


Wire wrap


Figure 3-2. Arm signal interconnects between Val and ICM-2900 modules









3.2.3 Amplifier Digital-to-Analog Converter Signals and Control Lines

The DAC outputs on the Val controller for each axis are derived by the digital

servo boards. The DAC (+/-) signals are presented to a 34-way IDC connector on the

control backplane, and are linked to the power amplifier backplane via a 34-way ribbon

cable (J103 => J79). Additional control lines are also present. Table 3-1 shows the pin

connections between the Val controller and Galil's interconnect modules.

Table 3-1. Pin connections between Val and Galil ICM-2900 interconnect modules
VAL Signal 34/50 way pin Wire color ICM-2900
teach-error 1 white
_stop 2 white 1/14/INPUT1
Hnd-sigl 3 white
Hnd-sig2 4 white
Brk-on-hi 5 white
Deadman-sw 6 white
E-stop b 7 white
ox-inhibit 8 white 1/14/INPUT3
Servo E-stop 9 white
DAC+1 11 orange 1/3/MOCMDX
DAC-1 12 blue 1/3/GND
DAC+2 13 orange 1/4/MOCMDY
DAC-2 14 blue 1/4/GND
DAC+3 15 orange 1/1/MOCMDZ
DAC-3 16 blue 1/1/GND
DAC+4 17 orange 1/2/MOCMDW
DAC-4 18 blue 1/1/GND
DAC+5 19 orange 2/3/MOCMDX
DAC-5 20 blue 2/3/GND
DAC+6 21 orange 1/4/MOCMDY
DAC-6 22 blue 1/4/GND
Remote +ve 33 white
Encoder fault 34 white 1/14/INPUT2









In order to retain Val safety functionality, all control lines are connected straight

through via the 34-50-50-34 interconnection cabling. Stop, Encoder-fault and Ox-inhibit

signals are linked to digital inputs 1-3, respectively of the ICM module 1. The amplifier

enable signal is provided by a single control line BRK-ON-HI (brake on high). This is a

TTL open-collector output from the LSI-11 controller, which is pulled low on VAL being

initialized. A 7406 hex-inverter (with open-collector outputs) is used to drive this line

low via the Galil digital output 1 as is shown in Figure 3-3.

+5v




1/8/OUTJ1 1 > R BRK-ON-HI


7406 VAL
Figure 3-3. BRK-ON-HI connection diagram

3.2.4 Safety

The power amplifiers are enabled by pulling-low BRK-ON-HI using the Galil

command OP1 (OutPut 1 set). Arm power is applied using the remote ON/OFF switch

box (if motion control set to REMOTE) or via the front panel (if set to LOCAL). The arm

will attempt to go into closed loop at this time, and it is essential to apply either the SH or

MO (ServoHere, MotorOff) Galil commands prior to powering up the arm to prevent any

run-away.

3.2.5 Tuning

Axis tuning was carried out sequentially, initially in the digital feedback mode

(AFn=0), and subsequently in the analog feedback mode (AFn=1). Step response tests

were carried out using the Servo-Design Kit software. Small and large steps (100 and









1000 counts using encoder feedback) as well as manual tuning and auto-tuning features

were used, although manual tuning was preferred. Proportional (KPn), Derivative (KDn)

and Integral action gains (KIn) are set as shown in Table 3-2.

Table 3-2. Controller gain values
Axis/Joint # KP KD KI
A/1 80 500 1
B/2 60 500 1
C/3 100 200 1
D/4 100 500 1
E/5 100 500 1
F/6 100 500 1

Once adequately tuned, this configuration provides a user friendly computer

interface and allows for simple control of the manipulator.

3.3 Galil DMC-2100 Functionality

DMC-2100 is one of Galil's highest performance stand-alone controllers outfitted

with many enhanced features including high-speed communications, non-volatile

program memory, faster encoder speeds and improved cabling for noise reduction. It is

designed to solve complex problems involving jogging, point-to-point positioning, vector

positioning, electronic gearing, multiple move sequences, and contouring [14].

3.3.1 Command Modes

There are several of ways to command motion using the Galil controller. The

requirements of this project are simple and only take advantage of two motion modes.

Independent axis positioning generates an independent trajectory profile for each of the

axes. The user commands either absolute or relative position and selects the values of

maximum speed, acceleration and deceleration. The second, and more relevant, is

independent jogging. This mode is very flexible and allows the user to change all of the










above-mentioned values during motion and specify the direction. The controller operates

as a closed-loop position controller while in the jog mode. It converts the velocity profile

into a position trajectory and a new position target is generated with every sample period

[14].

3.3.2 Theory of Operation

This section only offers a brief overview of the operation of a motion control

system. Detailed information can be found in many control theory books and controller

manuals. The operation of a system (such as the DMC-2100) could be divided in three

levels as follows:

* Closing the loop

* Motion profiling

* Motion programming.

Figure 3-4 shows the elements of the servo system. On the lowest level, the

controller ensures that the motor follows the commanded position. This is accomplished

using a feedback provided by a sensor. In the case of the Puma system, position feedback

is provided by an incremental encoder.

CONTROLLER
r-----------------------------------------
I ZOK
R X- DIGITAL FILTER -Y- zero-order- DAC --- AMP E MOTOR
hold




ENCODER P


Figure 3-4. Functional elements of a motion control system

Most of the commercially available motion controllers use trajectory generators.

This function describes where the motor should be at every sampling period. Finally, at









the highest level of control, the program describes the tasks such as desired distances or

speed [14]. A detailed mathematical model of each of the various components presented

below can be found in [14].

3.4 Galil C/C++ Application Programming Interface (API)

Engineers at Galil Motion Control Inc. have developed a set of API function calls

that can be used in software development on various computer platforms. These calls

provide an effective link between the Galil machine code and standard C or C++

programming languages. Manipulator JAUS implementation more specifically requires

libraries running on the Linux operating system. This section lists only the calls and

corresponding prototypes used in our study (Figure 3-5 through 3-9). Additional function

calls and installation procedures are outlined in the interface document [15].

Function Prototype:
extern LONG FAR GALILCALL DMCInitLibrary(void);
Function Description:
This function must be called prior to using the library.
Figure 3-5. Initializing the Galil libraries

Function Prototype:
extern LONG FAR GALILCALL DMCOpen(PCONTROLLERINFO
pcontrollerinfo, PHANDLE phdmc);
Function Description:
The handle to the controller is returned in the argument phdmc.

Pcontrollerinfo: Structure holding information about the controller.
Phdmc: Buffer to recelive the to the Galil controller to be used in all subsequent
calls.
Figure 3-6. Establishing communications with the Galil Controller

Function Prototype:
extern LONG FAR GALILCALL DMCClose(HANDLEDMC hdmc);
Function Description:
This function closes the Ethernet connection to the controller.
Figure 3-7. Closing the connection to the Galil Controller









Function Prototype:
extern LONG FAR GALILCALL DMCCommand(HANDLEDMC hdmc, PSZ
pszCommand, PCHAR pchResponse, ULONG cbResponse);
Function Description:
This function is used to send commands to the controller.

pszCommand: The command send to the controller in the machine language.
pchResponse: Buffer receiving the response data.
cbResponse: Length of the buffer.
Figure 3-8. Sending commands to the Galil Controller

Function Prototype:
extern LONG FAR GALILCALL DMCReset(HANDLEMC hdmc);
Function Description:
This function is used to reset the controller.
Figure 3-9. Resetting the controller

The use of these calls will become more apparent in Chapter 9 as the aspects of


software design on a node level are introduced.














CHAPTER 4
LOW-LEVEL MANIPULATOR CONTROL COMPONENT

This chapter defines the Primitive Manipulator (PM) component in terms of the

JAUS architecture. For the purposes of easy insertion, the format used to present the

information in the first section of this and the upcoming chapters, follows the latest

format outlined in version 3.2 of the JAUS Reference Architecture Document. The

chapter further details the application of the PM to the Puma system.

4.1 Primitive Manipulator Component

The one component in this category (JAUS ID# 49) allows for low-level command

of the manipulator joint efforts. This is an open-loop command that could be used in a

simple tele-operated scenario. This component is currently in version 3.2 of the JAUS

Reference Architecture.

4.1.1 Definition of Coordinate Systems

A variety of platform configurations on which manipulator components can be

implemented might require data to be interpreted in terms of different coordinate systems

either to adequately define the geometry or allow for easier task completion.

4.1.1.1 Global coordinate system

Points that are defined in this coordinate system are defined in units of longitude,

latitude, and elevation. The x-axis points North and the z-axis points downward.

4.1.1.2 Vehicle coordinate system

This coordinate system is attached to the vehicle frame. The x-axis points in the

forward direction and the z-axis points downward. The y-axis is defined so as to have a









right-handed coordinate system (i.e. i x j = k where i, j, and k are unit vectors along the

x, y, and z coordinate axes).

4.1.1.3 Manipulator base coordinate system

In most cases, this coordinate system is attached to the vehicle base just like the

vehicle coordinate system. The origin is located at the intersection of the line along the

first joint axis, S1, and the line along the first link, a12. The z-axis is along Si and the

direction of the x-axis is user defined, but fixed with respect to the vehicle frame. Since

the manipulator base coordinate system and the vehicle coordinate system are both

attached to the vehicle base, the transformation matrix that describes the relative position

and orientation of these two coordinate systems will be constant. In some cases where

one manipulator may be attached to the end of another manipulator, this transformation

matrix would vary.

4.1.1.4 End-effector coordinate system

This coordinate system is attached to the last link of the serial manipulator. The

origin is located at the point that is a distance Sn (S6 for a six axis manipulator) along the

last joint axis vector (S6 for a six axis manipulator) from the intersection of the lines

along the last joint axis and the preceding link axis (S6 and a56 for a six axis manipulator).

The Z axis is along the Sn vector. The direction of the x-axis is user defined, but of

course must be perpendicular to the z-axis. The y-axis is defined by the right-hand rule.

Note that the distance Sn is returned by the Primitive Manipulator component via the

Report Manipulator Specifications Message.

4.1.2 Component Function

This component is concerned only with the remote operation (open-loop control) of

a single manipulator system. The manipulator may or may not have joint measurement









sensors that would provide joint position and joint velocity information. Without joint

measurement sensors, the operator can only send joint motion efforts as commands to the

manipulator. This component does not use any joint angle or velocity feedback from the

manipulator. It only receives the desired percentage of maximum joint effort for each

joint as an input.

4.1.3 Associated Messages

The PM accepts the core input and output messages listed in Table 1-1. The set of

user defined input and output messages specific to this component are listed below.

Detailed definitions are provided in Section 4.2.6.

* Set Joint Effort

* Query Manipulator Specifications

* Query Joint Efforts

* Report Manipulator Specifications

* Report Joint Efforts

4.1.4 Component Description

This component is the low-level interface to a manipulator arm and is in many

respects similar to the Primitive Driver component for mobility of the platform. When

queried, the component will reply with a description of the manipulator's specification

parameters, axes range of motion, and axes velocity limits. The notations used to

describe these data are documented in many popular text books on robotics and were

previously presented in Chapter 2. The mechanism specification parameters as reported

by the Report Manipulator Specifications Message consist of the number of joints, the

type of each joint (either revolute or prismatic), the link description parameters for each

link (link length and twist angle, Figures 1-1 to 1-3), the constant joint parameter value









(offset for a revolute joint, Figure 1-2), and joint angle for a prismatic joint (Chapter 1,

Figure 1-3). The minimum and maximum allowable value for each joint and the

maximum velocity for each joint follow this information. Motion of the arm is

accomplished via the Set Joint Effort message (Figure 4-1). In this message, each

actuator is commanded to move with a percentage of maximum effort.



Commanded joint effort
Primitive
Manipulator
Actuator commands


I-


Figure 4-1. Joint effort provides basic manipulator mobility

4.1.5 Input and Output Messages

This section provides detailed specifications of user defined messages. It covers

data types used for each of the parameters, as well as the upper and lower limits. This

information becomes very important for software development purposes and is further

covered in Chapter 8.

4.1.5.1 Code 0601h: Set Joint Effort

Field #1 in Table 4-1 indicates the number of joint effort commands contained in

this message. This message sets the desired joint effort values.

Table 4-1. Set Joint Effort message parameters
Field # Name Type Units Interpretation
1 Num Joints Byte N/A 1 ... 255; 0 is Reserved
Scaled integer
2 Joint 1 -effort Short int Percent Lower Limit = -100%
Upper Limit = +100%
3 ...n ...
n + 1 Joint n -effort Short int Percent see field 2










4.1.5.2 Code 2600h: Query Manipulator Specifications

This message shall cause the Primitive Manipulator component to reply to the

requestor with a Code 4600h: Report Manipulator Specifications message.

4.1.5.3 Code 2601h: Query Joint Effort

This message shall cause the receiving component to reply to the requestor with a

Code 4601h: Report Joint Efforts message.

4.1.5.4 Code 4600h: Report Manipulator Specifications

This message provides the specifications of the manipulator including the number

of joints, the link lengths, twist angles, offset or joint angles, minimum and maximum

value for each joint, and minimum and maximum speed for each joint.

4.1.5.5 Code 4601h: Report Joint Effort

This message provides the receiver with the current values of the commanded joint

effort. The message data and mapping of the presence vector for the Report Joint Efforts

message are identical to Code 0601h: Set Joint Effort.










Table 4-2. Report Manipulator Specifications parameters
Field # Name Type Units Interpretation


Number of
Joints



2 Joint n Type


Joint n -
3 Offset/Joint
Angle
Joint n -
4
Min value
Joint n -
Max value

S Joint n -
6
Max velocity




manipulator
7 coordinate
sys. x




manipulator
8 coordinate sys.
y



manipulator
9 coordinate
sys. z


Byte




Byte


Unsigned
Short


Unsigned
Short


Unsigned
Short





Integer







Integer





Integer


10 d component of Integer
unit quatemion q


N/A




N/A


rad or
mm


rad or
mm


rad/s or
mm/s





m






m





m








N/A


1 ... 255 0 is Reserved
For a value of n the message
data area size in bytes is:
(36 + 13(n-1)) bytes.
Joint type of the last joint of the
manipulator.
1 = revolute, 2 = prismatic
Prismatic joint,
value x 10-3 radians.
Revolute joint, mm

Prismatic joint, mm
Revolute joint,
value x 10-3 radians.

Prismatic joint, mm/sec
Revolute joint,
value x 10-3 radians/sec.
x coordinate of origin of
manipulator coordinate
system measured with respect
to vehicle coordinate system
Scaled integer:
Lower limit = -30 m
Upper limit = +30 m
y coordinate of origin of
manipulator coordinate
system measured with respect
to vehicle coordinate system


z coordinate of origin of
manipulator coordinate
system measured with respect
to vehicle coordinate system


quaternion q defines the
orientation of the manipulator
coordinate system measured
with respect to the vehicle
coordinate system
Scaled integer:
Lower limit = -1
Upper limit = +1










Table 4-2. Continued
Field # Name


b component of
unit quatemion q
c component of
unit quaternion q
14 Joint 1 Type
14a Link a12 -
14a
Link Length
14b Link a12 -
14b
Twist Angle
Joint 1 -
14c Offset/Joint
Angle
d Joint 1 -
14d.
Mm value
S Joint 1 -
14e
Max value

14f Joint 1 -
14f
Max velocity



n-1 Joint (n-l) Type

(n-1)a Linka)n
Link Length

(n- 1)b Link a(nl)n -
Twist Angle


(n-1)c


Joint (n-1)-
Offset/Joint
Angle


( d Joint (n-) -
(n-l)d .
Mmi value
e Joint (n-) -
(n-l)e
Max value

(n-)f Joint (n-l)-
Max velocity


Type
Integer

Integer

Byte
Unsigned
Short
Unsigned
Short

Unsigned
Short


Unsigned
Short


Unsigned
Short



Byte
Unsigned
Short
Unsigned
Short

Unsigned
Short


Unsigned
Short


Unsigned
Short


Units
N/A

N/A

N/A

mm


rad


rad or
mm


rad or
mm


rad/s or
mm/s



N/A

mm


rad


rad or
mm


rad or
mm



rad/s


Interpretation


see field 10

see field 10

1 = revolute, 2 = prismatic

Link Length

Twist Angle -
value x 10-3 radians
Prismatic joint,
value x 10-3 radians.
Revolute joint, mm

Prismatic joint, mm
Revolute joint,
value x 10-3 radians.

Prismatic joint, mm/sec
Revolute joint,
value x 10-3 radians/sec.


1 = revolute, 2 = prismatic

Link Length

Twist Angle -
value x 10-3 radians
Prismatic joint,
value x 10-3 radians.
Revolute joint, mm

Prismatic joint, mm
Revolute joint,
value x 10-3 radians.

Prismatic joint, mm/sec
Revolute joint,
value x 10-3 radians/sec.









4.2 Primitive Manipulator Applications to the Puma system

As mentioned earlier, the primary function of this component is to allow for tele-op

commands of joint efforts. This implementation interprets joint efforts as the percentages

of maximum velocity. Thus, a Set Joint Effort message commanding values of [50, 50,

50, 50, 50, 50] would in effect rotate each of the joints at fifty percent of the maximum

velocity in the positive direction. Note that the interpretation of joint efforts can vary

depending on the type of the controller provided. Since the component assumes that no

sensor feedback is provided, it is possible to drive the robot into an unfavorable state

triggering a fatal Val II error. Either one of the joints reaching a hardware limit, or

driving a manipulator to a singular configuration would cause Val to respond in such a

way. In order to prevent this from happening during the tasks requiring closed-loop

control, this implementation takes advantage of the onboard position ad velocity sensor

components covered in the following chapter. Computer logic and software design of this

and all other components will be the topic of Chapter 8.















CHAPTER 5
MANIPULATOR SENSOR COMPONENTS

This chapter describes the components that when queried, return instantaneous joint

position, velocity, and force or torque information. Note that a particular manipulator

might only have one or two measurement sensors onboard. Consequently, the

implementation of all three components covered in this chapter is seldom necessary.

Moreover, the JAUS Reference Architecture is not concerned with the type of the sensors

used, but rather with the format in which the measured information is exchanged with the

component requesting it.

5.1 Manipulator Joint Position Sensor Component

5.1.1 Component Function

The function of the Manipulator Joint Position Sensor Component (MJPS) is to

report the values of manipulator joint parameters when queried.

5.1.2 Associated Messages

The MJPS (JAUS ID# 51) accepts the core input and output messages (Chapter 1,

Table 1-1). The set of user defined input and output messages specific to this component

are:

* Query Joint Positions

* Report Joint Positions.

Detailed definitions are provided in Section 5.1.4.










5.1.3 Component Description

The Report Joint Positions message provides the instantaneous joint positions. The

positions are given in radians for revolute and in meters for prismatic joints. The

component is shown in Figure 5-1.



actual joint positions; request joint positions;
Report Joint Positions Query Joint Positions
Message Message


Joint Position
Sensor

Figure 5-1. Joint position sensor component

5.1.4 Input and Output Messages

Similar to Section 4.1.5, this section and Sections 5.2.4 and 5.3.4, are used to

provide detailed specifications of user defined messages. They cover data types and value

limits for each of the parameters.

5.1.4.1 Code 0602h: Set Joint Positions message

Set Joint Positions message is not defined by this component but it is included as a

reference.

Table 5-1. Set Joint Positions message parameters
Field # Name Type Units Interpretation
1 Number of Joints Byte N/A 1 ... 255
0 is Reserved
2 Joint 1 -position Int rad or m Scaled integer:
If revolute joint,
Lower limit = -87n rad
Upper limit = +87: rad
If prismatic joint,
Lower limit = -10 m
Upper limit = +10 m
3 ... n .
n + 1 Joint n -position Int rad or m see field 2









5.1.4.2 Code 2602h: Query Joint Positions message

This message shall cause the receiving component to reply to the requestor with a

Code 4602h: Report Joint Positions message.

5.1.4.3 Code 4602h: Report Joint Positions message

This message provides the receiver with the current values of the joint positions.

The message data for the Report Joint Positions message is identical to Code 0602h: Set

Joint Positions.

5.2 Manipulator Joint Velocity Sensor Component

5.2.1 Component Function

The function of the Manipulator Joint Velocity Sensor (MJVS) is to report the

values of instantaneous joint velocities when queried.

5.2.2 Associated Messages

The MJVS (JAUS ID# 52) accepts the core input and output messages (Chapter 1,

Table 1-1). The set of user defined input and output messages specific to this component

are:

* Query Joint Velocities

* Report Joint Velocities.

Detailed definitions are provided in Section 5.2.4.

5.2.3 Component Description

The Report Joint Velocities message provides the instantaneous joint velocities.

The velocities are given in radians/sec for revolute and in meters/sec for prismatic joints.

The component is depicted in Figure 5-2.












actual instantaneous joint request instantaneous joint
velocities; velocities;
Report Joint Velocities Message Query Joint Velocities Message


Joint Velocity
Sensor

Figure 5-2. Joint velocity sensor component

5.2.4 Input and Output Messages

5.2.4.1 Code 0603h: Set Joint Velocities message

Set Joint Velocities message is not defined by this component but it is included for

reference purposes.

Table 5-2. Set Joint Velocities message parameters
Field # Name Type Units Interpretation
1 Num Joints Byte N/A 1 ... 255
0 is Reserved
2 Joint 1 -velocity int rad/sec or If revolute joint,
m/sec Lower limit = -107 rad/sec
Upper limit = +107 rad/sec
If prismatic joint,
Lower limit = -5 m/sec
Upper limit = +5 m/sec
3 ... n
n + 1 Joint n -velocity int rad/sec or see field 2
m/sec

5.2.4.2 Code 2603h: Query Joint Velocities message
This message shall cause the receiving component to reply to the requestor with a

Code 4603h: Report Joint Velocities message.

5.2.4.3 Code 4603h: Report Joint Velocities message

This message provides the receiver with the current values of the joint velocities.

The message data for the Report Joint Velocities message is identical to Code 0603h: Set

Joint Velocities.









5.3 Manipulator Joint Force/Torque Sensor Component

5.3.1 Component Function

The function of the Manipulator Joint Force/Torque Sensor (MJFTS) is to report

the values of instantaneous torques (for revolute joints) and forces (for prismatic joints)

that are applied at the individual joints of the manipulator kinematic model when queried.

5.3.2 Associated Messages

The MJFTS (JAUS ID# 53) accepts the core input and output messages (Chapter 1,

Table 1-1). The set of user defined input and output messages specific to this component

are listed below, while detailed definitions are provided in Section 5.3.4:

* Query Joint Force/Torques

* Report Joint Force/Torques

5.3.3 Component Description

The Joint Force/Torque Sensor component provides the instantaneous joint forces

or torques acting on each joint of the manipulator kinematic model. Forces are returned

for prismatic joints in units of Newton's (N). Torques is returned for revolute joints in

units of Newton-meters (Nm).

5.3.4 Input and Output Messages

5.3.4.1 Code 2605: Query Joint Force/Torques

This message shall cause the receiving component to reply to the requestor with a

Code 4605h: Report Joint Force/Torques message.

5.3.4.2 Code 4605h: Report Joint Force/Torques

This message replies to the requestor with the values of current joint forces or

torques for prismatic and revolute joints, respectively.









Table 5-3. Report Joint Force/Torque message parameters
Field # Name Type Units Interpretation
1 Num Joints Byte N/A 1 ... 255
0 is Reserved
2 Joint 1 -force or int N or Nm If revolute joint
torque Scaled integer:
Lower limit = -1000 Nm
Upper limit = +1000 Nm
If prismatic joint
Scaled integer:
Lower limit = -500 N
Upper limit = +500 N
3 ... n
n + 1 Joint n -force or int N or Nm see field 2
torque

5.4 Sensor Component Applications to the Puma System

Each joint onboard the Puma 762 manipulator uses an incremental encoder for

position feedback (Chapter 3, Section 3.2.1). This information is obtained from the Galil

controller in encoder counts and is converted to radians. Similarly, the velocity is

reported in encoder counts per second and converted into radians per second to meet

JAUS specifications. In many instances, the joint data is converted back to either encoder

counts or degrees for the purposes of more meaningful interpretation.

The position sensor component implemented on the Puma system has additional

functionality (Section 5.1.1). This involves monitoring joint movement and assuring that

no set software limits have been breached. It further uses the acquired information to

monitor joint angle values approaching singularity configurations (Chapter 2, Section

2.3.4). Actions taken if either occurs are discussed in Chapter 8. The use of MJPS and

MJVS components will become more apparent in the next chapter dealing with

closed-loop control of joint positions and velocities.














CHAPTER 6
MANIPULATOR LOW-LEVEL POSITION AND VELOCITY DRIVER
COMPONENTS

These components take as inputs the desired joint positions or velocities, or the

desired end-effector pose or velocity state. They further use platform specific information

provided by the PM component, as well as the sensor information obtained from the

MJPS and MJVS components to perform closed-loop position and velocity control. It

should be noted that in most implementations, these components and the Primitive

Manipulator component would be embedded in the same node that will facilitate the

control process. The implementation of the low level drivers to the Puma platform

becomes nontrivial and is addressed in Section 6.5.

6.1 Manipulator Joint Positions Driver Component

6.1.1 Component Function

The function of the Manipulator Joint Positions Driver (MJPD) is to perform

closed-loop joint position control.

6.1.2 Associated Messages

The MJPD (JAUS ID# 54) accepts the core input and output messages (Chapter 1,

Table 1-1). User defined messages that are received or sent by this component were

defined in previous chapters and are:

* Set Joint Positions

* Report Manipulator Specifications

* Report Joint Efforts










* Report Joint Positions

* Set Joint Effort.

6.1.3 Component Description

The inputs are the desired joint values, current joint angles, and the manipulator

specifications report. The output is the joint effort level that is sent to the Primitive

Manipulator component. Figure 6-1 shows the MJPD component.




commanded joint values ;
Set Joint Positions Message
Report Joint
Positions
Joint Position Message Manipulator Joint
Sensor Positions Driver



Report Manipulator y Set Joint Effort
Specifications Message Message
actual joint effort;
Report Joint Effort Message


Figure 6-1. Manipulator Joint Positions Driver component

6.2 Manipulator End-Effector Pose Driver Component

6.2.1 Component Function

The function of the Manipulator End-Effector Pose Driver (MEEPD) is to perform

closed-loop position and orientation control of the end-effector.

6.2.2 Associated Messages

The MEEPD (JAUS ID# 55) accepts the core input and output messages (Chapter

1, Table 1-1). Some of the user defined messages that are received or sent by this

component were defined in previous chapters, while others are defined in Section 6.2.4.

The following messages are associated with this component:

* Set Tool Point










* Set End-Effector Pose

* Query Tool Point

* Report Manipulator Specifications

* Report Joint Efforts

* Report Joint Positions

* Set Joint Effort

* Report Tool Point.

6.2.3 Component Description

This component performs closed-loop position and orientation control of the end-

effector. The input is the desired position and orientation of the end-effector specified in

the vehicle coordinate system, the current joint angles, and the data from the manipulator

specification report. The output is the joint effort level that is sent to the Primitive

Manipulator component. The component is shown in Figure 6-2.




commanded end effector pose;
Set End Effector Pose Message

Report Joint
Positions
Joint Position Message Manipulator End-
Sensor 0 Effector Pose
Sensor
Driver


Set Joint Effort
Report Manipulator Message
Specifications Message actual joint effort ;
Report Joint Effort Message

Figure 6-2. Manipulator End-Effector Pose Driver component

6.2.4 Input and Output Messages

6.2.4.1 Code 0604h: Set Tool Point message

This message specifies the coordinates of the end-effector tool point in terms of the

coordinate system attached to the end-effector. For a 6-axis robot, this coordinate system









is defined by having its origin located at the intersection of the S6 joint axis vector and

the user defined link vector a67. The z-axis of the coordinate system is along S6 and the -

x-axis is along the a67 vector.

Table 6-1. Set Tool Point message parameters
Field # Name Type Units Interpretation
1 x coordinate of tool point Int m Scaled integer:
Lower limit = -15 m
Upper limit = +15 m
2 y coordinate of tool point Int m See field 1
3 z coordinate of tool point Int m See field 1

6.2.4.2 Code 0605h: Set End-Effector Pose message

This message defines the desired end-effector position and orientation. The

coordinates of the tool point are defined in terms of the vehicle coordinate system. The

orientation of the end-effector is defined by a unit quaternion (d ; a, b, c) which specifies

the axis and angle of rotation that was used to establish the orientation of the end-effector

coordinate system with respect to the vehicle coordinate system.

Table 6-2: Set End-Effector Pose message parameters
Field # Name Type Units Interpretation
1 x component of tool point int m Scaled integer:
Lower limit = -30m
Upper limit = +30m
2 y component of tool point int m see field 1
3 z component of tool point int m see field 1
4 d component of unit quaternion q int N/A Scaled integer:
Lower limit = -1
Upper limit = +1
5 a component of unit quaternion q int N/A see field 4
6 b component of unit quaternion q int N/A see field 4
7 c component of unit quaternion q int N/A see field 4

6.2.4.3 Code 2604h: Query Tool Point

This message shall cause the receiving component to reply to the requestor with a

Code 4604h: Report Tool Point message.









6.2.4.4 Code 4604h: Report Tool Point

This message provides the receiver with the current values of the joint positions.

The message data for the Report Joint Positions message is identical to Code 0604h: Set

Tool Point.

6.3 Manipulator Joint Velocities Driver Component

6.3.1 Component Function

The function of the Manipulator Joint Velocities Driver (MJVD) is to perform

closed-loop joint velocity control.

6.3.2 Associated Messages

The MJVD (JAUS ID# 56) accepts the core input and output messages (Chapter 1,

Table 1-1). User defined messages that are received or sent by this component were

defined in previous chapters and are:

* Set Joint Velocities

* Report Manipulator Specifications

* Report Joint Effort

* Report Joint Velocities

* Set Joint Effort

6.3.3 Component Description

The input consists of the desired instantaneous joint velocities, the current joint

velocities (rad/s for revolute and m/s for prismatic joints, respectively), and the data from

the manipulator specification report (Puma platform specific parameters, including the

orientation of the manipulator base coordinate system). The output is the joint effort

level that is sent to the Primitive Manipulator component. The Manipulator Joint

Velocities Driver component is shown in Figure 6-3.











commanded joint velocities ;
Set Joint Velocities Message
Report Joint
Velocities
Joint Velocity Message 1 Manipulator Joint
Sensor Velocities Driver


Set Joint Effort
Message
Report Manipulator r
Specifications Message
actual joint effort;
Report Joint Effort Message


Figure 6-3. Manipulator Joint Velocities Driver component

6.4 Manipulator End-Effector Velocity State Driver Component

6.4.1 Component Function

The function of the Manipulator End-Effector Velocity State Driver (MEEVD) is to

perform closed-loop velocity control of the end effector.

6.4.2 Associated Messages

The MEEPD (JAUS ID# 57) accepts the core input and output messages (Chapter

1, Table 1-1). Some of the user defined messages that are received or sent by this

component were defined in previous chapters, while Set End-Effector Velocity State

message is defined in Section 6.4.4. The following messages are associated with this

component:

* Set End-Effector Velocity State

* Report Manipulator Specifications

* Report Joint Effort

* Report Joint Positions

* Report Joint Velocities

* Set Joint Effort










6.4.3 Component Description

The input is the desired end-effector velocity state, specified in the vehicle

coordinate system or the end-effector coordinate system, the current joint positions and

joint velocities, and the data from the manipulator specifications report. The output is the

joint effort level that is sent to the Primitive Manipulator component. Figure 6-4 depicts

this component.


commanded end-effector velocity
state values ;
Set End-effector Velocity State
Report Joint Message
Joint Position Positions
Sensor Message

Effector Velocity

Report Map ulatorE
State Driver
Joint Velocity
Sensor Report Joint
Velocities Set Joint Effort
Message Message
Report Manipulator '
Specifications Message actual joint effort;
Report Joint Effort Message
Figure 6-4. Manipulator End-Effector Velocity State Driver component

6.4.4 Code 0606h: Set End-Effector Velocity State message

The velocity state of body B measured with respect to body A is defined as the

angular velocity of body B with respect to body A, A0B, and the linear velocity of the

point in body B that is coincident with the origin of the reference frame measured with

respect to body A, A V From these parameters, the velocity of any point in body B can


be determined from the equation A VB =AvB +A IB x r0P Here A V is the velocity of

some point P, that is embedded in body B, measured with respect to body A and ro0p

represents the vector from the origin of the reference frame to point P, i.e. the coordinates

of point P. In this application, body B is the end-effector, and body A is ground. The









reference coordinate system is embedded in ground, but is aligned with either the end-

effector coordinate system or the vehicle coordinate system at this instant.

Table 6-3. Set End-Effector Velocity State message parameters


Field # Name T
1 Coordinate system
definition


x component of angular
velocity AcWB



y component of angular
velocity AWB
z component of angular
velocity A(B
x component of the linear
velocity A V


6 y component of the linear
velocity A vB
7 z component of the linear
velocity A vB


ype Units Interpretation
byte N/A 1 = reference coord.
system aligned with
vehicle coord. sys.
2 = reference coord.
system aligned with
end-effector coord. sys.
int rad/sec Scaled integer:
Lower limit = -20 7t
rad/sec
Upper limit = +20 7t
rad/sec
int rad/sec see field 2

int rad/sec see field 2

int m/sec Scaled integer:
Lower limit = -10
m/sec
Upper limit = +10
rad/sec
int m/sec see field 5

int m/sec see field 5


6.5 Applications of the Low-Level Driver Components to the Puma System

The complexity of low-level component implementation revolves around the

concept of joint effort. Even though the Galil controller is inherently capable of position

and velocity control, the interpretation of effort as velocity mandates the use of

independent jogging mode to perpetuate joint motion (Chapter 3, Section 3.3.1).

Therefore this section strives to relate this interpretation to each individual component's

requirements.









The Manipulator Joint Positions Driver component receives commanded joint

positions and constantly queries the MJPS for current joint values. As this information is

rapidly updated, the corresponding joint efforts are determined using Equation 6-1.

positiond [n] position ,,, [n]) k [n]
effort[n] =-- (6-1)
velocitymax [n]

where n is the joint number and kp is a proportional constant whose values are

determined experimentally for each of the joints and depend on the chosen values of

maximum speed, acceleration and deceleration. Since joint efforts can vary from -100%

to 100%, computed efforts are clipped when received by the Primitive Manipulator. For

instance, if commanded joint position is -3000 encoder counts, and the current value is

6000 encoder counts, then the PM will cause that joint to move at a 100% of the

maximum velocity in the negative direction. As the position gap closes, the difference

becomes smaller causing the effort to decrease. When the desired position is reached, the

resulting effort is zero. This implementation thus adds another control loop to the system.

Since the independent jogging mode uses trajectory generator, there is a possibility of

overshoot. Equation 6-1 is set up to quickly fix the error and return the joint back to the

desired position.

The Manipulator End-Effector Pose Driver component receives the desired position

and orientation of the end-effector as its inputs. It then uses the reverse position analysis

(Section 2.3.2) to compute the corresponding joint values. Just as with the MJPD, this

component constantly queries for current joint positions. Once this information is

available, the identical approach (Equation 6-1) is used to complete the task.









Definition of the joint effort for the two components commanding velocity is much

simpler and is given by Equation 6-2.

velocity des [n]
effort[n] =el (6-2)
velocitYma [n]

The Manipulator Joint Velocities Driver component receives the desired joint

velocities, while the MEEVD uses reverse velocity analysis from Section 2.3.3 to

determine these values given the desired velocity state of the end-effector. Once

computed, these values are passed on to the Primitive Manipulator. The effort values

should never exceed -100% or 100% (e.g, commanding a -2500 encoder count per second

velocity would be converted to -50%, given the maximum velocity of 5000 encoder

counts per second). It is entirely up to the Galil controller to close the loop and ensure

joint motion at the desired speed.

This chapter explored all the core functionality of the JAUS manipulator

implementation. The following chapter further takes the above capabilities and allows the

system to handle multiple sets of joint positions and end-effector positions and

orientations.














CHAPTER 7
MID-LEVEL POSITION AND VELOCITY DRIVER COMPONENTS

This chapter defines the last 2 components with respect to the scope of our study.

Up to this point, this modular architecture was only concerned with single-goal

completion. The components presented in this chapter will extend this interface to allow

the manipulator to receive multiple joint position configurations or a tool-point path

profile. It should be noted that in most implementations, these components and the

Primitive Manipulator will be embedded in the same node which will facilitate the

control process. Finally, the last section will briefly discuss how these 2 components are

implemented on the Puma platform.

7.1 Manipulator Joint Move Driver Component

7.1.1 Component Function

The function of the Manipulator Joint Move Driver (MJMD) is to perform closed-

loop joint level control of the manipulator where motion parameters for each joint are

specified. The specified motion parameters are the desired values, maximum velocity,

maximum acceleration, and maximum deceleration.

7.1.2 Associated Messages

The MJMD (JAUS ID# 58) accepts the core input and output messages (Chapter 1,

Table 1-1). Some of the user defined messages that are received or sent by this

component were defined in previous chapters, while Set Joint Motion message is defined

in Section 7.1.4. The following messages are associated with this component:

* Set Joint Motion










* Report Manipulator Specifications

* Report Joint Effort

* Report Joint Positions

* Report Joint Velocities

* Set Joint Effort

7.1.3 Component Description

The inputs are the desired joint values at specified time values together with data to

define a trapezoidal velocity profile (i.e. the maximum joint velocity, maximum joint

acceleration, and maximum joint deceleration). No explicit path is defined, only the

values of the joint angles at distinct times. The time values are measured in units of

seconds and are relative to the time that the movement to the first joint angle set is

started. Additional inputs are the current joint values, joint velocities, and the data from

the Report Manipulator Specifications message. The output is the joint effort level that is

sent to the Primitive Manipulator component. The MJMD is shown in Figure 7-1.


commanded joint motion profile;
Set Joint Motion Message


Report Manipulator Set Joint Effort
Specificaitons Message Message
actual joint effort;
Report Joint Effort Message
Figure 7-1. Manipulator Joint Move Driver component









7.1.4 Code 0607: Set Joint Motion

Note that this message specifies the number of manipulator joints and the number

of poses (different trapezoidal profile sets).

Table 7-1. Set Joint Motion message parameters


Field #
1


Type
Byte

Byte


Units
N/A

N/A


Name
Num Joints, n

number of
poses, p
pose 1 time


Joint 1 -
position at
pose 1





Joint 1 max
velocity





Joint 1 max
acceleration





Joint 1 max
deceleration





Joint 2 -
position at
pose 1
Joint 2 max
velocity


int Sec


int rad or m







int rad/s or m/s






int rad/s2 or m/s2






int rad/s2 or m/s2






int rad or m


int rad/s or m/s


Interpretation
1 ... 255
0 is Reserved
1...255
0 is Reserved
Scaled integer:
Lower limit = 0 sec
Upper limit = 6000 sec
Scaled integer:
If revolute joint,
Lower limit = -87: rad
Upper limit = +87 rad
If prismatic joint,
Lower limit = -10 m
Upper limit = +10 m
If revolute joint,
Lower limit = -107t rad/s
Upper limit = +107 rad/s
If prismatic joint,
Lower limit = -5 m/s
Upper limit = +5 m/s
If revolute joint,
Lower limit = -107t rad/s2
Upper limit = +107 rad/s2
If prismatic joint,
Lower limit = -20 m/s2
Upper limit = +20 m/s2
If revolute joint,
Lower limit = -107t rad/s2
Upper limit = +107 rad/s2
If prismatic joint,
Lower limit = -20 m/s2
Upper limit = +20 m/s2
see field 4


see field 5





Type


Type
int

int


Units
rad/s2 or m/s2

rad/s2 or m/s2


Table 7-1. Continued
Field # Name
10 Joint 2 max
acceleration
11 Joint 2 max
deceleration

4n Joint n -
position at
pose 1
4n+1 Joint n max
velocity
4n+2 Joint n max
acceleration
4n+3 Joint n max
deceleration

(p-1) 4n+4 pose p time
(p-1) 4n+5 Joint 1 -
position at
pose p
(p-1) 4n+6 Joint 1 max
velocity
(p-1) 4n+7 Joint 1 max
acceleration
(p-1) 4n+8 Joint 1 max
deceleration

(p-1)8n Joint n -
position at
pose p
(p-1)8n+l Joint n max
velocity
(p-1)8n+2 Joint n max
acceleration
(p-1)8n+3 Joint n max
deceleration


rad/s or m/s

rad/s2 or m/s2

rad/s2 or m/s2


s
rad or m


rad/s or m/s

rad/s2 or m/s2

rad/s2 or m/s2


int rad or m


rad/s or m/s

rad/s2 or m/s2

rad/s2 or m/s2


int rad or m


Interpretation
see field 6

see field 7


see field 4


see field 5

see field 6

see field 7


see field 3
see field 4


see field 5

see field 6

see field 7


see field 4


see field 5

see field 6

see field 7













7.2 Manipulator End-Effector Discrete Pose Driver Component

7.2.1 Component Function

The function of the Manipulator End-Effector Discrete Pose Driver (MEEDPD) is

to perform closed-loop control of the end-effector pose through a series of specified

positions and orientations.

7.2.2 Associated Messages

The MEEDPD (JAUS ID# 59) accepts the core input and output messages (Chapter

1, Table 1-1). Some of the user defined messages that are received or sent by this

component were defined in previous chapters, while Set End-Effector Path Motion

message is defined in Section 6.4.4. The following is the list of all the messages

associated with this component:

* Set End-Effector Path Motion

* Report Manipulator Specifications

* Report Joint Effort

* Report Joint Positions

* Report Joint Velocities

* Set Joint Effort

7.2.3 Component Description

This component performs closed-loop control of the end-effector pose as measured

with respect to the vehicle coordinate system. The inputs are a path motion description

(discrete end-effector position and orientation at time t measured in the vehicle

coordinate system which is defined by a point and a quaternion at time t), the current










joint values, the current joint velocities, and the data from the Report Manipulator

Specifications message. The output is the joint effort level that is sent to the Primitive

Manipulator component. The functionality of the MEEDPD is shown in Figure 7-2.



commanded end-
effector path motion
profile in vehicle
coordinate system;
Set End-effector Path
Report Joint Motion Message
Joint Position Positions Message
Sensor
-- Manipulator End-
Effector Discrete
Pose Driver VCS
Joint Velocity
Sensor Report Joint Set Joint Effort
Velocities Message Message
Report Manipulator actual joint effort;
Specifications Message Report Joint Effort
Message

Figure 7-2. Manipulator End-Effector Discrete Pose Driver component

7.2.4 Code 0608h: Set End-Effector Path Motion

A series of end-effector poses are defined in terms of the vehicle coordinate system

at various times. The time is a relative time and is defined in seconds where time equals

0 is the moment that the motion towards the first pose begins.

7.3 Applications of the Mid-Level Driver Components to the Puma System

The Section 3.3.1 described the independent axis positioning mode inherent to the

Galil controller. The parameters defining joint motion in this mode are identical to those

defined by Set Joint Motion message. Furthermore, the independent jogging mode used

in previous component definitions provides closed-loop position control generating a

trapezoidal trajectory based on these parameters. Thus, the MJMD can be defined as a

superset of the MJPD component, in that it redefines the maximum speed, acceleration

and deceleration with each new pose instead of using the default values.






67



Table 7-2. Set End-Effector Path Motion message parameters


Field #
1


Name
number of poses, n


Type


1


Byte


time 1


X component of tool
point for pose 1

Y component of tool
point for pose 1
Z component of tool point
for pose 1
d component of unit
quaternion q for pose 1

a component of unit
quaternion q for pose 1
b component of unit
quaternion q for pose 1
c component of unit
quaternion q for pose 1


8n-6 time n
8n-5 X component of tool
point for pose n
8n-4 Y component of tool
point for pose n
8n-3 Z component of tool point
for pose n
8n-2 d component of unit
quaternion q for pose n
8n-1 a component of unit
quaternion q for pose n
8n b component of unit
quaternion q for pose n
8n+l c component of unit
quaternion q for pose n


Jnits Interpretation
N/A 1 ... 255
0 is Reserved
sec time for pose 1
Scaled integer:
Lower limit = 0 sec
Upper limit = 6000 sec
m Scaled integer:
Lower limit = -30 m
Upper limit = +30 m
m see field 3

m see field 3


N/A Scaled integer:
Lower limit =
Upper limit
N/A see field 6

N/A see field 6

N/A see field 6


sec see field 2
m see field 3

m see field 3

m see field 3

N/A see field 6

N/A see field 6

N/A see field 6

N/A see field 6


An identical approach is taken to determine the corresponding joint efforts

(Equation 6-1). Note however, that the proportional constant k, should change with the









magnitude of these parameters. Since this implementation is used to test rather then

optimize manipulator performance, previously determined values of kp are adequate for

operating speeds below 10000 encoder counts per second. Thus after each pose is

completed a new set of parameters is applied to the system.

Unlike the MJMD, the functionality of the MEEDPD component is identical to that

of the MEEPD. It just allows for a single message to define multiple tool-point positions

and orientations to be executed autonomously at a particular time. Note that this

implementation uses generic timing functions provided with the Linux kernel. More

precise operation would require the use of a real-time operating system. All aspects of

software design are addressed in the following chapter.














CHAPTER 8
OVERVIEW OF SOFTWARE DESIGN

The purpose of our study was to design and implement the JAUS manipulator

components. The design aspects were covered in Chapters 4, 5, 6, and 7, while the

software implementation is addressed here. Keep in mind that the chapter covers design

and logistics aspects rather than computer science technicalities. The source code is

rather complicated but well documented and could be easily read. For completion

purposes, this chapter gives a brief overview of the node manager and its role in

inter-component communications.

8.1 Overview

The scope of computer programming associated with each of the components and

their corresponding messages reflects the importance of software design in this and any

other large scale project. In order to allow for easy and clear understanding behind the

process control and data flow in each of the functional elements, this chapter begins its

analysis at the lowest level and moves up hierarchically. More specifically, it first

addresses the logistics behind the interface to the Galil controller, then goes into the

component and message development, and finally describes the node level functionality.

Due to a high level of redundancy, only one component out of the first three groups will

be analyzed in detail. Furthermore, this development takes advantage of multithreading, a

powerful tool described in many popular computer science books. From a software

development standpoint, each component is treated as a separate thread, and could be











compared to a program running a while-loop. An additional thread is used in the interface

to the controller.

8.2 The Interface to the Galil Controller

The Section 3.4 gave an overview of the C function prototypes that are the core of

this development. Only a single program/thread is responsible for communications with

the Galil controller eliminating the need for multithread synchronization. The file

galillnterface.c is responsible for managing startup and shutdown routines of this

particular thread. The interface has a well defined structure that is shown in Figure 8-1:


galillnterface.c


Interface Startup inrii fi-cThiradl I interfaeSlhutdown()



Check if NO Check fcr FALSE
RoboWorks in -untie flag
use DMCCommandt(OPD");
i Shutdown motors
YES
TRUE
ODMCClose(}
.DMOConmand[(TP"); / Close connestin to the
Galil Controller
Connect( )
//Open RoboTalk connection
DMCCommand("T-V};
DisconnectO(
//Close RoboTalk
DMCOpen)O connection
l Open oninetion to the Galil Conlroller

D...MCGommand(JG");
DMCReset)
.'' Reset the Galil onri ller 1I.
prevent any runaway SetTagValuesO;
Send pcIltlon values to
RoboWofks for display
ii.anaipu t.,1 purposes
1i Initialize all joints

rr rrirterilre -'ph di 1 interfaoeShutdowrn,(

Figure 8-1. The galillnterface.c logic flow diagram









On startup, the code checks whether the RoboWorks 3-D software tool is used.

This package, developed at the University of Texas, was slightly modified to work with

the Linux operating system for both simulation and real-time 3D display purposes. Its

application will become more apparent in the next chapter. RoboTalk is the program that

handles Ethernet communications between the computer hosting RoboWorks and the

computer providing position data. The file RoboTalk.h contains function prototypes for

the Connect(, SetTagValues(..), and Disconnect( functions shown in Figure 8-1. This is

followed by establishing a connection to the Galil controller, resetting it for safety

purposes, and calibrating all the joints using stored potentiometer values.

After the state thread is started, position, velocity and force/torque values are

queried using "TP", "TV", and "TT" commands, respectively. Regardless of the fact that

the Puma 762 does not have any torque sensors, this component was implemented for

testing purposes. Commanding an independent jogging motion is accomplished using the

"JG" command (e.g. if the Primitive Manipulator commands a 50% effort, this is

converted to -2500 encoder counts per second velocity using Equation 6-2, assuming the

maximum velocity is 5000 encoder counts per second). In addition to the core

functionality, galillnterface.c is used to set up maximum speed, acceleration, and

deceleration values using "SP", "AC", and "DC" commands generating a trapezoidal

profile. The function is set as a sleeper outside the thread and will change the values only

if called. Only the Manipulator Joint Motion component is responsible for changes to the

default parameters. The file also contains a homing function that could take the

manipulator to its home position on startup. This capability should be used after

recalibration of joint values. The source code for galillnterface.c, RoboTalk.c, and











corresponding header files is listed in Appendix B, Section B.1. The Primitive

Manipulator component and all of the sensor components acquire data from the interface

file using external access functions eliminating the need for the use of global variables.

8.3 Component Level Software Development

Components are based on standardized interfaces (Section 1.3.4). From a software

development standpoint, this means that the code structure of the files defining these

unique JAUS entities is very similar. Figure 8-2 shows the functional elements of a

generic component file.


ornpLc




Component startup State Thread Node Manager Component Shutdown
Thread

Component ciheck-in .IClose node manager
with the node C k f FALSE RecBive incoming connection and check
manager to obtain JAUS core and out
Instance, Node and rE1r user defined
Subsystem IDs rne5 s y fHrom
TRUE the node manager Set component state to
SHUTDOWN
Op.-, ronicion with Switch momponent
tenod mna behavior based on Proess messages
ia rode managing to
and obtain jms the stte o t acrige t
cesr machine been: message type
accessor
S-INITIALIZE
STANDBY
REAhY
Set component state EMERG CY
to INITIPAZE
S- FAILURE
SHUTDOWN

Start c8m nponent
state thread

Shutdown
component state
Sian cmponrent thread
node manager thread

Figure 8-2. Generic component logic flow diagram










Each component follows a standard process flow defining thread startup and

shutdown routines. As it is shown in Figure 8-2, each component consists of two threads.

The first is responsible for performing component function while the other handles the

incoming core and user-defined messages. Therefore it is in the state thread that the

particular component's behavior is defined. This implementation defines Emergency,

Failure, and Shutdown states identically across the entire node. In order to better

understand the inner workings of these JAUS elements, the state thread of one component

from each of the Chapters 4, 5, and 6 is analyzed.

8.3.1 Primitive Manipulator State Thread

The best way to represent the processes within a particular file is using a flow

chart. Therefore, Figure 8-3 shows the PM state thread.


[PM State ThRad


COMPONENT BEHAVIOR:




INITIALIZE STANDBY READY EMERGENCY FAILURE



PUMA FJOit effots Z0ro zero
FALSE
initialized and
running
Set commanded
efforts received
TRUE from another
co mpDnenL Dr user


Figure 8-3. The Primitive Manipulator state thread logic flow diagram









Each component is set to the Initialize state by default during the startup routine.

While at this state, the PM accesses the information provided by the interface to the Galil

controller requesting the status on initialization procedures, ensuring all integrity checks

are complete and the system is up and running. Once the component enters the Ready

state, it talks to the interface file again, but this time accessing the function directly

responsible for commanding motion, given the joint effort values. The source code for

the file pm.c and its corresponding header is documented in Appendix B.2.

8.3.2 Manipulator Sensor Components

The state thread of Manipulator Joint Position Sensor is described in this section as

it provides more complex functionality than the other sensor components. Definitions of

Initialize, Standby and Ready states are shown in Figure 8-4.


MJPS Sliate Thieaid

[ COMPONENT BEHAVIOR" ]


Figure 8-4. Manipulator Joint Position Sensor logic flow diagram










The definition of the initialize state in the above diagram is applied to the

remainder of the components on this node. If the query status message to the Primitive

Manipulator returns Ready, it is assumed that the initialization procedure was successful.

Once in the Ready state, the MJPS accesses the Galil interface file and queries it for

position. Next, it checks those values ensuring that none of the joints are crossing

position limits, or getting close to a singularity configuration. In either case, the MJPS

changes the status of the Primitive Manipulator to the Emergency state. This instantly

causes all the other components to go into the Emergency state as well. The system

would now have to be reinitialized. The source code for the mjps.c file and the

corresponding header is listed in the Appendix B.3.

8.3.3 Low-Level Position and Velocity Drivers

It should be noted, that all states, except Ready, are defined in the same manner as

covered in previous sections across all of the remaining components. Figure 8-5 shows

the MEEPD state thread (Ready state only).


IlEEPD Ste Thread

I L C.r Pi-r ENT BEHt*1:,1 I


Query for current
joint positions


Figure 8-5. Manipulator End-Effector Pose Driver logic flow diagram









The Figure 8-5 simply states that this component performs its unique function as

long as there is no change in the status of the Primitive Manipulator. At this point all of

the software functionality is defined, and since the timing functionality of the mid-level

components is a trivial addition, it is not discussed in detail. However, for completion

purposes, Appendix B.4 and Appendix B.5 list the meepd.c and the meedpd.c files and

their corresponding headers, respectively.

8.4 Message Level Software Development

Each manipulator component sends or receives user defined messages. Prior to

messages being exchanged, they are compressed (packed) and eventually uncompressed

(unpacked) once they reach the destination (Section 1.3.5). Packing and unpacking

algorithms are well defined and easy to implement. They are based on converting a

desired parameter into a byte stream, thus using a correct byte counter is critical for

preserving correct values. These functions can further clip passing parameters if they lay

outside the specified limits. Information being passed is defined as a structure type so that

it is easily accessed by the components requesting it. For example, joint velocities are

sent by the MJVD component as a part of a jointVelocity t structure containing six

velocity values and a parameter defining the total number of joints. Message files and

their corresponding headers are documented in the Appendix C.

8.5 Node Level Software Development

The Manipulator Control node is responsible for startup and shutdown of all the

manipulator components. In the case of the Puma system, it also ensures that both the Val

and Galil controllers, as well as the arm itself are powered up before starting the interface

thread. The order in which the components are started up is irrelevant, but should be









consistent with the order in which they are shutdown. Two files, mc.c and mc.h, are listed

in the Appendix B.6.

8.6 Node Manager and Communicator

Two JAUS components responsible for all inter-component communications are

the Communicator and the Node Manger. The Communicator allows for a single point of

message entry into a subsystem while maintaining the data link between the subsystems.

The Node Manger component is responsible for routing JAUS messages from one node

to another. When a component sends a message [7], it first goes to the Node Manager

where the information regarding the destination component is interpreted and passed onto

the communicator, which handles the transmission of the message to the proper nod.

Finally, at the highest level, the main file is responsible for starting the node itself.

This file further uses a "curses" text-based window environment for display purposes.

How the information is being displayed for each of the components is discussed in the

next chapter. The main.c file is listed in the Appendix B.7.














CHAPTER 9
TESTING AND RESULTS

This chapter covers the methods used to test 2 aspects of this JAUS

implementation. The first ensures that the functionality of developed messages and

components meets the JAUS specification requirements. The latter looks at how well this

architecture handles manipulator control from the view point of accuracy and task

completion. In order to adequately test this implementation, an additional component

mimicking a Subsystem Commander (SSC) was created. The manipulator sensor

components are self tested as the information they provide becomes critical to

components responsible for closed-loop position and velocity control. Essentially 7

different cases or scenarios pertaining to the functionality of the driver components are

evaluated by the SSC. User input is required when choosing the scenario, however the

current setup mandates that any parameter change has to be done in the source code.

9.1 Subsystem Commander Component Overview

The Subsystem Commander component is defined in the JAUS Reference

Architecture document. Its function is to coordinate all activity within a given subsystem.

The SSC (JAUS ID# 32) has the responsibility of performing mission planning, issuing

commands, and querying status for the subsystem operation. The document states that

functions of this component may be performed by humans, or by the computer or both

[7]. The capabilities of the RoboWorks software package are integrated with this

component to display real-time position data of the manipulator. This could be useful

when the commander is located off site. Figure 9-1 shows this operator control setup.











P IRr *VIr***t r .D ..L.4


















S1 L JaIT I~I .Juni
S 1 U na r r ..n. tu .tatr









] 3 r r r Julni thaInn
J] Mtr fc C rHnd-r r rrpn
Figure 9-1. Subsystem Commander operator graphical user interface; il
5SI Ie~aftLt]rl I
SI9 CQie 1: St IP E
The first scenario is used to test the Primitive Manipulator component without any
-C ailr JlIIF :1. '















] ollow inrlg set of values:
P-i i irafr in hutdDm Anutlw r




r I,al tSftIiDr Uram"fE

Figure 9-1. Subsystem Commander operator graphical user interface

e t9.2 Case 1: Set Joint Effort

The first scenario is used to test the Primitive Manipulator component without any


sensor feedback. In order to ensure that no other components are commanding joint


efforts, their status is changed to the Standby state. Note that the case numbers


correspond to the items listed in Figure 9-1. Set Joint Effort Message commands the


following set of values:


effort =[15 15 15 12 12 12] (9-1)


Given the default maximum velocity value of 5000 encoder counts per second


(enc/s) for the first three joints and 1000 enc/s for the last three joints, these values are


converted back to [750, -750, 750, -120, 120, -120] enc/s as they are passed on to the











Galil controller using Equation 6-2. Figure 9-2 shows a snapshot of the Primitive

Manipulator screen during the execution of this command.


Primitiue Manipulator Screen Commanded Effort

PM State: Ready Joint 1: 15.00
PM Instance ID: 1 Joint 2: -15.00
PM Component ID: 49 Joint 3: 15.00
PM Node ID: 1 Joint 4: -12.00
PM Subsystem ID: 200 Joint 5: 12.00
PM Update Rate: 331.67 Joint 6: -12.00
Interface Update Rate: 7.45

Manipulator Specifications Current Effort

Type Lnk_L Twist_Ang Offset Pos_Limit Uel_Limit Joint 1: 15.20
(mm) (deg) (mm) (enc) (enc/s) Joint 2: -15.00
Joint 3: 15.18
Joint 1: 1 0 90.0 0 224000 5000 Joint 4: -11.50
Joint 2: 1 650 0.0 190 224000 5000 Joint 5: 11.80
Joint 3: 1 0 270.0 0 224000 5000 Joint 6: -11.50
Joint 4: 1 0 90.0 600 70000 1000
Joint 5: 1 0 90.0 0 32000 1000
Joint 6: 1 129 31000 1000

Manipulator Type: Manipulator Coordinate System:
PUMA 762 Serial 6DOF Position: Orientation:
| X 0.0 D 1.0
Controller Type: Y 0.0 A 0.0
GALIL MC, DMC2100 Z 0.0 B 0.0
C 0.0

Figure 9-2. Primitive Manipulator Screen as it responds to the Set Joint Effort message

Note that the current effort values are slightly different from the commanded ones.

This error ranging between 1% and 4% is inherent to the underlying theory behind the

independent jogging mode covered in Chapter 3. Figure 9-2 also shows that the PM

screen is used to display the contents of the Manipulator Specifications message.

Mechanism and controller information is also available. It is useful to realize that in this

and the upcoming sections, any information regarding position and velocity information

is displayed in units of encoder counts (enc) and encoder counts per second (enc/s),

respectively. This was done for practical purposes to allow for quick interpretation of the

corresponding positions with the actual ones. Table 1-1 lists the conversion factors used

to go from specified JAUS standard units to enc and enc/s and vice versa:









Table 9-1. The Puma 762 platform specific conversion factors
Joint # Radians to Encoder Counts Encoder Counts to Degrees
1 45836.6 0.00125
2 65951.9 0.00086875
3 51357.5 0.001115625
4 9152.6 0.00626
5 9152.6 0.00626
6 4285.3 0.01337

9.3 Case 2: Set Joint Position

This case tests the capabilities of the Manipulator Joint Position Driver. The SSC

simply commands six joint values corresponding to the desired joint positions. That

information is then used to determine the corresponding joint efforts (Equation 6-1) that

are passed to the PM. Unlike the PM, MJVD, and MEEVD components, this and the

other position drivers use the independent jogging mode to command position. This

requires an introduction of an additional loop to the existing control system as shown in

Figure 9-3.

Pdes vel
K l Galil Controller Plant


Pcurr

Figure 9-3. External closed-loop control diagram

The value of K is determined experimentally and its values are tuned to provide

stable, no-steady-state-error operation of each of the joints within a particular range of

motion parameters. The Puma 762 system is capable of high-speed operation with great

accuracy; however such implementation would require a different set of K values and

potentially a more complicated control loop. The values of K and motion parameters used

in this project are summarized in Table 9-2.









Table 9-2. Values of the K constant and corresponding range of motion parameters
Max Speed Max Acceleration Max Deceleration
Joint # K
(end/s) (enc/s2) (enc/s2)
1 34 1000-10000 28000-256000 28000-256000
2 34 1000-10000 28000-256000 28000-256000
3 34 1000-10000 28000-256000 28000-256000
4 34 250-1000 28000-256000 28000-256000
5 15 250-1000 28000-256000 28000-256000
6 14 250-1000 28000-256000 28000-256000

To further illustrate the performance of the manipulator system within these ranges,

the MJPS is commanded the same position, [35000, -35000, 50000, 5500, 6500, -4000],

with three different sets of motion parameters. Keep in mind that when this or any other

driver component enters the Ready state, all other components except the Primitive

Manipulator and the sensors are set to Standby.

9.3.1 The "Average" Set

Table 9-3 shows the set of "average" motion parameters used to test the

performance of the MJPD.

Table 9-3. Values of the K constant and "average" set of motion parameters
Max Speed Max Acceleration Max Deceleration
Joint # K
(end/s) (enc/s2) (enc/s2)
1 34 5000 128000 128000
2 34 5000 128000 128000
3 34 5000 128000 128000
4 34 1000 128000 128000
5 15 1000 128000 128000
6 14 1000 128000 128000

The step responses of each of the joints as they are commanded motion are shown


in Figure 9-4.















Joint 1
0.9
0.8
0.7--
C 0.6-
0.5
0
0.4
ao 0.3

0.2
0.1
0
0 5 Time (s) 10 15


Joint 3
1.2

1 -

0.8

o 0.6

S0.4

0.2

0
0 5 10 15
Time (s)


0.8

0.7

0.6

" 0.5

o 0.4

g 0.3
a.
0.2

0.1
0


5 10 15
Time (s)


i -0.2

-0.3
Uo
o -0.4

-0.5

-0.6
Time (s)

Joint 4
0.7

0.6

0 .5

0.4

0.3
0
- 0.2

0.1

0


Time (s)


Figure 9-4. Joint step responses using "average" motion parameters


Manipulator Joint Positions Driuer Screen

MJPD State: Ready
MJPD Instance ID: 1
MJPD Component ID: 54
MJPD Mode ID: 1
MJPD Subsystem ID: 200
MJPD Update Rate: 330.16


Queried Information:

Joint 1:
Joint 2:
Joint 3:
Joint 4:
Joint 5:
Joint 6:


effort

0.00
0.00
0.00
0.00
0.00
0.00


Commanded Position

Joint 1: 35000
Joint 2: -35000
Joint 3: 50000
Joint 4: 5500
Joint 5: 6500
Joint 6: -4000


Resulting Effort

Joint 1: 0.00
Joint 2: 0.00
Joint 3: 0.00
Joint 4: 0.10
Joint 5: -0.14
Joint 6: -0.09


position

35000
-35000
50000
5499
6501
-3999


Figure 9-5. The MJPD screen as motion is completed under the "average" set


Joint 2










Note that only Joint 5 has a slight overshoot, and that all the joints arrive within 1

encoder count of the desired position as shown in Figure 9-5. This error falls within

performance specifications of the Galil controller.

9.3.2 The "Low" Set

Table 9-4 shows the set of "low" motion parameters used to test the performance of

the Manipulator Joint Positions Driver. The step responses are very similar to those in

Figure 9-4 with Joint 5 having less overshoot. However low acceleration and deceleration

values yield low response time, thus the resulting position falls within a larger margin of

error. As Figure 9-6 shows, that magnitude of this error is +/-6 encoder counts. The step

responses of each of the joints as they are commanded motion are shown in Figure 9-7.

Table 9-4. Values of the K constant and "low" set of motion parameters
Max Speed Max Acceleration Max Deceleration
Joint # K
(end/s) (enc/s2) (enc/s2)

1 34 1000 28000 28000
2 34 1000 28000 28000
3 34 1000 28000 28000
4 34 250 28000 28000
5 15 250 28000 28000
6 14 250 28000 28000


Manipulator Joint Positions Driuer Screen Commanded Position
MJPD State: Ready Joint 1: 35000
MJPD Instance ID: 1 Joint 2: -35000
MJPD Component ID: 54 Joint 3: 50000
MJPD Node ID: 1 Joint 4: 5500
MJPD Subsystem ID: 200 Joint 5: 6500
MJPD Update Rate: 19.24 Joint 6: -4000

Queried Information: effort position Resulting Effort
Joint 1: 0.00 34996 Joint 1: 0.12
Joint 2: 0.00 -34996 Joint 2: -0.12
Joint 3: 0.80 49954 Joint 3: 1.40
Joint 4: 0.00 5494 Joint 4: 0.58
Joint 5: 0.00 6495 Joint 5: 0.47
Joint 6: 0.00 -3994 Joint 6: -0.54

Figure 9-6. The MJPD screen as motion is completed under the "low" set