mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-01 17:10:26 +08:00
Compare commits
652 Commits
0.20.23-me
...
bayes_memt
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf2c3a1566 | ||
|
|
d4940634f9 | ||
|
|
2d4a3391bb | ||
|
|
94c93ac9b1 | ||
|
|
9c1e117384 | ||
|
|
f647014f54 | ||
|
|
df52523a0c | ||
|
|
338e142e58 | ||
|
|
2e193ee191 | ||
|
|
9cee4c17b2 | ||
|
|
47ce2b0c74 | ||
|
|
c5ecfef101 | ||
|
|
79d3a1af97 | ||
|
|
829c3c157a | ||
|
|
8355e531bc | ||
|
|
ee49beaf4f | ||
|
|
bcdb4b4546 | ||
|
|
bef4eaf679 | ||
|
|
d9f3337f97 | ||
|
|
89998284bc | ||
|
|
5fad2d29c3 | ||
|
|
f569393de1 | ||
|
|
0a41263fba | ||
|
|
6a605b3be1 | ||
|
|
0f56dd4b43 | ||
|
|
d96c30710e | ||
|
|
e321999b15 | ||
|
|
d069becc72 | ||
|
|
cb34c4bd37 | ||
|
|
9d30b174e6 | ||
|
|
c55c05a97e | ||
|
|
bc724a2125 | ||
|
|
1a3beebcbb | ||
|
|
a9dcc52d4c | ||
|
|
9f464db7c9 | ||
|
|
1dddb350b9 | ||
|
|
468f6e6f28 | ||
|
|
f29676deb0 | ||
|
|
6f34498651 | ||
|
|
bb95cc081a | ||
|
|
4756474367 | ||
|
|
49aa566613 | ||
|
|
a9146f5be6 | ||
|
|
27ca7ec058 | ||
|
|
8d0692eab0 | ||
|
|
afe8aadff1 | ||
|
|
440e143d87 | ||
|
|
72833c89bb | ||
|
|
f04067fa16 | ||
|
|
c1ef13a8d6 | ||
|
|
37f8fa63c5 | ||
|
|
0cf2e45c81 | ||
|
|
f48db0ee51 | ||
|
|
2314c4dfa5 | ||
|
|
ebba7e4878 | ||
|
|
aa6d20775f | ||
|
|
9cbe84e445 | ||
|
|
cc86af4399 | ||
|
|
79ff91d293 | ||
|
|
aa7546ec62 | ||
|
|
a8fd7f043d | ||
|
|
a9f63bd5fd | ||
|
|
8fd701aabe | ||
|
|
1ea8fa2e06 | ||
|
|
51cfc37923 | ||
|
|
26bab2ba15 | ||
|
|
20409d2bf6 | ||
|
|
94bd3601fc | ||
|
|
f94a963463 | ||
|
|
5b985f69be | ||
|
|
0151f8cdfb | ||
|
|
018b804a46 | ||
|
|
8051be45b3 | ||
|
|
0ef907757b | ||
|
|
d6cf470402 | ||
|
|
b3b8fbddbe | ||
|
|
b47c4093a6 | ||
|
|
e23c38f471 | ||
|
|
040de14ec8 | ||
|
|
e6bc39028a | ||
|
|
da55168f60 | ||
|
|
48f529b4c6 | ||
|
|
42faef3941 | ||
|
|
7db14533f1 | ||
|
|
93ca4ed8d7 | ||
|
|
92aff2129f | ||
|
|
af10d6b778 | ||
|
|
6f715b4a8d | ||
|
|
72bd453078 | ||
|
|
86d5c99f5d | ||
|
|
07c3b8c901 | ||
|
|
26573456c2 | ||
|
|
af7ff60a6c | ||
|
|
106874845f | ||
|
|
1e7ad82af6 | ||
|
|
65867c47ae | ||
|
|
c7da53ac3d | ||
|
|
16c0d2fec5 | ||
|
|
90d7cc3045 | ||
|
|
3268707c00 | ||
|
|
3093df8e71 | ||
|
|
1edb6a8647 | ||
|
|
0bf2160939 | ||
|
|
e75baec73e | ||
|
|
82fb7ff5d2 | ||
|
|
d1b5d62d21 | ||
|
|
e612d103bf | ||
|
|
c97f0c10dd | ||
|
|
e3a60c8672 | ||
|
|
e9c6180d56 | ||
|
|
5e4fd171e2 | ||
|
|
f44a4fc478 | ||
|
|
a20e161a5b | ||
|
|
b04f607828 | ||
|
|
a3076392b5 | ||
|
|
210aadb92b | ||
|
|
1def668578 | ||
|
|
b9d7e8077c | ||
|
|
098db33547 | ||
|
|
5cc16e371c | ||
|
|
edebf18043 | ||
|
|
1c8ac2b82b | ||
|
|
17fc6e3485 | ||
|
|
4e5a094491 | ||
|
|
56aa26ce1d | ||
|
|
739628aef9 | ||
|
|
f54b7685f3 | ||
|
|
99471819d5 | ||
|
|
ad8bbdc4b2 | ||
|
|
059cda85dc | ||
|
|
d60c15593d | ||
|
|
1abb70ef36 | ||
|
|
40ac961079 | ||
|
|
f0dab18005 | ||
|
|
5aec9bacec | ||
|
|
5f1eccb2cd | ||
|
|
11577fb553 | ||
|
|
05f077b950 | ||
|
|
0f37bafd66 | ||
|
|
a552bdfb2f | ||
|
|
c774ef641a | ||
|
|
cb0cc9ed18 | ||
|
|
6a435c968f | ||
|
|
a96d574517 | ||
|
|
668494948c | ||
|
|
efcfb9be16 | ||
|
|
4603f09389 | ||
|
|
349580299c | ||
|
|
52e770e2d4 | ||
|
|
b9db73a239 | ||
|
|
be5cd3998d | ||
|
|
7d1a987d5d | ||
|
|
4970474320 | ||
|
|
f2b9cc1cdd | ||
|
|
8328b22c3f | ||
|
|
330fda6522 | ||
|
|
9650b71d8e | ||
|
|
df6300e0ba | ||
|
|
94e31dcad1 | ||
|
|
fa6deba7df | ||
|
|
d34962f908 | ||
|
|
e5655b0b96 | ||
|
|
14d270241c | ||
|
|
0579d4f39c | ||
|
|
2e71831324 | ||
|
|
2fdd2337c7 | ||
|
|
963ba42a1a | ||
|
|
c9292bea5b | ||
|
|
30962119cb | ||
|
|
ee98be9ef7 | ||
|
|
0536ddf0c9 | ||
|
|
6e439d2342 | ||
|
|
4a37855526 | ||
|
|
db59344007 | ||
|
|
105ac3bf9e | ||
|
|
471ed6ade2 | ||
|
|
dbfc4b1dad | ||
|
|
1f44d23a08 | ||
|
|
332dde6d74 | ||
|
|
80d463ed20 | ||
|
|
e19b0c3dc4 | ||
|
|
6d73ba46e2 | ||
|
|
a6b71f4716 | ||
|
|
47e49207ad | ||
|
|
2a5af18bf2 | ||
|
|
41684644a1 | ||
|
|
7b69bf6696 | ||
|
|
6d4e8a4173 | ||
|
|
90d195237f | ||
|
|
9394c0a170 | ||
|
|
6781930100 | ||
|
|
9e862cec68 | ||
|
|
eb2a8f132c | ||
|
|
7a317b9f39 | ||
|
|
f5f51bc792 | ||
|
|
683a1dc554 | ||
|
|
478e909742 | ||
|
|
a02621ef30 | ||
|
|
43d2e1bfde | ||
|
|
802b8f9870 | ||
|
|
f03139d4ff | ||
|
|
96f8466fa7 | ||
|
|
5b368fb2f1 | ||
|
|
a3d4028faa | ||
|
|
6b5b1c9617 | ||
|
|
087a2cecd8 | ||
|
|
d2a430ce57 | ||
|
|
26f036173d | ||
|
|
16e21697f8 | ||
|
|
af11afdc9a | ||
|
|
def99328ce | ||
|
|
8cbee58f07 | ||
|
|
1731f91908 | ||
|
|
d639fcb8e7 | ||
|
|
2c3f1458e7 | ||
|
|
3d968da30f | ||
|
|
ccb6ce67d5 | ||
|
|
b5dce57be8 | ||
|
|
43c398a0de | ||
|
|
3678372981 | ||
|
|
1d6c70c1db | ||
|
|
b750e94eaa | ||
|
|
08f031e11c | ||
|
|
c0dc4b43f3 | ||
|
|
2d79689675 | ||
|
|
a7a2d66556 | ||
|
|
36f7241f7d | ||
|
|
21fbf635b3 | ||
|
|
81ffbca1d6 | ||
|
|
83a2754714 | ||
|
|
6a547f4403 | ||
|
|
68e3125358 | ||
|
|
5f946cc26b | ||
|
|
135110c9b6 | ||
|
|
28dbf1c98a | ||
|
|
f329ebd42b | ||
|
|
1ae523884f | ||
|
|
6eebca83b2 | ||
|
|
72a20d849d | ||
|
|
a1b602dbe0 | ||
|
|
d88353dc1b | ||
|
|
4eea83d1af | ||
|
|
2c7aa5a78f | ||
|
|
a85e732f01 | ||
|
|
258095e0f3 | ||
|
|
35c3ca20ad | ||
|
|
ec4e076a08 | ||
|
|
7a4f8d9783 | ||
|
|
e65c1c2f85 | ||
|
|
7adaa249ff | ||
|
|
079600bf3a | ||
|
|
921381b3bd | ||
|
|
c0e83ce9e9 | ||
|
|
d77a3e3e7c | ||
|
|
1cf051d63b | ||
|
|
19a8292ad0 | ||
|
|
15be406509 | ||
|
|
618e839999 | ||
|
|
ddaf2f5271 | ||
|
|
fcfadfe489 | ||
|
|
6aa188d2af | ||
|
|
3ab9a69fbb | ||
|
|
7baf435600 | ||
|
|
853f603898 | ||
|
|
f8b1d50656 | ||
|
|
2f431ce385 | ||
|
|
89849ae245 | ||
|
|
02e30ffc69 | ||
|
|
97c56361f8 | ||
|
|
340248fed0 | ||
|
|
626bf64983 | ||
|
|
38cacb7978 | ||
|
|
a613998652 | ||
|
|
d33e98a540 | ||
|
|
5988f0bb3b | ||
|
|
8f46cc7370 | ||
|
|
10eea91044 | ||
|
|
b55759174d | ||
|
|
13ed9137a5 | ||
|
|
ca877041e3 | ||
|
|
3eda219f1d | ||
|
|
13bc3c5c2c | ||
|
|
8a26f42687 | ||
|
|
968b9f8609 | ||
|
|
afde4af3a7 | ||
|
|
cbd3995b60 | ||
|
|
5fff349623 | ||
|
|
b2e26e81c1 | ||
|
|
f10dee4175 | ||
|
|
a584245029 | ||
|
|
966feefb35 | ||
|
|
fd27380be7 | ||
|
|
75ac722996 | ||
|
|
374df24ac9 | ||
|
|
6b313257f2 | ||
|
|
8b21c27f5f | ||
|
|
2454b04f1f | ||
|
|
e3fde4ecdd | ||
|
|
17c2142c98 | ||
|
|
465ea85d91 | ||
|
|
595f200a89 | ||
|
|
409ef73e56 | ||
|
|
538bc681d4 | ||
|
|
8c0e57bc52 | ||
|
|
21abdddbff | ||
|
|
379e11bd66 | ||
|
|
0e85bd849c | ||
|
|
69ac21f811 | ||
|
|
f3ccfcb452 | ||
|
|
11a8057246 | ||
|
|
12e2caf7d1 | ||
|
|
5580e78273 | ||
|
|
58b466288d | ||
|
|
f73e9c02b3 | ||
|
|
4df207acc3 | ||
|
|
6ce85b4e55 | ||
|
|
20734cade9 | ||
|
|
4911dbe9bb | ||
|
|
cc5da376ec | ||
|
|
9ef94f5a71 | ||
|
|
41b1a87c34 | ||
|
|
7fd9646f2e | ||
|
|
24ca56248f | ||
|
|
0efd3c6b62 | ||
|
|
49d67302d5 | ||
|
|
41dcddc48e | ||
|
|
ccca53be03 | ||
|
|
08a44ec44f | ||
|
|
41fe47efdf | ||
|
|
7641f28250 | ||
|
|
f5a477f0f4 | ||
|
|
2fbe31f7cb | ||
|
|
623d056436 | ||
|
|
1611aa14f6 | ||
|
|
7d970ef020 | ||
|
|
1ab0133f14 | ||
|
|
4c1822683a | ||
|
|
7c601bb6e8 | ||
|
|
0d221a806f | ||
|
|
28fd696c18 | ||
|
|
c58fffe56d | ||
|
|
2a840fe340 | ||
|
|
0f03db9d7f | ||
|
|
4349f304d2 | ||
|
|
80a4ce02c9 | ||
|
|
b37f7d6351 | ||
|
|
35d4bd768c | ||
|
|
e6691658bd | ||
|
|
3cfcccdb1d | ||
|
|
8310925c81 | ||
|
|
99cb02fdff | ||
|
|
8b372b52ac | ||
|
|
c25add868a | ||
|
|
91cbbc8238 | ||
|
|
ccdddfc83f | ||
|
|
9b255d1f27 | ||
|
|
3ab8ae7eaf | ||
|
|
a327c9530c | ||
|
|
5b810da73b | ||
|
|
098301e52c | ||
|
|
2f21d42555 | ||
|
|
fc9dcd6b3d | ||
|
|
0ad1d0ad69 | ||
|
|
ce0c806d75 | ||
|
|
fb37b3adba | ||
|
|
0f961783c1 | ||
|
|
32e03aaf68 | ||
|
|
03afb94d92 | ||
|
|
c5c190a2a0 | ||
|
|
bc66060fab | ||
|
|
3d5f1ad5c2 | ||
|
|
41a7eff8fa | ||
|
|
6acec02dbe | ||
|
|
fbeabf0751 | ||
|
|
0d4e4730c7 | ||
|
|
995f65b2ec | ||
|
|
c034a9631c | ||
|
|
256dcbded4 | ||
|
|
812caeeb9a | ||
|
|
a66564f98f | ||
|
|
375597af00 | ||
|
|
72d7418011 | ||
|
|
9505a21a7e | ||
|
|
36304b2cd1 | ||
|
|
f3cfa7831d | ||
|
|
99c4612c64 | ||
|
|
27dea71398 | ||
|
|
726bceb816 | ||
|
|
700704bec9 | ||
|
|
6a6913c939 | ||
|
|
a55b4203cd | ||
|
|
a3267c9da6 | ||
|
|
fbbab1c077 | ||
|
|
4e7110930c | ||
|
|
9266926a4a | ||
|
|
5a159cef04 | ||
|
|
5ed1bf0ca8 | ||
|
|
c33e995e83 | ||
|
|
92edae35fc | ||
|
|
d794669ef9 | ||
|
|
9cb0046734 | ||
|
|
76f63ab79a | ||
|
|
063ca9c8ee | ||
|
|
11adbdcc9f | ||
|
|
8612ebba93 | ||
|
|
a0476af896 | ||
|
|
3b735907c8 | ||
|
|
0ba79be461 | ||
|
|
cc17ebe92b | ||
|
|
bfeb487dba | ||
|
|
bc6d390fb6 | ||
|
|
f8a63ecf10 | ||
|
|
7183b43c2a | ||
|
|
fa3ece5183 | ||
|
|
2f132b3a40 | ||
|
|
79dc180bf4 | ||
|
|
264c560a2c | ||
|
|
4ce36ef245 | ||
|
|
d0227694c5 | ||
|
|
a6d9425bce | ||
|
|
e299505a64 | ||
|
|
57b4954cb3 | ||
|
|
2577c47e77 | ||
|
|
52e1b01597 | ||
|
|
8019a2dc49 | ||
|
|
33b875ecbf | ||
|
|
c24f95a8d9 | ||
|
|
6f7e5cc97b | ||
|
|
fccf33dd96 | ||
|
|
752ca76cf5 | ||
|
|
81e249b56c | ||
|
|
ff7c8af56f | ||
|
|
a11ea291d8 | ||
|
|
cd615c6e52 | ||
|
|
1bd2d9fe81 | ||
|
|
510aef19e4 | ||
|
|
1dadd50cf2 | ||
|
|
b2a86d640a | ||
|
|
c27507bc77 | ||
|
|
b374c6cd8e | ||
|
|
29dc6c67fa | ||
|
|
10de748531 | ||
|
|
dcd5994456 | ||
|
|
13cd5e7a5e | ||
|
|
856e372dde | ||
|
|
423e67558b | ||
|
|
ace653593b | ||
|
|
7b31c737be | ||
|
|
0b534c9427 | ||
|
|
cdbdcfe676 | ||
|
|
b7239fdc84 | ||
|
|
a0559b156b | ||
|
|
79db6b2811 | ||
|
|
096592e4fc | ||
|
|
d135ef02e2 | ||
|
|
ee09e92496 | ||
|
|
e619c57759 | ||
|
|
f6a0323d46 | ||
|
|
933d26f005 | ||
|
|
ec8f9fdcfd | ||
|
|
f4a60f0b6f | ||
|
|
ade94cde1c | ||
|
|
71415992ac | ||
|
|
45392fcfc6 | ||
|
|
be3e6c538c | ||
|
|
f56875db4a | ||
|
|
0876603325 | ||
|
|
3a7f88dc6c | ||
|
|
07c24e95ba | ||
|
|
7ab1ee0a0b | ||
|
|
fc8ead2237 | ||
|
|
a1d43d2353 | ||
|
|
aaff1abc4f | ||
|
|
9c56a429cc | ||
|
|
757d3eb90b | ||
|
|
4812ce4eaf | ||
|
|
56552afa6c | ||
|
|
45a3b59a23 | ||
|
|
08d0ef7408 | ||
|
|
8da6ea1707 | ||
|
|
64962e8e3d | ||
|
|
71bb0cf226 | ||
|
|
948e15c72c | ||
|
|
f06cc0b17f | ||
|
|
2aa139b579 | ||
|
|
67c6a15b93 | ||
|
|
78c029d833 | ||
|
|
afd10b1aa6 | ||
|
|
f1cd819673 | ||
|
|
fb466a6a96 | ||
|
|
0b7181fc88 | ||
|
|
97f2b4b65d | ||
|
|
39dedba93a | ||
|
|
49daa211ea | ||
|
|
01c2e70b11 | ||
|
|
fa4a2eb5e3 | ||
|
|
9e86faa4ad | ||
|
|
e31eec2c55 | ||
|
|
2d7d0ec424 | ||
|
|
191e4250ef | ||
|
|
e56e0c37f7 | ||
|
|
6a5b844bac | ||
|
|
20ad6cca2c | ||
|
|
f90fede65c | ||
|
|
61dbe51ee3 | ||
|
|
f2687ed1ff | ||
|
|
cdd8cd9e34 | ||
|
|
6d36fc1fcd | ||
|
|
ba5579f063 | ||
|
|
6395487b58 | ||
|
|
f0ba56bf5e | ||
|
|
a94a4c9802 | ||
|
|
e2f037189a | ||
|
|
bcb29cfb66 | ||
|
|
d25bb758ca | ||
|
|
424dc90dce | ||
|
|
5d6875ed98 | ||
|
|
f8b761d79b | ||
|
|
446590b19f | ||
|
|
3feb03cf35 | ||
|
|
a593b0d525 | ||
|
|
ca4276a951 | ||
|
|
e8b54de94a | ||
|
|
f9719c197d | ||
|
|
d391f237eb | ||
|
|
0b4f5d2925 | ||
|
|
7d2272beb3 | ||
|
|
6d690a315a | ||
|
|
ce81fe445a | ||
|
|
a2a75a28ba | ||
|
|
ddeca4585d | ||
|
|
64f79813cd | ||
|
|
b8c298efd9 | ||
|
|
97be9d4ace | ||
|
|
f8c4b62591 | ||
|
|
a1168ba8a9 | ||
|
|
c307f5c65f | ||
|
|
b0cf2e9927 | ||
|
|
c7e46c1431 | ||
|
|
092f6abccc | ||
|
|
dcbad6a0aa | ||
|
|
337832e1b8 | ||
|
|
d901fb23e3 | ||
|
|
59d5675fe6 | ||
|
|
ab3ade0309 | ||
|
|
720d50fe74 | ||
|
|
33fb2f75ad | ||
|
|
36c0054070 | ||
|
|
55a84cfdaa | ||
|
|
2dd64a6283 | ||
|
|
f75839294a | ||
|
|
e219152e8f | ||
|
|
d031d79369 | ||
|
|
0c476936e3 | ||
|
|
d86193036f | ||
|
|
0c3b202006 | ||
|
|
1cc7c2818f | ||
|
|
1e145550df | ||
|
|
2a3580e060 | ||
|
|
d3facb1a84 | ||
|
|
bf5c70d2e2 | ||
|
|
7f7609075f | ||
|
|
cf49ebf238 | ||
|
|
879f0f6941 | ||
|
|
af481fc730 | ||
|
|
1b67d6a86a | ||
|
|
31d975acd5 | ||
|
|
54c68f8e6c | ||
|
|
aedfcdc576 | ||
|
|
bfc4e939d1 | ||
|
|
67df99aa57 | ||
|
|
d88c816ca1 | ||
|
|
5b1c9e7233 | ||
|
|
8d6c809c3c | ||
|
|
52e417c313 | ||
|
|
5592a1ebfe | ||
|
|
42fbdda567 | ||
|
|
ae3fda37a9 | ||
|
|
ffd89ead86 | ||
|
|
937e9fbb3b | ||
|
|
9ecf71e5ed | ||
|
|
ff83b14b49 | ||
|
|
263eb6fbde | ||
|
|
e7d61b3856 | ||
|
|
682d54725a | ||
|
|
ba33c080bc | ||
|
|
2da448f4ee | ||
|
|
376c82325e | ||
|
|
95f65e1599 | ||
|
|
060af6f7bb | ||
|
|
999c01d71d | ||
|
|
a54f76238b | ||
|
|
f8f6b7788a | ||
|
|
e54195c47f | ||
|
|
e300d4c5c1 | ||
|
|
b91addb261 | ||
|
|
0f221ba3cd | ||
|
|
0070de4aaf | ||
|
|
11b4becdde | ||
|
|
8b8a512cbb | ||
|
|
141f2d3334 | ||
|
|
6dca8ab0f3 | ||
|
|
fc7a6708c5 | ||
|
|
11e5437eba | ||
|
|
c4e94bcdc3 | ||
|
|
51a7122dbe | ||
|
|
d13f594d9c | ||
|
|
85cc6fe3c7 | ||
|
|
50a0961f4e | ||
|
|
a406c37750 | ||
|
|
1cb7f3fb87 | ||
|
|
ab99719a78 | ||
|
|
e66ea7b42b | ||
|
|
46edd15121 | ||
|
|
e7bea0ec03 | ||
|
|
e3b7e9378d | ||
|
|
6fe5e6375f | ||
|
|
92b9cc89e0 | ||
|
|
53025bf059 | ||
|
|
e51d161407 | ||
|
|
3a3a4ed745 | ||
|
|
d6704ca2ed | ||
|
|
8c5c4f63bf | ||
|
|
98635ae33d | ||
|
|
70cbe52fcf | ||
|
|
e6e6630d54 | ||
|
|
34fec972dc | ||
|
|
67604a0fb0 | ||
|
|
731d73b798 | ||
|
|
70c3d5d97f | ||
|
|
23b0b37493 | ||
|
|
c7f49134eb | ||
|
|
549fc2a592 | ||
|
|
7005a8aa2a | ||
|
|
2065688116 | ||
|
|
89e3e10d89 | ||
|
|
437ed09335 | ||
|
|
59d220c54f | ||
|
|
2acd8f82b5 | ||
|
|
724e068194 | ||
|
|
e30e6937fa | ||
|
|
9406b15746 | ||
|
|
67ca39514a | ||
|
|
5fd0448924 | ||
|
|
413be8e824 | ||
|
|
dcedd8bb6b | ||
|
|
e4edee33eb | ||
|
|
128d3b0d0a | ||
|
|
ff61266430 | ||
|
|
f928cb6787 | ||
|
|
3a9ae201a7 | ||
|
|
34af17de59 |
149
.appveyor.yml
149
.appveyor.yml
@@ -1,149 +0,0 @@
|
|||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- devel
|
|
||||||
|
|
||||||
os: Visual Studio 2015
|
|
||||||
|
|
||||||
clone_folder: c:\projects\rtabmap
|
|
||||||
|
|
||||||
platform: x64
|
|
||||||
configuration: Release
|
|
||||||
|
|
||||||
init:
|
|
||||||
- cmake --version
|
|
||||||
- call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64
|
|
||||||
- call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64
|
|
||||||
|
|
||||||
install:
|
|
||||||
# Qt
|
|
||||||
- set QTDIR=C:\Qt\5.10.1\msvc2015_64
|
|
||||||
# make sure Qt bin path is before cmake bin path to avoid copying qt5 dlls from cmake before qt installation
|
|
||||||
- set PATH=%QTDIR%\bin;%PATH%
|
|
||||||
# Boost
|
|
||||||
- set PATH=%PATH%;C:\Libraries\boost_1_62_0\lib64-msvc-14.0
|
|
||||||
# Openni2
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/d98jv79l6oy9fxz/OpenNI2.exe?dl=0' -outfile OpenNI2.exe
|
|
||||||
- cmd: OpenNI2.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed OpenNI2:"
|
|
||||||
- ps: "ls \"C:/Program Files/OpenNI2\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\OpenNI2\Redist
|
|
||||||
- set OPENNI2_INCLUDE64=C:\Program Files\OpenNI2\Include
|
|
||||||
- set OPENNI2_LIB64=C:\Program Files\OpenNI2\Lib
|
|
||||||
- set OPENNI2_REDIST64=C:\Program Files\OpenNI2\Redist
|
|
||||||
# OpenCV
|
|
||||||
#- appveyor-retry appveyor DownloadFile http://downloads.sourceforge.net/project/opencvlibrary/4.5.2/opencv-4.5.2-vc14_vc15.exe
|
|
||||||
#- cmd: opencv-4.5.2-vc14_vc15.exe -o"C:\Program Files" -y
|
|
||||||
#- ECHO "Installed OpenCV:"
|
|
||||||
#- ps: "ls \"C:/Program Files/opencv/build\""
|
|
||||||
#- set PATH=%PATH%;C:\Program Files\opencv\build\x64\vc14\bin
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/o6ofn491bc0jso1/opencv450_vc14.exe?dl=0' -outfile opencv.exe
|
|
||||||
- cmd: opencv.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed OpenCV:"
|
|
||||||
- ps: "ls \"C:/Program Files/opencv\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\opencv\x64\vc14\bin
|
|
||||||
# VTK (including QVTK)
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/1l33b5l3f3y52gf/VTK-6_3-msvc140.exe?dl=0' -outfile VTK-6_3.exe
|
|
||||||
- cmd: VTK-6_3.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed VTK:"
|
|
||||||
- ps: "ls \"C:/Program Files/VTK\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\VTK\bin
|
|
||||||
# QHull
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/9widnk9msdsh2b8/Qhull-msvc140.exe?dl=0' -outfile Qhull.exe
|
|
||||||
- cmd: Qhull.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed QHull:"
|
|
||||||
- ps: "ls \"C:/Program Files/Qhull\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\Qhull\bin
|
|
||||||
# FLANN
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/7k58jbmqa51sxmh/FLANN-msvc140.exe?dl=0' -outfile FLANN.exe
|
|
||||||
- cmd: FLANN.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed FLANN:"
|
|
||||||
- ps: "ls \"C:/Program Files/FLANN\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\FLANN\bin
|
|
||||||
# Eigen
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/3v6i9i8dxj4o8ji/Eigen.exe?dl=0' -outfile Eigen.exe
|
|
||||||
- cmd: Eigen.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed Eigen:"
|
|
||||||
- ps: "ls \"C:/Program Files/Eigen\""
|
|
||||||
# PCL
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/2iayr4lyqa50i9j/PCL_181_August2018_x64_vc14.exe?dl=0' -outfile PCL_1.8.1.exe
|
|
||||||
- cmd: PCL_1.8.1.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed PCL:"
|
|
||||||
- ps: "ls \"C:/Program Files/PCL\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\PCL\bin
|
|
||||||
# zlib
|
|
||||||
- ps: wget 'https://docs.google.com/uc?authuser=0&id=0B46akLGdg-uaYm9MTTI4MUtUcmc&export=download' -outfile zlib-1.2.8-vc2010-x64.zip
|
|
||||||
- ps: Expand-Archive zlib-1.2.8-vc2010-x64.zip -DestinationPath 'C:\Program Files'
|
|
||||||
- ECHO "Installed zlib:"
|
|
||||||
- ps: "ls \"C:/Program Files/zlib\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\zlib\bin
|
|
||||||
# g2o
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/ht74s5pa21wokzw/g2o.exe?dl=0' -outfile g2o.exe
|
|
||||||
- cmd: g2o.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed g2o:"
|
|
||||||
- ps: "ls \"C:/Program Files/g2o\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\g2o\bin
|
|
||||||
# GTSAM
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/0fpr6r4cgsqmvhf/GTSAM-4_0_0_alpha2-msvc140.exe?dl=0' -outfile GTSAM.exe
|
|
||||||
- cmd: GTSAM.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed GTSAM:"
|
|
||||||
- ps: "ls \"C:/Program Files/GTSAM\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\GTSAM\bin
|
|
||||||
# OctoMap
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/6jpxu0nm8ne6e54/octomap_x64_vc14.exe?dl=0' -outfile octomap.exe
|
|
||||||
- cmd: octomap.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed OctoMap:"
|
|
||||||
- ps: "ls \"C:/Program Files/octomap-distribution\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\octomap-distribution\bin
|
|
||||||
# CPU-TSDF
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/mgges9va1uzxr0q/cpu_tsdf_sept2015_x64_vc14.exe?dl=0' -outfile cpu_tsdf.exe
|
|
||||||
- cmd: cpu_tsdf.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed CPU-TSDF:"
|
|
||||||
- ps: "ls \"C:/Program Files/cpu_tsdf\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\cpu_tsdf\bin
|
|
||||||
# Open Chisel
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/0aaphcde4acrinm/open_chisel_x64_vc14.exe?dl=0' -outfile open_chisel.exe
|
|
||||||
- cmd: open_chisel.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed Open Chisel:"
|
|
||||||
- ps: "ls \"C:/Program Files/open_chisel\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\open_chisel\bin
|
|
||||||
# yaml-cpp
|
|
||||||
- ps: wget 'https://dl.dropboxusercontent.com/s/22qfvftwj6zq8tj/yaml-cpp_x64_vc14.exe?dl=0' -outfile yaml-cpp.exe
|
|
||||||
- cmd: yaml-cpp.exe -o"C:\Program Files" -y
|
|
||||||
- ECHO "Installed yaml-cpp:"
|
|
||||||
- ps: "ls \"C:/Program Files/yaml-cpp\""
|
|
||||||
# RealSense2
|
|
||||||
- ps: wget 'https://github.com/IntelRealSense/librealsense/releases/download/v2.40.0/Intel.RealSense.SDK-WIN10-2.40.0.2482.exe' -outfile realsense2.exe
|
|
||||||
- cmd: realsense2.exe /VERYSILENT
|
|
||||||
- ECHO "Installed RealSense2:"
|
|
||||||
- ps: "ls \"C:/Program Files (x86)/Intel RealSense SDK 2.0\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files (x86)\Intel RealSense SDK 2.0\bin\x64
|
|
||||||
- set RealSense2_ROOT_DIR=C:\Program Files (x86)\Intel RealSense SDK 2.0
|
|
||||||
# Kinect 4 Azure
|
|
||||||
- ps: wget 'https://download.microsoft.com/download/3/d/6/3d6d9e99-a251-4cf3-8c6a-8e108e960b4b/Azure%20Kinect%20SDK%201.4.1.exe' -outfile azure.exe
|
|
||||||
- cmd: azure.exe /quiet
|
|
||||||
- ECHO "Installed Kinect For Azure:"
|
|
||||||
- ps: "ls \"C:/Program Files/Azure Kinect SDK v1.4.1\""
|
|
||||||
- set PATH=%PATH%;C:\Program Files\Azure Kinect SDK v1.4.1\tools
|
|
||||||
- set K4A_ROOT_DIR=C:\Program Files\Azure Kinect SDK v1.4.1
|
|
||||||
|
|
||||||
before_build:
|
|
||||||
- cd c:\projects\rtabmap\build
|
|
||||||
- ECHO %PROGRAMFILES%
|
|
||||||
- ECHO %PATH%
|
|
||||||
- cmake -G "Visual Studio 14 2015 Win64" -DOpenCV_DIR="C:\Program Files\opencv\build" -DPCL_DIR="C:\Program Files\PCL\cmake" -DCPUTSDF_DIR="C:\Program Files\cpu_tsdf\share\cpu_tsdf" -Dyaml-cpp_DIR="C:\Program Files\yaml-cpp\CMake" -DBUILD_AS_BUNDLE=ON ..
|
|
||||||
|
|
||||||
after_build :
|
|
||||||
- cmake --build . --config Release --target package
|
|
||||||
|
|
||||||
artifacts:
|
|
||||||
- path: build\RTABMap-*
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
- provider: Email
|
|
||||||
to:
|
|
||||||
- matlabbe@gmail.com
|
|
||||||
on_build_success: false
|
|
||||||
on_build_failure: false
|
|
||||||
on_build_status_changed: true
|
|
||||||
24
.devcontainer/android/Dockerfile
Normal file
24
.devcontainer/android/Dockerfile
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
FROM introlab3it/rtabmap:android-noble-deps
|
||||||
|
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN chmod +x /opt/android-sdk/tools/android
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
|
|
||||||
21
.devcontainer/android/devcontainer.json
Normal file
21
.devcontainer/android/devcontainer.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools", "vscjava.vscode-java-pack"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
"postStartCommand": "./.devcontainer/android/init.sh",
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"runArgs": ["--privileged", "--network=host"]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
17
.devcontainer/android/init.sh
Executable file
17
.devcontainer/android/init.sh
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Running post-start initialization..."
|
||||||
|
|
||||||
|
# copy required jars
|
||||||
|
cp /opt/android/lib/*.jar app/android/libs/.
|
||||||
|
|
||||||
|
mkdir -p build_android/arm64-v8a
|
||||||
|
|
||||||
|
# resource tool
|
||||||
|
cd build_android
|
||||||
|
cmake -DANDROID_PREBUILD=ON ..
|
||||||
|
make
|
||||||
|
|
||||||
|
echo -e "\nTo build the APK, do (adjust API number):"
|
||||||
|
echo -e '\nexport ANDROID_API=30 && cd build_android/arm64-v8a && cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_NDK=$ANDROID_NDK -DANDROID_NATIVE_API_LEVEL=$ANDROID_API -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/android/arm64-v8a -DCMAKE_FIND_ROOT_PATH="/opt/android/arm64-v8a/bin;/opt/android/arm64-v8a;/opt/android/arm64-v8a/share" -DBUILD_EXAMPLES=OFF -DBUILD_TOOLS=OFF -DOpenCV_DIR=/opt/android/arm64-v8a/sdk/native/jni ../..\nmake -j6\n'
|
||||||
8
.devcontainer/bionic/devcontainer.json
Normal file
8
.devcontainer/bionic/devcontainer.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"image": "introlab3it/rtabmap:18.04",
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
19
.devcontainer/focal/Dockerfile
Normal file
19
.devcontainer/focal/Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
FROM introlab3it/rtabmap:focal-deps
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map && chown -R ${USERNAME} /home/${USERNAME}
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
RUN echo 'source /opt/ros/$ROS_DISTRO/setup.bash' >> /home/${USERNAME}/.bashrc
|
||||||
18
.devcontainer/focal/devcontainer.json
Normal file
18
.devcontainer/focal/devcontainer.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"runArgs": ["--privileged", "--network=host"]
|
||||||
|
}
|
||||||
19
.devcontainer/jammy/Dockerfile
Normal file
19
.devcontainer/jammy/Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
FROM introlab3it/rtabmap:jammy-deps
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map && chown -R ${USERNAME} /home/${USERNAME}
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
RUN echo 'source /opt/ros/$ROS_DISTRO/setup.bash' >> /home/${USERNAME}/.bashrc
|
||||||
18
.devcontainer/jammy/devcontainer.json
Normal file
18
.devcontainer/jammy/devcontainer.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"runArgs": ["--privileged", "--network=host"]
|
||||||
|
}
|
||||||
105
.devcontainer/latest-deps-from-source/Dockerfile
Normal file
105
.devcontainer/latest-deps-from-source/Dockerfile
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
ARG ROS_DISTRO=jazzy
|
||||||
|
|
||||||
|
FROM osrf/ros:${ROS_DISTRO}-desktop
|
||||||
|
|
||||||
|
# Install build dependencies with Qt6 (issue: rtabmap has black window)
|
||||||
|
#RUN apt-get update && \
|
||||||
|
# apt-get install -y git software-properties-common ros-${ROS_DISTRO}-rtabmap-ros libqt6* qt6* qml6* && \
|
||||||
|
# apt-get remove -y ros-${ROS_DISTRO}-rtabmap* ros-${ROS_DISTRO}-gtsam ros-${ROS_DISTRO}-libg2o libpcl* libqt5* qt5* libvtk* libopencv* && \
|
||||||
|
# apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
# Install build dependencies with Qt5
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y git software-properties-common ros-${ROS_DISTRO}-rtabmap-ros && \
|
||||||
|
apt-get remove -y ros-${ROS_DISTRO}-rtabmap* ros-${ROS_DISTRO}-gtsam ros-${ROS_DISTRO}-libg2o libpcl* libvtk* libopencv* && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
RUN echo 'source /opt/ros/${ROS_DISTRO}/setup.bash' >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
|
WORKDIR /home/${USERNAME}/
|
||||||
|
|
||||||
|
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
||||||
|
|
||||||
|
# We build main dependencies from source, cleaning up the
|
||||||
|
# build directory after install but keeping the source code
|
||||||
|
# to change version/reinstall from inside the dev container
|
||||||
|
# if needed.
|
||||||
|
|
||||||
|
# Build latest VTK with Qt6
|
||||||
|
RUN git clone https://github.com/Kitware/VTK.git
|
||||||
|
RUN cd VTK && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DVTK_GROUP_ENABLE_Qt=YES .. && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
make clean
|
||||||
|
|
||||||
|
# Build latest PCL with latest VTK
|
||||||
|
# Make sure all libraries depending on Eigen are built with same CXX standard (17)
|
||||||
|
RUN git clone https://github.com/PointCloudLibrary/pcl.git
|
||||||
|
RUN cd pcl && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_CXX_STANDARD=17 -DBUILD_tools=ON -DPCL_ENABLE_AVX=OFF -DPCL_ENABLE_MARCHNATIVE=OFF -DPCL_ENABLE_SSE=OFF .. && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
make clean
|
||||||
|
|
||||||
|
# Build latest OpenCV
|
||||||
|
RUN git clone https://github.com/opencv/opencv.git
|
||||||
|
RUN git clone https://github.com/opencv/opencv_contrib.git
|
||||||
|
RUN cd opencv && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DBUILD_opencv_python3=OFF -DBUILD_opencv_python_bindings_generator=OFF -DBUILD_opencv_python_tests=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DOPENCV_ENABLE_NONFREE=ON -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules .. && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
make clean
|
||||||
|
|
||||||
|
# Build latest gtsam
|
||||||
|
RUN git clone https://github.com/borglab/gtsam.git
|
||||||
|
RUN cd gtsam && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_CXX_STANDARD=17 -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF -DGTSAM_BUILD_TESTS=OFF -DGTSAM_BUILD_STATIC_LIBRARY=OFF -DGTSAM_BUILD_UNSTABLE=OFF -DGTSAM_INSTALL_CPPUNILITE=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
make clean
|
||||||
|
|
||||||
|
# Build latest g2o
|
||||||
|
RUN git clone https://github.com/RainerKuemmerle/g2o.git
|
||||||
|
RUN cd g2o && \
|
||||||
|
mkdir build && \
|
||||||
|
cd build && \
|
||||||
|
cmake -DCMAKE_CXX_STANDARD=17 -DBUILD_WITH_MARCH_NATIVE=OFF -DG2O_BUILD_APPS=OFF -DG2O_BUILD_EXAMPLES=OFF -DG2O_USE_OPENGL=OFF -DCMAKE_BUILD_TYPE=Release .. && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
make clean
|
||||||
|
|
||||||
|
# ros2 seems not sourcing by default its multi-arch folders
|
||||||
|
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ros/${ROS_DISTRO}/lib/x86_64-linux-gnu
|
||||||
|
|
||||||
|
RUN ldconfig
|
||||||
|
|
||||||
|
RUN chown -R ${USERNAME} /home/${USERNAME}
|
||||||
21
.devcontainer/latest-deps-from-source/devcontainer.json
Normal file
21
.devcontainer/latest-deps-from-source/devcontainer.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"args": {
|
||||||
|
"ROS_DISTRO": "jazzy"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"runArgs": ["--privileged", "--network=host"]
|
||||||
|
}
|
||||||
20
.devcontainer/noble-kilted/Dockerfile
Normal file
20
.devcontainer/noble-kilted/Dockerfile
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
FROM introlab3it/rtabmap:noble-kilted-deps
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
RUN echo 'source /opt/ros/kilted/setup.bash' >> /home/${USERNAME}/.bashrc
|
||||||
17
.devcontainer/noble-kilted/devcontainer.json
Normal file
17
.devcontainer/noble-kilted/devcontainer.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"runArgs": ["--privileged"]
|
||||||
|
}
|
||||||
23
.devcontainer/noble/Dockerfile
Normal file
23
.devcontainer/noble/Dockerfile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
FROM introlab3it/rtabmap:noble-deps
|
||||||
|
|
||||||
|
# For devcontainer
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map && chown -R ${USERNAME} /home/${USERNAME}
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
RUN echo 'source /opt/ros/$ROS_DISTRO/setup.bash' >> /home/${USERNAME}/.bashrc
|
||||||
30
.devcontainer/noble/devcontainer.json
Normal file
30
.devcontainer/noble/devcontainer.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools", "ms-vscode.cpptools-extension-pack"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"hostRequirements": {
|
||||||
|
"gpu": "optional"
|
||||||
|
},
|
||||||
|
"runArgs": ["--privileged",
|
||||||
|
"--network=host",
|
||||||
|
"--gpus=all",
|
||||||
|
//"--runtime=nvidia", // uncommment this if rtabmap doesn't show up in nvidia-smi on the host computer
|
||||||
|
"--env=DISPLAY",
|
||||||
|
"--env=QT_X11_NO_MITSHM=1",
|
||||||
|
"--volume=/tmp/.X11-unix:/tmp/.X11-unix"],
|
||||||
|
"containerEnv": {
|
||||||
|
"NVIDIA_VISIBLE_DEVICES": "all"
|
||||||
|
}
|
||||||
|
}
|
||||||
25
.devcontainer/resolute/Dockerfile
Normal file
25
.devcontainer/resolute/Dockerfile
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
FROM introlab3it/rtabmap:resolute-deps
|
||||||
|
|
||||||
|
# For devcontainer
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map && chown -R ${USERNAME} /home/${USERNAME}
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
|
||||||
|
|
||||||
30
.devcontainer/resolute/devcontainer.json
Normal file
30
.devcontainer/resolute/devcontainer.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools", "ms-vscode.cpptools-extension-pack"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"hostRequirements": {
|
||||||
|
"gpu": "optional"
|
||||||
|
},
|
||||||
|
"runArgs": ["--privileged",
|
||||||
|
"--network=host",
|
||||||
|
"--gpus=all",
|
||||||
|
//"--runtime=nvidia", // uncommment this if rtabmap doesn't show up in nvidia-smi on the host computer
|
||||||
|
"--env=DISPLAY",
|
||||||
|
"--env=QT_X11_NO_MITSHM=1",
|
||||||
|
"--volume=/tmp/.X11-unix:/tmp/.X11-unix"],
|
||||||
|
"containerEnv": {
|
||||||
|
"NVIDIA_VISIBLE_DEVICES": "all"
|
||||||
|
}
|
||||||
|
}
|
||||||
80
.devcontainer/rolling/Dockerfile
Normal file
80
.devcontainer/rolling/Dockerfile
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
|
||||||
|
FROM ubuntu:24.04
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
# Install ROS2
|
||||||
|
RUN apt update && \
|
||||||
|
apt install software-properties-common -y && \
|
||||||
|
add-apt-repository universe -y && \
|
||||||
|
apt update && \
|
||||||
|
apt install curl -y && \
|
||||||
|
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}') && \
|
||||||
|
curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb" && \
|
||||||
|
apt install /tmp/ros2-apt-source.deb && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
# Install build dependencies
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt upgrade -y && \
|
||||||
|
apt-get install -y \
|
||||||
|
git \
|
||||||
|
wget \
|
||||||
|
libtbb-dev \
|
||||||
|
libproj-dev \
|
||||||
|
libpcl-dev \
|
||||||
|
liboctomap-dev \
|
||||||
|
libfreenect-dev \
|
||||||
|
ros-rolling-ros-base \
|
||||||
|
ros-dev-tools \
|
||||||
|
ros-rolling-cv-bridge \
|
||||||
|
ros-rolling-image-geometry \
|
||||||
|
ros-rolling-laser-geometry \
|
||||||
|
ros-rolling-pcl-conversions \
|
||||||
|
ros-rolling-rviz-common \
|
||||||
|
ros-rolling-rviz-rendering \
|
||||||
|
ros-rolling-rviz-default-plugins \
|
||||||
|
ros-rolling-pcl-ros \
|
||||||
|
ros-rolling-imu-filter-madgwick \
|
||||||
|
ros-rolling-image-transport \
|
||||||
|
ros-rolling-octomap-msgs \
|
||||||
|
ros-rolling-libg2o \
|
||||||
|
ros-rolling-gtsam \
|
||||||
|
ros-rolling-libpointmatcher \
|
||||||
|
ros-rolling-qt-gui-cpp \
|
||||||
|
ros-rolling-diagnostic-updater && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
WORKDIR /root/
|
||||||
|
|
||||||
|
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
||||||
|
|
||||||
|
RUN echo -e '#!/bin/bash\nset -e\n\n# setup ros2 environment\nsource "/opt/ros/rolling/setup.bash" --\nexec "$@"' > /ros_entrypoint.sh
|
||||||
|
RUN chmod +x /ros_entrypoint.sh
|
||||||
|
ENTRYPOINT [ "/ros_entrypoint.sh" ]
|
||||||
|
|
||||||
|
# ros2 seems not sourcing by default its multi-arch folders
|
||||||
|
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ros/rolling/lib/x86_64-linux-gnu
|
||||||
|
|
||||||
|
# For devcontainer
|
||||||
|
# remove ubuntu user
|
||||||
|
RUN touch /var/mail/ubuntu && chown ubuntu /var/mail/ubuntu && userdel -r ubuntu
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo && \
|
||||||
|
apt-get clean && rm -rf /var/lib/apt/lists/
|
||||||
|
|
||||||
|
ARG USERNAME=vscode
|
||||||
|
ARG USER_UID=1000
|
||||||
|
ARG USER_GID=1000
|
||||||
|
|
||||||
|
RUN set -ex && \
|
||||||
|
groupadd --gid ${USER_GID} ${USERNAME} && \
|
||||||
|
useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
|
||||||
|
usermod -a -G sudo ${USERNAME} && \
|
||||||
|
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} && \
|
||||||
|
chmod 0440 /etc/sudoers.d/${USERNAME}
|
||||||
|
|
||||||
|
RUN mkdir -p /home/${USERNAME}/Documents/RTAB-Map && chown -R ${USERNAME} /home/${USERNAME}
|
||||||
|
|
||||||
|
RUN echo "source /usr/share/bash-completion/completions/git" >> /home/${USERNAME}/.bashrc
|
||||||
|
RUN echo 'source /opt/ros/$ROS_DISTRO/setup.bash' >> /home/${USERNAME}/.bashrc
|
||||||
30
.devcontainer/rolling/devcontainer.json
Normal file
30
.devcontainer/rolling/devcontainer.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": ["ms-vscode.cpptools-themes", "ms-vscode.cmake-tools"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/rtabmap,type=bind",
|
||||||
|
"workspaceFolder": "/home/vscode/rtabmap",
|
||||||
|
//"mounts": ["source=${localEnv:HOME}/Documents/RTAB-Map,target=/home/vscode/Documents/RTAB-Map,type=bind,consistency=cached"],
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash"
|
||||||
|
},
|
||||||
|
"remoteUser": "vscode",
|
||||||
|
"hostRequirements": {
|
||||||
|
"gpu": "optional"
|
||||||
|
},
|
||||||
|
"runArgs": ["--privileged",
|
||||||
|
"--network=host",
|
||||||
|
"--gpus=all",
|
||||||
|
//"--runtime=nvidia", // uncommment this if rtabmap doesn't show up in nvidia-smi on the host computer
|
||||||
|
"--env=DISPLAY",
|
||||||
|
"--env=QT_X11_NO_MITSHM=1",
|
||||||
|
"--volume=/tmp/.X11-unix:/tmp/.X11-unix"],
|
||||||
|
"containerEnv": {
|
||||||
|
"NVIDIA_VISIBLE_DEVICES": "all"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1 +1,2 @@
|
|||||||
build/*
|
build/*
|
||||||
|
build_*
|
||||||
|
|||||||
53
.gitattributes
vendored
Normal file
53
.gitattributes
vendored
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# This repository has a historical mix of CRLF and LF files. Letting git convert
|
||||||
|
# line endings (core.autocrlf, or a "text=auto" policy) would rewrite whole files
|
||||||
|
# on checkout/commit and bury real changes under thousands of ending-only diff
|
||||||
|
# lines -- and it would do so at unpredictable times, on whichever file happens
|
||||||
|
# to be touched next. Keep every file's bytes exactly as committed.
|
||||||
|
#
|
||||||
|
# This also keeps LF-only files LF on Windows checkouts, which data/tests/manifest.txt
|
||||||
|
# relies on: scripts/fetch_test_data.sh tab-splits it and a trailing CR breaks SHA
|
||||||
|
# matching. No per-file exception is needed for that.
|
||||||
|
#
|
||||||
|
# Note this does not stop an editor or script from rewriting a file's endings; it
|
||||||
|
# only stops git from doing it.
|
||||||
|
* -text
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Migrating to the standard LF policy (a future MR, on its own)
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# LF is what git stores natively and what essentially every C++ project on GitHub
|
||||||
|
# uses (LLVM, OpenCV, PCL, Qt). The rule above only freezes the current mix; it is
|
||||||
|
# a holding position, not the destination. To finish the job:
|
||||||
|
#
|
||||||
|
# 1. Replace the `* -text` line above with:
|
||||||
|
#
|
||||||
|
# * text=auto
|
||||||
|
# # Files that must stay LF even in a Windows working tree:
|
||||||
|
# *.sh text eol=lf
|
||||||
|
# *.bash text eol=lf
|
||||||
|
#
|
||||||
|
# (`text=auto` = store LF in the repo, check out native line endings.)
|
||||||
|
#
|
||||||
|
# 2. Rewrite the working tree and stage it, in the same commit as step 1:
|
||||||
|
#
|
||||||
|
# git add --renormalize .
|
||||||
|
#
|
||||||
|
# 3. Verify nothing but line endings changed -- this must print nothing:
|
||||||
|
#
|
||||||
|
# git diff --cached --ignore-cr-at-eol
|
||||||
|
#
|
||||||
|
# 4. Commit alone, with no other change in the MR, then record the SHA so
|
||||||
|
# `git blame` (and GitHub's blame view) skips over it:
|
||||||
|
#
|
||||||
|
# echo "<sha of the normalization commit>" >> .git-blame-ignore-revs
|
||||||
|
#
|
||||||
|
# Add a follow-up commit for that file; also set it locally with
|
||||||
|
# `git config blame.ignoreRevsFile .git-blame-ignore-revs`.
|
||||||
|
#
|
||||||
|
# Cost, measured on the tree at the time of writing: 227 CRLF files + 7 with mixed
|
||||||
|
# endings, ~138k of ~634k lines rewritten (22%), across 234 files. The commit
|
||||||
|
# itself is mechanical and safe -- the real cost is every open branch that touches
|
||||||
|
# one of those files, which will conflict over the whole file on rebase. Merge or
|
||||||
|
# rebase those with `-X renormalize` (merge) / `--strategy-option renormalize`.
|
||||||
|
#
|
||||||
|
# Best moment: right after a release, when the branch backlog is smallest.
|
||||||
267
.github/actions/install-macos-source-deps/action.yml
vendored
Normal file
267
.github/actions/install-macos-source-deps/action.yml
vendored
Normal file
@@ -0,0 +1,267 @@
|
|||||||
|
name: 'Install macOS Source Dependencies'
|
||||||
|
description: 'Builds (and per-dependency caches) the source-only deps not available from Homebrew (GTSAM, libnabo+libpointmatcher, OrbbecSDK, depthai) and installs them into /usr/local.'
|
||||||
|
inputs:
|
||||||
|
os:
|
||||||
|
description: 'Runner os label (e.g. matrix.os), used to namespace the per-dependency caches. Required because intel/arm produce different binaries with identical Homebrew version strings.'
|
||||||
|
required: true
|
||||||
|
build_type:
|
||||||
|
description: 'CMake build type.'
|
||||||
|
required: false
|
||||||
|
default: 'Release'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Resolve dependency versions
|
||||||
|
id: depver
|
||||||
|
shell: bash
|
||||||
|
# The source deps link against these Homebrew libraries and are compiled
|
||||||
|
# with Xcode's toolchain, so both are folded into the cache keys: a
|
||||||
|
# Homebrew bump (e.g. a new Eigen) or an Xcode update forces a rebuild.
|
||||||
|
run: |
|
||||||
|
BREW=$(brew list --versions eigen boost yaml-cpp | sort)
|
||||||
|
XCODE=$(xcodebuild -version 2>/dev/null || clang --version | head -1)
|
||||||
|
HASH=$(printf '%s\n%s\n' "$BREW" "$XCODE" | shasum | cut -d' ' -f1)
|
||||||
|
echo "hash=$HASH" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# ----------------------------- GTSAM -----------------------------
|
||||||
|
- name: Cache GTSAM
|
||||||
|
id: cache-gtsam
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/gtsam
|
||||||
|
key: gtsam-4.2.1-${{ inputs.os }}-${{ hashFiles('.github/actions/install-macos-source-deps/patches/gtsam-4.2.1-eigen5.patch') }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build GTSAM
|
||||||
|
if: steps.cache-gtsam.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
PATCHES="${{ github.action_path }}/patches"
|
||||||
|
SRC="${{ runner.temp }}/src-deps/gtsam"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/gtsam"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
git clone --depth 1 --branch 4.2.1 https://github.com/borglab/gtsam.git "$SRC/gtsam"
|
||||||
|
cd "$SRC/gtsam"
|
||||||
|
git apply "$PATCHES/gtsam-4.2.1-eigen5.patch"
|
||||||
|
cmake -B build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ inputs.build_type }} \
|
||||||
|
-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF \
|
||||||
|
-DGTSAM_WITH_TBB=OFF \
|
||||||
|
-DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF \
|
||||||
|
-DGTSAM_BUILD_TESTS=OFF \
|
||||||
|
-DGTSAM_BUILD_UNSTABLE=OFF \
|
||||||
|
-DGTSAM_USE_SYSTEM_EIGEN=ON \
|
||||||
|
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
|
||||||
|
# ----------------- libnabo + libpointmatcher --------------------
|
||||||
|
# Built together: libpointmatcher depends on libnabo, so keeping them in one
|
||||||
|
# unit keeps the build order internal (lpm finds libnabo in the unit's stage).
|
||||||
|
- name: Cache pointmatcher
|
||||||
|
id: cache-pointmatcher
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/pointmatcher
|
||||||
|
key: pointmatcher-nabo1.1.2-lpm1.4.4-${{ inputs.os }}-${{ hashFiles('.github/actions/install-macos-source-deps/patches/libnabo-1.1.2.patch', '.github/actions/install-macos-source-deps/patches/libpointmatcher-1.4.4-boost.patch') }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build pointmatcher
|
||||||
|
if: steps.cache-pointmatcher.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
PATCHES="${{ github.action_path }}/patches"
|
||||||
|
SRC="${{ runner.temp }}/src-deps/pointmatcher"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/pointmatcher"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
# libnabo (required by libpointmatcher)
|
||||||
|
git clone --depth 1 --branch 1.1.2 https://github.com/ethz-asl/libnabo.git "$SRC/libnabo"
|
||||||
|
cd "$SRC/libnabo"
|
||||||
|
git apply "$PATCHES/libnabo-1.1.2.patch"
|
||||||
|
cmake -B build -DCMAKE_BUILD_TYPE=${{ inputs.build_type }}
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
# libpointmatcher (finds libnabo from the unit's staged prefix)
|
||||||
|
git clone --depth 1 --branch 1.4.4 https://github.com/ethz-asl/libpointmatcher.git "$SRC/libpointmatcher"
|
||||||
|
cd "$SRC/libpointmatcher"
|
||||||
|
git apply "$PATCHES/libpointmatcher-1.4.4-boost.patch"
|
||||||
|
cmake -B build -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DCMAKE_PREFIX_PATH="$STAGE/usr/local" -DBUILD_EVALUATIONS=OFF -DBUILD_EXAMPLES=OFF
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
|
||||||
|
# ----------------------------- OrbbecSDK ------------------------
|
||||||
|
- name: Cache OrbbecSDK
|
||||||
|
id: cache-orbbec
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/orbbec
|
||||||
|
key: orbbec-2.8.7-usrlocal-${{ inputs.os }}-${{ hashFiles('.github/actions/install-macos-source-deps/patches/orbbecsdk-2.8.7-cmake-config-install.patch') }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build OrbbecSDK
|
||||||
|
if: steps.cache-orbbec.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
PATCHES="${{ github.action_path }}/patches"
|
||||||
|
SRC="${{ runner.temp }}/src-deps/orbbec"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/orbbec"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
git clone --depth 1 --branch v2.8.7 https://github.com/orbbec/OrbbecSDK_v2.git "$SRC/OrbbecSDK_v2"
|
||||||
|
cd "$SRC/OrbbecSDK_v2"
|
||||||
|
git apply "$PATCHES/orbbecsdk-2.8.7-cmake-config-install.patch"
|
||||||
|
# OrbbecSDK defaults its install prefix to /opt/OrbbecSDK; force /usr/local
|
||||||
|
# so it stages under usr/local like the other deps and is installed/found.
|
||||||
|
cmake -B build -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DCMAKE_INSTALL_PREFIX=/usr/local -DOB_BUILD_DOCS=OFF -DOB_BUILD_EXAMPLES=OFF -DOB_BUILD_TOOLS=OFF -DOB_INSTALL_EXAMPLES_SOURCE=OFF
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
|
||||||
|
# ----------------------------- depthai --------------------------
|
||||||
|
- name: Cache depthai
|
||||||
|
id: cache-depthai
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/depthai
|
||||||
|
key: depthai-2.32.0-usrlocal-nocv-${{ inputs.os }}-${{ hashFiles('.github/actions/install-macos-source-deps/patches/depthai-2.32.0-hunter-macos.patch') }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build depthai
|
||||||
|
if: steps.cache-depthai.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
PATCHES="${{ github.action_path }}/patches"
|
||||||
|
SRC="${{ runner.temp }}/src-deps/depthai"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/depthai"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
# depthai 2.32.0 (Hunter-based; v2 does NOT use vcpkg/CMake presets)
|
||||||
|
git clone --depth 1 --branch v2.32.0 https://github.com/luxonis/depthai-core.git "$SRC/depthai-core"
|
||||||
|
cd "$SRC/depthai-core"
|
||||||
|
git submodule update --init --recursive
|
||||||
|
# Route zlib to Homebrew: Hunter's pinned zlib fork has a classic
|
||||||
|
# TARGET_OS_MAC fdopen block that won't compile against the modern macOS SDK.
|
||||||
|
git apply "$PATCHES/depthai-2.32.0-hunter-macos.patch"
|
||||||
|
# v2 and its old Hunter deps declare cmake_minimum_required < 3.5, which the
|
||||||
|
# runner's CMake 4.x rejects, and CMAKE_POLICY_VERSION_MINIMUM does not
|
||||||
|
# propagate into Hunter's sub-builds. Use a pinned CMake 3.x just for depthai
|
||||||
|
# (Hunter reuses the same cmake binary for its dependency sub-builds).
|
||||||
|
python3 -m venv "$SRC/cmake3-venv"
|
||||||
|
"$SRC/cmake3-venv/bin/pip" install -q "cmake==3.31.6"
|
||||||
|
CMAKE3="$SRC/cmake3-venv/bin/cmake"
|
||||||
|
# DEPTHAI_ENABLE_CURL=OFF: Hunter's CURL drags in the broken zlib and also
|
||||||
|
# fails to configure on this toolchain; rtabmap doesn't need depthai's CURL.
|
||||||
|
# depthai-core defaults its install prefix to <build>/install; force
|
||||||
|
# /usr/local so it stages under usr/local like the other deps.
|
||||||
|
"$CMAKE3" -B build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ inputs.build_type }} \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr/local \
|
||||||
|
-DBUILD_SHARED_LIBS=ON \
|
||||||
|
-DDEPTHAI_ENABLE_CURL=OFF \
|
||||||
|
-DDEPTHAI_BUILD_TESTS=OFF \
|
||||||
|
-DDEPTHAI_BUILD_EXAMPLES=OFF \
|
||||||
|
-DDEPTHAI_OPENCV_SUPPORT=OFF \
|
||||||
|
-DCMAKE_PREFIX_PATH="$(brew --prefix zlib)"
|
||||||
|
"$CMAKE3" --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" "$CMAKE3" --install build
|
||||||
|
|
||||||
|
# ----------------------------- opengv ---------------------------
|
||||||
|
- name: Cache opengv
|
||||||
|
id: cache-opengv
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/opengv
|
||||||
|
key: opengv-91f4b19c-usrlocal-${{ inputs.os }}-${{ hashFiles('.github/actions/install-macos-source-deps/patches/opengv-91f4b19c-macos.patch') }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build opengv
|
||||||
|
if: steps.cache-opengv.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
PATCHES="${{ github.action_path }}/patches"
|
||||||
|
SRC="${{ runner.temp }}/src-deps/opengv"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/opengv"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
# opengv pins a commit (not a tag), so clone then checkout.
|
||||||
|
git clone https://github.com/laurentkneip/opengv.git "$SRC/opengv"
|
||||||
|
cd "$SRC/opengv"
|
||||||
|
git checkout 91f4b19c73450833a40e463ad3648aae80b3a7f3
|
||||||
|
# Disable the -march=native/armv7-a/armv8-a flags so it builds portably on
|
||||||
|
# both Intel and Apple Silicon runners.
|
||||||
|
git apply "$PATCHES/opengv-91f4b19c-macos.patch"
|
||||||
|
# CMAKE_POLICY_VERSION_MINIMUM=3.5: opengv declares an ancient
|
||||||
|
# cmake_minimum_required that modern CMake rejects. EIGEN_INCLUDE_DIR points
|
||||||
|
# opengv's bundled FindEigen at Homebrew's eigen (covers /opt/homebrew on arm64).
|
||||||
|
cmake -B build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ inputs.build_type }} \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr/local \
|
||||||
|
-DBUILD_TESTS=OFF \
|
||||||
|
-DBUILD_SHARED_LIBS=ON \
|
||||||
|
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
||||||
|
-DEIGEN_INCLUDE_DIR="$(brew --prefix eigen)/include/eigen3"
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
|
||||||
|
# ----------------------------- g2o ------------------------------
|
||||||
|
- name: Cache g2o
|
||||||
|
id: cache-g2o
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/deps-stage/g2o
|
||||||
|
key: g2o-67cbe15c-${{ inputs.os }}-${{ steps.depver.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Build g2o
|
||||||
|
if: steps.cache-g2o.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
NPROC=$(sysctl -n hw.logicalcpu)
|
||||||
|
SRC="${{ runner.temp }}/src-deps/g2o"
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage/g2o"
|
||||||
|
rm -rf "$SRC"; mkdir -p "$SRC" "$STAGE"
|
||||||
|
# g2o pins a commit (not a tag), so clone then checkout.
|
||||||
|
git clone https://github.com/RainerKuemmerle/g2o.git "$SRC/g2o"
|
||||||
|
cd "$SRC/g2o"
|
||||||
|
git checkout 67cbe15c998737ac6705d3cd18201a72be0d073d
|
||||||
|
# CMAKE_INSTALL_PREFIX=/usr/local so it stages under usr/local like the
|
||||||
|
# other deps. Homebrew's libomp is keg-only and g2o does not propagate
|
||||||
|
# OpenMP's include/lib dirs, so with Apple clang <omp.h> isn't found and
|
||||||
|
# libomp isn't linked; add its include (-I) and lib (-L -lomp) explicitly.
|
||||||
|
LIBOMP=$(brew --prefix libomp)
|
||||||
|
cmake -B build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ inputs.build_type }} \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr/local \
|
||||||
|
-DCMAKE_PREFIX_PATH="$LIBOMP" \
|
||||||
|
-DCMAKE_C_FLAGS="-I$LIBOMP/include" \
|
||||||
|
-DCMAKE_CXX_FLAGS="-I$LIBOMP/include" \
|
||||||
|
-DCMAKE_EXE_LINKER_FLAGS="-L$LIBOMP/lib -lomp" \
|
||||||
|
-DCMAKE_SHARED_LINKER_FLAGS="-L$LIBOMP/lib -lomp" \
|
||||||
|
-DG2O_BUILD_APPS=OFF \
|
||||||
|
-DG2O_BUILD_EXAMPLES=OFF \
|
||||||
|
-DG2O_USE_OPENMP=ON \
|
||||||
|
-DG2O_USE_OPENGL=OFF
|
||||||
|
cmake --build build -j$NPROC
|
||||||
|
DESTDIR="$STAGE" cmake --install build
|
||||||
|
|
||||||
|
# ------------------- install all units into /usr/local ----------
|
||||||
|
- name: Install source dependencies into /usr/local
|
||||||
|
shell: bash
|
||||||
|
# Copy each (cached or freshly built) staged tree into /usr/local so
|
||||||
|
# rtabmap's find_package() and the bundle fixup (which search /usr/local)
|
||||||
|
# pick them up. Runs on both cache hit and miss.
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
STAGE="${{ runner.temp }}/deps-stage"
|
||||||
|
found=0
|
||||||
|
for unit in gtsam pointmatcher orbbec depthai opengv g2o; do
|
||||||
|
if [ -d "$STAGE/$unit/usr/local" ]; then
|
||||||
|
sudo cp -a "$STAGE/$unit/usr/local/." /usr/local/
|
||||||
|
found=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ "$found" != "1" ]; then
|
||||||
|
echo "No staged source dependencies found under $STAGE" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
41
.github/actions/install-macos-source-deps/patches/depthai-2.32.0-hunter-macos.patch
vendored
Normal file
41
.github/actions/install-macos-source-deps/patches/depthai-2.32.0-hunter-macos.patch
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
diff --git a/cmake/depthaiDependencies.cmake b/cmake/depthaiDependencies.cmake
|
||||||
|
index 6b0b44f98..672c26402 100644
|
||||||
|
--- a/cmake/depthaiDependencies.cmake
|
||||||
|
+++ b/cmake/depthaiDependencies.cmake
|
||||||
|
@@ -17,7 +17,9 @@ else()
|
||||||
|
hunter_add_package(FP16)
|
||||||
|
hunter_add_package(libarchive-luxonis)
|
||||||
|
hunter_add_package(spdlog)
|
||||||
|
- hunter_add_package(ZLIB)
|
||||||
|
+ # ZLIB: use the system/Homebrew copy instead of Hunter's (the old pinned
|
||||||
|
+ # zlib fork fails to build against the modern macOS SDK). Found below via
|
||||||
|
+ # the standard FindZLIB module, which provides the same ZLIB::ZLIB target.
|
||||||
|
if(DEPTHAI_ENABLE_BACKWARD)
|
||||||
|
hunter_add_package(Backward)
|
||||||
|
endif()
|
||||||
|
@@ -45,8 +47,23 @@ if(NOT CONFIG_MODE OR (CONFIG_MODE AND NOT DEPTHAI_SHARED_LIBS))
|
||||||
|
# libarchive for firmware packages
|
||||||
|
find_package(archive_static ${_QUIET} CONFIG REQUIRED)
|
||||||
|
find_package(lzma ${_QUIET} CONFIG REQUIRED)
|
||||||
|
- # ZLIB for compressing Apps
|
||||||
|
- find_package(ZLIB CONFIG REQUIRED)
|
||||||
|
+ # ZLIB for compressing Apps.
|
||||||
|
+ # Use the system/Homebrew zlib directly instead of Hunter's: Hunter's pinned
|
||||||
|
+ # zlib fork fails to build against the modern macOS SDK, and Hunter also
|
||||||
|
+ # intercepts find_package(ZLIB) via its own FindZLIB on the module path, so
|
||||||
|
+ # we locate it manually and expose the ZLIB::zlib target depthai expects.
|
||||||
|
+ find_path(SYSTEM_ZLIB_INCLUDE_DIR NAMES zlib.h)
|
||||||
|
+ find_library(SYSTEM_ZLIB_LIBRARY NAMES z)
|
||||||
|
+ if(NOT SYSTEM_ZLIB_INCLUDE_DIR OR NOT SYSTEM_ZLIB_LIBRARY)
|
||||||
|
+ message(FATAL_ERROR "System zlib not found (looked for zlib.h and libz). Install via: brew install zlib")
|
||||||
|
+ endif()
|
||||||
|
+ if(NOT TARGET ZLIB::zlib)
|
||||||
|
+ add_library(ZLIB::zlib UNKNOWN IMPORTED)
|
||||||
|
+ set_target_properties(ZLIB::zlib PROPERTIES
|
||||||
|
+ IMPORTED_LOCATION "${SYSTEM_ZLIB_LIBRARY}"
|
||||||
|
+ INTERFACE_INCLUDE_DIRECTORIES "${SYSTEM_ZLIB_INCLUDE_DIR}"
|
||||||
|
+ )
|
||||||
|
+ endif()
|
||||||
|
|
||||||
|
# spdlog for library and device logging
|
||||||
|
find_package(spdlog ${_QUIET} CONFIG REQUIRED)
|
||||||
83
.github/actions/install-macos-source-deps/patches/gtsam-4.2.1-eigen5.patch
vendored
Normal file
83
.github/actions/install-macos-source-deps/patches/gtsam-4.2.1-eigen5.patch
vendored
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
diff --git a/cmake/HandleEigen.cmake b/cmake/HandleEigen.cmake
|
||||||
|
index b3b4f66b6..651cd1009 100644
|
||||||
|
--- a/cmake/HandleEigen.cmake
|
||||||
|
+++ b/cmake/HandleEigen.cmake
|
||||||
|
@@ -59,7 +59,12 @@ else()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Detect Eigen version:
|
||||||
|
-set(EIGEN_VER_H "${GTSAM_EIGEN_INCLUDE_FOR_BUILD}/Eigen/src/Core/util/Macros.h")
|
||||||
|
+# Since Eigen 5.0.0 the version macros moved from Eigen/src/Core/util/Macros.h
|
||||||
|
+# to a dedicated Eigen/Version header, so check the new location first.
|
||||||
|
+set(EIGEN_VER_H "${GTSAM_EIGEN_INCLUDE_FOR_BUILD}/Eigen/Version")
|
||||||
|
+if (NOT EXISTS ${EIGEN_VER_H})
|
||||||
|
+ set(EIGEN_VER_H "${GTSAM_EIGEN_INCLUDE_FOR_BUILD}/Eigen/src/Core/util/Macros.h")
|
||||||
|
+endif()
|
||||||
|
if (EXISTS ${EIGEN_VER_H})
|
||||||
|
file(READ "${EIGEN_VER_H}" STR_EIGEN_VERSION)
|
||||||
|
|
||||||
|
diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h
|
||||||
|
index cfedf6d8c..9c9771407 100644
|
||||||
|
--- a/gtsam/base/Matrix.h
|
||||||
|
+++ b/gtsam/base/Matrix.h
|
||||||
|
@@ -54,7 +54,7 @@ using Matrix7##N = Eigen::Matrix<double, 7, N>; \
|
||||||
|
using Matrix8##N = Eigen::Matrix<double, 8, N>; \
|
||||||
|
using Matrix9##N = Eigen::Matrix<double, 9, N>; \
|
||||||
|
static const Eigen::MatrixBase<Matrix##N>::IdentityReturnType I_##N##x##N = Matrix##N::Identity(); \
|
||||||
|
-static const Eigen::MatrixBase<Matrix##N>::ConstantReturnType Z_##N##x##N = Matrix##N::Zero();
|
||||||
|
+static const decltype(Matrix##N::Zero()) Z_##N##x##N = Matrix##N::Zero();
|
||||||
|
|
||||||
|
GTSAM_MAKE_MATRIX_DEFS(1)
|
||||||
|
GTSAM_MAKE_MATRIX_DEFS(2)
|
||||||
|
diff --git a/gtsam/base/Vector.h b/gtsam/base/Vector.h
|
||||||
|
index f7923ff88..5410393f6 100644
|
||||||
|
--- a/gtsam/base/Vector.h
|
||||||
|
+++ b/gtsam/base/Vector.h
|
||||||
|
@@ -27,6 +27,7 @@
|
||||||
|
|
||||||
|
#include <gtsam/global_includes.h>
|
||||||
|
#include <Eigen/Core>
|
||||||
|
+#include <cassert>
|
||||||
|
#include <iosfwd>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
@@ -42,14 +43,14 @@ typedef Eigen::Matrix<double, 1, 1> Vector1;
|
||||||
|
typedef Eigen::Vector2d Vector2;
|
||||||
|
typedef Eigen::Vector3d Vector3;
|
||||||
|
|
||||||
|
-static const Eigen::MatrixBase<Vector2>::ConstantReturnType Z_2x1 = Vector2::Zero();
|
||||||
|
-static const Eigen::MatrixBase<Vector3>::ConstantReturnType Z_3x1 = Vector3::Zero();
|
||||||
|
+static const decltype(Vector2::Zero()) Z_2x1 = Vector2::Zero();
|
||||||
|
+static const decltype(Vector3::Zero()) Z_3x1 = Vector3::Zero();
|
||||||
|
|
||||||
|
// Create handy typedefs and constants for vectors with N>3
|
||||||
|
// VectorN and Z_Nx1, for N=1..9
|
||||||
|
#define GTSAM_MAKE_VECTOR_DEFS(N) \
|
||||||
|
using Vector##N = Eigen::Matrix<double, N, 1>; \
|
||||||
|
- static const Eigen::MatrixBase<Vector##N>::ConstantReturnType Z_##N##x1 = Vector##N::Zero();
|
||||||
|
+ static const decltype(Vector##N::Zero()) Z_##N##x1 = Vector##N::Zero();
|
||||||
|
|
||||||
|
GTSAM_MAKE_VECTOR_DEFS(4)
|
||||||
|
GTSAM_MAKE_VECTOR_DEFS(5)
|
||||||
|
diff --git a/gtsam/linear/iterative.h b/gtsam/linear/iterative.h
|
||||||
|
index 22f65b8de..20a0c936e 100644
|
||||||
|
--- a/gtsam/linear/iterative.h
|
||||||
|
+++ b/gtsam/linear/iterative.h
|
||||||
|
@@ -61,7 +61,7 @@ namespace gtsam {
|
||||||
|
|
||||||
|
/** Apply operator A'*e */
|
||||||
|
Vector operator^(const Vector& e) const {
|
||||||
|
- return A_ ^ e;
|
||||||
|
+ return gtsam::operator^(A_, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -71,7 +71,7 @@ namespace gtsam {
|
||||||
|
|
||||||
|
/** gradient of objective function 0.5*|Ax-b_|^2 at x = A_'*(Ax-b_) */
|
||||||
|
Vector gradient(const Vector& x) const {
|
||||||
|
- return A() ^ (A() * x - b());
|
||||||
|
+ return gtsam::operator^(A(), Vector(A() * x - b()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Apply operator A */
|
||||||
87
.github/actions/install-macos-source-deps/patches/libnabo-1.1.2.patch
vendored
Normal file
87
.github/actions/install-macos-source-deps/patches/libnabo-1.1.2.patch
vendored
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index a5f0c44..69340e4 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -78,18 +78,18 @@ elseif ()
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
-# enable C++11 support.
|
||||||
|
+# enable C++14 support (required by recent Eigen versions).
|
||||||
|
if (CMAKE_VERSION VERSION_LESS "3.1")
|
||||||
|
if (MSVC)
|
||||||
|
message(FATAL_ERROR "CMake version 3.1 or later is required to compile ${PROJECT_NAME} with Microsoft Visual C++")
|
||||||
|
endif ()
|
||||||
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
|
- set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
|
||||||
|
+ set (CMAKE_CXX_FLAGS "-std=c++14 ${CMAKE_CXX_FLAGS}")
|
||||||
|
else ()
|
||||||
|
- set (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
|
||||||
|
+ set (CMAKE_CXX_FLAGS "-std=c++14 ${CMAKE_CXX_FLAGS}")
|
||||||
|
endif ()
|
||||||
|
else ()
|
||||||
|
- set (CMAKE_CXX_STANDARD 11)
|
||||||
|
+ set (CMAKE_CXX_STANDARD 14)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
#======================== External Dependencies ===============================
|
||||||
|
diff --git a/experimental/kdtree_cpu.cpp b/experimental/kdtree_cpu.cpp
|
||||||
|
index 302b672..d63fcd3 100644
|
||||||
|
--- a/experimental/kdtree_cpu.cpp
|
||||||
|
+++ b/experimental/kdtree_cpu.cpp
|
||||||
|
@@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#include "nabo_experimental.h"
|
||||||
|
#include "../nabo/index_heap.h"
|
||||||
|
+#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <limits>
|
||||||
|
diff --git a/nabo/kdtree_cpu.cpp b/nabo/kdtree_cpu.cpp
|
||||||
|
index cb1f8d1..52a444f 100644
|
||||||
|
--- a/nabo/kdtree_cpu.cpp
|
||||||
|
+++ b/nabo/kdtree_cpu.cpp
|
||||||
|
@@ -37,6 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#include <queue>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <utility>
|
||||||
|
+#include <cassert>
|
||||||
|
#ifdef HAVE_OPENMP
|
||||||
|
#include <omp.h>
|
||||||
|
#endif
|
||||||
|
diff --git a/nabo/kdtree_opencl.cpp b/nabo/kdtree_opencl.cpp
|
||||||
|
index 5a9fee2..fb1345f 100644
|
||||||
|
--- a/nabo/kdtree_opencl.cpp
|
||||||
|
+++ b/nabo/kdtree_opencl.cpp
|
||||||
|
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#include "nabo_private.h"
|
||||||
|
#include "index_heap.h"
|
||||||
|
+#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <fstream>
|
||||||
|
diff --git a/tests/knnshow.cpp b/tests/knnshow.cpp
|
||||||
|
index 6f4d3fc..c612378 100644
|
||||||
|
--- a/tests/knnshow.cpp
|
||||||
|
+++ b/tests/knnshow.cpp
|
||||||
|
@@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nabo/nabo.h"
|
||||||
|
+#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <stdexcept>
|
||||||
|
diff --git a/tests/knnvalidate.cpp b/tests/knnvalidate.cpp
|
||||||
|
index 2430249..2a7dcc4 100644
|
||||||
|
--- a/tests/knnvalidate.cpp
|
||||||
|
+++ b/tests/knnvalidate.cpp
|
||||||
|
@@ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#include "nabo/nabo.h"
|
||||||
|
#include "helpers.h"
|
||||||
|
//#include "experimental/nabo_experimental.h"
|
||||||
|
+#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <stdexcept>
|
||||||
32
.github/actions/install-macos-source-deps/patches/libpointmatcher-1.4.4-boost.patch
vendored
Normal file
32
.github/actions/install-macos-source-deps/patches/libpointmatcher-1.4.4-boost.patch
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index 9dabfd0..7b73418 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -128,9 +128,9 @@ endif()
|
||||||
|
#--------------------
|
||||||
|
# DEPENDENCY: boost
|
||||||
|
#--------------------
|
||||||
|
-find_package(Boost REQUIRED COMPONENTS thread system program_options date_time)
|
||||||
|
+find_package(Boost REQUIRED COMPONENTS thread program_options date_time)
|
||||||
|
if (Boost_MINOR_VERSION GREATER 47)
|
||||||
|
- find_package(Boost REQUIRED COMPONENTS thread system program_options date_time chrono)
|
||||||
|
+ find_package(Boost REQUIRED COMPONENTS thread program_options date_time chrono)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
#--------------------
|
||||||
|
diff --git a/libpointmatcherConfig.cmake.in b/libpointmatcherConfig.cmake.in
|
||||||
|
index 6de2c85..7c887fd 100644
|
||||||
|
--- a/libpointmatcherConfig.cmake.in
|
||||||
|
+++ b/libpointmatcherConfig.cmake.in
|
||||||
|
@@ -7,9 +7,9 @@
|
||||||
|
include(CMakeFindDependencyMacro)
|
||||||
|
find_dependency(libnabo REQUIRED)
|
||||||
|
find_dependency(yaml-cpp REQUIRED)
|
||||||
|
-find_package(Boost COMPONENTS thread system program_options date_time REQUIRED)
|
||||||
|
+find_package(Boost COMPONENTS thread program_options date_time REQUIRED)
|
||||||
|
if (Boost_MINOR_VERSION GREATER 47)
|
||||||
|
- find_package(Boost COMPONENTS thread system program_options date_time chrono REQUIRED)
|
||||||
|
+ find_package(Boost COMPONENTS thread program_options date_time chrono REQUIRED)
|
||||||
|
endif ()
|
||||||
|
include(${CMAKE_CURRENT_LIST_DIR}/libpointmatcher-config.cmake)
|
||||||
|
|
||||||
309
.github/actions/install-macos-source-deps/patches/opengv-91f4b19c-macos.patch
vendored
Normal file
309
.github/actions/install-macos-source-deps/patches/opengv-91f4b19c-macos.patch
vendored
Normal file
@@ -0,0 +1,309 @@
|
|||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index 9660f55..0186da4 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -31,12 +31,12 @@ IF(MSVC)
|
||||||
|
add_definitions(-D_USE_MATH_DEFINES)
|
||||||
|
ELSE()
|
||||||
|
IF (CMAKE_SYSTEM_PROCESSOR MATCHES "(arm64)|(ARM64)|(aarch64)|(AARCH64)")
|
||||||
|
- add_definitions (-march=armv8-a)
|
||||||
|
+ #add_definitions (-march=armv8-a)
|
||||||
|
ELSEIF (CMAKE_SYSTEM_PROCESSOR MATCHES
|
||||||
|
"(arm)|(ARM)|(armhf)|(ARMHF)|(armel)|(ARMEL)")
|
||||||
|
- add_definitions (-march=armv7-a)
|
||||||
|
+ #add_definitions (-march=armv7-a)
|
||||||
|
ELSE ()
|
||||||
|
- add_definitions (-march=native) #TODO use correct c++11 def once everybody has moved to gcc 4.7 # for now I even removed std=gnu++0x
|
||||||
|
+ #add_definitions (-march=native) #TODO use correct c++11 def once everybody has moved to gcc 4.7 # for now I even removed std=gnu++0x
|
||||||
|
ENDIF()
|
||||||
|
add_definitions (
|
||||||
|
-O3
|
||||||
|
@@ -181,7 +181,7 @@ add_library( random_generators test/random_generators.cpp test/random_generators
|
||||||
|
set_target_properties( opengv random_generators PROPERTIES
|
||||||
|
SOVERSION ${PROJECT_VERSION}
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
- CXX_STANDARD 11
|
||||||
|
+ CXX_STANDARD 14
|
||||||
|
CXX_STANDARD_REQUIRED ON
|
||||||
|
DEBUG_POSTFIX d )
|
||||||
|
|
||||||
|
@@ -329,7 +329,7 @@ IF (BUILD_TESTS)
|
||||||
|
test_Sturm
|
||||||
|
|
||||||
|
PROPERTIES
|
||||||
|
- CXX_STANDARD 11
|
||||||
|
+ CXX_STANDARD 14
|
||||||
|
CXX_STANDARD_REQUIRED ON
|
||||||
|
DEBUG_POSTFIX d )
|
||||||
|
|
||||||
|
diff --git a/modules/FindEigen.cmake b/modules/FindEigen.cmake
|
||||||
|
index 126f4a0..39b5524 100644
|
||||||
|
--- a/modules/FindEigen.cmake
|
||||||
|
+++ b/modules/FindEigen.cmake
|
||||||
|
@@ -30,7 +30,13 @@ if(NOT Eigen_FIND_VERSION)
|
||||||
|
endif(NOT Eigen_FIND_VERSION)
|
||||||
|
|
||||||
|
macro(_eigen3_check_version)
|
||||||
|
- file(READ "${EIGEN_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
|
||||||
|
+ # Since Eigen 5.0.0 the version macros moved from Eigen/src/Core/util/Macros.h
|
||||||
|
+ # to a dedicated Eigen/Version header, so check the new location first.
|
||||||
|
+ if(EXISTS "${EIGEN_INCLUDE_DIR}/Eigen/Version")
|
||||||
|
+ file(READ "${EIGEN_INCLUDE_DIR}/Eigen/Version" _eigen3_version_header)
|
||||||
|
+ else()
|
||||||
|
+ file(READ "${EIGEN_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
|
||||||
|
+ endif()
|
||||||
|
|
||||||
|
string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
|
||||||
|
set(EIGEN_WORLD_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
diff --git a/src/absolute_pose/CentralAbsoluteAdapter.cpp b/src/absolute_pose/CentralAbsoluteAdapter.cpp
|
||||||
|
index 684fa7e..a4ff2bd 100644
|
||||||
|
--- a/src/absolute_pose/CentralAbsoluteAdapter.cpp
|
||||||
|
+++ b/src/absolute_pose/CentralAbsoluteAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/CentralAbsoluteAdapter.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/absolute_pose/MACentralAbsolute.cpp b/src/absolute_pose/MACentralAbsolute.cpp
|
||||||
|
index 6edbabc..1687d45 100644
|
||||||
|
--- a/src/absolute_pose/MACentralAbsolute.cpp
|
||||||
|
+++ b/src/absolute_pose/MACentralAbsolute.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/MACentralAbsolute.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/absolute_pose/MANoncentralAbsolute.cpp b/src/absolute_pose/MANoncentralAbsolute.cpp
|
||||||
|
index d9b5b09..a7ae689 100644
|
||||||
|
--- a/src/absolute_pose/MANoncentralAbsolute.cpp
|
||||||
|
+++ b/src/absolute_pose/MANoncentralAbsolute.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/MANoncentralAbsolute.hpp>
|
||||||
|
|
||||||
|
opengv::absolute_pose::MANoncentralAbsolute::MANoncentralAbsolute(
|
||||||
|
diff --git a/src/absolute_pose/NoncentralAbsoluteAdapter.cpp b/src/absolute_pose/NoncentralAbsoluteAdapter.cpp
|
||||||
|
index 30176aa..6a0e405 100644
|
||||||
|
--- a/src/absolute_pose/NoncentralAbsoluteAdapter.cpp
|
||||||
|
+++ b/src/absolute_pose/NoncentralAbsoluteAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/NoncentralAbsoluteAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::absolute_pose::NoncentralAbsoluteAdapter::NoncentralAbsoluteAdapter(
|
||||||
|
diff --git a/src/absolute_pose/NoncentralAbsoluteMultiAdapter.cpp b/src/absolute_pose/NoncentralAbsoluteMultiAdapter.cpp
|
||||||
|
index 88c237a..58a82f4 100644
|
||||||
|
--- a/src/absolute_pose/NoncentralAbsoluteMultiAdapter.cpp
|
||||||
|
+++ b/src/absolute_pose/NoncentralAbsoluteMultiAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/NoncentralAbsoluteMultiAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::absolute_pose::NoncentralAbsoluteMultiAdapter::NoncentralAbsoluteMultiAdapter(
|
||||||
|
diff --git a/src/absolute_pose/methods.cpp b/src/absolute_pose/methods.cpp
|
||||||
|
index b1f0889..19c4eaf 100644
|
||||||
|
--- a/src/absolute_pose/methods.cpp
|
||||||
|
+++ b/src/absolute_pose/methods.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/absolute_pose/methods.hpp>
|
||||||
|
#include <opengv/Indices.hpp>
|
||||||
|
|
||||||
|
diff --git a/src/absolute_pose/modules/main.cpp b/src/absolute_pose/modules/main.cpp
|
||||||
|
index ed0c271..99f7f35 100644
|
||||||
|
--- a/src/absolute_pose/modules/main.cpp
|
||||||
|
+++ b/src/absolute_pose/modules/main.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <Eigen/NonLinearOptimization>
|
||||||
|
#include <Eigen/NumericalDiff>
|
||||||
|
|
||||||
|
diff --git a/src/math/arun.cpp b/src/math/arun.cpp
|
||||||
|
index a0d6296..f5c0ac3 100644
|
||||||
|
--- a/src/math/arun.cpp
|
||||||
|
+++ b/src/math/arun.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/math/arun.hpp>
|
||||||
|
|
||||||
|
opengv::rotation_t
|
||||||
|
diff --git a/src/point_cloud/MAPointCloud.cpp b/src/point_cloud/MAPointCloud.cpp
|
||||||
|
index 81fd5dd..cdccae3 100644
|
||||||
|
--- a/src/point_cloud/MAPointCloud.cpp
|
||||||
|
+++ b/src/point_cloud/MAPointCloud.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/point_cloud/MAPointCloud.hpp>
|
||||||
|
|
||||||
|
opengv::point_cloud::MAPointCloud::MAPointCloud(
|
||||||
|
diff --git a/src/point_cloud/PointCloudAdapter.cpp b/src/point_cloud/PointCloudAdapter.cpp
|
||||||
|
index f9faaeb..28fbb7e 100644
|
||||||
|
--- a/src/point_cloud/PointCloudAdapter.cpp
|
||||||
|
+++ b/src/point_cloud/PointCloudAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/point_cloud/PointCloudAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::point_cloud::PointCloudAdapter::PointCloudAdapter(
|
||||||
|
diff --git a/src/point_cloud/methods.cpp b/src/point_cloud/methods.cpp
|
||||||
|
index 5409eeb..7a26e6a 100644
|
||||||
|
--- a/src/point_cloud/methods.cpp
|
||||||
|
+++ b/src/point_cloud/methods.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/point_cloud/methods.hpp>
|
||||||
|
#include <opengv/Indices.hpp>
|
||||||
|
|
||||||
|
diff --git a/src/relative_pose/CentralRelativeAdapter.cpp b/src/relative_pose/CentralRelativeAdapter.cpp
|
||||||
|
index 38e9a62..5018bd8 100644
|
||||||
|
--- a/src/relative_pose/CentralRelativeAdapter.cpp
|
||||||
|
+++ b/src/relative_pose/CentralRelativeAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/CentralRelativeAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::CentralRelativeAdapter::CentralRelativeAdapter(
|
||||||
|
diff --git a/src/relative_pose/CentralRelativeMultiAdapter.cpp b/src/relative_pose/CentralRelativeMultiAdapter.cpp
|
||||||
|
index 2ab7476..49a3a07 100644
|
||||||
|
--- a/src/relative_pose/CentralRelativeMultiAdapter.cpp
|
||||||
|
+++ b/src/relative_pose/CentralRelativeMultiAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/CentralRelativeMultiAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::CentralRelativeMultiAdapter::CentralRelativeMultiAdapter(
|
||||||
|
diff --git a/src/relative_pose/CentralRelativeWeightingAdapter.cpp b/src/relative_pose/CentralRelativeWeightingAdapter.cpp
|
||||||
|
index a6ab478..7684526 100644
|
||||||
|
--- a/src/relative_pose/CentralRelativeWeightingAdapter.cpp
|
||||||
|
+++ b/src/relative_pose/CentralRelativeWeightingAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/CentralRelativeWeightingAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::CentralRelativeWeightingAdapter::CentralRelativeWeightingAdapter(
|
||||||
|
diff --git a/src/relative_pose/MACentralRelative.cpp b/src/relative_pose/MACentralRelative.cpp
|
||||||
|
index ec2959f..75e76d5 100644
|
||||||
|
--- a/src/relative_pose/MACentralRelative.cpp
|
||||||
|
+++ b/src/relative_pose/MACentralRelative.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/MACentralRelative.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::MACentralRelative::MACentralRelative(
|
||||||
|
diff --git a/src/relative_pose/MANoncentralRelative.cpp b/src/relative_pose/MANoncentralRelative.cpp
|
||||||
|
index cea9c14..8566aeb 100644
|
||||||
|
--- a/src/relative_pose/MANoncentralRelative.cpp
|
||||||
|
+++ b/src/relative_pose/MANoncentralRelative.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/MANoncentralRelative.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::MANoncentralRelative::MANoncentralRelative(
|
||||||
|
diff --git a/src/relative_pose/MANoncentralRelativeMulti.cpp b/src/relative_pose/MANoncentralRelativeMulti.cpp
|
||||||
|
index 49f8ecf..8b62e07 100644
|
||||||
|
--- a/src/relative_pose/MANoncentralRelativeMulti.cpp
|
||||||
|
+++ b/src/relative_pose/MANoncentralRelativeMulti.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/MANoncentralRelativeMulti.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::MANoncentralRelativeMulti::MANoncentralRelativeMulti(
|
||||||
|
diff --git a/src/relative_pose/NoncentralRelativeAdapter.cpp b/src/relative_pose/NoncentralRelativeAdapter.cpp
|
||||||
|
index 552f180..775d520 100644
|
||||||
|
--- a/src/relative_pose/NoncentralRelativeAdapter.cpp
|
||||||
|
+++ b/src/relative_pose/NoncentralRelativeAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/NoncentralRelativeAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::NoncentralRelativeAdapter::NoncentralRelativeAdapter(
|
||||||
|
diff --git a/src/relative_pose/NoncentralRelativeMultiAdapter.cpp b/src/relative_pose/NoncentralRelativeMultiAdapter.cpp
|
||||||
|
index f41edbe..733023c 100644
|
||||||
|
--- a/src/relative_pose/NoncentralRelativeMultiAdapter.cpp
|
||||||
|
+++ b/src/relative_pose/NoncentralRelativeMultiAdapter.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/NoncentralRelativeMultiAdapter.hpp>
|
||||||
|
|
||||||
|
opengv::relative_pose::NoncentralRelativeMultiAdapter::NoncentralRelativeMultiAdapter(
|
||||||
|
diff --git a/src/relative_pose/methods.cpp b/src/relative_pose/methods.cpp
|
||||||
|
index 0027dae..7678567 100644
|
||||||
|
--- a/src/relative_pose/methods.cpp
|
||||||
|
+++ b/src/relative_pose/methods.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/methods.hpp>
|
||||||
|
#include <opengv/Indices.hpp>
|
||||||
|
|
||||||
|
diff --git a/src/relative_pose/modules/fivept_nister/modules.cpp b/src/relative_pose/modules/fivept_nister/modules.cpp
|
||||||
|
index 4b134c5..258d416 100644
|
||||||
|
--- a/src/relative_pose/modules/fivept_nister/modules.cpp
|
||||||
|
+++ b/src/relative_pose/modules/fivept_nister/modules.cpp
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
+#include <cassert>
|
||||||
|
#include <opengv/relative_pose/modules/fivept_nister/modules.hpp>
|
||||||
|
#include <Eigen/NonLinearOptimization>
|
||||||
|
#include <Eigen/NumericalDiff>
|
||||||
29
.github/actions/install-macos-source-deps/patches/orbbecsdk-2.8.7-cmake-config-install.patch
vendored
Normal file
29
.github/actions/install-macos-source-deps/patches/orbbecsdk-2.8.7-cmake-config-install.patch
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
|
||||||
|
index 261f2cda..644e068f 100644
|
||||||
|
--- a/src/CMakeLists.txt
|
||||||
|
+++ b/src/CMakeLists.txt
|
||||||
|
@@ -92,17 +92,20 @@ if(OB_IS_MAIN_PROJECT)
|
||||||
|
)
|
||||||
|
|
||||||
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/generated/Export.h" DESTINATION include/libobsensor/h)
|
||||||
|
- install(EXPORT ${OB_SDK_LIB_NAME}Config NAMESPACE ob:: DESTINATION lib)
|
||||||
|
+ install(EXPORT ${OB_SDK_LIB_NAME}Config NAMESPACE ob:: DESTINATION lib/cmake/${OB_SDK_LIB_NAME})
|
||||||
|
|
||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
+ # Name the version file <pkg>ConfigVersion.cmake (not <pkg>Version.cmake) and
|
||||||
|
+ # install it next to the config in lib/cmake/<pkg>, so find_package(OrbbecSDK)
|
||||||
|
+ # discovers it in config mode and reads its version.
|
||||||
|
write_basic_package_version_file(
|
||||||
|
- "${CMAKE_CURRENT_BINARY_DIR}/${OB_SDK_LIB_NAME}Version.cmake"
|
||||||
|
+ "${CMAKE_CURRENT_BINARY_DIR}/${OB_SDK_LIB_NAME}ConfigVersion.cmake"
|
||||||
|
VERSION "${PROJECT_VERSION}"
|
||||||
|
COMPATIBILITY SameMajorVersion
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
- FILES "${CMAKE_CURRENT_BINARY_DIR}/${OB_SDK_LIB_NAME}Version.cmake"
|
||||||
|
- DESTINATION lib
|
||||||
|
+ FILES "${CMAKE_CURRENT_BINARY_DIR}/${OB_SDK_LIB_NAME}ConfigVersion.cmake"
|
||||||
|
+ DESTINATION lib/cmake/${OB_SDK_LIB_NAME}
|
||||||
|
)
|
||||||
|
if(MSVC)
|
||||||
|
install(FILES $<TARGET_PDB_FILE:${OB_SDK_LIB_NAME}> DESTINATION bin OPTIONAL)
|
||||||
70
.github/actions/install-windows-cuda-deps/action.yml
vendored
Normal file
70
.github/actions/install-windows-cuda-deps/action.yml
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
name: 'Install Windows Dependencies with CUDA'
|
||||||
|
description: 'Installs PCL, Qt, VTK, g2o and others'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Set up MSVC Developer Command Prompt
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
with:
|
||||||
|
arch: x64
|
||||||
|
|
||||||
|
- name: Install CUDA
|
||||||
|
uses: Jimver/cuda-toolkit@v0.2.30
|
||||||
|
id: cuda-toolkit
|
||||||
|
with:
|
||||||
|
cuda: '13.0.0'
|
||||||
|
use-github-cache: True
|
||||||
|
|
||||||
|
- name: Verify CUDA
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
nvcc --version
|
||||||
|
echo "CUDA Path: $CUDA_PATH"
|
||||||
|
|
||||||
|
- name: Cache vcpkg
|
||||||
|
id: cache-vcpkg
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.workspace }}/vcpkg_installed
|
||||||
|
key: ${{ runner.os }}-vcpkg-export-66c0373d-x64-vs2022-cuda130_v5
|
||||||
|
|
||||||
|
- name: Download and Install vcpkg
|
||||||
|
if: steps.cache-vcpkg.outputs.cache-hit != 'true'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$install_dir = "${{ runner.workspace }}\vcpkg_installed"
|
||||||
|
$archivePath = "${{ runner.workspace }}\vcpkg-export.7z"
|
||||||
|
|
||||||
|
# The 7z is built locally with bundle_windows_deps_cuda.bat and uploaded to a
|
||||||
|
# GitHub release. Resolve it by filename via the API (authenticated with the
|
||||||
|
# built-in token) so it works even from a *draft* release and regardless of
|
||||||
|
# the (changing) asset id. Requires the workflow to run in-repo (github.token
|
||||||
|
# can't read introlab drafts from a fork PR).
|
||||||
|
$repo = "introlab/rtabmap"
|
||||||
|
$releaseTag = "0.23.8"
|
||||||
|
$assetName = "vcpkg-export-66c0373d-x64-vs2022-cuda130.7z"
|
||||||
|
$apiHeaders = @{ Authorization = "Bearer ${{ github.token }}"; "User-Agent" = "rtabmap-ci"; Accept = "application/vnd.github+json" }
|
||||||
|
# Select the release by tag_name (populated on drafts too, and unique), then
|
||||||
|
# take the asset from THAT release so concurrent releases can't be confused.
|
||||||
|
$rel = (Invoke-RestMethod -Uri "https://api.github.com/repos/$repo/releases?per_page=100" -Headers $apiHeaders) |
|
||||||
|
Where-Object { $_.tag_name -eq $releaseTag } | Select-Object -First 1
|
||||||
|
if (-not $rel) { throw "Release tagged $releaseTag not found (including drafts)" }
|
||||||
|
$asset = $rel.assets | Where-Object { $_.name -eq $assetName } | Select-Object -First 1
|
||||||
|
if (-not $asset) { throw "Asset $assetName not found in release $releaseTag" }
|
||||||
|
Write-Host "Downloading $assetName (asset id $($asset.id)) ..."
|
||||||
|
$dlHeaders = @{ Authorization = "Bearer ${{ github.token }}"; "User-Agent" = "rtabmap-ci"; Accept = "application/octet-stream" }
|
||||||
|
Invoke-WebRequest -Uri $asset.url -Headers $dlHeaders -OutFile $archivePath
|
||||||
|
& 7z x $archivePath "-o$install_dir" -y
|
||||||
|
|
||||||
|
- name: Add vcpkg to PATH and env variable
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$vcpkg_path = "${{ runner.workspace }}\vcpkg_installed"
|
||||||
|
echo "VCPKG_EXPORT_PATH=$vcpkg_path" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
# K4A runtime DLLs (k4a.dll, k4arecord.dll) live in the SDK bin; needed on PATH so fixup_bundle resolves them at package time.
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\sdk\windows-desktop\amd64\release\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "${{env.CUDA_PATH}}\bin\x64" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "${{env.CUDA_PATH}}\extras\CUPTI\lib64" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\tools\python3\Lib\site-packages\torch\lib" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\tools\python3\Lib\site-packages\numpy.libs" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
54
.github/actions/install-windows-deps/action.yml
vendored
Normal file
54
.github/actions/install-windows-deps/action.yml
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
name: 'Install Windows Dependencies'
|
||||||
|
description: 'Installs PCL, Qt, VTK, g2o and others'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Set up MSVC Developer Command Prompt
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
with:
|
||||||
|
arch: x64
|
||||||
|
|
||||||
|
- name: Cache vcpkg
|
||||||
|
id: cache-vcpkg
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ runner.workspace }}/vcpkg_installed
|
||||||
|
key: ${{ runner.os }}-vcpkg-export-66c0373d-x64-vs2022-v7
|
||||||
|
|
||||||
|
- name: Download and Install vcpkg
|
||||||
|
if: steps.cache-vcpkg.outputs.cache-hit != 'true'
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$install_dir = "${{ runner.workspace }}\vcpkg_installed"
|
||||||
|
$archivePath = "${{ runner.workspace }}\vcpkg-export.7z"
|
||||||
|
|
||||||
|
# The 7z is built locally with bundle_windows_deps.bat and uploaded to a
|
||||||
|
# GitHub release. Resolve it by filename via the API (authenticated with the
|
||||||
|
# built-in token) so it works even from a *draft* release and regardless of
|
||||||
|
# the (changing) asset id. Requires the workflow to run in-repo (github.token
|
||||||
|
# can't read introlab drafts from a fork PR).
|
||||||
|
$repo = "introlab/rtabmap"
|
||||||
|
$releaseTag = "0.23.8"
|
||||||
|
$assetName = "vcpkg-export-66c0373d-x64-vs2022.7z"
|
||||||
|
$apiHeaders = @{ Authorization = "Bearer ${{ github.token }}"; "User-Agent" = "rtabmap-ci"; Accept = "application/vnd.github+json" }
|
||||||
|
# Select the release by tag_name (populated on drafts too, and unique), then
|
||||||
|
# take the asset from THAT release so concurrent releases can't be confused.
|
||||||
|
$rel = (Invoke-RestMethod -Uri "https://api.github.com/repos/$repo/releases?per_page=100" -Headers $apiHeaders) |
|
||||||
|
Where-Object { $_.tag_name -eq $releaseTag } | Select-Object -First 1
|
||||||
|
if (-not $rel) { throw "Release tagged $releaseTag not found (including drafts)" }
|
||||||
|
$asset = $rel.assets | Where-Object { $_.name -eq $assetName } | Select-Object -First 1
|
||||||
|
if (-not $asset) { throw "Asset $assetName not found in release $releaseTag" }
|
||||||
|
Write-Host "Downloading $assetName (asset id $($asset.id)) ..."
|
||||||
|
$dlHeaders = @{ Authorization = "Bearer ${{ github.token }}"; "User-Agent" = "rtabmap-ci"; Accept = "application/octet-stream" }
|
||||||
|
Invoke-WebRequest -Uri $asset.url -Headers $dlHeaders -OutFile $archivePath
|
||||||
|
& 7z x $archivePath "-o$install_dir" -y
|
||||||
|
|
||||||
|
- name: Add vcpkg to PATH and env variable
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$vcpkg_path = "${{ runner.workspace }}\vcpkg_installed"
|
||||||
|
echo "VCPKG_EXPORT_PATH=$vcpkg_path" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
# K4A runtime DLLs (k4a.dll, k4arecord.dll) live in the SDK bin; needed on PATH so fixup_bundle resolves them at package time.
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\sdk\windows-desktop\amd64\release\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "$vcpkg_path\installed\x64-windows-release\tools\python3\Lib\site-packages\numpy.libs" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
19
.github/scripts/ros-deps-env.sh
vendored
Normal file
19
.github/scripts/ros-deps-env.sh
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Puts the graph optimizers taken from the ROS 2 repo (see cmake-linux.yml) on
|
||||||
|
# the loader path, for a shell that is about to run something built against
|
||||||
|
# them. Sourced, not executed: it exports into the caller.
|
||||||
|
#
|
||||||
|
# source .github/scripts/ros-deps-env.sh /opt/ros/humble
|
||||||
|
#
|
||||||
|
# A missing or empty prefix is a build that took every dependency from the
|
||||||
|
# Ubuntu archive: nothing to add.
|
||||||
|
#
|
||||||
|
# Both directories are needed. GTSAM and g2o install their libraries in the
|
||||||
|
# multiarch subdirectory, while the prefix's own lib/ holds the rest, and
|
||||||
|
# libgtsam.so carries no RUNPATH -- so the loader finds neither it nor the
|
||||||
|
# libmetis-gtsam.so it pulls in without being told where to look.
|
||||||
|
ros_prefix="${1:-}"
|
||||||
|
if [ -n "$ros_prefix" ] && [ -d "$ros_prefix" ]; then
|
||||||
|
ros_lib="$ros_prefix/lib"
|
||||||
|
export LD_LIBRARY_PATH="${ros_lib}:${ros_lib}/$(gcc -dumpmachine)${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
||||||
|
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
|
||||||
|
fi
|
||||||
15
.github/workflows/cleanup-pr-artifacts.yml
vendored
Normal file
15
.github/workflows/cleanup-pr-artifacts.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
name: Cleanup PR Artifacts
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [closed]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
delete-artifacts:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: write
|
||||||
|
steps:
|
||||||
|
- name: Delete PR Artifacts
|
||||||
|
uses: geekyeggo/delete-artifact@v5
|
||||||
|
with:
|
||||||
|
name: build-output-*
|
||||||
214
.github/workflows/cmake-linux.yml
vendored
Normal file
214
.github/workflows/cmake-linux.yml
vendored
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
name: CMake-Linux
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: ${{ matrix.build_name }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.build_name }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
build_name: [ubuntu-22.04, ubuntu-24.04, ubuntu-24.04-with-opengv, ubuntu-26.04]
|
||||||
|
include:
|
||||||
|
# GTSAM is in no Ubuntu release, and libg2o-dev only appears in the
|
||||||
|
# archive from noble on (jammy has no g2o at all).
|
||||||
|
#
|
||||||
|
# 26.04 builds GTSAM itself (gtsam_ref) rather than taking it from the
|
||||||
|
# ROS repo: that runner is on Ubuntu's amd64v3 variant, so rtabmap and
|
||||||
|
# the archive libraries are AVX builds where Eigen aligns to 32, while
|
||||||
|
# the ROS binary is plain x86-64 where it aligns to 16 and uses plain
|
||||||
|
# malloc/free. Allocating on one side and freeing on the other gives
|
||||||
|
# "double free or corruption (out)". Forcing EIGEN_MAX_ALIGN_BYTES=16
|
||||||
|
# on rtabmap would only move the mismatch onto PCL, g2o and Ceres.
|
||||||
|
- build_name: ubuntu-22.04
|
||||||
|
os: ubuntu-22.04
|
||||||
|
extra_deps: "libunwind-dev libceres-dev"
|
||||||
|
ros_deps: "ros-humble-libg2o ros-humble-gtsam"
|
||||||
|
ros_prefix: "/opt/ros/humble"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON -DWITH_G2O=ON -DWITH_GTSAM=ON"
|
||||||
|
- build_name: ubuntu-24.04
|
||||||
|
os: ubuntu-24.04
|
||||||
|
extra_deps: "libg2o-dev libceres-dev"
|
||||||
|
ros_deps: "ros-jazzy-gtsam"
|
||||||
|
ros_prefix: "/opt/ros/jazzy"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON -DWITH_G2O=ON -DWITH_GTSAM=ON"
|
||||||
|
- build_name: ubuntu-24.04-with-opengv
|
||||||
|
os: ubuntu-24.04
|
||||||
|
extra_deps: "libg2o-dev libceres-dev"
|
||||||
|
ros_deps: "ros-jazzy-gtsam"
|
||||||
|
ros_prefix: "/opt/ros/jazzy"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON -DWITH_G2O=ON -DWITH_GTSAM=ON -DBUILD_OPENGV=ON"
|
||||||
|
- build_name: ubuntu-26.04
|
||||||
|
os: ubuntu-26.04
|
||||||
|
# libboost-all-dev for the GTSAM build
|
||||||
|
extra_deps: "libg2o-dev libceres-dev libboost-all-dev"
|
||||||
|
ros_deps: ""
|
||||||
|
ros_prefix: ""
|
||||||
|
# The tag ros-lyrical-gtsam 4.3.0 is built from
|
||||||
|
gtsam_ref: "4.3a0-ros"
|
||||||
|
extra_cmake_def: "-DWITH_CERES=ON -DWITH_PYTHON=ON -DWITH_G2O=ON -DWITH_GTSAM=ON -DBUILD_OPENGV=ON"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Restore test data
|
||||||
|
id: cache-testdata
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
# SQLite DBs are binary-portable -> share the cache across
|
||||||
|
# linux / macos / windows. Key omits runner.os on purpose so all
|
||||||
|
# three OSes hit the same entry.
|
||||||
|
path: data/tests/*.db
|
||||||
|
key: testdata-${{ hashFiles('data/tests/manifest.txt') }}
|
||||||
|
|
||||||
|
- name: Fetch test data
|
||||||
|
if: steps.cache-testdata.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: bash scripts/fetch_test_data.sh
|
||||||
|
|
||||||
|
- name: Install Linux Dependencies
|
||||||
|
run: |
|
||||||
|
DEBIAN_FRONTEND=noninteractive
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get -y install libopencv-dev libpcl-dev git cmake software-properties-common libyaml-cpp-dev curl gnupg lsb-release ${{ matrix.extra_deps }}
|
||||||
|
|
||||||
|
- name: Install Graph Optimizers From The ROS Repo
|
||||||
|
if: matrix.ros_deps != ''
|
||||||
|
env:
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
run: |
|
||||||
|
sudo curl -fsSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
|
||||||
|
-o /usr/share/keyrings/ros-archive-keyring.gpg
|
||||||
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" \
|
||||||
|
| sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get -y install ${{ matrix.ros_deps }}
|
||||||
|
|
||||||
|
# The compiler's x86-64 baseline, for the cache key: it decides Eigen's
|
||||||
|
# alignment, so a GTSAM built under one must not be restored under the
|
||||||
|
# other. v3 packages still declare Architecture: amd64, so dpkg cannot tell.
|
||||||
|
- name: Toolchain baseline
|
||||||
|
if: matrix.gtsam_ref != ''
|
||||||
|
id: toolchain
|
||||||
|
run: |
|
||||||
|
avx=$(echo | gcc -dM -E -x c++ - | grep -c __AVX__ || true)
|
||||||
|
echo "gcc $(gcc -dumpversion), __AVX__=$avx"
|
||||||
|
echo "id=gcc$(gcc -dumpversion)-avx${avx}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Restore GTSAM
|
||||||
|
if: matrix.gtsam_ref != ''
|
||||||
|
id: cache-gtsam
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{github.workspace}}/gtsam-install
|
||||||
|
key: gtsam-${{ matrix.gtsam_ref }}-${{ matrix.os }}-${{ steps.toolchain.outputs.id }}
|
||||||
|
|
||||||
|
- name: Build GTSAM
|
||||||
|
if: matrix.gtsam_ref != '' && steps.cache-gtsam.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
git clone --depth 1 --branch ${{ matrix.gtsam_ref }} https://github.com/borglab/gtsam.git ${{runner.temp}}/gtsam-src
|
||||||
|
# Tag-specific fixes, named after the tag.
|
||||||
|
patch_file="${{github.workspace}}/patches/gtsam_$(echo '${{ matrix.gtsam_ref }}' | tr '.' '_').patch"
|
||||||
|
if [ -f "$patch_file" ]; then
|
||||||
|
echo "Applying $patch_file"
|
||||||
|
git -C ${{runner.temp}}/gtsam-src apply "$patch_file"
|
||||||
|
fi
|
||||||
|
cmake -S ${{runner.temp}}/gtsam-src -B ${{runner.temp}}/gtsam-build \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=${{github.workspace}}/gtsam-install \
|
||||||
|
-DGTSAM_USE_SYSTEM_EIGEN=ON \
|
||||||
|
-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF \
|
||||||
|
-DGTSAM_BUILD_WITH_WERROR=OFF \
|
||||||
|
-DGTSAM_BUILD_TESTS=OFF \
|
||||||
|
-DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF \
|
||||||
|
-DGTSAM_BUILD_UNSTABLE=OFF \
|
||||||
|
-DGTSAM_BUILD_PYTHON=OFF \
|
||||||
|
-DBUILD_SHARED_LIBS=ON
|
||||||
|
cmake --build ${{runner.temp}}/gtsam-build --target install -j $(nproc)
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.x'
|
||||||
|
|
||||||
|
- name: Install Python Dependencies
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
pip install numpy pybind11
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
run: |
|
||||||
|
# Both prefixes when a job has both.
|
||||||
|
prefix_path="${{ matrix.ros_prefix }}"
|
||||||
|
if [ -d "${{github.workspace}}/gtsam-install" ]; then
|
||||||
|
prefix_path="${prefix_path:+$prefix_path;}${{github.workspace}}/gtsam-install"
|
||||||
|
fi
|
||||||
|
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_PREFIX_PATH="$prefix_path" -DPython3_EXECUTABLE=$(which python3) -Dpybind11_DIR=$(python3 -m pybind11 --cmakedir) ${{ matrix.extra_cmake_def }}
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||||
|
|
||||||
|
- name: Info
|
||||||
|
working-directory: ${{github.workspace}}/build/bin
|
||||||
|
run: |
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{ matrix.ros_prefix }}"
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{github.workspace}}/gtsam-install"
|
||||||
|
./rtabmap-console --version
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
working-directory: ${{github.workspace}}/build
|
||||||
|
# PYTHONNOUSERSITE=1: prevent the embedded Python interpreter from
|
||||||
|
# loading numpy / other site-packages from ~/.local that were compiled
|
||||||
|
# against a different ABI than the build-time Python (causes numpy
|
||||||
|
# 1.x/2.x mismatch crashes in test_pydetector / test_pydescriptor /
|
||||||
|
# test_pymatcher).
|
||||||
|
env:
|
||||||
|
PYTHONNOUSERSITE: 1
|
||||||
|
run: |
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{ matrix.ros_prefix }}"
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{github.workspace}}/gtsam-install"
|
||||||
|
# Keep a core file per crashing test, for the backtrace step below: an
|
||||||
|
# abort otherwise leaves only its message, and may not reproduce
|
||||||
|
# elsewhere.
|
||||||
|
ulimit -c unlimited
|
||||||
|
sudo sysctl -w kernel.core_pattern="${{github.workspace}}/build/core.%e.%p" > /dev/null
|
||||||
|
ctest -C ${{env.BUILD_TYPE}} -V -LE performance
|
||||||
|
|
||||||
|
- name: Backtrace of crashed tests
|
||||||
|
if: failure()
|
||||||
|
working-directory: ${{github.workspace}}/build
|
||||||
|
run: |
|
||||||
|
shopt -s nullglob
|
||||||
|
cores=(core.*)
|
||||||
|
if [ ${#cores[@]} -eq 0 ]; then
|
||||||
|
echo "No core file: the failure was an assertion or a wrong value, not a crash."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
sudo apt-get -y install gdb
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{ matrix.ros_prefix }}"
|
||||||
|
source ${{github.workspace}}/.github/scripts/ros-deps-env.sh "${{github.workspace}}/gtsam-install"
|
||||||
|
for core in "${cores[@]}"; do
|
||||||
|
exe="${core#core.}"
|
||||||
|
exe="bin/${exe%.*}"
|
||||||
|
echo "::group::$core ($exe)"
|
||||||
|
gdb -batch -ex "thread apply all bt" "$exe" "$core" || true
|
||||||
|
echo "::endgroup::"
|
||||||
|
done
|
||||||
160
.github/workflows/cmake-macos.yml
vendored
Normal file
160
.github/workflows/cmake-macos.yml
vendored
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
name: CMake-MacOS
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: ${{ matrix.build_name }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
build_name: [macos-sequoia-apple-silicon, macos-tahoe-apple-silicon, macos-tahoe-apple-silicon-cv5]
|
||||||
|
include:
|
||||||
|
# macos-sequoia-intel temporarily disabled. Had some g2o optimizer issues.
|
||||||
|
#- build_name: macos-sequoia-intel
|
||||||
|
# os: macos-15-intel
|
||||||
|
# cv: opencv@4
|
||||||
|
- build_name: macos-sequoia-apple-silicon
|
||||||
|
os: macos-15
|
||||||
|
cv: opencv@4
|
||||||
|
# - build_name: macos-tahoe-intel
|
||||||
|
# os: macos-26-intel
|
||||||
|
# cv: opencv@4
|
||||||
|
- build_name: macos-tahoe-apple-silicon
|
||||||
|
os: macos-26
|
||||||
|
cv: opencv@4
|
||||||
|
# - build_name: macos-tahoe-intel-cv5
|
||||||
|
# os: macos-26-intel
|
||||||
|
# cv: opencv
|
||||||
|
- build_name: macos-tahoe-apple-silicon-cv5
|
||||||
|
os: macos-26
|
||||||
|
cv: opencv
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Restore test data
|
||||||
|
id: cache-testdata
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
# SQLite DBs are binary-portable -> share the cache across
|
||||||
|
# linux / macos / windows. Key omits runner.os on purpose so all
|
||||||
|
# three OSes hit the same entry.
|
||||||
|
path: data/tests/*.db
|
||||||
|
key: testdata-${{ hashFiles('data/tests/manifest.txt') }}
|
||||||
|
|
||||||
|
- name: Fetch test data
|
||||||
|
if: steps.cache-testdata.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: bash scripts/fetch_test_data.sh
|
||||||
|
|
||||||
|
- name: Install Brew Dependencies
|
||||||
|
run: |
|
||||||
|
# Update brew and install from Brewfile if present, or specific packages
|
||||||
|
brew install pcl octomap pdal yaml-cpp librealsense libfreenect libusb zlib libomp suite-sparse ceres-solver ${{ matrix.cv }}
|
||||||
|
|
||||||
|
- name: Install Source Dependencies
|
||||||
|
# Build (and per-dependency cache) the source-only deps not available from
|
||||||
|
# Homebrew, then install them into /usr/local. See the composite action.
|
||||||
|
uses: ./.github/actions/install-macos-source-deps
|
||||||
|
with:
|
||||||
|
os: ${{ matrix.os }}
|
||||||
|
build_type: ${{ env.BUILD_TYPE }}
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
run: |
|
||||||
|
# Apple clang has no built-in OpenMP; point find_package(OpenMP) at
|
||||||
|
# Homebrew's keg-only libomp so PCL/g2o/rtabmap enable OpenMP instead of
|
||||||
|
# repeatedly logging "Could NOT find OpenMP".
|
||||||
|
LIBOMP=$(brew --prefix libomp)
|
||||||
|
cmake -B ${{github.workspace}}/build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} \
|
||||||
|
-DBUILD_TESTING=ON \
|
||||||
|
-DBUILD_AS_BUNDLE=ON \
|
||||||
|
-DWITH_ORBBEC_SDK=ON \
|
||||||
|
-DWITH_DEPTHAI=ON \
|
||||||
|
-DWITH_CERES=ON \
|
||||||
|
-DOpenMP_C_FLAGS="-Xclang -fopenmp -I$LIBOMP/include" \
|
||||||
|
-DOpenMP_C_LIB_NAMES=omp \
|
||||||
|
-DOpenMP_CXX_FLAGS="-Xclang -fopenmp -I$LIBOMP/include" \
|
||||||
|
-DOpenMP_CXX_LIB_NAMES=omp \
|
||||||
|
-DOpenMP_omp_LIBRARY="$LIBOMP/lib/libomp.dylib"
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
||||||
|
|
||||||
|
- name: Info
|
||||||
|
working-directory: ${{github.workspace}}/build/bin
|
||||||
|
run: |
|
||||||
|
./rtabmap-console --version
|
||||||
|
|
||||||
|
- name: Build MacOS Package
|
||||||
|
run: |
|
||||||
|
cmake --build ${{ github.workspace }}/build --config ${{ env.BUILD_TYPE }} --target package
|
||||||
|
|
||||||
|
- name: Upload RTABMap Artifacts (DMG)
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: RTABMap-Binaries-${{ matrix.build_name }}-nonsigned-zip
|
||||||
|
path: |
|
||||||
|
build/RTABMap-*.dmg
|
||||||
|
compression-level: 0
|
||||||
|
if-no-files-found: warn
|
||||||
|
retention-days: ${{ github.event_name == 'pull_request' && 1 || 90 }}
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
working-directory: ${{github.workspace}}/build
|
||||||
|
# PYTHONNOUSERSITE=1: prevent the embedded Python interpreter from
|
||||||
|
# loading numpy / other site-packages from the user's site that were
|
||||||
|
# compiled against a different ABI than the build-time Python.
|
||||||
|
env:
|
||||||
|
PYTHONNOUSERSITE: 1
|
||||||
|
run: |
|
||||||
|
ctest -C ${{env.BUILD_TYPE}} -V -LE performance
|
||||||
|
|
||||||
|
# A ctest SEGFAULT is reported as just "SEGFAULT" with no backtrace, which
|
||||||
|
# makes a crash inside a long integration test invisible -- the log simply
|
||||||
|
# stops mid-test. macOS's ReportCrash writes a symbolized .ips report for
|
||||||
|
# every crashed process, so surface any that appeared during this job.
|
||||||
|
- name: Dump macOS crash reports on failure
|
||||||
|
if: failure()
|
||||||
|
run: |
|
||||||
|
# ReportCrash can lag the process death by a few seconds.
|
||||||
|
sleep 20
|
||||||
|
found=0
|
||||||
|
for d in "$HOME/Library/Logs/DiagnosticReports" /Library/Logs/DiagnosticReports; do
|
||||||
|
[ -d "$d" ] || continue
|
||||||
|
while IFS= read -r f; do
|
||||||
|
found=1
|
||||||
|
echo "::group::$f"
|
||||||
|
cat "$f"
|
||||||
|
echo "::endgroup::"
|
||||||
|
done < <(find "$d" -type f \( -name '*.ips' -o -name '*.crash' \) -mtime -1 2>/dev/null | sort)
|
||||||
|
done
|
||||||
|
if [ "$found" = 0 ]; then
|
||||||
|
echo "No crash reports found -- the job may have failed without a crash."
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Upload ctest log on failure
|
||||||
|
if: failure()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: ctest-log-${{ matrix.build_name }}
|
||||||
|
path: build/Testing/Temporary/LastTest.log
|
||||||
|
if-no-files-found: warn
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
120
.github/workflows/cmake-ros.yml
vendored
120
.github/workflows/cmake-ros.yml
vendored
@@ -3,62 +3,98 @@ name: CMake-ROS
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- '**'
|
- master
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- '**'
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
# The CMake configure and build commands are platform agnostic and should work equally
|
name: ${{ matrix.ros_distribution }}
|
||||||
# well on Windows or Mac. You can convert this to a matrix build if you need
|
runs-on: ubuntu-latest
|
||||||
# cross-platform coverage.
|
concurrency:
|
||||||
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
|
group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.ros_distribution }}
|
||||||
name: Build on ros ${{ matrix.ros_distribution }} and ${{ matrix.os }}
|
cancel-in-progress: true
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ros_distribution: [melodic, noetic, foxy, humble, rolling]
|
ros_distribution: [ humble, jazzy, kilted, lyrical, rolling]
|
||||||
include:
|
include:
|
||||||
- ros_distribution: 'melodic'
|
|
||||||
os: ubuntu-18.04
|
|
||||||
- ros_distribution: 'noetic'
|
|
||||||
os: ubuntu-20.04
|
|
||||||
- ros_distribution: 'foxy'
|
|
||||||
os: ubuntu-20.04
|
|
||||||
- ros_distribution: 'humble'
|
- ros_distribution: 'humble'
|
||||||
os: ubuntu-22.04
|
skip_keys: ""
|
||||||
|
- ros_distribution: 'jazzy'
|
||||||
|
skip_keys: ""
|
||||||
|
- ros_distribution: 'kilted'
|
||||||
|
skip_keys: ""
|
||||||
|
- ros_distribution: 'lyrical'
|
||||||
|
skip_keys: "libpointmatcher"
|
||||||
- ros_distribution: 'rolling'
|
- ros_distribution: 'rolling'
|
||||||
os: ubuntu-22.04
|
skip_keys: "libpointmatcher gtsam"
|
||||||
|
use_ros2_testing: true # Rolling is using ros2-testing (nightly)
|
||||||
|
container:
|
||||||
|
image: osrf/ros:${{ matrix.ros_distribution }}-desktop-full
|
||||||
steps:
|
steps:
|
||||||
- uses: ros-tooling/setup-ros@v0.4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Restore test data
|
||||||
|
id: cache-testdata
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: data/tests/*.db
|
||||||
|
key: testdata-${{ hashFiles('data/tests/manifest.txt') }}
|
||||||
|
|
||||||
|
- name: Fetch test data
|
||||||
|
if: steps.cache-testdata.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# The ROS images are slim; fetch_test_data.sh needs curl, and 7-Zip for
|
||||||
|
# the assets that come as an archive. The package holding it is
|
||||||
|
# p7zip-full up to Ubuntu 24.04 and 7zip on the newer ones.
|
||||||
|
command -v curl >/dev/null || (apt-get update && apt-get install -y --no-install-recommends curl)
|
||||||
|
command -v 7z >/dev/null || command -v 7zz >/dev/null || (apt-get update && \
|
||||||
|
(apt-get install -y --no-install-recommends p7zip-full || \
|
||||||
|
apt-get install -y --no-install-recommends 7zip))
|
||||||
|
bash scripts/fetch_test_data.sh
|
||||||
|
|
||||||
|
# `${{ github.workspace }}` is expanded by the runner on the *host*
|
||||||
|
# (/home/runner/work/...), but this job runs in a container where the runner
|
||||||
|
# bind-mounts that directory somewhere else (/__w/...). Baking the host path
|
||||||
|
# into RTABMAP_TEST_DATA_ROOT points every data-driven test at a directory
|
||||||
|
# that does not exist in the container: the integration tests silently skip
|
||||||
|
# and the ones that imread() committed fixtures abort outright.
|
||||||
|
#
|
||||||
|
# Resolve the path inside the container instead. A `run` step's cwd is the
|
||||||
|
# checkout root -- the same assumption the relative `scripts/...` and
|
||||||
|
# `data/tests/*.db` paths in the steps above already rely on -- so derive it
|
||||||
|
# from $PWD rather than trusting a path computed outside the container. The
|
||||||
|
# existence checks then turn that into a verified precondition: a wrong
|
||||||
|
# mount point or a failed fetch fails here, with the path printed, instead
|
||||||
|
# of degrading into skipped tests.
|
||||||
|
- name: Resolve test data root in the container
|
||||||
|
id: testdata
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
root="$PWD/data"
|
||||||
|
test -f "$root/samples/17.jpg" || { echo "::error::test data root $root is missing committed fixtures"; exit 1; }
|
||||||
|
ls "$root"/tests/*.db >/dev/null || { echo "::error::no test databases in $root/tests"; exit 1; }
|
||||||
|
echo "root=$root" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- uses: ros-tooling/setup-ros@v0.7
|
||||||
with:
|
with:
|
||||||
required-ros-distributions: ${{ matrix.ros_distribution }}
|
required-ros-distributions: ${{ matrix.ros_distribution }}
|
||||||
|
use-ros2-testing: ${{ matrix.use_ros2_testing || false }}
|
||||||
- name: Install dependencies
|
- uses: ros-tooling/action-ros-ci@v0.4
|
||||||
run: |
|
with:
|
||||||
sudo apt-get update
|
package-name: rtabmap
|
||||||
sudo apt-get -y install ros-${{ matrix.ros_distribution }}-rtabmap
|
target-ros2-distro: ${{ matrix.ros_distribution }}
|
||||||
sudo apt-get -y remove ros-${{ matrix.ros_distribution }}-rtabmap
|
rosdep-skip-keys: "${{ matrix.skip_keys }}"
|
||||||
|
coverage-result: false
|
||||||
- uses: actions/checkout@v2
|
extra-cmake-args: -DTEST_DATA_ROOT=${{ steps.testdata.outputs.root }}
|
||||||
|
|
||||||
- name: Configure CMake
|
|
||||||
run: |
|
|
||||||
source /opt/ros/${{ matrix.ros_distribution }}/setup.bash
|
|
||||||
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
|
||||||
|
|
||||||
- name: Info
|
|
||||||
working-directory: ${{github.workspace}}/build/bin
|
|
||||||
run: |
|
|
||||||
source /opt/ros/${{ matrix.ros_distribution }}/setup.bash
|
|
||||||
./rtabmap-console --version
|
|
||||||
|
|
||||||
|
|||||||
171
.github/workflows/cmake-windows.yml
vendored
Normal file
171
.github/workflows/cmake-windows.yml
vendored
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
name: CMake-Windows
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: Release
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: ${{ matrix.build_name }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
build_name: [windows-2022, windows-2022-cuda]
|
||||||
|
include:
|
||||||
|
- build_name: windows-2022
|
||||||
|
os: windows-2022
|
||||||
|
extra_deps: ""
|
||||||
|
extra_cmake_def: '-DWITH_TORCH=OFF -DWITH_ZED=OFF'
|
||||||
|
- build_name: windows-2022-cuda
|
||||||
|
os: windows-2022
|
||||||
|
extra_deps: ""
|
||||||
|
extra_cmake_def: '-DWITH_TORCH=ON -DWITH_ZED=ON -DWITH_CUDASIFT=ON'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Restore test data
|
||||||
|
id: cache-testdata
|
||||||
|
if: matrix.build_name != 'windows-2022-cuda'
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
# SQLite DBs are binary-portable -> share the cache across
|
||||||
|
# linux / macos / windows. Key omits runner.os on purpose so all
|
||||||
|
# three OSes hit the same entry.
|
||||||
|
path: data/tests/*.db
|
||||||
|
key: testdata-${{ hashFiles('data/tests/manifest.txt') }}
|
||||||
|
|
||||||
|
- name: Fetch test data
|
||||||
|
if: matrix.build_name != 'windows-2022-cuda' && steps.cache-testdata.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: bash scripts/fetch_test_data.sh
|
||||||
|
|
||||||
|
- name: Install Windows Dependencies
|
||||||
|
if: matrix.build_name == 'windows-2022'
|
||||||
|
uses: ./.github/actions/install-windows-deps
|
||||||
|
|
||||||
|
- name: Install Windows Dependencies with CUDA
|
||||||
|
if: matrix.build_name == 'windows-2022-cuda'
|
||||||
|
uses: ./.github/actions/install-windows-cuda-deps
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
run: |
|
||||||
|
# K4A, K4W2 and ZED are located via these env vars (FindK4A.cmake / FindKinectSDK2.cmake
|
||||||
|
# and the install rules), pointing at the export where the bundle staged their SDK files.
|
||||||
|
$env:K4A_ROOT_DIR = "${{env.VCPKG_EXPORT_PATH}}/installed/x64-windows-release"
|
||||||
|
$env:KINECTSDK20_DIR = "${{env.VCPKG_EXPORT_PATH}}/installed/x64-windows-release"
|
||||||
|
$env:ZED_SDK_ROOT_DIR = "${{env.VCPKG_EXPORT_PATH}}/installed/x64-windows-release"
|
||||||
|
cmake `
|
||||||
|
-B ${{github.workspace}}/build `
|
||||||
|
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} `
|
||||||
|
-DBUILD_AS_BUNDLE=ON `
|
||||||
|
-DWITH_PYTHON=ON `
|
||||||
|
-DWITH_CERES=ON `
|
||||||
|
-DWITH_ORBBEC_SDK=ON `
|
||||||
|
-DWITH_FREENECT2=ON `
|
||||||
|
-DWITH_K4W2=ON `
|
||||||
|
-DWITH_K4A=ON `
|
||||||
|
-DWITH_DEPTHAI=ON `
|
||||||
|
-DWITH_REALSENSE2=ON `
|
||||||
|
-DWITH_CCCORELIB=ON `
|
||||||
|
${{ matrix.extra_cmake_def }} `
|
||||||
|
-DBUILD_TESTING=ON `
|
||||||
|
-DVCPKG_MANIFEST_INSTALL=OFF `
|
||||||
|
-DVCPKG_TARGET_TRIPLET=x64-windows-release `
|
||||||
|
-DVCPKG_INSTALLED_DIR="${{env.VCPKG_EXPORT_PATH}}/installed" `
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=${{env.VCPKG_EXPORT_PATH}}/scripts/buildsystems/vcpkg.cmake `
|
||||||
|
-DTorch_DIR=${{env.VCPKG_EXPORT_PATH}}/installed/x64-windows-release/tools/python3/Lib/site-packages/torch/share/cmake/Torch
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --target ALL_BUILD
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
# Not run on the CUDA build, which is a build+package job only.
|
||||||
|
#
|
||||||
|
# The runner has no NVIDIA GPU or driver (see the driver-DLL note in
|
||||||
|
# app/src/CMakeLists.txt), so no cv::cuda / CUDASIFT path can actually
|
||||||
|
# execute there -- everything falls back to CPU and the run just repeats
|
||||||
|
# the coverage the non-CUDA job already gives, on the same sources. It
|
||||||
|
# used to cost more than it returned: the two cv::cuda-touching tests
|
||||||
|
# (test_util3d_features, test_localgrid) had to be excluded because lazy
|
||||||
|
# CUDA-init stalled them past the 300 s timeout, and once WITH_ZED=ON was
|
||||||
|
# added to this job every remaining corelib test died in the loader with
|
||||||
|
# 0xc0000135 (STATUS_DLL_NOT_FOUND) before reaching main(): rtabmap_core
|
||||||
|
# links sl_zed64.dll, which imports the driver-only nvcuvid.dll /
|
||||||
|
# nvEncodeAPI64.dll that a driver-less runner does not have.
|
||||||
|
#
|
||||||
|
# So this job compiles, links and packages the CUDA artifact; the
|
||||||
|
# non-CUDA job is what verifies behaviour. Same reason the Info step
|
||||||
|
# below is skipped here.
|
||||||
|
if: matrix.build_name != 'windows-2022-cuda'
|
||||||
|
working-directory: ${{github.workspace}}/build
|
||||||
|
# PYTHONHOME points the embedded interpreter at vcpkg's bundled
|
||||||
|
# Python install (where Lib/, DLLs/ live). Without it Python emits
|
||||||
|
# "Could not find platform independent libraries <prefix>" at init
|
||||||
|
# and runs without a stdlib, breaking every numpy import.
|
||||||
|
# PYTHONNOUSERSITE=1: prevent the embedded Python interpreter from
|
||||||
|
# loading numpy / other site-packages from %APPDATA%\Python that
|
||||||
|
# were compiled against a different ABI than the build-time Python
|
||||||
|
# (numpy 1.x/2.x mismatch crashes in test_pydetector /
|
||||||
|
# test_pydescriptor / test_pymatcher).
|
||||||
|
env:
|
||||||
|
PYTHONHOME: ${{env.VCPKG_EXPORT_PATH}}/installed/x64-windows-release/tools/python3
|
||||||
|
PYTHONNOUSERSITE: 1
|
||||||
|
run: |
|
||||||
|
ctest -C ${{env.BUILD_TYPE}} -V --timeout 300 -LE performance
|
||||||
|
|
||||||
|
- name: Info
|
||||||
|
# Skipped for CUDA: the binary links ZED (sl_zed64.dll -> nvcuvid/nvEncodeAPI64),
|
||||||
|
# which need the NVIDIA driver; the GPU-less runner can't load the exe.
|
||||||
|
if: matrix.build_name != 'windows-2022-cuda'
|
||||||
|
working-directory: ${{github.workspace}}/build/bin
|
||||||
|
run: |
|
||||||
|
./rtabmap-console --version
|
||||||
|
|
||||||
|
- name: Build Windows Package
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
if ("${{ github.event_name }}" -eq "pull_request") {
|
||||||
|
cpack --config build/CPackConfig.cmake -G ZIP -B build
|
||||||
|
} else {
|
||||||
|
cmake --build ${{ github.workspace }}/build --config ${{ env.BUILD_TYPE }} --target package
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Rename CUDA artifacts
|
||||||
|
if: matrix.build_name == 'windows-2022-cuda'
|
||||||
|
shell: pwsh
|
||||||
|
run: Get-ChildItem -Path "build" -Filter "RTABMap-*" | Rename-Item -NewName { $_.BaseName + "_cuda" + $_.Extension }
|
||||||
|
|
||||||
|
- name: Upload RTABMap Artifacts (ZIP)
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: RTABMap-Binaries-${{ matrix.build_name }}-zip
|
||||||
|
path: |
|
||||||
|
build/RTABMap-*.zip
|
||||||
|
compression-level: 0
|
||||||
|
if-no-files-found: warn
|
||||||
|
retention-days: ${{ github.event_name == 'pull_request' && 1 || 90 }}
|
||||||
|
|
||||||
|
- name: Upload RTABMap Artifacts (Installer)
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: RTABMap-Binaries-${{ matrix.build_name }}-exe
|
||||||
|
path: |
|
||||||
|
build/RTABMap-*.exe
|
||||||
|
compression-level: 0
|
||||||
|
if-no-files-found: warn
|
||||||
|
retention-days: ${{ github.event_name == 'pull_request' && 1 || 90 }}
|
||||||
48
.github/workflows/cmake.yml
vendored
48
.github/workflows/cmake.yml
vendored
@@ -1,48 +0,0 @@
|
|||||||
name: CMake
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- '**'
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- '**'
|
|
||||||
|
|
||||||
env:
|
|
||||||
BUILD_TYPE: Release
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: ${{ matrix.os }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-22.04, ubuntu-20.04, ubuntu-18.04]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
DEBIAN_FRONTEND=noninteractive
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get -y install libopencv-dev libpcl-dev git cmake software-properties-common libyaml-cpp-dev
|
|
||||||
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Configure CMake
|
|
||||||
run: |
|
|
||||||
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
|
|
||||||
|
|
||||||
- name: Info
|
|
||||||
working-directory: ${{github.workspace}}/build/bin
|
|
||||||
run: |
|
|
||||||
./rtabmap-console --version
|
|
||||||
|
|
||||||
# - name: Test
|
|
||||||
# working-directory: ${{github.workspace}}/build
|
|
||||||
# # Execute tests defined by the CMake configuration.
|
|
||||||
# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
|
||||||
# run: ctest -C ${{env.BUILD_TYPE}}
|
|
||||||
|
|
||||||
198
.github/workflows/coverage.yml
vendored
Normal file
198
.github/workflows/coverage.yml
vendored
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
name: Coverage
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: Debug
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
coverage:
|
||||||
|
name: Coverage (ubuntu-24.04)
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
env:
|
||||||
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Restore test data
|
||||||
|
id: cache-testdata
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
# Same key as the other workflows so all of them share one entry.
|
||||||
|
path: data/tests/*.db
|
||||||
|
key: testdata-${{ hashFiles('data/tests/manifest.txt') }}
|
||||||
|
|
||||||
|
- name: Fetch test data
|
||||||
|
if: steps.cache-testdata.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: bash scripts/fetch_test_data.sh
|
||||||
|
|
||||||
|
- name: Install Linux dependencies
|
||||||
|
run: |
|
||||||
|
DEBIAN_FRONTEND=noninteractive
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
lcov \
|
||||||
|
libopencv-dev \
|
||||||
|
libpcl-dev \
|
||||||
|
git \
|
||||||
|
cmake \
|
||||||
|
software-properties-common \
|
||||||
|
libyaml-cpp-dev \
|
||||||
|
libg2o-dev \
|
||||||
|
libceres-dev \
|
||||||
|
curl \
|
||||||
|
gnupg \
|
||||||
|
lsb-release
|
||||||
|
|
||||||
|
# GTSAM and libpointmatcher are not in the Ubuntu archive, and
|
||||||
|
# borglab's gtsam PPAs have no noble packages (gtsam-release-4.2 has
|
||||||
|
# no noble suite; gtsam-develop's noble Packages index is empty). The
|
||||||
|
# ROS 2 repo ships both for noble, which is also what the ROS CI jobs
|
||||||
|
# test against, so take them from there.
|
||||||
|
sudo curl -fsSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
|
||||||
|
-o /usr/share/keyrings/ros-archive-keyring.gpg
|
||||||
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" \
|
||||||
|
| sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
ros-jazzy-gtsam \
|
||||||
|
ros-jazzy-libpointmatcher
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
run: |
|
||||||
|
cmake -B ${{ github.workspace }}/build \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||||
|
-DENABLE_COVERAGE=ON \
|
||||||
|
-DCMAKE_PREFIX_PATH=/opt/ros/jazzy \
|
||||||
|
-DBUILD_TESTING=ON \
|
||||||
|
-DBUILD_APP=OFF \
|
||||||
|
-DBUILD_TOOLS=OFF \
|
||||||
|
-DBUILD_EXAMPLES=OFF \
|
||||||
|
-DWITH_QT=OFF \
|
||||||
|
-DWITH_PYTHON=OFF \
|
||||||
|
-DWITH_CERES=ON \
|
||||||
|
-DWITH_G2O=ON \
|
||||||
|
-DWITH_GTSAM=ON \
|
||||||
|
-DWITH_MRPT=OFF \
|
||||||
|
-DWITH_CVSBA=OFF \
|
||||||
|
-DWITH_POINTMATCHER=ON \
|
||||||
|
-DWITH_CCCORELIB=OFF \
|
||||||
|
-DWITH_OPEN3D=OFF \
|
||||||
|
-DWITH_LOAM=OFF \
|
||||||
|
-DWITH_FLOAM=OFF \
|
||||||
|
-DWITH_LIOSAM=OFF \
|
||||||
|
-DWITH_FLYCAPTURE2=OFF \
|
||||||
|
-DWITH_ZED=OFF \
|
||||||
|
-DWITH_ZEDOC=OFF \
|
||||||
|
-DWITH_REALSENSE=OFF
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: cmake --build ${{ github.workspace }}/build -j$(nproc)
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
working-directory: ${{ github.workspace }}/build
|
||||||
|
run: |
|
||||||
|
# The ROS packages are not on the default loader path. Both
|
||||||
|
# directories are needed: GTSAM and libpointmatcher land in
|
||||||
|
# /opt/ros/jazzy/lib, but gtsam's own libmetis-gtsam.so goes to the
|
||||||
|
# multiarch subdirectory, and libgtsam.so carries no RUNPATH, so the
|
||||||
|
# loader can only find it through LD_LIBRARY_PATH.
|
||||||
|
ROS_LIB=/opt/ros/jazzy/lib
|
||||||
|
export LD_LIBRARY_PATH="${{ github.workspace }}/build/bin:${ROS_LIB}:${ROS_LIB}/$(gcc -dumpmachine)${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
||||||
|
find ${{ github.workspace }}/build -name '*.gcda' -delete
|
||||||
|
# Unit tests only ("long" is the end-to-end replay suite).
|
||||||
|
#
|
||||||
|
# Two reasons. It costs ~90 min in this instrumented -O0 build, 94% of
|
||||||
|
# the job's test time, for ~3 points of coverage. And running it on
|
||||||
|
# some events but not others makes the numbers incomparable: Codecov
|
||||||
|
# measures a pull request against master, so a unit-only PR report
|
||||||
|
# against a full master report reads as a coverage regression on every
|
||||||
|
# PR. Same scope everywhere keeps the comparison meaningful.
|
||||||
|
#
|
||||||
|
# The replays still run (and gate) in the cmake-linux / macos /
|
||||||
|
# windows jobs; they are just not measured here.
|
||||||
|
ctest -V -LE "long|performance"
|
||||||
|
|
||||||
|
- name: Generate LCOV report
|
||||||
|
run: |
|
||||||
|
GCOV_VER="$(gcc -dumpversion | cut -d. -f1)"
|
||||||
|
if command -v "gcov-${GCOV_VER}" >/dev/null 2>&1; then
|
||||||
|
GCOV_TOOL="gcov-${GCOV_VER}"
|
||||||
|
else
|
||||||
|
GCOV_TOOL="gcov"
|
||||||
|
fi
|
||||||
|
LCOV_IGNORE=(--ignore-errors gcov,source,graph,mismatch,unused)
|
||||||
|
|
||||||
|
# The whole of corelib/utilite, test objects included, not just their src/.
|
||||||
|
# An inline function defined in a header is emitted in whichever
|
||||||
|
# translation unit wins comdat folding, which is often a test one, and
|
||||||
|
# its counters then live in that unit's .gcda: capturing only src/
|
||||||
|
# reports such a function as uncovered however often it is called. The
|
||||||
|
# test sources themselves are dropped below, after the counters are read.
|
||||||
|
lcov --gcov-tool "$GCOV_TOOL" "${LCOV_IGNORE[@]}" \
|
||||||
|
--capture \
|
||||||
|
--directory ${{ github.workspace }}/build/corelib \
|
||||||
|
--directory ${{ github.workspace }}/build/utilite \
|
||||||
|
--output-file lcov.info
|
||||||
|
|
||||||
|
lcov "${LCOV_IGNORE[@]}" --extract lcov.info \
|
||||||
|
'${{ github.workspace }}/*' \
|
||||||
|
--output-file lcov.info
|
||||||
|
# The test sources are the instrument, not the subject: a line in a
|
||||||
|
# test counts as uncovered only when the test skipped it (a defensive
|
||||||
|
# cleanup branch, a platform guard), which says nothing about the
|
||||||
|
# library. They are also near-fully covered by construction, so
|
||||||
|
# leaving them in inflates the overall number. Excluded here, before
|
||||||
|
# the upload, so the HTML artifact, the summary below and Codecov all
|
||||||
|
# report the same figure. Kept in sync with coverage-report.sh.
|
||||||
|
lcov "${LCOV_IGNORE[@]}" --remove lcov.info \
|
||||||
|
'*/sqlite3/*' \
|
||||||
|
'*/rtflann/*' \
|
||||||
|
'*/corelib/test/*' \
|
||||||
|
'*/utilite/test/*' \
|
||||||
|
'*/_deps/*' \
|
||||||
|
--output-file lcov.info
|
||||||
|
|
||||||
|
lcov --summary lcov.info
|
||||||
|
|
||||||
|
- name: HTML coverage report
|
||||||
|
run: genhtml --ignore-errors source,mismatch lcov.info --output-directory coverage-html --legend --demangle-cpp
|
||||||
|
|
||||||
|
- name: Upload HTML coverage artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: coverage-html
|
||||||
|
path: coverage-html
|
||||||
|
retention-days: 14
|
||||||
|
|
||||||
|
- name: Upload to Codecov
|
||||||
|
if: ${{ env.CODECOV_TOKEN != '' }}
|
||||||
|
uses: codecov/codecov-action@v5
|
||||||
|
with:
|
||||||
|
files: lcov.info
|
||||||
|
# Upload ONLY lcov.info. By default the CLI also searches the tree and
|
||||||
|
# runs gcov over every .gcno it finds, uploading those .gcov files
|
||||||
|
# alongside -- which re-introduced corelib/test and utilite/test on
|
||||||
|
# Codecov even though the lcov --remove step had dropped them (the
|
||||||
|
# HTML artifact, built from the same lcov.info, was correctly clean).
|
||||||
|
disable_search: true
|
||||||
|
plugins: noop
|
||||||
|
token: ${{ env.CODECOV_TOKEN }}
|
||||||
|
fail_ci_if_error: false
|
||||||
168
.github/workflows/docker.yml
vendored
168
.github/workflows/docker.yml
vendored
@@ -4,24 +4,114 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- 'master'
|
- 'master'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docker:
|
docker_deps:
|
||||||
|
|
||||||
|
# Disabling ###-deps step from CI because it is too flaky (seg faults, arm64 build timeout...)
|
||||||
|
# Only way I was able to build all images is to do it from a ubuntu 20.04 computer with:
|
||||||
|
# $ sudo add-apt-repository ppa:canonical-server/server-backports
|
||||||
|
# $ sudo apt-get update
|
||||||
|
# $ sudo apt-get upgrade qemu-user-static
|
||||||
|
# $ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -c yes
|
||||||
|
# More info: https://github.com/introlab/rtabmap/issues/1454
|
||||||
|
# Skipped on pull requests; built and pushed only from master (push or
|
||||||
|
# manual dispatch), since it pushes the :*-deps tags to Docker Hub.
|
||||||
|
if: github.ref == 'refs/heads/master'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
docker_tag: [xenial, bionic, focal, android23, android24, android26, android30]
|
docker_tag: [focal-deps, jammy-deps, noble-deps, noble-kilted-deps, resolute-deps]
|
||||||
include:
|
include:
|
||||||
- docker_tag: xenial
|
- docker_tag: focal-deps
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:xenial
|
introlab3it/rtabmap:focal-deps
|
||||||
introlab3it/rtabmap:16.04
|
|
||||||
docker_args: |
|
|
||||||
NOT_USED=0
|
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'xenial'
|
linux/arm64
|
||||||
|
docker_path: 'focal/deps'
|
||||||
|
- docker_tag: jammy-deps
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:jammy-deps
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'jammy/deps'
|
||||||
|
- docker_tag: noble-deps
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:noble-deps
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'noble/deps'
|
||||||
|
- docker_tag: noble-kilted-deps
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:noble-kilted-deps
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'noble-kilted/deps'
|
||||||
|
- docker_tag: resolute-deps
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:resolute-deps
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'resolute/deps'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
with:
|
||||||
|
platforms: all
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
-
|
||||||
|
name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
platforms: ${{ matrix.docker_platforms }}
|
||||||
|
file: ./docker/${{ matrix.docker_path }}/Dockerfile
|
||||||
|
tags: ${{ matrix.docker_tags }}
|
||||||
|
cache-from: type=registry,ref=introlab3it/rtabmap:${{ matrix.docker_tag }}
|
||||||
|
cache-to: type=inline
|
||||||
|
|
||||||
|
docker:
|
||||||
|
needs: docker_deps
|
||||||
|
# Run even when docker_deps is skipped (it is, on pull requests).
|
||||||
|
# A manual dispatch is honored only on master, the only ref we push from.
|
||||||
|
if: ${{ !cancelled() && !failure() && (github.event_name != 'workflow_dispatch' || github.ref == 'refs/heads/master') }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
docker_tag: [bionic, focal, jammy, noble, noble-kilted, resolute, android23, android24, android26, android30]
|
||||||
|
include:
|
||||||
- docker_tag: bionic
|
- docker_tag: bionic
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:bionic
|
introlab3it/rtabmap:bionic
|
||||||
@@ -43,6 +133,45 @@ jobs:
|
|||||||
linux/amd64
|
linux/amd64
|
||||||
linux/arm64
|
linux/arm64
|
||||||
docker_path: 'focal'
|
docker_path: 'focal'
|
||||||
|
- docker_tag: jammy
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:jammy
|
||||||
|
introlab3it/rtabmap:22.04
|
||||||
|
docker_args: |
|
||||||
|
NOT_USED=0
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'jammy'
|
||||||
|
- docker_tag: noble
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:noble
|
||||||
|
introlab3it/rtabmap:24.04
|
||||||
|
docker_args: |
|
||||||
|
NOT_USED=0
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'noble'
|
||||||
|
- docker_tag: noble-kilted
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:noble-kilted
|
||||||
|
docker_args: |
|
||||||
|
NOT_USED=0
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'noble-kilted'
|
||||||
|
- docker_tag: resolute
|
||||||
|
docker_tags: |
|
||||||
|
introlab3it/rtabmap:resolute
|
||||||
|
introlab3it/rtabmap:26.04
|
||||||
|
docker_args: |
|
||||||
|
NOT_USED=0
|
||||||
|
docker_platforms: |
|
||||||
|
linux/amd64
|
||||||
|
linux/arm64
|
||||||
|
docker_path: 'resolute'
|
||||||
- docker_tag: android23
|
- docker_tag: android23
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android23
|
introlab3it/rtabmap:android23
|
||||||
@@ -51,7 +180,7 @@ jobs:
|
|||||||
API_VERSION=23
|
API_VERSION=23
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
- docker_tag: android24
|
- docker_tag: android24
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android24
|
introlab3it/rtabmap:android24
|
||||||
@@ -59,7 +188,7 @@ jobs:
|
|||||||
API_VERSION=24
|
API_VERSION=24
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
- docker_tag: android26
|
- docker_tag: android26
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android26
|
introlab3it/rtabmap:android26
|
||||||
@@ -67,7 +196,7 @@ jobs:
|
|||||||
API_VERSION=26
|
API_VERSION=26
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
- docker_tag: android30
|
- docker_tag: android30
|
||||||
docker_tags: |
|
docker_tags: |
|
||||||
introlab3it/rtabmap:android30
|
introlab3it/rtabmap:android30
|
||||||
@@ -75,7 +204,7 @@ jobs:
|
|||||||
API_VERSION=30
|
API_VERSION=30
|
||||||
docker_platforms: |
|
docker_platforms: |
|
||||||
linux/amd64
|
linux/amd64
|
||||||
docker_path: 'bionic/android/rtabmap_apiXX'
|
docker_path: 'noble/android/rtabmap_apiXX'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
@@ -83,25 +212,28 @@ jobs:
|
|||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
-
|
-
|
||||||
name: Set up QEMU
|
name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v3
|
||||||
with:
|
with:
|
||||||
platforms: all
|
platforms: all
|
||||||
-
|
-
|
||||||
name: Set up Docker Buildx
|
name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v3
|
||||||
-
|
-
|
||||||
name: Login to DockerHub
|
name: Login to DockerHub
|
||||||
uses: docker/login-action@v1
|
# Only needed when pushing; skipped on pull requests (secrets are
|
||||||
|
# unavailable for fork PRs and we don't push there anyway).
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
-
|
-
|
||||||
name: Build and push
|
name: Build and push
|
||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
platforms: ${{ matrix.docker_platforms }}
|
platforms: ${{ github.event_name == 'pull_request' && 'linux/amd64' || matrix.docker_platforms }}
|
||||||
file: ./docker/${{ matrix.docker_path }}/Dockerfile
|
file: ./docker/${{ matrix.docker_path }}/Dockerfile
|
||||||
build-args: |
|
build-args: |
|
||||||
${{ matrix.docker_args }}
|
${{ matrix.docker_args }}
|
||||||
|
|||||||
54
.github/workflows/docs-preview-cleanup.yml
vendored
Normal file
54
.github/workflows/docs-preview-cleanup.yml
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
name: Documentation preview cleanup
|
||||||
|
|
||||||
|
# Removes the per-PR documentation preview published by docs.yml under
|
||||||
|
# gh-pages:preview/pr-<number>/ once the pull request is closed (merged or not).
|
||||||
|
#
|
||||||
|
# Deliberately has no `paths` filter: docs.yml only publishes a preview when
|
||||||
|
# documentation-related files changed, but this must fire for every close so a
|
||||||
|
# preview can never be orphaned on the branch.
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [closed]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cleanup:
|
||||||
|
name: Remove PR preview
|
||||||
|
# Forks never get a preview (their token is read-only), so nothing to clean.
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
# Same group as docs.yml's publish job: both push to gh-pages, and two
|
||||||
|
# concurrent pushes would collide.
|
||||||
|
concurrency:
|
||||||
|
group: gh-pages-publish
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout gh-pages
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: gh-pages
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Remove preview directory
|
||||||
|
env:
|
||||||
|
PREVIEW_DIR: preview/pr-${{ github.event.number }}
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
if [[ ! -d "${PREVIEW_DIR}" ]]; then
|
||||||
|
echo "No preview at ${PREVIEW_DIR}, nothing to do."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
git config user.name 'github-actions[bot]'
|
||||||
|
git config user.email 'github-actions[bot]@users.noreply.github.com'
|
||||||
|
git rm -r --quiet "${PREVIEW_DIR}"
|
||||||
|
# Drop the parent too once the last preview is gone.
|
||||||
|
rmdir preview 2>/dev/null || true
|
||||||
|
git commit -m "Remove preview for PR #${{ github.event.number }}"
|
||||||
|
git push
|
||||||
218
.github/workflows/docs.yml
vendored
Normal file
218
.github/workflows/docs.yml
vendored
Normal file
@@ -0,0 +1,218 @@
|
|||||||
|
name: Documentation
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
# Publishing commits to the gh-pages branch, so only run when something that
|
||||||
|
# affects the documentation actually changed. Use the manual "Run workflow"
|
||||||
|
# button if a deploy is needed outside of these paths.
|
||||||
|
paths: &docs_paths
|
||||||
|
- '.github/workflows/docs.yml'
|
||||||
|
- 'CMakeLists.txt'
|
||||||
|
- 'Doxyfile.in'
|
||||||
|
- 'docs-report.sh'
|
||||||
|
- 'website/**'
|
||||||
|
- 'doxygen/**'
|
||||||
|
- 'package.xml'
|
||||||
|
- 'corelib/include/**'
|
||||||
|
- 'utilite/include/**'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
paths: *docs_paths
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build site (ubuntu-24.04)
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.site.outputs.version }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
DEBIAN_FRONTEND=noninteractive
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
doxygen \
|
||||||
|
graphviz \
|
||||||
|
cmake \
|
||||||
|
libopencv-dev \
|
||||||
|
libpcl-dev \
|
||||||
|
libyaml-cpp-dev \
|
||||||
|
git
|
||||||
|
|
||||||
|
# Configures build-docs (CMake generates the export headers that are part
|
||||||
|
# of Doxygen's INPUT), runs Doxygen into build-docs/api/latest/. Same
|
||||||
|
# script used locally, so a local preview matches what gets published.
|
||||||
|
- name: Generate C++ API documentation (Doxygen)
|
||||||
|
run: ./docs-report.sh
|
||||||
|
|
||||||
|
# The theme emits absolute asset links built from site.baseurl, which
|
||||||
|
# GitHub's own Jekyll infers from the repository (/rtabmap). A PR preview
|
||||||
|
# is served from a deeper path, so those links would 404 there. Pin
|
||||||
|
# baseurl to the path this particular build gets published to.
|
||||||
|
- name: Set Jekyll baseurl
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
if [ "${{ github.event_name }}" = "pull_request" ]; then
|
||||||
|
baseurl="/${{ github.event.repository.name }}/preview/pr-${{ github.event.number }}"
|
||||||
|
else
|
||||||
|
baseurl="/${{ github.event.repository.name }}"
|
||||||
|
fi
|
||||||
|
echo "baseurl: ${baseurl}" >> website/_config.yml
|
||||||
|
|
||||||
|
# Landing page: built here rather than by GitHub's own Jekyll, so that
|
||||||
|
# .nojekyll can be set below and the Doxygen output is served untouched.
|
||||||
|
- name: Build landing page (Jekyll)
|
||||||
|
uses: actions/jekyll-build-pages@v1
|
||||||
|
with:
|
||||||
|
source: ./website
|
||||||
|
destination: ./_site
|
||||||
|
|
||||||
|
- name: Assemble site
|
||||||
|
id: site
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
# jekyll-build-pages is a container action running as root, so _site
|
||||||
|
# comes back owned by root and the steps below (running as the runner
|
||||||
|
# user) cannot write into it.
|
||||||
|
sudo chown -R "$(id -u):$(id -g)" _site
|
||||||
|
|
||||||
|
# Serve everything verbatim: the site is already built, and Jekyll
|
||||||
|
# would otherwise skip Doxygen files/folders starting with '_'.
|
||||||
|
touch _site/.nojekyll
|
||||||
|
|
||||||
|
mkdir -p _site/api
|
||||||
|
cp -r build-docs/api/latest _site/api/latest
|
||||||
|
|
||||||
|
# On a release tag (plain X.Y.Z, not the ROS-distro variants such as
|
||||||
|
# 0.23.7-jazzy), also publish under the version number. Older versions
|
||||||
|
# already on the branch are preserved by keep_files when publishing.
|
||||||
|
version=""
|
||||||
|
if [[ "${GITHUB_REF_TYPE}" == "tag" && "${GITHUB_REF_NAME}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
|
version="${GITHUB_REF_NAME}"
|
||||||
|
cp -r build-docs/api/latest "_site/api/${version}"
|
||||||
|
fi
|
||||||
|
echo "version=${version}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# The dropdown list is maintained by hand in the repository (one entry
|
||||||
|
# per release) and shared by every published version -- see the header
|
||||||
|
# comment in doxygen/versions.js.
|
||||||
|
cp doxygen/versions.js _site/api/versions.js
|
||||||
|
|
||||||
|
# /api/ has no content of its own: send it to the current docs so a
|
||||||
|
# bare .../api/ link lands somewhere useful instead of a 404. The
|
||||||
|
# target is relative, so it works at the site root and under a
|
||||||
|
# preview prefix alike.
|
||||||
|
printf '%s\n' \
|
||||||
|
'<!doctype html>' \
|
||||||
|
'<meta charset="utf-8">' \
|
||||||
|
'<title>RTAB-Map API documentation</title>' \
|
||||||
|
'<meta http-equiv="refresh" content="0; url=latest/">' \
|
||||||
|
'<link rel="canonical" href="latest/">' \
|
||||||
|
'<p>Redirecting to the <a href="latest/">latest API documentation</a>.</p>' \
|
||||||
|
> _site/api/index.html
|
||||||
|
|
||||||
|
test -f _site/index.html
|
||||||
|
test -f _site/api/index.html
|
||||||
|
test -f _site/api/latest/index.html
|
||||||
|
|
||||||
|
- name: Upload site artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: documentation-site
|
||||||
|
path: _site
|
||||||
|
# include-hidden-files keeps .nojekyll, which the publish job needs.
|
||||||
|
include-hidden-files: true
|
||||||
|
retention-days: 14
|
||||||
|
|
||||||
|
publish:
|
||||||
|
name: Publish to gh-pages
|
||||||
|
needs: build
|
||||||
|
# Forks are skipped for pull requests: their GITHUB_TOKEN is read-only, and
|
||||||
|
# granting write access to a workflow that builds untrusted code would be a
|
||||||
|
# security hole.
|
||||||
|
if: >-
|
||||||
|
github.event_name != 'pull_request' ||
|
||||||
|
github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
# Serialize every push to gh-pages, including the preview cleanup workflow,
|
||||||
|
# and never cancel one in flight: two concurrent pushes would collide.
|
||||||
|
concurrency:
|
||||||
|
group: gh-pages-publish
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download site
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: documentation-site
|
||||||
|
path: _site
|
||||||
|
|
||||||
|
# Pull requests go to preview/pr-<number>/, everything else to the site
|
||||||
|
# root. keep_files preserves what this run does not carry: the published
|
||||||
|
# version folders (api/0.23.x/) and the other PRs' previews.
|
||||||
|
- name: Publish
|
||||||
|
uses: peaceiris/actions-gh-pages@v4
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
publish_branch: gh-pages
|
||||||
|
publish_dir: ./_site
|
||||||
|
destination_dir: ${{ github.event_name == 'pull_request' && format('preview/pr-{0}', github.event.number) || '' }}
|
||||||
|
keep_files: true
|
||||||
|
# Do not let the action drop a .nojekyll at the *branch root*: that
|
||||||
|
# disables Jekyll for everything on the branch, including content
|
||||||
|
# published outside this deployment. The site we publish carries its
|
||||||
|
# own .nojekyll inside destination_dir, which is the only place it
|
||||||
|
# should apply.
|
||||||
|
enable_jekyll: true
|
||||||
|
user_name: 'github-actions[bot]'
|
||||||
|
user_email: 'github-actions[bot]@users.noreply.github.com'
|
||||||
|
commit_message: >-
|
||||||
|
${{ github.event_name == 'pull_request'
|
||||||
|
&& format('Preview for PR #{0}', github.event.number)
|
||||||
|
|| format('Update documentation ({0})', needs.build.outputs.version || 'latest') }}
|
||||||
|
|
||||||
|
- name: Link the site
|
||||||
|
run: |
|
||||||
|
base="https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}"
|
||||||
|
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
|
||||||
|
url="${base}/preview/pr-${{ github.event.number }}"
|
||||||
|
note="Removed automatically when this pull request is closed."
|
||||||
|
else
|
||||||
|
url="${base}"
|
||||||
|
note=""
|
||||||
|
fi
|
||||||
|
{
|
||||||
|
echo "### Documentation"
|
||||||
|
echo ""
|
||||||
|
echo "- Landing page: ${url}/"
|
||||||
|
echo "- C++ API: ${url}/api/latest/"
|
||||||
|
# An `if` rather than `[[ ... ]] && { ... }`: as the last command in
|
||||||
|
# the group, a false test would make the group (and so the whole
|
||||||
|
# step) exit 1. `note` is empty on push, which failed every master
|
||||||
|
# run while pull requests passed.
|
||||||
|
if [[ -n "${note}" ]]; then
|
||||||
|
echo ""
|
||||||
|
echo "${note}"
|
||||||
|
fi
|
||||||
|
} >> "$GITHUB_STEP_SUMMARY"
|
||||||
115
.github/workflows/ios.yml
vendored
Normal file
115
.github/workflows/ios.yml
vendored
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
name: iOS
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths: &ios_paths
|
||||||
|
- '.github/workflows/ios.yml'
|
||||||
|
- 'app/ios/**'
|
||||||
|
- 'app/android/jni/**'
|
||||||
|
- 'corelib/**'
|
||||||
|
- 'utilite/**'
|
||||||
|
- 'cmake_modules/**'
|
||||||
|
- 'CMakeLists.txt'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
paths: *ios_paths
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
env:
|
||||||
|
# Pre-built iOS dependencies (content of app/ios/RTABMapApp/Libraries, generated by install_deps.sh).
|
||||||
|
# Bump this when the dependency set changes (must match the Xcode toolchain below).
|
||||||
|
DEPS_URL: https://github.com/introlab/rtabmap/releases/download/0.23.1/libraries-ios-xcode26.5.zip
|
||||||
|
XCODE_VERSION: '26.5'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: build-ios
|
||||||
|
# macos-26 (Tahoe) ships Xcode 26.x, matching the toolchain used to build the prebuilt libraries.
|
||||||
|
runs-on: macos-26
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Select Xcode ${{ env.XCODE_VERSION }}
|
||||||
|
uses: maxim-lobanov/setup-xcode@v1
|
||||||
|
with:
|
||||||
|
xcode-version: ${{ env.XCODE_VERSION }}
|
||||||
|
|
||||||
|
- name: Versions
|
||||||
|
run: |
|
||||||
|
xcodebuild -version
|
||||||
|
cmake --version || brew install cmake
|
||||||
|
|
||||||
|
- name: Cache prebuilt dependencies archive
|
||||||
|
id: deps-cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: deps.zip
|
||||||
|
# Keyed on the archive URL (release tag + filename), so the cache is
|
||||||
|
# reused until DEPS_URL is bumped, regardless of other workflow edits.
|
||||||
|
key: ${{ runner.os }}-ios-deps-${{ env.DEPS_URL }}
|
||||||
|
|
||||||
|
- name: Download prebuilt dependencies
|
||||||
|
if: steps.deps-cache.outputs.cache-hit != 'true'
|
||||||
|
run: curl -L "$DEPS_URL" -o deps.zip
|
||||||
|
|
||||||
|
- name: Extract dependencies into Libraries
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
mkdir -p app/ios/RTABMapApp/Libraries
|
||||||
|
rm -rf deps_extract && mkdir -p deps_extract
|
||||||
|
unzip -q deps.zip -d deps_extract
|
||||||
|
# The archive holds the *content* of the Libraries folder (include/ lib/ share/),
|
||||||
|
# but tolerate an extra top-level Libraries/ wrapper just in case.
|
||||||
|
if [ -d deps_extract/Libraries ]; then
|
||||||
|
SRC=deps_extract/Libraries
|
||||||
|
else
|
||||||
|
SRC=deps_extract
|
||||||
|
fi
|
||||||
|
cp -R "$SRC"/. app/ios/RTABMapApp/Libraries/
|
||||||
|
test -d app/ios/RTABMapApp/Libraries/include
|
||||||
|
test -d app/ios/RTABMapApp/Libraries/lib
|
||||||
|
|
||||||
|
- name: Build rtabmap core (third-party deps are skipped, already provided by the archive)
|
||||||
|
working-directory: app/ios/RTABMapApp
|
||||||
|
run: ./install_deps.sh
|
||||||
|
|
||||||
|
- name: Build RTABMapApp
|
||||||
|
run: |
|
||||||
|
xcodebuild \
|
||||||
|
-project app/ios/RTABMapApp.xcodeproj \
|
||||||
|
-scheme RTABMapApp \
|
||||||
|
-configuration Release \
|
||||||
|
-sdk iphoneos \
|
||||||
|
-destination 'generic/platform=iOS' \
|
||||||
|
-derivedDataPath build \
|
||||||
|
CODE_SIGNING_ALLOWED=NO \
|
||||||
|
CODE_SIGNING_REQUIRED=NO \
|
||||||
|
CODE_SIGN_IDENTITY="" \
|
||||||
|
DEVELOPMENT_TEAM="" \
|
||||||
|
build
|
||||||
|
|
||||||
|
- name: Package app (unsigned .ipa)
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
APP_DIR="build/Build/Products/Release-iphoneos"
|
||||||
|
rm -rf Payload && mkdir Payload
|
||||||
|
cp -R "$APP_DIR/RTABMapApp.app" Payload/
|
||||||
|
# Unsigned .ipa: not installable as-is, but ready for later (re)signing.
|
||||||
|
zip -q -r RTABMapApp-unsigned.ipa Payload
|
||||||
|
|
||||||
|
- name: Upload app artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: RTABMapApp-ios-unsigned
|
||||||
|
path: RTABMapApp-unsigned.ipa
|
||||||
|
compression-level: 0
|
||||||
|
if-no-files-found: error
|
||||||
|
retention-days: ${{ github.event_name == 'pull_request' && 1 || 90 }}
|
||||||
16
.github/workflows/scheduled-stats.yml
vendored
Normal file
16
.github/workflows/scheduled-stats.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
name: RTAB-Map Scheduled Stats Extraction From GitHub
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 5 * * *'
|
||||||
|
jobs:
|
||||||
|
get_stats:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Update Stats
|
||||||
|
uses: introlab/github-stats-action@v1
|
||||||
|
with:
|
||||||
|
github-stats-token: ${{ secrets.STATS_TOKEN }}
|
||||||
|
google-application-credentials: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
|
||||||
|
spreadsheet-id: ${{ secrets.SPREADSHEET_ID }}
|
||||||
22
.gitignore
vendored
22
.gitignore
vendored
@@ -10,3 +10,25 @@ app/android/AndroidManifest.xml
|
|||||||
app/android/res/raw/
|
app/android/res/raw/
|
||||||
compile_flags.txt
|
compile_flags.txt
|
||||||
tags
|
tags
|
||||||
|
build_*
|
||||||
|
*.bak
|
||||||
|
build-*
|
||||||
|
|
||||||
|
# Coverage (coverage-report.sh / .github/workflows/coverage.yml)
|
||||||
|
coverage-html/
|
||||||
|
lcov.info
|
||||||
|
*.gcda
|
||||||
|
*.gcno
|
||||||
|
|
||||||
|
# Doxygen (docs-report.sh / .github/workflows/docs.yml)
|
||||||
|
doc/
|
||||||
|
# Byte-code of doxygen/generate_parameters_page.py
|
||||||
|
__pycache__/
|
||||||
|
# Generated from Doxyfile.in by CMake.
|
||||||
|
Doxyfile
|
||||||
|
|
||||||
|
# Windows bundle: vcpkg tree, build output, and deps built from source (bundle_windows_deps.bat)
|
||||||
|
vcpkg/
|
||||||
|
vcpkg_installed/
|
||||||
|
vcpkg_binaries/
|
||||||
|
vcpkg_deps_from_source/
|
||||||
|
|||||||
1060
CMakeLists.txt
1060
CMakeLists.txt
File diff suppressed because it is too large
Load Diff
2824
Doxyfile.in
Normal file
2824
Doxyfile.in
Normal file
File diff suppressed because it is too large
Load Diff
2
LICENSE
2
LICENSE
@@ -1,5 +1,5 @@
|
|||||||
RTAB-Map - https://github.com/introlab/rtabmap
|
RTAB-Map - https://github.com/introlab/rtabmap
|
||||||
Copyright (c) 2010-2021, Mathieu Labbe - IntRoLab - Universite de Sherbrooke, all rights reserved.
|
Copyright (c) 2010-2025, Mathieu Labbe - IntRoLab - Universite de Sherbrooke, all rights reserved.
|
||||||
Copyright (c) XXX, contributors, all rights reserved.
|
Copyright (c) XXX, contributors, all rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|||||||
53
README.md
53
README.md
@@ -4,11 +4,16 @@ rtabmap
|
|||||||
[](http://introlab.github.io/rtabmap)
|
[](http://introlab.github.io/rtabmap)
|
||||||
|
|
||||||
[![Release][release-image]][releases]
|
[![Release][release-image]][releases]
|
||||||
|
[![Downloads][downloads-image]][downloads]
|
||||||
|
[](https://codecov.io/gh/introlab/rtabmap)
|
||||||
[![License][license-image]][license]
|
[![License][license-image]][license]
|
||||||
|
|
||||||
[release-image]: https://img.shields.io/badge/release-0.20.16-green.svg?style=flat
|
[release-image]: https://img.shields.io/badge/release-0.23.1-green.svg?style=flat
|
||||||
[releases]: https://github.com/introlab/rtabmap/releases
|
[releases]: https://github.com/introlab/rtabmap/releases
|
||||||
|
|
||||||
|
[downloads-image]: https://img.shields.io/github/downloads/introlab/rtabmap/total?label=downloads
|
||||||
|
[downloads]: https://github.com/introlab/rtabmap/releases
|
||||||
|
|
||||||
[license-image]: https://img.shields.io/badge/license-BSD-green.svg?style=flat
|
[license-image]: https://img.shields.io/badge/license-BSD-green.svg?style=flat
|
||||||
[license]: https://github.com/introlab/rtabmap/blob/master/LICENSE
|
[license]: https://github.com/introlab/rtabmap/blob/master/LICENSE
|
||||||
|
|
||||||
@@ -16,6 +21,7 @@ RTAB-Map library and standalone application.
|
|||||||
|
|
||||||
* For more information (e.g., papers, major updates), visit [RTAB-Map's home page](http://introlab.github.io/rtabmap).
|
* For more information (e.g., papers, major updates), visit [RTAB-Map's home page](http://introlab.github.io/rtabmap).
|
||||||
* For installation instructions and examples, visit [RTAB-Map's wiki](https://github.com/introlab/rtabmap/wiki).
|
* For installation instructions and examples, visit [RTAB-Map's wiki](https://github.com/introlab/rtabmap/wiki).
|
||||||
|
* For the C++ API of the library, see the [API documentation](https://introlab.github.io/rtabmap/api/latest/), which also lists all [parameters](https://introlab.github.io/rtabmap/api/latest/parameters.html) and [command-line tools](https://introlab.github.io/rtabmap/api/latest/tools.html).
|
||||||
|
|
||||||
To use RTAB-Map under ROS, visit the [rtabmap](http://wiki.ros.org/rtabmap) page on the ROS wiki.
|
To use RTAB-Map under ROS, visit the [rtabmap](http://wiki.ros.org/rtabmap) page on the ROS wiki.
|
||||||
|
|
||||||
@@ -31,13 +37,12 @@ This project is supported by [IntRoLab - Intelligent / Interactive / Integrated
|
|||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Linux</td>
|
<td>
|
||||||
<td><a href="https://github.com/introlab/rtabmap/actions/workflows/cmake.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake.yml/badge.svg" alt="Build Status"/> <br> <a href="https://github.com/introlab/rtabmap/actions/workflows/cmake-ros.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake-ros.yml/badge.svg" alt="Build Status"/> <br> <a href="https://github.com/introlab/rtabmap/actions/workflows/docker.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/docker.yml/badge.svg" alt="Build Status"/>
|
<a href="https://github.com/introlab/rtabmap/actions/workflows/cmake-linux.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake-linux.yml/badge.svg" alt="CMake Linux Build Status"/> <br>
|
||||||
</td>
|
<a href="https://github.com/introlab/rtabmap/actions/workflows/cmake-windows.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake-windows.yml/badge.svg" alt="CMake Windows Build Status"/> <br>
|
||||||
</tr>
|
<a href="https://github.com/introlab/rtabmap/actions/workflows/cmake-macos.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake-macos.yml/badge.svg" alt="CMake MaCOS Build Status"/> <br>
|
||||||
<tr>
|
<a href="https://github.com/introlab/rtabmap/actions/workflows/cmake-ros.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/cmake-ros.yml/badge.svg" alt="CMake ROS Build Status"/> <br>
|
||||||
<td>Windows</td>
|
<a href="https://github.com/introlab/rtabmap/actions/workflows/docker.yml"><img src="https://github.com/introlab/rtabmap/actions/workflows/docker.yml/badge.svg" alt="Docker Build Status"/>
|
||||||
<td><a href="https://ci.appveyor.com/project/matlabbe/rtabmap/branch/master"><img src="https://ci.appveyor.com/api/projects/status/hr73xspix9oqa26h/branch/master?svg=true" alt="Build Status"/>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -50,27 +55,37 @@ This project is supported by [IntRoLab - Intelligent / Interactive / Integrated
|
|||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td rowspan="2">ROS 1</td>
|
<td rowspan="1">ROS 1</td>
|
||||||
<td>Melodic</td>
|
|
||||||
<td><a href="http://build.ros.org/job/Mbin_ubv8_uBv8__rtabmap__ubuntu_bionic_arm64__binary/"><img src="http://build.ros.org/buildStatus/icon?job=Mbin_ubv8_uBv8__rtabmap__ubuntu_bionic_arm64__binary" alt="Build Status"/></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Noetic</td>
|
<td>Noetic</td>
|
||||||
<td><a href="http://build.ros.org/job/Nbin_ufv8_uFv8__rtabmap__ubuntu_focal_arm64__binary/"><img src="http://build.ros.org/buildStatus/icon?job=Nbin_ufv8_uFv8__rtabmap__ubuntu_focal_arm64__binary" alt="Build Status"/></td>
|
<td><a href="http://build.ros.org/job/Nbin_ufv8_uFv8__rtabmap__ubuntu_focal_arm64__binary/"><img src="http://build.ros.org/buildStatus/icon?job=Nbin_ufv8_uFv8__rtabmap__ubuntu_focal_arm64__binary" alt="Build Status"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td rowspan="3">ROS 2</td>
|
<td rowspan="5">ROS 2</td>
|
||||||
<td>Foxy</td>
|
|
||||||
<td><a href="http://build.ros2.org/job/Fbin_uF64__rtabmap__ubuntu_focal_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Fbin_uF64__rtabmap__ubuntu_focal_amd64__binary" alt="Build Status"/></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Humble</td>
|
<td>Humble</td>
|
||||||
<td><a href="http://build.ros2.org/job/Hbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Hbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary" alt="Build Status"/></td>
|
<td><a href="http://build.ros2.org/job/Hbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Hbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary" alt="Build Status"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Jazzy</td>
|
||||||
|
<td><a href="http://build.ros2.org/job/Jbin_uN64__rtabmap__ubuntu_noble_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Jbin_uN64__rtabmap__ubuntu_noble_amd64__binary" alt="Build Status"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Kilted</td>
|
||||||
|
<td><a href="http://build.ros2.org/job/Lbin_uR64__rtabmap__ubuntu_resolute_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Lbin_uR64__rtabmap__ubuntu_resolute_amd64__binary" alt="Build Status"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Lyrical</td>
|
||||||
|
<td><a href="http://build.ros2.org/job/Kbin_uN64__rtabmap__ubuntu_noble_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Kbin_uN64__rtabmap__ubuntu_noble_amd64__binary" alt="Build Status"/></td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Rolling</td>
|
<td>Rolling</td>
|
||||||
<td><a href="http://build.ros2.org/job/Rbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Rbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary" alt="Build Status"/></td>
|
<td><a href="http://build.ros2.org/job/Rbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary/"><img src="http://build.ros2.org/buildStatus/icon?job=Rbin_uJ64__rtabmap__ubuntu_jammy_amd64__binary" alt="Build Status"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Docker</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://hub.docker.com/r/introlab3it/rtabmap">rtabmap</a>
|
||||||
|
</td>
|
||||||
|
<td><img src="https://img.shields.io/docker/pulls/introlab3it/rtabmap" alt="Docker Pulls"/></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
@@ -1,99 +1,102 @@
|
|||||||
# - Config file for the RTABMap package
|
include(CMakeFindDependencyMacro)
|
||||||
# Components:
|
|
||||||
# core (required)
|
|
||||||
# gui (optional)
|
|
||||||
# utilite (required)
|
|
||||||
# It defines the following variables
|
|
||||||
# RTABMap_INCLUDE_DIRS - include directories for RTABMap
|
|
||||||
# RTABMap_LIBRARIES - libraries to link against
|
|
||||||
# RTABMap_CORE - core library
|
|
||||||
# RTABMap_UTILITE - utilite library
|
|
||||||
# RTABMap_GUI - gui library (set if RTABMap is built with Qt)
|
|
||||||
|
|
||||||
# Compute paths
|
# Mandatory dependencies
|
||||||
get_filename_component(RTABMap_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
find_dependency(OpenCV @CONF_OPENCV_VERSION_MAJOR@ COMPONENTS @CONF_OPENCV_COMPONENTS@ OPTIONAL_COMPONENTS @CONF_OPENCV_OPTIONAL_COMPONENTS@)
|
||||||
set(RTABMap_INCLUDE_DIRS "@CONF_INCLUDE_DIRS@")
|
|
||||||
|
|
||||||
#core lib
|
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/RTABMap_guiTargets.cmake")
|
||||||
find_library(RTABMap_CORE_RELEASE NAMES rtabmap_core NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
|
find_dependency(PCL 1.7 COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization)
|
||||||
find_library(RTABMap_CORE_DEBUG NAMES rtabmap_cored NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
|
|
||||||
|
|
||||||
IF(RTABMap_CORE_DEBUG AND RTABMap_CORE_RELEASE)
|
if(@CONF_QT_VERSION@ EQUAL 6)
|
||||||
SET(RTABMap_CORE
|
find_dependency(Qt6 COMPONENTS Widgets Core Gui OpenGL)
|
||||||
debug ${RTABMap_CORE_DEBUG}
|
elseif(@CONF_QT_VERSION@ EQUAL 5)
|
||||||
optimized ${RTABMap_CORE_RELEASE}
|
find_dependency(Qt5 COMPONENTS Widgets Core Gui OpenGL)
|
||||||
)
|
else() # Qt4
|
||||||
ELSEIF(RTABMap_CORE_DEBUG)
|
find_dependency(Qt4 COMPONENTS QtCore QtGui)
|
||||||
SET(RTABMap_CORE ${RTABMap_CORE_DEBUG})
|
endif()
|
||||||
|
set(RTABMap_QT_VERSION @CONF_QT_VERSION@)
|
||||||
ELSE()
|
ELSE()
|
||||||
SET(RTABMap_CORE ${RTABMap_CORE_RELEASE})
|
find_dependency(PCL 1.7 COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation)
|
||||||
|
ENDIF()
|
||||||
|
set(RTABMap_DEFINITIONS ${PCL_DEFINITIONS})
|
||||||
|
add_definitions(${RTABMap_DEFINITIONS}) # To include -march=native if set
|
||||||
|
|
||||||
|
# Optional dependencies
|
||||||
|
IF(EXISTS "${CMAKE_CURRENT_LIST_DIR}/@CONF_MODULES_DIR@")
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/@CONF_MODULES_DIR@")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
#utilite lib
|
IF(@CONF_WITH_REALSENSE2@)
|
||||||
find_library(RTABMap_UTILITE_RELEASE NAMES rtabmap_utilite NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
|
IF(WIN32)
|
||||||
find_library(RTABMap_UTILITE_DEBUG NAMES rtabmap_utilited NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
|
find_dependency(RealSense2)
|
||||||
|
ELSE()
|
||||||
IF(RTABMap_UTILITE_DEBUG AND RTABMap_UTILITE_RELEASE)
|
find_dependency(realsense2)
|
||||||
SET(RTABMap_UTILITE
|
ENDIF()
|
||||||
debug ${RTABMap_UTILITE_DEBUG}
|
|
||||||
optimized ${RTABMap_UTILITE_RELEASE}
|
|
||||||
)
|
|
||||||
ELSEIF(RTABMap_UTILITE_DEBUG)
|
|
||||||
SET(RTABMap_UTILITE ${RTABMap_UTILITE_DEBUG})
|
|
||||||
ELSE()
|
|
||||||
SET(RTABMap_UTILITE ${RTABMap_UTILITE_RELEASE})
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
set(RTABMap_LIBRARIES ${RTABMap_CORE} ${RTABMap_UTILITE})
|
IF(@CONF_WITH_K4A@)
|
||||||
|
IF(WIN32)
|
||||||
|
find_dependency(K4A)
|
||||||
|
ELSE()
|
||||||
|
find_dependency(k4a)
|
||||||
|
find_dependency(k4arecord)
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
list(LENGTH RTABMap_FIND_COMPONENTS RTABMap_FIND_COMPONENTS_LENGTH)
|
IF(@CONF_WITH_DEPTH_AI@)
|
||||||
set(WITH_GUI ON)
|
find_dependency(depthai 2.24)
|
||||||
if(${RTABMap_FIND_COMPONENTS_LENGTH} GREATER 0)
|
ENDIF()
|
||||||
list (FIND RTABMap_FIND_COMPONENTS "gui" _index)
|
|
||||||
if (${_index} EQUAL -1)
|
|
||||||
set(WITH_GUI OFF)
|
|
||||||
endif()
|
|
||||||
endif(${RTABMap_FIND_COMPONENTS_LENGTH} GREATER 0)
|
|
||||||
|
|
||||||
|
IF(@CONF_WITH_XVSDK@)
|
||||||
|
find_dependency(xvsdk)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
#gui lib (OFF if RTAB-Map is not built with Qt)
|
IF(@CONF_WITH_OCTOMAP@)
|
||||||
if(@CONF_WITH_GUI@ AND ${WITH_GUI})
|
find_dependency(octomap)
|
||||||
find_library(RTABMap_GUI_RELEASE NAMES rtabmap_gui NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
|
ENDIF()
|
||||||
find_library(RTABMap_GUI_DEBUG NAMES rtabmap_guid NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
|
|
||||||
|
|
||||||
IF(RTABMap_GUI_DEBUG AND RTABMap_GUI_RELEASE)
|
IF(@CONF_WITH_PYTHON@)
|
||||||
SET(RTABMap_GUI
|
find_dependency(Python3 COMPONENTS Interpreter Development NumPy)
|
||||||
debug ${RTABMap_GUI_DEBUG}
|
ENDIF()
|
||||||
optimized ${RTABMap_GUI_RELEASE}
|
|
||||||
)
|
|
||||||
ELSEIF(RTABMap_GUI_RELEASE)
|
|
||||||
SET(RTABMap_GUI ${RTABMap_GUI_RELEASE})
|
|
||||||
ELSEIF(RTABMap_GUI_DEBUG)
|
|
||||||
SET(RTABMap_GUI ${RTABMap_GUI_DEBUG})
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
set(RTABMap_LIBRARIES ${RTABMap_LIBRARIES} ${RTABMap_GUI})
|
# Provide those for backward compatibilities (e.g., catkin requires them to propagate dependencies)
|
||||||
elseif(${WITH_GUI})
|
set(RTABMap_INCLUDE_DIRS "")
|
||||||
MESSAGE(WARNING "Asked for \"gui\" module but RTABMap hasn't been built with gui support.")
|
set(RTABMap_LIBRARIES "")
|
||||||
endif()
|
set(RTABMap_TARGETS "")
|
||||||
|
|
||||||
# Dependencies
|
set(_RTABMap_supported_components utilite core gui)
|
||||||
if(@CONF_VTK_QT@ AND ${WITH_GUI})
|
|
||||||
find_package(VTK COMPONENTS vtkGUISupportQt NO_MODULE) # to define vtkGUISupportQt target
|
|
||||||
endif(@CONF_VTK_QT@ AND ${WITH_GUI})
|
|
||||||
if(@CONF_DEPTH_AI@)
|
|
||||||
FIND_PACKAGE(depthai 2 QUIET REQUIRED)
|
|
||||||
endif(@CONF_DEPTH_AI@)
|
|
||||||
SET(RTABMap_LIBRARIES ${RTABMap_LIBRARIES} "@CONF_DEPENDENCIES@")
|
|
||||||
|
|
||||||
#backward compatibilities
|
foreach(_comp ${_RTABMap_supported_components})
|
||||||
set(RTABMAP_CORE ${RTABMap_CORE})
|
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/RTABMap_${_comp}Targets.cmake")
|
||||||
set(RTABMAP_UTILITE ${RTABMap_UTILITE})
|
include("${CMAKE_CURRENT_LIST_DIR}/RTABMap_${_comp}Targets.cmake")
|
||||||
if(RTABMap_GUI)
|
set(RTABMap_${_comp}_FOUND True)
|
||||||
set(RTABMAP_GUI ${RTABMap_GUI})
|
set(RTABMap_TARGETS
|
||||||
set(RTABMAP_QT_VERSION @CONF_QT_VERSION@)
|
${RTABMap_TARGETS}
|
||||||
endif(RTABMap_GUI)
|
rtabmap::${_comp})
|
||||||
|
get_target_property(RTABMap_${_comp}_INCLUDE_DIRS rtabmap::${_comp} INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
|
get_target_property(RTABMap_${_comp}_LIBRARIES rtabmap::${_comp} INTERFACE_LINK_LIBRARIES)
|
||||||
|
set(RTABMap_INCLUDE_DIRS
|
||||||
|
${RTABMap_INCLUDE_DIRS}
|
||||||
|
${RTABMap_${_comp}_INCLUDE_DIRS})
|
||||||
|
set(RTABMap_LIBRARIES
|
||||||
|
${RTABMap_LIBRARIES}
|
||||||
|
rtabmap::${_comp})
|
||||||
|
if(RTABMap_${_comp}_LIBRARIES)
|
||||||
|
set(RTABMap_LIBRARIES
|
||||||
|
${RTABMap_LIBRARIES}
|
||||||
|
${RTABMap_${_comp}_LIBRARIES})
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(RTABMap_${_comp}_FOUND False)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
include("${CMAKE_CURRENT_LIST_DIR}/RTABMapTargets.cmake")
|
||||||
find_package_handle_standard_args(RTABMap DEFAULT_MSG RTABMap_LIBRARIES RTABMap_INCLUDE_DIRS)
|
|
||||||
mark_as_advanced(RTABMap_LIBRARIES RTABMap_INCLUDE_DIRS RTABMap_LIBRARY_DIRS)
|
foreach(_comp ${RTABMap_FIND_COMPONENTS})
|
||||||
|
if (NOT RTABMap_${_comp}_FOUND)
|
||||||
|
if(${RTABMap_FIND_REQUIRED_${_comp}})
|
||||||
|
set(RTABMap_FOUND False)
|
||||||
|
set(RTABMap_NOT_FOUND_MESSAGE "Unsupported or not found required component: ${_comp}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
set(PACKAGE_VERSION "@RTABMAP_VERSION@")
|
|
||||||
|
|
||||||
# Check whether the requested PACKAGE_FIND_VERSION is compatible
|
|
||||||
if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
|
|
||||||
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
|
||||||
else()
|
|
||||||
set(PACKAGE_VERSION_COMPATIBLE TRUE)
|
|
||||||
if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}")
|
|
||||||
set(PACKAGE_VERSION_EXACT TRUE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
16
Version.h.in
16
Version.h.in
@@ -35,15 +35,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#define RTABMAP_VERSION_MINOR @PROJECT_VERSION_MINOR@
|
#define RTABMAP_VERSION_MINOR @PROJECT_VERSION_MINOR@
|
||||||
#define RTABMAP_VERSION_PATCH @PROJECT_VERSION_PATCH@
|
#define RTABMAP_VERSION_PATCH @PROJECT_VERSION_PATCH@
|
||||||
|
|
||||||
#define RTABMAP_VERSION_COMPARE(major, minor, patch) (major>=@PROJECT_VERSION_MAJOR@ || (major==@PROJECT_VERSION_MAJOR@ && minor>=@PROJECT_VERSION_MINOR@) || (major==@PROJECT_VERSION_MAJOR@ && minor==@PROJECT_VERSION_MINOR@ && patch >=@PROJECT_VERSION_PATCH@))
|
#define RTABMAP_VERSION_COMPARE(OP, MAJOR, MINOR, PATCH) (RTABMAP_VERSION_MAJOR*10000+RTABMAP_VERSION_MINOR*100+RTABMAP_VERSION_PATCH OP MAJOR*10000+MINOR*100+PATCH)
|
||||||
|
|
||||||
@NONFREE@#define RTABMAP_NONFREE
|
@NONFREE@#define RTABMAP_NONFREE
|
||||||
@TORO@#define RTABMAP_TORO
|
@TORO@#define RTABMAP_TORO
|
||||||
@G2O@#define RTABMAP_G2O
|
@G2O@#define RTABMAP_G2O
|
||||||
@G2O_CPP_CONF@#define RTABMAP_G2O_CPP11 @G2O_CPP11@
|
@G2O_CPP_CONF@#define RTABMAP_G2O_CPP11 @G2O_CPP11@
|
||||||
|
@G2O_WITH_SBA_UTILS_CONF@#define RTABMAP_G2O_WITH_SBA_UTILS
|
||||||
@GTSAM@#define RTABMAP_GTSAM
|
@GTSAM@#define RTABMAP_GTSAM
|
||||||
@CERES@#define RTABMAP_CERES
|
@CERES@#define RTABMAP_CERES
|
||||||
|
@MRPT@#define RTABMAP_MRPT
|
||||||
@VERTIGO@#define RTABMAP_VERTIGO
|
@VERTIGO@#define RTABMAP_VERTIGO
|
||||||
|
@OPENNI@#define RTABMAP_OPENNI
|
||||||
@OPENNI2@#define RTABMAP_OPENNI2
|
@OPENNI2@#define RTABMAP_OPENNI2
|
||||||
@FREENECT@#define RTABMAP_FREENECT
|
@FREENECT@#define RTABMAP_FREENECT
|
||||||
@FREENECT2@#define RTABMAP_FREENECT2
|
@FREENECT2@#define RTABMAP_FREENECT2
|
||||||
@@ -56,8 +59,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
@FASTCV@#define RTABMAP_FASTCV
|
@FASTCV@#define RTABMAP_FASTCV
|
||||||
@OPENGV@#define RTABMAP_OPENGV
|
@OPENGV@#define RTABMAP_OPENGV
|
||||||
@PDAL@#define RTABMAP_PDAL
|
@PDAL@#define RTABMAP_PDAL
|
||||||
|
@LIBLAS@#define RTABMAP_LIBLAS
|
||||||
|
@CUDASIFT@#define RTABMAP_CUDASIFT
|
||||||
@LOAM@#define RTABMAP_LOAM
|
@LOAM@#define RTABMAP_LOAM
|
||||||
@FLOAM@#define RTABMAP_FLOAM
|
@FLOAM@#define RTABMAP_FLOAM
|
||||||
|
@LIOSAM@#define RTABMAP_LIOSAM
|
||||||
@DC1394@#define RTABMAP_DC1394
|
@DC1394@#define RTABMAP_DC1394
|
||||||
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
||||||
@ZED@#define RTABMAP_ZED
|
@ZED@#define RTABMAP_ZED
|
||||||
@@ -67,7 +73,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
@REALSENSE2@#define RTABMAP_REALSENSE2
|
@REALSENSE2@#define RTABMAP_REALSENSE2
|
||||||
@MYNTEYE@#define RTABMAP_MYNTEYE
|
@MYNTEYE@#define RTABMAP_MYNTEYE
|
||||||
@DEPTHAI@#define RTABMAP_DEPTHAI
|
@DEPTHAI@#define RTABMAP_DEPTHAI
|
||||||
|
@XVSDK@#define RTABMAP_XVSDK
|
||||||
|
@ORBBEC_SDK@#define RTABMAP_ORBBEC_SDK
|
||||||
@OCTOMAP@#define RTABMAP_OCTOMAP
|
@OCTOMAP@#define RTABMAP_OCTOMAP
|
||||||
|
@GRIDMAP@#define RTABMAP_GRIDMAP
|
||||||
@CPUTSDF@#define RTABMAP_CPUTSDF
|
@CPUTSDF@#define RTABMAP_CPUTSDF
|
||||||
@ALICE_VISION@#define RTABMAP_ALICE_VISION
|
@ALICE_VISION@#define RTABMAP_ALICE_VISION
|
||||||
@OPENCHISEL@#define RTABMAP_OPENCHISEL
|
@OPENCHISEL@#define RTABMAP_OPENCHISEL
|
||||||
@@ -76,13 +85,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
@DVO@#define RTABMAP_DVO
|
@DVO@#define RTABMAP_DVO
|
||||||
@OKVIS@#define RTABMAP_OKVIS
|
@OKVIS@#define RTABMAP_OKVIS
|
||||||
@MSCKF_VIO@#define RTABMAP_MSCKF_VIO
|
@MSCKF_VIO@#define RTABMAP_MSCKF_VIO
|
||||||
@VINS@#define RTABMAP_VINS
|
@VINSFUSION@#define RTABMAP_VINS_FUSION
|
||||||
@OPENVINS@#define RTABMAP_OPENVINS
|
@OPENVINS@#define RTABMAP_OPENVINS
|
||||||
|
@CUVSLAM@#define RTABMAP_CUVSLAM
|
||||||
@ORB_SLAM@#define RTABMAP_ORB_SLAM @ORB_SLAM_VERSION@
|
@ORB_SLAM@#define RTABMAP_ORB_SLAM @ORB_SLAM_VERSION@
|
||||||
@ORB_OCTREE@#define RTABMAP_ORB_OCTREE
|
@ORB_OCTREE@#define RTABMAP_ORB_OCTREE
|
||||||
@TORCH@#define RTABMAP_TORCH
|
@TORCH@#define RTABMAP_TORCH
|
||||||
@PYTHON@#define RTABMAP_PYTHON
|
@PYTHON@#define RTABMAP_PYTHON
|
||||||
@MADGWICK@#define RTABMAP_MADGWICK
|
@MADGWICK@#define RTABMAP_MADGWICK
|
||||||
|
@APRILTAG@#define RTABMAP_APRILTAG
|
||||||
|
@APRILTAG_ARUCO@#define RTABMAP_APRILTAG_WITH_ARUCO
|
||||||
|
|
||||||
#include <pcl/pcl_config.h>
|
#include <pcl/pcl_config.h>
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,10 @@ SET(INCLUDE_DIRS
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/tango-gl/include
|
${CMAKE_CURRENT_SOURCE_DIR}/tango-gl/include
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/third-party/include
|
${CMAKE_CURRENT_SOURCE_DIR}/third-party/include
|
||||||
${PROJECT_BINARY_DIR}/corelib/include
|
${PROJECT_BINARY_DIR}/corelib/include
|
||||||
${PROJECT_SOURCE_DIR}/corelib/include
|
${PROJECT_SOURCE_DIR}/corelib/include
|
||||||
${PROJECT_SOURCE_DIR}/utilite/include
|
${PROJECT_SOURCE_DIR}/utilite/include
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
${OpenCV_INCLUDE_DIRS}
|
${OpenCV_INCLUDE_DIRS}
|
||||||
${PCL_INCLUDE_DIRS}
|
${PCL_INCLUDE_DIRS}
|
||||||
"${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include"
|
"${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include"
|
||||||
@@ -24,14 +25,19 @@ set(sources
|
|||||||
point_cloud_drawable.cpp
|
point_cloud_drawable.cpp
|
||||||
graph_drawable.cpp
|
graph_drawable.cpp
|
||||||
background_renderer.cc
|
background_renderer.cc
|
||||||
|
text_drawable.cpp
|
||||||
|
quad_color.cpp
|
||||||
|
tango-gl/bounding_box.cpp
|
||||||
tango-gl/axis.cpp
|
tango-gl/axis.cpp
|
||||||
tango-gl/camera.cpp
|
tango-gl/camera.cpp
|
||||||
|
tango-gl/circle.cpp
|
||||||
tango-gl/conversions.cpp
|
tango-gl/conversions.cpp
|
||||||
tango-gl/drawable_object.cpp
|
tango-gl/drawable_object.cpp
|
||||||
tango-gl/frustum.cpp
|
tango-gl/frustum.cpp
|
||||||
tango-gl/gesture_camera.cpp
|
tango-gl/gesture_camera.cpp
|
||||||
tango-gl/grid.cpp
|
tango-gl/grid.cpp
|
||||||
tango-gl/line.cpp
|
tango-gl/line.cpp
|
||||||
|
tango-gl/mesh.cpp
|
||||||
tango-gl/shaders.cpp
|
tango-gl/shaders.cpp
|
||||||
tango-gl/trace.cpp
|
tango-gl/trace.cpp
|
||||||
tango-gl/transform.cpp
|
tango-gl/transform.cpp
|
||||||
@@ -114,7 +120,35 @@ add_definitions(${PCL_DEFINITIONS})
|
|||||||
|
|
||||||
INCLUDE_DIRECTORIES(${INCLUDE_DIRS})
|
INCLUDE_DIRECTORIES(${INCLUDE_DIRS})
|
||||||
|
|
||||||
add_library(NativeRTABMap SHARED ${sources})
|
####################################
|
||||||
|
# Generate resources files
|
||||||
|
####################################
|
||||||
|
SET(RESOURCES
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/resources/text_atlas.png
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach(arg ${RESOURCES})
|
||||||
|
get_filename_component(filename ${arg} NAME)
|
||||||
|
string(REPLACE "." "_" output ${filename})
|
||||||
|
set(RESOURCES_HEADERS "${RESOURCES_HEADERS}" "${CMAKE_CURRENT_BINARY_DIR}/${output}.h")
|
||||||
|
endforeach(arg ${RESOURCES})
|
||||||
|
|
||||||
|
find_host_program(RTABMAP_RES_TOOL rtabmap-res_tool PATHS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
|
||||||
|
IF(NOT RTABMAP_RES_TOOL)
|
||||||
|
MESSAGE( FATAL_ERROR "RTABMAP_RES_TOOL is not defined (it is the path to \"rtabmap-res_tool\" application created by a non-Android build)." )
|
||||||
|
ENDIF(NOT RTABMAP_RES_TOOL)
|
||||||
|
|
||||||
|
ADD_CUSTOM_COMMAND(
|
||||||
|
OUTPUT ${RESOURCES_HEADERS}
|
||||||
|
COMMAND ${RTABMAP_RES_TOOL} -n rtabmap -p ${CMAKE_CURRENT_BINARY_DIR} ${RESOURCES}
|
||||||
|
COMMENT "[Creating resources]"
|
||||||
|
DEPENDS ${RESOURCES}
|
||||||
|
)
|
||||||
|
####################################
|
||||||
|
# Generate resources files END
|
||||||
|
####################################
|
||||||
|
|
||||||
|
add_library(NativeRTABMap SHARED ${sources} ${RESOURCES_HEADERS})
|
||||||
target_link_libraries(NativeRTABMap ${LIBRARIES}
|
target_link_libraries(NativeRTABMap ${LIBRARIES}
|
||||||
android
|
android
|
||||||
log
|
log
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ namespace rtabmap {
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// CameraARCore
|
// CameraARCore
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
CameraARCore::CameraARCore(void* env, void* context, void* activity, bool depthFromMotion, bool smoothing):
|
CameraARCore::CameraARCore(void* env, void* context, void* activity, bool depthFromMotion, float upstreamRelocalizationAccThr):
|
||||||
CameraMobile(smoothing),
|
CameraMobile(upstreamRelocalizationAccThr),
|
||||||
env_(env),
|
env_(env),
|
||||||
context_(context),
|
context_(context),
|
||||||
activity_(activity),
|
activity_(activity),
|
||||||
@@ -125,6 +125,8 @@ bool CameraARCore::init(const std::string & calibrationFolder, const std::string
|
|||||||
{
|
{
|
||||||
close();
|
close();
|
||||||
|
|
||||||
|
CameraMobile::init(calibrationFolder, cameraName);
|
||||||
|
|
||||||
UScopeMutex lock(arSessionMutex_);
|
UScopeMutex lock(arSessionMutex_);
|
||||||
|
|
||||||
ArInstallStatus install_status;
|
ArInstallStatus install_status;
|
||||||
@@ -272,54 +274,6 @@ void CameraARCore::close()
|
|||||||
CameraMobile::close();
|
CameraMobile::close();
|
||||||
}
|
}
|
||||||
|
|
||||||
LaserScan CameraARCore::scanFromPointCloudData(
|
|
||||||
const float * pointCloudData,
|
|
||||||
int points,
|
|
||||||
const Transform & pose,
|
|
||||||
const CameraModel & model,
|
|
||||||
const cv::Mat & rgb,
|
|
||||||
std::vector<cv::KeyPoint> * kpts,
|
|
||||||
std::vector<cv::Point3f> * kpts3D)
|
|
||||||
{
|
|
||||||
if(pointCloudData && points>0)
|
|
||||||
{
|
|
||||||
cv::Mat scanData(1, points, CV_32FC4);
|
|
||||||
float * ptr = scanData.ptr<float>();
|
|
||||||
for(unsigned int i=0;i<points; ++i)
|
|
||||||
{
|
|
||||||
cv::Point3f pt(pointCloudData[i*4], pointCloudData[i*4 + 1], pointCloudData[i*4 + 2]);
|
|
||||||
pt = util3d::transformPoint(pt, pose.inverse()*rtabmap_world_T_opengl_world);
|
|
||||||
ptr[i*4] = pt.x;
|
|
||||||
ptr[i*4 + 1] = pt.y;
|
|
||||||
ptr[i*4 + 2] = pt.z;
|
|
||||||
|
|
||||||
//get color from rgb image
|
|
||||||
cv::Point3f org= pt;
|
|
||||||
pt = util3d::transformPoint(pt, opticalRotationInv);
|
|
||||||
int u,v;
|
|
||||||
model.reproject(pt.x, pt.y, pt.z, u, v);
|
|
||||||
unsigned char r=255,g=255,b=255;
|
|
||||||
if(model.inFrame(u, v))
|
|
||||||
{
|
|
||||||
b=rgb.at<cv::Vec3b>(v,u).val[0];
|
|
||||||
g=rgb.at<cv::Vec3b>(v,u).val[1];
|
|
||||||
r=rgb.at<cv::Vec3b>(v,u).val[2];
|
|
||||||
if(kpts)
|
|
||||||
kpts->push_back(cv::KeyPoint(u,v,3));
|
|
||||||
if(kpts3D)
|
|
||||||
kpts3D->push_back(org);
|
|
||||||
}
|
|
||||||
*(int*)&ptr[i*4 + 3] = int(b) | (int(g) << 8) | (int(r) << 16);
|
|
||||||
|
|
||||||
//confidence
|
|
||||||
//*(int*)&ptr[i*4 + 3] = (int(pointCloudData[i*4 + 3] * 255.0f) << 8) | (int(255) << 16);
|
|
||||||
|
|
||||||
}
|
|
||||||
return LaserScan::backwardCompatibility(scanData, 0, 10, rtabmap::Transform::getIdentity());
|
|
||||||
}
|
|
||||||
return LaserScan();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CameraARCore::setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height)
|
void CameraARCore::setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height)
|
||||||
{
|
{
|
||||||
CameraMobile::setScreenRotationAndSize(colorCameraToDisplayRotation, width, height);
|
CameraMobile::setScreenRotationAndSize(colorCameraToDisplayRotation, width, height);
|
||||||
@@ -334,11 +288,12 @@ void CameraARCore::setScreenRotationAndSize(ScreenRotation colorCameraToDisplayR
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SensorData CameraARCore::captureImage(CameraInfo * info)
|
SensorData CameraARCore::updateDataOnRender(Transform & pose)
|
||||||
{
|
{
|
||||||
UScopeMutex lock(arSessionMutex_);
|
UScopeMutex lock(arSessionMutex_);
|
||||||
//LOGI("Capturing image...");
|
//LOGI("Capturing image...");
|
||||||
|
|
||||||
|
pose.setNull();
|
||||||
SensorData data;
|
SensorData data;
|
||||||
if(!arSession_)
|
if(!arSession_)
|
||||||
{
|
{
|
||||||
@@ -370,7 +325,7 @@ SensorData CameraARCore::captureImage(CameraInfo * info)
|
|||||||
if (geometry_changed != 0 || !uvs_initialized_) {
|
if (geometry_changed != 0 || !uvs_initialized_) {
|
||||||
ArFrame_transformCoordinates2d(
|
ArFrame_transformCoordinates2d(
|
||||||
arSession_, arFrame_, AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES,
|
arSession_, arFrame_, AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES,
|
||||||
BackgroundRenderer::kNumVertices, BackgroundRenderer_kVertices, AR_COORDINATES_2D_TEXTURE_NORMALIZED,
|
BackgroundRenderer::kNumVertices, BackgroundRenderer_kVerticesDevice, AR_COORDINATES_2D_TEXTURE_NORMALIZED,
|
||||||
transformed_uvs_);
|
transformed_uvs_);
|
||||||
UASSERT(transformed_uvs_);
|
UASSERT(transformed_uvs_);
|
||||||
uvs_initialized_ = true;
|
uvs_initialized_ = true;
|
||||||
@@ -384,16 +339,9 @@ SensorData CameraARCore::captureImage(CameraInfo * info)
|
|||||||
/*near=*/0.1f, /*far=*/100.f,
|
/*near=*/0.1f, /*far=*/100.f,
|
||||||
glm::value_ptr(projectionMatrix_));
|
glm::value_ptr(projectionMatrix_));
|
||||||
|
|
||||||
// adjust origin
|
|
||||||
if(!getOriginOffset().isNull())
|
|
||||||
{
|
|
||||||
viewMatrix_ = glm::inverse(rtabmap::glmFromTransform(rtabmap::opengl_world_T_rtabmap_world * getOriginOffset() *rtabmap::rtabmap_world_T_opengl_world)*glm::inverse(viewMatrix_));
|
|
||||||
}
|
|
||||||
|
|
||||||
ArTrackingState camera_tracking_state;
|
ArTrackingState camera_tracking_state;
|
||||||
ArCamera_getTrackingState(arSession_, ar_camera, &camera_tracking_state);
|
ArCamera_getTrackingState(arSession_, ar_camera, &camera_tracking_state);
|
||||||
|
|
||||||
Transform pose;
|
|
||||||
CameraModel model;
|
CameraModel model;
|
||||||
if(camera_tracking_state == AR_TRACKING_STATE_TRACKING)
|
if(camera_tracking_state == AR_TRACKING_STATE_TRACKING)
|
||||||
{
|
{
|
||||||
@@ -401,23 +349,13 @@ SensorData CameraARCore::captureImage(CameraInfo * info)
|
|||||||
float pose_raw[7];
|
float pose_raw[7];
|
||||||
ArCamera_getPose(arSession_, ar_camera, arPose_);
|
ArCamera_getPose(arSession_, ar_camera, arPose_);
|
||||||
ArPose_getPoseRaw(arSession_, arPose_, pose_raw);
|
ArPose_getPoseRaw(arSession_, arPose_, pose_raw);
|
||||||
pose = Transform(pose_raw[4], pose_raw[5], pose_raw[6], pose_raw[0], pose_raw[1], pose_raw[2], pose_raw[3]);
|
Transform poseArCore = Transform(pose_raw[4], pose_raw[5], pose_raw[6], pose_raw[0], pose_raw[1], pose_raw[2], pose_raw[3]);
|
||||||
pose = rtabmap::rtabmap_world_T_opengl_world * pose * rtabmap::opengl_world_T_rtabmap_world;
|
pose = rtabmap::rtabmap_world_T_opengl_world * poseArCore * rtabmap::opengl_world_T_rtabmap_world;
|
||||||
|
|
||||||
Transform poseArCore = pose;
|
|
||||||
if(pose.isNull())
|
if(pose.isNull())
|
||||||
{
|
{
|
||||||
LOGE("CameraARCore: Pose is null");
|
LOGE("CameraARCore: Pose is null");
|
||||||
}
|
return data;
|
||||||
else
|
|
||||||
{
|
|
||||||
this->poseReceived(pose);
|
|
||||||
// adjust origin
|
|
||||||
if(!getOriginOffset().isNull())
|
|
||||||
{
|
|
||||||
pose = getOriginOffset() * pose;
|
|
||||||
}
|
|
||||||
info->odomPose = pose;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get calibration parameters
|
// Get calibration parameters
|
||||||
@@ -541,7 +479,11 @@ SensorData CameraARCore::captureImage(CameraInfo * info)
|
|||||||
#endif
|
#endif
|
||||||
if(pointCloudData && points>0)
|
if(pointCloudData && points>0)
|
||||||
{
|
{
|
||||||
scan = scanFromPointCloudData(pointCloudData, points, poseArCore, model, rgb, &kpts, &kpts3);
|
cv::Mat pointCloudDataMat(1, points, CV_32FC4, (void *)pointCloudData);
|
||||||
|
scan = scanFromPointCloudData(pointCloudDataMat, pose, model, rgb, &kpts, &kpts3);
|
||||||
|
#ifndef DISABLE_LOG
|
||||||
|
LOGI("valid scan points = %d", scan.size());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -551,6 +493,11 @@ SensorData CameraARCore::captureImage(CameraInfo * info)
|
|||||||
|
|
||||||
data = SensorData(scan, rgb, depthFromMotion_?getOcclusionImage():cv::Mat(), model, 0, stamp);
|
data = SensorData(scan, rgb, depthFromMotion_?getOcclusionImage():cv::Mat(), model, 0, stamp);
|
||||||
data.setFeatures(kpts, kpts3, cv::Mat());
|
data.setFeatures(kpts, kpts3, cv::Mat());
|
||||||
|
|
||||||
|
if(!pose.isNull())
|
||||||
|
{
|
||||||
|
this->poseReceived(pose, stamp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -571,134 +518,6 @@ SensorData CameraARCore::captureImage(CameraInfo * info)
|
|||||||
ArCamera_release(ar_camera);
|
ArCamera_release(ar_camera);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void CameraARCore::capturePoseOnly()
|
|
||||||
{
|
|
||||||
UScopeMutex lock(arSessionMutex_);
|
|
||||||
//LOGI("Capturing image...");
|
|
||||||
|
|
||||||
if(!arSession_)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(textureId_ != 0)
|
|
||||||
{
|
|
||||||
glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId_);
|
|
||||||
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
ArSession_setCameraTextureName(arSession_, textureId_);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update session to get current frame and render camera background.
|
|
||||||
if (ArSession_update(arSession_, arFrame_) != AR_SUCCESS) {
|
|
||||||
LOGE("CameraARCore::capturePoseOnly() ArSession_update error");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If display rotation changed (also includes view size change), we need to
|
|
||||||
// re-query the uv coordinates for the on-screen portion of the camera image.
|
|
||||||
int32_t geometry_changed = 0;
|
|
||||||
ArFrame_getDisplayGeometryChanged(arSession_, arFrame_, &geometry_changed);
|
|
||||||
if (geometry_changed != 0 || !uvs_initialized_) {
|
|
||||||
ArFrame_transformCoordinates2d(
|
|
||||||
arSession_, arFrame_, AR_COORDINATES_2D_OPENGL_NORMALIZED_DEVICE_COORDINATES,
|
|
||||||
BackgroundRenderer::kNumVertices, BackgroundRenderer_kVertices, AR_COORDINATES_2D_TEXTURE_NORMALIZED,
|
|
||||||
transformed_uvs_);
|
|
||||||
UASSERT(transformed_uvs_);
|
|
||||||
uvs_initialized_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ArCamera* ar_camera;
|
|
||||||
ArFrame_acquireCamera(arSession_, arFrame_, &ar_camera);
|
|
||||||
|
|
||||||
ArCamera_getViewMatrix(arSession_, ar_camera, glm::value_ptr(viewMatrix_));
|
|
||||||
ArCamera_getProjectionMatrix(arSession_, ar_camera,
|
|
||||||
/*near=*/0.1f, /*far=*/100.f,
|
|
||||||
glm::value_ptr(projectionMatrix_));
|
|
||||||
|
|
||||||
// adjust origin
|
|
||||||
if(!getOriginOffset().isNull())
|
|
||||||
{
|
|
||||||
viewMatrix_ = glm::inverse(rtabmap::glmFromTransform(rtabmap::opengl_world_T_rtabmap_world * getOriginOffset() *rtabmap::rtabmap_world_T_opengl_world)*glm::inverse(viewMatrix_));
|
|
||||||
}
|
|
||||||
|
|
||||||
ArTrackingState camera_tracking_state;
|
|
||||||
ArCamera_getTrackingState(arSession_, ar_camera, &camera_tracking_state);
|
|
||||||
|
|
||||||
Transform pose;
|
|
||||||
CameraModel model;
|
|
||||||
if(camera_tracking_state == AR_TRACKING_STATE_TRACKING)
|
|
||||||
{
|
|
||||||
// pose in OpenGL coordinates
|
|
||||||
float pose_raw[7];
|
|
||||||
ArCamera_getPose(arSession_, ar_camera, arPose_);
|
|
||||||
ArPose_getPoseRaw(arSession_, arPose_, pose_raw);
|
|
||||||
pose = Transform(pose_raw[4], pose_raw[5], pose_raw[6], pose_raw[0], pose_raw[1], pose_raw[2], pose_raw[3]);
|
|
||||||
if(!pose.isNull())
|
|
||||||
{
|
|
||||||
pose = rtabmap::rtabmap_world_T_opengl_world * pose * rtabmap::opengl_world_T_rtabmap_world;
|
|
||||||
this->poseReceived(pose);
|
|
||||||
|
|
||||||
if(!getOriginOffset().isNull())
|
|
||||||
{
|
|
||||||
pose = getOriginOffset() * pose;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t is_depth_supported = 0;
|
|
||||||
ArSession_isDepthModeSupported(arSession_, AR_DEPTH_MODE_AUTOMATIC, &is_depth_supported);
|
|
||||||
|
|
||||||
if(is_depth_supported)
|
|
||||||
{
|
|
||||||
LOGD("Acquire depth image!");
|
|
||||||
ArImage * depthImage = nullptr;
|
|
||||||
ArFrame_acquireDepthImage(arSession_, arFrame_, &depthImage);
|
|
||||||
|
|
||||||
ArImageFormat format;
|
|
||||||
ArImage_getFormat(arSession_, depthImage, &format);
|
|
||||||
if(format == AR_IMAGE_FORMAT_DEPTH16)
|
|
||||||
{
|
|
||||||
LOGD("Depth format detected!");
|
|
||||||
int planeCount;
|
|
||||||
ArImage_getNumberOfPlanes(arSession_, depthImage, &planeCount);
|
|
||||||
LOGD("planeCount=%d", planeCount);
|
|
||||||
UASSERT_MSG(planeCount == 1, uFormat("Error: getNumberOfPlanes() planceCount = %d", planeCount).c_str());
|
|
||||||
const uint8_t *data = nullptr;
|
|
||||||
int len = 0;
|
|
||||||
int stride;
|
|
||||||
int width;
|
|
||||||
int height;
|
|
||||||
ArImage_getWidth(arSession_, depthImage, &width);
|
|
||||||
ArImage_getHeight(arSession_, depthImage, &height);
|
|
||||||
ArImage_getPlaneRowStride(arSession_, depthImage, 0, &stride);
|
|
||||||
ArImage_getPlaneData(arSession_, depthImage, 0, &data, &len);
|
|
||||||
|
|
||||||
LOGD("width=%d, height=%d, bytes=%d stride=%d", width, height, len, stride);
|
|
||||||
|
|
||||||
cv::Mat occlusionImage = cv::Mat(height, width, CV_16UC1, (void*)data).clone();
|
|
||||||
|
|
||||||
float fx,fy, cx, cy;
|
|
||||||
int32_t rgb_width, rgb_height;
|
|
||||||
ArCamera_getImageIntrinsics(arSession_, ar_camera, arCameraIntrinsics_);
|
|
||||||
ArCameraIntrinsics_getFocalLength(arSession_, arCameraIntrinsics_, &fx, &fy);
|
|
||||||
ArCameraIntrinsics_getPrincipalPoint(arSession_, arCameraIntrinsics_, &cx, &cy);
|
|
||||||
ArCameraIntrinsics_getImageDimensions(arSession_, arCameraIntrinsics_, &rgb_width, &rgb_height);
|
|
||||||
|
|
||||||
float scaleX = (float)width / (float)rgb_width;
|
|
||||||
float scaleY = (float)height / (float)rgb_height;
|
|
||||||
CameraModel occlusionModel(fx*scaleX, fy*scaleY, cx*scaleX, cy*scaleY, pose*deviceTColorCamera_, 0, cv::Size(width, height));
|
|
||||||
this->setOcclusionImage(occlusionImage, occlusionModel);
|
|
||||||
}
|
|
||||||
ArImage_release(depthImage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ArCamera_release(ar_camera);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
@@ -50,36 +50,17 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class CameraARCore : public CameraMobile {
|
class CameraARCore : public CameraMobile {
|
||||||
public:
|
public:
|
||||||
static LaserScan scanFromPointCloudData(
|
CameraARCore(void* env, void* context, void* activity, bool depthFromMotion = false, float upstreamRelocalizationAccThr = 0.0f);
|
||||||
const float * pointCloudData,
|
|
||||||
int points,
|
|
||||||
const Transform & pose,
|
|
||||||
const CameraModel & model,
|
|
||||||
const cv::Mat & rgb,
|
|
||||||
std::vector<cv::KeyPoint> * kpts = 0,
|
|
||||||
std::vector<cv::Point3f> * kpts3D = 0);
|
|
||||||
|
|
||||||
public:
|
|
||||||
CameraARCore(void* env, void* context, void* activity, bool depthFromMotion = false, bool smoothing = false);
|
|
||||||
virtual ~CameraARCore();
|
virtual ~CameraARCore();
|
||||||
|
|
||||||
bool uvsInitialized() const {return uvs_initialized_;}
|
|
||||||
const float* uvsTransformed() const {return transformed_uvs_;}
|
|
||||||
void getVPMatrices(glm::mat4 & view, glm::mat4 & projection) const {view=viewMatrix_; projection=projectionMatrix_;}
|
|
||||||
|
|
||||||
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height);
|
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height);
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
void setupGL();
|
virtual void close(); // close ARCore connection
|
||||||
virtual void close(); // close Tango connection
|
|
||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
GLuint getTextureId() const {return textureId_;}
|
|
||||||
|
|
||||||
void imageCallback(AImageReader *reader);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage(CameraInfo * info = 0); // should be called in opengl thread
|
virtual SensorData updateDataOnRender(Transform & pose); // should be called in opengl thread
|
||||||
virtual void capturePoseOnly();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtabmap::Transform getPoseAtTimestamp(double timestamp);
|
rtabmap::Transform getPoseAtTimestamp(double timestamp);
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ namespace rtabmap {
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// CameraAREngine
|
// CameraAREngine
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
CameraAREngine::CameraAREngine(void* env, void* context, void* activity, bool smoothing):
|
CameraAREngine::CameraAREngine(void* env, void* context, void* activity, float upstreamRelocalizationAccThr):
|
||||||
CameraMobile(smoothing),
|
CameraMobile(upstreamRelocalizationAccThr),
|
||||||
env_(env),
|
env_(env),
|
||||||
context_(context),
|
context_(context),
|
||||||
activity_(activity),
|
activity_(activity),
|
||||||
@@ -66,6 +66,8 @@ bool CameraAREngine::init(const std::string & calibrationFolder, const std::stri
|
|||||||
{
|
{
|
||||||
close();
|
close();
|
||||||
|
|
||||||
|
CameraMobile::init(calibrationFolder, cameraName);
|
||||||
|
|
||||||
UScopeMutex lock(arSessionMutex_);
|
UScopeMutex lock(arSessionMutex_);
|
||||||
|
|
||||||
HwArInstallStatus install_status;
|
HwArInstallStatus install_status;
|
||||||
@@ -117,9 +119,6 @@ bool CameraAREngine::init(const std::string & calibrationFolder, const std::stri
|
|||||||
|
|
||||||
deviceTColorCamera_ = opticalRotation;
|
deviceTColorCamera_ = opticalRotation;
|
||||||
|
|
||||||
// Required as ArSession_update does some off-screen OpenGL stuff...
|
|
||||||
HwArSession_setCameraTextureName(arSession_, textureId_);
|
|
||||||
|
|
||||||
if (HwArSession_resume(arSession_) != HWAR_SUCCESS)
|
if (HwArSession_resume(arSession_) != HWAR_SUCCESS)
|
||||||
{
|
{
|
||||||
UERROR("Cannot resume camera!");
|
UERROR("Cannot resume camera!");
|
||||||
@@ -169,38 +168,81 @@ void CameraAREngine::close()
|
|||||||
CameraMobile::close();
|
CameraMobile::close();
|
||||||
}
|
}
|
||||||
|
|
||||||
SensorData CameraAREngine::captureImage(CameraInfo * info)
|
void CameraAREngine::setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height)
|
||||||
|
{
|
||||||
|
CameraMobile::setScreenRotationAndSize(colorCameraToDisplayRotation, width, height);
|
||||||
|
if(arSession_)
|
||||||
|
{
|
||||||
|
int ret = static_cast<int>(colorCameraToDisplayRotation) + 1; // remove 90deg camera rotation
|
||||||
|
if (ret > 3) {
|
||||||
|
ret -= 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
HwArSession_setDisplayGeometry(arSession_, ret, width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SensorData CameraAREngine::updateDataOnRender(Transform & pose)
|
||||||
{
|
{
|
||||||
UScopeMutex lock(arSessionMutex_);
|
UScopeMutex lock(arSessionMutex_);
|
||||||
//LOGI("Capturing image...");
|
//LOGI("Capturing image...");
|
||||||
|
|
||||||
|
pose.setNull();
|
||||||
SensorData data;
|
SensorData data;
|
||||||
if(!arSession_)
|
if(!arSession_)
|
||||||
{
|
{
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(textureId_ == 0)
|
||||||
|
{
|
||||||
|
glGenTextures(1, &textureId_);
|
||||||
|
glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId_);
|
||||||
|
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
}
|
||||||
|
if(textureId_!=0)
|
||||||
|
HwArSession_setCameraTextureName(arSession_, textureId_);
|
||||||
|
|
||||||
// Update session to get current frame and render camera background.
|
// Update session to get current frame and render camera background.
|
||||||
if (HwArSession_update(arSession_, arFrame_) != HWAR_SUCCESS) {
|
if (HwArSession_update(arSession_, arFrame_) != HWAR_SUCCESS) {
|
||||||
LOGE("CameraAREngine::captureImage() ArSession_update error");
|
LOGE("CameraAREngine::captureImage() ArSession_update error");
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If display rotation changed (also includes view size change), we need to
|
||||||
|
// re-query the uv coordinates for the on-screen portion of the camera image.
|
||||||
|
int32_t geometry_changed = 0;
|
||||||
|
HwArFrame_getDisplayGeometryChanged(arSession_, arFrame_, &geometry_changed);
|
||||||
|
if (geometry_changed != 0 || !uvs_initialized_) {
|
||||||
|
HwArFrame_transformDisplayUvCoords(
|
||||||
|
arSession_, arFrame_,
|
||||||
|
BackgroundRenderer::kNumVertices*2, BackgroundRenderer_kVerticesView,
|
||||||
|
transformed_uvs_);
|
||||||
|
UERROR("uv: (%f,%f) (%f,%f) (%f,%f) (%f,%f)",
|
||||||
|
transformed_uvs_[0], transformed_uvs_[1],
|
||||||
|
transformed_uvs_[2], transformed_uvs_[3],
|
||||||
|
transformed_uvs_[4], transformed_uvs_[5],
|
||||||
|
transformed_uvs_[6], transformed_uvs_[7]);
|
||||||
|
UASSERT(transformed_uvs_);
|
||||||
|
uvs_initialized_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
HwArCamera* ar_camera;
|
HwArCamera* ar_camera;
|
||||||
HwArFrame_acquireCamera(arSession_, arFrame_, &ar_camera);
|
HwArFrame_acquireCamera(arSession_, arFrame_, &ar_camera);
|
||||||
|
|
||||||
|
HwArCamera_getViewMatrix(arSession_, ar_camera, glm::value_ptr(viewMatrix_));
|
||||||
|
HwArCamera_getProjectionMatrix(arSession_, ar_camera,
|
||||||
|
/*near=*/0.1f, /*far=*/100.f,
|
||||||
|
glm::value_ptr(projectionMatrix_));
|
||||||
|
|
||||||
HwArTrackingState camera_tracking_state;
|
HwArTrackingState camera_tracking_state;
|
||||||
HwArCamera_getTrackingState(arSession_, ar_camera, &camera_tracking_state);
|
HwArCamera_getTrackingState(arSession_, ar_camera, &camera_tracking_state);
|
||||||
|
|
||||||
Transform pose;
|
|
||||||
if(camera_tracking_state == HWAR_TRACKING_STATE_TRACKING)
|
if(camera_tracking_state == HWAR_TRACKING_STATE_TRACKING)
|
||||||
{
|
{
|
||||||
// pose in OpenGL coordinates
|
|
||||||
float pose_raw[7];
|
|
||||||
HwArCamera_getPose(arSession_, ar_camera, arPose_);
|
|
||||||
HwArPose_getPoseRaw(arSession_, arPose_, pose_raw);
|
|
||||||
pose = Transform(pose_raw[4], pose_raw[5], pose_raw[6], pose_raw[0], pose_raw[1], pose_raw[2], pose_raw[3]);
|
|
||||||
|
|
||||||
// Get calibration parameters
|
// Get calibration parameters
|
||||||
// FIXME: Hard-coded as getting intrinsics with the api fails
|
// FIXME: Hard-coded as getting intrinsics with the api fails
|
||||||
float fx=492.689667,fy=492.606201, cx=323.594849, cy=234.659744;
|
float fx=492.689667,fy=492.606201, cx=323.594849, cy=234.659744;
|
||||||
@@ -274,6 +316,21 @@ SensorData CameraAREngine::captureImage(CameraInfo * info)
|
|||||||
double stamp = double(timestamp_ns)/10e8;
|
double stamp = double(timestamp_ns)/10e8;
|
||||||
CameraModel model = CameraModel(fx, fy, cx, cy, deviceTColorCamera_, 0, cv::Size(camWidth, camHeight));
|
CameraModel model = CameraModel(fx, fy, cx, cy, deviceTColorCamera_, 0, cv::Size(camWidth, camHeight));
|
||||||
data = SensorData(outputRGB, outputDepth, model, 0, stamp);
|
data = SensorData(outputRGB, outputDepth, model, 0, stamp);
|
||||||
|
|
||||||
|
// pose in OpenGL coordinates
|
||||||
|
float pose_raw[7];
|
||||||
|
HwArCamera_getPose(arSession_, ar_camera, arPose_);
|
||||||
|
HwArPose_getPoseRaw(arSession_, arPose_, pose_raw);
|
||||||
|
pose = Transform(pose_raw[4], pose_raw[5], pose_raw[6], pose_raw[0], pose_raw[1], pose_raw[2], pose_raw[3]);
|
||||||
|
if(pose.isNull())
|
||||||
|
{
|
||||||
|
LOGE("CameraAREngine: Pose is null");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pose = rtabmap::rtabmap_world_T_opengl_world * pose * rtabmap::opengl_world_T_rtabmap_world;
|
||||||
|
this->poseReceived(pose, stamp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -291,66 +348,8 @@ SensorData CameraAREngine::captureImage(CameraInfo * info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
HwArCamera_release(ar_camera);
|
HwArCamera_release(ar_camera);
|
||||||
|
|
||||||
if(pose.isNull())
|
|
||||||
{
|
|
||||||
LOGE("CameraAREngine: Pose is null");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pose = rtabmap::rtabmap_world_T_opengl_world * pose * rtabmap::opengl_world_T_rtabmap_world;
|
|
||||||
this->poseReceived(pose);
|
|
||||||
// adjust origin
|
|
||||||
if(!getOriginOffset().isNull())
|
|
||||||
{
|
|
||||||
pose = getOriginOffset() * pose;
|
|
||||||
}
|
|
||||||
info->odomPose = pose;
|
|
||||||
}
|
|
||||||
return data;
|
return data;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraAREngine::capturePoseOnly()
|
|
||||||
{
|
|
||||||
UScopeMutex lock(arSessionMutex_);
|
|
||||||
//LOGI("Capturing image...");
|
|
||||||
|
|
||||||
SensorData data;
|
|
||||||
if(!arSession_)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update session to get current frame and render camera background.
|
|
||||||
if (HwArSession_update(arSession_, arFrame_) != HWAR_SUCCESS) {
|
|
||||||
LOGE("CameraARCore::captureImage() ArSession_update error");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
HwArCamera* ar_camera;
|
|
||||||
HwArFrame_acquireCamera(arSession_, arFrame_, &ar_camera);
|
|
||||||
|
|
||||||
HwArTrackingState camera_tracking_state;
|
|
||||||
HwArCamera_getTrackingState(arSession_, ar_camera, &camera_tracking_state);
|
|
||||||
|
|
||||||
Transform pose;
|
|
||||||
CameraModel model;
|
|
||||||
if(camera_tracking_state == HWAR_TRACKING_STATE_TRACKING)
|
|
||||||
{
|
|
||||||
// pose in OpenGL coordinates
|
|
||||||
float pose_raw[7];
|
|
||||||
HwArCamera_getPose(arSession_, ar_camera, arPose_);
|
|
||||||
HwArPose_getPoseRaw(arSession_, arPose_, pose_raw);
|
|
||||||
pose = Transform(pose_raw[4], pose_raw[5], pose_raw[6], pose_raw[0], pose_raw[1], pose_raw[2], pose_raw[3]);
|
|
||||||
if(!pose.isNull())
|
|
||||||
{
|
|
||||||
pose = rtabmap::rtabmap_world_T_opengl_world * pose * rtabmap::opengl_world_T_rtabmap_world;
|
|
||||||
this->poseReceived(pose);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HwArCamera_release(ar_camera);
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <rtabmap/utilite/UEvent.h>
|
#include <rtabmap/utilite/UEvent.h>
|
||||||
#include <rtabmap/utilite/UTimer.h>
|
#include <rtabmap/utilite/UTimer.h>
|
||||||
#include <boost/thread/mutex.hpp>
|
#include <boost/thread/mutex.hpp>
|
||||||
|
#include <background_renderer.h>
|
||||||
|
|
||||||
#include <huawei_arengine_interface.h>
|
#include <huawei_arengine_interface.h>
|
||||||
|
|
||||||
@@ -45,16 +46,17 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class CameraAREngine : public CameraMobile {
|
class CameraAREngine : public CameraMobile {
|
||||||
public:
|
public:
|
||||||
CameraAREngine(void* env, void* context, void* activity, bool smoothing = false);
|
CameraAREngine(void* env, void* context, void* activity, float upstreamRelocalizationAccThr = 0.0f);
|
||||||
virtual ~CameraAREngine();
|
virtual ~CameraAREngine();
|
||||||
|
|
||||||
|
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height);
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
virtual void close(); // close Tango connection
|
virtual void close(); // close AREngine connection
|
||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
virtual SensorData updateDataOnRender(Transform & pose);
|
||||||
virtual void capturePoseOnly();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtabmap::Transform getPoseAtTimestamp(double timestamp);
|
rtabmap::Transform getPoseAtTimestamp(double timestamp);
|
||||||
@@ -69,7 +71,6 @@ private:
|
|||||||
HwArCameraIntrinsics *arCameraIntrinsics_ = nullptr;
|
HwArCameraIntrinsics *arCameraIntrinsics_ = nullptr;
|
||||||
HwArPose * arPose_ = nullptr;
|
HwArPose * arPose_ = nullptr;
|
||||||
bool arInstallRequested_;
|
bool arInstallRequested_;
|
||||||
GLuint textureId_;
|
|
||||||
UMutex arSessionMutex_;
|
UMutex arSessionMutex_;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
@@ -40,9 +41,6 @@ namespace rtabmap {
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// CameraMobile
|
// CameraMobile
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
const float CameraMobile::bilateralFilteringSigmaS = 2.0f;
|
|
||||||
const float CameraMobile::bilateralFilteringSigmaR = 0.075f;
|
|
||||||
|
|
||||||
const rtabmap::Transform CameraMobile::opticalRotation = Transform(
|
const rtabmap::Transform CameraMobile::opticalRotation = Transform(
|
||||||
0.0f, 0.0f, 1.0f, 0.0f,
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
-1.0f, 0.0f, 0.0f, 0.0f,
|
-1.0f, 0.0f, 0.0f, 0.0f,
|
||||||
@@ -52,17 +50,17 @@ const rtabmap::Transform CameraMobile::opticalRotationInv = Transform(
|
|||||||
0.0f, 0.0f, -1.0f, 0.0f,
|
0.0f, 0.0f, -1.0f, 0.0f,
|
||||||
1.0f, 0.0f, 0.0f, 0.0f);
|
1.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
CameraMobile::CameraMobile(bool smoothing) :
|
CameraMobile::CameraMobile(float upstreamRelocalizationAccThr) :
|
||||||
Camera(10),
|
Camera(10),
|
||||||
deviceTColorCamera_(Transform::getIdentity()),
|
deviceTColorCamera_(Transform::getIdentity()),
|
||||||
spinOncePreviousStamp_(0.0),
|
|
||||||
textureId_(0),
|
textureId_(0),
|
||||||
uvs_initialized_(false),
|
uvs_initialized_(false),
|
||||||
previousStamp_(0.0),
|
|
||||||
stampEpochOffset_(0.0),
|
stampEpochOffset_(0.0),
|
||||||
smoothing_(smoothing),
|
|
||||||
colorCameraToDisplayRotation_(ROTATION_0),
|
colorCameraToDisplayRotation_(ROTATION_0),
|
||||||
originUpdate_(false)
|
originUpdate_(true),
|
||||||
|
upstreamRelocalizationAccThr_(upstreamRelocalizationAccThr),
|
||||||
|
previousAnchorStamp_(0.0),
|
||||||
|
dataGoodTracking_(true)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,58 +72,215 @@ CameraMobile::~CameraMobile() {
|
|||||||
bool CameraMobile::init(const std::string &, const std::string &)
|
bool CameraMobile::init(const std::string &, const std::string &)
|
||||||
{
|
{
|
||||||
deviceTColorCamera_ = opticalRotation;
|
deviceTColorCamera_ = opticalRotation;
|
||||||
|
// clear semaphore
|
||||||
|
if(dataReady_.value() > 0) {
|
||||||
|
dataReady_.acquire(dataReady_.value());
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMobile::close()
|
void CameraMobile::close()
|
||||||
{
|
{
|
||||||
previousPose_.setNull();
|
UScopeMutex lock(dataMutex_);
|
||||||
previousStamp_ = 0.0;
|
|
||||||
|
firstFrame_ = true;
|
||||||
lastKnownGPS_ = GPS();
|
lastKnownGPS_ = GPS();
|
||||||
lastEnvSensors_.clear();
|
lastEnvSensors_.clear();
|
||||||
originOffset_ = Transform();
|
originOffset_ = Transform();
|
||||||
originUpdate_ = false;
|
originUpdate_ = true;
|
||||||
pose_ = Transform();
|
dataPose_ = Transform();
|
||||||
data_ = SensorData();
|
data_ = SensorData();
|
||||||
|
dataGoodTracking_ = true;
|
||||||
|
previousAnchorPose_.setNull();
|
||||||
|
previousAnchorLinearVelocity_.clear();
|
||||||
|
previousAnchorStamp_ = 0.0;
|
||||||
|
|
||||||
if(textureId_ != 0)
|
if(textureId_ != 0)
|
||||||
{
|
{
|
||||||
glDeleteTextures(1, &textureId_);
|
glDeleteTextures(1, &textureId_);
|
||||||
textureId_ = 0;
|
textureId_ = 0;
|
||||||
}
|
}
|
||||||
|
// in case someone is waiting on captureImage()
|
||||||
|
dataReady_.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMobile::resetOrigin()
|
void CameraMobile::resetOrigin(const rtabmap::Transform & offset)
|
||||||
{
|
{
|
||||||
previousPose_.setNull();
|
manualOriginOffset_ = offset;
|
||||||
previousStamp_ = 0.0;
|
|
||||||
lastKnownGPS_ = GPS();
|
|
||||||
lastEnvSensors_.clear();
|
|
||||||
pose_ = Transform();
|
|
||||||
data_ = SensorData();
|
|
||||||
originUpdate_ = true;
|
originUpdate_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMobile::poseReceived(const Transform & pose)
|
bool CameraMobile::getPose(double epochStamp, Transform & pose, cv::Mat & covariance, double maxWaitTime)
|
||||||
{
|
{
|
||||||
if(!pose.isNull())
|
pose.setNull();
|
||||||
{
|
|
||||||
// send pose of the camera (without optical rotation)
|
|
||||||
Transform p = pose*deviceTColorCamera_;
|
|
||||||
if(originUpdate_)
|
|
||||||
{
|
|
||||||
originOffset_ = p.translation().inverse();
|
|
||||||
originUpdate_ = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!originOffset_.isNull())
|
int maxWaitTimeMs = maxWaitTime * 1000;
|
||||||
|
|
||||||
|
// Interpolate pose
|
||||||
|
if(!poseBuffer_.empty())
|
||||||
|
{
|
||||||
|
poseMutex_.lock();
|
||||||
|
int waitTry = 0;
|
||||||
|
while(maxWaitTimeMs>0 && poseBuffer_.rbegin()->first < epochStamp && waitTry < maxWaitTimeMs)
|
||||||
{
|
{
|
||||||
this->post(new PoseEvent(originOffset_*p));
|
poseMutex_.unlock();
|
||||||
|
++waitTry;
|
||||||
|
uSleep(1);
|
||||||
|
poseMutex_.lock();
|
||||||
|
}
|
||||||
|
if(poseBuffer_.rbegin()->first < epochStamp)
|
||||||
|
{
|
||||||
|
if(maxWaitTimeMs > 0)
|
||||||
|
{
|
||||||
|
UWARN("Could not find poses to interpolate at time %f after waiting %d ms (latest is %f)...", epochStamp, maxWaitTimeMs, poseBuffer_.rbegin()->first);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UWARN("Could not find poses to interpolate at time %f (latest is %f)...", epochStamp, poseBuffer_.rbegin()->first);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->post(new PoseEvent(p));
|
std::map<double, Transform>::const_iterator iterB = poseBuffer_.lower_bound(epochStamp);
|
||||||
|
std::map<double, Transform>::const_iterator iterA = iterB;
|
||||||
|
if(iterA != poseBuffer_.begin())
|
||||||
|
{
|
||||||
|
iterA = --iterA;
|
||||||
|
}
|
||||||
|
if(iterB == poseBuffer_.end())
|
||||||
|
{
|
||||||
|
iterB = --iterB;
|
||||||
|
}
|
||||||
|
if(iterA == iterB && epochStamp == iterA->first)
|
||||||
|
{
|
||||||
|
pose = iterA->second;
|
||||||
|
}
|
||||||
|
else if(epochStamp >= iterA->first && epochStamp <= iterB->first)
|
||||||
|
{
|
||||||
|
pose = iterA->second.interpolate((epochStamp-iterA->first) / (iterB->first-iterA->first), iterB->second);
|
||||||
|
}
|
||||||
|
else // stamp < iterA->first
|
||||||
|
{
|
||||||
|
UWARN("Could not find pose data to interpolate at time %f (earliest is %f). Are sensors synchronized?", epochStamp, iterA->first);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
poseMutex_.unlock();
|
||||||
|
}
|
||||||
|
return !pose.isNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraMobile::poseReceived(const Transform & pose, double deviceStamp)
|
||||||
|
{
|
||||||
|
// Pose reveived is the pose of the device in rtabmap coordinate
|
||||||
|
if(!pose.isNull())
|
||||||
|
{
|
||||||
|
Transform p = pose;
|
||||||
|
|
||||||
|
if(stampEpochOffset_ == 0.0)
|
||||||
|
{
|
||||||
|
stampEpochOffset_ = UTimer::now() - deviceStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(originUpdate_)
|
||||||
|
{
|
||||||
|
firstFrame_ = true;
|
||||||
|
lastKnownGPS_ = GPS();
|
||||||
|
lastEnvSensors_.clear();
|
||||||
|
dataGoodTracking_ = true;
|
||||||
|
previousAnchorPose_.setNull();
|
||||||
|
previousAnchorLinearVelocity_.clear();
|
||||||
|
previousAnchorStamp_ = 0.0;
|
||||||
|
originOffset_ = manualOriginOffset_.isNull() ? pose.translation().inverse() : manualOriginOffset_;
|
||||||
|
originUpdate_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
double epochStamp = stampEpochOffset_ + deviceStamp;
|
||||||
|
if(!originOffset_.isNull())
|
||||||
|
{
|
||||||
|
// Filter re-localizations from poses received
|
||||||
|
rtabmap::Transform rawPose = originOffset_ * pose.translation(); // remove rotation to keep position in fixed frame
|
||||||
|
// Remove upstream localization corrections by integrating pose from previous frame anchor
|
||||||
|
bool showLog = false;
|
||||||
|
if(upstreamRelocalizationAccThr_>0.0f && !previousAnchorPose_.isNull())
|
||||||
|
{
|
||||||
|
float dt = epochStamp - previousAnchorStamp_;
|
||||||
|
std::vector<float> currentLinearVelocity(3);
|
||||||
|
float dx = rawPose.x()-previousAnchorPose_.x();
|
||||||
|
float dy = rawPose.y()-previousAnchorPose_.y();
|
||||||
|
float dz = rawPose.z()-previousAnchorPose_.z();
|
||||||
|
currentLinearVelocity[0] = dx / dt;
|
||||||
|
currentLinearVelocity[1] = dy / dt;
|
||||||
|
currentLinearVelocity[2] = dz / dt;
|
||||||
|
if(!previousAnchorLinearVelocity_.empty() && uNorm(dx, dy, dz)>0.02)
|
||||||
|
{
|
||||||
|
float ax = (currentLinearVelocity[0] - previousAnchorLinearVelocity_[0]) / dt;
|
||||||
|
float ay = (currentLinearVelocity[1] - previousAnchorLinearVelocity_[1]) / dt;
|
||||||
|
float az = (currentLinearVelocity[2] - previousAnchorLinearVelocity_[2]) / dt;
|
||||||
|
float acceleration = sqrt(ax*ax + ay*ay + az*az);
|
||||||
|
if(acceleration>=upstreamRelocalizationAccThr_)
|
||||||
|
{
|
||||||
|
// Only correct the translation to not lose rotation aligned
|
||||||
|
// with gravity.
|
||||||
|
|
||||||
|
// Use constant motion model to update current pose.
|
||||||
|
rtabmap::Transform offset(previousAnchorLinearVelocity_[0] * dt,
|
||||||
|
previousAnchorLinearVelocity_[1] * dt,
|
||||||
|
previousAnchorLinearVelocity_[2] * dt,
|
||||||
|
0, 0, 0, 1);
|
||||||
|
rtabmap::Transform newRawPose = offset * previousAnchorPose_;
|
||||||
|
currentLinearVelocity = previousAnchorLinearVelocity_;
|
||||||
|
originOffset_.x() += newRawPose.x() - rawPose.x();
|
||||||
|
originOffset_.y() += newRawPose.y() - rawPose.y();
|
||||||
|
originOffset_.z() += newRawPose.z() - rawPose.z();
|
||||||
|
UERROR("Upstream re-localization has been suppressed because of "
|
||||||
|
"high acceleration detected (%f m/s^2) causing a jump!",
|
||||||
|
acceleration);
|
||||||
|
dataGoodTracking_ = false;
|
||||||
|
post(new CameraInfoEvent(0, "UpstreamRelocationFiltered", uFormat("%.1f m/s^2", acceleration).c_str()));
|
||||||
|
showLog = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
previousAnchorLinearVelocity_ = currentLinearVelocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = originOffset_*pose;
|
||||||
|
previousAnchorPose_ = p;
|
||||||
|
previousAnchorStamp_ = epochStamp;
|
||||||
|
|
||||||
|
if(upstreamRelocalizationAccThr_>0.0f) {
|
||||||
|
relocalizationDebugBuffer_.insert(std::make_pair(epochStamp, std::make_pair(pose, p)));
|
||||||
|
if(relocalizationDebugBuffer_.size() > 60)
|
||||||
|
{
|
||||||
|
relocalizationDebugBuffer_.erase(relocalizationDebugBuffer_.begin());
|
||||||
|
}
|
||||||
|
if(showLog) {
|
||||||
|
std::stringstream stream;
|
||||||
|
for(auto iter=relocalizationDebugBuffer_.begin(); iter!=relocalizationDebugBuffer_.end(); ++iter)
|
||||||
|
{
|
||||||
|
stream << iter->first - relocalizationDebugBuffer_.begin()->first
|
||||||
|
<< " " << iter->second.first.x()
|
||||||
|
<< " " << iter->second.first.y()
|
||||||
|
<< " " << iter->second.first.z()
|
||||||
|
<< " " << iter->second.second.x()
|
||||||
|
<< " " << iter->second.second.y()
|
||||||
|
<< " " << iter->second.second.z() << std::endl;
|
||||||
|
}
|
||||||
|
UERROR("timestamp original_xyz corrected_xyz:\n%s", stream.str().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
UScopeMutex lock(poseMutex_);
|
||||||
|
poseBuffer_.insert(poseBuffer_.end(), std::make_pair(epochStamp, p));
|
||||||
|
if(poseBuffer_.size() > 1000)
|
||||||
|
{
|
||||||
|
poseBuffer_.erase(poseBuffer_.begin());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// send pose of the camera (with optical rotation)
|
||||||
|
this->post(new PoseEvent(p * deviceTColorCamera_));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,22 +294,25 @@ void CameraMobile::setGPS(const GPS & gps)
|
|||||||
lastKnownGPS_ = gps;
|
lastKnownGPS_ = gps;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMobile::setData(const SensorData & data, const Transform & pose, const glm::mat4 & viewMatrix, const glm::mat4 & projectionMatrix, const float * texCoord)
|
void CameraMobile::addEnvSensor(int type, float value)
|
||||||
{
|
{
|
||||||
LOGD("CameraMobile::setData pose=%s stamp=%f", pose.prettyPrint().c_str(), data.stamp());
|
lastEnvSensors_.insert(std::make_pair((EnvSensor::Type)type, EnvSensor((EnvSensor::Type)type, value)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraMobile::update(const SensorData & data, const Transform & pose, const glm::mat4 & viewMatrix, const glm::mat4 & projectionMatrix, const float * texCoord)
|
||||||
|
{
|
||||||
|
UScopeMutex lock(dataMutex_);
|
||||||
|
|
||||||
|
LOGD("CameraMobile::update pose=%s stamp=%f", pose.prettyPrint().c_str(), data.stamp());
|
||||||
|
|
||||||
|
bool notify = !data_.isValid();
|
||||||
|
|
||||||
data_ = data;
|
data_ = data;
|
||||||
pose_ = pose;
|
dataPose_ = pose;
|
||||||
|
|
||||||
viewMatrix_ = viewMatrix;
|
viewMatrix_ = viewMatrix;
|
||||||
projectionMatrix_ = projectionMatrix;
|
projectionMatrix_ = projectionMatrix;
|
||||||
|
|
||||||
// adjust origin
|
|
||||||
if(!originOffset_.isNull())
|
|
||||||
{
|
|
||||||
pose_ = originOffset_ * pose_;
|
|
||||||
viewMatrix_ = glm::inverse(rtabmap::glmFromTransform(rtabmap::opengl_world_T_rtabmap_world * originOffset_ *rtabmap::rtabmap_world_T_opengl_world)*glm::inverse(viewMatrix_));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(textureId_ == 0)
|
if(textureId_ == 0)
|
||||||
{
|
{
|
||||||
glGenTextures(1, &textureId_);
|
glGenTextures(1, &textureId_);
|
||||||
@@ -166,7 +324,7 @@ void CameraMobile::setData(const SensorData & data, const Transform & pose, cons
|
|||||||
uvs_initialized_ = true;
|
uvs_initialized_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGD("CameraMobile::setData textureId_=%d", (int)textureId_);
|
LOGD("CameraMobile::update textureId_=%d", (int)textureId_);
|
||||||
|
|
||||||
if(textureId_ != 0 && texCoord != 0)
|
if(textureId_ != 0 && texCoord != 0)
|
||||||
{
|
{
|
||||||
@@ -193,218 +351,233 @@ void CameraMobile::setData(const SensorData & data, const Transform & pose, cons
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(data_.isValid())
|
||||||
|
{
|
||||||
|
postUpdate();
|
||||||
|
|
||||||
|
if(notify)
|
||||||
|
{
|
||||||
|
dataReady_.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMobile::addEnvSensor(int type, float value)
|
void CameraMobile::updateOnRender()
|
||||||
{
|
{
|
||||||
lastEnvSensors_.insert(std::make_pair((EnvSensor::Type)type, EnvSensor((EnvSensor::Type)type, value)));
|
UScopeMutex lock(dataMutex_);
|
||||||
}
|
bool notify = !data_.isValid();
|
||||||
|
|
||||||
void CameraMobile::spinOnce()
|
data_ = updateDataOnRender(dataPose_);
|
||||||
{
|
if(data_.isValid())
|
||||||
if(!this->isRunning())
|
|
||||||
{
|
{
|
||||||
bool ignoreFrame = false;
|
postUpdate();
|
||||||
//float rate = 10.0f; // maximum 10 FPS for image data
|
|
||||||
double now = UTimer::now();
|
|
||||||
/*if(rate>0.0f)
|
|
||||||
{
|
|
||||||
if((spinOncePreviousStamp_>=0.0 && now>spinOncePreviousStamp_ && now - spinOncePreviousStamp_ < 1.0f/rate) ||
|
|
||||||
((spinOncePreviousStamp_<=0.0 || now<=spinOncePreviousStamp_) && spinOnceFrameRateTimer_.getElapsedTime() < 1.0f/rate))
|
|
||||||
{
|
|
||||||
ignoreFrame = true;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if(!ignoreFrame)
|
if(notify)
|
||||||
{
|
{
|
||||||
spinOnceFrameRateTimer_.start();
|
dataReady_.release();
|
||||||
spinOncePreviousStamp_ = now;
|
|
||||||
mainLoop();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// just send pose
|
|
||||||
capturePoseOnly();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMobile::mainLoopBegin()
|
SensorData CameraMobile::updateDataOnRender(Transform & pose)
|
||||||
{
|
{
|
||||||
double t = cameraStartedTime_.elapsed();
|
LOGE("To use CameraMobile::updateOnRender(), CameraMobile::updateDataOnRender() "
|
||||||
if(t < 5.0)
|
"should be overridden by inherited classes. Returning empty data!\n");
|
||||||
{
|
return SensorData();
|
||||||
uSleep((5.0-t)*1000); // just to make sure that the camera is started
|
}
|
||||||
|
|
||||||
|
void CameraMobile::postUpdate()
|
||||||
|
{
|
||||||
|
if(data_.isValid())
|
||||||
|
{
|
||||||
|
// adjust origin
|
||||||
|
if(!originOffset_.isNull())
|
||||||
|
{
|
||||||
|
dataPose_ = originOffset_ * dataPose_;
|
||||||
|
viewMatrix_ = glm::inverse(rtabmap::glmFromTransform(rtabmap::opengl_world_T_rtabmap_world * originOffset_ *rtabmap::rtabmap_world_T_opengl_world)*glm::inverse(viewMatrix_));
|
||||||
|
occlusionModel_.setLocalTransform(originOffset_ * occlusionModel_.localTransform());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lastKnownGPS_.stamp() > 0.0 && data_.stamp()-lastKnownGPS_.stamp()<1.0)
|
||||||
|
{
|
||||||
|
data_.setGPS(lastKnownGPS_);
|
||||||
|
}
|
||||||
|
else if(lastKnownGPS_.stamp()>0.0)
|
||||||
|
{
|
||||||
|
LOGD("GPS too old (current time=%f, gps time = %f)", data_.stamp(), lastKnownGPS_.stamp());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lastEnvSensors_.size())
|
||||||
|
{
|
||||||
|
data_.setEnvSensors(lastEnvSensors_);
|
||||||
|
lastEnvSensors_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Rotate image depending on the camera orientation
|
||||||
|
if(colorCameraToDisplayRotation_ == ROTATION_90)
|
||||||
|
{
|
||||||
|
UDEBUG("ROTATION_90");
|
||||||
|
cv::Mat rgb, depth, confidence;
|
||||||
|
cv::Mat rgbt;
|
||||||
|
cv::flip(data_.imageRaw(),rgb,1);
|
||||||
|
cv::transpose(rgb,rgbt);
|
||||||
|
rgb = rgbt;
|
||||||
|
cv::Mat deptht;
|
||||||
|
cv::flip(data_.depthRaw(),depth,1);
|
||||||
|
cv::transpose(depth,deptht);
|
||||||
|
depth = deptht;
|
||||||
|
if(!data_.depthConfidenceRaw().empty()) {
|
||||||
|
cv::Mat conft;
|
||||||
|
cv::flip(data_.depthConfidenceRaw(),confidence,1);
|
||||||
|
cv::transpose(confidence,conft);
|
||||||
|
confidence = conft;
|
||||||
|
}
|
||||||
|
CameraModel model = data_.cameraModels()[0];
|
||||||
|
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
||||||
|
model = CameraModel(
|
||||||
|
model.fy(),
|
||||||
|
model.fx(),
|
||||||
|
model.cy(),
|
||||||
|
model.cx()>0?model.imageWidth()-model.cx():0,
|
||||||
|
model.localTransform()*rtabmap::Transform(0,-1,0,0, 1,0,0,0, 0,0,1,0));
|
||||||
|
model.setImageSize(sizet);
|
||||||
|
data_.setRGBDImage(rgb, depth, confidence, model);
|
||||||
|
|
||||||
|
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
||||||
|
for(size_t i=0; i<keypoints.size(); ++i)
|
||||||
|
{
|
||||||
|
keypoints[i].pt.x = data_.keypoints()[i].pt.y;
|
||||||
|
keypoints[i].pt.y = rgb.rows - data_.keypoints()[i].pt.x;
|
||||||
|
}
|
||||||
|
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
||||||
|
}
|
||||||
|
else if(colorCameraToDisplayRotation_ == ROTATION_180)
|
||||||
|
{
|
||||||
|
UDEBUG("ROTATION_180");
|
||||||
|
cv::Mat rgb, depth, confidence;
|
||||||
|
cv::flip(data_.imageRaw(),rgb,1);
|
||||||
|
cv::flip(rgb,rgb,0);
|
||||||
|
cv::flip(data_.depthOrRightRaw(),depth,1);
|
||||||
|
cv::flip(depth,depth,0);
|
||||||
|
if(!data_.depthConfidenceRaw().empty()) {
|
||||||
|
cv::flip(data_.depthConfidenceRaw(),confidence,1);
|
||||||
|
cv::flip(confidence,confidence,0);
|
||||||
|
}
|
||||||
|
CameraModel model = data_.cameraModels()[0];
|
||||||
|
cv::Size sizet(model.imageWidth(), model.imageHeight());
|
||||||
|
model = CameraModel(
|
||||||
|
model.fx(),
|
||||||
|
model.fy(),
|
||||||
|
model.cx()>0?model.imageWidth()-model.cx():0,
|
||||||
|
model.cy()>0?model.imageHeight()-model.cy():0,
|
||||||
|
model.localTransform()*rtabmap::Transform(0,0,0,0,0,1,0));
|
||||||
|
model.setImageSize(sizet);
|
||||||
|
data_.setRGBDImage(rgb, depth, confidence, model);
|
||||||
|
|
||||||
|
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
||||||
|
for(size_t i=0; i<keypoints.size(); ++i)
|
||||||
|
{
|
||||||
|
keypoints[i].pt.x = rgb.cols - data_.keypoints()[i].pt.x;
|
||||||
|
keypoints[i].pt.y = rgb.rows - data_.keypoints()[i].pt.y;
|
||||||
|
}
|
||||||
|
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
||||||
|
}
|
||||||
|
else if(colorCameraToDisplayRotation_ == ROTATION_270)
|
||||||
|
{
|
||||||
|
UDEBUG("ROTATION_270");
|
||||||
|
cv::Mat rgb, depth, confidence;
|
||||||
|
cv::transpose(data_.imageRaw(),rgb);
|
||||||
|
cv::flip(rgb,rgb,1);
|
||||||
|
cv::transpose(data_.depthOrRightRaw(),depth);
|
||||||
|
cv::flip(depth,depth,1);
|
||||||
|
if(!data_.depthConfidenceRaw().empty()) {
|
||||||
|
cv::transpose(data_.depthConfidenceRaw(),confidence);
|
||||||
|
cv::flip(confidence,confidence,1);
|
||||||
|
}
|
||||||
|
CameraModel model = data_.cameraModels()[0];
|
||||||
|
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
||||||
|
model = CameraModel(
|
||||||
|
model.fy(),
|
||||||
|
model.fx(),
|
||||||
|
model.cy()>0?model.imageHeight()-model.cy():0,
|
||||||
|
model.cx(),
|
||||||
|
model.localTransform()*rtabmap::Transform(0,1,0,0, -1,0,0,0, 0,0,1,0));
|
||||||
|
model.setImageSize(sizet);
|
||||||
|
data_.setRGBDImage(rgb, depth, confidence, model);
|
||||||
|
|
||||||
|
std::vector<cv::KeyPoint> keypoints = data_.keypoints();
|
||||||
|
for(size_t i=0; i<keypoints.size(); ++i)
|
||||||
|
{
|
||||||
|
keypoints[i].pt.x = rgb.cols - data_.keypoints()[i].pt.y;
|
||||||
|
keypoints[i].pt.y = data_.keypoints()[i].pt.x;
|
||||||
|
}
|
||||||
|
data_.setFeatures(keypoints, data_.keypoints3D(), cv::Mat());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UDEBUG("ROTATION_0");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraMobile::mainLoop()
|
SensorData CameraMobile::captureImage(SensorCaptureInfo * info)
|
||||||
{
|
{
|
||||||
CameraInfo info;
|
SensorData data;
|
||||||
SensorData data = this->captureImage(&info);
|
bool firstFrame = true;
|
||||||
|
bool dataGoodTracking = true;
|
||||||
if(data.isValid() && !info.odomPose.isNull())
|
rtabmap::Transform dataPose;
|
||||||
|
if(dataReady_.acquire(1, 15000))
|
||||||
|
{
|
||||||
|
UScopeMutex lock(dataMutex_);
|
||||||
|
data = data_;
|
||||||
|
dataPose = dataPose_;
|
||||||
|
firstFrame = firstFrame_;
|
||||||
|
dataGoodTracking = dataGoodTracking_;
|
||||||
|
firstFrame_ = false;
|
||||||
|
dataGoodTracking_ = true;
|
||||||
|
data_ = SensorData();
|
||||||
|
dataPose_.setNull();
|
||||||
|
}
|
||||||
|
if(data.isValid())
|
||||||
{
|
{
|
||||||
if(lastKnownGPS_.stamp() > 0.0 && data.stamp()-lastKnownGPS_.stamp()<1.0)
|
|
||||||
{
|
|
||||||
data.setGPS(lastKnownGPS_);
|
|
||||||
}
|
|
||||||
else if(lastKnownGPS_.stamp()>0.0)
|
|
||||||
{
|
|
||||||
LOGD("GPS too old (current time=%f, gps time = %f)", data.stamp(), lastKnownGPS_.stamp());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(lastEnvSensors_.size())
|
|
||||||
{
|
|
||||||
data.setEnvSensors(lastEnvSensors_);
|
|
||||||
lastEnvSensors_.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(smoothing_ && !data.depthRaw().empty())
|
|
||||||
{
|
|
||||||
//UTimer t;
|
|
||||||
data.setDepthOrRightRaw(rtabmap::util2d::fastBilateralFiltering(data.depthRaw(), bilateralFilteringSigmaS, bilateralFilteringSigmaR));
|
|
||||||
//LOGD("Bilateral filtering, time=%fs", t.ticks());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rotate image depending on the camera orientation
|
|
||||||
if(colorCameraToDisplayRotation_ == ROTATION_90)
|
|
||||||
{
|
|
||||||
UDEBUG("ROTATION_90");
|
|
||||||
cv::Mat rgb, depth;
|
|
||||||
cv::Mat rgbt(data.imageRaw().cols, data.imageRaw().rows, data.imageRaw().type());
|
|
||||||
cv::flip(data.imageRaw(),rgb,1);
|
|
||||||
cv::transpose(rgb,rgbt);
|
|
||||||
rgb = rgbt;
|
|
||||||
cv::Mat deptht(data.depthRaw().cols, data.depthRaw().rows, data.depthRaw().type());
|
|
||||||
cv::flip(data.depthRaw(),depth,1);
|
|
||||||
cv::transpose(depth,deptht);
|
|
||||||
depth = deptht;
|
|
||||||
CameraModel model = data.cameraModels()[0];
|
|
||||||
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
|
||||||
model = CameraModel(
|
|
||||||
model.fy(),
|
|
||||||
model.fx(),
|
|
||||||
model.cy(),
|
|
||||||
model.cx()>0?model.imageWidth()-model.cx():0,
|
|
||||||
model.localTransform()*rtabmap::Transform(0,-1,0,0, 1,0,0,0, 0,0,1,0));
|
|
||||||
model.setImageSize(sizet);
|
|
||||||
data.setRGBDImage(rgb, depth, model);
|
|
||||||
|
|
||||||
std::vector<cv::KeyPoint> keypoints = data.keypoints();
|
|
||||||
for(size_t i=0; i<keypoints.size(); ++i)
|
|
||||||
{
|
|
||||||
keypoints[i].pt.x = data.keypoints()[i].pt.y;
|
|
||||||
keypoints[i].pt.y = rgb.rows - data.keypoints()[i].pt.x;
|
|
||||||
}
|
|
||||||
data.setFeatures(keypoints, data.keypoints3D(), cv::Mat());
|
|
||||||
}
|
|
||||||
else if(colorCameraToDisplayRotation_ == ROTATION_180)
|
|
||||||
{
|
|
||||||
UDEBUG("ROTATION_180");
|
|
||||||
cv::Mat rgb, depth;
|
|
||||||
cv::flip(data.imageRaw(),rgb,1);
|
|
||||||
cv::flip(rgb,rgb,0);
|
|
||||||
cv::flip(data.depthOrRightRaw(),depth,1);
|
|
||||||
cv::flip(depth,depth,0);
|
|
||||||
CameraModel model = data.cameraModels()[0];
|
|
||||||
cv::Size sizet(model.imageWidth(), model.imageHeight());
|
|
||||||
model = CameraModel(
|
|
||||||
model.fx(),
|
|
||||||
model.fy(),
|
|
||||||
model.cx()>0?model.imageWidth()-model.cx():0,
|
|
||||||
model.cy()>0?model.imageHeight()-model.cy():0,
|
|
||||||
model.localTransform()*rtabmap::Transform(0,0,0,0,0,1,0));
|
|
||||||
model.setImageSize(sizet);
|
|
||||||
data.setRGBDImage(rgb, depth, model);
|
|
||||||
|
|
||||||
std::vector<cv::KeyPoint> keypoints = data.keypoints();
|
|
||||||
for(size_t i=0; i<keypoints.size(); ++i)
|
|
||||||
{
|
|
||||||
keypoints[i].pt.x = rgb.cols - data.keypoints()[i].pt.x;
|
|
||||||
keypoints[i].pt.y = rgb.rows - data.keypoints()[i].pt.y;
|
|
||||||
}
|
|
||||||
data.setFeatures(keypoints, data.keypoints3D(), cv::Mat());
|
|
||||||
}
|
|
||||||
else if(colorCameraToDisplayRotation_ == ROTATION_270)
|
|
||||||
{
|
|
||||||
UDEBUG("ROTATION_270");
|
|
||||||
cv::Mat rgb(data.imageRaw().cols, data.imageRaw().rows, data.imageRaw().type());
|
|
||||||
cv::transpose(data.imageRaw(),rgb);
|
|
||||||
cv::flip(rgb,rgb,1);
|
|
||||||
cv::Mat depth(data.depthOrRightRaw().cols, data.depthOrRightRaw().rows, data.depthOrRightRaw().type());
|
|
||||||
cv::transpose(data.depthOrRightRaw(),depth);
|
|
||||||
cv::flip(depth,depth,1);
|
|
||||||
CameraModel model = data.cameraModels()[0];
|
|
||||||
cv::Size sizet(model.imageHeight(), model.imageWidth());
|
|
||||||
model = CameraModel(
|
|
||||||
model.fy(),
|
|
||||||
model.fx(),
|
|
||||||
model.cy()>0?model.imageHeight()-model.cy():0,
|
|
||||||
model.cx(),
|
|
||||||
model.localTransform()*rtabmap::Transform(0,1,0,0, -1,0,0,0, 0,0,1,0));
|
|
||||||
model.setImageSize(sizet);
|
|
||||||
data.setRGBDImage(rgb, depth, model);
|
|
||||||
|
|
||||||
std::vector<cv::KeyPoint> keypoints = data.keypoints();
|
|
||||||
for(size_t i=0; i<keypoints.size(); ++i)
|
|
||||||
{
|
|
||||||
keypoints[i].pt.x = rgb.cols - data.keypoints()[i].pt.y;
|
|
||||||
keypoints[i].pt.y = data.keypoints()[i].pt.x;
|
|
||||||
}
|
|
||||||
data.setFeatures(keypoints, data.keypoints3D(), cv::Mat());
|
|
||||||
}
|
|
||||||
|
|
||||||
rtabmap::Transform pose = info.odomPose;
|
|
||||||
data.setGroundTruth(Transform());
|
data.setGroundTruth(Transform());
|
||||||
|
|
||||||
// convert stamp to epoch
|
|
||||||
bool firstFrame = previousPose_.isNull();
|
|
||||||
if(firstFrame)
|
|
||||||
{
|
|
||||||
stampEpochOffset_ = UTimer::now()-data.stamp();
|
|
||||||
}
|
|
||||||
data.setStamp(stampEpochOffset_ + data.stamp());
|
data.setStamp(stampEpochOffset_ + data.stamp());
|
||||||
OdometryInfo info;
|
|
||||||
if(!firstFrame)
|
|
||||||
{
|
|
||||||
info.interval = data.stamp()-previousStamp_;
|
|
||||||
info.transform = previousPose_.inverse() * pose;
|
|
||||||
}
|
|
||||||
// linear cov = 0.0001
|
|
||||||
info.reg.covariance = cv::Mat::eye(6,6,CV_64FC1) * (firstFrame?9999.0:0.0001);
|
|
||||||
if(!firstFrame)
|
|
||||||
{
|
|
||||||
// angular cov = 0.000001
|
|
||||||
info.reg.covariance.at<double>(3,3) *= 0.01;
|
|
||||||
info.reg.covariance.at<double>(4,4) *= 0.01;
|
|
||||||
info.reg.covariance.at<double>(5,5) *= 0.01;
|
|
||||||
}
|
|
||||||
LOGI("Publish odometry message (variance=%f)", firstFrame?9999:0.0001);
|
|
||||||
this->post(new OdometryEvent(data, pose, info));
|
|
||||||
previousPose_ = pose;
|
|
||||||
previousStamp_ = data.stamp();
|
|
||||||
}
|
|
||||||
else if(!this->isKilled() && info.odomPose.isNull())
|
|
||||||
{
|
|
||||||
LOGW("Odometry lost");
|
|
||||||
this->post(new OdometryEvent());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SensorData CameraMobile::captureImage(CameraInfo * info)
|
if(info)
|
||||||
{
|
{
|
||||||
if(info)
|
// linear cov = 0.0001
|
||||||
{
|
info->odomCovariance = cv::Mat::eye(6,6,CV_64FC1) * (firstFrame?9999.0:0.00001);
|
||||||
info->odomPose = pose_;
|
if(!firstFrame)
|
||||||
|
{
|
||||||
|
// angular cov = 0.000001
|
||||||
|
// roll/pitch should be fairly accurate with VIO input
|
||||||
|
info->odomCovariance.at<double>(3,3) *= 0.01; // roll
|
||||||
|
info->odomCovariance.at<double>(4,4) *= 0.01; // pitch
|
||||||
|
if(!dataGoodTracking)
|
||||||
|
{
|
||||||
|
UERROR("not good tracking!");
|
||||||
|
// add slightly more error on translation
|
||||||
|
// 0.001
|
||||||
|
info->odomCovariance.at<double>(0,0) *= 10; // x
|
||||||
|
info->odomCovariance.at<double>(1,1) *= 10; // y
|
||||||
|
info->odomCovariance.at<double>(2,2) *= 10; // z
|
||||||
|
info->odomCovariance.at<double>(5,5) *= 10; // yaw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
info->odomPose = dataPose;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return data_;
|
else
|
||||||
|
{
|
||||||
|
UWARN("CameraMobile::captureImage() invalid data!");
|
||||||
|
}
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
LaserScan CameraMobile::scanFromPointCloudData(
|
LaserScan CameraMobile::scanFromPointCloudData(
|
||||||
const cv::Mat & pointCloudData,
|
const cv::Mat & pointCloudData,
|
||||||
int points,
|
|
||||||
const Transform & pose,
|
const Transform & pose,
|
||||||
const CameraModel & model,
|
const CameraModel & model,
|
||||||
const cv::Mat & rgb,
|
const cv::Mat & rgb,
|
||||||
@@ -421,7 +594,7 @@ LaserScan CameraMobile::scanFromPointCloudData(
|
|||||||
UASSERT(pointCloudData.depth() == CV_32F && ic >= 3);
|
UASSERT(pointCloudData.depth() == CV_32F && ic >= 3);
|
||||||
|
|
||||||
int oi = 0;
|
int oi = 0;
|
||||||
for(unsigned int i=0;i<points; ++i)
|
for(unsigned int i=0;i<pointCloudData.cols; ++i)
|
||||||
{
|
{
|
||||||
cv::Point3f pt(inPtr[i*ic], inPtr[i*ic + 1], inPtr[i*ic + 2]);
|
cv::Point3f pt(inPtr[i*ic], inPtr[i*ic + 1], inPtr[i*ic + 2]);
|
||||||
pt = util3d::transformPoint(pt, pose.inverse()*rtabmap_world_T_opengl_world);
|
pt = util3d::transformPoint(pt, pose.inverse()*rtabmap_world_T_opengl_world);
|
||||||
@@ -432,23 +605,25 @@ LaserScan CameraMobile::scanFromPointCloudData(
|
|||||||
//get color from rgb image
|
//get color from rgb image
|
||||||
cv::Point3f org= pt;
|
cv::Point3f org= pt;
|
||||||
pt = util3d::transformPoint(pt, opticalRotationInv);
|
pt = util3d::transformPoint(pt, opticalRotationInv);
|
||||||
int u,v;
|
if(pt.z > 0)
|
||||||
model.reproject(pt.x, pt.y, pt.z, u, v);
|
|
||||||
unsigned char r=255,g=255,b=255;
|
|
||||||
if(model.inFrame(u, v))
|
|
||||||
{
|
{
|
||||||
b=rgb.at<cv::Vec3b>(v,u).val[0];
|
int u,v;
|
||||||
g=rgb.at<cv::Vec3b>(v,u).val[1];
|
model.reproject(pt.x, pt.y, pt.z, u, v);
|
||||||
r=rgb.at<cv::Vec3b>(v,u).val[2];
|
unsigned char r=255,g=255,b=255;
|
||||||
if(kpts)
|
if(model.inFrame(u, v))
|
||||||
kpts->push_back(cv::KeyPoint(u,v,kptsSize));
|
{
|
||||||
if(kpts3D)
|
b=rgb.at<cv::Vec3b>(v,u).val[0];
|
||||||
kpts3D->push_back(org);
|
g=rgb.at<cv::Vec3b>(v,u).val[1];
|
||||||
|
r=rgb.at<cv::Vec3b>(v,u).val[2];
|
||||||
|
if(kpts)
|
||||||
|
kpts->push_back(cv::KeyPoint(u,v,kptsSize));
|
||||||
|
if(kpts3D)
|
||||||
|
kpts3D->push_back(org);
|
||||||
|
|
||||||
*(int*)&ptr[oi*4 + 3] = int(b) | (int(g) << 8) | (int(r) << 16);
|
*(int*)&ptr[oi*4 + 3] = int(b) | (int(g) << 8) | (int(r) << 16);
|
||||||
++oi;
|
++oi;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//confidence
|
//confidence
|
||||||
//*(int*)&ptr[i*4 + 3] = (int(pointCloudData[i*4 + 3] * 255.0f) << 8) | (int(255) << 16);
|
//*(int*)&ptr[i*4 + 3] = (int(pointCloudData[i*4 + 3] * 255.0f) << 8) | (int(255) << 16);
|
||||||
|
|
||||||
|
|||||||
@@ -68,18 +68,14 @@ private:
|
|||||||
Transform pose_;
|
Transform pose_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CameraMobile : public Camera, public UThread, public UEventsSender {
|
class CameraMobile : public Camera, public UEventsSender {
|
||||||
public:
|
public:
|
||||||
static const float bilateralFilteringSigmaS;
|
|
||||||
static const float bilateralFilteringSigmaR;
|
|
||||||
|
|
||||||
static const rtabmap::Transform opticalRotation;
|
static const rtabmap::Transform opticalRotation;
|
||||||
static const rtabmap::Transform opticalRotationInv;
|
static const rtabmap::Transform opticalRotationInv;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static LaserScan scanFromPointCloudData(
|
static LaserScan scanFromPointCloudData(
|
||||||
const cv::Mat & pointCloudData,
|
const cv::Mat & pointCloudData,
|
||||||
int points,
|
|
||||||
const Transform & pose,
|
const Transform & pose,
|
||||||
const CameraModel & model,
|
const CameraModel & model,
|
||||||
const cv::Mat & rgb,
|
const cv::Mat & rgb,
|
||||||
@@ -88,29 +84,32 @@ public:
|
|||||||
int kptsSize = 3);
|
int kptsSize = 3);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CameraMobile(bool smoothing = false);
|
CameraMobile(float upstreamRelocalizationAccThr = 0.0f);
|
||||||
virtual ~CameraMobile();
|
virtual ~CameraMobile();
|
||||||
|
|
||||||
// abstract functions
|
// abstract functions
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
virtual void close(); // inherited classes should call its parent in their close().
|
virtual void close(); // inherited classes should call its parent at the end of their close().
|
||||||
virtual std::string getSerial() const {return "CameraMobile";}
|
virtual std::string getSerial() const {return "CameraMobile";}
|
||||||
|
|
||||||
const Transform & getOriginOffset() const {return originOffset_;} // in rtabmap frame
|
// original pose of device in rtabmap frame (without origin offset), stamp of the device (may be not epoch), viewMatrix in opengl frame (without origin offset)
|
||||||
void resetOrigin();
|
void update(const SensorData & data, const Transform & pose, const glm::mat4 & viewMatrix, const glm::mat4 & projectionMatrix, const float * texCoord);
|
||||||
|
void updateOnRender();
|
||||||
|
|
||||||
|
void resetOrigin(const rtabmap::Transform & offset = rtabmap::Transform());
|
||||||
virtual bool isCalibrated() const;
|
virtual bool isCalibrated() const;
|
||||||
|
|
||||||
void poseReceived(const Transform & pose); // in rtabmap frame
|
virtual bool odomProvided() const { return true; }
|
||||||
|
virtual bool getPose(double epochStamp, Transform & pose, cv::Mat & covariance, double maxWaitTime = 0.06); // Return pose of device in rtabmap frame (with origin offset), stamp should be epoch time
|
||||||
|
// original pose of device in rtabmap frame (without origin offset), stamp of the device (may be not epoch)
|
||||||
|
void poseReceived(const Transform & pose, double deviceStamp);
|
||||||
|
double getStampEpochOffset() const {return stampEpochOffset_;}
|
||||||
|
|
||||||
const CameraModel & getCameraModel() const {return model_;}
|
const CameraModel & getCameraModel() const {return model_;}
|
||||||
const Transform & getDeviceTColorCamera() const {return deviceTColorCamera_;}
|
const Transform & getDeviceTColorCamera() const {return deviceTColorCamera_;}
|
||||||
void setSmoothing(bool enabled) {smoothing_ = enabled;}
|
|
||||||
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
virtual void setScreenRotationAndSize(ScreenRotation colorCameraToDisplayRotation, int width, int height) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
||||||
void setGPS(const GPS & gps);
|
void setGPS(const GPS & gps);
|
||||||
void addEnvSensor(int type, float value);
|
void addEnvSensor(int type, float value);
|
||||||
void setData(const SensorData & data, const Transform & pose, const glm::mat4 & viewMatrix, const glm::mat4 & projectionMatrix, const float * texCoord);
|
|
||||||
|
|
||||||
void spinOnce(); // Should only be called if not thread is not running, otherwise it does nothing
|
|
||||||
|
|
||||||
GLuint getTextureId() {return textureId_;}
|
GLuint getTextureId() {return textureId_;}
|
||||||
bool uvsInitialized() const {return uvs_initialized_;}
|
bool uvsInitialized() const {return uvs_initialized_;}
|
||||||
@@ -122,17 +121,15 @@ public:
|
|||||||
const cv::Mat & getOcclusionImage(CameraModel * model=0) const {if(model)*model=occlusionModel_; return occlusionImage_; }
|
const cv::Mat & getOcclusionImage(CameraModel * model=0) const {if(model)*model=occlusionModel_; return occlusionImage_; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
virtual SensorData updateDataOnRender(Transform & pose);
|
||||||
virtual void capturePoseOnly() {}
|
|
||||||
|
|
||||||
virtual void mainLoopBegin();
|
private:
|
||||||
virtual void mainLoop();
|
virtual SensorData captureImage(SensorCaptureInfo * info = 0);
|
||||||
|
void postUpdate(); // Should be called while being protected by dataMutex_
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CameraModel model_; // local transform is the device to camera optical rotation in rtabmap frame
|
CameraModel model_; // local transform is the device to camera optical rotation in rtabmap frame
|
||||||
Transform deviceTColorCamera_; // device to camera optical rotation in rtabmap frame
|
Transform deviceTColorCamera_; // device to camera optical rotation in rtabmap frame
|
||||||
UTimer spinOnceFrameRateTimer_;
|
|
||||||
double spinOncePreviousStamp_;
|
|
||||||
|
|
||||||
GLuint textureId_;
|
GLuint textureId_;
|
||||||
glm::mat4 viewMatrix_;
|
glm::mat4 viewMatrix_;
|
||||||
@@ -141,19 +138,28 @@ protected:
|
|||||||
bool uvs_initialized_ = false;
|
bool uvs_initialized_ = false;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Transform previousPose_;
|
bool firstFrame_;
|
||||||
double previousStamp_;
|
|
||||||
UTimer cameraStartedTime_;
|
|
||||||
double stampEpochOffset_;
|
double stampEpochOffset_;
|
||||||
bool smoothing_;
|
|
||||||
ScreenRotation colorCameraToDisplayRotation_;
|
ScreenRotation colorCameraToDisplayRotation_;
|
||||||
GPS lastKnownGPS_;
|
GPS lastKnownGPS_;
|
||||||
EnvSensors lastEnvSensors_;
|
EnvSensors lastEnvSensors_;
|
||||||
Transform originOffset_;
|
Transform originOffset_;
|
||||||
bool originUpdate_;
|
bool originUpdate_;
|
||||||
|
rtabmap::Transform manualOriginOffset_;
|
||||||
|
float upstreamRelocalizationAccThr_;
|
||||||
|
rtabmap::Transform previousAnchorPose_;
|
||||||
|
std::vector<float> previousAnchorLinearVelocity_;
|
||||||
|
double previousAnchorStamp_;
|
||||||
|
std::map<double, std::pair<rtabmap::Transform, rtabmap::Transform> > relocalizationDebugBuffer_;
|
||||||
|
|
||||||
|
USemaphore dataReady_;
|
||||||
|
UMutex dataMutex_;
|
||||||
SensorData data_;
|
SensorData data_;
|
||||||
Transform pose_;
|
Transform dataPose_;
|
||||||
|
bool dataGoodTracking_;
|
||||||
|
|
||||||
|
UMutex poseMutex_;
|
||||||
|
std::map<double, Transform> poseBuffer_; // <stamp, Pose>
|
||||||
|
|
||||||
cv::Mat occlusionImage_;
|
cv::Mat occlusionImage_;
|
||||||
CameraModel occlusionModel_;
|
CameraModel occlusionModel_;
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ void onPoseAvailableRouter(void* context, const TangoPoseData* pose)
|
|||||||
if(pose->status_code == TANGO_POSE_VALID)
|
if(pose->status_code == TANGO_POSE_VALID)
|
||||||
{
|
{
|
||||||
CameraTango* app = static_cast<CameraTango*>(context);
|
CameraTango* app = static_cast<CameraTango*>(context);
|
||||||
app->poseReceived(rtabmap_world_T_tango_world * app->tangoPoseToTransform(pose) * tango_device_T_rtabmap_world);
|
app->poseReceived(rtabmap_world_T_tango_world * app->tangoPoseToTransform(pose) * tango_device_T_rtabmap_world, pose->timestamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,8 +114,7 @@ void onTangoEventAvailableRouter(void* context, const TangoEvent* event)
|
|||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// CameraTango
|
// CameraTango
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
CameraTango::CameraTango(bool colorCamera, int decimation, bool publishRawScan, bool smoothing) :
|
CameraTango::CameraTango(bool colorCamera, int decimation, bool publishRawScan) :
|
||||||
CameraMobile(smoothing),
|
|
||||||
tango_config_(0),
|
tango_config_(0),
|
||||||
colorCamera_(colorCamera),
|
colorCamera_(colorCamera),
|
||||||
decimation_(decimation),
|
decimation_(decimation),
|
||||||
@@ -194,6 +193,8 @@ bool CameraTango::init(const std::string & calibrationFolder, const std::string
|
|||||||
{
|
{
|
||||||
close();
|
close();
|
||||||
|
|
||||||
|
CameraMobile::init(calibrationFolder, cameraName);
|
||||||
|
|
||||||
TangoSupport_initialize(TangoService_getPoseAtTime, TangoService_getCameraIntrinsics);
|
TangoSupport_initialize(TangoService_getPoseAtTime, TangoService_getCameraIntrinsics);
|
||||||
|
|
||||||
// Connect to Tango
|
// Connect to Tango
|
||||||
@@ -444,7 +445,7 @@ void CameraTango::cloudReceived(const cv::Mat & cloud, double timestamp)
|
|||||||
//LOGD("Depth received! %fs (%d points)", timestamp, cloud.cols);
|
//LOGD("Depth received! %fs (%d points)", timestamp, cloud.cols);
|
||||||
|
|
||||||
UASSERT(cloud.type() == CV_32FC4);
|
UASSERT(cloud.type() == CV_32FC4);
|
||||||
boost::mutex::scoped_lock lock(dataMutex_);
|
boost::mutex::scoped_lock lock(tangoDataMutex_);
|
||||||
|
|
||||||
// From post: http://stackoverflow.com/questions/29236110/timing-issues-with-tango-image-frames
|
// From post: http://stackoverflow.com/questions/29236110/timing-issues-with-tango-image-frames
|
||||||
// "In the current version of Project Tango Tablet RGB IR camera
|
// "In the current version of Project Tango Tablet RGB IR camera
|
||||||
@@ -463,7 +464,7 @@ void CameraTango::cloudReceived(const cv::Mat & cloud, double timestamp)
|
|||||||
|
|
||||||
if(dt >= 0.0 && dt < 0.5)
|
if(dt >= 0.0 && dt < 0.5)
|
||||||
{
|
{
|
||||||
bool notify = !data_.isValid();
|
bool notify = !tangoData_.isValid();
|
||||||
|
|
||||||
cv::Mat tangoImage = tangoColor_;
|
cv::Mat tangoImage = tangoColor_;
|
||||||
cv::Mat rgb;
|
cv::Mat rgb;
|
||||||
@@ -495,7 +496,7 @@ void CameraTango::cloudReceived(const cv::Mat & cloud, double timestamp)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOGE("Not supported color format : %d.", tangoColorType);
|
LOGE("Not supported color format : %d.", tangoColorType);
|
||||||
data_ = SensorData();
|
tangoData_ = SensorData();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -657,12 +658,6 @@ void CameraTango::cloudReceived(const cv::Mat & cloud, double timestamp)
|
|||||||
//LOGD("tango = %s", poseDevice.prettyPrint().c_str());
|
//LOGD("tango = %s", poseDevice.prettyPrint().c_str());
|
||||||
//LOGD("opengl(t)= %s", (opengl_world_T_tango_world * poseDevice).prettyPrint().c_str());
|
//LOGD("opengl(t)= %s", (opengl_world_T_tango_world * poseDevice).prettyPrint().c_str());
|
||||||
|
|
||||||
// adjust origin
|
|
||||||
if(!getOriginOffset().isNull())
|
|
||||||
{
|
|
||||||
odom = getOriginOffset() * odom;
|
|
||||||
}
|
|
||||||
|
|
||||||
// occlusion depth
|
// occlusion depth
|
||||||
if(!depth.empty())
|
if(!depth.empty())
|
||||||
{
|
{
|
||||||
@@ -678,24 +673,24 @@ void CameraTango::cloudReceived(const cv::Mat & cloud, double timestamp)
|
|||||||
|
|
||||||
if(rawScanPublished_)
|
if(rawScanPublished_)
|
||||||
{
|
{
|
||||||
data_ = SensorData(LaserScan::backwardCompatibility(scan, cloud.total()/scanDownsampling, 0, scanLocalTransform), rgb, depth, model, this->getNextSeqID(), rgbStamp);
|
tangoData_ = SensorData(LaserScan::backwardCompatibility(scan, cloud.total()/scanDownsampling, 0, scanLocalTransform), rgb, depth, model, this->getNextSeqID(), rgbStamp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data_ = SensorData(rgb, depth, model, this->getNextSeqID(), rgbStamp);
|
tangoData_ = SensorData(rgb, depth, model, this->getNextSeqID(), rgbStamp);
|
||||||
}
|
}
|
||||||
data_.setGroundTruth(odom);
|
tangoData_.setGroundTruth(odom);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOGE("Could not get depth and rgb images!?!");
|
LOGE("Could not get depth and rgb images!?!");
|
||||||
data_ = SensorData();
|
tangoData_ = SensorData();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(notify)
|
if(notify)
|
||||||
{
|
{
|
||||||
dataReady_.release();
|
tangoDataReady_.release();
|
||||||
}
|
}
|
||||||
LOGD("process cloud received %fs", timer.ticks());
|
LOGD("process cloud received %fs", timer.ticks());
|
||||||
}
|
}
|
||||||
@@ -709,7 +704,7 @@ void CameraTango::rgbReceived(const cv::Mat & tangoImage, int type, double times
|
|||||||
{
|
{
|
||||||
//LOGD("RGB received! %fs", timestamp);
|
//LOGD("RGB received! %fs", timestamp);
|
||||||
|
|
||||||
boost::mutex::scoped_lock lock(dataMutex_);
|
boost::mutex::scoped_lock lock(tangoDataMutex_);
|
||||||
|
|
||||||
tangoColor_ = tangoImage.clone();
|
tangoColor_ = tangoImage.clone();
|
||||||
tangoColorStamp_ = timestamp;
|
tangoColorStamp_ = timestamp;
|
||||||
@@ -775,10 +770,11 @@ rtabmap::Transform CameraTango::getPoseAtTimestamp(double timestamp)
|
|||||||
return pose;
|
return pose;
|
||||||
}
|
}
|
||||||
|
|
||||||
SensorData CameraTango::captureImage(CameraInfo * info)
|
SensorData CameraTango::updateDataOnRender(Transform & pose)
|
||||||
{
|
{
|
||||||
//LOGI("Capturing image...");
|
//LOGI("Capturing image...");
|
||||||
|
|
||||||
|
pose.setNull();
|
||||||
if(textureId_ == 0)
|
if(textureId_ == 0)
|
||||||
{
|
{
|
||||||
glGenTextures(1, &textureId_);
|
glGenTextures(1, &textureId_);
|
||||||
@@ -797,10 +793,7 @@ SensorData CameraTango::captureImage(CameraInfo * info)
|
|||||||
|
|
||||||
if (status == TANGO_SUCCESS)
|
if (status == TANGO_SUCCESS)
|
||||||
{
|
{
|
||||||
if(info)
|
pose = getPoseAtTimestamp(video_overlay_timestamp);
|
||||||
{
|
|
||||||
info->odomPose = getPoseAtTimestamp(video_overlay_timestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
int rotation = static_cast<int>(getScreenRotation()) + 1; // remove 90deg camera rotation
|
int rotation = static_cast<int>(getScreenRotation()) + 1; // remove 90deg camera rotation
|
||||||
if (rotation > 3) {
|
if (rotation > 3) {
|
||||||
@@ -834,10 +827,6 @@ SensorData CameraTango::captureImage(CameraInfo * info)
|
|||||||
float cy = static_cast<float>(color_camera_intrinsics.cy);
|
float cy = static_cast<float>(color_camera_intrinsics.cy);
|
||||||
|
|
||||||
viewMatrix_ = glm::make_mat4(matrix_transform.matrix);
|
viewMatrix_ = glm::make_mat4(matrix_transform.matrix);
|
||||||
if(!getOriginOffset().isNull())
|
|
||||||
{
|
|
||||||
viewMatrix_ = glm::inverse(rtabmap::glmFromTransform(rtabmap::opengl_world_T_rtabmap_world * getOriginOffset() *rtabmap::rtabmap_world_T_opengl_world)*glm::inverse(viewMatrix_));
|
|
||||||
}
|
|
||||||
|
|
||||||
projectionMatrix_ = tango_gl::Camera::ProjectionMatrixForCameraIntrinsics(
|
projectionMatrix_ = tango_gl::Camera::ProjectionMatrixForCameraIntrinsics(
|
||||||
image_width, image_height, fx, fy, cx, cy, 0.3, 50);
|
image_width, image_height, fx, fy, cx, cy, 0.3, 50);
|
||||||
@@ -876,16 +865,13 @@ SensorData CameraTango::captureImage(CameraInfo * info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
SensorData data;
|
SensorData data;
|
||||||
if(dataReady_.acquireTry(1))
|
if(tangoDataReady_.acquireTry(1) == 0)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(dataMutex_);
|
boost::mutex::scoped_lock lock(tangoDataMutex_);
|
||||||
data = data_;
|
data = tangoData_;
|
||||||
data_ = SensorData();
|
tangoData_ = SensorData();
|
||||||
if(info)
|
pose = data.groundTruth();
|
||||||
{
|
data.setGroundTruth(Transform());
|
||||||
info->odomPose = data.groundTruth();
|
|
||||||
data.setGroundTruth(Transform());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
|
|
||||||
|
|||||||
@@ -45,14 +45,13 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class CameraTango : public CameraMobile {
|
class CameraTango : public CameraMobile {
|
||||||
public:
|
public:
|
||||||
CameraTango(bool colorCamera, int decimation, bool publishRawScan, bool smoothing);
|
CameraTango(bool colorCamera, int decimation, bool publishRawScan);
|
||||||
virtual ~CameraTango();
|
virtual ~CameraTango();
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
virtual void close(); // close Tango connection
|
virtual void close(); // close Tango connection
|
||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
rtabmap::Transform tangoPoseToTransform(const TangoPoseData * tangoPose) const;
|
rtabmap::Transform tangoPoseToTransform(const TangoPoseData * tangoPose) const;
|
||||||
void setColorCamera(bool enabled) {if(!this->isRunning()) colorCamera_ = enabled;}
|
|
||||||
void setDecimation(int value) {decimation_ = value;}
|
void setDecimation(int value) {decimation_ = value;}
|
||||||
void setRawScanPublished(bool enabled) {rawScanPublished_ = enabled;}
|
void setRawScanPublished(bool enabled) {rawScanPublished_ = enabled;}
|
||||||
|
|
||||||
@@ -61,7 +60,7 @@ public:
|
|||||||
void tangoEventReceived(int type, const char * key, const char * value);
|
void tangoEventReceived(int type, const char * key, const char * value);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
virtual SensorData updateDataOnRender(Transform & pose);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtabmap::Transform getPoseAtTimestamp(double timestamp);
|
rtabmap::Transform getPoseAtTimestamp(double timestamp);
|
||||||
@@ -71,12 +70,12 @@ private:
|
|||||||
bool colorCamera_;
|
bool colorCamera_;
|
||||||
int decimation_;
|
int decimation_;
|
||||||
bool rawScanPublished_;
|
bool rawScanPublished_;
|
||||||
SensorData data_;
|
SensorData tangoData_;
|
||||||
cv::Mat tangoColor_;
|
cv::Mat tangoColor_;
|
||||||
int tangoColorType_;
|
int tangoColorType_;
|
||||||
double tangoColorStamp_;
|
double tangoColorStamp_;
|
||||||
boost::mutex dataMutex_;
|
boost::mutex tangoDataMutex_;
|
||||||
USemaphore dataReady_;
|
USemaphore tangoDataReady_;
|
||||||
cv::Mat fisheyeRectifyMapX_;
|
cv::Mat fisheyeRectifyMapX_;
|
||||||
cv::Mat fisheyeRectifyMapY_;
|
cv::Mat fisheyeRectifyMapY_;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2025, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
@@ -25,17 +25,41 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RTABMAPGUIEXP_H
|
#ifndef MEASURE_H_
|
||||||
#define RTABMAPGUIEXP_H
|
#define MEASURE_H_
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#include <opencv2/opencv.hpp>
|
||||||
#if defined(rtabmap_gui_EXPORTS)
|
|
||||||
#define RTABMAPGUI_EXP __declspec( dllexport )
|
|
||||||
#else
|
|
||||||
#define RTABMAPGUI_EXP __declspec( dllimport )
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define RTABMAPGUI_EXP
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // RTABMAPGUIEXP_H
|
class Measure
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Measure(
|
||||||
|
const cv::Point3f & pt1,
|
||||||
|
const cv::Point3f & pt2,
|
||||||
|
const cv::Vec3f & n1,
|
||||||
|
const cv::Vec3f & n2) :
|
||||||
|
pt1_(pt1),
|
||||||
|
pt2_(pt2),
|
||||||
|
n1_(n1),
|
||||||
|
n2_(n2)
|
||||||
|
{
|
||||||
|
length_ = cv::norm(pt2_ - pt1_);
|
||||||
|
}
|
||||||
|
virtual ~Measure() {}
|
||||||
|
|
||||||
|
float length() const {return length_;}
|
||||||
|
const cv::Point3f & pt1() const {return pt1_;}
|
||||||
|
const cv::Point3f & pt2() const {return pt2_;}
|
||||||
|
const cv::Vec3f & n1() const {return n1_;}
|
||||||
|
const cv::Vec3f & n2() const {return n2_;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
cv::Point3f pt1_;
|
||||||
|
cv::Point3f pt2_;
|
||||||
|
cv::Vec3f n1_;
|
||||||
|
cv::Vec3f n2_;
|
||||||
|
float length_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* MEASURE_H_ */
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -40,12 +40,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "ProgressionStatus.h"
|
#include "ProgressionStatus.h"
|
||||||
|
|
||||||
|
#include <rtabmap/core/SensorCaptureThread.h>
|
||||||
#include <rtabmap/core/RtabmapThread.h>
|
#include <rtabmap/core/RtabmapThread.h>
|
||||||
|
#include <rtabmap/core/SensorEvent.h>
|
||||||
#include <rtabmap/utilite/UEventsHandler.h>
|
#include <rtabmap/utilite/UEventsHandler.h>
|
||||||
#include <boost/thread/mutex.hpp>
|
#include <boost/thread/mutex.hpp>
|
||||||
#include <pcl/pcl_base.h>
|
#include <pcl/pcl_base.h>
|
||||||
#include <pcl/TextureMesh.h>
|
#include <pcl/TextureMesh.h>
|
||||||
|
|
||||||
|
#include "Measure.h"
|
||||||
|
|
||||||
// RTABMapApp handles the application lifecycle and resources.
|
// RTABMapApp handles the application lifecycle and resources.
|
||||||
class RTABMapApp : public UEventsHandler {
|
class RTABMapApp : public UEventsHandler {
|
||||||
@@ -68,7 +71,8 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
int,
|
int,
|
||||||
float, float, float, float,
|
float, float, float, float,
|
||||||
int, int,
|
int, int,
|
||||||
float, float, float, float, float, float));
|
float, float, float, float, float, float),
|
||||||
|
void(*cameraInfoCallback)(void *, int, const char*, const char*));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
~RTABMapApp();
|
~RTABMapApp();
|
||||||
@@ -81,7 +85,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
bool startCamera(JNIEnv* env, jobject iBinder, jobject context, jobject activity, int driver);
|
bool startCamera(JNIEnv* env, jobject iBinder, jobject context, jobject activity, int driver);
|
||||||
#else // __APPLE__
|
#else // __APPLE__
|
||||||
bool startCamera();
|
bool startCamera();
|
||||||
#endif
|
#endif
|
||||||
// Allocate OpenGL resources for rendering, mainly for initializing the Scene.
|
// Allocate OpenGL resources for rendering, mainly for initializing the Scene.
|
||||||
void InitializeGLContent();
|
void InitializeGLContent();
|
||||||
@@ -124,6 +128,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
void setLighting(bool enabled);
|
void setLighting(bool enabled);
|
||||||
void setBackfaceCulling(bool enabled);
|
void setBackfaceCulling(bool enabled);
|
||||||
void setWireframe(bool enabled);
|
void setWireframe(bool enabled);
|
||||||
|
void setTextureColorSeamsHidden(bool hidden);
|
||||||
void setLocalizationMode(bool enabled);
|
void setLocalizationMode(bool enabled);
|
||||||
void setTrajectoryMode(bool enabled);
|
void setTrajectoryMode(bool enabled);
|
||||||
void setGraphOptimization(bool enabled);
|
void setGraphOptimization(bool enabled);
|
||||||
@@ -134,8 +139,10 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
void setCameraColor(bool enabled);
|
void setCameraColor(bool enabled);
|
||||||
void setFullResolution(bool enabled);
|
void setFullResolution(bool enabled);
|
||||||
void setSmoothing(bool enabled);
|
void setSmoothing(bool enabled);
|
||||||
|
void setDepthBleedingError(float value);
|
||||||
void setDepthFromMotion(bool enabled);
|
void setDepthFromMotion(bool enabled);
|
||||||
void setAppendMode(bool enabled);
|
void setAppendMode(bool enabled);
|
||||||
|
void setUpstreamRelocalizationAccThr(float value);
|
||||||
void setDataRecorderMode(bool enabled);
|
void setDataRecorderMode(bool enabled);
|
||||||
void setMaxCloudDepth(float value);
|
void setMaxCloudDepth(float value);
|
||||||
void setMinCloudDepth(float value);
|
void setMinCloudDepth(float value);
|
||||||
@@ -148,6 +155,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
void setRenderingTextureDecimation(int value);
|
void setRenderingTextureDecimation(int value);
|
||||||
void setBackgroundColor(float gray);
|
void setBackgroundColor(float gray);
|
||||||
void setDepthConfidence(int value);
|
void setDepthConfidence(int value);
|
||||||
|
void setExportPointCloudFormat(const std::string & format);
|
||||||
int setMappingParameter(const std::string & key, const std::string & value);
|
int setMappingParameter(const std::string & key, const std::string & value);
|
||||||
void setGPS(const rtabmap::GPS & gps);
|
void setGPS(const rtabmap::GPS & gps);
|
||||||
void addEnvSensor(int type, float value);
|
void addEnvSensor(int type, float value);
|
||||||
@@ -171,13 +179,19 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
int optimizedMinClusterSize,
|
int optimizedMinClusterSize,
|
||||||
float optimizedMaxTextureDistance,
|
float optimizedMaxTextureDistance,
|
||||||
int optimizedMinTextureClusterSize,
|
int optimizedMinTextureClusterSize,
|
||||||
|
int textureVertexColorPolicy,
|
||||||
bool blockRendering);
|
bool blockRendering);
|
||||||
bool postExportation(bool visualize);
|
bool postExportation(bool visualize);
|
||||||
bool writeExportedMesh(const std::string & directory, const std::string & name);
|
bool writeExportedMesh(const std::string & directory, const std::string & name);
|
||||||
int postProcessing(int approach);
|
int postProcessing(int approach);
|
||||||
|
void clearMeasures();
|
||||||
void postCameraPoseEvent(
|
void showMeasures(bool x, bool y, bool z, bool custom);
|
||||||
float x, float y, float z, float qx, float qy, float qz, float qw, double stamp);
|
void setMeasuringMode(int mode);
|
||||||
|
void addMeasureButtonClicked();
|
||||||
|
void teleportButtonClicked();
|
||||||
|
void removeMeasure();
|
||||||
|
void setMetricSystem(bool enabled);
|
||||||
|
void setMeasuringTextSize(float size);
|
||||||
|
|
||||||
void postOdometryEvent(
|
void postOdometryEvent(
|
||||||
rtabmap::Transform pose,
|
rtabmap::Transform pose,
|
||||||
@@ -191,7 +205,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
const void * depth, int depthLen, int depthWidth, int depthHeight, int depthFormat,
|
const void * depth, int depthLen, int depthWidth, int depthHeight, int depthFormat,
|
||||||
const void * conf, int confLen, int confWidth, int confHeight, int confFormat,
|
const void * conf, int confLen, int confWidth, int confHeight, int confFormat,
|
||||||
const float * points, int pointsLen, int pointsChannels,
|
const float * points, int pointsLen, int pointsChannels,
|
||||||
const rtabmap::Transform & viewMatrix, //view matrix
|
rtabmap::Transform viewMatrix, //view matrix
|
||||||
float p00, float p11, float p02, float p12, float p22, float p32, float p23, // projection matrix
|
float p00, float p11, float p02, float p12, float p22, float p32, float p23, // projection matrix
|
||||||
float t0, float t1, float t2, float t3, float t4, float t5, float t6, float t7); // tex coord
|
float t0, float t1, float t2, float t3, float t4, float t5, float t6, float t7); // tex coord
|
||||||
|
|
||||||
@@ -201,6 +215,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
private:
|
private:
|
||||||
int updateMeshDecimation(int width, int height);
|
int updateMeshDecimation(int width, int height);
|
||||||
rtabmap::ParametersMap getRtabmapParameters();
|
rtabmap::ParametersMap getRtabmapParameters();
|
||||||
|
void updateMeasuringState();
|
||||||
bool smoothMesh(int id, rtabmap::Mesh & mesh);
|
bool smoothMesh(int id, rtabmap::Mesh & mesh);
|
||||||
void gainCompensation(bool full = false);
|
void gainCompensation(bool full = false);
|
||||||
std::vector<pcl::Vertices> filterOrganizedPolygons(const std::vector<pcl::Vertices> & polygons, int cloudSize) const;
|
std::vector<pcl::Vertices> filterOrganizedPolygons(const std::vector<pcl::Vertices> & polygons, int cloudSize) const;
|
||||||
@@ -209,6 +224,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
private:
|
private:
|
||||||
int cameraDriver_;
|
int cameraDriver_;
|
||||||
rtabmap::CameraMobile * camera_;
|
rtabmap::CameraMobile * camera_;
|
||||||
|
rtabmap::SensorCaptureThread * sensorCaptureThread_;
|
||||||
rtabmap::RtabmapThread * rtabmapThread_;
|
rtabmap::RtabmapThread * rtabmapThread_;
|
||||||
rtabmap::Rtabmap * rtabmap_;
|
rtabmap::Rtabmap * rtabmap_;
|
||||||
rtabmap::LogHandler * logHandler_;
|
rtabmap::LogHandler * logHandler_;
|
||||||
@@ -220,10 +236,12 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
bool trajectoryMode_;
|
bool trajectoryMode_;
|
||||||
bool rawScanSaved_;
|
bool rawScanSaved_;
|
||||||
bool smoothing_;
|
bool smoothing_;
|
||||||
|
float depthBleedingError_;
|
||||||
bool depthFromMotion_;
|
bool depthFromMotion_;
|
||||||
bool cameraColor_;
|
bool cameraColor_;
|
||||||
bool fullResolution_;
|
bool fullResolution_;
|
||||||
bool appendMode_;
|
bool appendMode_;
|
||||||
|
bool useExternalLidar_;
|
||||||
float maxCloudDepth_;
|
float maxCloudDepth_;
|
||||||
float minCloudDepth_;
|
float minCloudDepth_;
|
||||||
int cloudDensityLevel_;
|
int cloudDensityLevel_;
|
||||||
@@ -234,7 +252,9 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
float maxGainRadius_;
|
float maxGainRadius_;
|
||||||
int renderingTextureDecimation_;
|
int renderingTextureDecimation_;
|
||||||
float backgroundColor_;
|
float backgroundColor_;
|
||||||
int depthConfidence_;
|
unsigned char depthConfidence_;
|
||||||
|
float upstreamRelocalizationMaxAcc_;
|
||||||
|
std::string exportPointCloudFormat_;
|
||||||
|
|
||||||
rtabmap::ParametersMap mappingParameters_;
|
rtabmap::ParametersMap mappingParameters_;
|
||||||
|
|
||||||
@@ -258,11 +278,26 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
|
|
||||||
bool visualizingMesh_;
|
bool visualizingMesh_;
|
||||||
bool exportedMeshUpdated_;
|
bool exportedMeshUpdated_;
|
||||||
pcl::TextureMesh::Ptr optMesh_;
|
pcl::TextureMesh::Ptr optTextureMesh_;
|
||||||
cv::Mat optTexture_;
|
cv::Mat optTexture_;
|
||||||
|
rtabmap::Mesh optMesh_;
|
||||||
int optRefId_;
|
int optRefId_;
|
||||||
rtabmap::Transform * optRefPose_; // App crashes when loading native library if not dynamic
|
rtabmap::Transform * optRefPose_; // App crashes when loading native library if not dynamic
|
||||||
|
std::list<Measure> measures_; // In opengl frame
|
||||||
|
bool measuresUpdated_;
|
||||||
|
bool metricSystem_;
|
||||||
|
float measuringTextSize_;
|
||||||
|
float snapAxisThr_;
|
||||||
|
std::vector<cv::Vec3f> snapAxes_;
|
||||||
|
int measuringMode_;
|
||||||
|
bool addMeasureClicked_;
|
||||||
|
bool teleportClicked_;
|
||||||
|
bool removeMeasureClicked_;
|
||||||
|
std::vector<cv::Point3f> measuringTmpPts_; // In opengl frame
|
||||||
|
std::vector<cv::Point3f> measuringTmpNormals_; // In opengl frame
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr targetPoint_;
|
||||||
|
pcl::PointCloud<pcl::PointXYZ>::Ptr quadSample_;
|
||||||
|
std::vector<pcl::Vertices> quadSamplePolygons_;
|
||||||
// main_scene_ includes all drawable object for visualizing Tango device's
|
// main_scene_ includes all drawable object for visualizing Tango device's
|
||||||
// movement and point cloud.
|
// movement and point cloud.
|
||||||
Scene main_scene_;
|
Scene main_scene_;
|
||||||
@@ -270,16 +305,15 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
UTimer fpsTime_;
|
UTimer fpsTime_;
|
||||||
|
|
||||||
std::list<rtabmap::RtabmapEvent*> rtabmapEvents_;
|
std::list<rtabmap::RtabmapEvent*> rtabmapEvents_;
|
||||||
std::list<rtabmap::OdometryEvent> odomEvents_;
|
std::list<rtabmap::SensorEvent> sensorEvents_;
|
||||||
std::list<rtabmap::Transform> poseEvents_;
|
std::list<rtabmap::Transform> poseEvents_;
|
||||||
std::map<double, rtabmap::Transform> poseBuffer_;
|
|
||||||
|
|
||||||
rtabmap::Transform mapToOdom_;
|
rtabmap::Transform mapToOdom_;
|
||||||
|
|
||||||
boost::mutex cameraMutex_;
|
boost::mutex cameraMutex_;
|
||||||
boost::mutex rtabmapMutex_;
|
boost::mutex rtabmapMutex_;
|
||||||
boost::mutex meshesMutex_;
|
boost::mutex meshesMutex_;
|
||||||
boost::mutex odomMutex_;
|
boost::mutex sensorMutex_;
|
||||||
boost::mutex poseMutex_;
|
boost::mutex poseMutex_;
|
||||||
boost::mutex renderingMutex_;
|
boost::mutex renderingMutex_;
|
||||||
|
|
||||||
@@ -306,6 +340,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
float, float, float, float,
|
float, float, float, float,
|
||||||
int, int,
|
int, int,
|
||||||
float, float, float, float, float, float);
|
float, float, float, float, float, float);
|
||||||
|
void(*swiftCameraInfoEventCallback)(void *, int, const char *, const char *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ void BackgroundRenderer::InitializeGlContent(GLuint textureId, bool oes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BackgroundRenderer::Draw(const float * transformed_uvs, const GLuint & depthTexture, int screenWidth, int screenHeight, bool redUnknown) {
|
void BackgroundRenderer::Draw(const float * transformed_uvs, const GLuint & depthTexture, int screenWidth, int screenHeight, bool redUnknown) {
|
||||||
static_assert(std::extent<decltype(BackgroundRenderer_kVertices)>::value == kNumVertices * 2, "Incorrect kVertices length");
|
static_assert(std::extent<decltype(BackgroundRenderer_kVerticesDevice)>::value == kNumVertices * 2, "Incorrect kVertices length");
|
||||||
|
|
||||||
GLuint program = shaderPrograms_[depthTexture>0?1:0];
|
GLuint program = shaderPrograms_[depthTexture>0?1:0];
|
||||||
|
|
||||||
@@ -191,7 +191,7 @@ void BackgroundRenderer::Draw(const float * transformed_uvs, const GLuint & dept
|
|||||||
GLuint attributeVertices = glGetAttribLocation(program, "a_Position");
|
GLuint attributeVertices = glGetAttribLocation(program, "a_Position");
|
||||||
GLuint attributeUvs = glGetAttribLocation(program, "a_TexCoord");
|
GLuint attributeUvs = glGetAttribLocation(program, "a_TexCoord");
|
||||||
|
|
||||||
glVertexAttribPointer(attributeVertices, 2, GL_FLOAT, GL_FALSE, 0, BackgroundRenderer_kVertices);
|
glVertexAttribPointer(attributeVertices, 2, GL_FLOAT, GL_FALSE, 0, BackgroundRenderer_kVerticesDevice);
|
||||||
glVertexAttribPointer(attributeUvs, 2, GL_FLOAT, GL_FALSE, 0, transformed_uvs?transformed_uvs:BackgroundRenderer_kTexCoord);
|
glVertexAttribPointer(attributeUvs, 2, GL_FLOAT, GL_FALSE, 0, transformed_uvs?transformed_uvs:BackgroundRenderer_kTexCoord);
|
||||||
|
|
||||||
glEnableVertexAttribArray(attributeVertices);
|
glEnableVertexAttribArray(attributeVertices);
|
||||||
|
|||||||
@@ -28,9 +28,15 @@
|
|||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static const GLfloat BackgroundRenderer_kVertices[] = {
|
static const GLfloat BackgroundRenderer_kVerticesDevice[] = {
|
||||||
-1.0f, -1.0f, +1.0f, -1.0f, -1.0f, +1.0f, +1.0f, +1.0f,
|
-1.0f, -1.0f, +1.0f, -1.0f, -1.0f, +1.0f, +1.0f, +1.0f,
|
||||||
};
|
};
|
||||||
|
//static const GLfloat BackgroundRenderer_kVerticesView[] = {
|
||||||
|
// 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
|
||||||
|
//};
|
||||||
|
static const GLfloat BackgroundRenderer_kVerticesView[] = {
|
||||||
|
0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
};
|
||||||
static const GLfloat BackgroundRenderer_kTexCoord[] = {
|
static const GLfloat BackgroundRenderer_kTexCoord[] = {
|
||||||
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
|
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -512,6 +512,19 @@ Java_com_introlab_rtabmap_RTABMapLib_setSmoothing(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setDepthBleedingError(
|
||||||
|
JNIEnv*, jclass, jlong native_application, float value)
|
||||||
|
{
|
||||||
|
if(native_application)
|
||||||
|
{
|
||||||
|
return native(native_application)->setDepthBleedingError(value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("native_application is null!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setDepthFromMotion(
|
Java_com_introlab_rtabmap_RTABMapLib_setDepthFromMotion(
|
||||||
JNIEnv*, jclass, jlong native_application, bool enabled)
|
JNIEnv*, jclass, jlong native_application, bool enabled)
|
||||||
{
|
{
|
||||||
@@ -550,6 +563,20 @@ Java_com_introlab_rtabmap_RTABMapLib_setAppendMode(
|
|||||||
UERROR("native_application is null!");
|
UERROR("native_application is null!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setUpstreamRelocalizationAccThr(
|
||||||
|
JNIEnv*, jclass, jlong native_application, float value)
|
||||||
|
{
|
||||||
|
if(native_application)
|
||||||
|
{
|
||||||
|
return native(native_application)->setUpstreamRelocalizationAccThr(value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("native_application is null!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setDataRecorderMode(
|
Java_com_introlab_rtabmap_RTABMapLib_setDataRecorderMode(
|
||||||
JNIEnv*, jclass, jlong native_application, bool enabled)
|
JNIEnv*, jclass, jlong native_application, bool enabled)
|
||||||
@@ -807,6 +834,7 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
|
|||||||
optimizedMinClusterSize,
|
optimizedMinClusterSize,
|
||||||
optimizedMaxTextureDistance,
|
optimizedMaxTextureDistance,
|
||||||
optimizedMinTextureClusterSize,
|
optimizedMinTextureClusterSize,
|
||||||
|
0,
|
||||||
blockRendering);
|
blockRendering);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -866,22 +894,6 @@ Java_com_introlab_rtabmap_RTABMapLib_postProcessing(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_postCameraPoseEvent(
|
|
||||||
JNIEnv* env, jclass, jlong native_application,
|
|
||||||
float x, float y, float z, float qx, float qy, float qz, float qw, double stamp)
|
|
||||||
{
|
|
||||||
if(native_application)
|
|
||||||
{
|
|
||||||
native(native_application)->postCameraPoseEvent(x,y,z,qx,qy,qz,qw, stamp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UERROR("native_application is null!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_postOdometryEvent(
|
Java_com_introlab_rtabmap_RTABMapLib_postOdometryEvent(
|
||||||
JNIEnv* env, jclass, jlong native_application,
|
JNIEnv* env, jclass, jlong native_application,
|
||||||
|
|||||||
@@ -170,10 +170,12 @@ const std::string kTextureMeshVertexShader =
|
|||||||
"precision highp float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"attribute vec3 aVertex;\n"
|
"attribute vec3 aVertex;\n"
|
||||||
|
"attribute vec3 aColor;\n"
|
||||||
"attribute vec2 aTexCoord;\n"
|
"attribute vec2 aTexCoord;\n"
|
||||||
|
|
||||||
"uniform mat4 uMVP;\n"
|
"uniform mat4 uMVP;\n"
|
||||||
|
|
||||||
|
"varying vec3 vColor;\n"
|
||||||
"varying vec2 vTexCoord;\n"
|
"varying vec2 vTexCoord;\n"
|
||||||
"varying float vLightWeighting;\n"
|
"varying float vLightWeighting;\n"
|
||||||
|
|
||||||
@@ -187,12 +189,14 @@ const std::string kTextureMeshVertexShader =
|
|||||||
" vTexCoord = aTexCoord;\n"
|
" vTexCoord = aTexCoord;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
|
||||||
|
" vColor = aColor;\n"
|
||||||
" vLightWeighting = 1.0;\n"
|
" vLightWeighting = 1.0;\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
const std::string kTextureMeshLightingVertexShader =
|
const std::string kTextureMeshLightingVertexShader =
|
||||||
"precision highp float;\n"
|
"precision highp float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
"attribute vec3 aVertex;\n"
|
"attribute vec3 aVertex;\n"
|
||||||
|
"attribute vec3 aColor;\n"
|
||||||
"attribute vec3 aNormal;\n"
|
"attribute vec3 aNormal;\n"
|
||||||
"attribute vec2 aTexCoord;\n"
|
"attribute vec2 aTexCoord;\n"
|
||||||
|
|
||||||
@@ -200,6 +204,7 @@ const std::string kTextureMeshLightingVertexShader =
|
|||||||
"uniform mat3 uN;\n"
|
"uniform mat3 uN;\n"
|
||||||
"uniform vec3 uLightingDirection;\n"
|
"uniform vec3 uLightingDirection;\n"
|
||||||
|
|
||||||
|
"varying vec3 vColor;\n"
|
||||||
"varying vec2 vTexCoord;\n"
|
"varying vec2 vTexCoord;\n"
|
||||||
"varying float vLightWeighting;\n"
|
"varying float vLightWeighting;\n"
|
||||||
|
|
||||||
@@ -213,6 +218,7 @@ const std::string kTextureMeshLightingVertexShader =
|
|||||||
" vTexCoord = aTexCoord;\n"
|
" vTexCoord = aTexCoord;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
|
||||||
|
" vColor = aColor;\n"
|
||||||
" vec3 transformedNormal = uN * aNormal;\n"
|
" vec3 transformedNormal = uN * aNormal;\n"
|
||||||
" vLightWeighting = max(dot(transformedNormal, uLightingDirection)*0.5+0.5, 0.0);\n"
|
" vLightWeighting = max(dot(transformedNormal, uLightingDirection)*0.5+0.5, 0.0);\n"
|
||||||
" if(vLightWeighting<0.5) \n"
|
" if(vLightWeighting<0.5) \n"
|
||||||
@@ -225,11 +231,22 @@ const std::string kTextureMeshFragmentShader =
|
|||||||
"uniform float uGainR;\n"
|
"uniform float uGainR;\n"
|
||||||
"uniform float uGainG;\n"
|
"uniform float uGainG;\n"
|
||||||
"uniform float uGainB;\n"
|
"uniform float uGainB;\n"
|
||||||
|
"uniform int uHideSeams;\n"
|
||||||
|
"varying vec3 vColor;\n"
|
||||||
"varying vec2 vTexCoord;\n"
|
"varying vec2 vTexCoord;\n"
|
||||||
"varying float vLightWeighting;\n"
|
"varying float vLightWeighting;\n"
|
||||||
""
|
""
|
||||||
"void main() {\n"
|
"void main() {\n"
|
||||||
" vec4 textureColor = texture2D(uTexture, vTexCoord);\n"
|
" vec4 textureColor;\n"
|
||||||
|
" if(uHideSeams==1) {\n"
|
||||||
|
" if(vTexCoord.x>0.99 && vTexCoord.y>0.99) {\n"
|
||||||
|
" textureColor = vec4(vColor.z, vColor.y, vColor.x, 1.0);\n"
|
||||||
|
" } else {\n"
|
||||||
|
" textureColor = texture2D(uTexture, vTexCoord);\n"
|
||||||
|
" }\n"
|
||||||
|
" } else {\n"
|
||||||
|
" textureColor = texture2D(uTexture, vTexCoord) * vec4(vColor.z, vColor.y, vColor.x, 1.0);\n"
|
||||||
|
" }\n"
|
||||||
" gl_FragColor = vec4(textureColor.r * uGainR * vLightWeighting, textureColor.g * uGainG * vLightWeighting, textureColor.b * uGainB * vLightWeighting, textureColor.a);\n"
|
" gl_FragColor = vec4(textureColor.r * uGainR * vLightWeighting, textureColor.g * uGainG * vLightWeighting, textureColor.b * uGainB * vLightWeighting, textureColor.a);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
const std::string kTextureMeshBlendingFragmentShader =
|
const std::string kTextureMeshBlendingFragmentShader =
|
||||||
@@ -243,11 +260,12 @@ const std::string kTextureMeshBlendingFragmentShader =
|
|||||||
"uniform vec2 uScreenScale;\n"
|
"uniform vec2 uScreenScale;\n"
|
||||||
"uniform float uNearZ;\n"
|
"uniform float uNearZ;\n"
|
||||||
"uniform float uFarZ;\n"
|
"uniform float uFarZ;\n"
|
||||||
|
"varying vec3 vColor;\n"
|
||||||
"varying vec2 vTexCoord;\n"
|
"varying vec2 vTexCoord;\n"
|
||||||
"varying float vLightWeighting;\n"
|
"varying float vLightWeighting;\n"
|
||||||
""
|
""
|
||||||
"void main() {\n"
|
"void main() {\n"
|
||||||
" vec4 textureColor = texture2D(uTexture, vTexCoord);\n"
|
" vec4 textureColor = texture2D(uTexture, vTexCoord);\n"
|
||||||
" float alpha = 1.0;\n"
|
" float alpha = 1.0;\n"
|
||||||
" vec2 coord = uScreenScale * gl_FragCoord.xy;\n;"
|
" vec2 coord = uScreenScale * gl_FragCoord.xy;\n;"
|
||||||
" vec4 depthPacked = texture2D(uDepthTexture, coord);\n"
|
" vec4 depthPacked = texture2D(uDepthTexture, coord);\n"
|
||||||
@@ -1008,7 +1026,8 @@ void PointCloudDrawable::Render(
|
|||||||
float nearClipPlane,
|
float nearClipPlane,
|
||||||
float farClipPlane,
|
float farClipPlane,
|
||||||
bool packDepthToColorChannel,
|
bool packDepthToColorChannel,
|
||||||
bool wireFrame) const
|
bool wireFrame,
|
||||||
|
bool hideSeams) const
|
||||||
{
|
{
|
||||||
if(vertex_buffer_ && nPoints_ && visible_ && !shaderPrograms_.empty())
|
if(vertex_buffer_ && nPoints_ && visible_ && !shaderPrograms_.empty())
|
||||||
{
|
{
|
||||||
@@ -1127,12 +1146,16 @@ void PointCloudDrawable::Render(
|
|||||||
|
|
||||||
attribute_texture = glGetAttribLocation(program, "aTexCoord");
|
attribute_texture = glGetAttribLocation(program, "aTexCoord");
|
||||||
glEnableVertexAttribArray(attribute_texture);
|
glEnableVertexAttribArray(attribute_texture);
|
||||||
|
|
||||||
|
if(depthTexture == 0)
|
||||||
|
{
|
||||||
|
GLuint hideSeams_handle = glGetUniformLocation(program, "uHideSeams");
|
||||||
|
glUniform1i(hideSeams_handle, hideSeams?1:0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
attribute_color = glGetAttribLocation(program, "aColor");
|
||||||
attribute_color = glGetAttribLocation(program, "aColor");
|
glEnableVertexAttribArray(attribute_color);
|
||||||
glEnableVertexAttribArray(attribute_color);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
tango_gl::util::CheckGlError("Pointcloud::Render() common");
|
tango_gl::util::CheckGlError("Pointcloud::Render() common");
|
||||||
|
|
||||||
@@ -1144,7 +1167,7 @@ void PointCloudDrawable::Render(
|
|||||||
{
|
{
|
||||||
glVertexAttribPointer(attribute_texture, 2, GL_FLOAT, GL_FALSE, (hasNormals_?9:6)*sizeof(GLfloat), (GLvoid*) (4 * sizeof(GLfloat)));
|
glVertexAttribPointer(attribute_texture, 2, GL_FLOAT, GL_FALSE, (hasNormals_?9:6)*sizeof(GLfloat), (GLvoid*) (4 * sizeof(GLfloat)));
|
||||||
}
|
}
|
||||||
else if(!packDepthToColorChannel)
|
if(!packDepthToColorChannel)
|
||||||
{
|
{
|
||||||
glVertexAttribPointer(attribute_color, 3, GL_UNSIGNED_BYTE, GL_TRUE, (hasNormals_?9:6)*sizeof(GLfloat), (GLvoid*) (3 * sizeof(GLfloat)));
|
glVertexAttribPointer(attribute_color, 3, GL_UNSIGNED_BYTE, GL_TRUE, (hasNormals_?9:6)*sizeof(GLfloat), (GLvoid*) (3 * sizeof(GLfloat)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,8 @@ private:
|
|||||||
float nearClipPlane = 0, // nonnull if depthTexture>0
|
float nearClipPlane = 0, // nonnull if depthTexture>0
|
||||||
float farClipPlane = 0, // nonnull if depthTexture>0
|
float farClipPlane = 0, // nonnull if depthTexture>0
|
||||||
bool packDepthToColorChannel = false,
|
bool packDepthToColorChannel = false,
|
||||||
bool wireFrame = false) const;
|
bool wireFrame = false,
|
||||||
|
bool hideSeams = false) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<class PointT>
|
template<class PointT>
|
||||||
|
|||||||
69
app/android/jni/quad_color.cpp
Normal file
69
app/android/jni/quad_color.cpp
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 Google Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "quad_color.h"
|
||||||
|
#include "tango-gl/util.h"
|
||||||
|
|
||||||
|
static const float vertices[] = {-1.0f, -1.0f, 1.0f, -1.0f,
|
||||||
|
-1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
|
||||||
|
QuadColor::QuadColor(float size) {
|
||||||
|
SetShader();
|
||||||
|
|
||||||
|
vertices_.resize(8);
|
||||||
|
for(int i=0; i<8; ++i)
|
||||||
|
{
|
||||||
|
vertices_[i] = vertices[i]*size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QuadColor::QuadColor(
|
||||||
|
float widthLeft,
|
||||||
|
float widthRight,
|
||||||
|
float heightBottom,
|
||||||
|
float heightTop) {
|
||||||
|
SetShader();
|
||||||
|
|
||||||
|
vertices_.resize(8);
|
||||||
|
vertices_[0] = vertices[0]*widthLeft;
|
||||||
|
vertices_[1] = vertices[1]*heightBottom;
|
||||||
|
vertices_[2] = vertices[2]*widthRight;
|
||||||
|
vertices_[3] = vertices[3]*heightBottom;
|
||||||
|
vertices_[4] = vertices[4]*widthLeft;
|
||||||
|
vertices_[5] = vertices[5]*heightTop;
|
||||||
|
vertices_[6] = vertices[6]*widthRight;
|
||||||
|
vertices_[7] = vertices[7]*heightTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QuadColor::Render(const glm::mat4& projection_mat,
|
||||||
|
const glm::mat4& view_mat) const {
|
||||||
|
glUseProgram(shader_program_);
|
||||||
|
|
||||||
|
// Calculate MVP matrix and pass it to shader.
|
||||||
|
glm::mat4 model_mat = GetTransformationMatrix();
|
||||||
|
glm::mat4 mvp_mat = projection_mat * view_mat * model_mat;
|
||||||
|
glUniformMatrix4fv(uniform_mvp_mat_, 1, GL_FALSE, glm::value_ptr(mvp_mat));
|
||||||
|
|
||||||
|
glUniform4f(uniform_color_, red_, green_, blue_, alpha_);
|
||||||
|
|
||||||
|
// Vertice binding
|
||||||
|
glEnableVertexAttribArray(attrib_vertices_);
|
||||||
|
glVertexAttribPointer(attrib_vertices_, 2, GL_FLOAT, GL_FALSE, 0, &vertices_[0]);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
|
glUseProgram(0);
|
||||||
|
}
|
||||||
35
app/android/jni/quad_color.h
Normal file
35
app/android/jni/quad_color.h
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 Google Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TANGO_GL_QUADCOLOR_H_
|
||||||
|
#define TANGO_GL_QUADCOLOR_H_
|
||||||
|
|
||||||
|
#include "tango-gl/drawable_object.h"
|
||||||
|
|
||||||
|
class QuadColor : public tango_gl::DrawableObject {
|
||||||
|
public:
|
||||||
|
QuadColor(float size);
|
||||||
|
QuadColor(float widthLeft,
|
||||||
|
float widthRight,
|
||||||
|
float heightBottom,
|
||||||
|
float heightTop);
|
||||||
|
QuadColor(const QuadColor& other) = delete;
|
||||||
|
QuadColor& operator=(const QuadColor&) = delete;
|
||||||
|
virtual ~QuadColor() {}
|
||||||
|
|
||||||
|
void Render(const glm::mat4& projection_mat, const glm::mat4& view_mat) const;
|
||||||
|
};
|
||||||
|
#endif // TANGO_GL_QUADCOLOR_H_
|
||||||
BIN
app/android/jni/resources/text_atlas.png
Normal file
BIN
app/android/jni/resources/text_atlas.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
@@ -36,7 +36,7 @@
|
|||||||
// add an offset in z to our origin. We'll set this offset to 1.3 meters based
|
// add an offset in z to our origin. We'll set this offset to 1.3 meters based
|
||||||
// on the average height of a human standing with a Tango device. This allows us
|
// on the average height of a human standing with a Tango device. This allows us
|
||||||
// to place a grid roughly on the ground for most users.
|
// to place a grid roughly on the ground for most users.
|
||||||
const glm::vec3 kHeightOffset = glm::vec3(0.0f, -1.3f, 0.0f);
|
const glm::vec3 Scene::kHeightOffset = glm::vec3(0.0f, -1.3f, 0.0f);
|
||||||
|
|
||||||
// Color of the motion tracking trajectory.
|
// Color of the motion tracking trajectory.
|
||||||
const tango_gl::Color kTraceColor(0.66f, 0.66f, 0.66f);
|
const tango_gl::Color kTraceColor(0.66f, 0.66f, 0.66f);
|
||||||
@@ -93,6 +93,7 @@ Scene::Scene() :
|
|||||||
lighting_(false),
|
lighting_(false),
|
||||||
backfaceCulling_(true),
|
backfaceCulling_(true),
|
||||||
wireFrame_(false),
|
wireFrame_(false),
|
||||||
|
textureColorSeamsHidden_(true),
|
||||||
r_(0.0f),
|
r_(0.0f),
|
||||||
g_(0.0f),
|
g_(0.0f),
|
||||||
b_(0.0f),
|
b_(0.0f),
|
||||||
@@ -124,6 +125,7 @@ void Scene::InitGLContent()
|
|||||||
|
|
||||||
UASSERT(axis_ == 0);
|
UASSERT(axis_ == 0);
|
||||||
|
|
||||||
|
TextDrawable::createShaderProgram();
|
||||||
|
|
||||||
axis_ = new tango_gl::Axis();
|
axis_ = new tango_gl::Axis();
|
||||||
frustum_ = new tango_gl::Frustum();
|
frustum_ = new tango_gl::Frustum();
|
||||||
@@ -166,6 +168,7 @@ void Scene::DeleteResources() {
|
|||||||
background_renderer_ = 0;
|
background_renderer_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TextDrawable::releaseShaderProgram();
|
||||||
PointCloudDrawable::releaseShaderPrograms();
|
PointCloudDrawable::releaseShaderPrograms();
|
||||||
|
|
||||||
if (graph_shader_program_) {
|
if (graph_shader_program_) {
|
||||||
@@ -198,6 +201,10 @@ void Scene::clear()
|
|||||||
{
|
{
|
||||||
delete iter->second;
|
delete iter->second;
|
||||||
}
|
}
|
||||||
|
clearLines();
|
||||||
|
clearQuads();
|
||||||
|
clearTexts();
|
||||||
|
clearCircles();
|
||||||
if(trace_)
|
if(trace_)
|
||||||
{
|
{
|
||||||
trace_->ClearVertexArray();
|
trace_->ClearVertexArray();
|
||||||
@@ -215,6 +222,39 @@ void Scene::clear()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::clearLines()
|
||||||
|
{
|
||||||
|
for(std::map<int, tango_gl::Line*>::iterator iter=lines_.begin(); iter!=lines_.end(); ++iter)
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
}
|
||||||
|
lines_.clear();
|
||||||
|
}
|
||||||
|
void Scene::clearTexts()
|
||||||
|
{
|
||||||
|
for(std::map<int, TextDrawable*>::iterator iter=texts_.begin(); iter!=texts_.end(); ++iter)
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
}
|
||||||
|
texts_.clear();
|
||||||
|
}
|
||||||
|
void Scene::clearQuads()
|
||||||
|
{
|
||||||
|
for(std::map<int, QuadColor*>::iterator iter=quads_.begin(); iter!=quads_.end(); ++iter)
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
}
|
||||||
|
quads_.clear();
|
||||||
|
}
|
||||||
|
void Scene::clearCircles()
|
||||||
|
{
|
||||||
|
for(std::map<int, tango_gl::Circle*>::iterator iter=circles_.begin(); iter!=circles_.end(); ++iter)
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
}
|
||||||
|
circles_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
//Should only be called in OpenGL thread!
|
//Should only be called in OpenGL thread!
|
||||||
void Scene::SetupViewPort(int w, int h) {
|
void Scene::SetupViewPort(int w, int h) {
|
||||||
if (h == 0) {
|
if (h == 0) {
|
||||||
@@ -444,8 +484,14 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
std::vector<glm::vec4> planes = computeFrustumPlanes(projectionMatrix*viewMatrix, true);
|
std::vector<glm::vec4> planes = computeFrustumPlanes(projectionMatrix*viewMatrix, true);
|
||||||
std::vector<PointCloudDrawable*> cloudsToDraw(pointClouds_.size());
|
std::vector<PointCloudDrawable*> cloudsToDraw(pointClouds_.size());
|
||||||
int oi=0;
|
int oi=0;
|
||||||
|
int positiveCloudIds = 0;
|
||||||
for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
|
for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
|
||||||
{
|
{
|
||||||
|
if(iter->first > 0)
|
||||||
|
{
|
||||||
|
positiveCloudIds++;
|
||||||
|
}
|
||||||
|
|
||||||
if(!mapRendering_ && iter->first > 0)
|
if(!mapRendering_ && iter->first > 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@@ -487,7 +533,7 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
(blending_ &&
|
(blending_ &&
|
||||||
gesture_camera_->GetCameraType()!=tango_gl::GestureCamera::kTopOrtho &&
|
gesture_camera_->GetCameraType()!=tango_gl::GestureCamera::kTopOrtho &&
|
||||||
mapRendering_ && meshRendering_ &&
|
mapRendering_ && meshRendering_ &&
|
||||||
(cloudsToDraw.size() > 1 || (renderBackgroundCamera && wireFrame_)));
|
(positiveCloudIds > 1 || (renderBackgroundCamera && wireFrame_)));
|
||||||
|
|
||||||
if(onlineBlending && fboId_)
|
if(onlineBlending && fboId_)
|
||||||
{
|
{
|
||||||
@@ -629,9 +675,18 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
cloud->getPose().z() - openglCamera.z());
|
cloud->getPose().z() - openglCamera.z());
|
||||||
float distanceToCameraSqr = cloudToCamera[0]*cloudToCamera[0] + cloudToCamera[1]*cloudToCamera[1] + cloudToCamera[2]*cloudToCamera[2];
|
float distanceToCameraSqr = cloudToCamera[0]*cloudToCamera[0] + cloudToCamera[1]*cloudToCamera[1] + cloudToCamera[2]*cloudToCamera[2];
|
||||||
|
|
||||||
cloud->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, meshRenderingTexture_, lighting_, distanceToCameraSqr, onlineBlending?depthTexture_:0, screenWidth_, screenHeight_, gesture_camera_->getNearClipPlane(), gesture_camera_->getFarClipPlane(), false, wireFrame_);
|
cloud->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, meshRenderingTexture_, lighting_, distanceToCameraSqr, onlineBlending?depthTexture_:0, screenWidth_, screenHeight_, gesture_camera_->getNearClipPlane(), gesture_camera_->getFarClipPlane(), false, wireFrame_, textureColorSeamsHidden_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(quads_.find(55556)!=quads_.end())
|
||||||
|
{
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
const QuadColor * quad = quads_.at(55556);
|
||||||
|
quad->Render(projectionMatrix, viewMatrix);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
}
|
||||||
|
|
||||||
if(onlineBlending)
|
if(onlineBlending)
|
||||||
{
|
{
|
||||||
if(renderBackgroundCamera && meshRendering_)
|
if(renderBackgroundCamera && meshRendering_)
|
||||||
@@ -643,6 +698,57 @@ int Scene::Render(const float * uvsTransformed, glm::mat4 arViewMatrix, glm::mat
|
|||||||
glDepthMask(GL_TRUE);
|
glDepthMask(GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////
|
||||||
|
glDisable (GL_DEPTH_TEST);
|
||||||
|
if(lines_.size())
|
||||||
|
{
|
||||||
|
for(std::map<int, tango_gl::Line*>::const_iterator iter=lines_.begin(); iter!=lines_.end(); ++iter)
|
||||||
|
{
|
||||||
|
const tango_gl::Line * line = iter->second;
|
||||||
|
line->Render(projectionMatrix, viewMatrix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(quads_.size())
|
||||||
|
{
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
for(std::map<int, QuadColor*>::const_iterator iter=quads_.begin(); iter!=quads_.end(); ++iter)
|
||||||
|
{
|
||||||
|
if(iter->first!=55556)
|
||||||
|
{
|
||||||
|
const QuadColor * quad = iter->second;
|
||||||
|
quad->Render(projectionMatrix, viewMatrix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(circles_.size())
|
||||||
|
{
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
for(std::map<int, tango_gl::Circle*>::const_iterator iter=circles_.begin(); iter!=circles_.end(); ++iter)
|
||||||
|
{
|
||||||
|
const tango_gl::Circle * circle = iter->second;
|
||||||
|
circle->Render(projectionMatrix, viewMatrix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(texts_.size())
|
||||||
|
{
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glm::mat4 viewMatrixRotInv = viewMatrix;
|
||||||
|
viewMatrixRotInv[3][0] = 0;
|
||||||
|
viewMatrixRotInv[3][1] = 0;
|
||||||
|
viewMatrixRotInv[3][2] = 0;
|
||||||
|
viewMatrixRotInv = glm::inverse(viewMatrixRotInv);
|
||||||
|
for(std::map<int, TextDrawable*>::const_iterator iter=texts_.begin(); iter!=texts_.end(); ++iter)
|
||||||
|
{
|
||||||
|
const TextDrawable * text = iter->second;
|
||||||
|
text->Render(projectionMatrix, viewMatrix, viewMatrixRotInv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//draw markers on foreground
|
//draw markers on foreground
|
||||||
for(std::map<int, tango_gl::Axis*>::const_iterator iter=markers_.begin(); iter!=markers_.end(); ++iter)
|
for(std::map<int, tango_gl::Axis*>::const_iterator iter=markers_.begin(); iter!=markers_.end(); ++iter)
|
||||||
{
|
{
|
||||||
@@ -800,12 +906,7 @@ void Scene::addCloud(
|
|||||||
const rtabmap::Transform & pose)
|
const rtabmap::Transform & pose)
|
||||||
{
|
{
|
||||||
LOGI("add cloud %d (%d points %d indices)", id, (int)cloud->size(), indices.get()?(int)indices->size():0);
|
LOGI("add cloud %d (%d points %d indices)", id, (int)cloud->size(), indices.get()?(int)indices->size():0);
|
||||||
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
removeCloudOrMesh(id);
|
||||||
if(iter != pointClouds_.end())
|
|
||||||
{
|
|
||||||
delete iter->second;
|
|
||||||
pointClouds_.erase(iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
//create
|
//create
|
||||||
PointCloudDrawable * drawable = new PointCloudDrawable(cloud, indices);
|
PointCloudDrawable * drawable = new PointCloudDrawable(cloud, indices);
|
||||||
@@ -813,6 +914,16 @@ void Scene::addCloud(
|
|||||||
pointClouds_.insert(std::make_pair(id, drawable));
|
pointClouds_.insert(std::make_pair(id, drawable));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::removeCloudOrMesh(int id)
|
||||||
|
{
|
||||||
|
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
||||||
|
if(iter != pointClouds_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
pointClouds_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Scene::addMesh(
|
void Scene::addMesh(
|
||||||
int id,
|
int id,
|
||||||
const rtabmap::Mesh & mesh,
|
const rtabmap::Mesh & mesh,
|
||||||
@@ -820,12 +931,7 @@ void Scene::addMesh(
|
|||||||
bool createWireframe)
|
bool createWireframe)
|
||||||
{
|
{
|
||||||
LOGI("add mesh %d", id);
|
LOGI("add mesh %d", id);
|
||||||
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
removeCloudOrMesh(id);
|
||||||
if(iter != pointClouds_.end())
|
|
||||||
{
|
|
||||||
delete iter->second;
|
|
||||||
pointClouds_.erase(iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
//create
|
//create
|
||||||
PointCloudDrawable * drawable = new PointCloudDrawable(mesh, createWireframe);
|
PointCloudDrawable * drawable = new PointCloudDrawable(mesh, createWireframe);
|
||||||
@@ -885,6 +991,160 @@ void Scene::addMesh(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::addLine(
|
||||||
|
int id,
|
||||||
|
const cv::Point3f & pt1,
|
||||||
|
const cv::Point3f & pt2,
|
||||||
|
const tango_gl::Color & color)
|
||||||
|
{
|
||||||
|
LOGI("add line %d", id);
|
||||||
|
removeLine(id);
|
||||||
|
|
||||||
|
//create
|
||||||
|
tango_gl::Line * line = new tango_gl::Line(2.0f, GL_LINES);
|
||||||
|
line->SetShader();
|
||||||
|
std::vector<glm::vec3> vertices(2);
|
||||||
|
vertices[0].x = pt1.x;
|
||||||
|
vertices[0].y = pt1.y;
|
||||||
|
vertices[0].z = pt1.z;
|
||||||
|
vertices[1].x = pt2.x;
|
||||||
|
vertices[1].y = pt2.y;
|
||||||
|
vertices[1].z = pt2.z;
|
||||||
|
line->UpdateLineVertices(vertices);
|
||||||
|
line->SetColor(color);
|
||||||
|
lines_.insert(std::make_pair(id, line));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::removeLine(int id)
|
||||||
|
{
|
||||||
|
std::map<int, tango_gl::Line*>::iterator iter=lines_.find(id);
|
||||||
|
if(iter != lines_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
lines_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::addText(
|
||||||
|
int id,
|
||||||
|
const std::string & text,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
float size,
|
||||||
|
const tango_gl::Color & color)
|
||||||
|
{
|
||||||
|
LOGI("add text %d", id);
|
||||||
|
removeText(id);
|
||||||
|
|
||||||
|
//create
|
||||||
|
TextDrawable * textD = new TextDrawable(text, pose, size, color);
|
||||||
|
texts_.insert(std::make_pair(id, textD));
|
||||||
|
}
|
||||||
|
void Scene::removeText(int id)
|
||||||
|
{
|
||||||
|
std::map<int, TextDrawable*>::iterator iter=texts_.find(id);
|
||||||
|
if(iter != texts_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
texts_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::addQuad(
|
||||||
|
int id,
|
||||||
|
float size,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha)
|
||||||
|
{
|
||||||
|
//LOGI("add quad %d", id);
|
||||||
|
std::map<int, QuadColor*>::iterator iter=quads_.find(id);
|
||||||
|
if(iter != quads_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
quads_.erase(iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
//create
|
||||||
|
QuadColor * quad = new QuadColor(size);
|
||||||
|
quad->SetTransformationMatrix(glmFromTransform(pose));
|
||||||
|
quad->SetColor(color);
|
||||||
|
quad->SetAlpha(alpha);
|
||||||
|
quads_.insert(std::make_pair(id, quad));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::addQuad(
|
||||||
|
int id,
|
||||||
|
float widthLeft,
|
||||||
|
float widthRight,
|
||||||
|
float heightBottom,
|
||||||
|
float heightTop,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha)
|
||||||
|
{
|
||||||
|
//LOGI("add quad %d", id);
|
||||||
|
removeQuad(id);
|
||||||
|
|
||||||
|
//create
|
||||||
|
QuadColor * quad = new QuadColor(widthLeft, widthRight, heightBottom, heightTop);
|
||||||
|
quad->SetTransformationMatrix(glmFromTransform(pose));
|
||||||
|
quad->SetColor(color);
|
||||||
|
quad->SetAlpha(alpha);
|
||||||
|
quads_.insert(std::make_pair(id, quad));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::removeQuad(int id)
|
||||||
|
{
|
||||||
|
std::map<int, QuadColor*>::iterator iter=quads_.find(id);
|
||||||
|
if(iter != quads_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
quads_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Scene::hasQuad(int id) const
|
||||||
|
{
|
||||||
|
return quads_.find(id) != quads_.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::addCircle(
|
||||||
|
int id,
|
||||||
|
float radius,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha)
|
||||||
|
{
|
||||||
|
//LOGI("add quad %d", id);
|
||||||
|
std::map<int, tango_gl::Circle*>::iterator iter=circles_.find(id);
|
||||||
|
if(iter != circles_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
circles_.erase(iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
//create
|
||||||
|
tango_gl::Circle * circle = new tango_gl::Circle(radius, 12);
|
||||||
|
circle->SetTransformationMatrix(glmFromTransform(pose));
|
||||||
|
circle->SetColor(color);
|
||||||
|
circle->SetAlpha(alpha);
|
||||||
|
circles_.insert(std::make_pair(id, circle));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::removeCircle(int id)
|
||||||
|
{
|
||||||
|
std::map<int, tango_gl::Circle*>::iterator iter=circles_.find(id);
|
||||||
|
if(iter != circles_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
circles_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Scene::hasCircle(int id) const
|
||||||
|
{
|
||||||
|
return circles_.find(id) != circles_.end();
|
||||||
|
}
|
||||||
|
|
||||||
void Scene::setCloudPose(int id, const rtabmap::Transform & pose)
|
void Scene::setCloudPose(int id, const rtabmap::Transform & pose)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include <tango-gl/trace.h>
|
#include <tango-gl/trace.h>
|
||||||
#include <tango-gl/transform.h>
|
#include <tango-gl/transform.h>
|
||||||
#include <tango-gl/util.h>
|
#include <tango-gl/util.h>
|
||||||
|
#include <tango-gl/circle.h>
|
||||||
|
|
||||||
#include <rtabmap/core/Transform.h>
|
#include <rtabmap/core/Transform.h>
|
||||||
#include <rtabmap/core/Link.h>
|
#include <rtabmap/core/Link.h>
|
||||||
@@ -41,12 +42,16 @@
|
|||||||
#include "graph_drawable.h"
|
#include "graph_drawable.h"
|
||||||
#include "bounding_box_drawable.h"
|
#include "bounding_box_drawable.h"
|
||||||
#include "background_renderer.h"
|
#include "background_renderer.h"
|
||||||
|
#include "text_drawable.h"
|
||||||
|
#include "quad_color.h"
|
||||||
|
|
||||||
#include <pcl/point_cloud.h>
|
#include <pcl/point_cloud.h>
|
||||||
#include <pcl/point_types.h>
|
#include <pcl/point_types.h>
|
||||||
|
|
||||||
// Scene provides OpenGL drawable objects and renders them for visualization.
|
// Scene provides OpenGL drawable objects and renders them for visualization.
|
||||||
class Scene {
|
class Scene {
|
||||||
|
public:
|
||||||
|
static const glm::vec3 kHeightOffset;
|
||||||
public:
|
public:
|
||||||
// Constructor and destructor.
|
// Constructor and destructor.
|
||||||
Scene();
|
Scene();
|
||||||
@@ -67,6 +72,10 @@ class Scene {
|
|||||||
void setScreenRotation(rtabmap::ScreenRotation colorCameraToDisplayRotation) {color_camera_to_display_rotation_ = colorCameraToDisplayRotation;}
|
void setScreenRotation(rtabmap::ScreenRotation colorCameraToDisplayRotation) {color_camera_to_display_rotation_ = colorCameraToDisplayRotation;}
|
||||||
|
|
||||||
void clear(); // removed all point clouds
|
void clear(); // removed all point clouds
|
||||||
|
void clearLines();
|
||||||
|
void clearTexts();
|
||||||
|
void clearQuads();
|
||||||
|
void clearCircles();
|
||||||
|
|
||||||
// Render loop.
|
// Render loop.
|
||||||
// @param: cur_pose_transformation, latest pose's transformation.
|
// @param: cur_pose_transformation, latest pose's transformation.
|
||||||
@@ -119,11 +128,50 @@ class Scene {
|
|||||||
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
const pcl::IndicesPtr & indices,
|
const pcl::IndicesPtr & indices,
|
||||||
const rtabmap::Transform & pose);
|
const rtabmap::Transform & pose);
|
||||||
|
void removeCloudOrMesh(int id);
|
||||||
void addMesh(
|
void addMesh(
|
||||||
int id,
|
int id,
|
||||||
const rtabmap::Mesh & mesh,
|
const rtabmap::Mesh & mesh,
|
||||||
const rtabmap::Transform & pose,
|
const rtabmap::Transform & pose,
|
||||||
bool createWireframe = false);
|
bool createWireframe = false);
|
||||||
|
void addLine(
|
||||||
|
int id,
|
||||||
|
const cv::Point3f & pt1,
|
||||||
|
const cv::Point3f & pt2,
|
||||||
|
const tango_gl::Color & color = tango_gl::Color(1.0f, 1.0f, 1.0f));
|
||||||
|
void removeLine(int id);
|
||||||
|
void addText(
|
||||||
|
int id,
|
||||||
|
const std::string & text,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
float size,
|
||||||
|
const tango_gl::Color & color);
|
||||||
|
void removeText(int id);
|
||||||
|
void addQuad(
|
||||||
|
int id,
|
||||||
|
float size,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha = 1.0f);
|
||||||
|
void addQuad(
|
||||||
|
int id,
|
||||||
|
float widthLeft,
|
||||||
|
float widthRight,
|
||||||
|
float heightBottom,
|
||||||
|
float heightTop,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha =1.0f);
|
||||||
|
void removeQuad(int id);
|
||||||
|
bool hasQuad(int id) const;
|
||||||
|
void addCircle(
|
||||||
|
int id,
|
||||||
|
float radius,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
const tango_gl::Color & color,
|
||||||
|
float alpha = 1.0f);
|
||||||
|
void removeCircle(int id);
|
||||||
|
bool hasCircle(int id) const;
|
||||||
|
|
||||||
void setCloudPose(int id, const rtabmap::Transform & pose);
|
void setCloudPose(int id, const rtabmap::Transform & pose);
|
||||||
void setCloudVisible(int id, bool visible);
|
void setCloudVisible(int id, bool visible);
|
||||||
@@ -145,6 +193,7 @@ class Scene {
|
|||||||
void setLighting(bool enabled) {lighting_ = enabled;}
|
void setLighting(bool enabled) {lighting_ = enabled;}
|
||||||
void setBackfaceCulling(bool enabled) {backfaceCulling_ = enabled;}
|
void setBackfaceCulling(bool enabled) {backfaceCulling_ = enabled;}
|
||||||
void setWireframe(bool enabled) {wireFrame_ = enabled;}
|
void setWireframe(bool enabled) {wireFrame_ = enabled;}
|
||||||
|
void setTextureColorSeamsHidden(bool hidden) {textureColorSeamsHidden_ = hidden;}
|
||||||
void setBackgroundColor(float r, float g, float b) {r_=r; g_=g; b_=b;} // 0.0f <> 1.0f
|
void setBackgroundColor(float r, float g, float b) {r_=r; g_=g; b_=b;} // 0.0f <> 1.0f
|
||||||
void setGridColor(float r, float g, float b);
|
void setGridColor(float r, float g, float b);
|
||||||
|
|
||||||
@@ -188,6 +237,10 @@ class Scene {
|
|||||||
rtabmap::ScreenRotation color_camera_to_display_rotation_;
|
rtabmap::ScreenRotation color_camera_to_display_rotation_;
|
||||||
|
|
||||||
std::map<int, PointCloudDrawable*> pointClouds_;
|
std::map<int, PointCloudDrawable*> pointClouds_;
|
||||||
|
std::map<int, tango_gl::Line*> lines_;
|
||||||
|
std::map<int, TextDrawable*> texts_;
|
||||||
|
std::map<int, QuadColor*> quads_;
|
||||||
|
std::map<int, tango_gl::Circle*> circles_;
|
||||||
|
|
||||||
rtabmap::Transform * currentPose_;
|
rtabmap::Transform * currentPose_;
|
||||||
|
|
||||||
@@ -203,6 +256,7 @@ class Scene {
|
|||||||
bool lighting_;
|
bool lighting_;
|
||||||
bool backfaceCulling_;
|
bool backfaceCulling_;
|
||||||
bool wireFrame_;
|
bool wireFrame_;
|
||||||
|
bool textureColorSeamsHidden_;
|
||||||
float r_;
|
float r_;
|
||||||
float g_;
|
float g_;
|
||||||
float b_;
|
float b_;
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ Circle::Circle(float radius, int resolution) : Mesh(GL_TRIANGLE_FAN){
|
|||||||
for (int i = resolution; i >= 0; i--) {
|
for (int i = resolution; i >= 0; i--) {
|
||||||
float theta = delta_theta * static_cast<float>(i);
|
float theta = delta_theta * static_cast<float>(i);
|
||||||
vertices.push_back(cos(theta) * radius);
|
vertices.push_back(cos(theta) * radius);
|
||||||
vertices.push_back(0);
|
|
||||||
vertices.push_back(sin(theta) * radius);
|
vertices.push_back(sin(theta) * radius);
|
||||||
|
vertices.push_back(0);
|
||||||
}
|
}
|
||||||
SetVertices(vertices);
|
SetVertices(vertices);
|
||||||
}
|
}
|
||||||
|
|||||||
366
app/android/jni/text_drawable.cpp
Normal file
366
app/android/jni/text_drawable.cpp
Normal file
@@ -0,0 +1,366 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2025, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the Universite de Sherbrooke nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
#include <jni.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <tango-gl/util.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <rtabmap/core/Transform.h>
|
||||||
|
#include "util.h"
|
||||||
|
#include "text_drawable.h"
|
||||||
|
#include "text_atlas_png.h"
|
||||||
|
#include <rtabmap/utilite/UConversion.h>
|
||||||
|
|
||||||
|
const std::string kTextVertexShader =
|
||||||
|
"uniform mat4 uMVPMatrix;"
|
||||||
|
"attribute vec4 vPosition;"
|
||||||
|
"attribute vec2 a_texCoord;"
|
||||||
|
"varying vec2 v_texCoord;"
|
||||||
|
"void main() {"
|
||||||
|
" gl_Position = uMVPMatrix * vPosition;"
|
||||||
|
" v_texCoord = a_texCoord;"
|
||||||
|
"}";
|
||||||
|
const std::string kTextFragmentShader =
|
||||||
|
"precision mediump float;"
|
||||||
|
"uniform vec3 uColor;"
|
||||||
|
"varying vec2 v_texCoord;"
|
||||||
|
"uniform sampler2D s_texture;"
|
||||||
|
"void main() {"
|
||||||
|
" gl_FragColor = texture2D( s_texture, v_texCoord );"
|
||||||
|
" gl_FragColor.rgb = uColor;"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
const int RI_TEXT_TEXTURE_SIZE = 512; // 512
|
||||||
|
const float RI_TEXT_HEIGHT_BASE = 32.0f;
|
||||||
|
const char RI_TEXT_START = ' ';
|
||||||
|
const char RI_TEXT_STOP = '~'+1;
|
||||||
|
|
||||||
|
GLuint TextDrawable::textProgram_ = 0;
|
||||||
|
GLuint TextDrawable::textTextureId_ = 0;
|
||||||
|
float TextDrawable::textUVWidth_ = 0;
|
||||||
|
float TextDrawable::textUVHeight_ = 0;
|
||||||
|
float TextDrawable::textHeight_ = 0;
|
||||||
|
std::vector<float> TextDrawable::textCharacterWidths_;
|
||||||
|
|
||||||
|
void TextDrawable::createShaderProgram()
|
||||||
|
{
|
||||||
|
releaseShaderProgram();
|
||||||
|
|
||||||
|
// hard-coded with text_atlas.png resource
|
||||||
|
textCharacterWidths_.resize(95);
|
||||||
|
textCharacterWidths_[0]=8;
|
||||||
|
textCharacterWidths_[1]=9.000000;
|
||||||
|
textCharacterWidths_[2]=10.000000;
|
||||||
|
textCharacterWidths_[3]=19.000000;
|
||||||
|
textCharacterWidths_[4]=18.000000;
|
||||||
|
textCharacterWidths_[5]=24.000000;
|
||||||
|
textCharacterWidths_[6]=21.000000;
|
||||||
|
textCharacterWidths_[7]=5.000000;
|
||||||
|
textCharacterWidths_[8]=11.000000;
|
||||||
|
textCharacterWidths_[9]=11.000000;
|
||||||
|
textCharacterWidths_[10]=15.000000;
|
||||||
|
textCharacterWidths_[11]=17.000000;
|
||||||
|
textCharacterWidths_[12]=8.000000;
|
||||||
|
textCharacterWidths_[13]=12.000000;
|
||||||
|
textCharacterWidths_[14]=9.000000;
|
||||||
|
textCharacterWidths_[15]=12.000000;
|
||||||
|
textCharacterWidths_[16]=18.000000;
|
||||||
|
textCharacterWidths_[17]=18.000000;
|
||||||
|
textCharacterWidths_[18]=18.000000;
|
||||||
|
textCharacterWidths_[19]=18.000000;
|
||||||
|
textCharacterWidths_[20]=18.000000;
|
||||||
|
textCharacterWidths_[21]=18.000000;
|
||||||
|
textCharacterWidths_[22]=18.000000;
|
||||||
|
textCharacterWidths_[23]=18.000000;
|
||||||
|
textCharacterWidths_[24]=18.000000;
|
||||||
|
textCharacterWidths_[25]=18.000000;
|
||||||
|
textCharacterWidths_[26]=9.000000;
|
||||||
|
textCharacterWidths_[27]=8.000000;
|
||||||
|
textCharacterWidths_[28]=16.000000;
|
||||||
|
textCharacterWidths_[29]=18.000000;
|
||||||
|
textCharacterWidths_[30]=17.000000;
|
||||||
|
textCharacterWidths_[31]=16.000000;
|
||||||
|
textCharacterWidths_[32]=29.000000;
|
||||||
|
textCharacterWidths_[33]=22.000000;
|
||||||
|
textCharacterWidths_[34]=20.000000;
|
||||||
|
textCharacterWidths_[35]=21.000000;
|
||||||
|
textCharacterWidths_[36]=21.000000;
|
||||||
|
textCharacterWidths_[37]=18.000000;
|
||||||
|
textCharacterWidths_[38]=18.000000;
|
||||||
|
textCharacterWidths_[39]=22.000000;
|
||||||
|
textCharacterWidths_[40]=23.000000;
|
||||||
|
textCharacterWidths_[41]=9.000000;
|
||||||
|
textCharacterWidths_[42]=18.000000;
|
||||||
|
textCharacterWidths_[43]=20.000000;
|
||||||
|
textCharacterWidths_[44]=17.000000;
|
||||||
|
textCharacterWidths_[45]=28.000000;
|
||||||
|
textCharacterWidths_[46]=23.000000;
|
||||||
|
textCharacterWidths_[47]=22.000000;
|
||||||
|
textCharacterWidths_[48]=21.000000;
|
||||||
|
textCharacterWidths_[49]=22.000000;
|
||||||
|
textCharacterWidths_[50]=20.000000;
|
||||||
|
textCharacterWidths_[51]=20.000000;
|
||||||
|
textCharacterWidths_[52]=20.000000;
|
||||||
|
textCharacterWidths_[53]=21.000000;
|
||||||
|
textCharacterWidths_[54]=21.000000;
|
||||||
|
textCharacterWidths_[55]=28.000000;
|
||||||
|
textCharacterWidths_[56]=20.000000;
|
||||||
|
textCharacterWidths_[57]=20.000000;
|
||||||
|
textCharacterWidths_[58]=19.000000;
|
||||||
|
textCharacterWidths_[59]=9.000000;
|
||||||
|
textCharacterWidths_[60]=14.000000;
|
||||||
|
textCharacterWidths_[61]=9.000000;
|
||||||
|
textCharacterWidths_[62]=14.000000;
|
||||||
|
textCharacterWidths_[63]=14.000000;
|
||||||
|
textCharacterWidths_[64]=11.000000;
|
||||||
|
textCharacterWidths_[65]=17.000000;
|
||||||
|
textCharacterWidths_[66]=18.000000;
|
||||||
|
textCharacterWidths_[67]=17.000000;
|
||||||
|
textCharacterWidths_[68]=18.000000;
|
||||||
|
textCharacterWidths_[69]=17.000000;
|
||||||
|
textCharacterWidths_[70]=11.000000;
|
||||||
|
textCharacterWidths_[71]=18.000000;
|
||||||
|
textCharacterWidths_[72]=18.000000;
|
||||||
|
textCharacterWidths_[73]=8.000000;
|
||||||
|
textCharacterWidths_[74]=8.000000;
|
||||||
|
textCharacterWidths_[75]=17.000000;
|
||||||
|
textCharacterWidths_[76]=8.000000;
|
||||||
|
textCharacterWidths_[77]=28.000000;
|
||||||
|
textCharacterWidths_[78]=18.000000;
|
||||||
|
textCharacterWidths_[79]=18.000000;
|
||||||
|
textCharacterWidths_[80]=18.000000;
|
||||||
|
textCharacterWidths_[81]=18.000000;
|
||||||
|
textCharacterWidths_[82]=12.000000;
|
||||||
|
textCharacterWidths_[83]=16.000000;
|
||||||
|
textCharacterWidths_[84]=11.000000;
|
||||||
|
textCharacterWidths_[85]=18.000000;
|
||||||
|
textCharacterWidths_[86]=16.000000;
|
||||||
|
textCharacterWidths_[87]=24.000000;
|
||||||
|
textCharacterWidths_[88]=16.000000;
|
||||||
|
textCharacterWidths_[89]=16.000000;
|
||||||
|
textCharacterWidths_[90]=16.000000;
|
||||||
|
textCharacterWidths_[91]=11.000000;
|
||||||
|
textCharacterWidths_[92]=8.000000;
|
||||||
|
textCharacterWidths_[93]=11.000000;
|
||||||
|
textCharacterWidths_[94]=21.000000;
|
||||||
|
textUVWidth_=0.062500;
|
||||||
|
textUVHeight_=0.082031;
|
||||||
|
textHeight_=42.000000;
|
||||||
|
|
||||||
|
textProgram_ = tango_gl::util::CreateProgram(kTextVertexShader.c_str(), kTextFragmentShader.c_str());
|
||||||
|
UASSERT(textProgram_ != 0);
|
||||||
|
|
||||||
|
glGenTextures(1, &textTextureId_);
|
||||||
|
UASSERT(textTextureId_);
|
||||||
|
|
||||||
|
// gen texture from image
|
||||||
|
glBindTexture(GL_TEXTURE_2D, textTextureId_);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
|
std::vector<char> data = uHex2Bytes(rtabmap::TEXT_ATLAS_PNG);
|
||||||
|
|
||||||
|
cv::Mat rgbImage = cv::imdecode(data, cv::IMREAD_UNCHANGED);
|
||||||
|
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, rgbImage.cols, rgbImage.rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbImage.data);
|
||||||
|
|
||||||
|
GLint error = glGetError();
|
||||||
|
UASSERT(error == GL_NO_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextDrawable::releaseShaderProgram()
|
||||||
|
{
|
||||||
|
if(textProgram_)
|
||||||
|
{
|
||||||
|
glDeleteShader(textProgram_);
|
||||||
|
textProgram_ = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextDrawable::TextDrawable(
|
||||||
|
const std::string & text,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
float textSize, // meters
|
||||||
|
const tango_gl::Color & color) :
|
||||||
|
poseGl_(glmFromTransform(pose)),
|
||||||
|
color_(color)
|
||||||
|
{
|
||||||
|
if(textProgram_ > 0)
|
||||||
|
{
|
||||||
|
vertexBuffer_ = std::vector<float>(text.size() * 12);
|
||||||
|
textureBuffer_ = std::vector<float>(text.size() * 8);
|
||||||
|
drawListBuffer_ = std::vector<unsigned short>(text.size() * 6);
|
||||||
|
|
||||||
|
int index_vecs = 0;
|
||||||
|
int index_indices = 0;
|
||||||
|
int index_uvs = 0;
|
||||||
|
float x=0.0f;
|
||||||
|
float y=0.0f;
|
||||||
|
float uniformscale = textSize/textHeight_;
|
||||||
|
for(unsigned int i=0; i<text.size(); ++i)
|
||||||
|
{
|
||||||
|
// get ascii value
|
||||||
|
char c = text[i];
|
||||||
|
int c_val = (int)c;
|
||||||
|
|
||||||
|
int indx = c_val-RI_TEXT_START;
|
||||||
|
|
||||||
|
if(indx<0 || indx>=textCharacterWidths_.size()) {
|
||||||
|
// unknown character, we will add a space for it to be save.
|
||||||
|
indx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int colCount = RI_TEXT_TEXTURE_SIZE/(int)RI_TEXT_HEIGHT_BASE;
|
||||||
|
|
||||||
|
// Calculate the uv parts
|
||||||
|
int row = indx / colCount;
|
||||||
|
int col = indx % colCount;
|
||||||
|
|
||||||
|
float v = row * textUVHeight_;
|
||||||
|
float v2 = v + textUVHeight_;
|
||||||
|
float u = col * textUVWidth_;
|
||||||
|
float u2 = u + textCharacterWidths_[indx]/(float)RI_TEXT_TEXTURE_SIZE;
|
||||||
|
|
||||||
|
// Creating the triangle information
|
||||||
|
std::vector<float> vec(12);
|
||||||
|
std::vector<float> uv(8);
|
||||||
|
|
||||||
|
vec[0] = x;
|
||||||
|
vec[1] = y + (textHeight_ * uniformscale);
|
||||||
|
vec[2] = 0;
|
||||||
|
vec[3] = x;
|
||||||
|
vec[4] = y;
|
||||||
|
vec[5] = 0;
|
||||||
|
vec[6] = x + (textCharacterWidths_[indx] * uniformscale);
|
||||||
|
vec[7] = y;
|
||||||
|
vec[8] = 0;
|
||||||
|
vec[9] = x + (textCharacterWidths_[indx] * uniformscale);
|
||||||
|
vec[10] = y + (textHeight_ * uniformscale);
|
||||||
|
vec[11] = 0;
|
||||||
|
|
||||||
|
// 0.001f = texture bleeding hack/fix
|
||||||
|
uv[0] = u+0.001f;
|
||||||
|
uv[1] = v+0.001f;
|
||||||
|
uv[2] = u+0.001f;
|
||||||
|
uv[3] = v2-0.001f;
|
||||||
|
uv[4] = u2-0.001f;
|
||||||
|
uv[5] = v2-0.001f;
|
||||||
|
uv[6] = u2-0.001f;
|
||||||
|
uv[7] = v+0.001f;
|
||||||
|
|
||||||
|
unsigned short inds[6] = {0, 1, 2, 0, 2, 3};
|
||||||
|
|
||||||
|
// We need a base value because the object has indices related to
|
||||||
|
// that object and not to this collection so basicly we need to
|
||||||
|
// translate the indices to align with the vertexlocation in ou
|
||||||
|
// vecs array of vectors.
|
||||||
|
short base = (short) (index_vecs / 3);
|
||||||
|
|
||||||
|
// We should add the vec, translating the indices to our saved vector
|
||||||
|
for(int i=0;i<vec.size();i++)
|
||||||
|
{
|
||||||
|
vertexBuffer_[index_vecs] = vec[i];
|
||||||
|
index_vecs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We should add the uvs
|
||||||
|
for(int i=0;i<uv.size();i++)
|
||||||
|
{
|
||||||
|
textureBuffer_[index_uvs] = uv[i];
|
||||||
|
index_uvs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We handle the indices
|
||||||
|
for(int j=0;j<6;j++)
|
||||||
|
{
|
||||||
|
drawListBuffer_[index_indices] = (unsigned short) (base + inds[j]);
|
||||||
|
index_indices++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate the new position
|
||||||
|
x += (textCharacterWidths_[indx] * uniformscale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextDrawable::Render(
|
||||||
|
const glm::mat4 & projectionMatrix,
|
||||||
|
const glm::mat4 & viewMatrix,
|
||||||
|
const glm::mat4 & viewMatrixRotInv) const
|
||||||
|
{
|
||||||
|
glUseProgram(textProgram_);
|
||||||
|
|
||||||
|
// get handle to vertex shader's vPosition member
|
||||||
|
int mPositionHandle = glGetAttribLocation(textProgram_, "vPosition");
|
||||||
|
|
||||||
|
// Enable a handle to the triangle vertices
|
||||||
|
glEnableVertexAttribArray(mPositionHandle);
|
||||||
|
|
||||||
|
// Prepare the background coordinate data
|
||||||
|
glVertexAttribPointer(mPositionHandle, 3, GL_FLOAT, false, 0, &vertexBuffer_[0]);
|
||||||
|
|
||||||
|
int mTexCoordLoc = glGetAttribLocation(textProgram_, "a_texCoord" );
|
||||||
|
|
||||||
|
// Prepare the texturecoordinates
|
||||||
|
glVertexAttribPointer ( mTexCoordLoc, 2, GL_FLOAT, false, 0, &textureBuffer_[0]);
|
||||||
|
|
||||||
|
glEnableVertexAttribArray ( mPositionHandle );
|
||||||
|
glEnableVertexAttribArray ( mTexCoordLoc );
|
||||||
|
|
||||||
|
// get handle to shape's transformation matrix
|
||||||
|
int mtrxhandle = glGetUniformLocation(textProgram_, "uMVPMatrix");
|
||||||
|
|
||||||
|
// Apply the projection and view transformation
|
||||||
|
//glUniformMatrix4fv(mtrxhandle, 1, false, m, 0);
|
||||||
|
glm::mat4 mvp_mat = projectionMatrix * viewMatrix * poseGl_ * viewMatrixRotInv;//glm::toMat4(gesture_camera_->GetParent()->GetRotation());
|
||||||
|
glUniformMatrix4fv(mtrxhandle, 1, GL_FALSE, glm::value_ptr(mvp_mat));
|
||||||
|
|
||||||
|
// get handle to color value
|
||||||
|
int colorhandle = glGetUniformLocation(textProgram_, "uColor");
|
||||||
|
glUniform3f(colorhandle, color_.r, color_.g, color_.b);
|
||||||
|
|
||||||
|
int mSamplerLoc = glGetUniformLocation (textProgram_, "s_texture" );
|
||||||
|
|
||||||
|
// Texture activate unit 0
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
// Bind the texture to this unit.
|
||||||
|
glBindTexture(GL_TEXTURE_2D, textTextureId_);
|
||||||
|
// Set the sampler texture unit to our selected id
|
||||||
|
glUniform1i ( mSamplerLoc, 0);
|
||||||
|
|
||||||
|
// Draw the triangle
|
||||||
|
glDrawElements(GL_TRIANGLES, drawListBuffer_.size(), GL_UNSIGNED_SHORT, &drawListBuffer_[0]);
|
||||||
|
|
||||||
|
// Disable vertex array
|
||||||
|
glDisableVertexAttribArray(mPositionHandle);
|
||||||
|
glDisableVertexAttribArray(mTexCoordLoc);
|
||||||
|
}
|
||||||
71
app/android/jni/text_drawable.h
Normal file
71
app/android/jni/text_drawable.h
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2025, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the Universite de Sherbrooke nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TANGO_TEXT_DRAWABLE_H_
|
||||||
|
#define TANGO_TEXT_DRAWABLE_H_
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <rtabmap/core/Transform.h>
|
||||||
|
#include <tango-gl/color.h>
|
||||||
|
|
||||||
|
// PointCloudDrawable is responsible for the point cloud rendering.
|
||||||
|
class TextDrawable {
|
||||||
|
private:
|
||||||
|
static GLuint textProgram_;
|
||||||
|
static GLuint textTextureId_;
|
||||||
|
static float textUVWidth_;
|
||||||
|
static float textUVHeight_;
|
||||||
|
static float textHeight_;
|
||||||
|
static std::vector<float> textCharacterWidths_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void createShaderProgram();
|
||||||
|
static void releaseShaderProgram();
|
||||||
|
|
||||||
|
public:
|
||||||
|
TextDrawable(
|
||||||
|
const std::string & text,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
float textSize = 0.1f, // meters
|
||||||
|
const tango_gl::Color & color = tango_gl::Color(1,0,0));
|
||||||
|
|
||||||
|
virtual ~TextDrawable() {}
|
||||||
|
|
||||||
|
void Render(
|
||||||
|
const glm::mat4 & projectionMatrix,
|
||||||
|
const glm::mat4 & viewMatrix,
|
||||||
|
const glm::mat4 & viewMatrixRotInv) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<float> vertexBuffer_;
|
||||||
|
std::vector<float> textureBuffer_;
|
||||||
|
std::vector<unsigned short> drawListBuffer_;
|
||||||
|
glm::mat4 poseGl_;
|
||||||
|
tango_gl::Color color_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // TANGO_POINT_CLOUD_POINT_CLOUD_DRAWABLE_H_
|
||||||
5
app/android/libs/.gitignore
vendored
5
app/android/libs/.gitignore
vendored
@@ -1 +1,4 @@
|
|||||||
*.jar
|
# Ignore everything in this directory
|
||||||
|
*
|
||||||
|
# Except this file
|
||||||
|
!.gitignore
|
||||||
@@ -103,17 +103,24 @@
|
|||||||
android:summary="@string/pref_summary_depth_from_motion"
|
android:summary="@string/pref_summary_depth_from_motion"
|
||||||
android:defaultValue="@string/pref_default_depth_from_motion"/>
|
android:defaultValue="@string/pref_default_depth_from_motion"/>
|
||||||
<ListPreference
|
<ListPreference
|
||||||
android:key="@string/pref_key_arcore_localization_filtering_speed"
|
android:key="@string/pref_key_arcore_relocalization_acc_thr"
|
||||||
android:title="@string/pref_title_arcore_localization_filtering_speed"
|
android:title="@string/pref_title_arcore_relocalization_acc_thr"
|
||||||
android:summary="@string/pref_summary_arcore_localization_filtering_speed"
|
android:summary="@string/pref_summary_arcore_relocalization_acc_thr"
|
||||||
android:entries="@array/pref_arcore_localization_filtering_speed_keys"
|
android:entries="@array/pref_arcore_relocalization_acc_thr_keys"
|
||||||
android:entryValues="@array/pref_arcore_localization_filtering_speed_values"
|
android:entryValues="@array/pref_arcore_relocalization_acc_thr_values"
|
||||||
android:defaultValue="@string/pref_default_arcore_localization_filtering_speed"/>
|
android:defaultValue="@string/pref_default_arcore_relocalization_acc_thr"/>
|
||||||
<com.introlab.rtabmap.CustomSwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_smoothing"
|
android:key="@string/pref_key_smoothing"
|
||||||
android:title="@string/pref_title_smoothing"
|
android:title="@string/pref_title_smoothing"
|
||||||
android:summary="@string/pref_summary_smoothing"
|
android:summary="@string/pref_summary_smoothing"
|
||||||
android:defaultValue="@string/pref_default_smoothing"/>
|
android:defaultValue="@string/pref_default_smoothing"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_depth_bleeding_error"
|
||||||
|
android:title="@string/pref_title_depth_bleeding_error"
|
||||||
|
android:summary="@string/pref_summary_depth_bleeding_error"
|
||||||
|
android:entries="@array/pref_depth_bleeding_error_keys"
|
||||||
|
android:entryValues="@array/pref_depth_bleeding_error_values"
|
||||||
|
android:defaultValue="@string/pref_default_depth_bleeding_error"/>
|
||||||
<com.introlab.rtabmap.CustomSwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_fisheye"
|
android:key="@string/pref_key_fisheye"
|
||||||
android:title="@string/pref_title_fisheye"
|
android:title="@string/pref_title_fisheye"
|
||||||
|
|||||||
@@ -76,6 +76,8 @@
|
|||||||
<string name="pref_default_resolution">false</string>
|
<string name="pref_default_resolution">false</string>
|
||||||
<string name="pref_key_smoothing">pref_key_smoothing</string>
|
<string name="pref_key_smoothing">pref_key_smoothing</string>
|
||||||
<string name="pref_default_smoothing">false</string>
|
<string name="pref_default_smoothing">false</string>
|
||||||
|
<string name="pref_key_depth_bleeding_error">pref_key_depth_bleeding_error</string>
|
||||||
|
<string name="pref_default_depth_bleeding_error">0.0</string>
|
||||||
<string name="pref_key_fisheye">pref_key_fisheye</string>
|
<string name="pref_key_fisheye">pref_key_fisheye</string>
|
||||||
<string name="pref_default_fisheye">false</string>
|
<string name="pref_default_fisheye">false</string>
|
||||||
|
|
||||||
@@ -83,8 +85,8 @@
|
|||||||
<string name="pref_default_camera_driver">-1</string>
|
<string name="pref_default_camera_driver">-1</string>
|
||||||
<string name="pref_key_depth_from_motion">pref_key_depth_from_motion</string>
|
<string name="pref_key_depth_from_motion">pref_key_depth_from_motion</string>
|
||||||
<string name="pref_default_depth_from_motion">false</string>
|
<string name="pref_default_depth_from_motion">false</string>
|
||||||
<string name="pref_key_arcore_localization_filtering_speed">pref_key_arcore_localization_filtering_speed</string>
|
<string name="pref_key_arcore_relocalization_acc_thr">pref_key_arcore_relocalization_acc_thr</string>
|
||||||
<string name="pref_default_arcore_localization_filtering_speed">1</string>
|
<string name="pref_default_arcore_relocalization_acc_thr">58.8399</string>
|
||||||
<string name="pref_key_update_rate">pref_key_update_rate</string>
|
<string name="pref_key_update_rate">pref_key_update_rate</string>
|
||||||
<string name="pref_default_update_rate">1</string>
|
<string name="pref_default_update_rate">1</string>
|
||||||
<string name="pref_key_max_speed">pref_key_max_speed</string>
|
<string name="pref_key_max_speed">pref_key_max_speed</string>
|
||||||
@@ -100,7 +102,7 @@
|
|||||||
<string name="pref_key_min_inliers">pref_key_min_inliers</string>
|
<string name="pref_key_min_inliers">pref_key_min_inliers</string>
|
||||||
<string name="pref_default_min_inliers">25</string>
|
<string name="pref_default_min_inliers">25</string>
|
||||||
<string name="pref_key_opt_error">pref_key_opt_error</string>
|
<string name="pref_key_opt_error">pref_key_opt_error</string>
|
||||||
<string name="pref_default_opt_error">1</string>
|
<string name="pref_default_opt_error">2</string>
|
||||||
<string name="pref_key_features_voc">pref_key_features_voc</string>
|
<string name="pref_key_features_voc">pref_key_features_voc</string>
|
||||||
<string name="pref_default_features_voc">200</string>
|
<string name="pref_default_features_voc">200</string>
|
||||||
<string name="pref_key_features">pref_key_features</string>
|
<string name="pref_key_features">pref_key_features</string>
|
||||||
@@ -329,14 +331,16 @@
|
|||||||
<string name="pref_summary_camera_driver">AR sdk used for capturing 6DoF poses and images. A TOF camera is required to record a 3D model.</string>
|
<string name="pref_summary_camera_driver">AR sdk used for capturing 6DoF poses and images. A TOF camera is required to record a 3D model.</string>
|
||||||
<string name="pref_title_depth_from_motion">Depth From Motion</string>
|
<string name="pref_title_depth_from_motion">Depth From Motion</string>
|
||||||
<string name="pref_summary_depth_from_motion">Use ARCore\'s depth API to compute depth image from motion. If the phone has a TOF camera and is supported by ARCore, results should be better. Currently supported only with ARCore NDK driver.</string>
|
<string name="pref_summary_depth_from_motion">Use ARCore\'s depth API to compute depth image from motion. If the phone has a TOF camera and is supported by ARCore, results should be better. Currently supported only with ARCore NDK driver.</string>
|
||||||
<string name="pref_title_arcore_localization_filtering_speed">ARCore Localization Filtering Speed</string>
|
<string name="pref_title_arcore_relocalization_acc_thr">ARCore Re-Localization Acceleration Threshold</string>
|
||||||
<string name="pref_summary_arcore_localization_filtering_speed">Filter ARCore\'s localizations to avoid jumps in odometry when creating a map with RTAB-Map, which would cause large drift errors that are difficult to correct. Set a speed threshold to detect those events.</string>
|
<string name="pref_summary_arcore_relocalization_acc_thr">Filter ARCore\'s re-localizations to avoid jumps in odometry when creating a map with RTAB-Map, which would cause large drift errors that are difficult to correct. Set an acceleration threshold to detect those events.</string>
|
||||||
<string name="pref_title_append">Append Mode</string>
|
<string name="pref_title_append">Append Mode</string>
|
||||||
<string name="pref_summary_append">When resuming mapping, wait for a relocalization on the current map before starting a new map.</string>
|
<string name="pref_summary_append">When resuming mapping, wait for a relocalization on the current map before starting a new map.</string>
|
||||||
<string name="pref_title_resolution">HD Mode</string>
|
<string name="pref_title_resolution">HD Mode</string>
|
||||||
<string name="pref_summary_resolution">Save HD images of the color camera if you want very detailed textures. More memory will be required.</string>
|
<string name="pref_summary_resolution">Save HD images of the color camera if you want very detailed textures. More memory will be required.</string>
|
||||||
<string name="pref_title_smoothing">Smoothing</string>
|
<string name="pref_title_smoothing">Smoothing</string>
|
||||||
<string name="pref_summary_smoothing">Smooth the point clouds.</string>
|
<string name="pref_summary_smoothing">Smooth the point clouds.</string>
|
||||||
|
<string name="pref_title_depth_bleeding_error">Depth Bleeding Filtering Error</string>
|
||||||
|
<string name="pref_summary_depth_bleeding_error">Filter noisy depth points on the edges.</string>
|
||||||
<string name="pref_title_fisheye">Fish Eye Camera</string>
|
<string name="pref_title_fisheye">Fish Eye Camera</string>
|
||||||
<string name="pref_summary_fisheye">Use fish eye camera instead of the color camera. May not work on some devices.</string>
|
<string name="pref_summary_fisheye">Use fish eye camera instead of the color camera. May not work on some devices.</string>
|
||||||
<string name="pref_title_update_rate">Update Rate</string>
|
<string name="pref_title_update_rate">Update Rate</string>
|
||||||
@@ -412,23 +416,49 @@
|
|||||||
<item>"1"</item>
|
<item>"1"</item>
|
||||||
<item>"0.5"</item>
|
<item>"0.5"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="pref_arcore_localization_filtering_speed_keys">
|
<string-array name="pref_arcore_relocalization_acc_thr_keys">
|
||||||
<item>"Disabled"</item>
|
<item>"Disabled"</item>
|
||||||
<item>"5 m/s"</item>
|
<item>"10 g"</item>
|
||||||
<item>"4 m/s"</item>
|
<item>"9 g"</item>
|
||||||
<item>"3 m/s"</item>
|
<item>"8 g"</item>
|
||||||
<item>"2 m/s"</item>
|
<item>"7 g"</item>
|
||||||
<item>"1 m/s"</item>
|
<item>"6 g"</item>
|
||||||
<item>"0.5 m/s"</item>
|
<item>"5 g"</item>
|
||||||
|
<item>"4 g"</item>
|
||||||
|
<item>"3 g"</item>
|
||||||
|
<item>"2 g"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="pref_arcore_localization_filtering_speed_values">
|
<string-array name="pref_arcore_relocalization_acc_thr_values">
|
||||||
<item>"0"</item>
|
<item>"0"</item>
|
||||||
<item>"5"</item>
|
<item>"98.0665"</item>
|
||||||
<item>"4"</item>
|
<item>"88.25985"</item>
|
||||||
<item>"3"</item>
|
<item>"78.4532"</item>
|
||||||
<item>"2"</item>
|
<item>"68.64655"</item>
|
||||||
<item>"1"</item>
|
<item>"58.8399"</item>
|
||||||
<item>"0.5"</item>
|
<item>"49.03325"</item>
|
||||||
|
<item>"39.2266"</item>
|
||||||
|
<item>"29.41995"</item>
|
||||||
|
<item>"19.6133"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_depth_bleeding_error_keys">
|
||||||
|
<item>"Disabled"</item>
|
||||||
|
<item>"2.5 cm"</item>
|
||||||
|
<item>"5 cm"</item>
|
||||||
|
<item>"10 cm"</item>
|
||||||
|
<item>"15 cm"</item>
|
||||||
|
<item>"20 cm"</item>
|
||||||
|
<item>"25 cm"</item>
|
||||||
|
<item>"30 cm"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_depth_bleeding_error_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"0.025"</item>
|
||||||
|
<item>"0.05"</item>
|
||||||
|
<item>"0.10"</item>
|
||||||
|
<item>"0.15"</item>
|
||||||
|
<item>"0.20"</item>
|
||||||
|
<item>"0.25"</item>
|
||||||
|
<item>"0.30"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="pref_max_speed_keys">
|
<string-array name="pref_max_speed_keys">
|
||||||
<item>"No Limit"</item>
|
<item>"No Limit"</item>
|
||||||
|
|||||||
@@ -56,9 +56,8 @@ public class ARCoreSharedCamera {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private static RTABMapActivity mActivity;
|
private static RTABMapActivity mActivity;
|
||||||
public ARCoreSharedCamera(RTABMapActivity c, float arCoreLocalizationFilteringSpeed) {
|
public ARCoreSharedCamera(RTABMapActivity c) {
|
||||||
mActivity = c;
|
mActivity = c;
|
||||||
mARCoreLocalizationFilteringSpeed = arCoreLocalizationFilteringSpeed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Depth TOF Image.
|
// Depth TOF Image.
|
||||||
@@ -72,11 +71,7 @@ public class ARCoreSharedCamera {
|
|||||||
// ARCore session that supports camera sharing.
|
// ARCore session that supports camera sharing.
|
||||||
private Session sharedSession;
|
private Session sharedSession;
|
||||||
|
|
||||||
private Pose previousAnchorPose = null;
|
|
||||||
private long previousAnchorTimeStamp;
|
|
||||||
private Pose arCoreCorrection = Pose.IDENTITY;
|
|
||||||
private Pose odomPose = Pose.IDENTITY;
|
private Pose odomPose = Pose.IDENTITY;
|
||||||
private float mARCoreLocalizationFilteringSpeed = 1.0f;
|
|
||||||
|
|
||||||
// Camera capture session. Used by both non-AR and AR modes.
|
// Camera capture session. Used by both non-AR and AR modes.
|
||||||
private CameraCaptureSession captureSession;
|
private CameraCaptureSession captureSession;
|
||||||
@@ -111,11 +106,17 @@ public class ARCoreSharedCamera {
|
|||||||
private CaptureRequest.Builder previewCaptureRequestBuilder;
|
private CaptureRequest.Builder previewCaptureRequestBuilder;
|
||||||
|
|
||||||
private int cameraTextureId = -1;
|
private int cameraTextureId = -1;
|
||||||
|
private boolean firstFrameReceived = false;
|
||||||
|
|
||||||
// Image reader that continuously processes CPU images.
|
// Image reader that continuously processes CPU images.
|
||||||
public TOF_ImageReader mTOFImageReader = new TOF_ImageReader();
|
public TOF_ImageReader mTOFImageReader = new TOF_ImageReader();
|
||||||
private boolean mTOFAvailable = false;
|
private boolean mTOFAvailable = false;
|
||||||
|
|
||||||
|
ByteBuffer mPreviousDepth = null;
|
||||||
|
double mPreviousDepthStamp = 0.0;
|
||||||
|
ByteBuffer mPreviousDepth2 = null;
|
||||||
|
double mPreviousDepthStamp2 = 0.0;
|
||||||
|
|
||||||
public boolean isDepthSupported() {return mTOFAvailable;}
|
public boolean isDepthSupported() {return mTOFAvailable;}
|
||||||
|
|
||||||
public void setToast(Toast toast)
|
public void setToast(Toast toast)
|
||||||
@@ -630,6 +631,7 @@ public class ARCoreSharedCamera {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mTOFImageReader.close();
|
mTOFImageReader.close();
|
||||||
|
firstFrameReceived = false;
|
||||||
|
|
||||||
if(cameraTextureId>=0)
|
if(cameraTextureId>=0)
|
||||||
{
|
{
|
||||||
@@ -678,14 +680,15 @@ public class ARCoreSharedCamera {
|
|||||||
Log.e(TAG, String.format("camera is null!"));
|
Log.e(TAG, String.format("camera is null!"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
boolean lost = false;
|
||||||
if (camera.getTrackingState() != TrackingState.TRACKING) {
|
if (camera.getTrackingState() != TrackingState.TRACKING) {
|
||||||
final String trackingState = camera.getTrackingState().toString();
|
final String trackingState = camera.getTrackingState().toString();
|
||||||
Log.e(TAG, String.format("Tracking lost! state=%s", trackingState));
|
Log.e(TAG, String.format("Tracking lost! state=%s", trackingState));
|
||||||
// This will force a new session on the next frame received
|
// This will force a new session on the next frame received
|
||||||
RTABMapLib.postCameraPoseEvent(RTABMapActivity.nativeApplication, 0,0,0,0,0,0,0,0);
|
lost = true;
|
||||||
mActivity.runOnUiThread(new Runnable() {
|
mActivity.runOnUiThread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
if(mToast!=null && previousAnchorPose != null)
|
if(mToast!=null && firstFrameReceived)
|
||||||
{
|
{
|
||||||
String msg = "Tracking lost! If you are mapping, you will need to relocalize before continuing.";
|
String msg = "Tracking lost! If you are mapping, you will need to relocalize before continuing.";
|
||||||
if(mToast.getView() == null || !mToast.getView().isShown())
|
if(mToast.getView() == null || !mToast.getView().isShown())
|
||||||
@@ -697,67 +700,14 @@ public class ARCoreSharedCamera {
|
|||||||
{
|
{
|
||||||
mToast.setText(msg);
|
mToast.setText(msg);
|
||||||
}
|
}
|
||||||
previousAnchorPose = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frame.getTimestamp() != 0) {
|
if (frame.getTimestamp() != 0) {
|
||||||
Pose pose = camera.getPose();
|
Pose pose = camera.getPose();
|
||||||
|
|
||||||
// Remove ARCore SLAM corrections by integrating pose from previous frame anchor
|
|
||||||
if(previousAnchorPose == null || mARCoreLocalizationFilteringSpeed==0)
|
|
||||||
{
|
|
||||||
odomPose = pose;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
float[] t = previousAnchorPose.inverse().compose(pose).getTranslation();
|
|
||||||
final double speed = Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2])/((double)(frame.getTimestamp()-previousAnchorTimeStamp)/10e8);
|
|
||||||
if(speed>=mARCoreLocalizationFilteringSpeed)
|
|
||||||
{
|
|
||||||
arCoreCorrection = arCoreCorrection.compose(previousAnchorPose).compose(pose.inverse());
|
|
||||||
t = arCoreCorrection.getTranslation();
|
|
||||||
Log.e(TAG, String.format("POTENTIAL TELEPORTATION!!!!!!!!!!!!!! previous anchor moved (speed=%f), new arcorrection: %f %f %f", speed, t[0], t[1], t[2]));
|
|
||||||
|
|
||||||
t = odomPose.getTranslation();
|
|
||||||
float[] t2 = (arCoreCorrection.compose(pose)).getTranslation();
|
|
||||||
float[] t3 = previousAnchorPose.getTranslation();
|
|
||||||
float[] t4 = pose.getTranslation();
|
|
||||||
Log.e(TAG, String.format("Odom = %f %f %f -> %f %f %f ArCore= %f %f %f -> %f %f %f", t[0], t[1], t[2], t2[0], t2[1], t2[2], t3[0], t3[1], t3[2], t4[0], t4[1], t4[2]));
|
|
||||||
|
|
||||||
mActivity.runOnUiThread(new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
if(mToast!=null)
|
|
||||||
{
|
|
||||||
String msg = String.format("ARCore localization has been suppressed "
|
|
||||||
+ "because of high speed detected (%f m/s) causing a jump! You can change "
|
|
||||||
+ "ARCore localization filtering speed in Settings->Mapping if you are "
|
|
||||||
+ "indeed moving as fast.", speed);
|
|
||||||
if(mToast.getView() == null || !mToast.getView().isShown())
|
|
||||||
{
|
|
||||||
mToast.makeText(mActivity.getApplicationContext(), msg, Toast.LENGTH_LONG).show();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mToast.setText(msg);
|
|
||||||
}
|
|
||||||
previousAnchorPose = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
odomPose = arCoreCorrection.compose(pose);
|
|
||||||
}
|
|
||||||
previousAnchorPose = pose;
|
|
||||||
previousAnchorTimeStamp = frame.getTimestamp();
|
|
||||||
|
|
||||||
double stamp = (double)frame.getTimestamp()/10e8;
|
double stamp = (double)frame.getTimestamp()/10e8;
|
||||||
if(!RTABMapActivity.DISABLE_LOG) Log.d(TAG, String.format("pose=%f %f %f q=%f %f %f %f stamp=%f", odomPose.tx(), odomPose.ty(), odomPose.tz(), odomPose.qx(), odomPose.qy(), odomPose.qz(), odomPose.qw(), stamp));
|
|
||||||
RTABMapLib.postCameraPoseEvent(RTABMapActivity.nativeApplication, odomPose.tx(), odomPose.ty(), odomPose.tz(), odomPose.qx(), odomPose.qy(), odomPose.qz(), odomPose.qw(), stamp);
|
|
||||||
|
|
||||||
CameraIntrinsics intrinsics = camera.getImageIntrinsics();
|
CameraIntrinsics intrinsics = camera.getImageIntrinsics();
|
||||||
try{
|
try{
|
||||||
Image image = frame.acquireCameraImage();
|
Image image = frame.acquireCameraImage();
|
||||||
@@ -800,7 +750,7 @@ public class ARCoreSharedCamera {
|
|||||||
camera.getProjectionMatrix(p, 0, 0.1f, 100.0f);
|
camera.getProjectionMatrix(p, 0, 0.1f, 100.0f);
|
||||||
|
|
||||||
float[] viewMatrix = new float[16];
|
float[] viewMatrix = new float[16];
|
||||||
arCoreCorrection.compose(camera.getDisplayOrientedPose()).inverse().toMatrix(viewMatrix, 0);
|
camera.getDisplayOrientedPose().inverse().toMatrix(viewMatrix, 0);
|
||||||
float[] quat = new float[4];
|
float[] quat = new float[4];
|
||||||
rotationMatrixToQuaternion(viewMatrix, quat);
|
rotationMatrixToQuaternion(viewMatrix, quat);
|
||||||
|
|
||||||
@@ -814,30 +764,52 @@ public class ARCoreSharedCamera {
|
|||||||
depthStamp = (double)mTOFImageReader.timestamp/10e8;
|
depthStamp = (double)mTOFImageReader.timestamp/10e8;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!RTABMapActivity.DISABLE_LOG) Log.d(TAG, String.format("Depth %dx%d len=%dbytes format=%d stamp=%f",
|
if(mPreviousDepth == null)
|
||||||
mTOFImageReader.WIDTH, mTOFImageReader.HEIGHT, depth.limit(), ImageFormat.DEPTH16, depthStamp));
|
{
|
||||||
|
mPreviousDepth = depth;
|
||||||
|
mPreviousDepthStamp = depthStamp;
|
||||||
|
}
|
||||||
|
if(mPreviousDepth2 == null)
|
||||||
|
{
|
||||||
|
mPreviousDepth2 = depth;
|
||||||
|
mPreviousDepthStamp2 = depthStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!RTABMapActivity.DISABLE_LOG) Log.d(TAG, String.format("Depth %dx%d len=%dbytes format=%d stamp=%f previous=%f rgb=%f",
|
||||||
|
mTOFImageReader.WIDTH, mTOFImageReader.HEIGHT, depth.limit(), ImageFormat.DEPTH16, depthStamp, mPreviousDepthStamp, stamp));
|
||||||
|
|
||||||
RTABMapLib.postOdometryEventDepth(
|
RTABMapLib.postOdometryEventDepth(
|
||||||
RTABMapActivity.nativeApplication,
|
RTABMapActivity.nativeApplication,
|
||||||
odomPose.tx(), odomPose.ty(), odomPose.tz(), odomPose.qx(), odomPose.qy(), odomPose.qz(), odomPose.qw(),
|
lost?0:pose.tx(), lost?0:pose.ty(), lost?0:pose.tz(), lost?0:pose.qx(), lost?0:pose.qy(), lost?0:pose.qz(), lost?0:pose.qw(),
|
||||||
fl[0], fl[1], pp[0], pp[1],
|
fl[0], fl[1], pp[0], pp[1],
|
||||||
depthIntrinsics[0], depthIntrinsics[1], depthIntrinsics[2], depthIntrinsics[3],
|
depthIntrinsics[0], depthIntrinsics[1], depthIntrinsics[2], depthIntrinsics[3],
|
||||||
rgbExtrinsics.tx(), rgbExtrinsics.ty(), rgbExtrinsics.tz(), rgbExtrinsics.qx(), rgbExtrinsics.qy(), rgbExtrinsics.qz(), rgbExtrinsics.qw(),
|
rgbExtrinsics.tx(), rgbExtrinsics.ty(), rgbExtrinsics.tz(), rgbExtrinsics.qx(), rgbExtrinsics.qy(), rgbExtrinsics.qz(), rgbExtrinsics.qw(),
|
||||||
depthExtrinsics.tx(), depthExtrinsics.ty(), depthExtrinsics.tz(), depthExtrinsics.qx(), depthExtrinsics.qy(), depthExtrinsics.qz(), depthExtrinsics.qw(),
|
depthExtrinsics.tx(), depthExtrinsics.ty(), depthExtrinsics.tz(), depthExtrinsics.qx(), depthExtrinsics.qy(), depthExtrinsics.qz(), depthExtrinsics.qw(),
|
||||||
stamp,
|
stamp,
|
||||||
depthStamp,
|
depthStamp<=stamp?depthStamp:mPreviousDepthStamp<=stamp?mPreviousDepthStamp:mPreviousDepthStamp2,
|
||||||
y, u, v, y.limit(), image.getWidth(), image.getHeight(), image.getFormat(),
|
y, u, v, y.limit(), image.getWidth(), image.getHeight(), image.getFormat(),
|
||||||
depth, depth.limit(), mTOFImageReader.WIDTH, mTOFImageReader.HEIGHT, ImageFormat.DEPTH16,
|
depthStamp<=stamp?depth:mPreviousDepthStamp<=stamp?mPreviousDepth:mPreviousDepth2,
|
||||||
|
depthStamp<=stamp?depth.limit():mPreviousDepthStamp<=stamp?mPreviousDepth.limit():mPreviousDepth2.limit(),
|
||||||
|
mTOFImageReader.WIDTH, mTOFImageReader.HEIGHT, ImageFormat.DEPTH16,
|
||||||
points, points.limit()/4,
|
points, points.limit()/4,
|
||||||
viewMatrix[12], viewMatrix[13], viewMatrix[14], quat[1], quat[2], quat[3], quat[0],
|
viewMatrix[12], viewMatrix[13], viewMatrix[14], quat[1], quat[2], quat[3], quat[0],
|
||||||
p[0], p[5], p[8], p[9], p[10], p[11], p[14],
|
p[0], p[5], p[8], p[9], p[10], p[11], p[14],
|
||||||
texCoord[0],texCoord[1],texCoord[2],texCoord[3],texCoord[4],texCoord[5],texCoord[6],texCoord[7]);
|
texCoord[0],texCoord[1],texCoord[2],texCoord[3],texCoord[4],texCoord[5],texCoord[6],texCoord[7]);
|
||||||
|
|
||||||
|
// triple buffer in case delay of rgb frame is > 60 ms
|
||||||
|
if(depthStamp != mPreviousDepthStamp)
|
||||||
|
{
|
||||||
|
mPreviousDepthStamp2 = mPreviousDepthStamp;
|
||||||
|
mPreviousDepth2 = mPreviousDepth;
|
||||||
|
mPreviousDepthStamp = depthStamp;
|
||||||
|
mPreviousDepth = depth;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RTABMapLib.postOdometryEvent(
|
RTABMapLib.postOdometryEvent(
|
||||||
RTABMapActivity.nativeApplication,
|
RTABMapActivity.nativeApplication,
|
||||||
odomPose.tx(), odomPose.ty(), odomPose.tz(), odomPose.qx(), odomPose.qy(), odomPose.qz(), odomPose.qw(),
|
lost?0:pose.tx(), lost?0:pose.ty(), lost?0:pose.tz(), lost?0:pose.qx(), lost?0:pose.qy(), lost?0:pose.qz(), lost?0:pose.qw(),
|
||||||
fl[0], fl[1], pp[0], pp[1],
|
fl[0], fl[1], pp[0], pp[1],
|
||||||
rgbExtrinsics.tx(), rgbExtrinsics.ty(), rgbExtrinsics.tz(), rgbExtrinsics.qx(), rgbExtrinsics.qy(), rgbExtrinsics.qz(), rgbExtrinsics.qw(),
|
rgbExtrinsics.tx(), rgbExtrinsics.ty(), rgbExtrinsics.tz(), rgbExtrinsics.qx(), rgbExtrinsics.qy(), rgbExtrinsics.qz(), rgbExtrinsics.qw(),
|
||||||
stamp,
|
stamp,
|
||||||
@@ -848,6 +820,7 @@ public class ARCoreSharedCamera {
|
|||||||
texCoord[0],texCoord[1],texCoord[2],texCoord[3],texCoord[4],texCoord[5],texCoord[6],texCoord[7]);
|
texCoord[0],texCoord[1],texCoord[2],texCoord[3],texCoord[4],texCoord[5],texCoord[6],texCoord[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
firstFrameReceived = !lost;
|
||||||
image.close();
|
image.close();
|
||||||
cloud.close();
|
cloud.close();
|
||||||
|
|
||||||
|
|||||||
@@ -323,6 +323,7 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
// touch point.
|
// touch point.
|
||||||
Display display = getWindowManager().getDefaultDisplay();
|
Display display = getWindowManager().getDefaultDisplay();
|
||||||
display.getSize(mScreenSize);
|
display.getSize(mScreenSize);
|
||||||
|
Log.i(TAG, String.format("Screen resolution: %dx%d", mScreenSize.x, mScreenSize.y));
|
||||||
|
|
||||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
||||||
@@ -1139,9 +1140,11 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
RTABMapLib.setRawScanSaved(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_raw_scan_saved), Boolean.parseBoolean(getString(R.string.pref_default_raw_scan_saved))));
|
RTABMapLib.setRawScanSaved(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_raw_scan_saved), Boolean.parseBoolean(getString(R.string.pref_default_raw_scan_saved))));
|
||||||
RTABMapLib.setFullResolution(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_resolution), Boolean.parseBoolean(getString(R.string.pref_default_resolution))));
|
RTABMapLib.setFullResolution(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_resolution), Boolean.parseBoolean(getString(R.string.pref_default_resolution))));
|
||||||
RTABMapLib.setSmoothing(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_smoothing), Boolean.parseBoolean(getString(R.string.pref_default_smoothing))));
|
RTABMapLib.setSmoothing(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_smoothing), Boolean.parseBoolean(getString(R.string.pref_default_smoothing))));
|
||||||
|
RTABMapLib.setDepthBleedingError(nativeApplication, Float.parseFloat(sharedPref.getString(getString(R.string.pref_key_depth_bleeding_error), getString(R.string.pref_default_depth_bleeding_error))));
|
||||||
RTABMapLib.setDepthFromMotion(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_depth_from_motion), Boolean.parseBoolean(getString(R.string.pref_default_depth_from_motion))));
|
RTABMapLib.setDepthFromMotion(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_depth_from_motion), Boolean.parseBoolean(getString(R.string.pref_default_depth_from_motion))));
|
||||||
RTABMapLib.setCameraColor(nativeApplication, !sharedPref.getBoolean(getString(R.string.pref_key_fisheye), Boolean.parseBoolean(getString(R.string.pref_default_fisheye))));
|
RTABMapLib.setCameraColor(nativeApplication, !sharedPref.getBoolean(getString(R.string.pref_key_fisheye), Boolean.parseBoolean(getString(R.string.pref_default_fisheye))));
|
||||||
RTABMapLib.setAppendMode(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_append), Boolean.parseBoolean(getString(R.string.pref_default_append))));
|
RTABMapLib.setAppendMode(nativeApplication, sharedPref.getBoolean(getString(R.string.pref_key_append), Boolean.parseBoolean(getString(R.string.pref_default_append))));
|
||||||
|
RTABMapLib.setUpstreamRelocalizationAccThr(nativeApplication, Float.parseFloat(sharedPref.getString(getString(R.string.pref_key_arcore_relocalization_acc_thr), getString(R.string.pref_default_arcore_relocalization_acc_thr))));
|
||||||
RTABMapLib.setMappingParameter(nativeApplication, "Rtabmap/DetectionRate", mUpdateRate);
|
RTABMapLib.setMappingParameter(nativeApplication, "Rtabmap/DetectionRate", mUpdateRate);
|
||||||
RTABMapLib.setMappingParameter(nativeApplication, "Rtabmap/TimeThr", mTimeThr);
|
RTABMapLib.setMappingParameter(nativeApplication, "Rtabmap/TimeThr", mTimeThr);
|
||||||
RTABMapLib.setMappingParameter(nativeApplication, "Rtabmap/MemoryThr", memThr);
|
RTABMapLib.setMappingParameter(nativeApplication, "Rtabmap/MemoryThr", memThr);
|
||||||
@@ -1383,9 +1386,7 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
if(cameraStartSucess && mCameraDriver == 3)
|
if(cameraStartSucess && mCameraDriver == 3)
|
||||||
{
|
{
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
|
mArCoreCamera = new ARCoreSharedCamera(getActivity());
|
||||||
String arCoreLocalizationFiltering = sharedPref.getString(getString(R.string.pref_key_arcore_localization_filtering_speed), getString(R.string.pref_default_arcore_localization_filtering_speed));
|
|
||||||
mArCoreCamera = new ARCoreSharedCamera(getActivity(), Float.parseFloat(arCoreLocalizationFiltering));
|
|
||||||
mArCoreCamera.setToast(mToast);
|
mArCoreCamera.setToast(mToast);
|
||||||
mProgressDialog.setTitle("");
|
mProgressDialog.setTitle("");
|
||||||
mProgressDialog.setMessage(message);
|
mProgressDialog.setMessage(message);
|
||||||
@@ -1775,16 +1776,19 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
long currentTime = System.currentTimeMillis()/1000;
|
long currentTime = System.currentTimeMillis()/1000;
|
||||||
if(loopClosureId > 0)
|
if(loopClosureId > 0)
|
||||||
{
|
{
|
||||||
|
if (mToast != null) mToast.cancel();
|
||||||
mToast.setText(String.format("Loop closure detected! (%d/%d inliers)", inliers, matches));
|
mToast.setText(String.format("Loop closure detected! (%d/%d inliers)", inliers, matches));
|
||||||
mToast.show();
|
mToast.show();
|
||||||
}
|
}
|
||||||
else if(landmarkDetected != 0)
|
else if(landmarkDetected != 0)
|
||||||
{
|
{
|
||||||
|
if (mToast != null) mToast.cancel();
|
||||||
mToast.setText(String.format("Marker %d detected!", landmarkDetected));
|
mToast.setText(String.format("Marker %d detected!", landmarkDetected));
|
||||||
mToast.show();
|
mToast.show();
|
||||||
}
|
}
|
||||||
else if(rejected > 0)
|
else if(rejected > 0)
|
||||||
{
|
{
|
||||||
|
if (mToast != null) mToast.cancel();
|
||||||
if(inliers >= Integer.parseInt(mMinInliers))
|
if(inliers >= Integer.parseInt(mMinInliers))
|
||||||
{
|
{
|
||||||
if(optimizationMaxError > 0.0f)
|
if(optimizationMaxError > 0.0f)
|
||||||
@@ -1806,6 +1810,7 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
{
|
{
|
||||||
if(currentTime - mLastFastMovementNotificationStamp > 3)
|
if(currentTime - mLastFastMovementNotificationStamp > 3)
|
||||||
{
|
{
|
||||||
|
if (mToast != null) mToast.cancel();
|
||||||
mToast.setText("Move slower... blurry images are not added to map (\"Settings->Mapping...->Maximum Motion Speed\" is enabled).");
|
mToast.setText("Move slower... blurry images are not added to map (\"Settings->Mapping...->Maximum Motion Speed\" is enabled).");
|
||||||
mToast.show();
|
mToast.show();
|
||||||
}
|
}
|
||||||
@@ -2057,7 +2062,14 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
* "Unknown"
|
* "Unknown"
|
||||||
*/
|
*/
|
||||||
String str = null;
|
String str = null;
|
||||||
if(key.equals("TangoServiceException"))
|
if(key.equals("UpstreamRelocationFiltered"))
|
||||||
|
{
|
||||||
|
if(mItemDebugVisibility != null && mItemDebugVisibility.isChecked()) {
|
||||||
|
str = String.format("%s re-localization filtered because an acceleration of %s has been detected, which is over current threshold set in the settings.",
|
||||||
|
mCameraDriver == 2?"AREngine":"ARCore", value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(key.equals("TangoServiceException"))
|
||||||
str = String.format("Tango service exception: %s", value);
|
str = String.format("Tango service exception: %s", value);
|
||||||
else if(key.equals("FisheyeOverExposed"))
|
else if(key.equals("FisheyeOverExposed"))
|
||||||
;//str = String.format("The fisheye image is over exposed with average pixel value %s px.", value);
|
;//str = String.format("The fisheye image is over exposed with average pixel value %s px.", value);
|
||||||
@@ -3024,7 +3036,6 @@ public class RTABMapActivity extends FragmentActivity implements OnClickListener
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
RTABMapLib.openDatabase(nativeApplication, tmpDatabase, databaseInMemory, false, true);
|
RTABMapLib.openDatabase(nativeApplication, tmpDatabase, databaseInMemory, false, true);
|
||||||
|
|
||||||
if(!(mState == State.STATE_CAMERA || mState ==State.STATE_MAPPING))
|
if(!(mState == State.STATE_CAMERA || mState ==State.STATE_MAPPING))
|
||||||
|
|||||||
@@ -73,9 +73,11 @@ public class RTABMapLib
|
|||||||
public static native void setRawScanSaved(long nativeApplication, boolean enabled);
|
public static native void setRawScanSaved(long nativeApplication, boolean enabled);
|
||||||
public static native void setFullResolution(long nativeApplication, boolean enabled);
|
public static native void setFullResolution(long nativeApplication, boolean enabled);
|
||||||
public static native void setSmoothing(long nativeApplication, boolean enabled);
|
public static native void setSmoothing(long nativeApplication, boolean enabled);
|
||||||
|
public static native void setDepthBleedingError(long nativeApplication, float value);
|
||||||
public static native void setDepthFromMotion(long nativeApplication, boolean enabled);
|
public static native void setDepthFromMotion(long nativeApplication, boolean enabled);
|
||||||
public static native void setCameraColor(long nativeApplication, boolean enabled);
|
public static native void setCameraColor(long nativeApplication, boolean enabled);
|
||||||
public static native void setAppendMode(long nativeApplication, boolean enabled);
|
public static native void setAppendMode(long nativeApplication, boolean enabled);
|
||||||
|
public static native void setUpstreamRelocalizationAccThr(long nativeApplication, float value);
|
||||||
public static native void setDataRecorderMode(long nativeApplication, boolean enabled);
|
public static native void setDataRecorderMode(long nativeApplication, boolean enabled);
|
||||||
public static native void setMaxCloudDepth(long nativeApplication, float value);
|
public static native void setMaxCloudDepth(long nativeApplication, float value);
|
||||||
public static native void setMinCloudDepth(long nativeApplication, float value);
|
public static native void setMinCloudDepth(long nativeApplication, float value);
|
||||||
@@ -135,7 +137,6 @@ public class RTABMapLib
|
|||||||
public static native float getUpdateTime(long nativeApplication);
|
public static native float getUpdateTime(long nativeApplication);
|
||||||
public static native int getLoopClosureId(long nativeApplication);
|
public static native int getLoopClosureId(long nativeApplication);
|
||||||
|
|
||||||
public static native void postCameraPoseEvent(long nativeApplication, float x, float y, float z, float qx, float qy, float qz, float qw, double stamp);
|
|
||||||
public static native void postOdometryEvent(long nativeApplication,
|
public static native void postOdometryEvent(long nativeApplication,
|
||||||
float x, float y, float z, float qx, float qy, float qz, float qw,
|
float x, float y, float z, float qx, float qy, float qz, float qw,
|
||||||
float rgb_fx, float rgb_fy, float rgb_cx, float rgb_cy,
|
float rgb_fx, float rgb_fy, float rgb_cx, float rgb_cy,
|
||||||
|
|||||||
@@ -222,7 +222,8 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
((Preference)findPreference(getString(R.string.pref_key_background_color))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_background_color))).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
((Preference)findPreference(getString(R.string.pref_key_background_color))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_background_color))).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
((Preference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
||||||
|
|
||||||
((Preference)findPreference(getString(R.string.pref_key_arcore_localization_filtering_speed))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_arcore_localization_filtering_speed))).getEntry() + ") "+getString(R.string.pref_summary_arcore_localization_filtering_speed));
|
((Preference)findPreference(getString(R.string.pref_key_depth_bleeding_error))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_depth_bleeding_error))).getEntry() + ") "+getString(R.string.pref_summary_depth_bleeding_error));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_arcore_relocalization_acc_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_arcore_relocalization_acc_thr))).getEntry() + ") "+getString(R.string.pref_summary_arcore_relocalization_acc_thr));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_update_rate))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_update_rate))).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
((Preference)findPreference(getString(R.string.pref_key_update_rate))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_update_rate))).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_max_speed))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_speed))).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
((Preference)findPreference(getString(R.string.pref_key_max_speed))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_speed))).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_time_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_time_thr))).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
((Preference)findPreference(getString(R.string.pref_key_time_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_time_thr))).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
||||||
@@ -285,7 +286,8 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
if(key.compareTo(getString(R.string.pref_key_background_color))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
if(key.compareTo(getString(R.string.pref_key_background_color))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_background_color));
|
||||||
if(key.compareTo(getString(R.string.pref_key_rendering_texture_decimation))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
if(key.compareTo(getString(R.string.pref_key_rendering_texture_decimation))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
||||||
|
|
||||||
if(key.compareTo(getString(R.string.pref_key_arcore_localization_filtering_speed))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_arcore_localization_filtering_speed));
|
if(key.compareTo(getString(R.string.pref_key_depth_bleeding_error))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_depth_bleeding_error));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_arcore_relocalization_acc_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_arcore_relocalization_acc_thr));
|
||||||
if(key.compareTo(getString(R.string.pref_key_update_rate))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
if(key.compareTo(getString(R.string.pref_key_update_rate))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
||||||
if(key.compareTo(getString(R.string.pref_key_max_speed))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
if(key.compareTo(getString(R.string.pref_key_max_speed))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
||||||
if(key.compareTo(getString(R.string.pref_key_time_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
if(key.compareTo(getString(R.string.pref_key_time_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
||||||
|
|||||||
@@ -3,15 +3,87 @@
|
|||||||
archiveVersion = 1;
|
archiveVersion = 1;
|
||||||
classes = {
|
classes = {
|
||||||
};
|
};
|
||||||
objectVersion = 52;
|
objectVersion = 54;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
4E0D83832621F52C00C879AC /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4E0D83822621F52C00C879AC /* Settings.bundle */; };
|
4E0D83832621F52C00C879AC /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4E0D83822621F52C00C879AC /* Settings.bundle */; };
|
||||||
|
4E10D89C2DE409870015926D /* librtabmap_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB0259D5BE500575D88 /* librtabmap_core.a */; };
|
||||||
|
4E10D89D2DE409870015926D /* librtabmap_utilite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAF259D5BE500575D88 /* librtabmap_utilite.a */; };
|
||||||
|
4E10D89E2DE409A60015926D /* libopencv_xfeatures2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED9259D5BFC00575D88 /* libopencv_xfeatures2d.a */; };
|
||||||
|
4E10D89F2DE409B20015926D /* libopencv_video.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB4259D5BFB00575D88 /* libopencv_video.a */; };
|
||||||
|
4E10D8A02DE409BB0015926D /* libopencv_tracking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECC259D5BFC00575D88 /* libopencv_tracking.a */; };
|
||||||
|
4E10D8A12DE409C00015926D /* libopencv_optflow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC3259D5BFC00575D88 /* libopencv_optflow.a */; };
|
||||||
|
4E10D8A22DE409C70015926D /* libopencv_imgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBE259D5BFC00575D88 /* libopencv_imgproc.a */; };
|
||||||
|
4E10D8A32DE409CA0015926D /* libopencv_features2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB8259D5BFB00575D88 /* libopencv_features2d.a */; };
|
||||||
|
4E10D8A42DE409CE0015926D /* libopencv_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED1259D5BFC00575D88 /* libopencv_core.a */; };
|
||||||
|
4E10D8A52DE409D10015926D /* libopencv_calib3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED6259D5BFC00575D88 /* libopencv_calib3d.a */; };
|
||||||
|
4E10D8A62DE409D50015926D /* libopencv_aruco.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB5259D5BFB00575D88 /* libopencv_aruco.a */; };
|
||||||
|
4E10D8A72DE409F40015926D /* libopencv_flann.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBC259D5BFB00575D88 /* libopencv_flann.a */; };
|
||||||
|
4E10D8A82DE40A1B0015926D /* libopencv_ximgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDC259D5BFC00575D88 /* libopencv_ximgproc.a */; };
|
||||||
|
4E10D8A92DE40A3A0015926D /* libopencv_photo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB6259D5BFB00575D88 /* libopencv_photo.a */; };
|
||||||
|
4E10D8AA2DE40A6C0015926D /* libopencv_objdetect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBB259D5BFB00575D88 /* libopencv_objdetect.a */; };
|
||||||
|
4E10D8AB2DE40A8C0015926D /* libopencv_stitching.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBD259D5BFB00575D88 /* libopencv_stitching.a */; };
|
||||||
|
4E10D8AC2DE40AA20015926D /* libopencv_imgcodecs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC4259D5BFC00575D88 /* libopencv_imgcodecs.a */; };
|
||||||
|
4E10D8AD2DE40E990015926D /* libg2o_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0D259D5C2200575D88 /* libg2o_core.a */; };
|
||||||
|
4E10D8AE2DE40E990015926D /* libg2o_solver_dense.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F07259D5C2100575D88 /* libg2o_solver_dense.a */; };
|
||||||
|
4E10D8AF2DE40E990015926D /* libg2o_solver_eigen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F12259D5C2200575D88 /* libg2o_solver_eigen.a */; };
|
||||||
|
4E10D8B02DE40E990015926D /* libg2o_solver_pcg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0B259D5C2200575D88 /* libg2o_solver_pcg.a */; };
|
||||||
|
4E10D8B12DE40E990015926D /* libg2o_solver_slam2d_linear.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F09259D5C2100575D88 /* libg2o_solver_slam2d_linear.a */; };
|
||||||
|
4E10D8B22DE40E990015926D /* libg2o_solver_structure_only.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F11259D5C2200575D88 /* libg2o_solver_structure_only.a */; };
|
||||||
|
4E10D8B32DE40E990015926D /* libg2o_stuff.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F14259D5C2200575D88 /* libg2o_stuff.a */; };
|
||||||
|
4E10D8B42DE40E990015926D /* libg2o_types_data.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0C259D5C2200575D88 /* libg2o_types_data.a */; };
|
||||||
|
4E10D8B52DE40E990015926D /* libg2o_types_icp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0F259D5C2200575D88 /* libg2o_types_icp.a */; };
|
||||||
|
4E10D8B62DE40E990015926D /* libg2o_types_sba.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F15259D5C2200575D88 /* libg2o_types_sba.a */; };
|
||||||
|
4E10D8B72DE40E990015926D /* libg2o_types_sclam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1A259D5C2200575D88 /* libg2o_types_sclam2d.a */; };
|
||||||
|
4E10D8B82DE40E990015926D /* libg2o_types_sim3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1B259D5C2200575D88 /* libg2o_types_sim3.a */; };
|
||||||
|
4E10D8B92DE40E990015926D /* libg2o_types_slam2d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F16259D5C2200575D88 /* libg2o_types_slam2d_addons.a */; };
|
||||||
|
4E10D8BA2DE40E990015926D /* libg2o_types_slam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0A259D5C2100575D88 /* libg2o_types_slam2d.a */; };
|
||||||
|
4E10D8BB2DE40E990015926D /* libg2o_types_slam3d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F17259D5C2200575D88 /* libg2o_types_slam3d_addons.a */; };
|
||||||
|
4E10D8BC2DE40E990015926D /* libg2o_types_slam3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F18259D5C2200575D88 /* libg2o_types_slam3d.a */; };
|
||||||
|
4E10D8BD2DE40EC70015926D /* libpcl_common.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4D259D4DF100575D88 /* libpcl_common.a */; };
|
||||||
|
4E10D8BE2DE40EC70015926D /* libpcl_features.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B43259D4DF100575D88 /* libpcl_features.a */; };
|
||||||
|
4E10D8BF2DE40EC70015926D /* libpcl_filters.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B44259D4DF100575D88 /* libpcl_filters.a */; };
|
||||||
|
4E10D8C02DE40EC70015926D /* libpcl_io_ply.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4E259D4DF100575D88 /* libpcl_io_ply.a */; };
|
||||||
|
4E10D8C12DE40EC70015926D /* libpcl_io.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4C259D4DF100575D88 /* libpcl_io.a */; };
|
||||||
|
4E10D8C22DE40EC70015926D /* libpcl_kdtree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B46259D4DF100575D88 /* libpcl_kdtree.a */; };
|
||||||
|
4E10D8C32DE40EC70015926D /* libpcl_keypoints.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B49259D4DF100575D88 /* libpcl_keypoints.a */; };
|
||||||
|
4E10D8C42DE40EC70015926D /* libpcl_ml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4F259D4DF100575D88 /* libpcl_ml.a */; };
|
||||||
|
4E10D8C52DE40EC70015926D /* libpcl_octree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4B259D4DF100575D88 /* libpcl_octree.a */; };
|
||||||
|
4E10D8C62DE40EC70015926D /* libpcl_registration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B42259D4DF100575D88 /* libpcl_registration.a */; };
|
||||||
|
4E10D8C72DE40EC70015926D /* libpcl_sample_consensus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B45259D4DF100575D88 /* libpcl_sample_consensus.a */; };
|
||||||
|
4E10D8C82DE40EC70015926D /* libpcl_search.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B47259D4DF100575D88 /* libpcl_search.a */; };
|
||||||
|
4E10D8C92DE40EC70015926D /* libpcl_segmentation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B50259D4DF100575D88 /* libpcl_segmentation.a */; };
|
||||||
|
4E10D8CA2DE40EC70015926D /* libpcl_stereo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B41259D4DF100575D88 /* libpcl_stereo.a */; };
|
||||||
|
4E10D8CB2DE40EC70015926D /* libpcl_surface.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B48259D4DF100575D88 /* libpcl_surface.a */; };
|
||||||
|
4E10D8CC2DE40EE30015926D /* libgtsam_unstable.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0E259D5C2200575D88 /* libgtsam_unstable.a */; };
|
||||||
|
4E10D8CD2DE40EE30015926D /* libgtsam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1C259D5C2200575D88 /* libgtsam.a */; };
|
||||||
|
4E10D8CE2DE40EE30015926D /* libmetis-gtsam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8622DE408EE0015926D /* libmetis-gtsam.a */; };
|
||||||
|
4E10D8CF2DE40EF90015926D /* libboost_serialization.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B30259D4DE900575D88 /* libboost_serialization.a */; };
|
||||||
|
4E10D8D02DE40F060015926D /* libboost_timer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B34259D4DE900575D88 /* libboost_timer.a */; };
|
||||||
|
4E10D8D12DE40F190015926D /* liblas_c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8752DE408EF0015926D /* liblas_c.a */; };
|
||||||
|
4E10D8D22DE40F190015926D /* liblas.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFAA9422CAE4E960055DA51 /* liblas.a */; };
|
||||||
|
4E10D8D32DE40F190015926D /* liblaszip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4ED73AD02D7FECF3007899C2 /* liblaszip.a */; };
|
||||||
|
4E10D8D42DE40F2A0015926D /* libboost_thread.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B33259D4DE900575D88 /* libboost_thread.a */; };
|
||||||
|
4E10D8E12DE4101B0015926D /* liblibjpeg-turbo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8D52DE40FBE0015926D /* liblibjpeg-turbo.a */; };
|
||||||
|
4E10D8E22DE4101B0015926D /* liblibpng.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E10D8D72DE40FCA0015926D /* liblibpng.a */; };
|
||||||
|
4E1E9CF72D618E69000CB881 /* quad_color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E1E9CF62D618079000CB881 /* quad_color.cpp */; };
|
||||||
|
4E1E9CF82D618E69000CB881 /* text_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E1E9CF52D618079000CB881 /* text_drawable.cpp */; };
|
||||||
4E20B24E266AB94300316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24D266AB94300316EE6 /* Images.xcassets */; };
|
4E20B24E266AB94300316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24D266AB94300316EE6 /* Images.xcassets */; };
|
||||||
4E20B250266AB95600316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24F266AB95600316EE6 /* Images.xcassets */; };
|
4E20B250266AB95600316EE6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E20B24F266AB95600316EE6 /* Images.xcassets */; };
|
||||||
4E2C516725A63119005CEDBD /* DatabaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516525A63119005CEDBD /* DatabaseView.swift */; };
|
4E2C516725A63119005CEDBD /* DatabaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516525A63119005CEDBD /* DatabaseView.swift */; };
|
||||||
4E2C516825A63119005CEDBD /* VerticalScrollerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */; };
|
4E2C516825A63119005CEDBD /* VerticalScrollerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */; };
|
||||||
|
4E3525542DE4C6E500F39D8F /* libg2o_csparse_extension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F13259D5C2200575D88 /* libg2o_csparse_extension.a */; };
|
||||||
|
4E3525552DE4C6E500F39D8F /* libg2o_solver_csparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F10259D5C2200575D88 /* libg2o_solver_csparse.a */; };
|
||||||
|
4E3525572DE4C6E500F39D8F /* libg2o_solver_cholmod.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525562DE4C6E500F39D8F /* libg2o_solver_cholmod.a */; };
|
||||||
|
4E3525592DE4C6F600F39D8F /* libcholmod.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525582DE4C6F600F39D8F /* libcholmod.a */; };
|
||||||
|
4E35255E2DE4C71000F39D8F /* libcxsparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255A2DE4C71000F39D8F /* libcxsparse.a */; };
|
||||||
|
4E35255F2DE4C71000F39D8F /* libcolamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255B2DE4C71000F39D8F /* libcolamd.a */; };
|
||||||
|
4E3525602DE4C71000F39D8F /* libcamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255C2DE4C71000F39D8F /* libcamd.a */; };
|
||||||
|
4E3525612DE4C71000F39D8F /* libccolamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E35255D2DE4C71000F39D8F /* libccolamd.a */; };
|
||||||
|
4E3525642DE4C71C00F39D8F /* libsuitesparseconfig.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525622DE4C71C00F39D8F /* libsuitesparseconfig.a */; };
|
||||||
|
4E3525652DE4C71C00F39D8F /* libspqr.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525632DE4C71C00F39D8F /* libspqr.a */; };
|
||||||
|
4E3525672DE4C72D00F39D8F /* libamd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E3525662DE4C72D00F39D8F /* libamd.a */; };
|
||||||
4E8B155426273A580037FC53 /* Zip in Frameworks */ = {isa = PBXBuildFile; productRef = 4E8B155326273A580037FC53 /* Zip */; };
|
4E8B155426273A580037FC53 /* Zip in Frameworks */ = {isa = PBXBuildFile; productRef = 4E8B155326273A580037FC53 /* Zip */; };
|
||||||
4EB1A66625A0D90B0043C7BF /* RTABMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A66525A0D90B0043C7BF /* RTABMap.swift */; };
|
4EB1A66625A0D90B0043C7BF /* RTABMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A66525A0D90B0043C7BF /* RTABMap.swift */; };
|
||||||
4EE016B3259BE441008CCE65 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016AF259BE441008CCE65 /* ViewController.swift */; };
|
4EE016B3259BE441008CCE65 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE016AF259BE441008CCE65 /* ViewController.swift */; };
|
||||||
@@ -20,33 +92,6 @@
|
|||||||
4EE016C3259BE464008CCE65 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016BF259BE464008CCE65 /* Main.storyboard */; };
|
4EE016C3259BE464008CCE65 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016BF259BE464008CCE65 /* Main.storyboard */; };
|
||||||
4EE016C4259BE464008CCE65 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C1259BE464008CCE65 /* LaunchScreen.storyboard */; };
|
4EE016C4259BE464008CCE65 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C1259BE464008CCE65 /* LaunchScreen.storyboard */; };
|
||||||
4EE016C7259BE46F008CCE65 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C6259BE46F008CCE65 /* Assets.xcassets */; };
|
4EE016C7259BE46F008CCE65 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4EE016C6259BE46F008CCE65 /* Assets.xcassets */; };
|
||||||
4EFD0B36259D4DE900575D88 /* libboost_filesystem.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2B259D4DE900575D88 /* libboost_filesystem.a */; };
|
|
||||||
4EFD0B37259D4DE900575D88 /* libboost_program_options.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2C259D4DE900575D88 /* libboost_program_options.a */; };
|
|
||||||
4EFD0B38259D4DE900575D88 /* libboost_regex.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2D259D4DE900575D88 /* libboost_regex.a */; };
|
|
||||||
4EFD0B39259D4DE900575D88 /* libboost_iostreams.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2E259D4DE900575D88 /* libboost_iostreams.a */; };
|
|
||||||
4EFD0B3A259D4DE900575D88 /* libboost_date_time.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B2F259D4DE900575D88 /* libboost_date_time.a */; };
|
|
||||||
4EFD0B3B259D4DE900575D88 /* libboost_serialization.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B30259D4DE900575D88 /* libboost_serialization.a */; };
|
|
||||||
4EFD0B3C259D4DE900575D88 /* libboost_system.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B31259D4DE900575D88 /* libboost_system.a */; };
|
|
||||||
4EFD0B3D259D4DE900575D88 /* libboost_signals.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B32259D4DE900575D88 /* libboost_signals.a */; };
|
|
||||||
4EFD0B3E259D4DE900575D88 /* libboost_thread.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B33259D4DE900575D88 /* libboost_thread.a */; };
|
|
||||||
4EFD0B3F259D4DE900575D88 /* libboost_timer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B34259D4DE900575D88 /* libboost_timer.a */; };
|
|
||||||
4EFD0B40259D4DE900575D88 /* libboost_chrono.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B35259D4DE900575D88 /* libboost_chrono.a */; };
|
|
||||||
4EFD0B51259D4DF100575D88 /* libpcl_stereo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B41259D4DF100575D88 /* libpcl_stereo.a */; };
|
|
||||||
4EFD0B52259D4DF100575D88 /* libpcl_registration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B42259D4DF100575D88 /* libpcl_registration.a */; };
|
|
||||||
4EFD0B53259D4DF100575D88 /* libpcl_features.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B43259D4DF100575D88 /* libpcl_features.a */; };
|
|
||||||
4EFD0B54259D4DF100575D88 /* libpcl_filters.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B44259D4DF100575D88 /* libpcl_filters.a */; };
|
|
||||||
4EFD0B55259D4DF100575D88 /* libpcl_sample_consensus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B45259D4DF100575D88 /* libpcl_sample_consensus.a */; };
|
|
||||||
4EFD0B56259D4DF100575D88 /* libpcl_kdtree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B46259D4DF100575D88 /* libpcl_kdtree.a */; };
|
|
||||||
4EFD0B57259D4DF100575D88 /* libpcl_search.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B47259D4DF100575D88 /* libpcl_search.a */; };
|
|
||||||
4EFD0B58259D4DF100575D88 /* libpcl_surface.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B48259D4DF100575D88 /* libpcl_surface.a */; };
|
|
||||||
4EFD0B59259D4DF100575D88 /* libpcl_keypoints.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B49259D4DF100575D88 /* libpcl_keypoints.a */; };
|
|
||||||
4EFD0B5A259D4DF100575D88 /* libpcl_recognition.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4A259D4DF100575D88 /* libpcl_recognition.a */; };
|
|
||||||
4EFD0B5B259D4DF100575D88 /* libpcl_octree.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4B259D4DF100575D88 /* libpcl_octree.a */; };
|
|
||||||
4EFD0B5C259D4DF100575D88 /* libpcl_io.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4C259D4DF100575D88 /* libpcl_io.a */; };
|
|
||||||
4EFD0B5D259D4DF100575D88 /* libpcl_common.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4D259D4DF100575D88 /* libpcl_common.a */; };
|
|
||||||
4EFD0B5E259D4DF100575D88 /* libpcl_io_ply.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4E259D4DF100575D88 /* libpcl_io_ply.a */; };
|
|
||||||
4EFD0B5F259D4DF100575D88 /* libpcl_ml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B4F259D4DF100575D88 /* libpcl_ml.a */; };
|
|
||||||
4EFD0B60259D4DF100575D88 /* libpcl_segmentation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0B50259D4DF100575D88 /* libpcl_segmentation.a */; };
|
|
||||||
4EFD0B97259D501E00575D88 /* line.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B63259D501E00575D88 /* line.cpp */; };
|
4EFD0B97259D501E00575D88 /* line.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B63259D501E00575D88 /* line.cpp */; };
|
||||||
4EFD0B98259D501E00575D88 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B64259D501E00575D88 /* util.cpp */; };
|
4EFD0B98259D501E00575D88 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B64259D501E00575D88 /* util.cpp */; };
|
||||||
4EFD0B99259D501E00575D88 /* obj_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B65259D501E00575D88 /* obj_loader.cpp */; };
|
4EFD0B99259D501E00575D88 /* obj_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0B65259D501E00575D88 /* obj_loader.cpp */; };
|
||||||
@@ -74,93 +119,74 @@
|
|||||||
4EFD0BBC259D509300575D88 /* point_cloud_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBA259D509300575D88 /* point_cloud_drawable.cpp */; };
|
4EFD0BBC259D509300575D88 /* point_cloud_drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBA259D509300575D88 /* point_cloud_drawable.cpp */; };
|
||||||
4EFD0BC0259D50A800575D88 /* scene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBE259D50A800575D88 /* scene.cpp */; };
|
4EFD0BC0259D50A800575D88 /* scene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0BBE259D50A800575D88 /* scene.cpp */; };
|
||||||
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAA259D581800575D88 /* OpenGLES.framework */; };
|
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAA259D581800575D88 /* OpenGLES.framework */; };
|
||||||
4EFD0EB1259D5BE500575D88 /* librtabmap_utilite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EAF259D5BE500575D88 /* librtabmap_utilite.a */; };
|
|
||||||
4EFD0EB2259D5BE500575D88 /* librtabmap_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB0259D5BE500575D88 /* librtabmap_core.a */; };
|
|
||||||
4EFD0EDD259D5BFC00575D88 /* libopencv_video.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB4259D5BFB00575D88 /* libopencv_video.a */; };
|
|
||||||
4EFD0EDE259D5BFC00575D88 /* libopencv_aruco.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB5259D5BFB00575D88 /* libopencv_aruco.a */; };
|
|
||||||
4EFD0EDF259D5BFC00575D88 /* libopencv_photo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB6259D5BFB00575D88 /* libopencv_photo.a */; };
|
|
||||||
4EFD0EE0259D5BFC00575D88 /* libopencv_line_descriptor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB7259D5BFB00575D88 /* libopencv_line_descriptor.a */; };
|
|
||||||
4EFD0EE1259D5BFC00575D88 /* libopencv_features2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB8259D5BFB00575D88 /* libopencv_features2d.a */; };
|
|
||||||
4EFD0EE2259D5BFC00575D88 /* libopencv_bgsegm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EB9259D5BFB00575D88 /* libopencv_bgsegm.a */; };
|
|
||||||
4EFD0EE3259D5BFC00575D88 /* libopencv_dnn_objdetect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBA259D5BFB00575D88 /* libopencv_dnn_objdetect.a */; };
|
|
||||||
4EFD0EE4259D5BFC00575D88 /* libopencv_objdetect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBB259D5BFB00575D88 /* libopencv_objdetect.a */; };
|
|
||||||
4EFD0EE5259D5BFC00575D88 /* libopencv_flann.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBC259D5BFB00575D88 /* libopencv_flann.a */; };
|
|
||||||
4EFD0EE6259D5BFC00575D88 /* libopencv_stitching.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBD259D5BFB00575D88 /* libopencv_stitching.a */; };
|
|
||||||
4EFD0EE7259D5BFC00575D88 /* libopencv_imgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBE259D5BFC00575D88 /* libopencv_imgproc.a */; };
|
|
||||||
4EFD0EE8259D5BFC00575D88 /* libopencv_ml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EBF259D5BFC00575D88 /* libopencv_ml.a */; };
|
|
||||||
4EFD0EE9259D5BFC00575D88 /* libopencv_rgbd.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC0259D5BFC00575D88 /* libopencv_rgbd.a */; };
|
|
||||||
4EFD0EEA259D5BFC00575D88 /* libopencv_xphoto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC1259D5BFC00575D88 /* libopencv_xphoto.a */; };
|
|
||||||
4EFD0EEB259D5BFC00575D88 /* libopencv_phase_unwrapping.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC2259D5BFC00575D88 /* libopencv_phase_unwrapping.a */; };
|
|
||||||
4EFD0EEC259D5BFC00575D88 /* libopencv_optflow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC3259D5BFC00575D88 /* libopencv_optflow.a */; };
|
|
||||||
4EFD0EED259D5BFC00575D88 /* libopencv_imgcodecs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC4259D5BFC00575D88 /* libopencv_imgcodecs.a */; };
|
|
||||||
4EFD0EEE259D5BFC00575D88 /* libopencv_fuzzy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC5259D5BFC00575D88 /* libopencv_fuzzy.a */; };
|
|
||||||
4EFD0EEF259D5BFC00575D88 /* libopencv_dpm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC6259D5BFC00575D88 /* libopencv_dpm.a */; };
|
|
||||||
4EFD0EF0259D5BFC00575D88 /* libopencv_plot.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC7259D5BFC00575D88 /* libopencv_plot.a */; };
|
|
||||||
4EFD0EF1259D5BFC00575D88 /* libopencv_dnn.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC8259D5BFC00575D88 /* libopencv_dnn.a */; };
|
|
||||||
4EFD0EF2259D5BFC00575D88 /* libopencv_saliency.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EC9259D5BFC00575D88 /* libopencv_saliency.a */; };
|
|
||||||
4EFD0EF3259D5BFC00575D88 /* libopencv_videoio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECA259D5BFC00575D88 /* libopencv_videoio.a */; };
|
|
||||||
4EFD0EF4259D5BFC00575D88 /* libopencv_hfs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECB259D5BFC00575D88 /* libopencv_hfs.a */; };
|
|
||||||
4EFD0EF5259D5BFC00575D88 /* libopencv_tracking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECC259D5BFC00575D88 /* libopencv_tracking.a */; };
|
|
||||||
4EFD0EF6259D5BFC00575D88 /* libopencv_text.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECD259D5BFC00575D88 /* libopencv_text.a */; };
|
|
||||||
4EFD0EF7259D5BFC00575D88 /* libopencv_face.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECE259D5BFC00575D88 /* libopencv_face.a */; };
|
|
||||||
4EFD0EF8259D5BFC00575D88 /* libopencv_bioinspired.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ECF259D5BFC00575D88 /* libopencv_bioinspired.a */; };
|
|
||||||
4EFD0EF9259D5BFC00575D88 /* libopencv_highgui.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED0259D5BFC00575D88 /* libopencv_highgui.a */; };
|
|
||||||
4EFD0EFA259D5BFC00575D88 /* libopencv_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED1259D5BFC00575D88 /* libopencv_core.a */; };
|
|
||||||
4EFD0EFB259D5BFC00575D88 /* libopencv_shape.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED2259D5BFC00575D88 /* libopencv_shape.a */; };
|
|
||||||
4EFD0EFC259D5BFC00575D88 /* libopencv_datasets.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED3259D5BFC00575D88 /* libopencv_datasets.a */; };
|
|
||||||
4EFD0EFD259D5BFC00575D88 /* libopencv_img_hash.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED4259D5BFC00575D88 /* libopencv_img_hash.a */; };
|
|
||||||
4EFD0EFE259D5BFC00575D88 /* libopencv_surface_matching.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED5259D5BFC00575D88 /* libopencv_surface_matching.a */; };
|
|
||||||
4EFD0EFF259D5BFC00575D88 /* libopencv_calib3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED6259D5BFC00575D88 /* libopencv_calib3d.a */; };
|
|
||||||
4EFD0F00259D5BFC00575D88 /* libopencv_structured_light.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED7259D5BFC00575D88 /* libopencv_structured_light.a */; };
|
|
||||||
4EFD0F01259D5BFC00575D88 /* libopencv_reg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED8259D5BFC00575D88 /* libopencv_reg.a */; };
|
|
||||||
4EFD0F02259D5BFC00575D88 /* libopencv_xfeatures2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0ED9259D5BFC00575D88 /* libopencv_xfeatures2d.a */; };
|
|
||||||
4EFD0F03259D5BFC00575D88 /* libopencv_videostab.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDA259D5BFC00575D88 /* libopencv_videostab.a */; };
|
|
||||||
4EFD0F04259D5BFC00575D88 /* libopencv_ccalib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDB259D5BFC00575D88 /* libopencv_ccalib.a */; };
|
|
||||||
4EFD0F05259D5BFC00575D88 /* libopencv_ximgproc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0EDC259D5BFC00575D88 /* libopencv_ximgproc.a */; };
|
|
||||||
4EFD0F1D259D5C2200575D88 /* libg2o_solver_dense.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F07259D5C2100575D88 /* libg2o_solver_dense.a */; };
|
|
||||||
4EFD0F1E259D5C2200575D88 /* libg2o_ext_csparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F08259D5C2100575D88 /* libg2o_ext_csparse.a */; };
|
|
||||||
4EFD0F1F259D5C2200575D88 /* libg2o_solver_slam2d_linear.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F09259D5C2100575D88 /* libg2o_solver_slam2d_linear.a */; };
|
|
||||||
4EFD0F20259D5C2200575D88 /* libg2o_types_slam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0A259D5C2100575D88 /* libg2o_types_slam2d.a */; };
|
|
||||||
4EFD0F21259D5C2200575D88 /* libg2o_solver_pcg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0B259D5C2200575D88 /* libg2o_solver_pcg.a */; };
|
|
||||||
4EFD0F22259D5C2200575D88 /* libg2o_types_data.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0C259D5C2200575D88 /* libg2o_types_data.a */; };
|
|
||||||
4EFD0F23259D5C2200575D88 /* libg2o_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0D259D5C2200575D88 /* libg2o_core.a */; };
|
|
||||||
4EFD0F24259D5C2200575D88 /* libgtsam_unstable.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0E259D5C2200575D88 /* libgtsam_unstable.a */; };
|
|
||||||
4EFD0F25259D5C2200575D88 /* libg2o_types_icp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F0F259D5C2200575D88 /* libg2o_types_icp.a */; };
|
|
||||||
4EFD0F26259D5C2200575D88 /* libg2o_solver_csparse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F10259D5C2200575D88 /* libg2o_solver_csparse.a */; };
|
|
||||||
4EFD0F27259D5C2200575D88 /* libg2o_solver_structure_only.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F11259D5C2200575D88 /* libg2o_solver_structure_only.a */; };
|
|
||||||
4EFD0F28259D5C2200575D88 /* libg2o_solver_eigen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F12259D5C2200575D88 /* libg2o_solver_eigen.a */; };
|
|
||||||
4EFD0F29259D5C2200575D88 /* libg2o_csparse_extension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F13259D5C2200575D88 /* libg2o_csparse_extension.a */; };
|
|
||||||
4EFD0F2A259D5C2200575D88 /* libg2o_stuff.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F14259D5C2200575D88 /* libg2o_stuff.a */; };
|
|
||||||
4EFD0F2B259D5C2200575D88 /* libg2o_types_sba.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F15259D5C2200575D88 /* libg2o_types_sba.a */; };
|
|
||||||
4EFD0F2C259D5C2200575D88 /* libg2o_types_slam2d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F16259D5C2200575D88 /* libg2o_types_slam2d_addons.a */; };
|
|
||||||
4EFD0F2D259D5C2200575D88 /* libg2o_types_slam3d_addons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F17259D5C2200575D88 /* libg2o_types_slam3d_addons.a */; };
|
|
||||||
4EFD0F2E259D5C2200575D88 /* libg2o_types_slam3d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F18259D5C2200575D88 /* libg2o_types_slam3d.a */; };
|
|
||||||
4EFD0F2F259D5C2200575D88 /* libmetis.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F19259D5C2200575D88 /* libmetis.a */; };
|
|
||||||
4EFD0F30259D5C2200575D88 /* libg2o_types_sclam2d.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1A259D5C2200575D88 /* libg2o_types_sclam2d.a */; };
|
|
||||||
4EFD0F31259D5C2200575D88 /* libg2o_types_sim3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1B259D5C2200575D88 /* libg2o_types_sim3.a */; };
|
|
||||||
4EFD0F32259D5C2200575D88 /* libgtsam.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F1C259D5C2200575D88 /* libgtsam.a */; };
|
|
||||||
4EFD0F34259D5C2900575D88 /* libflann_cpp_s.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F33259D5C2900575D88 /* libflann_cpp_s.a */; };
|
|
||||||
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F35259D5C7300575D88 /* vtk.framework */; };
|
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F35259D5C7300575D88 /* vtk.framework */; };
|
||||||
4EFD0F3A259D5D1500575D88 /* CameraMobile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F38259D5D1500575D88 /* CameraMobile.cpp */; };
|
4EFD0F3A259D5D1500575D88 /* CameraMobile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F38259D5D1500575D88 /* CameraMobile.cpp */; };
|
||||||
4EFD0F3D259D5D5C00575D88 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F3C259D5D5C00575D88 /* libsqlite3.tbd */; };
|
|
||||||
4EFD0F50259D67D900575D88 /* liblibwebp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4B259D67D900575D88 /* liblibwebp.a */; };
|
|
||||||
4EFD0F51259D67D900575D88 /* liblibpng.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4C259D67D900575D88 /* liblibpng.a */; };
|
|
||||||
4EFD0F52259D67D900575D88 /* liblibjpeg-turbo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */; };
|
|
||||||
4EFD0F53259D67D900575D88 /* libzlib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4E259D67D900575D88 /* libzlib.a */; };
|
|
||||||
4EFD0F54259D67D900575D88 /* liblibprotobuf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFD0F4F259D67D900575D88 /* liblibprotobuf.a */; };
|
|
||||||
4EFD0F62259E341C00575D88 /* RTABMapApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F61259E341C00575D88 /* RTABMapApp.cpp */; };
|
4EFD0F62259E341C00575D88 /* RTABMapApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F61259E341C00575D88 /* RTABMapApp.cpp */; };
|
||||||
4EFD0F67259E38DE00575D88 /* NativeWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F66259E38DE00575D88 /* NativeWrapper.cpp */; };
|
4EFD0F67259E38DE00575D88 /* NativeWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F66259E38DE00575D88 /* NativeWrapper.cpp */; };
|
||||||
4EFD0F70259F847300575D88 /* background_renderer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F6E259F847300575D88 /* background_renderer.cc */; };
|
4EFD0F70259F847300575D88 /* background_renderer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD0F6E259F847300575D88 /* background_renderer.cc */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
44D4681D2D538A4100B094BA /* RTABMapApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RTABMapApp.entitlements; path = RTABMapApp/RTABMapApp.entitlements; sourceTree = "<group>"; };
|
||||||
4E0D83822621F52C00C879AC /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
4E0D83822621F52C00C879AC /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
|
||||||
|
4E10D8602DE408EE0015926D /* libboost_stacktrace_noop.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_stacktrace_noop.a; path = RTABMapApp/Libraries/lib/libboost_stacktrace_noop.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8612DE408EE0015926D /* libboost_wserialization.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_wserialization.a; path = RTABMapApp/Libraries/lib/libboost_wserialization.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8622DE408EE0015926D /* libmetis-gtsam.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libmetis-gtsam.a"; path = "RTABMapApp/Libraries/lib/libmetis-gtsam.a"; sourceTree = "<group>"; };
|
||||||
|
4E10D8632DE408EE0015926D /* libopencv_wechat_qrcode.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_wechat_qrcode.a; path = RTABMapApp/Libraries/lib/libopencv_wechat_qrcode.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8642DE408EE0015926D /* libboost_container.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_container.a; path = RTABMapApp/Libraries/lib/libboost_container.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8652DE408EE0015926D /* libboost_graph.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_graph.a; path = RTABMapApp/Libraries/lib/libboost_graph.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8662DE408EE0015926D /* libboost_json.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_json.a; path = RTABMapApp/Libraries/lib/libboost_json.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8672DE408EE0015926D /* libboost_stacktrace_basic.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_stacktrace_basic.a; path = RTABMapApp/Libraries/lib/libboost_stacktrace_basic.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8682DE408EE0015926D /* libboost_atomic.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_atomic.a; path = RTABMapApp/Libraries/lib/libboost_atomic.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8692DE408EE0015926D /* libopencv_intensity_transform.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_intensity_transform.a; path = RTABMapApp/Libraries/lib/libopencv_intensity_transform.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86A2DE408EF0015926D /* libboost_locale.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_locale.a; path = RTABMapApp/Libraries/lib/libboost_locale.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86B2DE408EF0015926D /* liblz4.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblz4.a; path = RTABMapApp/Libraries/lib/liblz4.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86C2DE408EF0015926D /* libopencv_dnn_superres.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_dnn_superres.a; path = RTABMapApp/Libraries/lib/libopencv_dnn_superres.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86D2DE408EF0015926D /* libopencv_rapid.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_rapid.a; path = RTABMapApp/Libraries/lib/libopencv_rapid.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86E2DE408EF0015926D /* libopencv_quality.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_quality.a; path = RTABMapApp/Libraries/lib/libopencv_quality.a; sourceTree = "<group>"; };
|
||||||
|
4E10D86F2DE408EF0015926D /* libboost_url.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_url.a; path = RTABMapApp/Libraries/lib/libboost_url.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8702DE408EF0015926D /* libboost_unit_test_framework.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_unit_test_framework.a; path = RTABMapApp/Libraries/lib/libboost_unit_test_framework.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8712DE408EF0015926D /* libboost_random.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_random.a; path = RTABMapApp/Libraries/lib/libboost_random.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8722DE408EF0015926D /* libboost_wave.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_wave.a; path = RTABMapApp/Libraries/lib/libboost_wave.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8732DE408EF0015926D /* libboost_charconv.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_charconv.a; path = RTABMapApp/Libraries/lib/libboost_charconv.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8742DE408EF0015926D /* libboost_type_erasure.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_type_erasure.a; path = RTABMapApp/Libraries/lib/libboost_type_erasure.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8752DE408EF0015926D /* liblas_c.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblas_c.a; path = RTABMapApp/Libraries/lib/liblas_c.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8762DE408EF0015926D /* libboost_contract.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_contract.a; path = RTABMapApp/Libraries/lib/libboost_contract.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8772DE408EF0015926D /* libopencv_gapi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_gapi.a; path = RTABMapApp/Libraries/lib/libopencv_gapi.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8782DE408EF0015926D /* libopencv_signal.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_signal.a; path = RTABMapApp/Libraries/lib/libopencv_signal.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8792DE408EF0015926D /* libboost_prg_exec_monitor.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_prg_exec_monitor.a; path = RTABMapApp/Libraries/lib/libboost_prg_exec_monitor.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87A2DE408EF0015926D /* libboost_stacktrace_addr2line.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_stacktrace_addr2line.a; path = RTABMapApp/Libraries/lib/libboost_stacktrace_addr2line.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87B2DE408EF0015926D /* libboost_nowide.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_nowide.a; path = RTABMapApp/Libraries/lib/libboost_nowide.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87C2DE408EF0015926D /* libboost_test_exec_monitor.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_test_exec_monitor.a; path = RTABMapApp/Libraries/lib/libboost_test_exec_monitor.a; sourceTree = "<group>"; };
|
||||||
|
4E10D87D2DE408EF0015926D /* libopencv_mcc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopencv_mcc.a; path = RTABMapApp/Libraries/lib/libopencv_mcc.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8D52DE40FBE0015926D /* liblibjpeg-turbo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "liblibjpeg-turbo.a"; path = "RTABMapApp/Libraries/lib/opencv4/3rdparty/liblibjpeg-turbo.a"; sourceTree = "<group>"; };
|
||||||
|
4E10D8D72DE40FCA0015926D /* liblibpng.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblibpng.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/liblibpng.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8D92DE40FF60015926D /* libzlib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libzlib.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/libzlib.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8DA2DE40FF60015926D /* libIlmImf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libIlmImf.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/libIlmImf.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8DB2DE40FF60015926D /* libade.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libade.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/libade.a; sourceTree = "<group>"; };
|
||||||
|
4E10D8DC2DE40FF60015926D /* liblibprotobuf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblibprotobuf.a; path = RTABMapApp/Libraries/lib/opencv4/3rdparty/liblibprotobuf.a; sourceTree = "<group>"; };
|
||||||
|
4E1E9CF22D617D08000CB881 /* Measure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Measure.h; path = ../android/jni/Measure.h; sourceTree = "<group>"; };
|
||||||
|
4E1E9CF32D618079000CB881 /* quad_color.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = quad_color.h; path = ../android/jni/quad_color.h; sourceTree = "<group>"; };
|
||||||
|
4E1E9CF42D618079000CB881 /* text_drawable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text_drawable.h; path = ../android/jni/text_drawable.h; sourceTree = "<group>"; };
|
||||||
|
4E1E9CF52D618079000CB881 /* text_drawable.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = text_drawable.cpp; path = ../android/jni/text_drawable.cpp; sourceTree = "<group>"; };
|
||||||
|
4E1E9CF62D618079000CB881 /* quad_color.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = quad_color.cpp; path = ../android/jni/quad_color.cpp; sourceTree = "<group>"; };
|
||||||
|
4E1E9CF92D619025000CB881 /* text_atlas_png.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = text_atlas_png.h; path = RTABMapApp/text_atlas_png.h; sourceTree = "<group>"; };
|
||||||
4E20B24D266AB94300316EE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RTABMapApp/Images.xcassets; sourceTree = SOURCE_ROOT; };
|
4E20B24D266AB94300316EE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RTABMapApp/Images.xcassets; sourceTree = SOURCE_ROOT; };
|
||||||
4E20B24F266AB95600316EE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RTABMapApp/Images.xcassets; sourceTree = "<group>"; };
|
4E20B24F266AB95600316EE6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RTABMapApp/Images.xcassets; sourceTree = "<group>"; };
|
||||||
4E2C516525A63119005CEDBD /* DatabaseView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DatabaseView.swift; path = RTABMapApp/DatabaseView.swift; sourceTree = "<group>"; };
|
4E2C516525A63119005CEDBD /* DatabaseView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DatabaseView.swift; path = RTABMapApp/DatabaseView.swift; sourceTree = "<group>"; };
|
||||||
4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VerticalScrollerView.swift; path = RTABMapApp/VerticalScrollerView.swift; sourceTree = "<group>"; };
|
4E2C516625A63119005CEDBD /* VerticalScrollerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VerticalScrollerView.swift; path = RTABMapApp/VerticalScrollerView.swift; sourceTree = "<group>"; };
|
||||||
|
4E3525562DE4C6E500F39D8F /* libg2o_solver_cholmod.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libg2o_solver_cholmod.a; path = RTABMapApp/Libraries/lib/libg2o_solver_cholmod.a; sourceTree = "<group>"; };
|
||||||
|
4E3525582DE4C6F600F39D8F /* libcholmod.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcholmod.a; path = RTABMapApp/Libraries/lib/libcholmod.a; sourceTree = "<group>"; };
|
||||||
|
4E35255A2DE4C71000F39D8F /* libcxsparse.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcxsparse.a; path = RTABMapApp/Libraries/lib/libcxsparse.a; sourceTree = "<group>"; };
|
||||||
|
4E35255B2DE4C71000F39D8F /* libcolamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcolamd.a; path = RTABMapApp/Libraries/lib/libcolamd.a; sourceTree = "<group>"; };
|
||||||
|
4E35255C2DE4C71000F39D8F /* libcamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcamd.a; path = RTABMapApp/Libraries/lib/libcamd.a; sourceTree = "<group>"; };
|
||||||
|
4E35255D2DE4C71000F39D8F /* libccolamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libccolamd.a; path = RTABMapApp/Libraries/lib/libccolamd.a; sourceTree = "<group>"; };
|
||||||
|
4E3525622DE4C71C00F39D8F /* libsuitesparseconfig.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsuitesparseconfig.a; path = RTABMapApp/Libraries/lib/libsuitesparseconfig.a; sourceTree = "<group>"; };
|
||||||
|
4E3525632DE4C71C00F39D8F /* libspqr.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libspqr.a; path = RTABMapApp/Libraries/lib/libspqr.a; sourceTree = "<group>"; };
|
||||||
|
4E3525662DE4C72D00F39D8F /* libamd.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libamd.a; path = RTABMapApp/Libraries/lib/libamd.a; sourceTree = "<group>"; };
|
||||||
4E401BE825CC92C100240A56 /* ProgressionStatus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProgressionStatus.h; path = ../android/jni/ProgressionStatus.h; sourceTree = "<group>"; };
|
4E401BE825CC92C100240A56 /* ProgressionStatus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProgressionStatus.h; path = ../android/jni/ProgressionStatus.h; sourceTree = "<group>"; };
|
||||||
4EB1A66525A0D90B0043C7BF /* RTABMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTABMap.swift; path = RTABMapApp/RTABMap.swift; sourceTree = "<group>"; };
|
4EB1A66525A0D90B0043C7BF /* RTABMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTABMap.swift; path = RTABMapApp/RTABMap.swift; sourceTree = "<group>"; };
|
||||||
|
4ED73AD02D7FECF3007899C2 /* liblaszip.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblaszip.a; path = RTABMapApp/Libraries/lib/liblaszip.a; sourceTree = "<group>"; };
|
||||||
4EE015C2259A2AF0008CCE65 /* RTABMapApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RTABMapApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
4EE015C2259A2AF0008CCE65 /* RTABMapApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RTABMapApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
4EE016AF259BE441008CCE65 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ViewController.swift; path = RTABMapApp/ViewController.swift; sourceTree = "<group>"; };
|
4EE016AF259BE441008CCE65 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ViewController.swift; path = RTABMapApp/ViewController.swift; sourceTree = "<group>"; };
|
||||||
4EE016B0259BE441008CCE65 /* SceneDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SceneDelegate.swift; path = RTABMapApp/SceneDelegate.swift; sourceTree = "<group>"; };
|
4EE016B0259BE441008CCE65 /* SceneDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SceneDelegate.swift; path = RTABMapApp/SceneDelegate.swift; sourceTree = "<group>"; };
|
||||||
@@ -170,6 +196,7 @@
|
|||||||
4EE016C2259BE464008CCE65 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = RTABMapApp/Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
4EE016C2259BE464008CCE65 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = RTABMapApp/Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
4EE016C6259BE46F008CCE65 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = RTABMapApp/Assets.xcassets; sourceTree = "<group>"; };
|
4EE016C6259BE46F008CCE65 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = RTABMapApp/Assets.xcassets; sourceTree = "<group>"; };
|
||||||
4EE016E1259BE96A008CCE65 /* RTABMapApp-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "RTABMapApp-Bridging-Header.h"; path = "RTABMapApp/RTABMapApp-Bridging-Header.h"; sourceTree = "<group>"; };
|
4EE016E1259BE96A008CCE65 /* RTABMapApp-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "RTABMapApp-Bridging-Header.h"; path = "RTABMapApp/RTABMapApp-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
|
4EFAA9422CAE4E960055DA51 /* liblas.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblas.a; path = RTABMapApp/Libraries/lib/liblas.a; sourceTree = "<group>"; };
|
||||||
4EFD0B2B259D4DE900575D88 /* libboost_filesystem.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_filesystem.a; path = RTABMapApp/Libraries/lib/libboost_filesystem.a; sourceTree = "<group>"; };
|
4EFD0B2B259D4DE900575D88 /* libboost_filesystem.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_filesystem.a; path = RTABMapApp/Libraries/lib/libboost_filesystem.a; sourceTree = "<group>"; };
|
||||||
4EFD0B2C259D4DE900575D88 /* libboost_program_options.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_program_options.a; path = RTABMapApp/Libraries/lib/libboost_program_options.a; sourceTree = "<group>"; };
|
4EFD0B2C259D4DE900575D88 /* libboost_program_options.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_program_options.a; path = RTABMapApp/Libraries/lib/libboost_program_options.a; sourceTree = "<group>"; };
|
||||||
4EFD0B2D259D4DE900575D88 /* libboost_regex.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_regex.a; path = RTABMapApp/Libraries/lib/libboost_regex.a; sourceTree = "<group>"; };
|
4EFD0B2D259D4DE900575D88 /* libboost_regex.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libboost_regex.a; path = RTABMapApp/Libraries/lib/libboost_regex.a; sourceTree = "<group>"; };
|
||||||
@@ -343,108 +370,79 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
4EFD0F50259D67D900575D88 /* liblibwebp.a in Frameworks */,
|
|
||||||
4EFD0F51259D67D900575D88 /* liblibpng.a in Frameworks */,
|
|
||||||
4EFD0F52259D67D900575D88 /* liblibjpeg-turbo.a in Frameworks */,
|
|
||||||
4EFD0F53259D67D900575D88 /* libzlib.a in Frameworks */,
|
|
||||||
4EFD0F54259D67D900575D88 /* liblibprotobuf.a in Frameworks */,
|
|
||||||
4EFD0F3D259D5D5C00575D88 /* libsqlite3.tbd in Frameworks */,
|
|
||||||
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */,
|
|
||||||
4EFD0F34259D5C2900575D88 /* libflann_cpp_s.a in Frameworks */,
|
|
||||||
4EFD0F1D259D5C2200575D88 /* libg2o_solver_dense.a in Frameworks */,
|
|
||||||
4EFD0F1E259D5C2200575D88 /* libg2o_ext_csparse.a in Frameworks */,
|
|
||||||
4EFD0F1F259D5C2200575D88 /* libg2o_solver_slam2d_linear.a in Frameworks */,
|
|
||||||
4EFD0F20259D5C2200575D88 /* libg2o_types_slam2d.a in Frameworks */,
|
|
||||||
4EFD0F21259D5C2200575D88 /* libg2o_solver_pcg.a in Frameworks */,
|
|
||||||
4EFD0F22259D5C2200575D88 /* libg2o_types_data.a in Frameworks */,
|
|
||||||
4EFD0F23259D5C2200575D88 /* libg2o_core.a in Frameworks */,
|
|
||||||
4EFD0F24259D5C2200575D88 /* libgtsam_unstable.a in Frameworks */,
|
|
||||||
4EFD0F25259D5C2200575D88 /* libg2o_types_icp.a in Frameworks */,
|
|
||||||
4EFD0F26259D5C2200575D88 /* libg2o_solver_csparse.a in Frameworks */,
|
|
||||||
4EFD0F27259D5C2200575D88 /* libg2o_solver_structure_only.a in Frameworks */,
|
|
||||||
4EFD0F28259D5C2200575D88 /* libg2o_solver_eigen.a in Frameworks */,
|
|
||||||
4EFD0F29259D5C2200575D88 /* libg2o_csparse_extension.a in Frameworks */,
|
|
||||||
4EFD0F2A259D5C2200575D88 /* libg2o_stuff.a in Frameworks */,
|
|
||||||
4EFD0F2B259D5C2200575D88 /* libg2o_types_sba.a in Frameworks */,
|
|
||||||
4EFD0F2C259D5C2200575D88 /* libg2o_types_slam2d_addons.a in Frameworks */,
|
|
||||||
4EFD0F2D259D5C2200575D88 /* libg2o_types_slam3d_addons.a in Frameworks */,
|
|
||||||
4EFD0F2E259D5C2200575D88 /* libg2o_types_slam3d.a in Frameworks */,
|
|
||||||
4EFD0F2F259D5C2200575D88 /* libmetis.a in Frameworks */,
|
|
||||||
4EFD0F30259D5C2200575D88 /* libg2o_types_sclam2d.a in Frameworks */,
|
|
||||||
4EFD0F31259D5C2200575D88 /* libg2o_types_sim3.a in Frameworks */,
|
|
||||||
4EFD0F32259D5C2200575D88 /* libgtsam.a in Frameworks */,
|
|
||||||
4E8B155426273A580037FC53 /* Zip in Frameworks */,
|
4E8B155426273A580037FC53 /* Zip in Frameworks */,
|
||||||
4EFD0EDD259D5BFC00575D88 /* libopencv_video.a in Frameworks */,
|
4EFD0F36259D5C7300575D88 /* vtk.framework in Frameworks */,
|
||||||
4EFD0EDE259D5BFC00575D88 /* libopencv_aruco.a in Frameworks */,
|
|
||||||
4EFD0EDF259D5BFC00575D88 /* libopencv_photo.a in Frameworks */,
|
|
||||||
4EFD0EE0259D5BFC00575D88 /* libopencv_line_descriptor.a in Frameworks */,
|
|
||||||
4EFD0EE1259D5BFC00575D88 /* libopencv_features2d.a in Frameworks */,
|
|
||||||
4EFD0EE2259D5BFC00575D88 /* libopencv_bgsegm.a in Frameworks */,
|
|
||||||
4EFD0EE3259D5BFC00575D88 /* libopencv_dnn_objdetect.a in Frameworks */,
|
|
||||||
4EFD0EE4259D5BFC00575D88 /* libopencv_objdetect.a in Frameworks */,
|
|
||||||
4EFD0EE5259D5BFC00575D88 /* libopencv_flann.a in Frameworks */,
|
|
||||||
4EFD0EE6259D5BFC00575D88 /* libopencv_stitching.a in Frameworks */,
|
|
||||||
4EFD0EE7259D5BFC00575D88 /* libopencv_imgproc.a in Frameworks */,
|
|
||||||
4EFD0EE8259D5BFC00575D88 /* libopencv_ml.a in Frameworks */,
|
|
||||||
4EFD0EE9259D5BFC00575D88 /* libopencv_rgbd.a in Frameworks */,
|
|
||||||
4EFD0EEA259D5BFC00575D88 /* libopencv_xphoto.a in Frameworks */,
|
|
||||||
4EFD0EEB259D5BFC00575D88 /* libopencv_phase_unwrapping.a in Frameworks */,
|
|
||||||
4EFD0EEC259D5BFC00575D88 /* libopencv_optflow.a in Frameworks */,
|
|
||||||
4EFD0EED259D5BFC00575D88 /* libopencv_imgcodecs.a in Frameworks */,
|
|
||||||
4EFD0EEE259D5BFC00575D88 /* libopencv_fuzzy.a in Frameworks */,
|
|
||||||
4EFD0EEF259D5BFC00575D88 /* libopencv_dpm.a in Frameworks */,
|
|
||||||
4EFD0EF0259D5BFC00575D88 /* libopencv_plot.a in Frameworks */,
|
|
||||||
4EFD0EF1259D5BFC00575D88 /* libopencv_dnn.a in Frameworks */,
|
|
||||||
4EFD0EF2259D5BFC00575D88 /* libopencv_saliency.a in Frameworks */,
|
|
||||||
4EFD0EF3259D5BFC00575D88 /* libopencv_videoio.a in Frameworks */,
|
|
||||||
4EFD0EF4259D5BFC00575D88 /* libopencv_hfs.a in Frameworks */,
|
|
||||||
4EFD0EF5259D5BFC00575D88 /* libopencv_tracking.a in Frameworks */,
|
|
||||||
4EFD0EF6259D5BFC00575D88 /* libopencv_text.a in Frameworks */,
|
|
||||||
4EFD0EF7259D5BFC00575D88 /* libopencv_face.a in Frameworks */,
|
|
||||||
4EFD0EF8259D5BFC00575D88 /* libopencv_bioinspired.a in Frameworks */,
|
|
||||||
4EFD0EF9259D5BFC00575D88 /* libopencv_highgui.a in Frameworks */,
|
|
||||||
4EFD0EFA259D5BFC00575D88 /* libopencv_core.a in Frameworks */,
|
|
||||||
4EFD0EFB259D5BFC00575D88 /* libopencv_shape.a in Frameworks */,
|
|
||||||
4EFD0EFC259D5BFC00575D88 /* libopencv_datasets.a in Frameworks */,
|
|
||||||
4EFD0EFD259D5BFC00575D88 /* libopencv_img_hash.a in Frameworks */,
|
|
||||||
4EFD0EFE259D5BFC00575D88 /* libopencv_surface_matching.a in Frameworks */,
|
|
||||||
4EFD0EFF259D5BFC00575D88 /* libopencv_calib3d.a in Frameworks */,
|
|
||||||
4EFD0F00259D5BFC00575D88 /* libopencv_structured_light.a in Frameworks */,
|
|
||||||
4EFD0F01259D5BFC00575D88 /* libopencv_reg.a in Frameworks */,
|
|
||||||
4EFD0F02259D5BFC00575D88 /* libopencv_xfeatures2d.a in Frameworks */,
|
|
||||||
4EFD0F03259D5BFC00575D88 /* libopencv_videostab.a in Frameworks */,
|
|
||||||
4EFD0F04259D5BFC00575D88 /* libopencv_ccalib.a in Frameworks */,
|
|
||||||
4EFD0F05259D5BFC00575D88 /* libopencv_ximgproc.a in Frameworks */,
|
|
||||||
4EFD0EB1259D5BE500575D88 /* librtabmap_utilite.a in Frameworks */,
|
|
||||||
4EFD0EB2259D5BE500575D88 /* librtabmap_core.a in Frameworks */,
|
|
||||||
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */,
|
4EFD0EAB259D581800575D88 /* OpenGLES.framework in Frameworks */,
|
||||||
4EFD0B36259D4DE900575D88 /* libboost_filesystem.a in Frameworks */,
|
4E10D89C2DE409870015926D /* librtabmap_core.a in Frameworks */,
|
||||||
4EFD0B37259D4DE900575D88 /* libboost_program_options.a in Frameworks */,
|
4E10D89D2DE409870015926D /* librtabmap_utilite.a in Frameworks */,
|
||||||
4EFD0B38259D4DE900575D88 /* libboost_regex.a in Frameworks */,
|
4E10D89E2DE409A60015926D /* libopencv_xfeatures2d.a in Frameworks */,
|
||||||
4EFD0B39259D4DE900575D88 /* libboost_iostreams.a in Frameworks */,
|
4E10D89F2DE409B20015926D /* libopencv_video.a in Frameworks */,
|
||||||
4EFD0B3A259D4DE900575D88 /* libboost_date_time.a in Frameworks */,
|
4E10D8A02DE409BB0015926D /* libopencv_tracking.a in Frameworks */,
|
||||||
4EFD0B3B259D4DE900575D88 /* libboost_serialization.a in Frameworks */,
|
4E10D8A12DE409C00015926D /* libopencv_optflow.a in Frameworks */,
|
||||||
4EFD0B3C259D4DE900575D88 /* libboost_system.a in Frameworks */,
|
4E10D8A22DE409C70015926D /* libopencv_imgproc.a in Frameworks */,
|
||||||
4EFD0B3D259D4DE900575D88 /* libboost_signals.a in Frameworks */,
|
4E10D8A32DE409CA0015926D /* libopencv_features2d.a in Frameworks */,
|
||||||
4EFD0B3E259D4DE900575D88 /* libboost_thread.a in Frameworks */,
|
4E10D8A42DE409CE0015926D /* libopencv_core.a in Frameworks */,
|
||||||
4EFD0B3F259D4DE900575D88 /* libboost_timer.a in Frameworks */,
|
4E10D8A52DE409D10015926D /* libopencv_calib3d.a in Frameworks */,
|
||||||
4EFD0B40259D4DE900575D88 /* libboost_chrono.a in Frameworks */,
|
4E10D8A62DE409D50015926D /* libopencv_aruco.a in Frameworks */,
|
||||||
4EFD0B51259D4DF100575D88 /* libpcl_stereo.a in Frameworks */,
|
4E10D8A72DE409F40015926D /* libopencv_flann.a in Frameworks */,
|
||||||
4EFD0B52259D4DF100575D88 /* libpcl_registration.a in Frameworks */,
|
4E10D8A82DE40A1B0015926D /* libopencv_ximgproc.a in Frameworks */,
|
||||||
4EFD0B53259D4DF100575D88 /* libpcl_features.a in Frameworks */,
|
4E10D8A92DE40A3A0015926D /* libopencv_photo.a in Frameworks */,
|
||||||
4EFD0B54259D4DF100575D88 /* libpcl_filters.a in Frameworks */,
|
4E10D8AA2DE40A6C0015926D /* libopencv_objdetect.a in Frameworks */,
|
||||||
4EFD0B55259D4DF100575D88 /* libpcl_sample_consensus.a in Frameworks */,
|
4E10D8AB2DE40A8C0015926D /* libopencv_stitching.a in Frameworks */,
|
||||||
4EFD0B56259D4DF100575D88 /* libpcl_kdtree.a in Frameworks */,
|
4E10D8AC2DE40AA20015926D /* libopencv_imgcodecs.a in Frameworks */,
|
||||||
4EFD0B57259D4DF100575D88 /* libpcl_search.a in Frameworks */,
|
4E3525672DE4C72D00F39D8F /* libamd.a in Frameworks */,
|
||||||
4EFD0B58259D4DF100575D88 /* libpcl_surface.a in Frameworks */,
|
4E3525642DE4C71C00F39D8F /* libsuitesparseconfig.a in Frameworks */,
|
||||||
4EFD0B59259D4DF100575D88 /* libpcl_keypoints.a in Frameworks */,
|
4E3525652DE4C71C00F39D8F /* libspqr.a in Frameworks */,
|
||||||
4EFD0B5A259D4DF100575D88 /* libpcl_recognition.a in Frameworks */,
|
4E35255E2DE4C71000F39D8F /* libcxsparse.a in Frameworks */,
|
||||||
4EFD0B5B259D4DF100575D88 /* libpcl_octree.a in Frameworks */,
|
4E35255F2DE4C71000F39D8F /* libcolamd.a in Frameworks */,
|
||||||
4EFD0B5C259D4DF100575D88 /* libpcl_io.a in Frameworks */,
|
4E3525602DE4C71000F39D8F /* libcamd.a in Frameworks */,
|
||||||
4EFD0B5D259D4DF100575D88 /* libpcl_common.a in Frameworks */,
|
4E3525612DE4C71000F39D8F /* libccolamd.a in Frameworks */,
|
||||||
4EFD0B5E259D4DF100575D88 /* libpcl_io_ply.a in Frameworks */,
|
4E3525592DE4C6F600F39D8F /* libcholmod.a in Frameworks */,
|
||||||
4EFD0B5F259D4DF100575D88 /* libpcl_ml.a in Frameworks */,
|
4E10D8AD2DE40E990015926D /* libg2o_core.a in Frameworks */,
|
||||||
4EFD0B60259D4DF100575D88 /* libpcl_segmentation.a in Frameworks */,
|
4E3525572DE4C6E500F39D8F /* libg2o_solver_cholmod.a in Frameworks */,
|
||||||
|
4E3525542DE4C6E500F39D8F /* libg2o_csparse_extension.a in Frameworks */,
|
||||||
|
4E3525552DE4C6E500F39D8F /* libg2o_solver_csparse.a in Frameworks */,
|
||||||
|
4E10D8AE2DE40E990015926D /* libg2o_solver_dense.a in Frameworks */,
|
||||||
|
4E10D8AF2DE40E990015926D /* libg2o_solver_eigen.a in Frameworks */,
|
||||||
|
4E10D8B02DE40E990015926D /* libg2o_solver_pcg.a in Frameworks */,
|
||||||
|
4E10D8B12DE40E990015926D /* libg2o_solver_slam2d_linear.a in Frameworks */,
|
||||||
|
4E10D8B22DE40E990015926D /* libg2o_solver_structure_only.a in Frameworks */,
|
||||||
|
4E10D8B32DE40E990015926D /* libg2o_stuff.a in Frameworks */,
|
||||||
|
4E10D8B42DE40E990015926D /* libg2o_types_data.a in Frameworks */,
|
||||||
|
4E10D8B52DE40E990015926D /* libg2o_types_icp.a in Frameworks */,
|
||||||
|
4E10D8B62DE40E990015926D /* libg2o_types_sba.a in Frameworks */,
|
||||||
|
4E10D8B72DE40E990015926D /* libg2o_types_sclam2d.a in Frameworks */,
|
||||||
|
4E10D8B82DE40E990015926D /* libg2o_types_sim3.a in Frameworks */,
|
||||||
|
4E10D8B92DE40E990015926D /* libg2o_types_slam2d_addons.a in Frameworks */,
|
||||||
|
4E10D8BA2DE40E990015926D /* libg2o_types_slam2d.a in Frameworks */,
|
||||||
|
4E10D8BB2DE40E990015926D /* libg2o_types_slam3d_addons.a in Frameworks */,
|
||||||
|
4E10D8BC2DE40E990015926D /* libg2o_types_slam3d.a in Frameworks */,
|
||||||
|
4E10D8BD2DE40EC70015926D /* libpcl_common.a in Frameworks */,
|
||||||
|
4E10D8BE2DE40EC70015926D /* libpcl_features.a in Frameworks */,
|
||||||
|
4E10D8BF2DE40EC70015926D /* libpcl_filters.a in Frameworks */,
|
||||||
|
4E10D8C02DE40EC70015926D /* libpcl_io_ply.a in Frameworks */,
|
||||||
|
4E10D8C12DE40EC70015926D /* libpcl_io.a in Frameworks */,
|
||||||
|
4E10D8C22DE40EC70015926D /* libpcl_kdtree.a in Frameworks */,
|
||||||
|
4E10D8C32DE40EC70015926D /* libpcl_keypoints.a in Frameworks */,
|
||||||
|
4E10D8C42DE40EC70015926D /* libpcl_ml.a in Frameworks */,
|
||||||
|
4E10D8C52DE40EC70015926D /* libpcl_octree.a in Frameworks */,
|
||||||
|
4E10D8C62DE40EC70015926D /* libpcl_registration.a in Frameworks */,
|
||||||
|
4E10D8C72DE40EC70015926D /* libpcl_sample_consensus.a in Frameworks */,
|
||||||
|
4E10D8C82DE40EC70015926D /* libpcl_search.a in Frameworks */,
|
||||||
|
4E10D8C92DE40EC70015926D /* libpcl_segmentation.a in Frameworks */,
|
||||||
|
4E10D8CA2DE40EC70015926D /* libpcl_stereo.a in Frameworks */,
|
||||||
|
4E10D8CB2DE40EC70015926D /* libpcl_surface.a in Frameworks */,
|
||||||
|
4E10D8CC2DE40EE30015926D /* libgtsam_unstable.a in Frameworks */,
|
||||||
|
4E10D8CD2DE40EE30015926D /* libgtsam.a in Frameworks */,
|
||||||
|
4E10D8CE2DE40EE30015926D /* libmetis-gtsam.a in Frameworks */,
|
||||||
|
4E10D8CF2DE40EF90015926D /* libboost_serialization.a in Frameworks */,
|
||||||
|
4E10D8D02DE40F060015926D /* libboost_timer.a in Frameworks */,
|
||||||
|
4E10D8D42DE40F2A0015926D /* libboost_thread.a in Frameworks */,
|
||||||
|
4E10D8D12DE40F190015926D /* liblas_c.a in Frameworks */,
|
||||||
|
4E10D8D22DE40F190015926D /* liblas.a in Frameworks */,
|
||||||
|
4E10D8D32DE40F190015926D /* liblaszip.a in Frameworks */,
|
||||||
|
4E10D8E12DE4101B0015926D /* liblibjpeg-turbo.a in Frameworks */,
|
||||||
|
4E10D8E22DE4101B0015926D /* liblibpng.a in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -472,6 +470,7 @@
|
|||||||
4EE01634259BDCC7008CCE65 /* RTABMapApp */ = {
|
4EE01634259BDCC7008CCE65 /* RTABMapApp */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
44D4681D2D538A4100B094BA /* RTABMapApp.entitlements */,
|
||||||
4E20B24F266AB95600316EE6 /* Images.xcassets */,
|
4E20B24F266AB95600316EE6 /* Images.xcassets */,
|
||||||
4EFD0BB0259D503200575D88 /* NativeWrapper */,
|
4EFD0BB0259D503200575D88 /* NativeWrapper */,
|
||||||
4EFD0B62259D501E00575D88 /* tango-gl */,
|
4EFD0B62259D501E00575D88 /* tango-gl */,
|
||||||
@@ -493,6 +492,53 @@
|
|||||||
4EFD0B2A259D4DE900575D88 /* Frameworks */ = {
|
4EFD0B2A259D4DE900575D88 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
4E3525662DE4C72D00F39D8F /* libamd.a */,
|
||||||
|
4E3525632DE4C71C00F39D8F /* libspqr.a */,
|
||||||
|
4E3525622DE4C71C00F39D8F /* libsuitesparseconfig.a */,
|
||||||
|
4E35255C2DE4C71000F39D8F /* libcamd.a */,
|
||||||
|
4E35255D2DE4C71000F39D8F /* libccolamd.a */,
|
||||||
|
4E35255B2DE4C71000F39D8F /* libcolamd.a */,
|
||||||
|
4E35255A2DE4C71000F39D8F /* libcxsparse.a */,
|
||||||
|
4E3525582DE4C6F600F39D8F /* libcholmod.a */,
|
||||||
|
4E3525562DE4C6E500F39D8F /* libg2o_solver_cholmod.a */,
|
||||||
|
4E10D8DB2DE40FF60015926D /* libade.a */,
|
||||||
|
4E10D8DA2DE40FF60015926D /* libIlmImf.a */,
|
||||||
|
4E10D8DC2DE40FF60015926D /* liblibprotobuf.a */,
|
||||||
|
4E10D8D92DE40FF60015926D /* libzlib.a */,
|
||||||
|
4E10D8D72DE40FCA0015926D /* liblibpng.a */,
|
||||||
|
4E10D8D52DE40FBE0015926D /* liblibjpeg-turbo.a */,
|
||||||
|
4E10D8682DE408EE0015926D /* libboost_atomic.a */,
|
||||||
|
4E10D8732DE408EF0015926D /* libboost_charconv.a */,
|
||||||
|
4E10D8642DE408EE0015926D /* libboost_container.a */,
|
||||||
|
4E10D8762DE408EF0015926D /* libboost_contract.a */,
|
||||||
|
4E10D8652DE408EE0015926D /* libboost_graph.a */,
|
||||||
|
4E10D8662DE408EE0015926D /* libboost_json.a */,
|
||||||
|
4E10D86A2DE408EF0015926D /* libboost_locale.a */,
|
||||||
|
4E10D87B2DE408EF0015926D /* libboost_nowide.a */,
|
||||||
|
4E10D8792DE408EF0015926D /* libboost_prg_exec_monitor.a */,
|
||||||
|
4E10D8712DE408EF0015926D /* libboost_random.a */,
|
||||||
|
4E10D87A2DE408EF0015926D /* libboost_stacktrace_addr2line.a */,
|
||||||
|
4E10D8672DE408EE0015926D /* libboost_stacktrace_basic.a */,
|
||||||
|
4E10D8602DE408EE0015926D /* libboost_stacktrace_noop.a */,
|
||||||
|
4E10D87C2DE408EF0015926D /* libboost_test_exec_monitor.a */,
|
||||||
|
4E10D8742DE408EF0015926D /* libboost_type_erasure.a */,
|
||||||
|
4E10D8702DE408EF0015926D /* libboost_unit_test_framework.a */,
|
||||||
|
4E10D86F2DE408EF0015926D /* libboost_url.a */,
|
||||||
|
4E10D8722DE408EF0015926D /* libboost_wave.a */,
|
||||||
|
4E10D8612DE408EE0015926D /* libboost_wserialization.a */,
|
||||||
|
4E10D8752DE408EF0015926D /* liblas_c.a */,
|
||||||
|
4E10D86B2DE408EF0015926D /* liblz4.a */,
|
||||||
|
4E10D8622DE408EE0015926D /* libmetis-gtsam.a */,
|
||||||
|
4E10D86C2DE408EF0015926D /* libopencv_dnn_superres.a */,
|
||||||
|
4E10D8772DE408EF0015926D /* libopencv_gapi.a */,
|
||||||
|
4E10D8692DE408EE0015926D /* libopencv_intensity_transform.a */,
|
||||||
|
4E10D87D2DE408EF0015926D /* libopencv_mcc.a */,
|
||||||
|
4E10D86E2DE408EF0015926D /* libopencv_quality.a */,
|
||||||
|
4E10D86D2DE408EF0015926D /* libopencv_rapid.a */,
|
||||||
|
4E10D8782DE408EF0015926D /* libopencv_signal.a */,
|
||||||
|
4E10D8632DE408EE0015926D /* libopencv_wechat_qrcode.a */,
|
||||||
|
4ED73AD02D7FECF3007899C2 /* liblaszip.a */,
|
||||||
|
4EFAA9422CAE4E960055DA51 /* liblas.a */,
|
||||||
4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */,
|
4EFD0F4D259D67D900575D88 /* liblibjpeg-turbo.a */,
|
||||||
4EFD0F4C259D67D900575D88 /* liblibpng.a */,
|
4EFD0F4C259D67D900575D88 /* liblibpng.a */,
|
||||||
4EFD0F4F259D67D900575D88 /* liblibprotobuf.a */,
|
4EFD0F4F259D67D900575D88 /* liblibprotobuf.a */,
|
||||||
@@ -675,6 +721,12 @@
|
|||||||
4EFD0BB0259D503200575D88 /* NativeWrapper */ = {
|
4EFD0BB0259D503200575D88 /* NativeWrapper */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
4E1E9CF92D619025000CB881 /* text_atlas_png.h */,
|
||||||
|
4E1E9CF62D618079000CB881 /* quad_color.cpp */,
|
||||||
|
4E1E9CF32D618079000CB881 /* quad_color.h */,
|
||||||
|
4E1E9CF52D618079000CB881 /* text_drawable.cpp */,
|
||||||
|
4E1E9CF42D618079000CB881 /* text_drawable.h */,
|
||||||
|
4E1E9CF22D617D08000CB881 /* Measure.h */,
|
||||||
4EFD0F6E259F847300575D88 /* background_renderer.cc */,
|
4EFD0F6E259F847300575D88 /* background_renderer.cc */,
|
||||||
4EFD0F6F259F847300575D88 /* background_renderer.h */,
|
4EFD0F6F259F847300575D88 /* background_renderer.h */,
|
||||||
4EFD0F66259E38DE00575D88 /* NativeWrapper.cpp */,
|
4EFD0F66259E38DE00575D88 /* NativeWrapper.cpp */,
|
||||||
@@ -787,7 +839,7 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nversion=\"$MARKETING_VERSION\"\n/usr/libexec/PlistBuddy -c \"Set PreferenceSpecifiers:22:DefaultValue $version\" \"${SRCROOT}/Settings.bundle/Root.plist\"\n";
|
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\nversion=\"$MARKETING_VERSION\"\n/usr/libexec/PlistBuddy -c \"Set PreferenceSpecifiers:24:DefaultValue $version\" \"${SRCROOT}/Settings.bundle/Root.plist\"\n";
|
||||||
};
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
@@ -796,6 +848,8 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
4E1E9CF72D618E69000CB881 /* quad_color.cpp in Sources */,
|
||||||
|
4E1E9CF82D618E69000CB881 /* text_drawable.cpp in Sources */,
|
||||||
4EFD0F70259F847300575D88 /* background_renderer.cc in Sources */,
|
4EFD0F70259F847300575D88 /* background_renderer.cc in Sources */,
|
||||||
4EFD0BC0259D50A800575D88 /* scene.cpp in Sources */,
|
4EFD0BC0259D50A800575D88 /* scene.cpp in Sources */,
|
||||||
4E2C516825A63119005CEDBD /* VerticalScrollerView.swift in Sources */,
|
4E2C516825A63119005CEDBD /* VerticalScrollerView.swift in Sources */,
|
||||||
@@ -863,7 +917,7 @@
|
|||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
@@ -894,7 +948,7 @@
|
|||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
@@ -924,7 +978,7 @@
|
|||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
@@ -955,8 +1009,9 @@
|
|||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = "";
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
@@ -967,6 +1022,7 @@
|
|||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
VALIDATE_PRODUCT = YES;
|
VALIDATE_PRODUCT = YES;
|
||||||
@@ -980,6 +1036,7 @@
|
|||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_USE_OPTIMIZATION_PROFILE = NO;
|
CLANG_USE_OPTIMIZATION_PROFILE = NO;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = RTABMapApp/RTABMapApp.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
@@ -1006,8 +1063,9 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
||||||
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib/opencv4/3rdparty",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 0.20.19;
|
MARKETING_VERSION = 0.23.7;
|
||||||
OTHER_CFLAGS = "";
|
OTHER_CFLAGS = "";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -1019,11 +1077,12 @@
|
|||||||
SYSTEM_HEADER_SEARCH_PATHS = (
|
SYSTEM_HEADER_SEARCH_PATHS = (
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.11\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.15\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.20\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.23\"",
|
||||||
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
||||||
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
||||||
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/opencv4\"",
|
||||||
);
|
);
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VALIDATE_WORKSPACE = NO;
|
VALIDATE_WORKSPACE = NO;
|
||||||
@@ -1037,6 +1096,7 @@
|
|||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_USE_OPTIMIZATION_PROFILE = NO;
|
CLANG_USE_OPTIMIZATION_PROFILE = NO;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = RTABMapApp/RTABMapApp.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
@@ -1063,8 +1123,9 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib",
|
||||||
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/share/OpenCV/3rdparty/lib",
|
||||||
|
"$(PROJECT_DIR)/RTABMapApp/Libraries/lib/opencv4/3rdparty",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 0.20.19;
|
MARKETING_VERSION = 0.23.7;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
OTHER_CFLAGS = "";
|
OTHER_CFLAGS = "";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
PRODUCT_BUNDLE_IDENTIFIER = com.introlab.rtabmap;
|
||||||
@@ -1077,11 +1138,12 @@
|
|||||||
SYSTEM_HEADER_SEARCH_PATHS = (
|
SYSTEM_HEADER_SEARCH_PATHS = (
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/eigen3\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.11\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/pcl-1.15\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.20\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/rtabmap-0.23\"",
|
||||||
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
"\"$(SRCROOT)/../android/jni/tango-gl/include\"",
|
||||||
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
"\"$(SRCROOT)/../android/jni/third-party/include\"",
|
||||||
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
"\"$(SRCROOT)/RTABMapApp/Libraries/lib/vtk.framework/Headers\"",
|
||||||
|
"\"$(SRCROOT)/RTABMapApp/Libraries/include/opencv4\"",
|
||||||
);
|
);
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VALIDATE_WORKSPACE = NO;
|
VALIDATE_WORKSPACE = NO;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
</BuildActionEntries>
|
</BuildActionEntries>
|
||||||
</BuildAction>
|
</BuildAction>
|
||||||
<TestAction
|
<TestAction
|
||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Release"
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
@@ -51,6 +51,13 @@
|
|||||||
ReferencedContainer = "container:RTABMapApp.xcodeproj">
|
ReferencedContainer = "container:RTABMapApp.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
|
<EnvironmentVariables>
|
||||||
|
<EnvironmentVariable
|
||||||
|
key = "IDEPreferLogStreaming"
|
||||||
|
value = "YES"
|
||||||
|
isEnabled = "YES">
|
||||||
|
</EnvironmentVariable>
|
||||||
|
</EnvironmentVariables>
|
||||||
</LaunchAction>
|
</LaunchAction>
|
||||||
<ProfileAction
|
<ProfileAction
|
||||||
buildConfiguration = "Release"
|
buildConfiguration = "Release"
|
||||||
@@ -70,7 +77,7 @@
|
|||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
</ProfileAction>
|
</ProfileAction>
|
||||||
<AnalyzeAction
|
<AnalyzeAction
|
||||||
buildConfiguration = "Debug">
|
buildConfiguration = "Release">
|
||||||
</AnalyzeAction>
|
</AnalyzeAction>
|
||||||
<ArchiveAction
|
<ArchiveAction
|
||||||
buildConfiguration = "Release"
|
buildConfiguration = "Release"
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19455" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="zah-iI-EPt">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="zah-iI-EPt">
|
||||||
<device id="retina3_5" orientation="portrait" appearance="light"/>
|
<device id="retina6_12" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="iOS"/>
|
<deployment identifier="iOS"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19454"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
|
||||||
<capability name="Image references" minToolsVersion="12.0"/>
|
<capability name="Image references" minToolsVersion="12.0"/>
|
||||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
@@ -15,14 +15,14 @@
|
|||||||
<objects>
|
<objects>
|
||||||
<glkViewController preferredFramesPerSecond="30" id="zah-iI-EPt" customClass="ViewController" customModule="RTABMapApp" customModuleProvider="target" sceneMemberID="viewController">
|
<glkViewController preferredFramesPerSecond="30" id="zah-iI-EPt" customClass="ViewController" customModule="RTABMapApp" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<glkView key="view" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" drawableDepthFormat="24" enableSetNeedsDisplay="NO" id="sqF-4e-2HU">
|
<glkView key="view" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" drawableDepthFormat="24" enableSetNeedsDisplay="NO" id="sqF-4e-2HU">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
|
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="kPv-DO-hpd">
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="30" translatesAutoresizingMaskIntoConstraints="NO" id="kPv-DO-hpd">
|
||||||
<rect key="frame" x="250" y="180" width="60" height="120"/>
|
<rect key="frame" x="323" y="261" width="60" height="330"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mJN-Ru-yPg" userLabel="StopButton">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mJN-Ru-yPg" userLabel="StopButton">
|
||||||
<rect key="frame" x="0.0" y="0.5" width="60" height="59"/>
|
<rect key="frame" x="0.0" y="1" width="60" height="58.666666666666671"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="60" id="g9J-0P-CmQ"/>
|
<constraint firstAttribute="height" constant="60" id="g9J-0P-CmQ"/>
|
||||||
<constraint firstAttribute="width" constant="60" id="m06-eJ-dIn"/>
|
<constraint firstAttribute="width" constant="60" id="m06-eJ-dIn"/>
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="7Lv-u6-mGh" userLabel="RecordButton">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="7Lv-u6-mGh" userLabel="RecordButton">
|
||||||
<rect key="frame" x="0.0" y="60.5" width="60" height="59"/>
|
<rect key="frame" x="0.0" y="91" width="60" height="58.666666666666686"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="60" id="DQI-eQ-v3X"/>
|
<constraint firstAttribute="height" constant="60" id="DQI-eQ-v3X"/>
|
||||||
<constraint firstAttribute="width" constant="60" id="Oeu-YT-wMz"/>
|
<constraint firstAttribute="width" constant="60" id="Oeu-YT-wMz"/>
|
||||||
@@ -47,13 +47,39 @@
|
|||||||
<action selector="recordAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="dzY-yL-YBg"/>
|
<action selector="recordAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="dzY-yL-YBg"/>
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lFB-Lm-zFS" userLabel="AddMeasureButton">
|
||||||
|
<rect key="frame" x="0.0" y="181.33333333333334" width="60" height="57.999999999999972"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="60" id="Wtb-vg-lgB"/>
|
||||||
|
<constraint firstAttribute="height" constant="60" id="p0E-BN-poT"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="tintColor" systemColor="systemYellowColor"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" backgroundImage="plus.viewfinder" catalog="system"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="addMeasureAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="lUX-tm-SgY"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="c1k-0i-64A" userLabel="RemoveMeasureButton">
|
||||||
|
<rect key="frame" x="0.0" y="271" width="60" height="58.666666666666686"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="height" constant="60" id="0gd-nd-i5y"/>
|
||||||
|
<constraint firstAttribute="width" constant="60" id="mSi-rI-NoN"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" backgroundImage="minus.circle" catalog="system"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="removeMeasureAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="2RW-qr-kvb"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="ozY-dg-YOd">
|
<stackView opaque="NO" contentMode="scaleToFill" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="ozY-dg-YOd">
|
||||||
<rect key="frame" x="160" y="20" width="140" height="60"/>
|
<rect key="frame" x="233" y="79" width="140" height="60"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9kh-4C-KyP" userLabel="LibraryButton">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9kh-4C-KyP" userLabel="LibraryButton">
|
||||||
<rect key="frame" x="0.0" y="1" width="60" height="57.5"/>
|
<rect key="frame" x="0.0" y="1.6666666666666643" width="60" height="57"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" constant="60" id="Ekq-3J-kUL"/>
|
<constraint firstAttribute="width" constant="60" id="Ekq-3J-kUL"/>
|
||||||
<constraint firstAttribute="height" constant="60" id="fqe-e7-0uk"/>
|
<constraint firstAttribute="height" constant="60" id="fqe-e7-0uk"/>
|
||||||
@@ -67,7 +93,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="y53-OI-O76" userLabel="MenuButton">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="y53-OI-O76" userLabel="MenuButton">
|
||||||
<rect key="frame" x="80" y="0.5" width="60" height="59"/>
|
<rect key="frame" x="80" y="1" width="60" height="58.666666666666671"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="60" id="L5T-8h-ale"/>
|
<constraint firstAttribute="height" constant="60" id="L5T-8h-ale"/>
|
||||||
<constraint firstAttribute="width" constant="60" id="pLI-ns-KHQ"/>
|
<constraint firstAttribute="width" constant="60" id="pLI-ns-KHQ"/>
|
||||||
@@ -78,25 +104,13 @@
|
|||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KlF-4H-k6I">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KlF-4H-k6I">
|
||||||
<rect key="frame" x="16" y="20" width="31" height="14.5"/>
|
<rect key="frame" x="16" y="79" width="31" height="14.333333333333329"/>
|
||||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.29820365646258501" colorSpace="custom" customColorSpace="sRGB"/>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="12"/>
|
<fontDescription key="fontDescription" type="system" pointSize="12"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="773-n4-lob" userLabel="ViewButton">
|
|
||||||
<rect key="frame" x="248" y="417.5" width="52" height="40.5"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" constant="52" id="epT-x2-WRc"/>
|
|
||||||
<constraint firstAttribute="height" constant="44" id="wAe-I1-qhs"/>
|
|
||||||
</constraints>
|
|
||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<state key="normal" backgroundImage="eye" catalog="system">
|
|
||||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
</state>
|
|
||||||
</button>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="012-W3-dOS" userLabel="CloseVisualization">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="012-W3-dOS" userLabel="CloseVisualization">
|
||||||
<rect key="frame" x="75" y="434" width="170.5" height="22"/>
|
<rect key="frame" x="111.33333333333333" y="772" width="170.33333333333337" height="22"/>
|
||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<state key="normal" title="Close Visualization" image="xmark.square" catalog="system">
|
<state key="normal" title="Close Visualization" image="xmark.square" catalog="system">
|
||||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
@@ -106,7 +120,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9oq-op-NGV" userLabel="StopCamera">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9oq-op-NGV" userLabel="StopCamera">
|
||||||
<rect key="frame" x="98" y="433" width="124.5" height="22"/>
|
<rect key="frame" x="134.33333333333334" y="771" width="124.33333333333334" height="22"/>
|
||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<state key="normal" title="Stop Camera" image="xmark.square" catalog="system">
|
<state key="normal" title="Stop Camera" image="xmark.square" catalog="system">
|
||||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
@@ -116,9 +130,9 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Jj4-ow-MwD" userLabel="NewScanButtonLarge">
|
<button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Jj4-ow-MwD" userLabel="NewScanButtonLarge">
|
||||||
<rect key="frame" x="73.5" y="224" width="173" height="32"/>
|
<rect key="frame" x="86.333333333333329" y="407" width="220.66666666666669" height="38.333333333333314"/>
|
||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<state key="normal" title="Start the Camera">
|
<state key="normal" title="New Mapping Session">
|
||||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<imageReference key="image" image="plus.app" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="plus.app" catalog="system" symbolScale="large"/>
|
||||||
<preferredSymbolConfiguration key="preferredSymbolConfiguration" configurationType="font">
|
<preferredSymbolConfiguration key="preferredSymbolConfiguration" configurationType="font">
|
||||||
@@ -130,7 +144,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3Sc-lx-YKH">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3Sc-lx-YKH">
|
||||||
<rect key="frame" x="161" y="96" width="149" height="22"/>
|
<rect key="frame" x="234" y="155" width="149" height="23.666666666666657"/>
|
||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<state key="normal" title="Export OBJ-PLY" image="square.and.arrow.up" catalog="system"/>
|
<state key="normal" title="Export OBJ-PLY" image="square.and.arrow.up" catalog="system"/>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -138,7 +152,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<slider opaque="NO" contentMode="scaleToFill" placeholderIntrinsicWidth="114" placeholderIntrinsicHeight="30" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="80" minValue="0.0" maxValue="120" translatesAutoresizingMaskIntoConstraints="NO" id="30J-Tx-NRW" userLabel="OrthoClipDistanceSlider">
|
<slider opaque="NO" contentMode="scaleToFill" placeholderIntrinsicWidth="114" placeholderIntrinsicHeight="30" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="80" minValue="0.0" maxValue="120" translatesAutoresizingMaskIntoConstraints="NO" id="30J-Tx-NRW" userLabel="OrthoClipDistanceSlider">
|
||||||
<rect key="frame" x="-2" y="344" width="122" height="31"/>
|
<rect key="frame" x="-2" y="682" width="122" height="31"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" constant="118" id="dsv-im-K52"/>
|
<constraint firstAttribute="width" constant="118" id="dsv-im-K52"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
@@ -146,18 +160,8 @@
|
|||||||
<action selector="clipDistanceAction:" destination="zah-iI-EPt" eventType="valueChanged" id="iKj-nz-0KW"/>
|
<action selector="clipDistanceAction:" destination="zah-iI-EPt" eventType="valueChanged" id="iKj-nz-0KW"/>
|
||||||
</connections>
|
</connections>
|
||||||
</slider>
|
</slider>
|
||||||
<slider opaque="NO" contentMode="scaleToFill" placeholderIntrinsicWidth="114" placeholderIntrinsicHeight="30" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="90" minValue="0.0" maxValue="180" translatesAutoresizingMaskIntoConstraints="NO" id="Z1x-Af-hdf" userLabel="GridRotationSlider">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Toast Label" textAlignment="center" lineBreakMode="wordWrap" numberOfLines="4" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JMv-UE-cvK" userLabel="ToastLabel">
|
||||||
<rect key="frame" x="99" y="389" width="122" height="31"/>
|
<rect key="frame" x="51" y="637.33333333333337" width="291" height="20.333333333333371"/>
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" constant="118" id="KDl-lP-Jj7"/>
|
|
||||||
</constraints>
|
|
||||||
<connections>
|
|
||||||
<action selector="rotateGridAction:" destination="zah-iI-EPt" eventType="valueChanged" id="eiC-QR-TYH"/>
|
|
||||||
</connections>
|
|
||||||
</slider>
|
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Toast Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JMv-UE-cvK" userLabel="ToastLabel">
|
|
||||||
<rect key="frame" x="116.5" y="330" width="87.5" height="20.5"/>
|
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.3002232142857143" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<accessibility key="accessibilityConfiguration">
|
<accessibility key="accessibilityConfiguration">
|
||||||
<accessibilityTraits key="traits" staticText="YES" notEnabled="YES"/>
|
<accessibilityTraits key="traits" staticText="YES" notEnabled="YES"/>
|
||||||
</accessibility>
|
</accessibility>
|
||||||
@@ -165,29 +169,93 @@
|
|||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
|
<slider opaque="NO" contentMode="scaleToFill" placeholderIntrinsicWidth="114" placeholderIntrinsicHeight="30" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="90" minValue="0.0" maxValue="180" translatesAutoresizingMaskIntoConstraints="NO" id="Z1x-Af-hdf" userLabel="GridRotationSlider">
|
||||||
|
<rect key="frame" x="132" y="727" width="122" height="31"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="118" id="KDl-lP-Jj7"/>
|
||||||
|
</constraints>
|
||||||
|
<connections>
|
||||||
|
<action selector="rotateGridAction:" destination="zah-iI-EPt" eventType="valueChanged" id="eiC-QR-TYH"/>
|
||||||
|
</connections>
|
||||||
|
</slider>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aWA-YQ-w5B" userLabel="TeleportButton">
|
||||||
|
<rect key="frame" x="10" y="396.66666666666669" width="62.666666666666671" height="60"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="height" constant="60" id="fe3-pR-D97"/>
|
||||||
|
<constraint firstAttribute="width" constant="60" id="t1H-Yp-Ayy"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="tintColor" systemColor="systemGreenColor"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" backgroundImage="accessibility.badge.arrow.up.right" catalog="system"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="teleportButtonAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="acD-kc-XA8"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="773-n4-lob" userLabel="ViewButton">
|
||||||
|
<rect key="frame" x="321" y="756.33333333333337" width="52" height="40"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="52" id="epT-x2-WRc"/>
|
||||||
|
<constraint firstAttribute="height" constant="44" id="wAe-I1-qhs"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<state key="normal" backgroundImage="eye" catalog="system">
|
||||||
|
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</state>
|
||||||
|
</button>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Z7f-kc-Rob" userLabel="MeasuringModeButton">
|
||||||
|
<rect key="frame" x="293" y="687.33333333333337" width="80" height="32.333333333333371"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" secondItem="Z7f-kc-Rob" secondAttribute="height" multiplier="52:27" id="78b-kS-OdV"/>
|
||||||
|
<constraint firstAttribute="width" constant="80" id="PFZ-dH-x12"/>
|
||||||
|
</constraints>
|
||||||
|
<color key="tintColor" systemColor="systemYellowColor"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" backgroundImage="ruler" catalog="system"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="startMeasuring:" destination="zah-iI-EPt" eventType="touchUpInside" id="uAe-Qu-Wwb"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="wOV-tT-ZlN" userLabel="StopMeasuring">
|
||||||
|
<rect key="frame" x="123.33333333333333" y="771" width="146.33333333333343" height="22"/>
|
||||||
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<state key="normal" title="Stop Measuring" image="xmark.square" catalog="system">
|
||||||
|
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</state>
|
||||||
|
<connections>
|
||||||
|
<action selector="stopCameraAction:" destination="zah-iI-EPt" eventType="touchUpInside" id="UY3-Dh-T9g"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
</subviews>
|
</subviews>
|
||||||
<viewLayoutGuide key="safeArea" id="qAR-pI-uT2"/>
|
<viewLayoutGuide key="safeArea" id="qAR-pI-uT2"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="KlF-4H-k6I" firstAttribute="leading" secondItem="qAR-pI-uT2" secondAttribute="leading" constant="16" id="14l-HO-Yqo"/>
|
<constraint firstItem="KlF-4H-k6I" firstAttribute="leading" secondItem="qAR-pI-uT2" secondAttribute="leading" constant="16" id="14l-HO-Yqo"/>
|
||||||
<constraint firstItem="kPv-DO-hpd" firstAttribute="centerY" secondItem="sqF-4e-2HU" secondAttribute="centerY" id="4S8-5c-tBm"/>
|
<constraint firstItem="kPv-DO-hpd" firstAttribute="centerY" secondItem="sqF-4e-2HU" secondAttribute="centerY" id="4S8-5c-tBm"/>
|
||||||
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="773-n4-lob" secondAttribute="trailing" constant="20" id="6TZ-Iy-b1B"/>
|
||||||
|
<constraint firstItem="773-n4-lob" firstAttribute="top" secondItem="Z7f-kc-Rob" secondAttribute="bottom" constant="30" id="7cF-fT-hfI"/>
|
||||||
|
<constraint firstItem="JMv-UE-cvK" firstAttribute="leading" secondItem="sqF-4e-2HU" secondAttribute="leadingMargin" constant="35" id="Awg-pU-JkT"/>
|
||||||
<constraint firstItem="KlF-4H-k6I" firstAttribute="top" secondItem="qAR-pI-uT2" secondAttribute="top" constant="20" id="CS3-Rk-Wxs"/>
|
<constraint firstItem="KlF-4H-k6I" firstAttribute="top" secondItem="qAR-pI-uT2" secondAttribute="top" constant="20" id="CS3-Rk-Wxs"/>
|
||||||
<constraint firstItem="012-W3-dOS" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="IsC-yB-kNs"/>
|
<constraint firstItem="012-W3-dOS" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="IsC-yB-kNs"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="773-n4-lob" secondAttribute="trailing" constant="20" id="N8s-Yg-VsL"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="wOV-tT-ZlN" secondAttribute="bottom" constant="25" id="Kab-84-pPU"/>
|
||||||
<constraint firstItem="JMv-UE-cvK" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="NIf-UH-gZ7"/>
|
<constraint firstItem="JMv-UE-cvK" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="NIf-UH-gZ7"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="773-n4-lob" secondAttribute="bottom" constant="20" id="O9t-O0-69d"/>
|
|
||||||
<constraint firstItem="Jj4-ow-MwD" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="OLx-LR-8xj"/>
|
<constraint firstItem="Jj4-ow-MwD" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="OLx-LR-8xj"/>
|
||||||
|
<constraint firstItem="aWA-YQ-w5B" firstAttribute="leading" secondItem="sqF-4e-2HU" secondAttribute="leading" constant="10" id="Rlo-Ir-NqY"/>
|
||||||
<constraint firstItem="012-W3-dOS" firstAttribute="top" secondItem="Z1x-Af-hdf" secondAttribute="bottom" constant="15" id="RpS-k0-btM"/>
|
<constraint firstItem="012-W3-dOS" firstAttribute="top" secondItem="Z1x-Af-hdf" secondAttribute="bottom" constant="15" id="RpS-k0-btM"/>
|
||||||
<constraint firstItem="ozY-dg-YOd" firstAttribute="top" secondItem="qAR-pI-uT2" secondAttribute="top" constant="20" id="TFT-we-noh"/>
|
<constraint firstItem="ozY-dg-YOd" firstAttribute="top" secondItem="qAR-pI-uT2" secondAttribute="top" constant="20" id="TFT-we-noh"/>
|
||||||
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="Z7f-kc-Rob" secondAttribute="trailing" constant="20" id="Tbc-4P-ryD"/>
|
||||||
|
<constraint firstItem="aWA-YQ-w5B" firstAttribute="centerY" secondItem="sqF-4e-2HU" secondAttribute="centerY" id="YXX-yd-QGL"/>
|
||||||
|
<constraint firstAttribute="trailingMargin" secondItem="JMv-UE-cvK" secondAttribute="trailing" constant="35" id="Ya5-GD-1rM"/>
|
||||||
<constraint firstItem="30J-Tx-NRW" firstAttribute="leading" secondItem="sqF-4e-2HU" secondAttribute="leading" id="ZBG-GX-P1X"/>
|
<constraint firstItem="30J-Tx-NRW" firstAttribute="leading" secondItem="sqF-4e-2HU" secondAttribute="leading" id="ZBG-GX-P1X"/>
|
||||||
|
<constraint firstItem="wOV-tT-ZlN" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="aPp-NO-q0A"/>
|
||||||
<constraint firstItem="3Sc-lx-YKH" firstAttribute="top" secondItem="ozY-dg-YOd" secondAttribute="bottom" constant="16" id="abR-Tj-Nua"/>
|
<constraint firstItem="3Sc-lx-YKH" firstAttribute="top" secondItem="ozY-dg-YOd" secondAttribute="bottom" constant="16" id="abR-Tj-Nua"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="012-W3-dOS" secondAttribute="bottom" constant="24" id="dcl-mV-bH1"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="012-W3-dOS" secondAttribute="bottom" constant="24" id="dcl-mV-bH1"/>
|
||||||
<constraint firstItem="9oq-op-NGV" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="g5b-gW-Amg"/>
|
<constraint firstItem="9oq-op-NGV" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="g5b-gW-Amg"/>
|
||||||
<constraint firstItem="Z1x-Af-hdf" firstAttribute="centerX" secondItem="sqF-4e-2HU" secondAttribute="centerX" id="i2j-zQ-m1V"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="773-n4-lob" secondAttribute="bottom" constant="20" id="h09-nI-8yH"/>
|
||||||
<constraint firstItem="Z1x-Af-hdf" firstAttribute="top" secondItem="JMv-UE-cvK" secondAttribute="bottom" constant="38.5" id="icg-DR-ZpX"/>
|
<constraint firstItem="9oq-op-NGV" firstAttribute="top" secondItem="JMv-UE-cvK" secondAttribute="bottom" constant="113.33" id="icg-DR-ZpX"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="9oq-op-NGV" secondAttribute="bottom" constant="25" id="lFI-66-D3N"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="bottom" secondItem="9oq-op-NGV" secondAttribute="bottom" constant="25" id="lFI-66-D3N"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="kPv-DO-hpd" secondAttribute="trailing" constant="10" id="lFv-p3-LIS"/>
|
<constraint firstAttribute="trailing" secondItem="kPv-DO-hpd" secondAttribute="trailing" constant="10" id="lFv-p3-LIS"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="ozY-dg-YOd" secondAttribute="trailing" constant="20" id="ov4-d2-OMy"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="ozY-dg-YOd" secondAttribute="trailing" constant="20" id="ov4-d2-OMy"/>
|
||||||
<constraint firstItem="012-W3-dOS" firstAttribute="top" secondItem="30J-Tx-NRW" secondAttribute="bottom" constant="60" id="tbj-nG-nfI"/>
|
<constraint firstItem="012-W3-dOS" firstAttribute="top" secondItem="30J-Tx-NRW" secondAttribute="bottom" constant="60" id="tbj-nG-nfI"/>
|
||||||
|
<constraint firstItem="Z1x-Af-hdf" firstAttribute="leading" secondItem="30J-Tx-NRW" secondAttribute="trailing" constant="16" id="uMj-kM-hlH"/>
|
||||||
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="3Sc-lx-YKH" secondAttribute="trailing" constant="10" id="v2K-Dp-Kyn"/>
|
<constraint firstItem="qAR-pI-uT2" firstAttribute="trailing" secondItem="3Sc-lx-YKH" secondAttribute="trailing" constant="10" id="v2K-Dp-Kyn"/>
|
||||||
<constraint firstItem="Jj4-ow-MwD" firstAttribute="centerY" secondItem="sqF-4e-2HU" secondAttribute="centerY" id="vmc-4u-BtF"/>
|
<constraint firstItem="Jj4-ow-MwD" firstAttribute="centerY" secondItem="sqF-4e-2HU" secondAttribute="centerY" id="vmc-4u-BtF"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
@@ -196,42 +264,47 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</glkView>
|
</glkView>
|
||||||
<connections>
|
<connections>
|
||||||
|
<outlet property="addMeasureButton" destination="lFB-Lm-zFS" id="iOG-iO-mMQ"/>
|
||||||
<outlet property="closeVisualizationButton" destination="012-W3-dOS" id="qSV-q9-eOP"/>
|
<outlet property="closeVisualizationButton" destination="012-W3-dOS" id="qSV-q9-eOP"/>
|
||||||
<outlet property="exportOBJPLYButton" destination="3Sc-lx-YKH" id="ZvS-VQ-nsg"/>
|
<outlet property="exportOBJPLYButton" destination="3Sc-lx-YKH" id="ZvS-VQ-nsg"/>
|
||||||
<outlet property="libraryButton" destination="9kh-4C-KyP" id="Mvv-uQ-kmi"/>
|
<outlet property="libraryButton" destination="9kh-4C-KyP" id="Mvv-uQ-kmi"/>
|
||||||
|
<outlet property="measuringModeButton" destination="Z7f-kc-Rob" id="C0D-Pc-wdr"/>
|
||||||
<outlet property="menuButton" destination="y53-OI-O76" id="v3g-JB-SsY"/>
|
<outlet property="menuButton" destination="y53-OI-O76" id="v3g-JB-SsY"/>
|
||||||
<outlet property="newScanButtonLarge" destination="Jj4-ow-MwD" id="0Hv-3K-Xjh"/>
|
<outlet property="newScanButtonLarge" destination="Jj4-ow-MwD" id="0Hv-3K-Xjh"/>
|
||||||
<outlet property="orthoDistanceSlider" destination="30J-Tx-NRW" id="4J1-8u-tDY"/>
|
<outlet property="orthoDistanceSlider" destination="30J-Tx-NRW" id="4J1-8u-tDY"/>
|
||||||
<outlet property="orthoGridSlider" destination="Z1x-Af-hdf" id="Zsn-xz-jn0"/>
|
<outlet property="orthoGridSlider" destination="Z1x-Af-hdf" id="Zsn-xz-jn0"/>
|
||||||
<outlet property="recordButton" destination="7Lv-u6-mGh" id="xTu-EK-FH2"/>
|
<outlet property="recordButton" destination="7Lv-u6-mGh" id="xTu-EK-FH2"/>
|
||||||
|
<outlet property="removeMeasureButton" destination="c1k-0i-64A" id="E9z-yH-Vye"/>
|
||||||
<outlet property="statusLabel" destination="KlF-4H-k6I" id="NmA-K5-UOw"/>
|
<outlet property="statusLabel" destination="KlF-4H-k6I" id="NmA-K5-UOw"/>
|
||||||
<outlet property="stopButton" destination="mJN-Ru-yPg" id="DND-gz-jLg"/>
|
<outlet property="stopButton" destination="mJN-Ru-yPg" id="DND-gz-jLg"/>
|
||||||
<outlet property="stopCameraButton" destination="9oq-op-NGV" id="sxO-jc-luC"/>
|
<outlet property="stopCameraButton" destination="9oq-op-NGV" id="sxO-jc-luC"/>
|
||||||
|
<outlet property="stopMeasuringButton" destination="wOV-tT-ZlN" id="iK5-hG-9q0"/>
|
||||||
|
<outlet property="teleportButton" destination="aWA-YQ-w5B" id="KTE-cK-RCI"/>
|
||||||
<outlet property="toastLabel" destination="JMv-UE-cvK" id="9a7-QF-h02"/>
|
<outlet property="toastLabel" destination="JMv-UE-cvK" id="9a7-QF-h02"/>
|
||||||
<outlet property="viewButton" destination="773-n4-lob" id="deU-Na-mBk"/>
|
<outlet property="viewButton" destination="773-n4-lob" id="deU-Na-mBk"/>
|
||||||
</connections>
|
</connections>
|
||||||
</glkViewController>
|
</glkViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="plN-WG-seA" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="plN-WG-seA" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="-234.375" y="-586.25"/>
|
<point key="canvasLocation" x="-235.87786259541983" y="-586.61971830985919"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Unsupported View Controller-->
|
<!--Unsupported View Controller-->
|
||||||
<scene sceneID="sJB-xy-u63">
|
<scene sceneID="sJB-xy-u63">
|
||||||
<objects>
|
<objects>
|
||||||
<viewController storyboardIdentifier="unsupportedDeviceMessage" id="v3G-nW-gVc" userLabel="Unsupported View Controller" sceneMemberID="viewController">
|
<viewController storyboardIdentifier="unsupportedDeviceMessage" id="v3G-nW-gVc" userLabel="Unsupported View Controller" sceneMemberID="viewController">
|
||||||
<view key="view" contentMode="scaleToFill" id="hzM-1k-POo">
|
<view key="view" contentMode="scaleToFill" id="hzM-1k-POo">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
|
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Unsupported Device" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" enabled="NO" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kZt-ct-4KD">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Unsupported Device" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" enabled="NO" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kZt-ct-4KD">
|
||||||
<rect key="frame" x="21.5" y="165" width="277.5" height="30"/>
|
<rect key="frame" x="21" y="352.33333333333331" width="351.33333333333331" height="33.666666666666686"/>
|
||||||
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/>
|
<fontDescription key="fontDescription" style="UICTFontTextStyleTitle1"/>
|
||||||
<nil key="textColor"/>
|
<nil key="textColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" enabled="NO" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Js-Hw-3QU">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" enabled="NO" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Js-Hw-3QU">
|
||||||
<rect key="frame" x="21.5" y="203" width="277.5" height="74"/>
|
<rect key="frame" x="21" y="394" width="351.33333333333331" height="64.333333333333314"/>
|
||||||
<string key="text">This sample app requires a LiDAR-capable device, such as the second-generation iPad Pro 11-inch and fourth-generation iPad Pro 12.9-inch.</string>
|
<string key="text">This app requires a LiDAR-capable device, such as the second-generation iPad Pro 11-inch and fourth-generation iPad Pro 12.9-inch.</string>
|
||||||
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||||
<nil key="textColor"/>
|
<nil key="textColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
@@ -256,16 +329,26 @@
|
|||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<resources>
|
<resources>
|
||||||
<image name="ellipsis.circle" catalog="system" width="128" height="121"/>
|
<image name="accessibility.badge.arrow.up.right" catalog="system" width="128" height="114"/>
|
||||||
<image name="eye" catalog="system" width="128" height="81"/>
|
<image name="ellipsis.circle" catalog="system" width="128" height="123"/>
|
||||||
<image name="folder" catalog="system" width="128" height="97"/>
|
<image name="eye" catalog="system" width="128" height="79"/>
|
||||||
|
<image name="folder" catalog="system" width="128" height="96"/>
|
||||||
|
<image name="minus.circle" catalog="system" width="128" height="123"/>
|
||||||
<image name="plus.app" catalog="system" width="128" height="114"/>
|
<image name="plus.app" catalog="system" width="128" height="114"/>
|
||||||
<image name="record.circle" catalog="system" width="128" height="121"/>
|
<image name="plus.viewfinder" catalog="system" width="128" height="115"/>
|
||||||
<image name="square.and.arrow.up" catalog="system" width="115" height="128"/>
|
<image name="record.circle" catalog="system" width="128" height="123"/>
|
||||||
<image name="stop.circle" catalog="system" width="128" height="121"/>
|
<image name="ruler" catalog="system" width="128" height="57"/>
|
||||||
|
<image name="square.and.arrow.up" catalog="system" width="108" height="128"/>
|
||||||
|
<image name="stop.circle" catalog="system" width="128" height="123"/>
|
||||||
<image name="xmark.square" catalog="system" width="128" height="114"/>
|
<image name="xmark.square" catalog="system" width="128" height="114"/>
|
||||||
|
<systemColor name="systemGreenColor">
|
||||||
|
<color red="0.20392156859999999" green="0.78039215689999997" blue="0.34901960780000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
</systemColor>
|
||||||
<systemColor name="systemRedColor">
|
<systemColor name="systemRedColor">
|
||||||
<color red="1" green="0.23137254901960785" blue="0.18823529411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="1" green="0.23137254900000001" blue="0.18823529410000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
</systemColor>
|
||||||
|
<systemColor name="systemYellowColor">
|
||||||
|
<color red="1" green="0.80000000000000004" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
</resources>
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|||||||
@@ -55,11 +55,19 @@ class DatabaseView: UIView {
|
|||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
self.databaseURL = databaseURL
|
self.databaseURL = databaseURL
|
||||||
commonInit(databasePath: databaseURL.path)
|
commonInit(databasePath: databaseURL.path)
|
||||||
DispatchQueue.global().async {
|
if let image = ViewController.previewImages[databaseURL.path]
|
||||||
let downloadedImage = getPreviewImage(databasePath: databaseURL.path)
|
{
|
||||||
DispatchQueue.main.async {
|
self.coverImageView.image = image
|
||||||
self.coverImageView.image = downloadedImage
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
|
DispatchQueue.global().async {
|
||||||
|
let downloadedImage = getPreviewImage(databasePath: databaseURL.path)
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.coverImageView.image = downloadedImage
|
||||||
|
ViewController.previewImages[databaseURL.path] = downloadedImage
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,11 +33,12 @@ void setupCallbacksNative(const void *object, void * classPtr,
|
|||||||
int,
|
int,
|
||||||
float, float, float, float,
|
float, float, float, float,
|
||||||
int, int,
|
int, int,
|
||||||
float, float, float, float, float, float))
|
float, float, float, float, float, float),
|
||||||
|
void(*cameraInfoEventCallback)(void *, int, const char*, const char*))
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
{
|
{
|
||||||
native(object)->setupSwiftCallbacks(classPtr, progressCallback, initCallback, statsUpdatedCallback);
|
native(object)->setupSwiftCallbacks(classPtr, progressCallback, initCallback, statsUpdatedCallback, cameraInfoEventCallback);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -149,11 +150,12 @@ bool exportMeshNative(
|
|||||||
int optimizedMinClusterSize,
|
int optimizedMinClusterSize,
|
||||||
float optimizedMaxTextureDistance,
|
float optimizedMaxTextureDistance,
|
||||||
int optimizedMinTextureClusterSize,
|
int optimizedMinTextureClusterSize,
|
||||||
|
int textureVertexColorPolicy,
|
||||||
bool blockRendering)
|
bool blockRendering)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
{
|
{
|
||||||
return native(object)->exportMesh(cloudVoxelSize, regenerateCloud, meshing, textureSize, textureCount, normalK, optimized, optimizedVoxelSize, optimizedDepth, optimizedMaxPolygons, optimizedColorRadius, optimizedCleanWhitePolygons, optimizedMinClusterSize, optimizedMaxTextureDistance, optimizedMinTextureClusterSize, blockRendering);
|
return native(object)->exportMesh(cloudVoxelSize, regenerateCloud, meshing, textureSize, textureCount, normalK, optimized, optimizedVoxelSize, optimizedDepth, optimizedMaxPolygons, optimizedColorRadius, optimizedCleanWhitePolygons, optimizedMinClusterSize, optimizedMaxTextureDistance, optimizedMinTextureClusterSize, textureVertexColorPolicy, blockRendering);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -283,20 +285,6 @@ void setCameraNative(const void *object, int type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void postCameraPoseEventNative(const void *object,
|
|
||||||
float x, float y, float z, float qx, float qy, float qz, float qw)
|
|
||||||
{
|
|
||||||
if(object)
|
|
||||||
{
|
|
||||||
native(object)->postCameraPoseEvent(x,y,z,qx,qy,qz,qw,0.0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UERROR("object is null!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void postOdometryEventNative(const void *object,
|
void postOdometryEventNative(const void *object,
|
||||||
float x, float y, float z, float qx, float qy, float qz, float qw,
|
float x, float y, float z, float qx, float qy, float qz, float qw,
|
||||||
float fx, float fy, float cx, float cy,
|
float fx, float fy, float cx, float cy,
|
||||||
@@ -312,7 +300,7 @@ void postOdometryEventNative(const void *object,
|
|||||||
if(object)
|
if(object)
|
||||||
{
|
{
|
||||||
native(object)->postOdometryEvent(
|
native(object)->postOdometryEvent(
|
||||||
rtabmap::Transform(x,y,z,qx,qy,qz,qw),
|
(qx==0.0f && qy==0.0f && qz==0.0f && qw==0.0f)?rtabmap::Transform():rtabmap::Transform(x,y,z,qx,qy,qz,qw),
|
||||||
fx,fy,cx,cy, 0,0,0,0,
|
fx,fy,cx,cy, 0,0,0,0,
|
||||||
rtabmap::Transform(), rtabmap::Transform(),
|
rtabmap::Transform(), rtabmap::Transform(),
|
||||||
stamp, 0,
|
stamp, 0,
|
||||||
@@ -447,6 +435,13 @@ void setWireframeNative(const void *object, bool enabled)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
|
void setTextureColorSeamsHiddenNative(const void *object, bool hidden)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
native(object)->setTextureColorSeamsHidden(hidden);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
void setLocalizationModeNative(const void *object, bool enabled)
|
void setLocalizationModeNative(const void *object, bool enabled)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
@@ -454,6 +449,13 @@ void setLocalizationModeNative(const void *object, bool enabled)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
|
void setDataRecorderModeNative(const void *object, bool enabled)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
native(object)->setDataRecorderMode(enabled);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
void setTrajectoryModeNative(const void *object, bool enabled)
|
void setTrajectoryModeNative(const void *object, bool enabled)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
@@ -489,13 +491,6 @@ void setGridVisibleNative(const void *object, bool visible)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
void setRawScanSavedNative(const void *object, bool enabled)
|
|
||||||
{
|
|
||||||
if(object)
|
|
||||||
native(object)->setRawScanSaved(enabled);
|
|
||||||
else
|
|
||||||
UERROR("object is null!");
|
|
||||||
}
|
|
||||||
void setFullResolutionNative(const void *object, bool enabled)
|
void setFullResolutionNative(const void *object, bool enabled)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
@@ -510,6 +505,13 @@ void setSmoothingNative(const void *object, bool enabled)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
|
void setDepthBleedingErrorNative(const void *object, float value)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
native(object)->setDepthBleedingError(value);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
void setAppendModeNative(const void *object, bool enabled)
|
void setAppendModeNative(const void *object, bool enabled)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
@@ -517,6 +519,13 @@ void setAppendModeNative(const void *object, bool enabled)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
|
void setUpstreamRelocalizationAccThrNative(const void * object, float value)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
native(object)->setUpstreamRelocalizationAccThr(value);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
void setMaxCloudDepthNative(const void *object, float value)
|
void setMaxCloudDepthNative(const void *object, float value)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
@@ -594,6 +603,15 @@ void setDepthConfidenceNative(const void *object, int value)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setExportPointCloudFormatNative(const void *object, const char * format)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
native(object)->setExportPointCloudFormat(format);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
|
||||||
int setMappingParameterNative(const void *object, const char * key, const char * value)
|
int setMappingParameterNative(const void *object, const char * key, const char * value)
|
||||||
{
|
{
|
||||||
if(object)
|
if(object)
|
||||||
@@ -619,3 +637,53 @@ void addEnvSensorNative(const void *object, int type, float value)
|
|||||||
else
|
else
|
||||||
UERROR("object is null!");
|
UERROR("object is null!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void removeMeasureNative(const void *object)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->removeMeasure();
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void addMeasureNative(const void *object)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->addMeasureButtonClicked();
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void teleportNative(const void *object)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->teleportButtonClicked();
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void setMeasuringModeNative(const void *object, int mode)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->setMeasuringMode(mode);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void setMetricSystemNative(const void *object, bool enabled)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->setMetricSystem(enabled);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void setMeasuringTextSizeNative(const void *object, float size)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->setMeasuringTextSize(size);
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
void clearMeasuresNative(const void *object)
|
||||||
|
{
|
||||||
|
if(object)
|
||||||
|
return native(object)->clearMeasures();
|
||||||
|
else
|
||||||
|
UERROR("object is null!");
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ void setupCallbacksNative(const void *object, void * classPtr,
|
|||||||
int,
|
int,
|
||||||
float, float, float, float,
|
float, float, float, float,
|
||||||
int, int,
|
int, int,
|
||||||
float, float, float, float, float, float));
|
float, float, float, float, float, float),
|
||||||
|
void(*cameraInfoEventCallback)(void *, int, const char*, const char*));
|
||||||
void destroyNativeApplication(const void *object);
|
void destroyNativeApplication(const void *object);
|
||||||
void setScreenRotationNative(const void *object, int displayRotation);
|
void setScreenRotationNative(const void *object, int displayRotation);
|
||||||
int openDatabaseNative(const void *object, const char * databasePath, bool databaseInMemory, bool optimize, bool clearDatabase);
|
int openDatabaseNative(const void *object, const char * databasePath, bool databaseInMemory, bool optimize, bool clearDatabase);
|
||||||
@@ -54,6 +55,7 @@ bool exportMeshNative(
|
|||||||
int optimizedMinClusterSize,
|
int optimizedMinClusterSize,
|
||||||
float optimizedMaxTextureDistance,
|
float optimizedMaxTextureDistance,
|
||||||
int optimizedMinTextureClusterSize,
|
int optimizedMinTextureClusterSize,
|
||||||
|
int textureVertexColorPolicy,
|
||||||
bool blockRendering);
|
bool blockRendering);
|
||||||
bool postExportationNative(const void *object, bool visualize);
|
bool postExportationNative(const void *object, bool visualize);
|
||||||
bool writeExportedMeshNative(const void *object, const char * directory, const char * name);
|
bool writeExportedMeshNative(const void *object, const char * directory, const char * name);
|
||||||
@@ -66,8 +68,6 @@ int renderNative(const void *object);
|
|||||||
bool startCameraNative(const void *object);
|
bool startCameraNative(const void *object);
|
||||||
void stopCameraNative(const void *object);
|
void stopCameraNative(const void *object);
|
||||||
void setCameraNative(const void *object, int type);
|
void setCameraNative(const void *object, int type);
|
||||||
void postCameraPoseEventNative(const void *object,
|
|
||||||
float x, float y, float z, float qx, float qy, float qz, float qw);
|
|
||||||
void postOdometryEventNative(const void *object,
|
void postOdometryEventNative(const void *object,
|
||||||
float x, float y, float z, float qx, float qy, float qz, float qw,
|
float x, float y, float z, float qx, float qy, float qz, float qw,
|
||||||
float fx, float fy, float cx, float cy,
|
float fx, float fy, float cx, float cy,
|
||||||
@@ -91,16 +91,19 @@ void setGridRotationNative(const void *object, float value);
|
|||||||
void setLightingNative(const void *object, bool enabled);
|
void setLightingNative(const void *object, bool enabled);
|
||||||
void setBackfaceCullingNative(const void *object, bool enabled);
|
void setBackfaceCullingNative(const void *object, bool enabled);
|
||||||
void setWireframeNative(const void *object, bool enabled);
|
void setWireframeNative(const void *object, bool enabled);
|
||||||
|
void setTextureColorSeamsHiddenNative(const void *object, bool hidden);
|
||||||
void setLocalizationModeNative(const void *object, bool enabled);
|
void setLocalizationModeNative(const void *object, bool enabled);
|
||||||
|
void setDataRecorderModeNative(const void *object, bool enabled);
|
||||||
void setTrajectoryModeNative(const void *object, bool enabled);
|
void setTrajectoryModeNative(const void *object, bool enabled);
|
||||||
void setGraphOptimizationNative(const void *object, bool enabled);
|
void setGraphOptimizationNative(const void *object, bool enabled);
|
||||||
void setNodesFilteringNative(const void *object, bool enabled);
|
void setNodesFilteringNative(const void *object, bool enabled);
|
||||||
void setGraphVisibleNative(const void *object, bool visible);
|
void setGraphVisibleNative(const void *object, bool visible);
|
||||||
void setGridVisibleNative(const void *object, bool visible);
|
void setGridVisibleNative(const void *object, bool visible);
|
||||||
void setRawScanSavedNative(const void *object, bool enabled);
|
|
||||||
void setFullResolutionNative(const void *object, bool enabled);
|
void setFullResolutionNative(const void *object, bool enabled);
|
||||||
void setSmoothingNative(const void *object, bool enabled);
|
void setSmoothingNative(const void *object, bool enabled);
|
||||||
|
void setDepthBleedingErrorNative(const void *object, float value);
|
||||||
void setAppendModeNative(const void *object, bool enabled);
|
void setAppendModeNative(const void *object, bool enabled);
|
||||||
|
void setUpstreamRelocalizationAccThrNative(const void *object, float value);
|
||||||
void setMaxCloudDepthNative(const void *object, float value);
|
void setMaxCloudDepthNative(const void *object, float value);
|
||||||
void setMinCloudDepthNative(const void *object, float value);
|
void setMinCloudDepthNative(const void *object, float value);
|
||||||
void setCloudDensityLevelNative(const void *object, int value);
|
void setCloudDensityLevelNative(const void *object, int value);
|
||||||
@@ -112,8 +115,17 @@ void setMaxGainRadiusNative(const void *object, float value);
|
|||||||
void setRenderingTextureDecimationNative(const void *object, int value);
|
void setRenderingTextureDecimationNative(const void *object, int value);
|
||||||
void setBackgroundColorNative(const void *object, float gray);
|
void setBackgroundColorNative(const void *object, float gray);
|
||||||
void setDepthConfidenceNative(const void *object, int value);
|
void setDepthConfidenceNative(const void *object, int value);
|
||||||
|
void setExportPointCloudFormatNative(const void *object, const char * format);
|
||||||
int setMappingParameterNative(const void *object, const char * key, const char * value);
|
int setMappingParameterNative(const void *object, const char * key, const char * value);
|
||||||
|
|
||||||
|
void removeMeasureNative(const void *object);
|
||||||
|
void addMeasureNative(const void *object);
|
||||||
|
void teleportNative(const void *object);
|
||||||
|
void setMeasuringModeNative(const void *object, int mode);
|
||||||
|
void setMetricSystemNative(const void *object, bool enabled);
|
||||||
|
void setMeasuringTextSizeNative(const void *object, float size);
|
||||||
|
void clearMeasuresNative(const void *object);
|
||||||
|
|
||||||
typedef struct ImageNative
|
typedef struct ImageNative
|
||||||
{
|
{
|
||||||
const void * objectPtr;
|
const void * objectPtr;
|
||||||
|
|||||||
@@ -85,6 +85,25 @@ class RTABMap {
|
|||||||
|
|
||||||
observer.statsUpdated(mySelf, nodes: Int(nodes), words: Int(words), points: Int(points), polygons: Int(polygons), updateTime: updateTime, loopClosureId: Int(loopClosureId), highestHypId: Int(highestHypId), databaseMemoryUsed: Int(databaseMemoryUsed), inliers: Int(inliers), matches: Int(matches), featuresExtracted: Int(featuresExtracted), hypothesis: hypothesis, nodesDrawn: Int(nodesDrawn), fps: fps, rejected: Int(rejected), rehearsalValue: rehearsalValue, optimizationMaxError: optimizationMaxError, optimizationMaxErrorRatio: optimizationMaxErrorRatio, distanceTravelled: distanceTravelled, fastMovement: Int(fastMovement), landmarkDetected: Int(landmarkDetected), x: x, y: y, z: z, roll: roll, pitch: pitch, yaw: yaw)
|
observer.statsUpdated(mySelf, nodes: Int(nodes), words: Int(words), points: Int(points), polygons: Int(polygons), updateTime: updateTime, loopClosureId: Int(loopClosureId), highestHypId: Int(highestHypId), databaseMemoryUsed: Int(databaseMemoryUsed), inliers: Int(inliers), matches: Int(matches), featuresExtracted: Int(featuresExtracted), hypothesis: hypothesis, nodesDrawn: Int(nodesDrawn), fps: fps, rejected: Int(rejected), rehearsalValue: rehearsalValue, optimizationMaxError: optimizationMaxError, optimizationMaxErrorRatio: optimizationMaxErrorRatio, distanceTravelled: distanceTravelled, fastMovement: Int(fastMovement), landmarkDetected: Int(landmarkDetected), x: x, y: y, z: z, roll: roll, pitch: pitch, yaw: yaw)
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
//cameraInfoEventCallback
|
||||||
|
{(observer, type, key, value) -> Void in
|
||||||
|
// Extract pointer to `self` from void pointer:
|
||||||
|
let mySelf = Unmanaged<RTABMap>.fromOpaque(observer!).takeUnretainedValue()
|
||||||
|
// Call instance method:
|
||||||
|
//mySelf.TestMethod();
|
||||||
|
for (id, observation) in mySelf.observations {
|
||||||
|
// If the observer is no longer in memory, we
|
||||||
|
// can clean up the observation for its ID
|
||||||
|
guard let observer = observation.observer else {
|
||||||
|
mySelf.observations.removeValue(forKey: id)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
let strKey = String(cString: key!)
|
||||||
|
let strValue = String(cString: value!)
|
||||||
|
observer.cameraInfoEventReceived(mySelf, type: Int(type), key: strKey, value: strValue)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,6 +152,27 @@ class RTABMap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func removeMeasure() {
|
||||||
|
removeMeasureNative(native_rtabmap)
|
||||||
|
}
|
||||||
|
func addMeasureButtonClicked() {
|
||||||
|
addMeasureNative(native_rtabmap)
|
||||||
|
}
|
||||||
|
func teleportButtonClicked() {
|
||||||
|
teleportNative(native_rtabmap)
|
||||||
|
}
|
||||||
|
func setMeasuringMode(_ mode: Int) {
|
||||||
|
setMeasuringModeNative(native_rtabmap, Int32(mode))
|
||||||
|
}
|
||||||
|
func setMetricSystem(_ enabled: Bool) {
|
||||||
|
setMetricSystemNative(native_rtabmap, enabled)
|
||||||
|
}
|
||||||
|
func setMeasuringTextSize(_ size: Float32) {
|
||||||
|
setMeasuringTextSizeNative(native_rtabmap, size)
|
||||||
|
}
|
||||||
|
func clearMeasures() {
|
||||||
|
clearMeasuresNative(native_rtabmap)
|
||||||
|
}
|
||||||
func cancelProcessing() {
|
func cancelProcessing() {
|
||||||
cancelProcessingNative(native_rtabmap);
|
cancelProcessingNative(native_rtabmap);
|
||||||
}
|
}
|
||||||
@@ -157,6 +197,7 @@ class RTABMap {
|
|||||||
optimizedMinClusterSize: Int,
|
optimizedMinClusterSize: Int,
|
||||||
optimizedMaxTextureDistance: Float,
|
optimizedMaxTextureDistance: Float,
|
||||||
optimizedMinTextureClusterSize: Int,
|
optimizedMinTextureClusterSize: Int,
|
||||||
|
textureVertexColorPolicy: Int,
|
||||||
blockRendering: Bool) -> Bool
|
blockRendering: Bool) -> Bool
|
||||||
{
|
{
|
||||||
return exportMeshNative(native_rtabmap,
|
return exportMeshNative(native_rtabmap,
|
||||||
@@ -175,6 +216,7 @@ class RTABMap {
|
|||||||
Int32(optimizedMinClusterSize),
|
Int32(optimizedMinClusterSize),
|
||||||
optimizedMaxTextureDistance,
|
optimizedMaxTextureDistance,
|
||||||
Int32(optimizedMinTextureClusterSize),
|
Int32(optimizedMinTextureClusterSize),
|
||||||
|
Int32(textureVertexColorPolicy),
|
||||||
blockRendering)
|
blockRendering)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,7 +246,7 @@ class RTABMap {
|
|||||||
return Int(renderNative(native_rtabmap))
|
return Int(renderNative(native_rtabmap))
|
||||||
}
|
}
|
||||||
|
|
||||||
func startCamera() -> Bool {
|
func startCamera(imageOverlayInFirstPerson: Bool = true) -> Bool {
|
||||||
return startCameraNative(native_rtabmap)
|
return startCameraNative(native_rtabmap)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,20 +258,6 @@ class RTABMap {
|
|||||||
setCameraNative(native_rtabmap, Int32(type))
|
setCameraNative(native_rtabmap, Int32(type))
|
||||||
}
|
}
|
||||||
|
|
||||||
func postCameraPoseEvent(pose: simd_float4x4) {
|
|
||||||
let rotation = GLKMatrix3(
|
|
||||||
m: (pose[0,0], pose[0,1], pose[0,2],
|
|
||||||
pose[1,0], pose[1,1], pose[1,2],
|
|
||||||
pose[2,0], pose[2,1], pose[2,2]))
|
|
||||||
let quat = GLKQuaternionMakeWithMatrix3(rotation)
|
|
||||||
postCameraPoseEventNative(native_rtabmap, pose[3,0], pose[3,1], pose[3,2], quat.x, quat.y, quat.z, quat.w)
|
|
||||||
}
|
|
||||||
|
|
||||||
func notifyLost() {
|
|
||||||
// a null transform will make rtabmap creating a new session
|
|
||||||
postCameraPoseEventNative(native_rtabmap, 0,0,0,0,0,0,0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func postOdometryEvent(frame: ARFrame, orientation: UIInterfaceOrientation, viewport: CGSize) {
|
func postOdometryEvent(frame: ARFrame, orientation: UIInterfaceOrientation, viewport: CGSize) {
|
||||||
let pose = frame.camera.transform // ViewMatrix
|
let pose = frame.camera.transform // ViewMatrix
|
||||||
let rotation = GLKMatrix3(
|
let rotation = GLKMatrix3(
|
||||||
@@ -239,8 +267,6 @@ class RTABMap {
|
|||||||
|
|
||||||
let quat = GLKQuaternionMakeWithMatrix3(rotation)
|
let quat = GLKQuaternionMakeWithMatrix3(rotation)
|
||||||
|
|
||||||
postCameraPoseEventNative(native_rtabmap, pose[3,0], pose[3,1], pose[3,2], quat.x, quat.y, quat.z, quat.w)
|
|
||||||
|
|
||||||
let confMap = frame.sceneDepth?.confidenceMap
|
let confMap = frame.sceneDepth?.confidenceMap
|
||||||
let depthMap = frame.sceneDepth?.depthMap
|
let depthMap = frame.sceneDepth?.depthMap
|
||||||
let points = frame.rawFeaturePoints?.points
|
let points = frame.rawFeaturePoints?.points
|
||||||
@@ -314,8 +340,21 @@ class RTABMap {
|
|||||||
addEnvSensor(type: 4, value: Float(frame.lightEstimate!.ambientIntensity))
|
addEnvSensor(type: 4, value: Float(frame.lightEstimate!.ambientIntensity))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var lost = false
|
||||||
|
switch frame.camera.trackingState {
|
||||||
|
case .normal:
|
||||||
|
lost = false
|
||||||
|
case .limited(.excessiveMotion):
|
||||||
|
lost = false
|
||||||
|
case .limited(.insufficientFeatures):
|
||||||
|
lost = false
|
||||||
|
default:
|
||||||
|
lost = true
|
||||||
|
}
|
||||||
|
// Notify lost with pose=null
|
||||||
|
|
||||||
postOdometryEventNative(native_rtabmap,
|
postOdometryEventNative(native_rtabmap,
|
||||||
pose[3,0], pose[3,1], pose[3,2], quat.x, quat.y, quat.z, quat.w,
|
!lost ? pose[3,0]:0, !lost ? pose[3,1]:0, !lost ? pose[3,2]:0, !lost ? quat.x:0, !lost ? quat.y:0, !lost ? quat.z:0, !lost ? quat.w:0,
|
||||||
frame.camera.intrinsics[0,0], // fx
|
frame.camera.intrinsics[0,0], // fx
|
||||||
frame.camera.intrinsics[1,1], // fy
|
frame.camera.intrinsics[1,1], // fy
|
||||||
frame.camera.intrinsics[2,0], // cx
|
frame.camera.intrinsics[2,0], // cx
|
||||||
@@ -387,11 +426,14 @@ class RTABMap {
|
|||||||
func setWireframe(enabled: Bool) {
|
func setWireframe(enabled: Bool) {
|
||||||
setWireframeNative(native_rtabmap, enabled)
|
setWireframeNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
|
func setTextureColorSeamsHidden(hidden: Bool) {
|
||||||
|
setTextureColorSeamsHiddenNative(native_rtabmap, hidden)
|
||||||
|
}
|
||||||
func setLocalizationMode(enabled: Bool) {
|
func setLocalizationMode(enabled: Bool) {
|
||||||
setLocalizationModeNative(native_rtabmap, enabled)
|
setLocalizationModeNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
func setTrajectoryMode(enabled: Bool) {
|
func setDataRecorderMode(enabled: Bool) {
|
||||||
setTrajectoryModeNative(native_rtabmap, enabled)
|
setDataRecorderModeNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
func setGraphOptimization(enabled: Bool) {
|
func setGraphOptimization(enabled: Bool) {
|
||||||
setGraphOptimizationNative(native_rtabmap, enabled)
|
setGraphOptimizationNative(native_rtabmap, enabled)
|
||||||
@@ -405,18 +447,21 @@ class RTABMap {
|
|||||||
func setGridVisible(visible: Bool) {
|
func setGridVisible(visible: Bool) {
|
||||||
setGridVisibleNative(native_rtabmap, visible)
|
setGridVisibleNative(native_rtabmap, visible)
|
||||||
}
|
}
|
||||||
func setRawScanSaved(enabled: Bool) {
|
|
||||||
setRawScanSavedNative(native_rtabmap, enabled)
|
|
||||||
}
|
|
||||||
func setFullResolution(enabled: Bool) {
|
func setFullResolution(enabled: Bool) {
|
||||||
setFullResolutionNative(native_rtabmap, enabled)
|
setFullResolutionNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
func setSmoothing(enabled: Bool) {
|
func setSmoothing(enabled: Bool) {
|
||||||
setSmoothingNative(native_rtabmap, enabled)
|
setSmoothingNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
|
func setDepthBleedingError(value: Float) {
|
||||||
|
setDepthBleedingErrorNative(native_rtabmap, value)
|
||||||
|
}
|
||||||
func setAppendMode(enabled: Bool) {
|
func setAppendMode(enabled: Bool) {
|
||||||
setAppendModeNative(native_rtabmap, enabled)
|
setAppendModeNative(native_rtabmap, enabled)
|
||||||
}
|
}
|
||||||
|
func setUpstreamRelocalizationAccThr(value: Float) {
|
||||||
|
setUpstreamRelocalizationAccThrNative(native_rtabmap, value)
|
||||||
|
}
|
||||||
func setMaxCloudDepth(value: Float) {
|
func setMaxCloudDepth(value: Float) {
|
||||||
setMaxCloudDepthNative(native_rtabmap, value)
|
setMaxCloudDepthNative(native_rtabmap, value)
|
||||||
}
|
}
|
||||||
@@ -450,6 +495,11 @@ class RTABMap {
|
|||||||
func setDepthConfidence(value: Int) {
|
func setDepthConfidence(value: Int) {
|
||||||
setDepthConfidenceNative(native_rtabmap, Int32(value))
|
setDepthConfidenceNative(native_rtabmap, Int32(value))
|
||||||
}
|
}
|
||||||
|
func setExportPointCloudFormat(format: String) {
|
||||||
|
format.utf8CString.withUnsafeBufferPointer { bufferFormat in
|
||||||
|
return setExportPointCloudFormatNative(native_rtabmap, bufferFormat.baseAddress)
|
||||||
|
}
|
||||||
|
}
|
||||||
func setMappingParameter(key: String, value: String) {
|
func setMappingParameter(key: String, value: String) {
|
||||||
key.utf8CString.withUnsafeBufferPointer { bufferKey in
|
key.utf8CString.withUnsafeBufferPointer { bufferKey in
|
||||||
value.utf8CString.withUnsafeBufferPointer { bufferValue in
|
value.utf8CString.withUnsafeBufferPointer { bufferValue in
|
||||||
@@ -526,6 +576,7 @@ protocol RTABMapObserver: class {
|
|||||||
roll: Float,
|
roll: Float,
|
||||||
pitch: Float,
|
pitch: Float,
|
||||||
yaw: Float)
|
yaw: Float)
|
||||||
|
func cameraInfoEventReceived(_ rtabmap: RTABMap, type: Int, key: String, value: String)
|
||||||
}
|
}
|
||||||
|
|
||||||
extension String {
|
extension String {
|
||||||
|
|||||||
8
app/ios/RTABMapApp/RTABMapApp.entitlements
Normal file
8
app/ios/RTABMapApp/RTABMapApp.entitlements
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>com.apple.developer.kernel.increased-memory-limit</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -2,19 +2,15 @@
|
|||||||
|
|
||||||
set -euxo pipefail
|
set -euxo pipefail
|
||||||
|
|
||||||
# Tested on Apple Silicon Mac, with cmake 3.19.2.
|
# Tested on Apple Silicon Mac, with cmake 4.0.2, XCode 16.3.
|
||||||
|
|
||||||
mkdir Libraries
|
mkdir -p Libraries
|
||||||
cd Libraries
|
cd Libraries
|
||||||
pwd=$(pwd)
|
pwd=$(pwd)
|
||||||
prefix=$pwd
|
prefix=$pwd
|
||||||
sysroot=iphoneos
|
sysroot=iphoneos
|
||||||
#sysroot=iphonesimulator
|
#sysroot=iphonesimulator
|
||||||
|
|
||||||
|
|
||||||
# Install directory for all dependencies
|
|
||||||
mkdir -p $prefix
|
|
||||||
|
|
||||||
# openmp
|
# openmp
|
||||||
# based on https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/libomp.rb
|
# based on https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/libomp.rb
|
||||||
#curl -L https://github.com/llvm/llvm-project/releases/download/llvmorg-11.1.0/openmp-11.1.0.src.tar.xz -o openmp-11.1.0.src.tar.xz
|
#curl -L https://github.com/llvm/llvm-project/releases/download/llvmorg-11.1.0/openmp-11.1.0.src.tar.xz -o openmp-11.1.0.src.tar.xz
|
||||||
@@ -24,139 +20,286 @@ mkdir -p $prefix
|
|||||||
#patch -p1 < arm.patch
|
#patch -p1 < arm.patch
|
||||||
#mkdir build
|
#mkdir build
|
||||||
#cd build
|
#cd build
|
||||||
#cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_C_FLAGS=-fembed-bitcode -DCMAKE_CXX_FLAGS=-fembed-bitcode -DCMAKE_INSTALL_PREFIX=$prefix -DLIBOMP_INSTALL_ALIASES=OFF -DLIBOMP_ENABLE_SHARED=OFF ..
|
#cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DLIBOMP_INSTALL_ALIASES=OFF -DLIBOMP_ENABLE_SHARED=OFF ..
|
||||||
#cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
#cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
#cp runtime/src/Release-iphoneos/libomp.a runtime/src/.
|
#cp runtime/src/Release-iphoneos/libomp.a runtime/src/.
|
||||||
#cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
#cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
|
||||||
# Boost
|
# Boost
|
||||||
echo "wget boost..."
|
if [ ! -e $prefix/include/boost ]
|
||||||
curl -L https://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz -o boost_1_59_0.tar.gz
|
then
|
||||||
tar -xzf boost_1_59_0.tar.gz
|
if [ ! -e boost-1.88.0 ]
|
||||||
cd boost_1_59_0
|
then
|
||||||
curl -L https://gist.github.com/matlabbe/0bce8feeb73a499a76afbbcc5c687221/raw/489ff2869eccd6f8d03ffb9090ef839108762741/BoostConfig.cmake.in -o BoostConfig.cmake.in
|
echo "wget boost..."
|
||||||
curl -L https://gist.github.com/matlabbe/0bce8feeb73a499a76afbbcc5c687221/raw/b07fe7d4e5dfe5f1d110c733e5cf660d79a26378/CMakeLists.txt -o CMakeLists.txt
|
curl -L https://github.com/boostorg/boost/releases/download/boost-1.88.0/boost-1.88.0-cmake.tar.gz -o boost-1.88.0-cmake.tar.gz
|
||||||
mkdir build
|
tar -xzf boost-1.88.0-cmake.tar.gz
|
||||||
|
fi
|
||||||
|
cd boost-1.88.0
|
||||||
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_C_FLAGS=-fembed-bitcode -DCMAKE_CXX_FLAGS=-fembed-bitcode -DCMAKE_INSTALL_PREFIX=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBOOST_INCOMPATIBLE_LIBRARIES="process;context;coroutine;fiber;fiber_numa;log_setup;log;cobalt" -DBOOST_IOSTREAMS_ENABLE_ZLIB=OFF -DBOOST_IOSTREAMS_ENABLE_BZIP2=OFF ..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -r boost_1_59_0.tar.gz boost_1_59_0
|
#rm -r boost-1.88.0-cmake.tar.gz boost-1.88.0
|
||||||
|
fi
|
||||||
|
|
||||||
# eigen
|
# eigen
|
||||||
echo "wget eigen..."
|
if [ ! -e $prefix/include/eigen3 ]
|
||||||
curl -L https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz -o 3.3.9.tar.gz
|
then
|
||||||
tar -xzf 3.3.9.tar.gz
|
if [ ! -e eigen-3.4.0 ]
|
||||||
cd eigen-3.3.9
|
then
|
||||||
mkdir build
|
echo "wget eigen..."
|
||||||
|
curl -L https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz -o 3.4.0.tar.gz
|
||||||
|
tar -xzf 3.4.0.tar.gz
|
||||||
|
fi
|
||||||
|
cd eigen-3.4.0
|
||||||
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_C_FLAGS=-fembed-bitcode -DCMAKE_CXX_FLAGS=-fembed-bitcode -DCMAKE_INSTALL_PREFIX=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix ..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -r 3.3.9.tar.gz eigen-3.3.9
|
#rm -r 3.4.0.tar.gz eigen-3.4.0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# lz4 (required by flann)
|
||||||
|
if [ ! -e $prefix/include/lz4.h ]
|
||||||
|
then
|
||||||
|
if [ ! -e lz4 ]
|
||||||
|
then
|
||||||
|
echo "wget lz4..."
|
||||||
|
git clone https://github.com/lz4/lz4.git -b v1.10.0
|
||||||
|
fi
|
||||||
|
cd lz4
|
||||||
|
if [ ! -e LZ4Config.cmake.in ]
|
||||||
|
then
|
||||||
|
curl -L https://gist.githubusercontent.com/matlabbe/abd0242305c29495bbba26065269daf2/raw/ad0b1865c02e61449f58358fdc4ddbed3cb5fb87/LZ4Config.cmake.in -o LZ4Config.cmake.in
|
||||||
|
fi
|
||||||
|
if [ ! -e CMakeLists.txt ]
|
||||||
|
then
|
||||||
|
curl -L https://gist.githubusercontent.com/matlabbe/abd0242305c29495bbba26065269daf2/raw/ad0b1865c02e61449f58358fdc4ddbed3cb5fb87/CMakeLists.txt -o CMakeLists.txt
|
||||||
|
fi
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix ..
|
||||||
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cd $pwd
|
||||||
|
#rm -r lz4
|
||||||
|
fi
|
||||||
|
|
||||||
# FLANN
|
# FLANN
|
||||||
echo "wget flann..."
|
if [ ! -e $prefix/include/flann ]
|
||||||
git clone https://github.com/flann-lib/flann.git
|
then
|
||||||
|
if [ ! -e flann ]
|
||||||
|
then
|
||||||
|
echo "wget flann..."
|
||||||
|
git clone https://github.com/flann-lib/flann.git -b 1.9.2
|
||||||
|
fi
|
||||||
cd flann
|
cd flann
|
||||||
git checkout 1.8.4
|
if [ ! -e flann_ios_lz4.patch ]
|
||||||
curl -L https://gist.githubusercontent.com/matlabbe/c858ba36fb85d5e44d8667dfb3543e12/raw/8fc40aa9bc3267604869444020476a49f14ab424/flann_ios.patch -o flann_ios.patch
|
then
|
||||||
git apply flann_ios.patch
|
curl -L https://gist.githubusercontent.com/matlabbe/c858ba36fb85d5e44d8667dfb3543e12/raw/2586a356dec2b11440ec3c1bb113e709e1266d97/flann_ios_lz4.patch -o flann_ios_lz4.patch
|
||||||
mkdir build
|
git apply flann_ios_lz4.patch
|
||||||
|
fi
|
||||||
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
# comment "add_subdirectory( test )" in top CMakeLists.txt
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_C_BINDINGS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF -DBUILD_DOC=OFF -DUSE_OPENMP=OFF -DLZ4_DIR=$prefix/lib/lz4 ..
|
||||||
# comment "add_subdirectory( doc )" in top CMakeLists.txt
|
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_C_FLAGS=-fembed-bitcode -DCMAKE_CXX_FLAGS=-fembed-bitcode -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_PYTHON_BINDINGS=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_C_BINDINGS=OFF ..
|
|
||||||
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -r flann
|
#rm -r flann
|
||||||
|
fi
|
||||||
|
|
||||||
# GTSAM
|
# GTSAM
|
||||||
git clone https://bitbucket.org/gtborg/gtsam.git
|
if [ ! -e $prefix/include/gtsam ]
|
||||||
|
then
|
||||||
|
if [ ! -e gtsam ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/borglab/gtsam.git -b 4.2
|
||||||
|
fi
|
||||||
cd gtsam
|
cd gtsam
|
||||||
git checkout fbb9d3bdda8b88df51896bc401bfd170573e66f5
|
|
||||||
# patch
|
# patch
|
||||||
curl -L https://gist.github.com/matlabbe/76d658dddb841b3355ae3a6e32850cd8/raw/7033cba1c89097b0c830651d7277c04dc92cbdd9/gtsam_GKlib_ios_fix.patch -o gtsam_GKlib_ios_fix.patch
|
if [ ! -e gtsam_4_2_ios.patch ]
|
||||||
git apply gtsam_GKlib_ios_fix.patch
|
then
|
||||||
mkdir build
|
curl -L https://gist.githubusercontent.com/matlabbe/76d658dddb841b3355ae3a6e32850cd8/raw/e7355348c2d536ec50f41effa775ed251ae4e045/gtsam_4_2_ios.patch -o gtsam_4_2_ios.patch
|
||||||
|
git apply gtsam_4_2_ios.patch
|
||||||
|
fi
|
||||||
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_C_FLAGS=-fembed-bitcode -DCMAKE_CXX_FLAGS=-fembed-bitcode -DCMAKE_INSTALL_PREFIX=$prefix -DMETIS_SHARED=OFF -DGTSAM_BUILD_STATIC_LIBRARY=ON -DGTSAM_BUILD_TESTS=OFF -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON -DGTSAM_WRAP_SERIALIZATION=OFF -DGTSAM_BUILD_WRAP=OFF -DGTSAM_INSTALL_CPPUNITLITE=OFF -DCMAKE_FIND_ROOT_PATH=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DMETIS_SHARED=OFF -DGTSAM_BUILD_STATIC_LIBRARY=ON -DGTSAM_BUILD_TESTS=OFF -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON -DGTSAM_WRAP_SERIALIZATION=OFF -DGTSAM_BUILD_WRAP=OFF -DGTSAM_INSTALL_CPPUNITLITE=OFF -DCMAKE_FIND_ROOT_PATH=$prefix ..
|
||||||
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -rf gtsam
|
#rm -rf gtsam
|
||||||
|
fi
|
||||||
|
|
||||||
|
# suitesparse (dependency of g2o)
|
||||||
|
if [ ! -e $prefix/include/suitesparse/SuiteSparse_config.h ]
|
||||||
|
then
|
||||||
|
if [ ! -e SuiteSparse ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/DrTimothyAldenDavis/SuiteSparse.git -b v7.6.1
|
||||||
|
fi
|
||||||
|
cd SuiteSparse
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DCMAKE_FIND_ROOT_PATH=$prefix -DSUITESPARSE_USE_OPENMP=OFF -DSUITESPARSE_ENABLE_PROJECTS="cholmod;cxsparse;spqr" ..
|
||||||
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cd $pwd
|
||||||
|
fi
|
||||||
|
|
||||||
# g2o
|
# g2o
|
||||||
git clone https://github.com/RainerKuemmerle/g2o.git
|
if [ ! -e $prefix/include/g2o ]
|
||||||
|
then
|
||||||
|
if [ ! -e g2o ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/RainerKuemmerle/g2o.git -b 20241228_git
|
||||||
|
fi
|
||||||
cd g2o
|
cd g2o
|
||||||
git checkout a3f7706bdbb849b2808dc3e1b7aee189f63b498e
|
|
||||||
# patch
|
# patch
|
||||||
curl -L https://gist.github.com/matlabbe/b9ccfeae8f0744b275cab23510872680/raw/a58e06accba3976420d4b61341685c123193810e/g2o_ios_fix.patch -o g2o_ios_fix.patch
|
if [ ! -e g2o_20241228_ios.patch ]
|
||||||
git apply g2o_ios_fix.patch
|
then
|
||||||
mkdir build
|
ls
|
||||||
|
curl -L https://gist.githubusercontent.com/matlabbe/b9ccfeae8f0744b275cab23510872680/raw/6fe2ffe5ba8fba59171adbd2f38f9c3999c61f75/g2o_20241228_ios.patch -o g2o_20241228_ios.patch
|
||||||
|
git apply g2o_20241228_ios.patch
|
||||||
|
fi
|
||||||
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_C_FLAGS=-fembed-bitcode -DCMAKE_CXX_FLAGS=-fembed-bitcode -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_LGPL_SHARED_LIBS=OFF -DG2O_BUILD_APPS=OFF -DG2O_BUILD_EXAMPLES=OFF -DCMAKE_FIND_ROOT_PATH=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_LGPL_SHARED_LIBS=OFF -DG2O_BUILD_APPS=OFF -DG2O_BUILD_EXAMPLES=OFF -DCMAKE_FIND_ROOT_PATH=$prefix ..
|
||||||
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -rf g2o
|
#rm -rf g2o
|
||||||
|
fi
|
||||||
|
|
||||||
|
# g2o's installed CMake config hard-codes the absolute build-time prefix of its
|
||||||
|
# external dependencies (e.g. suitesparse) in INTERFACE_INCLUDE_DIRECTORIES. That
|
||||||
|
# path doesn't exist when the prebuilt Libraries archive is unpacked on another
|
||||||
|
# machine (CI), breaking find_package(g2o) with "includes non-existent path".
|
||||||
|
# Rewrite those absolute paths to be relocatable (relative to the config file).
|
||||||
|
# Run unconditionally (outside the build guard above) so it also fixes the prebuilt
|
||||||
|
# archive in CI, where the g2o build step is skipped.
|
||||||
|
find "$prefix/lib" -path '*/cmake/g2o/*.cmake' -print0 | while IFS= read -r -d '' f
|
||||||
|
do
|
||||||
|
sed -i '' -E 's#[^";]*/Libraries#${CMAKE_CURRENT_LIST_DIR}/../../..#g' "$f"
|
||||||
|
done
|
||||||
|
|
||||||
# VTK
|
# VTK
|
||||||
git clone https://github.com/Kitware/VTK.git
|
if [ ! -e $prefix/lib/vtk.framework ]
|
||||||
cd VTK
|
then
|
||||||
git checkout tags/v8.2.0
|
if [ ! -e VTK ]
|
||||||
git cherry-pick bf3ae8072df2393c7270509bae41be0776826346
|
then
|
||||||
mkdir build
|
git clone https://github.com/Kitware/VTK.git
|
||||||
|
cd VTK
|
||||||
|
git checkout tags/v9.5.0.rc1
|
||||||
|
else
|
||||||
|
cd VTK
|
||||||
|
fi
|
||||||
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_FRAMEWORK_INSTALL_PREFIX=$prefix/lib -DIOS_DEVICE_ARCHITECTURES="arm64" -DIOS_SIMULATOR_ARCHITECTURES="" -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DVTK_IOS_BUILD=ON -DModule_vtkFiltersModeling=ON ..
|
cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_FRAMEWORK_INSTALL_PREFIX=$prefix/lib -DIOS_DEVICE_ARCHITECTURES="arm64" -DIOS_SIMULATOR_ARCHITECTURES="" -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DVTK_IOS_BUILD=ON -DModule_vtkFiltersModeling=ON ..
|
||||||
# For iphonesimulator: add -DIOS_DEVICE_ARCHITECTURES=""
|
# For iphonesimulator: add -DIOS_DEVICE_ARCHITECTURES=""
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -rf VTK
|
#rm -rf VTK
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# PCL
|
# PCL
|
||||||
git clone https://github.com/PointCloudLibrary/pcl.git
|
if [ ! -e $prefix/include/pcl-1.15 ]
|
||||||
cd pcl
|
then
|
||||||
git checkout tags/pcl-1.11.1
|
if [ ! -e pcl ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/PointCloudLibrary/pcl.git
|
||||||
|
cd pcl
|
||||||
|
git checkout tags/pcl-1.15.0
|
||||||
|
else
|
||||||
|
cd pcl
|
||||||
|
fi
|
||||||
# patch
|
# patch
|
||||||
curl -L https://gist.github.com/matlabbe/f3ba9366eb91e1b855dadd2ddce5746d/raw/4a66ebb9faa1dfe997a0860d733bc5473cff20ee/pcl_1_11_1_vtk_ios_support.patch -o pcl_1_11_1_vtk_ios_support.patch
|
if [ ! -e pcl_1_15_0_ios.patch ]
|
||||||
git apply pcl_1_11_1_vtk_ios_support.patch
|
then
|
||||||
mkdir build
|
curl -L https://gist.githubusercontent.com/matlabbe/f3ba9366eb91e1b855dadd2ddce5746d/raw/7231688d7fb9e86df72ca7c5f355d6b9727205d5/pcl_1_15_0_ios.patch -o pcl_1_15_0_ios.patch
|
||||||
|
git apply pcl_1_15_0_ios.patch
|
||||||
|
fi
|
||||||
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_C_FLAGS=-fembed-bitcode -DCMAKE_CXX_FLAGS=-fembed-bitcode -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_apps=OFF -DBUILD_examples=OFF -DBUILD_tools=OFF -DBUILD_visualization=OFF -DBUILD_tracking=OFF -DBUILD_people=OFF -DBUILD_global_tests=OFF -DWITH_QT=OFF -DWITH_OPENGL=OFF -DWITH_VTK=ON -DPCL_SHARED_LIBS=OFF -DCMAKE_FIND_ROOT_PATH=$prefix ..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DBUILD_apps=OFF -DBUILD_examples=OFF -DBUILD_tools=OFF -DBUILD_visualization=OFF -DBUILD_tracking=OFF -DBUILD_people=OFF -DBUILD_recognition=OFF -DBUILD_global_tests=OFF -DWITH_QT=OFF -DWITH_OPENGL=OFF -DWITH_OPENMP=OFF -DWITH_VTK=ON -DPCL_FLANN_REQUIRED_TYPE=STATIC -DPCL_SHARED_LIBS=OFF -DPCL_ENABLE_SSE=OFF -DCMAKE_FIND_ROOT_PATH=$prefix ..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -rf pcl
|
#rm -rf pcl
|
||||||
|
fi
|
||||||
|
|
||||||
# OpenCV
|
# OpenCV
|
||||||
git clone https://github.com/opencv/opencv_contrib.git
|
if [ ! -e $prefix/include/opencv4 ]
|
||||||
cd opencv_contrib
|
then
|
||||||
git checkout tags/3.4.2
|
if [ ! -e opencv_contrib ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/opencv/opencv_contrib.git -b 4.11.0
|
||||||
|
fi
|
||||||
cd $pwd
|
cd $pwd
|
||||||
git clone https://github.com/opencv/opencv.git
|
if [ ! -e opencv ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/opencv/opencv.git -b 4.11.0
|
||||||
|
fi
|
||||||
cd opencv
|
cd opencv
|
||||||
git checkout tags/3.4.2
|
mkdir -p build
|
||||||
curl -L https://gist.githubusercontent.com/matlabbe/fdc3ab4854f3a68fbde7277f543b4e5b/raw/f340839c09165056d3845645df24b76507542fd2/opencv_ios.patch -o opencv_ios.patch
|
|
||||||
git apply opencv_ios.patch
|
|
||||||
mkdir build
|
|
||||||
cd build
|
cd build
|
||||||
# add "add_definitions(-DPNG_ARM_NEON_OPT=0)" in 3rdparty/libpng/CMakeLists.txt
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DOPENCV_EXTRA_MODULES_PATH=$prefix/opencv_contrib/modules -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DWITH_CUDA=OFF -DWITH_WEBP=OFF -DWITH_OPENEXR=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_stereo=OFF -DOPENCV_ENABLE_NONFREE=ON ..
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_C_FLAGS=-fembed-bitcode -DCMAKE_CXX_FLAGS=-fembed-bitcode -DCMAKE_INSTALL_PREFIX=$prefix -DOPENCV_EXTRA_MODULES_PATH=$prefix/opencv_contrib/modules -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DWITH_CUDA=OFF -DBUILD_opencv_apps=OFF -DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_stereo=OFF ..
|
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
cd $pwd
|
cd $pwd
|
||||||
#rm -rf opencv opencv_contrib
|
#rm -rf opencv opencv_contrib
|
||||||
|
fi
|
||||||
|
|
||||||
mkdir rtabmap
|
# LAZ (dependency for liblas)
|
||||||
|
# LAS
|
||||||
|
if [ ! -e $prefix/include/laszip ]
|
||||||
|
then
|
||||||
|
if [ ! -e LASzip ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/LASzip/LASzip.git -b 2.0.1
|
||||||
|
fi
|
||||||
|
cd LASzip
|
||||||
|
sed -i '' 's/cmake_minimum_required(VERSION 2.6.0)/cmake_minimum_required(VERSION 3.5)/g' CMakeLists.txt
|
||||||
|
sed -i '' 's/add_subdirectory(tools)/#add_subdirectory(tools)/g' CMakeLists.txt
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DCMAKE_FIND_ROOT_PATH=$prefix -DBUILD_STATIC=ON ..
|
||||||
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cd $pwd
|
||||||
|
fi
|
||||||
|
|
||||||
|
# LAS
|
||||||
|
if [ ! -e $prefix/include/liblas ]
|
||||||
|
then
|
||||||
|
if [ ! -e libLAS ]
|
||||||
|
then
|
||||||
|
git clone https://github.com/libLAS/libLAS.git
|
||||||
|
fi
|
||||||
|
cd libLAS
|
||||||
|
sed -i '' 's/cmake_minimum_required(VERSION 2.8.11)/cmake_minimum_required(VERSION 3.5)/g' CMakeLists.txt
|
||||||
|
sed -i '' 's/SHARED/STATIC/g' src/CMakeLists.txt
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DCMAKE_FIND_ROOT_PATH=$prefix -DWITH_UTILITIES=OFF -DWITH_TESTS=OFF -DWITH_GEOTIFF=OFF -DWITH_LASZIP=ON -DWITH_STATIC_LASZIP=ON ..
|
||||||
|
cmake --build . --config Release -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cmake --build . --config Release --target install -- CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
|
||||||
|
cd $pwd
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p rtabmap
|
||||||
cd rtabmap
|
cd rtabmap
|
||||||
cmake -DANDROID_PREBUILD=ON ../../../../..
|
cmake -DANDROID_PREBUILD=ON ../../../../..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
mkdir ios
|
mkdir -p ios
|
||||||
cd ios
|
cd ios
|
||||||
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_C_FLAGS=-fembed-bitcode -DCMAKE_CXX_FLAGS=-fembed-bitcode -DCMAKE_INSTALL_PREFIX=$prefix -DCMAKE_FIND_ROOT_PATH=$prefix -DWITH_QT=OFF -DBUILD_APP=OFF -DBUILD_TOOLS=OFF -DWITH_TORO=OFF -DWITH_VERTIGO=OFF -DWITH_MADGWICK=OFF -DWITH_ORB_OCTREE=OFF -DBUILD_EXAMPLES=OFF ../../../../../..
|
cmake -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_SYSROOT=$sysroot -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$prefix -DCMAKE_FIND_ROOT_PATH=$prefix -DWITH_QT=OFF -DBUILD_APP=OFF -DBUILD_TOOLS=OFF -DWITH_TORO=OFF -DWITH_VERTIGO=OFF -DWITH_MADGWICK=OFF -DWITH_ORB_OCTREE=ON -DBUILD_EXAMPLES=OFF -DWITH_LIBLAS=ON -DWITH_OPENGV=OFF ../../../../../..
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --build . --config Release --target install
|
cmake --build . --config Release --target install
|
||||||
|
|||||||
40
app/ios/RTABMapApp/text_atlas_png.h
Normal file
40
app/ios/RTABMapApp/text_atlas_png.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*This is a generated file...*/
|
||||||
|
|
||||||
|
#ifndef TEXT_ATLAS_PNG_H
|
||||||
|
#define TEXT_ATLAS_PNG_H
|
||||||
|
|
||||||
|
namespace rtabmap
|
||||||
|
{
|
||||||
|
|
||||||
|
static const char * TEXT_ATLAS_PNG =
|
||||||
|
"89504E470D0A1A0A0000000D4948445200000200000002000806000000F478D4FA0000000473424954080808087C0864880000200049444154789CEC9D79FC6D53FDFF5F6FB9487413924844FC88287C2543869006A24832954491211129241245C60A9967C99C0C190A99E729F335DE6BBAD77571EF7587E7EF8FB58FCF3AEBAC33EFE133ACE7E3711E9FCF597BEDFD7EEF7DCED97BADF7B4A4442291482412894422914824128944229148241289442291482412894422914824124312AB5A81C4E006D848D20A926698D92155EB934824128944A204805371BC5BB52E896A00962AF8F84B1779FC4422116796AA15180C0073D75E5EDB9C615B223192C8BEFFA74BBA0758B840511702B702CB1728239148241AA19E75B3B6F15EDB9655EB5815555800B2C1D7A2C0A8B264B6D06534B048C1327C762E5256A700F303B7797AFDB220396B7A32C6016B17212791483432682C00C0CDC07DDEEBAAAA75AA1AE0CFDEF558DB6BBFD06B5FA200B96B0317002F48DA366B1E05BC04FC1D58276F9999DC9D8087244D92F48CA4B7813B806F1521AF851ECB0267012F4A7A43D2B3C0E46C96BA5599BA54013087A48B24AD92354D9534B620719325BD94FDBF80A4F381150B92D511D9E0B3F6FBBAA54A5D122317608EEC9E53FB2EEE52B54E8501BC1ECC849E2A51B6CF2A599B6F01D8B82C5D02BD1ECBE4CFC433C10213B3F64905C83C16984E6BA60187E72CF780EC3C9BC9DB2E4F792DF4D824F8EC43660247E42CD3E787791EBB477D4E0CCEB7D01B0FB03AF0A627F3212A74BD01F37ABABC5C951E89910DB06DF03B5CA96A9D0A0337BBF479A444D93EF3666DFE43E0B365E9E2E934073025933FD66B5FC1D3EBFE9C651E1B3EEDDA70504E7297C6CDB06BFC0F67E578DE6B1B0BCC19EC370F701CB0784E7A2C41EB877F8D99C0F7F39099C9F5D934AFE3F6A8CB977103AE1AE79724779FE03A1C5786DC16FAD4AEC13355EA9118B900177BBF8707ABD6A7508031C10DE0BE1265D798E4B5D51E0433A960368233C3D7B8D96BDFC16BFF7B8EF25606DE8D3CECEECABE880F47B64D2687086E607FEF988F913DE88145A87F206F16ECF797DAE7067C23073DFC99AF7FFEFFA0716090DBE02B38EE1A791DB7475D7CBFFF048A0DFE0B65DFEBC99E42494181C00A91B637323D1A6EBCA4C0E044C1E0E2A0DEF07E0FB95A5C6B0C9A180049619059156967E3236D6F9A59EEA6F60EF0AD0E4F78FF7FDAFBFFB11CE56D2D290CBA3BCCCC5632B34DCCECD3924E09B6CF2169C71C64FB0F99DBCCEC1D4932B3E724F90FDAC56AFF006B4AFA5EF6F61549D7E5A0C7EAC1FB33B2F3FFAAA47525BDE56D5B96C02291132FB5EF520CC0261AF0FB4BD22966F642892AF837B9D925ED5BB4405CA0E9B5C0E3C0C1DE80E79DECEFDB59BF7971568AFB249D56825EBF04"
|
||||||
|
"9EF35EB7152D3331A8D852D2E8EC7F249D53A12EC5033C18CC846E2A51768D7BBCB6DA8CEFE9B2F408743AC9D36B6FAFFD4AAFFD3B39CABB3AB8FE9308A2F07126F77026FCDF1C649FE21DEFA460DB35DEB65F78ED77656D3381CDFBD5213B66786EEB07DB6F0BB62F9093DC1A33C26B5E26C1776B0AB068053A3CE9E9F036055B20802D82CFF41DE012E0E5ECFDFDC0D9D4CFC65E2FFA73028E08F47AAE487989C10570B9F7D9DF5B949C598B3A700F8433FEA915E8F07A876DB983F3FDCEE535F991D07301DB64FF2FE3B5CFEFB53F626677F5A1C21CC1FB37CD6C9ADF606613703ED179BCE68FF621B3866F61096FF80B79FFBF2149C07E1AB83E9798D90539E820357E07E7ABFD03CC23C98F3578D9CCF20E109B145EF3B2C0C5BEACE535DD6266632A50E532497B64FFCF29E9FB9272893569C28292C669E07BFC7E497ED0EF67B297CFFB25ADA97CAC4E89441DC068495FF49A0ACB881BCC0380325D00355FFAAD5EDBE5923E20E98192743842D2A24DB6FDAA49FBD1DEFF474AEA6700302178FF51E0F366169A1E0F50FD43F9ED3E64D6B849D2AED9FFEB02FB4BBA59D2373430E0992EE9065CDAE3CFB2B6F192F6CC417E8DC7E452D16A7C4FD239D9C3FF3C7903024997E628B776AC980BAA2C36937BB0D5B8BD223D6ED0C0004092365081030033FBA3A43FE2525BBF22690DB9D2D7B379DD90F494DCFDE13A49979959F87B4924F2E23B926A712633259D5DA12EE500DC1098BC2EAA5AA732019EA13FFA4A4D03F68B1CF351B2B4C8A2C1E5BBB6E2BCAC9F6F1ADB2B671D7E14917B2C8D01AA4F9093F97FB0009C169CE3D72AD2630E9C19BEC6DBB8BA0465C95F3B93E9737559F23D3D920B608442BD2BAE9F49DDD081461FF4B955EB5426B848F8A3B3979FFEF1A8D77E9DD77EBBD77E347DD62A0016045EA591A9B8E23FEBE675AE4DE42F4EA38FBDC695B8F883EF32502BA090A028E0EE263AD4789C48D4F85027FB3EF92CD47EAFC274792AD065FDF67BE5227711E0594FEE73DEFF0794A183A74B1A008C40B2FBDC5BDEE75EA4FB6BF0005C1A7CE14FAB5AA7AA007EED5D87E3BC763F586E9F02E47E9BFAD997CF4CDC2CBDD0AA7CC046C061B82A88BF65A034F33C0CCCC4A700AB16247FB516D7E04A2A7C301609F53517DEA858975B82EBBE6BFBBDFA96390AB829F8ACD7C40D80C9FEF69D6A1A91BB0CF515506BAF17836B30A549BFFDF2D629511DC04FBCCF7C3AB06491F206730C4015418083057FF535BF20D2A7BCFF732D02244966763EAEF2D9F1AA0F3694DCD2D19F97F4379C497457337BBC001D2E930B040BF9ADA44F64FF9F6466B746FAE4C11672296821CF4AFA8E994DAC3500CBAA3E66E07F66F662417A158D1FDFF066655A3842FF7A1983AEE3349006FA86A4DDCDEC71E054B954D7D9249D003C66668FE628774E49"
|
||||||
|
"9DD43B98BD49BF219F1E888BBFF8719B6E3798D9F165E853315FF7FEBFBB887BECA004577BDDE798AA75AA0A0652DCC0F3C17BB38269B8C0B4A2E48F027E41BD0934E4556083A27408F459C39B893D4D568805B760CDC6C056C05A7DCA9813B8AAC5F9025C19EC13BAADBEDB8F0E55917DDE3E95DE747055207DFE5C82CCBF31E05EDACB6B9F8701B7C02406B26EF292BB529BEF5C3BFE92A73E55006CDFC1799E5AB59E4583BB9FF9D6C7FD8B9639980A014D09DE4FAE448B0AC86E02EFBD247D32DB3445D28CAC7D75B99425C915BE59DCDB67DE3CF531B36966F65BB9B4B79D24FD572E12DA673E4967514EA5B823E5666048DA47D22CC0D9929E977489A433E532045EA2F7D5F4FE2E17715E0349610D880D831B6E1808385423C33F1CBCAFDAFA16DE0BDE1FED952366B699A41F4ABAD4CC7EEFB54F90F40B398BDB3A667646D1BA24462C5B69E0BB3E5D2544FF0F26174078D3A9FA2654267736699FA3C9B68F05EDDB4ACAFDC694E5A49F2067FAFC8AA46335303891DC20604FD5A76DE50AAEF84F6D118C4BCDEC02E03A49B115091794742C30C3CC3A9E19013F95F4E5A0F950497F924B4BF35D2F3FC4D542385BF5AE1A243DD4A9CC41C6CCE0FD609A18488DFA158299FD55D25F23ED67ABB89BF1F31A486BF55957D286DEFBD7E5BE9321A5954C4F148E6FFEBFC3CC0A5F106F300D00C251FF481A00540AAE9EFFFC5ED34C33BBD9EF636657E21625BA45F533B2D50AD46B09493573EC04493FC599D96B0FFF99922E90F4A4A48DE40AB698A45F4AEAC634FACDE0FD7366B65FA6C3E692AE96F4916C9B49FA8D5C3C849F9EF64256BA78281206FDCD16ED551E61DA5F786F183664C5A41A5278818FA97E00F08E99E5BA0AE520E242392B632B2A0D4C2D1A6041495FF09AAE6CD63731CCC0951EADBDFEE7F980EEF1DA7D7FFCCDC13E6BF729FFD4C0DF369326A54E813B82BE63FA91DD46AFCB3C397B676D7EACC8455EDF85A85F5276AD2EE484B10E3704DBBF4C636E78C8E9B99D7805509F7A54E94086FA3C6880D8CC7758434A031C51007B799FF5546091AA754A54007085F745D8CA6BBFC76BCFB5380F7078E481169AC46B7DEF0CFA15B25C2AB025034159B77BED7EA0DEAF837D1EF0B6751C90870B2CF4690882037E804BCB89319D3E8310AB86FA4254552C7EE5EB121685FA5195FA5401690030A200FEED7DD6FF294BEEA0F1F5E12291F7C02DF1DA2E256438B384F7BF9FE253F3BDBF6D667997698DA5D4ED43B0DA5DF6905B2EE897FBEA75B85AD8BF9533B74F95F4D34E77F5FEB72E443E1BBCFF1441EE79E61FFE5393FDFF66663776216F30E2AFFA3717152C04E4B160F07EA8C656248608B86C8FC37195468F02E66FBF576EB217917329D6B8A22CD9832906E05C79BE58606533FB5E8BFEC30E5CC9D345B3B7AF99D99359"
|
||||||
|
"FB721A581AB28819F73FE51E829FF0DABE28E9119C997DAC5C46402C47BE8805517EA7FA9CFF5BBC6D7EBDFCF72AF2E152033FEE6DEB666072B9EA17C2915C7DF8B525DD2DB748D367E402B3627CA80B5983954755BF1CF2E7248D295B89EC73F417987AD3CC4A5B1974A4825B7DF5BDDFBF998D3413F47992FC8A932BCAAD0B51065B6920EE66AA4642ED7F1F606E5C6EBB4FD5C5484A075779AC866FF6F6F3642F2E48F6B691CFA01D4F67B3F5BC75F911CE24FD5ECEBFB76D3B4FFE0CE04C606FEAD792184717CBB5E2AC4FF77679EE2127E67D1DCA04574BC1E7F7EDF72A448F6F057A8CC815F780DD70F136B557AC38569EF2FC65984BC9BA182C64BFFFA9C1F76E2639A757B790EF57BEBCA1FD1EC38CEC0398147C00E3AAD6AB6C80DDBDF33FCB6B3FD26BFF5D81F27F44FDBAE7AD788602170AC215E689D6DCA7BE646B8C4E5D06FE3197001EEEF0DCA7E16A0E84ECDBFF99574376BD277AE77273FBBD0AD1E3F8E09AC652E4123943FD006046D5FA940D6ED2E0534AD601B018F06E3FF7AE61016E35BADA85980CEC56B54E65039CE87D117EE9B5FFC36BDFAAD53172D06129E074E0B5E8A3CF55233C960A57C30316C0653F844179E37175037A3DEEDCB8E0ABB00E7B8D89C045C05AD9757A3ED8FE2EB0659EE75A26C005DEB94CC3A58796AD839F913181022B5E2606A03E10F69DAAF5291B604706B288DEA6A4E70FF02BFFBA57795FAD9CECA6BA29B078D5BA8C74705699B5191819DF4D494B03770A6EF4BC35F063E01B04EE823E8FBD32CEDDB02B2E03606DBA702B0C45B273AC655E009C50B2FC1D8201D59076AB0C2580D7BDEB5E4866CF6007188D5B0CAC14D37F26D35F01F59AB2E426121DC1407AD888F4C58E34806BBC1BD25BC052EDF7CA45EE28EA6B604CA4DA4C841103B07C30F02B24CE28514F36819984B3784F0676A95AA744A28E3400185964960F7F4192AB4A927B6830FB3FB00CB9090997F6E6B379D53A2512894100B0332E3E63C8FAB613DD01FCBACC8731B0116EBDFB1A29EDAF2470F134E3D3B54F24128984A4862579A703852CF804AC437DE6C913C9F45F1EC0260C647F8C0756AE5AA7442291485408CE27EF0F028A1A007C1657CF015C0C40E99907231D6051E02460C3F6BD138944223122000EC0A54516968E07FC17389712CBAF2612894422916803C19A1043EDF88944229148241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289C41000987324D7E8CE96CB5CA822D9A3B2853AE6AD427E2201CC0B2C52A1FC05D2F73F3112C9BEFB731729C39A08DE48D28E925696345FD6EF6D490F4BBA4CD2116636A548C5223A7D47D2E6921E31B3FD0A94335AD25E92BE2C691949EFCF364D97"
|
||||||
|
"F494A49B251D6B66F717247F39493F91F445499F94346BB6E92D498F4BBA5AD2F166F66211F29BE83487DCE7FE11AFF92D335B3D6739074AFA4697BB1D6C6617E6A9870FB09EA4AF495A55D247257D48D258335B2AA7E32F20F799F6C3DA663621277D4649DA59D266929695F4C16C53EDFB7FBDA4A3CDECB13CE435D16147495B4AFA9CA4B9B2E68992EE9074B2999D5F94EC44A22AB265B07795B49EA44F499A3DDB3451D2A3922E96744C61CF5E600EE06C6026AD791458A11025EAF55907380518EBC93EB54079EB032FB4397780B7805D0B90BF3FF07607F25F01B6C95B7E0BBDFE10D1616201722EEFE0DC4376CC5B8F4C97B5801B9BC87C3247390BF770CE21B958E8806581FB3A90F706F0A33C6406F2E705AE6F237B266EE5C05179CB4F24AA02D80678AD83DFDEFDC092452971613BE91E2FE2462C79EBB01C70046E6DF018850C007037FC495D9CFF34E0BB39CA3FB40BD90053812DF292DF42AF95817722F28B1800DCD1E53580020600C02EC094163207D3006026392CD58B7BF83ED585DCBCBFFFA3805BBB909FAC00896101F0755ADF6F42EE27EF0130B05D44D014E0DFC03F809723DB2FCD51FE86B807C08C36279FFB000077F3793C22EB45E032DCACE48DC8F6277292BF0AEE811EF25C76EDAF07C647B63F9387FC36BADDD2E47328620030A6E5271F27D70100B02730BD89AC49C013E4FBBD5F1078B58BD7B440A75B73D2E3C8C8F9BE0BFC07B892F8EF3FCF81D0E191E3BF055C035C477C10FA83BCE4271255417CE23309B809B89BF8337197BC95086FF493800DBCEDF347147D17C8CB17BA7FE42463143100D83D22E71ABC000C9C65E2B948BF757290FFA7C8714FC3F9DE6B7D16031E8AF4FB7ABFF25BE8F5B3169F43110380F026BF51DE32DAC85F3DA203C03F816F50B1D919583CA2DF0E391DFBD1E0B8D3806F78DB17061E895C9B3CBEFFF3D238C01D0FACE2F5591D3700F279B85FD9894495004BD0F8807F0ECFCC0FEC10F9DDE53609A9CD42C259CF49917E6B4714D93F271DC201C034DCE827A48801C0D5818CC9C032917EFB45F4D93307F9D705C77C93C8C306D83A22FF97FDCA6FA2D362C0EB117935721D0064F24272195C76A1C33D81FC77819F94A9432B681C283E1BFB9EF478EC7060717DA4CFCE91CF68F71C64EF1439EE61917E7B47FA6D103B660F3ACC83B3425C0E1C45C9994F55CBEF065C66D8C255EB9117D9B55FA022D99B46BED30745FA8593CFBBF2905F8B30FFA2A4F705DBFE157636B31B807172D1D0353E938722199325DD2EE95A49E79BD95300391EBF198B07EF1F33B34722FDEE89B4E591A6B1A706A2AD2569B2994D8BF47B28D23657A42D0F8E92F461EFFD2BAACF02C89BF0613FB5C848F3106053499F0D9A0F35B363CBD2A115B854B830E6E3EC26DF935E0807122F44FA3C1E697B7F"
|
||||||
|
"A4AD5B568EB4FD25D276B2A4DFAAFE5EF545F59F452149E7495ADF7BBFA2A4357238EE5091DF1660690D64881C24E9F86A35CA8DFF27E91AE00A497F32B39B4A94FDB0A49D82B61B23FD2605EFC3E7754FD40600B1995633F3DA8BAA1F002C9A8722723F80E3CDECF59C8ED70D27ABFE41DECCB7F9A148DBABFD0A37B3FB3AECBA6CA4EDA97EE587005B4AF25D0B77481A2B69E3BC65797C2278FF4A81B26284A6F427CDEC0049C265BC2C26970AFBA0998D2D593749DA43921FECF796A43C07272F4BF2EB5D7C2CD2E79391B6A773903D5FF0FE0D336B886F31B3D78157242DE835F76D25CAAC286B05CDAB01F396713FAA5A7E3B808DE5D2C2D795345B41327EACDE2653A799D9CB39A83097DC00FBDBC01D92CE90744AD1E9EED924A7E5440758428DBFBD67735382780050B4F8062E28D0E77FB92912971752581A6007BA9C13E8328388ABA020D9F302F706F2C7E1EA16E429671E9C69B9C6146035E0924076DE2E80DF04C77F14670ABD1F98800BC27C26D3A3DB5A019DC80FDD1D47E25C3E6160E254E00660D5BC7568A1DB1CC0F3811E67E62CE3D4E0F8EF02EB7BDB47D3E822190BCC9983ECCB82E3BED9A26F98A9D060A9EC518771C171DFC8E3B843457E449FD1C03EC4E38E0076CE59DE8B4DE4B463A51C64AFDAE4D863816328D91519D1EF5F11DDB6CC53C0091101D1D1188DFEEAE77353242E2FA4920100B0128D7ED2C24C45B868F483804380D369AC4F301D376ACE5BEE89819C63B3F6A2070027473EEB66CC04CEC30B92EC53F69A11194FB4D1E12DE02B79C8EF40BF304875065E805C4E3296A2F121F40ECE277D36F074E433E8DBFF9FC93E2D727DA3036BE0C9A0DF7F73D261475CEC0DB85A1CBBE571DCA122DFD36305E0245AC7FFC0C81800D4988ACB84D9248F73ED42AF39804B23FA5C94B7A09322423A1D00145A912EA257E90300606E1A0BA44CC39B21152033967150E30D608F0264AE8B9BF9D578AAF63DA0F801C03F5A9C6F334ECF49F68E3DC80677D32ABC4C2DF07020F78682E4AC4BBDF5A7195389042AF521778F888C06FF32B0348DB53A72190064C71F8DB37655527AB84AF9C016C0B534A699863C0CFC8E9CCB4353ED00606EDC84EBDFC4D3B17D1EC15906CBF8DD87963170D97A7D5BDD6ACCDABE4B42D2E992960FDA8E36B36BAA5046D205924ECBF380383FE4911A080643D23E6616069F1445389B9F2EE906494F643AADA2C680D3AD8133CCECBA3E657FB849FB044957C8C53F2C295712D8FFCD7C4CD2CF25EDDDA7FCA6E08AED84B3E1138B906566D7016748DA4F4DCA8467DC21E9AF398AFEBBA443541F50F83DE03E333B49728313497F5263D0EB3B792961661325DD92D7F186827C5C60DFA572A5679BF1A2A42B259D596080DC21EA2D06A06F0B74768F3B42D211B8E2765BCBC5407D4E8DC1764B"
|
||||||
|
"4B3A58D25EC081667654BFF2630047AA3E0E4B7201F21B99596EDFF99AB06401682E3FE61E293C4A94D61600702E8158F474AFF2421FFC85C1F6422D00998CCF03BFCC646D1AD91EAB97705E0E726355181F02160BFA7D3FD22F9762502D74FB6F20AF90CC089CB9F19AE65FB706C691EFF7EFCC26725EC795BE6E569EFCEF79E9301221EEFE026765BC10D8BC6A1DAB02580667ED78A0C9F7AF21553E27B90BE35C8C3E775294D58146BF2F743E0088A50BE5A95B48690300E0F711F9FFA384D50171A6C075810D7079D2E7526F9E073748E83B081057E4C837ADBE4A50E6991206001DE839378DA6C2BE1FC0C06191CF399A5F8EABCEE53333BC5679815B9B22BCF114B210166ECD8D907FE28A906C0E1C4DE33A1563F2F8FE65F217A4D1BF1F23BC1E27E4217FA4427C00F032B02B05AF44375400BE45E3EF1E8A1B00FC389033099709903B3573E6E416DB426609DEC7F61DF200BF92CBCFF77949D2B7CA5889CFCC4253E05F704587FEE0B57D5CD26E7239B9FD70B4EA4DABAF483A8CFA120CA1F97D0E06EAB15F6F6685DF88CD6C1270AFEA53D4F2188C4D8FB48D6BD2F72649FE2A882667A21F93831E21BBABDE143F41CE0C9E2B38337018557C91997DD37B7F0170A75C7A544DA74F643AFEBA5F1DCC6C2CAEAAE529923E1FE93259D23199BCD9BDF6586D8E447F7C44EE9E70102ECBE24233EBDBD2D60AE0443577C5B5E2E76656442AF49A92B692F415E5738FE986D0E5F71F33CBADEC7603349A7F6936E2006E0BFA759AC3DEAB6E21855B007051D76179C6D780CA0B73D0580EB5AF3804DC0A70FD52C848B889BEA746E4F7151403EC15396634CD8F7835BCEFF423BF899C15690CC82AC4F70FFC3C724EEB35E91B6647E4EE0EC3955DFE332E02FA629C1976191AABA6CDA4A099D1480197F6FB3BDA077F8EC5FDF60A097CA6C220404F876570D6C058C96B9FB771EE91D5F2921DE8717620AFB06264B559FE98C8B6A5152F8813964C7C294F85AA06D85ED2E1AAB7744C94B465510130B807883FD37B366201A83156F585533EDAA45FA7F45DC8A85FB21FF1BA41F3F9663626D23DF4834DCD212826F63D5F42526CA19DD8F52EA258CB1EAAB7C24D939B0117412CA2BB59ACC12B72D7A6C6824DFAF58C995D22E992B01D1718E5735BA133A31180994D90B48FA47DB27BDFF7247D418D41A01F95B49DA4ED708B40FDC4CCAE2A53D7A200169774965C45CA5615F6C668A0605D61AE6F33FBAEA4DC56DA6C0BB064649413ABC5BD148D3EB8C30BD62DA4300B00F06DDC3A003E932878511A1AEB0BFCA749BF51345A00FA5E0D8EF6A92FEDE8CB02006C15396634CD91C6C23C7DAF88888B2D083F83688A212E55CAE75D72AE230E2C4AA3BFFDCA3C6504F28E8A5CFFE8779EC69962A185C03CB97BD178EFF96119B2471AB8BCF8B369BD3C"
|
||||||
|
"FA48A903301D57F86B9B3CCE73D04263AEF18B3406829D1BF49949C166F1C80752C80000F81A8D5FF877806F17212F901D9A9CA60161DDF76641897DE7C2E306804BB7795D19C87DD3DBD6D72C10B7CA5D68EE7E98C0B44FDCFC7E4E7F67FFDEB12F8F7CF6EB057D36A5F121745B1EF20339C746CEB3C8551F7789C8BB89A0D012715749A1A9B0B800D5336974C9E5B20CB22767C82CC65316C00238F770587D11F21F002C0D2CDFC3ABEF6260C40700E381BF02E1FA208583CBC8F915EE79BB3F39E6FDB7121A5BE9EE39DC43673FE2E508EF2C41AF902256035C93C6E548C1959EBDA683D7727DCA8FAD853E0D17797F20CE2F158B429D414EABA175A063D185806229684F017F047E817B084C899CFFEAED8FDE91FC7568CCB2780B57A5EE97B86A8CB1A582B7CE43BEA7C73CB878139FFBF3941191B900F1D9DE23B892C807E28A92C4D625CFA51AA0A7CB1AC005C055B88C9B7095528089C08A39CB0D57042D7341985A76C973B55799B23B01B712E90DDEE791EB00A04AA81F003C805B7532D712EB5DEA7371F05DBCAC0CA1A380BB223FB6664C01D62A41AF90220600477471DE31D6EC53FE68E0C11EE49E96D325E844C7A20700CBD3BEFC68C8C939EBD0EDF720DF929C4E87032372727DC836917B7097E70E907B043EB04D1B99E3812FE72C73148D6EB0999458918FFA14C89965C9ED165C49F4D3C8B3167DC5009FC5059C9652DABB1D344E34A690D3B2DFED042F815B7CA51D6F01DB15AE9046C60020D36161E08E0EE5CD20E7875F07FA955108680D1A6BCE37E39F14601A03FE42F3A233A1FCBC17621A45A38F7D5C11E7D944FE31C467DC31EEA180FA07B41E00DC44418B3051FD6240FE00604699B213830B5CC6854F792BA3E266A387110FCA7807E70BCEAD025807FA840CCB0180A7CBEEB855FF6235B9DFC19946BF9697BC2EF42AA5101003DFBF30D80FDC83F9095CDA5A6123625C30E89DC41F868F033F2B486ECC175F48A9D1163A7C39FB8EC5DC1D3319A8855EC8F5A77100F002CE255068453AAA5F0CC81FF8E65BEA3531A4C8BE8B3597DC5B14B0E85B8D56F5BE85F3AF2E2E57A77D9C5C4182094529931800B7D8C6E7E4D26FDE95F482DCF52F747DEAC1042E006739B92245E3253D64660F95287F71B9CF603EB954D087CDAC507FFC600167755853D2C2726B318C97748799F59D75D146EE629256944B777DDACCC616292F903D5AD2B292FE676645A476B692FDBA060AE18C31B3C55AF54F0C6F7041A89F96BBE7549EAA9D4824128902C0C5BFF86EA78BABD629313208CBFA26128944A25CBEA77A6BECB95529924824128944A2047029987E0A72A9E9878944229148242A00D80457D7806C20505A80752291482412890AC1957E3E09D8B06A5D12894422914824128944229148241289442291482412894422914824"
|
||||||
|
"128944229148241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289442291482412FA07BC59000020004944415489610FB030306FD57A24AA01981F58A86A3D128944F9007303A3F33EAEF5A8CC3C926A37A3A7CDEC9DFC546A9075A8247F95AC9992BE6966CFE42CE74E49A35A747957D2DB925E92F4B0A40BCDECF13C7508F4F9BCA41D24AD29E9E39266CF364D96F4A4A4DB241D6F66F7E724AFD5F94F963441D2B392AE96F40F339B9687DC0EE5B7E35766767945F25F31B3F5FB91DD449FA524ED22F7F92F2EE903D9A6E992C6497A50D20566765A4EF2C2F37FD4CCBED3669FE5259D1E345F6D663FEF41FE5F25AD14347FA1C87B4BB7001749FAA4D7F4A699AD99D3B1BBBAFEC019923E13344F96B46D2FF7A55E3EFF3C69F1FBFB9D999DD7E131B690B44F64D334336BB9CC7244FE2449DF30B3D75BECB3A2A49383E67F9AD9BE9DE8DB469F8524FD44D23A929694F4C16CD35B72F7FF1BE5EEFF4FF52BAB13651606F603FE0DBC4C3D338137803B812381D573943B0A184B2387E425C393F56E444E2BA6019703CBE6ACC728E044606A073A4C058ECA496E37E73F06D82D0FB93DCA0FD9A642F92FE671FE812EBF03267528FF1E60B91C6486E77F7707FBAC1AD1E7FC1EE5DF1839D6DCBD1CAB28804702FDC6E778EC8EAF3F705093EF42D703AF5EE41741447E8D8E07F6C0154D8EF16E8FF24F6CB3CF9A917DCEE954DF16C7DD0B78BDC9B9F8BC01FCBA5F79AD1499073886CE6F460033808BC9E7A6B47513190FE7717E81AC5E1F00E3805573D2614EE0EA1E74B8A0A2F3BF829CCC523DCAAF316C0600C0F93DE8F002B0449F72D300A00D0C820100B031F1C9C1D965C82F8A88FC1A93E8C0F509CC0BBCD5E418BD0E00A6D262424B010300E0B826E7D08AB37A95374B0B45D6903333FF44D25C59F35449774A3A4BD231928E93748E9C39E24DEF98DF907413B071AF8A656CD1A47D19609D3E8F9D170B483A36A7631D2B29664E7E4BD2E3929E92FB0C423603F6CB49876EF8AAA4AB80392A903DEC000E93B47964D3643993FF5D9262038E85249D54A06A8941006E907782A4D9824D77CBB90B87237349DABA837EDB68C04D9617B349FA7DCEC76C4A760FDF39B269A69CDB6FACA41991EDDF05FE90A7221B0213BC11C65BC051C0622DF69903D81E78C2DBEF6DE0DB3DEAB020F04E8B514FE87BEC0B1A4780F7E25C1FB5D7F2C096C0354DF459A34FF95FC7594F7CA600BFC69B6503A37126E26941DFF1F41124D6E6FC9706BE059C064C8E9C7BE807CB5B7EBBD79C15CA5FB05FD999FC55689CD9CD044E20980101DF065E8D7C0EDFEA437EB200B4810A2D0038D7E0AD916B340E172F52A8FCA289C8F7B9B183FDFFDD62FF5E2D0035766FB24F6E16006025E2CFBBBFE359D3"
|
||||||
|
"81A5803371F786BA7304D6EB45764C11FFE1FF281006E7B4DA7F0EEACD98E380457AD063BF161F08B81B606E334FBAF3C1DD10D1A767FF5B76CCD8C02216D052EB7F7AA4FF2FFA90DFA909725DDC60C3673A7DBA41BAB9FE453008E49F1DF93CFFDAA2FFF691FE17F5213F0D00DA40B503801322D7670AF0F532E4174D44BECF5460D116FB2E4AEB98A97E07002F13995C91EF00E09C6E8E05FC39D2FFCA6EE5D6B900700FD4D3257D286B7A44D27A667657A70734B32966F66D49FFCC9A1690731774CBA6C1FB1BE522A06BCCA7CE4C43457075A4AD675F386E80B476D0FCA499FDAEC56EB140C82FF5AA43A798D975920E0A9ADF2769EFA2650F57805172EE149F49929A0E2ACDEC643997904FC703F5C4D001D8417113FFAFFBCD7E19C48CF3FE9F4DCEC4DF8C6D55EF1619D7AC638F7C4452AB7B715FE02CBC1B05CDE325EDD162B7BDD5E80E5C0F58BC1BD9610CC0019296C9FE7F43D21666F642B8136EE4FF4B5CD4FFFEC086611FB9D88137B2FFBF4A17D1F2C0CA923E1B349F25E7EBF289F94BCB2096AEF2521FC75B5FD2AC41DBBF5AED90A5FA3C27699AF7FA781F3A748C991DA5C61FD917CB903D4C59438D03C89B5BA520651C21E713AEBD86EBC360C492DD0B7FAFC694EDF3CCECD00A542A8B1B83F7E103B2D5B670DF3CD8823C4CEC71365063FCC2B566F672B31DCC6C92A47F04CDB32A1E43D694F70600C0FC9276F2B61D6E660FFA9D81E5801B24DD22E9377223945F4BBA127810F89AA7E05392CEF414FB51177A7D4FF55FF88992CE95149A38D6A0455C4211E0FCCDA17562B2A42BFA38ECE7226DF7B6DBC9CC3E6166B379AF4FF5A143B7DC16BC9F07D8A044F9C38955226D0FB4DBC9CCFE6C663B79AF580051628892DD6B4E56E3E0F01E49DB97AF51A93CA2FA49D567717527EA005650FD64F125498FE620FF31B9DA2735669574780EC78DF1F948DB1D1DEC774BA4AD65BD83107FD6B9B3064CFF6324D54515E20AD35C24A959D0D3B2922E055637B35BB3B633E48A99985C41834E09FD5AFF36B377329FC8AF3CBD6797FB21FCB28B6377CA07802DBDF71F94B4A8A44DE40A33F89C6C6663FA90154B7379B68FE395C11391B62515778FF4C242B86227AD78CACC8ACA839D1558BA4D9FC97D7EEE35E68BB43558DE4AA693EB3FA87CF4C390632485E9D42F4BDA723015482A8839E5267C3FC8DECF22E706D833E8B78DEA278BFFC8F6ED97B7E52C6C077B6D2B00FB9959DE75683E1A69EB6410F360A46D816E04FB0300DF8C72815FE90D57F9EF4C0D3CFC27CBCDC81F94AB52B64BD63E8BA4F7CC96667617F0ACDC83733160CE765F5C5CD6C0C241F3A5D9F19EC405A7F833A64D54CC00602949ED726BA7493ADDCC7ED2A7AC0F46DA720B302A888991B6D883AC571650FB188F3BE52C5045F019B959482BEE91B4620EB262"
|
||||||
|
"9F7FECFA964927D73F511C8BA9D10D2AB90AA48F95AD4C057C40EE99F303AFEDAB6A1C007C25787FA672720D9BD921C066927CCBC39EC0393957A2EDF5FEFF6A87C76ACA2C9294050ED4CA4A22E76FF7394452ADD0C85449DF36B3ED335FB06FFA9E2E29BC3063B2BFB34BEAA44A60587E72A224BF14E43F83EDCB0061005D59DCAF46B7442F8479BD92FB1C063353226D79E7E18E14668FB4CD0C1B8097706998AD5E69BD80E1C13C8A976ADF16880D0C861BEF37B3FFA87E10BE14B056ED4D76DFF753201F31B39B24BD3F473DF6567DF0F93CCABF36402C9B2D767F0D894D12BA3AF75A0CC0DA7291DC9234C6F7FD030B48FAAEB7CFD941E4A9EF1278235223DE8F546C59D1298B43583768BE31B01A9CADFA0F447251A055B092A4BF037FECF338B1E20E3DADD3502261D0A2E4D64B48744FA79FFF1C1DBC06FBF726D11F7329BFC26383999A193F0C6CDDB2C9FF927459B06FDF98D935AA9F804AD226F45FE4CE27B6AE4A27EB92C4060E5DADD152BB89FB8B4A840B496CAE7AB342581FD9F75F4C5023FEC3BADDE8E47B1AA83A58E312FF4DE606B847D2FF79CD5F01E630B34E464D9DF2801A2B11CE2F17EDBEAB06CCDD266937E03A33EB35107052A46DB0FB573F14696B17B5DE0D0F4BFA719B3E6FB6D9DE0F13D5DE0FF7BF9C64C5CEA3EACFFF09D5FB3F632CA802D3A312EF3143031334495A0DD877986701D49E15A7CA99FD6BCF2A3FE3CCFF7F7AD6D7DF372FF6918BD49F3F7B3F8BA44315AFDAD70BB1FB7F2769E5317F7FEC584DA95DD48F796DCF057D7CF3FA8B66767BB07D7EEFFF98DFC29FDDB41BD584D1F548FA421680E813CE72E697B495A4A685537A60BA99850F804725FD077840D2C59E1E269741D1EB002066CAC9A5C25C81C4F24DF30C5C9B9A9900ABE22933CB658D870E88FD6E62A6FC5355EF66595FCE575C0493CCAC65102039AD819168C985929E56639D8D9F03979BD94315E85406734A92993D06DCA601F7F1C2C02672F75CFF37729BB70A62AE0300337B11B72AED915EF3D2AA8F4FE887D8C4E95392AE6BB3DFFF8BB475153B561B007CB8C501FC45469E8E1CC30FFC8A9D88BF7D6C3345B2148F3085C1D4798DEBCD95EF00A0296676293056F503A74FF771C8D84C32F6E1D6011CAFFA51E07833FB611F7A7443587466AAA46B4A923DDC882DE9DC5037C3CCEA02A080EB54DC0020513DD7CA99B9DF27E96B1AA8D122B919E2B16A2C20365CF01FE297A83E7E6C73354E022FF6FECFCD0550C3CCFE9805A8FB01E83D95B98F705FA42D961A1E122BFCD5367DD8A71603E05FCCD0BFEE3FE4621596FC07FC6B91EDFEFEADA257B7578BC5893A604D5A948B2C80309BA19F55F16E88B4B50C98CCAA477D4FD237BD572995E080ADD4F8E0B9DBCC622EA0447BAE91CBACF1599341560A7738027C17B823786DD7A4"
|
||||||
|
"7BF879E4E9720C1923E99B66362D736DEEA1C67BF35A40AB6A7143197F00709ADC826835D697E417E5794BAE826D8DA21627FB99EAE39CDED7AC63975CADC6A0DFF5B30AA1AD8815E0BBBE1BC1B507AE7F526170971FA11C0BF2F203FBEA060059FA602D4AF3F936E92BFDD6B49E5DD2F7FB3C464764D68A707D839ED3B6CCEC4E35A69CAD1E717DF8ECA0465357DBE241FD92E5C6FF36B2E94F45CB1EAE6441AEE120701EB9625B8962995DCEF218BEEAC80A8E85F9DAB1094F5E8CCFAABD497A2F18EDB448BF5F01615D92E1C07B0FD7AC22A6FF60FBB0EAADD6D7075533F37A30D7616637AB7EA091D771C7480ADD9D9F508BF476E047AA8FDD93A4FBCC2C2CD0D692DA00C05F62367CA8F823AF8F044A2C162811BA0FB6D5C0A8F9BFCD9400BE21572BC0E76649BBB778FD4C8D23E24D9AC9C80BDCFAD067A83175AF5F5FDC99C1FB59259D41642126602349E1F2BFA87DDD829E01E6067691334B862587FF6B6685C91E211CABC6D4CF5D80E82000B742D8270AD76AF873871AAFFBC67E85D16C26F67B354E8E3A5E232527F656638CD63C1A19590117B4D8D6D302543DB2AFE24B72F7CBF16AFC1EEE0B34ACB19259A86255097B5B121C38C95B51E8B260DB2DDEB6376BA34DDCF2949753CFEFBCFD46038F65ED3380355BC8BF9046B6EB40EFDB23FB3595D3E658E16A506FE356FFAABD1E055EA17119C61A61C640B7F2470177478E3B05B809382FBB4EF737D1E1D23EE5B73AFFA769BE34F34BB875CAFBA283EBDFEA15D68EC8437EA9ABA1653A9CD1E41A3F977DF627E05681FC37F1659901C2225A9DCA1EB1AB01E27E532113704BB19E063C14D93E0D3719C84B874E57E3DC82F8EFBF5DC64CB7F23BFDFDE532236E77FEB8FBE3B8C8798F253095D3781FED6535C056ABC1EE10D1A3464FAB0166C78DAD080AF00C702970318D2B52D6E83DFE0AD8CD3BD023C1B67059DE17810B1878B8FBBC0CFC0CD811B8C76B6FFA7002E6012606C79940076BBC0307447438B5DD7E4D8ED56A39C876FCAD1799111D5622FE256FC763F478E3EFF3FC9F21A748F01EE5D7E83B1D2722BF8A01C0DCC07FFBB80E57D3DE6FD84CF6481E007C1BF740EF86E373D6A19B07D0DF23FABC4A1F315011F99D7263AF32DBC86F387FE0D488FC5322FD0A1D0064FD6F68723DFA19008C066EEDE6E2673C423FF16FC02ADEC166E0559A02E604FED744F04CE0309ACF0EC18DAE9B160002768FEC7371B3FEC1BE4BD0F8C37D19B7AC71B7D7A0971FC034E0447ABCE936D163459A5FEF18B7024BB53F725BB9DD9CFF34E06FB8658C73A14BF921C3620090E93127702ECD2D4D3126D1C455D085DC113B00C8E4FF94D6F7B11A3381DCB38DBAB9FEC0A2B8077EC865CDF6E9417EA7DCD8ABCC36F26303807522F21BB220286700B022F1EF4BCF0380ECB873E3AC7D9DFE"
|
||||||
|
"FE6F00FA4F19071EF70E7A5CB06D395C74ACCF4BC08ED9F6AD70E6F1BA8B0E5C449B9929CEBC1DB25D177AC7DC005DAF9445673F8029B81FDE1DC071401E75E063BACC81B36E3C4CFC8B3015B80BD8959C061F6DCE7F0ACE3271277034105BBDAE48F9ED183603004F9FF5812B81379A9CF34C9C05E62FE41004D6CBF9338C0600990E9FC7DDB326457499861B6CE795FA15CAEEF601F49326DF8B9E56098CC8EF941B7B3AE1F6F29BB940FCC951B41017250C00B27DFE18B91E7D0D00BC636F0C5C4F7C903115F75DDCAE5F39EFA5FF01076B20B0EC6D496B99595D900BCEDCBBA4DC8A54D7050B06CD29B758C347E52A02DE686655AF6836E4C1CDEE9791CBF77F57D22B926E49297723039C35EB0B72E9B4A3E502765F91F4404E2B1126027083EA35E5822C67978BF6FFAF991511FC954834059749B78ADCEFFF7D72B574EE36B3A635757A15B410F566A57BC9C3B49048241289446270036C47BDC9F96146C6CA5389442291488C6C70BE6D9F29B8D4A30D5AECB33A704CAB3E8944229148240639C0FEC4D3625EC545F5FF1B177D780FF09AB7FDE8AA754F2412894422D107C07AB8C8DC6ED2913A4ADF4B2412894422512DE18A4A0D00EBC8D5E9FF82A44F4AFAA006CAE04E935B02F60149FF34B3130AD233914824128944D56419037D559E4B241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289442291482412894422D140DB424089442291280E6031493F6FB2F911333BA64C7DCA0438506E09F990E966B64BC9EA2412894422511EC0AA2DCAAB5F53B57E45023CD6E4BCDFAD5AB791C02C552B904824128944A27C86CC0000180D8CAE5A8F2AC8CE7D81AAF548241289C4F061D6DA3FC09D9246B5E88BA42992264A7A4CD275667659518A018B48DA45D2BA9296903477D63E49D29392AE9774BC998DC9495EBBF39F29E96D49E3253D2CE93233BB2D0FD9115D5691B4BDA455E4CE7DCEAC7D9AA4E725DD23E9AF6676750EB27E20779DF3604733BBBD071DD69414FA392F35B3035AECB3A7A4AD83E603CDEC922E659F27E9FF05CDA799D9511DECBBBFA44D83E6FBCC6CBB2EE4FF50D28F83E643CCEC6F91BE0B48FAA7EA07EEDF36B3C7227DBF22E9B741F34966767CD0EFEB927E13F49B29E9FB66765F0BBD2F94FB6EFAFCDBCC766BB64F17C739CACC4E6BB3DF619236089AAF32B37DBA919F1DEB2AC5FDD0DDB0B799E569AE3FD4CC7E91E3F1A2642E868F784D8F99D9B78B965BC3CC96CAF43847D277CA92DB0AE0EF9216CFDE3E67661B55A94F2900EF76B1EC6F8D0780AF15A0CB7EC0F80EE44F00F6CB4966B7E73F13B809F87C1EF2331DE6064E07A675A8C3A5C0427DCADCAFCBF36EC5BA3DEAF0F5C8B14E6DB3CF11917DB6EF41F69191E3DCD4E1BE0F45F63DA8"
|
||||||
|
"4BF91B468E717493BE5B47FAFEA449DF43237D3769D2F7EE48DF4B5BE8BC55A4FF5460D56ECE3D3BD64F23C7BAB7CD3E0B0213837DA6F5223F3BDE73111DBA65F35E6467F2633100E1E0AD1080D302B93380CF96213BD0E39C408F4A620080B570F7769FF5ABD0A50CFA75012C27E9EFC0AE79282349C049920E96344F07DD3F24E960E094BCE47781495A5DD2B540380BEC1A604E49D748DA469E65A60D1B49BA92E41EE88733E5AC5B3E2B01F3B6DA095846D23241F37449677429FF06499383B6A59BF48D3DE0FEAF49DF50B7A97256B318FB4A9A11B47D0D58AF49FFD8CCF42C33BBB549FF561C2BE989A06D059A0C56327E2AB72CB9CFE53DCACF8BF03B345408EF9DB348FA41158A0C1276546376DC0FAB50A40CF28801984DD2E13893635F00BF51FCCB3753D2384963B3FF43BE071CD2AFFC1E994BD209F4BF3CF2E19262D684D725DD27E92E492F47B67F465274C698688F99DD2BE981A0790E499BB5D9F59B6ABC51DC6E664F76297F8AA44782E6A59A74FF5CA4ADD96C2D3CC6E36636B1890ED748FA7BD03C8BA406170CCEF5120E505E91F4CB267AB4C4CCA6498AB95BA2938A6CA01CBA7EDE55A31BA34C9E941BBC0F39CCEC3F92EE0F9A37AE4297AA01E697F4D5C8A60DE9D3D23A58693500B84FD2C783D70A723FCC3141DFD9D5E70F10584DD25E914DE74B5ACECC1634B38FC9591DCE8FF4DB1358A31F1D02C2F35F42EE87F157B91B8ECF7C92F6E855507653DB326C967498A445CCECB366B6B2997D54D23E72334D9F6F01CD668DED38468D9F73ED15B3AC6CD5A2FF7F7AD4A16AFE11696B67F68BB93B2EEF517E78035E38B4EA00A3247D3AB2EF92A1B522FB3E2D16F47BB08D0EFB487A23685B0D78EF7B09CCADF8F7FC0F6636B6CDF19B62667F52E32068CD26BFE75D258516AF8BB2815CAFACA2E6DFE9F0FEF74AB0EF3449BB341B5C0D112E0CDE2F046C558926D5F22365B16672F16EEF64FFCF2969A74A342A0B1A7DE077B7E8BB143029E2B75AB90FF917468ED7D40F0C9C12E97F711FF2BB39FF0323B2EFEC43F6EA91E3DDD0A27FECDC730F1802FE1291D3CA34DBAB9CCA6200B2632D4563DC4578A3F7FBCF03BC13F49F0C2CD8A3FC9D22E7B259D0E7CB913E35BE13F4DD20D2A7ED0015F87564BF87BDEDBF8B6CEFE7C1EBCBFE7EE4D81745FA3D11F4998C73C7140E705944C7BEAD6F54180390C95F10783B907F6559F2331D2A8F01001EF5CF1F1763552374530D0B7A72016451C7A1C95092D6E9E578B8D94E687A7945CED7D78C3DD568122FCB5473881AFDB6FD4411C7E21D9E69D1FF1AB911AAFFEA378A79C4927D9FEF0A9AE7C745C8C7D84CD2FB83B69BFA9805FF4B8D3EE4D0B4BF668BFDBF10BC5F29D2A7E980D2E360B90C1F9F6570817A0BABD1173A53F17880AE31B353E4AC6E3E5FF11FEEB88C953063"
|
||||||
|
"E002330BAD07B903EC2C29FC3E3CA0E615FC860CD9F7F65F41F33AB84CAC1101B0B1EAB381CE967496F77E098241F970A09F188087236D1F89B475C206727E579FABCC6C42B31DB26D5705CDB34B6A16B8941B99DFF2D5A079B63E0E197BD8AF8F2B111A937F9E99BD3F78E516883942B922D2D62CC325E61E681A35DF8E2C6EE085A03934F7AF18BCF7070C616C40B8EF2BAD52FA3C3DA649DA5F8D83913D140FCCBDD8CCFED9EEB85D7058F07E76B9817E8DD00CFBB64AF0FD67839050CE64493FCE623886036705EF6797B443158A54846F3D7CD1CCCECE52719FF5DABF57B24E85D3CF00205694279C1577CA2A91B64EF2C96351BFB163E50A30871AFD904D072BED30B387D438F35A48D22DC05E389F6EA258CE948B94F7F96293BEA16F7A921A6FA0DD12FAE8C320BEE5BDFF5F527DE4FCB2B818811A615D83873A55C2CC2E50E3C07A6149DB066D6FCAC50DE486999DA7C6DFFDB73213F5466A1C049DDD6DD0658F9CA0C6C1CF1FCCEC9612649742F6B01B1334F79DDD3414C8265AFEA0FED226FFAF0B2C598E56E5D0CF00202CC221B968D85E88A5B17562D68B5921CA4889FB8DDC08D9278C24EF96C3D538F35A306B7F36F3918D881F641598D9736A1C502E09F80FDE5A819DD0D275430E4160F704EF17C305DD099797BD40D0D7EFFF41496B79EF433379DBD97FC0BE6A3F983FBEA087EFA1C1FB0FCAB902430BD74439575CA1E016AB593D68BED5CCF62F5A76058445B4966118E7C07BFC5803F7F3997281DE35FEAA8114D9D9E40205870D5D0F00808581D3D5E8677C4BBD9B41C39C5E497AAD83FD5E8FB4E5552E78B62C38A7F65A13D81E57252A8C4D9829E9E47E84653ED003D418E12FB92C83EFC8D55C781117003762FC73251256B634B9743F9F5855B0583C4CB784B3C9D924AD96FDFFA560DBED6A1CACAC29BD574572EE605B57152BCDEC7E4927B6E8F2A4A4AE0A1E7521FB52496121A6EF4B5A3B683B231BB41506AEB0D0DE41F344B95CF1E1C8496ABCFF6C57811E65E31771BAC3CF2831B30755FFFBD92CB0B60D695A159C591A0847F8B3CB059BC5F63BA595CFBE0D614095D4993B615287C7EA856525FDB7C3BE7FCCA32CAF99FD06B8596E16D4CC95F131B901C8F78023CCACAAFA07C391B3E47CDDBECB651D39BF788DD02DF09AA40B72907DA35CDA912F7B4539737C985D739DDCE0170DD422A899C7C3EFCD3435067875C221723EF7D0D225B952C945FABE7F2BE94A0D9CDB8783ED1354F0EC3F73F3FD458DF79383B287C2B0C3CC1E01FEABFA80D30D81D1433CCDB1299975ED010D5870CF8B743B5EF52EDE1524F59CF53528A1B752C0356EE8C74F0D5C1F3966DBBC7660F1C87E1D95718D1CAB97F39F82AB499E3BC00EC02DB8D29CADB8948246A48C9034C0E0B857463EE3F9B36DCBD35826F4DC7E657AB2EF8C"
|
||||||
|
"1D1B78DC6B7BD9EBFFB4D7FE62D67662708C989BAC135D0E8B5CDF1A8F50F02C08B8B685FCC38B949DC93F3622B7EF417E135995A60106BAFC28A2CBEE25C8AD3C0D7024D26F25C0E9723E928DCCEC9D769D5B109BC97FA883FDE68BB4F5A347374C93B4AE9915920664662799D96A7233BA13243533776E2437424DE443E8C69A5D035501375563F5BF3C66FF35C282404BE1D2EF16F7DA7C7FBE1F07F03160393556E9EB3A360537F80E1728F2595A39A5FFB5E010C5AB7EBEAAC66C815CC1AD6F12661CBCA6D6D764B870BA1ADDAFA52D0E942897560300E41E72B5D7BB727EFEB1723E9163257DCECC7630B3D803BC1B62BEFC4EA22D3F15691BD7A72E3526C8D54EAFBD4277C828B5AF16D73766769799ED64669F90F45D49B1C22BDB5252319411C039727E5E9FDAE71C56FF7BD1CC7A2E3E1521342B7E4A2ED8D6FF9DDEE1FD1F46CCAFA7C6DF4458DFA0130E932B71DD8ADD6992A69A076676A3E2E5754F36B3D8FD22177055158F51BD9B1349FB98D95345C91D2C6413B9B032E6FF51C1024189E2693500B8D7CC66F35EB39BD9DC66F631335BD5CC76CDD11716CE7CA478319390302D48EA2C7BA0139E31B3756B2FB9457AC200991FD166D1984E00D6C1557AABBDA2258DCDEC1C398B40E8E6984D52EEA6F91209D3EF24E97D6DF6896DEFDB2F9D0D66C3457356C315AB0ABF9361BA5CBF5CA7FA4C90B9D41884E817F4091F905F526316CCBFBB5100E7E209EB1FBCA646CBC88724FDAE9B63F7C0B391B6A2D3FE8E556319E5BF9B595F41BE438CB440D008218FC580F2E01A35A6C07DB983FDC23E28FF9BB224295B692C1C19CF2F298FE588CF925BE7BDF66AEA57CE8AB5C46E468BE6A04755BC14696B57542A96EE9997F5278CEA9F4FF1D4CFDCFCFFD27B05819E0F9A7DABC30433BBDEEB7FBFEA0B0885168AD7CCAC630B40E6D73F448D6E8EE3E42ADEBD1DB47F1388A5030F4980AD256D11343F2F69970AD4A98CB440D0C861500C00CCEC5135A6352D418BFAF6B8DAE661C193BBB29B62511C22E70EF1F93EFDA7E48555E03E06C4AC1B35C21BB434749723955C11A4D0ECBE32104DE9CC1E54AB05CD53D57F2D861A17A8B1D2E336C1FB27CDECBA9CE4F9845635BFC264ECBBEDBB84C26A941D1700CAD84F8D3104CF483A2C2B971C0666BE4F8D79FB4312605149BF57FD6F6B86A49F9A596C15CEE14E5A20680430280600197F8AB4ED4F641113E0876A4C03422E7DA830CCEC4E35E68A8F96F4AB3E0F7D63284A6E89E1864C08601EC56724ADD60E18D464568D7000F86149679215C3A9913DFC4F965B9DCDE75E330B1FDAFDE813A6CE85B3FF3C4BE0FA8405817CEE88B4B5AA98D97101A0CC9FBF5B64D3615ECADF416A1C187D1688ADE239D4F8B31AAD4AA79B59F8201C299CACC680EA70C5D2C470812E56C32B5087D88A80"
|
||||||
|
"004FE2D2DD2E01FED7A44FAF4BB1D6647774FEC00AC0D4A0EF3BB1877517B21706C645CE690A2E1DEA445CDADB39C0CB917E932920208B92D2003359EB134F791C87FB5EFC813F094000002000494441540538171813E903B0797B295DE9F38D2672C0A502F6BCF2651BB9B195FC6A6C18E9BF4A8BFE1D476F031744F66F701F00BF8AF47B851E57426CA353ECFBD777AA6744CE1E4DAEDFE3B894C74E5E3DBB0219446980815E97063A4DA6A00264A434C06A61700C00E6A53117BA13EE24CBD5EE437637CB019F1BD1A12F7F302EF86F7C0FE70EC5D522286D0090C93BAAC7F32F24400B78A189BCC2DC4CC028E0AD88CC3769927B4F7CF0388D0E0354810D81E9C1FE3389AC8608CC811B90879CD6E7A9C7F42A6B00F074444EB71CD787FCC13A00D82CA257218B2F9106009530985C00CAD27BBE246766EFD4A73D5DD29E79997F3BE4103546AE7F933E66856676955CA04D377EDBE9928E2EAA1641D998D9EE7291E5B1AC8018D3251D6B66B93F14329A059416B6567AE67E8865B23C906D8B1133F53FD145BADCA16ACCAAB8C6CC1AAC6A993B205688674B9A64AF0C015A55441DB18CE40582460A836A0020496636D1CC3696ABCFFC6FB52F093CABA44B80EF16AE5C46B67ADFDF82E651927ED9E7716F32B3E524ED2CE93F6A8CBAAE31516E90B441F6D01C3698D9BE7275DF2F9034BE49B789922E96B45EC1CB20C7AC3A33249D51A04C291EECD72A9A3F1607D0518A2EF073D5AF3428B99A1F0734DBC7CC4E8CE8334AF181416268335217081A11C4A2C907153833E6FFC9D5C09F45D21B72CB90866BA0CF9074A499858B770C597001702BCB9DFB07E52A263E99A5248E0880D5E4F2B26BE7FF6C96A694480C0B708B0E85EB8E1C6A6645575B6C0BAEC0D8FDAAB7929C6B66B9060402E7C82D7856639A9985592DC30E60867A9B886F6B66454F440627C09CC0794D7C713FAC5ABF442291E89426310027E3E2823A298856B47ED7E202006BAF97E863ED97E0D86B64E719AEC13122620068BFD64B33C2B4E49107B01F0311F9D381A666CB442291188C341900D48895431E36008F3539EF340028610030A4835FCCEC10E01149474BFAAD99FDA56A9D1289442291E89033D59B0BE0E9BC1519B250F0D2A48944225114C90230722D005533A42D00355AA447251289C460E769355F6FA0D932E0C3855F4B9A27D23EA36C45128944229148241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289442291482412894422914824128944229148241289442291482472C6AA56209118AC006B4BFA94A4D924BD28E93F66F67AB55A25861BD962667304CD53D21A2789C201460377042B31BD03AC5CB56E65016C1F598D6AFBAAF51A6C8C94EB041C0C8C8B9CEBF155EB5604C07E91735D"
|
||||||
|
"B7641D96054E04FE06EC5CA6EC4CFE4AC029C0F9C07625CBDEA6CADF15307744FEA965C94F54C7AC663611D854D2759296CCDADF2FE91849AB56A659225101C0A592366AB2796699BA8C148005255D2BE9A359D3B780F9CCECD725C95F42D2351A58956E73602E333BAE0CF9894455CC224966F682A46F491AEB6DFB3CB077255A25121500ECA1E60F7F292D515A14EB68E0E15FE3CB25CAFFB21A97A4FD6A89F213894A98B5F68F993D086C29E91249A3B3E67D808BCCECC94AB44B24CAE53B91B63B255D2F69AAA4FBCA5567C4304612AA8F497AA964F9212F96283F91A88459FC376676A3A41F487A5AEE473151D26EA56B954854C3A783F78F485ACDCCF631B303CCECE22A941AEE98D92D920E95F4A69C95E52E49BF2A51FE15722ECFB7244D9774B3A483CA929F4854C5AC6183995D28E9C20A7449242A03985BD29C41F35D2912BB1CCC6C3F49FB01739AD93B15C8DF4DD26E55C94F24AAA06100305800464B5A5ED287254D92F488998D6DBD57217A8C92F47F92E695F4A299DD5DA2DC65252D24E95D494F98D93365C8CEE42F2F691149E325DD51C583105852D2627296AAE7CDECA102C585695892BBEE95002C266929B9C0C387CDAC329334B08CA4C5E566C8B717F980ACFAE15BB5FC4423DE6F6186A48762CF81EC7EF919B9FBE50449B7E575CF0216970B909F29E93E337B398FE376207769499F90738D157DFF1B1C003F01EE02DE0DD252A6030F007B15203396DEF603E030E0D5A07D2C701410CE16F3D26525E052607C207726F018F0ABECCB5E08C0FEC09840F6ABC0A14DAE53AEE94AC03CC011C0D311592FE252C516CA51DE89D9B50EAF37C0646FDBC379C96CA3CF36C0FDD9E75DE35DE0066055E02C4FA7F1C08939C88CA601669FF7FF82F6B771A9728BE471BE99FC3983731A0F1C9BD7F18780FCB66980C062C0A3113DFF9083FC4AD30081EF46CE6B34B025705FF05B98065C8B7B38D6743F1E7839D07F02F0273AB84F03BB06B29FCDDAB726FE5BBC1658A1A06BB1307012F07CE4331987FBFD2FD9FE48430C605EE0FAC849C7B809983747D9B107DB136D74B8999C0701C04EC0940ECEFF765CEA54AE0097B591FB78A42DB70100B022F1077FC80BC02A39C93CA703790085CFC0813F527FB3099910B93EE7E420373600B8B0CDF5788A9C066254FF00AA5A7ECB0140A6DF9D913ED792C36460109C7FECFEFB575AFF169E039600EE6DD107E0860EE4FF3CD867266E12D28A57816573BE0E5FA671C219E34D608B3C64CED2BE4B699C2B69ED0EFBAE2EE92F05EA22494BB4D9BE9AA423F212067C432E1069F60EBAFF9FA4BE6FFC81FCC3247DBD4DB74FE5293390BF88A4CBE44CFEED5848D205C0FC45E95336C08F25EDAED6D5393FA4CEAE4F1E7CB3CDF64F4AFA6D198A2474A6A49582B607246D318C6354B657EBDFC2"
|
||||||
|
"C725DD21A9DD4C7C2DBA2F2C65927EDAA6CF7C920EEEF2B84DC115DE3B3F3B6E3BE696741AB041BF7207450C00B089A4F582E6FB241D25579B6065497B69203D5192360196283845F12549FF928B41585E6EE0E1B32D7044BF3AE046F1BF97E48FE6914B3F7B44D2FC92BE22E983DEF6B580ADCDECCC7E6467F21791F4E3C8A67B24DD26692E49EBCA3D788BE258491F0BDAC648BA51CEF7B7AAA465BC6D8B48FA8DA49DFA947B91A427E57E0BFB06DBFE2B57204B7211EA8580B324ED1FD9F4BCDCF76FAADC8DEEF345E9D0848724DD2A3751F882A4A583ED5F2B599F11077094A48D83E617246D3602CA523F25A936835F432E0EC0A756BBE151B9CC8D5172F7A98F07FDBE21A9972A9E4FC8DD7F246915B918039F3CAB65FE59F5F777C99DD7BFE5EE7FABCB3D836ACC2EE9386099213F08048E8B98395608FAFC32D267979CE4C74C507787334CE0CF917EBFC941FE0F22C73D3CE8B30AF056D02797B4349CDF3FE4C2A0CFFCD93509E9DB05808B7B98161CF71EFFFA037300D7047D5E0362C17BBDE8307FE4DC4ECAE3D81DC8DE3922FB1E0237177060A45F512E803322FD6E8AF45B3107F9559BA0AB961F7501E07CD3A119FC0D608D9CE5577DFEB1FBEF0D782E566014CE1F1F72359E1B04F73B1E1BF479AE8DFCD005007039C1BD05E77209E9BB5A2EB059E4B8D710B87788BBE5FA2A9B3D585C007F92F425EFB5AE99854557FE13D96F8102753AC1CC5E0DDA0E91148EB6BE9083AC7026354D817BC1CC6E977479D02FAF6090F0868202F356762D4EC8495EC8966AB446EDE75F7F339B22972BEE33AF5C15B9A14EEC1C7E13CEF0CCEC4095578EF8F448DB9591B670B695C887A5251DA67A33F8BB927634B39BAA51A954CEF23332B2596EEC1970B03F03CEEE19F7047D3ED483FCE3B37B8ECFBF22FDF288C5FA56A4EDA0C8CCFE1772752A7C42EB50570C0A1780993D2267EA96F4DE686F75B9D4A30FCAADC61696EA54D65E140D655FCDEC05E021499FF59A17CF4156184CF26893549353E5CC5235DEC841B6D4E8DB7F3C3200938A2B85FBB9E0FD6B92C69045FA7ABC2CF703F0BFB79F55FCC13494F87FC1FBE70769D1A1F191B6B94BD76264B0AB1A5D82BF30B3F32BD267303029D23639D2F656F0BE93B8AA4E88DD6F3F90C371C3388627CDECE6B093993D0EDCA57A5760E896E88A413100A801AC25E96792BE28E7771E8C8C0BDEF732BA0C09033F5E897532B36BE4162DC99BF01CCAAEB7105A72E69337206C436ED92015F2E1E0FDF39568D11B6949F16208A3FB276B201E25D11D457E47F3387618CCDC2AE3E839D50F00FABAFF0D161780807DE55604FBAA06EFC35F6A0C06CBC3071D1EA3B080B30EE54F28597E3F9FF7FB73D3A23AC27318EEC15D89EE9953CE559A187E84E9E4314B5B8D89C1FB59819E5DE183C202007C5D2E"
|
||||||
|
"A2FB7D5EF33B7211DAFF9333BD7C5883A33E77F8B00CFD44BD3045F566AA5C02DBBAE0DD407E21458E5A10FAB5BA6138CC40A706EF47477B25463AAB02FB9BD960B80F26F223BCFFB79A1085AEF019FD54261C140300493BABFEE13F59D2D7CCECBD220EC04A1A1C038070B495C76C7D82EA6FFA9DE482E6C944D5FB723F52B2FC099216F5DE8F5563CA4F33F2188055CD04D55FF3DC8B3C25862457C8997BFDFBC1DEC095667657453A25F2E775D5DFFF5BCDE8C365B3FBB2D60E161740B80ADB9DFEC37FB090A5A584816979D4E70FFDDDCBE216A709E51F82AB80557BE5150D1CD6315816577F3BA4A8D9F603C1FB05256D606693622FB911F294ECFDD0CE81753C16BC5F0258B3124D128385CB246DAAC649CF07945C01C38D0783F79F06960B3B010BCBD5C4F1E96B7D80C13200084DDE31BFEE97CA50C463EB300F54D21E6A34CFDE9183ACAB83F773CA5945DE039713BE855CDA55ED95574A5818713A4AD2CF03F9734BDA2E277921B1D5278F6CF223585E2E56A4B43CE5120807BB26A961CD07604F0D9EDF6CA2582E33B3696676AC068AD1D458991CEA8F24060D5704EFDF2797F217B2AF1A331AAEEA47F0607101BCA07A33D7CAC0C9922E911BF16E2C69F3C87EEF8BB4E5C51725DD035C2967225F4ED226419FE992CECA41D65FE51EB87E25BC83B287DD4372F10F9BAADE4C2E49FFC841B6249D22694FD50FBC76CCAC00B7CBA5627E4505950236B32B80FF48F267BD1F97742B7099DC0CF97D72292F5F92FB4E7C1A78C5CCDA95EC1C0A9C2CF783F7A381BF24E92EE02AB9EFD9CA2A7F109C181CEC2A5795D2F70DEF095C91D507490C61CCECAFC0CF54EFF6DC02F8B85CE6C774B95A2D61B5DC97D4A73568B00C00FEA6C65CC8EF67AF56141D2CB5B41A4DFE3E179AD9FDFD0A31B377805FC8CD6A6B66F6517233FE66DC2FE98FFDCACEE43F83AB7AB76BB069FDEC55063BC995BDF41F821F90F49D16FB6C0C1C90B905862C663609F8AD1A3FCFCFA8CF3CDFC4D0C7CC1E048E907480D7FC7E49C703AB0E1337D84867374997AA7E86BF5AF68A3143D2CFFABDF70D1673E2EF25FDB34D9FD7D458E0A1DD823DBD325D8D66F19047D4F8C0EC19333B5DD281EACCACFF90A46FE6FCC3FFB91A4D8D2137AAA0624066F6A89C85A565D94E8F07246D3AD41FFE35CCEC28394B502B5E932B08931861645520EF0D9A57D4E0088C4EF489995D2DE98772D96FED9826694F333BB75FB9836200903DC8369674B81A73A067CA9580DC506E611A9F55FAC9816CC16B923692338D8795A6264B3A4FD29722A582FB224BEFD958CEDC177BB88F932B11BC8A993D95B3EC297235188E5363AEE93B924E92BB26AFE52937D0E116B955CF8E96730BC57852AE24F32A79585F061366B6835C21ACF0DC911B906E14D9AD9F14CAC4D0623735A68CEE06349B"
|
||||||
|
"252686106676869C1BF432354E7625F7ECB956AE54FED1B9C8CCE320799205DEAD2DE913720F9EDBCD2C8C922E539FF9337D3E2C57A1EFA6BC1FFC4DE42E24E7F75D40EE26FF785935C0B380BFB5E562122648BABE8C738EE8B1A2DC7A071F92F4AA5C89CC5889E26107B0B65C99E9E992EE32B3878075D4580DEE1833DBAD74058711D9F73D4CE73DD5CCDAB920138942C832CEBE28770F9E456EF277B399955DA42D91489401F07960BF16DBCF8EAC06B643993A0E4780E523D7B597E5631389442291E80EDC92AC0FE1967FBD2C9BEDD7B62DF6FFDBBBF3205BAAF200E0DF4150A04424687025A8892B46346E880B89B108042441895B0296808A91A891481435115C826B702B154A408C5882286A447141232A22228A821B82282285B288B2C8F2E58FEE81BEE7F6CC7B33D3F7DE796F7EBFAAA9F77A99FE4EDFB9F776F7E9EF7C9D994766E64DD541EAAAAC1E19CCE264F398E90FF79C00F40DC302806165E6513D07A1AB33F3F29EF9735E3FEB76AFAB32F37D997965665EDBF3BADE94CDED2758AFAD946180B0DA5D184DC26B373177A19AE01F2EA5B84A5DBA12F30F23FE5429E55BD36C0C00AB58663E3333CF5EE08A3FB32901FDE259B7755D979947CCF3FA7E3D2733B208569C15370A0056BB6C9E03B07334A300368F6648D0C511F1D5883851E197E5CBCC03A2296D7D87689E86F9B368AEFCD5D907000000000000000000000000000000000000000080F55F666E94990766E61999F9C259B7679232F38B99F991CCDC61D66D018099C9CC4764E6B99D07147D61D66D9A94CCFC8BCCBCB9DDCF1B32F3DD99B9D1ACDB0500539599F7CDCC4BAA2714FE780A719FDA3E89F2ECCC7CD9A4E375E2EEDB1EF8BBDE37ADF8404464E69699F980EA67D359B70B5693CC3CA13A187E2533B79842DCE775621E3EE97855EC5D32F3BA4EFC9B32F32FA7D90658D532F3E09E67A33F71D6ED82D52233EFDE73207CF09462CFEC04A08D7F74F5DDF3E169B76135DA60D60D00202222768988DB75A67F5C4A3967568D99B2CF54D38F9E492B56192700002BC39F56D317CFA415B3F1836AFAEE3369C52AB3E19A56C82623F39111F14711F18B52CAB727DEAA26EE432262EB88B82222CE2CA55C378DB83DEDD822221E11112522BE524AB9664A71EF1711F78A88DB46C46511F1ED59BD06C054D4393757CFA415B3714935BD61666E594AF9CD4C5AB39A64E6B332F3F2CECF6599B96966BEB9FD7FD7C5997958666E3C81766C94998764E64555CCCB33F31D99B959667EBD6AEBB306885BEFFFE5D924C51D96995775DAB1FF10FBB9403BB6CCCCB7F7EC7F66E63599796A66EE3970CCEFB6FBFBBB9E9857765F8F21E3566DF8D79ED7FFF13DEBEDDDB3DED39719FBA3D5F67E9399F7E9596FA3CCBCA05AF7ABCB89DD6EF775D536C732BE33F31ED97C0EE7"
|
||||||
|
"D6796BCF3A8756DBF9C95AC6DFB9DDE7EEEF7EAC67BD7FE879ED8F59DA5E8F6CB7FE3CFF3A33EFD5B3DEC6EDE7A2BBEEF7971BBFDDF6B13DFBB6A69F5F0E11BB6AC73BABCFDFC7878EB140EC59E700DCB9E7FBE7CED36EC76A33D703B07144D499A69F8B88C7F4FCCEDD22E26511F1C8CCDC79A8ABD26C7A1A3E19113BF52CDE22225E18110F8E886D23E2F69D65439C88F4EDFF9B23E2D9D5BC9B0688D52B33B78D888F47C4D8C1A7B54944EC18114FC8CC2795529E3B50E83BC6F8BECFD9BCF3FF49DE2EDAA4A70D7D6381FBFE4EB75D66ECD322628F6ADEEE11511F64778A886DAA79672C337644C49931BA4F5B64E6B6A594EF75E6ED111177EA4CFF75CF761E516D67AD7AEA4A292767E63763F473B77B66EE5A4AF95467DE7F54DBFF7D441CB63631D6E0F418BFDFBB6744BCB19AF7F71171CF6ADE2707881F11B159CCFF19988FDE38D6790B7DA9F71DFCBB768CE62039943745FFC1BFEB09317AF09FA4BD7BE64DE404A03DF9392EE63FF8779588D82F335F3389B6AC421F8C886BAB794FE859AF7E6F66447C6880F89F8DE660DA55F77EFC5535FDA09E5E8A0756D35F5F441B5E1EA3AF4189E6801F1111997950CFF6DF5B4A39771131E6F3C1685ECBAEBED1277FD3336F9699E2374C609BF549EF2462AC54D7C5F8FB60935934643559D355DD8511717444BC3B22CEEA59FE9CCCAC135716ADEDF2EBBBA23D3322DE19114746C45A75690EA8F4CCBB7142B1F689A667A3EBC888B85F343D2EFB47C455D5F27FCE616EC31C1E118746C4A77A96BDB75D76688C1FA4D60BA594CBA2E905E87A54CFAAF509F1B9A5946F0E10FF9A88F84E35FBA1D5747D85BC41443C656E2233B78E887B54EB7C7E116DF87644BCBF9AFDF0CCDCAFED867D49B5ECA288F8CFB5DDFE1A627F2BC6F7FFD1395E83A23E29BAB09472F2106D88E6BBE5AC057E6EEEF99DB1DB3003B84B357DE90462AC48A594AB63FC3BEEFEB368CBAA9399FBF4DC7FF972666E56AD777CCF7AAF1B20FE213DDB3DBE5A67D3CCFC7CCF7AFB0C10BF6FFF3333BF94992FCEA64AD6B3B349CC1B5C8E8F81BDA0679DB7F4B4AFBE325C4E1B665607606D63E7E87DCA397B0D10FF5F167A6D33F3AE99F9876AF960BD5F3D7FDBD33BCB9ED4D3B6CCCC4F77D6D9AB5A76D912DAB06536F93D5DE767E67B7A62EF37D4BEB7B15FDB13E3999DE58FEE59FEEE21DBB040DBDEBAD06B3F609CADB3C9B9E95A567ECB22E3CF3407A06DC317ABFD3F76066D383033CFCA262FE69799794A66EE36CFBA0FCFCCD7777E265EB06922B2FF00387660CDCC6D33F3C66ABD2F0E10FF0BD5366FC8CCFB2EB59D4B88DFB7DDA9752F66E607AAD8BFCDAA00483625429F59FD6C3D601B56F309C09699F9FB6ABB6FEA2C7F7EB5ECE6CCACAFD297137FD76AFB577696BDAD679F339B44B48DDA750EAF967D7689"
|
||||||
|
"ED38A027CECDD574DD5BB26CD9BCB7EB72B01FE82C3FACA75D8F1DBA1D3DED7A5A4FBB2EC8CCBB0E18E37ED924825E50C5F9DE9A7F7B38B9324E00F6CCD1E3CBCD997952663E6F4AF14FEC799F65360599C64E3833F335D57A9BF56D77255B5462579B9854BF31D7E6BEF59AFC5935FD8352CA8F06D8EE727C6E8AB1EA84ADCD22E2CB99794C363D0F5B95527E544AF950F573D114DBB8DE6A871AFD5F35BB7B80D9B15A76CEC0C3613F1B11BFED4C6F9E99DBB7FF7F5C677EB74B788B88D8B5FD7F5D2D6E31F7FF6F514A794744D4B735BAB7C26E88265F6050ED67BD8EDBDDEF1DAB65E79552063F11E9CAA6B7EF1D313A54FABA88786E29A51EB2B61C8F8A8857C46882E985D19F83B45E2BA51C1FCDADA5EBE76645C49323E2DF261D3B330F8E26D1B4CF0611B17F667E66EEE42F9B5B63CFE8AC73697B1B639DB294CCEEFACDBF79EF5A8B73876AFAE7036C735DF2DE88A887346D11117B45C45111F1F3CCFC5666BE293315C8988C3AA37CBBBCB54B6FFB6A595DB56C594A293744C4D9D5EC1DDABFF59F77E6BD27464F14766EFFADEF952EE7E4F5E0983FD9F5B852CA5796B1ED857CA29ADE2633E75E83EDAA658377C17765D3B3724C44D4C3D00E2DA54CFAC2E0C68878659B1BB11ABD39C6DF0BD350F7325C1EE3C7A19D22E2BBD9DC023A33462F5C87181134754B3901F85D353DD430BCAEA914DB5929DA44B05DA249C4EB4B38DA28221E16110746C4F773C0FBCFDCE27F62F4BDBD7134C3E11E1E4D41AA394365FFD74EAFA6B78BE68A642E333C23E223317A75FFD86C6E9575BBA42F2DA52CB93E417B803B7F9EC5C7CF337F08C7C6F8D0BADDA34976EC0EF5CC68460E4CD2DB633C11F413A594D74F2056FD79DF30228EC9CC174C20D68AD69E789D1CCD30D09145138EBB438C0E313D2D22B629A56C1D4D727A3739F14ED19C7877BF136E8C88774DB28D93B2941380FA8A7F88F1B0D757D3D31AEAB76294522E2AA5EC16CD9BEBA3317F06F0E611F1D2F4C8CC419552AE8AF1DB004F8C883A01E83BA5943A6B7D08F533DFB78DD1E17FE7B6C3EEBAD9FDF78FCE688056DF689DB596990744C458FE4DEBDF97B3ED8594522E8EF1D1183BC678CD83B34B29756FC960B2C929A94724FD2422F69D44BC52CA07A31962D9CD39BA4D44FC57666E3589982BD82B63F476CFE511B15F34956827E941D5F41BE6BAF34B29474473ABED670BFCFEE1A59425E5DDCCDA524E00EA37E595BD6B2D4E3DFC63B5BDF16F514A39A594F2D452CA5DA2E9727A638C0F938A88D8CBED80C19D544D6F1FA3F7A22306EEFE9F534A39259AB2D773EE1BA3430FBFD4FE7B42DC3A1CB5C4F8C1EA6B4B6D437BCB63A183FC0E9939910361AB7EFD1F1AA3B91811FDC35507914DF9F1FF8ED1EFC56B22629F76B8E8449452CE2BA53C2322BA5520378BD59707F0D4"
|
||||||
|
"6AFAADA594234B2957F4AE3D9C0BA3B9D5FA81687A02477268DA7C93EDDBE55755BFF7D252CA81136EDFC42CEA04209B31FF75419021C6E7D7DBD8367BCAB1AE8FB219627648F5F3C0885B4E060E2AA56C174D3D84AEDBC59A8B35AD2BEA1EA088E6D913D3765C8CDE63BF778C8EC1BF399A2F8849E95EBD6F12A327C29F8C8828A55C18A3F902DB54DB58CE95C821D1D49DE8AAEB3FBC7282D9CEC7C668FDFB0D63B442DF8DD17C090F2E9BBA0347C57845C0579752EA9EA149A97B6FE6EB89595FD525A0D7BA96C572B4DFB3CF29A5EC5D4AF9C7BE138E52CA25A594BDA3C90B797044DCBB9472AF52CA24EA414CCD4227004F69EFC9741D18E30F101A221BB7DEC68651657EB66DA9BB3BD7077F8826B3FA559D9FBEE71BFC6FCFBCBE72B94BD557E4A82E2E33297D5757235DBFD9143D9AE8DFBFEDF6FB5277568C56233BBB2AD13BB43A0F60CEAFAA2EC653E759EF974B2D4ED45EFDD6436ABF194D11A8AE3F8988572F25C69AB4B761E6DBB78888334A29932A08F6AE182FC0744229E52D138AD7E7D7D5F42C4E8267229B678DD495FF7E3A8BB62CA494724329E57BA594B15A2DEBA2859E06B873449C919927477315F098B835EB78CE35D1540A5CAEA3A239B9E8BE019E9B99F78CA64BF3F66DEC870C106B4529A5FC2633BF16A395CE5E94995744C411A594AB32F301D1BC3E5D374693893A94FACB2722E290CC7C5834278A474F3033F9ABD124FA74879C3D2733FF3822CE89E6AA6CA7181F2E3A09274533F4A8CF5095E7E6F3F968B2F06B75E6FD89D13F346A397F9F37C4E8E7EFE668AE7E3F9399FF14A3F7499F9F99EF2FA59CB78C78F3F968CCFFFA4F243BBC1D675E77B76744DC29334F59E0575F554AF9C624DAD45A4D8F6B5F4DFBBAB2E4FC95F0D664B08211395ECC646D4DAA10D0B2B7BB88F88FCFE6697FB59B32F3EA79F6FB8481DB709F1C2F7AD235DF18D9A1E29FBE88BF79D7B20B0155EDD83433AFE88973633627621395E34FDFCCEC2FCAF5D39EF59634463F9B4A9775C19F933ACBF7E8593E9127D565F3D4BFBED7E0DA1CB0004F15B3EFB55C1BBD15E296D10E4F031CE5698013B6D059D79AEA509F1611070DD8968362B4FBB54FDF55EA3AAFBDC7F88218BFDFBA41F48F88382D9AE7030CD986F3A3B9B29C9597C7F810D3DA7C5DE483698764F675439F35A12BDE5A7D157F4D34897FB52FF7CC5B740F4536B7D60E89D1DE976BA3C9C88E888852CA89315E5B60B7CCDC3506D63E5DB4EFDEEF690317E0E95AA827749AEAFA0BB799492B66E3763DF33C7171C2163A01F8CF68BAF7EB27A5FD369AC235BB0CF528E0885B3EF87F1B4DB25B3D2AE0FA6892AF2672EF712528A51C1D114F8AA6C849FD9ACFF9613445421E37A1ACE47DA349C4AA93F23226FC64B252CAA9D1FCFDBF11E3E37EAF8CE6E12B7596F0A47CAC"
|
||||||
|
"67DEA4BBFFE7D455FCCE68EF8DD7EA62383F5FE2F0B88322A2EED938A694724E35EF1531FABED820225EBB84786BE3233DF3EA1102EBA33AF9EC8E3369C56CD4F946D7AC8B95F5D649B9401778DB35F3F43E4241D8000003D7494441546CEAA1FF5D660E51F96F4DEDD92C339FDCC67C46DE5A7E71A65DF5D3924D37F42E99B96F66EEDFBEFECB7EEAE222E2DFBD7DDD5F90CD3307A616BB8DFFC0CCDCBBFDFBEF96C33CF590754466EE5E7DC6AFCE75F5412B8BD0B3DFBF9A62EC59DF027851B5EF93A8B541658D5D5FED95E6549FBBDD9EF9CDA21CE48AD076434FB4DCE91AE25F1CCD90B859C53F37228678D63CEBA6FAA4FED4298C055F093E1DCDADD7B9E19F5B65E6B34A29931C7ABA52EC514D4FF3592CAB96CC4B6045C82601F0E068CA62770D9AF0BA52B5CF8438A29AFD96CCAC4BE3AE3732738B6CAA9A7647415D114D412626CC0900305399F9B8CCBC2C9A5C8FD7C668F2DB85A5948914FF59A10E89D1B2D05B45F354C2F5D5DED194FB9D737D44BCA494F28B19B56755710200CCDA6DA379C84A9D099ED1D4275835DA5E809DA349869E7B285AFD9C88493825229ED6FE1C358578738E8B5B939ECF8B883D4B29C74C31FEAAB65286BF00746544BCAD94B2EA1E7AD59E041CD026E33D3BFA877C0E1DF38288987A75BB52CAA5997958449CDF3E1889299A3B01F861441C592DFBE194DBB236D69576026BEF92686A80DC2D9AB1DF1746C4FB4B29AB61E8DFBCDAB2C7AF5CE38AEBB852CA6B66DD0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D629FF0F4A0CD12A5E549F170000000049454E44AE426082";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //TEXT_ATLAS_PNG_H
|
||||||
|
|
||||||
@@ -320,6 +320,34 @@
|
|||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Standard OBJ format has colorless polygons where there is no texture. This policy can add color to vertex when exporting the OBJ.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Texture Vertex Color Policy</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>TextureVertexColorPolicy</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>Colorless (standard OBJ)</string>
|
||||||
|
<string>Keep color only on textureless polygons</string>
|
||||||
|
<string>Keep all color</string>
|
||||||
|
</array>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<integer>0</integer>
|
||||||
|
<integer>1</integer>
|
||||||
|
<integer>2</integer>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
@@ -346,6 +374,34 @@
|
|||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>The format of exported point cloud data.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Export Point Cloud Format</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>ExportPointCloudFormat</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<string>ply</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>PLY</string>
|
||||||
|
<string>LAS</string>
|
||||||
|
<string>LAZ</string>
|
||||||
|
</array>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<string>ply</string>
|
||||||
|
<string>las</string>
|
||||||
|
<string>laz</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<string>
|
<string>
|
||||||
======= RTAB-Map =======
|
======= RTAB-Map =======
|
||||||
RTAB-Map - https://github.com/introlab/rtabmap
|
RTAB-Map - https://github.com/introlab/rtabmap
|
||||||
Copyright (c) 2010-2022, Mathieu Labbe - IntRoLab - Universite de Sherbrooke, all rights reserved.
|
Copyright (c) 2010-2024, Mathieu Labbe - IntRoLab - Universite de Sherbrooke, all rights reserved.
|
||||||
Copyright (c) XXX, contributors, all rights reserved.
|
Copyright (c) XXX, contributors, all rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
@@ -165,6 +165,53 @@ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|||||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
|
||||||
WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
======= libLAS =======
|
||||||
|
|
||||||
|
Copyright (c) 2007, Martin Isenburg, isenburg at cs.unc.edu
|
||||||
|
|
||||||
|
Copyright (c) 2008, Howard Butler, hobu.inc at gmail.com
|
||||||
|
|
||||||
|
Copyright (c) 2008, Mateusz Loskot, mateusz at loskot.net
|
||||||
|
|
||||||
|
Copyright (c) 2008, Phil Vachon, philippe at cowpig.ca
|
||||||
|
|
||||||
|
Copyright (c) 2008, Frank Warmerdam, warmerdam at pobox.com
|
||||||
|
|
||||||
|
Copyright (c) 2008, Martin Rodriguez, mrodriguez at stereocarto.com
|
||||||
|
|
||||||
|
Copyright (c) 2016, Oscar Martinez Rubi o.rubi at esciencecenter.nl
|
||||||
|
|
||||||
|
Copyright (c) 2016, Romulo Goncalves r.goncalves at esciencecenter.nl
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following
|
||||||
|
conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided
|
||||||
|
with the distribution.
|
||||||
|
* Neither the name of the Martin Isenburg or Iowa Department
|
||||||
|
of Natural Resources nor the names of its contributors may be
|
||||||
|
used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||||
|
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
OF SUCH DAMAGE.
|
||||||
|
|
||||||
</string>
|
</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|||||||
@@ -58,7 +58,35 @@
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Smooth the point clouds.</string>
|
<string>Choosing between high and low depth confidence depends on the application. If precise geometry is critical, prioritize high depth confidence even if it means fewer points. If you need a dense point cloud for analysis, even in areas with weak LiDAR signal, a lower depth confidence might be suitable at the cost of highly interpolated points (that could give a wavy look of some surfaces). Note: it is possible to change confidence level in post-processing.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<integer>2</integer>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>DepthConfidence</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Depth Confidence</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>High</string>
|
||||||
|
<string>Medium</string>
|
||||||
|
<string>Low</string>
|
||||||
|
</array>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<integer>2</integer>
|
||||||
|
<integer>1</integer>
|
||||||
|
<integer>0</integer>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Smooth the point clouds. Note that this can be changed in post-processing.</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
@@ -70,6 +98,86 @@
|
|||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Filter interpolated depth pixels between foreground and background objects. Note that values can be changed in post-processing.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Depth Bleeding Filter Error</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>DepthBleedingError</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<string>0</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>Disabled</string>
|
||||||
|
<string>2.5 cm</string>
|
||||||
|
<string>5 cm</string>
|
||||||
|
<string>10 cm</string>
|
||||||
|
<string>15 cm</string>
|
||||||
|
<string>20 cm</string>
|
||||||
|
<string>25 cm</string>
|
||||||
|
<string>30 cm</string>
|
||||||
|
</array>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<string>0</string>
|
||||||
|
<string>0.025</string>
|
||||||
|
<string>0.05</string>
|
||||||
|
<string>0.10</string>
|
||||||
|
<string>0.15</string>
|
||||||
|
<string>0.20</string>
|
||||||
|
<string>0.25</string>
|
||||||
|
<string>0.30</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Filter ARKit's re-localization events to avoid jumps in odometry when creating a map with RTAB-Map, which would cause large drift errors that are difficult to correct. Set an acceleration threshold to detect those events.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>ARKit Re-Localization Acceleration Threshold</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>UpstreamRelocalizationFilteringAccThr</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<string>58.8399</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>Disabled</string>
|
||||||
|
<string>10 g</string>
|
||||||
|
<string>9 g</string>
|
||||||
|
<string>8 g</string>
|
||||||
|
<string>7 g</string>
|
||||||
|
<string>6 g</string>
|
||||||
|
<string>5 g</string>
|
||||||
|
<string>4 g</string>
|
||||||
|
<string>3 g</string>
|
||||||
|
<string>2 g</string>
|
||||||
|
</array>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<string>0</string>
|
||||||
|
<string>98.0665</string>
|
||||||
|
<string>88.25985</string>
|
||||||
|
<string>78.4532</string>
|
||||||
|
<string>68.64655</string>
|
||||||
|
<string>58.8399</string>
|
||||||
|
<string>49.03325</string>
|
||||||
|
<string>39.2266</string>
|
||||||
|
<string>29.41995</string>
|
||||||
|
<string>19.6133</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
@@ -368,7 +476,7 @@
|
|||||||
<key>Key</key>
|
<key>Key</key>
|
||||||
<string>MaxOptimizationError</string>
|
<string>MaxOptimizationError</string>
|
||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<integer>1</integer>
|
<integer>2</integer>
|
||||||
<key>Titles</key>
|
<key>Titles</key>
|
||||||
<array>
|
<array>
|
||||||
<string>4x</string>
|
<string>4x</string>
|
||||||
@@ -412,6 +520,14 @@
|
|||||||
<key>Titles</key>
|
<key>Titles</key>
|
||||||
<array>
|
<array>
|
||||||
<string>No Limit</string>
|
<string>No Limit</string>
|
||||||
|
<string>5000</string>
|
||||||
|
<string>4500</string>
|
||||||
|
<string>4000</string>
|
||||||
|
<string>3500</string>
|
||||||
|
<string>3000</string>
|
||||||
|
<string>2500</string>
|
||||||
|
<string>2000</string>
|
||||||
|
<string>1500</string>
|
||||||
<string>1000</string>
|
<string>1000</string>
|
||||||
<string>900</string>
|
<string>900</string>
|
||||||
<string>800</string>
|
<string>800</string>
|
||||||
@@ -427,6 +543,14 @@
|
|||||||
<key>Values</key>
|
<key>Values</key>
|
||||||
<array>
|
<array>
|
||||||
<string>0</string>
|
<string>0</string>
|
||||||
|
<string>5000</string>
|
||||||
|
<string>4500</string>
|
||||||
|
<string>4000</string>
|
||||||
|
<string>3500</string>
|
||||||
|
<string>3000</string>
|
||||||
|
<string>2500</string>
|
||||||
|
<string>2000</string>
|
||||||
|
<string>1500</string>
|
||||||
<string>1000</string>
|
<string>1000</string>
|
||||||
<string>900</string>
|
<string>900</string>
|
||||||
<string>800</string>
|
<string>800</string>
|
||||||
@@ -458,6 +582,14 @@
|
|||||||
<key>Titles</key>
|
<key>Titles</key>
|
||||||
<array>
|
<array>
|
||||||
<string>No Limit</string>
|
<string>No Limit</string>
|
||||||
|
<string>5000</string>
|
||||||
|
<string>4500</string>
|
||||||
|
<string>4000</string>
|
||||||
|
<string>3500</string>
|
||||||
|
<string>3000</string>
|
||||||
|
<string>2500</string>
|
||||||
|
<string>2000</string>
|
||||||
|
<string>1500</string>
|
||||||
<string>1000</string>
|
<string>1000</string>
|
||||||
<string>900</string>
|
<string>900</string>
|
||||||
<string>800</string>
|
<string>800</string>
|
||||||
@@ -472,6 +604,14 @@
|
|||||||
<key>Values</key>
|
<key>Values</key>
|
||||||
<array>
|
<array>
|
||||||
<string>0</string>
|
<string>0</string>
|
||||||
|
<string>5000</string>
|
||||||
|
<string>4500</string>
|
||||||
|
<string>4000</string>
|
||||||
|
<string>3500</string>
|
||||||
|
<string>3000</string>
|
||||||
|
<string>2500</string>
|
||||||
|
<string>2000</string>
|
||||||
|
<string>1500</string>
|
||||||
<string>1000</string>
|
<string>1000</string>
|
||||||
<string>900</string>
|
<string>900</string>
|
||||||
<string>800</string>
|
<string>800</string>
|
||||||
@@ -488,7 +628,7 @@
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>BRIEF features are fast to compute but are not rotation invariant like FREAK. Warning: Changing feature type will automatically reset the map!</string>
|
<string>BRIEF, FREAK and ORB are binary features, which are fast to compute and use less memory. SURF and SIFT are high dimensional float descriptors (rotation/scale/shear-invariant), so they use more memory and CPU but they are significantly better to detect loop closures in large environments. Warning: Changing feature type will automatically reset the map!</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
@@ -501,13 +641,21 @@
|
|||||||
<string>6</string>
|
<string>6</string>
|
||||||
<key>Titles</key>
|
<key>Titles</key>
|
||||||
<array>
|
<array>
|
||||||
<string>BRIEF</string>
|
<string>SURF</string>
|
||||||
<string>FREAK</string>
|
<string>SIFT</string>
|
||||||
|
<string>GFTT-FREAK</string>
|
||||||
|
<string>GFTT-BRIEF</string>
|
||||||
|
<string>GFTT-ORB</string>
|
||||||
|
<string>ORB-OCTREE</string>
|
||||||
</array>
|
</array>
|
||||||
<key>Values</key>
|
<key>Values</key>
|
||||||
<array>
|
<array>
|
||||||
<string>6</string>
|
<string>0</string>
|
||||||
|
<string>1</string>
|
||||||
<string>5</string>
|
<string>5</string>
|
||||||
|
<string>6</string>
|
||||||
|
<string>8</string>
|
||||||
|
<string>10</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
@@ -552,61 +700,61 @@
|
|||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
|
||||||
<key>Type</key>
|
|
||||||
<string>PSGroupSpecifier</string>
|
|
||||||
<key>FooterText</key>
|
|
||||||
<string>Used only in localization mode (when clicking First-P. View during visualization). This is used to get smoother localizations and to verify localization transforms (when Max Optimization Error is not disabled) to make sure we don't teleport to a location very similar to one we previously localized on.</string>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>Type</key>
|
|
||||||
<string>PSMultiValueSpecifier</string>
|
|
||||||
<key>Title</key>
|
|
||||||
<string>Maximum odometry cache size</string>
|
|
||||||
<key>Key</key>
|
|
||||||
<string>MaximumOdometryCacheSize</string>
|
|
||||||
<key>DefaultValue</key>
|
|
||||||
<string>10</string>
|
|
||||||
<key>Titles</key>
|
|
||||||
<array>
|
|
||||||
<string>500</string>
|
|
||||||
<string>200</string>
|
|
||||||
<string>100</string>
|
|
||||||
<string>75</string>
|
|
||||||
<string>50</string>
|
|
||||||
<string>40</string>
|
|
||||||
<string>30</string>
|
|
||||||
<string>20</string>
|
|
||||||
<string>10</string>
|
|
||||||
<string>5</string>
|
|
||||||
<string>Disabled</string>
|
|
||||||
</array>
|
|
||||||
<key>Values</key>
|
|
||||||
<array>
|
|
||||||
<string>500</string>
|
|
||||||
<string>200</string>
|
|
||||||
<string>100</string>
|
|
||||||
<string>75</string>
|
|
||||||
<string>50</string>
|
|
||||||
<string>40</string>
|
|
||||||
<string>30</string>
|
|
||||||
<string>20</string>
|
|
||||||
<string>10</string>
|
|
||||||
<string>5</string>
|
|
||||||
<string>0</string>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>ArUco markers can be detected for localization and graph optimization.</string>
|
<string>Used only in localization mode (when clicking First-P. View during visualization). This is used to get smoother localizations and to verify localization transforms (when Max Optimization Error is not disabled) to make sure we don't teleport to a location very similar to one we previously localized on.</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSMultiValueSpecifier</string>
|
<string>PSMultiValueSpecifier</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
<string>ArUco Marker Detection</string>
|
<string>Maximum odometry cache size</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>MaximumOdometryCacheSize</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<string>10</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>500</string>
|
||||||
|
<string>200</string>
|
||||||
|
<string>100</string>
|
||||||
|
<string>75</string>
|
||||||
|
<string>50</string>
|
||||||
|
<string>40</string>
|
||||||
|
<string>30</string>
|
||||||
|
<string>20</string>
|
||||||
|
<string>10</string>
|
||||||
|
<string>5</string>
|
||||||
|
<string>Disabled</string>
|
||||||
|
</array>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<string>500</string>
|
||||||
|
<string>200</string>
|
||||||
|
<string>100</string>
|
||||||
|
<string>75</string>
|
||||||
|
<string>50</string>
|
||||||
|
<string>40</string>
|
||||||
|
<string>30</string>
|
||||||
|
<string>20</string>
|
||||||
|
<string>10</string>
|
||||||
|
<string>5</string>
|
||||||
|
<string>0</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>ArUco or AprilTag markers can be detected for localization and graph optimization. Marker number should be >0.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>ArUco/AprilTag Marker Detection</string>
|
||||||
<key>Key</key>
|
<key>Key</key>
|
||||||
<string>ArUcoMarkerDetection</string>
|
<string>ArUcoMarkerDetection</string>
|
||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
@@ -734,6 +882,56 @@
|
|||||||
<key>KeyboardType</key>
|
<key>KeyboardType</key>
|
||||||
<string>NumberPad</string>
|
<string>NumberPad</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Maximum range at which the markers are detected. Long range increases the estimated orientation error of the tag, which can then cause bad graph optimization. Using larger tags can improve orientation estimation at longer range.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Marker Maximum Range</string>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>MarkerMaxRange</string>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<real>2</real>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>No Limit</string>
|
||||||
|
<string>0.5 m</string>
|
||||||
|
<string>1 m</string>
|
||||||
|
<string>2 m</string>
|
||||||
|
<string>3 m</string>
|
||||||
|
<string>4 m</string>
|
||||||
|
<string>5 m</string>
|
||||||
|
<string>6 m</string>
|
||||||
|
<string>7 m</string>
|
||||||
|
<string>8 m</string>
|
||||||
|
<string>9 m</string>
|
||||||
|
<string>10 m</string>
|
||||||
|
<string>15 m</string>
|
||||||
|
<string>20 m</string>
|
||||||
|
</array>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<string>0</string>
|
||||||
|
<real>0.5</real>
|
||||||
|
<real>1</real>
|
||||||
|
<real>2</real>
|
||||||
|
<real>3</real>
|
||||||
|
<real>4</real>
|
||||||
|
<real>5</real>
|
||||||
|
<real>6</real>
|
||||||
|
<real>7</real>
|
||||||
|
<real>8</real>
|
||||||
|
<real>9</real>
|
||||||
|
<integer>10</integer>
|
||||||
|
<real>15</real>
|
||||||
|
<real>20</real>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
@@ -752,22 +950,6 @@
|
|||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
|
||||||
<key>Type</key>
|
|
||||||
<string>PSGroupSpecifier</string>
|
|
||||||
<key>FooterText</key>
|
|
||||||
<string>Save raw point clouds in database.</string>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>Type</key>
|
|
||||||
<string>PSToggleSwitchSpecifier</string>
|
|
||||||
<key>Title</key>
|
|
||||||
<string>Save Raw Scan</string>
|
|
||||||
<key>Key</key>
|
|
||||||
<string>SaveRawScan</string>
|
|
||||||
<key>DefaultValue</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
@@ -788,7 +970,7 @@
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>The database is kept in RAM for fast access. Set to false to reduce RAM used at the cost of slower access. This parameter is applied on reset or when a database is opened.</string>
|
<string>The database is kept in RAM for fast access. Set to false to reduce RAM used at the cost of slower access. This parameter is applied on reset or when a database is opened. Important: if enabled, the database cannot be recovered in case of the App crashes for some reason (e.g., low battery).</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Decrease density to reduce rendering time and memory. Tip: To apply a different density to current map: save the map, change density and re-open the same map to regenerate the point clouds at this density. Points over the maximum depth, under minimum depth or under the depth confidence are not rendered.</string>
|
<string>Decrease density to reduce rendering time and memory. Points over the maximum depth or under minimum depth are not rendered. In all cases, the raw data is still saved in the db file, meaning that the the point cloud can be regenerated differently by changing these settings and by re-opening the scan in the Library.</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
<string>Rendering</string>
|
<string>Rendering</string>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
@@ -106,28 +106,6 @@
|
|||||||
<real>3</real>
|
<real>3</real>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
|
||||||
<key>DefaultValue</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
<key>Key</key>
|
|
||||||
<string>DepthConfidence</string>
|
|
||||||
<key>Title</key>
|
|
||||||
<string>Depth Confidence</string>
|
|
||||||
<key>Titles</key>
|
|
||||||
<array>
|
|
||||||
<string>High</string>
|
|
||||||
<string>Medium</string>
|
|
||||||
<string>Low</string>
|
|
||||||
</array>
|
|
||||||
<key>Type</key>
|
|
||||||
<string>PSMultiValueSpecifier</string>
|
|
||||||
<key>Values</key>
|
|
||||||
<array>
|
|
||||||
<integer>2</integer>
|
|
||||||
<integer>1</integer>
|
|
||||||
<integer>0</integer>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
<dict>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Increase minimum polygon angle to force scanning perpendicular to surfaces. Set a decimation factor to reduce the number of polygons. The higher the factor, the less polygons will remain. Note that the decimation factor is done after decreasing point cloud density. Decimation factor and texture resolution don't affect post-processing.</string>
|
<string>Increase minimum polygon angle to force scanning perpendicular to surfaces. Set a decimation factor to reduce the number of polygons. The higher the factor, the less polygons will remain. Note that the decimation factor is done after decreasing point cloud density. Decimation factor and texture resolution don't affect post-processing.</string>
|
||||||
@@ -452,9 +430,63 @@
|
|||||||
<real>0.01</real>
|
<real>0.01</real>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Measuring</string>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>MeasuringUnits</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>System of Units</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>Metric</string>
|
||||||
|
<string>Imperial</string>
|
||||||
|
</array>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<integer>0</integer>
|
||||||
|
<integer>1</integer>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<real>0.050000000000000003</real>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>MeasuringTextSize</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Text Size</string>
|
||||||
|
<key>Titles</key>
|
||||||
|
<array>
|
||||||
|
<string>30 cm</string>
|
||||||
|
<string>25 cm</string>
|
||||||
|
<string>20 cm</string>
|
||||||
|
<string>15 cm</string>
|
||||||
|
<string>10 cm</string>
|
||||||
|
<string>5 cm</string>
|
||||||
|
</array>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSMultiValueSpecifier</string>
|
||||||
|
<key>Values</key>
|
||||||
|
<array>
|
||||||
|
<real>0.29999999999999999</real>
|
||||||
|
<real>0.25</real>
|
||||||
|
<real>0.20000000000000001</real>
|
||||||
|
<real>0.14999999999999999</real>
|
||||||
|
<real>0.10000000000000001</real>
|
||||||
|
<real>0.050000000000000003</real>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Copyright (c) 2010-2022, Mathieu Labbe - IntRoLab - Université de Sherbrooke. All rights reserved.</string>
|
<string>Copyright (c) 2010-2024, Mathieu Labbe - IntRoLab - Université de Sherbrooke. All rights reserved.</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
<string>About</string>
|
<string>About</string>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
@@ -462,7 +494,7 @@
|
|||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>DefaultValue</key>
|
<key>DefaultValue</key>
|
||||||
<string>0.20.19</string>
|
<string>0.22.0</string>
|
||||||
<key>Key</key>
|
<key>Key</key>
|
||||||
<string>Version</string>
|
<string>Version</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
|
|||||||
@@ -3,32 +3,6 @@ SET(SRC_FILES
|
|||||||
main.cpp
|
main.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(INCLUDE_DIRS
|
|
||||||
${PROJECT_BINARY_DIR}/corelib/include
|
|
||||||
${PROJECT_SOURCE_DIR}/utilite/include
|
|
||||||
${PROJECT_SOURCE_DIR}/corelib/include
|
|
||||||
${PROJECT_SOURCE_DIR}/guilib/include
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
${OpenCV_INCLUDE_DIRS}
|
|
||||||
${PCL_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
IF(QT4_FOUND)
|
|
||||||
INCLUDE(${QT_USE_FILE})
|
|
||||||
ENDIF(QT4_FOUND)
|
|
||||||
|
|
||||||
SET(LIBRARIES
|
|
||||||
${QT_LIBRARIES}
|
|
||||||
${OpenCV_LIBS}
|
|
||||||
${PCL_LIBRARIES}
|
|
||||||
)
|
|
||||||
|
|
||||||
# rc.exe has problems with these defintions... commented!
|
|
||||||
#add_definitions(${PCL_DEFINITIONS})
|
|
||||||
|
|
||||||
# Make sure the compiler can find include files from our library.
|
|
||||||
INCLUDE_DIRECTORIES(${INCLUDE_DIRS})
|
|
||||||
|
|
||||||
# For Apple set the icns file containing icons
|
# For Apple set the icns file containing icons
|
||||||
IF(APPLE AND BUILD_AS_BUNDLE)
|
IF(APPLE AND BUILD_AS_BUNDLE)
|
||||||
# set how it shows up in the Info.plist file
|
# set how it shows up in the Info.plist file
|
||||||
@@ -52,38 +26,43 @@ IF(WIN32)
|
|||||||
ENDIF( MINGW )
|
ENDIF( MINGW )
|
||||||
ENDIF(WIN32)
|
ENDIF(WIN32)
|
||||||
|
|
||||||
|
IF(BUILD_AS_BUNDLE)
|
||||||
|
ADD_DEFINITIONS("-DBUILD_AS_BUNDLE")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
# Add binary
|
# Add binary
|
||||||
IF(APPLE AND BUILD_AS_BUNDLE)
|
IF(APPLE AND BUILD_AS_BUNDLE)
|
||||||
ADD_EXECUTABLE(rtabmap MACOSX_BUNDLE ${SRC_FILES})
|
ADD_EXECUTABLE(rtabmap_app MACOSX_BUNDLE ${SRC_FILES})
|
||||||
ELSEIF(MINGW)
|
# Custom Info.plist providing NSCameraUsageDescription, required by macOS to
|
||||||
ADD_EXECUTABLE(rtabmap WIN32 ${SRC_FILES})
|
# grant the app access to USB/UVC cameras (e.g. Orbbec, RealSense). A bundle
|
||||||
|
# identifier is also set: macOS ties the camera (TCC) permission to it, so it
|
||||||
|
# must be non-empty for the permission to be granted/persisted.
|
||||||
|
SET_TARGET_PROPERTIES(rtabmap_app PROPERTIES
|
||||||
|
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
|
||||||
|
MACOSX_BUNDLE_GUI_IDENTIFIER "com.introlab.rtabmap"
|
||||||
|
MACOSX_BUNDLE_BUNDLE_NAME "${CMAKE_BUNDLE_NAME}")
|
||||||
|
ELSEIF(WIN32 AND BUILD_AS_BUNDLE)
|
||||||
|
ADD_EXECUTABLE(rtabmap_app WIN32 ${SRC_FILES})
|
||||||
ELSE()
|
ELSE()
|
||||||
ADD_EXECUTABLE(rtabmap ${SRC_FILES})
|
ADD_EXECUTABLE(rtabmap_app ${SRC_FILES})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
TARGET_LINK_LIBRARIES(rtabmap rtabmap_core rtabmap_gui rtabmap_utilite ${LIBRARIES})
|
TARGET_LINK_LIBRARIES(rtabmap_app rtabmap_gui)
|
||||||
IF(Qt5_FOUND)
|
|
||||||
IF(Qt5Svg_FOUND)
|
|
||||||
QT5_USE_MODULES(rtabmap Widgets Core Gui Svg PrintSupport)
|
|
||||||
ELSE()
|
|
||||||
QT5_USE_MODULES(rtabmap Widgets Core Gui PrintSupport)
|
|
||||||
ENDIF()
|
|
||||||
ENDIF(Qt5_FOUND)
|
|
||||||
|
|
||||||
IF(APPLE AND BUILD_AS_BUNDLE)
|
IF(APPLE AND BUILD_AS_BUNDLE)
|
||||||
SET_TARGET_PROPERTIES(rtabmap PROPERTIES
|
SET_TARGET_PROPERTIES(rtabmap_app PROPERTIES
|
||||||
OUTPUT_NAME ${CMAKE_BUNDLE_NAME})
|
OUTPUT_NAME ${CMAKE_BUNDLE_NAME})
|
||||||
ELSEIF(WIN32)
|
ELSEIF(WIN32)
|
||||||
SET_TARGET_PROPERTIES(rtabmap PROPERTIES
|
SET_TARGET_PROPERTIES(rtabmap_app PROPERTIES
|
||||||
OUTPUT_NAME ${PROJECT_NAME})
|
OUTPUT_NAME ${PROJECT_NAME})
|
||||||
ELSE()
|
ELSE()
|
||||||
SET_TARGET_PROPERTIES(rtabmap PROPERTIES
|
SET_TARGET_PROPERTIES(rtabmap_app PROPERTIES
|
||||||
OUTPUT_NAME ${PROJECT_PREFIX})
|
OUTPUT_NAME ${PROJECT_PREFIX})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
#---------------------------
|
#---------------------------
|
||||||
# Installation stuff
|
# Installation stuff
|
||||||
#---------------------------
|
#---------------------------
|
||||||
INSTALL(TARGETS rtabmap
|
INSTALL(TARGETS rtabmap_app
|
||||||
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT runtime
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT runtime
|
||||||
BUNDLE DESTINATION "${CMAKE_BUNDLE_LOCATION}" COMPONENT runtime)
|
BUNDLE DESTINATION "${CMAKE_BUNDLE_LOCATION}" COMPONENT runtime)
|
||||||
|
|
||||||
@@ -94,14 +73,17 @@ ENDIF(APPLE AND BUILD_AS_BUNDLE)
|
|||||||
|
|
||||||
IF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
IF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
||||||
SET(APPS "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
|
SET(APPS "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
SET(plugin_dest_dir bin)
|
SET(plugin_dest_dir bin/plugins)
|
||||||
SET(qtconf_dest_dir bin)
|
SET(qtconf_dest_dir bin)
|
||||||
SET(openni2_dest_dir bin)
|
SET(thirdparty_dest_dir bin)
|
||||||
|
|
||||||
IF(APPLE)
|
IF(APPLE)
|
||||||
SET(plugin_dest_dir MacOS)
|
SET(plugin_dest_dir MacOS/plugins)
|
||||||
|
IF(Qt6_FOUND)
|
||||||
|
SET(plugin_dest_dir PlugIns)
|
||||||
|
ENDIF()
|
||||||
SET(qtconf_dest_dir Resources)
|
SET(qtconf_dest_dir Resources)
|
||||||
SET(openni2_dest_dir MacOS)
|
SET(thirdparty_dest_dir MacOS)
|
||||||
SET(APPS "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/MacOS/${CMAKE_BUNDLE_NAME}")
|
SET(APPS "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/MacOS/${CMAKE_BUNDLE_NAME}")
|
||||||
ENDIF(APPLE)
|
ENDIF(APPLE)
|
||||||
|
|
||||||
@@ -118,98 +100,316 @@ IF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
INSTALL(DIRECTORY "${OpenNI2_BIN_DIR}/OpenNI2"
|
INSTALL(DIRECTORY "${OpenNI2_BIN_DIR}/OpenNI2"
|
||||||
DESTINATION ${openni2_dest_dir}
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
COMPONENT runtime
|
COMPONENT runtime
|
||||||
REGEX ".*pdb" EXCLUDE)
|
REGEX ".*pdb" EXCLUDE)
|
||||||
INSTALL(FILES "${OpenNI2_BIN_DIR}/OpenNI.ini"
|
IF(NOT WIN32)
|
||||||
DESTINATION ${openni2_dest_dir}
|
INSTALL(FILES "${OpenNI2_BIN_DIR}/OpenNI.ini"
|
||||||
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
COMPONENT runtime)
|
COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
ENDIF(OpenNI2_FOUND)
|
ENDIF(OpenNI2_FOUND)
|
||||||
|
|
||||||
IF(k4a_FOUND)
|
IF(k4a_FOUND)
|
||||||
# Install needed depthengine_2_0.dll
|
# Install needed depthengine_2_0.dll. Its location varies by K4A SDK version:
|
||||||
|
# v1.4.1 ships it under sdk/windows-desktop/amd64/release/bin, or fallback in tools/.
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
file(TO_CMAKE_PATH "$ENV{K4A_ROOT_DIR}" ENV_K4A_ROOT_DIR)
|
file(TO_CMAKE_PATH "$ENV{K4A_ROOT_DIR}" ENV_K4A_ROOT_DIR)
|
||||||
INSTALL(FILES "${ENV_K4A_ROOT_DIR}/tools/depthengine_2_0.dll"
|
set(DEPTHENGINE_DLL "")
|
||||||
DESTINATION ${plugin_dest_dir}
|
foreach(_depthengine_dir
|
||||||
COMPONENT runtime)
|
"${ENV_K4A_ROOT_DIR}/sdk/windows-desktop/amd64/release/bin"
|
||||||
|
"${ENV_K4A_ROOT_DIR}/tools")
|
||||||
|
if(EXISTS "${_depthengine_dir}/depthengine_2_0.dll")
|
||||||
|
set(DEPTHENGINE_DLL "${_depthengine_dir}/depthengine_2_0.dll")
|
||||||
|
break()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
IF(DEPTHENGINE_DLL)
|
||||||
|
INSTALL(FILES "${DEPTHENGINE_DLL}"
|
||||||
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
|
COMPONENT runtime)
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(WARNING "depthengine_2_0.dll not found under $ENV{K4A_ROOT_DIR} (sdk/windows-desktop/amd64/release/bin or tools); Kinect for Azure depth may not work at runtime.")
|
||||||
|
ENDIF()
|
||||||
ENDIF(WIN32)
|
ENDIF(WIN32)
|
||||||
ENDIF(k4a_FOUND)
|
ENDIF(k4a_FOUND)
|
||||||
|
|
||||||
|
IF(ZED_FOUND)
|
||||||
|
# Install needed zlibwapi.dll
|
||||||
|
IF(WIN32)
|
||||||
|
file(TO_CMAKE_PATH "$ENV{ZED_SDK_ROOT_DIR}" ENV_ZED_SDK_ROOT_DIR)
|
||||||
|
INSTALL(FILES "${ENV_ZED_SDK_ROOT_DIR}/bin/zlibwapi.dll"
|
||||||
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
|
COMPONENT runtime)
|
||||||
|
ENDIF(WIN32)
|
||||||
|
ENDIF(ZED_FOUND)
|
||||||
|
|
||||||
|
IF(OrbbecSDK_FOUND)
|
||||||
|
# Install needed "extensions" folder
|
||||||
|
IF(WIN32)
|
||||||
|
find_path(OrbbecSDK_BIN_DIR NAMES OrbbecSDK.dll)
|
||||||
|
IF(NOT OrbbecSDK_BIN_DIR)
|
||||||
|
MESSAGE(FATAL_ERROR "OrbbecSDK.dll not found! Verify your PATH.")
|
||||||
|
ENDIF(NOT OrbbecSDK_BIN_DIR)
|
||||||
|
MESSAGE(STATUS "OrbbecSDK_BIN_DIR=${OrbbecSDK_BIN_DIR}")
|
||||||
|
INSTALL(DIRECTORY "${OrbbecSDK_BIN_DIR}/extensions"
|
||||||
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
|
COMPONENT runtime
|
||||||
|
FILES_MATCHING
|
||||||
|
PATTERN "*.lib" EXCLUDE
|
||||||
|
PATTERN "*")
|
||||||
|
ELSEIF(APPLE)
|
||||||
|
# OrbbecSDK loads its extensions (frame processor, filters like
|
||||||
|
# FrameUnpacker) via dlopen relative to libOrbbecSDK. fixup_bundle puts
|
||||||
|
# libOrbbecSDK in Contents/Frameworks, so the extensions must sit next to
|
||||||
|
# it in Frameworks/extensions (they reference @rpath/libOrbbecSDK, which
|
||||||
|
# resolves via the app executable's @executable_path/../Frameworks rpath).
|
||||||
|
# Without this the camera is detected but frame processing fails.
|
||||||
|
get_filename_component(OrbbecSDK_LIB_DIR "${OrbbecSDK_DIR}/../.." ABSOLUTE)
|
||||||
|
INSTALL(DIRECTORY "${OrbbecSDK_LIB_DIR}/extensions"
|
||||||
|
DESTINATION Frameworks
|
||||||
|
COMPONENT runtime)
|
||||||
|
IF(EXISTS "${OrbbecSDK_LIB_DIR}/OrbbecSDKConfig.xml")
|
||||||
|
INSTALL(FILES "${OrbbecSDK_LIB_DIR}/OrbbecSDKConfig.xml"
|
||||||
|
DESTINATION Frameworks
|
||||||
|
COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
|
ENDIF(WIN32)
|
||||||
|
ENDIF(OrbbecSDK_FOUND)
|
||||||
|
|
||||||
IF(Torch_FOUND)
|
IF(Torch_FOUND)
|
||||||
# Install needed cudnn_ops_infer64_8.dll and cudnn_cnn_infer64_8.dll
|
# Install needed cudnn dlls
|
||||||
# TODO: should be a more general way to include them if version is different
|
|
||||||
IF(WIN32 AND CUDA_FOUND)
|
IF(WIN32 AND CUDA_FOUND)
|
||||||
find_file(CUDNN_OPS_DLL NAMES cudnn_ops_infer64_8.dll)
|
find_path(cuDNN_BIN_DIR NAMES cudnn.dll cudnn64.dll cudnn64_9.dll)
|
||||||
find_file(CUDNN_CNN_DLL NAMES cudnn_cnn_infer64_8.dll)
|
IF(NOT cuDNN_BIN_DIR)
|
||||||
IF(CUDNN_OPS_DLL AND CUDNN_CNN_DLL)
|
MESSAGE(FATAL_ERROR "cudnn dlls not found! Make sure the dlls are in a directory on your PATH.")
|
||||||
MESSAGE(STATUS "Found ${CUDNN_OPS_DLL}")
|
ENDIF(NOT cuDNN_BIN_DIR)
|
||||||
MESSAGE(STATUS "Found ${CUDNN_CNN_DLL}")
|
MESSAGE(STATUS "cuDNN_BIN_DIR = ${cuDNN_BIN_DIR}")
|
||||||
INSTALL(FILES ${CUDNN_OPS_DLL} ${CUDNN_CNN_DLL}
|
file(GLOB CUDNN_DLLS "${cuDNN_BIN_DIR}/cudnn*.dll")
|
||||||
DESTINATION ${plugin_dest_dir}
|
IF(CUDNN_DLLS)
|
||||||
COMPONENT runtime)
|
MESSAGE(STATUS "Found cuDNN DLLs: ${CUDNN_DLLS}")
|
||||||
ELSE()
|
INSTALL(FILES ${CUDNN_DLLS}
|
||||||
MESSAGE(AUTHOR_WARNING "Using Torch with CUDA, but cudnn_ops_infer64_8.dll and cudnn_cnn_infer64_8.dll are not found on the PATH, so it won't be added to package.")
|
DESTINATION ${thirdparty_dest_dir}
|
||||||
|
COMPONENT runtime)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF(WIN32 AND CUDA_FOUND)
|
ENDIF(WIN32 AND CUDA_FOUND)
|
||||||
ENDIF(Torch_FOUND)
|
ENDIF(Torch_FOUND)
|
||||||
|
|
||||||
# Install needed Qt plugins by copying directories from the qt installation
|
set(python_pyd_dir "")
|
||||||
# One can cull what gets copied by using 'REGEX "..." EXCLUDE'
|
IF(Python3_FOUND)
|
||||||
# Exclude debug libraries
|
# bundle python3
|
||||||
IF(QT_PLUGINS_DIR)
|
IF(WIN32)
|
||||||
INSTALL(DIRECTORY "${QT_PLUGINS_DIR}/imageformats"
|
set(python_pyd_dir "bin/Lib/site-packages")
|
||||||
DESTINATION ${plugin_dest_dir}/plugins
|
set(PYTHON_ZIP_NAME "python${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR}.zip")
|
||||||
COMPONENT runtime
|
get_filename_component(PYTHON_ROOT "${Python3_EXECUTABLE}" DIRECTORY)
|
||||||
REGEX ".*d4.dll" EXCLUDE
|
file(TO_CMAKE_PATH "${Python3_STDLIB}" SANITIZED_STDLIB)
|
||||||
REGEX ".*d4.a" EXCLUDE)
|
|
||||||
ELSE()
|
MESSAGE(STATUS "Python3_EXECUTABLE=${Python3_EXECUTABLE}")
|
||||||
#Qt5
|
MESSAGE(STATUS "Python3_STDLIB=${SANITIZED_STDLIB}")
|
||||||
foreach(plugin ${Qt5Gui_PLUGINS})
|
|
||||||
get_target_property(plugin_loc ${plugin} LOCATION)
|
install(FILES "${Python3_EXECUTABLE}" DESTINATION bin COMPONENT runtime)
|
||||||
get_filename_component(plugin_dir ${plugin_loc} DIRECTORY)
|
|
||||||
string(REPLACE "plugins" ";" loc_list ${plugin_dir})
|
# when using python-opencv, it expects python3.dll, not python312.dll
|
||||||
list(GET loc_list 1 plugin_type)
|
get_filename_component(VCPKG_TRIPLET_ROOT "${PYTHON_TOOLS_DIR}/../../" ABSOLUTE)
|
||||||
IF(NOT plugin_root)
|
set(VCPKG_BIN_DIR "${VCPKG_TRIPLET_ROOT}/bin")
|
||||||
get_filename_component(plugin_root ${plugin_dir} DIRECTORY)
|
find_file(PYTHON3_STABLE_DLL
|
||||||
ENDIF(NOT plugin_root)
|
NAMES python3.dll
|
||||||
#MESSAGE(STATUS "Qt5 plugin \"${plugin_loc}\" installed in \"${plugin_dest_dir}/plugins${plugin_type}\"")
|
PATHS "${VCPKG_BIN_DIR}"
|
||||||
INSTALL(FILES ${plugin_loc}
|
NO_DEFAULT_PATH
|
||||||
DESTINATION ${plugin_dest_dir}/plugins${plugin_type}
|
)
|
||||||
|
if(PYTHON3_STABLE_DLL)
|
||||||
|
message(STATUS "Found python3.dll at: ${PYTHON3_STABLE_DLL}")
|
||||||
|
install(FILES "${PYTHON3_STABLE_DLL}" DESTINATION bin COMPONENT runtime)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# install python Lib in python312.zip (without site-packages, which is installed separatly afterwards)
|
||||||
|
file(TO_CMAKE_PATH "${Python3_STDLIB}" SANITIZED_STDLIB)
|
||||||
|
file(GLOB LIB_CONTENTS RELATIVE "${SANITIZED_STDLIB}" "${SANITIZED_STDLIB}/*")
|
||||||
|
list(REMOVE_ITEM LIB_CONTENTS "site-packages")
|
||||||
|
install(CODE "
|
||||||
|
execute_process(
|
||||||
|
COMMAND \"${CMAKE_COMMAND}\" -E tar cf \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/${PYTHON_ZIP_NAME}\" --format=zip -- ${LIB_CONTENTS}
|
||||||
|
WORKING_DIRECTORY \"${SANITIZED_STDLIB}\"
|
||||||
|
)
|
||||||
|
" COMPONENT runtime)
|
||||||
|
set(PYTHON_SITE_PACKAGES "${SANITIZED_STDLIB}/site-packages")
|
||||||
|
|
||||||
|
install(DIRECTORY "${PYTHON_SITE_PACKAGES}/"
|
||||||
|
DESTINATION "${thirdparty_dest_dir}/Lib/site-packages"
|
||||||
|
COMPONENT runtime
|
||||||
|
PATTERN "*.exe" EXCLUDE
|
||||||
|
PATTERN "*.lib" EXCLUDE
|
||||||
|
PATTERN "*.hpp" EXCLUDE
|
||||||
|
PATTERN "*.h" EXCLUDE
|
||||||
|
PATTERN "*/torch/*" EXCLUDE
|
||||||
|
)
|
||||||
|
if(EXISTS "${PYTHON_SITE_PACKAGES}/torch")
|
||||||
|
install(DIRECTORY "${PYTHON_SITE_PACKAGES}/torch"
|
||||||
|
DESTINATION "${thirdparty_dest_dir}/Lib/site-packages/"
|
||||||
|
COMPONENT runtime
|
||||||
|
PATTERN "*.exe" EXCLUDE
|
||||||
|
PATTERN "*.lib" EXCLUDE
|
||||||
|
PATTERN "*.hpp" EXCLUDE
|
||||||
|
PATTERN "*.h" EXCLUDE
|
||||||
|
PATTERN "*.dll" EXCLUDE
|
||||||
|
)
|
||||||
|
file(GLOB_RECURSE PY_DLL_FILES "${PYTHON_SITE_PACKAGES}/torch/*.dll")
|
||||||
|
if(PY_DLL_FILES)
|
||||||
|
install(FILES ${PY_DLL_FILES} DESTINATION bin COMPONENT runtime)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# install python DDLs
|
||||||
|
file(GLOB_RECURSE PY_DLL_FILES \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${python_pyd_dir}/*.dll\")
|
||||||
|
install(DIRECTORY "${PYTHON_ROOT}/DLLs"
|
||||||
|
DESTINATION "${thirdparty_dest_dir}/"
|
||||||
|
COMPONENT runtime
|
||||||
|
FILES_MATCHING
|
||||||
|
PATTERN "*.dll"
|
||||||
|
PATTERN "*.pyd"
|
||||||
|
)
|
||||||
|
|
||||||
|
# install our python scripts in share for convenience
|
||||||
|
install(DIRECTORY "${PROJECT_SOURCE_DIR}/corelib/src/python/"
|
||||||
|
DESTINATION share
|
||||||
|
COMPONENT runtime
|
||||||
|
FILES_MATCHING
|
||||||
|
PATTERN "*.py"
|
||||||
|
)
|
||||||
|
ENDIF(WIN32)
|
||||||
|
ENDIF(Python3_FOUND)
|
||||||
|
|
||||||
|
IF(Qt6_FOUND AND APPLE)
|
||||||
|
# On macOS we do NOT use qt_deploy_runtime_dependencies (macdeployqt):
|
||||||
|
# macdeployqt cannot deploy VTK 9.6+, whose libraries reference each other
|
||||||
|
# via @rpath relative to "@loader_path/../lib". Instead we install the Qt plugins
|
||||||
|
# manually and let fixup_bundle() below deploy all libraries.
|
||||||
|
IF(TARGET Qt6::QCocoaIntegrationPlugin)
|
||||||
|
get_target_property(_qt_plugin_loc Qt6::QCocoaIntegrationPlugin LOCATION)
|
||||||
|
get_filename_component(_qt_plugins_dir "${_qt_plugin_loc}" DIRECTORY) # .../plugins/platforms
|
||||||
|
get_filename_component(_qt_plugins_dir "${_qt_plugins_dir}" DIRECTORY) # .../plugins
|
||||||
|
FOREACH(_qt_plugin_type platforms styles imageformats iconengines)
|
||||||
|
IF(EXISTS "${_qt_plugins_dir}/${_qt_plugin_type}")
|
||||||
|
# Homebrew Qt plugins are symlinks into the Cellar; resolve them to the
|
||||||
|
# real files so they aren't installed as dangling symlinks (which would
|
||||||
|
# break fixup_bundle and codesign).
|
||||||
|
FILE(GLOB _qt_plugin_files "${_qt_plugins_dir}/${_qt_plugin_type}/*${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||||
|
SET(_qt_plugin_real "")
|
||||||
|
FOREACH(_qt_plugin_file ${_qt_plugin_files})
|
||||||
|
GET_FILENAME_COMPONENT(_qt_plugin_file "${_qt_plugin_file}" REALPATH)
|
||||||
|
LIST(APPEND _qt_plugin_real "${_qt_plugin_file}")
|
||||||
|
ENDFOREACH()
|
||||||
|
IF(_qt_plugin_real)
|
||||||
|
INSTALL(FILES ${_qt_plugin_real}
|
||||||
|
DESTINATION ${plugin_dest_dir}/${_qt_plugin_type}
|
||||||
|
COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
ENDFOREACH()
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(WARNING "Qt6::QCocoaIntegrationPlugin target not found: Qt plugins may be missing from the bundle")
|
||||||
|
ENDIF()
|
||||||
|
# qt.conf so Qt finds the bundled plugins (path is relative to Contents/)
|
||||||
|
SET(QT_CONF_FILE [Paths]\nPlugins=${plugin_dest_dir})
|
||||||
|
INSTALL(CODE "
|
||||||
|
file(WRITE \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${qtconf_dest_dir}/qt.conf\" \"${QT_CONF_FILE}\")
|
||||||
|
" COMPONENT runtime)
|
||||||
|
ELSEIF(Qt6_FOUND)
|
||||||
|
# Reference: https://doc-snapshots.qt.io/qt6-6.4/qt-deploy-runtime-dependencies.html
|
||||||
|
# The following script must only be executed at install time
|
||||||
|
set(deploy_script "${CMAKE_CURRENT_BINARY_DIR}/deploy_app$<CONFIG>.cmake")
|
||||||
|
file(GENERATE OUTPUT ${deploy_script} CONTENT "
|
||||||
|
# Including the file pointed to by QT_DEPLOY_SUPPORT ensures the generated
|
||||||
|
# deployment script has access to qt_deploy_runtime_dependencies()
|
||||||
|
include(\"${QT_DEPLOY_SUPPORT}\")
|
||||||
|
qt_deploy_runtime_dependencies(
|
||||||
|
EXECUTABLE \"${APPS}\"
|
||||||
|
PLUGINS_DIR ${plugin_dest_dir}
|
||||||
|
GENERATE_QT_CONF
|
||||||
|
NO_TRANSLATIONS
|
||||||
|
VERBOSE
|
||||||
|
)")
|
||||||
|
IF("${CMAKE_BUILD_TYPE}" STREQUAL "" OR "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
|
||||||
|
install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/deploy_appDebug.cmake"
|
||||||
|
CONFIGURATIONS Debug
|
||||||
|
COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
|
IF("${CMAKE_BUILD_TYPE}" STREQUAL "" OR "${CMAKE_BUILD_TYPE}" STREQUAL "Release")
|
||||||
|
install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/deploy_appRelease.cmake"
|
||||||
|
CONFIGURATIONS Release
|
||||||
|
COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
|
IF("${CMAKE_BUILD_TYPE}" STREQUAL "" OR "${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
|
||||||
|
install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/deploy_appRelWithDebInfo.cmake"
|
||||||
|
CONFIGURATIONS RelWithDebInfo
|
||||||
|
COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
|
IF("${CMAKE_BUILD_TYPE}" STREQUAL "" OR "${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
|
||||||
|
install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/deploy_appMinSizeRel.cmake"
|
||||||
|
CONFIGURATIONS MinSizeRel
|
||||||
|
COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
|
ELSEIF(Qt5_FOUND)
|
||||||
|
#Qt5
|
||||||
|
foreach(plugin ${Qt5Gui_PLUGINS})
|
||||||
|
get_target_property(plugin_loc ${plugin} LOCATION)
|
||||||
|
get_filename_component(plugin_dir ${plugin_loc} DIRECTORY)
|
||||||
|
string(REPLACE "plugins" ";" loc_list ${plugin_dir})
|
||||||
|
list(GET loc_list 1 plugin_type)
|
||||||
|
IF(NOT plugin_root)
|
||||||
|
get_filename_component(plugin_root ${plugin_dir} DIRECTORY)
|
||||||
|
ENDIF(NOT plugin_root)
|
||||||
|
#MESSAGE(STATUS "Qt5 plugin \"${plugin_loc}\" installed in \"${plugin_dest_dir}${plugin_type}\"")
|
||||||
|
INSTALL(FILES ${plugin_loc}
|
||||||
|
DESTINATION ${plugin_dest_dir}${plugin_type}
|
||||||
COMPONENT runtime)
|
COMPONENT runtime)
|
||||||
endforeach()
|
endforeach()
|
||||||
IF(NOT Qt5Widgets_VERSION VERSION_LESS 5.10.0)
|
IF(NOT Qt5Widgets_VERSION VERSION_LESS 5.10.0)
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
SET(plugin_loc "${plugin_root}/styles/qwindowsvistastyle.dll")
|
SET(plugin_loc "${plugin_root}/styles/qwindowsvistastyle.dll")
|
||||||
ELSEIF(APPLE)
|
ELSEIF(APPLE)
|
||||||
SET(plugin_loc "${plugin_root}/styles/libqmacstyle.dylib")
|
SET(plugin_loc "${plugin_root}/styles/libqmacstyle.dylib")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(EXISTS ${plugin_loc})
|
IF(EXISTS ${plugin_loc})
|
||||||
get_filename_component(plugin_dir ${plugin_loc} DIRECTORY)
|
get_filename_component(plugin_dir ${plugin_loc} DIRECTORY)
|
||||||
string(REPLACE "plugins" ";" loc_list ${plugin_dir})
|
string(REPLACE "plugins" ";" loc_list ${plugin_dir})
|
||||||
list(GET loc_list 1 plugin_type)
|
list(GET loc_list 1 plugin_type)
|
||||||
INSTALL(FILES ${plugin_loc}
|
INSTALL(FILES ${plugin_loc}
|
||||||
DESTINATION ${plugin_dest_dir}/plugins${plugin_type}
|
DESTINATION ${plugin_dest_dir}/plugins${plugin_type}
|
||||||
COMPONENT runtime)
|
COMPONENT runtime)
|
||||||
#MESSAGE(STATUS "Qt5 plugin \"${plugin_loc}\" installed in \"${plugin_dest_dir}/plugins${plugin_type}\"")
|
#MESSAGE(STATUS "Qt5 plugin \"${plugin_loc}\" installed in \"${plugin_dest_dir}${plugin_type}\"")
|
||||||
ENDIF(EXISTS ${plugin_loc})
|
ENDIF(EXISTS ${plugin_loc})
|
||||||
ENDIF(NOT Qt5Widgets_VERSION VERSION_LESS 5.10.0)
|
ENDIF(NOT Qt5Widgets_VERSION VERSION_LESS 5.10.0)
|
||||||
|
ELSEIF(QT_PLUGINS_DIR) # Qt4
|
||||||
|
# Install needed Qt plugins by copying directories from the qt installation
|
||||||
|
# One can cull what gets copied by using 'REGEX "..." EXCLUDE'
|
||||||
|
# Exclude debug libraries
|
||||||
|
INSTALL(DIRECTORY "${QT_PLUGINS_DIR}/imageformats"
|
||||||
|
DESTINATION ${plugin_dest_dir}
|
||||||
|
COMPONENT runtime
|
||||||
|
REGEX ".*d4.dll" EXCLUDE
|
||||||
|
REGEX ".*d4.a" EXCLUDE)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
# install a qt.conf file
|
IF(Qt5_FOUND OR QT4_FOUND)
|
||||||
# this inserts some cmake code into the install script to write the file
|
# install a qt.conf file
|
||||||
SET(QT_CONF_FILE [Paths]\nPlugins=plugins)
|
# this inserts some cmake code into the install script to write the file
|
||||||
IF(APPLE)
|
SET(QT_CONF_FILE [Paths]\nPlugins=plugins)
|
||||||
SET(QT_CONF_FILE [Paths]\nPlugins=MacOS/plugins)
|
IF(APPLE)
|
||||||
ENDIF(APPLE)
|
SET(QT_CONF_FILE [Paths]\nPlugins=MacOS/plugins)
|
||||||
INSTALL(CODE "
|
ENDIF(APPLE)
|
||||||
file(WRITE \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${qtconf_dest_dir}/qt.conf\" \"${QT_CONF_FILE}\")
|
INSTALL(CODE "
|
||||||
" COMPONENT runtime)
|
file(WRITE \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${qtconf_dest_dir}/qt.conf\" \"${QT_CONF_FILE}\")
|
||||||
|
" COMPONENT runtime)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
# directories to look for dependencies
|
# directories to look for dependencies
|
||||||
SET(DIRS ${QT_LIBRARY_DIRS} ${PROJECT_SOURCE_DIR}/bin)
|
# CMAKE_LIBRARY_OUTPUT_DIRECTORY is where rtabmap's own libraries (e.g.
|
||||||
|
# librtabmap_core) are built; fixup_bundle needs it to resolve the app's
|
||||||
|
# @rpath references to them (macdeployqt used to handle this via rpath).
|
||||||
|
SET(DIRS "${QT_LIBRARY_DIRS}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/lib")
|
||||||
IF(APPLE)
|
IF(APPLE)
|
||||||
SET(DIRS ${DIRS} /usr/local /usr/local/lib)
|
SET(DIRS ${DIRS} /usr/local /usr/local/lib /opt/homebrew /opt/homebrew/lib /opt/homebrew/lib/gcc/current)
|
||||||
ENDIF(APPLE)
|
ENDIF(APPLE)
|
||||||
|
|
||||||
# Now the work of copying dependencies into the bundle/package
|
# Now the work of copying dependencies into the bundle/package
|
||||||
@@ -219,10 +419,65 @@ IF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
|||||||
# over.
|
# over.
|
||||||
# To find dependencies, cmake use "otool" on Apple and "dumpbin" on Windows (make sure you have one of them).
|
# To find dependencies, cmake use "otool" on Apple and "dumpbin" on Windows (make sure you have one of them).
|
||||||
install(CODE "
|
install(CODE "
|
||||||
file(GLOB_RECURSE QTPLUGINS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${plugin_dest_dir}/plugins/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
|
# Glob Qt Plugins
|
||||||
|
file(GLOB_RECURSE ALL_LIBS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${plugin_dest_dir}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
|
||||||
|
|
||||||
|
# OrbbecSDK loads its filter/frame-processor extensions via dlopen, and they
|
||||||
|
# link @rpath/libOrbbecSDK. Feed them to fixup_bundle so their reference is
|
||||||
|
# rewritten to the embedded libOrbbecSDK
|
||||||
|
file(GLOB ORBBEC_EXT_LIBS
|
||||||
|
\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Frameworks/extensions/filters/*${CMAKE_SHARED_LIBRARY_SUFFIX}\"
|
||||||
|
\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Frameworks/extensions/frameprocessor/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
|
||||||
|
if(ORBBEC_EXT_LIBS)
|
||||||
|
list(APPEND ALL_LIBS \${ORBBEC_EXT_LIBS})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT \"${python_pyd_dir}\" STREQUAL \"\")
|
||||||
|
file(GLOB_RECURSE PYD_FILES \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${python_pyd_dir}/*.pyd\")
|
||||||
|
if(PYD_FILES)
|
||||||
|
list(APPEND ALL_LIBS \${PYD_FILES})
|
||||||
|
endif()
|
||||||
|
if(WIN32)
|
||||||
|
file(GLOB_RECURSE DLL_FILES \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${python_pyd_dir}/torch/*.dll\")
|
||||||
|
if(DLL_FILES)
|
||||||
|
list(APPEND ALL_LIBS \${DLL_FILES})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
set(BU_CHMOD_BUNDLE_ITEMS ON)
|
set(BU_CHMOD_BUNDLE_ITEMS ON)
|
||||||
include(\"BundleUtilities\")
|
include(\"BundleUtilities\")
|
||||||
fixup_bundle(\"${APPS}\" \"\${QTPLUGINS}\" \"${DIRS}\")
|
# nvcuvid.dll (NVDEC) and nvEncodeAPI64.dll (NVENC), and the CUDA driver API
|
||||||
|
# nvcuda.dll, ship with the NVIDIA GPU driver (System32), not the CUDA toolkit,
|
||||||
|
# so they are absent on driver-less CI runners and must never be bundled (they
|
||||||
|
# are resolved at runtime from the end user's driver). Mark them 'system' so
|
||||||
|
# fixup_bundle skips them instead of failing to resolve them.
|
||||||
|
function(gp_resolved_file_type_override resolved_file type_var)
|
||||||
|
if(resolved_file MATCHES \"(nvcuvid|nvEncodeAPI64|nvcuda)\")
|
||||||
|
set(\${type_var} \"system\" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
fixup_bundle(\"${APPS}\" \"\${ALL_LIBS}\" \"${DIRS}\")
|
||||||
" COMPONENT runtime)
|
" COMPONENT runtime)
|
||||||
|
|
||||||
|
IF(APPLE)
|
||||||
|
# Re-sign ad-hoc AFTER fixup_bundle has finished all its install_name_tool
|
||||||
|
# edits.
|
||||||
|
install(CODE "
|
||||||
|
set(_contents \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}\")
|
||||||
|
get_filename_component(_app \"\${_contents}\" DIRECTORY)
|
||||||
|
file(GLOB_RECURSE _nested \"\${_contents}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
|
||||||
|
foreach(_f \${_nested})
|
||||||
|
execute_process(COMMAND codesign --force --sign - --timestamp=none \"\${_f}\")
|
||||||
|
endforeach()
|
||||||
|
file(GLOB _frameworks \"\${_contents}/Frameworks/*.framework\")
|
||||||
|
foreach(_f \${_frameworks})
|
||||||
|
execute_process(COMMAND codesign --force --sign - --timestamp=none \"\${_f}\")
|
||||||
|
endforeach()
|
||||||
|
message(STATUS \"Ad-hoc re-signing bundle: \${_app}\")
|
||||||
|
execute_process(COMMAND codesign --force --sign - --timestamp=none \"\${_app}\")
|
||||||
|
" COMPONENT runtime)
|
||||||
|
ENDIF(APPLE)
|
||||||
|
|
||||||
ENDIF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
ENDIF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
||||||
|
|
||||||
|
|||||||
40
app/src/Info.plist.in
Normal file
40
app/src/Info.plist.in
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrincipalClass</key>
|
||||||
|
<string>NSApplication</string>
|
||||||
|
<key>NSHighResolutionCapable</key>
|
||||||
|
<string>True</string>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>English</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
|
||||||
|
<key>CFBundleGetInfoString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
|
||||||
|
<key>CFBundleIconFile</key>
|
||||||
|
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleLongVersionString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
|
||||||
|
<key>CSResourcesFileMapped</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||||
|
<key>NSCameraUsageDescription</key>
|
||||||
|
<string>RTAB-Map needs access to the camera to capture images from connected RGB-D/stereo cameras (e.g. Orbbec, RealSense).</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user