mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 01:20:25 +08:00
Compare commits
853 Commits
0.11.4-kin
...
0.17.1-kin
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c91fb8cd8 | ||
|
|
5cdede1482 | ||
|
|
fa174be741 | ||
|
|
5e93803eef | ||
|
|
bb0b12be27 | ||
|
|
41e93ac6f0 | ||
|
|
1df99efa14 | ||
|
|
911b8158a4 | ||
|
|
e875c7d6d1 | ||
|
|
0ddbb28fd2 | ||
|
|
e54234ec50 | ||
|
|
6dd0cd27e1 | ||
|
|
ec50b0c366 | ||
|
|
97b61f885d | ||
|
|
0d7b8f13d8 | ||
|
|
2bf7d87b29 | ||
|
|
8d5d50a198 | ||
|
|
aa743fc397 | ||
|
|
29d16633f5 | ||
|
|
d92debe356 | ||
|
|
52aed1041c | ||
|
|
8fec570c13 | ||
|
|
a39d0840ce | ||
|
|
63cc86bdcd | ||
|
|
637514d00d | ||
|
|
b2db31ff18 | ||
|
|
b044bae304 | ||
|
|
f13e384a1b | ||
|
|
bfce5cceb5 | ||
|
|
344dc165bc | ||
|
|
79c4bd7850 | ||
|
|
a82261a4df | ||
|
|
57a62dbbfd | ||
|
|
cd125ae274 | ||
|
|
d9716590b1 | ||
|
|
2b00b2c1c5 | ||
|
|
b3b0caa038 | ||
|
|
db0e833ce9 | ||
|
|
592b7c66c5 | ||
|
|
34b32f53f6 | ||
|
|
9ade28ee00 | ||
|
|
99acc9a6e7 | ||
|
|
d886c788e7 | ||
|
|
d2f7d8a9c4 | ||
|
|
7143f693d2 | ||
|
|
9cfdc00d64 | ||
|
|
4f6ab68318 | ||
|
|
7c6439e075 | ||
|
|
420fecad51 | ||
|
|
ef017c9e9d | ||
|
|
00412749e7 | ||
|
|
4188da2ef2 | ||
|
|
8d93c275ab | ||
|
|
b0b3b491a0 | ||
|
|
dd59d3c713 | ||
|
|
548f0b6130 | ||
|
|
f7e007018f | ||
|
|
436e82653c | ||
|
|
ecf598e412 | ||
|
|
257fe20c4f | ||
|
|
ba011169b8 | ||
|
|
ffe50dad22 | ||
|
|
dc289ba635 | ||
|
|
10724fac3b | ||
|
|
4969ece356 | ||
|
|
2fad881202 | ||
|
|
39b363d0b5 | ||
|
|
215eff3212 | ||
|
|
e1a0fc42ea | ||
|
|
69d28db660 | ||
|
|
c3ab04b436 | ||
|
|
918281a804 | ||
|
|
297cf3f51e | ||
|
|
93e1d732c9 | ||
|
|
1bfde1f9f0 | ||
|
|
489ab86ac7 | ||
|
|
e8f7746c87 | ||
|
|
db1139e89e | ||
|
|
5c04ce257b | ||
|
|
6cdb2a48fd | ||
|
|
37cbf79b4c | ||
|
|
00559ce8d6 | ||
|
|
07244a8a73 | ||
|
|
d181bedbfc | ||
|
|
077b3ab59e | ||
|
|
edbed67afe | ||
|
|
a947f8c783 | ||
|
|
6e131dcd7e | ||
|
|
d24097f73d | ||
|
|
bfb3a58c01 | ||
|
|
02a64a7fa3 | ||
|
|
3dfe1ccb1a | ||
|
|
c6e5f1c9f8 | ||
|
|
4c0a612ab5 | ||
|
|
09cae9cbd3 | ||
|
|
1595405871 | ||
|
|
1c8c233ebf | ||
|
|
c2d0628da1 | ||
|
|
2e58fa3c2f | ||
|
|
fced2c521c | ||
|
|
e7ceacc215 | ||
|
|
a320eb5d8e | ||
|
|
42199eefd2 | ||
|
|
56df87e60c | ||
|
|
90ed9cd15c | ||
|
|
8ca3bca810 | ||
|
|
5d2912baa1 | ||
|
|
129ec29af5 | ||
|
|
70991cf173 | ||
|
|
61199eff9c | ||
|
|
4991d3dbab | ||
|
|
3405e8b8e1 | ||
|
|
977d21eed5 | ||
|
|
09e0d0b9d8 | ||
|
|
79c38d66cb | ||
|
|
d7871fec2b | ||
|
|
9f80f4ac42 | ||
|
|
d6058768fc | ||
|
|
6a50b3f149 | ||
|
|
35045aa9d7 | ||
|
|
398ca1f8e4 | ||
|
|
7091406abc | ||
|
|
c21d478f5d | ||
|
|
f973fc3743 | ||
|
|
d776092b35 | ||
|
|
775b80eff5 | ||
|
|
ff135322f6 | ||
|
|
dafaac412f | ||
|
|
4452e637ad | ||
|
|
821c1c938e | ||
|
|
1df95702a3 | ||
|
|
274e7c579e | ||
|
|
b820e98bdc | ||
|
|
10c5cb3721 | ||
|
|
cc7db6190f | ||
|
|
9a9d81ca18 | ||
|
|
71d9816f4b | ||
|
|
8cdd138143 | ||
|
|
7dabfdc207 | ||
|
|
65e82eb37e | ||
|
|
8a14e6ccb4 | ||
|
|
5dadcf3862 | ||
|
|
c001ff763a | ||
|
|
3c59b601b5 | ||
|
|
4cb0d23136 | ||
|
|
2fd29c4b78 | ||
|
|
c0344a56ff | ||
|
|
16692d47b2 | ||
|
|
204b3e1159 | ||
|
|
41d4ee20b0 | ||
|
|
4d17f3c2ff | ||
|
|
353fe177f4 | ||
|
|
4dc4239963 | ||
|
|
0a72cab089 | ||
|
|
57202b3ea0 | ||
|
|
69e7006cc8 | ||
|
|
7ee8652cc3 | ||
|
|
8f1331dab3 | ||
|
|
2998a54713 | ||
|
|
ccba8e155e | ||
|
|
e9317dc2c7 | ||
|
|
77f88e5cac | ||
|
|
43649328cb | ||
|
|
3629c8c493 | ||
|
|
426a2f983c | ||
|
|
85273b9ed7 | ||
|
|
461dba87db | ||
|
|
d4982a8f24 | ||
|
|
de5f3657ab | ||
|
|
7a2ddd3905 | ||
|
|
d5200f859d | ||
|
|
6cee1d9ee6 | ||
|
|
6b9d4fe7c5 | ||
|
|
303f315b3e | ||
|
|
b6f41eecfd | ||
|
|
c880366aaf | ||
|
|
e40a7d6681 | ||
|
|
b3149a2b55 | ||
|
|
37a9712532 | ||
|
|
bcf65d4cae | ||
|
|
521126c982 | ||
|
|
e2aea92e3b | ||
|
|
e595f564b1 | ||
|
|
bfbabc62c4 | ||
|
|
d4248385f0 | ||
|
|
ab0aad87ec | ||
|
|
5ac5ff638e | ||
|
|
ed80acd87f | ||
|
|
fa27757719 | ||
|
|
c02cc6d193 | ||
|
|
312f6515ff | ||
|
|
f6315e48d0 | ||
|
|
8b3cff9f4c | ||
|
|
400952b327 | ||
|
|
007d23308a | ||
|
|
66e79e23cb | ||
|
|
4de2ed767b | ||
|
|
49f9a1e8d7 | ||
|
|
9a09db9212 | ||
|
|
1aad6d0517 | ||
|
|
d927f1886c | ||
|
|
0b8ff7cc01 | ||
|
|
c4ae4919a5 | ||
|
|
83e7f06500 | ||
|
|
9abd925ab7 | ||
|
|
7e0c17c5aa | ||
|
|
6da7788f61 | ||
|
|
b187409e59 | ||
|
|
079be0e072 | ||
|
|
81c8e1b192 | ||
|
|
1220eab47a | ||
|
|
44d1877892 | ||
|
|
11f8fda585 | ||
|
|
81fe104f1b | ||
|
|
feab6211d4 | ||
|
|
9691a4f361 | ||
|
|
8759fda632 | ||
|
|
74ee322312 | ||
|
|
ef4aff7d34 | ||
|
|
bfc393a090 | ||
|
|
114490f01e | ||
|
|
ad38632fc1 | ||
|
|
b737df9c40 | ||
|
|
fd18c0b2e9 | ||
|
|
cf6478b633 | ||
|
|
a70996f079 | ||
|
|
2aa56c8d49 | ||
|
|
b2fb7d5d5b | ||
|
|
16ffcc7684 | ||
|
|
16c428e360 | ||
|
|
77bdff1e4b | ||
|
|
1ae15911fc | ||
|
|
aca005c287 | ||
|
|
68fb5d7252 | ||
|
|
380fc2cbde | ||
|
|
39283a5526 | ||
|
|
3e38e467a2 | ||
|
|
4f55b56d6b | ||
|
|
54c0b3e196 | ||
|
|
9eac47f7e8 | ||
|
|
7ec58c63e9 | ||
|
|
b70ffb6331 | ||
|
|
423b47a5ff | ||
|
|
52a4e8964f | ||
|
|
964a052be1 | ||
|
|
15a14e86ba | ||
|
|
eca0c72063 | ||
|
|
2353c98919 | ||
|
|
30e5a1a7aa | ||
|
|
d94db237a9 | ||
|
|
317aa3b6ed | ||
|
|
268c92a1af | ||
|
|
bc2c998b7c | ||
|
|
73c05d2d9d | ||
|
|
f7872d346b | ||
|
|
d0d387a42f | ||
|
|
84af88ee40 | ||
|
|
aa4f7571b9 | ||
|
|
b5b96a3edb | ||
|
|
1e335e53ba | ||
|
|
75854fc026 | ||
|
|
d8a6ed4ba6 | ||
|
|
459bbda60c | ||
|
|
2a9508b4e3 | ||
|
|
c0c288e0d9 | ||
|
|
82fd5b36a8 | ||
|
|
dd3c7d8fa4 | ||
|
|
b63f073d90 | ||
|
|
0491125e92 | ||
|
|
3443c3b8ea | ||
|
|
be720be74a | ||
|
|
f3e491f15b | ||
|
|
5855198b5f | ||
|
|
62de6fcdae | ||
|
|
57dc0cd53e | ||
|
|
0a1694dd78 | ||
|
|
edc690973a | ||
|
|
48148a9e26 | ||
|
|
62b9911176 | ||
|
|
fb69a37445 | ||
|
|
81ae1eae51 | ||
|
|
517c70d855 | ||
|
|
85f7c1e73c | ||
|
|
b4cfa0e844 | ||
|
|
3c758ab2f6 | ||
|
|
1ed01b8d3d | ||
|
|
19abbe0dbd | ||
|
|
c833af1ae6 | ||
|
|
78bdd4a087 | ||
|
|
dc77bb4332 | ||
|
|
9e011d6ad9 | ||
|
|
f9ed36ed54 | ||
|
|
495681770e | ||
|
|
eb1f0e0a8a | ||
|
|
23ae5caa3c | ||
|
|
4b7d558026 | ||
|
|
44969a7fdf | ||
|
|
5f5c74f260 | ||
|
|
5646751f88 | ||
|
|
b6d3e785df | ||
|
|
ebada30984 | ||
|
|
64fc9f203e | ||
|
|
653d4fef4b | ||
|
|
5cc04b58a4 | ||
|
|
f628da7a91 | ||
|
|
a8853bdee6 | ||
|
|
5f8ffa7afc | ||
|
|
d74f4f64f7 | ||
|
|
3e7929bed6 | ||
|
|
7a2d1c29f0 | ||
|
|
0a841f17a4 | ||
|
|
ee8d48a915 | ||
|
|
539d500528 | ||
|
|
3d1de43ff1 | ||
|
|
e7998acf66 | ||
|
|
e0640418e4 | ||
|
|
52a6cc5bad | ||
|
|
8787ecceb8 | ||
|
|
a1f2f95d1b | ||
|
|
c3aeae5ed7 | ||
|
|
29ff2c5d0a | ||
|
|
a7880dc3b0 | ||
|
|
ba4437edee | ||
|
|
811afa1171 | ||
|
|
29a48aba66 | ||
|
|
c00119989e | ||
|
|
bbaac8b2b1 | ||
|
|
9554597948 | ||
|
|
774afe9fdd | ||
|
|
fa2199c3ea | ||
|
|
e321e1bb2c | ||
|
|
dfc425a7c5 | ||
|
|
4ac422314d | ||
|
|
ff6e42fa6d | ||
|
|
7a0a82bcb4 | ||
|
|
fa95ede3e9 | ||
|
|
26147c97cf | ||
|
|
c4ca6a0bac | ||
|
|
8de694b2d7 | ||
|
|
de797b644e | ||
|
|
c8357be4d0 | ||
|
|
657f0314e4 | ||
|
|
4f26e34717 | ||
|
|
133ed68152 | ||
|
|
e2c5b87a7e | ||
|
|
21e716b08a | ||
|
|
f6e21bd6c8 | ||
|
|
4ffbc0fb58 | ||
|
|
6d6c5e2e17 | ||
|
|
d795bea543 | ||
|
|
10c23e60b7 | ||
|
|
6f9ac4b88b | ||
|
|
f92025e120 | ||
|
|
392ae832b8 | ||
|
|
87a5f69335 | ||
|
|
c8e1060ea4 | ||
|
|
e361abcecd | ||
|
|
e8af8f7792 | ||
|
|
2e906f9b8a | ||
|
|
385b7e3389 | ||
|
|
48ba55d02c | ||
|
|
5223629ab1 | ||
|
|
a2a8638f28 | ||
|
|
58e6424bf7 | ||
|
|
d2255adc4e | ||
|
|
7f8ca64f64 | ||
|
|
104c1e6945 | ||
|
|
414e3555a5 | ||
|
|
c63b45dbf3 | ||
|
|
197bb2179f | ||
|
|
62fdb8d0af | ||
|
|
98184c31de | ||
|
|
ee04ad500a | ||
|
|
df40b0b8d3 | ||
|
|
8eab31c469 | ||
|
|
474011033b | ||
|
|
5893e42a8d | ||
|
|
9d18f7b15f | ||
|
|
b0c22e7a3a | ||
|
|
9ab78acf09 | ||
|
|
aa6499e7e4 | ||
|
|
fffd3592d3 | ||
|
|
842da98e61 | ||
|
|
eadeb3841b | ||
|
|
b25379c243 | ||
|
|
4d025568dc | ||
|
|
c3ec7fbbe4 | ||
|
|
14baca125d | ||
|
|
1ea94c0356 | ||
|
|
57dbece417 | ||
|
|
f023adff4b | ||
|
|
6a2fe47b22 | ||
|
|
461d167547 | ||
|
|
13425e1ad4 | ||
|
|
c7deb5ed33 | ||
|
|
27313bc3d6 | ||
|
|
6e1dbbcf4f | ||
|
|
4e3216a75d | ||
|
|
51c353e504 | ||
|
|
1b71a96a3d | ||
|
|
a0a7237c01 | ||
|
|
af576ea0c4 | ||
|
|
183c6abc98 | ||
|
|
559e65a4e1 | ||
|
|
b93ca148a8 | ||
|
|
07d6763e69 | ||
|
|
bc2da10713 | ||
|
|
2e515f5fc7 | ||
|
|
a274f3cf01 | ||
|
|
c068c3c33a | ||
|
|
e258a7cf64 | ||
|
|
5814724600 | ||
|
|
220a454859 | ||
|
|
42fb02c36f | ||
|
|
732223e832 | ||
|
|
286ab7a600 | ||
|
|
b402ce1564 | ||
|
|
0ccba3281e | ||
|
|
6f148c47e2 | ||
|
|
98a96a897b | ||
|
|
f1d96a30a4 | ||
|
|
2509a842f0 | ||
|
|
b7dbf27931 | ||
|
|
6bfce63060 | ||
|
|
6ca3b8246a | ||
|
|
1d8952867d | ||
|
|
e415dd8504 | ||
|
|
aa37ac6038 | ||
|
|
d68eeada0e | ||
|
|
accbe5a423 | ||
|
|
f33b838204 | ||
|
|
767b29d5a3 | ||
|
|
a928a0b404 | ||
|
|
2574f3a8ee | ||
|
|
622352b411 | ||
|
|
900de0a5c9 | ||
|
|
def90355a9 | ||
|
|
a3f1e04a4d | ||
|
|
39286deb19 | ||
|
|
504bffa57a | ||
|
|
d89c43befa | ||
|
|
d95818f1b2 | ||
|
|
9b0faaac34 | ||
|
|
eaafe91ade | ||
|
|
f84bfd8384 | ||
|
|
79709f3f06 | ||
|
|
ce6edf893a | ||
|
|
5d5d602f1d | ||
|
|
ad3aa30471 | ||
|
|
69d174309d | ||
|
|
5b08a69607 | ||
|
|
1bd9d41164 | ||
|
|
ef7bf87187 | ||
|
|
d21ae76fff | ||
|
|
c12980ee91 | ||
|
|
719416741f | ||
|
|
1b14263bb8 | ||
|
|
5c8da20eea | ||
|
|
560fcdc541 | ||
|
|
d1e9525052 | ||
|
|
9f65ef199b | ||
|
|
fed9d4ef3b | ||
|
|
867e8727c1 | ||
|
|
d927b82020 | ||
|
|
e003fb8d35 | ||
|
|
4db957f437 | ||
|
|
46ec0b8f70 | ||
|
|
d1aa8bf5ae | ||
|
|
3cf8ea63d8 | ||
|
|
fd55828c42 | ||
|
|
1ce4db5604 | ||
|
|
300e37124c | ||
|
|
9b3b7b09a0 | ||
|
|
17121d5861 | ||
|
|
c9f6dabfc6 | ||
|
|
b76952f016 | ||
|
|
6c9572714f | ||
|
|
2565239a1b | ||
|
|
8ab609471a | ||
|
|
3cf21a7e7f | ||
|
|
b0170d1f6f | ||
|
|
45ca3500c6 | ||
|
|
526fdb495b | ||
|
|
8de6cb1ca0 | ||
|
|
a1c036a7e2 | ||
|
|
a9b03bb39e | ||
|
|
595ac49552 | ||
|
|
af1cdadabd | ||
|
|
1be0d52051 | ||
|
|
0d0577a886 | ||
|
|
e4629cc740 | ||
|
|
1c555f321b | ||
|
|
5e9c4fde95 | ||
|
|
6aecebcf2c | ||
|
|
9a2c9f607f | ||
|
|
3a9b725c0c | ||
|
|
f7616f6e94 | ||
|
|
ce8bd9ac40 | ||
|
|
5c44082c42 | ||
|
|
585f0c54bf | ||
|
|
31453d187d | ||
|
|
53ff5b56e6 | ||
|
|
a1ceff8ce8 | ||
|
|
bfb9feaf07 | ||
|
|
8e0e04eae9 | ||
|
|
0f96bf7709 | ||
|
|
f61569622a | ||
|
|
31d8ae08c8 | ||
|
|
4e324e34d8 | ||
|
|
7b5761106d | ||
|
|
819db9538f | ||
|
|
e3b3a08f5f | ||
|
|
e3d9ad005e | ||
|
|
bcacf2fe74 | ||
|
|
b3a6650a6f | ||
|
|
534efcb987 | ||
|
|
79a211ad02 | ||
|
|
b4a0fe54cd | ||
|
|
3a73414972 | ||
|
|
66ee792e8c | ||
|
|
496319a2b0 | ||
|
|
0a98df922e | ||
|
|
4c7d46c8a0 | ||
|
|
a011a6af64 | ||
|
|
2b8f40e505 | ||
|
|
8f797e81ae | ||
|
|
f8ec338fa3 | ||
|
|
ea5f0fadb8 | ||
|
|
bf01a1d138 | ||
|
|
32c051320c | ||
|
|
74ae1429a1 | ||
|
|
00c93abd1b | ||
|
|
7fa559247d | ||
|
|
8895173a2b | ||
|
|
f20cb6ff52 | ||
|
|
4b12fb3a9a | ||
|
|
716337b71a | ||
|
|
dfb965cfa9 | ||
|
|
91f78b54d8 | ||
|
|
ac1c5f81ae | ||
|
|
6abed48af6 | ||
|
|
6550a52cee | ||
|
|
cd62e67011 | ||
|
|
e5524ddc1d | ||
|
|
3c17049084 | ||
|
|
d2287ab9f4 | ||
|
|
a5f4468c54 | ||
|
|
f2dbfa9b33 | ||
|
|
d0dddaf7cc | ||
|
|
40d0be5828 | ||
|
|
d879491a58 | ||
|
|
4d585cbb11 | ||
|
|
2f6d7f81cc | ||
|
|
3363772ce5 | ||
|
|
1910cef3d1 | ||
|
|
121446d648 | ||
|
|
693f623e5e | ||
|
|
da1cac1e55 | ||
|
|
22089a9e45 | ||
|
|
e65db3cba5 | ||
|
|
5b183d9105 | ||
|
|
2a43a95ddd | ||
|
|
23bb5d5147 | ||
|
|
639896b309 | ||
|
|
3d5699ef4a | ||
|
|
1c41882bf0 | ||
|
|
14908e3a11 | ||
|
|
4c559a3191 | ||
|
|
0802f9158c | ||
|
|
ceb5c38ca3 | ||
|
|
f0d36e71a1 | ||
|
|
e809b30cb9 | ||
|
|
e5db40e4ae | ||
|
|
43ff7e4b3e | ||
|
|
a3afc249ef | ||
|
|
ed83d90603 | ||
|
|
daf0a9c6e8 | ||
|
|
4271fb37e9 | ||
|
|
8560baca87 | ||
|
|
d73394abd8 | ||
|
|
f6cca3313a | ||
|
|
76edd53e40 | ||
|
|
cb31a717cf | ||
|
|
b9b3dcb5e3 | ||
|
|
acf55e0c9b | ||
|
|
c40456a2ec | ||
|
|
6d9f1828c6 | ||
|
|
9276607920 | ||
|
|
9fbd02b06d | ||
|
|
4885a9e65a | ||
|
|
98851ed686 | ||
|
|
edcd92fbb7 | ||
|
|
fdcfb3eb7c | ||
|
|
55ff45064f | ||
|
|
f88eadd312 | ||
|
|
874e9dafc2 | ||
|
|
d6b334ab02 | ||
|
|
efbee6796f | ||
|
|
cdeba51ccd | ||
|
|
7fd3d9f331 | ||
|
|
c8d5a446ea | ||
|
|
fe19d277ac | ||
|
|
a7971373a6 | ||
|
|
70dbac10c7 | ||
|
|
82b352d519 | ||
|
|
421926f7ac | ||
|
|
53d555dceb | ||
|
|
043e288d70 | ||
|
|
8718bb4ff1 | ||
|
|
0a06648c02 | ||
|
|
276992d654 | ||
|
|
f07bb17442 | ||
|
|
2529952982 | ||
|
|
e3c290269b | ||
|
|
4bcb31e532 | ||
|
|
768c864766 | ||
|
|
20a5d80647 | ||
|
|
a09aebeca4 | ||
|
|
9e0b45e27a | ||
|
|
9123889876 | ||
|
|
d06abbbd91 | ||
|
|
8f90d25468 | ||
|
|
69219eb340 | ||
|
|
185f03985e | ||
|
|
d102c43f9a | ||
|
|
063e019653 | ||
|
|
49cb35175f | ||
|
|
5d1ea43b9e | ||
|
|
a1c3a60f87 | ||
|
|
60c406d6ec | ||
|
|
7b2bf9ac13 | ||
|
|
856b83ac53 | ||
|
|
4017db1d15 | ||
|
|
5a24bcfe51 | ||
|
|
73268c2af2 | ||
|
|
bcc6354c04 | ||
|
|
1853cfde9b | ||
|
|
07ff1a7717 | ||
|
|
0ce6ef8d8d | ||
|
|
e13454fe3f | ||
|
|
94c25e2017 | ||
|
|
b09c97169a | ||
|
|
37192422be | ||
|
|
9e7b905c0b | ||
|
|
33501fdb0f | ||
|
|
6f00cba872 | ||
|
|
29f4734ec6 | ||
|
|
b17e0dc26d | ||
|
|
403bfc2b44 | ||
|
|
4d6cfbba20 | ||
|
|
a1593a69a4 | ||
|
|
8c05ae332c | ||
|
|
7f0c49b14d | ||
|
|
b7fae1a65b | ||
|
|
a4dd47374e | ||
|
|
4062b960c7 | ||
|
|
44bf3d40ad | ||
|
|
5f85c2a7a0 | ||
|
|
3530da935b | ||
|
|
a0972158dc | ||
|
|
3434b95d68 | ||
|
|
861cc437f4 | ||
|
|
2b2dc2be39 | ||
|
|
acb700bd27 | ||
|
|
e5977d6157 | ||
|
|
44caa12fa5 | ||
|
|
26c7078923 | ||
|
|
94a4fb4579 | ||
|
|
d6f9f29835 | ||
|
|
2eb2362da8 | ||
|
|
53c3981651 | ||
|
|
d252b1fb13 | ||
|
|
d3173d8533 | ||
|
|
4a072b3dfc | ||
|
|
ce1acd9d44 | ||
|
|
ff4300d525 | ||
|
|
3b25fef852 | ||
|
|
91da92346d | ||
|
|
7f2c118f8d | ||
|
|
0848b03127 | ||
|
|
e5074afdeb | ||
|
|
4bd9e4f847 | ||
|
|
717e82c09e | ||
|
|
d069dedf34 | ||
|
|
dd2f89628e | ||
|
|
87b9f30dce | ||
|
|
76298e86be | ||
|
|
aaef1ac997 | ||
|
|
794ee2f562 | ||
|
|
546c66ea3c | ||
|
|
7a4de966d4 | ||
|
|
c404234635 | ||
|
|
6fe7d5a856 | ||
|
|
2fb71445da | ||
|
|
79b51311bc | ||
|
|
fe6eb01404 | ||
|
|
5542918b04 | ||
|
|
e93ef025a1 | ||
|
|
8d31b6140d | ||
|
|
4e027a6515 | ||
|
|
797f1f0f1c | ||
|
|
4d8200fef3 | ||
|
|
edee909324 | ||
|
|
48f54cf2f2 | ||
|
|
c8cb961108 | ||
|
|
013eba1d58 | ||
|
|
af02e02978 | ||
|
|
b947bde3db | ||
|
|
34b8fdfe6d | ||
|
|
47e7b621ad | ||
|
|
52c7395578 | ||
|
|
fb527e5df4 | ||
|
|
7161756cc9 | ||
|
|
f180beb3f9 | ||
|
|
a302a6334d | ||
|
|
18b1931e7c | ||
|
|
ae7436a41b | ||
|
|
a0d76eabe5 | ||
|
|
5557701f44 | ||
|
|
0ccb69bc06 | ||
|
|
0152941ecf | ||
|
|
28462bb2b5 | ||
|
|
a824b24058 | ||
|
|
6ef9034a67 | ||
|
|
93f1ae501c | ||
|
|
d9b3eafc39 | ||
|
|
5dd42cf925 | ||
|
|
e4c4c8c468 | ||
|
|
72a76f6c80 | ||
|
|
071670e24c | ||
|
|
c25c1db3da | ||
|
|
c0cc57d1d8 | ||
|
|
33dab87765 | ||
|
|
9d09c509ab | ||
|
|
dbb29c7661 | ||
|
|
1a1cf5f672 | ||
|
|
759c917498 | ||
|
|
d7b1d617ea | ||
|
|
1e47271c91 | ||
|
|
1dca6116be | ||
|
|
ff59274c95 | ||
|
|
ca6cd19fb1 | ||
|
|
be61eefdf9 | ||
|
|
cf2bb6b599 | ||
|
|
d739d04232 | ||
|
|
711ff2692c | ||
|
|
705f4337e4 | ||
|
|
237ab2be45 | ||
|
|
536136af77 | ||
|
|
d4e5cfb548 | ||
|
|
b5e5e9508c | ||
|
|
f161609a24 | ||
|
|
b4b7b6f455 | ||
|
|
c24079884d | ||
|
|
38c3e3600d | ||
|
|
09795678ef | ||
|
|
b3207d6402 | ||
|
|
c6439cb1b7 | ||
|
|
61f6e5ff79 | ||
|
|
4cd8705710 | ||
|
|
c8cd2545d3 | ||
|
|
6f310ff63a | ||
|
|
20862f07bc | ||
|
|
1365eaca3a | ||
|
|
9dfc7801a0 | ||
|
|
02d4ca5c8b | ||
|
|
c2a7b2f13a | ||
|
|
4115bc416e | ||
|
|
060a3fd47e | ||
|
|
84726fa45c | ||
|
|
3609c961ea | ||
|
|
756e176878 | ||
|
|
1398b71b60 | ||
|
|
f69ca56179 | ||
|
|
a310b5e864 | ||
|
|
517bfa5272 | ||
|
|
ca95c9de97 | ||
|
|
37c269bc0b | ||
|
|
e90c97f8a4 | ||
|
|
af6e17fce8 | ||
|
|
b86352bfc0 | ||
|
|
f03a1b50ef | ||
|
|
70da8d26c0 | ||
|
|
333c7433e8 | ||
|
|
f2d48cb894 | ||
|
|
22766e958f | ||
|
|
42c3186a53 | ||
|
|
530919c531 | ||
|
|
0ec39e3c77 | ||
|
|
cdddb1209e | ||
|
|
62db5370aa | ||
|
|
ab991c2a7d | ||
|
|
d03b54d95a | ||
|
|
62a982ef9f | ||
|
|
798c3cb373 | ||
|
|
7f55e2c9bb | ||
|
|
8e76de7d34 | ||
|
|
ac284ab067 | ||
|
|
95f9304f4f | ||
|
|
7b733686cb | ||
|
|
bdafb9a3f1 | ||
|
|
abd376a44c | ||
|
|
38a7993a9b | ||
|
|
3edb133727 | ||
|
|
84dd258777 | ||
|
|
543b8df045 | ||
|
|
cb7c76889d | ||
|
|
9f296c67b2 | ||
|
|
4a3f490814 | ||
|
|
cbf348fafa | ||
|
|
e205883de5 | ||
|
|
ce04336648 | ||
|
|
a8bf7e5d5f | ||
|
|
69e1973544 | ||
|
|
2f817568e2 | ||
|
|
d9611f784c | ||
|
|
9430bcbf2e | ||
|
|
a6f7062f92 | ||
|
|
e234717129 | ||
|
|
6f1f490370 | ||
|
|
b2bb421063 | ||
|
|
be13a9b967 | ||
|
|
0fa41d317a | ||
|
|
a4d36e0212 | ||
|
|
30fecd412c | ||
|
|
0d61c12dcd | ||
|
|
7f2a899c6f | ||
|
|
0bbb773e95 | ||
|
|
7aa9c92971 | ||
|
|
904f4bb4d8 | ||
|
|
09696195f4 | ||
|
|
971c96f566 | ||
|
|
4fdaa2b708 | ||
|
|
9f6af75f79 | ||
|
|
b29ce28877 | ||
|
|
ff7406a755 | ||
|
|
a8be08a19a | ||
|
|
1ecaae364c | ||
|
|
2637f74094 | ||
|
|
02d944aa67 | ||
|
|
a6bad6d2a5 | ||
|
|
0ae131108d | ||
|
|
2db6b2ceef | ||
|
|
f19c058634 | ||
|
|
ceb4acd749 | ||
|
|
dde0e26110 | ||
|
|
1fbcc2319a | ||
|
|
b0629d626e | ||
|
|
ec09d69145 | ||
|
|
8ddbc6bf96 | ||
|
|
b608e50296 | ||
|
|
7fa791992c | ||
|
|
fae21132ee |
70
.appveyor.yml
Normal file
70
.appveyor.yml
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
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.8\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%
|
||||||
|
# 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
|
||||||
|
- ps: wget 'http://kent.dl.sourceforge.net/project/opencvlibrary/opencv-win/3.3.1/opencv-3.3.1-vc14.exe' -outfile opencv-3.3.1-vc14.exe
|
||||||
|
- cmd: opencv-3.3.1-vc14.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
|
||||||
|
# PCL (including QVTK)
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/atf4r8kb1xyc1ls/PCL%201.8.1.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 1.8.1\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\PCL 1.8.1\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
|
||||||
|
|
||||||
|
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 1.8.1\cmake" -DZLIB_ROOT="C:\Program Files\zlib" ..
|
||||||
|
|
||||||
|
after_build :
|
||||||
|
- cmake --build . --config Release --target package
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
- path: build\RTABMap-*
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
- provider: Email
|
||||||
|
to:
|
||||||
|
- matlabbe@email.com
|
||||||
|
on_build_success: false
|
||||||
|
on_build_failure: false
|
||||||
|
on_build_status_changed: true
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,6 +1,8 @@
|
|||||||
/lib
|
/lib
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.settings/language.settings.xml
|
.settings/language.settings.xml
|
||||||
|
.idea/
|
||||||
|
cmake-build-debug/
|
||||||
app/android/.classpath
|
app/android/.classpath
|
||||||
app/android/.project
|
app/android/.project
|
||||||
app/android/AndroidManifest.xml
|
app/android/AndroidManifest.xml
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
sudo: true
|
sudo: true
|
||||||
dist: trusty
|
dist: trusty
|
||||||
language: cpp
|
language: cpp
|
||||||
|
group: deprecated-2017Q3
|
||||||
|
|
||||||
compiler:
|
compiler:
|
||||||
- gcc
|
- gcc
|
||||||
@@ -13,17 +14,20 @@ addons:
|
|||||||
- libopencv-dev
|
- libopencv-dev
|
||||||
- libqt4-dev
|
- libqt4-dev
|
||||||
- libsqlite3-dev
|
- libsqlite3-dev
|
||||||
|
- libyaml-cpp-dev
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
|
- sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
|
||||||
- wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
|
- wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
|
||||||
- sudo apt-get update
|
- sudo apt-get update
|
||||||
- sudo apt-get -y install libpcl-1.7-all libfreenect-dev
|
- sudo apt-get -y install libpcl-1.7-all libfreenect-dev ros-indigo-libg2o ros-indigo-octomap libopenni2-dev
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
- source /opt/ros/indigo/setup.bash
|
||||||
- mkdir -p build && cd build
|
- mkdir -p build && cd build
|
||||||
- cmake ..
|
- cmake ..
|
||||||
- make
|
- make
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
email: false
|
email:
|
||||||
|
- matlabbe@gmail.com
|
||||||
|
|||||||
529
CMakeLists.txt
529
CMakeLists.txt
@@ -6,9 +6,10 @@ SET(PROJECT_PREFIX rtabmap)
|
|||||||
|
|
||||||
# Catkin doesn't support multiarch library path,
|
# Catkin doesn't support multiarch library path,
|
||||||
# fix to "lib" if not set by user.
|
# fix to "lib" if not set by user.
|
||||||
#IF(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
OPTION(MULTI_ARCH "Activate multi-arch lib directory (debian)" OFF)
|
||||||
# set(CMAKE_INSTALL_LIBDIR "lib")
|
IF(NOT MULTI_ARCH AND NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
||||||
#ENDIF(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
set(CMAKE_INSTALL_LIBDIR "lib")
|
||||||
|
ENDIF(NOT MULTI_ARCH AND NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
||||||
|
|
||||||
INCLUDE(GNUInstallDirs)
|
INCLUDE(GNUInstallDirs)
|
||||||
|
|
||||||
@@ -19,8 +20,8 @@ SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
|||||||
# VERSION
|
# VERSION
|
||||||
#######################
|
#######################
|
||||||
SET(RTABMAP_MAJOR_VERSION 0)
|
SET(RTABMAP_MAJOR_VERSION 0)
|
||||||
SET(RTABMAP_MINOR_VERSION 11)
|
SET(RTABMAP_MINOR_VERSION 17)
|
||||||
SET(RTABMAP_PATCH_VERSION 4)
|
SET(RTABMAP_PATCH_VERSION 1)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
@@ -45,18 +46,25 @@ IF(NOT ANDROID)
|
|||||||
ENDIF(NOT ANDROID)
|
ENDIF(NOT ANDROID)
|
||||||
|
|
||||||
IF(WIN32 AND NOT MINGW)
|
IF(WIN32 AND NOT MINGW)
|
||||||
ADD_DEFINITIONS("-DNOMINMAX")
|
ADD_DEFINITIONS("-DNOMINMAX")
|
||||||
ADD_DEFINITIONS("-wd4100 -wd4127 -wd4150 -wd4191 -wd4242 -wd4244 -wd4251 -wd4305 -wd4365 -wd4512 -wd4514 -wd4548 -wd4571 -wd4619 -wd4625 -wd4626 -wd4628 -wd4668 -wd4710 -wd4711 -wd4738 -wd4820 -wd4946 -wd4986")
|
ADD_DEFINITIONS("-wd4100 -wd4127 -wd4150 -wd4191 -wd4242 -wd4244 -wd4251 -wd4305 -wd4365 -wd4512 -wd4514 -wd4548 -wd4571 -wd4619 -wd4625 -wd4626 -wd4628 -wd4668 -wd4710 -wd4711 -wd4738 -wd4820 -wd4946 -wd4986")
|
||||||
ELSE ()
|
ELSE ()
|
||||||
ADD_DEFINITIONS( "-Wall" )
|
ADD_DEFINITIONS( "-Wall" )
|
||||||
ADD_DEFINITIONS("-Wno-unknown-pragmas")
|
ADD_DEFINITIONS("-Wno-unknown-pragmas")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
if(POLICY CMP0020)
|
||||||
|
cmake_policy(SET CMP0020 OLD)
|
||||||
|
endif()
|
||||||
|
if(POLICY CMP0043)
|
||||||
|
cmake_policy(SET CMP0043 OLD)
|
||||||
|
endif()
|
||||||
|
|
||||||
IF(MINGW)
|
IF(MINGW)
|
||||||
# Hide the --enable-auto-import warning
|
# Hide the --enable-auto-import warning
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--enable-auto-import")
|
SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--enable-auto-import")
|
||||||
SET(CMAKE_MODULE_LINKER_FLAGS "-Wl,--enable-auto-import")
|
SET(CMAKE_MODULE_LINKER_FLAGS "-Wl,--enable-auto-import")
|
||||||
SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-auto-import")
|
SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-auto-import")
|
||||||
ENDIF(MINGW)
|
ENDIF(MINGW)
|
||||||
|
|
||||||
# GCC 4 required
|
# GCC 4 required
|
||||||
@@ -105,29 +113,40 @@ SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
|
|||||||
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
|
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
|
||||||
|
|
||||||
####### INSTALL DIR #######
|
####### INSTALL DIR #######
|
||||||
set(INSTALL_INCLUDE_DIR include/${PROJECT_PREFIX}-${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION} CACHE PATH
|
set(INSTALL_INCLUDE_DIR include/${PROJECT_PREFIX}-${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION})
|
||||||
"Installation directory for header files")
|
|
||||||
if(WIN32 AND NOT CYGWIN)
|
if(WIN32 AND NOT CYGWIN)
|
||||||
set(DEF_INSTALL_CMAKE_DIR CMake)
|
set(DEF_INSTALL_CMAKE_DIR CMake)
|
||||||
else()
|
else()
|
||||||
set(DEF_INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/${PROJECT_PREFIX}-${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION})
|
set(DEF_INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/${PROJECT_PREFIX}-${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION})
|
||||||
endif()
|
endif()
|
||||||
set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
|
set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR})
|
||||||
"Installation directory for CMake files")
|
|
||||||
|
|
||||||
####### BUILD OPTIONS #######
|
####### BUILD OPTIONS #######
|
||||||
|
|
||||||
|
# ANDROID_PREBUILD (early exit if true)
|
||||||
|
OPTION( ANDROID_PREBUILD "Set to ON to build rtabmap resource build tool (required for android build)" OFF )
|
||||||
|
IF(ANDROID_PREBUILD)
|
||||||
|
MESSAGE("Option ANDROID_PREBUILD is set, only rtabmap resource tool will be built. You can use android toolchain after that.")
|
||||||
|
ADD_SUBDIRECTORY( utilite )
|
||||||
|
return()
|
||||||
|
ENDIF(ANDROID_PREBUILD)
|
||||||
|
|
||||||
IF(APPLE)
|
IF(APPLE)
|
||||||
OPTION(BUILD_AS_BUNDLE "Set to ON to build as bundle (DragNDrop)" OFF)
|
OPTION(BUILD_AS_BUNDLE "Set to ON to build as bundle (DragNDrop)" OFF)
|
||||||
ENDIF(APPLE)
|
ENDIF(APPLE)
|
||||||
OPTION(BUILD_APP "Build main application" ON)
|
OPTION(BUILD_APP "Build main application" ON)
|
||||||
OPTION(BUILD_TOOLS "Build tools" ON)
|
OPTION(BUILD_TOOLS "Build tools" ON)
|
||||||
OPTION(BUILD_EXAMPLES "Build examples" ON)
|
OPTION(BUILD_EXAMPLES "Build examples" ON)
|
||||||
|
|
||||||
####### DEPENDENCIES #######
|
####### DEPENDENCIES #######
|
||||||
|
IF(ANDROID)
|
||||||
|
option(WITH_QT "Include Qt support" OFF)
|
||||||
|
ELSE()
|
||||||
option(WITH_QT "Include Qt support" ON)
|
option(WITH_QT "Include Qt support" ON)
|
||||||
|
ENDIF()
|
||||||
option(WITH_FREENECT "Include Freenect support" ON)
|
option(WITH_FREENECT "Include Freenect support" ON)
|
||||||
option(WITH_FREENECT2 "Include Freenect2 support" ON)
|
option(WITH_FREENECT2 "Include Freenect2 support" ON)
|
||||||
|
option(WITH_K4W2 "Include Kinect for Windows v2 support" ON)
|
||||||
option(WITH_OPENNI2 "Include OpenNI2 support" ON)
|
option(WITH_OPENNI2 "Include OpenNI2 support" ON)
|
||||||
option(WITH_DC1394 "Include dc1394 support" ON)
|
option(WITH_DC1394 "Include dc1394 support" ON)
|
||||||
option(WITH_G2O "Include g2o support" ON)
|
option(WITH_G2O "Include g2o support" ON)
|
||||||
@@ -135,14 +154,38 @@ option(WITH_GTSAM "Include GTSAM support" ON)
|
|||||||
option(WITH_TORO "Include TORO support" ON)
|
option(WITH_TORO "Include TORO support" ON)
|
||||||
option(WITH_VERTIGO "Include Vertigo support" ON)
|
option(WITH_VERTIGO "Include Vertigo support" ON)
|
||||||
option(WITH_CVSBA "Include cvsba support" ON)
|
option(WITH_CVSBA "Include cvsba support" ON)
|
||||||
|
option(WITH_POINTMATCHER "Include libpointmatcher support" ON)
|
||||||
option(WITH_FLYCAPTURE2 "Include FlyCapture2/Triclops support" ON)
|
option(WITH_FLYCAPTURE2 "Include FlyCapture2/Triclops support" ON)
|
||||||
|
option(WITH_ZED "Include ZED sdk support" ON)
|
||||||
|
option(WITH_REALSENSE "Include RealSense support" ON)
|
||||||
|
option(WITH_REALSENSE_SLAM "Include RealSenseSlam support" ON)
|
||||||
|
option(WITH_OCTOMAP "Include Octomap support" ON)
|
||||||
|
option(WITH_CPUTSDF "Include CPUTSDF support" ON)
|
||||||
|
option(WITH_OPENCHISEL "Include open_chisel support" ON)
|
||||||
|
option(WITH_FOVIS "Include FOVIS support" ON)
|
||||||
|
option(WITH_VISO2 "Include VISO2 support" ON)
|
||||||
|
option(WITH_DVO "Include DVO support" ON)
|
||||||
|
option(WITH_ORB_SLAM2 "Include ORB_SLAM2 support" ON)
|
||||||
|
option(WITH_OKVIS "Include OKVIS support" ON)
|
||||||
|
option(PCL_OMP "With PCL OMP implementations" ON)
|
||||||
|
|
||||||
FIND_PACKAGE(OpenCV REQUIRED QUIET)
|
FIND_PACKAGE(OpenCV REQUIRED QUIET)
|
||||||
FIND_PACKAGE(PCL 1.7 REQUIRED QUIET)
|
|
||||||
|
IF(WITH_QT)
|
||||||
|
FIND_PACKAGE(PCL 1.7 REQUIRED QUIET COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization)
|
||||||
|
ELSE()
|
||||||
|
FIND_PACKAGE(PCL 1.7 REQUIRED QUIET COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation )
|
||||||
|
ENDIF()
|
||||||
|
if("${PCL_DEFINITIONS}" MATCHES "-march=native")
|
||||||
|
MESSAGE(WARNING "PCL definitions contain \"-march=native\", make sure all libraries using Eigen are also compiled with that flag to avoid some segmentation faults (with gdb referring to some Eigen functions).")
|
||||||
|
else()
|
||||||
|
MESSAGE(STATUS "PCL definitions don't contain \"-march=native\", make sure all libraries using Eigen are also compiled without that flag to avoid some segmentation faults (with gdb referring to some Eigen functions).")
|
||||||
|
endif()
|
||||||
|
|
||||||
FIND_PACKAGE(ZLIB REQUIRED QUIET)
|
FIND_PACKAGE(ZLIB REQUIRED QUIET)
|
||||||
|
|
||||||
# fix libproj.so not found on Xenial
|
|
||||||
if(NOT "${PCL_LIBRARIES}" STREQUAL "")
|
if(NOT "${PCL_LIBRARIES}" STREQUAL "")
|
||||||
|
# fix libproj.so not found on Xenial
|
||||||
list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4")
|
list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -155,6 +198,9 @@ if(OPENMP_FOUND)
|
|||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
||||||
message (STATUS "Found OpenMP")
|
message (STATUS "Found OpenMP")
|
||||||
|
if(PCL_OMP)
|
||||||
|
add_definitions(-DPCL_OMP)
|
||||||
|
endif(PCL_OMP)
|
||||||
else(OPENMP_FOUND)
|
else(OPENMP_FOUND)
|
||||||
message (STATUS "Not found OpenMP")
|
message (STATUS "Not found OpenMP")
|
||||||
endif()
|
endif()
|
||||||
@@ -169,19 +215,36 @@ IF(ZLIB_FOUND)
|
|||||||
MESSAGE(STATUS "Found ZLIB: ${ZLIB_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found ZLIB: ${ZLIB_INCLUDE_DIRS}")
|
||||||
ENDIF(ZLIB_FOUND)
|
ENDIF(ZLIB_FOUND)
|
||||||
|
|
||||||
|
SET(ADD_VTK_GUI_SUPPORT_QT_TO_CONF FALSE)
|
||||||
IF(WITH_QT)
|
IF(WITH_QT)
|
||||||
|
FIND_PACKAGE(VTK)
|
||||||
|
IF(NOT VTK_FOUND)
|
||||||
|
MESSAGE(FATAL_ERROR "VTK is required when using Qt. Set -DWITH_QT=OFF if you don't want gui tools.")
|
||||||
|
ENDIF(NOT VTK_FOUND)
|
||||||
|
|
||||||
# If Qt is here, the GUI will be built
|
# If Qt is here, the GUI will be built
|
||||||
# look for Qt5 before Qt4
|
# look for Qt5 (if vtk>5 is installed) before Qt4
|
||||||
FIND_PACKAGE(Qt5 COMPONENTS Widgets Core Gui Svg QUIET)
|
IF("${VTK_MAJOR_VERSION}" GREATER 5)
|
||||||
|
FIND_PACKAGE(Qt5 COMPONENTS Widgets Core Gui QUIET)
|
||||||
|
IF(Qt5_FOUND)
|
||||||
|
FIND_PACKAGE(Qt5 COMPONENTS Widgets Core Gui OPTIONAL_COMPONENTS Svg)
|
||||||
|
ENDIF(Qt5_FOUND)
|
||||||
|
ENDIF("${VTK_MAJOR_VERSION}" GREATER 5)
|
||||||
|
|
||||||
IF(NOT Qt5_FOUND)
|
IF(NOT Qt5_FOUND)
|
||||||
FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui QtSvg)
|
FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui OPTIONAL_COMPONENTS QtSvg)
|
||||||
ENDIF(NOT Qt5_FOUND)
|
ENDIF(NOT Qt5_FOUND)
|
||||||
|
|
||||||
IF(QT4_FOUND OR Qt5_FOUND)
|
IF(QT4_FOUND OR Qt5_FOUND)
|
||||||
FIND_PACKAGE(VTK REQUIRED)
|
|
||||||
IF("${VTK_MAJOR_VERSION}" EQUAL 5)
|
IF("${VTK_MAJOR_VERSION}" EQUAL 5)
|
||||||
FIND_PACKAGE(QVTK REQUIRED) # only for VTK 5
|
FIND_PACKAGE(QVTK REQUIRED) # only for VTK 5
|
||||||
ENDIF("${VTK_MAJOR_VERSION}" EQUAL 5)
|
ELSE()
|
||||||
|
list(FIND PCL_LIBRARIES vtkGUISupportQt value)
|
||||||
|
IF(value EQUAL -1)
|
||||||
|
SET(PCL_LIBRARIES "${PCL_LIBRARIES};vtkGUISupportQt")
|
||||||
|
SET(ADD_VTK_GUI_SUPPORT_QT_TO_CONF TRUE)
|
||||||
|
ENDIF(value EQUAL -1)
|
||||||
|
ENDIF()
|
||||||
ENDIF(QT4_FOUND OR Qt5_FOUND)
|
ENDIF(QT4_FOUND OR Qt5_FOUND)
|
||||||
ENDIF(WITH_QT)
|
ENDIF(WITH_QT)
|
||||||
|
|
||||||
@@ -195,13 +258,28 @@ ENDIF(WITH_FREENECT)
|
|||||||
IF(WITH_FREENECT2)
|
IF(WITH_FREENECT2)
|
||||||
FIND_PACKAGE(freenect2 QUIET)
|
FIND_PACKAGE(freenect2 QUIET)
|
||||||
IF(freenect2_FOUND)
|
IF(freenect2_FOUND)
|
||||||
IF(NOT freenect2_INCLUDE_DIRS)
|
IF(NOT freenect2_INCLUDE_DIRS)
|
||||||
SET(freenect2_INCLUDE_DIRS ${freenect2_INCLUDE_DIR})
|
SET(freenect2_INCLUDE_DIRS ${freenect2_INCLUDE_DIR})
|
||||||
ENDIF(NOT freenect2_INCLUDE_DIRS)
|
ENDIF(NOT freenect2_INCLUDE_DIRS)
|
||||||
MESSAGE(STATUS "Found freenect2: ${freenect2_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found freenect2: ${freenect2_INCLUDE_DIRS}")
|
||||||
|
# Explicitly link to OpenCL (in case of CUDA installed)
|
||||||
|
FIND_PACKAGE(OpenCL QUIET)
|
||||||
|
IF(OpenCL_FOUND)
|
||||||
|
SET(freenect2_LIBRARIES
|
||||||
|
${OpenCL_LIBRARIES}
|
||||||
|
${freenect2_LIBRARIES}
|
||||||
|
)
|
||||||
|
ENDIF(OpenCL_FOUND)
|
||||||
ENDIF(freenect2_FOUND)
|
ENDIF(freenect2_FOUND)
|
||||||
ENDIF(WITH_FREENECT2)
|
ENDIF(WITH_FREENECT2)
|
||||||
|
|
||||||
|
IF(WITH_K4W2 AND WIN32)
|
||||||
|
FIND_PACKAGE(KinectSDK2 QUIET)
|
||||||
|
IF(KinectSDK2_FOUND)
|
||||||
|
MESSAGE(STATUS "Found Kinect for Windows 2: ${KinectSDK2_INCLUDE_DIRS}")
|
||||||
|
ENDIF(KinectSDK2_FOUND)
|
||||||
|
ENDIF(WITH_K4W2 AND WIN32)
|
||||||
|
|
||||||
# IF PCL depends on OpenNI2 (already found), ignore WITH_OPENNI2
|
# IF PCL depends on OpenNI2 (already found), ignore WITH_OPENNI2
|
||||||
IF(WITH_OPENNI2 OR OpenNI2_FOUND)
|
IF(WITH_OPENNI2 OR OpenNI2_FOUND)
|
||||||
FIND_PACKAGE(OpenNI2 QUIET)
|
FIND_PACKAGE(OpenNI2 QUIET)
|
||||||
@@ -228,22 +306,6 @@ IF(WITH_GTSAM)
|
|||||||
FIND_PACKAGE(GTSAM QUIET)
|
FIND_PACKAGE(GTSAM QUIET)
|
||||||
ENDIF(WITH_GTSAM)
|
ENDIF(WITH_GTSAM)
|
||||||
|
|
||||||
IF(G2O_FOUND OR GTSAM_FOUND)
|
|
||||||
#Newest versions require std11
|
|
||||||
IF(NOT MSVC)
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
|
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
|
|
||||||
IF(COMPILER_SUPPORTS_CXX11)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
|
||||||
ELSEIF(COMPILER_SUPPORTS_CXX0X)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
|
||||||
ELSE()
|
|
||||||
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler if you want to use g2o or gtsam (set \"-DWITH_G2O=OFF -DWITH_GTSAM=OFF\" to build without g2o and gtsam).")
|
|
||||||
ENDIF()
|
|
||||||
ENDIF()
|
|
||||||
ENDIF(G2O_FOUND OR GTSAM_FOUND)
|
|
||||||
|
|
||||||
IF(WITH_FLYCAPTURE2)
|
IF(WITH_FLYCAPTURE2)
|
||||||
FIND_PACKAGE(FlyCapture2 QUIET)
|
FIND_PACKAGE(FlyCapture2 QUIET)
|
||||||
IF(FlyCapture2_FOUND)
|
IF(FlyCapture2_FOUND)
|
||||||
@@ -258,6 +320,147 @@ IF(WITH_CVSBA)
|
|||||||
ENDIF(cvsba_FOUND)
|
ENDIF(cvsba_FOUND)
|
||||||
ENDIF(WITH_CVSBA)
|
ENDIF(WITH_CVSBA)
|
||||||
|
|
||||||
|
IF(WITH_POINTMATCHER)
|
||||||
|
find_package(libpointmatcher QUIET)
|
||||||
|
IF(libpointmatcher_FOUND)
|
||||||
|
MESSAGE(STATUS "Found libpointmatcher: ${libpointmatcher_INCLUDE_DIRS}")
|
||||||
|
ENDIF(libpointmatcher_FOUND)
|
||||||
|
ENDIF(WITH_POINTMATCHER)
|
||||||
|
|
||||||
|
SET(ZED_FOUND FALSE)
|
||||||
|
IF(WITH_ZED)
|
||||||
|
IF(WIN32) # Windows
|
||||||
|
SET(ZED_INCLUDE_DIRS $ENV{ZED_INCLUDE_DIRS})
|
||||||
|
if (CMAKE_CL_64) # 64 bits
|
||||||
|
SET(ZED_LIBRARIES $ENV{ZED_LIBRARIES_64})
|
||||||
|
else(CMAKE_CL_64) # 32 bits
|
||||||
|
message("32bits compilation is no more available with CUDA7.0")
|
||||||
|
endif(CMAKE_CL_64)
|
||||||
|
SET(ZED_LIBRARY_DIR $ENV{ZED_LIBRARY_DIR})
|
||||||
|
IF(ZED_LIBRARIES AND ZED_INCLUDE_DIRS)
|
||||||
|
SET(ZED_FOUND TRUE)
|
||||||
|
LINK_DIRECTORIES( ${LINK_DIRECTORIES} ${ZED_LIBRARY_DIR})
|
||||||
|
ENDIF(ZED_LIBRARIES AND ZED_INCLUDE_DIRS)
|
||||||
|
ELSE() # Linux
|
||||||
|
find_package(ZED 2 QUIET)
|
||||||
|
ENDIF(WIN32)
|
||||||
|
|
||||||
|
IF(ZED_FOUND)
|
||||||
|
MESSAGE(STATUS "Found ZED sdk: ${ZED_INCLUDE_DIRS}")
|
||||||
|
## look for CUDA
|
||||||
|
find_package(CUDA)
|
||||||
|
IF(CUDA_FOUND)
|
||||||
|
MESSAGE(STATUS "Found CUDA: ${CUDA_INCLUDE_DIRS}")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(FATAL_ERROR "CUDA is required to build with Zed sdk! Set -DWITH_ZED=OFF if you don't have CUDA.")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF(ZED_FOUND)
|
||||||
|
ENDIF(WITH_ZED)
|
||||||
|
|
||||||
|
IF(WITH_REALSENSE)
|
||||||
|
IF(WITH_REALSENSE_SLAM)
|
||||||
|
FIND_PACKAGE(RealSense QUIET COMPONENTS slam)
|
||||||
|
ELSE()
|
||||||
|
FIND_PACKAGE(RealSense QUIET)
|
||||||
|
ENDIF()
|
||||||
|
IF(RealSense_FOUND)
|
||||||
|
MESSAGE(STATUS "Found RealSense: ${RealSense_INCLUDE_DIRS}")
|
||||||
|
ENDIF(RealSense_FOUND)
|
||||||
|
IF(RealSenseSlam_FOUND)
|
||||||
|
MESSAGE(STATUS "Found RealSenseSlam: ${RealSense_INCLUDE_DIRS}")
|
||||||
|
ENDIF(RealSenseSlam_FOUND)
|
||||||
|
ENDIF(WITH_REALSENSE)
|
||||||
|
|
||||||
|
IF(WITH_OCTOMAP)
|
||||||
|
FIND_PACKAGE(OCTOMAP QUIET)
|
||||||
|
IF(OCTOMAP_FOUND)
|
||||||
|
MESSAGE(STATUS "Found octomap ${OCTOMAP_VERSION}: ${OCTOMAP_INCLUDE_DIRS}")
|
||||||
|
IF(OCTOMAP_VERSION VERSION_LESS 1.8)
|
||||||
|
ADD_DEFINITIONS("-DOCTOMAP_PRE_18")
|
||||||
|
ENDIF(OCTOMAP_VERSION VERSION_LESS 1.8)
|
||||||
|
ENDIF(OCTOMAP_FOUND)
|
||||||
|
ENDIF(WITH_OCTOMAP)
|
||||||
|
|
||||||
|
IF(WITH_CPUTSDF)
|
||||||
|
FIND_PACKAGE(CPUTSDF QUIET)
|
||||||
|
IF(CPUTSDF_FOUND)
|
||||||
|
MESSAGE(STATUS "Found CPUTSDF: ${CPUTSDF_INCLUDE_DIRS}")
|
||||||
|
ENDIF(CPUTSDF_FOUND)
|
||||||
|
ENDIF(WITH_CPUTSDF)
|
||||||
|
|
||||||
|
IF(WITH_OPENCHISEL)
|
||||||
|
find_package(open_chisel QUIET)
|
||||||
|
if(open_chisel_FOUND)
|
||||||
|
MESSAGE(STATUS "Found open_chisel: ${open_chisel_INCLUDE_DIRS}")
|
||||||
|
endif(open_chisel_FOUND)
|
||||||
|
ENDIF(WITH_OPENCHISEL)
|
||||||
|
|
||||||
|
IF(WITH_FOVIS)
|
||||||
|
FIND_PACKAGE(libfovis QUIET)
|
||||||
|
IF(libfovis_FOUND)
|
||||||
|
MESSAGE(STATUS "Found libfovis: ${libfovis_INCLUDE_DIRS}")
|
||||||
|
ENDIF(libfovis_FOUND)
|
||||||
|
ENDIF(WITH_FOVIS)
|
||||||
|
|
||||||
|
IF(WITH_VISO2)
|
||||||
|
FIND_PACKAGE(libviso2 QUIET)
|
||||||
|
IF(libviso2_FOUND)
|
||||||
|
MESSAGE(STATUS "Found libviso2: ${libviso2_INCLUDE_DIRS}")
|
||||||
|
ENDIF(libviso2_FOUND)
|
||||||
|
ENDIF(WITH_VISO2)
|
||||||
|
|
||||||
|
IF(WITH_DVO)
|
||||||
|
FIND_PACKAGE(dvo_core QUIET)
|
||||||
|
IF(dvo_core_FOUND)
|
||||||
|
MESSAGE(STATUS "Found dvo_core: ${dvo_core_INCLUDE_DIRS}")
|
||||||
|
ENDIF(dvo_core_FOUND)
|
||||||
|
ENDIF(WITH_DVO)
|
||||||
|
|
||||||
|
IF(WITH_OKVIS)
|
||||||
|
FIND_PACKAGE(okvis 1.1 QUIET)
|
||||||
|
IF(okvis_FOUND)
|
||||||
|
MESSAGE(STATUS "Found okvis: ${OKVIS_INCLUDE_DIRS}")
|
||||||
|
find_package(brisk 2 REQUIRED)
|
||||||
|
MESSAGE(STATUS "Found brisk: ${BRISK_INCLUDE_DIRS}")
|
||||||
|
find_package(opengv REQUIRED)
|
||||||
|
MESSAGE(STATUS "Found opengv: ${OPENGV_INCLUDE_DIRS}")
|
||||||
|
find_package(Ceres REQUIRED CONFIG PATHS ${OKVIS_CERES_CONFIG} NO_DEFAULT_PATH)
|
||||||
|
MESSAGE(STATUS "Found ceres: ${CERES_INCLUDE_DIRS}")
|
||||||
|
ENDIF(okvis_FOUND)
|
||||||
|
ENDIF(WITH_OKVIS)
|
||||||
|
|
||||||
|
IF(WITH_ORB_SLAM2 AND NOT G2O_FOUND)
|
||||||
|
FIND_PACKAGE(ORB_SLAM2 QUIET)
|
||||||
|
IF(ORB_SLAM2_FOUND)
|
||||||
|
MESSAGE(STATUS "Found ORB_SLAM2: ${ORB_SLAM2_INCLUDE_DIRS}")
|
||||||
|
FIND_PACKAGE(Pangolin QUIET)
|
||||||
|
IF(NOT Pangolin_FOUND)
|
||||||
|
SET(ORB_SLAM2_FOUND FALSE)
|
||||||
|
MESSAGE(STATUS "Found ORB_SLAM2 but not Pangolin, disabling ORB_SLAM2.")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS "Found Pangolin: ${Pangolin_INCLUDE_DIRS}")
|
||||||
|
SET(ORB_SLAM2_INCLUDE_DIRS ${ORB_SLAM2_INCLUDE_DIRS} ${Pangolin_INCLUDE_DIRS})
|
||||||
|
SET(ORB_SLAM2_LIBRARIES ${ORB_SLAM2_LIBRARIES} ${Pangolin_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
ENDIF(ORB_SLAM2_FOUND)
|
||||||
|
ENDIF(WITH_ORB_SLAM2 AND NOT G2O_FOUND)
|
||||||
|
|
||||||
|
IF(G2O_FOUND OR GTSAM_FOUND OR ZED_FOUND OR ANDROID OR RealSense_FOUND OR ORB_SLAM2_FOUND OR okvis_FOUND OR open_chisel_FOUND)
|
||||||
|
#Newest versions require std11
|
||||||
|
IF(NOT MSVC)
|
||||||
|
include(CheckCXXCompilerFlag)
|
||||||
|
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
|
||||||
|
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
|
||||||
|
IF(COMPILER_SUPPORTS_CXX11)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
|
ELSEIF(COMPILER_SUPPORTS_CXX0X)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||||
|
ELSE()
|
||||||
|
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler if you want to use g2o or gtsam (set \"-DWITH_G2O=OFF -DWITH_GTSAM=OFF\" to build without g2o and gtsam).")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
ENDIF(G2O_FOUND OR GTSAM_FOUND OR ZED_FOUND OR ANDROID OR RealSense_FOUND OR ORB_SLAM2_FOUND OR okvis_FOUND OR open_chisel_FOUND)
|
||||||
|
|
||||||
####### OSX BUNDLE CMAKE_INSTALL_PREFIX #######
|
####### OSX BUNDLE CMAKE_INSTALL_PREFIX #######
|
||||||
IF(APPLE AND BUILD_AS_BUNDLE)
|
IF(APPLE AND BUILD_AS_BUNDLE)
|
||||||
IF(Qt5_FOUND OR (QT4_FOUND AND QT_QTCORE_FOUND AND QT_QTGUI_FOUND))
|
IF(Qt5_FOUND OR (QT4_FOUND AND QT_QTCORE_FOUND AND QT_QTGUI_FOUND))
|
||||||
@@ -287,15 +490,27 @@ ENDIF(APPLE AND BUILD_AS_BUNDLE)
|
|||||||
|
|
||||||
|
|
||||||
####### SOURCES (Projects) #######
|
####### SOURCES (Projects) #######
|
||||||
|
|
||||||
|
# CONF_DEPENDENCIES contains only dependencies not required by the headers
|
||||||
|
SET(CONF_DEPENDENCIES
|
||||||
|
${ZLIB_LIBRARIES}
|
||||||
|
)
|
||||||
IF(NOT (OPENCV_NONFREE_FOUND OR OPENCV_XFEATURES2D_FOUND))
|
IF(NOT (OPENCV_NONFREE_FOUND OR OPENCV_XFEATURES2D_FOUND))
|
||||||
SET(NONFREE "//")
|
SET(NONFREE "//")
|
||||||
ENDIF(NOT (OPENCV_NONFREE_FOUND OR OPENCV_XFEATURES2D_FOUND))
|
ENDIF(NOT (OPENCV_NONFREE_FOUND OR OPENCV_XFEATURES2D_FOUND))
|
||||||
IF(NOT G2O_FOUND)
|
IF(NOT G2O_FOUND)
|
||||||
SET(G2O "//")
|
SET(G2O "//")
|
||||||
ENDIF(NOT G2O_FOUND)
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${G2O_LIBRARIES})
|
||||||
|
IF(NOT G2O_CPP11)
|
||||||
|
SET(G2O_CPP_CONF "//")
|
||||||
|
ENDIF(NOT G2O_CPP11)
|
||||||
|
ENDIF()
|
||||||
IF(NOT GTSAM_FOUND)
|
IF(NOT GTSAM_FOUND)
|
||||||
SET(GTSAM "//")
|
SET(GTSAM "//")
|
||||||
ENDIF(NOT GTSAM_FOUND)
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${GTSAM_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
IF(NOT WITH_TORO)
|
IF(NOT WITH_TORO)
|
||||||
SET(TORO "//")
|
SET(TORO "//")
|
||||||
ENDIF(NOT WITH_TORO)
|
ENDIF(NOT WITH_TORO)
|
||||||
@@ -304,22 +519,105 @@ IF(NOT WITH_VERTIGO)
|
|||||||
ENDIF(NOT WITH_VERTIGO)
|
ENDIF(NOT WITH_VERTIGO)
|
||||||
IF(NOT cvsba_FOUND)
|
IF(NOT cvsba_FOUND)
|
||||||
SET(CVSBA "//")
|
SET(CVSBA "//")
|
||||||
ENDIF(NOT cvsba_FOUND)
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${cvsba_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT libpointmatcher_FOUND)
|
||||||
|
SET(POINTMATCHER "//")
|
||||||
|
ENDIF(NOT libpointmatcher_FOUND)
|
||||||
IF(NOT Freenect_FOUND)
|
IF(NOT Freenect_FOUND)
|
||||||
SET(FREENECT "//")
|
SET(FREENECT "//")
|
||||||
ENDIF(NOT Freenect_FOUND)
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${Freenect_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
IF(NOT freenect2_FOUND)
|
IF(NOT freenect2_FOUND)
|
||||||
SET(FREENECT2 "//")
|
SET(FREENECT2 "//")
|
||||||
ENDIF(NOT freenect2_FOUND)
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${freenect2_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT KinectSDK2_FOUND)
|
||||||
|
SET(K4W2 "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${KinectSDK2_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
IF(NOT OpenNI2_FOUND)
|
IF(NOT OpenNI2_FOUND)
|
||||||
SET(OPENNI2 "//")
|
SET(OPENNI2 "//")
|
||||||
ENDIF(NOT OpenNI2_FOUND)
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${OpenNI2_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
IF(NOT DC1394_FOUND)
|
IF(NOT DC1394_FOUND)
|
||||||
SET(DC1394 "//")
|
SET(DC1394 "//")
|
||||||
ENDIF(NOT DC1394_FOUND)
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${DC1394_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
IF(NOT FlyCapture2_FOUND)
|
IF(NOT FlyCapture2_FOUND)
|
||||||
SET(FLYCAPTURE2 "//")
|
SET(FLYCAPTURE2 "//")
|
||||||
ENDIF(NOT FlyCapture2_FOUND)
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${FlyCapture2_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT ZED_FOUND)
|
||||||
|
SET(ZED "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${ZED_LIBRARIES} ${CUDA_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT RealSense_FOUND)
|
||||||
|
SET(REALSENSE "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${RealSense_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT RealSenseSlam_FOUND)
|
||||||
|
SET(REALSENSESLAM "//")
|
||||||
|
ENDIF(NOT RealSenseSlam_FOUND)
|
||||||
|
IF(NOT OCTOMAP_FOUND)
|
||||||
|
SET(OCTOMAP "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${OCTOMAP_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT CPUTSDF_FOUND)
|
||||||
|
SET(CPUTSDF "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${CPUTSDF_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT open_chisel_FOUND)
|
||||||
|
SET(OPENCHISEL "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${open_chisel_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT libfovis_FOUND)
|
||||||
|
SET(FOVIS "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${libfovis_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT libviso2_FOUND)
|
||||||
|
SET(VISO2 "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${libviso2_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT dvo_core_FOUND)
|
||||||
|
SET(DVO "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${dvo_core_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT okvis_FOUND)
|
||||||
|
SET(OKVIS "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${OKVIS_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT ORB_SLAM2_FOUND)
|
||||||
|
SET(ORB_SLAM2 "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${ORB_SLAM2_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(ADD_VTK_GUI_SUPPORT_QT_TO_CONF)
|
||||||
|
SET(CONF_VTK_QT true)
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} vtkGUISupportQt)
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_VTK_QT false)
|
||||||
|
ENDIF()
|
||||||
|
IF(VTK_USE_QVTK)
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${QVTK_LIBRARY})
|
||||||
|
ENDIF(VTK_USE_QVTK)
|
||||||
|
|
||||||
IF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
|
IF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
|
||||||
SET(OPENCV3 "//")
|
SET(OPENCV3 "//")
|
||||||
ENDIF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
|
ENDIF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
|
||||||
@@ -368,11 +666,16 @@ file(RELATIVE_PATH REL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/${INSTALL_CMAKE_DIR}" "$
|
|||||||
|
|
||||||
# ... for the build tree
|
# ... for the build tree
|
||||||
set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/corelib/include"
|
set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/corelib/include"
|
||||||
"${PROJECT_SOURCE_DIR}/guilib/include"
|
"${PROJECT_SOURCE_DIR}/guilib/include"
|
||||||
"${PROJECT_SOURCE_DIR}/utilite/include")
|
"${PROJECT_SOURCE_DIR}/utilite/include")
|
||||||
set(CONF_LIB_DIR "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
|
set(CONF_LIB_DIR "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
|
||||||
IF(QT4_FOUND OR Qt5_FOUND)
|
IF(QT4_FOUND OR Qt5_FOUND)
|
||||||
set(CONF_WITH_GUI ON)
|
set(CONF_WITH_GUI ON)
|
||||||
|
IF(QT4_FOUND)
|
||||||
|
set(CONF_QT_VERSION 4)
|
||||||
|
ELSE()
|
||||||
|
set(CONF_QT_VERSION 5)
|
||||||
|
ENDIF()
|
||||||
ELSE()
|
ELSE()
|
||||||
set(CONF_WITH_GUI OFF)
|
set(CONF_WITH_GUI OFF)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
@@ -489,13 +792,14 @@ MESSAGE(STATUS " BUILD_APP = ${BUILD_APP}")
|
|||||||
MESSAGE(STATUS " BUILD_TOOLS = ${BUILD_TOOLS}")
|
MESSAGE(STATUS " BUILD_TOOLS = ${BUILD_TOOLS}")
|
||||||
MESSAGE(STATUS " BUILD_EXAMPLES = ${BUILD_EXAMPLES}")
|
MESSAGE(STATUS " BUILD_EXAMPLES = ${BUILD_EXAMPLES}")
|
||||||
IF(NOT WIN32)
|
IF(NOT WIN32)
|
||||||
# see comment above for the BUILD_SHARED_LIBS option on Windows
|
# see comment above for the BUILD_SHARED_LIBS option on Windows
|
||||||
MESSAGE(STATUS " BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}")
|
MESSAGE(STATUS " BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}")
|
||||||
ENDIF(NOT WIN32)
|
ENDIF(NOT WIN32)
|
||||||
IF(APPLE)
|
IF(APPLE)
|
||||||
MESSAGE(STATUS " BUILD_AS_BUNDLE = ${BUILD_AS_BUNDLE}")
|
MESSAGE(STATUS " BUILD_AS_BUNDLE = ${BUILD_AS_BUNDLE}")
|
||||||
ENDIF(APPLE)
|
ENDIF(APPLE)
|
||||||
MESSAGE(STATUS " CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
|
MESSAGE(STATUS " CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
|
||||||
|
MESSAGE(STATUS " PCL_DEFINITIONS = ${PCL_DEFINITIONS}")
|
||||||
|
|
||||||
IF(OpenCV_FOUND)
|
IF(OpenCV_FOUND)
|
||||||
IF(OpenCV_VERSION_MAJOR EQUAL 2)
|
IF(OpenCV_VERSION_MAJOR EQUAL 2)
|
||||||
@@ -537,6 +841,14 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With Freenect2 = NO (libfreenect2 not found)")
|
MESSAGE(STATUS " With Freenect2 = NO (libfreenect2 not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(KinectSDK2_FOUND)
|
||||||
|
MESSAGE(STATUS " With Kinect for Windows 2 = YES (License: Apache v2 and/or GPLv2)")
|
||||||
|
ELSEIF(NOT WITH_K4W2)
|
||||||
|
MESSAGE(STATUS " With Kinect for Windows 2 = NO (WITH_K4W2=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With Kinect for Windows 2 = NO (Kinect for Windows 2 SDK not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(DC1394_FOUND)
|
IF(DC1394_FOUND)
|
||||||
MESSAGE(STATUS " With dc1394 = YES (License: LGPL)")
|
MESSAGE(STATUS " With dc1394 = YES (License: LGPL)")
|
||||||
ELSEIF(NOT WITH_DC1394)
|
ELSEIF(NOT WITH_DC1394)
|
||||||
@@ -575,11 +887,15 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With GTSAM = NO (GTSAM not found)")
|
MESSAGE(STATUS " With GTSAM = NO (GTSAM not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(G2O_FOUND OR GTSAM_FOUND)
|
||||||
IF(WITH_VERTIGO)
|
IF(WITH_VERTIGO)
|
||||||
MESSAGE(STATUS " With VERTIGO = YES (License: GPLv3)")
|
MESSAGE(STATUS " With VERTIGO = YES (License: GPLv3)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With VERTIGO = NO (WITH_VERTIGO=OFF)")
|
MESSAGE(STATUS " With VERTIGO = NO (WITH_VERTIGO=OFF)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With VERTIGO = NO (GTSAM or g2o required)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(cvsba_FOUND)
|
IF(cvsba_FOUND)
|
||||||
MESSAGE(STATUS " With cvsba = YES (License: GPLv2)")
|
MESSAGE(STATUS " With cvsba = YES (License: GPLv2)")
|
||||||
@@ -589,6 +905,107 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With cvsba = NO (cvsba not found)")
|
MESSAGE(STATUS " With cvsba = NO (cvsba not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(libpointmatcher_FOUND)
|
||||||
|
MESSAGE(STATUS " With libpointmatcher = YES (License: BSD)")
|
||||||
|
ELSEIF(NOT WITH_POINTMATCHER)
|
||||||
|
MESSAGE(STATUS " With libpointmatcher = NO (WITH_POINTMATCHER=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With libpointmatcher = NO (libpointmatcher not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(ZED_FOUND)
|
||||||
|
IF(CUDA_FOUND)
|
||||||
|
MESSAGE(STATUS " With ZED = YES (With CUDA)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With ZED = YES (Without CUDA)")
|
||||||
|
ENDIF()
|
||||||
|
ELSEIF(NOT WITH_ZED)
|
||||||
|
MESSAGE(STATUS " With ZED = NO (WITH_ZED=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With ZED = NO (ZED sdk not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(RealSense_FOUND)
|
||||||
|
MESSAGE(STATUS " With RealSense = YES (License: Apache-2)")
|
||||||
|
IF(RealSenseSlam_FOUND)
|
||||||
|
MESSAGE(STATUS " With RealSenseSlam = YES")
|
||||||
|
ELSEIF(NOT WITH_REALSENSE)
|
||||||
|
MESSAGE(STATUS " With RealSenseSlam = NO (librealsense_slam not found)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With RealSenseSlam = NO (WITH_REALSENSE_SLAM=OFF)")
|
||||||
|
ENDIF()
|
||||||
|
ELSEIF(NOT WITH_REALSENSE)
|
||||||
|
MESSAGE(STATUS " With RealSense = NO (WITH_REALSENSE=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With RealSense = NO (librealsense not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(OCTOMAP_FOUND)
|
||||||
|
MESSAGE(STATUS " With OCTOMAP = YES (License: BSD)")
|
||||||
|
ELSEIF(NOT WITH_OCTOMAP)
|
||||||
|
MESSAGE(STATUS " With OCTOMAP = NO (WITH_OCTOMAP=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With OCTOMAP = NO (octomap not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(CPUTSDF_FOUND)
|
||||||
|
MESSAGE(STATUS " With CPUTSDF = YES (License: BSD)")
|
||||||
|
ELSEIF(NOT WITH_CPUTSDF)
|
||||||
|
MESSAGE(STATUS " With CPUTSDF = NO (WITH_CPUTSDF=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With CPUTSDF = NO (CPUTSDF not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(open_chisel_FOUND)
|
||||||
|
MESSAGE(STATUS " With OpenChisel = YES (License: ???)")
|
||||||
|
ELSEIF(NOT WITH_OPENCHISEL)
|
||||||
|
MESSAGE(STATUS " With OpenChisel = NO (WITH_OPENCHISEL=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With OpenChisel = NO (open_chisel not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(libfovis_FOUND)
|
||||||
|
MESSAGE(STATUS " With libfovis = YES (License: GPLv2)")
|
||||||
|
ELSEIF(NOT WITH_FOVIS)
|
||||||
|
MESSAGE(STATUS " With libfovis = NO (WITH_FOVIS=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With libfovis = NO (libfovis not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(libviso2_FOUND)
|
||||||
|
MESSAGE(STATUS " With libviso2 = YES (License: GPLv3)")
|
||||||
|
ELSEIF(NOT WITH_VISO2)
|
||||||
|
MESSAGE(STATUS " With libviso2 = NO (WITH_VISO2=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With libviso2 = NO (libviso2 not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(dvo_core_FOUND)
|
||||||
|
MESSAGE(STATUS " With dvo_core = YES (License: GPLv3)")
|
||||||
|
ELSEIF(NOT WITH_DVO)
|
||||||
|
MESSAGE(STATUS " With dvo_core = NO (WITH_DVO=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With dvo_core = NO (dvo_core not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(okvis_FOUND)
|
||||||
|
MESSAGE(STATUS " With okvis = YES (License: BSD)")
|
||||||
|
ELSEIF(NOT WITH_DVO)
|
||||||
|
MESSAGE(STATUS " With okvis = NO (WITH_OKVIS=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With okvis = NO (okvis not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(ORB_SLAM2_FOUND)
|
||||||
|
MESSAGE(STATUS " With ORB_SLAM2 = YES (License: GPLv3)")
|
||||||
|
ELSEIF(NOT WITH_ORB_SLAM2)
|
||||||
|
MESSAGE(STATUS " With ORB_SLAM2 = NO (WITH_ORB_SLAM2=OFF)")
|
||||||
|
ELSEIF(G2O_FOUND)
|
||||||
|
MESSAGE(STATUS " With ORB_SLAM2 = NO (WITH_G2O should be OFF as ORB_SLAM2 uses its own g2o version)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With ORB_SLAM2 = NO (ORB_SLAM2 not found, make sure environment variable ORB_SLAM2_ROOT_DIR is set)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(QT4_FOUND)
|
IF(QT4_FOUND)
|
||||||
MESSAGE(STATUS " With Qt4 = YES (License: Open Source or Commercial)")
|
MESSAGE(STATUS " With Qt4 = YES (License: Open Source or Commercial)")
|
||||||
ELSEIF(Qt5_FOUND)
|
ELSEIF(Qt5_FOUND)
|
||||||
@@ -607,3 +1024,5 @@ MESSAGE(SEND_ERROR "No graph optimizer found! You should have at least one of th
|
|||||||
GTSAM (https://collab.cc.gatech.edu/borg/gtsam)
|
GTSAM (https://collab.cc.gatech.edu/borg/gtsam)
|
||||||
set -DWITH_TORO=ON")
|
set -DWITH_TORO=ON")
|
||||||
ENDIF(NOT GTSAM_FOUND AND NOT G2O_FOUND AND NOT WITH_TORO)
|
ENDIF(NOT GTSAM_FOUND AND NOT G2O_FOUND AND NOT WITH_TORO)
|
||||||
|
|
||||||
|
# vim: set et ft=cmake fenc=utf-8 ff=unix sts=0 sw=2 ts=2 :
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2010-2015, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
|
|||||||
@@ -106,14 +106,14 @@ else
|
|||||||
end
|
end
|
||||||
ylabel('Time (s)')
|
ylabel('Time (s)')
|
||||||
xlabel('Node indexes')
|
xlabel('Node indexes')
|
||||||
meanTime = mean(LogF(:,1))*1000
|
meanTimeMS = mean(LogF(:,1))*1000
|
||||||
plot([1 length(LogF(:,1))], [0.7 0.7], 'r')
|
plot([1 length(LogF(:,1))], [0.7 0.7], 'r')
|
||||||
plot([1 length(LogF(:,1))], [1 1], 'k')
|
plot([1 length(LogF(:,1))], [1 1], 'k')
|
||||||
%plot([1 length(LogF(:,1))], [350 350], 'r')
|
%plot([1 length(LogF(:,1))], [350 350], 'r')
|
||||||
%legend('Processing time', 'Time limit')%, 'Acquisition rate (1 Hz)')
|
%legend('Processing time', 'Time limit')%, 'Acquisition rate (1 Hz)')
|
||||||
%title('Processing time')
|
%title('Processing time')
|
||||||
|
|
||||||
maxTime = max(sum(LogF(:,2:7),2)+LogF(:,17))
|
maxTimeMS = max(sum(LogF(:,2:7),2)+LogF(:,17))*1000
|
||||||
maxDict = max(LogI(:, 6))
|
maxDict = max(LogI(:, 6))
|
||||||
maxWM = max(LogI(:,7))
|
maxWM = max(LogI(:,7))
|
||||||
%%
|
%%
|
||||||
|
|||||||
16
README.md
16
README.md
@@ -1,10 +1,20 @@
|
|||||||
rtabmap [](https://travis-ci.org/introlab/rtabmap)
|
rtabmap 
|
||||||
=======
|
=======
|
||||||
|
|
||||||
|
[](http://introlab.github.io/rtabmap)
|
||||||
|
|
||||||
|
[![Release][release-image]][releases]
|
||||||
|
[![License][license-image]][license]
|
||||||
|
Linux: [](https://travis-ci.org/introlab/rtabmap) Windows: [](https://ci.appveyor.com/project/matlabbe/rtabmap/branch/master)
|
||||||
|
|
||||||
|
[release-image]: https://img.shields.io/badge/release-0.16.3-green.svg?style=flat
|
||||||
|
[releases]: https://github.com/introlab/rtabmap/releases
|
||||||
|
|
||||||
|
[license-image]: https://img.shields.io/badge/license-BSD-green.svg?style=flat
|
||||||
|
[license]: https://github.com/introlab/rtabmap/blob/master/LICENSE
|
||||||
|
|
||||||
RTAB-Map library and standalone application.
|
RTAB-Map library and standalone application.
|
||||||
|
|
||||||
For more information, visit the [RTAB-Map's home page](http://introlab.github.io/rtabmap) or the [RTAB-Map's wiki](https://github.com/introlab/rtabmap/wiki).
|
For more information, visit the [RTAB-Map's home page](http://introlab.github.io/rtabmap) or the [RTAB-Map's wiki](https://github.com/introlab/rtabmap/wiki).
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
# - Config file for the RTABMap package
|
# - Config file for the RTABMap package
|
||||||
|
# Components:
|
||||||
|
# core (required)
|
||||||
|
# gui (optional)
|
||||||
|
# utilite (required)
|
||||||
# It defines the following variables
|
# It defines the following variables
|
||||||
# RTABMap_INCLUDE_DIRS - include directories for RTABMap
|
# RTABMap_INCLUDE_DIRS - include directories for RTABMap
|
||||||
# RTABMap_LIBRARIES - libraries to link against
|
# RTABMap_LIBRARIES - libraries to link against
|
||||||
@@ -42,8 +46,18 @@ ENDIF()
|
|||||||
|
|
||||||
set(RTABMap_LIBRARIES ${RTABMap_CORE} ${RTABMap_UTILITE})
|
set(RTABMap_LIBRARIES ${RTABMap_CORE} ${RTABMap_UTILITE})
|
||||||
|
|
||||||
|
list(LENGTH RTABMap_FIND_COMPONENTS RTABMap_FIND_COMPONENTS_LENGTH)
|
||||||
|
set(WITH_GUI ON)
|
||||||
|
if(${RTABMap_FIND_COMPONENTS_LENGTH} GREATER 0)
|
||||||
|
list (FIND RTABMap_FIND_COMPONENTS "gui" _index)
|
||||||
|
if (${_index} EQUAL -1)
|
||||||
|
set(WITH_GUI OFF)
|
||||||
|
endif()
|
||||||
|
endif(${RTABMap_FIND_COMPONENTS_LENGTH} GREATER 0)
|
||||||
|
|
||||||
|
|
||||||
#gui lib (OFF if RTAB-Map is not built with Qt)
|
#gui lib (OFF if RTAB-Map is not built with Qt)
|
||||||
if(@CONF_WITH_GUI@)
|
if(@CONF_WITH_GUI@ AND ${WITH_GUI})
|
||||||
find_library(RTABMap_GUI_RELEASE NAMES rtabmap_gui NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
|
find_library(RTABMap_GUI_RELEASE NAMES rtabmap_gui NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
|
||||||
find_library(RTABMap_GUI_DEBUG NAMES rtabmap_guid NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
|
find_library(RTABMap_GUI_DEBUG NAMES rtabmap_guid NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
|
||||||
|
|
||||||
@@ -59,11 +73,24 @@ if(@CONF_WITH_GUI@)
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
set(RTABMap_LIBRARIES ${RTABMap_LIBRARIES} ${RTABMap_GUI})
|
set(RTABMap_LIBRARIES ${RTABMap_LIBRARIES} ${RTABMap_GUI})
|
||||||
endif(@CONF_WITH_GUI@)
|
elseif(${WITH_GUI})
|
||||||
|
MESSAGE(ERROR "Asked for \"gui\" module but RTABMap hasn't been built with gui support.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
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})
|
||||||
|
SET(RTABMap_LIBRARIES ${RTABMap_LIBRARIES} "@CONF_DEPENDENCIES@")
|
||||||
|
|
||||||
#backward compatibilities
|
#backward compatibilities
|
||||||
set(RTABMAP_CORE ${RTABMap_CORE})
|
set(RTABMAP_CORE ${RTABMap_CORE})
|
||||||
set(RTABMAP_UTILITE ${RTABMap_UTILITE})
|
set(RTABMAP_UTILITE ${RTABMap_UTILITE})
|
||||||
if(RTABMap_GUI)
|
if(RTABMap_GUI)
|
||||||
set(RTABMAP_GUI ${RTABMap_GUI})
|
set(RTABMAP_GUI ${RTABMap_GUI})
|
||||||
endif(RTABMap_GUI)
|
set(RTABMAP_QT_VERSION @CONF_QT_VERSION@)
|
||||||
|
endif(RTABMap_GUI)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(RTABMap DEFAULT_MSG RTABMap_LIBRARIES RTABMap_INCLUDE_DIRS)
|
||||||
|
mark_as_advanced(RTABMap_LIBRARIES RTABMap_INCLUDE_DIRS RTABMap_LIBRARY_DIRS)
|
||||||
14
Version.h.in
14
Version.h.in
@@ -40,15 +40,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
@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
|
||||||
@GTSAM@#define RTABMAP_GTSAM
|
@GTSAM@#define RTABMAP_GTSAM
|
||||||
@VERTIGO@#define RTABMAP_VERTIGO
|
@VERTIGO@#define RTABMAP_VERTIGO
|
||||||
@OPENCV3@#define RTABMAP_OPENCV3
|
@OPENCV3@#define RTABMAP_OPENCV3
|
||||||
@OPENNI2@#define RTABMAP_OPENNI2
|
@OPENNI2@#define RTABMAP_OPENNI2
|
||||||
@FREENECT@#define RTABMAP_FREENECT
|
@FREENECT@#define RTABMAP_FREENECT
|
||||||
@FREENECT2@#define RTABMAP_FREENECT2
|
@FREENECT2@#define RTABMAP_FREENECT2
|
||||||
|
@K4W2@#define RTABMAP_K4W2
|
||||||
@CVSBA@#define RTABMAP_CVSBA
|
@CVSBA@#define RTABMAP_CVSBA
|
||||||
|
@POINTMATCHER@#define RTABMAP_POINTMATCHER
|
||||||
@DC1394@#define RTABMAP_DC1394
|
@DC1394@#define RTABMAP_DC1394
|
||||||
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
||||||
|
@ZED@#define RTABMAP_ZED
|
||||||
|
@REALSENSE@#define RTABMAP_REALSENSE
|
||||||
|
@REALSENSESLAM@#define RTABMAP_REALSENSE_SLAM
|
||||||
|
@OCTOMAP@#define RTABMAP_OCTOMAP
|
||||||
|
@CPUTSDF@#define RTABMAP_CPUTSDF
|
||||||
|
@OPENCHISEL@#define RTABMAP_OPENCHISEL
|
||||||
|
@FOVIS@#define RTABMAP_FOVIS
|
||||||
|
@VISO2@#define RTABMAP_VISO2
|
||||||
|
@DVO@#define RTABMAP_DVO
|
||||||
|
@OKVIS@#define RTABMAP_OKVIS
|
||||||
|
@ORB_SLAM2@#define RTABMAP_ORB_SLAM2
|
||||||
|
|
||||||
#endif /* VERSION_H_ */
|
#endif /* VERSION_H_ */
|
||||||
|
|
||||||
|
|||||||
BIN
app/.DS_Store
vendored
BIN
app/.DS_Store
vendored
Binary file not shown.
1
app/android/.gitignore
vendored
Normal file
1
app/android/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/bin/
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
<!-- BEGIN_INCLUDE(manifest) -->
|
<!-- BEGIN_INCLUDE(manifest) -->
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.introlab.rtabmap"
|
package="com.introlab.rtabmap"
|
||||||
android:versionCode="8"
|
android:versionCode="70"
|
||||||
android:versionName="@RTABMAP_VERSION@">
|
android:versionName="@RTABMAP_VERSION@">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
@@ -10,23 +10,31 @@
|
|||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
|
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />
|
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
<uses-feature android:name="android.hardware.location.gps" />
|
||||||
<uses-feature android:glEsVersion="0x00020000" />
|
<uses-feature android:glEsVersion="0x00020000" />
|
||||||
<uses-library android:name="com.projecttango.libtango_device" android:required="true" />
|
|
||||||
|
|
||||||
<!-- This is the platform API where NativeActivity was introduced. -->
|
<!-- This is the platform API where NativeActivity was introduced. -->
|
||||||
<uses-sdk android:minSdkVersion="17" />
|
<uses-sdk android:minSdkVersion="19" />
|
||||||
|
|
||||||
<!-- This .apk has no Java code itself, so set hasCode to false. -->
|
<!-- This .apk has no Java code itself, so set hasCode to false. -->
|
||||||
<application
|
<application
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:icon="@drawable/ic_launcher">
|
android:icon="@drawable/ic_launcher"
|
||||||
|
android:debuggable="@ANDROID_DEBUGGABLE@">
|
||||||
|
|
||||||
|
<uses-library android:name="com.projecttango.libtango_device2" android:required="true" />
|
||||||
|
|
||||||
<!-- Our activity is the built-in NativeActivity framework class.
|
<!-- Our activity is the built-in NativeActivity framework class.
|
||||||
This will take care of integrating with our NDK code. -->
|
This will take care of integrating with our NDK code. -->
|
||||||
<activity android:name="RTABMapActivity"
|
<activity android:name="RTABMapActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:screenOrientation="nosensor">
|
android:screenOrientation="fullSensor"
|
||||||
|
android:configChanges="orientation|screenSize|keyboardHidden"
|
||||||
|
android:theme="@style/ThemeApp">
|
||||||
<!-- Tell NativeActivity the name of our .so -->
|
<!-- Tell NativeActivity the name of our .so -->
|
||||||
<meta-data android:name="android.app.lib_name"
|
<meta-data android:name="android.app.lib_name"
|
||||||
android:value="NativeRTABMap" />
|
android:value="NativeRTABMap" />
|
||||||
@@ -35,6 +43,9 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity android:name="SettingsActivity" android:label="@string/settings" android:screenOrientation="fullSensor"/>
|
||||||
|
<activity android:name="SketchfabActivity" android:label="@string/sketchfab" android:screenOrientation="fullSensor"/>
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -1,4 +1,17 @@
|
|||||||
|
|
||||||
|
option(DISABLE_LOG "Disable Android logging (should be true in release)" ON)
|
||||||
|
IF(DISABLE_LOG)
|
||||||
|
ADD_DEFINITIONS(-DDISABLE_LOG)
|
||||||
|
ENDIF(DISABLE_LOG)
|
||||||
|
|
||||||
|
MESSAGE(STATUS "DISABLE_LOG = ${DISABLE_LOG}")
|
||||||
|
|
||||||
|
IF(DISABLE_LOG)
|
||||||
|
SET(ANDROID_DEBUGGABLE false)
|
||||||
|
ELSE()
|
||||||
|
SET(ANDROID_DEBUGGABLE true)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
add_subdirectory(jni)
|
add_subdirectory(jni)
|
||||||
|
|
||||||
|
|
||||||
@@ -32,6 +45,11 @@ configure_file(
|
|||||||
"${CMAKE_CURRENT_SOURCE_DIR}/ant.properties.in"
|
"${CMAKE_CURRENT_SOURCE_DIR}/ant.properties.in"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/ant.properties"
|
"${CMAKE_CURRENT_BINARY_DIR}/ant.properties"
|
||||||
@ONLY)
|
@ONLY)
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/custom_rules.xml"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/custom_rules.xml"
|
||||||
|
COPYONLY)
|
||||||
|
|
||||||
add_custom_target(NativeRTABMap-ant-configure ALL
|
add_custom_target(NativeRTABMap-ant-configure ALL
|
||||||
COMMAND "${ANDROID_EXECUTABLE}"
|
COMMAND "${ANDROID_EXECUTABLE}"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
builddir=@CMAKE_CURRENT_BINARY_DIR@
|
builddir=@CMAKE_CURRENT_BINARY_DIR@
|
||||||
srcdir=@CMAKE_CURRENT_SOURCE_DIR@
|
srcdir=@CMAKE_CURRENT_SOURCE_DIR@
|
||||||
|
android.abi=@ANDROID_ABI@
|
||||||
|
|
||||||
source.dir=${srcdir}/src
|
source.dir=${srcdir}/src
|
||||||
gen.dir=${builddir}/gen
|
gen.dir=${builddir}/gen
|
||||||
|
|||||||
13
app/android/custom_rules.xml
Normal file
13
app/android/custom_rules.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<project>
|
||||||
|
<target name="-pre-build">
|
||||||
|
<copy todir="${jar.libs.dir}">
|
||||||
|
<fileset dir="${srcdir}/libs" includes="**/*.jar" excludes="**/*sources.jar, **/*javadoc.jar" />
|
||||||
|
</copy>
|
||||||
|
<copy todir="${native.libs.dir}/${android.abi}">
|
||||||
|
<fileset dir="${srcdir}/jni/third-party/lib" includes="*.so"/>
|
||||||
|
</copy>
|
||||||
|
<copy todir="${native.libs.dir}">
|
||||||
|
<fileset dir="${srcdir}/jni/third-party/lib" includes="${android.abi}/*.so"/>
|
||||||
|
</copy>
|
||||||
|
</target>
|
||||||
|
</project>
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
<h3>Real-Time Appearance-Based Mapping</h3>
|
<h3>Real-Time Appearance-Based Mapping</h3>
|
||||||
Version @RTABMAP_VERSION@<br>
|
Version @RTABMAP_VERSION@<br>
|
||||||
Author: Mathieu Labbé<br>
|
Author: Mathieu Labbé<br>
|
||||||
Copyright 2016<br>
|
Copyright 2016-2017<br>
|
||||||
IntRoLab - Université de Sherbrooke<br>
|
IntRoLab - Université de Sherbrooke<br>
|
||||||
<b>http://introlab.github.io/rtabmap</b><br><br>
|
<b>http://introlab.github.io/rtabmap</b><br><br>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -29,12 +29,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#define CAMERATANGO_H_
|
#define CAMERATANGO_H_
|
||||||
|
|
||||||
#include <rtabmap/core/Camera.h>
|
#include <rtabmap/core/Camera.h>
|
||||||
|
#include <rtabmap/core/GeodeticCoords.h>
|
||||||
#include <rtabmap/utilite/UMutex.h>
|
#include <rtabmap/utilite/UMutex.h>
|
||||||
#include <rtabmap/utilite/USemaphore.h>
|
#include <rtabmap/utilite/USemaphore.h>
|
||||||
#include <rtabmap/utilite/UEventsSender.h>
|
#include <rtabmap/utilite/UEventsSender.h>
|
||||||
#include <rtabmap/utilite/UThread.h>
|
#include <rtabmap/utilite/UThread.h>
|
||||||
#include <rtabmap/utilite/UEvent.h>
|
#include <rtabmap/utilite/UEvent.h>
|
||||||
|
#include <rtabmap/utilite/UTimer.h>
|
||||||
#include <boost/thread/mutex.hpp>
|
#include <boost/thread/mutex.hpp>
|
||||||
|
#include <tango_support_api.h>
|
||||||
|
|
||||||
class TangoPoseData;
|
class TangoPoseData;
|
||||||
|
|
||||||
@@ -69,16 +72,26 @@ private:
|
|||||||
|
|
||||||
class CameraTango : public Camera, public UThread, public UEventsSender {
|
class CameraTango : public Camera, public UThread, public UEventsSender {
|
||||||
public:
|
public:
|
||||||
CameraTango(int decimation, bool autoExposure);
|
static const float bilateralFilteringSigmaS;
|
||||||
|
static const float bilateralFilteringSigmaR;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CameraTango(bool colorCamera, int decimation, bool publishRawScan, bool smoothing);
|
||||||
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 = "");
|
||||||
void close(); // close Tango connection
|
void close(); // close Tango connection
|
||||||
|
void resetOrigin();
|
||||||
virtual bool isCalibrated() const;
|
virtual bool isCalibrated() const;
|
||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
rtabmap::Transform tangoPoseToTransform(const TangoPoseData * tangoPose, bool inOpenGLFrame) const;
|
const CameraModel & getCameraModel() const {return model_;}
|
||||||
|
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 setAutoExposure(bool enabled) {autoExposure_ = enabled;}
|
void setSmoothing(bool enabled) {smoothing_ = enabled;}
|
||||||
|
void setRawScanPublished(bool enabled) {rawScanPublished_ = enabled;}
|
||||||
|
void setScreenRotation(TangoSupportRotation colorCameraToDisplayRotation) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
||||||
|
void setGPS(const GPS & gps);
|
||||||
|
|
||||||
void cloudReceived(const cv::Mat & cloud, double timestamp);
|
void cloudReceived(const cv::Mat & cloud, double timestamp);
|
||||||
void rgbReceived(const cv::Mat & tangoImage, int type, double timestamp);
|
void rgbReceived(const cv::Mat & tangoImage, int type, double timestamp);
|
||||||
@@ -86,19 +99,24 @@ 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();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtabmap::Transform getPoseAtTimestamp(double timestamp, bool inOpenGLFrame);
|
rtabmap::Transform getPoseAtTimestamp(double timestamp);
|
||||||
|
|
||||||
virtual void mainLoopBegin();
|
virtual void mainLoopBegin();
|
||||||
virtual void mainLoop();
|
virtual void mainLoop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void * tango_config_;
|
void * tango_config_;
|
||||||
bool firstFrame_;
|
Transform previousPose_;
|
||||||
|
double previousStamp_;
|
||||||
|
UTimer cameraStartedTime_;
|
||||||
|
double stampEpochOffset_;
|
||||||
|
bool colorCamera_;
|
||||||
int decimation_;
|
int decimation_;
|
||||||
bool autoExposure_;
|
bool rawScanPublished_;
|
||||||
|
bool smoothing_;
|
||||||
cv::Mat cloud_;
|
cv::Mat cloud_;
|
||||||
double cloudStamp_;
|
double cloudStamp_;
|
||||||
cv::Mat tangoColor_;
|
cv::Mat tangoColor_;
|
||||||
@@ -106,10 +124,14 @@ private:
|
|||||||
double tangoColorStamp_;
|
double tangoColorStamp_;
|
||||||
boost::mutex dataMutex_;
|
boost::mutex dataMutex_;
|
||||||
USemaphore dataReady_;
|
USemaphore dataReady_;
|
||||||
rtabmap::Transform imuTDevice_;
|
|
||||||
rtabmap::Transform imuTDepthCamera_;
|
|
||||||
rtabmap::Transform deviceTDepth_;
|
|
||||||
CameraModel model_;
|
CameraModel model_;
|
||||||
|
Transform deviceTColorCamera_;
|
||||||
|
TangoSupportRotation colorCameraToDisplayRotation_;
|
||||||
|
cv::Mat fisheyeRectifyMapX_;
|
||||||
|
cv::Mat fisheyeRectifyMapY_;
|
||||||
|
GPS lastKnownGPS_;
|
||||||
|
Transform originOffset_;
|
||||||
|
bool originUpdate_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
124
app/android/jni/ProgressionStatus.h
Normal file
124
app/android/jni/ProgressionStatus.h
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* ProgressionStatus.h
|
||||||
|
*
|
||||||
|
* Created on: Feb 28, 2017
|
||||||
|
* Author: mathieu
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef APP_ANDROID_JNI_PROGRESSIONSTATUS_H_
|
||||||
|
#define APP_ANDROID_JNI_PROGRESSIONSTATUS_H_
|
||||||
|
|
||||||
|
#include <rtabmap/core/ProgressState.h>
|
||||||
|
#include <rtabmap/utilite/ULogger.h>
|
||||||
|
#include <rtabmap/utilite/UEventsManager.h>
|
||||||
|
#include <jni.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class ProgressEvent : public UEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ProgressEvent(int count = 1) : count_(count){}
|
||||||
|
virtual std::string getClassName() const {return "ProgressEvent";}
|
||||||
|
|
||||||
|
int count_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ProgressionStatus: public ProgressState, public UEventsHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ProgressionStatus() : count_(0), max_(100), jvm_(0), rtabmap_(0)
|
||||||
|
{
|
||||||
|
registerToEventsManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setJavaObjects(JavaVM * jvm, jobject rtabmap)
|
||||||
|
{
|
||||||
|
jvm_ = jvm;
|
||||||
|
rtabmap_ = rtabmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset(int max)
|
||||||
|
{
|
||||||
|
count_=-1;
|
||||||
|
max_ = max;
|
||||||
|
setCanceled(false);
|
||||||
|
|
||||||
|
increment();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setMax(int max)
|
||||||
|
{
|
||||||
|
max_ = max;
|
||||||
|
}
|
||||||
|
int getMax() const {return max_;}
|
||||||
|
|
||||||
|
void increment(int count = 1) const
|
||||||
|
{
|
||||||
|
UEventsManager::post(new ProgressEvent(count));
|
||||||
|
}
|
||||||
|
|
||||||
|
void finish()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool callback(const std::string & msg) const
|
||||||
|
{
|
||||||
|
if(!isCanceled())
|
||||||
|
{
|
||||||
|
increment();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ProgressState::callback(msg);
|
||||||
|
}
|
||||||
|
virtual ~ProgressionStatus(){}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool handleEvent(UEvent * event)
|
||||||
|
{
|
||||||
|
if(event->getClassName().compare("ProgressEvent") == 0)
|
||||||
|
{
|
||||||
|
count_ += ((ProgressEvent*)event)->count_;
|
||||||
|
// Call JAVA callback
|
||||||
|
bool success = false;
|
||||||
|
if(jvm_ && rtabmap_)
|
||||||
|
{
|
||||||
|
JNIEnv *env = 0;
|
||||||
|
jint rs = jvm_->AttachCurrentThread(&env, NULL);
|
||||||
|
if(rs == JNI_OK && env)
|
||||||
|
{
|
||||||
|
jclass clazz = env->GetObjectClass(rtabmap_);
|
||||||
|
if(clazz)
|
||||||
|
{
|
||||||
|
jmethodID methodID = env->GetMethodID(clazz, "updateProgressionCallback", "(II)V" );
|
||||||
|
if(methodID)
|
||||||
|
{
|
||||||
|
env->CallVoidMethod(rtabmap_, methodID,
|
||||||
|
count_,
|
||||||
|
max_);
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jvm_->DetachCurrentThread();
|
||||||
|
}
|
||||||
|
if(!success)
|
||||||
|
{
|
||||||
|
UERROR("Failed to call rtabmap::updateProgressionCallback");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
int count_;
|
||||||
|
int max_;
|
||||||
|
JavaVM *jvm_;
|
||||||
|
jobject rtabmap_;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* APP_ANDROID_JNI_PROGRESSIONSTATUS_H_ */
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -34,14 +34,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <tango_client_api.h> // NOLINT
|
#include <tango_client_api.h> // NOLINT
|
||||||
#include <tango-gl/util.h>
|
#include <tango-gl/util.h>
|
||||||
|
|
||||||
#include <scene.h>
|
#include "scene.h"
|
||||||
#include <CameraTango.h>
|
#include "CameraTango.h"
|
||||||
#include <util.h>
|
#include "util.h"
|
||||||
|
#include "ProgressionStatus.h"
|
||||||
|
|
||||||
#include <rtabmap/core/RtabmapThread.h>
|
#include <rtabmap/core/RtabmapThread.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>
|
||||||
|
|
||||||
// RTABMapApp handles the application lifecycle and resources.
|
// RTABMapApp handles the application lifecycle and resources.
|
||||||
class RTABMapApp : public UEventsHandler {
|
class RTABMapApp : public UEventsHandler {
|
||||||
@@ -50,14 +52,13 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
RTABMapApp();
|
RTABMapApp();
|
||||||
~RTABMapApp();
|
~RTABMapApp();
|
||||||
|
|
||||||
// Initialize the Tango Service, this function starts the communication
|
void onCreate(JNIEnv* env, jobject caller_activity);
|
||||||
// between the application and the Tango Service.
|
|
||||||
// The activity object is used for checking if the API version is outdated.
|
|
||||||
int TangoInitialize(JNIEnv* env, jobject caller_activity);
|
|
||||||
|
|
||||||
void openDatabase(const std::string & databasePath);
|
void setScreenRotation(int displayRotation, int cameraRotation);
|
||||||
|
|
||||||
int onResume();
|
int openDatabase(const std::string & databasePath, bool databaseInMemory, bool optimize, const std::string & databaseSource=std::string());
|
||||||
|
|
||||||
|
bool onTangoServiceConnected(JNIEnv* env, jobject iBinder);
|
||||||
|
|
||||||
// Explicitly reset motion tracking and restart the pipeline.
|
// Explicitly reset motion tracking and restart the pipeline.
|
||||||
// Note that this will cause motion tracking to re-initialize.
|
// Note that this will cause motion tracking to re-initialize.
|
||||||
@@ -113,31 +114,74 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
float x0, float y0, float x1, float y1);
|
float x0, float y0, float x1, float y1);
|
||||||
|
|
||||||
void setPausedMapping(bool paused);
|
void setPausedMapping(bool paused);
|
||||||
|
void setOnlineBlending(bool enabled);
|
||||||
void setMapCloudShown(bool shown);
|
void setMapCloudShown(bool shown);
|
||||||
void setOdomCloudShown(bool shown);
|
void setOdomCloudShown(bool shown);
|
||||||
void setMeshRendering(bool enabled);
|
void setMeshRendering(bool enabled, bool withTexture);
|
||||||
|
void setPointSize(float value);
|
||||||
|
void setFOV(float angle);
|
||||||
|
void setOrthoCropFactor(float value);
|
||||||
|
void setGridRotation(float value);
|
||||||
|
void setLighting(bool enabled);
|
||||||
|
void setBackfaceCulling(bool enabled);
|
||||||
|
void setWireframe(bool enabled);
|
||||||
void setLocalizationMode(bool enabled);
|
void setLocalizationMode(bool enabled);
|
||||||
void setTrajectoryMode(bool enabled);
|
void setTrajectoryMode(bool enabled);
|
||||||
void setGraphOptimization(bool enabled);
|
void setGraphOptimization(bool enabled);
|
||||||
void setNodesFiltering(bool enabled);
|
void setNodesFiltering(bool enabled);
|
||||||
void setGraphVisible(bool visible);
|
void setGraphVisible(bool visible);
|
||||||
void setAutoExposure(bool enabled);
|
void setGridVisible(bool visible);
|
||||||
|
void setRawScanSaved(bool enabled);
|
||||||
|
void setCameraColor(bool enabled);
|
||||||
void setFullResolution(bool enabled);
|
void setFullResolution(bool enabled);
|
||||||
|
void setSmoothing(bool enabled);
|
||||||
|
void setAppendMode(bool enabled);
|
||||||
|
void setDataRecorderMode(bool enabled);
|
||||||
void setMaxCloudDepth(float value);
|
void setMaxCloudDepth(float value);
|
||||||
|
void setMinCloudDepth(float value);
|
||||||
|
void setCloudDensityLevel(int value);
|
||||||
void setMeshAngleTolerance(float value);
|
void setMeshAngleTolerance(float value);
|
||||||
void setMeshTriangleSize(int value);
|
void setMeshTriangleSize(int value);
|
||||||
|
void setClusterRatio(float value);
|
||||||
|
void setMaxGainRadius(float value);
|
||||||
|
void setRenderingTextureDecimation(int value);
|
||||||
|
void setBackgroundColor(float gray);
|
||||||
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 resetMapping();
|
void resetMapping();
|
||||||
void save();
|
void save(const std::string & databasePath);
|
||||||
bool exportMesh(const std::string & filePath);
|
void cancelProcessing();
|
||||||
|
bool exportMesh(
|
||||||
|
float cloudVoxelSize,
|
||||||
|
bool regenerateCloud,
|
||||||
|
bool meshing,
|
||||||
|
int textureSize,
|
||||||
|
int textureCount,
|
||||||
|
int normalK,
|
||||||
|
bool optimized,
|
||||||
|
float optimizedVoxelSize,
|
||||||
|
int optimizedDepth,
|
||||||
|
int optimizedMaxPolygons,
|
||||||
|
float optimizedColorRadius,
|
||||||
|
bool optimizedCleanWhitePolygons,
|
||||||
|
int optimizedMinClusterSize,
|
||||||
|
float optimizedMaxTextureDistance,
|
||||||
|
int optimizedMinTextureClusterSize,
|
||||||
|
bool blockRendering);
|
||||||
|
bool postExportation(bool visualize);
|
||||||
|
bool writeExportedMesh(const std::string & directory, const std::string & name);
|
||||||
int postProcessing(int approach);
|
int postProcessing(int approach);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void handleEvent(UEvent * event);
|
virtual bool handleEvent(UEvent * event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtabmap::ParametersMap getRtabmapParameters();
|
rtabmap::ParametersMap getRtabmapParameters();
|
||||||
|
bool smoothMesh(int id, Mesh & mesh);
|
||||||
|
void gainCompensation(bool full = false);
|
||||||
|
std::vector<pcl::Vertices> filterOrganizedPolygons(const std::vector<pcl::Vertices> & polygons, int cloudSize) const;
|
||||||
|
std::vector<pcl::Vertices> filterPolygons(const std::vector<pcl::Vertices> & polygons, int cloudSize) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtabmap::CameraTango * camera_;
|
rtabmap::CameraTango * camera_;
|
||||||
@@ -150,45 +194,76 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
bool nodesFiltering_;
|
bool nodesFiltering_;
|
||||||
bool localizationMode_;
|
bool localizationMode_;
|
||||||
bool trajectoryMode_;
|
bool trajectoryMode_;
|
||||||
bool autoExposure_;
|
bool rawScanSaved_;
|
||||||
|
bool smoothing_;
|
||||||
|
bool cameraColor_;
|
||||||
bool fullResolution_;
|
bool fullResolution_;
|
||||||
|
bool appendMode_;
|
||||||
float maxCloudDepth_;
|
float maxCloudDepth_;
|
||||||
|
float minCloudDepth_;
|
||||||
|
int cloudDensityLevel_;
|
||||||
int meshTrianglePix_;
|
int meshTrianglePix_;
|
||||||
float meshAngleToleranceDeg_;
|
float meshAngleToleranceDeg_;
|
||||||
|
float clusterRatio_;
|
||||||
|
float maxGainRadius_;
|
||||||
|
int renderingTextureDecimation_;
|
||||||
|
float backgroundColor_;
|
||||||
|
|
||||||
rtabmap::ParametersMap mappingParameters_;
|
rtabmap::ParametersMap mappingParameters_;
|
||||||
|
|
||||||
|
bool paused_;
|
||||||
|
bool dataRecorderMode_;
|
||||||
bool clearSceneOnNextRender_;
|
bool clearSceneOnNextRender_;
|
||||||
|
bool openingDatabase_;
|
||||||
|
bool exporting_;
|
||||||
|
bool postProcessing_;
|
||||||
|
bool filterPolygonsOnNextRender_;
|
||||||
|
int gainCompensationOnNextRender_;
|
||||||
|
bool bilateralFilteringOnNextRender_;
|
||||||
|
bool takeScreenshotOnNextRender_;
|
||||||
|
bool cameraJustInitialized_;
|
||||||
|
int meshDecimation_;
|
||||||
int totalPoints_;
|
int totalPoints_;
|
||||||
int totalPolygons_;
|
int totalPolygons_;
|
||||||
int lastDrawnCloudsCount_;
|
int lastDrawnCloudsCount_;
|
||||||
|
float renderingTime_;
|
||||||
|
double lastPostRenderEventTime_;
|
||||||
|
double lastPoseEventTime_;
|
||||||
|
std::map<std::string, float> bufferedStatsData_;
|
||||||
|
|
||||||
|
bool visualizingMesh_;
|
||||||
|
bool exportedMeshUpdated_;
|
||||||
|
pcl::TextureMesh::Ptr optMesh_;
|
||||||
|
cv::Mat optTexture_;
|
||||||
|
int optRefId_;
|
||||||
|
rtabmap::Transform * optRefPose_; // App crashes when loading native library if not dynamic
|
||||||
|
|
||||||
// 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_;
|
||||||
|
|
||||||
std::list<rtabmap::Statistics> rtabmapEvents_;
|
std::list<rtabmap::RtabmapEvent*> rtabmapEvents_;
|
||||||
|
std::list<rtabmap::RtabmapEvent*> visLocalizationEvents_;
|
||||||
std::list<rtabmap::OdometryEvent> odomEvents_;
|
std::list<rtabmap::OdometryEvent> odomEvents_;
|
||||||
std::list<rtabmap::Transform> poseEvents_;
|
std::list<rtabmap::Transform> poseEvents_;
|
||||||
|
|
||||||
|
rtabmap::Transform mapToOdom_;
|
||||||
|
|
||||||
boost::mutex rtabmapMutex_;
|
boost::mutex rtabmapMutex_;
|
||||||
|
boost::mutex visLocalizationMutex_;
|
||||||
boost::mutex meshesMutex_;
|
boost::mutex meshesMutex_;
|
||||||
boost::mutex odomMutex_;
|
boost::mutex odomMutex_;
|
||||||
boost::mutex poseMutex_;
|
boost::mutex poseMutex_;
|
||||||
|
boost::mutex renderingMutex_;
|
||||||
|
|
||||||
struct Mesh
|
USemaphore screenshotReady_;
|
||||||
{
|
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
|
||||||
std::vector<pcl::Vertices> polygons;
|
|
||||||
rtabmap::Transform pose;
|
|
||||||
cv::Mat texture;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::map<int, Mesh> createdMeshes_;
|
std::map<int, Mesh> createdMeshes_;
|
||||||
std::map<int, rtabmap::Transform> rawPoses_;
|
std::map<int, rtabmap::Transform> rawPoses_;
|
||||||
|
|
||||||
std::pair<rtabmap::RtabmapEventInit::Status, std::string> status_;
|
std::pair<rtabmap::RtabmapEventInit::Status, std::string> status_;
|
||||||
|
|
||||||
|
rtabmap::ProgressionStatus progressionStatus_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TANGO_POINT_CLOUD_POINT_CLOUD_APP_H_
|
#endif // TANGO_POINT_CLOUD_POINT_CLOUD_APP_H_
|
||||||
|
|||||||
131
app/android/jni/bounding_box_drawable.h
Normal file
131
app/android/jni/bounding_box_drawable.h
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2016, 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 BOUNDING_BOX_DRAWABLE_H_
|
||||||
|
#define BOUNDING_BOX_DRAWABLE_H_
|
||||||
|
|
||||||
|
#include "tango-gl/line.h"
|
||||||
|
|
||||||
|
class BoundingBoxDrawable : public tango_gl::Line
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BoundingBoxDrawable() :
|
||||||
|
Line(3.0f, GL_LINES)
|
||||||
|
{
|
||||||
|
vec_vertices_.resize(24);
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateVertices(const pcl::PointXYZ & min, const pcl::PointXYZ & max)
|
||||||
|
{
|
||||||
|
int index = 0;
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = min.z;
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
vec_vertices_[index].x = max.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = min.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
vec_vertices_[index].x = min.x;
|
||||||
|
vec_vertices_[index].y = max.y;
|
||||||
|
vec_vertices_[index++].z = max.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
#endif // TANGO_GL_LINE_H_
|
||||||
@@ -48,26 +48,44 @@ void GetJStringContent(JNIEnv *AEnv, jstring AStr, std::string &ARes) {
|
|||||||
AEnv->ReleaseStringUTFChars(AStr,s);
|
AEnv->ReleaseStringUTFChars(AStr,s);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_initialize(
|
Java_com_introlab_rtabmap_RTABMapLib_onCreate(
|
||||||
JNIEnv* env, jobject, jobject activity)
|
JNIEnv* env, jobject, jobject activity)
|
||||||
{
|
{
|
||||||
return app.TangoInitialize(env, activity);
|
return app.onCreate(env, activity);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setScreenRotation(
|
||||||
|
JNIEnv* env, jobject, int displayRotation, int cameraRotation)
|
||||||
|
{
|
||||||
|
return app.setScreenRotation(displayRotation, cameraRotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT int JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_openDatabase(
|
Java_com_introlab_rtabmap_RTABMapLib_openDatabase(
|
||||||
JNIEnv* env, jobject, jstring databasePath)
|
JNIEnv* env, jobject, jstring databasePath, bool databaseInMemory, bool optimize)
|
||||||
{
|
{
|
||||||
std::string databasePathC;
|
std::string databasePathC;
|
||||||
GetJStringContent(env,databasePath,databasePathC);
|
GetJStringContent(env,databasePath,databasePathC);
|
||||||
return app.openDatabase(databasePathC);
|
return app.openDatabase(databasePathC, databaseInMemory, optimize);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL
|
JNIEXPORT int JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_onResume(
|
Java_com_introlab_rtabmap_RTABMapLib_openDatabase2(
|
||||||
JNIEnv*, jobject) {
|
JNIEnv* env, jobject, jstring databaseSource, jstring databasePath, bool databaseInMemory, bool optimize)
|
||||||
return app.onResume();
|
{
|
||||||
|
std::string databasePathC;
|
||||||
|
GetJStringContent(env,databasePath,databasePathC);
|
||||||
|
std::string databaseSourceC;
|
||||||
|
GetJStringContent(env,databaseSource,databaseSourceC);
|
||||||
|
return app.openDatabase(databasePathC, databaseInMemory, optimize, databaseSourceC);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT bool JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_onTangoServiceConnected(
|
||||||
|
JNIEnv* env, jobject, jobject iBinder) {
|
||||||
|
return app.onTangoServiceConnected(env, iBinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
@@ -120,6 +138,12 @@ Java_com_introlab_rtabmap_RTABMapLib_setPausedMapping(
|
|||||||
return app.setPausedMapping(paused);
|
return app.setPausedMapping(paused);
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setOnlineBlending(
|
||||||
|
JNIEnv*, jobject, bool enabled)
|
||||||
|
{
|
||||||
|
return app.setOnlineBlending(enabled);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setMapCloudShown(
|
Java_com_introlab_rtabmap_RTABMapLib_setMapCloudShown(
|
||||||
JNIEnv*, jobject, bool shown)
|
JNIEnv*, jobject, bool shown)
|
||||||
{
|
{
|
||||||
@@ -133,9 +157,51 @@ Java_com_introlab_rtabmap_RTABMapLib_setOdomCloudShown(
|
|||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setMeshRendering(
|
Java_com_introlab_rtabmap_RTABMapLib_setMeshRendering(
|
||||||
|
JNIEnv*, jobject, bool enabled, bool withTexture)
|
||||||
|
{
|
||||||
|
return app.setMeshRendering(enabled, withTexture);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setPointSize(
|
||||||
|
JNIEnv*, jobject, float value)
|
||||||
|
{
|
||||||
|
return app.setPointSize(value);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setFOV(
|
||||||
|
JNIEnv*, jobject, float fov)
|
||||||
|
{
|
||||||
|
return app.setFOV(fov);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setOrthoCropFactor(
|
||||||
|
JNIEnv*, jobject, float value)
|
||||||
|
{
|
||||||
|
return app.setOrthoCropFactor(value);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setGridRotation(
|
||||||
|
JNIEnv*, jobject, float value)
|
||||||
|
{
|
||||||
|
return app.setGridRotation(value);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setLighting(
|
||||||
JNIEnv*, jobject, bool enabled)
|
JNIEnv*, jobject, bool enabled)
|
||||||
{
|
{
|
||||||
return app.setMeshRendering(enabled);
|
return app.setLighting(enabled);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setBackfaceCulling(
|
||||||
|
JNIEnv*, jobject, bool enabled)
|
||||||
|
{
|
||||||
|
return app.setBackfaceCulling(enabled);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setWireframe(
|
||||||
|
JNIEnv*, jobject, bool enabled)
|
||||||
|
{
|
||||||
|
return app.setWireframe(enabled);
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setLocalizationMode(
|
Java_com_introlab_rtabmap_RTABMapLib_setLocalizationMode(
|
||||||
@@ -168,10 +234,16 @@ Java_com_introlab_rtabmap_RTABMapLib_setGraphVisible(
|
|||||||
return app.setGraphVisible(visible);
|
return app.setGraphVisible(visible);
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setAutoExposure(
|
Java_com_introlab_rtabmap_RTABMapLib_setGridVisible(
|
||||||
|
JNIEnv*, jobject, bool visible)
|
||||||
|
{
|
||||||
|
return app.setGridVisible(visible);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setRawScanSaved(
|
||||||
JNIEnv*, jobject, bool enabled)
|
JNIEnv*, jobject, bool enabled)
|
||||||
{
|
{
|
||||||
return app.setAutoExposure(enabled);
|
return app.setRawScanSaved(enabled);
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setFullResolution(
|
Java_com_introlab_rtabmap_RTABMapLib_setFullResolution(
|
||||||
@@ -180,12 +252,48 @@ Java_com_introlab_rtabmap_RTABMapLib_setFullResolution(
|
|||||||
return app.setFullResolution(enabled);
|
return app.setFullResolution(enabled);
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setSmoothing(
|
||||||
|
JNIEnv*, jobject, bool enabled)
|
||||||
|
{
|
||||||
|
return app.setSmoothing(enabled);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setCameraColor(
|
||||||
|
JNIEnv*, jobject, bool enabled)
|
||||||
|
{
|
||||||
|
return app.setCameraColor(enabled);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setAppendMode(
|
||||||
|
JNIEnv*, jobject, bool enabled)
|
||||||
|
{
|
||||||
|
return app.setAppendMode(enabled);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setDataRecorderMode(
|
||||||
|
JNIEnv*, jobject, bool enabled)
|
||||||
|
{
|
||||||
|
return app.setDataRecorderMode(enabled);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setMaxCloudDepth(
|
Java_com_introlab_rtabmap_RTABMapLib_setMaxCloudDepth(
|
||||||
JNIEnv*, jobject, float value)
|
JNIEnv*, jobject, float value)
|
||||||
{
|
{
|
||||||
return app.setMaxCloudDepth(value);
|
return app.setMaxCloudDepth(value);
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setMinCloudDepth(
|
||||||
|
JNIEnv*, jobject, float value)
|
||||||
|
{
|
||||||
|
return app.setMinCloudDepth(value);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setCloudDensityLevel(
|
||||||
|
JNIEnv*, jobject, int value)
|
||||||
|
{
|
||||||
|
return app.setCloudDensityLevel(value);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setMeshAngleTolerance(
|
Java_com_introlab_rtabmap_RTABMapLib_setMeshAngleTolerance(
|
||||||
JNIEnv*, jobject, float value)
|
JNIEnv*, jobject, float value)
|
||||||
{
|
{
|
||||||
@@ -197,6 +305,30 @@ Java_com_introlab_rtabmap_RTABMapLib_setMeshTriangleSize(
|
|||||||
{
|
{
|
||||||
return app.setMeshTriangleSize(value);
|
return app.setMeshTriangleSize(value);
|
||||||
}
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setClusterRatio(
|
||||||
|
JNIEnv*, jobject, float value)
|
||||||
|
{
|
||||||
|
return app.setClusterRatio(value);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setMaxGainRadius(
|
||||||
|
JNIEnv*, jobject, float value)
|
||||||
|
{
|
||||||
|
return app.setMaxGainRadius(value);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setRenderingTextureDecimation(
|
||||||
|
JNIEnv*, jobject, int value)
|
||||||
|
{
|
||||||
|
return app.setRenderingTextureDecimation(value);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setBackgroundColor(
|
||||||
|
JNIEnv*, jobject, float value)
|
||||||
|
{
|
||||||
|
return app.setBackgroundColor(value);
|
||||||
|
}
|
||||||
JNIEXPORT jint JNICALL
|
JNIEXPORT jint JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setMappingParameter(
|
Java_com_introlab_rtabmap_RTABMapLib_setMappingParameter(
|
||||||
JNIEnv* env, jobject, jstring key, jstring value)
|
JNIEnv* env, jobject, jstring key, jstring value)
|
||||||
@@ -207,6 +339,24 @@ Java_com_introlab_rtabmap_RTABMapLib_setMappingParameter(
|
|||||||
return app.setMappingParameter(keyC, valueC);
|
return app.setMappingParameter(keyC, valueC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setGPS(
|
||||||
|
JNIEnv*, jobject,
|
||||||
|
double stamp,
|
||||||
|
double longitude,
|
||||||
|
double latitude,
|
||||||
|
double altitude,
|
||||||
|
double accuracy,
|
||||||
|
double bearing)
|
||||||
|
{
|
||||||
|
return app.setGPS(rtabmap::GPS(stamp,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
altitude,
|
||||||
|
accuracy,
|
||||||
|
bearing));
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_resetMapping(
|
Java_com_introlab_rtabmap_RTABMapLib_resetMapping(
|
||||||
JNIEnv*, jobject)
|
JNIEnv*, jobject)
|
||||||
@@ -216,20 +366,78 @@ Java_com_introlab_rtabmap_RTABMapLib_resetMapping(
|
|||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_save(
|
Java_com_introlab_rtabmap_RTABMapLib_save(
|
||||||
|
JNIEnv* env, jobject, jstring databasePath)
|
||||||
|
{
|
||||||
|
std::string databasePathC;
|
||||||
|
GetJStringContent(env,databasePath,databasePathC);
|
||||||
|
return app.save(databasePathC);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_cancelProcessing(
|
||||||
JNIEnv* env, jobject)
|
JNIEnv* env, jobject)
|
||||||
{
|
{
|
||||||
return app.save();
|
return app.cancelProcessing();
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT bool JNICALL
|
JNIEXPORT bool JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
|
Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
|
||||||
JNIEnv* env, jobject, jstring filePath)
|
JNIEnv* env, jobject,
|
||||||
|
float cloudVoxelSize,
|
||||||
|
bool regenerateCloud,
|
||||||
|
bool meshing,
|
||||||
|
int textureSize,
|
||||||
|
int textureCount,
|
||||||
|
int normalK,
|
||||||
|
bool optimized,
|
||||||
|
float optimizedVoxelSize,
|
||||||
|
int optimizedDepth,
|
||||||
|
int optimizedMaxPolygons,
|
||||||
|
float optimizedColorRadius,
|
||||||
|
bool optimizedCleanWhitePolygons,
|
||||||
|
int optimizedMinClusterSize,
|
||||||
|
float optimizedMaxTextureDistance,
|
||||||
|
int optimizedMinTextureClusterSize,
|
||||||
|
bool blockRendering)
|
||||||
{
|
{
|
||||||
std::string filePathC;
|
return app.exportMesh(
|
||||||
GetJStringContent(env,filePath,filePathC);
|
cloudVoxelSize,
|
||||||
return app.exportMesh(filePathC);
|
regenerateCloud,
|
||||||
|
meshing,
|
||||||
|
textureSize,
|
||||||
|
textureCount,
|
||||||
|
normalK,
|
||||||
|
optimized,
|
||||||
|
optimizedVoxelSize,
|
||||||
|
optimizedDepth,
|
||||||
|
optimizedMaxPolygons,
|
||||||
|
optimizedColorRadius,
|
||||||
|
optimizedCleanWhitePolygons,
|
||||||
|
optimizedMinClusterSize,
|
||||||
|
optimizedMaxTextureDistance,
|
||||||
|
optimizedMinTextureClusterSize,
|
||||||
|
blockRendering);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT bool JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_postExportation(
|
||||||
|
JNIEnv* env, jobject, bool visualize)
|
||||||
|
{
|
||||||
|
return app.postExportation(visualize);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT bool JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_writeExportedMesh(
|
||||||
|
JNIEnv* env, jobject, jstring directory, jstring name)
|
||||||
|
{
|
||||||
|
std::string directoryC;
|
||||||
|
GetJStringContent(env,directory,directoryC);
|
||||||
|
std::string nameC;
|
||||||
|
GetJStringContent(env,name,nameC);
|
||||||
|
return app.writeExportedMesh(directoryC, nameC);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT int JNICALL
|
JNIEXPORT int JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_postProcessing(
|
Java_com_introlab_rtabmap_RTABMapLib_postProcessing(
|
||||||
JNIEnv* env, jobject, int approach)
|
JNIEnv* env, jobject, int approach)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -40,19 +40,41 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
// PointCloudDrawable is responsible for the point cloud rendering.
|
// PointCloudDrawable is responsible for the point cloud rendering.
|
||||||
class PointCloudDrawable {
|
class PointCloudDrawable {
|
||||||
|
public:
|
||||||
|
static void createShaderPrograms();
|
||||||
|
static void releaseShaderPrograms();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::vector<GLuint> shaderPrograms_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PointCloudDrawable(
|
PointCloudDrawable(
|
||||||
GLuint cloudShaderProgram,
|
|
||||||
GLuint textureShaderProgram,
|
|
||||||
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
const std::vector<pcl::Vertices> & polygons = std::vector<pcl::Vertices>(),
|
const pcl::IndicesPtr & indices,
|
||||||
const cv::Mat & image = cv::Mat());
|
float gainR = 1.0f,
|
||||||
|
float gainG = 1.0f,
|
||||||
|
float gainB = 1.0f);
|
||||||
|
PointCloudDrawable(
|
||||||
|
const Mesh & mesh,
|
||||||
|
bool createWireframe = false);
|
||||||
virtual ~PointCloudDrawable();
|
virtual ~PointCloudDrawable();
|
||||||
|
|
||||||
|
void updatePolygons(const std::vector<pcl::Vertices> & polygons, const std::vector<pcl::Vertices> & polygonsLowRes = std::vector<pcl::Vertices>(), bool createWireframe = false);
|
||||||
|
void updateCloud(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud, const pcl::IndicesPtr & indices);
|
||||||
|
void updateMesh(const Mesh & mesh, bool createWireframe = false);
|
||||||
void setPose(const rtabmap::Transform & pose);
|
void setPose(const rtabmap::Transform & pose);
|
||||||
void setVisible(bool visible) {visible_=visible;}
|
void setVisible(bool visible) {visible_=visible;}
|
||||||
rtabmap::Transform getPose() const {return glmToTransform(pose_);}
|
void setGains(float gainR, float gainG, float gainB) {gainR_ = gainR; gainG_ = gainG; gainB_ = gainB;}
|
||||||
|
rtabmap::Transform getPose() const {return pose_;}
|
||||||
|
const glm::mat4 & getPoseGl() const {return poseGl_;}
|
||||||
bool isVisible() const {return visible_;}
|
bool isVisible() const {return visible_;}
|
||||||
|
bool hasMesh() const {return polygons_.size()!=0;}
|
||||||
|
bool hasTexture() const {return textures_ != 0;}
|
||||||
|
float getMinHeight() const {return minHeight_;}
|
||||||
|
const pcl::PointXYZ & aabbMinModel() const {return aabbMinModel_;}
|
||||||
|
const pcl::PointXYZ & aabbMaxModel() const {return aabbMaxModel_;}
|
||||||
|
const pcl::PointXYZ & aabbMinWorld() const {return aabbMinWorld_;}
|
||||||
|
const pcl::PointXYZ & aabbMaxWorld() const {return aabbMaxWorld_;}
|
||||||
|
|
||||||
// Update current point cloud data.
|
// Update current point cloud data.
|
||||||
//
|
//
|
||||||
@@ -60,19 +82,61 @@ class PointCloudDrawable {
|
|||||||
// @param view_mat: view matrix from current render camera.
|
// @param view_mat: view matrix from current render camera.
|
||||||
// @param model_mat: model matrix for this point cloud frame.
|
// @param model_mat: model matrix for this point cloud frame.
|
||||||
// @param vertices: all vertices in this point cloud frame.
|
// @param vertices: all vertices in this point cloud frame.
|
||||||
void Render(const glm::mat4 & projectionMatrix, const glm::mat4 & viewMatrix, bool meshRendering = true, float pointSize = 3.0f);
|
void Render(
|
||||||
|
const glm::mat4 & projectionMatrix,
|
||||||
|
const glm::mat4 & viewMatrix,
|
||||||
|
bool meshRendering = true,
|
||||||
|
float pointSize = 3.0f,
|
||||||
|
bool textureRendering = false,
|
||||||
|
bool lighting = true,
|
||||||
|
float distanceToCamSqr = 0.0f,
|
||||||
|
const GLuint & depthTexture = 0,
|
||||||
|
int screenWidth = 0, // nonnull if depthTexture>0
|
||||||
|
int screenHeight = 0, // nonnull if depthTexture>0
|
||||||
|
float nearClipPlane = 0, // nonnull if depthTexture>0
|
||||||
|
float farClipPlane = 0, // nonnull if depthTexture>0
|
||||||
|
bool packDepthToColorChannel = false,
|
||||||
|
bool wireFrame = false) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
template<class PointT>
|
||||||
|
void updateAABBMinMax(const PointT & pt, pcl::PointXYZ & min, pcl::PointXYZ & max)
|
||||||
|
{
|
||||||
|
if(pt.x<min.x) min.x = pt.x;
|
||||||
|
if(pt.y<min.y) min.y = pt.y;
|
||||||
|
if(pt.z<min.z) min.z = pt.z;
|
||||||
|
if(pt.x>max.x) max.x = pt.x;
|
||||||
|
if(pt.y>max.y) max.y = pt.y;
|
||||||
|
if(pt.z>max.z) max.z = pt.z;
|
||||||
|
}
|
||||||
|
void updateAABBWorld(const rtabmap::Transform & pose);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Vertex buffer of the point cloud geometry.
|
// Vertex buffer of the point cloud geometry.
|
||||||
GLuint vertex_buffers_;
|
GLuint vertex_buffers_;
|
||||||
GLuint textures_;
|
GLuint textures_;
|
||||||
std::vector<GLushort> polygons_;
|
std::vector<GLuint> polygons_;
|
||||||
|
std::vector<GLuint> polygonsLowRes_;
|
||||||
|
std::vector<GLuint> polygonLines_;
|
||||||
|
std::vector<GLuint> polygonLinesLowRes_;
|
||||||
|
std::vector<GLuint> verticesLowRes_;
|
||||||
|
std::vector<GLuint> verticesLowLowRes_;
|
||||||
int nPoints_;
|
int nPoints_;
|
||||||
glm::mat4 pose_;
|
rtabmap::Transform pose_;
|
||||||
|
glm::mat4 poseGl_;
|
||||||
bool visible_;
|
bool visible_;
|
||||||
|
bool hasNormals_;
|
||||||
|
std::vector<unsigned int> organizedToDenseIndices_;
|
||||||
|
float minHeight_; // odom frame
|
||||||
|
|
||||||
GLuint cloud_shader_program_;
|
float gainR_;
|
||||||
GLuint texture_shader_program_;
|
float gainG_;
|
||||||
|
float gainB_;
|
||||||
|
|
||||||
|
pcl::PointXYZ aabbMinModel_;
|
||||||
|
pcl::PointXYZ aabbMaxModel_;
|
||||||
|
pcl::PointXYZ aabbMinWorld_;
|
||||||
|
pcl::PointXYZ aabbMaxWorld_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TANGO_POINT_CLOUD_POINT_CLOUD_DRAWABLE_H_
|
#endif // TANGO_POINT_CLOUD_POINT_CLOUD_DRAWABLE_H_
|
||||||
|
|||||||
@@ -16,10 +16,18 @@
|
|||||||
|
|
||||||
#include <tango-gl/conversions.h>
|
#include <tango-gl/conversions.h>
|
||||||
#include <tango-gl/gesture_camera.h>
|
#include <tango-gl/gesture_camera.h>
|
||||||
|
#include <tango-gl/util.h>
|
||||||
|
|
||||||
#include <rtabmap/utilite/ULogger.h>
|
#include <rtabmap/utilite/ULogger.h>
|
||||||
#include <rtabmap/utilite/UStl.h>
|
#include <rtabmap/utilite/UStl.h>
|
||||||
|
#include <rtabmap/utilite/UTimer.h>
|
||||||
#include <rtabmap/core/util3d_filtering.h>
|
#include <rtabmap/core/util3d_filtering.h>
|
||||||
|
#include <rtabmap/core/util3d_transforms.h>
|
||||||
|
#include <rtabmap/core/util3d_surface.h>
|
||||||
|
#include <pcl/common/transforms.h>
|
||||||
|
#include <pcl/common/common.h>
|
||||||
|
|
||||||
|
#include <glm/gtx/transform.hpp>
|
||||||
|
|
||||||
#include "scene.h"
|
#include "scene.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@@ -28,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 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);
|
||||||
@@ -39,47 +47,6 @@ const tango_gl::Color kGridColor(0.85f, 0.85f, 0.85f);
|
|||||||
// Frustum scale.
|
// Frustum scale.
|
||||||
const glm::vec3 kFrustumScale = glm::vec3(0.4f, 0.3f, 0.5f);
|
const glm::vec3 kFrustumScale = glm::vec3(0.4f, 0.3f, 0.5f);
|
||||||
|
|
||||||
const std::string kPointCloudVertexShader =
|
|
||||||
"precision mediump float;\n"
|
|
||||||
"precision mediump int;\n"
|
|
||||||
"attribute vec3 vertex;\n"
|
|
||||||
"attribute vec3 color;\n"
|
|
||||||
"uniform mat4 mvp;\n"
|
|
||||||
"uniform float point_size;\n"
|
|
||||||
"varying vec3 v_color;\n"
|
|
||||||
"void main() {\n"
|
|
||||||
" gl_Position = mvp*vec4(vertex.x, vertex.y, vertex.z, 1.0);\n"
|
|
||||||
" gl_PointSize = point_size;\n"
|
|
||||||
" v_color = color;\n"
|
|
||||||
"}\n";
|
|
||||||
const std::string kPointCloudFragmentShader =
|
|
||||||
"precision mediump float;\n"
|
|
||||||
"precision mediump int;\n"
|
|
||||||
"varying vec3 v_color;\n"
|
|
||||||
"void main() {\n"
|
|
||||||
" gl_FragColor = vec4(v_color.z, v_color.y, v_color.x, 1.0);\n"
|
|
||||||
"}\n";
|
|
||||||
|
|
||||||
const std::string kTextureMeshVertexShader =
|
|
||||||
"precision mediump float;\n"
|
|
||||||
"precision mediump int;\n"
|
|
||||||
"attribute vec3 vertex;\n"
|
|
||||||
"attribute vec2 a_TexCoordinate;\n"
|
|
||||||
"uniform mat4 mvp;\n"
|
|
||||||
"varying vec2 v_TexCoordinate;\n"
|
|
||||||
"void main() {\n"
|
|
||||||
" gl_Position = mvp*vec4(vertex.x, vertex.y, vertex.z, 1.0);\n"
|
|
||||||
" v_TexCoordinate = a_TexCoordinate;\n"
|
|
||||||
"}\n";
|
|
||||||
const std::string kTextureMeshFragmentShader =
|
|
||||||
"precision mediump float;\n"
|
|
||||||
"precision mediump int;\n"
|
|
||||||
"uniform sampler2D u_Texture;\n"
|
|
||||||
"varying vec2 v_TexCoordinate;\n"
|
|
||||||
"void main() {\n"
|
|
||||||
" gl_FragColor = texture2D(u_Texture, v_TexCoordinate);\n"
|
|
||||||
"}\n";
|
|
||||||
|
|
||||||
const std::string kGraphVertexShader =
|
const std::string kGraphVertexShader =
|
||||||
"precision mediump float;\n"
|
"precision mediump float;\n"
|
||||||
"precision mediump int;\n"
|
"precision mediump int;\n"
|
||||||
@@ -106,91 +73,109 @@ Scene::Scene() :
|
|||||||
axis_(0),
|
axis_(0),
|
||||||
frustum_(0),
|
frustum_(0),
|
||||||
grid_(0),
|
grid_(0),
|
||||||
|
box_(0),
|
||||||
trace_(0),
|
trace_(0),
|
||||||
graph_(0),
|
graph_(0),
|
||||||
graphVisible_(true),
|
graphVisible_(true),
|
||||||
|
gridVisible_(true),
|
||||||
traceVisible_(true),
|
traceVisible_(true),
|
||||||
|
color_camera_to_display_rotation_(ROTATION_0),
|
||||||
currentPose_(0),
|
currentPose_(0),
|
||||||
cloud_shader_program_(0),
|
|
||||||
texture_mesh_shader_program_(0),
|
|
||||||
graph_shader_program_(0),
|
graph_shader_program_(0),
|
||||||
|
blending_(true),
|
||||||
mapRendering_(true),
|
mapRendering_(true),
|
||||||
meshRendering_(true),
|
meshRendering_(true),
|
||||||
pointSize_(3.0f) {}
|
meshRenderingTexture_(true),
|
||||||
|
pointSize_(5.0f),
|
||||||
|
boundingBoxRendering_(false),
|
||||||
|
lighting_(false),
|
||||||
|
backfaceCulling_(true),
|
||||||
|
wireFrame_(false),
|
||||||
|
r_(0.0f),
|
||||||
|
g_(0.0f),
|
||||||
|
b_(0.0f),
|
||||||
|
fboId_(0),
|
||||||
|
depthTexture_(0),
|
||||||
|
screenWidth_(0),
|
||||||
|
screenHeight_(0),
|
||||||
|
doubleTapOn_(false)
|
||||||
|
{
|
||||||
|
gesture_camera_ = new tango_gl::GestureCamera();
|
||||||
|
gesture_camera_->SetCameraType(
|
||||||
|
tango_gl::GestureCamera::kFirstPerson);
|
||||||
|
}
|
||||||
|
|
||||||
Scene::~Scene() {DeleteResources();}
|
Scene::~Scene() {
|
||||||
|
DeleteResources();
|
||||||
|
delete gesture_camera_;
|
||||||
|
}
|
||||||
|
|
||||||
//Should only be called in OpenGL thread!
|
//Should only be called in OpenGL thread!
|
||||||
void Scene::InitGLContent()
|
void Scene::InitGLContent()
|
||||||
{
|
{
|
||||||
if(gesture_camera_ != 0)
|
if(axis_ != 0)
|
||||||
{
|
{
|
||||||
DeleteResources();
|
DeleteResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
UASSERT(gesture_camera_ == 0);
|
UASSERT(axis_ == 0);
|
||||||
|
|
||||||
gesture_camera_ = new tango_gl::GestureCamera();
|
|
||||||
axis_ = new tango_gl::Axis();
|
|
||||||
frustum_ = new tango_gl::Frustum();
|
|
||||||
trace_ = new tango_gl::Trace();
|
|
||||||
grid_ = new tango_gl::Grid();
|
|
||||||
currentPose_ = new rtabmap::Transform();
|
|
||||||
|
|
||||||
|
|
||||||
axis_->SetScale(glm::vec3(0.5f,0.5f,0.5f));
|
axis_ = new tango_gl::Axis();
|
||||||
frustum_->SetColor(kTraceColor);
|
frustum_ = new tango_gl::Frustum();
|
||||||
trace_->ClearVertexArray();
|
trace_ = new tango_gl::Trace();
|
||||||
trace_->SetColor(kTraceColor);
|
grid_ = new tango_gl::Grid();
|
||||||
grid_->SetColor(kGridColor);
|
box_ = new BoundingBoxDrawable();
|
||||||
grid_->SetPosition(-kHeightOffset);
|
currentPose_ = new rtabmap::Transform();
|
||||||
gesture_camera_->SetCameraType(
|
|
||||||
tango_gl::GestureCamera::kFirstPerson);
|
|
||||||
|
|
||||||
if(cloud_shader_program_ == 0)
|
|
||||||
{
|
axis_->SetScale(glm::vec3(0.5f,0.5f,0.5f));
|
||||||
cloud_shader_program_ = tango_gl::util::CreateProgram(kPointCloudVertexShader.c_str(), kPointCloudFragmentShader.c_str());
|
frustum_->SetColor(kTraceColor);
|
||||||
UASSERT(cloud_shader_program_ != 0);
|
trace_->ClearVertexArray();
|
||||||
}
|
trace_->SetColor(kTraceColor);
|
||||||
if(texture_mesh_shader_program_ == 0)
|
grid_->SetColor(kGridColor);
|
||||||
{
|
grid_->SetPosition(kHeightOffset);
|
||||||
texture_mesh_shader_program_ = tango_gl::util::CreateProgram(kTextureMeshVertexShader.c_str(), kTextureMeshFragmentShader.c_str());
|
box_->SetShader();
|
||||||
UASSERT(texture_mesh_shader_program_ != 0);
|
box_->SetColor(1,0,0);
|
||||||
}
|
|
||||||
if(graph_shader_program_ == 0)
|
PointCloudDrawable::createShaderPrograms();
|
||||||
{
|
|
||||||
graph_shader_program_ = tango_gl::util::CreateProgram(kGraphVertexShader.c_str(), kGraphFragmentShader.c_str());
|
if(graph_shader_program_ == 0)
|
||||||
UASSERT(graph_shader_program_ != 0);
|
{
|
||||||
}
|
graph_shader_program_ = tango_gl::util::CreateProgram(kGraphVertexShader.c_str(), kGraphFragmentShader.c_str());
|
||||||
|
UASSERT(graph_shader_program_ != 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Should only be called in OpenGL thread!
|
//Should only be called in OpenGL thread!
|
||||||
void Scene::DeleteResources() {
|
void Scene::DeleteResources() {
|
||||||
|
|
||||||
LOGI("Scene::DeleteResources()");
|
LOGI("Scene::DeleteResources()");
|
||||||
if(gesture_camera_)
|
if(axis_)
|
||||||
{
|
{
|
||||||
delete gesture_camera_;
|
delete axis_;
|
||||||
delete axis_;
|
axis_ = 0;
|
||||||
delete frustum_;
|
delete frustum_;
|
||||||
delete trace_;
|
delete trace_;
|
||||||
delete grid_;
|
delete grid_;
|
||||||
delete currentPose_;
|
delete currentPose_;
|
||||||
gesture_camera_ = 0;
|
delete box_;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cloud_shader_program_) {
|
PointCloudDrawable::releaseShaderPrograms();
|
||||||
glDeleteShader(cloud_shader_program_);
|
|
||||||
cloud_shader_program_ = 0;
|
|
||||||
}
|
|
||||||
if (texture_mesh_shader_program_) {
|
|
||||||
glDeleteShader(texture_mesh_shader_program_);
|
|
||||||
texture_mesh_shader_program_ = 0;
|
|
||||||
}
|
|
||||||
if (graph_shader_program_) {
|
if (graph_shader_program_) {
|
||||||
glDeleteShader(graph_shader_program_);
|
glDeleteShader(graph_shader_program_);
|
||||||
graph_shader_program_ = 0;
|
graph_shader_program_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(fboId_>0)
|
||||||
|
{
|
||||||
|
glDeleteFramebuffers(1, &fboId_);
|
||||||
|
fboId_ = 0;
|
||||||
|
glDeleteTextures(1, &depthTexture_);
|
||||||
|
depthTexture_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
@@ -213,142 +198,360 @@ void Scene::clear()
|
|||||||
graph_ = 0;
|
graph_ = 0;
|
||||||
}
|
}
|
||||||
pointClouds_.clear();
|
pointClouds_.clear();
|
||||||
|
if(grid_)
|
||||||
|
{
|
||||||
|
grid_->SetPosition(kHeightOffset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//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) {
|
||||||
LOGE("Setup graphic height not valid");
|
LOGE("Setup graphic height not valid");
|
||||||
|
}
|
||||||
|
UASSERT(gesture_camera_ != 0);
|
||||||
|
gesture_camera_->SetWindowSize(static_cast<float>(w), static_cast<float>(h));
|
||||||
|
glViewport(0, 0, w, h);
|
||||||
|
if(screenWidth_ != w || fboId_ == 0)
|
||||||
|
{
|
||||||
|
if(fboId_>0)
|
||||||
|
{
|
||||||
|
glDeleteFramebuffers(1, &fboId_);
|
||||||
|
fboId_ = 0;
|
||||||
|
glDeleteTextures(1, &depthTexture_);
|
||||||
|
depthTexture_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create depth texture
|
||||||
|
glGenTextures(1, &depthTexture_);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, depthTexture_);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
|
// regenerate fbo texture
|
||||||
|
// create a framebuffer object, you need to delete them when program exits.
|
||||||
|
glGenFramebuffers(1, &fboId_);
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
|
||||||
|
|
||||||
|
// Set the texture to be at the depth attachment point of the FBO
|
||||||
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture_, 0);
|
||||||
|
|
||||||
|
GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
|
||||||
|
if ( status != GL_FRAMEBUFFER_COMPLETE)
|
||||||
|
{
|
||||||
|
LOGE("Frame buffer cannot be generated! Status: %in", status);
|
||||||
|
}
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER,0);
|
||||||
|
}
|
||||||
|
screenWidth_ = w;
|
||||||
|
screenHeight_ = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<glm::vec4> computeFrustumPlanes(const glm::mat4 & mat, bool normalize = true)
|
||||||
|
{
|
||||||
|
// http://www.txutxi.com/?p=444
|
||||||
|
std::vector<glm::vec4> planes(6);
|
||||||
|
|
||||||
|
// Left Plane
|
||||||
|
// col4 + col1
|
||||||
|
planes[0].x = mat[0][3] + mat[0][0];
|
||||||
|
planes[0].y = mat[1][3] + mat[1][0];
|
||||||
|
planes[0].z = mat[2][3] + mat[2][0];
|
||||||
|
planes[0].w = mat[3][3] + mat[3][0];
|
||||||
|
|
||||||
|
// Right Plane
|
||||||
|
// col4 - col1
|
||||||
|
planes[1].x = mat[0][3] - mat[0][0];
|
||||||
|
planes[1].y = mat[1][3] - mat[1][0];
|
||||||
|
planes[1].z = mat[2][3] - mat[2][0];
|
||||||
|
planes[1].w = mat[3][3] - mat[3][0];
|
||||||
|
|
||||||
|
// Bottom Plane
|
||||||
|
// col4 + col2
|
||||||
|
planes[2].x = mat[0][3] + mat[0][1];
|
||||||
|
planes[2].y = mat[1][3] + mat[1][1];
|
||||||
|
planes[2].z = mat[2][3] + mat[2][1];
|
||||||
|
planes[2].w = mat[3][3] + mat[3][1];
|
||||||
|
|
||||||
|
// Top Plane
|
||||||
|
// col4 - col2
|
||||||
|
planes[3].x = mat[0][3] - mat[0][1];
|
||||||
|
planes[3].y = mat[1][3] - mat[1][1];
|
||||||
|
planes[3].z = mat[2][3] - mat[2][1];
|
||||||
|
planes[3].w = mat[3][3] - mat[3][1];
|
||||||
|
|
||||||
|
// Near Plane
|
||||||
|
// col4 + col3
|
||||||
|
planes[4].x = mat[0][3] + mat[0][2];
|
||||||
|
planes[4].y = mat[1][3] + mat[1][2];
|
||||||
|
planes[4].z = mat[2][3] + mat[2][2];
|
||||||
|
planes[4].w = mat[3][3] + mat[3][2];
|
||||||
|
|
||||||
|
// Far Plane
|
||||||
|
// col4 - col3
|
||||||
|
planes[5].x = mat[0][3] - mat[0][2];
|
||||||
|
planes[5].y = mat[1][3] - mat[1][2];
|
||||||
|
planes[5].z = mat[2][3] - mat[2][2];
|
||||||
|
planes[5].w = mat[3][3] - mat[3][2];
|
||||||
|
|
||||||
|
//if(normalize)
|
||||||
|
{
|
||||||
|
for(unsigned int i=0;i<planes.size(); ++i)
|
||||||
|
{
|
||||||
|
if(normalize)
|
||||||
|
{
|
||||||
|
float d = std::sqrt(planes[i].x * planes[i].x + planes[i].y * planes[i].y + planes[i].z * planes[i].z); // for normalizing the coordinates
|
||||||
|
planes[i].x/=d;
|
||||||
|
planes[i].y/=d;
|
||||||
|
planes[i].z/=d;
|
||||||
|
planes[i].w/=d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return planes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells whether or not b is intersecting f.
|
||||||
|
* http://www.txutxi.com/?p=584
|
||||||
|
* @param f Viewing frustum.
|
||||||
|
* @param b An axis aligned bounding box.
|
||||||
|
* @return True if b intersects f, false otherwise.
|
||||||
|
*/
|
||||||
|
bool intersectFrustumAABB(
|
||||||
|
const std::vector<glm::vec4> &planes,
|
||||||
|
const pcl::PointXYZ &boxMin,
|
||||||
|
const pcl::PointXYZ &boxMax)
|
||||||
|
{
|
||||||
|
// Indexed for the 'index trick' later
|
||||||
|
const pcl::PointXYZ * box[] = {&boxMin, &boxMax};
|
||||||
|
|
||||||
|
// We only need to do 6 point-plane tests
|
||||||
|
for (unsigned int i = 0; i < planes.size(); ++i)
|
||||||
|
{
|
||||||
|
// This is the current plane
|
||||||
|
const glm::vec4 &p = planes[i];
|
||||||
|
|
||||||
|
// p-vertex selection (with the index trick)
|
||||||
|
// According to the plane normal we can know the
|
||||||
|
// indices of the positive vertex
|
||||||
|
const int px = p.x > 0.0f?1:0;
|
||||||
|
const int py = p.y > 0.0f?1:0;
|
||||||
|
const int pz = p.z > 0.0f?1:0;
|
||||||
|
|
||||||
|
// Dot product
|
||||||
|
// project p-vertex on plane normal
|
||||||
|
// (How far is p-vertex from the origin)
|
||||||
|
const float dp =
|
||||||
|
(p.x*box[px]->x) +
|
||||||
|
(p.y*box[py]->y) +
|
||||||
|
(p.z*box[pz]->z) + p.w;
|
||||||
|
|
||||||
|
// Doesn't intersect if it is behind the plane
|
||||||
|
if (dp < 0) {return false; }
|
||||||
}
|
}
|
||||||
UASSERT(gesture_camera_ != 0);
|
return true;
|
||||||
gesture_camera_->SetAspectRatio(static_cast<float>(w) /
|
|
||||||
static_cast<float>(h));
|
|
||||||
glViewport(0, 0, w, h);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Should only be called in OpenGL thread!
|
//Should only be called in OpenGL thread!
|
||||||
int Scene::Render() {
|
int Scene::Render() {
|
||||||
UASSERT(gesture_camera_ != 0);
|
UASSERT(gesture_camera_ != 0);
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glm::vec3 position(currentPose_->x(), currentPose_->y(), currentPose_->z());
|
||||||
glEnable(GL_CULL_FACE);
|
Eigen::Quaternionf quat = currentPose_->getQuaternionf();
|
||||||
|
glm::quat rotation(quat.w(), quat.x(), quat.y(), quat.z());
|
||||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
glm::mat4 rotateM;
|
||||||
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
if(!currentPose_->isNull())
|
||||||
|
|
||||||
if(!currentPose_->isNull())
|
|
||||||
{
|
|
||||||
glm::vec3 position(currentPose_->x(), currentPose_->y(), currentPose_->z());
|
|
||||||
Eigen::Quaternionf quat = currentPose_->getQuaternionf();
|
|
||||||
glm::quat rotation(quat.w(), quat.x(), quat.y(), quat.z());
|
|
||||||
|
|
||||||
if (gesture_camera_->GetCameraType() == tango_gl::GestureCamera::kFirstPerson)
|
|
||||||
{
|
|
||||||
// In first person mode, we directly control camera's motion.
|
|
||||||
gesture_camera_->SetPosition(position);
|
|
||||||
gesture_camera_->SetRotation(rotation);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// In third person or top down more, we follow the camera movement.
|
|
||||||
gesture_camera_->SetAnchorPosition(position, rotation);
|
|
||||||
|
|
||||||
frustum_->SetPosition(position);
|
|
||||||
frustum_->SetRotation(rotation);
|
|
||||||
// Set the frustum scale to 4:3, this doesn't necessarily match the physical
|
|
||||||
// camera's aspect ratio, this is just for visualization purposes.
|
|
||||||
frustum_->SetScale(kFrustumScale);
|
|
||||||
frustum_->Render(gesture_camera_->GetProjectionMatrix(),
|
|
||||||
gesture_camera_->GetViewMatrix());
|
|
||||||
|
|
||||||
axis_->SetPosition(position);
|
|
||||||
axis_->SetRotation(rotation);
|
|
||||||
axis_->Render(gesture_camera_->GetProjectionMatrix(),
|
|
||||||
gesture_camera_->GetViewMatrix());
|
|
||||||
}
|
|
||||||
|
|
||||||
trace_->UpdateVertexArray(position);
|
|
||||||
if(traceVisible_)
|
|
||||||
{
|
|
||||||
trace_->Render(gesture_camera_->GetProjectionMatrix(),
|
|
||||||
gesture_camera_->GetViewMatrix());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
grid_->Render(gesture_camera_->GetProjectionMatrix(),
|
|
||||||
gesture_camera_->GetViewMatrix());
|
|
||||||
|
|
||||||
bool frustumCulling = true;
|
|
||||||
int cloudDrawn=0;
|
|
||||||
if(mapRendering_ && frustumCulling)
|
|
||||||
{
|
{
|
||||||
//Use camera frustum to cull nodes that don't need to be drawn
|
rotateM = glm::rotate<float>(float(color_camera_to_display_rotation_)*-1.57079632679489661923132169163975144, glm::vec3(0.0f, 0.0f, 1.0f));
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
|
|
||||||
std::vector<int> ids(pointClouds_.size());
|
|
||||||
|
|
||||||
cloud->resize(pointClouds_.size());
|
if (gesture_camera_->GetCameraType() == tango_gl::GestureCamera::kFirstPerson)
|
||||||
ids.resize(pointClouds_.size());
|
|
||||||
int oi=0;
|
|
||||||
for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
|
|
||||||
{
|
{
|
||||||
if(!iter->second->getPose().isNull() && iter->second->isVisible())
|
// In first person mode, we directly control camera's motion.
|
||||||
{
|
gesture_camera_->SetPosition(position);
|
||||||
(*cloud)[oi] = pcl::PointXYZ(iter->second->getPose().x(), iter->second->getPose().y(), iter->second->getPose().z());
|
gesture_camera_->SetRotation(rotation*glm::quat(rotateM));
|
||||||
ids[oi++] = iter->first;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
cloud->resize(oi);
|
else
|
||||||
ids.resize(oi);
|
|
||||||
|
|
||||||
if(oi)
|
|
||||||
{
|
{
|
||||||
float fov = 45.0f;
|
// In third person or top down mode, we follow the camera movement.
|
||||||
rtabmap::Transform openglCamera = GetOpenGLCameraPose(&fov)*rtabmap::Transform(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f);
|
gesture_camera_->SetAnchorPosition(position, rotation*glm::quat(rotateM));
|
||||||
// transform in same coordinate as frustum filtering
|
}
|
||||||
openglCamera *= rtabmap::Transform(
|
}
|
||||||
0.0f, 0.0f, 1.0f, 0.0f,
|
|
||||||
0.0f, 1.0f, 0.0f, 0.0f,
|
|
||||||
-1.0f, 0.0f, 0.0f, 0.0f);
|
|
||||||
pcl::IndicesPtr indices = rtabmap::util3d::frustumFiltering(
|
|
||||||
cloud,
|
|
||||||
pcl::IndicesPtr(new std::vector<int>),
|
|
||||||
openglCamera,
|
|
||||||
fov*2.0f,
|
|
||||||
fov*2.0f,
|
|
||||||
0.1f,
|
|
||||||
100.0f);
|
|
||||||
|
|
||||||
//LOGI("Frustum poses filtered = %d (showing %d/%d)",
|
glm::mat4 projectionMatrix = gesture_camera_->GetProjectionMatrix();
|
||||||
// (int)(pointClouds_.size()-indices->size()),
|
glm::mat4 viewMatrix = gesture_camera_->GetViewMatrix();
|
||||||
// (int)indices->size(),
|
|
||||||
// (int)pointClouds_.size());
|
|
||||||
|
|
||||||
for(unsigned int i=0; i<indices->size(); ++i)
|
rtabmap::Transform openglCamera = GetOpenGLCameraPose();//*rtabmap::Transform(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
// transform in same coordinate as frustum filtering
|
||||||
|
openglCamera *= rtabmap::Transform(
|
||||||
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
0.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
-1.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
//Culling
|
||||||
|
std::vector<glm::vec4> planes = computeFrustumPlanes(projectionMatrix*viewMatrix, true);
|
||||||
|
std::vector<PointCloudDrawable*> cloudsToDraw(pointClouds_.size());
|
||||||
|
int oi=0;
|
||||||
|
for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
|
||||||
|
{
|
||||||
|
if(!mapRendering_ && iter->first > 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(iter->second->isVisible())
|
||||||
|
{
|
||||||
|
if(intersectFrustumAABB(planes,
|
||||||
|
iter->second->aabbMinWorld(),
|
||||||
|
iter->second->aabbMaxWorld()))
|
||||||
{
|
{
|
||||||
++cloudDrawn;
|
cloudsToDraw[oi++] = iter->second;
|
||||||
pointClouds_.find(ids[indices->at(i)])->second->Render(gesture_camera_->GetProjectionMatrix(), gesture_camera_->GetViewMatrix(), meshRendering_, pointSize_);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cloudsToDraw.resize(oi);
|
||||||
|
|
||||||
|
// First rendering to get depth texture
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDepthFunc(GL_LESS);
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||||
|
glDisable (GL_BLEND);
|
||||||
|
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
|
if(backfaceCulling_)
|
||||||
|
{
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
|
glDisable(GL_CULL_FACE);
|
||||||
|
}
|
||||||
|
|
||||||
|
UTimer timer;
|
||||||
|
|
||||||
|
bool onlineBlending = blending_ && gesture_camera_->GetCameraType()!=tango_gl::GestureCamera::kTopOrtho && mapRendering_ && meshRendering_ && cloudsToDraw.size()>1;
|
||||||
|
if(onlineBlending && fboId_)
|
||||||
|
{
|
||||||
|
// set the rendering destination to FBO
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
|
||||||
|
|
||||||
|
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||||
|
glClearColor(1, 1, 1, 1);
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
// Draw scene
|
||||||
|
for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
|
||||||
{
|
{
|
||||||
if((mapRendering_ || iter->first < 0) && iter->second->isVisible())
|
// set large distance to cam to use low res polygons for fast processing
|
||||||
{
|
(*iter)->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, false, false, 999.0f);
|
||||||
++cloudDrawn;
|
}
|
||||||
iter->second->Render(gesture_camera_->GetProjectionMatrix(), gesture_camera_->GetViewMatrix(), meshRendering_, pointSize_);
|
|
||||||
}
|
// back to normal window-system-provided framebuffer
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, 0); // unbind
|
||||||
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(doubleTapOn_ && gesture_camera_->GetCameraType() != tango_gl::GestureCamera::kFirstPerson)
|
||||||
|
{
|
||||||
|
glClearColor(0, 0, 0, 0);
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
|
||||||
|
{
|
||||||
|
// set large distance to cam to use low res polygons for fast processing
|
||||||
|
(*iter)->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_*10.0f, false, false, 999.0f, 0, 0, 0, 0, 0, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLubyte zValue[4];
|
||||||
|
glReadPixels(doubleTapPos_.x*screenWidth_, screenHeight_-doubleTapPos_.y*screenHeight_, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, zValue);
|
||||||
|
float fromFixed = 256.0f/255.0f;
|
||||||
|
float zValueF = float(zValue[0]/255.0f)*fromFixed + float(zValue[1]/255.0f)*fromFixed/255.0f + float(zValue[2]/255.0f)*fromFixed/65025.0f + float(zValue[3]/255.0f)*fromFixed/160581375.0f;
|
||||||
|
|
||||||
|
if(zValueF != 0.0f)
|
||||||
|
{
|
||||||
|
zValueF = zValueF*2.0-1.0;//NDC
|
||||||
|
glm::vec4 point = glm::inverse(projectionMatrix*viewMatrix)*glm::vec4(doubleTapPos_.x*2.0f-1.0f, (1.0f-doubleTapPos_.y)*2.0f-1.0f, zValueF, 1.0f);
|
||||||
|
point /= point.w;
|
||||||
|
gesture_camera_->SetAnchorOffset(glm::vec3(point.x, point.y, point.z) - position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
doubleTapOn_ = false;
|
||||||
|
|
||||||
|
glClearColor(r_, g_, b_, 1.0f);
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
if(!currentPose_->isNull())
|
||||||
|
{
|
||||||
|
if (gesture_camera_->GetCameraType() != tango_gl::GestureCamera::kFirstPerson)
|
||||||
|
{
|
||||||
|
frustum_->SetPosition(position);
|
||||||
|
frustum_->SetRotation(rotation);
|
||||||
|
// Set the frustum scale to 4:3, this doesn't necessarily match the physical
|
||||||
|
// camera's aspect ratio, this is just for visualization purposes.
|
||||||
|
frustum_->SetScale(kFrustumScale);
|
||||||
|
frustum_->Render(projectionMatrix, viewMatrix);
|
||||||
|
|
||||||
|
axis_->SetPosition(position);
|
||||||
|
axis_->SetRotation(rotation);
|
||||||
|
axis_->Render(projectionMatrix, viewMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
trace_->UpdateVertexArray(position);
|
||||||
|
if(traceVisible_)
|
||||||
|
{
|
||||||
|
trace_->Render(projectionMatrix, viewMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(gridVisible_)
|
||||||
|
{
|
||||||
|
grid_->Render(projectionMatrix, viewMatrix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(graphVisible_ && graph_)
|
if(graphVisible_ && graph_)
|
||||||
{
|
{
|
||||||
graph_->Render(gesture_camera_->GetProjectionMatrix(), gesture_camera_->GetViewMatrix());
|
graph_->Render(projectionMatrix, viewMatrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
return cloudDrawn;
|
|
||||||
|
if(onlineBlending)
|
||||||
|
{
|
||||||
|
glEnable (GL_BLEND);
|
||||||
|
glDepthMask(GL_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
|
||||||
|
{
|
||||||
|
PointCloudDrawable * cloud = *iter;
|
||||||
|
|
||||||
|
if(boundingBoxRendering_)
|
||||||
|
{
|
||||||
|
box_->updateVertices(cloud->aabbMinWorld(), cloud->aabbMaxWorld());
|
||||||
|
box_->Render(projectionMatrix, viewMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
Eigen::Vector3f cloudToCamera(
|
||||||
|
cloud->getPose().x() - openglCamera.x(),
|
||||||
|
cloud->getPose().y() - openglCamera.y(),
|
||||||
|
cloud->getPose().z() - openglCamera.z());
|
||||||
|
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_);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(onlineBlending)
|
||||||
|
{
|
||||||
|
glDisable (GL_BLEND);
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int)cloudsToDraw.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::SetCameraType(tango_gl::GestureCamera::CameraType camera_type) {
|
void Scene::SetCameraType(tango_gl::GestureCamera::CameraType camera_type) {
|
||||||
@@ -362,6 +565,24 @@ void Scene::SetCameraPose(const rtabmap::Transform & pose)
|
|||||||
*currentPose_ = pose;
|
*currentPose_ = pose;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::setFOV(float angle)
|
||||||
|
{
|
||||||
|
gesture_camera_->SetFieldOfView(angle);
|
||||||
|
}
|
||||||
|
void Scene::setOrthoCropFactor(float value)
|
||||||
|
{
|
||||||
|
gesture_camera_->SetOrthoCropFactor(value);
|
||||||
|
}
|
||||||
|
void Scene::setGridRotation(float angleDeg)
|
||||||
|
{
|
||||||
|
float angleRad = angleDeg * DEGREE_2_RADIANS;
|
||||||
|
if(grid_)
|
||||||
|
{
|
||||||
|
glm::quat rot = glm::rotate(glm::quat(1,0,0,0), angleRad, glm::vec3(0, 1, 0));
|
||||||
|
grid_->SetRotation(rot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rtabmap::Transform Scene::GetOpenGLCameraPose(float * fov) const
|
rtabmap::Transform Scene::GetOpenGLCameraPose(float * fov) const
|
||||||
{
|
{
|
||||||
if(fov)
|
if(fov)
|
||||||
@@ -369,14 +590,27 @@ rtabmap::Transform Scene::GetOpenGLCameraPose(float * fov) const
|
|||||||
*fov = gesture_camera_->getFOV();
|
*fov = gesture_camera_->getFOV();
|
||||||
}
|
}
|
||||||
return glmToTransform(gesture_camera_->GetTransformationMatrix());
|
return glmToTransform(gesture_camera_->GetTransformationMatrix());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::OnTouchEvent(int touch_count,
|
void Scene::OnTouchEvent(int touch_count,
|
||||||
tango_gl::GestureCamera::TouchEvent event, float x0,
|
tango_gl::GestureCamera::TouchEvent event, float x0,
|
||||||
float y0, float x1, float y1) {
|
float y0, float x1, float y1) {
|
||||||
UASSERT(gesture_camera_ != 0);
|
UASSERT(gesture_camera_ != 0);
|
||||||
gesture_camera_->OnTouchEvent(touch_count, event, x0, y0, x1, y1);
|
if(touch_count == 3)
|
||||||
|
{
|
||||||
|
//doubletap
|
||||||
|
if(!doubleTapOn_)
|
||||||
|
{
|
||||||
|
doubleTapPos_.x = x0;
|
||||||
|
doubleTapPos_.y = y0;
|
||||||
|
doubleTapOn_ = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// rotate/translate/zoom
|
||||||
|
gesture_camera_->OnTouchEvent(touch_count, event, x0, y0, x1, y1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::updateGraph(
|
void Scene::updateGraph(
|
||||||
@@ -391,8 +625,11 @@ void Scene::updateGraph(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//create
|
//create
|
||||||
UASSERT(graph_shader_program_ != 0);
|
if(graphVisible_)
|
||||||
graph_ = new GraphDrawable(graph_shader_program_, poses, links);
|
{
|
||||||
|
UASSERT(graph_shader_program_ != 0);
|
||||||
|
graph_ = new GraphDrawable(graph_shader_program_, poses, links);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::setGraphVisible(bool visible)
|
void Scene::setGraphVisible(bool visible)
|
||||||
@@ -400,6 +637,11 @@ void Scene::setGraphVisible(bool visible)
|
|||||||
graphVisible_ = visible;
|
graphVisible_ = visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::setGridVisible(bool visible)
|
||||||
|
{
|
||||||
|
gridVisible_ = visible;
|
||||||
|
}
|
||||||
|
|
||||||
void Scene::setTraceVisible(bool visible)
|
void Scene::setTraceVisible(bool visible)
|
||||||
{
|
{
|
||||||
traceVisible_ = visible;
|
traceVisible_ = visible;
|
||||||
@@ -409,11 +651,10 @@ void Scene::setTraceVisible(bool visible)
|
|||||||
void Scene::addCloud(
|
void Scene::addCloud(
|
||||||
int id,
|
int id,
|
||||||
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
const std::vector<pcl::Vertices> & polygons,
|
const pcl::IndicesPtr & indices,
|
||||||
const rtabmap::Transform & pose,
|
const rtabmap::Transform & pose)
|
||||||
const cv::Mat & image)
|
|
||||||
{
|
{
|
||||||
LOGI("addOrUpdateCloud cloud %d", id);
|
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);
|
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
||||||
if(iter != pointClouds_.end())
|
if(iter != pointClouds_.end())
|
||||||
{
|
{
|
||||||
@@ -422,17 +663,83 @@ void Scene::addCloud(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//create
|
//create
|
||||||
UASSERT(cloud_shader_program_ != 0 && texture_mesh_shader_program_!=0);
|
PointCloudDrawable * drawable = new PointCloudDrawable(cloud, indices);
|
||||||
PointCloudDrawable * drawable = new PointCloudDrawable(
|
|
||||||
cloud_shader_program_,
|
|
||||||
texture_mesh_shader_program_,
|
|
||||||
cloud,
|
|
||||||
polygons,
|
|
||||||
image);
|
|
||||||
drawable->setPose(pose);
|
drawable->setPose(pose);
|
||||||
pointClouds_.insert(std::make_pair(id, drawable));
|
pointClouds_.insert(std::make_pair(id, drawable));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::addMesh(
|
||||||
|
int id,
|
||||||
|
const Mesh & mesh,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
bool createWireframe)
|
||||||
|
{
|
||||||
|
LOGI("add mesh %d", id);
|
||||||
|
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
||||||
|
if(iter != pointClouds_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
pointClouds_.erase(iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
//create
|
||||||
|
PointCloudDrawable * drawable = new PointCloudDrawable(mesh, createWireframe);
|
||||||
|
drawable->setPose(pose);
|
||||||
|
pointClouds_.insert(std::make_pair(id, drawable));
|
||||||
|
|
||||||
|
if(!mesh.pose.isNull() && mesh.cloud->size() && (!mesh.cloud->isOrganized() || mesh.indices->size()))
|
||||||
|
{
|
||||||
|
UTimer time;
|
||||||
|
float height = 0.0f;
|
||||||
|
Eigen::Affine3f affinePose = mesh.pose.toEigen3f();
|
||||||
|
if(mesh.polygons.size())
|
||||||
|
{
|
||||||
|
for(unsigned int i=0; i<mesh.polygons.size(); ++i)
|
||||||
|
{
|
||||||
|
for(unsigned int j=0; j<mesh.polygons[i].vertices.size(); ++j)
|
||||||
|
{
|
||||||
|
pcl::PointXYZRGB pt = pcl::transformPoint(mesh.cloud->at(mesh.polygons[i].vertices[j]), affinePose);
|
||||||
|
if(pt.z < height)
|
||||||
|
{
|
||||||
|
height = pt.z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(mesh.cloud->isOrganized())
|
||||||
|
{
|
||||||
|
for(unsigned int i=0; i<mesh.indices->size(); ++i)
|
||||||
|
{
|
||||||
|
pcl::PointXYZRGB pt = pcl::transformPoint(mesh.cloud->at(mesh.indices->at(i)), affinePose);
|
||||||
|
if(pt.z < height)
|
||||||
|
{
|
||||||
|
height = pt.z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(unsigned int i=0; i<mesh.cloud->size(); ++i)
|
||||||
|
{
|
||||||
|
pcl::PointXYZRGB pt = pcl::transformPoint(mesh.cloud->at(i), affinePose);
|
||||||
|
if(pt.z < height)
|
||||||
|
{
|
||||||
|
height = pt.z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(grid_->GetPosition().y == kHeightOffset.y || grid_->GetPosition().y > height)
|
||||||
|
{
|
||||||
|
grid_->SetPosition(glm::vec3(0,height,0));
|
||||||
|
}
|
||||||
|
LOGD("compute min height %f s", time.ticks());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Scene::setCloudPose(int id, const rtabmap::Transform & pose)
|
void Scene::setCloudPose(int id, const rtabmap::Transform & pose)
|
||||||
{
|
{
|
||||||
@@ -458,7 +765,52 @@ bool Scene::hasCloud(int id) const
|
|||||||
return pointClouds_.find(id) != pointClouds_.end();
|
return pointClouds_.find(id) != pointClouds_.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Scene::hasMesh(int id) const
|
||||||
|
{
|
||||||
|
return pointClouds_.find(id) != pointClouds_.end() && pointClouds_.at(id)->hasMesh();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Scene::hasTexture(int id) const
|
||||||
|
{
|
||||||
|
return pointClouds_.find(id) != pointClouds_.end() && pointClouds_.at(id)->hasTexture();
|
||||||
|
}
|
||||||
|
|
||||||
std::set<int> Scene::getAddedClouds() const
|
std::set<int> Scene::getAddedClouds() const
|
||||||
{
|
{
|
||||||
return uKeysSet(pointClouds_);
|
return uKeysSet(pointClouds_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::updateCloudPolygons(int id, const std::vector<pcl::Vertices> & polygons)
|
||||||
|
{
|
||||||
|
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
||||||
|
if(iter != pointClouds_.end())
|
||||||
|
{
|
||||||
|
iter->second->updatePolygons(polygons);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::updateMesh(int id, const Mesh & mesh)
|
||||||
|
{
|
||||||
|
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
||||||
|
if(iter != pointClouds_.end())
|
||||||
|
{
|
||||||
|
iter->second->updateMesh(mesh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::updateGains(int id, float gainR, float gainG, float gainB)
|
||||||
|
{
|
||||||
|
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
||||||
|
if(iter != pointClouds_.end())
|
||||||
|
{
|
||||||
|
iter->second->setGains(gainR, gainG, gainB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::setGridColor(float r, float g, float b)
|
||||||
|
{
|
||||||
|
if(grid_)
|
||||||
|
{
|
||||||
|
grid_->SetColor(r, g, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
#include <point_cloud_drawable.h>
|
#include <point_cloud_drawable.h>
|
||||||
#include <graph_drawable.h>
|
#include <graph_drawable.h>
|
||||||
|
#include <bounding_box_drawable.h>
|
||||||
|
|
||||||
#include <pcl/point_cloud.h>
|
#include <pcl/point_cloud.h>
|
||||||
#include <pcl/point_types.h>
|
#include <pcl/point_types.h>
|
||||||
@@ -56,6 +57,10 @@ class Scene {
|
|||||||
|
|
||||||
// Setup GL view port.
|
// Setup GL view port.
|
||||||
void SetupViewPort(int w, int h);
|
void SetupViewPort(int w, int h);
|
||||||
|
int getViewPortWidth() const {return screenWidth_;}
|
||||||
|
int getViewPortHeight() const {return screenHeight_;}
|
||||||
|
|
||||||
|
void setScreenRotation(TangoSupportRotation colorCameraToDisplayRotation) {color_camera_to_display_rotation_ = colorCameraToDisplayRotation;}
|
||||||
|
|
||||||
void clear(); // removed all point clouds
|
void clear(); // removed all point clouds
|
||||||
|
|
||||||
@@ -75,7 +80,7 @@ class Scene {
|
|||||||
|
|
||||||
void SetCameraPose(const rtabmap::Transform & pose);
|
void SetCameraPose(const rtabmap::Transform & pose);
|
||||||
rtabmap::Transform GetCameraPose() const {return currentPose_!=0?*currentPose_:rtabmap::Transform();}
|
rtabmap::Transform GetCameraPose() const {return currentPose_!=0?*currentPose_:rtabmap::Transform();}
|
||||||
rtabmap::Transform GetOpenGLCameraPose(float * fov) const;
|
rtabmap::Transform GetOpenGLCameraPose(float * fov = 0) const;
|
||||||
|
|
||||||
// Touch event passed from android activity. This function only support two
|
// Touch event passed from android activity. This function only support two
|
||||||
// touches.
|
// touches.
|
||||||
@@ -94,23 +99,50 @@ class Scene {
|
|||||||
const std::multimap<int, rtabmap::Link> & links);
|
const std::multimap<int, rtabmap::Link> & links);
|
||||||
|
|
||||||
void setGraphVisible(bool visible);
|
void setGraphVisible(bool visible);
|
||||||
|
void setGridVisible(bool visible);
|
||||||
void setTraceVisible(bool visible);
|
void setTraceVisible(bool visible);
|
||||||
|
|
||||||
void addCloud(
|
void addCloud(
|
||||||
int id,
|
int id,
|
||||||
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
const std::vector<pcl::Vertices> & polygons,
|
const pcl::IndicesPtr & indices,
|
||||||
const rtabmap::Transform & pose,
|
const rtabmap::Transform & pose);
|
||||||
const cv::Mat & image = cv::Mat());
|
void addMesh(
|
||||||
|
int id,
|
||||||
|
const Mesh & mesh,
|
||||||
|
const rtabmap::Transform & pose,
|
||||||
|
bool createWireframe = false);
|
||||||
|
|
||||||
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);
|
||||||
bool hasCloud(int id) const;
|
bool hasCloud(int id) const;
|
||||||
|
bool hasMesh(int id) const;
|
||||||
|
bool hasTexture(int id) const;
|
||||||
std::set<int> getAddedClouds() const;
|
std::set<int> getAddedClouds() const;
|
||||||
|
void updateCloudPolygons(int id, const std::vector<pcl::Vertices> & polygons);
|
||||||
|
void updateMesh(int id, const Mesh & mesh);
|
||||||
|
void updateGains(int id, float gainR, float gainG, float gainB);
|
||||||
|
|
||||||
|
void setBlending(bool enabled) {blending_ = enabled;}
|
||||||
void setMapRendering(bool enabled) {mapRendering_ = enabled;}
|
void setMapRendering(bool enabled) {mapRendering_ = enabled;}
|
||||||
void setMeshRendering(bool enabled) {meshRendering_ = enabled;}
|
void setMeshRendering(bool enabled, bool withTexture) {meshRendering_ = enabled; meshRenderingTexture_ = withTexture;}
|
||||||
void setPointSize(float size) {pointSize_ = size;}
|
void setPointSize(float size) {pointSize_ = size;}
|
||||||
|
void setFOV(float angle);
|
||||||
|
void setOrthoCropFactor(float value);
|
||||||
|
void setGridRotation(float angleDeg);
|
||||||
|
void setLighting(bool enabled) {lighting_ = enabled;}
|
||||||
|
void setBackfaceCulling(bool enabled) {backfaceCulling_ = enabled;}
|
||||||
|
void setWireframe(bool enabled) {wireFrame_ = enabled;}
|
||||||
|
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);
|
||||||
|
|
||||||
|
bool isBlending() const {return blending_;}
|
||||||
|
bool isMapRendering() const {return mapRendering_;}
|
||||||
|
bool isMeshRendering() const {return meshRendering_;}
|
||||||
|
bool isMeshTexturing() const {return meshRendering_ && meshRenderingTexture_;}
|
||||||
|
float getPointSize() const {return pointSize_;}
|
||||||
|
bool isLighting() const {return lighting_;}
|
||||||
|
bool isBackfaceCulling() const {return backfaceCulling_;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Camera object that allows user to use touch input to interact with.
|
// Camera object that allows user to use touch input to interact with.
|
||||||
@@ -125,24 +157,43 @@ class Scene {
|
|||||||
// Ground grid.
|
// Ground grid.
|
||||||
tango_gl::Grid* grid_;
|
tango_gl::Grid* grid_;
|
||||||
|
|
||||||
|
// Bounding box
|
||||||
|
BoundingBoxDrawable * box_;
|
||||||
|
|
||||||
// Trace of pose data.
|
// Trace of pose data.
|
||||||
tango_gl::Trace* trace_;
|
tango_gl::Trace* trace_;
|
||||||
GraphDrawable * graph_;
|
GraphDrawable * graph_;
|
||||||
bool graphVisible_;
|
bool graphVisible_;
|
||||||
|
bool gridVisible_;
|
||||||
bool traceVisible_;
|
bool traceVisible_;
|
||||||
|
|
||||||
|
TangoSupportRotation color_camera_to_display_rotation_;
|
||||||
|
|
||||||
std::map<int, PointCloudDrawable*> pointClouds_;
|
std::map<int, PointCloudDrawable*> pointClouds_;
|
||||||
|
|
||||||
rtabmap::Transform * currentPose_;
|
rtabmap::Transform * currentPose_;
|
||||||
|
|
||||||
// Shader to display point cloud.
|
// Shader to display point cloud.
|
||||||
GLuint cloud_shader_program_;
|
|
||||||
GLuint texture_mesh_shader_program_;
|
|
||||||
GLuint graph_shader_program_;
|
GLuint graph_shader_program_;
|
||||||
|
|
||||||
|
bool blending_;
|
||||||
bool mapRendering_;
|
bool mapRendering_;
|
||||||
bool meshRendering_;
|
bool meshRendering_;
|
||||||
|
bool meshRenderingTexture_;
|
||||||
float pointSize_;
|
float pointSize_;
|
||||||
|
bool boundingBoxRendering_;
|
||||||
|
bool lighting_;
|
||||||
|
bool backfaceCulling_;
|
||||||
|
bool wireFrame_;
|
||||||
|
float r_;
|
||||||
|
float g_;
|
||||||
|
float b_;
|
||||||
|
GLuint fboId_;
|
||||||
|
GLuint depthTexture_;
|
||||||
|
GLsizei screenWidth_;
|
||||||
|
GLsizei screenHeight_;
|
||||||
|
bool doubleTapOn_;
|
||||||
|
cv::Point2f doubleTapPos_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TANGO_POINT_CLOUD_SCENE_H_
|
#endif // TANGO_POINT_CLOUD_SCENE_H_
|
||||||
|
|||||||
@@ -22,8 +22,13 @@ namespace tango_gl {
|
|||||||
Camera::Camera() {
|
Camera::Camera() {
|
||||||
field_of_view_ = 45.0f * DEGREE_2_RADIANS;
|
field_of_view_ = 45.0f * DEGREE_2_RADIANS;
|
||||||
aspect_ratio_ = 4.0f / 3.0f;
|
aspect_ratio_ = 4.0f / 3.0f;
|
||||||
near_clip_plane_ = 0.1f;
|
width_ = 800.0f;
|
||||||
far_clip_plane_ = 100.0f;
|
height_ = 600.0f;
|
||||||
|
near_clip_plane_ = 0.2f;
|
||||||
|
far_clip_plane_ = 1000.0f;
|
||||||
|
ortho_ = false;
|
||||||
|
orthoScale_ = 2.0f;
|
||||||
|
orthoCropFactor_ = -1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::mat4 Camera::GetViewMatrix() {
|
glm::mat4 Camera::GetViewMatrix() {
|
||||||
@@ -31,18 +36,29 @@ glm::mat4 Camera::GetViewMatrix() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
glm::mat4 Camera::GetProjectionMatrix() {
|
glm::mat4 Camera::GetProjectionMatrix() {
|
||||||
return glm::perspective(field_of_view_, aspect_ratio_,
|
if(ortho_)
|
||||||
near_clip_plane_, far_clip_plane_);
|
{
|
||||||
|
return glm::ortho(-orthoScale_*aspect_ratio_, orthoScale_*aspect_ratio_, -orthoScale_, orthoScale_, orthoScale_ + orthoCropFactor_, far_clip_plane_);
|
||||||
|
}
|
||||||
|
return glm::perspective(field_of_view_, aspect_ratio_, near_clip_plane_, far_clip_plane_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::SetAspectRatio(float aspect_ratio) {
|
void Camera::SetWindowSize(float width, float height) {
|
||||||
aspect_ratio_ = aspect_ratio;
|
width_ = width;
|
||||||
|
height_ = height;
|
||||||
|
aspect_ratio_ = width/height;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::SetFieldOfView(float fov) {
|
void Camera::SetFieldOfView(float fov) {
|
||||||
field_of_view_ = fov * DEGREE_2_RADIANS;
|
field_of_view_ = fov * DEGREE_2_RADIANS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Camera::SetNearFarClipPlanes(const float near, const float far)
|
||||||
|
{
|
||||||
|
near_clip_plane_ = near;
|
||||||
|
far_clip_plane_ = far;
|
||||||
|
}
|
||||||
|
|
||||||
Camera::~Camera() {
|
Camera::~Camera() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include "tango-gl/gesture_camera.h"
|
#include "tango-gl/gesture_camera.h"
|
||||||
#include "tango-gl/util.h"
|
#include "tango-gl/util.h"
|
||||||
|
#include "glm/gtx/quaternion.hpp"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
// Render camera observation distance in third person camera mode.
|
// Render camera observation distance in third person camera mode.
|
||||||
@@ -30,8 +31,14 @@ const float kTopDownCameraDist = 5.0f;
|
|||||||
// Zoom in speed.
|
// Zoom in speed.
|
||||||
const float kZoomSpeed = 10.0f;
|
const float kZoomSpeed = 10.0f;
|
||||||
|
|
||||||
|
// Move speed
|
||||||
|
const float kMoveSpeed = 10.0f;
|
||||||
|
|
||||||
|
// Rotation speed
|
||||||
|
const float kRotationSpeed = 2.0f;
|
||||||
|
|
||||||
// Min/max clamp value of camera observation distance.
|
// Min/max clamp value of camera observation distance.
|
||||||
const float kCamViewMinDist = 1.0f;
|
const float kCamViewMinDist = .1f;
|
||||||
const float kCamViewMaxDist = 100.f;
|
const float kCamViewMaxDist = 100.f;
|
||||||
|
|
||||||
// FOV set up values.
|
// FOV set up values.
|
||||||
@@ -55,55 +62,83 @@ GestureCamera::GestureCamera() :
|
|||||||
GestureCamera::~GestureCamera() { delete cam_parent_transform_; }
|
GestureCamera::~GestureCamera() { delete cam_parent_transform_; }
|
||||||
|
|
||||||
void GestureCamera::OnTouchEvent(int touch_count, TouchEvent event, float x0,
|
void GestureCamera::OnTouchEvent(int touch_count, TouchEvent event, float x0,
|
||||||
float y0, float x1, float y1) {
|
float y0, float x1, float y1) {
|
||||||
if (camera_type_ == kFirstPerson) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (touch_count == 1) {
|
if (camera_type_!=kFirstPerson && touch_count == 1) {
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case kTouch0Down: {
|
case kTouch0Down: {
|
||||||
cam_start_angle_ = cam_cur_angle_;
|
cam_start_angle_ = cam_cur_angle_;
|
||||||
|
|
||||||
touch0_start_position_.x = x0;
|
touch0_start_position_.x = x0;
|
||||||
touch0_start_position_.y = y0;
|
touch0_start_position_.y = y0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kTouchMove: {
|
case kTouchMove: {
|
||||||
float rotation_x = touch0_start_position_.y - y0;
|
glm::vec2 offset;
|
||||||
float rotation_y = touch0_start_position_.x - x0;
|
|
||||||
|
|
||||||
cam_cur_angle_.x = cam_start_angle_.x + rotation_x;
|
float rotation_x = (touch0_start_position_.y - y0) * kRotationSpeed;
|
||||||
cam_cur_angle_.y = cam_start_angle_.y + rotation_y;
|
float rotation_y = (touch0_start_position_.x - x0) * kRotationSpeed;
|
||||||
StartCameraToCurrentTransform();
|
|
||||||
break;
|
if(camera_type_!=kTopOrtho)
|
||||||
}
|
cam_cur_angle_.x = cam_start_angle_.x + rotation_x;
|
||||||
default: { break; }
|
cam_cur_angle_.y = cam_start_angle_.y + rotation_y;
|
||||||
}
|
|
||||||
}
|
StartCameraToCurrentTransform();
|
||||||
if (touch_count == 2) {
|
|
||||||
switch (event) {
|
break;
|
||||||
case kTouch1Down: {
|
}
|
||||||
float abs_x = x0 - x1;
|
default: { break; }
|
||||||
float abs_y = y0 - y1;
|
}
|
||||||
start_touch_dist_ = std::sqrt(abs_x * abs_x + abs_y * abs_y);
|
}
|
||||||
cam_start_dist_ = GetPosition().z;
|
if (touch_count == 2) {
|
||||||
break;
|
switch (event) {
|
||||||
}
|
case kTouch1Down: {
|
||||||
case kTouchMove: {
|
float abs_x = x0 - x1;
|
||||||
float abs_x = x0 - x1;
|
float abs_y = y0 - y1;
|
||||||
float abs_y = y0 - y1;
|
start_touch_dist_ = std::sqrt(abs_x * abs_x + abs_y * abs_y);
|
||||||
float dist =
|
cam_start_dist_ = GetPosition().z;
|
||||||
start_touch_dist_ - std::sqrt(abs_x * abs_x + abs_y * abs_y);
|
cam_start_fov_ = this->getFOV();
|
||||||
cam_cur_dist_ =
|
|
||||||
tango_gl::util::Clamp(cam_start_dist_ + dist * kZoomSpeed,
|
// center touch
|
||||||
kCamViewMinDist, kCamViewMaxDist);
|
touch0_start_position_.x = (x0+x1)/2.0f;
|
||||||
StartCameraToCurrentTransform();
|
touch0_start_position_.y = (y0+y1)/2.0f;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: { break; }
|
case kTouchMove: {
|
||||||
}
|
float abs_x = x0 - x1;
|
||||||
}
|
float abs_y = y0 - y1;
|
||||||
|
float dist = start_touch_dist_ - std::sqrt(abs_x * abs_x + abs_y * abs_y);
|
||||||
|
|
||||||
|
if(camera_type_ == kFirstPerson)
|
||||||
|
{
|
||||||
|
this->SetFieldOfView(tango_gl::util::Clamp(cam_start_fov_ + dist * kZoomSpeed*10.0f, 45, 90));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cam_cur_dist_ = tango_gl::util::Clamp(cam_start_dist_ + dist * kZoomSpeed,
|
||||||
|
kCamViewMinDist, kCamViewMaxDist);
|
||||||
|
|
||||||
|
this->SetOrthoMode(camera_type_ == kTopOrtho);
|
||||||
|
if(camera_type_ == kTopOrtho)
|
||||||
|
{
|
||||||
|
this->SetOrthoScale(cam_cur_dist_);
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec2 touch_center_position((x0+x1)/2.0f, (y0+y1)/2.0f);
|
||||||
|
glm::vec2 offset;
|
||||||
|
offset.x = (touch_center_position.x - touch0_start_position_.x) * kMoveSpeed;
|
||||||
|
offset.y = (touch_center_position.y - touch0_start_position_.y) * kMoveSpeed;
|
||||||
|
touch0_start_position_ = touch_center_position;
|
||||||
|
|
||||||
|
StartCameraToCurrentTransform();
|
||||||
|
|
||||||
|
anchor_offset_ += glm::rotate(cam_parent_transform_->GetRotation(), glm::vec3(-offset.x, offset.y, 0));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: { break; }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Segment GestureCamera::GetSegmentFromTouch(float normalized_x,
|
Segment GestureCamera::GetSegmentFromTouch(float normalized_x,
|
||||||
@@ -126,7 +161,10 @@ Segment GestureCamera::GetSegmentFromTouch(float normalized_x,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GestureCamera::SetAnchorPosition(const glm::vec3& pos, const glm::quat & rotation) {
|
void GestureCamera::SetAnchorPosition(const glm::vec3& pos, const glm::quat & rotation) {
|
||||||
cam_parent_transform_->SetPosition(pos);
|
// Anchor position
|
||||||
|
cam_parent_transform_->SetPosition(pos+anchor_offset_);
|
||||||
|
|
||||||
|
// Anchor rotation
|
||||||
if(camera_type_ == kThirdPersonFollow)
|
if(camera_type_ == kThirdPersonFollow)
|
||||||
{
|
{
|
||||||
cam_cur_target_rot_ = rotation;
|
cam_cur_target_rot_ = rotation;
|
||||||
@@ -141,10 +179,12 @@ void GestureCamera::SetCameraType(CameraType camera_index) {
|
|||||||
camera_type_ = camera_index;
|
camera_type_ = camera_index;
|
||||||
switch (camera_index) {
|
switch (camera_index) {
|
||||||
case kFirstPerson:
|
case kFirstPerson:
|
||||||
|
SetOrthoMode(false);
|
||||||
SetFieldOfView(kLowFov);
|
SetFieldOfView(kLowFov);
|
||||||
SetPosition(glm::vec3(0.0f, 0.0f, 0.0f));
|
SetPosition(glm::vec3(0.0f, 0.0f, 0.0f));
|
||||||
SetRotation(glm::quat(1.0f, 0.0f, 0.0f, 0.0f));
|
SetRotation(glm::quat(1.0f, 0.0f, 0.0f, 0.0f));
|
||||||
cam_cur_dist_ = 0.0f;
|
cam_cur_dist_ = 0.0f;
|
||||||
|
anchor_offset_ = glm::vec3(0.0f,0.0f,0.0f);
|
||||||
cam_cur_angle_.x = 0.0f;
|
cam_cur_angle_.x = 0.0f;
|
||||||
cam_cur_angle_.y = 0.0f;
|
cam_cur_angle_.y = 0.0f;
|
||||||
cam_cur_target_rot_ = glm::quat(1,0,0,0);
|
cam_cur_target_rot_ = glm::quat(1,0,0,0);
|
||||||
@@ -153,25 +193,42 @@ void GestureCamera::SetCameraType(CameraType camera_index) {
|
|||||||
break;
|
break;
|
||||||
case kThirdPerson:
|
case kThirdPerson:
|
||||||
case kThirdPersonFollow:
|
case kThirdPersonFollow:
|
||||||
SetFieldOfView(kHighFov);
|
SetOrthoMode(false);
|
||||||
|
SetFieldOfView(kHighFov);
|
||||||
SetPosition(glm::vec3(0.0f, 0.0f, 0.0f));
|
SetPosition(glm::vec3(0.0f, 0.0f, 0.0f));
|
||||||
SetRotation(glm::quat(1.0f, 0.0f, 0.0f, 0.0f));
|
SetRotation(glm::quat(1.0f, 0.0f, 0.0f, 0.0f));
|
||||||
cam_cur_dist_ = kThirdPersonFollow?kThirdPersonFollowCameraDist:kThirdPersonCameraDist;
|
cam_cur_dist_ = kThirdPersonFollow?kThirdPersonFollowCameraDist:kThirdPersonCameraDist;
|
||||||
cam_cur_angle_.x = -M_PI / 4.0f;
|
anchor_offset_ = glm::vec3(0.0f,0.0f,0.0f);
|
||||||
|
cam_cur_angle_.x = -M_PI / 6.0f;
|
||||||
cam_cur_angle_.y = kThirdPersonFollow?0:M_PI / 4.0f;
|
cam_cur_angle_.y = kThirdPersonFollow?0:M_PI / 4.0f;
|
||||||
cam_cur_target_rot_ = glm::quat(1,0,0,0);
|
cam_cur_target_rot_ = glm::quat(1,0,0,0);
|
||||||
StartCameraToCurrentTransform();
|
StartCameraToCurrentTransform();
|
||||||
break;
|
break;
|
||||||
case kTopDown:
|
case kTopDown:
|
||||||
SetFieldOfView(kHighFov);
|
|
||||||
SetPosition(glm::vec3(0.0f, 0.0f, 0.0f));
|
SetPosition(glm::vec3(0.0f, 0.0f, 0.0f));
|
||||||
SetRotation(glm::quat(1.0f, 0.0f, 0.0f, 0.0f));
|
SetRotation(glm::quat(1.0f, 0.0f, 0.0f, 0.0f));
|
||||||
|
SetOrthoMode(false);
|
||||||
|
SetFieldOfView(kHighFov);
|
||||||
cam_cur_dist_ = kTopDownCameraDist;
|
cam_cur_dist_ = kTopDownCameraDist;
|
||||||
|
anchor_offset_ = glm::vec3(0.0f,0.0f,0.0f);
|
||||||
cam_cur_angle_.x = -M_PI / 2.0f;
|
cam_cur_angle_.x = -M_PI / 2.0f;
|
||||||
cam_cur_angle_.y = 0.0f;
|
cam_cur_angle_.y = 0.0f;
|
||||||
cam_cur_target_rot_ = glm::quat(1,0,0,0);
|
cam_cur_target_rot_ = glm::quat(1,0,0,0);
|
||||||
StartCameraToCurrentTransform();
|
StartCameraToCurrentTransform();
|
||||||
break;
|
break;
|
||||||
|
case kTopOrtho:
|
||||||
|
SetPosition(glm::vec3(0.0f, 0.0f, 0.0f));
|
||||||
|
SetRotation(glm::quat(1.0f, 0.0f, 0.0f, 0.0f));
|
||||||
|
SetOrthoMode(true);
|
||||||
|
SetOrthoScale(kTopDownCameraDist);
|
||||||
|
SetOrthoCropFactor(-1.0f);
|
||||||
|
cam_cur_dist_ = kTopDownCameraDist;
|
||||||
|
anchor_offset_ = glm::vec3(0.0f,0.0f,0.0f);
|
||||||
|
cam_cur_angle_.x = -M_PI / 2.0f;
|
||||||
|
cam_cur_angle_.y = 0.0f;
|
||||||
|
cam_cur_target_rot_ = glm::quat(1,0,0,0);
|
||||||
|
StartCameraToCurrentTransform();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -179,9 +236,12 @@ void GestureCamera::SetCameraType(CameraType camera_index) {
|
|||||||
|
|
||||||
void GestureCamera::StartCameraToCurrentTransform()
|
void GestureCamera::StartCameraToCurrentTransform()
|
||||||
{
|
{
|
||||||
|
//Anchor rotation
|
||||||
glm::quat parent_cam_rot = glm::rotate(cam_cur_target_rot_, cam_cur_angle_.y, glm::vec3(0, 1, 0));
|
glm::quat parent_cam_rot = glm::rotate(cam_cur_target_rot_, cam_cur_angle_.y, glm::vec3(0, 1, 0));
|
||||||
parent_cam_rot = glm::rotate(parent_cam_rot, cam_cur_angle_.x, glm::vec3(1, 0, 0));
|
parent_cam_rot = glm::rotate(parent_cam_rot, cam_cur_angle_.x, glm::vec3(1, 0, 0));
|
||||||
SetPosition(glm::vec3(0.0f, 0.0f, cam_cur_dist_));
|
|
||||||
cam_parent_transform_->SetRotation(parent_cam_rot);
|
cam_parent_transform_->SetRotation(parent_cam_rot);
|
||||||
|
|
||||||
|
//Camera position
|
||||||
|
SetPosition(glm::vec3(0, 0, cam_cur_dist_));
|
||||||
}
|
}
|
||||||
} // namespace tango_gl
|
} // namespace tango_gl
|
||||||
|
|||||||
@@ -27,11 +27,17 @@ class Camera : public Transform {
|
|||||||
Camera& operator=(const Camera&) = delete;
|
Camera& operator=(const Camera&) = delete;
|
||||||
~Camera();
|
~Camera();
|
||||||
|
|
||||||
void SetAspectRatio(const float aspect_ratio);
|
void SetWindowSize(const float width, const float height);
|
||||||
void SetFieldOfView(const float fov);
|
void SetFieldOfView(const float fov);
|
||||||
|
void SetOrthoMode(bool enabled) {ortho_ = enabled;}
|
||||||
|
void SetOrthoScale(float scale) {orthoScale_ = scale;}
|
||||||
|
void SetOrthoCropFactor(float value) {orthoCropFactor_ = value;}
|
||||||
|
void SetNearFarClipPlanes(const float near, const float far);
|
||||||
|
|
||||||
glm::mat4 GetViewMatrix();
|
glm::mat4 GetViewMatrix();
|
||||||
glm::mat4 GetProjectionMatrix();
|
glm::mat4 GetProjectionMatrix();
|
||||||
|
float getNearClipPlane() const {return near_clip_plane_;}
|
||||||
|
float getFarClipPlane() const {return far_clip_plane_;}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an OpenGL perspective matrix from window size, camera intrinsics, and clip settings.
|
* Create an OpenGL perspective matrix from window size, camera intrinsics, and clip settings.
|
||||||
@@ -52,7 +58,12 @@ class Camera : public Transform {
|
|||||||
protected:
|
protected:
|
||||||
float field_of_view_;
|
float field_of_view_;
|
||||||
float aspect_ratio_;
|
float aspect_ratio_;
|
||||||
|
float width_;
|
||||||
|
float height_;
|
||||||
float near_clip_plane_, far_clip_plane_;
|
float near_clip_plane_, far_clip_plane_;
|
||||||
|
bool ortho_;
|
||||||
|
float orthoScale_;
|
||||||
|
float orthoCropFactor_;
|
||||||
};
|
};
|
||||||
} // namespace tango_gl
|
} // namespace tango_gl
|
||||||
#endif // TANGO_GL_CAMERA_H_
|
#endif // TANGO_GL_CAMERA_H_
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ class GestureCamera : public Camera {
|
|||||||
kFirstPerson = 0,
|
kFirstPerson = 0,
|
||||||
kThirdPersonFollow = 1,
|
kThirdPersonFollow = 1,
|
||||||
kTopDown = 2,
|
kTopDown = 2,
|
||||||
kThirdPerson = 3
|
kTopOrtho = 3,
|
||||||
|
kThirdPerson = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
enum TouchEvent {
|
enum TouchEvent {
|
||||||
@@ -55,6 +56,11 @@ class GestureCamera : public Camera {
|
|||||||
float touch_range);
|
float touch_range);
|
||||||
|
|
||||||
void SetAnchorPosition(const glm::vec3& pos, const glm::quat & rotation);
|
void SetAnchorPosition(const glm::vec3& pos, const glm::quat & rotation);
|
||||||
|
void SetAnchorOffset(const glm::vec3& pos) {anchor_offset_ = pos;}
|
||||||
|
const glm::vec3& GetAnchorOffset() const {return anchor_offset_;}
|
||||||
|
|
||||||
|
void SetCameraDistance(float cameraDistance) {cam_cur_dist_ = cameraDistance;}
|
||||||
|
float GetCameraDistance() const {return cam_cur_dist_;}
|
||||||
|
|
||||||
// Set camera type, set render camera's parent position and rotation.
|
// Set camera type, set render camera's parent position and rotation.
|
||||||
void SetCameraType(CameraType camera_index);
|
void SetCameraType(CameraType camera_index);
|
||||||
@@ -75,7 +81,9 @@ class GestureCamera : public Camera {
|
|||||||
glm::quat cam_cur_target_rot_;
|
glm::quat cam_cur_target_rot_;
|
||||||
|
|
||||||
float cam_start_dist_;
|
float cam_start_dist_;
|
||||||
|
float cam_start_fov_;
|
||||||
float cam_cur_dist_;
|
float cam_cur_dist_;
|
||||||
|
glm::vec3 anchor_offset_;
|
||||||
|
|
||||||
float start_touch_dist_;
|
float start_touch_dist_;
|
||||||
float cur_touch_dist_;
|
float cur_touch_dist_;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include <android/log.h>
|
#include <android/log.h>
|
||||||
#include <GLES2/gl2.h>
|
#include <GLES2/gl2.h>
|
||||||
#include <GLES2/gl2ext.h>
|
#include <GLES2/gl2ext.h>
|
||||||
|
#include <tango_support_api.h>
|
||||||
|
|
||||||
#include "glm/glm.hpp"
|
#include "glm/glm.hpp"
|
||||||
#include "glm/gtc/matrix_transform.hpp"
|
#include "glm/gtc/matrix_transform.hpp"
|
||||||
@@ -33,9 +34,15 @@
|
|||||||
#include "glm/gtx/matrix_decompose.hpp"
|
#include "glm/gtx/matrix_decompose.hpp"
|
||||||
|
|
||||||
#define LOG_TAG "rtabmap"
|
#define LOG_TAG "rtabmap"
|
||||||
|
#ifdef DISABLE_LOG
|
||||||
|
#define LOGD(...) ;
|
||||||
|
#define LOGI(...) ;
|
||||||
|
#define LOGW(...) ;
|
||||||
|
#else
|
||||||
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
|
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
|
||||||
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
|
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
|
||||||
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
|
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
|
||||||
|
#endif
|
||||||
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
|
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
|
||||||
|
|
||||||
#ifndef M_PI
|
#ifndef M_PI
|
||||||
@@ -76,6 +83,33 @@ namespace util {
|
|||||||
const glm::vec3& start, const glm::vec3& end);
|
const glm::vec3& start, const glm::vec3& end);
|
||||||
|
|
||||||
glm::vec3 ApplyTransform(const glm::mat4& mat, const glm::vec3& vec);
|
glm::vec3 ApplyTransform(const glm::mat4& mat, const glm::vec3& vec);
|
||||||
|
|
||||||
|
// Get the Android rotation integer value from color camera to display.
|
||||||
|
// This function is used to compute the orientation difference to handle
|
||||||
|
// the portrait and landscape mode for color camera display.
|
||||||
|
//
|
||||||
|
// @param display: integer value of display orientation, values available
|
||||||
|
// are 0, 1, 2 ,3. Followed by Android display orientation standard:
|
||||||
|
// https://developer.android.com/reference/android/view/Display.html#getRotation()
|
||||||
|
// @param color_camera: integer value of color camera oreintation, values
|
||||||
|
// available are 0, 90, 180, 270. Followed by Android camera orientation
|
||||||
|
// standard:
|
||||||
|
// https://developer.android.com/reference/android/hardware/Camera.CameraInfo.html#orientation
|
||||||
|
TangoSupportRotation GetAndroidRotationFromColorCameraToDisplay(
|
||||||
|
int display_rotation, int color_camera_rotation);
|
||||||
|
|
||||||
|
// Get the Android rotation integer value from color camera to display.
|
||||||
|
// This function is used to compute the orientation difference to handle
|
||||||
|
// the portrait and landscape mode for color camera display.
|
||||||
|
//
|
||||||
|
// @param display: the device display orientation.
|
||||||
|
// @param color_camera: integer value of color camera oreintation, values
|
||||||
|
// available are 0, 90, 180, 270. Followed by Android camera orientation
|
||||||
|
// standard:
|
||||||
|
// https://developer.android.com/reference/android/hardware/Camera.CameraInfo.html#orientation
|
||||||
|
TangoSupportRotation GetAndroidRotationFromColorCameraToDisplay(
|
||||||
|
TangoSupportRotation display_rotation, int color_camera_rotation);
|
||||||
|
|
||||||
} // namespace util
|
} // namespace util
|
||||||
} // namespace tango_gl
|
} // namespace tango_gl
|
||||||
#endif // TANGO_GL_RENDERER_GL_UTIL
|
#endif // TANGO_GL_RENDERER_GL_UTIL
|
||||||
|
|||||||
@@ -19,6 +19,27 @@
|
|||||||
|
|
||||||
namespace tango_gl {
|
namespace tango_gl {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int NormalizedColorCameraRotation(int camera_rotation) {
|
||||||
|
int camera_n = 0;
|
||||||
|
switch (camera_rotation) {
|
||||||
|
case 90:
|
||||||
|
camera_n = 1;
|
||||||
|
break;
|
||||||
|
case 180:
|
||||||
|
camera_n = 2;
|
||||||
|
break;
|
||||||
|
case 270:
|
||||||
|
camera_n = 3;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
camera_n = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return camera_n;
|
||||||
|
}
|
||||||
|
} // annonymous namespace
|
||||||
|
|
||||||
void util::CheckGlError(const char* operation) {
|
void util::CheckGlError(const char* operation) {
|
||||||
for (GLint error = glGetError(); error; error = glGetError()) {
|
for (GLint error = glGetError(); error; error = glGetError()) {
|
||||||
LOGE("after %s() glError (0x%x)\n", operation, error);
|
LOGE("after %s() glError (0x%x)\n", operation, error);
|
||||||
@@ -217,4 +238,23 @@ glm::vec3 util::ApplyTransform(const glm::mat4& mat, const glm::vec3& vec) {
|
|||||||
return glm::vec3(mat * glm::vec4(vec, 1.0f));
|
return glm::vec3(mat * glm::vec4(vec, 1.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TangoSupportRotation util::GetAndroidRotationFromColorCameraToDisplay(
|
||||||
|
int display_rotation, int color_camera_rotation) {
|
||||||
|
TangoSupportRotation r =
|
||||||
|
static_cast<TangoSupportRotation>(display_rotation);
|
||||||
|
return util::GetAndroidRotationFromColorCameraToDisplay(
|
||||||
|
r, color_camera_rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
TangoSupportRotation util::GetAndroidRotationFromColorCameraToDisplay(
|
||||||
|
TangoSupportRotation display_rotation, int color_camera_rotation) {
|
||||||
|
int color_camera_n = NormalizedColorCameraRotation(color_camera_rotation);
|
||||||
|
|
||||||
|
int ret = static_cast<int>(display_rotation) - color_camera_n;
|
||||||
|
if (ret < 0) {
|
||||||
|
ret += 4;
|
||||||
|
}
|
||||||
|
return static_cast<TangoSupportRotation>(ret % 4);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace tango_gl
|
} // namespace tango_gl
|
||||||
|
|||||||
1
app/android/jni/third-party/lib/.gitignore
vendored
Normal file
1
app/android/jni/third-party/lib/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -32,17 +32,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <android/log.h>
|
#include <android/log.h>
|
||||||
#include <rtabmap/utilite/UEventsHandler.h>
|
#include <rtabmap/utilite/UEventsHandler.h>
|
||||||
#include <rtabmap/utilite/ULogger.h>
|
#include <rtabmap/utilite/ULogger.h>
|
||||||
|
#include <rtabmap/core/CameraModel.h>
|
||||||
#include <tango-gl/util.h>
|
#include <tango-gl/util.h>
|
||||||
|
#include <pcl/point_cloud.h>
|
||||||
|
#include <pcl/point_types.h>
|
||||||
|
#include <pcl/Vertices.h>
|
||||||
|
#include <pcl/pcl_base.h>
|
||||||
|
|
||||||
class LogHandler : public UEventsHandler
|
class LogHandler : public UEventsHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LogHandler()
|
LogHandler()
|
||||||
{
|
{
|
||||||
|
ULogger::setLevel(ULogger::kDebug);
|
||||||
|
ULogger::setEventLevel(ULogger::kDebug);
|
||||||
|
ULogger::setPrintThreadId(true);
|
||||||
|
|
||||||
registerToEventsManager();
|
registerToEventsManager();
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
virtual void handleEvent(UEvent * event)
|
virtual bool handleEvent(UEvent * event)
|
||||||
{
|
{
|
||||||
if(event->getClassName().compare("ULogEvent") == 0)
|
if(event->getClassName().compare("ULogEvent") == 0)
|
||||||
{
|
{
|
||||||
@@ -65,25 +74,31 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const rtabmap::Transform opengl_world_T_tango_world(
|
static const rtabmap::Transform opengl_world_T_tango_world(
|
||||||
1.0f, 0.0f, 0.0f, 0.0f,
|
1.0f, 0.0f, 0.0f, 0.0f,
|
||||||
0.0f, 0.0f, 1.0f, 0.0f,
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
0.0f, -1.0f, 0.0f, 0.0f);
|
0.0f, -1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
static const rtabmap::Transform depth_camera_T_opengl_camera(
|
static const rtabmap::Transform rtabmap_world_T_tango_world(
|
||||||
1.0f, 0.0f, 0.0f, 0.0f,
|
0.0f, 1.0f, 0.0f, 0.0f,
|
||||||
0.0f, -1.0f, 0.0f, 0.0f,
|
-1.0f, 0.0f, 0.0f, 0.0f,
|
||||||
0.0f, 0.0f, -1.0f, 0.0f);
|
0.0f, 0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
|
static const rtabmap::Transform tango_device_T_rtabmap_device(
|
||||||
|
0.0f, -1.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
-1.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
static const rtabmap::Transform opengl_world_T_rtabmap_world(
|
static const rtabmap::Transform opengl_world_T_rtabmap_world(
|
||||||
0.0f, -1.0f, 0.0f, 0.0f,
|
0.0f, -1.0f, 0.0f, 0.0f,
|
||||||
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);
|
||||||
|
|
||||||
static const rtabmap::Transform rtabmap_world_T_opengl_world(
|
static const rtabmap::Transform rtabmap_device_T_opengl_device(
|
||||||
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,
|
||||||
0.0f, 1.0f, 0.0f, 0.0f);
|
0.0f, 1.0f, 0.0f, 0.0f);
|
||||||
@@ -129,4 +144,33 @@ inline rtabmap::Transform glmToTransform(const glm::mat4 & mat)
|
|||||||
return transform;
|
return transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Mesh
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Mesh() :
|
||||||
|
cloud(new pcl::PointCloud<pcl::PointXYZRGB>),
|
||||||
|
normals(new pcl::PointCloud<pcl::Normal>),
|
||||||
|
indices(new std::vector<int>),
|
||||||
|
visible(true)
|
||||||
|
{
|
||||||
|
gains[0] = gains[1] = gains[2] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud; // organized cloud
|
||||||
|
pcl::PointCloud<pcl::Normal>::Ptr normals;
|
||||||
|
pcl::IndicesPtr indices;
|
||||||
|
std::vector<pcl::Vertices> polygons;
|
||||||
|
std::vector<pcl::Vertices> polygonsLowRes;
|
||||||
|
rtabmap::Transform pose; // in rtabmap coordinates
|
||||||
|
bool visible;
|
||||||
|
rtabmap::CameraModel cameraModel;
|
||||||
|
double gains[3]; // RGB gains
|
||||||
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
|
std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > texCoords;
|
||||||
|
#else
|
||||||
|
std::vector<Eigen::Vector2f> texCoords;
|
||||||
|
#endif
|
||||||
|
cv::Mat texture;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* UTIL_H_ */
|
#endif /* UTIL_H_ */
|
||||||
|
|||||||
BIN
app/android/libs/android-support-v4.jar
Normal file
BIN
app/android/libs/android-support-v4.jar
Normal file
Binary file not shown.
BIN
app/android/libs/httpclient-4.2.1.jar
Normal file
BIN
app/android/libs/httpclient-4.2.1.jar
Normal file
Binary file not shown.
12
app/android/res/drawable/custom_seekbar.xml
Normal file
12
app/android/res/drawable/custom_seekbar.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||||
|
<item>
|
||||||
|
<shape>
|
||||||
|
<gradient
|
||||||
|
android:endColor="#00ffffff"
|
||||||
|
android:startColor="#ff686868"
|
||||||
|
android:useLevel="false" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
</layer-list>
|
||||||
@@ -15,244 +15,130 @@
|
|||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content" >
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
<android.opengl.GLSurfaceView
|
<android.opengl.GLSurfaceView
|
||||||
android:id="@+id/gl_surface_view"
|
android:id="@+id/gl_surface_view"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="fill_parent"
|
android:layout_height="fill_parent"
|
||||||
android:layout_gravity="top" />
|
android:layout_gravity="top"/>
|
||||||
|
|
||||||
<LinearLayout
|
<RelativeLayout
|
||||||
android:id="@+id/debug_layout"
|
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:layout_alignParentLeft="true"
|
android:fitsSystemWindows="true">
|
||||||
android:layout_alignParentTop="true"
|
|
||||||
android:orientation="vertical"
|
<ToggleButton
|
||||||
android:paddingLeft="5dp" >
|
android:id="@+id/wireframe_button"
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/status" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/status"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/nodes" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/nodes"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/words" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/words"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/memory" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/memory"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/db_size" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/db_size"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/points" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/points"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/polygons" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/polygons"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/update_time" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/update_time"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/features" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/features"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/total_loop" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/total_loop"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/inliers" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/inliers"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/hypothesis" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/hypothesis"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/first_person_button"
|
|
||||||
android:layout_width="100dp"
|
android:layout_width="100dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_above="@+id/third_person_button"
|
android:layout_above="@+id/light_button"
|
||||||
android:layout_alignLeft="@+id/third_person_button"
|
android:layout_alignLeft="@+id/light_button"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:layout_marginBottom="5dp"
|
android:layout_marginBottom="5dp"
|
||||||
android:layout_marginRight="5dp"
|
android:layout_marginRight="5dp"
|
||||||
android:paddingRight="5dp"
|
android:paddingRight="5dp"
|
||||||
android:text="@string/first_person" />
|
android:textOff="@string/wireframe"
|
||||||
|
android:textOn="@string/wireframe" />
|
||||||
<Button
|
|
||||||
android:id="@+id/top_down_button"
|
<ToggleButton
|
||||||
|
android:id="@+id/light_button"
|
||||||
android:layout_width="100dp"
|
android:layout_width="100dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_above="@+id/backface_button"
|
||||||
|
android:layout_alignLeft="@+id/backface_button"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_marginBottom="5dp"
|
||||||
|
android:layout_marginRight="5dp"
|
||||||
|
android:paddingRight="5dp"
|
||||||
|
android:textOff="@string/light_off"
|
||||||
|
android:textOn="@string/light_on" />
|
||||||
|
|
||||||
|
<ToggleButton
|
||||||
|
android:id="@+id/backface_button"
|
||||||
|
android:layout_width="100dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_above="@+id/camera_button"
|
||||||
|
android:layout_alignRight="@+id/camera_button"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_marginBottom="15dp"
|
||||||
|
android:layout_marginRight="5dp"
|
||||||
|
android:paddingRight="5dp"
|
||||||
|
android:textOff="@string/backface_off"
|
||||||
|
android:textOn="@string/backface_on" />
|
||||||
|
|
||||||
|
<com.introlab.rtabmap.NDSpinner
|
||||||
|
android:id="@+id/camera_button"
|
||||||
|
android:layout_width="140dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
android:layout_alignParentBottom="true"
|
android:layout_alignParentBottom="true"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:layout_marginRight="5dp"
|
android:layout_marginRight="5dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
android:paddingRight="5dp"
|
android:paddingRight="5dp"
|
||||||
android:text="@string/top_down" />
|
android:paddingBottom="10dp"
|
||||||
|
android:text="@string/camera_button"
|
||||||
|
android:spinnerMode="dropdown"/>
|
||||||
|
|
||||||
<Button
|
<ToggleButton
|
||||||
android:id="@+id/third_person_button"
|
android:id="@+id/pause_button"
|
||||||
android:layout_width="100dp"
|
android:layout_width="100dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_above="@+id/top_down_button"
|
android:layout_marginRight="5dp"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:layout_marginBottom="5dp"
|
android:textOff="@string/pause"
|
||||||
android:layout_marginRight="5dp"
|
android:textOn="@string/resume" />
|
||||||
android:paddingRight="5dp"
|
|
||||||
android:text="@string/third_person" />
|
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button_shareToSketchfab"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginRight="5dp"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_below="@+id/pause_button"
|
||||||
|
android:text="@string/share_to_sketchfab" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button_saveOnDevice"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignRight="@+id/button_shareToSketchfab"
|
||||||
|
android:layout_below="@+id/button_shareToSketchfab"
|
||||||
|
android:text="@string/save_to_file" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/close_visualization_button"
|
||||||
|
android:layout_width="200dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_above="@+id/camera_button"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:text="@string/close_visualization" />
|
||||||
|
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/seekBar_ortho_cut"
|
||||||
|
android:layout_width="200dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:rotation="270"
|
||||||
|
android:layout_above="@+id/light_button"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginLeft="-50dp"
|
||||||
|
android:progressDrawable="@drawable/custom_seekbar" />
|
||||||
|
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/seekBar_grid"
|
||||||
|
android:layout_width="200dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignBottom="@+id/camera_button"
|
||||||
|
android:layout_marginLeft="35dp"
|
||||||
|
android:paddingBottom="10dp"
|
||||||
|
android:progressDrawable="@drawable/custom_seekbar" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
348
app/android/res/layout/activity_settings.xml
Normal file
348
app/android/res/layout/activity_settings.xml
Normal file
@@ -0,0 +1,348 @@
|
|||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/pref_title_rendering">
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_density"
|
||||||
|
android:title="@string/pref_title_density"
|
||||||
|
android:summary="@string/pref_summary_density"
|
||||||
|
android:entries="@array/pref_density_keys"
|
||||||
|
android:entryValues="@array/pref_density_values"
|
||||||
|
android:defaultValue="@string/pref_default_density"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_depth"
|
||||||
|
android:title="@string/pref_title_depth"
|
||||||
|
android:summary="@string/pref_summary_depth"
|
||||||
|
android:entries="@array/pref_depth_keys"
|
||||||
|
android:entryValues="@array/pref_depth_values"
|
||||||
|
android:defaultValue="@string/pref_default_depth"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_min_depth"
|
||||||
|
android:title="@string/pref_title_min_depth"
|
||||||
|
android:summary="@string/pref_summary_min_depth"
|
||||||
|
android:entries="@array/pref_min_depth_keys"
|
||||||
|
android:entryValues="@array/pref_min_depth_values"
|
||||||
|
android:defaultValue="@string/pref_default_min_depth"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_point_size"
|
||||||
|
android:title="@string/pref_title_point_size"
|
||||||
|
android:summary="@string/pref_summary_point_size"
|
||||||
|
android:entries="@array/pref_point_size_values"
|
||||||
|
android:entryValues="@array/pref_point_size_values"
|
||||||
|
android:defaultValue="@string/pref_default_point_size"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_angle"
|
||||||
|
android:title="@string/pref_title_angle"
|
||||||
|
android:summary="@string/pref_summary_angle"
|
||||||
|
android:entries="@array/pref_angle_keys"
|
||||||
|
android:entryValues="@array/pref_angle_values"
|
||||||
|
android:defaultValue="@string/pref_default_angle"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_triangle"
|
||||||
|
android:title="@string/pref_title_triangle"
|
||||||
|
android:summary="@string/pref_summary_triangle"
|
||||||
|
android:entries="@array/pref_triangle_keys"
|
||||||
|
android:entryValues="@array/pref_triangle_values"
|
||||||
|
android:defaultValue="@string/pref_default_triangle"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_rendering_texture_decimation"
|
||||||
|
android:title="@string/pref_title_rendering_texture_decimation"
|
||||||
|
android:summary="@string/pref_summary_rendering_texture_decimation"
|
||||||
|
android:entries="@array/pref_rendering_texture_decimation_keys"
|
||||||
|
android:entryValues="@array/pref_rendering_texture_decimation_values"
|
||||||
|
android:defaultValue="@string/pref_default_rendering_texture_decimation"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_background_color"
|
||||||
|
android:title="@string/pref_title_background_color"
|
||||||
|
android:summary="@string/pref_summary_background_color"
|
||||||
|
android:entries="@array/pref_background_color_keys"
|
||||||
|
android:entryValues="@array/pref_background_color_values"
|
||||||
|
android:defaultValue="@string/pref_default_background_color"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_blending"
|
||||||
|
android:title="@string/pref_title_blending"
|
||||||
|
android:summary="@string/pref_summary_blending"
|
||||||
|
android:defaultValue="@string/pref_default_blending"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_nodes_filtering"
|
||||||
|
android:title="@string/pref_title_nodes_filtering"
|
||||||
|
android:summary="@string/pref_summary_nodes_filtering"
|
||||||
|
android:defaultValue="@string/pref_default_nodes_filtering"/>
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/pref_title_general">
|
||||||
|
|
||||||
|
<PreferenceScreen
|
||||||
|
android:key="pref_button_mapping"
|
||||||
|
android:title="@string/pref_title_mapping_sub"
|
||||||
|
android:summary="@string/pref_summary_mapping"
|
||||||
|
android:persistent="false">
|
||||||
|
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_append"
|
||||||
|
android:title="@string/pref_title_append"
|
||||||
|
android:summary="@string/pref_summary_append"
|
||||||
|
android:defaultValue="@string/pref_default_append"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_resolution"
|
||||||
|
android:title="@string/pref_title_resolution"
|
||||||
|
android:summary="@string/pref_summary_resolution"
|
||||||
|
android:defaultValue="@string/pref_default_resolution"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_smoothing"
|
||||||
|
android:title="@string/pref_title_smoothing"
|
||||||
|
android:summary="@string/pref_summary_smoothing"
|
||||||
|
android:defaultValue="@string/pref_default_smoothing"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_fisheye"
|
||||||
|
android:title="@string/pref_title_fisheye"
|
||||||
|
android:summary="@string/pref_summary_fisheye"
|
||||||
|
android:defaultValue="@string/pref_default_fisheye"/>
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/pref_title_mapping_core">
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_update_rate"
|
||||||
|
android:title="@string/pref_title_update_rate"
|
||||||
|
android:summary="@string/pref_summary_update_rate"
|
||||||
|
android:entries="@array/pref_update_rate_keys"
|
||||||
|
android:entryValues="@array/pref_update_rate_values"
|
||||||
|
android:defaultValue="@string/pref_default_update_rate"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_max_speed"
|
||||||
|
android:title="@string/pref_title_max_speed"
|
||||||
|
android:summary="@string/pref_summary_max_speed"
|
||||||
|
android:entries="@array/pref_max_speed_keys"
|
||||||
|
android:entryValues="@array/pref_max_speed_values"
|
||||||
|
android:defaultValue="@string/pref_default_max_speed"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_time_thr"
|
||||||
|
android:title="@string/pref_title_time_thr"
|
||||||
|
android:summary="@string/pref_summary_time_thr"
|
||||||
|
android:entries="@array/pref_time_thr_keys"
|
||||||
|
android:entryValues="@array/pref_time_thr_values"
|
||||||
|
android:defaultValue="@string/pref_default_time_thr"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_mem_thr"
|
||||||
|
android:title="@string/pref_title_mem_thr"
|
||||||
|
android:summary="@string/pref_summary_mem_thr"
|
||||||
|
android:entries="@array/pref_mem_thr_keys"
|
||||||
|
android:entryValues="@array/pref_mem_thr_values"
|
||||||
|
android:defaultValue="@string/pref_default_mem_thr"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_loop_thr"
|
||||||
|
android:title="@string/pref_title_loop_thr"
|
||||||
|
android:summary="@string/pref_summary_loop_thr"
|
||||||
|
android:entries="@array/pref_loop_thr_keys"
|
||||||
|
android:entryValues="@array/pref_loop_thr_values"
|
||||||
|
android:defaultValue="@string/pref_default_loop_thr"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_sim_thr"
|
||||||
|
android:title="@string/pref_title_sim_thr"
|
||||||
|
android:summary="@string/pref_summary_sim_thr"
|
||||||
|
android:entries="@array/pref_sim_thr_keys"
|
||||||
|
android:entryValues="@array/pref_sim_thr_values"
|
||||||
|
android:defaultValue="@string/pref_default_sim_thr"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_min_inliers"
|
||||||
|
android:title="@string/pref_title_min_inliers"
|
||||||
|
android:summary="@string/pref_summary_min_inliers"
|
||||||
|
android:entries="@array/pref_min_inliers_keys"
|
||||||
|
android:entryValues="@array/pref_min_inliers_values"
|
||||||
|
android:defaultValue="@string/pref_default_min_inliers"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_opt_error"
|
||||||
|
android:title="@string/pref_title_opt_error"
|
||||||
|
android:summary="@string/pref_summary_opt_error"
|
||||||
|
android:entries="@array/pref_opt_error_keys"
|
||||||
|
android:entryValues="@array/pref_opt_error_values"
|
||||||
|
android:defaultValue="@string/pref_default_opt_error"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_features_voc"
|
||||||
|
android:title="@string/pref_title_features_voc"
|
||||||
|
android:summary="@string/pref_summary_features_voc"
|
||||||
|
android:entries="@array/pref_features_voc_keys"
|
||||||
|
android:entryValues="@array/pref_features_voc_values"
|
||||||
|
android:defaultValue="@string/pref_default_features_voc"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_features"
|
||||||
|
android:title="@string/pref_title_features"
|
||||||
|
android:summary="@string/pref_summary_features"
|
||||||
|
android:entries="@array/pref_features_keys"
|
||||||
|
android:entryValues="@array/pref_features_values"
|
||||||
|
android:defaultValue="@string/pref_default_features"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_features_type"
|
||||||
|
android:title="@string/pref_title_features_type"
|
||||||
|
android:summary="@string/pref_summary_features_type"
|
||||||
|
android:entries="@array/pref_features_type_keys"
|
||||||
|
android:entryValues="@array/pref_features_type_values"
|
||||||
|
android:defaultValue="@string/pref_default_features_type"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_optimizer"
|
||||||
|
android:title="@string/pref_title_optimizer"
|
||||||
|
android:summary="@string/pref_summary_optimizer"
|
||||||
|
android:entries="@array/pref_optimizer_keys"
|
||||||
|
android:entryValues="@array/pref_optimizer_values"
|
||||||
|
android:defaultValue="@string/pref_default_optimizer"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_optimize_end"
|
||||||
|
android:title="@string/pref_title_optimize_end"
|
||||||
|
android:summary="@string/pref_summary_optimize_end"
|
||||||
|
android:defaultValue="@string/pref_default_optimize_end"/>
|
||||||
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/pref_title_mapping_database">
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_keep_all_db"
|
||||||
|
android:title="@string/pref_title_keep_all_db"
|
||||||
|
android:summary="@string/pref_summary_keep_all_db"
|
||||||
|
android:defaultValue="@string/pref_default_keep_all_db"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_raw_scan_saved"
|
||||||
|
android:title="@string/pref_title_raw_scan_saved"
|
||||||
|
android:summary="@string/pref_summary_raw_scan_saved"
|
||||||
|
android:defaultValue="@string/pref_default_raw_scan_saved"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_gps_saved"
|
||||||
|
android:title="@string/pref_title_gps_saved"
|
||||||
|
android:summary="@string/pref_summary_gps_saved"
|
||||||
|
android:defaultValue="@string/pref_default_gps_saved"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_db_in_memory"
|
||||||
|
android:title="@string/pref_title_db_in_memory"
|
||||||
|
android:summary="@string/pref_summary_db_in_memory"
|
||||||
|
android:defaultValue="@string/pref_default_db_in_memory"/>
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
||||||
|
|
||||||
|
<PreferenceScreen
|
||||||
|
android:key="pref_button_export"
|
||||||
|
android:title="@string/pref_title_export_sub"
|
||||||
|
android:summary="@string/pref_summary_export"
|
||||||
|
android:persistent="false">
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_cloud_voxel"
|
||||||
|
android:title="@string/pref_title_cloud_voxel"
|
||||||
|
android:summary="@string/pref_summary_cloud_voxel"
|
||||||
|
android:entries="@array/pref_cloud_voxel_keys"
|
||||||
|
android:entryValues="@array/pref_cloud_voxel_values"
|
||||||
|
android:defaultValue="@string/pref_default_cloud_voxel"/>
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_texture_size"
|
||||||
|
android:title="@string/pref_title_texture_size"
|
||||||
|
android:summary="@string/pref_summary_texture_size"
|
||||||
|
android:entries="@array/pref_texture_size_keys"
|
||||||
|
android:entryValues="@array/pref_texture_size_values"
|
||||||
|
android:defaultValue="@string/pref_default_texture_size"/>
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_texture_count"
|
||||||
|
android:title="@string/pref_title_texture_count"
|
||||||
|
android:summary="@string/pref_summary_texture_count"
|
||||||
|
android:entries="@array/pref_texture_count_keys"
|
||||||
|
android:entryValues="@array/pref_texture_count_values"
|
||||||
|
android:defaultValue="@string/pref_default_texture_count"/>
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_normal_k"
|
||||||
|
android:title="@string/pref_title_normal_k"
|
||||||
|
android:summary="@string/pref_summary_normal_k"
|
||||||
|
android:entries="@array/pref_normal_k_values"
|
||||||
|
android:entryValues="@array/pref_normal_k_values"
|
||||||
|
android:defaultValue="@string/pref_default_normal_k"/>
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_max_texture_distance"
|
||||||
|
android:title="@string/pref_title_max_texture_distance"
|
||||||
|
android:summary="@string/pref_summary_max_texture_distance"
|
||||||
|
android:entries="@array/pref_max_texture_distance_keys"
|
||||||
|
android:entryValues="@array/pref_max_texture_distance_values"
|
||||||
|
android:defaultValue="@string/pref_default_max_texture_distance"/>
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_min_texture_cluster_size"
|
||||||
|
android:title="@string/pref_title_min_texture_cluster_size"
|
||||||
|
android:summary="@string/pref_summary_min_texture_cluster_size"
|
||||||
|
android:entries="@array/pref_min_texture_cluster_size_keys"
|
||||||
|
android:entryValues="@array/pref_min_texture_cluster_size_values"
|
||||||
|
android:defaultValue="@string/pref_default_min_texture_cluster_size"/>
|
||||||
|
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_block_render"
|
||||||
|
android:title="@string/pref_title_block_render"
|
||||||
|
android:summary="@string/pref_summary_block_render"
|
||||||
|
android:defaultValue="@string/pref_default_block_render"/>
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/pref_title_optimized">
|
||||||
|
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_opt_depth"
|
||||||
|
android:title="@string/pref_title_opt_depth"
|
||||||
|
android:summary="@string/pref_summary_opt_depth"
|
||||||
|
android:entries="@array/pref_opt_depth_keys"
|
||||||
|
android:entryValues="@array/pref_opt_depth_values"
|
||||||
|
android:defaultValue="@string/pref_default_opt_depth"/>
|
||||||
|
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_opt_color_radius"
|
||||||
|
android:title="@string/pref_title_opt_color_radius"
|
||||||
|
android:summary="@string/pref_summary_opt_color_radius"
|
||||||
|
android:entries="@array/pref_opt_color_radius_keys"
|
||||||
|
android:entryValues="@array/pref_opt_color_radius_values"
|
||||||
|
android:defaultValue="@string/pref_default_opt_color_radius"/>
|
||||||
|
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_opt_clean_white"
|
||||||
|
android:title="@string/pref_title_opt_clean_white"
|
||||||
|
android:summary="@string/pref_summary_opt_clean_white"
|
||||||
|
android:defaultValue="@string/pref_default_opt_clean_white"/>
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_opt_min_cluster_size"
|
||||||
|
android:title="@string/pref_title_opt_min_cluster_size"
|
||||||
|
android:summary="@string/pref_summary_opt_min_cluster_size"
|
||||||
|
android:entries="@array/pref_opt_min_cluster_size_keys"
|
||||||
|
android:entryValues="@array/pref_opt_min_cluster_size_values"
|
||||||
|
android:defaultValue="@string/pref_default_opt_min_cluster_size"/>
|
||||||
|
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_gain_max_radius"
|
||||||
|
android:title="@string/pref_title_gain_max_radius"
|
||||||
|
android:summary="@string/pref_summary_gain_max_radius"
|
||||||
|
android:entries="@array/pref_gain_max_radius_keys"
|
||||||
|
android:entryValues="@array/pref_gain_max_radius_values"
|
||||||
|
android:defaultValue="@string/pref_default_gain_max_radius"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_cluster_ratio"
|
||||||
|
android:title="@string/pref_title_cluster_ratio"
|
||||||
|
android:summary="@string/pref_summary_cluster_ratio"
|
||||||
|
android:entries="@array/pref_cluster_ratio_keys"
|
||||||
|
android:entryValues="@array/pref_cluster_ratio_values"
|
||||||
|
android:defaultValue="@string/pref_default_cluster_ratio"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
|
android:key="@string/pref_key_notification_sound"
|
||||||
|
android:title="@string/pref_title_notification_sound"
|
||||||
|
android:summary="@string/pref_summary_notification_sound"
|
||||||
|
android:defaultValue="@string/pref_default_notification_sound"/>
|
||||||
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/pref_title_presets">
|
||||||
|
<Preference android:title="@string/pref_title_open_button"
|
||||||
|
android:key="@string/pref_key_open_button"/>
|
||||||
|
<Preference android:title="@string/pref_title_save_button"
|
||||||
|
android:key="@string/pref_key_save_button"/>
|
||||||
|
<Preference android:title="@string/pref_title_remove_button"
|
||||||
|
android:key="@string/pref_key_remove_button"/>
|
||||||
|
<Preference android:title="@string/pref_title_reset_button"
|
||||||
|
android:key="@string/pref_key_reset_button"/>
|
||||||
|
</PreferenceCategory>
|
||||||
|
</PreferenceScreen>
|
||||||
81
app/android/res/layout/activity_sketchfab.xml
Normal file
81
app/android/res/layout/activity_sketchfab.xml
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
<LinearLayout android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:focusableInTouchMode="true" >
|
||||||
|
|
||||||
|
<TextView android:id="@+id/text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Model Name*:" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/editText_filename"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:imeOptions="flagNoExtractUi"
|
||||||
|
android:ems="10" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Description:" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/editText_description"
|
||||||
|
android:ems="10"
|
||||||
|
android:lines="4"
|
||||||
|
android:minLines="2"
|
||||||
|
android:gravity="top|left"
|
||||||
|
android:maxLines="8"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:scrollbars="vertical"
|
||||||
|
android:imeOptions="flagNoExtractUi"
|
||||||
|
android:inputType="textMultiLine" >
|
||||||
|
|
||||||
|
<requestFocus />
|
||||||
|
</EditText>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView2"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Tags:" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/editText_tags"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:imeOptions="flagNoExtractUi"
|
||||||
|
android:ems="10" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/checkBox_draft"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:checked="true"
|
||||||
|
android:text="Draft Mode" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dip"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="right|bottom"
|
||||||
|
android:orientation="horizontal" >
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button_ok"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="0.06"
|
||||||
|
android:text="Upload" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
11
app/android/res/layout/auth_dialog.xml
Normal file
11
app/android/res/layout/auth_dialog.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical" >
|
||||||
|
<WebView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/webv"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
22
app/android/res/layout/database_list.xml
Normal file
22
app/android/res/layout/database_list.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="#fff">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="@dimen/image_width"
|
||||||
|
android:layout_height="@dimen/image_width"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:padding="5dp"
|
||||||
|
android:src="@drawable/ic_launcher" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:text="Demo"
|
||||||
|
android:textColor="#000" />
|
||||||
|
</LinearLayout>
|
||||||
@@ -1,68 +1,74 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<group android:id="@+id/group_pause" android:checkableBehavior="all">
|
|
||||||
<item android:id="@+id/pause" android:checked="false" android:title="Pause"/>
|
|
||||||
</group>
|
|
||||||
|
|
||||||
<group android:id="@+id/group_actions">
|
<group android:id="@+id/group_actions">
|
||||||
<item android:id="@+id/post_processing" android:title="Post-Processing...">
|
<group android:checkableBehavior="single">
|
||||||
|
<item android:id="@+id/point_cloud" android:title="Point Cloud" />
|
||||||
|
<item android:id="@+id/mesh" android:title="Mesh" />
|
||||||
|
<item android:id="@+id/texture_mesh" android:checked="true" android:title="Texture Mesh" />
|
||||||
|
</group>
|
||||||
|
<item android:id="@+id/save" android:title="Save" android:showAsAction="ifRoom"/>
|
||||||
|
|
||||||
|
<item android:id="@+id/export" android:showAsAction="ifRoom" android:title="Export">
|
||||||
<menu>
|
<menu>
|
||||||
<group android:id="@+id/group_post_processing">
|
<item android:id="@+id/export_point_cloud_menu" android:title="Point Cloud">
|
||||||
<item android:id="@+id/detect_more_loop_closures" android:title="Detect More Loop Closures" />
|
<menu>
|
||||||
<item android:id="@+id/global_graph_optimization" android:title="Global Graph Optimization" />
|
<item android:id="@+id/export_point_cloud" android:title="Current Density" />
|
||||||
<item android:id="@+id/sba" android:title="Bundle Adjustement" />
|
<item android:id="@+id/export_point_cloud_highrez" android:title="Max Density" />
|
||||||
</group>
|
</menu>
|
||||||
|
</item>
|
||||||
|
<item android:id="@+id/export_optimized_mesh_menu" android:title="Optimized Mesh..." >
|
||||||
|
<menu>
|
||||||
|
<item android:id="@+id/export_optimized_mesh" android:title="Colored Mesh" />
|
||||||
|
<item android:id="@+id/export_optimized_mesh_texture" android:title="Textured Mesh" />
|
||||||
|
</menu>
|
||||||
|
</item>
|
||||||
</menu>
|
</menu>
|
||||||
</item>
|
</item>
|
||||||
<item android:id="@+id/open" android:title="Open"/>
|
|
||||||
<item android:id="@+id/save" android:title="Save"/>
|
|
||||||
<item android:id="@+id/export" android:title="Export...">
|
|
||||||
<menu>
|
|
||||||
<group android:id="@+id/group_export">
|
|
||||||
<item android:id="@+id/export_ply" android:title="Mesh (.ply)" />
|
|
||||||
<item android:id="@+id/export_obj" android:title="Mesh with texture (*.obj)" />
|
|
||||||
</group>
|
|
||||||
</menu>
|
|
||||||
</item>
|
|
||||||
<item android:id="@+id/reset" android:title="Reset"/>
|
|
||||||
|
|
||||||
<item android:id="@+id/menu_rendering_settings" android:title="Rendering Options...">
|
<item android:id="@+id/post_processing" android:title="Optimize" android:showAsAction="ifRoom">
|
||||||
|
<menu>
|
||||||
|
<item android:id="@+id/post_processing_standard" android:title="Standard Optimization" />
|
||||||
|
<item android:id="@+id/post_processing_advanced" android:title="Advanced..." >
|
||||||
|
<menu>
|
||||||
|
<item android:id="@+id/global_graph_optimization" android:title="Global Graph Optimization" />
|
||||||
|
<item android:id="@+id/detect_more_loop_closures" android:title="Detect More Loop Closures" />
|
||||||
|
<item android:id="@+id/gain_compensation_fast" android:title="Adjust Colors (Fast)" />
|
||||||
|
<item android:id="@+id/gain_compensation_full" android:title="Adjust Colors (Full)" />
|
||||||
|
<item android:id="@+id/bilateral_filtering" android:title="Mesh Smoothing" />
|
||||||
|
<item android:id="@+id/sba" android:title="Bundle Adjustement" />
|
||||||
|
<item android:id="@+id/polygons_filtering" android:title="Noise Filtering" />
|
||||||
|
</menu>
|
||||||
|
</item>
|
||||||
|
</menu>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<item android:id="@+id/open" android:title="Open" android:showAsAction="ifRoom"/>
|
||||||
|
|
||||||
|
<item android:id="@+id/menu_rendering_settings" android:title="Visibility...">
|
||||||
<menu >
|
<menu >
|
||||||
<group android:id="@+id/group_rendering_visibility" android:checkableBehavior="all">
|
<group android:id="@+id/group_rendering_visibility" android:checkableBehavior="all">
|
||||||
|
<item android:id="@+id/status" android:checked="true" android:title="Status" />
|
||||||
<item android:id="@+id/debug" android:checked="false" android:title="Debug" />
|
<item android:id="@+id/debug" android:checked="false" android:title="Debug" />
|
||||||
<item android:id="@+id/mesh_rendering" android:checked="true" android:title="Mesh Rendering" />
|
|
||||||
<item android:id="@+id/map_shown" android:checked="true" android:title="Map Visible" />
|
<item android:id="@+id/map_shown" android:checked="true" android:title="Map Visible" />
|
||||||
<item android:id="@+id/odom_shown" android:checked="true" android:title="Odom Visible" />
|
<item android:id="@+id/odom_shown" android:checked="true" android:title="Odom Visible" />
|
||||||
<item android:id="@+id/graph_visible" android:checked="true" android:title="Graph Visible" />
|
<item android:id="@+id/graph_visible" android:checked="true" android:title="Graph Visible" />
|
||||||
<item android:id="@+id/auto_exposure" android:checked="false" android:title="Auto Exposure" />
|
<item android:id="@+id/grid_visible" android:checked="true" android:title="Grid Visible" />
|
||||||
<item android:id="@+id/max_depth" android:checkable="false" android:title="Cloud/Mesh Max Depth..." />
|
<item android:id="@+id/graph_optimization" android:checked="true" android:title="Optimized Graph" />
|
||||||
<item android:id="@+id/mesh_angle_tolerance" android:checkable="false" android:title="Mesh Angle Tolerance..." />
|
|
||||||
<item android:id="@+id/mesh_triangle_size" android:checkable="false" android:title="Mesh Triangle Size..." />
|
|
||||||
</group>
|
</group>
|
||||||
</menu>
|
</menu>
|
||||||
</item>
|
</item>
|
||||||
<item android:id="@+id/menu_mapping_settings" android:title="Mapping Options...">
|
<item android:id="@+id/modes" android:title="Modes...">
|
||||||
<menu >
|
<menu >
|
||||||
<group android:id="@+id/group_mapping_visibility" android:checkableBehavior="all">
|
<group android:id="@+id/group_mapping_visibility" android:checkableBehavior="all">
|
||||||
<item android:id="@+id/localization_mode" android:checked="false" android:title="Localization Mode" />
|
<item android:id="@+id/localization_mode" android:checked="false" android:title="Localization Mode" />
|
||||||
<item android:id="@+id/trajectory_mode" android:checked="false" android:title="Trajectory Mode" />
|
<item android:id="@+id/trajectory_mode" android:checked="false" android:title="Trajectory Mode" />
|
||||||
<item android:id="@+id/graph_optimization" android:checked="true" android:title="Optimized Graph" />
|
<item android:id="@+id/data_recorder" android:checked="false" android:title="Data Recorder Mode" />
|
||||||
<item android:id="@+id/nodes_filtering" android:checked="false" android:title="Nodes Filtering" />
|
|
||||||
<item android:id="@+id/resolution" android:checked="false" android:title="720p Mode" />
|
|
||||||
<item android:id="@+id/menu_param_settings" android:checkable="false" android:title="Parameters...">
|
|
||||||
<menu >
|
|
||||||
<item android:id="@+id/update_rate" android:title="Map Update Rate..." />
|
|
||||||
<item android:id="@+id/time_threshold" android:title="Time Threshold..." />
|
|
||||||
<item android:id="@+id/loop_threshold" android:title="Loop Closure Threshold..." />
|
|
||||||
<item android:id="@+id/optimize_error" android:title="Max Optimization Error..." />
|
|
||||||
<item android:id="@+id/features" android:title="Max Features Extracted..." />
|
|
||||||
</menu>
|
|
||||||
</item>
|
|
||||||
</group>
|
</group>
|
||||||
</menu>
|
</menu>
|
||||||
</item>
|
</item>
|
||||||
|
<item android:id="@+id/settings" android:title="Settings"/>
|
||||||
|
<item android:id="@+id/reset" android:title="Reset"/>
|
||||||
<item android:id="@+id/about" android:title="About"/>
|
<item android:id="@+id/about" android:title="About"/>
|
||||||
</group>
|
</group>
|
||||||
</menu>
|
</menu>
|
||||||
9
app/android/res/values/arrays.xml
Normal file
9
app/android/res/values/arrays.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
<resources>
|
||||||
|
<string-array name="camera_view_array">
|
||||||
|
<item>First View</item>
|
||||||
|
<item>Third-P. View</item>
|
||||||
|
<item>Top View</item>
|
||||||
|
<item>Ortho View</item>
|
||||||
|
</string-array>
|
||||||
|
</resources>
|
||||||
4
app/android/res/values/dimens.xml
Normal file
4
app/android/res/values/dimens.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
<resources>
|
||||||
|
<dimen name="image_width">150dp</dimen>
|
||||||
|
</resources>
|
||||||
@@ -1,24 +1,846 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<string name="app_name">RTAB-Map</string>
|
<string name="app_name">RTAB-Map</string>
|
||||||
<string name="sys_name">RTAB-Map</string>
|
<string name="sys_name">RTAB-Map</string>
|
||||||
<string name="menu_name">Real-Time Appearance-Based Mapping</string>
|
<string name="menu_name">RTAB-Map</string>
|
||||||
|
<string name="settings">Settings</string>
|
||||||
|
<string name="sketchfab">Upload to Sketchfab…</string>
|
||||||
<string name="status">"Status: "</string>
|
<string name="status">"Status: "</string>
|
||||||
<string name="words">"Words: "</string>
|
<string name="words">"Words: "</string>
|
||||||
<string name="first_person">First</string>
|
<string name="camera_button">First View</string>
|
||||||
<string name="third_person">Third</string>
|
<string name="pause">Pause</string>
|
||||||
<string name="top_down">Top</string>
|
<string name="resume">Resume</string>
|
||||||
|
<string name="backface_on">Backface</string>
|
||||||
|
<string name="backface_off">Backface</string>
|
||||||
|
<string name="light_on">Lighting</string>
|
||||||
|
<string name="light_off">Lighting</string>
|
||||||
|
<string name="wireframe">Wireframe</string>
|
||||||
|
<string name="close_visualization">Close Visualization</string>
|
||||||
|
<string name="save_to_file">Export to File…</string>
|
||||||
|
<string name="share_to_sketchfab">Share to Sketchfab…</string>
|
||||||
<string name="start">Start</string>
|
<string name="start">Start</string>
|
||||||
<string name="nodes">"Nodes (WM): "</string>
|
<string name="nodes">"Nodes (WM): "</string>
|
||||||
<string name="points">"Number of points: "</string>
|
<string name="points">"Number of points: "</string>
|
||||||
<string name="update_time">"Update time (ms): "</string>
|
<string name="update_time">"Update time (ms): "</string>
|
||||||
<string name="loop_closure">"Loop closure ID: "</string>
|
<string name="loop_closure">"Loop closure ID: "</string>
|
||||||
<string name="db_size">"Database (MB): "</string>
|
<string name="free_memory">"Free Memory (MB): "</string>
|
||||||
|
<string name="database_size">"Database (MB): "</string>
|
||||||
<string name="total_loop">"Loop closures: "</string>
|
<string name="total_loop">"Loop closures: "</string>
|
||||||
<string name="inliers">"Inliers: "</string>
|
<string name="inliers">"Inliers: "</string>
|
||||||
<string name="features">"Features: "</string>
|
<string name="features">"Features: "</string>
|
||||||
|
<string name="rehearsal">"Rehearsal (%): "</string>
|
||||||
<string name="polygons">"Polygons: "</string>
|
<string name="polygons">"Polygons: "</string>
|
||||||
<string name="memory">"Memory (MB): "</string>
|
<string name="memory">"Used Memory (MB): "</string>
|
||||||
<string name="hypothesis">"Hypothesis: "</string>
|
<string name="hypothesis">"Hypothesis (%): "</string>
|
||||||
|
<string name="fps">"FPS (rendering): "</string>
|
||||||
|
<string name="distance">"Distance travelled: "</string>
|
||||||
|
<string name="gps">"GPS (long,lat,alt,bearing,err): "</string>
|
||||||
|
<string name="time">"Time: "</string>
|
||||||
|
|
||||||
|
<!-- Preference keys: BEGIN -->
|
||||||
|
<string name="pref_key_tags">pref_key_tags</string>
|
||||||
|
<string name="pref_default_tags">rtabmap 3dscan tango</string>
|
||||||
|
<string name="pref_key_rendering">pref_key_rendering</string>
|
||||||
|
<string name="pref_default_rendering">2</string>
|
||||||
|
<string name="pref_key_open_button">pref_key_open_button</string>
|
||||||
|
<string name="pref_key_save_button">pref_key_save_button</string>
|
||||||
|
<string name="pref_key_remove_button">pref_key_remove_button</string>
|
||||||
|
<string name="pref_key_reset_button">pref_key_reset_button</string>
|
||||||
|
<string name="pref_key_density">pref_key_density</string>
|
||||||
|
<string name="pref_default_density">1</string>
|
||||||
|
<string name="pref_key_min_depth">pref_key_min_depth</string>
|
||||||
|
<string name="pref_default_min_depth">0</string>
|
||||||
|
<string name="pref_key_depth">pref_key_depth</string>
|
||||||
|
<string name="pref_default_depth">2.5</string>
|
||||||
|
<string name="pref_key_point_size">pref_key_point_size</string>
|
||||||
|
<string name="pref_default_point_size">10</string>
|
||||||
|
<string name="pref_key_angle">pref_key_angle</string>
|
||||||
|
<string name="pref_default_angle">20</string>
|
||||||
|
<string name="pref_key_triangle">pref_key_triangle</string>
|
||||||
|
<string name="pref_default_triangle">2</string>
|
||||||
|
<string name="pref_key_rendering_texture_decimation">pref_key_rendering_texture_decimation</string>
|
||||||
|
<string name="pref_default_rendering_texture_decimation">4</string>
|
||||||
|
<string name="pref_key_blending">pref_key_blending</string>
|
||||||
|
<string name="pref_default_blending">true</string>
|
||||||
|
<string name="pref_key_background_color">pref_key_background_color</string>
|
||||||
|
<string name="pref_default_background_color">0.2</string>
|
||||||
|
<string name="pref_key_nodes_filtering">pref_key_nodes_filtering</string>
|
||||||
|
<string name="pref_default_nodes_filtering">false</string>
|
||||||
|
<string name="pref_key_append">pref_key_append</string>
|
||||||
|
<string name="pref_default_append">true</string>
|
||||||
|
<string name="pref_key_resolution">pref_key_resolution</string>
|
||||||
|
<string name="pref_default_resolution">false</string>
|
||||||
|
<string name="pref_key_smoothing">pref_key_smoothing</string>
|
||||||
|
<string name="pref_default_smoothing">true</string>
|
||||||
|
<string name="pref_key_fisheye">pref_key_fisheye</string>
|
||||||
|
<string name="pref_default_fisheye">false</string>
|
||||||
|
|
||||||
|
<string name="pref_key_update_rate">pref_key_update_rate</string>
|
||||||
|
<string name="pref_default_update_rate">1</string>
|
||||||
|
<string name="pref_key_max_speed">pref_key_max_speed</string>
|
||||||
|
<string name="pref_default_max_speed">0</string>
|
||||||
|
<string name="pref_key_time_thr">pref_key_time_thr</string>
|
||||||
|
<string name="pref_default_time_thr">1000</string>
|
||||||
|
<string name="pref_key_mem_thr">pref_key_mem_thr</string>
|
||||||
|
<string name="pref_default_mem_thr">0</string>
|
||||||
|
<string name="pref_key_loop_thr">pref_key_loop_thr</string>
|
||||||
|
<string name="pref_default_loop_thr">0.11</string>
|
||||||
|
<string name="pref_key_sim_thr">pref_key_sim_thr</string>
|
||||||
|
<string name="pref_default_sim_thr">0.3</string>
|
||||||
|
<string name="pref_key_min_inliers">pref_key_min_inliers</string>
|
||||||
|
<string name="pref_default_min_inliers">25</string>
|
||||||
|
<string name="pref_key_opt_error">pref_key_opt_error</string>
|
||||||
|
<string name="pref_default_opt_error">2</string>
|
||||||
|
<string name="pref_key_features_voc">pref_key_features_voc</string>
|
||||||
|
<string name="pref_default_features_voc">200</string>
|
||||||
|
<string name="pref_key_features">pref_key_features</string>
|
||||||
|
<string name="pref_default_features">400</string>
|
||||||
|
<string name="pref_key_features_type">pref_key_features_type</string>
|
||||||
|
<string name="pref_default_features_type">6</string>
|
||||||
|
<string name="pref_key_optimizer">pref_key_optimizer</string>
|
||||||
|
<string name="pref_default_optimizer">2</string>
|
||||||
|
<string name="pref_key_optimize_end">pref_key_optimize_end</string>
|
||||||
|
<string name="pref_default_optimize_end">true</string>
|
||||||
|
<string name="pref_key_keep_all_db">pref_key_keep_all_db</string>
|
||||||
|
<string name="pref_default_keep_all_db">true</string>
|
||||||
|
<string name="pref_key_raw_scan_saved">pref_key_raw_scan_saved</string>
|
||||||
|
<string name="pref_default_raw_scan_saved">false</string>
|
||||||
|
<string name="pref_key_gps_saved">pref_key_gps_saved</string>
|
||||||
|
<string name="pref_default_gps_saved">false</string>
|
||||||
|
<string name="pref_key_db_in_memory">pref_key_db_in_memory</string>
|
||||||
|
<string name="pref_default_db_in_memory">false</string>
|
||||||
|
|
||||||
|
<string name="pref_key_cloud_voxel">pref_key_cloud_voxel</string>
|
||||||
|
<string name="pref_default_cloud_voxel">0.01</string>
|
||||||
|
<string name="pref_key_texture_size">pref_key_texture_size</string>
|
||||||
|
<string name="pref_default_texture_size">4096</string>
|
||||||
|
<string name="pref_key_texture_count">pref_key_texture_count</string>
|
||||||
|
<string name="pref_default_texture_count">1</string>
|
||||||
|
<string name="pref_key_normal_k">pref_key_normal_k</string>
|
||||||
|
<string name="pref_default_normal_k">18</string>
|
||||||
|
<string name="pref_key_max_texture_distance">pref_key_max_texture_distance</string>
|
||||||
|
<string name="pref_default_max_texture_distance">3</string>
|
||||||
|
<string name="pref_key_min_texture_cluster_size">pref_key_min_texture_cluster_size</string>
|
||||||
|
<string name="pref_default_min_texture_cluster_size">50</string>
|
||||||
|
<string name="pref_key_block_render">pref_key_block_render</string>
|
||||||
|
<string name="pref_default_block_render">false</string>
|
||||||
|
<string name="pref_key_opt_depth">pref_key_opt_depth</string>
|
||||||
|
<string name="pref_default_opt_depth">0</string>
|
||||||
|
<string name="pref_key_opt_color_radius">pref_key_opt_color_radius</string>
|
||||||
|
<string name="pref_default_opt_color_radius">0.05</string>
|
||||||
|
<string name="pref_key_opt_clean_white">pref_key_opt_clean_white</string>
|
||||||
|
<string name="pref_default_opt_clean_white">true</string>
|
||||||
|
<string name="pref_key_opt_min_cluster_size">pref_key_opt_min_cluster_size</string>
|
||||||
|
<string name="pref_default_opt_min_cluster_size">0</string>
|
||||||
|
<string name="pref_key_gain_max_radius">pref_key_gain_max_radius</string>
|
||||||
|
<string name="pref_default_gain_max_radius">0.02</string>
|
||||||
|
<string name="pref_key_cluster_ratio">pref_key_cluster_ratio</string>
|
||||||
|
<string name="pref_default_cluster_ratio">0.05</string>
|
||||||
|
<string name="pref_key_notification_sound">pref_key_notification_sound</string>
|
||||||
|
<string name="pref_default_notification_sound">true</string>
|
||||||
|
<!-- Preference keys: END -->
|
||||||
|
|
||||||
|
<string name="pref_title_rendering">Rendering</string>
|
||||||
|
<string name="pref_title_density">Point Cloud Density</string>
|
||||||
|
<string name="pref_summary_density">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.</string>
|
||||||
|
<string name="pref_title_angle">Mesh Angle Tolerance</string>
|
||||||
|
<string name="pref_summary_angle">Minimum polygon angle. Increase to force scanning perpendicular to surfaces.</string>
|
||||||
|
<string name="pref_title_triangle">Mesh Triangle Size</string>
|
||||||
|
<string name="pref_summary_triangle">Size in pixels of the polygons created from the depth image.</string>
|
||||||
|
<string name="pref_title_rendering_texture_decimation">Texture Resolution</string>
|
||||||
|
<string name="pref_summary_rendering_texture_decimation">Resolution of the texture for online rendering. This doesn\'t affect Export results.</string>
|
||||||
|
<string name="pref_title_min_depth">Min Depth</string>
|
||||||
|
<string name="pref_summary_min_depth">Points under the minimum depth are not rendered.</string>
|
||||||
|
<string name="pref_title_depth">Max Depth</string>
|
||||||
|
<string name="pref_summary_depth">Points over the maximum depth are not rendered.</string>
|
||||||
|
<string name="pref_title_point_size">Point Size</string>
|
||||||
|
<string name="pref_summary_point_size">Size of the points when rendering only the point cloud.</string>
|
||||||
|
<string name="pref_title_blending">Blending</string>
|
||||||
|
<string name="pref_summary_blending">Blend close surfaces together to get more smooth colors on overlapping surfaces. May decrease rendering frame rate.</string>
|
||||||
|
<string name="pref_title_background_color">Background Color</string>
|
||||||
|
<string name="pref_summary_background_color"></string>
|
||||||
|
<string name="pref_title_nodes_filtering">Nodes Filtering</string>
|
||||||
|
<string name="pref_summary_nodes_filtering">Render only the newest point cloud of a loop closure.</string>
|
||||||
|
|
||||||
|
<string-array name="pref_density_keys">
|
||||||
|
<item>"Maximum"</item>
|
||||||
|
<item>"High"</item>
|
||||||
|
<item>"Low"</item>
|
||||||
|
<item>"Very Low"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_density_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"3"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_min_depth_keys">
|
||||||
|
<item>"0 m"</item>
|
||||||
|
<item>"0.3 m"</item>
|
||||||
|
<item>"0.5 m"</item>
|
||||||
|
<item>"0.75 m"</item>
|
||||||
|
<item>"1 m"</item>
|
||||||
|
<item>"1.5 m"</item>
|
||||||
|
<item>"2 m"</item>
|
||||||
|
<item>"2.5 m"</item>
|
||||||
|
<item>"3 m"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_min_depth_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"0.3"</item>
|
||||||
|
<item>"0.5"</item>
|
||||||
|
<item>"0.75"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
<item>"1.5"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"2.5"</item>
|
||||||
|
<item>"3"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_depth_keys">
|
||||||
|
<item>"No Limit"</item>
|
||||||
|
<item>"5 m"</item>
|
||||||
|
<item>"4.5 m"</item>
|
||||||
|
<item>"4 m"</item>
|
||||||
|
<item>"3.5 m"</item>
|
||||||
|
<item>"3 m"</item>
|
||||||
|
<item>"2.5 m"</item>
|
||||||
|
<item>"2 m"</item>
|
||||||
|
<item>"1.5 m"</item>
|
||||||
|
<item>"1 m"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_depth_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
<item>"4.5"</item>
|
||||||
|
<item>"4"</item>
|
||||||
|
<item>"3.5"</item>
|
||||||
|
<item>"3"</item>
|
||||||
|
<item>"2.5"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"1.5"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_point_size_values">
|
||||||
|
<item>"50"</item>
|
||||||
|
<item>"30"</item>
|
||||||
|
<item>"25"</item>
|
||||||
|
<item>"15"</item>
|
||||||
|
<item>"10"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_angle_keys">
|
||||||
|
<item>"60 deg"</item>
|
||||||
|
<item>"45 deg"</item>
|
||||||
|
<item>"35 deg"</item>
|
||||||
|
<item>"30 deg"</item>
|
||||||
|
<item>"25 deg"</item>
|
||||||
|
<item>"20 deg"</item>
|
||||||
|
<item>"15 deg"</item>
|
||||||
|
<item>"10 deg"</item>
|
||||||
|
<item>"5 deg"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_angle_values">
|
||||||
|
<item>"60"</item>
|
||||||
|
<item>"45"</item>
|
||||||
|
<item>"35"</item>
|
||||||
|
<item>"30"</item>
|
||||||
|
<item>"25"</item>
|
||||||
|
<item>"20"</item>
|
||||||
|
<item>"15"</item>
|
||||||
|
<item>"10"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_triangle_keys">
|
||||||
|
<item>"6 pix"</item>
|
||||||
|
<item>"5 pix"</item>
|
||||||
|
<item>"4 pix"</item>
|
||||||
|
<item>"3 pix"</item>
|
||||||
|
<item>"2 pix"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_triangle_values">
|
||||||
|
<item>"6"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
<item>"4"</item>
|
||||||
|
<item>"3"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_rendering_texture_decimation_keys">
|
||||||
|
<item>"Maximum"</item>
|
||||||
|
<item>"High"</item>
|
||||||
|
<item>"Low"</item>
|
||||||
|
<item>"Very Low"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_rendering_texture_decimation_values">
|
||||||
|
<item>"1"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"4"</item>
|
||||||
|
<item>"8"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_background_color_keys">
|
||||||
|
<item>"White"</item>
|
||||||
|
<item>"0.9"</item>
|
||||||
|
<item>"Light Gray"</item>
|
||||||
|
<item>"0.7"</item>
|
||||||
|
<item>"0.6"</item>
|
||||||
|
<item>"Gray"</item>
|
||||||
|
<item>"0.4"</item>
|
||||||
|
<item>"0.3"</item>
|
||||||
|
<item>"Dark Gray"</item>
|
||||||
|
<item>"0.1"</item>
|
||||||
|
<item>"Black"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_background_color_values">
|
||||||
|
<item>"1.0"</item>
|
||||||
|
<item>"0.9"</item>
|
||||||
|
<item>"0.8"</item>
|
||||||
|
<item>"0.7"</item>
|
||||||
|
<item>"0.6"</item>
|
||||||
|
<item>"0.5"</item>
|
||||||
|
<item>"0.4"</item>
|
||||||
|
<item>"0.3"</item>
|
||||||
|
<item>"0.2"</item>
|
||||||
|
<item>"0.1"</item>
|
||||||
|
<item>"0.0"</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string name="pref_title_mapping_sub">Mapping…</string>
|
||||||
|
<string name="pref_title_mapping">Mapping</string>
|
||||||
|
<string name="pref_summary_mapping">Advanced mapping parameters for fine tuning.</string>
|
||||||
|
<string name="pref_title_mapping_core">Core</string>
|
||||||
|
<string name="pref_title_mapping_database">Database</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_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_title_smoothing">Smoothing</string>
|
||||||
|
<string name="pref_summary_smoothing">Smooth the point clouds.</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_title_update_rate">Update Rate</string>
|
||||||
|
<string name="pref_summary_update_rate">Rate at which a new node is added to map.</string>
|
||||||
|
<string name="pref_title_max_speed">Maximum Motion Speed</string>
|
||||||
|
<string name="pref_summary_max_speed">Images taken when the camera is moving too fast are ignored to avoid blurry textures.</string>
|
||||||
|
<string name="pref_title_time_thr">Time Limit</string>
|
||||||
|
<string name="pref_summary_time_thr">Maximum time allowed for map updates. If time to add a new node is above this theshold, some old parts of the map are temporarly forgotten to reduce time of next updates.</string>
|
||||||
|
<string name="pref_title_mem_thr">Memory Limit</string>
|
||||||
|
<string name="pref_summary_mem_thr">Maximum nodes kept in working memory.</string>
|
||||||
|
<string name="pref_title_loop_thr">Loop Closure Threshold</string>
|
||||||
|
<string name="pref_summary_loop_thr">Threshold at which loop closure hypotheses are accepted. Higher means more robust to false loop closures while rejecting more good loop closures.</string>
|
||||||
|
<string name="pref_title_sim_thr">Similarity Threshold</string>
|
||||||
|
<string name="pref_summary_sim_thr">Threshold at which consecutive images are considered the same, so the corresponding node\'s weight is increased. The background turns dark blue when this happens.</string>
|
||||||
|
<string name="pref_title_min_inliers">Min Inliers</string>
|
||||||
|
<string name="pref_summary_min_inliers">Minimum visual inliers to accept a loop closure.</string>
|
||||||
|
<string name="pref_title_opt_error">Max Optimization Error</string>
|
||||||
|
<string name="pref_summary_opt_error">Reject any loop closures causing error corrections in the map higher than this factor of the link\'s variance.</string>
|
||||||
|
<string name="pref_title_features_voc">Max Features Extracted (Vocabulary)</string>
|
||||||
|
<string name="pref_summary_features_voc">Extracting more features per image would result in better loop closure hypotheses but more processing time is required.</string>
|
||||||
|
<string name="pref_title_features">Max Features Extracted (Loop Closure)</string>
|
||||||
|
<string name="pref_summary_features">Extracting more features per image would result in better loop closure transforms but more processing time is required.</string>
|
||||||
|
<string name="pref_title_features_type">Feature Type</string>
|
||||||
|
<string name="pref_summary_features_type">BRIEF features are fast to compute but are not rotation invariant like FREAK. Warning: Changing feature type will automatically reset the map!</string>
|
||||||
|
<string name="pref_title_optimizer">Graph Optimizer</string>
|
||||||
|
<string name="pref_summary_optimizer">Graph optimization approach.</string>
|
||||||
|
<string name="pref_title_optimize_end">Optimization from Graph End</string>
|
||||||
|
<string name="pref_summary_optimize_end">The map\'s graph is optimized from the last node. The map is moved when a loop closure happens instead of jumping the current pose back to localized area. </string>
|
||||||
|
<string name="pref_title_keep_all_db">Save All Frames in Database</string>
|
||||||
|
<string name="pref_summary_keep_all_db">Discarded frames while not moving are still saved in database. Useful to replay exactly the scanning on RTAB-Map Desktop.</string>
|
||||||
|
<string name="pref_title_raw_scan_saved">Save Raw Scan</string>
|
||||||
|
<string name="pref_summary_raw_scan_saved">Save raw point clouds in database.</string>
|
||||||
|
<string name="pref_title_gps_saved">Save GPS</string>
|
||||||
|
<string name="pref_summary_gps_saved">Save GPS in database.</string>
|
||||||
|
<string name="pref_title_db_in_memory">Database In Memory</string>
|
||||||
|
<string name="pref_summary_db_in_memory">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-array name="pref_update_rate_keys">
|
||||||
|
<item>"Max"</item>
|
||||||
|
<item>"5 Hz"</item>
|
||||||
|
<item>"4 Hz"</item>
|
||||||
|
<item>"3 Hz"</item>
|
||||||
|
<item>"2 Hz"</item>
|
||||||
|
<item>"1 Hz"</item>
|
||||||
|
<item>"0.5 Hz"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_update_rate_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
<item>"4"</item>
|
||||||
|
<item>"3"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
<item>"0.5"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_max_speed_keys">
|
||||||
|
<item>"No Limit"</item>
|
||||||
|
<item>"High"</item>
|
||||||
|
<item>"Medium"</item>
|
||||||
|
<item>"Low"</item>
|
||||||
|
<item>"Very Low"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_max_speed_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"0.4"</item>
|
||||||
|
<item>"0.3"</item>
|
||||||
|
<item>"0.2"</item>
|
||||||
|
<item>"0.1"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_time_thr_keys">
|
||||||
|
<item>"No Limit"</item>
|
||||||
|
<item>"1500 ms"</item>
|
||||||
|
<item>"1400 ms"</item>
|
||||||
|
<item>"1300 ms"</item>
|
||||||
|
<item>"1200 ms"</item>
|
||||||
|
<item>"1100 ms"</item>
|
||||||
|
<item>"1000 ms"</item>
|
||||||
|
<item>"900 ms"</item>
|
||||||
|
<item>"800 ms"</item>
|
||||||
|
<item>"700 ms"</item>
|
||||||
|
<item>"600 ms"</item>
|
||||||
|
<item>"500 ms"</item>
|
||||||
|
<item>"400"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_time_thr_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"1500"</item>
|
||||||
|
<item>"1400"</item>
|
||||||
|
<item>"1300"</item>
|
||||||
|
<item>"1200"</item>
|
||||||
|
<item>"1100"</item>
|
||||||
|
<item>"1000"</item>
|
||||||
|
<item>"900"</item>
|
||||||
|
<item>"800"</item>
|
||||||
|
<item>"700"</item>
|
||||||
|
<item>"600"</item>
|
||||||
|
<item>"500"</item>
|
||||||
|
<item>"400"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_mem_thr_keys">
|
||||||
|
<item>"No Limit"</item>
|
||||||
|
<item>"500 nodes"</item>
|
||||||
|
<item>"400 nodes"</item>
|
||||||
|
<item>"300 nodes"</item>
|
||||||
|
<item>"200 nodes"</item>
|
||||||
|
<item>"100 nodes"</item>
|
||||||
|
<item>"50 nodes"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_mem_thr_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"500"</item>
|
||||||
|
<item>"400"</item>
|
||||||
|
<item>"300"</item>
|
||||||
|
<item>"200"</item>
|
||||||
|
<item>"100"</item>
|
||||||
|
<item>"50"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_loop_thr_keys">
|
||||||
|
<item>"0.90"</item>
|
||||||
|
<item>"0.80"</item>
|
||||||
|
<item>"0.70"</item>
|
||||||
|
<item>"0.60"</item>
|
||||||
|
<item>"0.50"</item>
|
||||||
|
<item>"0.40"</item>
|
||||||
|
<item>"0.30"</item>
|
||||||
|
<item>"0.20"</item>
|
||||||
|
<item>"0.15"</item>
|
||||||
|
<item>"0.11"</item>
|
||||||
|
<item>"0.10"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_loop_thr_values">
|
||||||
|
<item>"0.90"</item>
|
||||||
|
<item>"0.80"</item>
|
||||||
|
<item>"0.70"</item>
|
||||||
|
<item>"0.60"</item>
|
||||||
|
<item>"0.50"</item>
|
||||||
|
<item>"0.40"</item>
|
||||||
|
<item>"0.30"</item>
|
||||||
|
<item>"0.20"</item>
|
||||||
|
<item>"0.15"</item>
|
||||||
|
<item>"0.11"</item>
|
||||||
|
<item>"0.10"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_sim_thr_keys">
|
||||||
|
<item>"Disabled"</item>
|
||||||
|
<item>"0.60"</item>
|
||||||
|
<item>"0.50"</item>
|
||||||
|
<item>"0.40"</item>
|
||||||
|
<item>"0.30"</item>
|
||||||
|
<item>"0.20"</item>
|
||||||
|
<item>"0.10"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_sim_thr_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"0.6"</item>
|
||||||
|
<item>"0.5"</item>
|
||||||
|
<item>"0.4"</item>
|
||||||
|
<item>"0.3"</item>
|
||||||
|
<item>"0.2"</item>
|
||||||
|
<item>"0.1"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_min_inliers_keys">
|
||||||
|
<item>"35"</item>
|
||||||
|
<item>"30"</item>
|
||||||
|
<item>"25"</item>
|
||||||
|
<item>"20"</item>
|
||||||
|
<item>"15"</item>
|
||||||
|
<item>"10"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_min_inliers_values">
|
||||||
|
<item>"35"</item>
|
||||||
|
<item>"30"</item>
|
||||||
|
<item>"25"</item>
|
||||||
|
<item>"20"</item>
|
||||||
|
<item>"15"</item>
|
||||||
|
<item>"10"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_opt_error_keys">
|
||||||
|
<item>"10x"</item>
|
||||||
|
<item>"9x"</item>
|
||||||
|
<item>"8x"</item>
|
||||||
|
<item>"7x"</item>
|
||||||
|
<item>"6x"</item>
|
||||||
|
<item>"5x"</item>
|
||||||
|
<item>"4x"</item>
|
||||||
|
<item>"3x"</item>
|
||||||
|
<item>"2x"</item>
|
||||||
|
<item>"1x"</item>
|
||||||
|
<item>"Disabled"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_opt_error_values">
|
||||||
|
<item>"10"</item>
|
||||||
|
<item>"9"</item>
|
||||||
|
<item>"8"</item>
|
||||||
|
<item>"7"</item>
|
||||||
|
<item>"6"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
<item>"4"</item>
|
||||||
|
<item>"3"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
<item>"0"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_features_voc_keys">
|
||||||
|
<item>"No Limit"</item>
|
||||||
|
<item>"1000"</item>
|
||||||
|
<item>"900"</item>
|
||||||
|
<item>"800"</item>
|
||||||
|
<item>"700"</item>
|
||||||
|
<item>"600"</item>
|
||||||
|
<item>"500"</item>
|
||||||
|
<item>"400"</item>
|
||||||
|
<item>"300"</item>
|
||||||
|
<item>"200"</item>
|
||||||
|
<item>"100"</item>
|
||||||
|
<item>"Disabled"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_features_voc_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"1000"</item>
|
||||||
|
<item>"900"</item>
|
||||||
|
<item>"800"</item>
|
||||||
|
<item>"700"</item>
|
||||||
|
<item>"600"</item>
|
||||||
|
<item>"500"</item>
|
||||||
|
<item>"400"</item>
|
||||||
|
<item>"300"</item>
|
||||||
|
<item>"200"</item>
|
||||||
|
<item>"100"</item>
|
||||||
|
<item>"-1"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_features_keys">
|
||||||
|
<item>"No Limit"</item>
|
||||||
|
<item>"1000"</item>
|
||||||
|
<item>"900"</item>
|
||||||
|
<item>"800"</item>
|
||||||
|
<item>"700"</item>
|
||||||
|
<item>"600"</item>
|
||||||
|
<item>"500"</item>
|
||||||
|
<item>"400"</item>
|
||||||
|
<item>"300"</item>
|
||||||
|
<item>"200"</item>
|
||||||
|
<item>"100"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_features_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"1000"</item>
|
||||||
|
<item>"900"</item>
|
||||||
|
<item>"800"</item>
|
||||||
|
<item>"700"</item>
|
||||||
|
<item>"600"</item>
|
||||||
|
<item>"500"</item>
|
||||||
|
<item>"400"</item>
|
||||||
|
<item>"300"</item>
|
||||||
|
<item>"200"</item>
|
||||||
|
<item>"100"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_features_type_keys">
|
||||||
|
<item>"BRIEF"</item>
|
||||||
|
<item>"FREAK"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_features_type_values">
|
||||||
|
<item>"6"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_optimizer_keys">
|
||||||
|
<item>"GTSAM"</item>
|
||||||
|
<item>"g2o"</item>
|
||||||
|
<item>"TORO"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_optimizer_values">
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
<item>"0"</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string name="pref_title_export_sub">Exporting…</string>
|
||||||
|
<string name="pref_title_export">Exporting</string>
|
||||||
|
<string name="pref_summary_export">Advanced parameters used when exporting the map.</string>
|
||||||
|
<string name="pref_title_cloud_voxel">Voxel Size</string>
|
||||||
|
<string name="pref_summary_cloud_voxel">If you don\'t need a very precise point cloud, you can set this to reduce the output point cloud size. This is also used for optimized mesh.</string>
|
||||||
|
<string name="pref_title_texture_size">Texture Size</string>
|
||||||
|
<string name="pref_summary_texture_size">If the map is large, you may want to increase this to maximize the texture resolution.</string>
|
||||||
|
<string name="pref_title_texture_count">Maximum Output Textures</string>
|
||||||
|
<string name="pref_summary_texture_count">Note that all textures are still merged into one for visualization, but exported in multiple files.</string>
|
||||||
|
<string name="pref_title_normal_k">Normal K</string>
|
||||||
|
<string name="pref_summary_normal_k">K-nearest neighbors used for normal computation when a mesh is created.</string>
|
||||||
|
<string name="pref_title_max_texture_distance">Max Texture Distance</string>
|
||||||
|
<string name="pref_summary_max_texture_distance">Maximum distance from a camera for polygons to be textured by this camera.</string>
|
||||||
|
<string name="pref_title_min_texture_cluster_size">Min Texture Cluster Size</string>
|
||||||
|
<string name="pref_summary_min_texture_cluster_size">Minimum polygon cluster size to be textured by a camera. This helps to filter sparse textured polygons.</string>
|
||||||
|
<string name="pref_title_block_render">Block Rendering Thread While Exporting</string>
|
||||||
|
<string name="pref_summary_block_render">This decreases exporting time, but freezes rendering while exporting. This also clears temporary the rendered clouds/meshes from memory during exporting, this can be useful to avoid out of memory errors.</string>
|
||||||
|
|
||||||
|
<string-array name="pref_cloud_voxel_keys">
|
||||||
|
<item>"0.2 m"</item>
|
||||||
|
<item>"0.1 m"</item>
|
||||||
|
<item>"0.05 m"</item>
|
||||||
|
<item>"0.02 m"</item>
|
||||||
|
<item>"0.01 m"</item>
|
||||||
|
<item>"0.005 m"</item>
|
||||||
|
<item>"Disabled"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_cloud_voxel_values">
|
||||||
|
<item>"0.2"</item>
|
||||||
|
<item>"0.1"</item>
|
||||||
|
<item>"0.05"</item>
|
||||||
|
<item>"0.02"</item>
|
||||||
|
<item>"0.01"</item>
|
||||||
|
<item>"0.005"</item>
|
||||||
|
<item>"0"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_texture_size_keys">
|
||||||
|
<item>"16384x16384"</item>
|
||||||
|
<item>"8192x8192"</item>
|
||||||
|
<item>"4096x4096"</item>
|
||||||
|
<item>"2048x2048"</item>
|
||||||
|
<item>"1024x1024"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_texture_size_values">
|
||||||
|
<item>"16384"</item>
|
||||||
|
<item>"8192"</item>
|
||||||
|
<item>"4096"</item>
|
||||||
|
<item>"2048"</item>
|
||||||
|
<item>"1024"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_texture_count_keys">
|
||||||
|
<item>"8"</item>
|
||||||
|
<item>"7"</item>
|
||||||
|
<item>"6"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
<item>"4"</item>
|
||||||
|
<item>"3"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_texture_count_values">
|
||||||
|
<item>"8"</item>
|
||||||
|
<item>"7"</item>
|
||||||
|
<item>"6"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
<item>"4"</item>
|
||||||
|
<item>"3"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_normal_k_values">
|
||||||
|
<item>"30"</item>
|
||||||
|
<item>"24"</item>
|
||||||
|
<item>"18"</item>
|
||||||
|
<item>"12"</item>
|
||||||
|
<item>"6"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_max_texture_distance_keys">
|
||||||
|
<item>"No Limit"</item>
|
||||||
|
<item>"5 m"</item>
|
||||||
|
<item>"4.5 m"</item>
|
||||||
|
<item>"4 m"</item>
|
||||||
|
<item>"3.5 m"</item>
|
||||||
|
<item>"3 m"</item>
|
||||||
|
<item>"2.5 m"</item>
|
||||||
|
<item>"2 m"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_max_texture_distance_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
<item>"4.5"</item>
|
||||||
|
<item>"4"</item>
|
||||||
|
<item>"3.5"</item>
|
||||||
|
<item>"3"</item>
|
||||||
|
<item>"2.5"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_min_texture_cluster_size_keys">
|
||||||
|
<item>"1000"</item>
|
||||||
|
<item>"500"</item>
|
||||||
|
<item>"200"</item>
|
||||||
|
<item>"100"</item>
|
||||||
|
<item>"50"</item>
|
||||||
|
<item>"10"</item>
|
||||||
|
<item>"Disabled"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_min_texture_cluster_size_values">
|
||||||
|
<item>"1000"</item>
|
||||||
|
<item>"500"</item>
|
||||||
|
<item>"200"</item>
|
||||||
|
<item>"100"</item>
|
||||||
|
<item>"50"</item>
|
||||||
|
<item>"10"</item>
|
||||||
|
<item>"0"</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string name="pref_title_optimized">Optimized</string>
|
||||||
|
<string name="pref_title_opt_voxel">Voxel Size</string>
|
||||||
|
<string name="pref_summary_opt_voxel">Increasing this can reduce reconstruction time at the cost of less geometry precision.</string>
|
||||||
|
<string name="pref_title_opt_depth">Reconstruction Depth</string>
|
||||||
|
<string name="pref_summary_opt_depth">Lowering this parameter decreases reconstruction time, but geometry precision is lower. Minimum polygon size: map length / 2^depth). \"Auto\" means that depth is chosen so that polygon size is just under 3 cm.</string>
|
||||||
|
<string name="pref_title_opt_color_radius">Color Radius</string>
|
||||||
|
<string name="pref_summary_opt_color_radius">Radius used to transfer nearest color from the point cloud to reconstructed mesh. When exporting with texture, if Clean Mesh is also enabled, this will limit the number of polygons textured in holes.</string>
|
||||||
|
<string name="pref_title_opt_clean_white">Clean Mesh</string>
|
||||||
|
<string name="pref_summary_opt_clean_white">Clean mesh from textureless or colorless reconstructed polygons.</string>
|
||||||
|
<string name="pref_summary_opt_min_cluster_size">This can be used to filter polygons before texturing.</string>
|
||||||
|
<string name="pref_title_opt_min_cluster_size">Polygon Filtering</string>
|
||||||
|
|
||||||
|
<string-array name="pref_opt_depth_keys">
|
||||||
|
<item>"Auto"</item>
|
||||||
|
<item>"12"</item>
|
||||||
|
<item>"11"</item>
|
||||||
|
<item>"10"</item>
|
||||||
|
<item>"9"</item>
|
||||||
|
<item>"8"</item>
|
||||||
|
<item>"7"</item>
|
||||||
|
<item>"6"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_opt_depth_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"12"</item>
|
||||||
|
<item>"11"</item>
|
||||||
|
<item>"10"</item>
|
||||||
|
<item>"9"</item>
|
||||||
|
<item>"8"</item>
|
||||||
|
<item>"7"</item>
|
||||||
|
<item>"6"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_opt_color_radius_keys">
|
||||||
|
<item>"Nearest"</item>
|
||||||
|
<item>"2 m"</item>
|
||||||
|
<item>"1 m"</item>
|
||||||
|
<item>"0.5 m"</item>
|
||||||
|
<item>"0.2 m"</item>
|
||||||
|
<item>"0.1 m"</item>
|
||||||
|
<item>"0.05 m"</item>
|
||||||
|
<item>"0.025"</item>
|
||||||
|
<item>"0.02"</item>
|
||||||
|
<item>"0.015"</item>
|
||||||
|
<item>"0.01"</item>
|
||||||
|
<item>"Disabled"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_opt_color_radius_values">
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
<item>"0.5"</item>
|
||||||
|
<item>"0.2"</item>
|
||||||
|
<item>"0.1"</item>
|
||||||
|
<item>"0.05"</item>
|
||||||
|
<item>"0.025"</item>
|
||||||
|
<item>"0.02"</item>
|
||||||
|
<item>"0.015"</item>
|
||||||
|
<item>"0.01"</item>
|
||||||
|
<item>"-1"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_opt_min_cluster_size_keys">
|
||||||
|
<item>"Only biggest cluster kept"</item>
|
||||||
|
<item>"Keep all polygons"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_opt_min_cluster_size_values">
|
||||||
|
<item>"-1"</item>
|
||||||
|
<item>"0"</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string name="pref_title_general">General</string>
|
||||||
|
<string name="pref_title_gain_max_radius">Color Correction Radius</string>
|
||||||
|
<string name="pref_summary_gain_max_radius">Radius used to find pixel correspondences for Adjust Colors optimization.</string>
|
||||||
|
<string name="pref_title_cluster_ratio">Noise Filtering Ratio</string>
|
||||||
|
<string name="pref_summary_cluster_ratio">Polygon clusters with size smaller than this ratio of the largest cluster are removed by the Noise Filtering optimization.</string>
|
||||||
|
<string name="pref_title_notification_sound">Notification Sound</string>
|
||||||
|
<string name="pref_summary_notification_sound">After saving database or preparing data to export, a notification sound is played.</string>
|
||||||
|
|
||||||
|
<string-array name="pref_gain_max_radius_keys">
|
||||||
|
<item>"0.3 m"</item>
|
||||||
|
<item>"0.2 m"</item>
|
||||||
|
<item>"0.1 m"</item>
|
||||||
|
<item>"0.05 m"</item>
|
||||||
|
<item>"0.025 m"</item>
|
||||||
|
<item>"0.02 m"</item>
|
||||||
|
<item>"0.015 m"</item>
|
||||||
|
<item>"0.01 m"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_gain_max_radius_values">
|
||||||
|
<item>"0.3"</item>
|
||||||
|
<item>"0.2"</item>
|
||||||
|
<item>"0.1"</item>
|
||||||
|
<item>"0.05"</item>
|
||||||
|
<item>"0.025"</item>
|
||||||
|
<item>"0.02"</item>
|
||||||
|
<item>"0.015"</item>
|
||||||
|
<item>"0.01"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_cluster_ratio_keys">
|
||||||
|
<item>"Keep Largest Only"</item>
|
||||||
|
<item>"0.9"</item>
|
||||||
|
<item>"0.8"</item>
|
||||||
|
<item>"0.7"</item>
|
||||||
|
<item>"0.6"</item>
|
||||||
|
<item>"0.5"</item>
|
||||||
|
<item>"0.4"</item>
|
||||||
|
<item>"0.3"</item>
|
||||||
|
<item>"0.2"</item>
|
||||||
|
<item>"0.1"</item>
|
||||||
|
<item>"0.05"</item>
|
||||||
|
<item>"0.01"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_cluster_ratio_values">
|
||||||
|
<item>"1.0"</item>
|
||||||
|
<item>"0.9"</item>
|
||||||
|
<item>"0.8"</item>
|
||||||
|
<item>"0.7"</item>
|
||||||
|
<item>"0.6"</item>
|
||||||
|
<item>"0.5"</item>
|
||||||
|
<item>"0.4"</item>
|
||||||
|
<item>"0.3"</item>
|
||||||
|
<item>"0.2"</item>
|
||||||
|
<item>"0.1"</item>
|
||||||
|
<item>"0.05"</item>
|
||||||
|
<item>"0.01"</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string name="pref_title_presets">Presets</string>
|
||||||
|
<string name="pref_title_open_button">Open</string>
|
||||||
|
<string name="pref_title_save_button">Save</string>
|
||||||
|
<string name="pref_title_remove_button">Remove</string>
|
||||||
|
<string name="pref_title_reset_button">Restore All Default Settings</string>
|
||||||
|
<string name="title_activity_sketchfab">SketchfabActivity</string>
|
||||||
|
<string name="hello_world">Hello world!</string>
|
||||||
|
<string name="action_settings">Settings</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
10
app/android/res/values/styles.xml
Normal file
10
app/android/res/values/styles.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<resources>
|
||||||
|
<style name="ThemeActionBar" parent="@android:style/Widget.DeviceDefault.ActionBar.Solid">
|
||||||
|
<item name="android:background">#20000000</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="ThemeApp" parent="@android:style/Theme.DeviceDefault">
|
||||||
|
<item name="android:actionBarStyle">@style/ThemeActionBar</item>
|
||||||
|
<item name="android:windowActionBarOverlay">true</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
@@ -8,11 +8,13 @@ import java.io.BufferedReader;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
|
import android.text.method.LinkMovementMethod;
|
||||||
import android.text.util.Linkify;
|
import android.text.util.Linkify;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
@@ -33,8 +35,10 @@ public class AboutDialog extends Dialog{
|
|||||||
setContentView(R.layout.about);
|
setContentView(R.layout.about);
|
||||||
TextView tv = (TextView)findViewById(R.id.info_text);
|
TextView tv = (TextView)findViewById(R.id.info_text);
|
||||||
tv.setText(Html.fromHtml(readRawTextFile(R.raw.info)));
|
tv.setText(Html.fromHtml(readRawTextFile(R.raw.info)));
|
||||||
|
tv.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
tv.setLinkTextColor(Color.WHITE);
|
tv.setLinkTextColor(Color.WHITE);
|
||||||
Linkify.addLinks(tv, Linkify.ALL);
|
Linkify.addLinks(tv, Linkify.ALL);
|
||||||
|
tv.append(Html.fromHtml("<b><a href=http://introlab.github.io/rtabmap/index.html#privacy-policy>Privacy Policy</a></b>"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String readRawTextFile(int id) {
|
public static String readRawTextFile(int id) {
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.preference.SwitchPreference;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Switch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathieu
|
||||||
|
* Bug fix of switch preferences changing states
|
||||||
|
* when scrolling on Jelly Bean:
|
||||||
|
* https://issuetracker.google.com/issues/36941388#comment4
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class CustomSwitchPreference extends SwitchPreference {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a new SwitchPreference with the given style options.
|
||||||
|
*
|
||||||
|
* @param context The Context that will style this preference
|
||||||
|
* @param attrs Style attributes that differ from the default
|
||||||
|
* @param defStyle Theme attribute defining the default style options
|
||||||
|
*/
|
||||||
|
public CustomSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
|
||||||
|
super(context, attrs, defStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a new SwitchPreference with the given style options.
|
||||||
|
*
|
||||||
|
* @param context The Context that will style this preference
|
||||||
|
* @param attrs Style attributes that differ from the default
|
||||||
|
*/
|
||||||
|
public CustomSwitchPreference(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a new SwitchPreference with default style options.
|
||||||
|
*
|
||||||
|
* @param context The Context that will style this preference
|
||||||
|
*/
|
||||||
|
public CustomSwitchPreference(Context context) {
|
||||||
|
super(context, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onBindView(View view) {
|
||||||
|
// Clean listener before invoke SwitchPreference.onBindView
|
||||||
|
ViewGroup viewGroup= (ViewGroup)view;
|
||||||
|
clearListenerInViewGroup(viewGroup);
|
||||||
|
super.onBindView(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear listener in Switch for specify ViewGroup.
|
||||||
|
*
|
||||||
|
* @param viewGroup The ViewGroup that will need to clear the listener.
|
||||||
|
*/
|
||||||
|
private void clearListenerInViewGroup(ViewGroup viewGroup) {
|
||||||
|
if (null == viewGroup) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = viewGroup.getChildCount();
|
||||||
|
for(int n = 0; n < count; ++n) {
|
||||||
|
View childView = viewGroup.getChildAt(n);
|
||||||
|
if(childView instanceof Switch) {
|
||||||
|
final Switch switchView = (Switch) childView;
|
||||||
|
switchView.setOnCheckedChangeListener(null);
|
||||||
|
return;
|
||||||
|
} else if (childView instanceof ViewGroup){
|
||||||
|
ViewGroup childGroup = (ViewGroup)childView;
|
||||||
|
clearListenerInViewGroup(childGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.BaseAdapter;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.SimpleAdapter;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class DatabaseListArrayAdapter extends SimpleAdapter {
|
||||||
|
LayoutInflater inflater;
|
||||||
|
Context context;
|
||||||
|
ArrayList<HashMap<String, String>> arrayList;
|
||||||
|
int imageWidth;
|
||||||
|
|
||||||
|
public DatabaseListArrayAdapter(Context context, ArrayList<HashMap<String, String>> data, int resource, String[] from, int[] to) {
|
||||||
|
super(context, data, resource, from, to);
|
||||||
|
this.context = context;
|
||||||
|
this.arrayList = data;
|
||||||
|
this.imageWidth = (int)context.getResources().getDimension(R.dimen.image_width);
|
||||||
|
inflater.from(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getView(final int position, View convertView, ViewGroup parent) {
|
||||||
|
View view = super.getView(position, convertView, parent);
|
||||||
|
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
|
||||||
|
|
||||||
|
boolean imageSet = false;
|
||||||
|
String path = this.arrayList.get(position).get("path");
|
||||||
|
if(!path.isEmpty())
|
||||||
|
{
|
||||||
|
SQLiteDatabase db = null;
|
||||||
|
try {
|
||||||
|
db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
|
||||||
|
|
||||||
|
// get version
|
||||||
|
Cursor c1 = db.rawQuery("SELECT version FROM Admin", null);
|
||||||
|
if(c1.moveToFirst()) {
|
||||||
|
String version = c1.getString(c1.getColumnIndex("version"));
|
||||||
|
Log.i(RTABMapActivity.TAG, "Version="+version);
|
||||||
|
if(Util.versionCompare(version, "0.12.0") >= 0) {
|
||||||
|
Cursor c2 = db.rawQuery("SELECT preview_image FROM Admin WHERE preview_image is not null", null);
|
||||||
|
if(c2.moveToFirst()) {
|
||||||
|
Log.i(RTABMapActivity.TAG, "Found image preview for db " + path);
|
||||||
|
|
||||||
|
byte[] bytes = c2.getBlob(c2.getColumnIndex("preview_image"));
|
||||||
|
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
|
||||||
|
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
|
||||||
|
imageView.setImageBitmap(bitmap);
|
||||||
|
imageSet = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log.i(RTABMapActivity.TAG, "Not found image preview for db " + path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log.i(RTABMapActivity.TAG, "Too old database for preview image, path = " + path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log.e(RTABMapActivity.TAG, "Failed getting version from database");
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(RTABMapActivity.TAG, e.getMessage());
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if(db != null && db.isOpen()) {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.e(RTABMapActivity.TAG, "Database path empty for item " + position);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!imageSet)
|
||||||
|
{
|
||||||
|
Drawable myDrawable = context.getResources().getDrawable(R.drawable.ic_launcher);
|
||||||
|
imageView.setImageDrawable(myDrawable);
|
||||||
|
}
|
||||||
|
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(imageWidth,imageWidth/(!imageSet?2:1));
|
||||||
|
imageView.setLayoutParams(layoutParams);
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
148
app/android/src/com/introlab/rtabmap/MultipartUtility.java
Normal file
148
app/android/src/com/introlab/rtabmap/MultipartUtility.java
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This utility class provides an abstraction layer for sending multipart HTTP
|
||||||
|
* POST requests to a web server.
|
||||||
|
* @author www.codejava.net
|
||||||
|
* http://www.codejava.net/java-se/networking/upload-files-by-sending-multipart-request-programmatically
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class MultipartUtility {
|
||||||
|
private final String boundary;
|
||||||
|
private static final String LINE_FEED = "\r\n";
|
||||||
|
private HttpURLConnection httpConn;
|
||||||
|
private String charset;
|
||||||
|
private OutputStream outputStream;
|
||||||
|
private PrintWriter writer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This constructor initializes a new HTTP POST request with content type
|
||||||
|
* is set to multipart/form-data
|
||||||
|
* @param requestURL
|
||||||
|
* @param charset
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public MultipartUtility(String requestURL, String token, String charset)
|
||||||
|
throws IOException {
|
||||||
|
this.charset = charset;
|
||||||
|
|
||||||
|
// creates a unique boundary based on time stamp
|
||||||
|
boundary = "===" + System.currentTimeMillis() + "===";
|
||||||
|
|
||||||
|
URL url = new URL(requestURL);
|
||||||
|
httpConn = (HttpURLConnection) url.openConnection();
|
||||||
|
httpConn.setUseCaches(false);
|
||||||
|
httpConn.setDoOutput(true); // indicates POST method
|
||||||
|
httpConn.setDoInput(true);
|
||||||
|
httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
|
||||||
|
httpConn.setRequestProperty("Authorization", "Bearer " + token);
|
||||||
|
outputStream = httpConn.getOutputStream();
|
||||||
|
writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a form field to the request
|
||||||
|
* @param name field name
|
||||||
|
* @param value field value
|
||||||
|
*/
|
||||||
|
public void addFormField(String name, String value) {
|
||||||
|
writer.append("--" + boundary).append(LINE_FEED);
|
||||||
|
writer.append("Content-Disposition: form-data; name=\"" + name + "\"").append(LINE_FEED);
|
||||||
|
writer.append("Content-Type: text/plain; charset=" + charset).append(LINE_FEED);
|
||||||
|
writer.append(LINE_FEED);
|
||||||
|
writer.append(value).append(LINE_FEED);
|
||||||
|
writer.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a upload file section to the request
|
||||||
|
* @param fieldName name attribute in <input type="file" name="..." />
|
||||||
|
* @param uploadFile a File to be uploaded
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void addFilePart(String fieldName, File uploadFile)
|
||||||
|
throws IOException {
|
||||||
|
String fileName = uploadFile.getName();
|
||||||
|
writer.append("--" + boundary).append(LINE_FEED);
|
||||||
|
writer.append(
|
||||||
|
"Content-Disposition: form-data; name=\"" + fieldName
|
||||||
|
+ "\"; filename=\"" + fileName + "\"")
|
||||||
|
.append(LINE_FEED);
|
||||||
|
writer.append(
|
||||||
|
"Content-Type: "
|
||||||
|
+ URLConnection.guessContentTypeFromName(fileName))
|
||||||
|
.append(LINE_FEED);
|
||||||
|
writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
|
||||||
|
writer.append(LINE_FEED);
|
||||||
|
writer.flush();
|
||||||
|
|
||||||
|
FileInputStream inputStream = new FileInputStream(uploadFile);
|
||||||
|
byte[] buffer = new byte[4096];
|
||||||
|
int bytesRead = -1;
|
||||||
|
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||||
|
outputStream.write(buffer, 0, bytesRead);
|
||||||
|
}
|
||||||
|
outputStream.flush();
|
||||||
|
inputStream.close();
|
||||||
|
|
||||||
|
writer.append(LINE_FEED);
|
||||||
|
writer.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a header field to the request.
|
||||||
|
* @param name - name of the header field
|
||||||
|
* @param value - value of the header field
|
||||||
|
*/
|
||||||
|
public void addHeaderField(String name, String value) {
|
||||||
|
writer.append(name + ": " + value).append(LINE_FEED);
|
||||||
|
writer.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Completes the request and receives response from the server.
|
||||||
|
* @return a list of Strings as response in case the server returned
|
||||||
|
* status OK, otherwise an exception is thrown.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public List<String> finish() throws IOException {
|
||||||
|
List<String> response = new ArrayList<String>();
|
||||||
|
|
||||||
|
writer.append(LINE_FEED).flush();
|
||||||
|
writer.append("--" + boundary + "--").append(LINE_FEED);
|
||||||
|
writer.close();
|
||||||
|
|
||||||
|
// checks server's status code first
|
||||||
|
int status = httpConn.getResponseCode();
|
||||||
|
if (status == 201) {
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(
|
||||||
|
httpConn.getInputStream()));
|
||||||
|
String line = null;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
response.add(line);
|
||||||
|
}
|
||||||
|
reader.close();
|
||||||
|
httpConn.disconnect();
|
||||||
|
} else {
|
||||||
|
throw new IOException("Server returned non-OK status: " + status + ", msg: " + httpConn.getResponseMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
||||||
43
app/android/src/com/introlab/rtabmap/NDSpinner.java
Normal file
43
app/android/src/com/introlab/rtabmap/NDSpinner.java
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.widget.Spinner;
|
||||||
|
|
||||||
|
|
||||||
|
/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value
|
||||||
|
Author: Mattia Ruggiero
|
||||||
|
https://stackoverflow.com/questions/5335306/how-can-i-get-an-event-in-android-spinner-when-the-current-selected-item-is-sele
|
||||||
|
*/
|
||||||
|
public class NDSpinner extends Spinner {
|
||||||
|
|
||||||
|
public NDSpinner(Context context)
|
||||||
|
{ super(context); }
|
||||||
|
|
||||||
|
public NDSpinner(Context context, AttributeSet attrs)
|
||||||
|
{ super(context, attrs); }
|
||||||
|
|
||||||
|
public NDSpinner(Context context, AttributeSet attrs, int defStyle)
|
||||||
|
{ super(context, attrs, defStyle); }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSelection(int position, boolean animate) {
|
||||||
|
boolean sameSelected = position == getSelectedItemPosition();
|
||||||
|
super.setSelection(position, animate);
|
||||||
|
if (sameSelected) {
|
||||||
|
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
|
||||||
|
//getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSelection(int position) {
|
||||||
|
boolean sameSelected = position == getSelectedItemPosition();
|
||||||
|
super.setSelection(position);
|
||||||
|
if (sameSelected) {
|
||||||
|
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
|
||||||
|
getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,8 @@
|
|||||||
|
|
||||||
package com.introlab.rtabmap;
|
package com.introlab.rtabmap;
|
||||||
|
import android.os.IBinder;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
|
||||||
// Wrapper for native library
|
// Wrapper for native library
|
||||||
@@ -8,19 +10,32 @@ import android.view.KeyEvent;
|
|||||||
public class RTABMapLib
|
public class RTABMapLib
|
||||||
{
|
{
|
||||||
|
|
||||||
static
|
static {
|
||||||
{
|
// This project depends on tango_client_api, so we need to make sure we load
|
||||||
System.loadLibrary("NativeRTABMap");
|
// the correct library first.
|
||||||
|
if (TangoInitializationHelper.loadTangoSharedLibrary() ==
|
||||||
|
TangoInitializationHelper.ARCH_ERROR) {
|
||||||
|
Log.e(RTABMapActivity.class.getSimpleName(), "ERROR! Unable to load libtango_client_api.so!");
|
||||||
|
}
|
||||||
|
System.loadLibrary("NativeRTABMap");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the Tango Service, this function starts the communication
|
// Initialize the Tango Service, this function starts the communication
|
||||||
// between the application and Tango Service.
|
// between the application and Tango Service.
|
||||||
// The activity object is used for checking if the API version is outdated.
|
// The activity object is used for checking if the API version is outdated.
|
||||||
public static native int initialize(RTABMapActivity activity);
|
public static native void onCreate(RTABMapActivity activity);
|
||||||
|
|
||||||
public static native void openDatabase(String databasePath);
|
public static native void setScreenRotation(int displayRotation, int cameraRotation);
|
||||||
|
|
||||||
public static native int onResume();
|
public static native int openDatabase(String databasePath, boolean databaseInMemory, boolean optimize);
|
||||||
|
public static native int openDatabase2(String databaseSource, String databasePath, boolean databaseInMemory, boolean optimize);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called when the Tango service is connected.
|
||||||
|
*
|
||||||
|
* @param binder The native binder object.
|
||||||
|
*/
|
||||||
|
public static native boolean onTangoServiceConnected(IBinder binder);
|
||||||
|
|
||||||
// Release all non OpenGl resources that are allocated from the program.
|
// Release all non OpenGl resources that are allocated from the program.
|
||||||
public static native void onPause();
|
public static native void onPause();
|
||||||
@@ -44,24 +59,69 @@ public class RTABMapLib
|
|||||||
|
|
||||||
|
|
||||||
public static native void setPausedMapping(boolean paused);
|
public static native void setPausedMapping(boolean paused);
|
||||||
|
public static native void setOnlineBlending(boolean enabled);
|
||||||
public static native void setMapCloudShown(boolean shown);
|
public static native void setMapCloudShown(boolean shown);
|
||||||
public static native void setOdomCloudShown(boolean shown);
|
public static native void setOdomCloudShown(boolean shown);
|
||||||
public static native void setMeshRendering(boolean enabled);
|
public static native void setMeshRendering(boolean enabled, boolean withTexture);
|
||||||
public static native void setLocalizationMode(boolean enabled);
|
public static native void setLocalizationMode(boolean enabled);
|
||||||
public static native void setTrajectoryMode(boolean enabled);
|
public static native void setTrajectoryMode(boolean enabled);
|
||||||
public static native void setGraphOptimization(boolean enabled);
|
public static native void setGraphOptimization(boolean enabled);
|
||||||
public static native void setNodesFiltering(boolean enabled);
|
public static native void setNodesFiltering(boolean enabled);
|
||||||
public static native void setGraphVisible(boolean visible);
|
public static native void setGraphVisible(boolean visible);
|
||||||
public static native void setAutoExposure(boolean enabled);
|
public static native void setGridVisible(boolean visible);
|
||||||
|
public static native void setRawScanSaved(boolean enabled);
|
||||||
public static native void setFullResolution(boolean enabled);
|
public static native void setFullResolution(boolean enabled);
|
||||||
|
public static native void setSmoothing(boolean enabled);
|
||||||
|
public static native void setCameraColor(boolean enabled);
|
||||||
|
public static native void setAppendMode(boolean enabled);
|
||||||
|
public static native void setDataRecorderMode(boolean enabled);
|
||||||
public static native void setMaxCloudDepth(float value);
|
public static native void setMaxCloudDepth(float value);
|
||||||
|
public static native void setMinCloudDepth(float value);
|
||||||
|
public static native void setPointSize(float value);
|
||||||
|
public static native void setFOV(float value);
|
||||||
|
public static native void setOrthoCropFactor(float value);
|
||||||
|
public static native void setGridRotation(float value);
|
||||||
|
public static native void setLighting(boolean enabled);
|
||||||
|
public static native void setBackfaceCulling(boolean enabled);
|
||||||
|
public static native void setWireframe(boolean enabled);
|
||||||
|
public static native void setCloudDensityLevel(int value);
|
||||||
public static native void setMeshAngleTolerance(float value);
|
public static native void setMeshAngleTolerance(float value);
|
||||||
public static native void setMeshTriangleSize(int value);
|
public static native void setMeshTriangleSize(int value);
|
||||||
|
public static native void setClusterRatio(float value);
|
||||||
|
public static native void setMaxGainRadius(float value);
|
||||||
|
public static native void setRenderingTextureDecimation(int value);
|
||||||
|
public static native void setBackgroundColor(float gray);
|
||||||
public static native int setMappingParameter(String key, String value);
|
public static native int setMappingParameter(String key, String value);
|
||||||
|
public static native void setGPS(
|
||||||
|
double stamp,
|
||||||
|
double longitude,
|
||||||
|
double latitude,
|
||||||
|
double altitude,
|
||||||
|
double accuracy,
|
||||||
|
double bearing);
|
||||||
|
|
||||||
public static native void resetMapping();
|
public static native void resetMapping();
|
||||||
public static native void save();
|
public static native void save(String outputDatabasePath);
|
||||||
public static native boolean exportMesh(String filePath);
|
public static native void cancelProcessing();
|
||||||
|
public static native boolean exportMesh(
|
||||||
|
float cloudVoxelSize,
|
||||||
|
boolean regenerateCloud,
|
||||||
|
boolean meshing,
|
||||||
|
int textureSize,
|
||||||
|
int textureCount,
|
||||||
|
int normalK,
|
||||||
|
boolean optimized,
|
||||||
|
float optimizedVoxelSize,
|
||||||
|
int optimizedDepth,
|
||||||
|
int optimizedMaxPolygons,
|
||||||
|
float optimizedColorRadius,
|
||||||
|
boolean optimizedCleanWhitePolygons,
|
||||||
|
int optimizedMinClusterSize,
|
||||||
|
float optimizedMaxTextureDistance,
|
||||||
|
int optimizedMinTextureClusterSize,
|
||||||
|
boolean blockRendering);
|
||||||
|
public static native boolean writeExportedMesh(String directory, String name);
|
||||||
|
public static native boolean postExportation(boolean visualize);
|
||||||
public static native int postProcessing(int approach);
|
public static native int postProcessing(int approach);
|
||||||
|
|
||||||
public static native String getStatus();
|
public static native String getStatus();
|
||||||
|
|||||||
@@ -16,8 +16,16 @@
|
|||||||
|
|
||||||
package com.introlab.rtabmap;
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.app.ProgressDialog;
|
import android.app.ProgressDialog;
|
||||||
|
import android.opengl.GLES20;
|
||||||
import android.opengl.GLSurfaceView;
|
import android.opengl.GLSurfaceView;
|
||||||
|
import android.opengl.Matrix;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import javax.microedition.khronos.egl.EGLConfig;
|
import javax.microedition.khronos.egl.EGLConfig;
|
||||||
import javax.microedition.khronos.opengles.GL10;
|
import javax.microedition.khronos.opengles.GL10;
|
||||||
@@ -26,30 +34,195 @@ import javax.microedition.khronos.opengles.GL10;
|
|||||||
// ground grid, camera frustum, camera axis, and trajectory based on the Tango
|
// ground grid, camera frustum, camera axis, and trajectory based on the Tango
|
||||||
// device's pose.
|
// device's pose.
|
||||||
public class Renderer implements GLSurfaceView.Renderer {
|
public class Renderer implements GLSurfaceView.Renderer {
|
||||||
|
|
||||||
|
private final float[] mtrxProjection = new float[16];
|
||||||
|
private final float[] mtrxView = new float[16];
|
||||||
|
private final float[] mtrxProjectionAndView = new float[16];
|
||||||
|
|
||||||
|
private TextManager mTextManager = null;
|
||||||
|
private float mSurfaceHeight = 0.0f;
|
||||||
|
private float mTextColor = 1.0f;
|
||||||
|
private int mOffset = 0;
|
||||||
|
|
||||||
private ProgressDialog mProgressDialog;
|
private Vector<TextObject> mTexts;
|
||||||
|
|
||||||
|
private static RTABMapActivity mActivity;
|
||||||
|
public Renderer(RTABMapActivity c) {
|
||||||
|
mActivity = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ProgressDialog mProgressDialog = null;
|
||||||
|
private Toast mToast = null;
|
||||||
|
|
||||||
|
private boolean mTextChanged = false;
|
||||||
|
private ReentrantLock mTextLock = new ReentrantLock();
|
||||||
|
|
||||||
public void setProgressDialog(ProgressDialog progressDialog)
|
public void setProgressDialog(ProgressDialog progressDialog)
|
||||||
{
|
{
|
||||||
mProgressDialog = progressDialog;
|
mProgressDialog = progressDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setToast(Toast toast)
|
||||||
|
{
|
||||||
|
mToast = toast;
|
||||||
|
}
|
||||||
|
|
||||||
// Render loop of the Gl context.
|
public void setOffset(int offset)
|
||||||
public void onDrawFrame(GL10 gl) {
|
{
|
||||||
int value = RTABMapLib.render();
|
mOffset = offset;
|
||||||
if(value == 1 && mProgressDialog != null)
|
}
|
||||||
{
|
|
||||||
mProgressDialog.dismiss();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called when the surface size changes.
|
// Render loop of the Gl context.
|
||||||
public void onSurfaceChanged(GL10 gl, int width, int height) {
|
public void onDrawFrame(GL10 useGLES20instead) {
|
||||||
RTABMapLib.setupGraphic(width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called when the surface is created or recreated.
|
try
|
||||||
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
|
{
|
||||||
RTABMapLib.initGlContent();
|
final int value = RTABMapLib.render();
|
||||||
}
|
|
||||||
|
if(mTextManager!=null)
|
||||||
|
{
|
||||||
|
if(mTextChanged)
|
||||||
|
{
|
||||||
|
mTextChanged = false;
|
||||||
|
Vector<TextObject> txtcollection = new Vector<TextObject>();
|
||||||
|
|
||||||
|
mTextLock.lock();
|
||||||
|
try {
|
||||||
|
if(mTexts.size() > 0)
|
||||||
|
{
|
||||||
|
txtcollection.addAll(mTexts);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
mTextLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare the text for rendering
|
||||||
|
mTextManager.PrepareDraw(txtcollection);
|
||||||
|
}
|
||||||
|
|
||||||
|
float[] mvp = new float[16];
|
||||||
|
Matrix.translateM(mvp, 0, mtrxProjectionAndView, 0, 0, mOffset, 0);
|
||||||
|
mTextManager.Draw(mvp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(value != 0 && mProgressDialog != null && mProgressDialog.isShowing())
|
||||||
|
{
|
||||||
|
mActivity.runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if(!RTABMapActivity.DISABLE_LOG) Log.i("RTABMapActivity", "Renderer: dismiss dialog, value received=" + String.valueOf(value));
|
||||||
|
mProgressDialog.dismiss();
|
||||||
|
mActivity.resetNoTouchTimer();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if(value==-1)
|
||||||
|
{
|
||||||
|
mActivity.runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if(mToast!=null)
|
||||||
|
{
|
||||||
|
mToast.makeText(mActivity, String.format("Out of Memory!"), Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if(value==-2)
|
||||||
|
{
|
||||||
|
mActivity.runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if(mToast!=null)
|
||||||
|
{
|
||||||
|
mToast.makeText(mActivity, String.format("Rendering Error!"), Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(final Exception e)
|
||||||
|
{
|
||||||
|
mActivity.runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if(mToast!=null)
|
||||||
|
{
|
||||||
|
mToast.makeText(mActivity, String.format("Rendering error! %s", e.getMessage()), Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when the surface size changes.
|
||||||
|
public void onSurfaceChanged(GL10 useGLES20instead, int width, int height) {
|
||||||
|
|
||||||
|
RTABMapLib.setupGraphic(width, height);
|
||||||
|
|
||||||
|
mSurfaceHeight = (float)height;
|
||||||
|
|
||||||
|
// Clear our matrices
|
||||||
|
for(int i=0;i<16;i++)
|
||||||
|
{
|
||||||
|
mtrxProjection[i] = 0.0f;
|
||||||
|
mtrxView[i] = 0.0f;
|
||||||
|
mtrxProjectionAndView[i] = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup our screen width and height for normal sprite translation.
|
||||||
|
Matrix.orthoM(mtrxProjection, 0, 0f, width, 0.0f, height, 0, 50);
|
||||||
|
|
||||||
|
// Set the camera position (View matrix)
|
||||||
|
Matrix.setLookAtM(mtrxView, 0, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
|
// Calculate the projection and view transformation
|
||||||
|
Matrix.multiplyMM(mtrxProjectionAndView, 0, mtrxProjection, 0, mtrxView, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when the surface is created or recreated.
|
||||||
|
public void onSurfaceCreated(GL10 useGLES20instead, EGLConfig config) {
|
||||||
|
|
||||||
|
RTABMapLib.initGlContent();
|
||||||
|
|
||||||
|
// Create our text manager
|
||||||
|
mTextManager = new TextManager(mActivity);
|
||||||
|
mTextManager.setColor(mTextColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateTexts(String[] texts)
|
||||||
|
{
|
||||||
|
if(mTextManager != null && mSurfaceHeight > 0.0f)
|
||||||
|
{
|
||||||
|
Vector<TextObject> textObjects = new Vector<TextObject>();
|
||||||
|
float offset = mSurfaceHeight-mTextManager.getMaxTextHeight();
|
||||||
|
if(texts != null)
|
||||||
|
{
|
||||||
|
for(int i=0;i<texts.length; ++i)
|
||||||
|
{
|
||||||
|
if(texts[i]!=null && texts[i].length()>0)
|
||||||
|
{
|
||||||
|
TextObject txt = new TextObject(texts[i], 0, offset);
|
||||||
|
textObjects.add(txt);
|
||||||
|
}
|
||||||
|
offset-=mTextManager.getMaxTextHeight();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mTextLock.lock();
|
||||||
|
try {
|
||||||
|
mTexts = textObjects;
|
||||||
|
} finally {
|
||||||
|
mTextLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
mTextChanged = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTextColor(float color)
|
||||||
|
{
|
||||||
|
mTextColor = color;
|
||||||
|
if(mTextManager != null)
|
||||||
|
{
|
||||||
|
mTextManager.setColor(mTextColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
330
app/android/src/com/introlab/rtabmap/SettingsActivity.java
Normal file
330
app/android/src/com/introlab/rtabmap/SettingsActivity.java
Normal file
@@ -0,0 +1,330 @@
|
|||||||
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.ListPreference;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.PreferenceActivity;
|
||||||
|
import android.text.InputType;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
|
import android.widget.EditText;
|
||||||
|
|
||||||
|
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
|
private SettingsActivity getActivity() {return this;}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
addPreferencesFromResource(R.layout.activity_settings);
|
||||||
|
|
||||||
|
Preference buttonReset = findPreference(getString(R.string.pref_key_reset_button));
|
||||||
|
buttonReset.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
getPreferenceScreen().getSharedPreferences().edit().clear().commit();
|
||||||
|
|
||||||
|
recreate();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Preference buttonOpen = findPreference(getString(R.string.pref_key_open_button));
|
||||||
|
buttonOpen.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
File prefsdir = new File(getApplicationInfo().dataDir,"shared_prefs");
|
||||||
|
if(prefsdir.exists() && prefsdir.isDirectory()){
|
||||||
|
ArrayList<String> filesArray = new ArrayList<String>(Arrays.asList(prefsdir.list()));
|
||||||
|
ArrayList<String> newList = new ArrayList<String>();
|
||||||
|
filesArray.remove("com.introlab.rtabmap_preferences.xml");
|
||||||
|
filesArray.remove("WebViewChromiumPrefs.xml");
|
||||||
|
for (String s : filesArray) {
|
||||||
|
newList.add(s.substring(0, s.length()-4)); // rip off the ".xml"
|
||||||
|
}
|
||||||
|
final String[] files = newList.toArray(new String[filesArray.size()]);
|
||||||
|
if(files.length > 0)
|
||||||
|
{
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
builder.setTitle("Choose Presets:");
|
||||||
|
builder.setItems(files, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, final int which) {
|
||||||
|
//sp1 is the shared pref to copy to
|
||||||
|
SharedPreferences.Editor ed = getPreferenceScreen().getSharedPreferences().edit();
|
||||||
|
SharedPreferences sp = getActivity().getSharedPreferences(files[which], MODE_PRIVATE); //The shared preferences to copy from
|
||||||
|
//Cycle through all the entries in the sp
|
||||||
|
for(Entry<String,?> entry : sp.getAll().entrySet()){
|
||||||
|
Object v = entry.getValue();
|
||||||
|
String key = entry.getKey();
|
||||||
|
//Now we just figure out what type it is, so we can copy it.
|
||||||
|
// Note that i am using Boolean and Integer instead of boolean and int.
|
||||||
|
// That's because the Entry class can only hold objects and int and boolean are primatives.
|
||||||
|
if(v instanceof Boolean)
|
||||||
|
// Also note that i have to cast the object to a Boolean
|
||||||
|
// and then use .booleanValue to get the boolean
|
||||||
|
ed.putBoolean(key, ((Boolean)v).booleanValue());
|
||||||
|
else if(v instanceof Float)
|
||||||
|
ed.putFloat(key, ((Float)v).floatValue());
|
||||||
|
else if(v instanceof Integer)
|
||||||
|
ed.putInt(key, ((Integer)v).intValue());
|
||||||
|
else if(v instanceof Long)
|
||||||
|
ed.putLong(key, ((Long)v).longValue());
|
||||||
|
else if(v instanceof String)
|
||||||
|
ed.putString(key, ((String)v));
|
||||||
|
}
|
||||||
|
ed.commit(); //save it.
|
||||||
|
recreate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Preference buttonSave = findPreference(getString(R.string.pref_key_save_button));
|
||||||
|
buttonSave.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
builder.setTitle("Save Presets:");
|
||||||
|
final EditText input = new EditText(getActivity());
|
||||||
|
input.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||||
|
input.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
|
||||||
|
builder.setView(input);
|
||||||
|
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which)
|
||||||
|
{
|
||||||
|
final String fileName = input.getText().toString();
|
||||||
|
dialog.dismiss();
|
||||||
|
if(!fileName.isEmpty())
|
||||||
|
{
|
||||||
|
File newFile = new File(getApplicationInfo().dataDir + "/shared_prefs/" + fileName + ".xml");
|
||||||
|
if(newFile.exists())
|
||||||
|
{
|
||||||
|
new AlertDialog.Builder(getActivity())
|
||||||
|
.setTitle("Presets Already Exist")
|
||||||
|
.setMessage("Do you want to overwrite the existing file?")
|
||||||
|
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
saveConfig(fileName);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton("No", new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
dialog.dismiss();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
saveConfig(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
AlertDialog alertToShow = builder.create();
|
||||||
|
alertToShow.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
|
||||||
|
alertToShow.show();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Preference buttonRemove = findPreference(getString(R.string.pref_key_remove_button));
|
||||||
|
buttonRemove.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
File prefsdir = new File(getApplicationInfo().dataDir,"shared_prefs");
|
||||||
|
if(prefsdir.exists() && prefsdir.isDirectory()){
|
||||||
|
ArrayList<String> filesArray = new ArrayList<String>(Arrays.asList(prefsdir.list()));
|
||||||
|
ArrayList<String> newList = new ArrayList<String>();
|
||||||
|
filesArray.remove("com.introlab.rtabmap_preferences.xml");
|
||||||
|
filesArray.remove("WebViewChromiumPrefs.xml");
|
||||||
|
for (String s : filesArray) {
|
||||||
|
newList.add(s.substring(0, s.length()-4)); // rip off the ".xml"
|
||||||
|
}
|
||||||
|
final String[] files = newList.toArray(new String[filesArray.size()]);
|
||||||
|
if(files.length > 0)
|
||||||
|
{
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
builder.setTitle("Remove Presets:");
|
||||||
|
builder.setItems(files, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, final int which) {
|
||||||
|
File file = new File(getApplicationInfo().dataDir + "/shared_prefs/" + files[which] + ".xml");
|
||||||
|
if(file.exists())
|
||||||
|
{
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_density))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_density))).getEntry() + ") "+getString(R.string.pref_summary_density));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_depth))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_depth))).getEntry() + ") "+getString(R.string.pref_summary_depth));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_min_depth))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_min_depth))).getEntry() + ") "+getString(R.string.pref_summary_min_depth));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_point_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_point_size))).getEntry() + ") "+getString(R.string.pref_summary_point_size));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_angle))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_angle))).getEntry() + ") "+getString(R.string.pref_summary_angle));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_triangle))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_triangle))).getEntry() + ") "+getString(R.string.pref_summary_triangle));
|
||||||
|
((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_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_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_mem_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_mem_thr))).getEntry() + ") "+getString(R.string.pref_summary_mem_thr));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_loop_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_loop_thr))).getEntry() + ") "+getString(R.string.pref_summary_loop_thr));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_sim_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_sim_thr))).getEntry() + ") "+getString(R.string.pref_summary_sim_thr));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_min_inliers))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_min_inliers))).getEntry() + ") "+getString(R.string.pref_summary_min_inliers));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_opt_error))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_error))).getEntry() + ") "+getString(R.string.pref_summary_opt_error));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_features_voc))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_features_voc))).getEntry() + ") "+getString(R.string.pref_summary_features_voc));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_features))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_features))).getEntry() + ") "+getString(R.string.pref_summary_features));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_features_type))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_features_type))).getEntry() + ") "+getString(R.string.pref_summary_features_type));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_optimizer))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_optimizer))).getEntry() + ") "+getString(R.string.pref_summary_optimizer));
|
||||||
|
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_cloud_voxel))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_cloud_voxel))).getEntry() + ") "+getString(R.string.pref_summary_cloud_voxel));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_texture_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_texture_size))).getEntry() + ") "+getString(R.string.pref_summary_texture_size));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_texture_count))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_texture_count))).getEntry() + ") "+getString(R.string.pref_summary_texture_count));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_normal_k))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_normal_k))).getEntry() + ") "+getString(R.string.pref_summary_normal_k));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_max_texture_distance))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_texture_distance))).getEntry() + ") "+getString(R.string.pref_summary_max_texture_distance));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_min_texture_cluster_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_min_texture_cluster_size))).getEntry() + ") "+getString(R.string.pref_summary_min_texture_cluster_size));
|
||||||
|
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_opt_depth))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_depth))).getEntry() + ") "+getString(R.string.pref_summary_opt_depth));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_opt_color_radius))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_color_radius))).getEntry() + ") "+getString(R.string.pref_summary_opt_color_radius));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_opt_min_cluster_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_min_cluster_size))).getEntry() + ") "+getString(R.string.pref_summary_opt_min_cluster_size));
|
||||||
|
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_cluster_ratio))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_cluster_ratio))).getEntry() + ") "+getString(R.string.pref_summary_cluster_ratio));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_gain_max_radius))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_gain_max_radius))).getEntry() + ") "+getString(R.string.pref_summary_gain_max_radius));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
|
Preference pref = findPreference(key);
|
||||||
|
|
||||||
|
if (pref instanceof ListPreference) {
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_density))==0) pref.setSummary("("+ ((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_density));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_depth))==0)
|
||||||
|
{
|
||||||
|
pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_depth));
|
||||||
|
float maxDepth = Float.parseFloat(((ListPreference)pref).getValue());
|
||||||
|
float minDepth = Float.parseFloat(((ListPreference)findPreference(getString(R.string.pref_key_min_depth))).getValue());
|
||||||
|
if(maxDepth > 0.0f && maxDepth <= minDepth)
|
||||||
|
{
|
||||||
|
((ListPreference)findPreference(getString(R.string.pref_key_min_depth))).setValueIndex(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_min_depth))==0)
|
||||||
|
{
|
||||||
|
pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_min_depth));
|
||||||
|
float maxDepth = Float.parseFloat(((ListPreference)findPreference(getString(R.string.pref_key_depth))).getValue());
|
||||||
|
float minDepth = Float.parseFloat(((ListPreference)pref).getValue());
|
||||||
|
if(minDepth >= maxDepth)
|
||||||
|
{
|
||||||
|
((ListPreference)findPreference(getString(R.string.pref_key_depth))).setValueIndex(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_point_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_point_size));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_angle))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_angle));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_triangle))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_triangle));
|
||||||
|
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_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_time_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_mem_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_mem_thr));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_loop_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_loop_thr));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_sim_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_sim_thr));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_min_inliers))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_min_inliers));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_opt_error))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_opt_error));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_features_voc))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_features_voc));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_features))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_features));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_features_type))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_features_type));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_optimizer))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_optimizer));
|
||||||
|
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_cloud_voxel))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_cloud_voxel));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_texture_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_texture_size));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_texture_count))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_texture_count));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_normal_k))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_normal_k));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_max_texture_distance))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_texture_distance));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_min_texture_cluster_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_min_texture_cluster_size));
|
||||||
|
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_opt_depth))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_opt_depth));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_opt_color_radius))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_opt_color_radius));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_opt_min_cluster_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_opt_min_cluster_size));
|
||||||
|
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_cluster_ratio))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_cluster_ratio));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_gain_max_radius))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_gain_max_radius));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
// Set up a listener whenever a key changes
|
||||||
|
getPreferenceScreen().getSharedPreferences()
|
||||||
|
.registerOnSharedPreferenceChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
// Unregister the listener whenever a key changes
|
||||||
|
getPreferenceScreen().getSharedPreferences()
|
||||||
|
.unregisterOnSharedPreferenceChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveConfig(String fileName)
|
||||||
|
{
|
||||||
|
//sp1 is the shared pref to copy to
|
||||||
|
SharedPreferences.Editor ed = getActivity().getSharedPreferences(fileName, MODE_PRIVATE).edit();
|
||||||
|
SharedPreferences sp = getPreferenceScreen().getSharedPreferences(); //The shared preferences to copy from
|
||||||
|
ed.clear(); // This clears the one we are copying to, but you don't necessarily need to do that.
|
||||||
|
//Cycle through all the entries in the sp
|
||||||
|
for(Entry<String,?> entry : sp.getAll().entrySet()){
|
||||||
|
Object v = entry.getValue();
|
||||||
|
String key = entry.getKey();
|
||||||
|
//Now we just figure out what type it is, so we can copy it.
|
||||||
|
// Note that i am using Boolean and Integer instead of boolean and int.
|
||||||
|
// That's because the Entry class can only hold objects and int and boolean are primatives.
|
||||||
|
if(v instanceof Boolean)
|
||||||
|
// Also note that i have to cast the object to a Boolean
|
||||||
|
// and then use .booleanValue to get the boolean
|
||||||
|
ed.putBoolean(key, ((Boolean)v).booleanValue());
|
||||||
|
else if(v instanceof Float)
|
||||||
|
ed.putFloat(key, ((Float)v).floatValue());
|
||||||
|
else if(v instanceof Integer)
|
||||||
|
ed.putInt(key, ((Integer)v).intValue());
|
||||||
|
else if(v instanceof Long)
|
||||||
|
ed.putLong(key, ((Long)v).longValue());
|
||||||
|
else if(v instanceof String)
|
||||||
|
ed.putString(key, ((String)v));
|
||||||
|
}
|
||||||
|
ed.commit(); //save it.
|
||||||
|
}
|
||||||
|
}
|
||||||
453
app/android/src/com/introlab/rtabmap/SketchfabActivity.java
Normal file
453
app/android/src/com/introlab/rtabmap/SketchfabActivity.java
Normal file
@@ -0,0 +1,453 @@
|
|||||||
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.app.ProgressDialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.NetworkInfo;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.SpannableString;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.text.method.LinkMovementMethod;
|
||||||
|
import android.text.util.Linkify;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.View.OnClickListener;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
import android.webkit.WebViewClient;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
public class SketchfabActivity extends Activity implements OnClickListener {
|
||||||
|
|
||||||
|
private static final String AUTHORIZE_PATH = "https://sketchfab.com/oauth2/authorize";
|
||||||
|
private static final String CLIENT_ID = "RXrIJYAwlTELpySsyM8TrK9r3kOGQ5Qjj9VVDIfV";
|
||||||
|
private static final String REDIRECT_URI = "https://introlab.github.io/rtabmap/oauth2_redirect";
|
||||||
|
|
||||||
|
ProgressDialog mProgressDialog;
|
||||||
|
|
||||||
|
private Dialog mAuthDialog;
|
||||||
|
|
||||||
|
private String mAuthToken;
|
||||||
|
private String mWorkingDirectory;
|
||||||
|
|
||||||
|
EditText mFilename;
|
||||||
|
EditText mDescription;
|
||||||
|
EditText mTags;
|
||||||
|
CheckBox mDraft;
|
||||||
|
Button mButtonOk;
|
||||||
|
|
||||||
|
private SketchfabActivity getActivity() {return this;}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_sketchfab);
|
||||||
|
|
||||||
|
mFilename = (EditText)findViewById(R.id.editText_filename);
|
||||||
|
mDescription = (EditText)findViewById(R.id.editText_description);
|
||||||
|
mTags = (EditText)findViewById(R.id.editText_tags);
|
||||||
|
mDraft = (CheckBox)findViewById(R.id.checkBox_draft);
|
||||||
|
mButtonOk = (Button)findViewById(R.id.button_ok);
|
||||||
|
|
||||||
|
mProgressDialog = new ProgressDialog(this);
|
||||||
|
mProgressDialog.setCanceledOnTouchOutside(false);
|
||||||
|
|
||||||
|
mAuthToken = getIntent().getExtras().getString(RTABMapActivity.RTABMAP_AUTH_TOKEN_KEY);
|
||||||
|
mFilename.setText(getIntent().getExtras().getString(RTABMapActivity.RTABMAP_FILENAME_KEY));
|
||||||
|
mWorkingDirectory = getIntent().getExtras().getString(RTABMapActivity.RTABMAP_WORKING_DIR_KEY);
|
||||||
|
|
||||||
|
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
|
String tags = sharedPref.getString(getString(R.string.pref_key_tags), getString(R.string.pref_default_tags));
|
||||||
|
if(tags.isEmpty())
|
||||||
|
{
|
||||||
|
tags = getString(R.string.pref_default_tags);
|
||||||
|
}
|
||||||
|
mTags.setText(tags);
|
||||||
|
|
||||||
|
mButtonOk.setEnabled(mFilename.getText().toString().length()>0);
|
||||||
|
mButtonOk.setOnClickListener(this);
|
||||||
|
|
||||||
|
mFilename.addTextChangedListener(new TextWatcher() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(Editable s) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(CharSequence s, int start,
|
||||||
|
int count, int after) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence s, int start,
|
||||||
|
int before, int count) {
|
||||||
|
mButtonOk.setEnabled(s.length() != 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
mFilename.setSelectAllOnFocus(true);
|
||||||
|
mFilename.requestFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
// Handle button clicks.
|
||||||
|
switch (v.getId()) {
|
||||||
|
case R.id.button_ok:
|
||||||
|
shareToSketchfab();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void shareToSketchfab()
|
||||||
|
{
|
||||||
|
if(!mTags.getText().toString().isEmpty())
|
||||||
|
{
|
||||||
|
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
|
SharedPreferences.Editor editor = sharedPref.edit();
|
||||||
|
editor.putString(getString(R.string.pref_key_tags), mTags.getText().toString());
|
||||||
|
// Commit the edits!
|
||||||
|
editor.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
authorizeAndPublish(mFilename.getText().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isNetworkAvailable() {
|
||||||
|
ConnectivityManager connectivityManager
|
||||||
|
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
|
||||||
|
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void authorizeAndPublish(final String fileName)
|
||||||
|
{
|
||||||
|
if(!isNetworkAvailable())
|
||||||
|
{
|
||||||
|
// Visualize the result?
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle("Sharing to Sketchfab...")
|
||||||
|
.setMessage("Network is not available. Make sure you have internet before continuing.")
|
||||||
|
.setPositiveButton("Try Again", new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
authorizeAndPublish(fileName);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNeutralButton("Abort", new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get token the first time
|
||||||
|
if(mAuthToken == null)
|
||||||
|
{
|
||||||
|
Log.i(RTABMapActivity.TAG,"We don't have the token, get it!");
|
||||||
|
|
||||||
|
WebView web;
|
||||||
|
mAuthDialog = new Dialog(this);
|
||||||
|
mAuthDialog.setContentView(R.layout.auth_dialog);
|
||||||
|
web = (WebView)mAuthDialog.findViewById(R.id.webv);
|
||||||
|
web.setWebContentsDebuggingEnabled(!RTABMapActivity.DISABLE_LOG);
|
||||||
|
web.getSettings().setJavaScriptEnabled(true);
|
||||||
|
String auth_url = AUTHORIZE_PATH+"?redirect_uri="+REDIRECT_URI+"&response_type=token&client_id="+CLIENT_ID;
|
||||||
|
Log.i(RTABMapActivity.TAG, "Auhorize url="+auth_url);
|
||||||
|
web.setWebViewClient(new WebViewClient() {
|
||||||
|
|
||||||
|
boolean authComplete = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageFinished(WebView view, String url) {
|
||||||
|
super.onPageFinished(view, url);
|
||||||
|
|
||||||
|
//Log.i(TAG,"onPageFinished url="+url);
|
||||||
|
if(url.contains("error=access_denied")){
|
||||||
|
Log.e(RTABMapActivity.TAG, "ACCESS_DENIED_HERE");
|
||||||
|
authComplete = true;
|
||||||
|
Toast.makeText(getApplicationContext(), "Error Occured", Toast.LENGTH_SHORT).show();
|
||||||
|
mAuthDialog.dismiss();
|
||||||
|
}
|
||||||
|
else if (url.startsWith(REDIRECT_URI) && url.contains("access_token") && authComplete != true) {
|
||||||
|
//Log.i(TAG,"onPageFinished received token="+url);
|
||||||
|
String[] sArray = url.split("access_token=");
|
||||||
|
mAuthToken = (sArray[1].split("&token_type=Bearer"))[0];
|
||||||
|
authComplete = true;
|
||||||
|
|
||||||
|
mAuthDialog.dismiss();
|
||||||
|
|
||||||
|
zipAndPublish(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
mAuthDialog.show();
|
||||||
|
mAuthDialog.setTitle("Authorize RTAB-Map");
|
||||||
|
mAuthDialog.setCancelable(true);
|
||||||
|
web.loadUrl(auth_url);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
zipAndPublish(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void zipAndPublish(final String fileName)
|
||||||
|
{
|
||||||
|
mProgressDialog.setTitle("Upload to Sketchfab");
|
||||||
|
mProgressDialog.setMessage(String.format("Compressing the files..."));
|
||||||
|
mProgressDialog.show();
|
||||||
|
|
||||||
|
Thread workingThread = new Thread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
try{
|
||||||
|
|
||||||
|
File tmpDir = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR);
|
||||||
|
tmpDir.mkdirs();
|
||||||
|
String[] fileNames = Util.loadFileList(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR, false);
|
||||||
|
if(!RTABMapActivity.DISABLE_LOG) Log.i(RTABMapActivity.TAG, String.format("Deleting %d files in \"%s\"", fileNames.length, mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR));
|
||||||
|
for(int i=0; i<fileNames.length; ++i)
|
||||||
|
{
|
||||||
|
File f = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR + "/" + fileNames[i]);
|
||||||
|
if(f.delete())
|
||||||
|
{
|
||||||
|
if(!RTABMapActivity.DISABLE_LOG) Log.i(RTABMapActivity.TAG, String.format("Deleted \"%s\"", f.getPath()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!RTABMapActivity.DISABLE_LOG) Log.i(RTABMapActivity.TAG, String.format("Failed deleting \"%s\"", f.getPath()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
File exportDir = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_EXPORT_DIR);
|
||||||
|
exportDir.mkdirs();
|
||||||
|
|
||||||
|
if(RTABMapLib.writeExportedMesh(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR, RTABMapActivity.RTABMAP_TMP_FILENAME))
|
||||||
|
{
|
||||||
|
String[] files = new String[0];
|
||||||
|
// verify if we have all files
|
||||||
|
|
||||||
|
fileNames = Util.loadFileList(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR, false);
|
||||||
|
if(fileNames.length > 0)
|
||||||
|
{
|
||||||
|
files = new String[fileNames.length];
|
||||||
|
for(int i=0; i<fileNames.length; ++i)
|
||||||
|
{
|
||||||
|
files[i] = mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR + "/" + fileNames[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!RTABMapActivity.DISABLE_LOG) Log.i(RTABMapActivity.TAG, "Missing files!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(files.length > 0)
|
||||||
|
{
|
||||||
|
final String[] filesToZip = files;
|
||||||
|
final String zipOutput = mWorkingDirectory+fileName+".zip";
|
||||||
|
Util.zip(filesToZip, zipOutput);
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
mProgressDialog.dismiss();
|
||||||
|
|
||||||
|
File f = new File(zipOutput);
|
||||||
|
|
||||||
|
// Continue?
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
builder.setTitle("File(s) compressed and ready to upload!");
|
||||||
|
|
||||||
|
final int fileSizeMB = (int)f.length()/(1024 * 1024);
|
||||||
|
final int fileSizeKB = (int)f.length()/(1024);
|
||||||
|
if(fileSizeMB == 0)
|
||||||
|
{
|
||||||
|
Log.i(RTABMapActivity.TAG, String.format("Zipped files = %d KB", fileSizeKB));
|
||||||
|
builder.setMessage(String.format("Total size to upload = %d KB. Do you want to continue?\n\n", fileSizeKB));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.i(RTABMapActivity.TAG, String.format("Zipped files = %d MB", fileSizeMB));
|
||||||
|
builder.setMessage(String.format("Total size to upload = %d MB. %sDo you want to continue?\n\n"
|
||||||
|
+ "Tip: To reduce the model size, you can also look at the Settings->Exporting options.", fileSizeMB,
|
||||||
|
fileSizeMB>=50?"Note that for size over 50 MB, a Sketchfab PRO account is required, otherwise the upload may fail. ":""));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
mProgressDialog.setTitle("Upload to Sketchfab");
|
||||||
|
if(fileSizeMB == 0)
|
||||||
|
{
|
||||||
|
mProgressDialog.setMessage(String.format("Uploading model \"%s\" (%d KB) to Sketchfab...", fileName, fileSizeKB));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mProgressDialog.setMessage(String.format("Uploading model \"%s\" (%d MB) to Sketchfab...", fileName, fileSizeMB));
|
||||||
|
}
|
||||||
|
mProgressDialog.show();
|
||||||
|
new uploadToSketchfabTask().execute(zipOutput, fileName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
// do nothing...
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
mProgressDialog.dismiss();
|
||||||
|
Toast.makeText(getActivity(), String.format("Failed writing files!"), Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(IOException ex) {
|
||||||
|
Log.e(RTABMapActivity.TAG, "Failed to zip", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
workingThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class uploadToSketchfabTask extends AsyncTask<String, Void, Void>
|
||||||
|
{
|
||||||
|
String mModelUri;
|
||||||
|
String mModelFilePath;
|
||||||
|
String error = "";
|
||||||
|
String mFileName;
|
||||||
|
|
||||||
|
protected void onPreExecute() {
|
||||||
|
//display progress dialog.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Void result) {
|
||||||
|
|
||||||
|
mProgressDialog.dismiss();
|
||||||
|
//Task you want to do on UIThread after completing Network operation
|
||||||
|
//onPostExecute is called after doInBackground finishes its task.
|
||||||
|
if(mModelFilePath!= null)
|
||||||
|
{
|
||||||
|
File f = new File(mModelFilePath);
|
||||||
|
f.delete(); // cleanup
|
||||||
|
|
||||||
|
// See on sketchfab?
|
||||||
|
final SpannableString s = new SpannableString(
|
||||||
|
"Model \"" + mFileName + "\" is now processing on Sketchfab! You can click "
|
||||||
|
+ "on the link below to see it on Sketchfab.\n\nhttps://sketchfab.com/models/"+mModelUri);
|
||||||
|
Linkify.addLinks(s, Linkify.WEB_URLS);
|
||||||
|
final AlertDialog d = new AlertDialog.Builder(getActivity())
|
||||||
|
.setTitle("Upload finished!")
|
||||||
|
.setCancelable(false)
|
||||||
|
.setMessage(s)
|
||||||
|
.setPositiveButton("Close", new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
Intent resultIntent = new Intent();
|
||||||
|
resultIntent.putExtra(RTABMapActivity.RTABMAP_AUTH_TOKEN_KEY, mAuthToken);
|
||||||
|
setResult(Activity.RESULT_OK, resultIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}).create();
|
||||||
|
d.show();
|
||||||
|
((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Toast.makeText(getApplicationContext(), String.format("Upload failed! Error=\"%s\"", error), Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(String... files) {
|
||||||
|
String charset = "UTF-8";
|
||||||
|
File uploadFile = new File(files[0]);
|
||||||
|
mFileName = files[1];
|
||||||
|
String requestURL = "https://api.sketchfab.com/v3/models";
|
||||||
|
|
||||||
|
Log.i(RTABMapActivity.TAG, "Uploading " + files[0]);
|
||||||
|
|
||||||
|
try {
|
||||||
|
MultipartUtility multipart = new MultipartUtility(requestURL, mAuthToken, charset);
|
||||||
|
|
||||||
|
multipart.addFormField("name", mFileName);
|
||||||
|
multipart.addFormField("description", mDescription.getText().toString());
|
||||||
|
multipart.addFormField("tags", mTags.getText().toString());
|
||||||
|
multipart.addFormField("source", "RTAB-Map");
|
||||||
|
multipart.addFormField("isPublished", mDraft.isChecked()?"false":"true");
|
||||||
|
multipart.addFilePart("modelFile", uploadFile);
|
||||||
|
|
||||||
|
Log.i(RTABMapActivity.TAG, "Starting multipart request");
|
||||||
|
List<String> response = multipart.finish();
|
||||||
|
|
||||||
|
Log.i(RTABMapActivity.TAG, "SERVER REPLIED:");
|
||||||
|
|
||||||
|
for (String line : response) {
|
||||||
|
Log.i(RTABMapActivity.TAG, line);
|
||||||
|
//{"uri":"https:\/\/api.sketchfab.com\/v3\/models\/XXXXXXXXX","uid":"XXXXXXXXXX"}
|
||||||
|
if(line.contains("\"uid\":\""))
|
||||||
|
{
|
||||||
|
String[] sArray = line.split("\"uid\":\"");
|
||||||
|
mModelUri = (sArray[1].split("\""))[0];
|
||||||
|
mModelFilePath = files[0];
|
||||||
|
|
||||||
|
//patch model for orientation
|
||||||
|
/*HttpClient httpClient = new DefaultHttpClient();
|
||||||
|
try {
|
||||||
|
String patchURL = "https://api.sketchfab.com/v3/models/"+ mModelUri +"/options";
|
||||||
|
HttpPatch request = new HttpPatch(patchURL);
|
||||||
|
String json =
|
||||||
|
"{\n"+
|
||||||
|
"uid: "+ mModelUri + "\n" +
|
||||||
|
"shading: shadeless\n"+
|
||||||
|
//"orientation:\n"+
|
||||||
|
//"{\n"+
|
||||||
|
// "axis : [1, 0, 0]\n"+
|
||||||
|
// "angle : 0\n"+
|
||||||
|
//"}\n"+
|
||||||
|
"}";
|
||||||
|
|
||||||
|
request.setHeader("Authorization", "Bearer " + mAuthToken);
|
||||||
|
StringEntity params =new StringEntity(json, "UTF-8");
|
||||||
|
params.setContentType("application/json");
|
||||||
|
request.setEntity(params);
|
||||||
|
HttpResponse responsePatch = httpClient.execute(request);
|
||||||
|
int responseStatus = responsePatch.getStatusLine().getStatusCode();
|
||||||
|
Log.i(RTABMapActivity.TAG, "get data responseStatus: " + responseStatus);
|
||||||
|
|
||||||
|
}catch (Exception e) {
|
||||||
|
Log.e(RTABMapActivity.TAG, "Error while patching model", e);
|
||||||
|
error = e.getMessage();
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException ex) {
|
||||||
|
Log.e(RTABMapActivity.TAG, "Error while uploading", ex);
|
||||||
|
error = ex.getMessage();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016 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.
|
||||||
|
*
|
||||||
|
* Copied for convenience from https://github.com/googlesamples/tango-examples-c/blob/master/cpp_example_util/app/src/main/java/com/projecttango/examples/cpp/util/TangoInitializationHelper.java
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.ServiceConnection;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Functions for simplifying the process of initializing TangoService, and function
|
||||||
|
* handles loading correct libtango_client_api.so.
|
||||||
|
*/
|
||||||
|
public class TangoInitializationHelper {
|
||||||
|
public static final int ARCH_ERROR = -2;
|
||||||
|
public static final int ARCH_FALLBACK = -1;
|
||||||
|
public static final int ARCH_DEFAULT = 0;
|
||||||
|
public static final int ARCH_ARM64 = 1;
|
||||||
|
public static final int ARCH_ARM32 = 2;
|
||||||
|
public static final int ARCH_X86_64 = 3;
|
||||||
|
public static final int ARCH_X86 = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Only for apps using the C API:
|
||||||
|
* Initializes the underlying TangoService for native apps.
|
||||||
|
*
|
||||||
|
* @return returns false if the device doesn't have the Tango running as Android Service.
|
||||||
|
* Otherwise ture.
|
||||||
|
*/
|
||||||
|
public static final boolean bindTangoService(final Context context,
|
||||||
|
ServiceConnection connection) {
|
||||||
|
Intent intent = new Intent();
|
||||||
|
intent.setClassName("com.google.tango", "com.google.atap.tango.TangoService");
|
||||||
|
|
||||||
|
boolean hasJavaService = (context.getPackageManager().resolveService(intent, 0) != null);
|
||||||
|
|
||||||
|
// User doesn't have the latest packagename for TangoCore, fallback to the previous name.
|
||||||
|
if (!hasJavaService) {
|
||||||
|
intent = new Intent();
|
||||||
|
intent.setClassName("com.projecttango.tango", "com.google.atap.tango.TangoService");
|
||||||
|
hasJavaService = (context.getPackageManager().resolveService(intent, 0) != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// User doesn't have a Java-fied TangoCore at all; fallback to the deprecated approach
|
||||||
|
// of doing nothing and letting the native side auto-init to the system-service version
|
||||||
|
// of Tango.
|
||||||
|
if (!hasJavaService) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return context.bindService(intent, connection, Context.BIND_AUTO_CREATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the libtango_client_api.so library based on different Tango device setup.
|
||||||
|
*
|
||||||
|
* @return returns the loaded architecture id.
|
||||||
|
*/
|
||||||
|
public static final int loadTangoSharedLibrary() {
|
||||||
|
int loadedSoId = ARCH_ERROR;
|
||||||
|
String basePath = "/data/data/com.google.tango/libfiles/";
|
||||||
|
if (!(new File(basePath).exists())) {
|
||||||
|
basePath = "/data/data/com.projecttango.tango/libfiles/";
|
||||||
|
}
|
||||||
|
Log.i("TangoInitializationHelper", "basePath: " + basePath);
|
||||||
|
|
||||||
|
try {
|
||||||
|
System.load(basePath + "arm64-v8a/libtango_client_api.so");
|
||||||
|
loadedSoId = ARCH_ARM64;
|
||||||
|
Log.i("TangoInitializationHelper", "Success! Using arm64-v8a/libtango_client_api.");
|
||||||
|
} catch (UnsatisfiedLinkError e) {
|
||||||
|
}
|
||||||
|
if (loadedSoId < ARCH_DEFAULT) {
|
||||||
|
try {
|
||||||
|
System.load(basePath + "armeabi-v7a/libtango_client_api.so");
|
||||||
|
loadedSoId = ARCH_ARM32;
|
||||||
|
Log.i("TangoInitializationHelper", "Success! Using armeabi-v7a/libtango_client_api.");
|
||||||
|
} catch (UnsatisfiedLinkError e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loadedSoId < ARCH_DEFAULT) {
|
||||||
|
try {
|
||||||
|
System.load(basePath + "x86_64/libtango_client_api.so");
|
||||||
|
loadedSoId = ARCH_X86_64;
|
||||||
|
Log.i("TangoInitializationHelper", "Success! Using x86_64/libtango_client_api.");
|
||||||
|
} catch (UnsatisfiedLinkError e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loadedSoId < ARCH_DEFAULT) {
|
||||||
|
try {
|
||||||
|
System.load(basePath + "x86/libtango_client_api.so");
|
||||||
|
loadedSoId = ARCH_X86;
|
||||||
|
Log.i("TangoInitializationHelper", "Success! Using x86/libtango_client_api.");
|
||||||
|
} catch (UnsatisfiedLinkError e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loadedSoId < ARCH_DEFAULT) {
|
||||||
|
try {
|
||||||
|
System.load(basePath + "default/libtango_client_api.so");
|
||||||
|
loadedSoId = ARCH_DEFAULT;
|
||||||
|
Log.i("TangoInitializationHelper", "Success! Using default/libtango_client_api.");
|
||||||
|
} catch (UnsatisfiedLinkError e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loadedSoId < ARCH_DEFAULT) {
|
||||||
|
try {
|
||||||
|
System.loadLibrary("tango_client_api");
|
||||||
|
loadedSoId = ARCH_FALLBACK;
|
||||||
|
Log.i("TangoInitializationHelper", "Falling back to libtango_client_api.so symlink.");
|
||||||
|
} catch (UnsatisfiedLinkError e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return loadedSoId;
|
||||||
|
}
|
||||||
|
}
|
||||||
419
app/android/src/com/introlab/rtabmap/TextManager.java
Normal file
419
app/android/src/com/introlab/rtabmap/TextManager.java
Normal file
@@ -0,0 +1,419 @@
|
|||||||
|
//package ri.blog.opengl008;
|
||||||
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
import java.nio.FloatBuffer;
|
||||||
|
import java.nio.ShortBuffer;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.graphics.Typeface;
|
||||||
|
import android.opengl.GLES20;
|
||||||
|
import android.opengl.GLUtils;
|
||||||
|
import android.text.TextPaint;
|
||||||
|
|
||||||
|
public class TextManager {
|
||||||
|
|
||||||
|
/* SHADER Text
|
||||||
|
*
|
||||||
|
* This shader is for rendering 2D text textures straight from a texture
|
||||||
|
* Color and alpha blended.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static final String vs_Text =
|
||||||
|
"uniform mat4 uMVPMatrix;" +
|
||||||
|
"attribute vec4 vPosition;" +
|
||||||
|
"attribute vec2 a_texCoord;" +
|
||||||
|
"varying vec2 v_texCoord;" +
|
||||||
|
"void main() {" +
|
||||||
|
" gl_Position = uMVPMatrix * vPosition;" +
|
||||||
|
" v_texCoord = a_texCoord;" +
|
||||||
|
"}";
|
||||||
|
public static final String fs_Text =
|
||||||
|
"precision mediump float;" +
|
||||||
|
"uniform float uColor;" +
|
||||||
|
"varying vec2 v_texCoord;" +
|
||||||
|
"uniform sampler2D s_texture;" +
|
||||||
|
"void main() {" +
|
||||||
|
" gl_FragColor = texture2D( s_texture, v_texCoord );" +
|
||||||
|
" gl_FragColor.rgb *= uColor;" +
|
||||||
|
"}";
|
||||||
|
|
||||||
|
public static int sp_Text;
|
||||||
|
|
||||||
|
public static final int RI_TEXT_TEXTURE_SIZE = 512; // 512
|
||||||
|
public static final float RI_TEXT_HEIGHT_BASE = 32.0f;
|
||||||
|
public static final char RI_TEXT_START = ' ';
|
||||||
|
public static final char RI_TEXT_STOP = '~'+1;
|
||||||
|
|
||||||
|
public float getMaxTextHeight() {return mTextHeight;}
|
||||||
|
|
||||||
|
private float mUVWidth;
|
||||||
|
private float mUVHeight;
|
||||||
|
private float mTextHeight;
|
||||||
|
private float mColor;
|
||||||
|
|
||||||
|
private FloatBuffer vertexBuffer;
|
||||||
|
private FloatBuffer textureBuffer;
|
||||||
|
private ShortBuffer drawListBuffer;
|
||||||
|
|
||||||
|
private float[] vecs;
|
||||||
|
private float[] uvs;
|
||||||
|
private short[] indices;
|
||||||
|
|
||||||
|
private int index_vecs;
|
||||||
|
private int index_indices;
|
||||||
|
private int index_uvs;
|
||||||
|
|
||||||
|
private int texturenr;
|
||||||
|
private int[] mTextures;
|
||||||
|
|
||||||
|
private float uniformscale = 1.0f;
|
||||||
|
|
||||||
|
float[] mCharacterWidth;
|
||||||
|
|
||||||
|
public TextManager(Context context)
|
||||||
|
{
|
||||||
|
// Create the arrays
|
||||||
|
vecs = new float[3 * 10];
|
||||||
|
uvs = new float[2 * 10];
|
||||||
|
indices = new short[10];
|
||||||
|
|
||||||
|
// init as 0 as default
|
||||||
|
texturenr = 0;
|
||||||
|
|
||||||
|
// Text shader
|
||||||
|
int vshadert = TextManager.loadShader(GLES20.GL_VERTEX_SHADER, TextManager.vs_Text);
|
||||||
|
int fshadert = TextManager.loadShader(GLES20.GL_FRAGMENT_SHADER, TextManager.fs_Text);
|
||||||
|
|
||||||
|
TextManager.sp_Text = GLES20.glCreateProgram();
|
||||||
|
GLES20.glAttachShader(TextManager.sp_Text, vshadert);
|
||||||
|
GLES20.glAttachShader(TextManager.sp_Text, fshadert); // add the fragment shader to program
|
||||||
|
GLES20.glLinkProgram(TextManager.sp_Text); // creates OpenGL ES program executables
|
||||||
|
|
||||||
|
// Generate Textures, if more needed, alter these numbers.
|
||||||
|
mTextures = new int[1];
|
||||||
|
GLES20.glGenTextures(1, mTextures, 0);
|
||||||
|
|
||||||
|
// Create an empty, mutable bitmap
|
||||||
|
Bitmap bitmap = Bitmap.createBitmap(RI_TEXT_TEXTURE_SIZE, RI_TEXT_TEXTURE_SIZE, Bitmap.Config.ARGB_4444);
|
||||||
|
// get a canvas to paint over the bitmap
|
||||||
|
Canvas canvas = new Canvas(bitmap);
|
||||||
|
bitmap.eraseColor(0);
|
||||||
|
|
||||||
|
// Draw the text
|
||||||
|
TextPaint textPaint = new TextPaint();
|
||||||
|
textPaint.setTextSize(RI_TEXT_HEIGHT_BASE);
|
||||||
|
textPaint.setColor(Color.WHITE);
|
||||||
|
textPaint.setAntiAlias(true);
|
||||||
|
textPaint.setTypeface(Typeface.create("Arial", Typeface.BOLD));
|
||||||
|
|
||||||
|
// compute real maximum height
|
||||||
|
mTextHeight=0.0f;
|
||||||
|
for(char c=RI_TEXT_START; c<RI_TEXT_STOP; ++c)
|
||||||
|
{
|
||||||
|
Rect textBounds = new Rect();
|
||||||
|
textPaint.getTextBounds(String.valueOf(c), 0, 1, textBounds);
|
||||||
|
if(textBounds.height() + textBounds.bottom > mTextHeight)
|
||||||
|
{
|
||||||
|
mTextHeight = textBounds.height() + textBounds.bottom;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mUVWidth = (float)RI_TEXT_HEIGHT_BASE/(float)RI_TEXT_TEXTURE_SIZE;
|
||||||
|
mUVHeight = mTextHeight/(float)RI_TEXT_TEXTURE_SIZE;
|
||||||
|
mColor = 1.0f;
|
||||||
|
|
||||||
|
int colCount = RI_TEXT_TEXTURE_SIZE/(int)RI_TEXT_HEIGHT_BASE;
|
||||||
|
mCharacterWidth = new float[RI_TEXT_STOP-RI_TEXT_START];
|
||||||
|
int i=0;
|
||||||
|
for(char c=RI_TEXT_START; c<RI_TEXT_STOP; ++c)
|
||||||
|
{
|
||||||
|
Rect textBounds = new Rect();
|
||||||
|
textPaint.getTextBounds(String.valueOf(c), 0, 1, textBounds);
|
||||||
|
canvas.drawText(String.valueOf(c), (i%colCount)*RI_TEXT_HEIGHT_BASE, (i/colCount) * mTextHeight + RI_TEXT_HEIGHT_BASE, textPaint);
|
||||||
|
mCharacterWidth[i] = textPaint.measureText(String.valueOf(c));
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures[0]);
|
||||||
|
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
|
||||||
|
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
|
||||||
|
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
|
||||||
|
|
||||||
|
//Clean up
|
||||||
|
bitmap.recycle();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTextureID(int val)
|
||||||
|
{
|
||||||
|
texturenr = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int loadShader(int type, String shaderCode){
|
||||||
|
|
||||||
|
// create a vertex shader type (GLES20.GL_VERTEX_SHADER)
|
||||||
|
// or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
|
||||||
|
int shader = GLES20.glCreateShader(type);
|
||||||
|
|
||||||
|
// add the source code to the shader and compile it
|
||||||
|
GLES20.glShaderSource(shader, shaderCode);
|
||||||
|
GLES20.glCompileShader(shader);
|
||||||
|
|
||||||
|
// return the shader
|
||||||
|
return shader;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void AddCharRenderInformation(float[] vec, float[] cs, float[] uv, short[] indi)
|
||||||
|
{
|
||||||
|
// 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.length;i++)
|
||||||
|
{
|
||||||
|
vecs[index_vecs] = vec[i];
|
||||||
|
index_vecs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We should add the uvs
|
||||||
|
for(int i=0;i<uv.length;i++)
|
||||||
|
{
|
||||||
|
uvs[index_uvs] = uv[i];
|
||||||
|
index_uvs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We handle the indices
|
||||||
|
for(int j=0;j<indi.length;j++)
|
||||||
|
{
|
||||||
|
indices[index_indices] = (short) (base + indi[j]);
|
||||||
|
index_indices++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrepareDrawInfo(Vector<TextObject> txtcollection)
|
||||||
|
{
|
||||||
|
// Reset the indices.
|
||||||
|
index_vecs = 0;
|
||||||
|
index_indices = 0;
|
||||||
|
index_uvs = 0;
|
||||||
|
|
||||||
|
// Get the total amount of characters
|
||||||
|
int charcount = 0;
|
||||||
|
for (TextObject txt : txtcollection) {
|
||||||
|
if(txt!=null)
|
||||||
|
{
|
||||||
|
if(!(txt.text==null))
|
||||||
|
{
|
||||||
|
charcount += txt.text.length();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the arrays we need with the correct size.
|
||||||
|
vecs = null;
|
||||||
|
uvs = null;
|
||||||
|
indices = null;
|
||||||
|
|
||||||
|
vecs = new float[charcount * 12];
|
||||||
|
uvs = new float[charcount * 8];
|
||||||
|
indices = new short[charcount * 6];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrepareDraw(Vector<TextObject> txtcollection)
|
||||||
|
{
|
||||||
|
// Setup all the arrays
|
||||||
|
PrepareDrawInfo(txtcollection);
|
||||||
|
|
||||||
|
// Using the iterator protects for problems with concurrency
|
||||||
|
for( Iterator< TextObject > it = txtcollection.iterator(); it.hasNext() ; )
|
||||||
|
{
|
||||||
|
TextObject txt = it.next();
|
||||||
|
if(txt!=null)
|
||||||
|
{
|
||||||
|
if(!(txt.text==null))
|
||||||
|
{
|
||||||
|
convertTextToTriangleInfo(txt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Draw(float[] m)
|
||||||
|
{
|
||||||
|
if(vecs.length > 0)
|
||||||
|
{
|
||||||
|
GLES20.glDisable(GLES20.GL_DEPTH_TEST);
|
||||||
|
GLES20.glEnable(GLES20.GL_BLEND);
|
||||||
|
|
||||||
|
// Set the correct shader for our grid object.
|
||||||
|
GLES20.glUseProgram(sp_Text);
|
||||||
|
|
||||||
|
// The vertex buffer.
|
||||||
|
ByteBuffer bb = ByteBuffer.allocateDirect(vecs.length * 4);
|
||||||
|
bb.order(ByteOrder.nativeOrder());
|
||||||
|
vertexBuffer = bb.asFloatBuffer();
|
||||||
|
vertexBuffer.put(vecs);
|
||||||
|
vertexBuffer.position(0);
|
||||||
|
|
||||||
|
// The texture buffer
|
||||||
|
ByteBuffer bb2 = ByteBuffer.allocateDirect(uvs.length * 4);
|
||||||
|
bb2.order(ByteOrder.nativeOrder());
|
||||||
|
textureBuffer = bb2.asFloatBuffer();
|
||||||
|
textureBuffer.put(uvs);
|
||||||
|
textureBuffer.position(0);
|
||||||
|
|
||||||
|
// initialize byte buffer for the draw list
|
||||||
|
ByteBuffer dlb = ByteBuffer.allocateDirect(indices.length * 2);
|
||||||
|
dlb.order(ByteOrder.nativeOrder());
|
||||||
|
drawListBuffer = dlb.asShortBuffer();
|
||||||
|
drawListBuffer.put(indices);
|
||||||
|
drawListBuffer.position(0);
|
||||||
|
|
||||||
|
// get handle to vertex shader's vPosition member
|
||||||
|
int mPositionHandle = GLES20.glGetAttribLocation(sp_Text, "vPosition");
|
||||||
|
|
||||||
|
// Enable a handle to the triangle vertices
|
||||||
|
GLES20.glEnableVertexAttribArray(mPositionHandle);
|
||||||
|
|
||||||
|
// Prepare the background coordinate data
|
||||||
|
GLES20.glVertexAttribPointer(mPositionHandle, 3,
|
||||||
|
GLES20.GL_FLOAT, false,
|
||||||
|
0, vertexBuffer);
|
||||||
|
|
||||||
|
int mTexCoordLoc = GLES20.glGetAttribLocation(sp_Text, "a_texCoord" );
|
||||||
|
|
||||||
|
// Prepare the texturecoordinates
|
||||||
|
GLES20.glVertexAttribPointer ( mTexCoordLoc, 2, GLES20.GL_FLOAT,
|
||||||
|
false,
|
||||||
|
0, textureBuffer);
|
||||||
|
|
||||||
|
GLES20.glEnableVertexAttribArray ( mPositionHandle );
|
||||||
|
GLES20.glEnableVertexAttribArray ( mTexCoordLoc );
|
||||||
|
|
||||||
|
// get handle to shape's transformation matrix
|
||||||
|
int mtrxhandle = GLES20.glGetUniformLocation(sp_Text, "uMVPMatrix");
|
||||||
|
|
||||||
|
// Apply the projection and view transformation
|
||||||
|
GLES20.glUniformMatrix4fv(mtrxhandle, 1, false, m, 0);
|
||||||
|
|
||||||
|
// get handle to color value
|
||||||
|
int colorhandle = GLES20.glGetUniformLocation(sp_Text, "uColor");
|
||||||
|
GLES20.glUniform1f(colorhandle, mColor);
|
||||||
|
|
||||||
|
int mSamplerLoc = GLES20.glGetUniformLocation (sp_Text, "s_texture" );
|
||||||
|
|
||||||
|
// Texture activate unit 0
|
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
|
||||||
|
// Bind the texture to this unit.
|
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures[0]);
|
||||||
|
// Set the sampler texture unit to our selected id
|
||||||
|
GLES20.glUniform1i ( mSamplerLoc, texturenr);
|
||||||
|
|
||||||
|
// Draw the triangle
|
||||||
|
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
|
||||||
|
|
||||||
|
// Disable vertex array
|
||||||
|
GLES20.glDisableVertexAttribArray(mPositionHandle);
|
||||||
|
GLES20.glDisableVertexAttribArray(mTexCoordLoc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void convertTextToTriangleInfo(TextObject val)
|
||||||
|
{
|
||||||
|
// Get attributes from text object
|
||||||
|
float x = val.x;
|
||||||
|
float y = val.y;
|
||||||
|
String text = val.text;
|
||||||
|
|
||||||
|
// Create
|
||||||
|
for(int j=0; j<text.length(); j++)
|
||||||
|
{
|
||||||
|
// get ascii value
|
||||||
|
char c = text.charAt(j);
|
||||||
|
int c_val = (int)c;
|
||||||
|
|
||||||
|
int indx = c_val-RI_TEXT_START;
|
||||||
|
|
||||||
|
if(indx<0 || indx>=mCharacterWidth.length) {
|
||||||
|
// 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 * mUVHeight;
|
||||||
|
float v2 = v + mUVHeight;
|
||||||
|
float u = col * mUVWidth;
|
||||||
|
float u2 = u + mCharacterWidth[indx]/(float)RI_TEXT_TEXTURE_SIZE;
|
||||||
|
|
||||||
|
// Creating the triangle information
|
||||||
|
float[] vec = new float[12];
|
||||||
|
float[] uv = new float[8];
|
||||||
|
float[] colors = new float[16];
|
||||||
|
|
||||||
|
vec[0] = x;
|
||||||
|
vec[1] = y + (mTextHeight * uniformscale);
|
||||||
|
vec[2] = 0.99f;
|
||||||
|
vec[3] = x;
|
||||||
|
vec[4] = y;
|
||||||
|
vec[5] = 0.99f;
|
||||||
|
vec[6] = x + (mCharacterWidth[indx] * uniformscale);
|
||||||
|
vec[7] = y;
|
||||||
|
vec[8] = 0.99f;
|
||||||
|
vec[9] = x + (mCharacterWidth[indx] * uniformscale);
|
||||||
|
vec[10] = y + (mTextHeight * uniformscale);
|
||||||
|
vec[11] = 0.99f;
|
||||||
|
|
||||||
|
colors = new float[]
|
||||||
|
{val.color[0], val.color[1], val.color[2], val.color[3],
|
||||||
|
val.color[0], val.color[1], val.color[2], val.color[3],
|
||||||
|
val.color[0], val.color[1], val.color[2], val.color[3],
|
||||||
|
val.color[0], val.color[1], val.color[2], val.color[3]
|
||||||
|
};
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
short[] inds = {0, 1, 2, 0, 2, 3};
|
||||||
|
|
||||||
|
// Add our triangle information to our collection for 1 render call.
|
||||||
|
AddCharRenderInformation(vec, colors, uv, inds);
|
||||||
|
|
||||||
|
// Calculate the new position
|
||||||
|
x += (mCharacterWidth[indx] * uniformscale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getUniformscale() {
|
||||||
|
return uniformscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUniformscale(float uniformscale) {
|
||||||
|
this.uniformscale = uniformscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setColor(float color) {
|
||||||
|
mColor = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
33
app/android/src/com/introlab/rtabmap/TextObject.java
Normal file
33
app/android/src/com/introlab/rtabmap/TextObject.java
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
//package ri.blog.opengl008;
|
||||||
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
public class TextObject {
|
||||||
|
|
||||||
|
public String text;
|
||||||
|
public float x;
|
||||||
|
public float y;
|
||||||
|
public float[] color;
|
||||||
|
|
||||||
|
public TextObject()
|
||||||
|
{
|
||||||
|
text = "default";
|
||||||
|
x = 0f;
|
||||||
|
y = 0f;
|
||||||
|
color = new float[] {1f, 1f, 1f, 1.0f};
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextObject(String txt, float xcoord, float ycoord)
|
||||||
|
{
|
||||||
|
text = txt;
|
||||||
|
x = xcoord;
|
||||||
|
y = ycoord;
|
||||||
|
color = new float[] {1f, 1f, 1f, 1.0f};
|
||||||
|
}
|
||||||
|
|
||||||
|
/*public boolean validate()
|
||||||
|
{
|
||||||
|
if(text.compareTo("")==0) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
126
app/android/src/com/introlab/rtabmap/Util.java
Normal file
126
app/android/src/com/introlab/rtabmap/Util.java
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.FilenameFilter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.NetworkInfo;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class Util {
|
||||||
|
|
||||||
|
public static final int ZIP_BUFFER_SIZE = 1<<20; // 1MB
|
||||||
|
|
||||||
|
public static void zip(String file, String zipFile) throws IOException {
|
||||||
|
Log.i(RTABMapActivity.TAG, "Zipping " + file +" to " + zipFile);
|
||||||
|
String[] files = new String[1];
|
||||||
|
files[0] = file;
|
||||||
|
zip(files, zipFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void zip(String[] files, String zipFile) throws IOException {
|
||||||
|
Log.i(RTABMapActivity.TAG, "Zipping " + String.valueOf(files.length) +" files to " + zipFile);
|
||||||
|
BufferedInputStream origin = null;
|
||||||
|
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
|
||||||
|
try {
|
||||||
|
byte data[] = new byte[ZIP_BUFFER_SIZE];
|
||||||
|
|
||||||
|
for (int i = 0; i < files.length; i++) {
|
||||||
|
FileInputStream fi = new FileInputStream(files[i]);
|
||||||
|
origin = new BufferedInputStream(fi, ZIP_BUFFER_SIZE);
|
||||||
|
try {
|
||||||
|
ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1));
|
||||||
|
out.putNextEntry(entry);
|
||||||
|
int count;
|
||||||
|
while ((count = origin.read(data, 0, ZIP_BUFFER_SIZE)) != -1) {
|
||||||
|
out.write(data, 0, count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
origin.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] loadFileList(String directory, final boolean databasesOnly) {
|
||||||
|
File path = new File(directory);
|
||||||
|
String fileList[];
|
||||||
|
try {
|
||||||
|
path.mkdirs();
|
||||||
|
}
|
||||||
|
catch(SecurityException e) {
|
||||||
|
Log.e(RTABMapActivity.TAG, "unable to write on the sd card " + e.toString());
|
||||||
|
}
|
||||||
|
if(path.exists()) {
|
||||||
|
FilenameFilter filter = new FilenameFilter() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean accept(File dir, String filename) {
|
||||||
|
File sel = new File(dir, filename);
|
||||||
|
if(databasesOnly)
|
||||||
|
{
|
||||||
|
return filename.compareTo(RTABMapActivity.RTABMAP_TMP_DB) != 0 && filename.endsWith(".db");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return sel.isFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
fileList = path.list(filter);
|
||||||
|
Arrays.sort(fileList);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fileList = new String[0];
|
||||||
|
}
|
||||||
|
return fileList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https://stackoverflow.com/questions/6701948/efficient-way-to-compare-version-strings-in-java
|
||||||
|
* Compares two version strings.
|
||||||
|
*
|
||||||
|
* Use this instead of String.compareTo() for a non-lexicographical
|
||||||
|
* comparison that works for version strings. e.g. "1.10".compareTo("1.6").
|
||||||
|
*
|
||||||
|
* @note It does not work if "1.10" is supposed to be equal to "1.10.0".
|
||||||
|
*
|
||||||
|
* @param str1 a string of ordinal numbers separated by decimal points.
|
||||||
|
* @param str2 a string of ordinal numbers separated by decimal points.
|
||||||
|
* @return The result is a negative integer if str1 is _numerically_ less than str2.
|
||||||
|
* The result is a positive integer if str1 is _numerically_ greater than str2.
|
||||||
|
* The result is zero if the strings are _numerically_ equal.
|
||||||
|
*/
|
||||||
|
public static int versionCompare(String str1, String str2) {
|
||||||
|
String[] vals1 = str1.split("\\.");
|
||||||
|
String[] vals2 = str2.split("\\.");
|
||||||
|
int i = 0;
|
||||||
|
// set index to first non-equal ordinal or length of shortest version string
|
||||||
|
while (i < vals1.length && i < vals2.length && vals1[i].equals(vals2[i])) {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
// compare first non-equal ordinal number
|
||||||
|
if (i < vals1.length && i < vals2.length) {
|
||||||
|
int diff = Integer.valueOf(vals1[i]).compareTo(Integer.valueOf(vals2[i]));
|
||||||
|
return Integer.signum(diff);
|
||||||
|
}
|
||||||
|
// the strings are equal or one string is a substring of the other
|
||||||
|
// e.g. "1.2.3" = "1.2.3" or "1.2.3" < "1.2.3.4"
|
||||||
|
return Integer.signum(vals1.length - vals2.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -74,7 +74,11 @@ ELSE()
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
TARGET_LINK_LIBRARIES(rtabmap rtabmap_core rtabmap_gui rtabmap_utilite ${LIBRARIES})
|
TARGET_LINK_LIBRARIES(rtabmap rtabmap_core rtabmap_gui rtabmap_utilite ${LIBRARIES})
|
||||||
IF(Qt5_FOUND)
|
IF(Qt5_FOUND)
|
||||||
QT5_USE_MODULES(rtabmap Widgets Core Gui Svg PrintSupport)
|
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)
|
ENDIF(Qt5_FOUND)
|
||||||
|
|
||||||
IF(APPLE AND BUILD_AS_BUNDLE)
|
IF(APPLE AND BUILD_AS_BUNDLE)
|
||||||
@@ -137,11 +141,25 @@ IF((APPLE AND BUILD_AS_BUNDLE) OR WIN32)
|
|||||||
# Install needed Qt plugins by copying directories from the qt installation
|
# Install needed Qt plugins by copying directories from the qt installation
|
||||||
# One can cull what gets copied by using 'REGEX "..." EXCLUDE'
|
# One can cull what gets copied by using 'REGEX "..." EXCLUDE'
|
||||||
# Exclude debug libraries
|
# Exclude debug libraries
|
||||||
INSTALL(DIRECTORY "${QT_PLUGINS_DIR}/imageformats"
|
IF(QT_PLUGINS_DIR)
|
||||||
|
INSTALL(DIRECTORY "${QT_PLUGINS_DIR}/imageformats"
|
||||||
DESTINATION ${plugin_dest_dir}/plugins
|
DESTINATION ${plugin_dest_dir}/plugins
|
||||||
COMPONENT runtime
|
COMPONENT runtime
|
||||||
REGEX ".*d4.dll" EXCLUDE
|
REGEX ".*d4.dll" EXCLUDE
|
||||||
REGEX ".*d4.a" EXCLUDE)
|
REGEX ".*d4.a" EXCLUDE)
|
||||||
|
ELSE()
|
||||||
|
#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)
|
||||||
|
#MESSAGE(STATUS "Qt5 plugin \"${plugin_loc}\" installed in \"${plugin_dest_dir}/plugins${plugin_type}\"")
|
||||||
|
INSTALL(FILES ${plugin_loc}
|
||||||
|
DESTINATION ${plugin_dest_dir}/plugins${plugin_type}
|
||||||
|
COMPONENT runtime)
|
||||||
|
endforeach()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
# install a qt.conf file
|
# install a qt.conf file
|
||||||
# this inserts some cmake code into the install script to write the file
|
# this inserts some cmake code into the install script to write the file
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -50,13 +50,14 @@ signals:
|
|||||||
void objDeletionEventReceived(int);
|
void objDeletionEventReceived(int);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void handleEvent(UEvent * event)
|
virtual bool handleEvent(UEvent * event)
|
||||||
{
|
{
|
||||||
if(event->getClassName().compare("UObjDeletedEvent") == 0 &&
|
if(event->getClassName().compare("UObjDeletedEvent") == 0 &&
|
||||||
event->getCode() == _watchedId)
|
event->getCode() == _watchedId)
|
||||||
{
|
{
|
||||||
emit objDeletionEventReceived(_watchedId);
|
emit objDeletionEventReceived(_watchedId);
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
int _watchedId;
|
int _watchedId;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -47,6 +47,9 @@ int main(int argc, char* argv[])
|
|||||||
|
|
||||||
/* Create tasks */
|
/* Create tasks */
|
||||||
QApplication * app = new QApplication(argc, argv);
|
QApplication * app = new QApplication(argc, argv);
|
||||||
|
app->setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }"); // selectable message box
|
||||||
|
|
||||||
|
ParametersMap parameters = Parameters::parseArguments(argc, argv, true);
|
||||||
MainWindow * mainWindow = new MainWindow();
|
MainWindow * mainWindow = new MainWindow();
|
||||||
app->installEventFilter(mainWindow); // to catch FileOpen events.
|
app->installEventFilter(mainWindow); // to catch FileOpen events.
|
||||||
|
|
||||||
@@ -82,7 +85,11 @@ int main(int argc, char* argv[])
|
|||||||
|
|
||||||
if(!database.empty())
|
if(!database.empty())
|
||||||
{
|
{
|
||||||
QMetaObject::invokeMethod(mainWindow, "openDatabase", Qt::QueuedConnection, Q_ARG(QString, QString(database.c_str())));
|
mainWindow->openDatabase(database.c_str());
|
||||||
|
}
|
||||||
|
if(parameters.size())
|
||||||
|
{
|
||||||
|
mainWindow->updateParameters(parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now wait for application to finish
|
// Now wait for application to finish
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ IF (DC1394_INCLUDE_DIRS AND DC1394_LIBRARIES)
|
|||||||
SET(DC1394_FOUND TRUE)
|
SET(DC1394_FOUND TRUE)
|
||||||
|
|
||||||
#On Mac OS X
|
#On Mac OS X
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
#if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
||||||
set(DC1394_LIBRARIES ${DC1394_LIBRARIES} "-framework CoreServices")
|
# set(DC1394_LIBRARIES ${DC1394_LIBRARIES} "-framework CoreServices")
|
||||||
endif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
#endif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
||||||
|
|
||||||
ENDIF (DC1394_INCLUDE_DIRS AND DC1394_LIBRARIES)
|
ENDIF (DC1394_INCLUDE_DIRS AND DC1394_LIBRARIES)
|
||||||
|
|
||||||
|
|||||||
@@ -19,13 +19,13 @@ set(Triclops_LIBDIR $ENV{Triclops_ROOT_DIR}/lib)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
#FlyCapture2 SDK
|
#FlyCapture2 SDK
|
||||||
find_path(FlyCapture2_INCLUDE_DIR NAMES FlyCapture2.h PATHS $ENV{FlyCapture2_ROOT_DIR}/include)
|
find_path(FlyCapture2_INCLUDE_DIR NAMES FlyCapture2.h PATHS $ENV{FlyCapture2_ROOT_DIR}/include $ENV{FlyCapture2_ROOT_DIR}/include/flycapture)
|
||||||
find_library(FlyCapture2_LIBRARY NAMES FlyCapture2_v100 FlyCapture2 flycapture2 NO_DEFAULT_PATH PATHS ${FlyCapture2_LIBDIR})
|
find_library(FlyCapture2_LIBRARY NAMES FlyCapture2_v100 FlyCapture2 flycapture2 flycapture NO_DEFAULT_PATH PATHS ${FlyCapture2_LIBDIR})
|
||||||
|
|
||||||
# Triclops SDK
|
# Triclops SDK
|
||||||
find_path(Triclops_INCLUDE_DIR NAMES triclops.h PATHS $ENV{Triclops_ROOT_DIR}/include)
|
find_path(Triclops_INCLUDE_DIR NAMES triclops.h PATHS $ENV{Triclops_ROOT_DIR}/include $ENV{Triclops_ROOT_DIR}/include/triclops)
|
||||||
find_library(Triclops_LIBRARY NAMES triclops triclops_v100 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
|
find_library(Triclops_LIBRARY NAMES triclops triclops_v100 libtriclops.so.3 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
|
||||||
find_library(FlyCaptureBridge_LIBRARY NAMES flycapture2bridge flycapture2bridge_v100 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
|
find_library(FlyCaptureBridge_LIBRARY NAMES flycapture2bridge flycapture2bridge_v100 libflycapture2bridge.so.3 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
|
||||||
find_library(pnmutils_LIBRARY NAMES pnmutils pnmutils_v100 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
|
find_library(pnmutils_LIBRARY NAMES pnmutils pnmutils_v100 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
|
||||||
|
|
||||||
IF (FlyCapture2_INCLUDE_DIR AND Triclops_INCLUDE_DIR AND FlyCapture2_LIBRARY AND Triclops_LIBRARY AND FlyCaptureBridge_LIBRARY AND pnmutils_LIBRARY)
|
IF (FlyCapture2_INCLUDE_DIR AND Triclops_INCLUDE_DIR AND FlyCapture2_LIBRARY AND Triclops_LIBRARY AND FlyCaptureBridge_LIBRARY AND pnmutils_LIBRARY)
|
||||||
|
|||||||
@@ -17,9 +17,16 @@ FIND_LIBRARY(CHOLMOD_LIB cholmod)
|
|||||||
FIND_PATH(G2O_INCLUDE_DIR g2o/core/base_vertex.h
|
FIND_PATH(G2O_INCLUDE_DIR g2o/core/base_vertex.h
|
||||||
PATHS "C:\\Program Files\\g2o\\include")
|
PATHS "C:\\Program Files\\g2o\\include")
|
||||||
|
|
||||||
|
FIND_FILE(G2O_CONFIG_FILE g2o/config.h
|
||||||
|
PATHS ${G2O_INCLUDE_DIR}
|
||||||
|
NO_DEFAULT_PATH)
|
||||||
|
|
||||||
|
#ifdef G2O_NUMBER_FORMAT_STR
|
||||||
|
#define G2O_CPP11 // we assume that if G2O_NUMBER_FORMAT_STR is defined, this is the new g2o code with c++11 interface
|
||||||
|
#endif
|
||||||
|
|
||||||
# Macro to unify finding both the debug and release versions of the
|
# Macro to unify finding both the debug and release versions of the
|
||||||
# libraries; this is adapted from the OpenSceneGraph FIND_LIBRARY
|
# libraries; this is adapted from the rtabmap config
|
||||||
# macro.
|
|
||||||
|
|
||||||
MACRO(FIND_G2O_LIBRARY MYLIBRARY MYLIBRARYNAME)
|
MACRO(FIND_G2O_LIBRARY MYLIBRARY MYLIBRARYNAME)
|
||||||
|
|
||||||
@@ -31,11 +38,14 @@ MACRO(FIND_G2O_LIBRARY MYLIBRARY MYLIBRARYNAME)
|
|||||||
NAMES "g2o_${MYLIBRARYNAME}"
|
NAMES "g2o_${MYLIBRARYNAME}"
|
||||||
PATHS "C:\\Program Files\\g2o\\lib")
|
PATHS "C:\\Program Files\\g2o\\lib")
|
||||||
|
|
||||||
IF(NOT ${MYLIBRARY}_DEBUG)
|
IF(${MYLIBRARY}_DEBUG AND ${MYLIBRARY})
|
||||||
IF(MYLIBRARY)
|
SET(${MYLIBRARY}
|
||||||
SET(${MYLIBRARY}_DEBUG ${MYLIBRARY})
|
debug ${${MYLIBRARY}_DEBUG}
|
||||||
ENDIF(MYLIBRARY)
|
optimized ${${MYLIBRARY}}
|
||||||
ENDIF( NOT ${MYLIBRARY}_DEBUG)
|
)
|
||||||
|
ELSEIF(${MYLIBRARY}_DEBUG)
|
||||||
|
SET(${MYLIBRARY} ${${MYLIBRARY}_DEBUG})
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
ENDMACRO(FIND_G2O_LIBRARY LIBRARY LIBRARYNAME)
|
ENDMACRO(FIND_G2O_LIBRARY LIBRARY LIBRARYNAME)
|
||||||
|
|
||||||
@@ -73,7 +83,7 @@ ENDIF(G2O_SOLVER_CHOLMOD OR G2O_SOLVER_CSPARSE OR G2O_SOLVER_DENSE OR G2O_SOLVER
|
|||||||
|
|
||||||
# G2O itself declared found if we found the core libraries and at least one solver
|
# G2O itself declared found if we found the core libraries and at least one solver
|
||||||
SET(G2O_FOUND "NO")
|
SET(G2O_FOUND "NO")
|
||||||
IF(G2O_STUFF_LIBRARY AND G2O_CORE_LIBRARY AND G2O_INCLUDE_DIR AND G2O_SOLVERS_FOUND)
|
IF(G2O_STUFF_LIBRARY AND G2O_CORE_LIBRARY AND G2O_INCLUDE_DIR AND G2O_CONFIG_FILE AND G2O_SOLVERS_FOUND)
|
||||||
SET(G2O_INCLUDE_DIRS ${G2O_INCLUDE_DIR})
|
SET(G2O_INCLUDE_DIRS ${G2O_INCLUDE_DIR})
|
||||||
SET(G2O_LIBRARIES
|
SET(G2O_LIBRARIES
|
||||||
${G2O_CORE_LIBRARY}
|
${G2O_CORE_LIBRARY}
|
||||||
@@ -103,5 +113,15 @@ IF(G2O_STUFF_LIBRARY AND G2O_CORE_LIBRARY AND G2O_INCLUDE_DIR AND G2O_SOLVERS_FO
|
|||||||
${CHOLMOD_LIB})
|
${CHOLMOD_LIB})
|
||||||
ENDIF(G2O_SOLVER_CHOLMOD)
|
ENDIF(G2O_SOLVER_CHOLMOD)
|
||||||
|
|
||||||
|
FILE(READ ${G2O_CONFIG_FILE} TMPTXT)
|
||||||
|
STRING(FIND "${TMPTXT}" "G2O_NUMBER_FORMAT_STR" matchres)
|
||||||
|
IF(${matchres} EQUAL -1)
|
||||||
|
MESSAGE(STATUS "Old g2o version detected with c++03 interface (config file: ${G2O_CONFIG_FILE}).")
|
||||||
|
SET(G2O_CPP11 0)
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(WARNING "Latest g2o version detected with c++11 interface (config file: ${G2O_CONFIG_FILE}). Make sure g2o is built with \"-DBUILD_WITH_MARCH_NATIVE=OFF\" to avoid segmentation faults caused by Eigen.")
|
||||||
|
SET(G2O_CPP11 1)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
SET(G2O_FOUND "YES")
|
SET(G2O_FOUND "YES")
|
||||||
ENDIF(G2O_STUFF_LIBRARY AND G2O_CORE_LIBRARY AND G2O_INCLUDE_DIR AND G2O_SOLVERS_FOUND)
|
ENDIF(G2O_STUFF_LIBRARY AND G2O_CORE_LIBRARY AND G2O_INCLUDE_DIR AND G2O_CONFIG_FILE AND G2O_SOLVERS_FOUND)
|
||||||
|
|||||||
183
cmake_modules/FindKinectSDK2.cmake
Normal file
183
cmake_modules/FindKinectSDK2.cmake
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
#.rst:
|
||||||
|
# FindKinectSDK2
|
||||||
|
# --------------
|
||||||
|
#
|
||||||
|
# Find Kinect for Windows SDK v2 (Kinect SDK v2) include dirs, library dirs, libraries
|
||||||
|
#
|
||||||
|
# Use this module by invoking find_package with the form::
|
||||||
|
#
|
||||||
|
# find_package( KinectSDK2 [REQUIRED] )
|
||||||
|
#
|
||||||
|
# Results for users are reported in following variables::
|
||||||
|
#
|
||||||
|
# KinectSDK2_FOUND - Return "TRUE" when Kinect SDK v2 found. Otherwise, Return "FALSE".
|
||||||
|
# KinectSDK2_INCLUDE_DIRS - Kinect SDK v2 include directories. (${KinectSDK2_DIR}/inc)
|
||||||
|
# KinectSDK2_LIBRARY_DIRS - Kinect SDK v2 library directories. (${KinectSDK2_DIR}/Lib/x86 or ${KinectSDK2_DIR}/Lib/x64)
|
||||||
|
# KinectSDK2_LIBRARIES - Kinect SDK v2 library files. (${KinectSDK2_LIBRARY_DIRS}/Kinect20.lib (If check the box of any application festures, corresponding library will be added.))
|
||||||
|
# KinectSDK2_COMMANDS - Copy commands of redist files for application functions of Kinect SDK v2. (If uncheck the box of all application features, this variable has defined empty command.)
|
||||||
|
#
|
||||||
|
# This module reads hints about search locations from following environment variables::
|
||||||
|
#
|
||||||
|
# KINECTSDK20_DIR - Kinect SDK v2 root directory. (This environment variable has been set by installer of Kinect SDK v2.)
|
||||||
|
#
|
||||||
|
# CMake entries::
|
||||||
|
#
|
||||||
|
# KinectSDK2_DIR - Kinect SDK v2 root directory. (Default $ENV{KINECTSDK20_DIR})
|
||||||
|
# KinectSDK2_FACE - Check the box when using Face or HDFace features. (Default uncheck)
|
||||||
|
# KinectSDK2_FUSION - Check the box when using Fusion features. (Default uncheck)
|
||||||
|
# KinectSDK2_VGB - Check the box when using Visual Gesture Builder features. (Default uncheck)
|
||||||
|
#
|
||||||
|
# Example to find Kinect SDK v2::
|
||||||
|
#
|
||||||
|
# cmake_minimum_required( VERSION 2.8 )
|
||||||
|
#
|
||||||
|
# project( project )
|
||||||
|
# add_executable( project main.cpp )
|
||||||
|
# set_property( DIRECTORY PROPERTY VS_STARTUP_PROJECT "project" )
|
||||||
|
#
|
||||||
|
# # Find package using this module.
|
||||||
|
# find_package( KinectSDK2 REQUIRED )
|
||||||
|
#
|
||||||
|
# if(KinectSDK2_FOUND)
|
||||||
|
# # [C/C++]>[General]>[Additional Include Directories]
|
||||||
|
# include_directories( ${KinectSDK2_INCLUDE_DIRS} )
|
||||||
|
#
|
||||||
|
# # [Linker]>[General]>[Additional Library Directories]
|
||||||
|
# link_directories( ${KinectSDK2_LIBRARY_DIRS} )
|
||||||
|
#
|
||||||
|
# # [Linker]>[Input]>[Additional Dependencies]
|
||||||
|
# target_link_libraries( project ${KinectSDK2_LIBRARIES} )
|
||||||
|
#
|
||||||
|
# # [Build Events]>[Post-Build Event]>[Command Line]
|
||||||
|
# add_custom_command( TARGET project POST_BUILD ${KinectSDK2_COMMANDS} )
|
||||||
|
# endif()
|
||||||
|
#
|
||||||
|
# =============================================================================
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 Tsukasa SUGIURA
|
||||||
|
# Distributed under the MIT License.
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
##### Utility #####
|
||||||
|
|
||||||
|
# Check Directory Macro
|
||||||
|
macro(CHECK_DIR _DIR)
|
||||||
|
if(NOT EXISTS "${${_DIR}}")
|
||||||
|
message(WARNING "Directory \"${${_DIR}}\" not found.")
|
||||||
|
set(KinectSDK2_FOUND FALSE)
|
||||||
|
unset(_DIR)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# Check Files Macro
|
||||||
|
macro(CHECK_FILES _FILES _DIR)
|
||||||
|
set(_MISSING_FILES)
|
||||||
|
foreach(_FILE ${${_FILES}})
|
||||||
|
if(NOT EXISTS "${_FILE}")
|
||||||
|
get_filename_component(_FILE ${_FILE} NAME)
|
||||||
|
set(_MISSING_FILES "${_MISSING_FILES}${_FILE}, ")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
if(_MISSING_FILES)
|
||||||
|
message(WARNING "In directory \"${${_DIR}}\" not found files: ${_MISSING_FILES}")
|
||||||
|
set(KinectSDK2_FOUND FALSE)
|
||||||
|
unset(_FILES)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# Target Platform
|
||||||
|
set(TARGET_PLATFORM)
|
||||||
|
if(NOT CMAKE_CL_64)
|
||||||
|
set(TARGET_PLATFORM x86)
|
||||||
|
else()
|
||||||
|
set(TARGET_PLATFORM x64)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
##### Find Kinect SDK v2 #####
|
||||||
|
|
||||||
|
# Found
|
||||||
|
set(KinectSDK2_FOUND TRUE)
|
||||||
|
if(MSVC_VERSION LESS 1700)
|
||||||
|
message(WARNING "Kinect for Windows SDK v2 supported Visual Studio 2012 or later.")
|
||||||
|
set(KinectSDK2_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Options
|
||||||
|
option(KinectSDK2_FACE "Face and HDFace features" FALSE)
|
||||||
|
option(KinectSDK2_FUSION "Fusion features" FALSE)
|
||||||
|
option(KinectSDK2_VGB "Visual Gesture Builder features" FALSE)
|
||||||
|
|
||||||
|
# Root Directoty
|
||||||
|
set(KinectSDK2_DIR)
|
||||||
|
if(KinectSDK2_FOUND)
|
||||||
|
set(KinectSDK2_DIR $ENV{KINECTSDK20_DIR} CACHE PATH "Kinect for Windows SDK v2 Install Path." FORCE)
|
||||||
|
check_dir(KinectSDK2_DIR)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Include Directories
|
||||||
|
set(KinectSDK2_INCLUDE_DIRS)
|
||||||
|
if(KinectSDK2_FOUND)
|
||||||
|
set(KinectSDK2_INCLUDE_DIRS ${KinectSDK2_DIR}/inc)
|
||||||
|
check_dir(KinectSDK2_INCLUDE_DIRS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Library Directories
|
||||||
|
set(KinectSDK2_LIBRARY_DIRS)
|
||||||
|
if(KinectSDK2_FOUND)
|
||||||
|
set(KinectSDK2_LIBRARY_DIRS ${KinectSDK2_DIR}/Lib/${TARGET_PLATFORM})
|
||||||
|
check_dir(KinectSDK2_LIBRARY_DIRS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
set(KinectSDK2_LIBRARIES)
|
||||||
|
if(KinectSDK2_FOUND)
|
||||||
|
set(KinectSDK2_LIBRARIES ${KinectSDK2_LIBRARY_DIRS}/Kinect20.lib)
|
||||||
|
|
||||||
|
if(KinectSDK2_FACE)
|
||||||
|
set(KinectSDK2_LIBRARIES ${KinectSDK2_LIBRARIES};${KinectSDK2_LIBRARY_DIRS}/Kinect20.Face.lib)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(KinectSDK2_FUSION)
|
||||||
|
set(KinectSDK2_LIBRARIES ${KinectSDK2_LIBRARIES};${KinectSDK2_LIBRARY_DIRS}/Kinect20.Fusion.lib)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(KinectSDK2_VGB)
|
||||||
|
set(KinectSDK2_LIBRARIES ${KinectSDK2_LIBRARIES};${KinectSDK2_LIBRARY_DIRS}/Kinect20.VisualGestureBuilder.lib)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
check_files(KinectSDK2_LIBRARIES KinectSDK2_LIBRARY_DIRS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Custom Commands
|
||||||
|
set(KinectSDK2_COMMANDS)
|
||||||
|
if(KinectSDK2_FOUND)
|
||||||
|
if(KinectSDK2_FACE)
|
||||||
|
set(KinectSDK2_REDIST_DIR ${KinectSDK2_DIR}/Redist/Face/${TARGET_PLATFORM})
|
||||||
|
check_dir(KinectSDK2_REDIST_DIR)
|
||||||
|
list(APPEND KinectSDK2_COMMANDS COMMAND xcopy "${KinectSDK2_REDIST_DIR}" "$(OutDir)" /e /y /i /r > NUL)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(KinectSDK2_FUSION)
|
||||||
|
set(KinectSDK2_REDIST_DIR ${KinectSDK2_DIR}/Redist/Fusion/${TARGET_PLATFORM})
|
||||||
|
check_dir(KinectSDK2_REDIST_DIR)
|
||||||
|
list(APPEND KinectSDK2_COMMANDS COMMAND xcopy "${KinectSDK2_REDIST_DIR}" "$(OutDir)" /e /y /i /r > NUL)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(KinectSDK2_VGB)
|
||||||
|
set(KinectSDK2_REDIST_DIR ${KinectSDK2_DIR}/Redist/VGB/${TARGET_PLATFORM})
|
||||||
|
check_dir(KinectSDK2_REDIST_DIR)
|
||||||
|
list(APPEND KinectSDK2_COMMANDS COMMAND xcopy "${KinectSDK2_REDIST_DIR}" "$(OutDir)" /e /y /i /r > NUL)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Empty Commands
|
||||||
|
if(NOT KinectSDK2_COMMANDS)
|
||||||
|
set(KinectSDK2_COMMANDS COMMAND)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "KinectSDK2_FOUND : ${KinectSDK2_FOUND}")
|
||||||
33
cmake_modules/FindORB_SLAM2.cmake
Normal file
33
cmake_modules/FindORB_SLAM2.cmake
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# - Find ORB_SLAM2
|
||||||
|
#
|
||||||
|
# It sets the following variables:
|
||||||
|
# ORB_SLAM2_FOUND - Set to false, or undefined, if ORB_SLAM2 isn't found.
|
||||||
|
# ORB_SLAM2_INCLUDE_DIRS - The ORB_SLAM2 include directory.
|
||||||
|
# ORB_SLAM2_LIBRARIES - The ORB_SLAM2 library to link against.
|
||||||
|
#
|
||||||
|
# Set ORB_SLAM2_ROOT_DIR environment variable as the path to ORB_SLAM2 root folder.
|
||||||
|
|
||||||
|
find_path(ORB_SLAM2_INCLUDE_DIR NAMES System.h PATHS $ENV{ORB_SLAM2_ROOT_DIR}/include)
|
||||||
|
find_library(ORB_SLAM2_LIBRARY NAMES ORB_SLAM2 PATHS $ENV{ORB_SLAM2_ROOT_DIR}/lib)
|
||||||
|
find_path(g2o_INCLUDE_DIR NAMES g2o/core/sparse_optimizer.h PATHS $ENV{ORB_SLAM2_ROOT_DIR}/Thirdparty/g2o NO_DEFAULT_PATH)
|
||||||
|
find_library(g2o_LIBRARY NAMES g2o PATHS $ENV{ORB_SLAM2_ROOT_DIR}/Thirdparty/g2o/lib NO_DEFAULT_PATH)
|
||||||
|
find_library(DBoW2_LIBRARY NAMES DBoW2 PATHS $ENV{ORB_SLAM2_ROOT_DIR}/Thirdparty/DBoW2/lib NO_DEFAULT_PATH)
|
||||||
|
|
||||||
|
IF (ORB_SLAM2_INCLUDE_DIR AND ORB_SLAM2_LIBRARY AND DBoW2_LIBRARY AND g2o_INCLUDE_DIR AND g2o_LIBRARY)
|
||||||
|
SET(ORB_SLAM2_FOUND TRUE)
|
||||||
|
SET(ORB_SLAM2_INCLUDE_DIRS ${ORB_SLAM2_INCLUDE_DIR} ${g2o_INCLUDE_DIR} $ENV{ORB_SLAM2_ROOT_DIR})
|
||||||
|
SET(ORB_SLAM2_LIBRARIES ${g2o_LIBRARY} ${ORB_SLAM2_LIBRARY} ${DBoW2_LIBRARY})
|
||||||
|
ENDIF (ORB_SLAM2_INCLUDE_DIR AND ORB_SLAM2_LIBRARY AND DBoW2_LIBRARY AND g2o_INCLUDE_DIR AND g2o_LIBRARY)
|
||||||
|
|
||||||
|
IF (ORB_SLAM2_FOUND)
|
||||||
|
# show which ORB_SLAM2 was found only if not quiet
|
||||||
|
IF (NOT ORB_SLAM2_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "Found ORB_SLAM2: ${ORB_SLAM2_LIBRARIES}")
|
||||||
|
ENDIF (NOT ORB_SLAM2_FIND_QUIETLY)
|
||||||
|
ELSE (ORB_SLAM2_FOUND)
|
||||||
|
# fatal error if ORB_SLAM2 is required but not found
|
||||||
|
IF (ORB_SLAM2_FIND_REQUIRED)
|
||||||
|
MESSAGE(FATAL_ERROR "Could not find ORB_SLAM2")
|
||||||
|
ENDIF (ORB_SLAM2_FIND_REQUIRED)
|
||||||
|
ENDIF (ORB_SLAM2_FOUND)
|
||||||
|
|
||||||
78
cmake_modules/FindRealSense.cmake
Normal file
78
cmake_modules/FindRealSense.cmake
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# - Find librealsense (https://github.com/IntelRealSense/librealsense)
|
||||||
|
#
|
||||||
|
# RealSense_ROOT_DIR environment variable can be set to find the library.
|
||||||
|
#
|
||||||
|
# It sets the following variables:
|
||||||
|
# RealSense_FOUND - Set to false, or undefined, if RealSense isn't found.
|
||||||
|
# RealSenseSlam_FOUND - Set to false, or undefined, if RealSense slam module isn't found.
|
||||||
|
# RealSense_INCLUDE_DIRS - The RealSense include directory.
|
||||||
|
# RealSense_LIBRARIES - The RealSense library to link against.
|
||||||
|
|
||||||
|
# Use find_package( RealSense COMPONENTS slam ) to search for realsense slam library
|
||||||
|
if( RealSense_FIND_COMPONENTS )
|
||||||
|
foreach( component ${RealSense_FIND_COMPONENTS} )
|
||||||
|
string( TOUPPER ${component} _COMPONENT )
|
||||||
|
set( REALSENSE_USE_${_COMPONENT} 1 )
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#RealSense library
|
||||||
|
find_path(RealSense_INCLUDE_DIRS NAMES librealsense/rs.hpp PATHS $ENV{RealSense_ROOT_DIR}/include)
|
||||||
|
if(CMAKE_CL_64)
|
||||||
|
find_library(RealSense_LIBRARY NAMES realsense PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/x64)
|
||||||
|
else()
|
||||||
|
find_library(RealSense_LIBRARY NAMES realsense PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/Win32)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
IF (RealSense_INCLUDE_DIRS AND RealSense_LIBRARY)
|
||||||
|
SET(RealSense_FOUND TRUE)
|
||||||
|
ENDIF (RealSense_INCLUDE_DIRS AND RealSense_LIBRARY)
|
||||||
|
|
||||||
|
#SLAM
|
||||||
|
if(REALSENSE_USE_SLAM)
|
||||||
|
find_path(RealSenseSlam_INCLUDE_DIRS NAMES librealsense/slam/slam.h PATHS $ENV{RealSense_ROOT_DIR}/include)
|
||||||
|
if(CMAKE_CL_64)
|
||||||
|
find_library(RealSenseSlam_LIBRARY NAMES realsense_slam PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/x64)
|
||||||
|
find_library(RealSenseImage_LIBRARY NAMES realsense_image PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/x64)
|
||||||
|
find_library(RealSenseSP_Core_LIBRARY NAMES SP_Core PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/x64)
|
||||||
|
find_library(RealSenseTracker_LIBRARY NAMES tracker PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/x64)
|
||||||
|
else()
|
||||||
|
find_library(RealSenseSlam_LIBRARY NAMES realsense_slam PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/Win32)
|
||||||
|
find_library(RealSenseImage_LIBRARY NAMES realsense_image PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/Win32)
|
||||||
|
find_library(RealSenseSP_Core_LIBRARY NAMES SP_Core PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/Win32)
|
||||||
|
find_library(RealSenseTracker_LIBRARY NAMES tracker PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/Win32)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(RealSenseSlam_INCLUDE_DIRS "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
IF (RealSense_FOUND)
|
||||||
|
|
||||||
|
IF (RealSenseSlam_INCLUDE_DIRS AND RealSenseSlam_LIBRARY AND RealSenseImage_LIBRARY AND RealSenseSP_Core_LIBRARY AND RealSenseTracker_LIBRARY)
|
||||||
|
SET(RealSenseSlam_FOUND TRUE)
|
||||||
|
ENDIF (RealSenseSlam_INCLUDE_DIRS AND RealSenseSlam_LIBRARY AND RealSenseImage_LIBRARY AND RealSenseSP_Core_LIBRARY AND RealSenseTracker_LIBRARY)
|
||||||
|
|
||||||
|
SET(RealSense_LIBRARIES ${RealSense_LIBRARY})
|
||||||
|
IF (RealSenseSlam_FOUND)
|
||||||
|
IF (RealSenseSlam_INCLUDE_DIRS AND RealSenseSlam_LIBRARY AND RealSenseImage_LIBRARY AND RealSenseSP_Core_LIBRARY AND RealSenseTracker_LIBRARY)
|
||||||
|
SET(RealSenseSlam_FOUND TRUE)
|
||||||
|
ENDIF (RealSenseSlam_INCLUDE_DIRS AND RealSenseSlam_LIBRARY AND RealSenseImage_LIBRARY AND RealSenseSP_Core_LIBRARY AND RealSenseTracker_LIBRARY)
|
||||||
|
SET(RealSense_LIBRARIES
|
||||||
|
${RealSense_LIBRARIES}
|
||||||
|
${RealSenseSlam_LIBRARY}
|
||||||
|
${RealSenseImage_LIBRARY}
|
||||||
|
${RealSenseSP_Core_LIBRARY}
|
||||||
|
${RealSenseTracker_LIBRARY})
|
||||||
|
ENDIF(RealSenseSlam_FOUND)
|
||||||
|
|
||||||
|
# show which RealSense was found only if not quiet
|
||||||
|
IF (NOT RealSense_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "Found RealSense: ${RealSense_LIBRARIES}")
|
||||||
|
ENDIF (NOT RealSense_FIND_QUIETLY)
|
||||||
|
ELSE (RealSense_FOUND)
|
||||||
|
# fatal error if RealSense is required but not found
|
||||||
|
IF (RealSense_FIND_REQUIRED)
|
||||||
|
MESSAGE(FATAL_ERROR "Could not find RealSense (librealsense)")
|
||||||
|
ENDIF (RealSense_FIND_REQUIRED)
|
||||||
|
ENDIF (RealSense_FOUND)
|
||||||
|
|
||||||
@@ -8,13 +8,14 @@
|
|||||||
|
|
||||||
FIND_PATH(Tango_INCLUDE_DIR tango_client_api.h)
|
FIND_PATH(Tango_INCLUDE_DIR tango_client_api.h)
|
||||||
|
|
||||||
FIND_LIBRARY(Tango_LIBRARY NAMES tango_client_api)
|
FIND_LIBRARY(Tango_LIBRARY NAMES tango_client_api PATH_SUFFIXES ${ANDROID_ABI})
|
||||||
|
FIND_LIBRARY(Tango_support_LIBRARY NAMES tango_support_api PATH_SUFFIXES ${ANDROID_ABI})
|
||||||
|
|
||||||
IF (Tango_INCLUDE_DIR AND Tango_LIBRARY)
|
IF (Tango_INCLUDE_DIR AND Tango_LIBRARY AND Tango_support_LIBRARY)
|
||||||
SET(Tango_FOUND TRUE)
|
SET(Tango_FOUND TRUE)
|
||||||
SET(Tango_INCLUDE_DIRS ${Tango_INCLUDE_DIR})
|
SET(Tango_INCLUDE_DIRS ${Tango_INCLUDE_DIR})
|
||||||
SET(Tango_LIBRARIES ${Tango_LIBRARY})
|
SET(Tango_LIBRARIES ${Tango_LIBRARY} ${Tango_support_LIBRARY})
|
||||||
ENDIF (Tango_INCLUDE_DIR AND Tango_LIBRARY)
|
ENDIF (Tango_INCLUDE_DIR AND Tango_LIBRARY AND Tango_support_LIBRARY)
|
||||||
|
|
||||||
IF (Tango_FOUND)
|
IF (Tango_FOUND)
|
||||||
# show which Tango was found only if not quiet
|
# show which Tango was found only if not quiet
|
||||||
@@ -24,7 +25,7 @@ IF (Tango_FOUND)
|
|||||||
ELSE (Tango_FOUND)
|
ELSE (Tango_FOUND)
|
||||||
# fatal error if Tango is required but not found
|
# fatal error if Tango is required but not found
|
||||||
IF (Tango_FIND_REQUIRED)
|
IF (Tango_FIND_REQUIRED)
|
||||||
MESSAGE(FATAL_ERROR "Could not find Tango")
|
MESSAGE(FATAL_ERROR "Could not find Tango (client and/or support libraries)")
|
||||||
ENDIF (Tango_FIND_REQUIRED)
|
ENDIF (Tango_FIND_REQUIRED)
|
||||||
ENDIF (Tango_FOUND)
|
ENDIF (Tango_FOUND)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -59,18 +59,14 @@ public:
|
|||||||
const std::vector<double> & getPredictionLC() const; // {Vp, Lc, l1, l2, l3, l4...}
|
const std::vector<double> & getPredictionLC() const; // {Vp, Lc, l1, l2, l3, l4...}
|
||||||
std::string getPredictionLCStr() const; // for convenience {Vp, Lc, l1, l2, l3, l4...}
|
std::string getPredictionLCStr() const; // for convenience {Vp, Lc, l1, l2, l3, l4...}
|
||||||
|
|
||||||
cv::Mat generatePrediction(const Memory * memory, const std::vector<int> & ids) const;
|
cv::Mat generatePrediction(const Memory * memory, const std::vector<int> & ids);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cv::Mat updatePrediction(const cv::Mat & oldPrediction,
|
cv::Mat updatePrediction(const cv::Mat & oldPrediction,
|
||||||
const Memory * memory,
|
const Memory * memory,
|
||||||
const std::vector<int> & oldIds,
|
const std::vector<int> & oldIds,
|
||||||
const std::vector<int> & newIds) const;
|
const std::vector<int> & newIds);
|
||||||
void updatePosterior(const Memory * memory, const std::vector<int> & likelihoodIds);
|
void updatePosterior(const Memory * memory, const std::vector<int> & likelihoodIds);
|
||||||
float addNeighborProb(cv::Mat & prediction,
|
|
||||||
unsigned int col,
|
|
||||||
const std::map<int, int> & neighbors,
|
|
||||||
const std::map<int, int> & idToIndexMap) const;
|
|
||||||
void normalize(cv::Mat & prediction, unsigned int index, float addedProbabilitiesSum, bool virtualPlaceUsed) const;
|
void normalize(cv::Mat & prediction, unsigned int index, float addedProbabilitiesSum, bool virtualPlaceUsed) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -80,6 +76,7 @@ private:
|
|||||||
std::vector<double> _predictionLC; // {Vp, Lc, l1, l2, l3, l4...}
|
std::vector<double> _predictionLC; // {Vp, Lc, l1, l2, l3, l4...}
|
||||||
bool _fullPredictionUpdate;
|
bool _fullPredictionUpdate;
|
||||||
float _totalPredictionLCValues;
|
float _totalPredictionLCValues;
|
||||||
|
std::map<int, std::map<int, int> > _neighborsIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -56,6 +56,7 @@ public:
|
|||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "") = 0;
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "") = 0;
|
||||||
virtual bool isCalibrated() const = 0;
|
virtual bool isCalibrated() const = 0;
|
||||||
virtual std::string getSerial() const = 0;
|
virtual std::string getSerial() const = 0;
|
||||||
|
virtual bool odomProvided() const { return false; }
|
||||||
|
|
||||||
//getters
|
//getters
|
||||||
float getImageRate() const {return _imageRate;}
|
float getImageRate() const {return _imageRate;}
|
||||||
@@ -65,6 +66,7 @@ public:
|
|||||||
void setImageRate(float imageRate) {_imageRate = imageRate;}
|
void setImageRate(float imageRate) {_imageRate = imageRate;}
|
||||||
void setLocalTransform(const Transform & localTransform) {_localTransform= localTransform;}
|
void setLocalTransform(const Transform & localTransform) {_localTransform= localTransform;}
|
||||||
|
|
||||||
|
void resetTimer();
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@@ -76,7 +78,7 @@ protected:
|
|||||||
/**
|
/**
|
||||||
* returned rgb and depth images should be already rectified if calibration was loaded
|
* returned rgb and depth images should be already rectified if calibration was loaded
|
||||||
*/
|
*/
|
||||||
virtual SensorData captureImage() = 0;
|
virtual SensorData captureImage(CameraInfo * info = 0) = 0;
|
||||||
|
|
||||||
int getNextSeqID() {return ++_seq;}
|
int getNextSeqID() {return ++_seq;}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -39,22 +39,35 @@ public:
|
|||||||
CameraInfo() :
|
CameraInfo() :
|
||||||
cameraName(""),
|
cameraName(""),
|
||||||
id(0),
|
id(0),
|
||||||
|
stamp(0.0),
|
||||||
timeCapture(0.0f),
|
timeCapture(0.0f),
|
||||||
timeDisparity(0.0f),
|
timeDisparity(0.0f),
|
||||||
timeMirroring(0.0f),
|
timeMirroring(0.0f),
|
||||||
timeImageDecimation(0.0f),
|
timeImageDecimation(0.0f),
|
||||||
timeScanFromDepth(0.0f)
|
timeScanFromDepth(0.0f),
|
||||||
|
timeUndistortDepth(0.0f),
|
||||||
|
timeBilateralFiltering(0.0f),
|
||||||
|
timeTotal(0.0f),
|
||||||
|
odomCovariance(cv::Mat::eye(6,6,CV_64FC1))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
virtual ~CameraInfo() {}
|
virtual ~CameraInfo() {}
|
||||||
|
|
||||||
std::string cameraName;
|
std::string cameraName;
|
||||||
int id;
|
int id;
|
||||||
|
double stamp;
|
||||||
float timeCapture;
|
float timeCapture;
|
||||||
float timeDisparity;
|
float timeDisparity;
|
||||||
float timeMirroring;
|
float timeMirroring;
|
||||||
|
float timeStereoExposureCompensation;
|
||||||
float timeImageDecimation;
|
float timeImageDecimation;
|
||||||
float timeScanFromDepth;
|
float timeScanFromDepth;
|
||||||
|
float timeUndistortDepth;
|
||||||
|
float timeBilateralFiltering;
|
||||||
|
float timeTotal;
|
||||||
|
Transform odomPose;
|
||||||
|
cv::Mat odomCovariance;
|
||||||
|
std::vector<float> odomVelocity;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -76,7 +76,8 @@ public:
|
|||||||
|
|
||||||
void initRectificationMap();
|
void initRectificationMap();
|
||||||
|
|
||||||
bool isValidForProjection() const {return fx()>0.0 && fy()>0.0;}
|
bool isValidForProjection() const {return fx()>0.0 && fy()>0.0 && cx()>0.0 && cy()>0.0;}
|
||||||
|
bool isValidForReprojection() const {return fx()>0.0 && fy()>0.0 && cx()>0.0 && cy()>0.0 && imageWidth()>0 && imageHeight()>0;}
|
||||||
bool isValidForRectification() const
|
bool isValidForRectification() const
|
||||||
{
|
{
|
||||||
return imageSize_.width>0 &&
|
return imageSize_.width>0 &&
|
||||||
@@ -106,7 +107,7 @@ public:
|
|||||||
void setLocalTransform(const Transform & transform) {localTransform_ = transform;}
|
void setLocalTransform(const Transform & transform) {localTransform_ = transform;}
|
||||||
const Transform & localTransform() const {return localTransform_;}
|
const Transform & localTransform() const {return localTransform_;}
|
||||||
|
|
||||||
void setImageSize(const cv::Size & size) {imageSize_ = size;}
|
void setImageSize(const cv::Size & size);
|
||||||
const cv::Size & imageSize() const {return imageSize_;}
|
const cv::Size & imageSize() const {return imageSize_;}
|
||||||
int imageWidth() const {return imageSize_.width;}
|
int imageWidth() const {return imageSize_.width;}
|
||||||
int imageHeight() const {return imageSize_.height;}
|
int imageHeight() const {return imageSize_.height;}
|
||||||
@@ -115,6 +116,7 @@ public:
|
|||||||
bool save(const std::string & directory) const;
|
bool save(const std::string & directory) const;
|
||||||
|
|
||||||
CameraModel scaled(double scale) const;
|
CameraModel scaled(double scale) const;
|
||||||
|
CameraModel roi(const cv::Rect & roi) const;
|
||||||
|
|
||||||
double horizontalFOV() const; // in degrees
|
double horizontalFOV() const; // in degrees
|
||||||
double verticalFOV() const; // in degrees
|
double verticalFOV() const; // in degrees
|
||||||
@@ -123,6 +125,13 @@ public:
|
|||||||
cv::Mat rectifyImage(const cv::Mat & raw, int interpolation = cv::INTER_LINEAR) const;
|
cv::Mat rectifyImage(const cv::Mat & raw, int interpolation = cv::INTER_LINEAR) const;
|
||||||
cv::Mat rectifyDepth(const cv::Mat & raw) const;
|
cv::Mat rectifyDepth(const cv::Mat & raw) const;
|
||||||
|
|
||||||
|
// Project 2D pixel to 3D (in /camera_link frame)
|
||||||
|
void project(float u, float v, float depth, float & x, float & y, float & z) const;
|
||||||
|
// Reproject 3D point (in /camera_link frame) to pixel
|
||||||
|
void reproject(float x, float y, float z, float & u, float & v) const;
|
||||||
|
void reproject(float x, float y, float z, int & u, int & v) const;
|
||||||
|
bool inFrame(int u, int v) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string name_;
|
std::string name_;
|
||||||
cv::Size imageSize_;
|
cv::Size imageSize_;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -59,6 +59,7 @@ public:
|
|||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
virtual bool isCalibrated() const;
|
virtual bool isCalibrated() const;
|
||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
virtual bool odomProvided() const { return odometry_.size() > 0; }
|
||||||
std::string getPath() const {return _path;}
|
std::string getPath() const {return _path;}
|
||||||
unsigned int imagesCount() const;
|
unsigned int imagesCount() const;
|
||||||
std::vector<std::string> filenames() const;
|
std::vector<std::string> filenames() const;
|
||||||
@@ -67,7 +68,7 @@ public:
|
|||||||
const CameraModel & cameraModel() const {return _model;}
|
const CameraModel & cameraModel() const {return _model;}
|
||||||
|
|
||||||
void setPath(const std::string & dir) {_path=dir;}
|
void setPath(const std::string & dir) {_path=dir;}
|
||||||
void setStartIndex(int index) {_startAt = index;} // negative means last
|
virtual void setStartIndex(int index) {_startAt = index;} // negative means last
|
||||||
void setDirRefreshed(bool enabled) {_refreshDir = enabled;}
|
void setDirRefreshed(bool enabled) {_refreshDir = enabled;}
|
||||||
void setImagesRectified(bool enabled) {_rectifyImages = enabled;}
|
void setImagesRectified(bool enabled) {_rectifyImages = enabled;}
|
||||||
void setBayerMode(int mode) {_bayerMode = mode;} // -1=disabled (default) 0=BayerBG, 1=BayerGB, 2=BayerRG, 3=BayerGR
|
void setBayerMode(int mode) {_bayerMode = mode;} // -1=disabled (default) 0=BayerBG, 1=BayerGB, 2=BayerRG, 3=BayerGR
|
||||||
@@ -75,8 +76,8 @@ public:
|
|||||||
void setTimestamps(bool fileNamesAreStamps, const std::string & filePath = "", bool syncImageRateWithStamps=true)
|
void setTimestamps(bool fileNamesAreStamps, const std::string & filePath = "", bool syncImageRateWithStamps=true)
|
||||||
{
|
{
|
||||||
_filenamesAreTimestamps = fileNamesAreStamps;
|
_filenamesAreTimestamps = fileNamesAreStamps;
|
||||||
timestampsPath_=filePath;
|
_timestampsPath=filePath;
|
||||||
syncImageRateWithStamps_ = syncImageRateWithStamps;
|
_syncImageRateWithStamps = syncImageRateWithStamps;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setScanPath(
|
void setScanPath(
|
||||||
@@ -84,19 +85,19 @@ public:
|
|||||||
int maxScanPts = 0,
|
int maxScanPts = 0,
|
||||||
int downsampleStep = 1,
|
int downsampleStep = 1,
|
||||||
float voxelSize = 0.0f,
|
float voxelSize = 0.0f,
|
||||||
int normalsK = 0, // compute normals if > 0
|
int normalsK = 0, // compute normals if > 0
|
||||||
const Transform & localTransform=Transform::getIdentity())
|
float normalsRadius = 0, // compute normals if > 0
|
||||||
|
const Transform & localTransform=Transform::getIdentity(),
|
||||||
|
bool forceGroundNormalsUp = false)
|
||||||
{
|
{
|
||||||
_scanPath = dir;
|
_scanPath = dir;
|
||||||
_scanLocalTransform = localTransform;
|
_scanLocalTransform = localTransform;
|
||||||
_scanMaxPts = maxScanPts;
|
_scanMaxPts = maxScanPts;
|
||||||
_scanDownsampleStep = downsampleStep;
|
_scanDownsampleStep = downsampleStep;
|
||||||
_scanNormalsK = normalsK;
|
_scanNormalsK = normalsK;
|
||||||
|
_scanNormalsRadius = normalsRadius;
|
||||||
_scanVoxelSize = voxelSize;
|
_scanVoxelSize = voxelSize;
|
||||||
if(_scanDownsampleStep>1)
|
_scanForceGroundNormalsUp = forceGroundNormalsUp;
|
||||||
{
|
|
||||||
_scanMaxPts /= _scanDownsampleStep;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDepthFromScan(bool enabled, int fillHoles = 1, bool fillHolesFromBorder = false)
|
void setDepthFromScan(bool enabled, int fillHoles = 1, bool fillHolesFromBorder = false)
|
||||||
@@ -106,12 +107,23 @@ public:
|
|||||||
_depthFromScanFillHolesFromBorder = fillHolesFromBorder;
|
_depthFromScanFillHolesFromBorder = fillHolesFromBorder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Format: 0=Raw, 1=RGBD-SLAM, 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe
|
||||||
|
void setOdometryPath(const std::string & filePath, int format = 0)
|
||||||
|
{
|
||||||
|
_odometryPath = filePath;
|
||||||
|
_odometryFormat = format;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format: 0=Raw, 1=RGBD-SLAM, 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe
|
||||||
void setGroundTruthPath(const std::string & filePath, int format = 0)
|
void setGroundTruthPath(const std::string & filePath, int format = 0)
|
||||||
{
|
{
|
||||||
groundTruthPath_ = filePath;
|
_groundTruthPath = filePath;
|
||||||
_groundTruthFormat = format;
|
_groundTruthFormat = format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setMaxPoseTimeDiff(double diff) {_maxPoseTimeDiff = diff;}
|
||||||
|
double getMaxPoseTimeDiff() const {return _maxPoseTimeDiff;}
|
||||||
|
|
||||||
void setDepth(bool isDepth, float depthScaleFactor = 1.0f)
|
void setDepth(bool isDepth, float depthScaleFactor = 1.0f)
|
||||||
{
|
{
|
||||||
_isDepth = isDepth;
|
_isDepth = isDepth;
|
||||||
@@ -119,7 +131,13 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
bool readPoses(
|
||||||
|
std::list<Transform> & outputPoses,
|
||||||
|
std::list<double> & stamps,
|
||||||
|
const std::string & filePath,
|
||||||
|
int format,
|
||||||
|
double maxTimeDiff) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string _path;
|
std::string _path;
|
||||||
@@ -144,19 +162,25 @@ private:
|
|||||||
int _scanDownsampleStep;
|
int _scanDownsampleStep;
|
||||||
float _scanVoxelSize;
|
float _scanVoxelSize;
|
||||||
int _scanNormalsK;
|
int _scanNormalsK;
|
||||||
|
float _scanNormalsRadius;
|
||||||
|
bool _scanForceGroundNormalsUp;
|
||||||
|
|
||||||
bool _depthFromScan;
|
bool _depthFromScan;
|
||||||
int _depthFromScanFillHoles; // <0:horizontal 0:disabled >0:vertical
|
int _depthFromScanFillHoles; // <0:horizontal 0:disabled >0:vertical
|
||||||
bool _depthFromScanFillHolesFromBorder;
|
bool _depthFromScanFillHolesFromBorder;
|
||||||
|
|
||||||
bool _filenamesAreTimestamps;
|
bool _filenamesAreTimestamps;
|
||||||
std::string timestampsPath_;
|
std::string _timestampsPath;
|
||||||
bool syncImageRateWithStamps_;
|
bool _syncImageRateWithStamps;
|
||||||
|
|
||||||
std::string groundTruthPath_;
|
std::string _odometryPath;
|
||||||
|
int _odometryFormat;
|
||||||
|
std::string _groundTruthPath;
|
||||||
int _groundTruthFormat;
|
int _groundTruthFormat;
|
||||||
|
double _maxPoseTimeDiff;
|
||||||
|
|
||||||
std::list<double> stamps_;
|
std::list<double> _stamps;
|
||||||
|
std::list<Transform> odometry_;
|
||||||
std::list<Transform> groundTruth_;
|
std::list<Transform> groundTruth_;
|
||||||
CameraModel _model;
|
CameraModel _model;
|
||||||
|
|
||||||
@@ -178,6 +202,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
CameraVideo(int usbDevice = 0,
|
CameraVideo(int usbDevice = 0,
|
||||||
|
bool rectifyImages = false,
|
||||||
float imageRate = 0,
|
float imageRate = 0,
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
CameraVideo(const std::string & filePath,
|
CameraVideo(const std::string & filePath,
|
||||||
@@ -193,7 +218,7 @@ public:
|
|||||||
const std::string & getFilePath() const {return _filePath;}
|
const std::string & getFilePath() const {return _filePath;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// File type
|
// File type
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -34,13 +34,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "rtabmap/core/CameraModel.h"
|
#include "rtabmap/core/CameraModel.h"
|
||||||
#include "rtabmap/core/Camera.h"
|
#include "rtabmap/core/Camera.h"
|
||||||
#include "rtabmap/core/CameraRGB.h"
|
#include "rtabmap/core/CameraRGB.h"
|
||||||
|
#include "rtabmap/core/Version.h"
|
||||||
|
|
||||||
#include <pcl/pcl_config.h>
|
#include <pcl/pcl_config.h>
|
||||||
|
|
||||||
#ifdef HAVE_OPENNI
|
#ifdef HAVE_OPENNI
|
||||||
|
#if __linux__ && __i386__ && __cplusplus >= 201103L
|
||||||
|
#warning "Openni driver is not available on i386 when building with c++11 support"
|
||||||
|
#else
|
||||||
|
#define RTABMAP_OPENNI
|
||||||
#include <pcl/io/openni_camera/openni_depth_image.h>
|
#include <pcl/io/openni_camera/openni_depth_image.h>
|
||||||
#include <pcl/io/openni_camera/openni_image.h>
|
#include <pcl/io/openni_camera/openni_image.h>
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <boost/signals2/connection.hpp>
|
#include <boost/signals2/connection.hpp>
|
||||||
|
|
||||||
@@ -64,9 +70,25 @@ class Registration;
|
|||||||
class PacketPipeline;
|
class PacketPipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace rs
|
||||||
|
{
|
||||||
|
class context;
|
||||||
|
class device;
|
||||||
|
namespace slam {
|
||||||
|
class slam;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct _freenect_context freenect_context;
|
typedef struct _freenect_context freenect_context;
|
||||||
typedef struct _freenect_device freenect_device;
|
typedef struct _freenect_device freenect_device;
|
||||||
|
|
||||||
|
typedef struct IKinectSensor IKinectSensor;
|
||||||
|
typedef struct ICoordinateMapper ICoordinateMapper;
|
||||||
|
typedef struct _DepthSpacePoint DepthSpacePoint;
|
||||||
|
typedef struct _ColorSpacePoint ColorSpacePoint;
|
||||||
|
typedef struct tagRGBQUAD RGBQUAD;
|
||||||
|
typedef struct IMultiSourceFrameReader IMultiSourceFrameReader;
|
||||||
|
|
||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -85,7 +107,7 @@ public:
|
|||||||
float imageRate = 0,
|
float imageRate = 0,
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
virtual ~CameraOpenni();
|
virtual ~CameraOpenni();
|
||||||
#ifdef HAVE_OPENNI
|
#ifdef RTABMAP_OPENNI
|
||||||
void image_cb (
|
void image_cb (
|
||||||
const boost::shared_ptr<openni_wrapper::Image>& rgb,
|
const boost::shared_ptr<openni_wrapper::Image>& rgb,
|
||||||
const boost::shared_ptr<openni_wrapper::DepthImage>& depth,
|
const boost::shared_ptr<openni_wrapper::DepthImage>& depth,
|
||||||
@@ -97,7 +119,7 @@ public:
|
|||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
pcl::Grabber* interface_;
|
pcl::Grabber* interface_;
|
||||||
@@ -131,7 +153,7 @@ public:
|
|||||||
virtual std::string getSerial() const {return "";} // unknown with OpenCV
|
virtual std::string getSerial() const {return "";} // unknown with OpenCV
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _asus;
|
bool _asus;
|
||||||
@@ -149,9 +171,11 @@ class RTABMAP_EXP CameraOpenNI2 :
|
|||||||
public:
|
public:
|
||||||
static bool available();
|
static bool available();
|
||||||
static bool exposureGainAvailable();
|
static bool exposureGainAvailable();
|
||||||
|
enum Type {kTypeColorDepth, kTypeIRDepth, kTypeIR};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CameraOpenNI2(const std::string & deviceId = "",
|
CameraOpenNI2(const std::string & deviceId = "",
|
||||||
|
Type type = kTypeColorDepth,
|
||||||
float imageRate = 0,
|
float imageRate = 0,
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
virtual ~CameraOpenNI2();
|
virtual ~CameraOpenNI2();
|
||||||
@@ -165,12 +189,15 @@ public:
|
|||||||
bool setExposure(int value);
|
bool setExposure(int value);
|
||||||
bool setGain(int value);
|
bool setGain(int value);
|
||||||
bool setMirroring(bool enabled);
|
bool setMirroring(bool enabled);
|
||||||
void setOpenNI2StampsAndIDsUsed(bool used) {_openNI2StampsAndIDsUsed = used;}
|
void setOpenNI2StampsAndIDsUsed(bool used);
|
||||||
|
void setIRDepthShift(int horizontal, int vertical);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
#ifdef RTABMAP_OPENNI2
|
||||||
|
Type _type;
|
||||||
openni::Device * _device;
|
openni::Device * _device;
|
||||||
openni::VideoStream * _color;
|
openni::VideoStream * _color;
|
||||||
openni::VideoStream * _depth;
|
openni::VideoStream * _depth;
|
||||||
@@ -178,6 +205,10 @@ private:
|
|||||||
float _depthFy;
|
float _depthFy;
|
||||||
std::string _deviceId;
|
std::string _deviceId;
|
||||||
bool _openNI2StampsAndIDsUsed;
|
bool _openNI2StampsAndIDsUsed;
|
||||||
|
StereoCameraModel _stereoModel;
|
||||||
|
int _depthHShift;
|
||||||
|
int _depthVShift;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -191,10 +222,12 @@ class RTABMAP_EXP CameraFreenect :
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static bool available();
|
static bool available();
|
||||||
|
enum Type {kTypeColorDepth, kTypeIRDepth};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// default local transform z in, x right, y down));
|
// default local transform z in, x right, y down));
|
||||||
CameraFreenect(int deviceId= 0,
|
CameraFreenect(int deviceId= 0,
|
||||||
|
Type type = kTypeColorDepth,
|
||||||
float imageRate=0.0f,
|
float imageRate=0.0f,
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
virtual ~CameraFreenect();
|
virtual ~CameraFreenect();
|
||||||
@@ -204,12 +237,16 @@ public:
|
|||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
#ifdef RTABMAP_FREENECT
|
||||||
int deviceId_;
|
int deviceId_;
|
||||||
|
Type type_;
|
||||||
freenect_context * ctx_;
|
freenect_context * ctx_;
|
||||||
FreenectDevice * freenectDevice_;
|
FreenectDevice * freenectDevice_;
|
||||||
|
StereoCameraModel stereoModel_;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////
|
/////////////////////////
|
||||||
@@ -234,14 +271,15 @@ public:
|
|||||||
public:
|
public:
|
||||||
// default local transform z in, x right, y down));
|
// default local transform z in, x right, y down));
|
||||||
CameraFreenect2(int deviceId= 0,
|
CameraFreenect2(int deviceId= 0,
|
||||||
Type type = kTypeColor2DepthSD,
|
Type type = kTypeDepth2ColorSD,
|
||||||
float imageRate=0.0f,
|
float imageRate=0.0f,
|
||||||
const Transform & localTransform = Transform::getIdentity(),
|
const Transform & localTransform = Transform::getIdentity(),
|
||||||
float minDepth = 0.3f,
|
float minDepth = 0.3f,
|
||||||
float maxDepth = 12.0f,
|
float maxDepth = 12.0f,
|
||||||
bool bilateralFiltering = true,
|
bool bilateralFiltering = true,
|
||||||
bool edgeAwareFiltering = true,
|
bool edgeAwareFiltering = true,
|
||||||
bool noiseFiltering = true);
|
bool noiseFiltering = true,
|
||||||
|
const std::string & pipelineName = "");
|
||||||
virtual ~CameraFreenect2();
|
virtual ~CameraFreenect2();
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
@@ -249,9 +287,10 @@ public:
|
|||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
#ifdef RTABMAP_FREENECT2
|
||||||
int deviceId_;
|
int deviceId_;
|
||||||
Type type_;
|
Type type_;
|
||||||
StereoCameraModel stereoModel_;
|
StereoCameraModel stereoModel_;
|
||||||
@@ -264,6 +303,111 @@ private:
|
|||||||
bool bilateralFiltering_;
|
bool bilateralFiltering_;
|
||||||
bool edgeAwareFiltering_;
|
bool edgeAwareFiltering_;
|
||||||
bool noiseFiltering_;
|
bool noiseFiltering_;
|
||||||
|
std::string pipelineName_;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// CameraK4W2
|
||||||
|
/////////////////////////
|
||||||
|
|
||||||
|
class RTABMAP_EXP CameraK4W2 :
|
||||||
|
public Camera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static bool available();
|
||||||
|
|
||||||
|
enum Type {
|
||||||
|
kTypeColor2DepthSD,
|
||||||
|
kTypeDepth2ColorSD,
|
||||||
|
kTypeDepth2ColorHD
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const int cDepthWidth = 512;
|
||||||
|
static const int cDepthHeight = 424;
|
||||||
|
static const int cColorWidth = 1920;
|
||||||
|
static const int cColorHeight = 1080;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// default local transform z in, x right, y down));
|
||||||
|
CameraK4W2(int deviceId = 0, // not used
|
||||||
|
Type type = kTypeDepth2ColorSD,
|
||||||
|
float imageRate = 0.0f,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
virtual ~CameraK4W2();
|
||||||
|
|
||||||
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
|
virtual bool isCalibrated() const;
|
||||||
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void close();
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef RTABMAP_K4W2
|
||||||
|
Type type_;
|
||||||
|
IKinectSensor* pKinectSensor_;
|
||||||
|
ICoordinateMapper* pCoordinateMapper_;
|
||||||
|
DepthSpacePoint* pDepthCoordinates_;
|
||||||
|
ColorSpacePoint* pColorCoordinates_;
|
||||||
|
IMultiSourceFrameReader* pMultiSourceFrameReader_;
|
||||||
|
RGBQUAD * pColorRGBX_;
|
||||||
|
INT_PTR hMSEvent;
|
||||||
|
CameraModel colorCameraModel_;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// CameraRealSense
|
||||||
|
/////////////////////////
|
||||||
|
class slam_event_handler;
|
||||||
|
class RTABMAP_EXP CameraRealSense :
|
||||||
|
public Camera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static bool available();
|
||||||
|
|
||||||
|
public:
|
||||||
|
// default local transform z in, x right, y down));
|
||||||
|
CameraRealSense(
|
||||||
|
int deviceId = 0,
|
||||||
|
int presetRGB = 0, // 0=best quality, 1=largest image, 2=highest framerate
|
||||||
|
int presetDepth = 0, // 0=best quality, 1=largest image, 2=highest framerate
|
||||||
|
bool computeOdometry = false,
|
||||||
|
float imageRate = 0,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
virtual ~CameraRealSense();
|
||||||
|
|
||||||
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
|
virtual bool isCalibrated() const;
|
||||||
|
virtual std::string getSerial() const;
|
||||||
|
virtual bool odomProvided() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef RTABMAP_REALSENSE
|
||||||
|
rs::context * ctx_;
|
||||||
|
rs::device * dev_;
|
||||||
|
int deviceId_;
|
||||||
|
int presetRGB_;
|
||||||
|
int presetDepth_;
|
||||||
|
bool computeOdometry_;
|
||||||
|
|
||||||
|
int motionSeq_[2];
|
||||||
|
rs::slam::slam * slam_;
|
||||||
|
UMutex slamLock_;
|
||||||
|
|
||||||
|
std::map<double, std::pair<cv::Mat, cv::Mat> > bufferedFrames_;
|
||||||
|
std::pair<cv::Mat, cv::Mat> lastSyncFrames_;
|
||||||
|
UMutex dataMutex_;
|
||||||
|
USemaphore dataReady_;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -290,8 +434,10 @@ public:
|
|||||||
virtual bool isCalibrated() const;
|
virtual bool isCalibrated() const;
|
||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
|
virtual void setStartIndex(int index) {CameraImages::setStartIndex(index);cameraDepth_.setStartIndex(index);} // negative means last
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CameraImages cameraDepth_;
|
CameraImages cameraDepth_;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "rtabmap/core/CameraModel.h"
|
#include "rtabmap/core/CameraModel.h"
|
||||||
#include "rtabmap/core/Camera.h"
|
#include "rtabmap/core/Camera.h"
|
||||||
#include "rtabmap/core/CameraRGB.h"
|
#include "rtabmap/core/CameraRGB.h"
|
||||||
|
#include "rtabmap/core/Version.h"
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
namespace FlyCapture2
|
namespace FlyCapture2
|
||||||
@@ -39,6 +40,11 @@ namespace FlyCapture2
|
|||||||
class Camera;
|
class Camera;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace sl
|
||||||
|
{
|
||||||
|
class Camera;
|
||||||
|
}
|
||||||
|
|
||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -62,11 +68,13 @@ public:
|
|||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
#ifdef RTABMAP_DC1394
|
||||||
DC1394Device *device_;
|
DC1394Device *device_;
|
||||||
StereoCameraModel stereoModel_;
|
StereoCameraModel stereoModel_;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////
|
/////////////////////////
|
||||||
@@ -87,11 +95,69 @@ public:
|
|||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
#ifdef RTABMAP_FLYCAPTURE2
|
||||||
FlyCapture2::Camera * camera_;
|
FlyCapture2::Camera * camera_;
|
||||||
void * triclopsCtx_; // TriclopsContext
|
void * triclopsCtx_; // TriclopsContext
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// CameraStereoZED
|
||||||
|
/////////////////////////
|
||||||
|
class RTABMAP_EXP CameraStereoZed :
|
||||||
|
public Camera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static bool available();
|
||||||
|
|
||||||
|
public:
|
||||||
|
CameraStereoZed(
|
||||||
|
int deviceId,
|
||||||
|
int resolution = 2, // 0=HD2K, 1=HD1080, 2=HD720, 3=VGA
|
||||||
|
int quality = 1, // 0=NONE, 1=PERFORMANCE, 2=QUALITY
|
||||||
|
int sensingMode = 0,// 0=STANDARD, 1=FILL
|
||||||
|
int confidenceThr = 100,
|
||||||
|
bool computeOdometry = false,
|
||||||
|
float imageRate=0.0f,
|
||||||
|
const Transform & localTransform = Transform::getIdentity(),
|
||||||
|
bool selfCalibration = false);
|
||||||
|
CameraStereoZed(
|
||||||
|
const std::string & svoFilePath,
|
||||||
|
int quality = 1, // 0=NONE, 1=PERFORMANCE, 2=QUALITY
|
||||||
|
int sensingMode = 0,// 0=STANDARD, 1=FILL
|
||||||
|
int confidenceThr = 100,
|
||||||
|
bool computeOdometry = false,
|
||||||
|
float imageRate=0.0f,
|
||||||
|
const Transform & localTransform = Transform::getIdentity(),
|
||||||
|
bool selfCalibration = false);
|
||||||
|
virtual ~CameraStereoZed();
|
||||||
|
|
||||||
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
|
virtual bool isCalibrated() const;
|
||||||
|
virtual std::string getSerial() const;
|
||||||
|
virtual bool odomProvided() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef RTABMAP_ZED
|
||||||
|
sl::Camera * zed_;
|
||||||
|
StereoCameraModel stereoModel_;
|
||||||
|
CameraVideo::Source src_;
|
||||||
|
int usbDevice_;
|
||||||
|
std::string svoFilePath_;
|
||||||
|
int resolution_;
|
||||||
|
int quality_;
|
||||||
|
bool selfCalibration_;
|
||||||
|
int sensingMode_;
|
||||||
|
int confidenceThr_;
|
||||||
|
bool computeOdometry_;
|
||||||
|
bool lost_;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/////////////////////////
|
/////////////////////////
|
||||||
@@ -122,8 +188,10 @@ public:
|
|||||||
virtual bool isCalibrated() const;
|
virtual bool isCalibrated() const;
|
||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
|
virtual void setStartIndex(int index) {CameraImages::setStartIndex(index);camera2_->setStartIndex(index);} // negative means last
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CameraImages * camera2_;
|
CameraImages * camera2_;
|
||||||
@@ -143,10 +211,21 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
CameraStereoVideo(
|
CameraStereoVideo(
|
||||||
const std::string & path,
|
const std::string & pathSideBySide,
|
||||||
bool rectifyImages = false,
|
bool rectifyImages = false,
|
||||||
float imageRate=0.0f,
|
float imageRate=0.0f,
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
CameraStereoVideo(
|
||||||
|
const std::string & pathLeft,
|
||||||
|
const std::string & pathRight,
|
||||||
|
bool rectifyImages = false,
|
||||||
|
float imageRate=0.0f,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
CameraStereoVideo(
|
||||||
|
int device,
|
||||||
|
bool rectifyImages = false,
|
||||||
|
float imageRate = 0.0f,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
virtual ~CameraStereoVideo();
|
virtual ~CameraStereoVideo();
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
@@ -154,14 +233,18 @@ public:
|
|||||||
virtual std::string getSerial() const;
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual SensorData captureImage();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cv::VideoCapture capture_;
|
cv::VideoCapture capture_;
|
||||||
|
cv::VideoCapture capture2_;
|
||||||
std::string path_;
|
std::string path_;
|
||||||
|
std::string path2_;
|
||||||
bool rectifyImages_;
|
bool rectifyImages_;
|
||||||
StereoCameraModel stereoModel_;
|
StereoCameraModel stereoModel_;
|
||||||
std::string cameraName_;
|
std::string cameraName_;
|
||||||
|
CameraVideo::Source src_;
|
||||||
|
int usbDevice_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -33,10 +33,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <rtabmap/utilite/UThread.h>
|
#include <rtabmap/utilite/UThread.h>
|
||||||
#include <rtabmap/utilite/UEventsSender.h>
|
#include <rtabmap/utilite/UEventsSender.h>
|
||||||
|
|
||||||
|
namespace clams
|
||||||
|
{
|
||||||
|
class DiscreteDepthDistortionModel;
|
||||||
|
}
|
||||||
|
|
||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
|
|
||||||
class Camera;
|
class Camera;
|
||||||
|
class CameraInfo;
|
||||||
|
class SensorData;
|
||||||
class StereoDense;
|
class StereoDense;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,38 +60,48 @@ public:
|
|||||||
virtual ~CameraThread();
|
virtual ~CameraThread();
|
||||||
|
|
||||||
void setMirroringEnabled(bool enabled) {_mirroring = enabled;}
|
void setMirroringEnabled(bool enabled) {_mirroring = enabled;}
|
||||||
|
void setStereoExposureCompensation(bool enabled) {_stereoExposureCompensation = enabled;}
|
||||||
void setColorOnly(bool colorOnly) {_colorOnly = colorOnly;}
|
void setColorOnly(bool colorOnly) {_colorOnly = colorOnly;}
|
||||||
void setImageDecimation(int decimation) {_imageDecimation = decimation;}
|
void setImageDecimation(int decimation) {_imageDecimation = decimation;}
|
||||||
void setStereoToDepth(bool enabled) {_stereoToDepth = enabled;}
|
void setStereoToDepth(bool enabled) {_stereoToDepth = enabled;}
|
||||||
|
void setImageRate(float imageRate);
|
||||||
|
void setDistortionModel(const std::string & path);
|
||||||
|
void enableBilateralFiltering(float sigmaS, float sigmaR);
|
||||||
|
void disableBilateralFiltering() {_bilateralFiltering = false;}
|
||||||
|
|
||||||
void setScanFromDepth(
|
void setScanFromDepth(
|
||||||
bool enabled,
|
bool enabled,
|
||||||
int decimation=4,
|
int decimation=4,
|
||||||
float maxDepth=4.0f,
|
float maxDepth=4.0f,
|
||||||
float voxelSize = 0.0f,
|
float voxelSize = 0.0f,
|
||||||
int normalsK = 0)
|
int normalsK = 0,
|
||||||
|
int normalsRadius = 0.0f)
|
||||||
{
|
{
|
||||||
_scanFromDepth = enabled;
|
_scanFromDepth = enabled;
|
||||||
_scanDecimation=decimation;
|
_scanDecimation=decimation;
|
||||||
_scanMaxDepth = maxDepth;
|
_scanMaxDepth = maxDepth;
|
||||||
_scanVoxelSize = voxelSize;
|
_scanVoxelSize = voxelSize;
|
||||||
_scanNormalsK = normalsK;
|
_scanNormalsK = normalsK;
|
||||||
|
_scanNormalsRadius = normalsRadius;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void postUpdate(SensorData * data, CameraInfo * info = 0) const;
|
||||||
|
|
||||||
//getters
|
//getters
|
||||||
bool isPaused() const {return !this->isRunning();}
|
bool isPaused() const {return !this->isRunning();}
|
||||||
bool isCapturing() const {return this->isRunning();}
|
bool isCapturing() const {return this->isRunning();}
|
||||||
void setImageRate(float imageRate);
|
|
||||||
|
|
||||||
Camera * camera() {return _camera;} // return null if not set, valid until CameraThread is deleted
|
Camera * camera() {return _camera;} // return null if not set, valid until CameraThread is deleted
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
virtual void mainLoopBegin();
|
||||||
virtual void mainLoop();
|
virtual void mainLoop();
|
||||||
virtual void mainLoopKill();
|
virtual void mainLoopKill();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Camera * _camera;
|
Camera * _camera;
|
||||||
bool _mirroring;
|
bool _mirroring;
|
||||||
|
bool _stereoExposureCompensation;
|
||||||
bool _colorOnly;
|
bool _colorOnly;
|
||||||
int _imageDecimation;
|
int _imageDecimation;
|
||||||
bool _stereoToDepth;
|
bool _stereoToDepth;
|
||||||
@@ -94,7 +111,12 @@ private:
|
|||||||
float _scanMinDepth;
|
float _scanMinDepth;
|
||||||
float _scanVoxelSize;
|
float _scanVoxelSize;
|
||||||
int _scanNormalsK;
|
int _scanNormalsK;
|
||||||
|
float _scanNormalsRadius;
|
||||||
StereoDense * _stereoDense;
|
StereoDense * _stereoDense;
|
||||||
|
clams::DiscreteDepthDistortionModel * _distortionModel;
|
||||||
|
bool _bilateralFiltering;
|
||||||
|
float _bilateralSigmaS;
|
||||||
|
float _bilateralSigmaR;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -83,5 +83,8 @@ cv::Mat RTABMAP_EXP uncompressData(const cv::Mat & bytes);
|
|||||||
cv::Mat RTABMAP_EXP uncompressData(const std::vector<unsigned char> & bytes);
|
cv::Mat RTABMAP_EXP uncompressData(const std::vector<unsigned char> & bytes);
|
||||||
cv::Mat RTABMAP_EXP uncompressData(const unsigned char * bytes, unsigned long size);
|
cv::Mat RTABMAP_EXP uncompressData(const unsigned char * bytes, unsigned long size);
|
||||||
|
|
||||||
|
cv::Mat RTABMAP_EXP compressString(const std::string & str);
|
||||||
|
std::string RTABMAP_EXP uncompressString(const cv::Mat & bytes);
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
#endif /* COMPRESSION_H_ */
|
#endif /* COMPRESSION_H_ */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -39,6 +39,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "rtabmap/utilite/UThreadNode.h"
|
#include "rtabmap/utilite/UThreadNode.h"
|
||||||
#include "rtabmap/core/Parameters.h"
|
#include "rtabmap/core/Parameters.h"
|
||||||
#include "rtabmap/core/SensorData.h"
|
#include "rtabmap/core/SensorData.h"
|
||||||
|
#include <rtabmap/core/Statistics.h>
|
||||||
|
|
||||||
#include <rtabmap/core/Transform.h>
|
#include <rtabmap/core/Transform.h>
|
||||||
#include <rtabmap/core/Link.h>
|
#include <rtabmap/core/Link.h>
|
||||||
@@ -67,6 +68,7 @@ public:
|
|||||||
virtual ~DBDriver();
|
virtual ~DBDriver();
|
||||||
|
|
||||||
virtual void parseParameters(const ParametersMap & parameters);
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
virtual bool isInMemory() const {return _url.empty();}
|
||||||
const std::string & getUrl() const {return _url;}
|
const std::string & getUrl() const {return _url;}
|
||||||
|
|
||||||
void beginTransaction() const;
|
void beginTransaction() const;
|
||||||
@@ -86,41 +88,84 @@ public:
|
|||||||
void addLink(const Link & link);
|
void addLink(const Link & link);
|
||||||
void removeLink(int from, int to);
|
void removeLink(int from, int to);
|
||||||
void updateLink(const Link & link);
|
void updateLink(const Link & link);
|
||||||
|
void updateOccupancyGrid(
|
||||||
|
int nodeId,
|
||||||
|
const cv::Mat & ground,
|
||||||
|
const cv::Mat & obstacles,
|
||||||
|
const cv::Mat & empty,
|
||||||
|
float cellSize,
|
||||||
|
const cv::Point3f & viewpoint);
|
||||||
|
void updateDepthImage(int nodeId, const cv::Mat & image);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void addStatisticsAfterRun(int stMemSize, int lastSignAdded, int processMemUsed, int databaseMemUsed, int dictionarySize) const;
|
void addInfoAfterRun(int stMemSize, int lastSignAdded, int processMemUsed, int databaseMemUsed, int dictionarySize, const ParametersMap & parameters) const;
|
||||||
|
void addStatistics(const Statistics & statistics) const;
|
||||||
|
void savePreviewImage(const cv::Mat & image) const;
|
||||||
|
cv::Mat loadPreviewImage() const;
|
||||||
|
void saveOptimizedPoses(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const;
|
||||||
|
std::map<int, Transform> loadOptimizedPoses(Transform * lastlocalizationPose) const;
|
||||||
|
void save2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize) const;
|
||||||
|
cv::Mat load2DMap(float & xMin, float & yMin, float & cellSize) const;
|
||||||
|
void saveOptimizedMesh(
|
||||||
|
const cv::Mat & cloud,
|
||||||
|
const std::vector<std::vector<std::vector<unsigned int> > > & polygons = std::vector<std::vector<std::vector<unsigned int> > >(), // Textures -> polygons -> vertices
|
||||||
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
|
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords = std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > >(), // Textures -> uv coords for each vertex of the polygons
|
||||||
|
#else
|
||||||
|
const std::vector<std::vector<Eigen::Vector2f> > & texCoords = std::vector<std::vector<Eigen::Vector2f> >(), // Textures -> uv coords for each vertex of the polygons
|
||||||
|
#endif
|
||||||
|
const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size);
|
||||||
|
cv::Mat loadOptimizedMesh(
|
||||||
|
std::vector<std::vector<std::vector<unsigned int> > > * polygons = 0,
|
||||||
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
|
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
|
||||||
|
#else
|
||||||
|
std::vector<std::vector<Eigen::Vector2f> > * texCoords = 0,
|
||||||
|
#endif
|
||||||
|
cv::Mat * textures = 0) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Mutex-protected methods of abstract versions below
|
// Mutex-protected methods of abstract versions below
|
||||||
|
|
||||||
bool openConnection(const std::string & url, bool overwritten = false);
|
bool openConnection(const std::string & url, bool overwritten = false);
|
||||||
void closeConnection(bool save = true);
|
void closeConnection(bool save = true, const std::string & outputUrl = "");
|
||||||
bool isConnected() const;
|
bool isConnected() const;
|
||||||
long getMemoryUsed() const; // In bytes
|
long getMemoryUsed() const; // In bytes
|
||||||
std::string getDatabaseVersion() const;
|
std::string getDatabaseVersion() const;
|
||||||
|
long getNodesMemoryUsed() const;
|
||||||
|
long getLinksMemoryUsed() const;
|
||||||
long getImagesMemoryUsed() const;
|
long getImagesMemoryUsed() const;
|
||||||
long getDepthImagesMemoryUsed() const;
|
long getDepthImagesMemoryUsed() const;
|
||||||
|
long getCalibrationsMemoryUsed() const;
|
||||||
|
long getGridsMemoryUsed() const;
|
||||||
long getLaserScansMemoryUsed() const;
|
long getLaserScansMemoryUsed() const;
|
||||||
long getUserDataMemoryUsed() const;
|
long getUserDataMemoryUsed() const;
|
||||||
long getWordsMemoryUsed() const;
|
long getWordsMemoryUsed() const;
|
||||||
|
long getFeaturesMemoryUsed() const;
|
||||||
|
long getStatisticsMemoryUsed() const;
|
||||||
int getLastNodesSize() const; // working memory
|
int getLastNodesSize() const; // working memory
|
||||||
int getLastDictionarySize() const; // working memory
|
int getLastDictionarySize() const; // working memory
|
||||||
int getTotalNodesSize() const;
|
int getTotalNodesSize() const;
|
||||||
int getTotalDictionarySize() const;
|
int getTotalDictionarySize() const;
|
||||||
|
ParametersMap getLastParameters() const;
|
||||||
|
std::map<std::string, float> getStatistics(int nodeId, double & stamp, std::vector<int> * wmState=0) const;
|
||||||
|
std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatistics() const;
|
||||||
|
std::map<int, std::vector<int> > getAllStatisticsWmStates() const;
|
||||||
|
|
||||||
void executeNoResult(const std::string & sql) const;
|
void executeNoResult(const std::string & sql) const;
|
||||||
|
|
||||||
// Load objects
|
// Load objects
|
||||||
void load(VWDictionary * dictionary) const;
|
void load(VWDictionary * dictionary, bool lastStateOnly = true) const;
|
||||||
void loadLastNodes(std::list<Signature *> & signatures) const;
|
void loadLastNodes(std::list<Signature *> & signatures) const;
|
||||||
void loadSignatures(const std::list<int> & ids, std::list<Signature *> & signatures, std::set<int> * loadedFromTrash = 0);
|
void loadSignatures(const std::list<int> & ids, std::list<Signature *> & signatures, std::set<int> * loadedFromTrash = 0);
|
||||||
void loadWords(const std::set<int> & wordIds, std::list<VisualWord *> & vws);
|
void loadWords(const std::set<int> & wordIds, std::list<VisualWord *> & vws);
|
||||||
|
|
||||||
// Specific queries...
|
// Specific queries...
|
||||||
void loadNodeData(std::list<Signature *> & signatures) const;
|
void loadNodeData(std::list<Signature *> & signatures, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
||||||
void getNodeData(int signatureId, SensorData & data) const;
|
void getNodeData(int signatureId, SensorData & data, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
||||||
bool getCalibration(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const;
|
bool getCalibration(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const;
|
||||||
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose) const;
|
bool getLaserScanInfo(int signatureId, LaserScan & info) const;
|
||||||
|
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps) const;
|
||||||
void loadLinks(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
|
void loadLinks(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
|
||||||
void getWeight(int signatureId, int & weight) const;
|
void getWeight(int signatureId, int & weight) const;
|
||||||
void getAllNodeIds(std::set<int> & ids, bool ignoreChildren = false, bool ignoreBadSignatures = false) const;
|
void getAllNodeIds(std::set<int> & ids, bool ignoreChildren = false, bool ignoreBadSignatures = false) const;
|
||||||
@@ -136,25 +181,35 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false) = 0;
|
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false) = 0;
|
||||||
virtual void disconnectDatabaseQuery(bool save = true) = 0;
|
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "") = 0;
|
||||||
virtual bool isConnectedQuery() const = 0;
|
virtual bool isConnectedQuery() const = 0;
|
||||||
virtual long getMemoryUsedQuery() const = 0; // In bytes
|
virtual long getMemoryUsedQuery() const = 0; // In bytes
|
||||||
virtual bool getDatabaseVersionQuery(std::string & version) const = 0;
|
virtual bool getDatabaseVersionQuery(std::string & version) const = 0;
|
||||||
|
virtual long getNodesMemoryUsedQuery() const = 0;
|
||||||
|
virtual long getLinksMemoryUsedQuery() const = 0;
|
||||||
virtual long getImagesMemoryUsedQuery() const = 0;
|
virtual long getImagesMemoryUsedQuery() const = 0;
|
||||||
virtual long getDepthImagesMemoryUsedQuery() const = 0;
|
virtual long getDepthImagesMemoryUsedQuery() const = 0;
|
||||||
|
virtual long getCalibrationsMemoryUsedQuery() const = 0;
|
||||||
|
virtual long getGridsMemoryUsedQuery() const = 0;
|
||||||
virtual long getLaserScansMemoryUsedQuery() const = 0;
|
virtual long getLaserScansMemoryUsedQuery() const = 0;
|
||||||
virtual long getUserDataMemoryUsedQuery() const = 0;
|
virtual long getUserDataMemoryUsedQuery() const = 0;
|
||||||
virtual long getWordsMemoryUsedQuery() const = 0;
|
virtual long getWordsMemoryUsedQuery() const = 0;
|
||||||
|
virtual long getFeaturesMemoryUsedQuery() const = 0;
|
||||||
|
virtual long getStatisticsMemoryUsedQuery() const = 0;
|
||||||
virtual int getLastNodesSizeQuery() const = 0;
|
virtual int getLastNodesSizeQuery() const = 0;
|
||||||
virtual int getLastDictionarySizeQuery() const = 0;
|
virtual int getLastDictionarySizeQuery() const = 0;
|
||||||
virtual int getTotalNodesSizeQuery() const = 0;
|
virtual int getTotalNodesSizeQuery() const = 0;
|
||||||
virtual int getTotalDictionarySizeQuery() const = 0;
|
virtual int getTotalDictionarySizeQuery() const = 0;
|
||||||
|
virtual ParametersMap getLastParametersQuery() const = 0;
|
||||||
|
virtual std::map<std::string, float> getStatisticsQuery(int nodeId, double & stamp, std::vector<int> * wmState) const = 0;
|
||||||
|
virtual std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatisticsQuery() const = 0;
|
||||||
|
virtual std::map<int, std::vector<int> > getAllStatisticsWmStatesQuery() const = 0;
|
||||||
|
|
||||||
virtual void executeNoResultQuery(const std::string & sql) const = 0;
|
virtual void executeNoResultQuery(const std::string & sql) const = 0;
|
||||||
|
|
||||||
virtual void getWeightQuery(int signatureId, int & weight) const = 0;
|
virtual void getWeightQuery(int signatureId, int & weight) const = 0;
|
||||||
|
|
||||||
virtual void saveQuery(const std::list<Signature *> & signatures) const = 0;
|
virtual void saveQuery(const std::list<Signature *> & signatures) = 0;
|
||||||
virtual void saveQuery(const std::list<VisualWord *> & words) const = 0;
|
virtual void saveQuery(const std::list<VisualWord *> & words) const = 0;
|
||||||
virtual void updateQuery(const std::list<Signature *> & signatures, bool updateTimestamp) const = 0;
|
virtual void updateQuery(const std::list<Signature *> & signatures, bool updateTimestamp) const = 0;
|
||||||
virtual void updateQuery(const std::list<VisualWord *> & words, bool updateTimestamp) const = 0;
|
virtual void updateQuery(const std::list<VisualWord *> & words, bool updateTimestamp) const = 0;
|
||||||
@@ -162,16 +217,54 @@ private:
|
|||||||
virtual void addLinkQuery(const Link & link) const = 0;
|
virtual void addLinkQuery(const Link & link) const = 0;
|
||||||
virtual void updateLinkQuery(const Link & link) const = 0;
|
virtual void updateLinkQuery(const Link & link) const = 0;
|
||||||
|
|
||||||
|
virtual void updateOccupancyGridQuery(
|
||||||
|
int nodeId,
|
||||||
|
const cv::Mat & ground,
|
||||||
|
const cv::Mat & obstacles,
|
||||||
|
const cv::Mat & empty,
|
||||||
|
float cellSize,
|
||||||
|
const cv::Point3f & viewpoint) const = 0;
|
||||||
|
|
||||||
|
virtual void updateDepthImageQuery(
|
||||||
|
int nodeId,
|
||||||
|
const cv::Mat & image) const = 0;
|
||||||
|
|
||||||
|
virtual void addStatisticsQuery(const Statistics & statistics) const = 0;
|
||||||
|
virtual void savePreviewImageQuery(const cv::Mat & image) const = 0;
|
||||||
|
virtual cv::Mat loadPreviewImageQuery() const = 0;
|
||||||
|
virtual void saveOptimizedPosesQuery(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const = 0;
|
||||||
|
virtual std::map<int, Transform> loadOptimizedPosesQuery(Transform * lastlocalizationPose) const = 0;
|
||||||
|
virtual void save2DMapQuery(const cv::Mat & map, float xMin, float yMin, float cellSize) const = 0;
|
||||||
|
virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const = 0;
|
||||||
|
virtual void saveOptimizedMeshQuery(
|
||||||
|
const cv::Mat & cloud,
|
||||||
|
const std::vector<std::vector<std::vector<unsigned int> > > & polygons,
|
||||||
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
|
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
|
||||||
|
#else
|
||||||
|
const std::vector<std::vector<Eigen::Vector2f> > & texCoords,
|
||||||
|
#endif
|
||||||
|
const cv::Mat & textures) const = 0;
|
||||||
|
virtual cv::Mat loadOptimizedMeshQuery(
|
||||||
|
std::vector<std::vector<std::vector<unsigned int> > > * polygons,
|
||||||
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
|
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
|
||||||
|
#else
|
||||||
|
std::vector<std::vector<Eigen::Vector2f> > * texCoords,
|
||||||
|
#endif
|
||||||
|
cv::Mat * textures) const = 0;
|
||||||
|
|
||||||
// Load objects
|
// Load objects
|
||||||
virtual void loadQuery(VWDictionary * dictionary) const = 0;
|
virtual void loadQuery(VWDictionary * dictionary, bool lastStateOnly = true) const = 0;
|
||||||
virtual void loadLastNodesQuery(std::list<Signature *> & signatures) const = 0;
|
virtual void loadLastNodesQuery(std::list<Signature *> & signatures) const = 0;
|
||||||
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures) const = 0;
|
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures) const = 0;
|
||||||
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const = 0;
|
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const = 0;
|
||||||
virtual void loadLinksQuery(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
|
virtual void loadLinksQuery(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
|
||||||
|
|
||||||
virtual void loadNodeDataQuery(std::list<Signature *> & signatures) const = 0;
|
virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const = 0;
|
||||||
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const = 0;
|
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const = 0;
|
||||||
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose) const = 0;
|
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const = 0;
|
||||||
|
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps) const = 0;
|
||||||
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const = 0;
|
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const = 0;
|
||||||
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const = 0;
|
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const = 0;
|
||||||
virtual void getLastIdQuery(const std::string & tableName, int & id) const = 0;
|
virtual void getLastIdQuery(const std::string & tableName, int & id) const = 0;
|
||||||
@@ -181,7 +274,7 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
//non-abstract methods
|
//non-abstract methods
|
||||||
void saveOrUpdate(const std::vector<Signature *> & signatures) const;
|
void saveOrUpdate(const std::vector<Signature *> & signatures);
|
||||||
void saveOrUpdate(const std::vector<VisualWord *> & words) const;
|
void saveOrUpdate(const std::vector<VisualWord *> & words) const;
|
||||||
|
|
||||||
//thread stuff
|
//thread stuff
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -30,11 +30,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
|
|
||||||
#include <rtabmap/utilite/UThreadNode.h>
|
|
||||||
#include <rtabmap/utilite/UTimer.h>
|
#include <rtabmap/utilite/UTimer.h>
|
||||||
#include <rtabmap/utilite/UEventsSender.h>
|
|
||||||
#include <rtabmap/core/Transform.h>
|
#include <rtabmap/core/Transform.h>
|
||||||
#include <rtabmap/core/OdometryEvent.h>
|
#include <rtabmap/core/Camera.h>
|
||||||
|
|
||||||
#include <opencv2/core/core.hpp>
|
#include <opencv2/core/core.hpp>
|
||||||
|
|
||||||
@@ -45,41 +43,55 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class DBDriver;
|
class DBDriver;
|
||||||
|
|
||||||
class RTABMAP_EXP DBReader : public UThreadNode, public UEventsSender {
|
class RTABMAP_EXP DBReader : public Camera {
|
||||||
public:
|
public:
|
||||||
DBReader(const std::string & databasePath,
|
DBReader(const std::string & databasePath,
|
||||||
float frameRate = 0.0f,
|
float frameRate = 0.0f, // -1 = use Database stamps, 0 = inf
|
||||||
bool odometryIgnored = false,
|
bool odometryIgnored = false,
|
||||||
bool ignoreGoalDelay = false,
|
bool ignoreGoalDelay = false,
|
||||||
bool goalsIgnored = false);
|
bool goalsIgnored = false,
|
||||||
|
int startIndex = 0,
|
||||||
|
int cameraIndex = -1);
|
||||||
DBReader(const std::list<std::string> & databasePaths,
|
DBReader(const std::list<std::string> & databasePaths,
|
||||||
float frameRate = 0.0f,
|
float frameRate = 0.0f, // -1 = use Database stamps, 0 = inf
|
||||||
bool odometryIgnored = false,
|
bool odometryIgnored = false,
|
||||||
bool ignoreGoalDelay = false,
|
bool ignoreGoalDelay = false,
|
||||||
bool goalsIgnored = false);
|
bool goalsIgnored = false,
|
||||||
|
int startIndex = 0,
|
||||||
|
int cameraIndex = -1);
|
||||||
virtual ~DBReader();
|
virtual ~DBReader();
|
||||||
|
|
||||||
bool init(int startIndex=0);
|
virtual bool init(
|
||||||
void setFrameRate(float frameRate);
|
const std::string & calibrationFolder = ".",
|
||||||
OdometryEvent getNextData();
|
const std::string & cameraName = "");
|
||||||
|
|
||||||
|
virtual bool isCalibrated() const;
|
||||||
|
virtual std::string getSerial() const;
|
||||||
|
virtual bool odomProvided() const {return !_odometryIgnored;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void mainLoopBegin();
|
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||||
virtual void mainLoop();
|
|
||||||
|
private:
|
||||||
|
SensorData getNextData(CameraInfo * info = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::list<std::string> _paths;
|
std::list<std::string> _paths;
|
||||||
float _frameRate; // -1 = use Database stamps, 0 = inf
|
|
||||||
bool _odometryIgnored;
|
bool _odometryIgnored;
|
||||||
bool _ignoreGoalDelay;
|
bool _ignoreGoalDelay;
|
||||||
bool _goalsIgnored;
|
bool _goalsIgnored;
|
||||||
|
int _startIndex;
|
||||||
|
int _cameraIndex;
|
||||||
|
|
||||||
DBDriver * _dbDriver;
|
DBDriver * _dbDriver;
|
||||||
UTimer _timer;
|
UTimer _timer;
|
||||||
std::set<int> _ids;
|
std::set<int> _ids;
|
||||||
std::set<int>::iterator _currentId;
|
std::set<int>::iterator _currentId;
|
||||||
|
int _previousMapId;
|
||||||
|
cv::Mat _previousInfMatrix;
|
||||||
double _previousStamp;
|
double _previousStamp;
|
||||||
int _previousMapID;
|
int _previousMapID;
|
||||||
|
bool _calibrated;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -94,7 +94,8 @@ public:
|
|||||||
static int findPairs(
|
static int findPairs(
|
||||||
const std::map<int, cv::KeyPoint> & wordsA,
|
const std::map<int, cv::KeyPoint> & wordsA,
|
||||||
const std::map<int, cv::KeyPoint> & wordsB,
|
const std::map<int, cv::KeyPoint> & wordsB,
|
||||||
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs);
|
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
|
||||||
|
bool ignoreNegativeIds = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(1,1a) (2,2) (4,4) (6a,6a) (6b,6b)]
|
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(1,1a) (2,2) (4,4) (6a,6a) (6b,6b)]
|
||||||
@@ -103,7 +104,8 @@ public:
|
|||||||
static int findPairs(
|
static int findPairs(
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsA,
|
const std::multimap<int, cv::KeyPoint> & wordsA,
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsB,
|
const std::multimap<int, cv::KeyPoint> & wordsB,
|
||||||
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs);
|
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
|
||||||
|
bool ignoreNegativeIds = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(2,2) (4,4)]
|
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(2,2) (4,4)]
|
||||||
@@ -112,7 +114,8 @@ public:
|
|||||||
static int findPairsUnique(
|
static int findPairsUnique(
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsA,
|
const std::multimap<int, cv::KeyPoint> & wordsA,
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsB,
|
const std::multimap<int, cv::KeyPoint> & wordsB,
|
||||||
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs);
|
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
|
||||||
|
bool ignoreNegativeIds = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(1,1a) (1,1b) (2,2) (4,4) (6a,6a) (6a,6b) (6b,6a) (6b,6b)]
|
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(1,1a) (1,1b) (2,2) (4,4) (6a,6a) (6a,6b) (6b,6a) (6b,6b)]
|
||||||
@@ -121,7 +124,8 @@ public:
|
|||||||
static int findPairsAll(
|
static int findPairsAll(
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsA,
|
const std::multimap<int, cv::KeyPoint> & wordsA,
|
||||||
const std::multimap<int, cv::KeyPoint> & wordsB,
|
const std::multimap<int, cv::KeyPoint> & wordsB,
|
||||||
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs);
|
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
|
||||||
|
bool ignoreNegativeIds = true);
|
||||||
|
|
||||||
static cv::Mat linearLSTriangulation(
|
static cv::Mat linearLSTriangulation(
|
||||||
cv::Point3d u, //homogenous image point (u,v,1)
|
cv::Point3d u, //homogenous image point (u,v,1)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -104,7 +104,8 @@ public:
|
|||||||
kFeatureGfttFreak=5,
|
kFeatureGfttFreak=5,
|
||||||
kFeatureGfttBrief=6,
|
kFeatureGfttBrief=6,
|
||||||
kFeatureBrisk=7,
|
kFeatureBrisk=7,
|
||||||
kFeatureGfttOrb=8}; //new 0.10.11
|
kFeatureGfttOrb=8, //new 0.10.11
|
||||||
|
kFeatureKaze=9}; //new 0.13.2
|
||||||
|
|
||||||
static Feature2D * create(const ParametersMap & parameters = ParametersMap());
|
static Feature2D * create(const ParametersMap & parameters = ParametersMap());
|
||||||
static Feature2D * create(Feature2D::Type type, const ParametersMap & parameters = ParametersMap()); // for convenience
|
static Feature2D * create(Feature2D::Type type, const ParametersMap & parameters = ParametersMap()); // for convenience
|
||||||
@@ -133,6 +134,8 @@ public:
|
|||||||
|
|
||||||
static void limitKeypoints(std::vector<cv::KeyPoint> & keypoints, int maxKeypoints);
|
static void limitKeypoints(std::vector<cv::KeyPoint> & keypoints, int maxKeypoints);
|
||||||
static void limitKeypoints(std::vector<cv::KeyPoint> & keypoints, cv::Mat & descriptors, int maxKeypoints);
|
static void limitKeypoints(std::vector<cv::KeyPoint> & keypoints, cv::Mat & descriptors, int maxKeypoints);
|
||||||
|
static void limitKeypoints(std::vector<cv::KeyPoint> & keypoints, std::vector<cv::Point3f> & keypoints3D, cv::Mat & descriptors, int maxKeypoints);
|
||||||
|
static void limitKeypoints(const std::vector<cv::KeyPoint> & keypoints, std::vector<bool> & inliers, int maxKeypoints);
|
||||||
|
|
||||||
static cv::Rect computeRoi(const cv::Mat & image, const std::string & roiRatios);
|
static cv::Rect computeRoi(const cv::Mat & image, const std::string & roiRatios);
|
||||||
static cv::Rect computeRoi(const cv::Mat & image, const std::vector<float> & roiRatios);
|
static cv::Rect computeRoi(const cv::Mat & image, const std::vector<float> & roiRatios);
|
||||||
@@ -174,6 +177,8 @@ private:
|
|||||||
int _subPixWinSize;
|
int _subPixWinSize;
|
||||||
int _subPixIterations;
|
int _subPixIterations;
|
||||||
double _subPixEps;
|
double _subPixEps;
|
||||||
|
int gridRows_;
|
||||||
|
int gridCols_;
|
||||||
// Stereo stuff
|
// Stereo stuff
|
||||||
Stereo * _stereo;
|
Stereo * _stereo;
|
||||||
};
|
};
|
||||||
@@ -430,6 +435,33 @@ private:
|
|||||||
cv::Ptr<CV_BRISK> brisk_;
|
cv::Ptr<CV_BRISK> brisk_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//KAZE
|
||||||
|
class RTABMAP_EXP KAZE : public Feature2D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
KAZE(const ParametersMap & parameters = ParametersMap());
|
||||||
|
virtual ~KAZE();
|
||||||
|
|
||||||
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
virtual Feature2D::Type getType() const { return kFeatureKaze; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) const;
|
||||||
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool extended_;
|
||||||
|
bool upright_;
|
||||||
|
float threshold_;
|
||||||
|
int nOctaves_;
|
||||||
|
int nOctaveLayers_;
|
||||||
|
int diffusivity_;
|
||||||
|
|
||||||
|
#if CV_MAJOR_VERSION > 2
|
||||||
|
cv::Ptr<cv::KAZE> kaze_;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
119
corelib/include/rtabmap/core/FlannIndex.h
Normal file
119
corelib/include/rtabmap/core/FlannIndex.h
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2016, 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 CORELIB_SRC_FLANNINDEX_H_
|
||||||
|
#define CORELIB_SRC_FLANNINDEX_H_
|
||||||
|
|
||||||
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
|
#include <list>
|
||||||
|
#include <opencv2/opencv.hpp>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class RTABMAP_EXP FlannIndex
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FlannIndex();
|
||||||
|
virtual ~FlannIndex();
|
||||||
|
|
||||||
|
void release();
|
||||||
|
unsigned int indexedFeatures() const;
|
||||||
|
|
||||||
|
// return KB
|
||||||
|
unsigned int memoryUsed() const;
|
||||||
|
|
||||||
|
// Note that useDistanceL1 doesn't have any effect if LSH is used
|
||||||
|
void buildLinearIndex(
|
||||||
|
const cv::Mat & features,
|
||||||
|
bool useDistanceL1 = false,
|
||||||
|
float rebalancingFactor = 2.0f);
|
||||||
|
void buildKDTreeIndex(
|
||||||
|
const cv::Mat & features,
|
||||||
|
int trees = 4,
|
||||||
|
bool useDistanceL1 = false,
|
||||||
|
float rebalancingFactor = 2.0f);
|
||||||
|
void buildKDTreeSingleIndex(
|
||||||
|
const cv::Mat & features,
|
||||||
|
int leafMaxSize = 10,
|
||||||
|
bool reorder = true,
|
||||||
|
bool useDistanceL1 = false,
|
||||||
|
float rebalancingFactor = 2.0f);
|
||||||
|
void buildLSHIndex(
|
||||||
|
const cv::Mat & features,
|
||||||
|
unsigned int table_number = 12,
|
||||||
|
unsigned int key_size = 20,
|
||||||
|
unsigned int multi_probe_level = 2,
|
||||||
|
float rebalancingFactor = 2.0f);
|
||||||
|
|
||||||
|
bool isBuilt();
|
||||||
|
|
||||||
|
int featuresType() const {return featuresType_;}
|
||||||
|
int featuresDim() const {return featuresDim_;}
|
||||||
|
|
||||||
|
unsigned int addPoints(const cv::Mat & features);
|
||||||
|
|
||||||
|
void removePoint(unsigned int index);
|
||||||
|
|
||||||
|
// return squared distances (indices should be casted in size_t)
|
||||||
|
void knnSearch(
|
||||||
|
const cv::Mat & query,
|
||||||
|
cv::Mat & indices,
|
||||||
|
cv::Mat & dists,
|
||||||
|
int knn,
|
||||||
|
int checks = 32,
|
||||||
|
float eps = 0.0,
|
||||||
|
bool sorted = true) const;
|
||||||
|
|
||||||
|
// return squared distances
|
||||||
|
void radiusSearch(
|
||||||
|
const cv::Mat & query,
|
||||||
|
std::vector<std::vector<size_t> > & indices,
|
||||||
|
std::vector<std::vector<float> > & dists,
|
||||||
|
float radius,
|
||||||
|
int maxNeighbors = 0,
|
||||||
|
int checks = 32,
|
||||||
|
float eps = 0.0,
|
||||||
|
bool sorted = true) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void * index_;
|
||||||
|
unsigned int nextIndex_;
|
||||||
|
int featuresType_;
|
||||||
|
int featuresDim_;
|
||||||
|
bool isLSH_;
|
||||||
|
bool useDistanceL1_; // true=EUCLEDIAN_L2 false=MANHATTAN_L1
|
||||||
|
float rebalancingFactor_;
|
||||||
|
|
||||||
|
// keep feature in memory until the tree is rebuilt
|
||||||
|
// (in case the word is deleted when removed from the VWDictionary)
|
||||||
|
std::map<int, cv::Mat> addedDescriptors_;
|
||||||
|
std::list<int> removedIndexes_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace rtabmap */
|
||||||
|
|
||||||
|
#endif /* CORELIB_SRC_FLANNINDEX_H_ */
|
||||||
108
corelib/include/rtabmap/core/GainCompensator.h
Normal file
108
corelib/include/rtabmap/core/GainCompensator.h
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2016, 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 CORELIB_SRC_GAINCOMPENSATOR_H_
|
||||||
|
#define CORELIB_SRC_GAINCOMPENSATOR_H_
|
||||||
|
|
||||||
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
|
|
||||||
|
#include <pcl/point_cloud.h>
|
||||||
|
#include <pcl/point_types.h>
|
||||||
|
#include <pcl/pcl_base.h>
|
||||||
|
#include <opencv2/opencv.hpp>
|
||||||
|
#include <rtabmap/core/Link.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Works like cv::GainCompensator but with point clouds
|
||||||
|
*/
|
||||||
|
class RTABMAP_EXP GainCompensator {
|
||||||
|
public:
|
||||||
|
GainCompensator(double maxCorrespondenceDistance = 0.02, double minOverlap = 0.0, double alpha = 0.01, double beta = 10);
|
||||||
|
virtual ~GainCompensator();
|
||||||
|
|
||||||
|
void feed(
|
||||||
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloudA, // should not contain NaNs
|
||||||
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloudB, // should not contain NaNs
|
||||||
|
const Transform & transformB);
|
||||||
|
void feed(
|
||||||
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloudA,
|
||||||
|
const pcl::IndicesPtr & indicesA,
|
||||||
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloudB,
|
||||||
|
const pcl::IndicesPtr & indicesB,
|
||||||
|
const Transform & transformB);
|
||||||
|
void feed(
|
||||||
|
const std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr> & clouds, // should not contain NaNs
|
||||||
|
const std::multimap<int, Link> & links);
|
||||||
|
void feed(
|
||||||
|
const std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr> & clouds,
|
||||||
|
const std::map<int, pcl::IndicesPtr> & indices,
|
||||||
|
const std::multimap<int, Link> & links);
|
||||||
|
void feed(
|
||||||
|
const std::map<int, pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr> & clouds,
|
||||||
|
const std::map<int, pcl::IndicesPtr> & indices,
|
||||||
|
const std::multimap<int, Link> & links);
|
||||||
|
void feed(
|
||||||
|
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & clouds,
|
||||||
|
const std::multimap<int, Link> & links);
|
||||||
|
|
||||||
|
void apply(
|
||||||
|
int id,
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
|
bool rgb = true) const;
|
||||||
|
void apply(
|
||||||
|
int id,
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
|
const pcl::IndicesPtr & indices,
|
||||||
|
bool rgb = true) const;
|
||||||
|
void apply(
|
||||||
|
int id,
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr & cloud,
|
||||||
|
const pcl::IndicesPtr & indices,
|
||||||
|
bool rgb = true) const;
|
||||||
|
void apply(
|
||||||
|
int id,
|
||||||
|
cv::Mat & image,
|
||||||
|
bool rgb = true) const;
|
||||||
|
|
||||||
|
double getGain(int id, double * r=0, double * g=0, double * b=0) const;
|
||||||
|
int getIndex(int id) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
cv::Mat_<double> gains_;
|
||||||
|
std::map<int, int> idToIndex_;
|
||||||
|
double maxCorrespondenceDistance_;
|
||||||
|
double minOverlap_;
|
||||||
|
double alpha_;
|
||||||
|
double beta_;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace rtabmap */
|
||||||
|
|
||||||
|
#endif /* CORELIB_SRC_GAINCOMPENSATOR_H_ */
|
||||||
@@ -25,6 +25,20 @@ 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The methods in this file were modified from the originals of the MRPT toolkit (see notice below):
|
||||||
|
* https://github.com/MRPT/mrpt/blob/master/libs/topography/src/conversions.cpp
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* +---------------------------------------------------------------------------+
|
||||||
|
| Mobile Robot Programming Toolkit (MRPT) |
|
||||||
|
| http://www.mrpt.org/ |
|
||||||
|
| |
|
||||||
|
| Copyright (c) 2005-2016, Individual contributors, see AUTHORS file |
|
||||||
|
| See: http://www.mrpt.org/Authors - All rights reserved. |
|
||||||
|
| Released under BSD License. See details in http://www.mrpt.org/License |
|
||||||
|
+---------------------------------------------------------------------------+ */
|
||||||
|
|
||||||
|
|
||||||
#ifndef GEODETICCOORDS_H_
|
#ifndef GEODETICCOORDS_H_
|
||||||
#define GEODETICCOORDS_H_
|
#define GEODETICCOORDS_H_
|
||||||
@@ -52,12 +66,58 @@ public:
|
|||||||
cv::Point3d toGeocentric_WGS84() const;
|
cv::Point3d toGeocentric_WGS84() const;
|
||||||
cv::Point3d toENU_WGS84(const GeodeticCoords & origin) const; // East=X, North=Y
|
cv::Point3d toENU_WGS84(const GeodeticCoords & origin) const; // East=X, North=Y
|
||||||
|
|
||||||
|
void fromGeocentric_WGS84(const cv::Point3d& geocentric);
|
||||||
|
void fromENU_WGS84(const cv::Point3d & enu, const GeodeticCoords & origin);
|
||||||
|
|
||||||
|
static cv::Point3d ENU_WGS84ToGeocentric_WGS84(const cv::Point3d & enu, const GeodeticCoords & origin);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double latitude_; // deg
|
double latitude_; // deg
|
||||||
double longitude_; // deg
|
double longitude_; // deg
|
||||||
double altitude_; // m
|
double altitude_; // m
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class GPS
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GPS():
|
||||||
|
stamp_(0.0),
|
||||||
|
longitude_(0.0),
|
||||||
|
latitude_(0.0),
|
||||||
|
altitude_(0.0),
|
||||||
|
error_(0.0),
|
||||||
|
bearing_(0.0)
|
||||||
|
{}
|
||||||
|
GPS(const double & stamp,
|
||||||
|
const double & longitude,
|
||||||
|
const double & latitude,
|
||||||
|
const double & altitude,
|
||||||
|
const double & error,
|
||||||
|
const double & bearing):
|
||||||
|
stamp_(stamp),
|
||||||
|
longitude_(longitude),
|
||||||
|
latitude_(latitude),
|
||||||
|
altitude_(altitude),
|
||||||
|
error_(error),
|
||||||
|
bearing_(bearing)
|
||||||
|
{}
|
||||||
|
const double & stamp() const {return stamp_;}
|
||||||
|
const double & longitude() const {return longitude_;}
|
||||||
|
const double & latitude() const {return latitude_;}
|
||||||
|
const double & altitude() const {return altitude_;}
|
||||||
|
const double & error() const {return error_;}
|
||||||
|
const double & bearing() const {return bearing_;}
|
||||||
|
|
||||||
|
GeodeticCoords toGeodeticCoords() const {return GeodeticCoords(latitude_, longitude_, altitude_);}
|
||||||
|
private:
|
||||||
|
double stamp_; // in sec
|
||||||
|
double longitude_; // DD
|
||||||
|
double latitude_; // DD
|
||||||
|
double altitude_; // m
|
||||||
|
double error_; // m
|
||||||
|
double bearing_; // deg (North 0->360 clockwise)
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* GEODETICCOORDS_H_ */
|
#endif /* GEODETICCOORDS_H_ */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <rtabmap/core/Link.h>
|
#include <rtabmap/core/Link.h>
|
||||||
|
#include <rtabmap/core/GeodeticCoords.h>
|
||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
class Memory;
|
class Memory;
|
||||||
@@ -53,11 +54,54 @@ bool RTABMAP_EXP exportPoses(
|
|||||||
|
|
||||||
bool RTABMAP_EXP importPoses(
|
bool RTABMAP_EXP importPoses(
|
||||||
const std::string & filePath,
|
const std::string & filePath,
|
||||||
int format, // 0=Raw, 1=RGBD-SLAM, 2=KITTI, 3=TORO, 4=g2o, GPS (t,x,y)
|
int format, // 0=Raw, 1=RGBD-SLAM, 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe
|
||||||
std::map<int, Transform> & poses,
|
std::map<int, Transform> & poses,
|
||||||
std::multimap<int, Link> * constraints = 0, // optional for formats 3 and 4
|
std::multimap<int, Link> * constraints = 0, // optional for formats 3 and 4
|
||||||
std::map<int, double> * stamps = 0); // optional for format 1
|
std::map<int, double> * stamps = 0); // optional for format 1
|
||||||
|
|
||||||
|
bool RTABMAP_EXP exportGPS(
|
||||||
|
const std::string & filePath,
|
||||||
|
const std::map<int, GPS> & gpsValues,
|
||||||
|
unsigned int rgba = 0xFFFFFFFF);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute translation and rotation errors for KITTI datasets.
|
||||||
|
* See http://www.cvlibs.net/datasets/kitti/eval_odometry.php.
|
||||||
|
* @param poses_gt, Ground Truth poses
|
||||||
|
* @param poses_result, Estimated poses
|
||||||
|
* @param t_err, Output translation error (%)
|
||||||
|
* @param r_err, Output rotation error (deg/m)
|
||||||
|
*/
|
||||||
|
void RTABMAP_EXP calcKittiSequenceErrors(
|
||||||
|
const std::vector<Transform> &poses_gt,
|
||||||
|
const std::vector<Transform> &poses_result,
|
||||||
|
float & t_err,
|
||||||
|
float & r_err);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute root-mean-square error (RMSE) like the TUM RGBD
|
||||||
|
* dataset's evaluation tool (absolute trajectory error).
|
||||||
|
* See https://vision.in.tum.de/data/datasets/rgbd-dataset
|
||||||
|
* @param groundTruth, Ground Truth poses
|
||||||
|
* @param poses, Estimated poses
|
||||||
|
* @return Gt to Map transform
|
||||||
|
*/
|
||||||
|
Transform RTABMAP_EXP calcRMSE(
|
||||||
|
const std::map<int, Transform> &groundTruth,
|
||||||
|
const std::map<int, Transform> &poses,
|
||||||
|
float & translational_rmse,
|
||||||
|
float & translational_mean,
|
||||||
|
float & translational_median,
|
||||||
|
float & translational_std,
|
||||||
|
float & translational_min,
|
||||||
|
float & translational_max,
|
||||||
|
float & rotational_rmse,
|
||||||
|
float & rotational_mean,
|
||||||
|
float & rotational_median,
|
||||||
|
float & rotational_std,
|
||||||
|
float & rotational_min,
|
||||||
|
float & rotational_max);
|
||||||
|
|
||||||
std::multimap<int, Link>::iterator RTABMAP_EXP findLink(
|
std::multimap<int, Link>::iterator RTABMAP_EXP findLink(
|
||||||
std::multimap<int, Link> & links,
|
std::multimap<int, Link> & links,
|
||||||
int from,
|
int from,
|
||||||
@@ -79,6 +123,15 @@ std::multimap<int, int>::const_iterator RTABMAP_EXP findLink(
|
|||||||
int to,
|
int to,
|
||||||
bool checkBothWays = true);
|
bool checkBothWays = true);
|
||||||
|
|
||||||
|
std::multimap<int, Link> RTABMAP_EXP filterDuplicateLinks(
|
||||||
|
const std::multimap<int, Link> & links);
|
||||||
|
std::multimap<int, Link> RTABMAP_EXP filterLinks(
|
||||||
|
const std::multimap<int, Link> & links,
|
||||||
|
Link::Type filteredType);
|
||||||
|
std::map<int, Link> RTABMAP_EXP filterLinks(
|
||||||
|
const std::map<int, Link> & links,
|
||||||
|
Link::Type filteredType);
|
||||||
|
|
||||||
//Note: This assumes a coordinate system where X is forward, * Y is up, and Z is right.
|
//Note: This assumes a coordinate system where X is forward, * Y is up, and Z is right.
|
||||||
std::map<int, Transform> RTABMAP_EXP frustumPosesFiltering(
|
std::map<int, Transform> RTABMAP_EXP frustumPosesFiltering(
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
@@ -176,6 +229,11 @@ int RTABMAP_EXP findNearestNode(
|
|||||||
const std::map<int, rtabmap::Transform> & nodes,
|
const std::map<int, rtabmap::Transform> & nodes,
|
||||||
const rtabmap::Transform & targetPose);
|
const rtabmap::Transform & targetPose);
|
||||||
|
|
||||||
|
std::vector<int> RTABMAP_EXP findNearestNodes(
|
||||||
|
const std::map<int, rtabmap::Transform> & nodes,
|
||||||
|
const rtabmap::Transform & targetPose,
|
||||||
|
int k);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get nodes near the query
|
* Get nodes near the query
|
||||||
* @param nodeId the query id
|
* @param nodeId the query id
|
||||||
@@ -198,6 +256,10 @@ float RTABMAP_EXP computePathLength(
|
|||||||
unsigned int fromIndex = 0,
|
unsigned int fromIndex = 0,
|
||||||
unsigned int toIndex = 0);
|
unsigned int toIndex = 0);
|
||||||
|
|
||||||
|
// assuming they are all linked in map order
|
||||||
|
float RTABMAP_EXP computePathLength(
|
||||||
|
const std::map<int, Transform> & path);
|
||||||
|
|
||||||
std::list<std::map<int, Transform> > RTABMAP_EXP getPaths(
|
std::list<std::map<int, Transform> > RTABMAP_EXP getPaths(
|
||||||
std::map<int, Transform> poses,
|
std::map<int, Transform> poses,
|
||||||
const std::multimap<int, Link> & links);
|
const std::multimap<int, Link> & links);
|
||||||
|
|||||||
109
corelib/include/rtabmap/core/IMU.h
Normal file
109
corelib/include/rtabmap/core/IMU.h
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* IMU.h
|
||||||
|
*
|
||||||
|
* Created on: 2018-03-05
|
||||||
|
* Author: mathieu
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IMU_H_
|
||||||
|
#define IMU_H_
|
||||||
|
|
||||||
|
#include <opencv2/core/core.hpp>
|
||||||
|
#include <rtabmap/utilite/ULogger.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
|
||||||
|
// Correspondence class to sensor_msgs/IMU
|
||||||
|
class IMU
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IMU() {}
|
||||||
|
IMU(const cv::Vec4d & orientation,
|
||||||
|
const cv::Mat & orientationCovariance,
|
||||||
|
const cv::Vec3d & angularVelocity,
|
||||||
|
const cv::Mat & angularVelocityCovariance,
|
||||||
|
const cv::Vec3d & linearAcceleration,
|
||||||
|
const cv::Mat & linearAccelerationCovariance,
|
||||||
|
const Transform & localTransform = Transform::getIdentity()) :
|
||||||
|
orientation_(orientation),
|
||||||
|
orientationCovariance_(orientationCovariance),
|
||||||
|
angularVelocity_(angularVelocity),
|
||||||
|
angularVelocityCovariance_(angularVelocityCovariance),
|
||||||
|
linearAcceleration_(linearAcceleration),
|
||||||
|
linearAccelerationCovariance_(linearAccelerationCovariance),
|
||||||
|
localTransform_(localTransform)
|
||||||
|
{
|
||||||
|
UASSERT(!orientationCovariance.empty() && orientationCovariance.cols == 3 && orientationCovariance.rows == 3 && orientationCovariance.type() == CV_64FC1);
|
||||||
|
UASSERT(!angularVelocityCovariance.empty() && angularVelocityCovariance.cols == 3 && angularVelocityCovariance.rows == 3 && angularVelocityCovariance.type() == CV_64FC1);
|
||||||
|
UASSERT(!linearAccelerationCovariance.empty() && linearAccelerationCovariance.cols == 3 && linearAccelerationCovariance.rows == 3 && linearAccelerationCovariance.type() == CV_64FC1);
|
||||||
|
}
|
||||||
|
IMU(const cv::Vec3d & angularVelocity,
|
||||||
|
const cv::Mat & angularVelocityCovariance,
|
||||||
|
const cv::Vec3d & linearAcceleration,
|
||||||
|
const cv::Mat & linearAccelerationCovariance,
|
||||||
|
const Transform & localTransform = Transform::getIdentity()) :
|
||||||
|
angularVelocity_(angularVelocity),
|
||||||
|
angularVelocityCovariance_(angularVelocityCovariance),
|
||||||
|
linearAcceleration_(linearAcceleration),
|
||||||
|
linearAccelerationCovariance_(linearAccelerationCovariance),
|
||||||
|
localTransform_(localTransform)
|
||||||
|
{
|
||||||
|
UASSERT(!angularVelocityCovariance.empty() && angularVelocityCovariance.cols == 3 && angularVelocityCovariance.rows == 3 && angularVelocityCovariance.type() == CV_64FC1);
|
||||||
|
UASSERT(!linearAccelerationCovariance.empty() && linearAccelerationCovariance.cols == 3 && linearAccelerationCovariance.rows == 3 && linearAccelerationCovariance.type() == CV_64FC1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const cv::Vec4d & orientation() const {return orientation_;}
|
||||||
|
const cv::Mat & orientationCovariance() const {return orientationCovariance_;} // 3x3 double Row major about x, y, z axes, empty if orientation is not set
|
||||||
|
|
||||||
|
const cv::Vec3d & angularVelocity() const {return angularVelocity_;}
|
||||||
|
const cv::Mat & angularVelocityCovariance() const {return angularVelocityCovariance_;} // 3x3 double Row major about x, y, z axes, empty if angularVelocity is not set
|
||||||
|
|
||||||
|
const cv::Vec3d linearAcceleration() const {return linearAcceleration_;}
|
||||||
|
const cv::Mat & linearAccelerationCovariance() const {return linearAccelerationCovariance_;} // 3x3 double Row major x, y z, empty if linearAcceleration is not set
|
||||||
|
|
||||||
|
const Transform & localTransform() const {return localTransform_;}
|
||||||
|
|
||||||
|
bool empty() const
|
||||||
|
{
|
||||||
|
return orientationCovariance_.empty() && angularVelocityCovariance_.empty() && linearAccelerationCovariance_.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
cv::Vec4d orientation_;
|
||||||
|
cv::Mat orientationCovariance_; // 3x3 double Row major about x, y, z axes, empty if orientation is not set
|
||||||
|
|
||||||
|
cv::Vec3d angularVelocity_;
|
||||||
|
cv::Mat angularVelocityCovariance_; // 3x3 double Row major about x, y, z axes, empty if angularVelocity is not set
|
||||||
|
|
||||||
|
cv::Vec3d linearAcceleration_;
|
||||||
|
cv::Mat linearAccelerationCovariance_; // 3x3 double Row major x, y z, empty if linearAcceleration is not set
|
||||||
|
|
||||||
|
Transform localTransform_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class IMUEvent : public UEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IMUEvent() :
|
||||||
|
stamp_(0.0)
|
||||||
|
{}
|
||||||
|
IMUEvent(const IMU & data, double stamp) :
|
||||||
|
data_(data),
|
||||||
|
stamp_(stamp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual std::string getClassName() const {return "IMUEvent";}
|
||||||
|
const IMU & getData() const {return data_;}
|
||||||
|
double getStamp() const {return stamp_;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
IMU data_;
|
||||||
|
double stamp_;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* IMU_H_ */
|
||||||
70
corelib/include/rtabmap/core/IMUThread.h
Normal file
70
corelib/include/rtabmap/core/IMUThread.h
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2016, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
|
|
||||||
|
#include <rtabmap/core/Transform.h>
|
||||||
|
#include <rtabmap/utilite/UThread.h>
|
||||||
|
#include <rtabmap/utilite/UEventsSender.h>
|
||||||
|
#include <rtabmap/utilite/UTimer.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
namespace rtabmap
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class IMUThread
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class RTABMAP_EXP IMUThread :
|
||||||
|
public UThread,
|
||||||
|
public UEventsSender
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IMUThread(int rate, const Transform & localTransform);
|
||||||
|
virtual ~IMUThread();
|
||||||
|
|
||||||
|
bool init(const std::string & path);
|
||||||
|
void setRate(int rate);
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual void mainLoopBegin();
|
||||||
|
virtual void mainLoop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int rate_;
|
||||||
|
Transform localTransform_;
|
||||||
|
std::ifstream imuFile_;
|
||||||
|
UTimer frameRateTimer_;
|
||||||
|
double captureDelay_;
|
||||||
|
double previousStamp_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace rtabmap
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
|
|||||||
95
corelib/include/rtabmap/core/LaserScan.h
Normal file
95
corelib/include/rtabmap/core/LaserScan.h
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2016, 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 CORELIB_INCLUDE_RTABMAP_CORE_LASERSCAN_H_
|
||||||
|
#define CORELIB_INCLUDE_RTABMAP_CORE_LASERSCAN_H_
|
||||||
|
|
||||||
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
|
|
||||||
|
#include <rtabmap/core/Transform.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class RTABMAP_EXP LaserScan
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Format{kUnknown=0,
|
||||||
|
kXY=1,
|
||||||
|
kXYI=2,
|
||||||
|
kXYNormal=3,
|
||||||
|
kXYINormal=4,
|
||||||
|
kXYZ=5,
|
||||||
|
kXYZI=6,
|
||||||
|
kXYZRGB=7,
|
||||||
|
kXYZNormal=8,
|
||||||
|
kXYZINormal=9,
|
||||||
|
kXYZRGBNormal=10};
|
||||||
|
|
||||||
|
static int channels(Format format);
|
||||||
|
static bool isScan2d(const Format & format);
|
||||||
|
static bool isScanHasNormals(const Format & format);
|
||||||
|
static bool isScanHasRGB(const Format & format);
|
||||||
|
static bool isScanHasIntensity(const Format & format);
|
||||||
|
static LaserScan backwardCompatibility(const cv::Mat & oldScanFormat, int maxPoints = 0, int maxRange = 0, const Transform & localTransform = Transform::getIdentity());
|
||||||
|
|
||||||
|
public:
|
||||||
|
LaserScan();
|
||||||
|
LaserScan(const cv::Mat & data, int maxPoints, float maxRange, Format format, const Transform & localTransform = Transform::getIdentity());
|
||||||
|
|
||||||
|
const cv::Mat & data() const {return data_;}
|
||||||
|
int maxPoints() const {return maxPoints_;}
|
||||||
|
float maxRange() const {return maxRange_;}
|
||||||
|
Format format() const {return format_;}
|
||||||
|
Transform localTransform() const {return localTransform_;}
|
||||||
|
|
||||||
|
bool isEmpty() const {return data_.empty();}
|
||||||
|
int size() const {return data_.cols;}
|
||||||
|
int dataType() const {return data_.type();}
|
||||||
|
bool is2d() const {return isScan2d(format_);}
|
||||||
|
bool hasNormals() const {return isScanHasNormals(format_);}
|
||||||
|
bool hasRGB() const {return isScanHasRGB(format_);}
|
||||||
|
bool hasIntensity() const {return isScanHasIntensity(format_);}
|
||||||
|
bool isCompressed() const {return !data_.empty() && data_.type()==CV_8UC1;}
|
||||||
|
LaserScan clone() const {return LaserScan(data_.clone(), maxPoints_, maxRange_, format_, localTransform_.clone());}
|
||||||
|
|
||||||
|
int getIntensityOffset() const {return hasIntensity()?(is2d()?2:3):-1;}
|
||||||
|
int getRGBOffset() const {return hasRGB()?(is2d()?2:3):-1;}
|
||||||
|
int getNormalsOffset() const {return hasNormals()?(2 + (is2d()?0:1) + ((hasRGB() || hasIntensity())?1:0)):-1;}
|
||||||
|
|
||||||
|
void clear() {data_ = cv::Mat();}
|
||||||
|
|
||||||
|
private:
|
||||||
|
cv::Mat data_;
|
||||||
|
int maxPoints_;
|
||||||
|
float maxRange_;
|
||||||
|
Format format_;
|
||||||
|
Transform localTransform_;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_LASERSCAN_H_ */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -46,20 +46,14 @@ public:
|
|||||||
kUserClosure,
|
kUserClosure,
|
||||||
kVirtualClosure,
|
kVirtualClosure,
|
||||||
kNeighborMerged,
|
kNeighborMerged,
|
||||||
kUndef};
|
kPosePrior,
|
||||||
|
kUndef = 99};
|
||||||
Link();
|
Link();
|
||||||
Link(int from,
|
Link(int from,
|
||||||
int to,
|
int to,
|
||||||
Type type,
|
Type type,
|
||||||
const Transform & transform,
|
const Transform & transform,
|
||||||
const cv::Mat & infMatrix = cv::Mat::eye(6,6,CV_64FC1),
|
const cv::Mat & infMatrix = cv::Mat::eye(6,6,CV_64FC1), // information matrix: inverse of covariance matrix
|
||||||
const cv::Mat & userData = cv::Mat());
|
|
||||||
Link(int from,
|
|
||||||
int to,
|
|
||||||
Type type,
|
|
||||||
const Transform & transform,
|
|
||||||
double rotVariance,
|
|
||||||
double transVariance,
|
|
||||||
const cv::Mat & userData = cv::Mat());
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
bool isValid() const {return from_ > 0 && to_ > 0 && !transform_.isNull() && type_!=kUndef;}
|
bool isValid() const {return from_ > 0 && to_ > 0 && !transform_.isNull() && type_!=kUndef;}
|
||||||
@@ -76,11 +70,7 @@ public:
|
|||||||
void setTo(int to) {to_ = to;}
|
void setTo(int to) {to_ = to;}
|
||||||
void setTransform(const Transform & transform) {transform_ = transform;}
|
void setTransform(const Transform & transform) {transform_ = transform;}
|
||||||
void setType(Type type) {type_ = type;}
|
void setType(Type type) {type_ = type;}
|
||||||
void setInfMatrix(const cv::Mat & infMatrix);
|
|
||||||
void setVariance(double rotVariance, double transVariance);
|
|
||||||
|
|
||||||
void setUserDataRaw(const cv::Mat & userDataRaw); // only set raw
|
|
||||||
void setUserData(const cv::Mat & userData); // detect automatically if raw or compressed. If raw, the data is compressed too.
|
|
||||||
const cv::Mat & userDataRaw() const {return _userDataRaw;}
|
const cv::Mat & userDataRaw() const {return _userDataRaw;}
|
||||||
const cv::Mat & userDataCompressed() const {return _userDataCompressed;}
|
const cv::Mat & userDataCompressed() const {return _userDataCompressed;}
|
||||||
void uncompressUserData();
|
void uncompressUserData();
|
||||||
@@ -89,6 +79,9 @@ public:
|
|||||||
Link merge(const Link & link, Type outputType) const;
|
Link merge(const Link & link, Type outputType) const;
|
||||||
Link inverse() const;
|
Link inverse() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setInfMatrix(const cv::Mat & infMatrix);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int from_;
|
int from_;
|
||||||
int to_;
|
int to_;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -42,6 +42,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "rtabmap/utilite/UStl.h"
|
#include "rtabmap/utilite/UStl.h"
|
||||||
#include <opencv2/core/core.hpp>
|
#include <opencv2/core/core.hpp>
|
||||||
#include <opencv2/features2d/features2d.hpp>
|
#include <opencv2/features2d/features2d.hpp>
|
||||||
|
#include <pcl/pcl_config.h>
|
||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
@@ -55,6 +56,7 @@ class Registration;
|
|||||||
class RegistrationInfo;
|
class RegistrationInfo;
|
||||||
class RegistrationIcp;
|
class RegistrationIcp;
|
||||||
class Stereo;
|
class Stereo;
|
||||||
|
class OccupancyGrid;
|
||||||
|
|
||||||
class RTABMAP_EXP Memory
|
class RTABMAP_EXP Memory
|
||||||
{
|
{
|
||||||
@@ -74,12 +76,13 @@ public:
|
|||||||
bool update(const SensorData & data,
|
bool update(const SensorData & data,
|
||||||
const Transform & pose,
|
const Transform & pose,
|
||||||
const cv::Mat & covariance,
|
const cv::Mat & covariance,
|
||||||
|
const std::vector<float> & velocity = std::vector<float>(), // vx,vy,vz,vroll,vpitch,vyaw
|
||||||
Statistics * stats = 0);
|
Statistics * stats = 0);
|
||||||
bool init(const std::string & dbUrl,
|
bool init(const std::string & dbUrl,
|
||||||
bool dbOverwritten = false,
|
bool dbOverwritten = false,
|
||||||
const ParametersMap & parameters = ParametersMap(),
|
const ParametersMap & parameters = ParametersMap(),
|
||||||
bool postInitClosingEvents = false);
|
bool postInitClosingEvents = false);
|
||||||
void close(bool databaseSaved = true, bool postInitClosingEvents = false);
|
void close(bool databaseSaved = true, bool postInitClosingEvents = false, const std::string & ouputDatabasePath = "");
|
||||||
std::map<int, float> computeLikelihood(const Signature * signature,
|
std::map<int, float> computeLikelihood(const Signature * signature,
|
||||||
const std::list<int> & ids);
|
const std::list<int> & ids);
|
||||||
int incrementMapId(std::map<int, int> * reducedIds = 0);
|
int incrementMapId(std::map<int, int> * reducedIds = 0);
|
||||||
@@ -89,11 +92,34 @@ public:
|
|||||||
std::set<int> reactivateSignatures(const std::list<int> & ids, unsigned int maxLoaded, double & timeDbAccess);
|
std::set<int> reactivateSignatures(const std::list<int> & ids, unsigned int maxLoaded, double & timeDbAccess);
|
||||||
|
|
||||||
int cleanup();
|
int cleanup();
|
||||||
|
void saveStatistics(const Statistics & statistics);
|
||||||
|
void savePreviewImage(const cv::Mat & image) const;
|
||||||
|
cv::Mat loadPreviewImage() const;
|
||||||
|
void saveOptimizedPoses(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const;
|
||||||
|
std::map<int, Transform> loadOptimizedPoses(Transform * lastlocalizationPose) const;
|
||||||
|
void save2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize) const;
|
||||||
|
cv::Mat load2DMap(float & xMin, float & yMin, float & cellSize) const;
|
||||||
|
void saveOptimizedMesh(
|
||||||
|
const cv::Mat & cloud,
|
||||||
|
const std::vector<std::vector<std::vector<unsigned int> > > & polygons = std::vector<std::vector<std::vector<unsigned int> > >(), // Textures -> polygons -> vertices
|
||||||
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
|
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords = std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > >(), // Textures -> uv coords for each vertex of the polygons
|
||||||
|
#else
|
||||||
|
const std::vector<std::vector<Eigen::Vector2f> > & texCoords = std::vector<std::vector<Eigen::Vector2f> >(), // Textures -> uv coords for each vertex of the polygons
|
||||||
|
#endif
|
||||||
|
const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size)
|
||||||
|
cv::Mat loadOptimizedMesh(
|
||||||
|
std::vector<std::vector<std::vector<unsigned int> > > * polygons = 0,
|
||||||
|
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
|
||||||
|
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
|
||||||
|
#else
|
||||||
|
std::vector<std::vector<Eigen::Vector2f> > * texCoords = 0,
|
||||||
|
#endif
|
||||||
|
cv::Mat * textures = 0) const;
|
||||||
void emptyTrash();
|
void emptyTrash();
|
||||||
void joinTrashThread();
|
void joinTrashThread();
|
||||||
bool addLink(const Link & link, bool addInDatabase = false);
|
bool addLink(const Link & link, bool addInDatabase = false);
|
||||||
void updateLink(int fromId, int toId, const Transform & transform, float rotVariance, float transVariance);
|
void updateLink(const Link & link, bool updateInDatabase = false);
|
||||||
void updateLink(int fromId, int toId, const Transform & transform, const cv::Mat & covariance);
|
|
||||||
void removeAllVirtualLinks();
|
void removeAllVirtualLinks();
|
||||||
void removeVirtualLinks(int signatureId);
|
void removeVirtualLinks(int signatureId);
|
||||||
std::map<int, int> getNeighborsId(
|
std::map<int, int> getNeighborsId(
|
||||||
@@ -103,6 +129,8 @@ public:
|
|||||||
bool incrementMarginOnLoop = false,
|
bool incrementMarginOnLoop = false,
|
||||||
bool ignoreLoopIds = false,
|
bool ignoreLoopIds = false,
|
||||||
bool ignoreIntermediateNodes = false,
|
bool ignoreIntermediateNodes = false,
|
||||||
|
bool ignoreLocalSpaceLoopIds = false,
|
||||||
|
const std::set<int> & nodesSet = std::set<int>(),
|
||||||
double * dbAccessTime = 0) const;
|
double * dbAccessTime = 0) const;
|
||||||
std::map<int, float> getNeighborsIdRadius(
|
std::map<int, float> getNeighborsIdRadius(
|
||||||
int signatureId,
|
int signatureId,
|
||||||
@@ -110,6 +138,7 @@ public:
|
|||||||
const std::map<int, Transform> & optimizedPoses,
|
const std::map<int, Transform> & optimizedPoses,
|
||||||
int maxGraphDepth) const;
|
int maxGraphDepth) const;
|
||||||
void deleteLocation(int locationId, std::list<int> * deletedWords = 0);
|
void deleteLocation(int locationId, std::list<int> * deletedWords = 0);
|
||||||
|
void saveLocationData(int locationId);
|
||||||
void removeLink(int idA, int idB);
|
void removeLink(int idA, int idB);
|
||||||
void removeRawData(int id, bool image = true, bool scan = true, bool userData = true);
|
void removeRawData(int id, bool image = true, bool scan = true, bool userData = true);
|
||||||
|
|
||||||
@@ -132,6 +161,13 @@ public:
|
|||||||
int getSignatureIdByLabel(const std::string & label, bool lookInDatabase = true) const;
|
int getSignatureIdByLabel(const std::string & label, bool lookInDatabase = true) const;
|
||||||
bool labelSignature(int id, const std::string & label);
|
bool labelSignature(int id, const std::string & label);
|
||||||
std::map<int, std::string> getAllLabels() const;
|
std::map<int, std::string> getAllLabels() const;
|
||||||
|
/**
|
||||||
|
* Set user data. Detect automatically if raw or compressed. If raw, the data is
|
||||||
|
* compressed too. A matrix of type CV_8UC1 with 1 row is considered as compressed.
|
||||||
|
* If you have one dimension unsigned 8 bits raw data, make sure to transpose it
|
||||||
|
* (to have multiple rows instead of multiple columns) in order to be detected as
|
||||||
|
* not compressed.
|
||||||
|
*/
|
||||||
bool setUserData(int id, const cv::Mat & data);
|
bool setUserData(int id, const cv::Mat & data);
|
||||||
int getDatabaseMemoryUsed() const; // in bytes
|
int getDatabaseMemoryUsed() const; // in bytes
|
||||||
std::string getDatabaseVersion() const;
|
std::string getDatabaseVersion() const;
|
||||||
@@ -145,6 +181,8 @@ public:
|
|||||||
std::string & label,
|
std::string & label,
|
||||||
double & stamp,
|
double & stamp,
|
||||||
Transform & groundTruth,
|
Transform & groundTruth,
|
||||||
|
std::vector<float> & velocity,
|
||||||
|
GPS & gps,
|
||||||
bool lookInDatabase = false) const;
|
bool lookInDatabase = false) const;
|
||||||
cv::Mat getImageCompressed(int signatureId) const;
|
cv::Mat getImageCompressed(int signatureId) const;
|
||||||
SensorData getNodeData(int nodeId, bool uncompressedData = false) const;
|
SensorData getNodeData(int nodeId, bool uncompressedData = false) const;
|
||||||
@@ -155,7 +193,7 @@ public:
|
|||||||
void getNodeCalibration(int nodeId,
|
void getNodeCalibration(int nodeId,
|
||||||
std::vector<CameraModel> & models,
|
std::vector<CameraModel> & models,
|
||||||
StereoCameraModel & stereoModel);
|
StereoCameraModel & stereoModel);
|
||||||
SensorData getSignatureDataConst(int locationId) const;
|
SensorData getSignatureDataConst(int locationId, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
|
||||||
std::set<int> getAllSignatureIds() const;
|
std::set<int> getAllSignatureIds() const;
|
||||||
bool memoryChanged() const {return _memoryChanged;}
|
bool memoryChanged() const {return _memoryChanged;}
|
||||||
bool isIncremental() const {return _incrementalMemory;}
|
bool isIncremental() const {return _incrementalMemory;}
|
||||||
@@ -185,9 +223,8 @@ public:
|
|||||||
std::multimap<int, Link> & links,
|
std::multimap<int, Link> & links,
|
||||||
bool lookInDatabase = false);
|
bool lookInDatabase = false);
|
||||||
|
|
||||||
Transform computeTransform(Signature & fromS, Signature & toS, Transform guess, RegistrationInfo * info = 0) const;
|
Transform computeTransform(Signature & fromS, Signature & toS, Transform guess, RegistrationInfo * info = 0, bool useKnownCorrespondencesIfPossible = false) const;
|
||||||
Transform computeTransform(int fromId, int toId, Transform guess, RegistrationInfo * info = 0);
|
Transform computeTransform(int fromId, int toId, Transform guess, RegistrationInfo * info = 0, bool useKnownCorrespondencesIfPossible = false);
|
||||||
Transform computeIcpTransform(int fromId, int toId, Transform guess, RegistrationInfo * info = 0);
|
|
||||||
Transform computeIcpTransformMulti(
|
Transform computeIcpTransformMulti(
|
||||||
int newId,
|
int newId,
|
||||||
int oldId,
|
int oldId,
|
||||||
@@ -198,6 +235,7 @@ private:
|
|||||||
void preUpdate();
|
void preUpdate();
|
||||||
void addSignatureToStm(Signature * signature, const cv::Mat & covariance);
|
void addSignatureToStm(Signature * signature, const cv::Mat & covariance);
|
||||||
void clear();
|
void clear();
|
||||||
|
void loadDataFromDb(bool postInitClosingEvents);
|
||||||
void moveToTrash(Signature * s, bool keepLinkedToGraph = true, std::list<int> * deletedWords = 0);
|
void moveToTrash(Signature * s, bool keepLinkedToGraph = true, std::list<int> * deletedWords = 0);
|
||||||
|
|
||||||
void moveSignatureToWMFromSTM(int id, int * reducedTo = 0);
|
void moveSignatureToWMFromSTM(int id, int * reducedTo = 0);
|
||||||
@@ -235,6 +273,7 @@ private:
|
|||||||
bool _rawDescriptorsKept;
|
bool _rawDescriptorsKept;
|
||||||
bool _saveDepth16Format;
|
bool _saveDepth16Format;
|
||||||
bool _notLinkedNodesKeptInDb;
|
bool _notLinkedNodesKeptInDb;
|
||||||
|
bool _saveIntermediateNodeData;
|
||||||
bool _incrementalMemory;
|
bool _incrementalMemory;
|
||||||
bool _reduceGraph;
|
bool _reduceGraph;
|
||||||
int _maxStMemSize;
|
int _maxStMemSize;
|
||||||
@@ -244,14 +283,23 @@ private:
|
|||||||
bool _generateIds;
|
bool _generateIds;
|
||||||
bool _badSignaturesIgnored;
|
bool _badSignaturesIgnored;
|
||||||
bool _mapLabelsAdded;
|
bool _mapLabelsAdded;
|
||||||
|
bool _depthAsMask;
|
||||||
int _imagePreDecimation;
|
int _imagePreDecimation;
|
||||||
int _imagePostDecimation;
|
int _imagePostDecimation;
|
||||||
|
bool _compressionParallelized;
|
||||||
float _laserScanDownsampleStepSize;
|
float _laserScanDownsampleStepSize;
|
||||||
|
float _laserScanVoxelSize;
|
||||||
|
int _laserScanNormalK;
|
||||||
|
int _laserScanNormalRadius;
|
||||||
bool _reextractLoopClosureFeatures;
|
bool _reextractLoopClosureFeatures;
|
||||||
float _rehearsalMaxDistance;
|
float _rehearsalMaxDistance;
|
||||||
float _rehearsalMaxAngle;
|
float _rehearsalMaxAngle;
|
||||||
bool _rehearsalWeightIgnoredWhileMoving;
|
bool _rehearsalWeightIgnoredWhileMoving;
|
||||||
bool _useOdometryFeatures;
|
bool _useOdometryFeatures;
|
||||||
|
bool _createOccupancyGrid;
|
||||||
|
int _visMaxFeatures;
|
||||||
|
int _visCorType;
|
||||||
|
bool _imagesAlreadyRectified;
|
||||||
|
|
||||||
int _idCount;
|
int _idCount;
|
||||||
int _idMapCount;
|
int _idMapCount;
|
||||||
@@ -260,6 +308,7 @@ private:
|
|||||||
bool _memoryChanged; // False by default, become true only when Memory::update() is called.
|
bool _memoryChanged; // False by default, become true only when Memory::update() is called.
|
||||||
bool _linksChanged; // False by default, become true when links are modified.
|
bool _linksChanged; // False by default, become true when links are modified.
|
||||||
int _signaturesAdded;
|
int _signaturesAdded;
|
||||||
|
GPS _gpsOrigin;
|
||||||
|
|
||||||
std::map<int, Signature *> _signatures; // TODO : check if a signature is already added? although it is not supposed to occur...
|
std::map<int, Signature *> _signatures; // TODO : check if a signature is already added? although it is not supposed to occur...
|
||||||
std::set<int> _stMem; // id
|
std::set<int> _stMem; // id
|
||||||
@@ -273,7 +322,9 @@ private:
|
|||||||
bool _parallelized;
|
bool _parallelized;
|
||||||
|
|
||||||
Registration * _registrationPipeline;
|
Registration * _registrationPipeline;
|
||||||
RegistrationIcp * _registrationIcp;
|
RegistrationIcp * _registrationIcpMulti;
|
||||||
|
|
||||||
|
OccupancyGrid * _occupancy;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
147
corelib/include/rtabmap/core/OccupancyGrid.h
Normal file
147
corelib/include/rtabmap/core/OccupancyGrid.h
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2016, 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 CORELIB_SRC_OCCUPANCYGRID_H_
|
||||||
|
#define CORELIB_SRC_OCCUPANCYGRID_H_
|
||||||
|
|
||||||
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
|
|
||||||
|
#include <pcl/point_cloud.h>
|
||||||
|
#include <pcl/pcl_base.h>
|
||||||
|
#include <rtabmap/core/Parameters.h>
|
||||||
|
#include <rtabmap/core/Signature.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class RTABMAP_EXP OccupancyGrid
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
OccupancyGrid(const ParametersMap & parameters = ParametersMap());
|
||||||
|
void parseParameters(const ParametersMap & parameters);
|
||||||
|
void setMap(const cv::Mat & map, float xMin, float yMin, float cellSize, const std::map<int, Transform> & poses);
|
||||||
|
void setCellSize(float cellSize);
|
||||||
|
float getCellSize() const {return cellSize_;}
|
||||||
|
void setCloudAssembling(bool enabled);
|
||||||
|
float getMinMapSize() const {return minMapSize_;}
|
||||||
|
bool isGridFromDepth() const {return occupancyFromDepth_;}
|
||||||
|
bool isFullUpdate() const {return fullUpdate_;}
|
||||||
|
float getUpdateError() const {return updateError_;}
|
||||||
|
bool isMapFrameProjection() const {return projMapFrame_;}
|
||||||
|
const std::map<int, Transform> & addedNodes() const {return addedNodes_;}
|
||||||
|
int cacheSize() const {return (int)cache_.size();}
|
||||||
|
|
||||||
|
template<typename PointT>
|
||||||
|
typename pcl::PointCloud<PointT>::Ptr segmentCloud(
|
||||||
|
const typename pcl::PointCloud<PointT>::Ptr & cloud,
|
||||||
|
const pcl::IndicesPtr & indices,
|
||||||
|
const Transform & pose,
|
||||||
|
const cv::Point3f & viewPoint,
|
||||||
|
pcl::IndicesPtr & groundIndices, // output cloud indices
|
||||||
|
pcl::IndicesPtr & obstaclesIndices, // output cloud indices
|
||||||
|
pcl::IndicesPtr * flatObstacles = 0) const; // output cloud indices
|
||||||
|
|
||||||
|
void createLocalMap(
|
||||||
|
const Signature & node,
|
||||||
|
cv::Mat & groundCells,
|
||||||
|
cv::Mat & obstacleCells,
|
||||||
|
cv::Mat & emptyCells,
|
||||||
|
cv::Point3f & viewPoint) const;
|
||||||
|
|
||||||
|
void createLocalMap(
|
||||||
|
const LaserScan & cloud,
|
||||||
|
const Transform & pose,
|
||||||
|
cv::Mat & groundCells,
|
||||||
|
cv::Mat & obstacleCells,
|
||||||
|
cv::Mat & emptyCells,
|
||||||
|
cv::Point3f & viewPointInOut) const;
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
void addToCache(
|
||||||
|
int nodeId,
|
||||||
|
const cv::Mat & ground,
|
||||||
|
const cv::Mat & obstacles,
|
||||||
|
const cv::Mat & empty);
|
||||||
|
void update(const std::map<int, Transform> & poses);
|
||||||
|
cv::Mat getMap(float & xMin, float & yMin) const;
|
||||||
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & getMapGround() const {return assembledGround_;}
|
||||||
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & getMapObstacles() const {return assembledObstacles_;}
|
||||||
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & getMapEmptyCells() const {return assembledEmptyCells_;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
ParametersMap parameters_;
|
||||||
|
int cloudDecimation_;
|
||||||
|
float cloudMaxDepth_;
|
||||||
|
float cloudMinDepth_;
|
||||||
|
std::vector<float> roiRatios_;
|
||||||
|
float footprintLength_;
|
||||||
|
float footprintWidth_;
|
||||||
|
float footprintHeight_;
|
||||||
|
int scanDecimation_;
|
||||||
|
float cellSize_;
|
||||||
|
bool preVoxelFiltering_;
|
||||||
|
bool occupancyFromDepth_;
|
||||||
|
bool projMapFrame_;
|
||||||
|
float maxObstacleHeight_;
|
||||||
|
int normalKSearch_;
|
||||||
|
float maxGroundAngle_;
|
||||||
|
float clusterRadius_;
|
||||||
|
int minClusterSize_;
|
||||||
|
bool flatObstaclesDetected_;
|
||||||
|
float minGroundHeight_;
|
||||||
|
float maxGroundHeight_;
|
||||||
|
bool normalsSegmentation_;
|
||||||
|
bool grid3D_;
|
||||||
|
bool groundIsObstacle_;
|
||||||
|
float noiseFilteringRadius_;
|
||||||
|
int noiseFilteringMinNeighbors_;
|
||||||
|
bool scan2dUnknownSpaceFilled_;
|
||||||
|
bool rayTracing_;
|
||||||
|
bool fullUpdate_;
|
||||||
|
float minMapSize_;
|
||||||
|
bool erode_;
|
||||||
|
float footprintRadius_;
|
||||||
|
float updateError_;
|
||||||
|
|
||||||
|
std::map<int, std::pair<std::pair<cv::Mat, cv::Mat>, cv::Mat> > cache_; //<node id, < <ground, obstacles>, empty> >
|
||||||
|
cv::Mat map_;
|
||||||
|
cv::Mat mapInfo_;
|
||||||
|
std::map<int, std::pair<int, int> > cellCount_; //<node Id, cells>
|
||||||
|
float xMin_;
|
||||||
|
float yMin_;
|
||||||
|
std::map<int, Transform> addedNodes_;
|
||||||
|
|
||||||
|
bool cloudAssembling_;
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr assembledGround_;
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr assembledObstacles_;
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr assembledEmptyCells_;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <rtabmap/core/impl/OccupancyGrid.hpp>
|
||||||
|
|
||||||
|
#endif /* CORELIB_SRC_OCCUPANCYGRID_H_ */
|
||||||
238
corelib/include/rtabmap/core/OctoMap.h
Normal file
238
corelib/include/rtabmap/core/OctoMap.h
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2016, 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 SRC_OCTOMAP_H_
|
||||||
|
#define SRC_OCTOMAP_H_
|
||||||
|
|
||||||
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
|
|
||||||
|
#include <octomap/ColorOcTree.h>
|
||||||
|
#include <octomap/OcTreeKey.h>
|
||||||
|
|
||||||
|
#include <pcl/pcl_base.h>
|
||||||
|
#include <pcl/point_types.h>
|
||||||
|
|
||||||
|
#include <rtabmap/core/Transform.h>
|
||||||
|
#include <rtabmap/core/Parameters.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
// forward declaraton for "friend"
|
||||||
|
class RtabmapColorOcTree;
|
||||||
|
|
||||||
|
class RtabmapColorOcTreeNode : public octomap::ColorOcTreeNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum OccupancyType {kTypeUnknown=-1, kTypeEmpty=0, kTypeGround=1, kTypeObstacle=100};
|
||||||
|
|
||||||
|
public:
|
||||||
|
friend class RtabmapColorOcTree; // needs access to node children (inherited)
|
||||||
|
|
||||||
|
RtabmapColorOcTreeNode() : ColorOcTreeNode(), nodeRefId_(0), type_(kTypeUnknown) {}
|
||||||
|
RtabmapColorOcTreeNode(const RtabmapColorOcTreeNode& rhs) : ColorOcTreeNode(rhs), nodeRefId_(rhs.nodeRefId_), type_(rhs.type_) {}
|
||||||
|
|
||||||
|
void setNodeRefId(int nodeRefId) {nodeRefId_ = nodeRefId;}
|
||||||
|
void setOccupancyType(char type) {type_=type;}
|
||||||
|
void setPointRef(const octomap::point3d & point) {pointRef_ = point;}
|
||||||
|
int getNodeRefId() const {return nodeRefId_;}
|
||||||
|
int getOccupancyType() const {return type_;}
|
||||||
|
const octomap::point3d & getPointRef() const {return pointRef_;}
|
||||||
|
|
||||||
|
// following methods defined for octomap < 1.8 compatibility
|
||||||
|
RtabmapColorOcTreeNode* getChild(unsigned int i);
|
||||||
|
const RtabmapColorOcTreeNode* getChild(unsigned int i) const;
|
||||||
|
bool pruneNode();
|
||||||
|
void expandNode();
|
||||||
|
bool createChild(unsigned int i);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int nodeRefId_;
|
||||||
|
int type_; // -1=undefined, 0=empty, 100=obstacle, 1=ground
|
||||||
|
octomap::point3d pointRef_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Same as official ColorOctree but using RtabmapColorOcTreeNode, which is inheriting ColorOcTreeNode
|
||||||
|
class RtabmapColorOcTree : public octomap::OccupancyOcTreeBase <RtabmapColorOcTreeNode> {
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// Default constructor, sets resolution of leafs
|
||||||
|
RtabmapColorOcTree(double resolution);
|
||||||
|
|
||||||
|
/// virtual constructor: creates a new object of same type
|
||||||
|
/// (Covariant return type requires an up-to-date compiler)
|
||||||
|
RtabmapColorOcTree* create() const {return new RtabmapColorOcTree(resolution); }
|
||||||
|
|
||||||
|
std::string getTreeType() const {return "ColorOcTree";} // same type as ColorOcTree to be compatible with ROS OctoMap msg
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prunes a node when it is collapsible. This overloaded
|
||||||
|
* version only considers the node occupancy for pruning,
|
||||||
|
* different colors of child nodes are ignored.
|
||||||
|
* @return true if pruning was successful
|
||||||
|
*/
|
||||||
|
virtual bool pruneNode(RtabmapColorOcTreeNode* node);
|
||||||
|
|
||||||
|
virtual bool isNodeCollapsible(const RtabmapColorOcTreeNode* node) const;
|
||||||
|
|
||||||
|
// set node color at given key or coordinate. Replaces previous color.
|
||||||
|
RtabmapColorOcTreeNode* setNodeColor(const octomap::OcTreeKey& key, uint8_t r,
|
||||||
|
uint8_t g, uint8_t b);
|
||||||
|
|
||||||
|
RtabmapColorOcTreeNode* setNodeColor(float x, float y,
|
||||||
|
float z, uint8_t r,
|
||||||
|
uint8_t g, uint8_t b) {
|
||||||
|
octomap::OcTreeKey key;
|
||||||
|
if (!this->coordToKeyChecked(octomap::point3d(x,y,z), key)) return NULL;
|
||||||
|
return setNodeColor(key,r,g,b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// integrate color measurement at given key or coordinate. Average with previous color
|
||||||
|
RtabmapColorOcTreeNode* averageNodeColor(const octomap::OcTreeKey& key, uint8_t r,
|
||||||
|
uint8_t g, uint8_t b);
|
||||||
|
|
||||||
|
RtabmapColorOcTreeNode* averageNodeColor(float x, float y,
|
||||||
|
float z, uint8_t r,
|
||||||
|
uint8_t g, uint8_t b) {
|
||||||
|
octomap:: OcTreeKey key;
|
||||||
|
if (!this->coordToKeyChecked(octomap::point3d(x,y,z), key)) return NULL;
|
||||||
|
return averageNodeColor(key,r,g,b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// integrate color measurement at given key or coordinate. Average with previous color
|
||||||
|
RtabmapColorOcTreeNode* integrateNodeColor(const octomap::OcTreeKey& key, uint8_t r,
|
||||||
|
uint8_t g, uint8_t b);
|
||||||
|
|
||||||
|
RtabmapColorOcTreeNode* integrateNodeColor(float x, float y,
|
||||||
|
float z, uint8_t r,
|
||||||
|
uint8_t g, uint8_t b) {
|
||||||
|
octomap::OcTreeKey key;
|
||||||
|
if (!this->coordToKeyChecked(octomap::point3d(x,y,z), key)) return NULL;
|
||||||
|
return integrateNodeColor(key,r,g,b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// update inner nodes, sets color to average child color
|
||||||
|
void updateInnerOccupancy();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void updateInnerOccupancyRecurs(RtabmapColorOcTreeNode* node, unsigned int depth);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static member object which ensures that this OcTree's prototype
|
||||||
|
* ends up in the classIDMapping only once. You need this as a
|
||||||
|
* static member in any derived octree class in order to read .ot
|
||||||
|
* files through the AbstractOcTree factory. You should also call
|
||||||
|
* ensureLinking() once from the constructor.
|
||||||
|
*/
|
||||||
|
class StaticMemberInitializer{
|
||||||
|
public:
|
||||||
|
StaticMemberInitializer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dummy function to ensure that MSVC does not drop the
|
||||||
|
* StaticMemberInitializer, causing this tree failing to register.
|
||||||
|
* Needs to be called from the constructor of this octree.
|
||||||
|
*/
|
||||||
|
void ensureLinking() {};
|
||||||
|
};
|
||||||
|
/// static member to ensure static initialization (only once)
|
||||||
|
static StaticMemberInitializer RtabmapColorOcTreeMemberInit;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class RTABMAP_EXP OctoMap {
|
||||||
|
public:
|
||||||
|
static void HSVtoRGB(float *r, float *g, float *b, float h, float s, float v);
|
||||||
|
|
||||||
|
public:
|
||||||
|
OctoMap(const ParametersMap & parameters);
|
||||||
|
OctoMap(float cellSize = 0.1f, float occupancyThr = 0.5f, bool fullUpdate = false, float updateError=0.01f);
|
||||||
|
|
||||||
|
const std::map<int, Transform> & addedNodes() const {return addedNodes_;}
|
||||||
|
void addToCache(int nodeId,
|
||||||
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & ground,
|
||||||
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & obstacles,
|
||||||
|
const pcl::PointXYZ & viewPoint);
|
||||||
|
void addToCache(int nodeId,
|
||||||
|
const cv::Mat & ground,
|
||||||
|
const cv::Mat & obstacles,
|
||||||
|
const cv::Mat & empty,
|
||||||
|
const cv::Point3f & viewPoint);
|
||||||
|
void update(const std::map<int, Transform> & poses);
|
||||||
|
|
||||||
|
const RtabmapColorOcTree * octree() const {return octree_;}
|
||||||
|
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr createCloud(
|
||||||
|
unsigned int treeDepth = 0,
|
||||||
|
std::vector<int> * obstacleIndices = 0,
|
||||||
|
std::vector<int> * emptyIndices = 0,
|
||||||
|
std::vector<int> * groundIndices = 0,
|
||||||
|
bool originalRefPoints = true) const;
|
||||||
|
|
||||||
|
cv::Mat createProjectionMap(
|
||||||
|
float & xMin,
|
||||||
|
float & yMin,
|
||||||
|
float & gridCellSize,
|
||||||
|
float minGridSize = 0.0f,
|
||||||
|
unsigned int treeDepth = 0);
|
||||||
|
|
||||||
|
bool writeBinary(const std::string & path);
|
||||||
|
|
||||||
|
virtual ~OctoMap();
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
void getGridMin(double & x, double & y, double & z) const {x=minValues_[0];y=minValues_[1];z=minValues_[2];}
|
||||||
|
void getGridMax(double & x, double & y, double & z) const {x=maxValues_[0];y=maxValues_[1];z=maxValues_[2];}
|
||||||
|
|
||||||
|
void setMaxRange(float value) {rangeMax_ = value;}
|
||||||
|
void setRayTracing(bool enabled) {rayTracing_ = enabled;}
|
||||||
|
bool hasColor() const {return hasColor_;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void updateMinMax(const octomap::point3d & point);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::map<int, std::pair<std::pair<cv::Mat, cv::Mat>, cv::Mat> > cache_; // [id: < <ground, obstacles>, empty>]
|
||||||
|
std::map<int, std::pair<const pcl::PointCloud<pcl::PointXYZRGB>::Ptr, const pcl::PointCloud<pcl::PointXYZRGB>::Ptr> > cacheClouds_; // [id: <ground, obstacles>]
|
||||||
|
std::map<int, cv::Point3f> cacheViewPoints_;
|
||||||
|
RtabmapColorOcTree * octree_;
|
||||||
|
std::map<int, Transform> addedNodes_;
|
||||||
|
octomap::KeyRay keyRay_;
|
||||||
|
bool hasColor_;
|
||||||
|
bool fullUpdate_;
|
||||||
|
float updateError_;
|
||||||
|
float rangeMax_;
|
||||||
|
bool rayTracing_;
|
||||||
|
double minValues_[3];
|
||||||
|
double maxValues_[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace rtabmap */
|
||||||
|
|
||||||
|
#endif /* SRC_OCTOMAP_H_ */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
|
Copyright (c) 2010-2016, 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
|
||||||
@@ -44,8 +44,13 @@ class RTABMAP_EXP Odometry
|
|||||||
public:
|
public:
|
||||||
enum Type {
|
enum Type {
|
||||||
kTypeUndef = -1,
|
kTypeUndef = -1,
|
||||||
kTypeLocalMap = 0,
|
kTypeF2M = 0,
|
||||||
kTypeF2F = 1
|
kTypeF2F = 1,
|
||||||
|
kTypeFovis = 2,
|
||||||
|
kTypeViso2 = 3,
|
||||||
|
kTypeDVO = 4,
|
||||||
|
kTypeORBSLAM2 = 5,
|
||||||
|
kTypeOkvis = 6
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -55,12 +60,18 @@ public:
|
|||||||
public:
|
public:
|
||||||
virtual ~Odometry();
|
virtual ~Odometry();
|
||||||
Transform process(SensorData & data, OdometryInfo * info = 0);
|
Transform process(SensorData & data, OdometryInfo * info = 0);
|
||||||
|
Transform process(SensorData & data, const Transform & guess, OdometryInfo * info = 0);
|
||||||
virtual void reset(const Transform & initialPose = Transform::getIdentity());
|
virtual void reset(const Transform & initialPose = Transform::getIdentity());
|
||||||
|
virtual Odometry::Type getType() = 0;
|
||||||
|
virtual bool canProcessRawImages() const {return false;}
|
||||||
|
|
||||||
//getters
|
//getters
|
||||||
const Transform & getPose() const {return _pose;}
|
const Transform & getPose() const {return _pose;}
|
||||||
bool isInfoDataFilled() const {return _fillInfoData;}
|
bool isInfoDataFilled() const {return _fillInfoData;}
|
||||||
const Transform & previousVelocityTransform() const {return previousVelocityTransform_;}
|
const Transform & previousVelocityTransform() const {return previousVelocityTransform_;}
|
||||||
|
double previousStamp() const {return previousStamp_;}
|
||||||
|
unsigned int framesProcessed() const {return framesProcessed_;}
|
||||||
|
bool imagesAlreadyRectified() const {return _imagesAlreadyRectified;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual Transform computeTransform(SensorData & data, const Transform & guess = Transform(), OdometryInfo * info = 0) = 0;
|
virtual Transform computeTransform(SensorData & data, const Transform & guess = Transform(), OdometryInfo * info = 0) = 0;
|
||||||
@@ -84,12 +95,16 @@ private:
|
|||||||
float _kalmanProcessNoise;
|
float _kalmanProcessNoise;
|
||||||
float _kalmanMeasurementNoise;
|
float _kalmanMeasurementNoise;
|
||||||
int _imageDecimation;
|
int _imageDecimation;
|
||||||
|
bool _alignWithGround;
|
||||||
|
bool _publishRAMUsage;
|
||||||
|
bool _imagesAlreadyRectified;
|
||||||
Transform _pose;
|
Transform _pose;
|
||||||
int _resetCurrentCount;
|
int _resetCurrentCount;
|
||||||
double previousStamp_;
|
double previousStamp_;
|
||||||
Transform previousVelocityTransform_;
|
Transform previousVelocityTransform_;
|
||||||
Transform previousGroundTruthPose_;
|
Transform previousGroundTruthPose_;
|
||||||
float distanceTravelled_;
|
float distanceTravelled_;
|
||||||
|
unsigned int framesProcessed_;
|
||||||
|
|
||||||
std::vector<ParticleFilter *> particleFilters_;
|
std::vector<ParticleFilter *> particleFilters_;
|
||||||
cv::KalmanFilter kalmanFilter_;
|
cv::KalmanFilter kalmanFilter_;
|
||||||
|
|||||||
69
corelib/include/rtabmap/core/OdometryDVO.h
Normal file
69
corelib/include/rtabmap/core/OdometryDVO.h
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2016, 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 ODOMETRYDVO_H_
|
||||||
|
#define ODOMETRYDVO_H_
|
||||||
|
|
||||||
|
#include <rtabmap/core/Odometry.h>
|
||||||
|
|
||||||
|
namespace dvo {
|
||||||
|
class DenseTracker;
|
||||||
|
namespace core {
|
||||||
|
class RgbdImagePyramid;
|
||||||
|
class RgbdCameraPyramid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class RTABMAP_EXP OdometryDVO : public Odometry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
OdometryDVO(const rtabmap::ParametersMap & parameters = rtabmap::ParametersMap());
|
||||||
|
virtual ~OdometryDVO();
|
||||||
|
|
||||||
|
virtual void reset(const Transform & initialPose = Transform::getIdentity());
|
||||||
|
virtual Odometry::Type getType() {return Odometry::kTypeDVO;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual Transform computeTransform(SensorData & image, const Transform & guess = Transform(), OdometryInfo * info = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef RTABMAP_DVO
|
||||||
|
dvo::DenseTracker * dvo_;
|
||||||
|
dvo::core::RgbdImagePyramid * reference_;
|
||||||
|
dvo::core::RgbdCameraPyramid * camera_;
|
||||||
|
bool lost_;
|
||||||
|
#endif
|
||||||
|
Transform motionFromKeyFrame_;
|
||||||
|
Transform previousLocalTransform_;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ODOMETRYDVO_H_ */
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user