mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-17 00:37:45 +08:00
Compare commits
705
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e09a872fa2 | ||
|
|
cdbdc36c94 | ||
|
|
8cb923b332 | ||
|
|
ec943198f0 | ||
|
|
4c8af6d6e9 | ||
|
|
d5d00fbd7d | ||
|
|
e887d462ce | ||
|
|
cd6e51a968 | ||
|
|
71f7515775 | ||
|
|
f8a8e55e7e | ||
|
|
cbca362cc4 | ||
|
|
750ad5bd44 | ||
|
|
e03a9b3003 | ||
|
|
d4b4379829 | ||
|
|
5b5b594f4a | ||
|
|
e6f471d88e | ||
|
|
0fd69f22d4 | ||
|
|
cc95ca1cf6 | ||
|
|
4675240d6e | ||
|
|
630b565cd4 | ||
|
|
125d532e95 | ||
|
|
195f6147ad | ||
|
|
cd2c261e2b | ||
|
|
38a83c0cd9 | ||
|
|
a5350c4891 | ||
|
|
f9b7b54454 | ||
|
|
1a71406f84 | ||
|
|
f1ae4002aa | ||
|
|
d4585960fc | ||
|
|
191de5baea | ||
|
|
ef2c68d768 | ||
|
|
a0f74eaee2 | ||
|
|
8a6c0dad00 | ||
|
|
bc2f89e66f | ||
|
|
23602935e1 | ||
|
|
aaefdae794 | ||
|
|
38cdc76790 | ||
|
|
a668ec35ab | ||
|
|
7acaac7a6d | ||
|
|
428d5be129 | ||
|
|
2de553ba02 | ||
|
|
77ae8e108a | ||
|
|
e7b3a7735d | ||
|
|
9b63297a6b | ||
|
|
ae12caff04 | ||
|
|
61098be315 | ||
|
|
727e4fe672 | ||
|
|
fc9c762516 | ||
|
|
35933cafba | ||
|
|
09ced82c9f | ||
|
|
81313c32ee | ||
|
|
8c92ed25e5 | ||
|
|
80ef0e1a75 | ||
|
|
73e15ee93d | ||
|
|
7cd7ce3b41 | ||
|
|
6f4dce52fc | ||
|
|
ae3d651e83 | ||
|
|
0f552b4b65 | ||
|
|
7a52f316f9 | ||
|
|
3cafdf911b | ||
|
|
24a4d91ee8 | ||
|
|
b2fe138dbf | ||
|
|
e8e3649f24 | ||
|
|
c0a7c3a344 | ||
|
|
9c1c88d35e | ||
|
|
c44349511d | ||
|
|
0c8194373f | ||
|
|
c8db45b2a4 | ||
|
|
a0a566140c | ||
|
|
977f8eb262 | ||
|
|
8edd85a9df | ||
|
|
f1f0c39be8 | ||
|
|
cf4db63226 | ||
|
|
d85c1c3bcf | ||
|
|
884d1d7684 | ||
|
|
45fa968076 | ||
|
|
530da08145 | ||
|
|
c272f9538a | ||
|
|
0ee4d6084b | ||
|
|
ebf74e3c98 | ||
|
|
e1290524af | ||
|
|
06ba3cfd73 | ||
|
|
222db70cf6 | ||
|
|
eef47e1681 | ||
|
|
17521e8efb | ||
|
|
d089e95e5a | ||
|
|
e635f35cf1 | ||
|
|
5f54bd13bb | ||
|
|
f27da7c8a5 | ||
|
|
49a41d7e46 | ||
|
|
2863060ded | ||
|
|
75025895b8 | ||
|
|
d6ca37a9e7 | ||
|
|
08f3e6c08e | ||
|
|
dd5e09be37 | ||
|
|
caf165a635 | ||
|
|
15ca0da89e | ||
|
|
3e71b3fe69 | ||
|
|
5839ccbeb5 | ||
|
|
38b8746507 | ||
|
|
99944b1d49 | ||
|
|
1752b55678 | ||
|
|
6fc884b575 | ||
|
|
c8cd745f81 | ||
|
|
c85ff90477 | ||
|
|
0c24786912 | ||
|
|
d647fd7743 | ||
|
|
5eb9bbe283 | ||
|
|
f8b7421b59 | ||
|
|
76ef2c4b0e | ||
|
|
0192cac18a | ||
|
|
ccaf15fc41 | ||
|
|
f50018776f | ||
|
|
c13267599e | ||
|
|
d45b77c0b7 | ||
|
|
479fb6cbca | ||
|
|
95f48b694e | ||
|
|
9da2c1918f | ||
|
|
42c8ed0c0f | ||
|
|
d63f9e736e | ||
|
|
2a8e5be361 | ||
|
|
bf5d2b7f04 | ||
|
|
18c35954f0 | ||
|
|
36d7e58ff2 | ||
|
|
0f8c70bcdf | ||
|
|
248d6f1167 | ||
|
|
35974d55bd | ||
|
|
5548f33e06 | ||
|
|
a909461535 | ||
|
|
698293e2d8 | ||
|
|
22d631d7aa | ||
|
|
be75c7591c | ||
|
|
c21f466573 | ||
|
|
308b1484e0 | ||
|
|
8beea1984e | ||
|
|
cebecc3fc3 | ||
|
|
81c4382349 | ||
|
|
b7f2eb8df9 | ||
|
|
97f956f138 | ||
|
|
6bd9dd55b7 | ||
|
|
6e8913091d | ||
|
|
85f0ab829a | ||
|
|
73004c643c | ||
|
|
ccbc802fe6 | ||
|
|
73378c4d56 | ||
|
|
986db04cb9 | ||
|
|
de32e53868 | ||
|
|
200ec8e5db | ||
|
|
b771aa00e0 | ||
|
|
26b33b12af | ||
|
|
f0ea8ab076 | ||
|
|
abbcc4f8a9 | ||
|
|
8a8f46c325 | ||
|
|
d2813ed70b | ||
|
|
0167687c6b | ||
|
|
ca27dbd2fe | ||
|
|
b862d6bc48 | ||
|
|
5ae2f487b4 | ||
|
|
283c1df00c | ||
|
|
bf2a9db5e4 | ||
|
|
963aea5c0d | ||
|
|
9efd7c14fc | ||
|
|
227f8c4f86 | ||
|
|
be498b4cb7 | ||
|
|
015c442f1c | ||
|
|
be1532b809 | ||
|
|
8333677dc6 | ||
|
|
3bb874825f | ||
|
|
c43bd6cd3f | ||
|
|
5159171bf3 | ||
|
|
c5057eb6b3 | ||
|
|
433e20869c | ||
|
|
0c4a91df8a | ||
|
|
71ae076b44 | ||
|
|
1784a0877f | ||
|
|
09a63bbc5b | ||
|
|
4f1deef971 | ||
|
|
c2b1a9fbd7 | ||
|
|
9d62d04459 | ||
|
|
d02bb9af5d | ||
|
|
f670f71d47 | ||
|
|
b96bc2a240 | ||
|
|
8eda6cbdf0 | ||
|
|
f05eefd80c | ||
|
|
4bfa1c2752 | ||
|
|
961549d375 | ||
|
|
4e3e5872fc | ||
|
|
de7ceb91dd | ||
|
|
d62dcdd29a | ||
|
|
8087774961 | ||
|
|
fad1993a01 | ||
|
|
53513b6632 | ||
|
|
bb4164a05d | ||
|
|
69f3116158 | ||
|
|
e57b722ce2 | ||
|
|
a43eccdac8 | ||
|
|
12a7349165 | ||
|
|
1ef61db73b | ||
|
|
c14e20330f | ||
|
|
299bec15ff | ||
|
|
8e99291e13 | ||
|
|
8701ae6de0 | ||
|
|
d2c406f019 | ||
|
|
d2abc3a237 | ||
|
|
3bc8fc4c11 | ||
|
|
93a3a667c8 | ||
|
|
39e1d45369 | ||
|
|
cc91208057 | ||
|
|
5d54c0e26c | ||
|
|
5fc9f859ce | ||
|
|
4c7b565391 | ||
|
|
f1546c1fca | ||
|
|
b2c012d8bc | ||
|
|
42c60c7154 | ||
|
|
444b511548 | ||
|
|
527cbddb4b | ||
|
|
7fdd212462 | ||
|
|
9f31830f03 | ||
|
|
e4098cb54b | ||
|
|
aa13ea1a80 | ||
|
|
b717910db8 | ||
|
|
16309e6d18 | ||
|
|
a1079761e7 | ||
|
|
6b5990aa04 | ||
|
|
ae08adb8bd | ||
|
|
711184c465 | ||
|
|
b5dec56eaf | ||
|
|
0059a4bc1b | ||
|
|
eb38b9cfab | ||
|
|
459f0b7fa0 | ||
|
|
db3b901063 | ||
|
|
8b055752aa | ||
|
|
dbb9cfa77a | ||
|
|
95e87fed14 | ||
|
|
02fdd677cf | ||
|
|
3b74534567 | ||
|
|
790b0e5cf7 | ||
|
|
5e08da51aa | ||
|
|
0c2287df77 | ||
|
|
b581a62c89 | ||
|
|
c341648a44 | ||
|
|
f903ffb927 | ||
|
|
124543c57d | ||
|
|
829f05e2fb | ||
|
|
d936b2d35a | ||
|
|
84a8e5830e | ||
|
|
eedc68c360 | ||
|
|
0cf37fbbf1 | ||
|
|
5f6dd0846d | ||
|
|
3c15563569 | ||
|
|
1f985ddef0 | ||
|
|
43e144e7b6 | ||
|
|
9c70b7116b | ||
|
|
3c1095be65 | ||
|
|
89f27e84d0 | ||
|
|
f64a5e75d5 | ||
|
|
94178c8cde | ||
|
|
30290c36d7 | ||
|
|
956f07785b | ||
|
|
3e6f14f3bd | ||
|
|
7cb39f02f2 | ||
|
|
c105804572 | ||
|
|
f498cf1b1a | ||
|
|
c0a2efe7e2 | ||
|
|
080d044c99 | ||
|
|
cbf14bfa08 | ||
|
|
110f4a99ee | ||
|
|
63af05ef88 | ||
|
|
0c790005b2 | ||
|
|
3ce6de573d | ||
|
|
67aa4cd28e | ||
|
|
c18f3cd539 | ||
|
|
9e13d5600a | ||
|
|
35d5200a3b | ||
|
|
e0858a9c2a | ||
|
|
b8847fd006 | ||
|
|
714d95cc34 | ||
|
|
5e60a2596c | ||
|
|
f281db8dd0 | ||
|
|
7f09a9e0cb | ||
|
|
fe52060de7 | ||
|
|
d5128ddc18 | ||
|
|
f938e8ce29 | ||
|
|
a0342671ac | ||
|
|
e03da92a90 | ||
|
|
4d5b42ab79 | ||
|
|
b63590bf1d | ||
|
|
cfdee23d33 | ||
|
|
60499e895f | ||
|
|
ddacee6d8b | ||
|
|
ae226cb1a2 | ||
|
|
a7e70ab80b | ||
|
|
e95cabb1fc | ||
|
|
173bd49a26 | ||
|
|
9ae47b79f9 | ||
|
|
15e09cd0a8 | ||
|
|
89a0eb506b | ||
|
|
4632c7650f | ||
|
|
281452434c | ||
|
|
ccdde45323 | ||
|
|
a3e13b8e72 | ||
|
|
35bc2d06a6 | ||
|
|
ee00f81b5b | ||
|
|
974db316ce | ||
|
|
d41c15dbc7 | ||
|
|
41d5e11511 | ||
|
|
c8100e1464 | ||
|
|
b783df397a | ||
|
|
62a64cd156 | ||
|
|
675da6201a | ||
|
|
d447329bf1 | ||
|
|
10b452197d | ||
|
|
973bf93c77 | ||
|
|
c91431410e | ||
|
|
a3bdb027e7 | ||
|
|
502d5e75e8 | ||
|
|
eb4de8e724 | ||
|
|
2060e0b1da | ||
|
|
dfcd7ae1a8 | ||
|
|
c6d893bc98 | ||
|
|
f638add755 | ||
|
|
9f22a2b1f8 | ||
|
|
432b0dc6f6 | ||
|
|
7424a1f463 | ||
|
|
0bf83c0cd6 | ||
|
|
230e6a311d | ||
|
|
26c004eee0 | ||
|
|
1914275fa8 | ||
|
|
055cccd151 | ||
|
|
b6b0b9a984 | ||
|
|
0fc97c28c6 | ||
|
|
11c34d383d | ||
|
|
c68dde70ec | ||
|
|
124d78fefd | ||
|
|
d34a529116 | ||
|
|
4df9ac995a | ||
|
|
4149be47e0 | ||
|
|
b7da3f7a97 | ||
|
|
206c4fe09c | ||
|
|
df7539a48e | ||
|
|
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 | ||
|
|
a2a8638f28 | ||
|
|
58e6424bf7 | ||
|
|
d2255adc4e | ||
|
|
7f8ca64f64 | ||
|
|
104c1e6945 |
+137
@@ -0,0 +1,137 @@
|
|||||||
|
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
- devel
|
||||||
|
|
||||||
|
os: Visual Studio 2015
|
||||||
|
|
||||||
|
clone_folder: c:\projects\rtabmap
|
||||||
|
|
||||||
|
platform: x64
|
||||||
|
configuration: Release
|
||||||
|
|
||||||
|
init:
|
||||||
|
- cmake --version
|
||||||
|
- call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64
|
||||||
|
- call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64
|
||||||
|
|
||||||
|
install:
|
||||||
|
# Qt
|
||||||
|
- set QTDIR=C:\Qt\5.10.1\msvc2015_64
|
||||||
|
# make sure Qt bin path is before cmake bin path to avoid copying qt5 dlls from cmake before qt installation
|
||||||
|
- set PATH=%QTDIR%\bin;%PATH%
|
||||||
|
# Boost
|
||||||
|
- set PATH=%PATH%;C:\Libraries\boost_1_62_0\lib64-msvc-14.0
|
||||||
|
# Openni2
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/d98jv79l6oy9fxz/OpenNI2.exe?dl=0' -outfile OpenNI2.exe
|
||||||
|
- cmd: OpenNI2.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed OpenNI2:"
|
||||||
|
- ps: "ls \"C:/Program Files/OpenNI2\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\OpenNI2\Redist
|
||||||
|
- set OPENNI2_INCLUDE64=C:\Program Files\OpenNI2\Include
|
||||||
|
- set OPENNI2_LIB64=C:\Program Files\OpenNI2\Lib
|
||||||
|
- set OPENNI2_REDIST64=C:\Program Files\OpenNI2\Redist
|
||||||
|
# OpenCV
|
||||||
|
#- 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
|
||||||
|
- ps: wget 'http://kent.dl.sourceforge.net/project/opencvlibrary/opencv-win/2.4.13/opencv-2.4.13.6-vc14.exe' -outfile opencv-2.4.13.6-vc14.exe
|
||||||
|
- cmd: opencv-2.4.13.6-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
|
||||||
|
# VTK (including QVTK)
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/1l33b5l3f3y52gf/VTK-6_3-msvc140.exe?dl=0' -outfile VTK-6_3.exe
|
||||||
|
- cmd: VTK-6_3.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed VTK:"
|
||||||
|
- ps: "ls \"C:/Program Files/VTK\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\VTK\bin
|
||||||
|
# QHull
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/9widnk9msdsh2b8/Qhull-msvc140.exe?dl=0' -outfile Qhull.exe
|
||||||
|
- cmd: Qhull.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed QHull:"
|
||||||
|
- ps: "ls \"C:/Program Files/Qhull\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\Qhull\bin
|
||||||
|
# FLANN
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/7k58jbmqa51sxmh/FLANN-msvc140.exe?dl=0' -outfile FLANN.exe
|
||||||
|
- cmd: FLANN.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed FLANN:"
|
||||||
|
- ps: "ls \"C:/Program Files/FLANN\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\FLANN\bin
|
||||||
|
# Eigen
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/3v6i9i8dxj4o8ji/Eigen.exe?dl=0' -outfile Eigen.exe
|
||||||
|
- cmd: Eigen.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed Eigen:"
|
||||||
|
- ps: "ls \"C:/Program Files/Eigen\""
|
||||||
|
# PCL
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/2iayr4lyqa50i9j/PCL_181_August2018_x64_vc14.exe?dl=0' -outfile PCL_1.8.1.exe
|
||||||
|
- cmd: PCL_1.8.1.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed PCL:"
|
||||||
|
- ps: "ls \"C:/Program Files/PCL\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\PCL\bin
|
||||||
|
# zlib
|
||||||
|
- ps: wget 'https://docs.google.com/uc?authuser=0&id=0B46akLGdg-uaYm9MTTI4MUtUcmc&export=download' -outfile zlib-1.2.8-vc2010-x64.zip
|
||||||
|
- ps: Expand-Archive zlib-1.2.8-vc2010-x64.zip -DestinationPath 'C:\Program Files'
|
||||||
|
- ECHO "Installed zlib:"
|
||||||
|
- ps: "ls \"C:/Program Files/zlib\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\zlib\bin
|
||||||
|
# g2o
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/ht74s5pa21wokzw/g2o.exe?dl=0' -outfile g2o.exe
|
||||||
|
- cmd: g2o.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed g2o:"
|
||||||
|
- ps: "ls \"C:/Program Files/g2o\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\g2o\bin
|
||||||
|
# GTSAM
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/0fpr6r4cgsqmvhf/GTSAM-4_0_0_alpha2-msvc140.exe?dl=0' -outfile GTSAM.exe
|
||||||
|
- cmd: GTSAM.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed GTSAM:"
|
||||||
|
- ps: "ls \"C:/Program Files/GTSAM\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\GTSAM\bin
|
||||||
|
# OctoMap
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/6jpxu0nm8ne6e54/octomap_x64_vc14.exe?dl=0' -outfile octomap.exe
|
||||||
|
- cmd: octomap.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed OctoMap:"
|
||||||
|
- ps: "ls \"C:/Program Files/octomap-distribution\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\octomap-distribution\bin
|
||||||
|
# CPU-TSDF
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/mgges9va1uzxr0q/cpu_tsdf_sept2015_x64_vc14.exe?dl=0' -outfile cpu_tsdf.exe
|
||||||
|
- cmd: cpu_tsdf.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed CPU-TSDF:"
|
||||||
|
- ps: "ls \"C:/Program Files/cpu_tsdf\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\cpu_tsdf\bin
|
||||||
|
# Open Chisel
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/0aaphcde4acrinm/open_chisel_x64_vc14.exe?dl=0' -outfile open_chisel.exe
|
||||||
|
- cmd: open_chisel.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed Open Chisel:"
|
||||||
|
- ps: "ls \"C:/Program Files/open_chisel\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\open_chisel\bin
|
||||||
|
# cvsba
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/4ey8ergerx46zvj/cvsba_x64_vc14.exe?dl=0' -outfile cvsba.exe
|
||||||
|
- cmd: cvsba.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed cvsba:"
|
||||||
|
- ps: "ls \"C:/Program Files/cvsba\""
|
||||||
|
- set PATH=%PATH%;C:\Program Files\cvsba\bin
|
||||||
|
- ps: wget 'https://dl.dropboxusercontent.com/s/22qfvftwj6zq8tj/yaml-cpp_x64_vc14.exe?dl=0' -outfile yaml-cpp.exe
|
||||||
|
- cmd: yaml-cpp.exe -o"C:\Program Files" -y
|
||||||
|
- ECHO "Installed yaml-cpp:"
|
||||||
|
- ps: "ls \"C:/Program Files/yaml-cpp\""
|
||||||
|
|
||||||
|
before_build:
|
||||||
|
- cd c:\projects\rtabmap\build
|
||||||
|
- ECHO %PROGRAMFILES%
|
||||||
|
- ECHO %PATH%
|
||||||
|
- cmake -G "Visual Studio 14 2015 Win64" -DOpenCV_DIR="C:\Program Files\opencv\build" -DPCL_DIR="C:\Program Files\PCL\cmake" -DCPUTSDF_DIR="C:\Program Files\cpu_tsdf\share\cpu_tsdf" -Dcvsba_DIR="C:\Program Files\cvsba\lib\cmake" -Dyaml-cpp_DIR="C:\Program Files\yaml-cpp\CMake" -DBUILD_AS_BUNDLE=ON ..
|
||||||
|
|
||||||
|
after_build :
|
||||||
|
- cmake --build . --config Release --target package
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
- path: build\RTABMap-*
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
- provider: Email
|
||||||
|
to:
|
||||||
|
- matlabbe@gmail.com
|
||||||
|
on_build_success: false
|
||||||
|
on_build_failure: false
|
||||||
|
on_build_status_changed: true
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
/lib
|
/lib
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.settings/language.settings.xml
|
.settings/language.settings.xml
|
||||||
|
.idea/
|
||||||
|
.vscode
|
||||||
|
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,11 +14,13 @@ 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 update && sudo apt-get install dpkg
|
||||||
- sudo apt-get -y install libpcl-1.7-all libfreenect-dev ros-indigo-libg2o ros-indigo-octomap libopenni2-dev
|
- sudo apt-get -y install libpcl-1.7-all libfreenect-dev ros-indigo-libg2o ros-indigo-octomap libopenni2-dev
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
|||||||
+499
-98
@@ -20,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 12)
|
SET(RTABMAP_MINOR_VERSION 19)
|
||||||
SET(RTABMAP_PATCH_VERSION 5)
|
SET(RTABMAP_PATCH_VERSION 3)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
@@ -43,28 +43,35 @@ ENDIF(${CMAKE_GENERATOR} MATCHES ".*Makefiles")
|
|||||||
|
|
||||||
IF(NOT ANDROID)
|
IF(NOT ANDROID)
|
||||||
SET(CMAKE_DEBUG_POSTFIX "d")
|
SET(CMAKE_DEBUG_POSTFIX "d")
|
||||||
ENDIF(NOT ANDROID)
|
option(FLANN_KDTREE_MEM_OPT "Disable multi-threaded FLANN kd-tree to minimize memory allocations" OFF)
|
||||||
|
ELSE()
|
||||||
|
option(FLANN_KDTREE_MEM_OPT "Disable multi-threaded FLANN kd-tree to minimize memory allocations" ON)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(FLANN_KDTREE_MEM_OPT)
|
||||||
|
ADD_DEFINITIONS("-DFLANN_KDTREE_MEM_OPT")
|
||||||
|
ENDIF(FLANN_KDTREE_MEM_OPT)
|
||||||
|
|
||||||
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)
|
if(POLICY CMP0020)
|
||||||
cmake_policy(SET CMP0020 OLD)
|
cmake_policy(SET CMP0020 OLD)
|
||||||
endif()
|
endif()
|
||||||
if(POLICY CMP0043)
|
if(POLICY CMP0043)
|
||||||
cmake_policy(SET CMP0043 OLD)
|
cmake_policy(SET CMP0043 OLD)
|
||||||
endif()
|
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
|
||||||
@@ -85,6 +92,17 @@ IF(CMAKE_COMPILER_IS_GNUCXX)
|
|||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmessage-length=0")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmessage-length=0")
|
||||||
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
|
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
if(MSVC_VERSION GREATER 1500 AND ${CMAKE_VERSION} VERSION_GREATER "2.8.6")
|
||||||
|
include(ProcessorCount)
|
||||||
|
ProcessorCount(N)
|
||||||
|
if(NOT N EQUAL 0)
|
||||||
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP${N}")
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP${N}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# [Eclipse] Automatic Discovery of Include directories (Optional, but handy)
|
# [Eclipse] Automatic Discovery of Include directories (Optional, but handy)
|
||||||
#SET(CMAKE_VERBOSE_MAKEFILE ON)
|
#SET(CMAKE_VERBOSE_MAKEFILE ON)
|
||||||
|
|
||||||
@@ -113,20 +131,27 @@ 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 #######
|
||||||
IF(APPLE)
|
|
||||||
OPTION(BUILD_AS_BUNDLE "Set to ON to build as bundle (DragNDrop)" OFF)
|
# ANDROID_PREBUILD (early exit if true)
|
||||||
ENDIF(APPLE)
|
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 OR WIN32)
|
||||||
|
OPTION(BUILD_AS_BUNDLE "Set to ON to build as bundle with all embedded dependencies (DragNDrop for Mac, installer for Windows)" OFF)
|
||||||
|
ENDIF(APPLE OR WIN32)
|
||||||
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)
|
||||||
@@ -137,8 +162,10 @@ option(WITH_QT "Include Qt support" OFF)
|
|||||||
ELSE()
|
ELSE()
|
||||||
option(WITH_QT "Include Qt support" ON)
|
option(WITH_QT "Include Qt support" ON)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
option(WITH_ORB_OCTREE "Include ORB Octree feature support" ON)
|
||||||
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)
|
||||||
@@ -146,20 +173,56 @@ 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_LOAM "Include LOAM 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_ZED "Include ZED sdk support" ON)
|
||||||
option(WITH_REALSENSE "Include RealSense support" ON)
|
option(WITH_REALSENSE "Include RealSense support" ON)
|
||||||
option(WITH_REALSENSE_SLAM "Include RealSenseSlam support" ON)
|
option(WITH_REALSENSE_SLAM "Include RealSenseSlam support" ON)
|
||||||
|
option(WITH_REALSENSE2 "Include RealSense support" ON)
|
||||||
option(WITH_OCTOMAP "Include Octomap support" ON)
|
option(WITH_OCTOMAP "Include Octomap support" ON)
|
||||||
option(WITH_CPUTSDF "Include CPUTSDF 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(WITH_MSCKF_VIO "Include MSCKF_VIO support" OFF)
|
||||||
|
option(WITH_VINS "Include VINS-Fusion support" ON)
|
||||||
|
option(WITH_MADGWICK "Include Madgwick IMU filtering support" ON)
|
||||||
option(PCL_OMP "With PCL OMP implementations" 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_COMPILE_OPTIONS)
|
||||||
|
if("${PCL_COMPILE_OPTIONS}" MATCHES "-march=native")
|
||||||
|
MESSAGE(WARNING "PCL compile options 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 compile options 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()
|
||||||
|
else()
|
||||||
|
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()
|
||||||
|
endif()
|
||||||
|
|
||||||
FIND_PACKAGE(ZLIB REQUIRED QUIET)
|
FIND_PACKAGE(ZLIB REQUIRED QUIET)
|
||||||
|
|
||||||
# fix libproj.so not found on Xenial
|
FIND_PACKAGE(Sqlite3 QUIET)
|
||||||
|
IF(Sqlite3_FOUND)
|
||||||
|
MESSAGE(STATUS "Found Sqlite3: ${Sqlite3_INCLUDE_DIRS} ${Sqlite3_LIBRARIES}")
|
||||||
|
ENDIF(Sqlite3_FOUND)
|
||||||
|
|
||||||
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()
|
||||||
|
|
||||||
@@ -171,6 +234,7 @@ endif()
|
|||||||
if(OPENMP_FOUND)
|
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}")
|
||||||
|
set(CMAKE_INSTALL_OPENMP_LIBRARIES TRUE)
|
||||||
message (STATUS "Found OpenMP")
|
message (STATUS "Found OpenMP")
|
||||||
if(PCL_OMP)
|
if(PCL_OMP)
|
||||||
add_definitions(-DPCL_OMP)
|
add_definitions(-DPCL_OMP)
|
||||||
@@ -201,12 +265,12 @@ IF(WITH_QT)
|
|||||||
IF("${VTK_MAJOR_VERSION}" GREATER 5)
|
IF("${VTK_MAJOR_VERSION}" GREATER 5)
|
||||||
FIND_PACKAGE(Qt5 COMPONENTS Widgets Core Gui QUIET)
|
FIND_PACKAGE(Qt5 COMPONENTS Widgets Core Gui QUIET)
|
||||||
IF(Qt5_FOUND)
|
IF(Qt5_FOUND)
|
||||||
FIND_PACKAGE(Qt5 COMPONENTS Widgets Core Gui Svg)
|
FIND_PACKAGE(Qt5 COMPONENTS Widgets Core Gui OPTIONAL_COMPONENTS Svg)
|
||||||
ENDIF(Qt5_FOUND)
|
ENDIF(Qt5_FOUND)
|
||||||
ENDIF("${VTK_MAJOR_VERSION}" GREATER 5)
|
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)
|
||||||
@@ -218,7 +282,12 @@ IF(WITH_QT)
|
|||||||
SET(PCL_LIBRARIES "${PCL_LIBRARIES};vtkGUISupportQt")
|
SET(PCL_LIBRARIES "${PCL_LIBRARIES};vtkGUISupportQt")
|
||||||
SET(ADD_VTK_GUI_SUPPORT_QT_TO_CONF TRUE)
|
SET(ADD_VTK_GUI_SUPPORT_QT_TO_CONF TRUE)
|
||||||
ENDIF(value EQUAL -1)
|
ENDIF(value EQUAL -1)
|
||||||
|
MESSAGE(STATUS "VTK_RENDERING_BACKEND=${VTK_RENDERING_BACKEND}")
|
||||||
|
IF(VTK_RENDERING_BACKEND STREQUAL "OpenGL2")
|
||||||
|
ADD_DEFINITIONS("-DVTK_OPENGL2")
|
||||||
|
ENDIF(VTK_RENDERING_BACKEND STREQUAL "OpenGL2")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
ADD_DEFINITIONS(-DQT_NO_KEYWORDS) # To avoid conflicts with boost signals/foreach and Qt macros
|
||||||
ENDIF(QT4_FOUND OR Qt5_FOUND)
|
ENDIF(QT4_FOUND OR Qt5_FOUND)
|
||||||
ENDIF(WITH_QT)
|
ENDIF(WITH_QT)
|
||||||
|
|
||||||
@@ -232,21 +301,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)
|
# Explicitly link to OpenCL (in case of CUDA installed)
|
||||||
FIND_PACKAGE(OpenCL QUIET)
|
FIND_PACKAGE(OpenCL QUIET)
|
||||||
IF(OpenCL_FOUND)
|
IF(OpenCL_FOUND)
|
||||||
SET(freenect2_LIBRARIES
|
SET(freenect2_LIBRARIES
|
||||||
${OpenCL_LIBRARIES}
|
${OpenCL_LIBRARIES}
|
||||||
${freenect2_LIBRARIES}
|
${freenect2_LIBRARIES}
|
||||||
)
|
)
|
||||||
ENDIF(OpenCL_FOUND)
|
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)
|
||||||
@@ -270,7 +346,8 @@ IF(WITH_G2O)
|
|||||||
ENDIF(WITH_G2O)
|
ENDIF(WITH_G2O)
|
||||||
|
|
||||||
IF(WITH_GTSAM)
|
IF(WITH_GTSAM)
|
||||||
FIND_PACKAGE(GTSAM QUIET)
|
# Force config mode to ignore PCL's findGTSAM.cmake file
|
||||||
|
FIND_PACKAGE(GTSAM CONFIG QUIET)
|
||||||
ENDIF(WITH_GTSAM)
|
ENDIF(WITH_GTSAM)
|
||||||
|
|
||||||
IF(WITH_FLYCAPTURE2)
|
IF(WITH_FLYCAPTURE2)
|
||||||
@@ -281,47 +358,48 @@ IF(WITH_FLYCAPTURE2)
|
|||||||
ENDIF(WITH_FLYCAPTURE2)
|
ENDIF(WITH_FLYCAPTURE2)
|
||||||
|
|
||||||
IF(WITH_CVSBA)
|
IF(WITH_CVSBA)
|
||||||
FIND_PACKAGE(cvsba QUIET)
|
FIND_PACKAGE(cvsba QUIET)
|
||||||
IF(cvsba_FOUND)
|
IF(cvsba_FOUND)
|
||||||
MESSAGE(STATUS "Found cvsba: ${cvsba_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found cvsba: ${cvsba_INCLUDE_DIRS}")
|
||||||
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)
|
||||||
|
|
||||||
|
IF(WITH_LOAM)
|
||||||
|
find_package(loam_velodyne QUIET)
|
||||||
|
IF(loam_velodyne_FOUND)
|
||||||
|
MESSAGE(STATUS "Found loam_velodyne: ${loam_velodyne_INCLUDE_DIRS}")
|
||||||
|
ENDIF(loam_velodyne_FOUND)
|
||||||
|
ENDIF(WITH_LOAM)
|
||||||
|
|
||||||
|
SET(ZED_FOUND FALSE)
|
||||||
IF(WITH_ZED)
|
IF(WITH_ZED)
|
||||||
IF(WIN32) # Windows
|
find_package(ZED 2 QUIET)
|
||||||
SET(ZED_INCLUDE_DIRS $ENV{ZED_INCLUDE_DIRS})
|
|
||||||
if (CMAKE_CL_64) # 64 bits
|
IF(ZED_FOUND)
|
||||||
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 1 QUIET)
|
|
||||||
ENDIF(WIN32)
|
|
||||||
|
|
||||||
IF(ZED_FOUND)
|
|
||||||
MESSAGE(STATUS "Found ZED sdk: ${ZED_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found ZED sdk: ${ZED_INCLUDE_DIRS}")
|
||||||
## look for CUDA
|
## look for CUDA
|
||||||
find_package(CUDA)
|
find_package(CUDA)
|
||||||
IF(CUDA_FOUND)
|
IF(CUDA_FOUND)
|
||||||
MESSAGE(STATUS "Found CUDA: ${CUDA_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found CUDA: ${CUDA_INCLUDE_DIRS}")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(FATAL_ERROR "CUDA is required to build with Zed sdk! Set -DWITH_ZED=OFF if you don't have CUDA.")
|
MESSAGE(FATAL_ERROR "CUDA is required to build with Zed sdk! Set -DWITH_ZED=OFF if you don't have CUDA.")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF(ZED_FOUND)
|
ENDIF(ZED_FOUND)
|
||||||
ENDIF(WITH_ZED)
|
ENDIF(WITH_ZED)
|
||||||
|
|
||||||
IF(WITH_REALSENSE)
|
IF(WITH_REALSENSE)
|
||||||
IF(WITH_REALSENSE_SLAM)
|
IF(WITH_REALSENSE_SLAM)
|
||||||
FIND_PACKAGE(RealSense QUIET COMPONENTS slam)
|
FIND_PACKAGE(RealSense QUIET COMPONENTS slam)
|
||||||
ELSE()
|
ELSE()
|
||||||
FIND_PACKAGE(RealSense QUIET)
|
FIND_PACKAGE(RealSense QUIET)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(RealSense_FOUND)
|
IF(RealSense_FOUND)
|
||||||
MESSAGE(STATUS "Found RealSense: ${RealSense_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found RealSense: ${RealSense_INCLUDE_DIRS}")
|
||||||
ENDIF(RealSense_FOUND)
|
ENDIF(RealSense_FOUND)
|
||||||
@@ -330,35 +408,145 @@ IF(WITH_REALSENSE)
|
|||||||
ENDIF(RealSenseSlam_FOUND)
|
ENDIF(RealSenseSlam_FOUND)
|
||||||
ENDIF(WITH_REALSENSE)
|
ENDIF(WITH_REALSENSE)
|
||||||
|
|
||||||
|
IF(WITH_REALSENSE2)
|
||||||
|
IF(WIN32)
|
||||||
|
FIND_PACKAGE(RealSense2 QUIET)
|
||||||
|
ELSE()
|
||||||
|
FIND_PACKAGE(realsense2 QUIET)
|
||||||
|
ENDIF()
|
||||||
|
IF(realsense2_FOUND)
|
||||||
|
MESSAGE(STATUS "Found RealSense2: ${realsense2_INCLUDE_DIRS}")
|
||||||
|
ENDIF(realsense2_FOUND)
|
||||||
|
ENDIF(WITH_REALSENSE2)
|
||||||
|
|
||||||
IF(WITH_OCTOMAP)
|
IF(WITH_OCTOMAP)
|
||||||
FIND_PACKAGE(OCTOMAP QUIET)
|
FIND_PACKAGE(OCTOMAP QUIET)
|
||||||
IF(OCTOMAP_FOUND)
|
IF(OCTOMAP_FOUND)
|
||||||
MESSAGE(STATUS "Found octomap: ${OCTOMAP_INCLUDE_DIRS}")
|
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(OCTOMAP_FOUND)
|
||||||
ENDIF(WITH_OCTOMAP)
|
ENDIF(WITH_OCTOMAP)
|
||||||
|
|
||||||
IF(WITH_CPUTSDF)
|
IF(WITH_CPUTSDF)
|
||||||
FIND_PACKAGE(CPUTSDF QUIET)
|
FIND_PACKAGE(CPUTSDF QUIET)
|
||||||
IF(CPUTSDF_FOUND)
|
IF(CPUTSDF_FOUND)
|
||||||
MESSAGE(STATUS "Found CPUTSDF: ${CPUTSDF_INCLUDE_DIRS}")
|
MESSAGE(STATUS "Found CPUTSDF: ${CPUTSDF_INCLUDE_DIRS}")
|
||||||
ENDIF(CPUTSDF_FOUND)
|
ENDIF(CPUTSDF_FOUND)
|
||||||
ENDIF(WITH_CPUTSDF)
|
ENDIF(WITH_CPUTSDF)
|
||||||
|
|
||||||
IF(G2O_FOUND OR GTSAM_FOUND OR ZED_FOUND OR ANDROID OR RealSense_FOUND)
|
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 1.9.0 REQUIRED EXACT) # OKVIS requires this specific version
|
||||||
|
MESSAGE(STATUS "Found ceres ${Ceres_VERSION}: ${CERES_INCLUDE_DIRS}")
|
||||||
|
ENDIF(okvis_FOUND)
|
||||||
|
ENDIF(WITH_OKVIS)
|
||||||
|
|
||||||
|
IF(WITH_MSCKF_VIO)
|
||||||
|
FIND_PACKAGE(msckf_vio QUIET)
|
||||||
|
IF(msckf_vio_FOUND)
|
||||||
|
MESSAGE(STATUS "Found msckf_vio: ${msckf_vio_INCLUDE_DIRS}")
|
||||||
|
ENDIF(msckf_vio_FOUND)
|
||||||
|
ENDIF(WITH_MSCKF_VIO)
|
||||||
|
|
||||||
|
IF(WITH_VINS)
|
||||||
|
FIND_PACKAGE(vins QUIET)
|
||||||
|
IF(vins_FOUND)
|
||||||
|
MESSAGE(STATUS "Found vins: ${vins_INCLUDE_DIRS}")
|
||||||
|
IF(okvis_FOUND)
|
||||||
|
MESSAGE(WARNING "VINS and OKVIS will be both linked to project, make sure VINS has been built with against same Ceres version than OKVIS to avoid some crashes.")
|
||||||
|
ENDIF(okvis_FOUND)
|
||||||
|
ENDIF(vins_FOUND)
|
||||||
|
ENDIF(WITH_VINS)
|
||||||
|
|
||||||
|
|
||||||
|
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(loam_velodyne_FOUND)
|
||||||
|
#LOAM requires c++14
|
||||||
|
IF(NOT MSVC)
|
||||||
|
include(CheckCXXCompilerFlag)
|
||||||
|
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
|
||||||
|
IF(COMPILER_SUPPORTS_CXX14)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
|
||||||
|
ELSE()
|
||||||
|
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler if you want to use LOAM (set \"-DWITH_LOAM=OFF\" to build without LOAM).")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
ELSEIF(G2O_FOUND OR
|
||||||
|
GTSAM_FOUND OR
|
||||||
|
ZED_FOUND OR
|
||||||
|
ANDROID OR
|
||||||
|
RealSense_FOUND OR
|
||||||
|
realsense2_FOUND OR
|
||||||
|
ORB_SLAM2_FOUND OR
|
||||||
|
okvis_FOUND OR
|
||||||
|
open_chisel_FOUND OR
|
||||||
|
msckf_vio_FOUND OR
|
||||||
|
vins_FOUND)
|
||||||
#Newest versions require std11
|
#Newest versions require std11
|
||||||
IF(NOT MSVC)
|
IF(NOT MSVC)
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
|
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
|
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
|
||||||
IF(COMPILER_SUPPORTS_CXX11)
|
IF(COMPILER_SUPPORTS_CXX11)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
ELSEIF(COMPILER_SUPPORTS_CXX0X)
|
ELSEIF(COMPILER_SUPPORTS_CXX0X)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||||
ELSE()
|
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).")
|
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF(G2O_FOUND OR GTSAM_FOUND OR ZED_FOUND OR ANDROID OR RealSense_FOUND)
|
ENDIF()
|
||||||
|
|
||||||
####### OSX BUNDLE CMAKE_INSTALL_PREFIX #######
|
####### OSX BUNDLE CMAKE_INSTALL_PREFIX #######
|
||||||
IF(APPLE AND BUILD_AS_BUNDLE)
|
IF(APPLE AND BUILD_AS_BUNDLE)
|
||||||
@@ -392,15 +580,28 @@ ENDIF(APPLE AND BUILD_AS_BUNDLE)
|
|||||||
|
|
||||||
# CONF_DEPENDENCIES contains only dependencies not required by the headers
|
# CONF_DEPENDENCIES contains only dependencies not required by the headers
|
||||||
SET(CONF_DEPENDENCIES
|
SET(CONF_DEPENDENCIES
|
||||||
${ZLIB_LIBRARIES}
|
${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))
|
ELSEIF(OpenCV_VERSION VERSION_GREATER "3.4.2")
|
||||||
|
FIND_FILE(OpenCV_MODULES_HPP opencv2/opencv_modules.hpp
|
||||||
|
PATHS ${OpenCV_INCLUDE_DIRS}
|
||||||
|
NO_DEFAULT_PATH)
|
||||||
|
FILE(READ ${OpenCV_MODULES_HPP} TMPTXT)
|
||||||
|
STRING(FIND "${TMPTXT}" "#define OPENCV_ENABLE_NONFREE" matchres)
|
||||||
|
IF(${matchres} EQUAL -1)
|
||||||
|
SET(NONFREE "//")
|
||||||
|
ENDIF(${matchres} EQUAL -1)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(NOT G2O_FOUND)
|
IF(NOT G2O_FOUND)
|
||||||
SET(G2O "//")
|
SET(G2O "//")
|
||||||
ELSE()
|
ELSE()
|
||||||
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${G2O_LIBRARIES})
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${G2O_LIBRARIES})
|
||||||
|
IF(NOT G2O_CPP11)
|
||||||
|
SET(G2O_CPP_CONF "//")
|
||||||
|
ENDIF(NOT G2O_CPP11)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(NOT GTSAM_FOUND)
|
IF(NOT GTSAM_FOUND)
|
||||||
SET(GTSAM "//")
|
SET(GTSAM "//")
|
||||||
@@ -418,6 +619,12 @@ IF(NOT cvsba_FOUND)
|
|||||||
ELSE()
|
ELSE()
|
||||||
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${cvsba_LIBRARIES})
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${cvsba_LIBRARIES})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
IF(NOT libpointmatcher_FOUND)
|
||||||
|
SET(POINTMATCHER "//")
|
||||||
|
ENDIF(NOT libpointmatcher_FOUND)
|
||||||
|
IF(NOT loam_velodyne_FOUND)
|
||||||
|
SET(LOAM "//")
|
||||||
|
ENDIF(NOT loam_velodyne_FOUND)
|
||||||
IF(NOT Freenect_FOUND)
|
IF(NOT Freenect_FOUND)
|
||||||
SET(FREENECT "//")
|
SET(FREENECT "//")
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -428,6 +635,11 @@ IF(NOT freenect2_FOUND)
|
|||||||
ELSE()
|
ELSE()
|
||||||
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${freenect2_LIBRARIES})
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${freenect2_LIBRARIES})
|
||||||
ENDIF()
|
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 "//")
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -456,6 +668,11 @@ ENDIF()
|
|||||||
IF(NOT RealSenseSlam_FOUND)
|
IF(NOT RealSenseSlam_FOUND)
|
||||||
SET(REALSENSESLAM "//")
|
SET(REALSENSESLAM "//")
|
||||||
ENDIF(NOT RealSenseSlam_FOUND)
|
ENDIF(NOT RealSenseSlam_FOUND)
|
||||||
|
IF(NOT realsense2_FOUND)
|
||||||
|
SET(REALSENSE2 "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${realsense2_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
IF(NOT OCTOMAP_FOUND)
|
IF(NOT OCTOMAP_FOUND)
|
||||||
SET(OCTOMAP "//")
|
SET(OCTOMAP "//")
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -466,15 +683,65 @@ IF(NOT CPUTSDF_FOUND)
|
|||||||
ELSE()
|
ELSE()
|
||||||
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${CPUTSDF_LIBRARIES})
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${CPUTSDF_LIBRARIES})
|
||||||
ENDIF()
|
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 msckf_vio_FOUND)
|
||||||
|
SET(MSCKF_VIO "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${msckf_vio_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT vins_FOUND)
|
||||||
|
SET(VINS "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${vins_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT ORB_SLAM2_FOUND)
|
||||||
|
SET(ORB_SLAM2 "//")
|
||||||
|
ELSE()
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${ORB_SLAM2_LIBRARIES})
|
||||||
|
ENDIF()
|
||||||
|
IF(NOT WITH_ORB_OCTREE)
|
||||||
|
SET(ORB_OCTREE "//")
|
||||||
|
ENDIF()
|
||||||
IF(ADD_VTK_GUI_SUPPORT_QT_TO_CONF)
|
IF(ADD_VTK_GUI_SUPPORT_QT_TO_CONF)
|
||||||
SET(CONF_VTK_QT true)
|
SET(CONF_VTK_QT true)
|
||||||
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} vtkGUISupportQt)
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} vtkGUISupportQt)
|
||||||
ELSE()
|
ELSE()
|
||||||
SET(CONF_VTK_QT false)
|
SET(CONF_VTK_QT false)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
|
IF(VTK_USE_QVTK)
|
||||||
|
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${QVTK_LIBRARY})
|
||||||
|
ENDIF(VTK_USE_QVTK)
|
||||||
|
IF(NOT WITH_MADGWICK)
|
||||||
|
SET(MADGWICK "//")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(NOT (OpenCV_FOUND AND NOT (OpenCV_VERSION_MAJOR LESS 3)))
|
||||||
SET(OPENCV3 "//")
|
SET(OPENCV3 "//")
|
||||||
ENDIF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
|
ENDIF(NOT (OpenCV_FOUND AND NOT (OpenCV_VERSION_MAJOR LESS 3)))
|
||||||
CONFIGURE_FILE(Version.h.in ${PROJECT_SOURCE_DIR}/corelib/include/${PROJECT_PREFIX}/core/Version.h)
|
CONFIGURE_FILE(Version.h.in ${PROJECT_SOURCE_DIR}/corelib/include/${PROJECT_PREFIX}/core/Version.h)
|
||||||
|
|
||||||
ADD_SUBDIRECTORY( utilite )
|
ADD_SUBDIRECTORY( utilite )
|
||||||
@@ -520,8 +787,8 @@ 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)
|
||||||
@@ -559,7 +826,9 @@ install(FILES package.xml DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_PR
|
|||||||
#######################
|
#######################
|
||||||
# CPACK (Packaging)
|
# CPACK (Packaging)
|
||||||
#######################
|
#######################
|
||||||
INCLUDE(InstallRequiredSystemLibraries)
|
IF(BUILD_AS_BUNDLE)
|
||||||
|
INCLUDE(InstallRequiredSystemLibraries)
|
||||||
|
ENDIF(BUILD_AS_BUNDLE)
|
||||||
|
|
||||||
SET(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
|
SET(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
|
||||||
SET(CPACK_PACKAGE_VENDOR "${PROJECT_NAME} project")
|
SET(CPACK_PACKAGE_VENDOR "${PROJECT_NAME} project")
|
||||||
@@ -594,7 +863,11 @@ IF(WIN32)
|
|||||||
ELSE()
|
ELSE()
|
||||||
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
|
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
SET(CPACK_GENERATOR "ZIP;NSIS")
|
IF(BUILD_AS_BUNDLE)
|
||||||
|
SET(CPACK_GENERATOR "ZIP;NSIS")
|
||||||
|
ELSE()
|
||||||
|
SET(CPACK_GENERATOR "ZIP")
|
||||||
|
ENDIF()
|
||||||
SET(CPACK_SOURCE_GENERATOR "ZIP")
|
SET(CPACK_SOURCE_GENERATOR "ZIP")
|
||||||
SET(CPACK_NSIS_PACKAGE_NAME "${PROJECT_NAME}")
|
SET(CPACK_NSIS_PACKAGE_NAME "${PROJECT_NAME}")
|
||||||
SET(ICON_PATH "${PROJECT_SOURCE_DIR}/app/src/${PROJECT_NAME}.ico")
|
SET(ICON_PATH "${PROJECT_SOURCE_DIR}/app/src/${PROJECT_NAME}.ico")
|
||||||
@@ -646,30 +919,54 @@ 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 OR WIN32)
|
||||||
MESSAGE(STATUS " BUILD_AS_BUNDLE = ${BUILD_AS_BUNDLE}")
|
MESSAGE(STATUS " BUILD_AS_BUNDLE = ${BUILD_AS_BUNDLE}")
|
||||||
ENDIF(APPLE)
|
ENDIF(APPLE OR WIN32)
|
||||||
MESSAGE(STATUS " CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
|
MESSAGE(STATUS " CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
|
||||||
|
MESSAGE(STATUS " FLANN_KDTREE_MEM_OPT = ${FLANN_KDTREE_MEM_OPT}")
|
||||||
|
MESSAGE(STATUS " PCL_DEFINITIONS = ${PCL_DEFINITIONS}")
|
||||||
|
IF(PCL_COMPILE_OPTIONS)
|
||||||
|
MESSAGE(STATUS " PCL_COMPILE_OPTIONS = ${PCL_COMPILE_OPTIONS}")
|
||||||
|
ENDIF(PCL_COMPILE_OPTIONS)
|
||||||
|
|
||||||
|
MESSAGE(STATUS "Optional dependencies ('*' affects some default parameters) :")
|
||||||
IF(OpenCV_FOUND)
|
IF(OpenCV_FOUND)
|
||||||
IF(OpenCV_VERSION_MAJOR EQUAL 2)
|
IF(OpenCV_VERSION_MAJOR EQUAL 2)
|
||||||
IF(OPENCV_NONFREE_FOUND)
|
IF(OPENCV_NONFREE_FOUND)
|
||||||
MESSAGE(STATUS " With OpenCV 2 nonfree module (SIFT/SURF) = YES (License: Non commercial)")
|
MESSAGE(STATUS " *With OpenCV 2 nonfree module (SIFT/SURF) = YES (License: Non commercial)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With OpenCV 2 nonfree module (SIFT/SURF) = NO (not found, License: BSD)")
|
MESSAGE(STATUS " *With OpenCV 2 nonfree module (SIFT/SURF) = NO (not found, License: BSD)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ELSE()
|
ELSE()
|
||||||
IF(OPENCV_XFEATURES2D_FOUND)
|
IF(OPENCV_XFEATURES2D_FOUND)
|
||||||
MESSAGE(STATUS " With OpenCV 3 xfeatures2d module (SIFT/SURF/BRIEF/FREAK) = YES (License: Non commercial)")
|
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION_MAJOR} xfeatures2d module (SIFT/SURF/BRIEF/FREAK) = YES (License: Non commercial)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With OpenCV 3 xfeatures2d module (SIFT/SURF/BRIEF/FREAK) = NO (not found, License: BSD)")
|
MESSAGE(STATUS " *With OpenCV ${OpenCV_VERSION_MAJOR} xfeatures2d module (SIFT/SURF/BRIEF/FREAK) = NO (not found, License: BSD)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF(OpenCV_FOUND)
|
ENDIF(OpenCV_FOUND)
|
||||||
|
|
||||||
|
IF(Sqlite3_FOUND)
|
||||||
|
MESSAGE(STATUS " With external SQLite3 = YES (License: Public Domain)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With external SQLite3 = NO (sqlite3 not found, internal version is used for convenience)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(WITH_ORB_OCTREE)
|
||||||
|
MESSAGE(STATUS " With ORB OcTree = YES (License: GPLv3)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With ORB OcTree = NO (WITH_ORB_OCTREE=OFF)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(WITH_MADGWICK)
|
||||||
|
MESSAGE(STATUS " With Madgwick = YES (License: GPL)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With Madgwick = NO (WITH_MADGWICK=OFF)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(Freenect_FOUND)
|
IF(Freenect_FOUND)
|
||||||
MESSAGE(STATUS " With Freenect = YES (License: Apache v2 and/or GPLv2)")
|
MESSAGE(STATUS " With Freenect = YES (License: Apache v2 and/or GPLv2)")
|
||||||
ELSEIF(NOT WITH_FREENECT)
|
ELSEIF(NOT WITH_FREENECT)
|
||||||
@@ -694,6 +991,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)
|
||||||
@@ -717,26 +1022,30 @@ MESSAGE(STATUS " With TORO = NO (WITH_TORO=OFF)")
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(G2O_FOUND)
|
IF(G2O_FOUND)
|
||||||
MESSAGE(STATUS " With g2o = YES (License: BSD)")
|
MESSAGE(STATUS " *With g2o = YES (License: BSD)")
|
||||||
ELSEIF(NOT WITH_G2O)
|
ELSEIF(NOT WITH_G2O)
|
||||||
MESSAGE(STATUS " With g2o = NO (WITH_G2O=OFF)")
|
MESSAGE(STATUS " *With g2o = NO (WITH_G2O=OFF)")
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE(STATUS " With g2o = NO (g2o not found)")
|
MESSAGE(STATUS " *With g2o = NO (g2o not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(GTSAM_FOUND)
|
IF(GTSAM_FOUND)
|
||||||
MESSAGE(STATUS " With GTSAM = YES (License: BSD)")
|
MESSAGE(STATUS " *With GTSAM = YES (License: BSD)")
|
||||||
ELSEIF(NOT WITH_GTSAM)
|
ELSEIF(NOT WITH_GTSAM)
|
||||||
MESSAGE(STATUS " With GTSAM = NO (WITH_GTSAM=OFF)")
|
MESSAGE(STATUS " *With GTSAM = NO (WITH_GTSAM=OFF)")
|
||||||
ELSE()
|
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)")
|
||||||
@@ -746,6 +1055,22 @@ 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(loam_velodyne_FOUND)
|
||||||
|
MESSAGE(STATUS " With loam_velodyne = YES (License: BSD)")
|
||||||
|
ELSEIF(NOT WITH_LOAM)
|
||||||
|
MESSAGE(STATUS " With loam_velodyne = NO (WITH_LOAM=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With loam_velodyne = NO (loam_velodyne not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(ZED_FOUND)
|
IF(ZED_FOUND)
|
||||||
IF(CUDA_FOUND)
|
IF(CUDA_FOUND)
|
||||||
MESSAGE(STATUS " With ZED = YES (With CUDA)")
|
MESSAGE(STATUS " With ZED = YES (With CUDA)")
|
||||||
@@ -773,6 +1098,14 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With RealSense = NO (librealsense not found)")
|
MESSAGE(STATUS " With RealSense = NO (librealsense not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(realsense2_FOUND)
|
||||||
|
MESSAGE(STATUS " With RealSense2 = YES (License: Apache-2)")
|
||||||
|
ELSEIF(NOT WITH_REALSENSE2)
|
||||||
|
MESSAGE(STATUS " With RealSense2 = NO (WITH_REALSENSE2=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With RealSense2 = NO (librealsense2 not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(OCTOMAP_FOUND)
|
IF(OCTOMAP_FOUND)
|
||||||
MESSAGE(STATUS " With OCTOMAP = YES (License: BSD)")
|
MESSAGE(STATUS " With OCTOMAP = YES (License: BSD)")
|
||||||
ELSEIF(NOT WITH_OCTOMAP)
|
ELSEIF(NOT WITH_OCTOMAP)
|
||||||
@@ -789,6 +1122,72 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With CPUTSDF = NO (CPUTSDF not found)")
|
MESSAGE(STATUS " With CPUTSDF = NO (CPUTSDF not found)")
|
||||||
ENDIF()
|
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_OKVIS)
|
||||||
|
MESSAGE(STATUS " With okvis = NO (WITH_OKVIS=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With okvis = NO (okvis not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(msckf_vio_FOUND)
|
||||||
|
MESSAGE(STATUS " With msckf_vio = YES (License: Penn Software License)")
|
||||||
|
ELSEIF(NOT WITH_MSCKF_VIO)
|
||||||
|
MESSAGE(STATUS " With msckf_vio = NO (WITH_MSCKF_VIO=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With msckf_vio = NO (msckf_vio not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(vins_FOUND)
|
||||||
|
MESSAGE(STATUS " With VINS-Fusion = YES (License: GPLv3)")
|
||||||
|
ELSEIF(NOT WITH_VINS)
|
||||||
|
MESSAGE(STATUS " With VINS-Fusion = NO (WITH_VINS=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With VINS-Fusion = NO (VINS-Fusion 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)
|
||||||
@@ -807,3 +1206,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 :
|
||||||
|
|||||||
@@ -1,8 +1,27 @@
|
|||||||
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.18.0-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.
|
||||||
|
|
||||||
|
### Acknowledgements
|
||||||
|
This project is supported by [IntRoLab - Intelligent / Interactive / Integrated / Interdisciplinary Robot Lab](https://introlab.3it.usherbrooke.ca/), Sherbrooke, Québec, Canada.
|
||||||
|
|
||||||
|
<a href="https://introlab.3it.usherbrooke.ca/">
|
||||||
|
<img src="https://github.com/introlab/16SoundsUSB/blob/master/images/IntRoLab.png" alt="IntRoLab" height="100">
|
||||||
|
</a>
|
||||||
|
|||||||
+25
-5
@@ -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,13 +73,15 @@ 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
|
# Dependencies
|
||||||
if(@CONF_VTK_QT@)
|
if(@CONF_VTK_QT@ AND ${WITH_GUI})
|
||||||
find_package(VTK COMPONENTS vtkGUISupportQt NO_MODULE) # to define vtkGUISupportQt target
|
find_package(VTK COMPONENTS vtkGUISupportQt NO_MODULE) # to define vtkGUISupportQt target
|
||||||
endif(@CONF_VTK_QT@)
|
endif(@CONF_VTK_QT@ AND ${WITH_GUI})
|
||||||
set(RTABMap_LIBRARIES ${RTABMap_LIBRARIES} @CONF_DEPENDENCIES@)
|
SET(RTABMap_LIBRARIES ${RTABMap_LIBRARIES} "@CONF_DEPENDENCIES@")
|
||||||
|
|
||||||
#backward compatibilities
|
#backward compatibilities
|
||||||
set(RTABMAP_CORE ${RTABMap_CORE})
|
set(RTABMAP_CORE ${RTABMap_CORE})
|
||||||
@@ -74,3 +90,7 @@ if(RTABMap_GUI)
|
|||||||
set(RTABMAP_GUI ${RTABMap_GUI})
|
set(RTABMAP_GUI ${RTABMap_GUI})
|
||||||
set(RTABMAP_QT_VERSION @CONF_QT_VERSION@)
|
set(RTABMAP_QT_VERSION @CONF_QT_VERSION@)
|
||||||
endif(RTABMap_GUI)
|
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)
|
||||||
@@ -40,20 +40,36 @@ 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
|
||||||
|
@LOAM@#define RTABMAP_LOAM
|
||||||
@DC1394@#define RTABMAP_DC1394
|
@DC1394@#define RTABMAP_DC1394
|
||||||
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
||||||
@ZED@#define RTABMAP_ZED
|
@ZED@#define RTABMAP_ZED
|
||||||
@REALSENSE@#define RTABMAP_REALSENSE
|
@REALSENSE@#define RTABMAP_REALSENSE
|
||||||
@REALSENSESLAM@#define RTABMAP_REALSENSE_SLAM
|
@REALSENSESLAM@#define RTABMAP_REALSENSE_SLAM
|
||||||
|
@REALSENSE2@#define RTABMAP_REALSENSE2
|
||||||
@OCTOMAP@#define RTABMAP_OCTOMAP
|
@OCTOMAP@#define RTABMAP_OCTOMAP
|
||||||
@CPUTSDF@#define RTABMAP_CPUTSDF
|
@CPUTSDF@#define RTABMAP_CPUTSDF
|
||||||
|
@OPENCHISEL@#define RTABMAP_OPENCHISEL
|
||||||
|
@FOVIS@#define RTABMAP_FOVIS
|
||||||
|
@VISO2@#define RTABMAP_VISO2
|
||||||
|
@DVO@#define RTABMAP_DVO
|
||||||
|
@OKVIS@#define RTABMAP_OKVIS
|
||||||
|
@MSCKF_VIO@#define RTABMAP_MSCKF_VIO
|
||||||
|
@VINS@#define RTABMAP_VINS
|
||||||
|
@ORB_SLAM2@#define RTABMAP_ORB_SLAM2
|
||||||
|
@ORB_OCTREE@#define RTABMAP_ORB_OCTREE
|
||||||
|
@MADGWICK@#define RTABMAP_MADGWICK
|
||||||
|
|
||||||
|
|
||||||
#endif /* VERSION_H_ */
|
#endif /* VERSION_H_ */
|
||||||
|
|
||||||
|
|||||||
@@ -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="50"
|
android:versionCode="72"
|
||||||
android:versionName="@RTABMAP_VERSION@">
|
android:versionName="@RTABMAP_VERSION@">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
@@ -12,6 +12,9 @@
|
|||||||
<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.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
|
<uses-feature android:name="android.hardware.location.gps" />
|
||||||
<uses-feature android:glEsVersion="0x00020000" />
|
<uses-feature android:glEsVersion="0x00020000" />
|
||||||
|
|
||||||
<!-- This is the platform API where NativeActivity was introduced. -->
|
<!-- This is the platform API where NativeActivity was introduced. -->
|
||||||
@@ -31,7 +34,8 @@
|
|||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:screenOrientation="fullSensor"
|
android:screenOrientation="fullSensor"
|
||||||
android:configChanges="orientation|screenSize|keyboardHidden">
|
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" />
|
||||||
|
|||||||
@@ -1,7 +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-2018<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>
|
||||||
|
|
||||||
|
|||||||
+136
-36
@@ -46,7 +46,7 @@ const int scanDownsampling = 1;
|
|||||||
void onPointCloudAvailableRouter(void* context, const TangoPointCloud* point_cloud)
|
void onPointCloudAvailableRouter(void* context, const TangoPointCloud* point_cloud)
|
||||||
{
|
{
|
||||||
CameraTango* app = static_cast<CameraTango*>(context);
|
CameraTango* app = static_cast<CameraTango*>(context);
|
||||||
if(point_cloud->num_points>0)
|
if(app->isRunning() && point_cloud->num_points>0)
|
||||||
{
|
{
|
||||||
app->cloudReceived(cv::Mat(1, point_cloud->num_points, CV_32FC4, point_cloud->points[0]), point_cloud->timestamp);
|
app->cloudReceived(cv::Mat(1, point_cloud->num_points, CV_32FC4, point_cloud->points[0]), point_cloud->timestamp);
|
||||||
}
|
}
|
||||||
@@ -55,31 +55,34 @@ void onPointCloudAvailableRouter(void* context, const TangoPointCloud* point_clo
|
|||||||
void onFrameAvailableRouter(void* context, TangoCameraId id, const TangoImageBuffer* color)
|
void onFrameAvailableRouter(void* context, TangoCameraId id, const TangoImageBuffer* color)
|
||||||
{
|
{
|
||||||
CameraTango* app = static_cast<CameraTango*>(context);
|
CameraTango* app = static_cast<CameraTango*>(context);
|
||||||
cv::Mat tangoImage;
|
if(app->isRunning())
|
||||||
if(color->format == TANGO_HAL_PIXEL_FORMAT_RGBA_8888)
|
|
||||||
{
|
{
|
||||||
tangoImage = cv::Mat(color->height, color->width, CV_8UC4, color->data);
|
cv::Mat tangoImage;
|
||||||
}
|
if(color->format == TANGO_HAL_PIXEL_FORMAT_RGBA_8888)
|
||||||
else if(color->format == TANGO_HAL_PIXEL_FORMAT_YV12)
|
{
|
||||||
{
|
tangoImage = cv::Mat(color->height, color->width, CV_8UC4, color->data);
|
||||||
tangoImage = cv::Mat(color->height+color->height/2, color->width, CV_8UC1, color->data);
|
}
|
||||||
}
|
else if(color->format == TANGO_HAL_PIXEL_FORMAT_YV12)
|
||||||
else if(color->format == TANGO_HAL_PIXEL_FORMAT_YCrCb_420_SP)
|
{
|
||||||
{
|
tangoImage = cv::Mat(color->height+color->height/2, color->width, CV_8UC1, color->data);
|
||||||
tangoImage = cv::Mat(color->height+color->height/2, color->width, CV_8UC1, color->data);
|
}
|
||||||
}
|
else if(color->format == TANGO_HAL_PIXEL_FORMAT_YCrCb_420_SP)
|
||||||
else if(color->format == 35)
|
{
|
||||||
{
|
tangoImage = cv::Mat(color->height+color->height/2, color->width, CV_8UC1, color->data);
|
||||||
tangoImage = cv::Mat(color->height+color->height/2, color->width, CV_8UC1, color->data);
|
}
|
||||||
}
|
else if(color->format == 35)
|
||||||
else
|
{
|
||||||
{
|
tangoImage = cv::Mat(color->height+color->height/2, color->width, CV_8UC1, color->data);
|
||||||
LOGE("Not supported color format : %d.", color->format);
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
|
LOGE("Not supported color format : %d.", color->format);
|
||||||
|
}
|
||||||
|
|
||||||
if(!tangoImage.empty())
|
if(!tangoImage.empty())
|
||||||
{
|
{
|
||||||
app->rgbReceived(tangoImage, (unsigned int)color->format, color->timestamp);
|
app->rgbReceived(tangoImage, (unsigned int)color->format, color->timestamp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +110,7 @@ const float CameraTango::bilateralFilteringSigmaR = 0.075f;
|
|||||||
CameraTango::CameraTango(bool colorCamera, int decimation, bool publishRawScan, bool smoothing) :
|
CameraTango::CameraTango(bool colorCamera, int decimation, bool publishRawScan, bool smoothing) :
|
||||||
Camera(0),
|
Camera(0),
|
||||||
tango_config_(0),
|
tango_config_(0),
|
||||||
firstFrame_(true),
|
previousStamp_(0.0),
|
||||||
stampEpochOffset_(0.0),
|
stampEpochOffset_(0.0),
|
||||||
colorCamera_(colorCamera),
|
colorCamera_(colorCamera),
|
||||||
decimation_(decimation),
|
decimation_(decimation),
|
||||||
@@ -116,7 +119,8 @@ CameraTango::CameraTango(bool colorCamera, int decimation, bool publishRawScan,
|
|||||||
cloudStamp_(0),
|
cloudStamp_(0),
|
||||||
tangoColorType_(0),
|
tangoColorType_(0),
|
||||||
tangoColorStamp_(0),
|
tangoColorStamp_(0),
|
||||||
colorCameraToDisplayRotation_(ROTATION_0)
|
colorCameraToDisplayRotation_(ROTATION_0),
|
||||||
|
originUpdate_(false)
|
||||||
{
|
{
|
||||||
UASSERT(decimation >= 1);
|
UASSERT(decimation >= 1);
|
||||||
}
|
}
|
||||||
@@ -189,7 +193,7 @@ bool CameraTango::init(const std::string & calibrationFolder, const std::string
|
|||||||
{
|
{
|
||||||
close();
|
close();
|
||||||
|
|
||||||
TangoSupport_initializeLibrary();
|
TangoSupport_initialize(TangoService_getPoseAtTime, TangoService_getCameraIntrinsics);
|
||||||
|
|
||||||
// Connect to Tango
|
// Connect to Tango
|
||||||
LOGI("NativeRTABMap: Setup tango config");
|
LOGI("NativeRTABMap: Setup tango config");
|
||||||
@@ -425,11 +429,23 @@ void CameraTango::close()
|
|||||||
{
|
{
|
||||||
TangoConfig_free(tango_config_);
|
TangoConfig_free(tango_config_);
|
||||||
tango_config_ = nullptr;
|
tango_config_ = nullptr;
|
||||||
|
LOGI("TangoService_disconnect()");
|
||||||
TangoService_disconnect();
|
TangoService_disconnect();
|
||||||
|
LOGI("TangoService_disconnect() done.");
|
||||||
}
|
}
|
||||||
firstFrame_ = true;
|
previousPose_.setNull();
|
||||||
|
previousStamp_ = 0.0;
|
||||||
fisheyeRectifyMapX_ = cv::Mat();
|
fisheyeRectifyMapX_ = cv::Mat();
|
||||||
fisheyeRectifyMapY_ = cv::Mat();
|
fisheyeRectifyMapY_ = cv::Mat();
|
||||||
|
lastKnownGPS_ = GPS();
|
||||||
|
lastEnvSensors_.clear();
|
||||||
|
originOffset_ = Transform();
|
||||||
|
originUpdate_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraTango::resetOrigin()
|
||||||
|
{
|
||||||
|
originUpdate_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraTango::cloudReceived(const cv::Mat & cloud, double timestamp)
|
void CameraTango::cloudReceived(const cv::Mat & cloud, double timestamp)
|
||||||
@@ -490,10 +506,23 @@ static rtabmap::Transform opticalRotation(
|
|||||||
0.0f, 0.0f, -1.0f, 0.0f);
|
0.0f, 0.0f, -1.0f, 0.0f);
|
||||||
void CameraTango::poseReceived(const Transform & pose)
|
void CameraTango::poseReceived(const Transform & pose)
|
||||||
{
|
{
|
||||||
if(!pose.isNull() && pose.getNormSquared() < 100000)
|
if(!pose.isNull())
|
||||||
{
|
{
|
||||||
// send pose of the camera (without optical rotation), not the device
|
// send pose of the camera (without optical rotation), not the device
|
||||||
this->post(new PoseEvent(pose*deviceTColorCamera_*opticalRotation));
|
Transform p = pose*deviceTColorCamera_*opticalRotation;
|
||||||
|
if(originUpdate_)
|
||||||
|
{
|
||||||
|
originOffset_ = p.translation().inverse();
|
||||||
|
originUpdate_ = false;
|
||||||
|
}
|
||||||
|
if(!originOffset_.isNull())
|
||||||
|
{
|
||||||
|
this->post(new PoseEvent(originOffset_*p));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->post(new PoseEvent(p));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -512,6 +541,16 @@ std::string CameraTango::getSerial() const
|
|||||||
return "Tango";
|
return "Tango";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CameraTango::setGPS(const GPS & gps)
|
||||||
|
{
|
||||||
|
lastKnownGPS_ = gps;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraTango::addEnvSensor(int type, float value)
|
||||||
|
{
|
||||||
|
lastEnvSensors_.insert(std::make_pair((EnvSensor::Type)type, EnvSensor((EnvSensor::Type)type, value)));
|
||||||
|
}
|
||||||
|
|
||||||
rtabmap::Transform CameraTango::tangoPoseToTransform(const TangoPoseData * tangoPose) const
|
rtabmap::Transform CameraTango::tangoPoseToTransform(const TangoPoseData * tangoPose) const
|
||||||
{
|
{
|
||||||
UASSERT(tangoPose);
|
UASSERT(tangoPose);
|
||||||
@@ -698,6 +737,13 @@ SensorData CameraTango::captureImage(CameraInfo * info)
|
|||||||
CameraModel depthModel = model_.scaled(1.0f/float(depthSizeDec));
|
CameraModel depthModel = model_.scaled(1.0f/float(depthSizeDec));
|
||||||
std::vector<cv::Point3f> scanData(rawScanPublished_?cloud.total():0);
|
std::vector<cv::Point3f> scanData(rawScanPublished_?cloud.total():0);
|
||||||
int oi=0;
|
int oi=0;
|
||||||
|
int closePoints = 0;
|
||||||
|
float closeROI[4];
|
||||||
|
closeROI[0] = depth.cols/4;
|
||||||
|
closeROI[1] = 3*(depth.cols/4);
|
||||||
|
closeROI[2] = depth.rows/4;
|
||||||
|
closeROI[3] = 3*(depth.rows/4);
|
||||||
|
unsigned short minDepthValue=10000;
|
||||||
for(unsigned int i=0; i<cloud.total(); ++i)
|
for(unsigned int i=0; i<cloud.total(); ++i)
|
||||||
{
|
{
|
||||||
float * p = cloud.ptr<float>(0,i);
|
float * p = cloud.ptr<float>(0,i);
|
||||||
@@ -716,6 +762,17 @@ SensorData CameraTango::captureImage(CameraInfo * info)
|
|||||||
pixel_y_h = static_cast<int>((depthModel.fy()) * (pt.y / pt.z) + depthModel.cy() + 0.5f);
|
pixel_y_h = static_cast<int>((depthModel.fy()) * (pt.y / pt.z) + depthModel.cy() + 0.5f);
|
||||||
unsigned short depth_value(pt.z * 1000.0f);
|
unsigned short depth_value(pt.z * 1000.0f);
|
||||||
|
|
||||||
|
if(pixel_x_l>=closeROI[0] && pixel_x_l<closeROI[1] &&
|
||||||
|
pixel_y_l>closeROI[2] && pixel_y_l<closeROI[3] &&
|
||||||
|
depth_value < 600)
|
||||||
|
{
|
||||||
|
++closePoints;
|
||||||
|
if(depth_value < minDepthValue)
|
||||||
|
{
|
||||||
|
minDepthValue = depth_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool pixelSet = false;
|
bool pixelSet = false;
|
||||||
if(pixel_x_l>=0 && pixel_x_l<depth.cols &&
|
if(pixel_x_l>=0 && pixel_x_l<depth.cols &&
|
||||||
pixel_y_l>0 && pixel_y_l<depth.rows && // ignore first line
|
pixel_y_l>0 && pixel_y_l<depth.rows && // ignore first line
|
||||||
@@ -745,6 +802,11 @@ SensorData CameraTango::captureImage(CameraInfo * info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(closePoints > 100)
|
||||||
|
{
|
||||||
|
this->post(new CameraTangoEvent(0, "TooClose", ""));
|
||||||
|
}
|
||||||
|
|
||||||
if(oi)
|
if(oi)
|
||||||
{
|
{
|
||||||
scan = cv::Mat(1, oi, CV_32FC3, scanData.data()).clone();
|
scan = cv::Mat(1, oi, CV_32FC3, scanData.data()).clone();
|
||||||
@@ -762,6 +824,12 @@ SensorData CameraTango::captureImage(CameraInfo * info)
|
|||||||
|
|
||||||
Transform poseDevice = getPoseAtTimestamp(rgbStamp);
|
Transform poseDevice = getPoseAtTimestamp(rgbStamp);
|
||||||
|
|
||||||
|
// adjust origin
|
||||||
|
if(!originOffset_.isNull())
|
||||||
|
{
|
||||||
|
poseDevice = originOffset_ * poseDevice;
|
||||||
|
}
|
||||||
|
|
||||||
//LOGD("Local = %s", model.localTransform().prettyPrint().c_str());
|
//LOGD("Local = %s", model.localTransform().prettyPrint().c_str());
|
||||||
//LOGD("tango = %s", poseDevice.prettyPrint().c_str());
|
//LOGD("tango = %s", poseDevice.prettyPrint().c_str());
|
||||||
//LOGD("opengl(t)= %s", (opengl_world_T_tango_world * poseDevice).prettyPrint().c_str());
|
//LOGD("opengl(t)= %s", (opengl_world_T_tango_world * poseDevice).prettyPrint().c_str());
|
||||||
@@ -823,19 +891,33 @@ SensorData CameraTango::captureImage(CameraInfo * info)
|
|||||||
{
|
{
|
||||||
//UTimer t;
|
//UTimer t;
|
||||||
depth = rtabmap::util2d::fastBilateralFiltering(depth, bilateralFilteringSigmaS, bilateralFilteringSigmaR);
|
depth = rtabmap::util2d::fastBilateralFiltering(depth, bilateralFilteringSigmaS, bilateralFilteringSigmaR);
|
||||||
data.setDepthOrRightRaw(depth);
|
|
||||||
//LOGD("Bilateral filtering, time=%fs", t.ticks());
|
//LOGD("Bilateral filtering, time=%fs", t.ticks());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(rawScanPublished_)
|
if(rawScanPublished_)
|
||||||
{
|
{
|
||||||
data = SensorData(scan, LaserScanInfo(cloud.total()/scanDownsampling, 0, scanLocalTransform), rgb, depth, model, this->getNextSeqID(), rgbStamp);
|
data = SensorData(LaserScan::backwardCompatibility(scan, cloud.total()/scanDownsampling, 0, scanLocalTransform), rgb, depth, model, this->getNextSeqID(), rgbStamp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data = SensorData(rgb, depth, model, this->getNextSeqID(), rgbStamp);
|
data = SensorData(rgb, depth, model, this->getNextSeqID(), rgbStamp);
|
||||||
}
|
}
|
||||||
data.setGroundTruth(odom);
|
data.setGroundTruth(odom);
|
||||||
|
|
||||||
|
if(lastKnownGPS_.stamp() > 0.0 && rgbStamp-lastKnownGPS_.stamp()<1.0)
|
||||||
|
{
|
||||||
|
data.setGPS(lastKnownGPS_);
|
||||||
|
}
|
||||||
|
else if(lastKnownGPS_.stamp()>0.0)
|
||||||
|
{
|
||||||
|
LOGD("GPS too old (current time=%f, gps time = %f)", rgbStamp, lastKnownGPS_.stamp());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lastEnvSensors_.size())
|
||||||
|
{
|
||||||
|
data.setEnvSensors(lastEnvSensors_);
|
||||||
|
lastEnvSensors_.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -865,15 +947,33 @@ void CameraTango::mainLoop()
|
|||||||
{
|
{
|
||||||
rtabmap::Transform pose = data.groundTruth();
|
rtabmap::Transform pose = data.groundTruth();
|
||||||
data.setGroundTruth(Transform());
|
data.setGroundTruth(Transform());
|
||||||
|
|
||||||
// convert stamp to epoch
|
// convert stamp to epoch
|
||||||
if(firstFrame_)
|
bool firstFrame = previousPose_.isNull();
|
||||||
|
if(firstFrame)
|
||||||
{
|
{
|
||||||
stampEpochOffset_ = UTimer::now()-data.stamp();
|
stampEpochOffset_ = UTimer::now()-data.stamp();
|
||||||
}
|
}
|
||||||
data.setStamp(stampEpochOffset_ + data.stamp());
|
data.setStamp(stampEpochOffset_ + data.stamp());
|
||||||
LOGI("Publish odometry message (variance=%f)", firstFrame_?9999:0.000001);
|
OdometryInfo info;
|
||||||
this->post(new OdometryEvent(data, pose, firstFrame_?9999:0.000001, firstFrame_?9999:0.000001));
|
if(!firstFrame)
|
||||||
firstFrame_ = false;
|
{
|
||||||
|
info.interval = data.stamp()-previousStamp_;
|
||||||
|
info.transform = previousPose_.inverse() * pose;
|
||||||
|
}
|
||||||
|
// linear cov = 0.0001
|
||||||
|
info.reg.covariance = cv::Mat::eye(6,6,CV_64FC1) * (firstFrame?9999.0:0.0001);
|
||||||
|
if(!firstFrame)
|
||||||
|
{
|
||||||
|
// angular cov = 0.000001
|
||||||
|
info.reg.covariance.at<double>(3,3) *= 0.01;
|
||||||
|
info.reg.covariance.at<double>(4,4) *= 0.01;
|
||||||
|
info.reg.covariance.at<double>(5,5) *= 0.01;
|
||||||
|
}
|
||||||
|
LOGI("Publish odometry message (variance=%f)", firstFrame?9999:0.0001);
|
||||||
|
this->post(new OdometryEvent(data, pose, info));
|
||||||
|
previousPose_ = pose;
|
||||||
|
previousStamp_ = data.stamp();
|
||||||
}
|
}
|
||||||
else if(!this->isKilled())
|
else if(!this->isKilled())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ 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>
|
||||||
@@ -80,6 +81,7 @@ public:
|
|||||||
|
|
||||||
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;
|
||||||
const CameraModel & getCameraModel() const {return model_;}
|
const CameraModel & getCameraModel() const {return model_;}
|
||||||
@@ -89,6 +91,8 @@ public:
|
|||||||
void setSmoothing(bool enabled) {smoothing_ = enabled;}
|
void setSmoothing(bool enabled) {smoothing_ = enabled;}
|
||||||
void setRawScanPublished(bool enabled) {rawScanPublished_ = enabled;}
|
void setRawScanPublished(bool enabled) {rawScanPublished_ = enabled;}
|
||||||
void setScreenRotation(TangoSupportRotation colorCameraToDisplayRotation) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
void setScreenRotation(TangoSupportRotation colorCameraToDisplayRotation) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
|
||||||
|
void setGPS(const GPS & gps);
|
||||||
|
void addEnvSensor(int type, float value);
|
||||||
|
|
||||||
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);
|
||||||
@@ -106,7 +110,8 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void * tango_config_;
|
void * tango_config_;
|
||||||
bool firstFrame_;
|
Transform previousPose_;
|
||||||
|
double previousStamp_;
|
||||||
UTimer cameraStartedTime_;
|
UTimer cameraStartedTime_;
|
||||||
double stampEpochOffset_;
|
double stampEpochOffset_;
|
||||||
bool colorCamera_;
|
bool colorCamera_;
|
||||||
@@ -125,6 +130,10 @@ private:
|
|||||||
TangoSupportRotation colorCameraToDisplayRotation_;
|
TangoSupportRotation colorCameraToDisplayRotation_;
|
||||||
cv::Mat fisheyeRectifyMapX_;
|
cv::Mat fisheyeRectifyMapX_;
|
||||||
cv::Mat fisheyeRectifyMapY_;
|
cv::Mat fisheyeRectifyMapY_;
|
||||||
|
GPS lastKnownGPS_;
|
||||||
|
EnvSensors lastEnvSensors_;
|
||||||
|
Transform originOffset_;
|
||||||
|
bool originUpdate_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ public:
|
|||||||
increment();
|
increment();
|
||||||
}
|
}
|
||||||
|
|
||||||
return !isCanceled();
|
return ProgressState::callback(msg);
|
||||||
}
|
}
|
||||||
virtual ~ProgressionStatus(){}
|
virtual ~ProgressionStatus(){}
|
||||||
|
|
||||||
|
|||||||
+775
-910
File diff suppressed because it is too large
Load Diff
@@ -56,7 +56,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
|
|
||||||
void setScreenRotation(int displayRotation, int cameraRotation);
|
void setScreenRotation(int displayRotation, int cameraRotation);
|
||||||
|
|
||||||
int openDatabase(const std::string & databasePath, bool databaseInMemory, bool optimize);
|
int openDatabase(const std::string & databasePath, bool databaseInMemory, bool optimize, const std::string & databaseSource=std::string());
|
||||||
|
|
||||||
bool onTangoServiceConnected(JNIEnv* env, jobject iBinder);
|
bool onTangoServiceConnected(JNIEnv* env, jobject iBinder);
|
||||||
|
|
||||||
@@ -119,8 +119,12 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
void setOdomCloudShown(bool shown);
|
void setOdomCloudShown(bool shown);
|
||||||
void setMeshRendering(bool enabled, bool withTexture);
|
void setMeshRendering(bool enabled, bool withTexture);
|
||||||
void setPointSize(float value);
|
void setPointSize(float value);
|
||||||
|
void setFOV(float angle);
|
||||||
|
void setOrthoCropFactor(float value);
|
||||||
|
void setGridRotation(float value);
|
||||||
void setLighting(bool enabled);
|
void setLighting(bool enabled);
|
||||||
void setBackfaceCulling(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);
|
||||||
@@ -143,19 +147,18 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
void setRenderingTextureDecimation(int value);
|
void setRenderingTextureDecimation(int value);
|
||||||
void setBackgroundColor(float gray);
|
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 addEnvSensor(int type, float value);
|
||||||
|
|
||||||
void resetMapping();
|
void resetMapping();
|
||||||
void save(const std::string & databasePath);
|
void save(const std::string & databasePath);
|
||||||
cv::Mat mergeTextures(pcl::TextureMesh & mesh,
|
|
||||||
int textureSize,
|
|
||||||
const std::vector<std::map<int, pcl::PointXY> > & vertexToPixels) const;
|
|
||||||
void cancelProcessing();
|
void cancelProcessing();
|
||||||
bool exportMesh(
|
bool exportMesh(
|
||||||
const std::string & filePath,
|
|
||||||
float cloudVoxelSize,
|
float cloudVoxelSize,
|
||||||
bool regenerateCloud,
|
bool regenerateCloud,
|
||||||
bool meshing,
|
bool meshing,
|
||||||
int textureSize,
|
int textureSize,
|
||||||
|
int textureCount,
|
||||||
int normalK,
|
int normalK,
|
||||||
bool optimized,
|
bool optimized,
|
||||||
float optimizedVoxelSize,
|
float optimizedVoxelSize,
|
||||||
@@ -163,11 +166,12 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
int optimizedMaxPolygons,
|
int optimizedMaxPolygons,
|
||||||
float optimizedColorRadius,
|
float optimizedColorRadius,
|
||||||
bool optimizedCleanWhitePolygons,
|
bool optimizedCleanWhitePolygons,
|
||||||
bool optimizedColorWhitePolygons,
|
int optimizedMinClusterSize,
|
||||||
float optimizedMaxTextureDistance,
|
float optimizedMaxTextureDistance,
|
||||||
int optimizedMinTextureClusterSize,
|
int optimizedMinTextureClusterSize,
|
||||||
bool blockRendering);
|
bool blockRendering);
|
||||||
bool postExportation(bool visualize);
|
bool postExportation(bool visualize);
|
||||||
|
bool writeExportedMesh(const std::string & directory, const std::string & name);
|
||||||
int postProcessing(int approach);
|
int postProcessing(int approach);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -217,6 +221,7 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
bool filterPolygonsOnNextRender_;
|
bool filterPolygonsOnNextRender_;
|
||||||
int gainCompensationOnNextRender_;
|
int gainCompensationOnNextRender_;
|
||||||
bool bilateralFilteringOnNextRender_;
|
bool bilateralFilteringOnNextRender_;
|
||||||
|
bool takeScreenshotOnNextRender_;
|
||||||
bool cameraJustInitialized_;
|
bool cameraJustInitialized_;
|
||||||
int meshDecimation_;
|
int meshDecimation_;
|
||||||
int totalPoints_;
|
int totalPoints_;
|
||||||
@@ -224,31 +229,36 @@ class RTABMapApp : public UEventsHandler {
|
|||||||
int lastDrawnCloudsCount_;
|
int lastDrawnCloudsCount_;
|
||||||
float renderingTime_;
|
float renderingTime_;
|
||||||
double lastPostRenderEventTime_;
|
double lastPostRenderEventTime_;
|
||||||
long processMemoryUsedBytes;
|
double lastPoseEventTime_;
|
||||||
long processGPUMemoryUsedBytes;
|
|
||||||
std::map<std::string, float> bufferedStatsData_;
|
std::map<std::string, float> bufferedStatsData_;
|
||||||
|
|
||||||
bool visualizingMesh_;
|
bool visualizingMesh_;
|
||||||
bool exportedMeshUpdated_;
|
bool exportedMeshUpdated_;
|
||||||
pcl::TextureMesh::Ptr exportedMesh_;
|
pcl::TextureMesh::Ptr optMesh_;
|
||||||
cv::Mat exportedTexture_;
|
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::RtabmapEvent*> 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_;
|
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_;
|
boost::mutex renderingMutex_;
|
||||||
|
|
||||||
|
USemaphore screenshotReady_;
|
||||||
|
|
||||||
std::map<int, Mesh> createdMeshes_;
|
std::map<int, Mesh> createdMeshes_;
|
||||||
std::map<int, rtabmap::Transform> rawPoses_;
|
std::map<int, rtabmap::Transform> rawPoses_;
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,17 @@ Java_com_introlab_rtabmap_RTABMapLib_openDatabase(
|
|||||||
return app.openDatabase(databasePathC, databaseInMemory, optimize);
|
return app.openDatabase(databasePathC, databaseInMemory, optimize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT int JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_openDatabase2(
|
||||||
|
JNIEnv* env, jobject, jstring databaseSource, jstring databasePath, bool databaseInMemory, bool optimize)
|
||||||
|
{
|
||||||
|
std::string databasePathC;
|
||||||
|
GetJStringContent(env,databasePath,databasePathC);
|
||||||
|
std::string databaseSourceC;
|
||||||
|
GetJStringContent(env,databaseSource,databaseSourceC);
|
||||||
|
return app.openDatabase(databasePathC, databaseInMemory, optimize, databaseSourceC);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT bool JNICALL
|
JNIEXPORT bool JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_onTangoServiceConnected(
|
Java_com_introlab_rtabmap_RTABMapLib_onTangoServiceConnected(
|
||||||
JNIEnv* env, jobject, jobject iBinder) {
|
JNIEnv* env, jobject, jobject iBinder) {
|
||||||
@@ -157,6 +168,24 @@ Java_com_introlab_rtabmap_RTABMapLib_setPointSize(
|
|||||||
return app.setPointSize(value);
|
return app.setPointSize(value);
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
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(
|
Java_com_introlab_rtabmap_RTABMapLib_setLighting(
|
||||||
JNIEnv*, jobject, bool enabled)
|
JNIEnv*, jobject, bool enabled)
|
||||||
{
|
{
|
||||||
@@ -169,6 +198,12 @@ Java_com_introlab_rtabmap_RTABMapLib_setBackfaceCulling(
|
|||||||
return app.setBackfaceCulling(enabled);
|
return app.setBackfaceCulling(enabled);
|
||||||
}
|
}
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_setWireframe(
|
||||||
|
JNIEnv*, jobject, bool enabled)
|
||||||
|
{
|
||||||
|
return app.setWireframe(enabled);
|
||||||
|
}
|
||||||
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_setLocalizationMode(
|
Java_com_introlab_rtabmap_RTABMapLib_setLocalizationMode(
|
||||||
JNIEnv*, jobject, bool enabled)
|
JNIEnv*, jobject, bool enabled)
|
||||||
{
|
{
|
||||||
@@ -304,6 +339,33 @@ 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
|
||||||
|
Java_com_introlab_rtabmap_RTABMapLib_addEnvSensor(
|
||||||
|
JNIEnv*, jobject,
|
||||||
|
int type,
|
||||||
|
float value)
|
||||||
|
{
|
||||||
|
return app.addEnvSensor(type, value);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_resetMapping(
|
Java_com_introlab_rtabmap_RTABMapLib_resetMapping(
|
||||||
JNIEnv*, jobject)
|
JNIEnv*, jobject)
|
||||||
@@ -330,11 +392,11 @@ Java_com_introlab_rtabmap_RTABMapLib_cancelProcessing(
|
|||||||
JNIEXPORT bool JNICALL
|
JNIEXPORT bool JNICALL
|
||||||
Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
|
Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
|
||||||
JNIEnv* env, jobject,
|
JNIEnv* env, jobject,
|
||||||
jstring filePath,
|
|
||||||
float cloudVoxelSize,
|
float cloudVoxelSize,
|
||||||
bool regenerateCloud,
|
bool regenerateCloud,
|
||||||
bool meshing,
|
bool meshing,
|
||||||
int textureSize,
|
int textureSize,
|
||||||
|
int textureCount,
|
||||||
int normalK,
|
int normalK,
|
||||||
bool optimized,
|
bool optimized,
|
||||||
float optimizedVoxelSize,
|
float optimizedVoxelSize,
|
||||||
@@ -342,19 +404,17 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
|
|||||||
int optimizedMaxPolygons,
|
int optimizedMaxPolygons,
|
||||||
float optimizedColorRadius,
|
float optimizedColorRadius,
|
||||||
bool optimizedCleanWhitePolygons,
|
bool optimizedCleanWhitePolygons,
|
||||||
bool optimizedColorWhitePolygons,
|
int optimizedMinClusterSize,
|
||||||
float optimizedMaxTextureDistance,
|
float optimizedMaxTextureDistance,
|
||||||
int optimizedMinTextureClusterSize,
|
int optimizedMinTextureClusterSize,
|
||||||
bool blockRendering)
|
bool blockRendering)
|
||||||
{
|
{
|
||||||
std::string filePathC;
|
|
||||||
GetJStringContent(env,filePath,filePathC);
|
|
||||||
return app.exportMesh(
|
return app.exportMesh(
|
||||||
filePathC,
|
|
||||||
cloudVoxelSize,
|
cloudVoxelSize,
|
||||||
regenerateCloud,
|
regenerateCloud,
|
||||||
meshing,
|
meshing,
|
||||||
textureSize,
|
textureSize,
|
||||||
|
textureCount,
|
||||||
normalK,
|
normalK,
|
||||||
optimized,
|
optimized,
|
||||||
optimizedVoxelSize,
|
optimizedVoxelSize,
|
||||||
@@ -362,7 +422,7 @@ Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
|
|||||||
optimizedMaxPolygons,
|
optimizedMaxPolygons,
|
||||||
optimizedColorRadius,
|
optimizedColorRadius,
|
||||||
optimizedCleanWhitePolygons,
|
optimizedCleanWhitePolygons,
|
||||||
optimizedColorWhitePolygons,
|
optimizedMinClusterSize,
|
||||||
optimizedMaxTextureDistance,
|
optimizedMaxTextureDistance,
|
||||||
optimizedMinTextureClusterSize,
|
optimizedMinTextureClusterSize,
|
||||||
blockRendering);
|
blockRendering);
|
||||||
@@ -375,6 +435,18 @@ Java_com_introlab_rtabmap_RTABMapLib_postExportation(
|
|||||||
return app.postExportation(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)
|
||||||
|
|||||||
@@ -318,7 +318,8 @@ PointCloudDrawable::PointCloudDrawable(
|
|||||||
}
|
}
|
||||||
|
|
||||||
PointCloudDrawable::PointCloudDrawable(
|
PointCloudDrawable::PointCloudDrawable(
|
||||||
const Mesh & mesh) :
|
const Mesh & mesh,
|
||||||
|
bool createWireframe) :
|
||||||
vertex_buffers_(0),
|
vertex_buffers_(0),
|
||||||
textures_(0),
|
textures_(0),
|
||||||
nPoints_(0),
|
nPoints_(0),
|
||||||
@@ -330,7 +331,7 @@ PointCloudDrawable::PointCloudDrawable(
|
|||||||
gainG_(1.0f),
|
gainG_(1.0f),
|
||||||
gainB_(1.0f)
|
gainB_(1.0f)
|
||||||
{
|
{
|
||||||
updateMesh(mesh);
|
updateMesh(mesh, createWireframe);
|
||||||
}
|
}
|
||||||
|
|
||||||
PointCloudDrawable::~PointCloudDrawable()
|
PointCloudDrawable::~PointCloudDrawable()
|
||||||
@@ -351,22 +352,33 @@ PointCloudDrawable::~PointCloudDrawable()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PointCloudDrawable::updatePolygons(const std::vector<pcl::Vertices> & polygons, const std::vector<pcl::Vertices> & polygonsLowRes)
|
void PointCloudDrawable::updatePolygons(const std::vector<pcl::Vertices> & polygons, const std::vector<pcl::Vertices> & polygonsLowRes, bool createWireframe)
|
||||||
{
|
{
|
||||||
LOGD("Update polygons");
|
LOGD("Update polygons");
|
||||||
polygons_.clear();
|
polygons_.clear();
|
||||||
|
polygonLines_.clear();
|
||||||
|
polygonsLowRes_.clear();
|
||||||
|
polygonLinesLowRes_.clear();
|
||||||
if(polygons.size() && organizedToDenseIndices_.size())
|
if(polygons.size() && organizedToDenseIndices_.size())
|
||||||
{
|
{
|
||||||
unsigned int polygonSize = polygons[0].vertices.size();
|
unsigned int polygonSize = polygons[0].vertices.size();
|
||||||
UASSERT(polygonSize == 3);
|
UASSERT(polygonSize == 3);
|
||||||
polygons_.resize(polygons.size() * polygonSize);
|
polygons_.resize(polygons.size() * polygonSize);
|
||||||
|
if(createWireframe)
|
||||||
|
polygonLines_.resize(polygons_.size()*2);
|
||||||
int oi = 0;
|
int oi = 0;
|
||||||
|
int li = 0;
|
||||||
for(unsigned int i=0; i<polygons.size(); ++i)
|
for(unsigned int i=0; i<polygons.size(); ++i)
|
||||||
{
|
{
|
||||||
UASSERT(polygons[i].vertices.size() == polygonSize);
|
UASSERT(polygons[i].vertices.size() == polygonSize);
|
||||||
for(unsigned int j=0; j<polygonSize; ++j)
|
for(unsigned int j=0; j<polygonSize; ++j)
|
||||||
{
|
{
|
||||||
polygons_[oi++] = organizedToDenseIndices_.at(polygons[i].vertices[j]);
|
polygons_[oi++] = organizedToDenseIndices_.at(polygons[i].vertices[j]);
|
||||||
|
if(createWireframe)
|
||||||
|
{
|
||||||
|
polygonLines_[li++] = organizedToDenseIndices_.at(polygons[i].vertices[j]);
|
||||||
|
polygonLines_[li++] = organizedToDenseIndices_.at(polygons[i].vertices[(j+1) % polygonSize]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -375,13 +387,21 @@ void PointCloudDrawable::updatePolygons(const std::vector<pcl::Vertices> & polyg
|
|||||||
unsigned int polygonSize = polygonsLowRes[0].vertices.size();
|
unsigned int polygonSize = polygonsLowRes[0].vertices.size();
|
||||||
UASSERT(polygonSize == 3);
|
UASSERT(polygonSize == 3);
|
||||||
polygonsLowRes_.resize(polygonsLowRes.size() * polygonSize);
|
polygonsLowRes_.resize(polygonsLowRes.size() * polygonSize);
|
||||||
|
if(createWireframe)
|
||||||
|
polygonLinesLowRes_.resize(polygonsLowRes_.size()*2);
|
||||||
int oi = 0;
|
int oi = 0;
|
||||||
|
int li = 0;
|
||||||
for(unsigned int i=0; i<polygonsLowRes.size(); ++i)
|
for(unsigned int i=0; i<polygonsLowRes.size(); ++i)
|
||||||
{
|
{
|
||||||
UASSERT(polygonsLowRes[i].vertices.size() == polygonSize);
|
UASSERT(polygonsLowRes[i].vertices.size() == polygonSize);
|
||||||
for(unsigned int j=0; j<polygonSize; ++j)
|
for(unsigned int j=0; j<polygonSize; ++j)
|
||||||
{
|
{
|
||||||
polygonsLowRes_[oi++] = organizedToDenseIndices_.at(polygonsLowRes[i].vertices[j]);
|
polygonsLowRes_[oi++] = organizedToDenseIndices_.at(polygonsLowRes[i].vertices[j]);
|
||||||
|
if(createWireframe)
|
||||||
|
{
|
||||||
|
polygonLinesLowRes_[li++] = organizedToDenseIndices_.at(polygonsLowRes[i].vertices[j]);
|
||||||
|
polygonLinesLowRes_[li++] = organizedToDenseIndices_.at(polygonsLowRes[i].vertices[(j+1)%polygonSize]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -505,7 +525,7 @@ void PointCloudDrawable::updateCloud(const pcl::PointCloud<pcl::PointXYZRGB>::Pt
|
|||||||
nPoints_ = totalPoints;
|
nPoints_ = totalPoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PointCloudDrawable::updateMesh(const Mesh & mesh)
|
void PointCloudDrawable::updateMesh(const Mesh & mesh, bool createWireframe)
|
||||||
{
|
{
|
||||||
UASSERT(mesh.cloud.get() && !mesh.cloud->empty());
|
UASSERT(mesh.cloud.get() && !mesh.cloud->empty());
|
||||||
nPoints_ = 0;
|
nPoints_ = 0;
|
||||||
@@ -797,7 +817,7 @@ void PointCloudDrawable::updateMesh(const Mesh & mesh)
|
|||||||
|
|
||||||
if(polygons_.size() != polygons.size())
|
if(polygons_.size() != polygons.size())
|
||||||
{
|
{
|
||||||
updatePolygons(polygons, polygonsLowRes);
|
updatePolygons(polygons, polygonsLowRes, createWireframe);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!pose_.isNull())
|
if(!pose_.isNull())
|
||||||
@@ -857,7 +877,8 @@ void PointCloudDrawable::Render(
|
|||||||
int screenHeight,
|
int screenHeight,
|
||||||
float nearClipPlane,
|
float nearClipPlane,
|
||||||
float farClipPlane,
|
float farClipPlane,
|
||||||
bool packDepthToColorChannel) const
|
bool packDepthToColorChannel,
|
||||||
|
bool wireFrame) const
|
||||||
{
|
{
|
||||||
if(vertex_buffers_ && nPoints_ && visible_ && !shaderPrograms_.empty())
|
if(vertex_buffers_ && nPoints_ && visible_ && !shaderPrograms_.empty())
|
||||||
{
|
{
|
||||||
@@ -1021,22 +1042,38 @@ void PointCloudDrawable::Render(
|
|||||||
{
|
{
|
||||||
if(distanceToCameraSqr<16.0f || polygonsLowRes_.empty())
|
if(distanceToCameraSqr<16.0f || polygonsLowRes_.empty())
|
||||||
{
|
{
|
||||||
glDrawElements(GL_TRIANGLES, polygons_.size(), GL_UNSIGNED_INT, polygons_.data());
|
wireFrame = wireFrame && polygonLines_.size();
|
||||||
|
if(wireFrame)
|
||||||
|
glDrawElements(GL_LINES, polygonLines_.size(), GL_UNSIGNED_INT, polygonLines_.data());
|
||||||
|
else
|
||||||
|
glDrawElements(GL_TRIANGLES, polygons_.size(), GL_UNSIGNED_INT, polygons_.data());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glDrawElements(GL_TRIANGLES, polygonsLowRes_.size(), GL_UNSIGNED_INT, polygonsLowRes_.data());
|
wireFrame = wireFrame && polygonLinesLowRes_.size();
|
||||||
|
if(wireFrame)
|
||||||
|
glDrawElements(GL_LINES, polygonLinesLowRes_.size(), GL_UNSIGNED_INT, polygonLinesLowRes_.data());
|
||||||
|
else
|
||||||
|
glDrawElements(GL_TRIANGLES, polygonsLowRes_.size(), GL_UNSIGNED_INT, polygonsLowRes_.data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(meshRendering && polygons_.size())
|
else if(meshRendering && polygons_.size())
|
||||||
{
|
{
|
||||||
if(distanceToCameraSqr<50.0f || polygonsLowRes_.empty())
|
if(distanceToCameraSqr<50.0f || polygonsLowRes_.empty())
|
||||||
{
|
{
|
||||||
glDrawElements(GL_TRIANGLES, polygons_.size(), GL_UNSIGNED_INT, polygons_.data());
|
wireFrame = wireFrame && polygonLines_.size();
|
||||||
|
if(wireFrame)
|
||||||
|
glDrawElements(GL_LINES, polygonLines_.size(), GL_UNSIGNED_INT, polygonLines_.data());
|
||||||
|
else
|
||||||
|
glDrawElements(GL_TRIANGLES, polygons_.size(), GL_UNSIGNED_INT, polygons_.data());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glDrawElements(GL_TRIANGLES, polygonsLowRes_.size(), GL_UNSIGNED_INT, polygonsLowRes_.data());
|
wireFrame = wireFrame && polygonLinesLowRes_.size();
|
||||||
|
if(wireFrame)
|
||||||
|
glDrawElements(GL_LINES, polygonLinesLowRes_.size(), GL_UNSIGNED_INT, polygonLinesLowRes_.data());
|
||||||
|
else
|
||||||
|
glDrawElements(GL_TRIANGLES, polygonsLowRes_.size(), GL_UNSIGNED_INT, polygonsLowRes_.data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(!verticesLowRes_.empty())
|
else if(!verticesLowRes_.empty())
|
||||||
|
|||||||
@@ -55,12 +55,13 @@ private:
|
|||||||
float gainG = 1.0f,
|
float gainG = 1.0f,
|
||||||
float gainB = 1.0f);
|
float gainB = 1.0f);
|
||||||
PointCloudDrawable(
|
PointCloudDrawable(
|
||||||
const Mesh & mesh);
|
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>());
|
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 updateCloud(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud, const pcl::IndicesPtr & indices);
|
||||||
void updateMesh(const Mesh & mesh);
|
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;}
|
||||||
void setGains(float gainR, float gainG, float gainB) {gainR_ = gainR; gainG_ = gainG; gainB_ = gainB;}
|
void setGains(float gainR, float gainG, float gainB) {gainR_ = gainR; gainG_ = gainG; gainB_ = gainB;}
|
||||||
@@ -69,6 +70,7 @@ private:
|
|||||||
bool isVisible() const {return visible_;}
|
bool isVisible() const {return visible_;}
|
||||||
bool hasMesh() const {return polygons_.size()!=0;}
|
bool hasMesh() const {return polygons_.size()!=0;}
|
||||||
bool hasTexture() const {return textures_ != 0;}
|
bool hasTexture() const {return textures_ != 0;}
|
||||||
|
float getMinHeight() const {return minHeight_;}
|
||||||
const pcl::PointXYZ & aabbMinModel() const {return aabbMinModel_;}
|
const pcl::PointXYZ & aabbMinModel() const {return aabbMinModel_;}
|
||||||
const pcl::PointXYZ & aabbMaxModel() const {return aabbMaxModel_;}
|
const pcl::PointXYZ & aabbMaxModel() const {return aabbMaxModel_;}
|
||||||
const pcl::PointXYZ & aabbMinWorld() const {return aabbMinWorld_;}
|
const pcl::PointXYZ & aabbMinWorld() const {return aabbMinWorld_;}
|
||||||
@@ -93,7 +95,8 @@ private:
|
|||||||
int screenHeight = 0, // nonnull if depthTexture>0
|
int screenHeight = 0, // nonnull if depthTexture>0
|
||||||
float nearClipPlane = 0, // nonnull if depthTexture>0
|
float nearClipPlane = 0, // nonnull if depthTexture>0
|
||||||
float farClipPlane = 0, // nonnull if depthTexture>0
|
float farClipPlane = 0, // nonnull if depthTexture>0
|
||||||
bool packDepthToColorChannel = false) const;
|
bool packDepthToColorChannel = false,
|
||||||
|
bool wireFrame = false) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<class PointT>
|
template<class PointT>
|
||||||
@@ -114,6 +117,8 @@ private:
|
|||||||
GLuint textures_;
|
GLuint textures_;
|
||||||
std::vector<GLuint> polygons_;
|
std::vector<GLuint> polygons_;
|
||||||
std::vector<GLuint> polygonsLowRes_;
|
std::vector<GLuint> polygonsLowRes_;
|
||||||
|
std::vector<GLuint> polygonLines_;
|
||||||
|
std::vector<GLuint> polygonLinesLowRes_;
|
||||||
std::vector<GLuint> verticesLowRes_;
|
std::vector<GLuint> verticesLowRes_;
|
||||||
std::vector<GLuint> verticesLowLowRes_;
|
std::vector<GLuint> verticesLowLowRes_;
|
||||||
int nPoints_;
|
int nPoints_;
|
||||||
@@ -122,6 +127,7 @@ private:
|
|||||||
bool visible_;
|
bool visible_;
|
||||||
bool hasNormals_;
|
bool hasNormals_;
|
||||||
std::vector<unsigned int> organizedToDenseIndices_;
|
std::vector<unsigned int> organizedToDenseIndices_;
|
||||||
|
float minHeight_; // odom frame
|
||||||
|
|
||||||
float gainR_;
|
float gainR_;
|
||||||
float gainG_;
|
float gainG_;
|
||||||
|
|||||||
+146
-9
@@ -16,12 +16,16 @@
|
|||||||
|
|
||||||
#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/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/transforms.h>
|
||||||
|
#include <pcl/common/common.h>
|
||||||
|
|
||||||
#include <glm/gtx/transform.hpp>
|
#include <glm/gtx/transform.hpp>
|
||||||
|
|
||||||
@@ -32,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);
|
||||||
@@ -86,6 +90,7 @@ Scene::Scene() :
|
|||||||
boundingBoxRendering_(false),
|
boundingBoxRendering_(false),
|
||||||
lighting_(false),
|
lighting_(false),
|
||||||
backfaceCulling_(true),
|
backfaceCulling_(true),
|
||||||
|
wireFrame_(false),
|
||||||
r_(0.0f),
|
r_(0.0f),
|
||||||
g_(0.0f),
|
g_(0.0f),
|
||||||
b_(0.0f),
|
b_(0.0f),
|
||||||
@@ -97,7 +102,7 @@ Scene::Scene() :
|
|||||||
{
|
{
|
||||||
gesture_camera_ = new tango_gl::GestureCamera();
|
gesture_camera_ = new tango_gl::GestureCamera();
|
||||||
gesture_camera_->SetCameraType(
|
gesture_camera_->SetCameraType(
|
||||||
tango_gl::GestureCamera::kFirstPerson);
|
tango_gl::GestureCamera::kThirdPersonFollow);
|
||||||
}
|
}
|
||||||
|
|
||||||
Scene::~Scene() {
|
Scene::~Scene() {
|
||||||
@@ -129,7 +134,7 @@ void Scene::InitGLContent()
|
|||||||
trace_->ClearVertexArray();
|
trace_->ClearVertexArray();
|
||||||
trace_->SetColor(kTraceColor);
|
trace_->SetColor(kTraceColor);
|
||||||
grid_->SetColor(kGridColor);
|
grid_->SetColor(kGridColor);
|
||||||
grid_->SetPosition(-kHeightOffset);
|
grid_->SetPosition(kHeightOffset);
|
||||||
box_->SetShader();
|
box_->SetShader();
|
||||||
box_->SetColor(1,0,0);
|
box_->SetColor(1,0,0);
|
||||||
|
|
||||||
@@ -183,6 +188,10 @@ void Scene::clear()
|
|||||||
{
|
{
|
||||||
delete iter->second;
|
delete iter->second;
|
||||||
}
|
}
|
||||||
|
for(std::map<int, tango_gl::Axis*>::iterator iter=markers_.begin(); iter!=markers_.end(); ++iter)
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
}
|
||||||
if(trace_)
|
if(trace_)
|
||||||
{
|
{
|
||||||
trace_->ClearVertexArray();
|
trace_->ClearVertexArray();
|
||||||
@@ -193,6 +202,11 @@ void Scene::clear()
|
|||||||
graph_ = 0;
|
graph_ = 0;
|
||||||
}
|
}
|
||||||
pointClouds_.clear();
|
pointClouds_.clear();
|
||||||
|
markers_.clear();
|
||||||
|
if(grid_)
|
||||||
|
{
|
||||||
|
grid_->SetPosition(kHeightOffset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Should only be called in OpenGL thread!
|
//Should only be called in OpenGL thread!
|
||||||
@@ -201,7 +215,7 @@ void Scene::SetupViewPort(int w, int h) {
|
|||||||
LOGE("Setup graphic height not valid");
|
LOGE("Setup graphic height not valid");
|
||||||
}
|
}
|
||||||
UASSERT(gesture_camera_ != 0);
|
UASSERT(gesture_camera_ != 0);
|
||||||
gesture_camera_->SetAspectRatio(static_cast<float>(w) / static_cast<float>(h));
|
gesture_camera_->SetWindowSize(static_cast<float>(w), static_cast<float>(h));
|
||||||
glViewport(0, 0, w, h);
|
glViewport(0, 0, w, h);
|
||||||
if(screenWidth_ != w || fboId_ == 0)
|
if(screenWidth_ != w || fboId_ == 0)
|
||||||
{
|
{
|
||||||
@@ -426,7 +440,7 @@ int Scene::Render() {
|
|||||||
|
|
||||||
UTimer timer;
|
UTimer timer;
|
||||||
|
|
||||||
bool onlineBlending = blending_ && mapRendering_ && meshRendering_ && cloudsToDraw.size()>1;
|
bool onlineBlending = blending_ && gesture_camera_->GetCameraType()!=tango_gl::GestureCamera::kTopOrtho && mapRendering_ && meshRendering_ && cloudsToDraw.size()>1;
|
||||||
if(onlineBlending && fboId_)
|
if(onlineBlending && fboId_)
|
||||||
{
|
{
|
||||||
// set the rendering destination to FBO
|
// set the rendering destination to FBO
|
||||||
@@ -533,7 +547,7 @@ int Scene::Render() {
|
|||||||
cloud->getPose().z() - openglCamera.z());
|
cloud->getPose().z() - openglCamera.z());
|
||||||
float distanceToCameraSqr = cloudToCamera[0]*cloudToCamera[0] + cloudToCamera[1]*cloudToCamera[1] + cloudToCamera[2]*cloudToCamera[2];
|
float distanceToCameraSqr = cloudToCamera[0]*cloudToCamera[0] + cloudToCamera[1]*cloudToCamera[1] + cloudToCamera[2]*cloudToCamera[2];
|
||||||
|
|
||||||
cloud->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, meshRenderingTexture_, lighting_, distanceToCameraSqr, onlineBlending?depthTexture_:0, screenWidth_, screenHeight_, gesture_camera_->getNearClipPlane(), gesture_camera_->getFarClipPlane());
|
cloud->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, meshRenderingTexture_, lighting_, distanceToCameraSqr, onlineBlending?depthTexture_:0, screenWidth_, screenHeight_, gesture_camera_->getNearClipPlane(), gesture_camera_->getFarClipPlane(), false, wireFrame_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(onlineBlending)
|
if(onlineBlending)
|
||||||
@@ -542,6 +556,12 @@ int Scene::Render() {
|
|||||||
glDepthMask(GL_TRUE);
|
glDepthMask(GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//draw markers on foreground
|
||||||
|
for(std::map<int, tango_gl::Axis*>::const_iterator iter=markers_.begin(); iter!=markers_.end(); ++iter)
|
||||||
|
{
|
||||||
|
iter->second->Render(projectionMatrix, viewMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
return (int)cloudsToDraw.size();
|
return (int)cloudsToDraw.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -556,6 +576,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)
|
||||||
@@ -563,7 +601,6 @@ 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,
|
||||||
@@ -622,6 +659,53 @@ void Scene::setTraceVisible(bool visible)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Should only be called in OpenGL thread!
|
//Should only be called in OpenGL thread!
|
||||||
|
void Scene::addMarker(
|
||||||
|
int id,
|
||||||
|
const rtabmap::Transform & pose)
|
||||||
|
{
|
||||||
|
LOGI("add marker %d", id);
|
||||||
|
std::map<int, tango_gl::Axis*>::iterator iter=markers_.find(id);
|
||||||
|
if(iter == markers_.end())
|
||||||
|
{
|
||||||
|
//create
|
||||||
|
tango_gl::Axis * drawable = new tango_gl::Axis();
|
||||||
|
drawable->SetScale(glm::vec3(0.05f,0.05f,0.05f));
|
||||||
|
drawable->SetLineWidth(5);
|
||||||
|
markers_.insert(std::make_pair(id, drawable));
|
||||||
|
}
|
||||||
|
setMarkerPose(id, pose);
|
||||||
|
}
|
||||||
|
void Scene::setMarkerPose(int id, const rtabmap::Transform & pose)
|
||||||
|
{
|
||||||
|
UASSERT(!pose.isNull());
|
||||||
|
std::map<int, tango_gl::Axis*>::iterator iter=markers_.find(id);
|
||||||
|
if(iter != markers_.end())
|
||||||
|
{
|
||||||
|
glm::vec3 position(pose.x(), pose.y(), pose.z());
|
||||||
|
Eigen::Quaternionf quat = pose.getQuaternionf();
|
||||||
|
glm::quat rotation(quat.w(), quat.x(), quat.y(), quat.z());
|
||||||
|
iter->second->SetPosition(position);
|
||||||
|
iter->second->SetRotation(rotation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool Scene::hasMarker(int id) const
|
||||||
|
{
|
||||||
|
return markers_.find(id) != markers_.end();
|
||||||
|
}
|
||||||
|
void Scene::removeMarker(int id)
|
||||||
|
{
|
||||||
|
std::map<int, tango_gl::Axis*>::iterator iter=markers_.find(id);
|
||||||
|
if(iter != markers_.end())
|
||||||
|
{
|
||||||
|
delete iter->second;
|
||||||
|
markers_.erase(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::set<int> Scene::getAddedMarkers() const
|
||||||
|
{
|
||||||
|
return uKeysSet(markers_);
|
||||||
|
}
|
||||||
|
|
||||||
void Scene::addCloud(
|
void Scene::addCloud(
|
||||||
int id,
|
int id,
|
||||||
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
@@ -645,7 +729,8 @@ void Scene::addCloud(
|
|||||||
void Scene::addMesh(
|
void Scene::addMesh(
|
||||||
int id,
|
int id,
|
||||||
const Mesh & mesh,
|
const Mesh & mesh,
|
||||||
const rtabmap::Transform & pose)
|
const rtabmap::Transform & pose,
|
||||||
|
bool createWireframe)
|
||||||
{
|
{
|
||||||
LOGI("add mesh %d", id);
|
LOGI("add mesh %d", id);
|
||||||
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
|
||||||
@@ -656,9 +741,61 @@ void Scene::addMesh(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//create
|
//create
|
||||||
PointCloudDrawable * drawable = new PointCloudDrawable(mesh);
|
PointCloudDrawable * drawable = new PointCloudDrawable(mesh, createWireframe);
|
||||||
drawable->setPose(pose);
|
drawable->setPose(pose);
|
||||||
pointClouds_.insert(std::make_pair(id, drawable));
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+17
-1
@@ -57,6 +57,8 @@ 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 setScreenRotation(TangoSupportRotation colorCameraToDisplayRotation) {color_camera_to_display_rotation_ = colorCameraToDisplayRotation;}
|
||||||
|
|
||||||
@@ -100,6 +102,12 @@ class Scene {
|
|||||||
void setGridVisible(bool visible);
|
void setGridVisible(bool visible);
|
||||||
void setTraceVisible(bool visible);
|
void setTraceVisible(bool visible);
|
||||||
|
|
||||||
|
void addMarker(int id, const rtabmap::Transform & pose);
|
||||||
|
void setMarkerPose(int id, const rtabmap::Transform & pose);
|
||||||
|
bool hasMarker(int id) const;
|
||||||
|
void removeMarker(int id);
|
||||||
|
std::set<int> getAddedMarkers() const;
|
||||||
|
|
||||||
void addCloud(
|
void addCloud(
|
||||||
int id,
|
int id,
|
||||||
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
@@ -108,7 +116,8 @@ class Scene {
|
|||||||
void addMesh(
|
void addMesh(
|
||||||
int id,
|
int id,
|
||||||
const Mesh & mesh,
|
const Mesh & mesh,
|
||||||
const rtabmap::Transform & pose);
|
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);
|
||||||
@@ -124,8 +133,12 @@ class Scene {
|
|||||||
void setMapRendering(bool enabled) {mapRendering_ = enabled;}
|
void setMapRendering(bool enabled) {mapRendering_ = enabled;}
|
||||||
void setMeshRendering(bool enabled, bool withTexture) {meshRendering_ = enabled; meshRenderingTexture_ = withTexture;}
|
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 setLighting(bool enabled) {lighting_ = enabled;}
|
||||||
void setBackfaceCulling(bool enabled) {backfaceCulling_ = 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 setBackgroundColor(float r, float g, float b) {r_=r; g_=g; b_=b;} // 0.0f <> 1.0f
|
||||||
void setGridColor(float r, float g, float b);
|
void setGridColor(float r, float g, float b);
|
||||||
|
|
||||||
@@ -160,6 +173,8 @@ class Scene {
|
|||||||
bool gridVisible_;
|
bool gridVisible_;
|
||||||
bool traceVisible_;
|
bool traceVisible_;
|
||||||
|
|
||||||
|
std::map<int, tango_gl::Axis*> markers_;
|
||||||
|
|
||||||
TangoSupportRotation color_camera_to_display_rotation_;
|
TangoSupportRotation color_camera_to_display_rotation_;
|
||||||
|
|
||||||
std::map<int, PointCloudDrawable*> pointClouds_;
|
std::map<int, PointCloudDrawable*> pointClouds_;
|
||||||
@@ -177,6 +192,7 @@ class Scene {
|
|||||||
bool boundingBoxRendering_;
|
bool boundingBoxRendering_;
|
||||||
bool lighting_;
|
bool lighting_;
|
||||||
bool backfaceCulling_;
|
bool backfaceCulling_;
|
||||||
|
bool wireFrame_;
|
||||||
float r_;
|
float r_;
|
||||||
float g_;
|
float g_;
|
||||||
float b_;
|
float b_;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
width_ = 800.0f;
|
||||||
|
height_ = 600.0f;
|
||||||
near_clip_plane_ = 0.2f;
|
near_clip_plane_ = 0.2f;
|
||||||
far_clip_plane_ = 1000.0f;
|
far_clip_plane_ = 1000.0f;
|
||||||
|
ortho_ = false;
|
||||||
|
orthoScale_ = 2.0f;
|
||||||
|
orthoCropFactor_ = -1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::mat4 Camera::GetViewMatrix() {
|
glm::mat4 Camera::GetViewMatrix() {
|
||||||
@@ -31,12 +36,17 @@ 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) {
|
||||||
|
|||||||
@@ -62,68 +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) * kRotationSpeed;
|
glm::vec2 offset;
|
||||||
float rotation_y = (touch0_start_position_.x - x0) * kRotationSpeed;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
default: { break; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (touch_count == 2) {
|
|
||||||
switch (event) {
|
|
||||||
case kTouch1Down: {
|
|
||||||
float abs_x = x0 - x1;
|
|
||||||
float abs_y = y0 - y1;
|
|
||||||
start_touch_dist_ = std::sqrt(abs_x * abs_x + abs_y * abs_y);
|
|
||||||
cam_start_dist_ = GetPosition().z;
|
|
||||||
|
|
||||||
// center touch
|
if(camera_type_!=kTopOrtho)
|
||||||
touch0_start_position_.x = (x0+x1)/2.0f;
|
cam_cur_angle_.x = cam_start_angle_.x + rotation_x;
|
||||||
touch0_start_position_.y = (y0+y1)/2.0f;
|
cam_cur_angle_.y = cam_start_angle_.y + rotation_y;
|
||||||
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);
|
|
||||||
|
|
||||||
cam_cur_dist_ = tango_gl::util::Clamp(cam_start_dist_ + dist * kZoomSpeed,
|
StartCameraToCurrentTransform();
|
||||||
kCamViewMinDist, kCamViewMaxDist);
|
|
||||||
|
|
||||||
glm::vec2 touch_center_position((x0+x1)/2.0f, (y0+y1)/2.0f);
|
break;
|
||||||
glm::vec2 offset;
|
}
|
||||||
offset.x = (touch_center_position.x - touch0_start_position_.x) * kMoveSpeed;
|
default: { break; }
|
||||||
offset.y = (touch_center_position.y - touch0_start_position_.y) * kMoveSpeed;
|
}
|
||||||
touch0_start_position_ = touch_center_position;
|
}
|
||||||
|
if (touch_count == 2) {
|
||||||
|
switch (event) {
|
||||||
|
case kTouch1Down: {
|
||||||
|
float abs_x = x0 - x1;
|
||||||
|
float abs_y = y0 - y1;
|
||||||
|
start_touch_dist_ = std::sqrt(abs_x * abs_x + abs_y * abs_y);
|
||||||
|
cam_start_dist_ = GetPosition().z;
|
||||||
|
cam_start_fov_ = this->getFOV();
|
||||||
|
|
||||||
StartCameraToCurrentTransform();
|
// center touch
|
||||||
|
touch0_start_position_.x = (x0+x1)/2.0f;
|
||||||
|
touch0_start_position_.y = (y0+y1)/2.0f;
|
||||||
|
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);
|
||||||
|
|
||||||
anchor_offset_ += glm::rotate(cam_parent_transform_->GetRotation(), glm::vec3(-offset.x, offset.y, 0));
|
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);
|
||||||
|
|
||||||
break;
|
this->SetOrthoMode(camera_type_ == kTopOrtho);
|
||||||
}
|
if(camera_type_ == kTopOrtho)
|
||||||
default: { break; }
|
{
|
||||||
}
|
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,
|
||||||
@@ -164,6 +179,7 @@ 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));
|
||||||
@@ -177,7 +193,8 @@ 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;
|
||||||
@@ -188,9 +205,10 @@ void GestureCamera::SetCameraType(CameraType camera_index) {
|
|||||||
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);
|
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;
|
||||||
@@ -198,6 +216,19 @@ void GestureCamera::SetCameraType(CameraType camera_index) {
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,11 @@ 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);
|
void SetNearFarClipPlanes(const float near, const float far);
|
||||||
|
|
||||||
glm::mat4 GetViewMatrix();
|
glm::mat4 GetViewMatrix();
|
||||||
@@ -55,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 {
|
||||||
@@ -80,6 +81,7 @@ 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_;
|
glm::vec3 anchor_offset_;
|
||||||
|
|
||||||
|
|||||||
@@ -44,8 +44,8 @@ class LogHandler : public UEventsHandler
|
|||||||
public:
|
public:
|
||||||
LogHandler()
|
LogHandler()
|
||||||
{
|
{
|
||||||
ULogger::setLevel(ULogger::kWarning);
|
ULogger::setLevel(ULogger::kDebug);
|
||||||
ULogger::setEventLevel(ULogger::kWarning);
|
ULogger::setEventLevel(ULogger::kDebug);
|
||||||
ULogger::setPrintThreadId(true);
|
ULogger::setPrintThreadId(true);
|
||||||
|
|
||||||
registerToEventsManager();
|
registerToEventsManager();
|
||||||
|
|||||||
@@ -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,13 +15,31 @@
|
|||||||
-->
|
-->
|
||||||
<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"/>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true">
|
||||||
|
|
||||||
|
<ToggleButton
|
||||||
|
android:id="@+id/wireframe_button"
|
||||||
|
android:layout_width="100dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_above="@+id/light_button"
|
||||||
|
android:layout_alignLeft="@+id/light_button"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_marginBottom="5dp"
|
||||||
|
android:layout_marginRight="5dp"
|
||||||
|
android:paddingRight="5dp"
|
||||||
|
android:textOff="@string/wireframe"
|
||||||
|
android:textOn="@string/wireframe" />
|
||||||
|
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
android:id="@+id/light_button"
|
android:id="@+id/light_button"
|
||||||
@@ -30,7 +48,7 @@
|
|||||||
android:layout_above="@+id/backface_button"
|
android:layout_above="@+id/backface_button"
|
||||||
android:layout_alignLeft="@+id/backface_button"
|
android:layout_alignLeft="@+id/backface_button"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:layout_marginBottom="15dp"
|
android:layout_marginBottom="5dp"
|
||||||
android:layout_marginRight="5dp"
|
android:layout_marginRight="5dp"
|
||||||
android:paddingRight="5dp"
|
android:paddingRight="5dp"
|
||||||
android:textOff="@string/light_off"
|
android:textOff="@string/light_off"
|
||||||
@@ -40,60 +58,36 @@
|
|||||||
android:id="@+id/backface_button"
|
android:id="@+id/backface_button"
|
||||||
android:layout_width="100dp"
|
android:layout_width="100dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_above="@+id/first_person_button"
|
android:layout_above="@+id/camera_button"
|
||||||
android:layout_alignLeft="@+id/first_person_button"
|
android:layout_alignRight="@+id/camera_button"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:layout_marginBottom="5dp"
|
android:layout_marginBottom="15dp"
|
||||||
android:layout_marginRight="5dp"
|
android:layout_marginRight="5dp"
|
||||||
android:paddingRight="5dp"
|
android:paddingRight="5dp"
|
||||||
android:textOff="@string/backface_off"
|
android:textOff="@string/backface_off"
|
||||||
android:textOn="@string/backface_on" />
|
android:textOn="@string/backface_on" />
|
||||||
|
|
||||||
<ToggleButton
|
<com.introlab.rtabmap.NDSpinner
|
||||||
android:id="@+id/first_person_button"
|
android:id="@+id/camera_button"
|
||||||
android:layout_width="100dp"
|
android:layout_width="140dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="40dp"
|
||||||
android:layout_above="@+id/third_person_button"
|
|
||||||
android:layout_alignLeft="@+id/third_person_button"
|
|
||||||
android:layout_alignParentRight="true"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:layout_marginRight="5dp"
|
|
||||||
android:paddingRight="5dp"
|
|
||||||
android:textOff="@string/first_person"
|
|
||||||
android:textOn="@string/first_person" />
|
|
||||||
|
|
||||||
<ToggleButton
|
|
||||||
android:id="@+id/third_person_button"
|
|
||||||
android:layout_width="100dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_above="@+id/top_down_button"
|
|
||||||
android:layout_alignParentRight="true"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:layout_marginRight="5dp"
|
|
||||||
android:paddingRight="5dp"
|
|
||||||
android:textOff="@string/third_person"
|
|
||||||
android:textOn="@string/third_person" />
|
|
||||||
|
|
||||||
<ToggleButton
|
|
||||||
android:id="@+id/top_down_button"
|
|
||||||
android:layout_width="100dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
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:textOff="@string/top_down"
|
android:paddingBottom="10dp"
|
||||||
android:textOn="@string/top_down" />
|
android:text="@string/camera_button"
|
||||||
|
android:spinnerMode="dropdown"/>
|
||||||
|
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
android:id="@+id/pause_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_alignLeft="@+id/first_person_button"
|
android:layout_marginRight="5dp"
|
||||||
android:layout_alignParentTop="true"
|
android:layout_alignParentTop="true"
|
||||||
android:layout_marginTop="61dp"
|
android:layout_marginTop="10dp"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:paddingRight="5dp"
|
|
||||||
android:textOff="@string/pause"
|
android:textOff="@string/pause"
|
||||||
android:textOn="@string/resume" />
|
android:textOn="@string/resume" />
|
||||||
|
|
||||||
@@ -101,26 +95,50 @@
|
|||||||
android:id="@+id/button_shareToSketchfab"
|
android:id="@+id/button_shareToSketchfab"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentTop="true"
|
android:layout_marginRight="5dp"
|
||||||
android:layout_alignRight="@+id/pause_button"
|
android:layout_marginTop="10dp"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_below="@+id/pause_button"
|
||||||
android:text="@string/share_to_sketchfab" />
|
android:text="@string/share_to_sketchfab" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/button_saveOnDevice"
|
android:id="@+id/button_saveOnDevice"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentTop="true"
|
android:layout_alignRight="@+id/button_shareToSketchfab"
|
||||||
android:layout_toLeftOf="@+id/button_shareToSketchfab"
|
android:layout_below="@+id/button_shareToSketchfab"
|
||||||
android:text="@string/save_to_file" />
|
android:text="@string/save_to_file" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/close_visualization_button"
|
android:id="@+id/close_visualization_button"
|
||||||
android:layout_width="200dp"
|
android:layout_width="200dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignBaseline="@+id/top_down_button"
|
android:layout_above="@+id/camera_button"
|
||||||
android:layout_alignBottom="@+id/top_down_button"
|
|
||||||
android:layout_centerHorizontal="true"
|
android:layout_centerHorizontal="true"
|
||||||
android:paddingLeft="5dp"
|
|
||||||
android:text="@string/close_visualization" />
|
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>
|
||||||
@@ -58,12 +58,12 @@
|
|||||||
android:entries="@array/pref_background_color_keys"
|
android:entries="@array/pref_background_color_keys"
|
||||||
android:entryValues="@array/pref_background_color_values"
|
android:entryValues="@array/pref_background_color_values"
|
||||||
android:defaultValue="@string/pref_default_background_color"/>
|
android:defaultValue="@string/pref_default_background_color"/>
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_blending"
|
android:key="@string/pref_key_blending"
|
||||||
android:title="@string/pref_title_blending"
|
android:title="@string/pref_title_blending"
|
||||||
android:summary="@string/pref_summary_blending"
|
android:summary="@string/pref_summary_blending"
|
||||||
android:defaultValue="@string/pref_default_blending"/>
|
android:defaultValue="@string/pref_default_blending"/>
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_nodes_filtering"
|
android:key="@string/pref_key_nodes_filtering"
|
||||||
android:title="@string/pref_title_nodes_filtering"
|
android:title="@string/pref_title_nodes_filtering"
|
||||||
android:summary="@string/pref_summary_nodes_filtering"
|
android:summary="@string/pref_summary_nodes_filtering"
|
||||||
@@ -79,22 +79,22 @@
|
|||||||
android:summary="@string/pref_summary_mapping"
|
android:summary="@string/pref_summary_mapping"
|
||||||
android:persistent="false">
|
android:persistent="false">
|
||||||
|
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_append"
|
android:key="@string/pref_key_append"
|
||||||
android:title="@string/pref_title_append"
|
android:title="@string/pref_title_append"
|
||||||
android:summary="@string/pref_summary_append"
|
android:summary="@string/pref_summary_append"
|
||||||
android:defaultValue="@string/pref_default_append"/>
|
android:defaultValue="@string/pref_default_append"/>
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_resolution"
|
android:key="@string/pref_key_resolution"
|
||||||
android:title="@string/pref_title_resolution"
|
android:title="@string/pref_title_resolution"
|
||||||
android:summary="@string/pref_summary_resolution"
|
android:summary="@string/pref_summary_resolution"
|
||||||
android:defaultValue="@string/pref_default_resolution"/>
|
android:defaultValue="@string/pref_default_resolution"/>
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_smoothing"
|
android:key="@string/pref_key_smoothing"
|
||||||
android:title="@string/pref_title_smoothing"
|
android:title="@string/pref_title_smoothing"
|
||||||
android:summary="@string/pref_summary_smoothing"
|
android:summary="@string/pref_summary_smoothing"
|
||||||
android:defaultValue="@string/pref_default_smoothing"/>
|
android:defaultValue="@string/pref_default_smoothing"/>
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_fisheye"
|
android:key="@string/pref_key_fisheye"
|
||||||
android:title="@string/pref_title_fisheye"
|
android:title="@string/pref_title_fisheye"
|
||||||
android:summary="@string/pref_summary_fisheye"
|
android:summary="@string/pref_summary_fisheye"
|
||||||
@@ -109,6 +109,13 @@
|
|||||||
android:entries="@array/pref_update_rate_keys"
|
android:entries="@array/pref_update_rate_keys"
|
||||||
android:entryValues="@array/pref_update_rate_values"
|
android:entryValues="@array/pref_update_rate_values"
|
||||||
android:defaultValue="@string/pref_default_update_rate"/>
|
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
|
<ListPreference
|
||||||
android:key="@string/pref_key_time_thr"
|
android:key="@string/pref_key_time_thr"
|
||||||
android:title="@string/pref_title_time_thr"
|
android:title="@string/pref_title_time_thr"
|
||||||
@@ -179,25 +186,49 @@
|
|||||||
android:entries="@array/pref_optimizer_keys"
|
android:entries="@array/pref_optimizer_keys"
|
||||||
android:entryValues="@array/pref_optimizer_values"
|
android:entryValues="@array/pref_optimizer_values"
|
||||||
android:defaultValue="@string/pref_default_optimizer"/>
|
android:defaultValue="@string/pref_default_optimizer"/>
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_optimize_end"
|
android:key="@string/pref_key_optimize_end"
|
||||||
android:title="@string/pref_title_optimize_end"
|
android:title="@string/pref_title_optimize_end"
|
||||||
android:summary="@string/pref_summary_optimize_end"
|
android:summary="@string/pref_summary_optimize_end"
|
||||||
android:defaultValue="@string/pref_default_optimize_end"/>
|
android:defaultValue="@string/pref_default_optimize_end"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_marker_detection"
|
||||||
|
android:title="@string/pref_title_marker_detection"
|
||||||
|
android:summary="@string/pref_summary_marker_detection"
|
||||||
|
android:entries="@array/pref_marker_detection_keys"
|
||||||
|
android:entryValues="@array/pref_marker_detection_values"
|
||||||
|
android:defaultValue="@string/pref_default_marker_detection"/>
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/pref_key_marker_detection_depth_error"
|
||||||
|
android:title="@string/pref_title_marker_detection_depth_error"
|
||||||
|
android:summary="@string/pref_summary_marker_detection_depth_error"
|
||||||
|
android:entries="@array/pref_marker_detection_depth_error_keys"
|
||||||
|
android:entryValues="@array/pref_marker_detection_depth_error_values"
|
||||||
|
android:defaultValue="@string/pref_default_marker_detection_depth_error"/>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/pref_title_mapping_database">
|
android:title="@string/pref_title_mapping_database">
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_keep_all_db"
|
android:key="@string/pref_key_keep_all_db"
|
||||||
android:title="@string/pref_title_keep_all_db"
|
android:title="@string/pref_title_keep_all_db"
|
||||||
android:summary="@string/pref_summary_keep_all_db"
|
android:summary="@string/pref_summary_keep_all_db"
|
||||||
android:defaultValue="@string/pref_default_keep_all_db"/>
|
android:defaultValue="@string/pref_default_keep_all_db"/>
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_raw_scan_saved"
|
android:key="@string/pref_key_raw_scan_saved"
|
||||||
android:title="@string/pref_title_raw_scan_saved"
|
android:title="@string/pref_title_raw_scan_saved"
|
||||||
android:summary="@string/pref_summary_raw_scan_saved"
|
android:summary="@string/pref_summary_raw_scan_saved"
|
||||||
android:defaultValue="@string/pref_default_raw_scan_saved"/>
|
android:defaultValue="@string/pref_default_raw_scan_saved"/>
|
||||||
<SwitchPreference
|
<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_env_sensors_saved"
|
||||||
|
android:title="@string/pref_title_env_sensors_saved"
|
||||||
|
android:summary="@string/pref_summary_env_sensors_saved"
|
||||||
|
android:defaultValue="@string/pref_default_env_sensors_saved"/>
|
||||||
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_db_in_memory"
|
android:key="@string/pref_key_db_in_memory"
|
||||||
android:title="@string/pref_title_db_in_memory"
|
android:title="@string/pref_title_db_in_memory"
|
||||||
android:summary="@string/pref_summary_db_in_memory"
|
android:summary="@string/pref_summary_db_in_memory"
|
||||||
@@ -227,6 +258,14 @@
|
|||||||
android:entryValues="@array/pref_texture_size_values"
|
android:entryValues="@array/pref_texture_size_values"
|
||||||
android:defaultValue="@string/pref_default_texture_size"/>
|
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
|
<ListPreference
|
||||||
android:key="@string/pref_key_normal_k"
|
android:key="@string/pref_key_normal_k"
|
||||||
android:title="@string/pref_title_normal_k"
|
android:title="@string/pref_title_normal_k"
|
||||||
@@ -251,7 +290,7 @@
|
|||||||
android:entryValues="@array/pref_min_texture_cluster_size_values"
|
android:entryValues="@array/pref_min_texture_cluster_size_values"
|
||||||
android:defaultValue="@string/pref_default_min_texture_cluster_size"/>
|
android:defaultValue="@string/pref_default_min_texture_cluster_size"/>
|
||||||
|
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_block_render"
|
android:key="@string/pref_key_block_render"
|
||||||
android:title="@string/pref_title_block_render"
|
android:title="@string/pref_title_block_render"
|
||||||
android:summary="@string/pref_summary_block_render"
|
android:summary="@string/pref_summary_block_render"
|
||||||
@@ -278,16 +317,23 @@
|
|||||||
android:entryValues="@array/pref_opt_color_radius_values"
|
android:entryValues="@array/pref_opt_color_radius_values"
|
||||||
android:defaultValue="@string/pref_default_opt_color_radius"/>
|
android:defaultValue="@string/pref_default_opt_color_radius"/>
|
||||||
|
|
||||||
<SwitchPreference
|
<com.introlab.rtabmap.CustomSwitchPreference
|
||||||
android:key="@string/pref_key_opt_clean_white"
|
android:key="@string/pref_key_opt_clean_white"
|
||||||
android:title="@string/pref_title_opt_clean_white"
|
android:title="@string/pref_title_opt_clean_white"
|
||||||
android:summary="@string/pref_summary_opt_clean_white"
|
android:summary="@string/pref_summary_opt_clean_white"
|
||||||
android:defaultValue="@string/pref_default_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>
|
</PreferenceCategory>
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
<ListPreference
|
||||||
<ListPreference
|
|
||||||
android:key="@string/pref_key_gain_max_radius"
|
android:key="@string/pref_key_gain_max_radius"
|
||||||
android:title="@string/pref_title_gain_max_radius"
|
android:title="@string/pref_title_gain_max_radius"
|
||||||
android:summary="@string/pref_summary_gain_max_radius"
|
android:summary="@string/pref_summary_gain_max_radius"
|
||||||
@@ -301,7 +347,20 @@
|
|||||||
android:entries="@array/pref_cluster_ratio_keys"
|
android:entries="@array/pref_cluster_ratio_keys"
|
||||||
android:entryValues="@array/pref_cluster_ratio_values"
|
android:entryValues="@array/pref_cluster_ratio_values"
|
||||||
android:defaultValue="@string/pref_default_cluster_ratio"/>
|
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"
|
<Preference android:title="@string/pref_title_reset_button"
|
||||||
android:key="@string/pref_key_reset_button"/>
|
android:key="@string/pref_key_reset_button"/>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
<resources>
|
||||||
|
<dimen name="image_width">150dp</dimen>
|
||||||
|
</resources>
|
||||||
@@ -8,15 +8,14 @@
|
|||||||
<string name="sketchfab">Upload to Sketchfab…</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="top_down">Top</string>
|
|
||||||
<string name="pause">Pause</string>
|
<string name="pause">Pause</string>
|
||||||
<string name="resume">Resume</string>
|
<string name="resume">Resume</string>
|
||||||
<string name="backface_on">Backface</string>
|
<string name="backface_on">Backface</string>
|
||||||
<string name="backface_off">Backface</string>
|
<string name="backface_off">Backface</string>
|
||||||
<string name="light_on">Lighting</string>
|
<string name="light_on">Lighting</string>
|
||||||
<string name="light_off">Lighting</string>
|
<string name="light_off">Lighting</string>
|
||||||
|
<string name="wireframe">Wireframe</string>
|
||||||
<string name="close_visualization">Close Visualization</string>
|
<string name="close_visualization">Close Visualization</string>
|
||||||
<string name="save_to_file">Export to File…</string>
|
<string name="save_to_file">Export to File…</string>
|
||||||
<string name="share_to_sketchfab">Share to Sketchfab…</string>
|
<string name="share_to_sketchfab">Share to Sketchfab…</string>
|
||||||
@@ -35,12 +34,19 @@
|
|||||||
<string name="memory">"Used 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="fps">"FPS (rendering): "</string>
|
||||||
|
<string name="distance">"Distance travelled: "</string>
|
||||||
|
<string name="gps">"GPS (long,lat,alt,bearing,err): "</string>
|
||||||
|
<string name="env_sensors">"Sensors: "</string>
|
||||||
|
<string name="time">"Time: "</string>
|
||||||
|
|
||||||
<!-- Preference keys: BEGIN -->
|
<!-- Preference keys: BEGIN -->
|
||||||
<string name="pref_key_tags">pref_key_tags</string>
|
<string name="pref_key_tags">pref_key_tags</string>
|
||||||
<string name="pref_default_tags">rtabmap 3dscan tango</string>
|
<string name="pref_default_tags">rtabmap 3dscan tango</string>
|
||||||
<string name="pref_key_rendering">pref_key_rendering</string>
|
<string name="pref_key_rendering">pref_key_rendering</string>
|
||||||
<string name="pref_default_rendering">2</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_reset_button">pref_key_reset_button</string>
|
||||||
<string name="pref_key_density">pref_key_density</string>
|
<string name="pref_key_density">pref_key_density</string>
|
||||||
<string name="pref_default_density">1</string>
|
<string name="pref_default_density">1</string>
|
||||||
@@ -49,7 +55,7 @@
|
|||||||
<string name="pref_key_depth">pref_key_depth</string>
|
<string name="pref_key_depth">pref_key_depth</string>
|
||||||
<string name="pref_default_depth">2.5</string>
|
<string name="pref_default_depth">2.5</string>
|
||||||
<string name="pref_key_point_size">pref_key_point_size</string>
|
<string name="pref_key_point_size">pref_key_point_size</string>
|
||||||
<string name="pref_default_point_size">5</string>
|
<string name="pref_default_point_size">10</string>
|
||||||
<string name="pref_key_angle">pref_key_angle</string>
|
<string name="pref_key_angle">pref_key_angle</string>
|
||||||
<string name="pref_default_angle">20</string>
|
<string name="pref_default_angle">20</string>
|
||||||
<string name="pref_key_triangle">pref_key_triangle</string>
|
<string name="pref_key_triangle">pref_key_triangle</string>
|
||||||
@@ -73,6 +79,8 @@
|
|||||||
|
|
||||||
<string name="pref_key_update_rate">pref_key_update_rate</string>
|
<string name="pref_key_update_rate">pref_key_update_rate</string>
|
||||||
<string name="pref_default_update_rate">1</string>
|
<string name="pref_default_update_rate">1</string>
|
||||||
|
<string name="pref_key_max_speed">pref_key_max_speed</string>
|
||||||
|
<string name="pref_default_max_speed">0</string>
|
||||||
<string name="pref_key_time_thr">pref_key_time_thr</string>
|
<string name="pref_key_time_thr">pref_key_time_thr</string>
|
||||||
<string name="pref_default_time_thr">1000</string>
|
<string name="pref_default_time_thr">1000</string>
|
||||||
<string name="pref_key_mem_thr">pref_key_mem_thr</string>
|
<string name="pref_key_mem_thr">pref_key_mem_thr</string>
|
||||||
@@ -84,7 +92,7 @@
|
|||||||
<string name="pref_key_min_inliers">pref_key_min_inliers</string>
|
<string name="pref_key_min_inliers">pref_key_min_inliers</string>
|
||||||
<string name="pref_default_min_inliers">25</string>
|
<string name="pref_default_min_inliers">25</string>
|
||||||
<string name="pref_key_opt_error">pref_key_opt_error</string>
|
<string name="pref_key_opt_error">pref_key_opt_error</string>
|
||||||
<string name="pref_default_opt_error">0.1</string>
|
<string name="pref_default_opt_error">3</string>
|
||||||
<string name="pref_key_features_voc">pref_key_features_voc</string>
|
<string name="pref_key_features_voc">pref_key_features_voc</string>
|
||||||
<string name="pref_default_features_voc">200</string>
|
<string name="pref_default_features_voc">200</string>
|
||||||
<string name="pref_key_features">pref_key_features</string>
|
<string name="pref_key_features">pref_key_features</string>
|
||||||
@@ -95,17 +103,27 @@
|
|||||||
<string name="pref_default_optimizer">2</string>
|
<string name="pref_default_optimizer">2</string>
|
||||||
<string name="pref_key_optimize_end">pref_key_optimize_end</string>
|
<string name="pref_key_optimize_end">pref_key_optimize_end</string>
|
||||||
<string name="pref_default_optimize_end">true</string>
|
<string name="pref_default_optimize_end">true</string>
|
||||||
|
<string name="pref_key_marker_detection">pref_key_marker_detection</string>
|
||||||
|
<string name="pref_default_marker_detection">-1</string>
|
||||||
|
<string name="pref_key_marker_detection_depth_error">pref_key_marker_detection_depth_error</string>
|
||||||
|
<string name="pref_default_marker_detection_depth_error">0.1</string>
|
||||||
<string name="pref_key_keep_all_db">pref_key_keep_all_db</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_default_keep_all_db">true</string>
|
||||||
<string name="pref_key_raw_scan_saved">pref_key_raw_scan_saved</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_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_env_sensors_saved">pref_key_env_sensors_saved</string>
|
||||||
|
<string name="pref_default_env_sensors_saved">false</string>
|
||||||
<string name="pref_key_db_in_memory">pref_key_db_in_memory</string>
|
<string name="pref_key_db_in_memory">pref_key_db_in_memory</string>
|
||||||
<string name="pref_default_db_in_memory">true</string>
|
<string name="pref_default_db_in_memory">false</string>
|
||||||
|
|
||||||
<string name="pref_key_cloud_voxel">pref_key_cloud_voxel</string>
|
<string name="pref_key_cloud_voxel">pref_key_cloud_voxel</string>
|
||||||
<string name="pref_default_cloud_voxel">0.01</string>
|
<string name="pref_default_cloud_voxel">0.01</string>
|
||||||
<string name="pref_key_texture_size">pref_key_texture_size</string>
|
<string name="pref_key_texture_size">pref_key_texture_size</string>
|
||||||
<string name="pref_default_texture_size">4096</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_key_normal_k">pref_key_normal_k</string>
|
||||||
<string name="pref_default_normal_k">18</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_key_max_texture_distance">pref_key_max_texture_distance</string>
|
||||||
@@ -120,10 +138,14 @@
|
|||||||
<string name="pref_default_opt_color_radius">0.05</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_key_opt_clean_white">pref_key_opt_clean_white</string>
|
||||||
<string name="pref_default_opt_clean_white">true</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_key_gain_max_radius">pref_key_gain_max_radius</string>
|
||||||
<string name="pref_default_gain_max_radius">0.02</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_key_cluster_ratio">pref_key_cluster_ratio</string>
|
||||||
<string name="pref_default_cluster_ratio">0.05</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 -->
|
<!-- Preference keys: END -->
|
||||||
|
|
||||||
<string name="pref_title_rendering">Rendering</string>
|
<string name="pref_title_rendering">Rendering</string>
|
||||||
@@ -302,9 +324,11 @@
|
|||||||
<string name="pref_title_smoothing">Smoothing</string>
|
<string name="pref_title_smoothing">Smoothing</string>
|
||||||
<string name="pref_summary_smoothing">Smooth the point clouds.</string>
|
<string name="pref_summary_smoothing">Smooth the point clouds.</string>
|
||||||
<string name="pref_title_fisheye">Fish Eye Camera</string>
|
<string name="pref_title_fisheye">Fish Eye Camera</string>
|
||||||
<string name="pref_summary_fisheye">Use fish eye camera instead of the color camera. Cannot be used on Yellowstone tablet.</string>
|
<string name="pref_summary_fisheye">Use fish eye camera instead of the color camera. May not work on some devices.</string>
|
||||||
<string name="pref_title_update_rate">Update Rate</string>
|
<string name="pref_title_update_rate">Update Rate</string>
|
||||||
<string name="pref_summary_update_rate">Rate at which a new node is added to map.</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_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_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_title_mem_thr">Memory Limit</string>
|
||||||
@@ -316,7 +340,7 @@
|
|||||||
<string name="pref_title_min_inliers">Min Inliers</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_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_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 threshold.</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_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_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_title_features">Max Features Extracted (Loop Closure)</string>
|
||||||
@@ -327,10 +351,18 @@
|
|||||||
<string name="pref_summary_optimizer">Graph optimization approach.</string>
|
<string name="pref_summary_optimizer">Graph optimization approach.</string>
|
||||||
<string name="pref_title_optimize_end">Optimization from Graph End</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_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_marker_detection">ArUco Marker Detection</string>
|
||||||
|
<string name="pref_summary_marker_detection">ArUco markers can be detected for localization and graph optimization.</string>
|
||||||
|
<string name="pref_title_marker_detection_depth_error">Marker Depth Error Estimation</string>
|
||||||
|
<string name="pref_summary_marker_detection_depth_error">Size of markers are automatically initialized on the first marker seen. All markers should have the same size. This value is the maximum depth error to do the initialization to get accurate size of the tag. The lower it is, the more perpendicular the camera should be from the marker to do initialization, but size estimated would be more accurate.</string>
|
||||||
<string name="pref_title_keep_all_db">Save All Frames in Database</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_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_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_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 to database.</string>
|
||||||
|
<string name="pref_title_env_sensors_saved">Save Environmental Sensors</string>
|
||||||
|
<string name="pref_summary_env_sensors_saved">Save Wifi strength, temperature, air pressure, light intensity and relative humidity to database.</string>
|
||||||
<string name="pref_title_db_in_memory">Database In Memory</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 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>
|
||||||
|
|
||||||
@@ -352,6 +384,20 @@
|
|||||||
<item>"1"</item>
|
<item>"1"</item>
|
||||||
<item>"0.5"</item>
|
<item>"0.5"</item>
|
||||||
</string-array>
|
</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">
|
<string-array name="pref_time_thr_keys">
|
||||||
<item>"No Limit"</item>
|
<item>"No Limit"</item>
|
||||||
<item>"1500 ms"</item>
|
<item>"1500 ms"</item>
|
||||||
@@ -461,25 +507,29 @@
|
|||||||
<item>"10"</item>
|
<item>"10"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="pref_opt_error_keys">
|
<string-array name="pref_opt_error_keys">
|
||||||
<item>"1.0 m"</item>
|
<item>"10x"</item>
|
||||||
<item>"0.5 m"</item>
|
<item>"9x"</item>
|
||||||
<item>"0.35 m"</item>
|
<item>"8x"</item>
|
||||||
<item>"0.2 m"</item>
|
<item>"7x"</item>
|
||||||
<item>"0.1 m"</item>
|
<item>"6x"</item>
|
||||||
<item>"0.05 m"</item>
|
<item>"5x"</item>
|
||||||
<item>"0.025 m"</item>
|
<item>"4x"</item>
|
||||||
<item>"0.01 m"</item>
|
<item>"3x"</item>
|
||||||
|
<item>"2x"</item>
|
||||||
|
<item>"1x"</item>
|
||||||
<item>"Disabled"</item>
|
<item>"Disabled"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="pref_opt_error_values">
|
<string-array name="pref_opt_error_values">
|
||||||
<item>"1.0"</item>
|
<item>"10"</item>
|
||||||
<item>"0.5"</item>
|
<item>"9"</item>
|
||||||
<item>"0.35"</item>
|
<item>"8"</item>
|
||||||
<item>"0.2"</item>
|
<item>"7"</item>
|
||||||
<item>"0.1"</item>
|
<item>"6"</item>
|
||||||
<item>"0.05"</item>
|
<item>"5"</item>
|
||||||
<item>"0.025"</item>
|
<item>"4"</item>
|
||||||
<item>"0.01"</item>
|
<item>"3"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"1"</item>
|
||||||
<item>"0"</item>
|
<item>"0"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="pref_features_voc_keys">
|
<string-array name="pref_features_voc_keys">
|
||||||
@@ -554,6 +604,91 @@
|
|||||||
<item>"1"</item>
|
<item>"1"</item>
|
||||||
<item>"0"</item>
|
<item>"0"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="pref_marker_detection_keys">
|
||||||
|
<item>"Disabled"</item>
|
||||||
|
<item>"4X4_50"</item>
|
||||||
|
<item>"4X4_100"</item>
|
||||||
|
<item>"4X4_250"</item>
|
||||||
|
<item>"4X4_1000"</item>
|
||||||
|
<item>"5X5_50"</item>
|
||||||
|
<item>"5X5_100"</item>
|
||||||
|
<item>"5X5_250"</item>
|
||||||
|
<item>"5X5_1000"</item>
|
||||||
|
<item>"6X6_50"</item>
|
||||||
|
<item>"6X6_100"</item>
|
||||||
|
<item>"6X6_250"</item>
|
||||||
|
<item>"6X6_1000"</item>
|
||||||
|
<item>"7X7_50"</item>
|
||||||
|
<item>"7X7_100"</item>
|
||||||
|
<item>"7X7_250"</item>
|
||||||
|
<item>"7X7_1000"</item>
|
||||||
|
<item>"ARUCO_ORIGINAL"</item>
|
||||||
|
<item>"APRILTAG_16h5"</item>
|
||||||
|
<item>"APRILTAG_25h9"</item>
|
||||||
|
<item>"APRILTAG_36h10"</item>
|
||||||
|
<item>"APRILTAG_36h11"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_marker_detection_values">
|
||||||
|
<item>"-1"</item>
|
||||||
|
<item>"0"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
<item>"2"</item>
|
||||||
|
<item>"3"</item>
|
||||||
|
<item>"4"</item>
|
||||||
|
<item>"5"</item>
|
||||||
|
<item>"6"</item>
|
||||||
|
<item>"7"</item>
|
||||||
|
<item>"8"</item>
|
||||||
|
<item>"9"</item>
|
||||||
|
<item>"10"</item>
|
||||||
|
<item>"11"</item>
|
||||||
|
<item>"12"</item>
|
||||||
|
<item>"13"</item>
|
||||||
|
<item>"14"</item>
|
||||||
|
<item>"15"</item>
|
||||||
|
<item>"16"</item>
|
||||||
|
<item>"17"</item>
|
||||||
|
<item>"18"</item>
|
||||||
|
<item>"19"</item>
|
||||||
|
<item>"20"</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="pref_marker_detection_depth_error_keys">
|
||||||
|
<item>"1 cm"</item>
|
||||||
|
<item>"2 cm"</item>
|
||||||
|
<item>"3 cm"</item>
|
||||||
|
<item>"4 cm"</item>
|
||||||
|
<item>"5 cm"</item>
|
||||||
|
<item>"6 cm"</item>
|
||||||
|
<item>"7 cm"</item>
|
||||||
|
<item>"8 cm"</item>
|
||||||
|
<item>"9 cm"</item>
|
||||||
|
<item>"10 cm"</item>
|
||||||
|
<item>"15 cm"</item>
|
||||||
|
<item>"20 cm"</item>
|
||||||
|
<item>"30 cm"</item>
|
||||||
|
<item>"40 cm"</item>
|
||||||
|
<item>"50 cm"</item>
|
||||||
|
<item>"100 cm"</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="pref_marker_detection_depth_error_values">
|
||||||
|
<item>"0.01"</item>
|
||||||
|
<item>"0.02"</item>
|
||||||
|
<item>"0.03"</item>
|
||||||
|
<item>"0.04"</item>
|
||||||
|
<item>"0.05"</item>
|
||||||
|
<item>"0.06"</item>
|
||||||
|
<item>"0.07"</item>
|
||||||
|
<item>"0.08"</item>
|
||||||
|
<item>"0.09"</item>
|
||||||
|
<item>"0.1"</item>
|
||||||
|
<item>"0.15"</item>
|
||||||
|
<item>"0.20"</item>
|
||||||
|
<item>"0.30"</item>
|
||||||
|
<item>"0.40"</item>
|
||||||
|
<item>"0.50"</item>
|
||||||
|
<item>"1"</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
<string name="pref_title_export_sub">Exporting…</string>
|
<string name="pref_title_export_sub">Exporting…</string>
|
||||||
<string name="pref_title_export">Exporting</string>
|
<string name="pref_title_export">Exporting</string>
|
||||||
@@ -562,6 +697,8 @@
|
|||||||
<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_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_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_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_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_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_title_max_texture_distance">Max Texture Distance</string>
|
||||||
@@ -603,6 +740,26 @@
|
|||||||
<item>"2048"</item>
|
<item>"2048"</item>
|
||||||
<item>"1024"</item>
|
<item>"1024"</item>
|
||||||
</string-array>
|
</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">
|
<string-array name="pref_normal_k_values">
|
||||||
<item>"30"</item>
|
<item>"30"</item>
|
||||||
<item>"24"</item>
|
<item>"24"</item>
|
||||||
@@ -631,22 +788,22 @@
|
|||||||
<item>"2"</item>
|
<item>"2"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="pref_min_texture_cluster_size_keys">
|
<string-array name="pref_min_texture_cluster_size_keys">
|
||||||
<item>"Disabled"</item>
|
|
||||||
<item>"1000"</item>
|
<item>"1000"</item>
|
||||||
<item>"500"</item>
|
<item>"500"</item>
|
||||||
<item>"200"</item>
|
<item>"200"</item>
|
||||||
<item>"100"</item>
|
<item>"100"</item>
|
||||||
<item>"50"</item>
|
<item>"50"</item>
|
||||||
<item>"10"</item>
|
<item>"10"</item>
|
||||||
|
<item>"Disabled"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="pref_min_texture_cluster_size_values">
|
<string-array name="pref_min_texture_cluster_size_values">
|
||||||
<item>"0"</item>
|
|
||||||
<item>"1000"</item>
|
<item>"1000"</item>
|
||||||
<item>"500"</item>
|
<item>"500"</item>
|
||||||
<item>"200"</item>
|
<item>"200"</item>
|
||||||
<item>"100"</item>
|
<item>"100"</item>
|
||||||
<item>"50"</item>
|
<item>"50"</item>
|
||||||
<item>"10"</item>
|
<item>"10"</item>
|
||||||
|
<item>"0"</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string name="pref_title_optimized">Optimized</string>
|
<string name="pref_title_optimized">Optimized</string>
|
||||||
@@ -658,7 +815,9 @@
|
|||||||
<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_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_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_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">
|
<string-array name="pref_opt_depth_keys">
|
||||||
<item>"Auto"</item>
|
<item>"Auto"</item>
|
||||||
<item>"12"</item>
|
<item>"12"</item>
|
||||||
@@ -707,12 +866,22 @@
|
|||||||
<item>"0.01"</item>
|
<item>"0.01"</item>
|
||||||
<item>"-1"</item>
|
<item>"-1"</item>
|
||||||
</string-array>
|
</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_general">General</string>
|
||||||
<string name="pref_title_gain_max_radius">Color Correction Radius</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_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_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_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">
|
<string-array name="pref_gain_max_radius_keys">
|
||||||
<item>"0.3 m"</item>
|
<item>"0.3 m"</item>
|
||||||
@@ -763,6 +932,10 @@
|
|||||||
<item>"0.01"</item>
|
<item>"0.01"</item>
|
||||||
</string-array>
|
</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="pref_title_reset_button">Restore All Default Settings</string>
|
||||||
<string name="title_activity_sketchfab">SketchfabActivity</string>
|
<string name="title_activity_sketchfab">SketchfabActivity</string>
|
||||||
<string name="hello_world">Hello world!</string>
|
<string name="hello_world">Hello world!</string>
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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
@@ -28,6 +28,7 @@ public class RTABMapLib
|
|||||||
public static native void setScreenRotation(int displayRotation, int cameraRotation);
|
public static native void setScreenRotation(int displayRotation, int cameraRotation);
|
||||||
|
|
||||||
public static native int openDatabase(String databasePath, boolean databaseInMemory, boolean optimize);
|
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.
|
* Called when the Tango service is connected.
|
||||||
@@ -77,8 +78,12 @@ public class RTABMapLib
|
|||||||
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 setMinCloudDepth(float value);
|
||||||
public static native void setPointSize(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 setLighting(boolean enabled);
|
||||||
public static native void setBackfaceCulling(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 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);
|
||||||
@@ -87,16 +92,24 @@ public class RTABMapLib
|
|||||||
public static native void setRenderingTextureDecimation(int value);
|
public static native void setRenderingTextureDecimation(int value);
|
||||||
public static native void setBackgroundColor(float gray);
|
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 addEnvSensor(int type, float value);
|
||||||
|
|
||||||
public static native void resetMapping();
|
public static native void resetMapping();
|
||||||
public static native void save(String outputDatabasePath);
|
public static native void save(String outputDatabasePath);
|
||||||
public static native void cancelProcessing();
|
public static native void cancelProcessing();
|
||||||
public static native boolean exportMesh(
|
public static native boolean exportMesh(
|
||||||
String filePath,
|
|
||||||
float cloudVoxelSize,
|
float cloudVoxelSize,
|
||||||
boolean regenerateCloud,
|
boolean regenerateCloud,
|
||||||
boolean meshing,
|
boolean meshing,
|
||||||
int textureSize,
|
int textureSize,
|
||||||
|
int textureCount,
|
||||||
int normalK,
|
int normalK,
|
||||||
boolean optimized,
|
boolean optimized,
|
||||||
float optimizedVoxelSize,
|
float optimizedVoxelSize,
|
||||||
@@ -104,10 +117,11 @@ public class RTABMapLib
|
|||||||
int optimizedMaxPolygons,
|
int optimizedMaxPolygons,
|
||||||
float optimizedColorRadius,
|
float optimizedColorRadius,
|
||||||
boolean optimizedCleanWhitePolygons,
|
boolean optimizedCleanWhitePolygons,
|
||||||
boolean optimizedColorWhitePolygons,
|
int optimizedMinClusterSize,
|
||||||
float optimizedMaxTextureDistance,
|
float optimizedMaxTextureDistance,
|
||||||
int optimizedMinTextureClusterSize,
|
int optimizedMinTextureClusterSize,
|
||||||
boolean blockRendering);
|
boolean blockRendering);
|
||||||
|
public static native boolean writeExportedMesh(String directory, String name);
|
||||||
public static native boolean postExportation(boolean visualize);
|
public static native boolean postExportation(boolean visualize);
|
||||||
public static native int postProcessing(int approach);
|
public static native int postProcessing(int approach);
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ public class Renderer implements GLSurfaceView.Renderer {
|
|||||||
private TextManager mTextManager = null;
|
private TextManager mTextManager = null;
|
||||||
private float mSurfaceHeight = 0.0f;
|
private float mSurfaceHeight = 0.0f;
|
||||||
private float mTextColor = 1.0f;
|
private float mTextColor = 1.0f;
|
||||||
|
private int mOffset = 0;
|
||||||
|
|
||||||
private Vector<TextObject> mTexts;
|
private Vector<TextObject> mTexts;
|
||||||
|
|
||||||
@@ -65,6 +66,11 @@ public class Renderer implements GLSurfaceView.Renderer {
|
|||||||
{
|
{
|
||||||
mToast = toast;
|
mToast = toast;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setOffset(int offset)
|
||||||
|
{
|
||||||
|
mOffset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
// Render loop of the Gl context.
|
// Render loop of the Gl context.
|
||||||
public void onDrawFrame(GL10 useGLES20instead) {
|
public void onDrawFrame(GL10 useGLES20instead) {
|
||||||
@@ -94,7 +100,9 @@ public class Renderer implements GLSurfaceView.Renderer {
|
|||||||
mTextManager.PrepareDraw(txtcollection);
|
mTextManager.PrepareDraw(txtcollection);
|
||||||
}
|
}
|
||||||
|
|
||||||
mTextManager.Draw(mtrxProjectionAndView);
|
float[] mvp = new float[16];
|
||||||
|
Matrix.translateM(mvp, 0, mtrxProjectionAndView, 0, 0, mOffset, 0);
|
||||||
|
mTextManager.Draw(mvp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value != 0 && mProgressDialog != null && mProgressDialog.isShowing())
|
if(value != 0 && mProgressDialog != null && mProgressDialog.isShowing())
|
||||||
@@ -103,6 +111,7 @@ public class Renderer implements GLSurfaceView.Renderer {
|
|||||||
public void run() {
|
public void run() {
|
||||||
if(!RTABMapActivity.DISABLE_LOG) Log.i("RTABMapActivity", "Renderer: dismiss dialog, value received=" + String.valueOf(value));
|
if(!RTABMapActivity.DISABLE_LOG) Log.i("RTABMapActivity", "Renderer: dismiss dialog, value received=" + String.valueOf(value));
|
||||||
mProgressDialog.dismiss();
|
mProgressDialog.dismiss();
|
||||||
|
mActivity.resetNoTouchTimer();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,36 @@
|
|||||||
package com.introlab.rtabmap;
|
package com.introlab.rtabmap;
|
||||||
|
|
||||||
import android.app.Activity;
|
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;
|
||||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.ListPreference;
|
import android.preference.ListPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceActivity;
|
import android.preference.PreferenceActivity;
|
||||||
import android.preference.PreferenceManager;
|
import android.text.InputType;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
|
import android.widget.EditText;
|
||||||
|
|
||||||
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
|
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
|
private SettingsActivity getActivity() {return this;}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
addPreferencesFromResource(R.layout.activity_settings);
|
addPreferencesFromResource(R.layout.activity_settings);
|
||||||
|
|
||||||
Preference button = findPreference(getString(R.string.pref_key_reset_button));
|
Preference buttonReset = findPreference(getString(R.string.pref_key_reset_button));
|
||||||
button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
buttonReset.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
getPreferenceScreen().getSharedPreferences().edit().clear().commit();
|
getPreferenceScreen().getSharedPreferences().edit().clear().commit();
|
||||||
@@ -28,6 +41,150 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
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_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_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_min_depth))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_min_depth))).getEntry() + ") "+getString(R.string.pref_summary_min_depth));
|
||||||
@@ -38,6 +195,7 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
((Preference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
((Preference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
||||||
|
|
||||||
((Preference)findPreference(getString(R.string.pref_key_update_rate))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_update_rate))).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
((Preference)findPreference(getString(R.string.pref_key_update_rate))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_update_rate))).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_max_speed))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_speed))).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
||||||
((Preference)findPreference(getString(R.string.pref_key_time_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_time_thr))).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
((Preference)findPreference(getString(R.string.pref_key_time_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_time_thr))).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
||||||
((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_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_loop_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_loop_thr))).getEntry() + ") "+getString(R.string.pref_summary_loop_thr));
|
||||||
@@ -48,16 +206,20 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
((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))).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_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_optimizer))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_optimizer))).getEntry() + ") "+getString(R.string.pref_summary_optimizer));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_marker_detection))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_marker_detection))).getEntry() + ") "+getString(R.string.pref_summary_marker_detection));
|
||||||
|
((Preference)findPreference(getString(R.string.pref_key_marker_detection_depth_error))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_marker_detection_depth_error))).getEntry() + ") "+getString(R.string.pref_summary_marker_detection_depth_error));
|
||||||
|
|
||||||
((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_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_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_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_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_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_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_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_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));
|
((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));
|
||||||
}
|
}
|
||||||
@@ -94,6 +256,7 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
if(key.compareTo(getString(R.string.pref_key_rendering_texture_decimation))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
if(key.compareTo(getString(R.string.pref_key_rendering_texture_decimation))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
|
||||||
|
|
||||||
if(key.compareTo(getString(R.string.pref_key_update_rate))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
if(key.compareTo(getString(R.string.pref_key_update_rate))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_max_speed))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
|
||||||
if(key.compareTo(getString(R.string.pref_key_time_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
if(key.compareTo(getString(R.string.pref_key_time_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
|
||||||
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_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_loop_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_loop_thr));
|
||||||
@@ -104,15 +267,19 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
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))==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_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_optimizer))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_optimizer));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_marker_detection))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_marker_detection));
|
||||||
|
if(key.compareTo(getString(R.string.pref_key_marker_detection_depth_error))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_marker_detection_depth_error));
|
||||||
|
|
||||||
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_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_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_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_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_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_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_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_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));
|
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));
|
||||||
@@ -135,4 +302,33 @@ public class SettingsActivity extends PreferenceActivity implements OnSharedPref
|
|||||||
getPreferenceScreen().getSharedPreferences()
|
getPreferenceScreen().getSharedPreferences()
|
||||||
.unregisterOnSharedPreferenceChangeListener(this);
|
.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.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ public class SketchfabActivity extends Activity implements OnClickListener {
|
|||||||
private Dialog mAuthDialog;
|
private Dialog mAuthDialog;
|
||||||
|
|
||||||
private String mAuthToken;
|
private String mAuthToken;
|
||||||
private boolean mExportedOBJ;
|
|
||||||
private String mWorkingDirectory;
|
private String mWorkingDirectory;
|
||||||
|
|
||||||
EditText mFilename;
|
EditText mFilename;
|
||||||
@@ -67,10 +66,10 @@ public class SketchfabActivity extends Activity implements OnClickListener {
|
|||||||
mButtonOk = (Button)findViewById(R.id.button_ok);
|
mButtonOk = (Button)findViewById(R.id.button_ok);
|
||||||
|
|
||||||
mProgressDialog = new ProgressDialog(this);
|
mProgressDialog = new ProgressDialog(this);
|
||||||
|
mProgressDialog.setCancelable(false);
|
||||||
mProgressDialog.setCanceledOnTouchOutside(false);
|
mProgressDialog.setCanceledOnTouchOutside(false);
|
||||||
|
|
||||||
mAuthToken = getIntent().getExtras().getString(RTABMapActivity.RTABMAP_AUTH_TOKEN_KEY);
|
mAuthToken = getIntent().getExtras().getString(RTABMapActivity.RTABMAP_AUTH_TOKEN_KEY);
|
||||||
mExportedOBJ = getIntent().getExtras().getBoolean(RTABMapActivity.RTABMAP_EXPORTED_OBJ_KEY);
|
|
||||||
mFilename.setText(getIntent().getExtras().getString(RTABMapActivity.RTABMAP_FILENAME_KEY));
|
mFilename.setText(getIntent().getExtras().getString(RTABMapActivity.RTABMAP_FILENAME_KEY));
|
||||||
mWorkingDirectory = getIntent().getExtras().getString(RTABMapActivity.RTABMAP_WORKING_DIR_KEY);
|
mWorkingDirectory = getIntent().getExtras().getString(RTABMapActivity.RTABMAP_WORKING_DIR_KEY);
|
||||||
|
|
||||||
@@ -129,51 +128,7 @@ public class SketchfabActivity extends Activity implements OnClickListener {
|
|||||||
editor.commit();
|
editor.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
final String extension = mExportedOBJ?".obj":".ply";
|
authorizeAndPublish(mFilename.getText().toString());
|
||||||
|
|
||||||
String[] files = new String[0];
|
|
||||||
// verify if we have all files
|
|
||||||
if(extension.compareTo(".obj") == 0)
|
|
||||||
{
|
|
||||||
File objFile = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR + RTABMapActivity.RTABMAP_TMP_FILENAME + ".obj");
|
|
||||||
File mltFile = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR + RTABMapActivity.RTABMAP_TMP_FILENAME + ".mtl");
|
|
||||||
File jpgFile = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR + RTABMapActivity.RTABMAP_TMP_FILENAME + ".jpg");
|
|
||||||
if(objFile.exists() && mltFile.exists() && jpgFile.exists())
|
|
||||||
{
|
|
||||||
files = new String[3];
|
|
||||||
files[0] = objFile.getAbsolutePath();
|
|
||||||
files[1] = mltFile.getAbsolutePath();
|
|
||||||
files[2] = jpgFile.getAbsolutePath();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Toast.makeText(getActivity(), String.format("Missing OBJ files!"), Toast.LENGTH_LONG).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(extension.compareTo(".ply") == 0)
|
|
||||||
{
|
|
||||||
File plyFile = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR + RTABMapActivity.RTABMAP_TMP_FILENAME + extension);
|
|
||||||
if(plyFile.exists())
|
|
||||||
{
|
|
||||||
files = new String[1];
|
|
||||||
files[0] = plyFile.getAbsolutePath();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Toast.makeText(getActivity(), String.format("Missing PLY file!"), Toast.LENGTH_LONG).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Toast.makeText(getActivity(), String.format("Unknown file extension \"%s\"!", extension), Toast.LENGTH_LONG).show();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(files.length > 0)
|
|
||||||
{
|
|
||||||
final String[] filesToZip = files;
|
|
||||||
authorizeAndPublish(filesToZip, mFilename.getText().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isNetworkAvailable() {
|
private boolean isNetworkAvailable() {
|
||||||
@@ -183,24 +138,27 @@ public class SketchfabActivity extends Activity implements OnClickListener {
|
|||||||
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
|
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void authorizeAndPublish(final String[] filesToZip, final String fileName)
|
private void authorizeAndPublish(final String fileName)
|
||||||
{
|
{
|
||||||
if(!isNetworkAvailable())
|
if(!isNetworkAvailable())
|
||||||
{
|
{
|
||||||
// Visualize the result?
|
// Visualize the result?
|
||||||
new AlertDialog.Builder(this)
|
AlertDialog ad = new AlertDialog.Builder(this)
|
||||||
|
.setCancelable(false)
|
||||||
.setTitle("Sharing to Sketchfab...")
|
.setTitle("Sharing to Sketchfab...")
|
||||||
.setMessage("Network is not available. Make sure you have internet before continuing.")
|
.setMessage("Network is not available. Make sure you have internet before continuing.")
|
||||||
.setPositiveButton("Try Again", new DialogInterface.OnClickListener() {
|
.setPositiveButton("Try Again", new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
authorizeAndPublish(filesToZip, fileName);
|
authorizeAndPublish(fileName);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.setNeutralButton("Abort", new DialogInterface.OnClickListener() {
|
.setNeutralButton("Abort", new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.show();
|
.create();
|
||||||
|
ad.setCanceledOnTouchOutside(false);
|
||||||
|
ad.show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,6 +169,8 @@ public class SketchfabActivity extends Activity implements OnClickListener {
|
|||||||
|
|
||||||
WebView web;
|
WebView web;
|
||||||
mAuthDialog = new Dialog(this);
|
mAuthDialog = new Dialog(this);
|
||||||
|
mAuthDialog.setCancelable(false);
|
||||||
|
mAuthDialog.setCanceledOnTouchOutside(false);
|
||||||
mAuthDialog.setContentView(R.layout.auth_dialog);
|
mAuthDialog.setContentView(R.layout.auth_dialog);
|
||||||
web = (WebView)mAuthDialog.findViewById(R.id.webv);
|
web = (WebView)mAuthDialog.findViewById(R.id.webv);
|
||||||
web.setWebContentsDebuggingEnabled(!RTABMapActivity.DISABLE_LOG);
|
web.setWebContentsDebuggingEnabled(!RTABMapActivity.DISABLE_LOG);
|
||||||
@@ -240,82 +200,138 @@ public class SketchfabActivity extends Activity implements OnClickListener {
|
|||||||
|
|
||||||
mAuthDialog.dismiss();
|
mAuthDialog.dismiss();
|
||||||
|
|
||||||
zipAndPublish(filesToZip, fileName);
|
zipAndPublish(fileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mAuthDialog.show();
|
mAuthDialog.show();
|
||||||
mAuthDialog.setTitle("Authorize RTAB-Map");
|
mAuthDialog.setTitle("Authorize RTAB-Map");
|
||||||
mAuthDialog.setCancelable(true);
|
|
||||||
web.loadUrl(auth_url);
|
web.loadUrl(auth_url);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
zipAndPublish(filesToZip, fileName);
|
zipAndPublish(fileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void zipAndPublish(final String[] filesToZip, final String fileName)
|
private void zipAndPublish(final String fileName)
|
||||||
{
|
{
|
||||||
final String zipOutput = mWorkingDirectory+fileName+".zip";
|
|
||||||
|
|
||||||
mProgressDialog.setTitle("Upload to Sketchfab");
|
mProgressDialog.setTitle("Upload to Sketchfab");
|
||||||
mProgressDialog.setMessage(String.format("Compressing the files..."));
|
mProgressDialog.setMessage(String.format("Compressing the files..."));
|
||||||
|
mProgressDialog.setCancelable(false);
|
||||||
|
mProgressDialog.setCanceledOnTouchOutside(false);
|
||||||
mProgressDialog.show();
|
mProgressDialog.show();
|
||||||
|
|
||||||
Thread workingThread = new Thread(new Runnable() {
|
Thread workingThread = new Thread(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try{
|
try{
|
||||||
Util.zip(filesToZip, zipOutput);
|
|
||||||
runOnUiThread(new Runnable() {
|
File tmpDir = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR);
|
||||||
public void run() {
|
tmpDir.mkdirs();
|
||||||
mProgressDialog.dismiss();
|
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));
|
||||||
File f = new File(zipOutput);
|
for(int i=0; i<fileNames.length; ++i)
|
||||||
|
{
|
||||||
// Continue?
|
File f = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR + "/" + fileNames[i]);
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
if(f.delete())
|
||||||
builder.setTitle("File(s) compressed and ready to upload!");
|
{
|
||||||
|
if(!RTABMapActivity.DISABLE_LOG) Log.i(RTABMapActivity.TAG, String.format("Deleted \"%s\"", f.getPath()));
|
||||||
final int fileSizeMB = (int)f.length()/(1024 * 1024);
|
}
|
||||||
final int fileSizeKB = (int)f.length()/(1024);
|
else
|
||||||
if(fileSizeMB == 0)
|
{
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
Log.i(RTABMapActivity.TAG, String.format("Zipped files = %d KB", fileSizeKB));
|
files[i] = mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR + "/" + fileNames[i];
|
||||||
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. ":""));
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
// Continue?
|
||||||
mProgressDialog.setTitle("Upload to Sketchfab");
|
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)
|
if(fileSizeMB == 0)
|
||||||
{
|
{
|
||||||
mProgressDialog.setMessage(String.format("Uploading model \"%s\" (%d KB) to Sketchfab...", fileName, fileSizeKB));
|
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
|
else
|
||||||
{
|
{
|
||||||
mProgressDialog.setMessage(String.format("Uploading model \"%s\" (%d MB) to Sketchfab...", fileName, fileSizeMB));
|
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. ":""));
|
||||||
}
|
}
|
||||||
mProgressDialog.show();
|
|
||||||
new uploadToSketchfabTask().execute(zipOutput, fileName);
|
|
||||||
|
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...
|
||||||
|
}
|
||||||
|
});
|
||||||
|
AlertDialog ad = builder.create();
|
||||||
|
ad.setCancelable(false);
|
||||||
|
ad.setCanceledOnTouchOutside(false);
|
||||||
|
ad.show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
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) {
|
catch(IOException ex) {
|
||||||
Log.e(RTABMapActivity.TAG, "Failed to zip", ex);
|
Log.e(RTABMapActivity.TAG, "Failed to zip", ex);
|
||||||
@@ -365,6 +381,7 @@ public class SketchfabActivity extends Activity implements OnClickListener {
|
|||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
}).create();
|
}).create();
|
||||||
|
d.setCanceledOnTouchOutside(false);
|
||||||
d.show();
|
d.show();
|
||||||
((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
|
((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public class TextManager {
|
|||||||
public static final int RI_TEXT_TEXTURE_SIZE = 512; // 512
|
public static final int RI_TEXT_TEXTURE_SIZE = 512; // 512
|
||||||
public static final float RI_TEXT_HEIGHT_BASE = 32.0f;
|
public static final float RI_TEXT_HEIGHT_BASE = 32.0f;
|
||||||
public static final char RI_TEXT_START = ' ';
|
public static final char RI_TEXT_START = ' ';
|
||||||
public static final char RI_TEXT_STOP = '~'+1;
|
public static final char RI_TEXT_STOP = '\u00B0'+1;
|
||||||
|
|
||||||
public float getMaxTextHeight() {return mTextHeight;}
|
public float getMaxTextHeight() {return mTextHeight;}
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,12 @@ package com.introlab.rtabmap;
|
|||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.FilenameFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipOutputStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
@@ -52,5 +55,72 @@ public class Util {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-3
@@ -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)
|
||||||
@@ -100,7 +104,7 @@ INSTALL(CODE "execute_process(COMMAND ln -s \"../MacOS/${CMAKE_BUNDLE_NAME}\" ${
|
|||||||
WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin)")
|
WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin)")
|
||||||
ENDIF(APPLE AND BUILD_AS_BUNDLE)
|
ENDIF(APPLE AND BUILD_AS_BUNDLE)
|
||||||
|
|
||||||
IF((APPLE AND BUILD_AS_BUNDLE) OR WIN32)
|
IF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
||||||
SET(APPS "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
|
SET(APPS "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
SET(plugin_dest_dir bin)
|
SET(plugin_dest_dir bin)
|
||||||
SET(qtconf_dest_dir bin)
|
SET(qtconf_dest_dir bin)
|
||||||
@@ -150,11 +154,28 @@ IF((APPLE AND BUILD_AS_BUNDLE) OR WIN32)
|
|||||||
get_filename_component(plugin_dir ${plugin_loc} DIRECTORY)
|
get_filename_component(plugin_dir ${plugin_loc} DIRECTORY)
|
||||||
string(REPLACE "plugins" ";" loc_list ${plugin_dir})
|
string(REPLACE "plugins" ";" loc_list ${plugin_dir})
|
||||||
list(GET loc_list 1 plugin_type)
|
list(GET loc_list 1 plugin_type)
|
||||||
|
IF(NOT plugin_root)
|
||||||
|
get_filename_component(plugin_root ${plugin_dir} DIRECTORY)
|
||||||
|
ENDIF(NOT plugin_root)
|
||||||
#MESSAGE(STATUS "Qt5 plugin \"${plugin_loc}\" installed in \"${plugin_dest_dir}/plugins${plugin_type}\"")
|
#MESSAGE(STATUS "Qt5 plugin \"${plugin_loc}\" installed in \"${plugin_dest_dir}/plugins${plugin_type}\"")
|
||||||
INSTALL(FILES ${plugin_loc}
|
INSTALL(FILES ${plugin_loc}
|
||||||
DESTINATION ${plugin_dest_dir}/plugins${plugin_type}
|
DESTINATION ${plugin_dest_dir}/plugins${plugin_type}
|
||||||
COMPONENT runtime)
|
COMPONENT runtime)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
IF(WIN32)
|
||||||
|
IF(NOT Qt5Widgets_VERSION VERSION_LESS 5.10.0)
|
||||||
|
SET(plugin_loc "${plugin_root}/styles/qwindowsvistastyle.dll")
|
||||||
|
IF(EXISTS ${plugin_loc})
|
||||||
|
get_filename_component(plugin_dir ${plugin_loc} DIRECTORY)
|
||||||
|
string(REPLACE "plugins" ";" loc_list ${plugin_dir})
|
||||||
|
list(GET loc_list 1 plugin_type)
|
||||||
|
INSTALL(FILES ${plugin_loc}
|
||||||
|
DESTINATION ${plugin_dest_dir}/plugins${plugin_type}
|
||||||
|
COMPONENT runtime)
|
||||||
|
#MESSAGE(STATUS "Qt5 plugin \"${plugin_loc}\" installed in \"${plugin_dest_dir}/plugins${plugin_type}\"")
|
||||||
|
ENDIF(EXISTS ${plugin_loc})
|
||||||
|
ENDIF(NOT Qt5Widgets_VERSION VERSION_LESS 5.10.0)
|
||||||
|
ENDIF(WIN32)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
# install a qt.conf file
|
# install a qt.conf file
|
||||||
@@ -185,5 +206,5 @@ IF((APPLE AND BUILD_AS_BUNDLE) OR WIN32)
|
|||||||
include(\"BundleUtilities\")
|
include(\"BundleUtilities\")
|
||||||
fixup_bundle(\"${APPS}\" \"\${QTPLUGINS}\" \"${DIRS}\")
|
fixup_bundle(\"${APPS}\" \"\${QTPLUGINS}\" \"${DIRS}\")
|
||||||
" COMPONENT runtime)
|
" COMPONENT runtime)
|
||||||
ENDIF((APPLE AND BUILD_AS_BUNDLE) OR WIN32)
|
ENDIF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public:
|
|||||||
}
|
}
|
||||||
virtual ~ObjDeletionHandler() {}
|
virtual ~ObjDeletionHandler() {}
|
||||||
|
|
||||||
signals:
|
Q_SIGNALS:
|
||||||
void objDeletionEventReceived(int);
|
void objDeletionEventReceived(int);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -55,7 +55,7 @@ protected:
|
|||||||
if(event->getClassName().compare("UObjDeletedEvent") == 0 &&
|
if(event->getClassName().compare("UObjDeletedEvent") == 0 &&
|
||||||
event->getCode() == _watchedId)
|
event->getCode() == _watchedId)
|
||||||
{
|
{
|
||||||
emit objDeletionEventReceived(_watchedId);
|
Q_EMIT objDeletionEventReceived(_watchedId);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-9
@@ -43,13 +43,13 @@ int main(int argc, char* argv[])
|
|||||||
{
|
{
|
||||||
/* Set logger type */
|
/* Set logger type */
|
||||||
ULogger::setType(ULogger::kTypeConsole);
|
ULogger::setType(ULogger::kTypeConsole);
|
||||||
ULogger::setLevel(ULogger::kInfo);
|
ULogger::setLevel(ULogger::kWarning);
|
||||||
|
|
||||||
/* 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
|
app->setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }"); // selectable message box
|
||||||
|
|
||||||
ParametersMap parameters = Parameters::parseArguments(argc, argv, true);
|
ParametersMap parameters = Parameters::parseArguments(argc, argv, false);
|
||||||
MainWindow * mainWindow = new MainWindow();
|
MainWindow * mainWindow = new MainWindow();
|
||||||
app->installEventFilter(mainWindow); // to catch FileOpen events.
|
app->installEventFilter(mainWindow); // to catch FileOpen events.
|
||||||
|
|
||||||
@@ -61,11 +61,10 @@ int main(int argc, char* argv[])
|
|||||||
UFile::getExtension(value).compare("db") == 0)
|
UFile::getExtension(value).compare("db") == 0)
|
||||||
{
|
{
|
||||||
database = value;
|
database = value;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UINFO("Program started...");
|
printf("Program started...\n");
|
||||||
|
|
||||||
UEventsManager::addHandler(mainWindow);
|
UEventsManager::addHandler(mainWindow);
|
||||||
|
|
||||||
@@ -85,9 +84,9 @@ int main(int argc, char* argv[])
|
|||||||
|
|
||||||
if(!database.empty())
|
if(!database.empty())
|
||||||
{
|
{
|
||||||
mainWindow->openDatabase(database.c_str());
|
mainWindow->openDatabase(database.c_str(), parameters);
|
||||||
}
|
}
|
||||||
if(parameters.size())
|
else if(parameters.size())
|
||||||
{
|
{
|
||||||
mainWindow->updateParameters(parameters);
|
mainWindow->updateParameters(parameters);
|
||||||
}
|
}
|
||||||
@@ -101,14 +100,13 @@ int main(int argc, char* argv[])
|
|||||||
UEventsManager::removeHandler(mainWindow);
|
UEventsManager::removeHandler(mainWindow);
|
||||||
UEventsManager::removeHandler(rtabmap);
|
UEventsManager::removeHandler(rtabmap);
|
||||||
|
|
||||||
UINFO("Killing threads...");
|
|
||||||
rtabmap->join(true);
|
rtabmap->join(true);
|
||||||
|
|
||||||
UINFO("Closing RTAB-Map...");
|
printf("Closing RTAB-Map...\n");
|
||||||
delete rtabmap;
|
delete rtabmap;
|
||||||
delete mainWindow;
|
delete mainWindow;
|
||||||
delete app;
|
delete app;
|
||||||
UINFO("All done!");
|
printf("All done!\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,32 +7,39 @@
|
|||||||
# FlyCapture2_LIBRARIES - The FlyCapture2 library to link against.
|
# FlyCapture2_LIBRARIES - The FlyCapture2 library to link against.
|
||||||
|
|
||||||
if(CMAKE_CL_64)
|
if(CMAKE_CL_64)
|
||||||
set(FlyCapture2_LIBDIR $ENV{FlyCapture2_ROOT_DIR}/lib64)
|
set(FlyCapture2_LIBDIR $ENV{FlyCapture2_ROOT_DIR}/lib64 $ENV{FC2LIB}/lib64)
|
||||||
else()
|
else()
|
||||||
set(FlyCapture2_LIBDIR $ENV{FlyCapture2_ROOT_DIR}/lib)
|
set(FlyCapture2_LIBDIR $ENV{FlyCapture2_ROOT_DIR}/lib $ENV{FC2LIB}/lib)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_CL_64)
|
if(CMAKE_CL_64)
|
||||||
set(Triclops_LIBDIR $ENV{Triclops_ROOT_DIR}/lib64)
|
set(Triclops_LIBDIR $ENV{Triclops_ROOT_DIR}/lib64 $ENV{TRICLOPSLIB}/lib64)
|
||||||
else()
|
else()
|
||||||
set(Triclops_LIBDIR $ENV{Triclops_ROOT_DIR}/lib)
|
set(Triclops_LIBDIR $ENV{Triclops_ROOT_DIR}/lib $ENV{TRICLOPSLIB}/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 $ENV{FC2LIB}/include $ENV{FC2LIB}/include/flycapture)
|
||||||
find_library(FlyCapture2_LIBRARY NAMES FlyCapture2_v100 FlyCapture2 flycapture2 NO_DEFAULT_PATH PATHS ${FlyCapture2_LIBDIR})
|
find_library(FlyCapture2_LIBRARY NAMES FlyCapture2_v140 FlyCapture2_v100 FlyCapture2 flycapture2 flycapture NO_DEFAULT_PATH PATHS ${FlyCapture2_LIBDIR}/vs2015 ${FlyCapture2_LIBDIR})
|
||||||
|
|
||||||
|
MESSAGE(STATUS "FlyCapture2_INCLUDE_DIR=${FlyCapture2_INCLUDE_DIR}")
|
||||||
|
MESSAGE(STATUS "FlyCapture2_LIBRARY=${FlyCapture2_LIBRARY}")
|
||||||
|
|
||||||
# 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 $ENV{TRICLOPSLIB}/include $ENV{TRICLOPSLIB}/include/triclops)
|
||||||
find_library(Triclops_LIBRARY NAMES triclops triclops_v100 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
|
find_library(Triclops_LIBRARY NAMES triclops triclops_v140 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_v140 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_v140 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)
|
MESSAGE(STATUS "Triclops_INCLUDE_DIR=${Triclops_INCLUDE_DIR}")
|
||||||
|
MESSAGE(STATUS "Triclops_LIBRARY=${Triclops_LIBRARY}")
|
||||||
|
MESSAGE(STATUS "FlyCaptureBridge_LIBRARY=${FlyCaptureBridge_LIBRARY}")
|
||||||
|
|
||||||
|
IF (FlyCapture2_INCLUDE_DIR AND Triclops_INCLUDE_DIR AND FlyCapture2_LIBRARY AND Triclops_LIBRARY AND FlyCaptureBridge_LIBRARY)
|
||||||
SET(FlyCapture2_FOUND TRUE)
|
SET(FlyCapture2_FOUND TRUE)
|
||||||
SET(FlyCapture2_INCLUDE_DIRS ${FlyCapture2_INCLUDE_DIR} ${Triclops_INCLUDE_DIR})
|
SET(FlyCapture2_INCLUDE_DIRS ${FlyCapture2_INCLUDE_DIR} ${Triclops_INCLUDE_DIR})
|
||||||
SET(FlyCapture2_LIBRARIES ${FlyCapture2_LIBRARY} ${Triclops_LIBRARY} ${FlyCaptureBridge_LIBRARY} ${pnmutils_LIBRARY})
|
SET(FlyCapture2_LIBRARIES ${FlyCapture2_LIBRARY} ${Triclops_LIBRARY} ${FlyCaptureBridge_LIBRARY})
|
||||||
ENDIF (FlyCapture2_INCLUDE_DIR AND Triclops_INCLUDE_DIR AND FlyCapture2_LIBRARY AND Triclops_LIBRARY AND FlyCaptureBridge_LIBRARY AND pnmutils_LIBRARY)
|
ENDIF (FlyCapture2_INCLUDE_DIR AND Triclops_INCLUDE_DIR AND FlyCapture2_LIBRARY AND Triclops_LIBRARY AND FlyCaptureBridge_LIBRARY)
|
||||||
|
|
||||||
IF (FlyCapture2_FOUND)
|
IF (FlyCapture2_FOUND)
|
||||||
# show which FlyCapture2 was found only if not quiet
|
# show which FlyCapture2 was found only if not quiet
|
||||||
|
|||||||
@@ -17,6 +17,14 @@ 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 rtabmap config
|
# libraries; this is adapted from the rtabmap config
|
||||||
|
|
||||||
@@ -75,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}
|
||||||
@@ -105,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)
|
||||||
|
|||||||
@@ -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}")
|
||||||
@@ -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)
|
||||||
|
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# - Find librealsense (https://github.com/IntelRealSense/librealsense)
|
||||||
|
#
|
||||||
|
# RealSense2_ROOT_DIR environment variable can be set to find the library.
|
||||||
|
#
|
||||||
|
# It sets the following variables:
|
||||||
|
# RealSense2_FOUND - Set to false, or undefined, if RealSense2 isn't found.
|
||||||
|
# RealSense2_INCLUDE_DIRS - The RealSense2 include directory.
|
||||||
|
# RealSense2_LIBRARIES - The RealSense2 library to link against.
|
||||||
|
|
||||||
|
#RealSense library
|
||||||
|
|
||||||
|
find_path(RealSense2_INCLUDE_DIRS NAMES librealsense2/rs.hpp PATHS $ENV{RealSense2_ROOT_DIR}/include)
|
||||||
|
if(CMAKE_CL_64)
|
||||||
|
find_library(RealSense2_LIBRARY NAMES realsense2 PATHS $ENV{RealSense2_ROOT_DIR}/lib $ENV{RealSense2_ROOT_DIR}/lib/x64 $ENV{RealSense2_ROOT_DIR}/bin $ENV{RealSense2_ROOT_DIR}/bin/x64)
|
||||||
|
else()
|
||||||
|
find_library(RealSense2_LIBRARY NAMES realsense2 PATHS $ENV{RealSense2_ROOT_DIR}/lib $ENV{RealSense2_ROOT_DIR}/lib/x86 $ENV{RealSense2_ROOT_DIR}/bin $ENV{RealSense2_ROOT_DIR}/bin/x86)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
IF (RealSense2_INCLUDE_DIRS AND RealSense2_LIBRARY)
|
||||||
|
SET(RealSense2_FOUND TRUE)
|
||||||
|
ENDIF (RealSense2_INCLUDE_DIRS AND RealSense2_LIBRARY)
|
||||||
|
|
||||||
|
IF (RealSense2_FOUND)
|
||||||
|
SET(RealSense2_LIBRARIES ${RealSense2_LIBRARY})
|
||||||
|
|
||||||
|
# Compatibility with linux names
|
||||||
|
SET(realsense2_LIBRARIES ${RealSense2_LIBRARIES})
|
||||||
|
SET(realsense2_INCLUDE_DIRS ${RealSense2_INCLUDE_DIRS})
|
||||||
|
SET(realsense2_FOUND ${RealSense2_FOUND})
|
||||||
|
|
||||||
|
# show which RealSense was found only if not quiet
|
||||||
|
IF (NOT RealSense2_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "Found RealSense: ${RealSense2_LIBRARIES}")
|
||||||
|
ENDIF (NOT RealSense2_FIND_QUIETLY)
|
||||||
|
ELSE (RealSense2_FOUND)
|
||||||
|
# fatal error if RealSense is required but not found
|
||||||
|
IF (RealSense2_FIND_REQUIRED)
|
||||||
|
MESSAGE(FATAL_ERROR "Could not find RealSense2 (librealsense2)")
|
||||||
|
ENDIF (RealSense2_FIND_REQUIRED)
|
||||||
|
ENDIF (RealSense2_FOUND)
|
||||||
|
|
||||||
@@ -2,46 +2,29 @@
|
|||||||
# This module finds an installed Sqlite3 package.
|
# This module finds an installed Sqlite3 package.
|
||||||
#
|
#
|
||||||
# It sets the following variables:
|
# It sets the following variables:
|
||||||
# SQLITE3_FOUND - Set to false, or undefined, if Sqlite3 isn't found.
|
# Sqlite3_FOUND - Set to false, or undefined, if Sqlite3 isn't found.
|
||||||
# SQLITE3_INCLUDE_DIR - The Sqlite3 include directory.
|
# Sqlite3_INCLUDE_DIR - The Sqlite3 include directory.
|
||||||
# SQLITE3_LIBRARY - The Sqlite3 library to link against.
|
# Sqlite3_LIBRARY - The Sqlite3 library to link against.
|
||||||
|
|
||||||
SET(SQLITE3_VERSION_REQUIRED "3.6.0")
|
FIND_PATH(Sqlite3_INCLUDE_DIR sqlite3.h PATHS $ENV{Sqlite3_ROOT_DIR}/include $ENV{Sqlite3_ROOT_DIR})
|
||||||
|
|
||||||
IF(UNIX)
|
FIND_LIBRARY(Sqlite3_LIBRARY NAMES sqlite3 PATHS $ENV{Sqlite3_ROOT_DIR}/lib $ENV{Sqlite3_ROOT_DIR})
|
||||||
FIND_PROGRAM(SQLITE3_EXEC NAME sqlite3 PATHS)
|
|
||||||
IF(SQLITE3_EXEC)
|
|
||||||
MESSAGE(STATUS "Found Sqlite3 executable : ${SQLITE3_EXEC}")
|
|
||||||
EXECUTE_PROCESS(COMMAND ${SQLITE3_EXEC} --version
|
|
||||||
OUTPUT_VARIABLE SQLITE3_VERSION
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
WORKING_DIRECTORY "./"
|
|
||||||
)
|
|
||||||
IF(SQLITE3_VERSION VERSION_LESS SQLITE3_VERSION_REQUIRED)
|
|
||||||
MESSAGE(FATAL_ERROR "Sqlite ${SQLITE3_VERSION} found, but version ${SQLITE3_VERSION_REQUIRED} minimum is required")
|
|
||||||
ENDIF(SQLITE3_VERSION VERSION_LESS SQLITE3_VERSION_REQUIRED)
|
|
||||||
ELSE(SQLITE3_EXEC)
|
|
||||||
MESSAGE(FATAL_ERROR "Could not find Sqlite3 executable")
|
|
||||||
ENDIF(SQLITE3_EXEC)
|
|
||||||
ENDIF(UNIX)
|
|
||||||
|
|
||||||
FIND_PATH(SQLITE3_INCLUDE_DIR sqlite3.h)
|
IF (Sqlite3_INCLUDE_DIR AND Sqlite3_LIBRARY)
|
||||||
|
SET(Sqlite3_FOUND TRUE)
|
||||||
|
SET(Sqlite3_INCLUDE_DIRS ${Sqlite3_INCLUDE_DIR})
|
||||||
|
SET(Sqlite3_LIBRARIES ${Sqlite3_LIBRARY})
|
||||||
|
ENDIF (Sqlite3_INCLUDE_DIR AND Sqlite3_LIBRARY)
|
||||||
|
|
||||||
FIND_LIBRARY(SQLITE3_LIBRARY NAMES sqlite3.dll sqlite3)
|
IF (Sqlite3_FOUND)
|
||||||
|
|
||||||
IF (SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARY)
|
|
||||||
SET(SQLITE3_FOUND TRUE)
|
|
||||||
ENDIF (SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARY)
|
|
||||||
|
|
||||||
IF (SQLITE3_FOUND)
|
|
||||||
# show which Sqlite3 was found only if not quiet
|
# show which Sqlite3 was found only if not quiet
|
||||||
IF (NOT Sqlite3_FIND_QUIETLY)
|
IF (NOT Sqlite3_FIND_QUIETLY)
|
||||||
MESSAGE(STATUS "Found Sqlite3")
|
MESSAGE(STATUS "Found Sqlite3: ${Sqlite3_INCLUDE_DIRS} ${Sqlite3_LIBRARIES}")
|
||||||
ENDIF (NOT Sqlite3_FIND_QUIETLY)
|
ENDIF (NOT Sqlite3_FIND_QUIETLY)
|
||||||
ELSE (SQLITE3_FOUND)
|
ELSE (Sqlite3_FOUND)
|
||||||
# fatal error if Sqlite3 is required but not found
|
# fatal error if Sqlite3 is required but not found
|
||||||
IF (Sqlite3_FIND_REQUIRED)
|
IF (Sqlite3_FIND_REQUIRED)
|
||||||
MESSAGE(FATAL_ERROR "Could not find Sqlite3")
|
MESSAGE(FATAL_ERROR "Could not find Sqlite3")
|
||||||
ENDIF (Sqlite3_FIND_REQUIRED)
|
ENDIF (Sqlite3_FIND_REQUIRED)
|
||||||
ENDIF (SQLITE3_FOUND)
|
ENDIF (Sqlite3_FOUND)
|
||||||
|
|
||||||
|
|||||||
@@ -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,8 @@ 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;
|
||||||
|
float _predictionEpsilon;
|
||||||
|
std::map<int, std::map<int, int> > _neighborsIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -66,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
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ public:
|
|||||||
timeCapture(0.0f),
|
timeCapture(0.0f),
|
||||||
timeDisparity(0.0f),
|
timeDisparity(0.0f),
|
||||||
timeMirroring(0.0f),
|
timeMirroring(0.0f),
|
||||||
|
timeStereoExposureCompensation(0.0f),
|
||||||
timeImageDecimation(0.0f),
|
timeImageDecimation(0.0f),
|
||||||
timeScanFromDepth(0.0f),
|
timeScanFromDepth(0.0f),
|
||||||
timeUndistortDepth(0.0f),
|
timeUndistortDepth(0.0f),
|
||||||
@@ -59,6 +60,7 @@ public:
|
|||||||
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 timeUndistortDepth;
|
||||||
@@ -66,6 +68,7 @@ public:
|
|||||||
float timeTotal;
|
float timeTotal;
|
||||||
Transform odomPose;
|
Transform odomPose;
|
||||||
cv::Mat odomCovariance;
|
cv::Mat odomCovariance;
|
||||||
|
std::vector<float> odomVelocity;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ public:
|
|||||||
virtual ~CameraModel() {}
|
virtual ~CameraModel() {}
|
||||||
|
|
||||||
void initRectificationMap();
|
void initRectificationMap();
|
||||||
|
bool isRectificationMapInitialized() {return !mapX_.empty() && !mapY_.empty();}
|
||||||
|
|
||||||
bool isValidForProjection() const {return fx()>0.0 && fy()>0.0 && cx()>0.0 && cy()>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 isValidForReprojection() const {return fx()>0.0 && fy()>0.0 && cx()>0.0 && cy()>0.0 && imageWidth()>0 && imageHeight()>0;}
|
||||||
@@ -114,6 +115,9 @@ public:
|
|||||||
|
|
||||||
bool load(const std::string & directory, const std::string & cameraName);
|
bool load(const std::string & directory, const std::string & cameraName);
|
||||||
bool save(const std::string & directory) const;
|
bool save(const std::string & directory) const;
|
||||||
|
std::vector<unsigned char> serialize() const;
|
||||||
|
unsigned int deserialize(const std::vector<unsigned char>& data);
|
||||||
|
unsigned int deserialize(const unsigned char * data, unsigned int dataSize);
|
||||||
|
|
||||||
CameraModel scaled(double scale) const;
|
CameraModel scaled(double scale) const;
|
||||||
CameraModel roi(const cv::Rect & roi) const;
|
CameraModel roi(const cv::Rect & roi) const;
|
||||||
|
|||||||
@@ -27,207 +27,5 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
#include <rtabmap/core/camera/CameraImages.h>
|
||||||
|
#include <rtabmap/core/camera/CameraVideo.h>
|
||||||
#include <opencv2/highgui/highgui.hpp>
|
|
||||||
#include "rtabmap/core/Camera.h"
|
|
||||||
#include "rtabmap/utilite/UTimer.h"
|
|
||||||
#include <set>
|
|
||||||
#include <stack>
|
|
||||||
#include <list>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
class UDirectory;
|
|
||||||
|
|
||||||
namespace rtabmap
|
|
||||||
{
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraImages
|
|
||||||
/////////////////////////
|
|
||||||
class RTABMAP_EXP CameraImages :
|
|
||||||
public Camera
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CameraImages();
|
|
||||||
CameraImages(
|
|
||||||
const std::string & path,
|
|
||||||
float imageRate = 0,
|
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
|
||||||
virtual ~CameraImages();
|
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
|
||||||
virtual bool isCalibrated() const;
|
|
||||||
virtual std::string getSerial() const;
|
|
||||||
virtual bool odomProvided() const { return odometry_.size() > 0; }
|
|
||||||
std::string getPath() const {return _path;}
|
|
||||||
unsigned int imagesCount() const;
|
|
||||||
std::vector<std::string> filenames() const;
|
|
||||||
bool isImagesRectified() const {return _rectifyImages;}
|
|
||||||
int getBayerMode() const {return _bayerMode;}
|
|
||||||
const CameraModel & cameraModel() const {return _model;}
|
|
||||||
|
|
||||||
void setPath(const std::string & dir) {_path=dir;}
|
|
||||||
void setStartIndex(int index) {_startAt = index;} // negative means last
|
|
||||||
void setDirRefreshed(bool enabled) {_refreshDir = 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 setTimestamps(bool fileNamesAreStamps, const std::string & filePath = "", bool syncImageRateWithStamps=true)
|
|
||||||
{
|
|
||||||
_filenamesAreTimestamps = fileNamesAreStamps;
|
|
||||||
_timestampsPath=filePath;
|
|
||||||
_syncImageRateWithStamps = syncImageRateWithStamps;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setScanPath(
|
|
||||||
const std::string & dir,
|
|
||||||
int maxScanPts = 0,
|
|
||||||
int downsampleStep = 1,
|
|
||||||
float voxelSize = 0.0f,
|
|
||||||
int normalsK = 0, // compute normals if > 0
|
|
||||||
const Transform & localTransform=Transform::getIdentity())
|
|
||||||
{
|
|
||||||
_scanPath = dir;
|
|
||||||
_scanLocalTransform = localTransform;
|
|
||||||
_scanMaxPts = maxScanPts;
|
|
||||||
_scanDownsampleStep = downsampleStep;
|
|
||||||
_scanNormalsK = normalsK;
|
|
||||||
_scanVoxelSize = voxelSize;
|
|
||||||
if(_scanDownsampleStep>1)
|
|
||||||
{
|
|
||||||
_scanMaxPts /= _scanDownsampleStep;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setDepthFromScan(bool enabled, int fillHoles = 1, bool fillHolesFromBorder = false)
|
|
||||||
{
|
|
||||||
_depthFromScan = enabled;
|
|
||||||
_depthFromScanFillHoles = fillHoles;
|
|
||||||
_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)
|
|
||||||
{
|
|
||||||
_groundTruthPath = filePath;
|
|
||||||
_groundTruthFormat = format;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setDepth(bool isDepth, float depthScaleFactor = 1.0f)
|
|
||||||
{
|
|
||||||
_isDepth = isDepth;
|
|
||||||
_depthScaleFactor=depthScaleFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
|
||||||
bool readPoses(
|
|
||||||
std::list<Transform> & outputPoses,
|
|
||||||
std::list<double> & stamps,
|
|
||||||
const std::string & filePath,
|
|
||||||
int format) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string _path;
|
|
||||||
int _startAt;
|
|
||||||
// If the list of files in the directory is refreshed
|
|
||||||
// on each call of takeImage()
|
|
||||||
bool _refreshDir;
|
|
||||||
bool _rectifyImages;
|
|
||||||
int _bayerMode;
|
|
||||||
bool _isDepth;
|
|
||||||
float _depthScaleFactor;
|
|
||||||
int _count;
|
|
||||||
UDirectory * _dir;
|
|
||||||
std::string _lastFileName;
|
|
||||||
|
|
||||||
int _countScan;
|
|
||||||
UDirectory * _scanDir;
|
|
||||||
std::string _lastScanFileName;
|
|
||||||
std::string _scanPath;
|
|
||||||
Transform _scanLocalTransform;
|
|
||||||
int _scanMaxPts;
|
|
||||||
int _scanDownsampleStep;
|
|
||||||
float _scanVoxelSize;
|
|
||||||
int _scanNormalsK;
|
|
||||||
|
|
||||||
bool _depthFromScan;
|
|
||||||
int _depthFromScanFillHoles; // <0:horizontal 0:disabled >0:vertical
|
|
||||||
bool _depthFromScanFillHolesFromBorder;
|
|
||||||
|
|
||||||
bool _filenamesAreTimestamps;
|
|
||||||
std::string _timestampsPath;
|
|
||||||
bool _syncImageRateWithStamps;
|
|
||||||
|
|
||||||
std::string _odometryPath;
|
|
||||||
int _odometryFormat;
|
|
||||||
|
|
||||||
std::string _groundTruthPath;
|
|
||||||
int _groundTruthFormat;
|
|
||||||
|
|
||||||
std::list<double> _stamps;
|
|
||||||
std::list<Transform> odometry_;
|
|
||||||
std::list<Transform> groundTruth_;
|
|
||||||
CameraModel _model;
|
|
||||||
|
|
||||||
UTimer _captureTimer;
|
|
||||||
double _captureDelay;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraVideo
|
|
||||||
/////////////////////////
|
|
||||||
class RTABMAP_EXP CameraVideo :
|
|
||||||
public Camera
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum Source{kVideoFile, kUsbDevice};
|
|
||||||
|
|
||||||
public:
|
|
||||||
CameraVideo(int usbDevice = 0,
|
|
||||||
bool rectifyImages = false,
|
|
||||||
float imageRate = 0,
|
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
|
||||||
CameraVideo(const std::string & filePath,
|
|
||||||
bool rectifyImages = false,
|
|
||||||
float imageRate = 0,
|
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
|
||||||
virtual ~CameraVideo();
|
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
|
||||||
virtual bool isCalibrated() const;
|
|
||||||
virtual std::string getSerial() const;
|
|
||||||
int getUsbDevice() const {return _usbDevice;}
|
|
||||||
const std::string & getFilePath() const {return _filePath;}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// File type
|
|
||||||
std::string _filePath;
|
|
||||||
bool _rectifyImages;
|
|
||||||
|
|
||||||
cv::VideoCapture _capture;
|
|
||||||
Source _src;
|
|
||||||
|
|
||||||
// Usb camera
|
|
||||||
int _usbDevice;
|
|
||||||
std::string _guid;
|
|
||||||
|
|
||||||
CameraModel _model;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace rtabmap
|
|
||||||
|
|||||||
@@ -27,347 +27,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
#include <rtabmap/core/camera/CameraFreenect.h>
|
||||||
|
#include <rtabmap/core/camera/CameraFreenect2.h>
|
||||||
|
#include <rtabmap/core/camera/CameraK4W2.h>
|
||||||
|
#include <rtabmap/core/camera/CameraOpenni.h>
|
||||||
|
#include <rtabmap/core/camera/CameraOpenNI2.h>
|
||||||
|
#include <rtabmap/core/camera/CameraOpenNICV.h>
|
||||||
|
#include <rtabmap/core/camera/CameraRealSense.h>
|
||||||
|
#include <rtabmap/core/camera/CameraRealSense2.h>
|
||||||
|
#include <rtabmap/core/camera/CameraRGBDImages.h>
|
||||||
|
|
||||||
#include "rtabmap/utilite/UMutex.h"
|
|
||||||
#include "rtabmap/utilite/USemaphore.h"
|
|
||||||
#include "rtabmap/core/CameraModel.h"
|
|
||||||
#include "rtabmap/core/Camera.h"
|
|
||||||
#include "rtabmap/core/CameraRGB.h"
|
|
||||||
#include "rtabmap/core/Version.h"
|
|
||||||
|
|
||||||
#include <pcl/pcl_config.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_OPENNI
|
|
||||||
#include <pcl/io/openni_camera/openni_depth_image.h>
|
|
||||||
#include <pcl/io/openni_camera/openni_image.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <boost/signals2/connection.hpp>
|
|
||||||
|
|
||||||
namespace openni
|
|
||||||
{
|
|
||||||
class Device;
|
|
||||||
class VideoStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace pcl
|
|
||||||
{
|
|
||||||
class Grabber;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace libfreenect2
|
|
||||||
{
|
|
||||||
class Freenect2;
|
|
||||||
class Freenect2Device;
|
|
||||||
class SyncMultiFrameListener;
|
|
||||||
class Registration;
|
|
||||||
class PacketPipeline;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace rs
|
|
||||||
{
|
|
||||||
class context;
|
|
||||||
class device;
|
|
||||||
namespace slam {
|
|
||||||
class slam;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct _freenect_context freenect_context;
|
|
||||||
typedef struct _freenect_device freenect_device;
|
|
||||||
|
|
||||||
namespace rtabmap
|
|
||||||
{
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraOpenNIPCL
|
|
||||||
/////////////////////////
|
|
||||||
class RTABMAP_EXP CameraOpenni :
|
|
||||||
public Camera
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static bool available();
|
|
||||||
|
|
||||||
public:
|
|
||||||
// default local transform z in, x right, y down));
|
|
||||||
CameraOpenni(const std::string & deviceId="",
|
|
||||||
float imageRate = 0,
|
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
|
||||||
virtual ~CameraOpenni();
|
|
||||||
#ifdef HAVE_OPENNI
|
|
||||||
void image_cb (
|
|
||||||
const boost::shared_ptr<openni_wrapper::Image>& rgb,
|
|
||||||
const boost::shared_ptr<openni_wrapper::DepthImage>& depth,
|
|
||||||
float constant);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
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:
|
|
||||||
pcl::Grabber* interface_;
|
|
||||||
std::string deviceId_;
|
|
||||||
boost::signals2::connection connection_;
|
|
||||||
cv::Mat depth_;
|
|
||||||
cv::Mat rgb_;
|
|
||||||
float depthConstant_;
|
|
||||||
UMutex dataMutex_;
|
|
||||||
USemaphore dataReady_;
|
|
||||||
};
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraOpenNICV
|
|
||||||
/////////////////////////
|
|
||||||
class RTABMAP_EXP CameraOpenNICV :
|
|
||||||
public Camera
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
static bool available();
|
|
||||||
|
|
||||||
public:
|
|
||||||
CameraOpenNICV(bool asus = false,
|
|
||||||
float imageRate = 0,
|
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
|
||||||
virtual ~CameraOpenNICV();
|
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
|
||||||
virtual bool isCalibrated() const;
|
|
||||||
virtual std::string getSerial() const {return "";} // unknown with OpenCV
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool _asus;
|
|
||||||
cv::VideoCapture _capture;
|
|
||||||
float _depthFocal;
|
|
||||||
};
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraOpenNI2
|
|
||||||
/////////////////////////
|
|
||||||
class RTABMAP_EXP CameraOpenNI2 :
|
|
||||||
public Camera
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
static bool available();
|
|
||||||
static bool exposureGainAvailable();
|
|
||||||
enum Type {kTypeColorDepth, kTypeIRDepth, kTypeIR};
|
|
||||||
|
|
||||||
public:
|
|
||||||
CameraOpenNI2(const std::string & deviceId = "",
|
|
||||||
Type type = kTypeColorDepth,
|
|
||||||
float imageRate = 0,
|
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
|
||||||
virtual ~CameraOpenNI2();
|
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
|
||||||
virtual bool isCalibrated() const;
|
|
||||||
virtual std::string getSerial() const;
|
|
||||||
|
|
||||||
bool setAutoWhiteBalance(bool enabled);
|
|
||||||
bool setAutoExposure(bool enabled);
|
|
||||||
bool setExposure(int value);
|
|
||||||
bool setGain(int value);
|
|
||||||
bool setMirroring(bool enabled);
|
|
||||||
void setOpenNI2StampsAndIDsUsed(bool used);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
|
||||||
|
|
||||||
private:
|
|
||||||
#ifdef RTABMAP_OPENNI2
|
|
||||||
Type _type;
|
|
||||||
openni::Device * _device;
|
|
||||||
openni::VideoStream * _color;
|
|
||||||
openni::VideoStream * _depth;
|
|
||||||
float _depthFx;
|
|
||||||
float _depthFy;
|
|
||||||
std::string _deviceId;
|
|
||||||
bool _openNI2StampsAndIDsUsed;
|
|
||||||
StereoCameraModel _stereoModel;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraFreenect
|
|
||||||
/////////////////////////
|
|
||||||
class FreenectDevice;
|
|
||||||
|
|
||||||
class RTABMAP_EXP CameraFreenect :
|
|
||||||
public Camera
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static bool available();
|
|
||||||
enum Type {kTypeColorDepth, kTypeIRDepth};
|
|
||||||
|
|
||||||
public:
|
|
||||||
// default local transform z in, x right, y down));
|
|
||||||
CameraFreenect(int deviceId= 0,
|
|
||||||
Type type = kTypeColorDepth,
|
|
||||||
float imageRate=0.0f,
|
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
|
||||||
virtual ~CameraFreenect();
|
|
||||||
|
|
||||||
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:
|
|
||||||
#ifdef RTABMAP_FREENECT
|
|
||||||
int deviceId_;
|
|
||||||
Type type_;
|
|
||||||
freenect_context * ctx_;
|
|
||||||
FreenectDevice * freenectDevice_;
|
|
||||||
StereoCameraModel stereoModel_;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraFreenect2
|
|
||||||
/////////////////////////
|
|
||||||
|
|
||||||
class RTABMAP_EXP CameraFreenect2 :
|
|
||||||
public Camera
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static bool available();
|
|
||||||
|
|
||||||
enum Type{
|
|
||||||
kTypeColor2DepthSD,
|
|
||||||
kTypeDepth2ColorSD,
|
|
||||||
kTypeDepth2ColorHD,
|
|
||||||
kTypeDepth2ColorHD2,
|
|
||||||
kTypeIRDepth,
|
|
||||||
kTypeColorIR
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
// default local transform z in, x right, y down));
|
|
||||||
CameraFreenect2(int deviceId= 0,
|
|
||||||
Type type = kTypeColor2DepthSD,
|
|
||||||
float imageRate=0.0f,
|
|
||||||
const Transform & localTransform = Transform::getIdentity(),
|
|
||||||
float minDepth = 0.3f,
|
|
||||||
float maxDepth = 12.0f,
|
|
||||||
bool bilateralFiltering = true,
|
|
||||||
bool edgeAwareFiltering = true,
|
|
||||||
bool noiseFiltering = true);
|
|
||||||
virtual ~CameraFreenect2();
|
|
||||||
|
|
||||||
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:
|
|
||||||
#ifdef RTABMAP_FREENECT2
|
|
||||||
int deviceId_;
|
|
||||||
Type type_;
|
|
||||||
StereoCameraModel stereoModel_;
|
|
||||||
libfreenect2::Freenect2 * freenect2_;
|
|
||||||
libfreenect2::Freenect2Device *dev_;
|
|
||||||
libfreenect2::SyncMultiFrameListener * listener_;
|
|
||||||
libfreenect2::Registration * reg_;
|
|
||||||
float minKinect2Depth_;
|
|
||||||
float maxKinect2Depth_;
|
|
||||||
bool bilateralFiltering_;
|
|
||||||
bool edgeAwareFiltering_;
|
|
||||||
bool noiseFiltering_;
|
|
||||||
#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
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraRGBDImages
|
|
||||||
/////////////////////////
|
|
||||||
class CameraImages;
|
|
||||||
class RTABMAP_EXP CameraRGBDImages :
|
|
||||||
public CameraImages
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static bool available();
|
|
||||||
|
|
||||||
public:
|
|
||||||
CameraRGBDImages(
|
|
||||||
const std::string & pathRGBImages,
|
|
||||||
const std::string & pathDepthImages,
|
|
||||||
float depthScaleFactor = 1.0f,
|
|
||||||
float imageRate=0.0f,
|
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
|
||||||
virtual ~CameraRGBDImages();
|
|
||||||
|
|
||||||
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:
|
|
||||||
CameraImages cameraDepth_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace rtabmap
|
|
||||||
|
|||||||
@@ -27,222 +27,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
#include <rtabmap/core/camera/CameraStereoDC1394.h>
|
||||||
|
#include <rtabmap/core/camera/CameraStereoFlyCapture2.h>
|
||||||
#include "rtabmap/core/CameraModel.h"
|
#include <rtabmap/core/camera/CameraStereoImages.h>
|
||||||
#include "rtabmap/core/Camera.h"
|
#include <rtabmap/core/camera/CameraStereoVideo.h>
|
||||||
#include "rtabmap/core/CameraRGB.h"
|
#include <rtabmap/core/camera/CameraStereoZed.h>
|
||||||
#include "rtabmap/core/Version.h"
|
#include <rtabmap/core/camera/CameraStereoTara.h>
|
||||||
#include <list>
|
|
||||||
|
|
||||||
namespace FlyCapture2
|
|
||||||
{
|
|
||||||
class Camera;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace sl
|
|
||||||
{
|
|
||||||
class Camera;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace rtabmap
|
|
||||||
{
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraStereoDC1394
|
|
||||||
/////////////////////////
|
|
||||||
class DC1394Device;
|
|
||||||
|
|
||||||
class RTABMAP_EXP CameraStereoDC1394 :
|
|
||||||
public Camera
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static bool available();
|
|
||||||
|
|
||||||
public:
|
|
||||||
CameraStereoDC1394( float imageRate=0.0f, const Transform & localTransform = Transform::getIdentity());
|
|
||||||
virtual ~CameraStereoDC1394();
|
|
||||||
|
|
||||||
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:
|
|
||||||
#ifdef RTABMAP_DC1394
|
|
||||||
DC1394Device *device_;
|
|
||||||
StereoCameraModel stereoModel_;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraStereoFlyCapture2
|
|
||||||
/////////////////////////
|
|
||||||
class RTABMAP_EXP CameraStereoFlyCapture2 :
|
|
||||||
public Camera
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static bool available();
|
|
||||||
|
|
||||||
public:
|
|
||||||
CameraStereoFlyCapture2( float imageRate=0.0f, const Transform & localTransform = Transform::getIdentity());
|
|
||||||
virtual ~CameraStereoFlyCapture2();
|
|
||||||
|
|
||||||
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:
|
|
||||||
#ifdef RTABMAP_FLYCAPTURE2
|
|
||||||
FlyCapture2::Camera * camera_;
|
|
||||||
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
|
|
||||||
};
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraStereoImages
|
|
||||||
/////////////////////////
|
|
||||||
class CameraImages;
|
|
||||||
class RTABMAP_EXP CameraStereoImages :
|
|
||||||
public CameraImages
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static bool available();
|
|
||||||
|
|
||||||
public:
|
|
||||||
CameraStereoImages(
|
|
||||||
const std::string & pathLeftImages,
|
|
||||||
const std::string & pathRightImages,
|
|
||||||
bool rectifyImages = false,
|
|
||||||
float imageRate=0.0f,
|
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
|
||||||
CameraStereoImages(
|
|
||||||
const std::string & pathLeftRightImages,
|
|
||||||
bool rectifyImages = false,
|
|
||||||
float imageRate=0.0f,
|
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
|
||||||
virtual ~CameraStereoImages();
|
|
||||||
|
|
||||||
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:
|
|
||||||
CameraImages * camera2_;
|
|
||||||
StereoCameraModel stereoModel_;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// CameraStereoVideo
|
|
||||||
/////////////////////////
|
|
||||||
class CameraImages;
|
|
||||||
class RTABMAP_EXP CameraStereoVideo :
|
|
||||||
public Camera
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static bool available();
|
|
||||||
|
|
||||||
public:
|
|
||||||
CameraStereoVideo(
|
|
||||||
const std::string & pathSideBySide,
|
|
||||||
bool rectifyImages = false,
|
|
||||||
float imageRate=0.0f,
|
|
||||||
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 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:
|
|
||||||
cv::VideoCapture capture_;
|
|
||||||
cv::VideoCapture capture2_;
|
|
||||||
std::string path_;
|
|
||||||
std::string path2_;
|
|
||||||
bool rectifyImages_;
|
|
||||||
StereoCameraModel stereoModel_;
|
|
||||||
std::string cameraName_;
|
|
||||||
CameraVideo::Source src_;
|
|
||||||
int usbDevice_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace rtabmap
|
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ class Camera;
|
|||||||
class CameraInfo;
|
class CameraInfo;
|
||||||
class SensorData;
|
class SensorData;
|
||||||
class StereoDense;
|
class StereoDense;
|
||||||
|
class IMUFilter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class CameraThread
|
* Class CameraThread
|
||||||
@@ -60,6 +61,7 @@ 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;}
|
||||||
@@ -67,19 +69,27 @@ public:
|
|||||||
void setDistortionModel(const std::string & path);
|
void setDistortionModel(const std::string & path);
|
||||||
void enableBilateralFiltering(float sigmaS, float sigmaR);
|
void enableBilateralFiltering(float sigmaS, float sigmaR);
|
||||||
void disableBilateralFiltering() {_bilateralFiltering = false;}
|
void disableBilateralFiltering() {_bilateralFiltering = false;}
|
||||||
|
void enableIMUFiltering(int filteringStrategy=1, const ParametersMap & parameters = ParametersMap());
|
||||||
|
void disableIMUFiltering();
|
||||||
|
|
||||||
void setScanFromDepth(
|
void setScanParameters(
|
||||||
bool enabled,
|
bool fromDepth,
|
||||||
int decimation=4,
|
int downsampleStep=1, // decimation of the depth image in case the scan is from depth image
|
||||||
float maxDepth=4.0f,
|
float rangeMin=0.0f,
|
||||||
|
float rangeMax=0.0f,
|
||||||
float voxelSize = 0.0f,
|
float voxelSize = 0.0f,
|
||||||
int normalsK = 0)
|
int normalsK = 0,
|
||||||
|
int normalsRadius = 0.0f,
|
||||||
|
bool forceGroundNormalsUp = false)
|
||||||
{
|
{
|
||||||
_scanFromDepth = enabled;
|
_scanFromDepth = fromDepth;
|
||||||
_scanDecimation=decimation;
|
_scanDownsampleStep=downsampleStep;
|
||||||
_scanMaxDepth = maxDepth;
|
_scanRangeMin = rangeMin;
|
||||||
|
_scanRangeMax = rangeMax;
|
||||||
_scanVoxelSize = voxelSize;
|
_scanVoxelSize = voxelSize;
|
||||||
_scanNormalsK = normalsK;
|
_scanNormalsK = normalsK;
|
||||||
|
_scanNormalsRadius = normalsRadius;
|
||||||
|
_scanForceGroundNormalsUp = forceGroundNormalsUp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void postUpdate(SensorData * data, CameraInfo * info = 0) const;
|
void postUpdate(SensorData * data, CameraInfo * info = 0) const;
|
||||||
@@ -98,20 +108,24 @@ private:
|
|||||||
private:
|
private:
|
||||||
Camera * _camera;
|
Camera * _camera;
|
||||||
bool _mirroring;
|
bool _mirroring;
|
||||||
|
bool _stereoExposureCompensation;
|
||||||
bool _colorOnly;
|
bool _colorOnly;
|
||||||
int _imageDecimation;
|
int _imageDecimation;
|
||||||
bool _stereoToDepth;
|
bool _stereoToDepth;
|
||||||
bool _scanFromDepth;
|
bool _scanFromDepth;
|
||||||
int _scanDecimation;
|
int _scanDownsampleStep;
|
||||||
float _scanMaxDepth;
|
float _scanRangeMin;
|
||||||
float _scanMinDepth;
|
float _scanRangeMax;
|
||||||
float _scanVoxelSize;
|
float _scanVoxelSize;
|
||||||
int _scanNormalsK;
|
int _scanNormalsK;
|
||||||
|
float _scanNormalsRadius;
|
||||||
|
bool _scanForceGroundNormalsUp;
|
||||||
StereoDense * _stereoDense;
|
StereoDense * _stereoDense;
|
||||||
clams::DiscreteDepthDistortionModel * _distortionModel;
|
clams::DiscreteDepthDistortionModel * _distortionModel;
|
||||||
bool _bilateralFiltering;
|
bool _bilateralFiltering;
|
||||||
float _bilateralSigmaS;
|
float _bilateralSigmaS;
|
||||||
float _bilateralSigmaR;
|
float _bilateralSigmaR;
|
||||||
|
IMUFilter * _imuFilter;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -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_ */
|
||||||
|
|||||||
@@ -68,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;
|
||||||
@@ -91,6 +92,7 @@ public:
|
|||||||
int nodeId,
|
int nodeId,
|
||||||
const cv::Mat & ground,
|
const cv::Mat & ground,
|
||||||
const cv::Mat & obstacles,
|
const cv::Mat & obstacles,
|
||||||
|
const cv::Mat & empty,
|
||||||
float cellSize,
|
float cellSize,
|
||||||
const cv::Point3f & viewpoint);
|
const cv::Point3f & viewpoint);
|
||||||
void updateDepthImage(int nodeId, const cv::Mat & image);
|
void updateDepthImage(int nodeId, const cv::Mat & image);
|
||||||
@@ -98,6 +100,29 @@ public:
|
|||||||
public:
|
public:
|
||||||
void addInfoAfterRun(int stMemSize, int lastSignAdded, int processMemUsed, int databaseMemUsed, int dictionarySize, const ParametersMap & parameters) const;
|
void addInfoAfterRun(int stMemSize, int lastSignAdded, int processMemUsed, int databaseMemUsed, int dictionarySize, const ParametersMap & parameters) const;
|
||||||
void addStatistics(const Statistics & statistics) 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 = 0) 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
|
||||||
@@ -107,22 +132,30 @@ public:
|
|||||||
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;
|
ParametersMap getLastParameters() const;
|
||||||
std::map<std::string, float> getStatistics(int nodeId, double & stamp) 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);
|
||||||
@@ -131,43 +164,53 @@ public:
|
|||||||
void loadNodeData(std::list<Signature *> & signatures, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) 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, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) 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;
|
||||||
void loadLinks(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
|
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const;
|
||||||
|
void loadLinks(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const;
|
||||||
void getWeight(int signatureId, int & weight) const;
|
void getWeight(int signatureId, int & weight) const;
|
||||||
|
void getLastNodeIds(std::set<int> & ids) 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;
|
||||||
void getAllLinks(std::multimap<int, Link> & links, bool ignoreNullLinks = true) const;
|
void getAllLinks(std::multimap<int, Link> & links, bool ignoreNullLinks = true, bool withLandmarks = false) const;
|
||||||
void getLastNodeId(int & id) const;
|
void getLastNodeId(int & id) const;
|
||||||
void getLastWordId(int & id) const;
|
void getLastWordId(int & id) const;
|
||||||
void getInvertedIndexNi(int signatureId, int & ni) const;
|
void getInvertedIndexNi(int signatureId, int & ni) const;
|
||||||
|
void getNodesObservingLandmark(int landmarkId, std::map<int, Link> & nodes) const;
|
||||||
void getNodeIdByLabel(const std::string & label, int & id) const;
|
void getNodeIdByLabel(const std::string & label, int & id) const;
|
||||||
void getAllLabels(std::map<int, std::string> & labels) const;
|
void getAllLabels(std::map<int, std::string> & labels) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
DBDriver(const ParametersMap & parameters = ParametersMap());
|
DBDriver(const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
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, const std::string & outputUrl = "") = 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 ParametersMap getLastParametersQuery() const = 0;
|
||||||
virtual std::map<std::string, float> getStatisticsQuery(int nodeId, double & stamp) 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;
|
||||||
@@ -179,6 +222,7 @@ private:
|
|||||||
int nodeId,
|
int nodeId,
|
||||||
const cv::Mat & ground,
|
const cv::Mat & ground,
|
||||||
const cv::Mat & obstacles,
|
const cv::Mat & obstacles,
|
||||||
|
const cv::Mat & empty,
|
||||||
float cellSize,
|
float cellSize,
|
||||||
const cv::Point3f & viewpoint) const = 0;
|
const cv::Point3f & viewpoint) const = 0;
|
||||||
|
|
||||||
@@ -187,27 +231,53 @@ private:
|
|||||||
const cv::Mat & image) const = 0;
|
const cv::Mat & image) const = 0;
|
||||||
|
|
||||||
virtual void addStatisticsQuery(const Statistics & statistics) 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 = 0) 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::multimap<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
|
||||||
|
|
||||||
virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) 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, EnvSensors & sensors) const = 0;
|
||||||
|
virtual void getLastNodeIdsQuery(std::set<int> & ids) 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, bool withLandmarks) const = 0;
|
||||||
virtual void getLastIdQuery(const std::string & tableName, int & id) const = 0;
|
virtual void getLastIdQuery(const std::string & tableName, int & id) const = 0;
|
||||||
virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const = 0;
|
virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const = 0;
|
||||||
|
virtual void getNodesObservingLandmarkQuery(int landmarkId, std::map<int, Link> & nodes) const = 0;
|
||||||
virtual void getNodeIdByLabelQuery(const std::string & label, int & id) const = 0;
|
virtual void getNodeIdByLabelQuery(const std::string & label, int & id) const = 0;
|
||||||
virtual void getAllLabelsQuery(std::map<int, std::string> & labels) const = 0;
|
virtual void getAllLabelsQuery(std::map<int, std::string> & labels) const = 0;
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -31,7 +31,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/core/DBDriver.h"
|
#include "rtabmap/core/DBDriver.h"
|
||||||
#include <opencv2/features2d/features2d.hpp>
|
#include <opencv2/features2d/features2d.hpp>
|
||||||
#include "sqlite3/sqlite3.h"
|
|
||||||
|
typedef struct sqlite3_stmt sqlite3_stmt;
|
||||||
|
typedef struct sqlite3 sqlite3;
|
||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
@@ -41,35 +43,44 @@ public:
|
|||||||
virtual ~DBDriverSqlite3();
|
virtual ~DBDriverSqlite3();
|
||||||
|
|
||||||
virtual void parseParameters(const ParametersMap & parameters);
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
virtual bool isInMemory() const {return getUrl().empty() || _dbInMemory;}
|
||||||
void setDbInMemory(bool dbInMemory);
|
void setDbInMemory(bool dbInMemory);
|
||||||
void setJournalMode(int journalMode);
|
void setJournalMode(int journalMode);
|
||||||
void setCacheSize(unsigned int cacheSize);
|
void setCacheSize(unsigned int cacheSize);
|
||||||
void setSynchronous(int synchronous);
|
void setSynchronous(int synchronous);
|
||||||
void setTempStore(int tempStore);
|
void setTempStore(int tempStore);
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false);
|
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false);
|
||||||
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "");
|
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "");
|
||||||
virtual bool isConnectedQuery() const;
|
virtual bool isConnectedQuery() const;
|
||||||
virtual long getMemoryUsedQuery() const; // In bytes
|
virtual long getMemoryUsedQuery() const; // In bytes
|
||||||
virtual bool getDatabaseVersionQuery(std::string & version) const;
|
virtual bool getDatabaseVersionQuery(std::string & version) const;
|
||||||
|
virtual long getNodesMemoryUsedQuery() const;
|
||||||
|
virtual long getLinksMemoryUsedQuery() const;
|
||||||
virtual long getImagesMemoryUsedQuery() const;
|
virtual long getImagesMemoryUsedQuery() const;
|
||||||
virtual long getDepthImagesMemoryUsedQuery() const;
|
virtual long getDepthImagesMemoryUsedQuery() const;
|
||||||
|
virtual long getCalibrationsMemoryUsedQuery() const;
|
||||||
|
virtual long getGridsMemoryUsedQuery() const;
|
||||||
virtual long getLaserScansMemoryUsedQuery() const;
|
virtual long getLaserScansMemoryUsedQuery() const;
|
||||||
virtual long getUserDataMemoryUsedQuery() const;
|
virtual long getUserDataMemoryUsedQuery() const;
|
||||||
virtual long getWordsMemoryUsedQuery() const;
|
virtual long getWordsMemoryUsedQuery() const;
|
||||||
|
virtual long getFeaturesMemoryUsedQuery() const;
|
||||||
|
virtual long getStatisticsMemoryUsedQuery() const;
|
||||||
virtual int getLastNodesSizeQuery() const;
|
virtual int getLastNodesSizeQuery() const;
|
||||||
virtual int getLastDictionarySizeQuery() const;
|
virtual int getLastDictionarySizeQuery() const;
|
||||||
virtual int getTotalNodesSizeQuery() const;
|
virtual int getTotalNodesSizeQuery() const;
|
||||||
virtual int getTotalDictionarySizeQuery() const;
|
virtual int getTotalDictionarySizeQuery() const;
|
||||||
virtual ParametersMap getLastParametersQuery() const;
|
virtual ParametersMap getLastParametersQuery() const;
|
||||||
virtual std::map<std::string, float> getStatisticsQuery(int nodeId, double & stamp) const;
|
virtual std::map<std::string, float> getStatisticsQuery(int nodeId, double & stamp, std::vector<int> * wmState) const;
|
||||||
|
virtual std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatisticsQuery() const;
|
||||||
|
virtual std::map<int, std::vector<int> > getAllStatisticsWmStatesQuery() const;
|
||||||
|
|
||||||
virtual void executeNoResultQuery(const std::string & sql) const;
|
virtual void executeNoResultQuery(const std::string & sql) const;
|
||||||
|
|
||||||
virtual void getWeightQuery(int signatureId, int & weight) const;
|
virtual void getWeightQuery(int signatureId, int & weight) const;
|
||||||
|
|
||||||
virtual void saveQuery(const std::list<Signature *> & signatures) const;
|
virtual void saveQuery(const std::list<Signature *> & signatures);
|
||||||
virtual void saveQuery(const std::list<VisualWord *> & words) const;
|
virtual void saveQuery(const std::list<VisualWord *> & words) const;
|
||||||
virtual void updateQuery(const std::list<Signature *> & signatures, bool updateTimestamp) const;
|
virtual void updateQuery(const std::list<Signature *> & signatures, bool updateTimestamp) const;
|
||||||
virtual void updateQuery(const std::list<VisualWord *> & words, bool updateTimestamp) const;
|
virtual void updateQuery(const std::list<VisualWord *> & words, bool updateTimestamp) const;
|
||||||
@@ -81,29 +92,56 @@ private:
|
|||||||
int nodeId,
|
int nodeId,
|
||||||
const cv::Mat & ground,
|
const cv::Mat & ground,
|
||||||
const cv::Mat & obstacles,
|
const cv::Mat & obstacles,
|
||||||
|
const cv::Mat & empty,
|
||||||
float cellSize,
|
float cellSize,
|
||||||
const cv::Point3f & viewpoint) const;
|
const cv::Point3f & viewpoint) const;
|
||||||
|
|
||||||
virtual void updateDepthImageQuery(
|
virtual void updateDepthImageQuery(
|
||||||
int nodeId,
|
int nodeId,
|
||||||
const cv::Mat & image) const;
|
const cv::Mat & image) const;
|
||||||
|
|
||||||
virtual void addStatisticsQuery(const Statistics & statistics) const;
|
virtual void addStatisticsQuery(const Statistics & statistics) const;
|
||||||
|
virtual void savePreviewImageQuery(const cv::Mat & image) const;
|
||||||
|
virtual cv::Mat loadPreviewImageQuery() const;
|
||||||
|
virtual void saveOptimizedPosesQuery(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const;
|
||||||
|
virtual std::map<int, Transform> loadOptimizedPosesQuery(Transform * lastlocalizationPose = 0) const;
|
||||||
|
virtual void save2DMapQuery(const cv::Mat & map, float xMin, float yMin, float cellSize) const;
|
||||||
|
virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const;
|
||||||
|
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;
|
||||||
|
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;
|
||||||
|
|
||||||
// Load objects
|
// Load objects
|
||||||
virtual void loadQuery(VWDictionary * dictionary) const;
|
virtual void loadQuery(VWDictionary * dictionary, bool lastStateOnly = true) const;
|
||||||
virtual void loadLastNodesQuery(std::list<Signature *> & signatures) const;
|
virtual void loadLastNodesQuery(std::list<Signature *> & signatures) const;
|
||||||
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures) const;
|
virtual void loadSignaturesQuery(const std::list<int> & ids, std::list<Signature *> & signatures) const;
|
||||||
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const;
|
virtual void loadWordsQuery(const std::set<int> & wordIds, std::list<VisualWord *> & vws) const;
|
||||||
virtual void loadLinksQuery(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
|
virtual void loadLinksQuery(int signatureId, std::multimap<int, Link> & links, Link::Type type = Link::kUndef) const;
|
||||||
|
|
||||||
virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const;
|
virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const;
|
||||||
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const;
|
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const;
|
||||||
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose) const;
|
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const;
|
||||||
|
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps, EnvSensors & sensors) const;
|
||||||
|
virtual void getLastNodeIdsQuery(std::set<int> & ids) const;
|
||||||
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const;
|
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const;
|
||||||
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const;
|
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks, bool withLandmarks) const;
|
||||||
virtual void getLastIdQuery(const std::string & tableName, int & id) const;
|
virtual void getLastIdQuery(const std::string & tableName, int & id) const;
|
||||||
virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const;
|
virtual void getInvertedIndexNiQuery(int signatureId, int & ni) const;
|
||||||
|
virtual void getNodesObservingLandmarkQuery(int landmarkId, std::map<int, Link> & nodes) const;
|
||||||
virtual void getNodeIdByLabelQuery(const std::string & label, int & id) const;
|
virtual void getNodeIdByLabelQuery(const std::string & label, int & id) const;
|
||||||
virtual void getAllLabelsQuery(std::map<int, std::string> & labels) const;
|
virtual void getAllLabelsQuery(std::map<int, std::string> & labels) const;
|
||||||
|
|
||||||
@@ -119,10 +157,7 @@ private:
|
|||||||
std::string queryStepKeypoint() const;
|
std::string queryStepKeypoint() const;
|
||||||
std::string queryStepOccupancyGridUpdate() const;
|
std::string queryStepOccupancyGridUpdate() const;
|
||||||
void stepNode(sqlite3_stmt * ppStmt, const Signature * s) const;
|
void stepNode(sqlite3_stmt * ppStmt, const Signature * s) const;
|
||||||
void stepImage(
|
void stepImage(sqlite3_stmt * ppStmt, int id, const cv::Mat & imageBytes) const;
|
||||||
sqlite3_stmt * ppStmt,
|
|
||||||
int id,
|
|
||||||
const cv::Mat & imageBytes) const;
|
|
||||||
void stepDepth(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
|
void stepDepth(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
|
||||||
void stepDepthUpdate(sqlite3_stmt * ppStmt, int nodeId, const cv::Mat & imageCompressed) const;
|
void stepDepthUpdate(sqlite3_stmt * ppStmt, int nodeId, const cv::Mat & imageCompressed) const;
|
||||||
void stepSensorData(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
|
void stepSensorData(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
|
||||||
@@ -133,6 +168,7 @@ private:
|
|||||||
int nodeId,
|
int nodeId,
|
||||||
const cv::Mat & ground,
|
const cv::Mat & ground,
|
||||||
const cv::Mat & obstacles,
|
const cv::Mat & obstacles,
|
||||||
|
const cv::Mat & empty,
|
||||||
float cellSize,
|
float cellSize,
|
||||||
const cv::Point3f & viewpoint) const;
|
const cv::Point3f & viewpoint) const;
|
||||||
|
|
||||||
@@ -140,9 +176,12 @@ private:
|
|||||||
void loadLinksQuery(std::list<Signature *> & signatures) const;
|
void loadLinksQuery(std::list<Signature *> & signatures) const;
|
||||||
int loadOrSaveDb(sqlite3 *pInMemory, const std::string & fileName, int isSave) const;
|
int loadOrSaveDb(sqlite3 *pInMemory, const std::string & fileName, int isSave) const;
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
sqlite3 * _ppDb;
|
sqlite3 * _ppDb;
|
||||||
std::string _version;
|
std::string _version;
|
||||||
|
|
||||||
|
private:
|
||||||
|
long _memoryUsedEstimate;
|
||||||
bool _dbInMemory;
|
bool _dbInMemory;
|
||||||
unsigned int _cacheSize;
|
unsigned int _cacheSize;
|
||||||
int _journalMode;
|
int _journalMode;
|
||||||
@@ -51,14 +51,16 @@ public:
|
|||||||
bool ignoreGoalDelay = false,
|
bool ignoreGoalDelay = false,
|
||||||
bool goalsIgnored = false,
|
bool goalsIgnored = false,
|
||||||
int startIndex = 0,
|
int startIndex = 0,
|
||||||
int cameraIndex = -1);
|
int cameraIndex = -1,
|
||||||
|
int maxFrames = 0);
|
||||||
DBReader(const std::list<std::string> & databasePaths,
|
DBReader(const std::list<std::string> & databasePaths,
|
||||||
float frameRate = 0.0f, // -1 = use Database stamps, 0 = inf
|
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 startIndex = 0,
|
||||||
int cameraIndex = -1);
|
int cameraIndex = -1,
|
||||||
|
int maxFrames = 0);
|
||||||
virtual ~DBReader();
|
virtual ~DBReader();
|
||||||
|
|
||||||
virtual bool init(
|
virtual bool init(
|
||||||
@@ -81,6 +83,7 @@ private:
|
|||||||
bool _ignoreGoalDelay;
|
bool _ignoreGoalDelay;
|
||||||
bool _goalsIgnored;
|
bool _goalsIgnored;
|
||||||
int _startIndex;
|
int _startIndex;
|
||||||
|
int _maxFrames;
|
||||||
int _cameraIndex;
|
int _cameraIndex;
|
||||||
|
|
||||||
DBDriver * _dbDriver;
|
DBDriver * _dbDriver;
|
||||||
@@ -92,6 +95,7 @@ private:
|
|||||||
double _previousStamp;
|
double _previousStamp;
|
||||||
int _previousMapID;
|
int _previousMapID;
|
||||||
bool _calibrated;
|
bool _calibrated;
|
||||||
|
int _framesPublished;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2018, 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_ENVSENSOR_H_
|
||||||
|
#define CORELIB_INCLUDE_RTABMAP_CORE_ENVSENSOR_H_
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class EnvSensor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Type {
|
||||||
|
// built-in types
|
||||||
|
kUndefined = 0,
|
||||||
|
kWifiSignalStrength, // dBm
|
||||||
|
kAmbientTemperature, // Celcius
|
||||||
|
kAmbientAirPressure, // hPa
|
||||||
|
kAmbientLight, // lx
|
||||||
|
kAmbientRelativeHumidity, // %
|
||||||
|
|
||||||
|
// user types
|
||||||
|
kCustomSensor1 = 100,
|
||||||
|
kCustomSensor2,
|
||||||
|
kCustomSensor3,
|
||||||
|
kCustomSensor4,
|
||||||
|
kCustomSensor5,
|
||||||
|
kCustomSensor6,
|
||||||
|
kCustomSensor7,
|
||||||
|
kCustomSensor8,
|
||||||
|
kCustomSensor9
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
EnvSensor() :
|
||||||
|
type_(kUndefined),
|
||||||
|
value_(0.0),
|
||||||
|
stamp_(0.0)
|
||||||
|
{}
|
||||||
|
EnvSensor(const Type & type, const double & value,const double & stamp = 0) :
|
||||||
|
type_(type),
|
||||||
|
value_(value),
|
||||||
|
stamp_(stamp)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual ~EnvSensor() {}
|
||||||
|
|
||||||
|
const Type & type() const {return type_;}
|
||||||
|
const double & value() const {return value_;}
|
||||||
|
const double & stamp() const {return stamp_;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Type type_;
|
||||||
|
double value_;
|
||||||
|
double stamp_;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::map<EnvSensor::Type, EnvSensor> EnvSensors;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_ENVSENSOR_H_ */
|
||||||
@@ -84,9 +84,10 @@ typedef cv::cuda::ORB CV_ORB_GPU;
|
|||||||
typedef cv::cuda::FastFeatureDetector CV_FAST_GPU;
|
typedef cv::cuda::FastFeatureDetector CV_FAST_GPU;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class ORBextractor;
|
||||||
|
|
||||||
class Stereo;
|
class Stereo;
|
||||||
#if CV_MAJOR_VERSION < 3
|
#if CV_MAJOR_VERSION < 3
|
||||||
class CV_ORB;
|
class CV_ORB;
|
||||||
@@ -105,7 +106,8 @@ public:
|
|||||||
kFeatureGfttBrief=6,
|
kFeatureGfttBrief=6,
|
||||||
kFeatureBrisk=7,
|
kFeatureBrisk=7,
|
||||||
kFeatureGfttOrb=8, //new 0.10.11
|
kFeatureGfttOrb=8, //new 0.10.11
|
||||||
kFeatureFreak=9}; //new 0.11.14
|
kFeatureKaze=9, //new 0.13.2
|
||||||
|
kFeatureOrbOctree=10}; //new 0.19.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
|
||||||
@@ -149,7 +151,7 @@ public:
|
|||||||
|
|
||||||
std::vector<cv::KeyPoint> generateKeypoints(
|
std::vector<cv::KeyPoint> generateKeypoints(
|
||||||
const cv::Mat & image,
|
const cv::Mat & image,
|
||||||
const cv::Mat & mask = cv::Mat()) const;
|
const cv::Mat & mask = cv::Mat());
|
||||||
cv::Mat generateDescriptors(
|
cv::Mat generateDescriptors(
|
||||||
const cv::Mat & image,
|
const cv::Mat & image,
|
||||||
std::vector<cv::KeyPoint> & keypoints) const;
|
std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
@@ -165,7 +167,7 @@ protected:
|
|||||||
Feature2D(const ParametersMap & parameters = ParametersMap());
|
Feature2D(const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) const = 0;
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) = 0;
|
||||||
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const = 0;
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -177,6 +179,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;
|
||||||
};
|
};
|
||||||
@@ -192,7 +196,7 @@ public:
|
|||||||
virtual Feature2D::Type getType() const {return kFeatureSurf;}
|
virtual Feature2D::Type getType() const {return kFeatureSurf;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) const;
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat());
|
||||||
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -219,7 +223,7 @@ public:
|
|||||||
virtual Feature2D::Type getType() const {return kFeatureSift;}
|
virtual Feature2D::Type getType() const {return kFeatureSift;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) const;
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat());
|
||||||
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -242,7 +246,7 @@ public:
|
|||||||
virtual Feature2D::Type getType() const {return kFeatureOrb;}
|
virtual Feature2D::Type getType() const {return kFeatureOrb;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) const;
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat());
|
||||||
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -273,7 +277,7 @@ public:
|
|||||||
virtual Feature2D::Type getType() const {return kFeatureUndef;}
|
virtual Feature2D::Type getType() const {return kFeatureUndef;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) const;
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat());
|
||||||
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const {return cv::Mat();}
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const {return cv::Mat();}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -341,7 +345,7 @@ public:
|
|||||||
virtual void parseParameters(const ParametersMap & parameters);
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) const;
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat());
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double _qualityLevel;
|
double _qualityLevel;
|
||||||
@@ -422,7 +426,7 @@ public:
|
|||||||
virtual Feature2D::Type getType() const {return kFeatureBrisk;}
|
virtual Feature2D::Type getType() const {return kFeatureBrisk;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) const;
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat());
|
||||||
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -433,27 +437,55 @@ private:
|
|||||||
cv::Ptr<CV_BRISK> brisk_;
|
cv::Ptr<CV_BRISK> brisk_;
|
||||||
};
|
};
|
||||||
|
|
||||||
//FREAK
|
//KAZE
|
||||||
class RTABMAP_EXP FREAK : public Feature2D
|
class RTABMAP_EXP KAZE : public Feature2D
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FREAK(const ParametersMap & parameters = ParametersMap());
|
KAZE(const ParametersMap & parameters = ParametersMap());
|
||||||
virtual ~FREAK();
|
virtual ~KAZE();
|
||||||
|
|
||||||
virtual void parseParameters(const ParametersMap & parameters);
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
virtual Feature2D::Type getType() const { return kFeatureFreak; }
|
virtual Feature2D::Type getType() const { return kFeatureKaze; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) const;
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat());
|
||||||
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool orientationNormalized_;
|
bool extended_;
|
||||||
bool scaleNormalized_;
|
bool upright_;
|
||||||
float patternScale_;
|
float threshold_;
|
||||||
int nOctaves_;
|
int nOctaves_;
|
||||||
|
int nOctaveLayers_;
|
||||||
|
int diffusivity_;
|
||||||
|
|
||||||
cv::Ptr<CV_FREAK> _freak;
|
#if CV_MAJOR_VERSION > 2
|
||||||
|
cv::Ptr<cv::KAZE> kaze_;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
//ORB OCTREE
|
||||||
|
class RTABMAP_EXP ORBOctree : public Feature2D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ORBOctree(const ParametersMap & parameters = ParametersMap());
|
||||||
|
virtual ~ORBOctree();
|
||||||
|
|
||||||
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
virtual Feature2D::Type getType() const {return kFeatureOrbOctree;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat());
|
||||||
|
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
float scaleFactor_;
|
||||||
|
int nLevels_;
|
||||||
|
int fastThreshold_;
|
||||||
|
int fastMinThreshold_;
|
||||||
|
|
||||||
|
cv::Ptr<ORBextractor> _orb;
|
||||||
|
cv::Mat descriptors_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -49,21 +49,25 @@ public:
|
|||||||
// Note that useDistanceL1 doesn't have any effect if LSH is used
|
// Note that useDistanceL1 doesn't have any effect if LSH is used
|
||||||
void buildLinearIndex(
|
void buildLinearIndex(
|
||||||
const cv::Mat & features,
|
const cv::Mat & features,
|
||||||
bool useDistanceL1 = false);
|
bool useDistanceL1 = false,
|
||||||
|
float rebalancingFactor = 2.0f);
|
||||||
void buildKDTreeIndex(
|
void buildKDTreeIndex(
|
||||||
const cv::Mat & features,
|
const cv::Mat & features,
|
||||||
int trees = 4,
|
int trees = 4,
|
||||||
bool useDistanceL1 = false);
|
bool useDistanceL1 = false,
|
||||||
|
float rebalancingFactor = 2.0f);
|
||||||
void buildKDTreeSingleIndex(
|
void buildKDTreeSingleIndex(
|
||||||
const cv::Mat & features,
|
const cv::Mat & features,
|
||||||
int leafMaxSize = 10,
|
int leafMaxSize = 10,
|
||||||
bool reorder = true,
|
bool reorder = true,
|
||||||
bool useDistanceL1 = false);
|
bool useDistanceL1 = false,
|
||||||
|
float rebalancingFactor = 2.0f);
|
||||||
void buildLSHIndex(
|
void buildLSHIndex(
|
||||||
const cv::Mat & features,
|
const cv::Mat & features,
|
||||||
unsigned int table_number = 12,
|
unsigned int table_number = 12,
|
||||||
unsigned int key_size = 20,
|
unsigned int key_size = 20,
|
||||||
unsigned int multi_probe_level = 2);
|
unsigned int multi_probe_level = 2,
|
||||||
|
float rebalancingFactor = 2.0f);
|
||||||
|
|
||||||
bool isBuilt();
|
bool isBuilt();
|
||||||
|
|
||||||
@@ -74,7 +78,7 @@ public:
|
|||||||
|
|
||||||
void removePoint(unsigned int index);
|
void removePoint(unsigned int index);
|
||||||
|
|
||||||
// return squared distances
|
// return squared distances (indices should be casted in size_t)
|
||||||
void knnSearch(
|
void knnSearch(
|
||||||
const cv::Mat & query,
|
const cv::Mat & query,
|
||||||
cv::Mat & indices,
|
cv::Mat & indices,
|
||||||
@@ -102,6 +106,7 @@ private:
|
|||||||
int featuresDim_;
|
int featuresDim_;
|
||||||
bool isLSH_;
|
bool isLSH_;
|
||||||
bool useDistanceL1_; // true=EUCLEDIAN_L2 false=MANHATTAN_L1
|
bool useDistanceL1_; // true=EUCLEDIAN_L2 false=MANHATTAN_L1
|
||||||
|
float rebalancingFactor_;
|
||||||
|
|
||||||
// keep feature in memory until the tree is rebuilt
|
// keep feature in memory until the tree is rebuilt
|
||||||
// (in case the word is deleted when removed from the VWDictionary)
|
// (in case the word is deleted when removed from the VWDictionary)
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2018, 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_GPS_H_
|
||||||
|
#define CORELIB_INCLUDE_RTABMAP_CORE_GPS_H_
|
||||||
|
|
||||||
|
#include <rtabmap/core/GeodeticCoords.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
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 /* CORELIB_INCLUDE_RTABMAP_CORE_GPS_H_ */
|
||||||
@@ -73,18 +73,22 @@ public:
|
|||||||
|
|
||||||
void apply(
|
void apply(
|
||||||
int id,
|
int id,
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud) const;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
|
bool rgb = true) const;
|
||||||
void apply(
|
void apply(
|
||||||
int id,
|
int id,
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
|
||||||
const pcl::IndicesPtr & indices) const;
|
const pcl::IndicesPtr & indices,
|
||||||
|
bool rgb = true) const;
|
||||||
void apply(
|
void apply(
|
||||||
int id,
|
int id,
|
||||||
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr & cloud,
|
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr & cloud,
|
||||||
const pcl::IndicesPtr & indices) const;
|
const pcl::IndicesPtr & indices,
|
||||||
|
bool rgb = true) const;
|
||||||
void apply(
|
void apply(
|
||||||
int id,
|
int id,
|
||||||
cv::Mat & image) const;
|
cv::Mat & image,
|
||||||
|
bool rgb = true) const;
|
||||||
|
|
||||||
double getGain(int id, double * r=0, double * g=0, double * b=0) const;
|
double getGain(int id, double * r=0, double * g=0, double * b=0) const;
|
||||||
int getIndex(int id) const;
|
int getIndex(int id) const;
|
||||||
|
|||||||
@@ -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,6 +66,15 @@ 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);
|
||||||
|
static cv::Point3d Geocentric_WGS84ToENU_WGS84(
|
||||||
|
const cv::Point3d & geocentric_WGS84,
|
||||||
|
const cv::Point3d & origin_geocentric_WGS84,
|
||||||
|
const GeodeticCoords & origin);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double latitude_; // deg
|
double latitude_; // deg
|
||||||
double longitude_; // deg
|
double longitude_; // deg
|
||||||
|
|||||||
@@ -32,7 +32,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <rtabmap/core/Parameters.h>
|
||||||
#include <rtabmap/core/Link.h>
|
#include <rtabmap/core/Link.h>
|
||||||
|
#include <rtabmap/core/GPS.h>
|
||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
class Memory;
|
class Memory;
|
||||||
@@ -43,21 +45,89 @@ namespace graph {
|
|||||||
// Graph utilities
|
// Graph utilities
|
||||||
////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
|
|
||||||
bool RTABMAP_EXP exportPoses(
|
bool RTABMAP_EXP exportPoses(
|
||||||
const std::string & filePath,
|
const std::string & filePath,
|
||||||
int format, // 0=Raw (*.txt), 1=RGBD-SLAM (*.txt), 2=KITTI (*.txt), 3=TORO (*.graph), 4=g2o (*.g2o)
|
int format, // 0=Raw (*.txt), 1=RGBD-SLAM motion capture (*.txt) (10=without change of coordinate frame), 2=KITTI (*.txt), 3=TORO (*.graph), 4=g2o (*.g2o)
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
const std::multimap<int, Link> & constraints = std::multimap<int, Link>(), // required for formats 3 and 4
|
const std::multimap<int, Link> & constraints = std::multimap<int, Link>(), // required for formats 3 and 4
|
||||||
const std::map<int, double> & stamps = std::map<int, double>(), // required for format 1
|
const std::map<int, double> & stamps = std::map<int, double>(), // required for format 1
|
||||||
bool g2oRobust = false); // optional for format 4
|
const ParametersMap & parameters = ParametersMap()); // optional for formats 3 and 4
|
||||||
|
|
||||||
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, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe
|
int format, // 0=Raw, 1=RGBD-SLAM motion capture (10=without change of coordinate frame), 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 average of translation and rotation errors between each poses.
|
||||||
|
* @param poses_gt, Ground Truth poses
|
||||||
|
* @param poses_result, Estimated poses
|
||||||
|
* @param t_err, Output translation error (m)
|
||||||
|
* @param r_err, Output rotation error (deg)
|
||||||
|
*/
|
||||||
|
void RTABMAP_EXP calcRelativeErrors (
|
||||||
|
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);
|
||||||
|
|
||||||
|
void RTABMAP_EXP computeMaxGraphErrors(
|
||||||
|
const std::map<int, Transform> & poses,
|
||||||
|
const std::multimap<int, Link> & links,
|
||||||
|
float & maxLinearErrorRatio,
|
||||||
|
float & maxAngularErrorRatio,
|
||||||
|
float & maxLinearError,
|
||||||
|
float & maxAngularError,
|
||||||
|
const Link ** maxLinearErrorLink = 0,
|
||||||
|
const Link ** maxAngularErrorLink = 0);
|
||||||
|
|
||||||
|
std::vector<double> RTABMAP_EXP getMaxOdomInf(const std::multimap<int, Link> & links);
|
||||||
|
|
||||||
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,
|
||||||
@@ -72,13 +142,19 @@ std::multimap<int, Link>::const_iterator RTABMAP_EXP findLink(
|
|||||||
const std::multimap<int, Link> & links,
|
const std::multimap<int, Link> & links,
|
||||||
int from,
|
int from,
|
||||||
int to,
|
int to,
|
||||||
bool checkBothWays = true);
|
bool checkBothWays = true,
|
||||||
|
Link::Type type = Link::kUndef);
|
||||||
std::multimap<int, int>::const_iterator RTABMAP_EXP findLink(
|
std::multimap<int, int>::const_iterator RTABMAP_EXP findLink(
|
||||||
const std::multimap<int, int> & links,
|
const std::multimap<int, int> & links,
|
||||||
int from,
|
int from,
|
||||||
int to,
|
int to,
|
||||||
bool checkBothWays = true);
|
bool checkBothWays = true);
|
||||||
|
std::list<Link> RTABMAP_EXP findLinks(
|
||||||
|
const std::multimap<int, Link> & links,
|
||||||
|
int from);
|
||||||
|
|
||||||
|
std::multimap<int, Link> RTABMAP_EXP filterDuplicateLinks(
|
||||||
|
const std::multimap<int, Link> & links);
|
||||||
std::multimap<int, Link> RTABMAP_EXP filterLinks(
|
std::multimap<int, Link> RTABMAP_EXP filterLinks(
|
||||||
const std::multimap<int, Link> & links,
|
const std::multimap<int, Link> & links,
|
||||||
Link::Type filteredType);
|
Link::Type filteredType);
|
||||||
@@ -183,6 +259,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
|
||||||
@@ -205,6 +286,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);
|
||||||
|
|||||||
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* 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, // qx qy qz qw
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// qx qy qz qw
|
||||||
|
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 localTransform_.isNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
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_ */
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2019, 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_IMUFILTER_H_
|
||||||
|
#define CORELIB_INCLUDE_RTABMAP_CORE_IMUFILTER_H_
|
||||||
|
|
||||||
|
#include <rtabmap/core/Parameters.h>
|
||||||
|
#include <Eigen/Geometry>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class IMUFilter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Type {
|
||||||
|
kMadgwick=0,
|
||||||
|
kComplementaryFilter=1};
|
||||||
|
public:
|
||||||
|
static IMUFilter * create(const ParametersMap & parameters = ParametersMap());
|
||||||
|
static IMUFilter * create(IMUFilter::Type type, const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void parseParameters(const ParametersMap & parameters) {}
|
||||||
|
virtual ~IMUFilter(){}
|
||||||
|
|
||||||
|
void update(
|
||||||
|
double gx, double gy, double gz,
|
||||||
|
double ax, double ay, double az,
|
||||||
|
double stamp);
|
||||||
|
|
||||||
|
virtual IMUFilter::Type type() const = 0;
|
||||||
|
virtual void getOrientation(double & qx, double & qy, double & qz, double & qw) const = 0;
|
||||||
|
virtual void reset(double qx = 0.0, double qy = 0.0, double qz = 0.0, double qw = 1.0) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
IMUFilter(const ParametersMap & parameters = ParametersMap()) : previousStamp_(0) {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Update from accelerometer and gyroscope data.
|
||||||
|
// [gx, gy, gz]: Angular veloctiy, in rad / s.
|
||||||
|
// [ax, ay, az]: Normalized gravity vector.
|
||||||
|
// dt: time delta, in seconds.
|
||||||
|
virtual void updateImpl(
|
||||||
|
double gx, double gy, double gz,
|
||||||
|
double ax, double ay, double az,
|
||||||
|
double dt) = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
double previousStamp_;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_IMUFILTER_H_ */
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2018, 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_LANDMARK_H_
|
||||||
|
#define CORELIB_INCLUDE_RTABMAP_CORE_LANDMARK_H_
|
||||||
|
|
||||||
|
#include <rtabmap/core/Transform.h>
|
||||||
|
#include <rtabmap/utilite/ULogger.h>
|
||||||
|
#include <rtabmap/utilite/UMath.h>
|
||||||
|
#include <rtabmap/utilite/UConversion.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class Landmark
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Landmark() :
|
||||||
|
id_(0)
|
||||||
|
{}
|
||||||
|
Landmark(const int & id, const Transform & pose, const cv::Mat & covariance) :
|
||||||
|
id_(id),
|
||||||
|
pose_(pose),
|
||||||
|
covariance_(covariance)
|
||||||
|
{
|
||||||
|
UASSERT(id_>0);
|
||||||
|
UASSERT(!pose_.isNull());
|
||||||
|
UASSERT(covariance_.cols == 6 && covariance_.rows == 6 && covariance_.type() == CV_64FC1);
|
||||||
|
UASSERT_MSG(uIsFinite(covariance_.at<double>(0,0)) && covariance_.at<double>(0,0)>0, uFormat("Linear covariance should not be null! Value=%f.", covariance_.at<double>(0,0)).c_str());
|
||||||
|
UASSERT_MSG(uIsFinite(covariance_.at<double>(1,1)) && covariance_.at<double>(1,1)>0, uFormat("Linear covariance should not be null! Value=%f.", covariance_.at<double>(1,1)).c_str());
|
||||||
|
UASSERT_MSG(uIsFinite(covariance_.at<double>(2,2)) && covariance_.at<double>(2,2)>0, uFormat("Linear covariance should not be null! Value=%f.", covariance_.at<double>(2,2)).c_str());
|
||||||
|
UASSERT_MSG(uIsFinite(covariance_.at<double>(3,3)) && covariance_.at<double>(3,3)>0, uFormat("Angular covariance should not be null! Value=%f (set to 9999 if unknown).", covariance_.at<double>(3,3)).c_str());
|
||||||
|
UASSERT_MSG(uIsFinite(covariance_.at<double>(4,4)) && covariance_.at<double>(4,4)>0, uFormat("Angular covariance should not be null! Value=%f (set to 9999 if unknown).", covariance_.at<double>(4,4)).c_str());
|
||||||
|
UASSERT_MSG(uIsFinite(covariance_.at<double>(5,5)) && covariance_.at<double>(5,5)>0, uFormat("Angular covariance should not be null! Value=%f (set to 9999 if unknown).", covariance_.at<double>(5,5)).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~Landmark() {}
|
||||||
|
|
||||||
|
const int & id() const {return id_;}
|
||||||
|
const Transform & pose() const {return pose_;}
|
||||||
|
const cv::Mat & covariance() const {return covariance_;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
int id_;
|
||||||
|
Transform pose_;
|
||||||
|
cv::Mat covariance_;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::map<int, Landmark> Landmarks;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_LANDMARK_H_ */
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
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 std::string formatName(const Format & format);
|
||||||
|
static int channels(const 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());
|
||||||
|
static LaserScan backwardCompatibility(
|
||||||
|
const cv::Mat & oldScanFormat,
|
||||||
|
float minRange,
|
||||||
|
float maxRange,
|
||||||
|
float angleMin,
|
||||||
|
float angleMax,
|
||||||
|
float angleInc,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
|
||||||
|
public:
|
||||||
|
LaserScan();
|
||||||
|
LaserScan(const cv::Mat & data,
|
||||||
|
int maxPoints,
|
||||||
|
float maxRange,
|
||||||
|
Format format,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
LaserScan(const cv::Mat & data,
|
||||||
|
Format format,
|
||||||
|
float minRange,
|
||||||
|
float maxRange,
|
||||||
|
float angleMin,
|
||||||
|
float angleMax,
|
||||||
|
float angleIncrement,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
|
||||||
|
const cv::Mat & data() const {return data_;}
|
||||||
|
Format format() const {return format_;}
|
||||||
|
std::string formatName() const {return formatName(format_);}
|
||||||
|
int channels() const {return data_.channels();}
|
||||||
|
int maxPoints() const {return maxPoints_;}
|
||||||
|
float rangeMin() const {return rangeMin_;}
|
||||||
|
float rangeMax() const {return rangeMax_;}
|
||||||
|
float angleMin() const {return angleMin_;}
|
||||||
|
float angleMax() const {return angleMax_;}
|
||||||
|
float angleIncrement() const {return angleIncrement_;}
|
||||||
|
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;
|
||||||
|
|
||||||
|
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_;
|
||||||
|
Format format_;
|
||||||
|
int maxPoints_;
|
||||||
|
float rangeMin_;
|
||||||
|
float rangeMax_;
|
||||||
|
float angleMin_;
|
||||||
|
float angleMax_;
|
||||||
|
float angleIncrement_;
|
||||||
|
Transform localTransform_;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_LASERSCAN_H_ */
|
||||||
@@ -46,23 +46,23 @@ public:
|
|||||||
kUserClosure,
|
kUserClosure,
|
||||||
kVirtualClosure,
|
kVirtualClosure,
|
||||||
kNeighborMerged,
|
kNeighborMerged,
|
||||||
kUndef};
|
kPosePrior, // Absolute pose in /world frame, From == To
|
||||||
|
kLandmark, // Transform /base_link -> /landmark, "From" is node observing the landmark "To" (landmark is negative id)
|
||||||
|
kGravity, // Orientation of the base frame accordingly to gravity (From == To)
|
||||||
|
kEnd,
|
||||||
|
kSelfRefLink = 97, // Include kPosePrior and kGravity (all links where From=To)
|
||||||
|
kAllWithLandmarks = 98,
|
||||||
|
kAllWithoutLandmarks = 99,
|
||||||
|
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;}
|
||||||
|
|
||||||
int from() const {return from_;}
|
int from() const {return from_;}
|
||||||
int to() const {return to_;}
|
int to() const {return to_;}
|
||||||
@@ -87,7 +87,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void setInfMatrix(const cv::Mat & infMatrix);
|
void setInfMatrix(const cv::Mat & infMatrix);
|
||||||
void setVariance(double rotVariance, double transVariance);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int from_;
|
int from_;
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2019, 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_MARKERDETECTOR_H_
|
||||||
|
#define CORELIB_INCLUDE_RTABMAP_CORE_MARKERDETECTOR_H_
|
||||||
|
|
||||||
|
#include <rtabmap/core/Parameters.h>
|
||||||
|
#include <rtabmap/core/CameraModel.h>
|
||||||
|
#include <opencv2/opencv_modules.hpp>
|
||||||
|
|
||||||
|
#ifdef HAVE_OPENCV_ARUCO
|
||||||
|
#include <opencv2/aruco.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class MarkerDetector {
|
||||||
|
public:
|
||||||
|
MarkerDetector(const ParametersMap & parameters = ParametersMap());
|
||||||
|
virtual ~MarkerDetector();
|
||||||
|
void parseParameters(const ParametersMap & parameters);
|
||||||
|
std::map<int, Transform> detect(const cv::Mat & image, const CameraModel & model, const cv::Mat & depth = cv::Mat(), float * estimatedMarkerLength = 0, cv::Mat * imageWithDetections = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
#ifdef HAVE_OPENCV_ARUCO
|
||||||
|
cv::Ptr<cv::aruco::DetectorParameters> detectorParams_;
|
||||||
|
float markerLength_;
|
||||||
|
float maxDepthError_;
|
||||||
|
int dictionaryId_;
|
||||||
|
cv::Ptr<cv::aruco::Dictionary> dictionary_;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace rtabmap */
|
||||||
|
|
||||||
|
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_MARKERDETECTOR_H_ */
|
||||||
@@ -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 {
|
||||||
|
|
||||||
@@ -56,6 +57,7 @@ class RegistrationInfo;
|
|||||||
class RegistrationIcp;
|
class RegistrationIcp;
|
||||||
class Stereo;
|
class Stereo;
|
||||||
class OccupancyGrid;
|
class OccupancyGrid;
|
||||||
|
class MarkerDetector;
|
||||||
|
|
||||||
class RTABMAP_EXP Memory
|
class RTABMAP_EXP Memory
|
||||||
{
|
{
|
||||||
@@ -75,6 +77,7 @@ 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,
|
||||||
@@ -91,6 +94,29 @@ public:
|
|||||||
|
|
||||||
int cleanup();
|
int cleanup();
|
||||||
void saveStatistics(const Statistics & statistics);
|
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);
|
||||||
@@ -104,6 +130,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,
|
||||||
@@ -111,6 +139,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);
|
||||||
|
|
||||||
@@ -118,21 +147,27 @@ public:
|
|||||||
const std::map<int, double> & getWorkingMem() const {return _workingMem;}
|
const std::map<int, double> & getWorkingMem() const {return _workingMem;}
|
||||||
const std::set<int> & getStMem() const {return _stMem;}
|
const std::set<int> & getStMem() const {return _stMem;}
|
||||||
int getMaxStMemSize() const {return _maxStMemSize;}
|
int getMaxStMemSize() const {return _maxStMemSize;}
|
||||||
std::map<int, Link> getNeighborLinks(int signatureId,
|
std::multimap<int, Link> getNeighborLinks(int signatureId,
|
||||||
bool lookInDatabase = false) const;
|
bool lookInDatabase = false) const;
|
||||||
std::map<int, Link> getLoopClosureLinks(int signatureId,
|
std::multimap<int, Link> getLoopClosureLinks(int signatureId,
|
||||||
bool lookInDatabase = false) const;
|
bool lookInDatabase = false) const;
|
||||||
std::map<int, Link> getLinks(int signatureId,
|
std::multimap<int, Link> getLinks(int signatureId, // can be also used to get links from landmarks
|
||||||
bool lookInDatabase = false) const;
|
bool lookInDatabase = false,
|
||||||
std::multimap<int, Link> getAllLinks(bool lookInDatabase, bool ignoreNullLinks = true) const;
|
bool withLandmarks = false) const;
|
||||||
|
std::multimap<int, Link> getAllLinks(bool lookInDatabase, bool ignoreNullLinks = true, bool withLandmarks = false) const;
|
||||||
bool isBinDataKept() const {return _binDataKept;}
|
bool isBinDataKept() const {return _binDataKept;}
|
||||||
float getSimilarityThreshold() const {return _similarityThreshold;}
|
float getSimilarityThreshold() const {return _similarityThreshold;}
|
||||||
std::map<int, int> getWeights() const;
|
std::map<int, int> getWeights() const;
|
||||||
int getLastSignatureId() const;
|
int getLastSignatureId() const;
|
||||||
const Signature * getLastWorkingSignature() const;
|
const Signature * getLastWorkingSignature() const;
|
||||||
|
std::map<int, Link> getNodesObservingLandmark(int landmarkId, bool lookInDatabase) const;
|
||||||
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;
|
const std::map<int, std::string> & getAllLabels() const {return _labels;}
|
||||||
|
const std::map<int, std::set<int> > & getLandmarksIndex() const {return _landmarksIndex;}
|
||||||
|
const std::map<int, std::set<int> > & getLandmarksInvertedIndex() const {return _landmarksInvertedIndex;}
|
||||||
|
bool allNodesInWM() const {return _allNodesInWM;}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set user data. Detect automatically if raw or compressed. If raw, the data is
|
* 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.
|
* compressed too. A matrix of type CV_8UC1 with 1 row is considered as compressed.
|
||||||
@@ -143,9 +178,13 @@ public:
|
|||||||
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;
|
||||||
|
std::string getDatabaseUrl() const;
|
||||||
double getDbSavingTime() const;
|
double getDbSavingTime() const;
|
||||||
|
int getMapId(int id, bool lookInDatabase = false) const;
|
||||||
Transform getOdomPose(int signatureId, bool lookInDatabase = false) const;
|
Transform getOdomPose(int signatureId, bool lookInDatabase = false) const;
|
||||||
Transform getGroundTruthPose(int signatureId, bool lookInDatabase = false) const;
|
Transform getGroundTruthPose(int signatureId, bool lookInDatabase = false) const;
|
||||||
|
const std::map<int, Transform> & getGroundTruths() const {return _groundTruths;} // only those in working+STM memory
|
||||||
|
void getGPS(int id, GPS & gps, Transform & offsetENU, bool lookInDatabase, int maxGraphDepth = 0) const;
|
||||||
bool getNodeInfo(int signatureId,
|
bool getNodeInfo(int signatureId,
|
||||||
Transform & odomPose,
|
Transform & odomPose,
|
||||||
int & mapId,
|
int & mapId,
|
||||||
@@ -153,6 +192,9 @@ public:
|
|||||||
std::string & label,
|
std::string & label,
|
||||||
double & stamp,
|
double & stamp,
|
||||||
Transform & groundTruth,
|
Transform & groundTruth,
|
||||||
|
std::vector<float> & velocity,
|
||||||
|
GPS & gps,
|
||||||
|
EnvSensors & sensors,
|
||||||
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;
|
||||||
@@ -175,6 +217,7 @@ public:
|
|||||||
int getLastGlobalLoopClosureId() const {return _lastGlobalLoopClosureId;}
|
int getLastGlobalLoopClosureId() const {return _lastGlobalLoopClosureId;}
|
||||||
const Feature2D * getFeature2D() const {return _feature2D;}
|
const Feature2D * getFeature2D() const {return _feature2D;}
|
||||||
bool isGraphReduced() const {return _reduceGraph;}
|
bool isGraphReduced() const {return _reduceGraph;}
|
||||||
|
const std::vector<double> & getOdomMaxInf() const {return _odomMaxInf;}
|
||||||
|
|
||||||
void dumpMemoryTree(const char * fileNameTree) const;
|
void dumpMemoryTree(const char * fileNameTree) const;
|
||||||
virtual void dumpMemory(std::string directory) const;
|
virtual void dumpMemory(std::string directory) const;
|
||||||
@@ -191,11 +234,11 @@ public:
|
|||||||
const std::set<int> & ids,
|
const std::set<int> & ids,
|
||||||
std::map<int, Transform> & poses,
|
std::map<int, Transform> & poses,
|
||||||
std::multimap<int, Link> & links,
|
std::multimap<int, Link> & links,
|
||||||
bool lookInDatabase = false);
|
bool lookInDatabase = false,
|
||||||
|
bool landmarksAdded = false);
|
||||||
|
|
||||||
Transform computeTransform(Signature & fromS, Signature & toS, Transform guess, RegistrationInfo * info = 0, bool useKnownCorrespondencesIfPossible = false) 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, bool useKnownCorrespondencesIfPossible = false);
|
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,
|
||||||
@@ -244,6 +287,8 @@ private:
|
|||||||
bool _rawDescriptorsKept;
|
bool _rawDescriptorsKept;
|
||||||
bool _saveDepth16Format;
|
bool _saveDepth16Format;
|
||||||
bool _notLinkedNodesKeptInDb;
|
bool _notLinkedNodesKeptInDb;
|
||||||
|
bool _saveIntermediateNodeData;
|
||||||
|
std::string _rgbCompressionFormat;
|
||||||
bool _incrementalMemory;
|
bool _incrementalMemory;
|
||||||
bool _reduceGraph;
|
bool _reduceGraph;
|
||||||
int _maxStMemSize;
|
int _maxStMemSize;
|
||||||
@@ -253,18 +298,29 @@ 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;
|
bool _compressionParallelized;
|
||||||
float _laserScanDownsampleStepSize;
|
float _laserScanDownsampleStepSize;
|
||||||
|
float _laserScanVoxelSize;
|
||||||
int _laserScanNormalK;
|
int _laserScanNormalK;
|
||||||
|
float _laserScanNormalRadius;
|
||||||
bool _reextractLoopClosureFeatures;
|
bool _reextractLoopClosureFeatures;
|
||||||
|
bool _localBundleOnLoopClosure;
|
||||||
float _rehearsalMaxDistance;
|
float _rehearsalMaxDistance;
|
||||||
float _rehearsalMaxAngle;
|
float _rehearsalMaxAngle;
|
||||||
bool _rehearsalWeightIgnoredWhileMoving;
|
bool _rehearsalWeightIgnoredWhileMoving;
|
||||||
bool _useOdometryFeatures;
|
bool _useOdometryFeatures;
|
||||||
|
bool _useOdometryGravity;
|
||||||
bool _createOccupancyGrid;
|
bool _createOccupancyGrid;
|
||||||
int _visMaxFeatures;
|
int _visMaxFeatures;
|
||||||
|
bool _imagesAlreadyRectified;
|
||||||
|
bool _rectifyOnlyFeatures;
|
||||||
|
bool _covOffDiagonalIgnored;
|
||||||
|
bool _detectMarkers;
|
||||||
|
float _markerLinVariance;
|
||||||
|
float _markerAngVariance;
|
||||||
|
|
||||||
int _idCount;
|
int _idCount;
|
||||||
int _idMapCount;
|
int _idMapCount;
|
||||||
@@ -273,10 +329,19 @@ 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;
|
||||||
|
bool _allNodesInWM;
|
||||||
|
GPS _gpsOrigin;
|
||||||
|
std::vector<CameraModel> _rectCameraModels;
|
||||||
|
StereoCameraModel _rectStereoCameraModel;
|
||||||
|
std::vector<double> _odomMaxInf;
|
||||||
|
|
||||||
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
|
||||||
std::map<int, double> _workingMem; // id,age
|
std::map<int, double> _workingMem; // id,age
|
||||||
|
std::map<int, Transform> _groundTruths;
|
||||||
|
std::map<int, std::string> _labels;
|
||||||
|
std::map<int, std::set<int> > _landmarksIndex; // <nodeId, landmarkIds>
|
||||||
|
std::map<int, std::set<int> > _landmarksInvertedIndex; // <landmarkId, nodeIds>
|
||||||
|
|
||||||
//Keypoint stuff
|
//Keypoint stuff
|
||||||
VWDictionary * _vwd;
|
VWDictionary * _vwd;
|
||||||
@@ -286,9 +351,11 @@ private:
|
|||||||
bool _parallelized;
|
bool _parallelized;
|
||||||
|
|
||||||
Registration * _registrationPipeline;
|
Registration * _registrationPipeline;
|
||||||
RegistrationIcp * _registrationIcp;
|
RegistrationIcp * _registrationIcpMulti;
|
||||||
|
|
||||||
OccupancyGrid * _occupancy;
|
OccupancyGrid * _occupancy;
|
||||||
|
|
||||||
|
MarkerDetector * _markerDetector;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -39,16 +39,32 @@ namespace rtabmap {
|
|||||||
|
|
||||||
class RTABMAP_EXP OccupancyGrid
|
class RTABMAP_EXP OccupancyGrid
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
inline static float logodds(double probability)
|
||||||
|
{
|
||||||
|
return (float) log(probability/(1-probability));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static double probability(double logodds)
|
||||||
|
{
|
||||||
|
return 1. - ( 1. / (1. + exp(logodds)));
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OccupancyGrid(const ParametersMap & parameters = ParametersMap());
|
OccupancyGrid(const ParametersMap & parameters = ParametersMap());
|
||||||
void parseParameters(const ParametersMap & parameters);
|
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);
|
void setCellSize(float cellSize);
|
||||||
float getCellSize() const {return cellSize_;}
|
float getCellSize() const {return cellSize_;}
|
||||||
|
void setCloudAssembling(bool enabled);
|
||||||
float getMinMapSize() const {return minMapSize_;}
|
float getMinMapSize() const {return minMapSize_;}
|
||||||
bool isGridFromDepth() const {return occupancyFromCloud_;}
|
bool isGridFromDepth() const {return occupancyFromDepth_;}
|
||||||
bool isFullUpdate() const {return fullUpdate_;}
|
bool isFullUpdate() const {return fullUpdate_;}
|
||||||
|
float getUpdateError() const {return updateError_;}
|
||||||
|
bool isMapFrameProjection() const {return projMapFrame_;}
|
||||||
const std::map<int, Transform> & addedNodes() const {return addedNodes_;}
|
const std::map<int, Transform> & addedNodes() const {return addedNodes_;}
|
||||||
int cacheSize() const {return (int)cache_.size();}
|
int cacheSize() const {return (int)cache_.size();}
|
||||||
|
const std::map<int, std::pair<std::pair<cv::Mat, cv::Mat>, cv::Mat> > & getCache() const {return cache_;}
|
||||||
|
|
||||||
template<typename PointT>
|
template<typename PointT>
|
||||||
typename pcl::PointCloud<PointT>::Ptr segmentCloud(
|
typename pcl::PointCloud<PointT>::Ptr segmentCloud(
|
||||||
@@ -62,17 +78,31 @@ public:
|
|||||||
|
|
||||||
void createLocalMap(
|
void createLocalMap(
|
||||||
const Signature & node,
|
const Signature & node,
|
||||||
cv::Mat & ground,
|
cv::Mat & groundCells,
|
||||||
cv::Mat & obstacles,
|
cv::Mat & obstacleCells,
|
||||||
|
cv::Mat & emptyCells,
|
||||||
cv::Point3f & viewPoint) const;
|
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 clear();
|
||||||
void addToCache(
|
void addToCache(
|
||||||
int nodeId,
|
int nodeId,
|
||||||
const cv::Mat & ground,
|
const cv::Mat & ground,
|
||||||
const cv::Mat & obstacles);
|
const cv::Mat & obstacles,
|
||||||
void update(const std::map<int, Transform> & poses);
|
const cv::Mat & empty);
|
||||||
const cv::Mat getMap(float & xMin, float & yMin) const;
|
bool update(const std::map<int, Transform> & poses); // return true if map has changed
|
||||||
|
cv::Mat getMap(float & xMin, float & yMin) const;
|
||||||
|
cv::Mat getProbMap(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:
|
private:
|
||||||
ParametersMap parameters_;
|
ParametersMap parameters_;
|
||||||
@@ -85,7 +115,8 @@ private:
|
|||||||
float footprintHeight_;
|
float footprintHeight_;
|
||||||
int scanDecimation_;
|
int scanDecimation_;
|
||||||
float cellSize_;
|
float cellSize_;
|
||||||
bool occupancyFromCloud_;
|
bool preVoxelFiltering_;
|
||||||
|
bool occupancyFromDepth_;
|
||||||
bool projMapFrame_;
|
bool projMapFrame_;
|
||||||
float maxObstacleHeight_;
|
float maxObstacleHeight_;
|
||||||
int normalKSearch_;
|
int normalKSearch_;
|
||||||
@@ -101,20 +132,30 @@ private:
|
|||||||
float noiseFilteringRadius_;
|
float noiseFilteringRadius_;
|
||||||
int noiseFilteringMinNeighbors_;
|
int noiseFilteringMinNeighbors_;
|
||||||
bool scan2dUnknownSpaceFilled_;
|
bool scan2dUnknownSpaceFilled_;
|
||||||
double scan2dMaxUnknownSpaceFilledRange_;
|
bool rayTracing_;
|
||||||
bool projRayTracing_;
|
|
||||||
bool fullUpdate_;
|
bool fullUpdate_;
|
||||||
float minMapSize_;
|
float minMapSize_;
|
||||||
bool erode_;
|
bool erode_;
|
||||||
float footprintRadius_;
|
float footprintRadius_;
|
||||||
|
float updateError_;
|
||||||
|
float occupancyThr_;
|
||||||
|
float probHit_;
|
||||||
|
float probMiss_;
|
||||||
|
float probClampingMin_;
|
||||||
|
float probClampingMax_;
|
||||||
|
|
||||||
std::map<int, std::pair<cv::Mat, cv::Mat> > cache_;
|
std::map<int, std::pair<std::pair<cv::Mat, cv::Mat>, cv::Mat> > cache_; //<node id, < <ground, obstacles>, empty> >
|
||||||
cv::Mat map_;
|
cv::Mat map_;
|
||||||
cv::Mat mapInfo_;
|
cv::Mat mapInfo_;
|
||||||
std::map<int, std::pair<int, int> > cellCount_; //<node Id, cells>
|
std::map<int, std::pair<int, int> > cellCount_; //<node Id, cells>
|
||||||
float xMin_;
|
float xMin_;
|
||||||
float yMin_;
|
float yMin_;
|
||||||
std::map<int, Transform> addedNodes_;
|
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_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,45 +37,164 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <pcl/point_types.h>
|
#include <pcl/point_types.h>
|
||||||
|
|
||||||
#include <rtabmap/core/Transform.h>
|
#include <rtabmap/core/Transform.h>
|
||||||
|
#include <rtabmap/core/Parameters.h>
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
class OcTreeNodeInfo
|
// forward declaraton for "friend"
|
||||||
|
class RtabmapColorOcTree;
|
||||||
|
|
||||||
|
class RtabmapColorOcTreeNode : public octomap::ColorOcTreeNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OcTreeNodeInfo(int nodeRefId, const octomap::OcTreeKey & key, bool isObstacle) :
|
enum OccupancyType {kTypeUnknown=-1, kTypeEmpty=0, kTypeGround=1, kTypeObstacle=100};
|
||||||
nodeRefId_(nodeRefId),
|
|
||||||
key_(key),
|
public:
|
||||||
isObstacle_(isObstacle) {}
|
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 nodeRefId_;
|
||||||
octomap::OcTreeKey key_;
|
int type_; // -1=undefined, 0=empty, 100=obstacle, 1=ground
|
||||||
bool isObstacle_;
|
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 ~RtabmapColorOcTree() {}
|
||||||
|
|
||||||
|
/// 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 {
|
class RTABMAP_EXP OctoMap {
|
||||||
public:
|
public:
|
||||||
OctoMap(float voxelSize = 0.1f, float occupancyThr = 0.5f, bool fullUpdate = false);
|
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_;}
|
const std::map<int, Transform> & addedNodes() const {return addedNodes_;}
|
||||||
void addToCache(int nodeId,
|
void addToCache(int nodeId,
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr & ground,
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & ground,
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr & obstacles,
|
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & obstacles,
|
||||||
const pcl::PointXYZ & viewPoint);
|
const pcl::PointXYZ & viewPoint);
|
||||||
void addToCache(int nodeId,
|
void addToCache(int nodeId,
|
||||||
const cv::Mat & ground,
|
const cv::Mat & ground,
|
||||||
const cv::Mat & obstacles,
|
const cv::Mat & obstacles,
|
||||||
|
const cv::Mat & empty,
|
||||||
const cv::Point3f & viewPoint);
|
const cv::Point3f & viewPoint);
|
||||||
void update(const std::map<int, Transform> & poses);
|
bool update(const std::map<int, Transform> & poses); // return true if map has changed
|
||||||
|
|
||||||
const octomap::ColorOcTree * octree() const {return octree_;}
|
const RtabmapColorOcTree * octree() const {return octree_;}
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr createCloud(
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr createCloud(
|
||||||
unsigned int treeDepth = 0,
|
unsigned int treeDepth = 0,
|
||||||
std::vector<int> * obstacleIndices = 0,
|
std::vector<int> * obstacleIndices = 0,
|
||||||
std::vector<int> * emptyIndices = 0) const;
|
std::vector<int> * emptyIndices = 0,
|
||||||
|
std::vector<int> * groundIndices = 0,
|
||||||
|
bool originalRefPoints = true) const;
|
||||||
|
|
||||||
cv::Mat createProjectionMap(
|
cv::Mat createProjectionMap(
|
||||||
float & xMin,
|
float & xMin,
|
||||||
@@ -89,16 +208,29 @@ public:
|
|||||||
virtual ~OctoMap();
|
virtual ~OctoMap();
|
||||||
void clear();
|
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:
|
private:
|
||||||
std::map<int, std::pair<cv::Mat, cv::Mat> > cache_;
|
void updateMinMax(const octomap::point3d & point);
|
||||||
std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGB>::Ptr, pcl::PointCloud<pcl::PointXYZRGB>::Ptr> > cacheClouds_;
|
|
||||||
|
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_;
|
std::map<int, cv::Point3f> cacheViewPoints_;
|
||||||
octomap::ColorOcTree * octree_;
|
RtabmapColorOcTree * octree_;
|
||||||
std::map<octomap::ColorOcTreeNode*, OcTreeNodeInfo> occupiedCells_;
|
|
||||||
std::map<int, Transform> addedNodes_;
|
std::map<int, Transform> addedNodes_;
|
||||||
octomap::KeyRay keyRay_;
|
|
||||||
bool hasColor_;
|
bool hasColor_;
|
||||||
bool fullUpdate_;
|
bool fullUpdate_;
|
||||||
|
float updateError_;
|
||||||
|
float rangeMax_;
|
||||||
|
bool rayTracing_;
|
||||||
|
double minValues_[3];
|
||||||
|
double maxValues_[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
@@ -45,11 +45,19 @@ public:
|
|||||||
enum Type {
|
enum Type {
|
||||||
kTypeUndef = -1,
|
kTypeUndef = -1,
|
||||||
kTypeF2M = 0,
|
kTypeF2M = 0,
|
||||||
kTypeF2F = 1
|
kTypeF2F = 1,
|
||||||
|
kTypeFovis = 2,
|
||||||
|
kTypeViso2 = 3,
|
||||||
|
kTypeDVO = 4,
|
||||||
|
kTypeORBSLAM2 = 5,
|
||||||
|
kTypeOkvis = 6,
|
||||||
|
kTypeLOAM = 7,
|
||||||
|
kTypeMSCKF = 8,
|
||||||
|
kTypeVINS = 9
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static Odometry * create(const ParametersMap & parameters);
|
static Odometry * create(const ParametersMap & parameters = ParametersMap());
|
||||||
static Odometry * create(Type & type, const ParametersMap & parameters = ParametersMap());
|
static Odometry * create(Type & type, const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -58,12 +66,17 @@ public:
|
|||||||
Transform process(SensorData & data, const Transform & guess, 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 Odometry::Type getType() = 0;
|
||||||
|
virtual bool canProcessRawImages() const {return false;}
|
||||||
|
virtual bool canProcessIMU() 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_;}
|
RTABMAP_DEPRECATED(const Transform & previousVelocityTransform() const, "Use getVelocityGuess() instead.");
|
||||||
|
const Transform & getVelocityGuess() const {return velocityGuess_;}
|
||||||
double previousStamp() const {return previousStamp_;}
|
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;
|
||||||
@@ -77,6 +90,7 @@ private:
|
|||||||
bool _force3DoF;
|
bool _force3DoF;
|
||||||
bool _holonomic;
|
bool _holonomic;
|
||||||
bool guessFromMotion_;
|
bool guessFromMotion_;
|
||||||
|
bool guessSmoothingDelay_;
|
||||||
int _filteringStrategy;
|
int _filteringStrategy;
|
||||||
int _particleSize;
|
int _particleSize;
|
||||||
float _particleNoiseT;
|
float _particleNoiseT;
|
||||||
@@ -88,12 +102,16 @@ private:
|
|||||||
float _kalmanMeasurementNoise;
|
float _kalmanMeasurementNoise;
|
||||||
int _imageDecimation;
|
int _imageDecimation;
|
||||||
bool _alignWithGround;
|
bool _alignWithGround;
|
||||||
|
bool _publishRAMUsage;
|
||||||
|
bool _imagesAlreadyRectified;
|
||||||
Transform _pose;
|
Transform _pose;
|
||||||
int _resetCurrentCount;
|
int _resetCurrentCount;
|
||||||
double previousStamp_;
|
double previousStamp_;
|
||||||
Transform previousVelocityTransform_;
|
std::list<std::pair<std::vector<float>, double> > previousVelocities_;
|
||||||
|
Transform velocityGuess_;
|
||||||
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_;
|
||||||
|
|||||||
@@ -39,53 +39,29 @@ namespace rtabmap {
|
|||||||
class OdometryEvent : public UEvent
|
class OdometryEvent : public UEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static cv::Mat generateCovarianceMatrix(float rotVariance, float transVariance)
|
OdometryEvent()
|
||||||
{
|
|
||||||
UASSERT(uIsFinite(rotVariance) && rotVariance>0);
|
|
||||||
UASSERT(uIsFinite(transVariance) && transVariance>0);
|
|
||||||
cv::Mat covariance = cv::Mat::eye(6,6,CV_64FC1);
|
|
||||||
covariance.at<double>(0,0) = transVariance;
|
|
||||||
covariance.at<double>(1,1) = transVariance;
|
|
||||||
covariance.at<double>(2,2) = transVariance;
|
|
||||||
covariance.at<double>(3,3) = rotVariance;
|
|
||||||
covariance.at<double>(4,4) = rotVariance;
|
|
||||||
covariance.at<double>(5,5) = rotVariance;
|
|
||||||
return covariance;
|
|
||||||
}
|
|
||||||
public:
|
|
||||||
OdometryEvent() :
|
|
||||||
_covariance(cv::Mat::eye(6,6,CV_64FC1))
|
|
||||||
{
|
{
|
||||||
|
_info.reg.covariance = cv::Mat::eye(6,6,CV_64FC1);
|
||||||
}
|
}
|
||||||
OdometryEvent(
|
OdometryEvent(
|
||||||
const SensorData & data,
|
const SensorData & data,
|
||||||
const Transform & pose,
|
const Transform & pose,
|
||||||
const cv::Mat & covariance = cv::Mat::eye(6,6,CV_64FC1),
|
|
||||||
const OdometryInfo & info = OdometryInfo()) :
|
const OdometryInfo & info = OdometryInfo()) :
|
||||||
_data(data),
|
_data(data),
|
||||||
_pose(pose),
|
_pose(pose),
|
||||||
_info(info)
|
_info(info)
|
||||||
{
|
{
|
||||||
UASSERT(covariance.cols == 6 && covariance.rows == 6 && covariance.type() == CV_64FC1);
|
if(_info.reg.covariance.empty())
|
||||||
UASSERT_MSG(uIsFinite(covariance.at<double>(0,0)) && covariance.at<double>(0,0)>0, "Transitional variance should not be null! (set to 1 if unknown)");
|
{
|
||||||
UASSERT_MSG(uIsFinite(covariance.at<double>(1,1)) && covariance.at<double>(1,1)>0, "Transitional variance should not be null! (set to 1 if unknown)");
|
_info.reg.covariance = cv::Mat::eye(6,6,CV_64FC1);
|
||||||
UASSERT_MSG(uIsFinite(covariance.at<double>(2,2)) && covariance.at<double>(2,2)>0, "Transitional variance should not be null! (set to 1 if unknown)");
|
}
|
||||||
UASSERT_MSG(uIsFinite(covariance.at<double>(3,3)) && covariance.at<double>(3,3)>0, "Rotational variance should not be null! (set to 1 if unknown)");
|
UASSERT(_info.reg.covariance.cols == 6 && _info.reg.covariance.rows == 6 && _info.reg.covariance.type() == CV_64FC1);
|
||||||
UASSERT_MSG(uIsFinite(covariance.at<double>(4,4)) && covariance.at<double>(4,4)>0, "Rotational variance should not be null! (set to 1 if unknown)");
|
UASSERT_MSG(uIsFinite(_info.reg.covariance.at<double>(0,0)) && _info.reg.covariance.at<double>(0,0)>0, "Transitional variance should not be null! (set to 1 if unknown)");
|
||||||
UASSERT_MSG(uIsFinite(covariance.at<double>(5,5)) && covariance.at<double>(5,5)>0, "Rotational variance should not be null! (set to 1 if unknown)");
|
UASSERT_MSG(uIsFinite(_info.reg.covariance.at<double>(1,1)) && _info.reg.covariance.at<double>(1,1)>0, "Transitional variance should not be null! (set to 1 if unknown)");
|
||||||
_covariance = covariance;
|
UASSERT_MSG(uIsFinite(_info.reg.covariance.at<double>(2,2)) && _info.reg.covariance.at<double>(2,2)>0, "Transitional variance should not be null! (set to 1 if unknown)");
|
||||||
}
|
UASSERT_MSG(uIsFinite(_info.reg.covariance.at<double>(3,3)) && _info.reg.covariance.at<double>(3,3)>0, "Rotational variance should not be null! (set to 1 if unknown)");
|
||||||
OdometryEvent(
|
UASSERT_MSG(uIsFinite(_info.reg.covariance.at<double>(4,4)) && _info.reg.covariance.at<double>(4,4)>0, "Rotational variance should not be null! (set to 1 if unknown)");
|
||||||
const SensorData & data,
|
UASSERT_MSG(uIsFinite(_info.reg.covariance.at<double>(5,5)) && _info.reg.covariance.at<double>(5,5)>0, "Rotational variance should not be null! (set to 1 if unknown)");
|
||||||
const Transform & pose,
|
|
||||||
double rotVariance = 1.0,
|
|
||||||
double transVariance = 1.0,
|
|
||||||
const OdometryInfo & info = OdometryInfo()) :
|
|
||||||
_data(data),
|
|
||||||
_pose(pose),
|
|
||||||
_covariance(generateCovarianceMatrix(rotVariance, transVariance)),
|
|
||||||
_info(info)
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
virtual ~OdometryEvent() {}
|
virtual ~OdometryEvent() {}
|
||||||
virtual std::string getClassName() const {return "OdometryEvent";}
|
virtual std::string getClassName() const {return "OdometryEvent";}
|
||||||
@@ -93,24 +69,40 @@ public:
|
|||||||
SensorData & data() {return _data;}
|
SensorData & data() {return _data;}
|
||||||
const SensorData & data() const {return _data;}
|
const SensorData & data() const {return _data;}
|
||||||
const Transform & pose() const {return _pose;}
|
const Transform & pose() const {return _pose;}
|
||||||
const cv::Mat & covariance() const {return _covariance;}
|
const cv::Mat & covariance() const {return _info.reg.covariance;}
|
||||||
|
std::vector<float> velocity() const {
|
||||||
|
if(_info.interval>0.0)
|
||||||
|
{
|
||||||
|
std::vector<float> velocity(6,0);
|
||||||
|
float x,y,z,roll,pitch,yaw;
|
||||||
|
_info.transform.getTranslationAndEulerAngles(x,y,z,roll,pitch,yaw);
|
||||||
|
velocity[0] = x/_info.interval;
|
||||||
|
velocity[1] = y/_info.interval;
|
||||||
|
velocity[2] = z/_info.interval;
|
||||||
|
velocity[3] = roll/_info.interval;
|
||||||
|
velocity[4] = pitch/_info.interval;
|
||||||
|
velocity[5] = yaw/_info.interval;
|
||||||
|
return velocity;
|
||||||
|
}
|
||||||
|
return std::vector<float>();
|
||||||
|
}
|
||||||
const OdometryInfo & info() const {return _info;}
|
const OdometryInfo & info() const {return _info;}
|
||||||
double rotVariance() const {return uMax3(_covariance.at<double>(3,3), _covariance.at<double>(4,4), _covariance.at<double>(5,5));}
|
|
||||||
double transVariance() const {return uMax3(_covariance.at<double>(0,0), _covariance.at<double>(1,1), _covariance.at<double>(2,2));}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SensorData _data;
|
SensorData _data;
|
||||||
Transform _pose;
|
Transform _pose;
|
||||||
cv::Mat _covariance;
|
|
||||||
OdometryInfo _info;
|
OdometryInfo _info;
|
||||||
};
|
};
|
||||||
|
|
||||||
class OdometryResetEvent : public UEvent
|
class OdometryResetEvent : public UEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OdometryResetEvent(){}
|
OdometryResetEvent(const Transform & pose = Transform::getIdentity()){_pose = pose;}
|
||||||
virtual ~OdometryResetEvent() {}
|
virtual ~OdometryResetEvent() {}
|
||||||
virtual std::string getClassName() const {return "OdometryResetEvent";}
|
virtual std::string getClassName() const {return "OdometryResetEvent";}
|
||||||
|
const Transform & getPose() const {return _pose;}
|
||||||
|
private:
|
||||||
|
Transform _pose;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include "rtabmap/core/Transform.h"
|
#include "rtabmap/core/Transform.h"
|
||||||
|
#include "rtabmap/core/RegistrationInfo.h"
|
||||||
|
#include "rtabmap/core/CameraModel.h"
|
||||||
|
#include "rtabmap/core/LaserScan.h"
|
||||||
#include <opencv2/features2d/features2d.hpp>
|
#include <opencv2/features2d/features2d.hpp>
|
||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
@@ -39,11 +42,6 @@ class OdometryInfo
|
|||||||
public:
|
public:
|
||||||
OdometryInfo() :
|
OdometryInfo() :
|
||||||
lost(true),
|
lost(true),
|
||||||
matches(0),
|
|
||||||
inliers(0),
|
|
||||||
icpInliersRatio(0.0f),
|
|
||||||
varianceLin(0.0f),
|
|
||||||
varianceAng(0.0f),
|
|
||||||
features(0),
|
features(0),
|
||||||
localMapSize(0),
|
localMapSize(0),
|
||||||
localScanMapSize(0),
|
localScanMapSize(0),
|
||||||
@@ -57,6 +55,7 @@ public:
|
|||||||
stamp(0),
|
stamp(0),
|
||||||
interval(0),
|
interval(0),
|
||||||
distanceTravelled(0.0f),
|
distanceTravelled(0.0f),
|
||||||
|
memoryUsage(0),
|
||||||
type(0)
|
type(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@@ -64,11 +63,7 @@ public:
|
|||||||
{
|
{
|
||||||
OdometryInfo output;
|
OdometryInfo output;
|
||||||
output.lost = lost;
|
output.lost = lost;
|
||||||
output.matches = matches;
|
output.reg = reg.copyWithoutData();
|
||||||
output.inliers = inliers;
|
|
||||||
output.icpInliersRatio = icpInliersRatio;
|
|
||||||
output.varianceLin = varianceLin;
|
|
||||||
output.varianceAng = varianceAng;
|
|
||||||
output.features = features;
|
output.features = features;
|
||||||
output.localMapSize = localMapSize;
|
output.localMapSize = localMapSize;
|
||||||
output.localScanMapSize = localScanMapSize;
|
output.localScanMapSize = localScanMapSize;
|
||||||
@@ -76,24 +71,24 @@ public:
|
|||||||
output.localBundleOutliers = localBundleOutliers;
|
output.localBundleOutliers = localBundleOutliers;
|
||||||
output.localBundleConstraints = localBundleConstraints;
|
output.localBundleConstraints = localBundleConstraints;
|
||||||
output.localBundleTime = localBundleTime;
|
output.localBundleTime = localBundleTime;
|
||||||
|
output.localBundlePoses = localBundlePoses;
|
||||||
|
output.localBundleModels = localBundleModels;
|
||||||
output.keyFrameAdded = keyFrameAdded;
|
output.keyFrameAdded = keyFrameAdded;
|
||||||
output.timeEstimation = timeEstimation;
|
output.timeEstimation = timeEstimation;
|
||||||
output.timeParticleFiltering = timeParticleFiltering;
|
output.timeParticleFiltering = timeParticleFiltering;
|
||||||
output.stamp = stamp;
|
output.stamp = stamp;
|
||||||
|
output.interval = interval;
|
||||||
output.transform = transform;
|
output.transform = transform;
|
||||||
output.transformFiltered = transformFiltered;
|
output.transformFiltered = transformFiltered;
|
||||||
output.transformGroundTruth = transformGroundTruth;
|
output.transformGroundTruth = transformGroundTruth;
|
||||||
output.distanceTravelled = distanceTravelled;
|
output.distanceTravelled = distanceTravelled;
|
||||||
|
output.memoryUsage = memoryUsage;
|
||||||
output.type = type;
|
output.type = type;
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lost;
|
bool lost;
|
||||||
int matches;
|
RegistrationInfo reg;
|
||||||
int inliers;
|
|
||||||
float icpInliersRatio;
|
|
||||||
float varianceLin;
|
|
||||||
float varianceAng;
|
|
||||||
int features;
|
int features;
|
||||||
int localMapSize;
|
int localMapSize;
|
||||||
int localScanMapSize;
|
int localScanMapSize;
|
||||||
@@ -101,6 +96,8 @@ public:
|
|||||||
int localBundleOutliers;
|
int localBundleOutliers;
|
||||||
int localBundleConstraints;
|
int localBundleConstraints;
|
||||||
float localBundleTime;
|
float localBundleTime;
|
||||||
|
std::map<int, Transform> localBundlePoses;
|
||||||
|
std::map<int, CameraModel> localBundleModels;
|
||||||
bool keyFrameAdded;
|
bool keyFrameAdded;
|
||||||
float timeEstimation;
|
float timeEstimation;
|
||||||
float timeParticleFiltering;
|
float timeParticleFiltering;
|
||||||
@@ -109,16 +106,16 @@ public:
|
|||||||
Transform transform;
|
Transform transform;
|
||||||
Transform transformFiltered;
|
Transform transformFiltered;
|
||||||
Transform transformGroundTruth;
|
Transform transformGroundTruth;
|
||||||
|
Transform guessVelocity;
|
||||||
float distanceTravelled;
|
float distanceTravelled;
|
||||||
|
int memoryUsage; //MB
|
||||||
|
|
||||||
int type; // 0=F2M, 1=F2F
|
int type;
|
||||||
|
|
||||||
// F2M
|
// F2M
|
||||||
std::multimap<int, cv::KeyPoint> words;
|
std::multimap<int, cv::KeyPoint> words;
|
||||||
std::vector<int> wordMatches;
|
|
||||||
std::vector<int> wordInliers;
|
|
||||||
std::map<int, cv::Point3f> localMap;
|
std::map<int, cv::Point3f> localMap;
|
||||||
cv::Mat localScanMap;
|
LaserScan localScanMap;
|
||||||
|
|
||||||
// F2F
|
// F2F
|
||||||
std::vector<cv::Point2f> refCorners;
|
std::vector<cv::Point2f> refCorners;
|
||||||
|
|||||||
@@ -62,9 +62,13 @@ private:
|
|||||||
USemaphore _dataAdded;
|
USemaphore _dataAdded;
|
||||||
UMutex _dataMutex;
|
UMutex _dataMutex;
|
||||||
std::list<SensorData> _dataBuffer;
|
std::list<SensorData> _dataBuffer;
|
||||||
|
std::list<SensorData> _imuBuffer;
|
||||||
Odometry * _odometry;
|
Odometry * _odometry;
|
||||||
unsigned int _dataBufferMaxSize;
|
unsigned int _dataBufferMaxSize;
|
||||||
bool _resetOdometry;
|
bool _resetOdometry;
|
||||||
|
Transform _resetPose;
|
||||||
|
double _lastImuStamp;
|
||||||
|
double _imuEstimatedDelay;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -38,6 +38,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class FeatureBA
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FeatureBA(const cv::KeyPoint & kptIn, const float & depthIn = 0.0f, const cv::Mat & descriptorIn = cv::Mat()):
|
||||||
|
kpt(kptIn),
|
||||||
|
depth(depthIn),
|
||||||
|
descriptor(descriptorIn)
|
||||||
|
{}
|
||||||
|
cv::KeyPoint kpt;
|
||||||
|
float depth;
|
||||||
|
cv::Mat descriptor;
|
||||||
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
// Graph optimizers
|
// Graph optimizers
|
||||||
////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
@@ -56,13 +69,12 @@ public:
|
|||||||
static Optimizer * create(Optimizer::Type type, const ParametersMap & parameters = ParametersMap());
|
static Optimizer * create(Optimizer::Type type, const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
// Get connected poses and constraints from a set of links
|
// Get connected poses and constraints from a set of links
|
||||||
static void getConnectedGraph(
|
void getConnectedGraph(
|
||||||
int fromId,
|
int fromId,
|
||||||
const std::map<int, Transform> & posesIn,
|
const std::map<int, Transform> & posesIn,
|
||||||
const std::multimap<int, Link> & linksIn, // only one link between two poses
|
const std::multimap<int, Link> & linksIn,
|
||||||
std::map<int, Transform> & posesOut,
|
std::map<int, Transform> & posesOut,
|
||||||
std::multimap<int, Link> & linksOut,
|
std::multimap<int, Link> & linksOut) const;
|
||||||
int depth = 0);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~Optimizer() {}
|
virtual ~Optimizer() {}
|
||||||
@@ -75,6 +87,9 @@ public:
|
|||||||
bool isCovarianceIgnored() const {return covarianceIgnored_;}
|
bool isCovarianceIgnored() const {return covarianceIgnored_;}
|
||||||
double epsilon() const {return epsilon_;}
|
double epsilon() const {return epsilon_;}
|
||||||
bool isRobust() const {return robust_;}
|
bool isRobust() const {return robust_;}
|
||||||
|
bool priorsIgnored() const {return priorsIgnored_;}
|
||||||
|
bool landmarksIgnored() const {return landmarksIgnored_;}
|
||||||
|
float gravitySigma() const {return gravitySigma_;}
|
||||||
|
|
||||||
// setters
|
// setters
|
||||||
void setIterations(int iterations) {iterations_ = iterations;}
|
void setIterations(int iterations) {iterations_ = iterations;}
|
||||||
@@ -82,37 +97,67 @@ public:
|
|||||||
void setCovarianceIgnored(bool enabled) {covarianceIgnored_ = enabled;}
|
void setCovarianceIgnored(bool enabled) {covarianceIgnored_ = enabled;}
|
||||||
void setEpsilon(double epsilon) {epsilon_ = epsilon;}
|
void setEpsilon(double epsilon) {epsilon_ = epsilon;}
|
||||||
void setRobust(bool enabled) {robust_ = enabled;}
|
void setRobust(bool enabled) {robust_ = enabled;}
|
||||||
|
void setPriorsIgnored(bool enabled) {priorsIgnored_ = enabled;}
|
||||||
|
void setLandmarksIgnored(bool enabled) {landmarksIgnored_ = enabled;}
|
||||||
|
void setGravitySigma(float value) {gravitySigma_ = value;}
|
||||||
|
|
||||||
virtual void parseParameters(const ParametersMap & parameters);
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
|
||||||
// inherited classes should implement one of these methods
|
std::map<int, Transform> optimizeIncremental(
|
||||||
virtual std::map<int, Transform> optimize(
|
|
||||||
int rootId,
|
int rootId,
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
const std::multimap<int, Link> & constraints,
|
const std::multimap<int, Link> & constraints,
|
||||||
std::list<std::map<int, Transform> > * intermediateGraphes = 0,
|
std::list<std::map<int, Transform> > * intermediateGraphes = 0,
|
||||||
double * finalError = 0,
|
double * finalError = 0,
|
||||||
int * iterationsDone = 0);
|
int * iterationsDone = 0);
|
||||||
|
|
||||||
|
std::map<int, Transform> optimize(
|
||||||
|
int rootId,
|
||||||
|
const std::map<int, Transform> & poses,
|
||||||
|
const std::multimap<int, Link> & constraints,
|
||||||
|
std::list<std::map<int, Transform> > * intermediateGraphes = 0,
|
||||||
|
double * finalError = 0,
|
||||||
|
int * iterationsDone = 0);
|
||||||
|
|
||||||
|
// inherited classes should implement one of these methods
|
||||||
|
virtual std::map<int, Transform> optimize(
|
||||||
|
int rootId,
|
||||||
|
const std::map<int, Transform> & poses,
|
||||||
|
const std::multimap<int, Link> & constraints,
|
||||||
|
cv::Mat & outputCovariance,
|
||||||
|
std::list<std::map<int, Transform> > * intermediateGraphes = 0,
|
||||||
|
double * finalError = 0,
|
||||||
|
int * iterationsDone = 0);
|
||||||
virtual std::map<int, Transform> optimizeBA(
|
virtual std::map<int, Transform> optimizeBA(
|
||||||
int rootId, // if negative, all other poses are fixed
|
int rootId, // if negative, all other poses are fixed
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
const std::multimap<int, Link> & links,
|
const std::multimap<int, Link> & links,
|
||||||
const std::map<int, CameraModel> & models, // in case of stereo, Tx should be set
|
const std::map<int, CameraModel> & models, // in case of stereo, Tx should be set
|
||||||
std::map<int, cv::Point3f> & points3DMap,
|
std::map<int, cv::Point3f> & points3DMap,
|
||||||
const std::map<int, std::map<int, cv::Point3f> > & wordReferences, // <ID words, IDs frames + keypoint(x,y,depth)>
|
const std::map<int, std::map<int, FeatureBA> > & wordReferences, // <ID words, IDs frames + keypoint/depth/descriptor>
|
||||||
std::set<int> * outliers = 0);
|
std::set<int> * outliers = 0);
|
||||||
|
|
||||||
std::map<int, Transform> optimizeBA(
|
std::map<int, Transform> optimizeBA(
|
||||||
int rootId,
|
int rootId,
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
const std::multimap<int, Link> & links,
|
const std::multimap<int, Link> & links,
|
||||||
const std::map<int, Signature> & signatures);
|
const std::map<int, Signature> & signatures,
|
||||||
|
std::map<int, cv::Point3f> & points3DMap,
|
||||||
|
std::map<int, std::map<int, FeatureBA> > & wordReferences, // <ID words, IDs frames + keypoint/depth/descriptor>
|
||||||
|
bool rematchFeatures = false);
|
||||||
|
|
||||||
|
std::map<int, Transform> optimizeBA(
|
||||||
|
int rootId,
|
||||||
|
const std::map<int, Transform> & poses,
|
||||||
|
const std::multimap<int, Link> & links,
|
||||||
|
const std::map<int, Signature> & signatures,
|
||||||
|
bool rematchFeatures = false);
|
||||||
|
|
||||||
Transform optimizeBA(
|
Transform optimizeBA(
|
||||||
const Link & link,
|
const Link & link,
|
||||||
const CameraModel & model,
|
const CameraModel & model,
|
||||||
std::map<int, cv::Point3f> & points3DMap,
|
std::map<int, cv::Point3f> & points3DMap,
|
||||||
const std::map<int, std::map<int, cv::Point3f> > & wordReferences,
|
const std::map<int, std::map<int, FeatureBA> > & wordReferences,
|
||||||
std::set<int> * outliers = 0);
|
std::set<int> * outliers = 0);
|
||||||
|
|
||||||
void computeBACorrespondences(
|
void computeBACorrespondences(
|
||||||
@@ -120,7 +165,8 @@ public:
|
|||||||
const std::multimap<int, Link> & links,
|
const std::multimap<int, Link> & links,
|
||||||
const std::map<int, Signature> & signatures,
|
const std::map<int, Signature> & signatures,
|
||||||
std::map<int, cv::Point3f> & points3DMap,
|
std::map<int, cv::Point3f> & points3DMap,
|
||||||
std::map<int, std::map<int, cv::Point3f> > & wordReferences); // <ID words, IDs frames + keypoint/depth>
|
std::map<int, std::map<int, FeatureBA > > & wordReferences, // <ID words, IDs frames + keypoint/depth/descriptor>
|
||||||
|
bool rematchFeatures = false);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Optimizer(
|
Optimizer(
|
||||||
@@ -128,7 +174,10 @@ protected:
|
|||||||
bool slam2d = Parameters::defaultRegForce3DoF(),
|
bool slam2d = Parameters::defaultRegForce3DoF(),
|
||||||
bool covarianceIgnored = Parameters::defaultOptimizerVarianceIgnored(),
|
bool covarianceIgnored = Parameters::defaultOptimizerVarianceIgnored(),
|
||||||
double epsilon = Parameters::defaultOptimizerEpsilon(),
|
double epsilon = Parameters::defaultOptimizerEpsilon(),
|
||||||
bool robust = Parameters::defaultOptimizerRobust());
|
bool robust = Parameters::defaultOptimizerRobust(),
|
||||||
|
bool priorsIgnored = Parameters::defaultOptimizerPriorsIgnored(),
|
||||||
|
bool landmarksIgnored = Parameters::defaultOptimizerLandmarksIgnored(),
|
||||||
|
float gravitySigma = Parameters::defaultOptimizerGravitySigma());
|
||||||
Optimizer(const ParametersMap & parameters);
|
Optimizer(const ParametersMap & parameters);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -137,6 +186,9 @@ private:
|
|||||||
bool covarianceIgnored_;
|
bool covarianceIgnored_;
|
||||||
double epsilon_;
|
double epsilon_;
|
||||||
bool robust_;
|
bool robust_;
|
||||||
|
bool priorsIgnored_;
|
||||||
|
bool landmarksIgnored_;
|
||||||
|
float gravitySigma_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -28,6 +28,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#ifndef CORELIB_INCLUDE_RTABMAP_CORE_PROGRESSSTATE_H_
|
#ifndef CORELIB_INCLUDE_RTABMAP_CORE_PROGRESSSTATE_H_
|
||||||
#define CORELIB_INCLUDE_RTABMAP_CORE_PROGRESSSTATE_H_
|
#define CORELIB_INCLUDE_RTABMAP_CORE_PROGRESSSTATE_H_
|
||||||
|
|
||||||
|
#include <rtabmap/utilite/ULogger.h>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
class ProgressState
|
class ProgressState
|
||||||
{
|
{
|
||||||
@@ -35,6 +38,8 @@ public:
|
|||||||
ProgressState():canceled_(false){}
|
ProgressState():canceled_(false){}
|
||||||
virtual bool callback(const std::string & msg) const
|
virtual bool callback(const std::string & msg) const
|
||||||
{
|
{
|
||||||
|
if(!msg.empty())
|
||||||
|
UDEBUG("msg=%s", msg.c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
virtual ~ProgressState(){}
|
virtual ~ProgressState(){}
|
||||||
@@ -52,5 +57,6 @@ private:
|
|||||||
bool canceled_;
|
bool canceled_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_PROGRESSSTATE_H_ */
|
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_PROGRESSSTATE_H_ */
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2010-2017, 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 RECOVERY_H_
|
||||||
|
#define RECOVERY_H_
|
||||||
|
|
||||||
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace rtabmap {
|
||||||
|
|
||||||
|
class ProgressState;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true on success. The database is
|
||||||
|
* renamed to "*.backup.db" before recovering.
|
||||||
|
* @param corruptedDatabase database to recover
|
||||||
|
* @param keepCorruptedDatabase if false and on recovery success, the backup database is removed
|
||||||
|
* @param errorMsg error message if the function returns false
|
||||||
|
* @param progressState A ProgressState object used to get status of the recovery process
|
||||||
|
*/
|
||||||
|
bool RTABMAP_EXP databaseRecovery(
|
||||||
|
const std::string & corruptedDatabase,
|
||||||
|
bool keepCorruptedDatabase = true,
|
||||||
|
std::string * errorMsg = 0,
|
||||||
|
ProgressState * progressState = 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* RECOVERY_H_ */
|
||||||
@@ -25,8 +25,8 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef REGISTRATION_H_
|
#ifndef RTABMAP_REGISTRATION_H_
|
||||||
#define REGISTRATION_H_
|
#define RTABMAP_REGISTRATION_H_
|
||||||
|
|
||||||
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||||
|
|
||||||
@@ -45,6 +45,7 @@ public:
|
|||||||
kTypeIcp = 1,
|
kTypeIcp = 1,
|
||||||
kTypeVisIcp = 2
|
kTypeVisIcp = 2
|
||||||
};
|
};
|
||||||
|
static double COVARIANCE_EPSILON;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static Registration * create(const ParametersMap & parameters);
|
static Registration * create(const ParametersMap & parameters);
|
||||||
@@ -58,10 +59,12 @@ public:
|
|||||||
bool isScanRequired() const;
|
bool isScanRequired() const;
|
||||||
bool isUserDataRequired() const;
|
bool isUserDataRequired() const;
|
||||||
|
|
||||||
|
bool canUseGuess() const;
|
||||||
|
|
||||||
int getMinVisualCorrespondences() const;
|
int getMinVisualCorrespondences() const;
|
||||||
float getMinGeometryCorrespondencesRatio() const;
|
float getMinGeometryCorrespondencesRatio() const;
|
||||||
|
|
||||||
bool varianceFromInliersCount() const {return varianceFromInliersCount_;}
|
bool repeatOnce() const {return repeatOnce_;}
|
||||||
bool force3DoF() const {return force3DoF_;}
|
bool force3DoF() const {return force3DoF_;}
|
||||||
|
|
||||||
// take ownership!
|
// take ownership!
|
||||||
@@ -75,7 +78,7 @@ public:
|
|||||||
Transform computeTransformation(
|
Transform computeTransformation(
|
||||||
const SensorData & from,
|
const SensorData & from,
|
||||||
const SensorData & to,
|
const SensorData & to,
|
||||||
Transform SensorData = Transform::getIdentity(),
|
Transform guess = Transform::getIdentity(),
|
||||||
RegistrationInfo * info = 0) const;
|
RegistrationInfo * info = 0) const;
|
||||||
|
|
||||||
Transform computeTransformationMod(
|
Transform computeTransformationMod(
|
||||||
@@ -99,11 +102,12 @@ protected:
|
|||||||
virtual bool isImageRequiredImpl() const {return false;}
|
virtual bool isImageRequiredImpl() const {return false;}
|
||||||
virtual bool isScanRequiredImpl() const {return false;}
|
virtual bool isScanRequiredImpl() const {return false;}
|
||||||
virtual bool isUserDataRequiredImpl() const {return false;}
|
virtual bool isUserDataRequiredImpl() const {return false;}
|
||||||
|
virtual bool canUseGuessImpl() const {return false;}
|
||||||
virtual int getMinVisualCorrespondencesImpl() const {return 0;}
|
virtual int getMinVisualCorrespondencesImpl() const {return 0;}
|
||||||
virtual float getMinGeometryCorrespondencesRatioImpl() const {return 0.0f;}
|
virtual float getMinGeometryCorrespondencesRatioImpl() const {return 0.0f;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool varianceFromInliersCount_;
|
bool repeatOnce_;
|
||||||
bool force3DoF_;
|
bool force3DoF_;
|
||||||
Registration * child_;
|
Registration * child_;
|
||||||
|
|
||||||
@@ -111,4 +115,4 @@ private:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* REGISTRATION_H_ */
|
#endif /* RTABMAP_REGISTRATION_H_ */
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class RTABMAP_EXP RegistrationIcp : public Registration
|
|||||||
public:
|
public:
|
||||||
// take ownership of child
|
// take ownership of child
|
||||||
RegistrationIcp(const ParametersMap & parameters = ParametersMap(), Registration * child = 0);
|
RegistrationIcp(const ParametersMap & parameters = ParametersMap(), Registration * child = 0);
|
||||||
virtual ~RegistrationIcp() {}
|
virtual ~RegistrationIcp();
|
||||||
|
|
||||||
virtual void parseParameters(const ParametersMap & parameters);
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
|
||||||
@@ -52,6 +52,7 @@ protected:
|
|||||||
Transform guess,
|
Transform guess,
|
||||||
RegistrationInfo & info) const;
|
RegistrationInfo & info) const;
|
||||||
virtual bool isScanRequiredImpl() const {return true;}
|
virtual bool isScanRequiredImpl() const {return true;}
|
||||||
|
virtual bool canUseGuessImpl() const {return true;}
|
||||||
virtual float getMinGeometryCorrespondencesRatioImpl() const {return _correspondenceRatio;}
|
virtual float getMinGeometryCorrespondencesRatioImpl() const {return _correspondenceRatio;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -64,7 +65,15 @@ private:
|
|||||||
float _epsilon;
|
float _epsilon;
|
||||||
float _correspondenceRatio;
|
float _correspondenceRatio;
|
||||||
bool _pointToPlane;
|
bool _pointToPlane;
|
||||||
int _pointToPlaneNormalNeighbors;
|
int _pointToPlaneK;
|
||||||
|
float _pointToPlaneRadius;
|
||||||
|
float _pointToPlaneMinComplexity;
|
||||||
|
bool _libpointmatcher;
|
||||||
|
std::string _libpointmatcherConfig;
|
||||||
|
int _libpointmatcherKnn;
|
||||||
|
float _libpointmatcherEpsilon;
|
||||||
|
float _libpointmatcherOutlierRatio;
|
||||||
|
void * _libpointmatcherICP;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,30 +35,48 @@ class RegistrationInfo
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RegistrationInfo() :
|
RegistrationInfo() :
|
||||||
varianceLin(0),
|
totalTime(0.0),
|
||||||
varianceAng(0),
|
|
||||||
inliers(0),
|
inliers(0),
|
||||||
matches(0),
|
matches(0),
|
||||||
icpInliersRatio(0),
|
icpInliersRatio(0),
|
||||||
icpTranslation(0.0f),
|
icpTranslation(0.0f),
|
||||||
icpRotation(0.0f)
|
icpRotation(0.0f),
|
||||||
|
icpStructuralComplexity(0.0f)
|
||||||
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
float varianceLin;
|
RegistrationInfo copyWithoutData() const
|
||||||
float varianceAng;
|
{
|
||||||
|
RegistrationInfo output;
|
||||||
|
output.totalTime = totalTime;
|
||||||
|
output.covariance = covariance.clone();
|
||||||
|
output.rejectedMsg = rejectedMsg;
|
||||||
|
output.inliers = inliers;
|
||||||
|
output.matches = matches;
|
||||||
|
output.icpInliersRatio = icpInliersRatio;
|
||||||
|
output.icpTranslation = icpTranslation;
|
||||||
|
output.icpRotation = icpRotation;
|
||||||
|
output.icpStructuralComplexity = icpStructuralComplexity;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
cv::Mat covariance;
|
||||||
std::string rejectedMsg;
|
std::string rejectedMsg;
|
||||||
|
double totalTime;
|
||||||
|
|
||||||
// RegistrationVis
|
// RegistrationVis
|
||||||
int inliers;
|
int inliers;
|
||||||
std::vector<int> inliersIDs;
|
std::vector<int> inliersIDs;
|
||||||
int matches;
|
int matches;
|
||||||
std::vector<int> matchesIDs;
|
std::vector<int> matchesIDs;
|
||||||
|
std::vector<int> projectedIDs; // "From" IDs
|
||||||
|
|
||||||
// RegistrationIcp
|
// RegistrationIcp
|
||||||
float icpInliersRatio;
|
float icpInliersRatio;
|
||||||
float icpTranslation;
|
float icpTranslation;
|
||||||
float icpRotation;
|
float icpRotation;
|
||||||
|
float icpStructuralComplexity;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ protected:
|
|||||||
RegistrationInfo & info) const;
|
RegistrationInfo & info) const;
|
||||||
|
|
||||||
virtual bool isImageRequiredImpl() const {return true;}
|
virtual bool isImageRequiredImpl() const {return true;}
|
||||||
|
virtual bool canUseGuessImpl() const {return _correspondencesApproach != 0 || _guessWinSize>0;}
|
||||||
virtual int getMinVisualCorrespondencesImpl() const {return _minInliers;}
|
virtual int getMinVisualCorrespondencesImpl() const {return _minInliers;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -81,7 +82,9 @@ private:
|
|||||||
int _flowMaxLevel;
|
int _flowMaxLevel;
|
||||||
float _nndr;
|
float _nndr;
|
||||||
int _guessWinSize;
|
int _guessWinSize;
|
||||||
|
bool _guessMatchToProjection;
|
||||||
int _bundleAdjustment;
|
int _bundleAdjustment;
|
||||||
|
bool _depthAsMask;
|
||||||
|
|
||||||
ParametersMap _featureParameters;
|
ParametersMap _featureParameters;
|
||||||
ParametersMap _bundleParameters;
|
ParametersMap _bundleParameters;
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ public:
|
|||||||
const SensorData & data,
|
const SensorData & data,
|
||||||
Transform odomPose,
|
Transform odomPose,
|
||||||
const cv::Mat & odomCovariance = cv::Mat::eye(6,6,CV_64FC1),
|
const cv::Mat & odomCovariance = cv::Mat::eye(6,6,CV_64FC1),
|
||||||
|
const std::vector<float> & odomVelocity = std::vector<float>(),
|
||||||
const std::map<std::string, float> & externalStats = std::map<std::string, float>());
|
const std::map<std::string, float> & externalStats = std::map<std::string, float>());
|
||||||
// for convenience
|
// for convenience
|
||||||
bool process(
|
bool process(
|
||||||
@@ -78,6 +79,7 @@ public:
|
|||||||
Transform odomPose,
|
Transform odomPose,
|
||||||
float odomLinearVariance,
|
float odomLinearVariance,
|
||||||
float odomAngularVariance,
|
float odomAngularVariance,
|
||||||
|
const std::vector<float> & odomVelocity = std::vector<float>(),
|
||||||
const std::map<std::string, float> & externalStats = std::map<std::string, float>());
|
const std::map<std::string, float> & externalStats = std::map<std::string, float>());
|
||||||
// for convenience, loop closure detection only
|
// for convenience, loop closure detection only
|
||||||
bool process(
|
bool process(
|
||||||
@@ -116,6 +118,7 @@ public:
|
|||||||
const Statistics & getStatistics() const;
|
const Statistics & getStatistics() const;
|
||||||
//bool getMetricData(int locationId, cv::Mat & rgb, cv::Mat & depth, float & depthConstant, Transform & pose, Transform & localTransform) const;
|
//bool getMetricData(int locationId, cv::Mat & rgb, cv::Mat & depth, float & depthConstant, Transform & pose, Transform & localTransform) const;
|
||||||
const std::map<int, Transform> & getLocalOptimizedPoses() const {return _optimizedPoses;}
|
const std::map<int, Transform> & getLocalOptimizedPoses() const {return _optimizedPoses;}
|
||||||
|
const std::multimap<int, Link> & getLocalConstraints() const {return _constraints;}
|
||||||
Transform getPose(int locationId) const;
|
Transform getPose(int locationId) const;
|
||||||
Transform getMapCorrection() const {return _mapCorrection;}
|
Transform getMapCorrection() const {return _mapCorrection;}
|
||||||
const Memory * getMemory() const {return _memory;}
|
const Memory * getMemory() const {return _memory;}
|
||||||
@@ -126,6 +129,7 @@ public:
|
|||||||
float getTimeThreshold() const {return _maxTimeAllowed;} // in ms
|
float getTimeThreshold() const {return _maxTimeAllowed;} // in ms
|
||||||
void setTimeThreshold(float maxTimeAllowed); // in ms
|
void setTimeThreshold(float maxTimeAllowed); // in ms
|
||||||
|
|
||||||
|
void setInitialPose(const Transform & initialPose);
|
||||||
int triggerNewMap();
|
int triggerNewMap();
|
||||||
bool labelLocation(int id, const std::string & label);
|
bool labelLocation(int id, const std::string & label);
|
||||||
/**
|
/**
|
||||||
@@ -149,7 +153,8 @@ public:
|
|||||||
void parseParameters(const ParametersMap & parameters);
|
void parseParameters(const ParametersMap & parameters);
|
||||||
const ParametersMap & getParameters() const {return _parameters;}
|
const ParametersMap & getParameters() const {return _parameters;}
|
||||||
void setWorkingDirectory(std::string path);
|
void setWorkingDirectory(std::string path);
|
||||||
void rejectLoopClosure(int oldId, int newId);
|
void rejectLastLoopClosure();
|
||||||
|
void deleteLastLocation();
|
||||||
void setOptimizedPoses(const std::map<int, Transform> & poses);
|
void setOptimizedPoses(const std::map<int, Transform> & poses);
|
||||||
void get3DMap(std::map<int, Signature> & signatures,
|
void get3DMap(std::map<int, Signature> & signatures,
|
||||||
std::map<int, Transform> & poses,
|
std::map<int, Transform> & poses,
|
||||||
@@ -159,15 +164,22 @@ public:
|
|||||||
void getGraph(std::map<int, Transform> & poses,
|
void getGraph(std::map<int, Transform> & poses,
|
||||||
std::multimap<int, Link> & constraints,
|
std::multimap<int, Link> & constraints,
|
||||||
bool optimized,
|
bool optimized,
|
||||||
bool global,
|
bool global,
|
||||||
std::map<int, Signature> * signatures = 0);
|
std::map<int, Signature> * signatures = 0);
|
||||||
int detectMoreLoopClosures(float clusterRadius = 0.5f, float clusterAngle = M_PI/6.0f, int iterations = 1, const ProgressState * state = 0);
|
int detectMoreLoopClosures(
|
||||||
|
float clusterRadius = 0.5f,
|
||||||
|
float clusterAngle = M_PI/6.0f,
|
||||||
|
int iterations = 1,
|
||||||
|
bool intraSession = true,
|
||||||
|
bool interSession = true,
|
||||||
|
const ProgressState * state = 0);
|
||||||
int refineLinks();
|
int refineLinks();
|
||||||
|
cv::Mat getInformation(const cv::Mat & covariance) const;
|
||||||
|
|
||||||
int getPathStatus() const {return _pathStatus;} // -1=failed 0=idle/executing 1=success
|
int getPathStatus() const {return _pathStatus;} // -1=failed 0=idle/executing 1=success
|
||||||
void clearPath(int status); // -1=failed 0=idle/executing 1=success
|
void clearPath(int status); // -1=failed 0=idle/executing 1=success
|
||||||
bool computePath(int targetNode, bool global);
|
bool computePath(int targetNode, bool global);
|
||||||
bool computePath(const Transform & targetPose); // only in current optimized map
|
bool computePath(const Transform & targetPose, float tolerance = -1.0f); // only in current optimized map, tolerance (m) < 0 means RGBD/LocalRadius, 0 means infinite
|
||||||
const std::vector<std::pair<int, Transform> > & getPath() const {return _path;}
|
const std::vector<std::pair<int, Transform> > & getPath() const {return _path;}
|
||||||
std::vector<std::pair<int, Transform> > getPathNextPoses() const;
|
std::vector<std::pair<int, Transform> > getPathNextPoses() const;
|
||||||
std::vector<int> getPathNextNodes() const;
|
std::vector<int> getPathNextNodes() const;
|
||||||
@@ -177,7 +189,7 @@ public:
|
|||||||
const Transform & getPathTransformToGoal() const {return _pathTransformToGoal;}
|
const Transform & getPathTransformToGoal() const {return _pathTransformToGoal;}
|
||||||
|
|
||||||
std::map<int, Transform> getForwardWMPoses(int fromId, int maxNearestNeighbors, float radius, int maxDiffID) const;
|
std::map<int, Transform> getForwardWMPoses(int fromId, int maxNearestNeighbors, float radius, int maxDiffID) const;
|
||||||
std::map<int, std::map<int, Transform> > getPaths(std::map<int, Transform> poses, const Transform & target, int maxGraphDepth = 0) const;
|
std::map<int, std::map<int, Transform> > getPaths(const std::map<int, Transform> & poses, const Transform & target, int maxGraphDepth = 0) const;
|
||||||
void adjustLikelihood(std::map<int, float> & likelihood) const;
|
void adjustLikelihood(std::map<int, float> & likelihood) const;
|
||||||
std::pair<int, float> selectHypothesis(const std::map<int, float> & posterior,
|
std::pair<int, float> selectHypothesis(const std::map<int, float> & posterior,
|
||||||
const std::map<int, float> & likelihood) const;
|
const std::map<int, float> & likelihood) const;
|
||||||
@@ -186,6 +198,7 @@ private:
|
|||||||
void optimizeCurrentMap(int id,
|
void optimizeCurrentMap(int id,
|
||||||
bool lookInDatabase,
|
bool lookInDatabase,
|
||||||
std::map<int, Transform> & optimizedPoses,
|
std::map<int, Transform> & optimizedPoses,
|
||||||
|
cv::Mat & covariance,
|
||||||
std::multimap<int, Link> * constraints = 0,
|
std::multimap<int, Link> * constraints = 0,
|
||||||
double * error = 0,
|
double * error = 0,
|
||||||
int * iterationsDone = 0) const;
|
int * iterationsDone = 0) const;
|
||||||
@@ -194,6 +207,7 @@ private:
|
|||||||
const std::set<int> & ids,
|
const std::set<int> & ids,
|
||||||
const std::map<int, Transform> & guessPoses,
|
const std::map<int, Transform> & guessPoses,
|
||||||
bool lookInDatabase,
|
bool lookInDatabase,
|
||||||
|
cv::Mat & covariance,
|
||||||
std::multimap<int, Link> * constraints = 0,
|
std::multimap<int, Link> * constraints = 0,
|
||||||
double * error = 0,
|
double * error = 0,
|
||||||
int * iterationsDone = 0) const;
|
int * iterationsDone = 0) const;
|
||||||
@@ -209,10 +223,14 @@ private:
|
|||||||
bool _publishLastSignatureData;
|
bool _publishLastSignatureData;
|
||||||
bool _publishPdf;
|
bool _publishPdf;
|
||||||
bool _publishLikelihood;
|
bool _publishLikelihood;
|
||||||
|
bool _publishRAMUsage;
|
||||||
|
bool _computeRMSE;
|
||||||
|
bool _saveWMState;
|
||||||
float _maxTimeAllowed; // in ms
|
float _maxTimeAllowed; // in ms
|
||||||
unsigned int _maxMemoryAllowed; // signatures count in WM
|
unsigned int _maxMemoryAllowed; // signatures count in WM
|
||||||
float _loopThr;
|
float _loopThr;
|
||||||
float _loopRatio;
|
float _loopRatio;
|
||||||
|
bool _verifyLoopClosureHypothesis;
|
||||||
unsigned int _maxRetrieved;
|
unsigned int _maxRetrieved;
|
||||||
unsigned int _maxLocalRetrieved;
|
unsigned int _maxLocalRetrieved;
|
||||||
bool _rawDataKept;
|
bool _rawDataKept;
|
||||||
@@ -222,6 +240,8 @@ private:
|
|||||||
bool _rgbdSlamMode;
|
bool _rgbdSlamMode;
|
||||||
float _rgbdLinearUpdate;
|
float _rgbdLinearUpdate;
|
||||||
float _rgbdAngularUpdate;
|
float _rgbdAngularUpdate;
|
||||||
|
float _rgbdLinearSpeedUpdate;
|
||||||
|
float _rgbdAngularSpeedUpdate;
|
||||||
float _newMapOdomChangeDistance;
|
float _newMapOdomChangeDistance;
|
||||||
bool _neighborLinkRefining;
|
bool _neighborLinkRefining;
|
||||||
bool _proximityByTime;
|
bool _proximityByTime;
|
||||||
@@ -237,13 +257,18 @@ private:
|
|||||||
float _proximityAngle;
|
float _proximityAngle;
|
||||||
std::string _databasePath;
|
std::string _databasePath;
|
||||||
bool _optimizeFromGraphEnd;
|
bool _optimizeFromGraphEnd;
|
||||||
float _optimizationMaxLinearError;
|
float _optimizationMaxError;
|
||||||
bool _startNewMapOnLoopClosure;
|
bool _startNewMapOnLoopClosure;
|
||||||
|
bool _startNewMapOnGoodSignature;
|
||||||
float _goalReachedRadius; // meters
|
float _goalReachedRadius; // meters
|
||||||
bool _goalsSavedInUserData;
|
bool _goalsSavedInUserData;
|
||||||
int _pathStuckIterations;
|
int _pathStuckIterations;
|
||||||
float _pathLinearVelocity;
|
float _pathLinearVelocity;
|
||||||
float _pathAngularVelocity;
|
float _pathAngularVelocity;
|
||||||
|
bool _savedLocalizationIgnored;
|
||||||
|
bool _loopCovLimited;
|
||||||
|
bool _loopGPS;
|
||||||
|
int _maxOdomCacheSize;
|
||||||
|
|
||||||
std::pair<int, float> _loopClosureHypothesis;
|
std::pair<int, float> _loopClosureHypothesis;
|
||||||
std::pair<int, float> _highestHypothesis;
|
std::pair<int, float> _highestHypothesis;
|
||||||
@@ -275,6 +300,10 @@ private:
|
|||||||
Transform _mapCorrectionBackup; // used in localization mode when odom is lost
|
Transform _mapCorrectionBackup; // used in localization mode when odom is lost
|
||||||
Transform _lastLocalizationPose; // Corrected odometry pose. In mapping mode, this corresponds to last pose return by getLocalOptimizedPoses().
|
Transform _lastLocalizationPose; // Corrected odometry pose. In mapping mode, this corresponds to last pose return by getLocalOptimizedPoses().
|
||||||
int _lastLocalizationNodeId; // for localization mode
|
int _lastLocalizationNodeId; // for localization mode
|
||||||
|
std::map<int, std::pair<cv::Point3d, Transform> > _gpsGeocentricCache;
|
||||||
|
bool _currentSessionHasGPS;
|
||||||
|
std::map<int, Transform> _odomCachePoses; // used in localization mode to reject loop closures
|
||||||
|
std::multimap<int, Link> _odomCacheConstraints; // used in localization mode to reject loop closures
|
||||||
|
|
||||||
// Planning stuff
|
// Planning stuff
|
||||||
int _pathStatus;
|
int _pathStatus;
|
||||||
@@ -288,6 +317,5 @@ private:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* RTABMAP_H_ */
|
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
#endif /* RTABMAP_H_ */
|
||||||
|
|||||||
@@ -66,7 +66,6 @@ public:
|
|||||||
kStateCleanDataBuffer,
|
kStateCleanDataBuffer,
|
||||||
kStatePublishingMap,
|
kStatePublishingMap,
|
||||||
kStateTriggeringMap,
|
kStateTriggeringMap,
|
||||||
kStateAddingUserData,
|
|
||||||
kStateSettingGoal,
|
kStateSettingGoal,
|
||||||
kStateCancellingGoal,
|
kStateCancellingGoal,
|
||||||
kStateLabelling
|
kStateLabelling
|
||||||
@@ -114,6 +113,7 @@ private:
|
|||||||
std::queue<ParametersMap> _stateParam;
|
std::queue<ParametersMap> _stateParam;
|
||||||
|
|
||||||
std::list<OdometryEvent> _dataBuffer;
|
std::list<OdometryEvent> _dataBuffer;
|
||||||
|
std::list<double> _newMapEvents;
|
||||||
UMutex _dataMutex;
|
UMutex _dataMutex;
|
||||||
USemaphore _dataAdded;
|
USemaphore _dataAdded;
|
||||||
unsigned int _dataBufferMaxSize;
|
unsigned int _dataBufferMaxSize;
|
||||||
@@ -125,8 +125,7 @@ private:
|
|||||||
Rtabmap * _rtabmap;
|
Rtabmap * _rtabmap;
|
||||||
bool _paused;
|
bool _paused;
|
||||||
Transform lastPose_;
|
Transform lastPose_;
|
||||||
double _rotVariance;
|
cv::Mat covariance_;
|
||||||
double _transVariance;
|
|
||||||
|
|
||||||
cv::Mat _userData;
|
cv::Mat _userData;
|
||||||
UMutex _userDataMutex;
|
UMutex _userDataMutex;
|
||||||
|
|||||||
@@ -33,9 +33,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <rtabmap/core/CameraModel.h>
|
#include <rtabmap/core/CameraModel.h>
|
||||||
#include <rtabmap/core/StereoCameraModel.h>
|
#include <rtabmap/core/StereoCameraModel.h>
|
||||||
#include <rtabmap/core/Transform.h>
|
#include <rtabmap/core/Transform.h>
|
||||||
#include <rtabmap/core/LaserScanInfo.h>
|
|
||||||
#include <opencv2/core/core.hpp>
|
#include <opencv2/core/core.hpp>
|
||||||
#include <opencv2/features2d/features2d.hpp>
|
#include <opencv2/features2d/features2d.hpp>
|
||||||
|
#include <rtabmap/core/LaserScan.h>
|
||||||
|
#include <rtabmap/core/IMU.h>
|
||||||
|
#include <rtabmap/core/GPS.h>
|
||||||
|
#include <rtabmap/core/EnvSensor.h>
|
||||||
|
#include <rtabmap/core/Landmark.h>
|
||||||
|
|
||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
@@ -75,8 +79,7 @@ public:
|
|||||||
|
|
||||||
// RGB-D constructor + laser scan
|
// RGB-D constructor + laser scan
|
||||||
SensorData(
|
SensorData(
|
||||||
const cv::Mat & laserScan,
|
const LaserScan & laserScan,
|
||||||
const LaserScanInfo & laserScanInfo,
|
|
||||||
const cv::Mat & rgb,
|
const cv::Mat & rgb,
|
||||||
const cv::Mat & depth,
|
const cv::Mat & depth,
|
||||||
const CameraModel & cameraModel,
|
const CameraModel & cameraModel,
|
||||||
@@ -95,8 +98,7 @@ public:
|
|||||||
|
|
||||||
// Multi-cameras RGB-D constructor + laser scan
|
// Multi-cameras RGB-D constructor + laser scan
|
||||||
SensorData(
|
SensorData(
|
||||||
const cv::Mat & laserScan,
|
const LaserScan & laserScan,
|
||||||
const LaserScanInfo & laserScanInfo,
|
|
||||||
const cv::Mat & rgb,
|
const cv::Mat & rgb,
|
||||||
const cv::Mat & depth,
|
const cv::Mat & depth,
|
||||||
const std::vector<CameraModel> & cameraModels,
|
const std::vector<CameraModel> & cameraModels,
|
||||||
@@ -115,8 +117,7 @@ public:
|
|||||||
|
|
||||||
// Stereo constructor + laser scan
|
// Stereo constructor + laser scan
|
||||||
SensorData(
|
SensorData(
|
||||||
const cv::Mat & laserScan,
|
const LaserScan & laserScan,
|
||||||
const LaserScanInfo & laserScanInfo,
|
|
||||||
const cv::Mat & left,
|
const cv::Mat & left,
|
||||||
const cv::Mat & right,
|
const cv::Mat & right,
|
||||||
const StereoCameraModel & cameraModel,
|
const StereoCameraModel & cameraModel,
|
||||||
@@ -124,7 +125,13 @@ public:
|
|||||||
double stamp = 0.0,
|
double stamp = 0.0,
|
||||||
const cv::Mat & userData = cv::Mat());
|
const cv::Mat & userData = cv::Mat());
|
||||||
|
|
||||||
virtual ~SensorData() {}
|
// IMU constructor
|
||||||
|
SensorData(
|
||||||
|
const IMU & imu,
|
||||||
|
int id = 0,
|
||||||
|
double stamp = 0.0);
|
||||||
|
|
||||||
|
virtual ~SensorData();
|
||||||
|
|
||||||
bool isValid() const {
|
bool isValid() const {
|
||||||
return !(_id == 0 &&
|
return !(_id == 0 &&
|
||||||
@@ -133,32 +140,46 @@ public:
|
|||||||
_imageCompressed.empty() &&
|
_imageCompressed.empty() &&
|
||||||
_depthOrRightRaw.empty() &&
|
_depthOrRightRaw.empty() &&
|
||||||
_depthOrRightCompressed.empty() &&
|
_depthOrRightCompressed.empty() &&
|
||||||
_laserScanRaw.empty() &&
|
_laserScanRaw.isEmpty() &&
|
||||||
_laserScanCompressed.empty() &&
|
_laserScanCompressed.isEmpty() &&
|
||||||
_cameraModels.size() == 0 &&
|
_cameraModels.size() == 0 &&
|
||||||
!_stereoCameraModel.isValidForProjection() &&
|
!_stereoCameraModel.isValidForProjection() &&
|
||||||
_userDataRaw.empty() &&
|
_userDataRaw.empty() &&
|
||||||
_userDataCompressed.empty() &&
|
_userDataCompressed.empty() &&
|
||||||
_keypoints.size() == 0 &&
|
_keypoints.size() == 0 &&
|
||||||
_descriptors.empty());
|
_descriptors.empty() &&
|
||||||
|
imu_.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
int id() const {return _id;}
|
int id() const {return _id;}
|
||||||
void setId(int id) {_id = id;}
|
void setId(int id) {_id = id;}
|
||||||
double stamp() const {return _stamp;}
|
double stamp() const {return _stamp;}
|
||||||
void setStamp(double stamp) {_stamp = stamp;}
|
void setStamp(double stamp) {_stamp = stamp;}
|
||||||
const LaserScanInfo & laserScanInfo() const {return _laserScanInfo;}
|
|
||||||
|
|
||||||
const cv::Mat & imageCompressed() const {return _imageCompressed;}
|
const cv::Mat & imageCompressed() const {return _imageCompressed;}
|
||||||
const cv::Mat & depthOrRightCompressed() const {return _depthOrRightCompressed;}
|
const cv::Mat & depthOrRightCompressed() const {return _depthOrRightCompressed;}
|
||||||
const cv::Mat & laserScanCompressed() const {return _laserScanCompressed;}
|
const LaserScan & laserScanCompressed() const {return _laserScanCompressed;}
|
||||||
|
|
||||||
const cv::Mat & imageRaw() const {return _imageRaw;}
|
const cv::Mat & imageRaw() const {return _imageRaw;}
|
||||||
const cv::Mat & depthOrRightRaw() const {return _depthOrRightRaw;}
|
const cv::Mat & depthOrRightRaw() const {return _depthOrRightRaw;}
|
||||||
const cv::Mat & laserScanRaw() const {return _laserScanRaw;}
|
const LaserScan & laserScanRaw() const {return _laserScanRaw;}
|
||||||
void setImageRaw(const cv::Mat & imageRaw) {_imageRaw = imageRaw;}
|
|
||||||
void setDepthOrRightRaw(const cv::Mat & depthOrImageRaw) {_depthOrRightRaw =depthOrImageRaw;}
|
/**
|
||||||
void setLaserScanRaw(const cv::Mat & laserScanRaw, const LaserScanInfo & info) {_laserScanRaw =laserScanRaw;_laserScanInfo = info;}
|
* Set image data. Detect automatically if raw or compressed.
|
||||||
|
* A matrix of type CV_8UC1 with 1 row is considered as compressed.
|
||||||
|
* @param clearPreviousData, clear previous raw and compressed images before setting the new ones.
|
||||||
|
*/
|
||||||
|
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const CameraModel & model, bool clearPreviousData = true);
|
||||||
|
void setRGBDImage(const cv::Mat & rgb, const cv::Mat & depth, const std::vector<CameraModel> & models, bool clearPreviousData = true);
|
||||||
|
void setStereoImage(const cv::Mat & left, const cv::Mat & right, const StereoCameraModel & stereoCameraModel, bool clearPreviousData = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set laser scan data. Detect automatically if raw or compressed.
|
||||||
|
* A matrix of type CV_8UC1 with 1 row is considered as compressed.
|
||||||
|
* @param clearPreviousData, clear previous raw and compressed scans before setting the new one.
|
||||||
|
*/
|
||||||
|
void setLaserScan(const LaserScan & laserScan, bool clearPreviousData = true);
|
||||||
|
|
||||||
void setCameraModel(const CameraModel & model) {_cameraModels.clear(); _cameraModels.push_back(model);}
|
void setCameraModel(const CameraModel & model) {_cameraModels.clear(); _cameraModels.push_back(model);}
|
||||||
void setCameraModels(const std::vector<CameraModel> & models) {_cameraModels = models;}
|
void setCameraModels(const std::vector<CameraModel> & models) {_cameraModels = models;}
|
||||||
void setStereoCameraModel(const StereoCameraModel & stereoCameraModel) {_stereoCameraModel = stereoCameraModel;}
|
void setStereoCameraModel(const StereoCameraModel & stereoCameraModel) {_stereoCameraModel = stereoCameraModel;}
|
||||||
@@ -167,34 +188,41 @@ public:
|
|||||||
cv::Mat depthRaw() const {return _depthOrRightRaw.type()!=CV_8UC1?_depthOrRightRaw:cv::Mat();}
|
cv::Mat depthRaw() const {return _depthOrRightRaw.type()!=CV_8UC1?_depthOrRightRaw:cv::Mat();}
|
||||||
cv::Mat rightRaw() const {return _depthOrRightRaw.type()==CV_8UC1?_depthOrRightRaw:cv::Mat();}
|
cv::Mat rightRaw() const {return _depthOrRightRaw.type()==CV_8UC1?_depthOrRightRaw:cv::Mat();}
|
||||||
|
|
||||||
|
RTABMAP_DEPRECATED(void setImageRaw(const cv::Mat & image), "Use setRGBDImage() or setStereoImage() with clearNotUpdated=false or removeRawData() instead. To be backward compatible, this function doesn't clear compressed data.");
|
||||||
|
RTABMAP_DEPRECATED(void setDepthOrRightRaw(const cv::Mat & image), "Use setRGBDImage() or setStereoImage() with clearNotUpdated=false or removeRawData() instead. To be backward compatible, this function doesn't clear compressed data.");
|
||||||
|
RTABMAP_DEPRECATED(void setLaserScanRaw(const LaserScan & scan), "Use setLaserScan() with clearNotUpdated=false or removeRawData() instead. To be backward compatible, this function doesn't clear compressed data.");
|
||||||
|
RTABMAP_DEPRECATED(void setUserDataRaw(const cv::Mat & data), "Use setUserData() or removeRawData() instead.");
|
||||||
|
|
||||||
void uncompressData();
|
void uncompressData();
|
||||||
void uncompressData(
|
void uncompressData(
|
||||||
cv::Mat * imageRaw,
|
cv::Mat * imageRaw,
|
||||||
cv::Mat * depthOrRightRaw,
|
cv::Mat * depthOrRightRaw,
|
||||||
cv::Mat * laserScanRaw = 0,
|
LaserScan * laserScanRaw = 0,
|
||||||
cv::Mat * userDataRaw = 0,
|
cv::Mat * userDataRaw = 0,
|
||||||
cv::Mat * groundCellsRaw = 0,
|
cv::Mat * groundCellsRaw = 0,
|
||||||
cv::Mat * obstacleCellsRaw = 0);
|
cv::Mat * obstacleCellsRaw = 0,
|
||||||
|
cv::Mat * emptyCellsRaw = 0);
|
||||||
void uncompressDataConst(
|
void uncompressDataConst(
|
||||||
cv::Mat * imageRaw,
|
cv::Mat * imageRaw,
|
||||||
cv::Mat * depthOrRightRaw,
|
cv::Mat * depthOrRightRaw,
|
||||||
cv::Mat * laserScanRaw = 0,
|
LaserScan * laserScanRaw = 0,
|
||||||
cv::Mat * userDataRaw = 0,
|
cv::Mat * userDataRaw = 0,
|
||||||
cv::Mat * groundCellsRaw = 0,
|
cv::Mat * groundCellsRaw = 0,
|
||||||
cv::Mat * obstacleCellsRaw = 0) const;
|
cv::Mat * obstacleCellsRaw = 0,
|
||||||
|
cv::Mat * emptyCellsRaw = 0) const;
|
||||||
|
|
||||||
const std::vector<CameraModel> & cameraModels() const {return _cameraModels;}
|
const std::vector<CameraModel> & cameraModels() const {return _cameraModels;}
|
||||||
const StereoCameraModel & stereoCameraModel() const {return _stereoCameraModel;}
|
const StereoCameraModel & stereoCameraModel() const {return _stereoCameraModel;}
|
||||||
|
|
||||||
void setUserDataRaw(const cv::Mat & userDataRaw); // only set raw
|
|
||||||
/**
|
/**
|
||||||
* Set user data. Detect automatically if raw or compressed. If raw, the data is
|
* 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.
|
* 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
|
* 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
|
* (to have multiple rows instead of multiple columns) in order to be detected as
|
||||||
* not compressed.
|
* not compressed.
|
||||||
|
* @param clearPreviousData, clear previous raw and compressed user data before setting the new one.
|
||||||
*/
|
*/
|
||||||
void setUserData(const cv::Mat & userData);
|
void setUserData(const cv::Mat & userData, bool clearPreviousData = true);
|
||||||
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;}
|
||||||
|
|
||||||
@@ -202,6 +230,7 @@ public:
|
|||||||
void setOccupancyGrid(
|
void setOccupancyGrid(
|
||||||
const cv::Mat & ground,
|
const cv::Mat & ground,
|
||||||
const cv::Mat & obstacles,
|
const cv::Mat & obstacles,
|
||||||
|
const cv::Mat & empty,
|
||||||
float cellSize,
|
float cellSize,
|
||||||
const cv::Point3f & viewPoint);
|
const cv::Point3f & viewPoint);
|
||||||
// remove raw occupancy grids
|
// remove raw occupancy grids
|
||||||
@@ -210,6 +239,8 @@ public:
|
|||||||
const cv::Mat & gridGroundCellsCompressed() const {return _groundCellsCompressed;}
|
const cv::Mat & gridGroundCellsCompressed() const {return _groundCellsCompressed;}
|
||||||
const cv::Mat & gridObstacleCellsRaw() const {return _obstacleCellsRaw;}
|
const cv::Mat & gridObstacleCellsRaw() const {return _obstacleCellsRaw;}
|
||||||
const cv::Mat & gridObstacleCellsCompressed() const {return _obstacleCellsCompressed;}
|
const cv::Mat & gridObstacleCellsCompressed() const {return _obstacleCellsCompressed;}
|
||||||
|
const cv::Mat & gridEmptyCellsRaw() const {return _emptyCellsRaw;}
|
||||||
|
const cv::Mat & gridEmptyCellsCompressed() const {return _emptyCellsCompressed;}
|
||||||
float gridCellSize() const {return _cellSize;}
|
float gridCellSize() const {return _cellSize;}
|
||||||
const cv::Point3f & gridViewPoint() const {return _viewPoint;}
|
const cv::Point3f & gridViewPoint() const {return _viewPoint;}
|
||||||
|
|
||||||
@@ -221,7 +252,36 @@ public:
|
|||||||
void setGroundTruth(const Transform & pose) {groundTruth_ = pose;}
|
void setGroundTruth(const Transform & pose) {groundTruth_ = pose;}
|
||||||
const Transform & groundTruth() const {return groundTruth_;}
|
const Transform & groundTruth() const {return groundTruth_;}
|
||||||
|
|
||||||
|
void setGlobalPose(const Transform & pose, const cv::Mat & covariance) {globalPose_ = pose; globalPoseCovariance_ = covariance;}
|
||||||
|
const Transform & globalPose() const {return globalPose_;}
|
||||||
|
const cv::Mat & globalPoseCovariance() const {return globalPoseCovariance_;}
|
||||||
|
|
||||||
|
void setGPS(const GPS & gps) {gps_ = gps;}
|
||||||
|
const GPS & gps() const {return gps_;}
|
||||||
|
|
||||||
|
void setIMU(const IMU & imu) {imu_ = imu; }
|
||||||
|
const IMU & imu() const {return imu_;}
|
||||||
|
|
||||||
|
void setEnvSensors(const EnvSensors & sensors) {_envSensors = sensors;}
|
||||||
|
void addEnvSensor(const EnvSensor & sensor) {_envSensors.insert(std::make_pair(sensor.type(), sensor));}
|
||||||
|
const EnvSensors & envSensors() const {return _envSensors;}
|
||||||
|
|
||||||
|
void setLandmarks(const Landmarks & landmarks) {_landmarks = landmarks;}
|
||||||
|
const Landmarks & landmarks() const {return _landmarks;}
|
||||||
|
|
||||||
long getMemoryUsed() const; // Return memory usage in Bytes
|
long getMemoryUsed() const; // Return memory usage in Bytes
|
||||||
|
/**
|
||||||
|
* Clear compressed rgb/depth (left/right) images, compressed laser scan and compressed user data.
|
||||||
|
* Raw data are kept is set.
|
||||||
|
*/
|
||||||
|
void clearCompressedData(bool images = true, bool scan = true, bool userData = true);
|
||||||
|
/**
|
||||||
|
* Clear raw rgb/depth (left/right) images, raw laser scan and raw user data.
|
||||||
|
* Compressed data are kept is set.
|
||||||
|
*/
|
||||||
|
void clearRawData(bool images = true, bool scan = true, bool userData = true);
|
||||||
|
|
||||||
|
bool isPointVisibleFromCameras(const cv::Point3f & pt) const; // assuming point is in robot frame
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int _id;
|
int _id;
|
||||||
@@ -229,17 +289,15 @@ private:
|
|||||||
|
|
||||||
cv::Mat _imageCompressed; // compressed image
|
cv::Mat _imageCompressed; // compressed image
|
||||||
cv::Mat _depthOrRightCompressed; // compressed image
|
cv::Mat _depthOrRightCompressed; // compressed image
|
||||||
cv::Mat _laserScanCompressed; // compressed data
|
LaserScan _laserScanCompressed; // compressed data
|
||||||
|
|
||||||
cv::Mat _imageRaw; // CV_8UC1 or CV_8UC3
|
cv::Mat _imageRaw; // CV_8UC1 or CV_8UC3
|
||||||
cv::Mat _depthOrRightRaw; // depth CV_16UC1 or CV_32FC1, right image CV_8UC1
|
cv::Mat _depthOrRightRaw; // depth CV_16UC1 or CV_32FC1, right image CV_8UC1
|
||||||
cv::Mat _laserScanRaw; // CV_32FC2 or CV_32FC3
|
LaserScan _laserScanRaw;
|
||||||
|
|
||||||
std::vector<CameraModel> _cameraModels;
|
std::vector<CameraModel> _cameraModels;
|
||||||
StereoCameraModel _stereoCameraModel;
|
StereoCameraModel _stereoCameraModel;
|
||||||
|
|
||||||
LaserScanInfo _laserScanInfo;
|
|
||||||
|
|
||||||
// user data
|
// user data
|
||||||
cv::Mat _userDataCompressed; // compressed data
|
cv::Mat _userDataCompressed; // compressed data
|
||||||
cv::Mat _userDataRaw;
|
cv::Mat _userDataRaw;
|
||||||
@@ -247,17 +305,32 @@ private:
|
|||||||
// occupancy grid
|
// occupancy grid
|
||||||
cv::Mat _groundCellsCompressed;
|
cv::Mat _groundCellsCompressed;
|
||||||
cv::Mat _obstacleCellsCompressed;
|
cv::Mat _obstacleCellsCompressed;
|
||||||
|
cv::Mat _emptyCellsCompressed;
|
||||||
cv::Mat _groundCellsRaw;
|
cv::Mat _groundCellsRaw;
|
||||||
cv::Mat _obstacleCellsRaw;
|
cv::Mat _obstacleCellsRaw;
|
||||||
|
cv::Mat _emptyCellsRaw;
|
||||||
float _cellSize;
|
float _cellSize;
|
||||||
cv::Point3f _viewPoint;
|
cv::Point3f _viewPoint;
|
||||||
|
|
||||||
|
// environmental sensors
|
||||||
|
EnvSensors _envSensors;
|
||||||
|
|
||||||
|
// landmarks
|
||||||
|
Landmarks _landmarks;
|
||||||
|
|
||||||
// features
|
// features
|
||||||
std::vector<cv::KeyPoint> _keypoints;
|
std::vector<cv::KeyPoint> _keypoints;
|
||||||
std::vector<cv::Point3f> _keypoints3D;
|
std::vector<cv::Point3f> _keypoints3D;
|
||||||
cv::Mat _descriptors;
|
cv::Mat _descriptors;
|
||||||
|
|
||||||
Transform groundTruth_;
|
Transform groundTruth_;
|
||||||
|
|
||||||
|
Transform globalPose_;
|
||||||
|
cv::Mat globalPoseCovariance_; // 6x6 double
|
||||||
|
|
||||||
|
GPS gps_;
|
||||||
|
|
||||||
|
IMU imu_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ public:
|
|||||||
void addLinks(const std::map<int, Link> & links);
|
void addLinks(const std::map<int, Link> & links);
|
||||||
void addLink(const Link & link);
|
void addLink(const Link & link);
|
||||||
|
|
||||||
bool hasLink(int idTo) const;
|
bool hasLink(int idTo, Link::Type type = Link::kUndef) const;
|
||||||
|
|
||||||
void changeLinkIds(int idFrom, int idTo);
|
void changeLinkIds(int idFrom, int idTo);
|
||||||
|
|
||||||
@@ -90,10 +90,13 @@ public:
|
|||||||
void removeLink(int idTo);
|
void removeLink(int idTo);
|
||||||
void removeVirtualLinks();
|
void removeVirtualLinks();
|
||||||
|
|
||||||
|
void addLandmark(const Link & landmark) {_landmarks.insert(std::make_pair(landmark.to(), landmark));}
|
||||||
|
const std::map<int, Link> & getLandmarks() const {return _landmarks;}
|
||||||
|
|
||||||
void setSaved(bool saved) {_saved = saved;}
|
void setSaved(bool saved) {_saved = saved;}
|
||||||
void setModified(bool modified) {_modified = modified; _linksModified = modified;}
|
void setModified(bool modified) {_modified = modified; _linksModified = modified;}
|
||||||
|
|
||||||
const std::map<int, Link> & getLinks() const {return _links;}
|
const std::multimap<int, Link> & getLinks() const {return _links;}
|
||||||
bool isSaved() const {return _saved;}
|
bool isSaved() const {return _saved;}
|
||||||
bool isModified() const {return _modified || _linksModified;}
|
bool isModified() const {return _modified || _linksModified;}
|
||||||
bool isLinksModified() const {return _linksModified;}
|
bool isLinksModified() const {return _linksModified;}
|
||||||
@@ -115,20 +118,33 @@ public:
|
|||||||
void setWords3(const std::multimap<int, cv::Point3f> & words3) {_words3 = words3;}
|
void setWords3(const std::multimap<int, cv::Point3f> & words3) {_words3 = words3;}
|
||||||
void setPose(const Transform & pose) {_pose = pose;}
|
void setPose(const Transform & pose) {_pose = pose;}
|
||||||
void setGroundTruthPose(const Transform & pose) {_groundTruthPose = pose;}
|
void setGroundTruthPose(const Transform & pose) {_groundTruthPose = pose;}
|
||||||
|
void setVelocity(float vx, float vy, float vz, float vroll, float vpitch, float vyaw) {
|
||||||
|
_velocity = std::vector<float>(6,0);
|
||||||
|
_velocity[0]=vx;
|
||||||
|
_velocity[1]=vy;
|
||||||
|
_velocity[2]=vz;
|
||||||
|
_velocity[3]=vroll;
|
||||||
|
_velocity[4]=vpitch;
|
||||||
|
_velocity[5]=vyaw;
|
||||||
|
}
|
||||||
|
|
||||||
const std::multimap<int, cv::Point3f> & getWords3() const {return _words3;}
|
const std::multimap<int, cv::Point3f> & getWords3() const {return _words3;}
|
||||||
const Transform & getPose() const {return _pose;}
|
const Transform & getPose() const {return _pose;}
|
||||||
cv::Mat getPoseCovariance() const;
|
cv::Mat getPoseCovariance() const;
|
||||||
const Transform & getGroundTruthPose() const {return _groundTruthPose;}
|
const Transform & getGroundTruthPose() const {return _groundTruthPose;}
|
||||||
|
const std::vector<float> & getVelocity() const {return _velocity;}
|
||||||
|
|
||||||
SensorData & sensorData() {return _sensorData;}
|
SensorData & sensorData() {return _sensorData;}
|
||||||
const SensorData & sensorData() const {return _sensorData;}
|
const SensorData & sensorData() const {return _sensorData;}
|
||||||
|
|
||||||
|
long getMemoryUsed(bool withSensorData=true) const; // Return memory usage in Bytes
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int _id;
|
int _id;
|
||||||
int _mapId;
|
int _mapId;
|
||||||
double _stamp;
|
double _stamp;
|
||||||
std::map<int, Link> _links; // id, transform
|
std::multimap<int, Link> _links; // id, transform
|
||||||
|
std::map<int, Link> _landmarks;
|
||||||
int _weight;
|
int _weight;
|
||||||
std::string _label;
|
std::string _label;
|
||||||
bool _saved; // If it's saved to bd
|
bool _saved; // If it's saved to bd
|
||||||
@@ -147,6 +163,7 @@ private:
|
|||||||
|
|
||||||
Transform _pose;
|
Transform _pose;
|
||||||
Transform _groundTruthPose;
|
Transform _groundTruthPose;
|
||||||
|
std::vector<float> _velocity;
|
||||||
|
|
||||||
SensorData _sensorData;
|
SensorData _sensorData;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -64,8 +64,13 @@ class RTABMAP_EXP Statistics
|
|||||||
RTABMAP_STATS(Loop, Visual_matches,);
|
RTABMAP_STATS(Loop, Visual_matches,);
|
||||||
RTABMAP_STATS(Loop, Last_id,);
|
RTABMAP_STATS(Loop, Last_id,);
|
||||||
RTABMAP_STATS(Loop, Optimization_max_error, m);
|
RTABMAP_STATS(Loop, Optimization_max_error, m);
|
||||||
|
RTABMAP_STATS(Loop, Optimization_max_error_ratio, );
|
||||||
RTABMAP_STATS(Loop, Optimization_error, );
|
RTABMAP_STATS(Loop, Optimization_error, );
|
||||||
RTABMAP_STATS(Loop, Optimization_iterations, );
|
RTABMAP_STATS(Loop, Optimization_iterations, );
|
||||||
|
RTABMAP_STATS(Loop, Linear_variance,);
|
||||||
|
RTABMAP_STATS(Loop, Angular_variance,);
|
||||||
|
RTABMAP_STATS(Loop, Landmark_detected,);
|
||||||
|
RTABMAP_STATS(Loop, Landmark_detected_node_ref,);
|
||||||
|
|
||||||
RTABMAP_STATS(Proximity, Time_detections,);
|
RTABMAP_STATS(Proximity, Time_detections,);
|
||||||
RTABMAP_STATS(Proximity, Space_last_detection_id,);
|
RTABMAP_STATS(Proximity, Space_last_detection_id,);
|
||||||
@@ -77,7 +82,10 @@ class RTABMAP_EXP Statistics
|
|||||||
|
|
||||||
RTABMAP_STATS(NeighborLinkRefining, Accepted,);
|
RTABMAP_STATS(NeighborLinkRefining, Accepted,);
|
||||||
RTABMAP_STATS(NeighborLinkRefining, Inliers,);
|
RTABMAP_STATS(NeighborLinkRefining, Inliers,);
|
||||||
RTABMAP_STATS(NeighborLinkRefining, Inliers_ratio,);
|
RTABMAP_STATS(NeighborLinkRefining, ICP_inliers_ratio,);
|
||||||
|
RTABMAP_STATS(NeighborLinkRefining, ICP_rotation, rad);
|
||||||
|
RTABMAP_STATS(NeighborLinkRefining, ICP_translation, m);
|
||||||
|
RTABMAP_STATS(NeighborLinkRefining, ICP_complexity,);
|
||||||
RTABMAP_STATS(NeighborLinkRefining, Variance,);
|
RTABMAP_STATS(NeighborLinkRefining, Variance,);
|
||||||
RTABMAP_STATS(NeighborLinkRefining, Pts,);
|
RTABMAP_STATS(NeighborLinkRefining, Pts,);
|
||||||
|
|
||||||
@@ -95,13 +103,17 @@ class RTABMAP_EXP Statistics
|
|||||||
RTABMAP_STATS(Memory, Rehearsal_merged,);
|
RTABMAP_STATS(Memory, Rehearsal_merged,);
|
||||||
RTABMAP_STATS(Memory, Local_graph_size,);
|
RTABMAP_STATS(Memory, Local_graph_size,);
|
||||||
RTABMAP_STATS(Memory, Small_movement,);
|
RTABMAP_STATS(Memory, Small_movement,);
|
||||||
|
RTABMAP_STATS(Memory, Fast_movement,);
|
||||||
RTABMAP_STATS(Memory, Odometry_variance_ang,);
|
RTABMAP_STATS(Memory, Odometry_variance_ang,);
|
||||||
RTABMAP_STATS(Memory, Odometry_variance_lin,);
|
RTABMAP_STATS(Memory, Odometry_variance_lin,);
|
||||||
RTABMAP_STATS(Memory, Distance_travelled, m);
|
RTABMAP_STATS(Memory, Distance_travelled, m);
|
||||||
|
RTABMAP_STATS(Memory, RAM_usage, MB);
|
||||||
|
RTABMAP_STATS(Memory, Triangulated_points, );
|
||||||
|
|
||||||
RTABMAP_STATS(Timing, Memory_update, ms);
|
RTABMAP_STATS(Timing, Memory_update, ms);
|
||||||
RTABMAP_STATS(Timing, Neighbor_link_refining, ms);
|
RTABMAP_STATS(Timing, Neighbor_link_refining, ms);
|
||||||
RTABMAP_STATS(Timing, Proximity_by_time, ms);
|
RTABMAP_STATS(Timing, Proximity_by_time, ms);
|
||||||
|
RTABMAP_STATS(Timing, Proximity_by_space_visual, ms);
|
||||||
RTABMAP_STATS(Timing, Proximity_by_space, ms);
|
RTABMAP_STATS(Timing, Proximity_by_space, ms);
|
||||||
RTABMAP_STATS(Timing, Cleaning_neighbors, ms);
|
RTABMAP_STATS(Timing, Cleaning_neighbors, ms);
|
||||||
RTABMAP_STATS(Timing, Reactivation, ms);
|
RTABMAP_STATS(Timing, Reactivation, ms);
|
||||||
@@ -117,6 +129,7 @@ class RTABMAP_EXP Statistics
|
|||||||
RTABMAP_STATS(Timing, Forgetting, ms);
|
RTABMAP_STATS(Timing, Forgetting, ms);
|
||||||
RTABMAP_STATS(Timing, Joining_trash, ms);
|
RTABMAP_STATS(Timing, Joining_trash, ms);
|
||||||
RTABMAP_STATS(Timing, Emptying_trash, ms);
|
RTABMAP_STATS(Timing, Emptying_trash, ms);
|
||||||
|
RTABMAP_STATS(Timing, Finalizing_statistics, ms);
|
||||||
|
|
||||||
RTABMAP_STATS(TimingMem, Pre_update, ms);
|
RTABMAP_STATS(TimingMem, Pre_update, ms);
|
||||||
RTABMAP_STATS(TimingMem, Signature_creation, ms);
|
RTABMAP_STATS(TimingMem, Signature_creation, ms);
|
||||||
@@ -125,19 +138,34 @@ class RTABMAP_EXP Statistics
|
|||||||
RTABMAP_STATS(TimingMem, Subpixel, ms);
|
RTABMAP_STATS(TimingMem, Subpixel, ms);
|
||||||
RTABMAP_STATS(TimingMem, Stereo_correspondences, ms);
|
RTABMAP_STATS(TimingMem, Stereo_correspondences, ms);
|
||||||
RTABMAP_STATS(TimingMem, Descriptors_extraction, ms);
|
RTABMAP_STATS(TimingMem, Descriptors_extraction, ms);
|
||||||
|
RTABMAP_STATS(TimingMem, Rectification, ms);
|
||||||
RTABMAP_STATS(TimingMem, Keypoints_3D, ms);
|
RTABMAP_STATS(TimingMem, Keypoints_3D, ms);
|
||||||
|
RTABMAP_STATS(TimingMem, Keypoints_3D_motion, ms);
|
||||||
RTABMAP_STATS(TimingMem, Joining_dictionary_update, ms);
|
RTABMAP_STATS(TimingMem, Joining_dictionary_update, ms);
|
||||||
RTABMAP_STATS(TimingMem, Add_new_words, ms);
|
RTABMAP_STATS(TimingMem, Add_new_words, ms);
|
||||||
RTABMAP_STATS(TimingMem, Compressing_data, ms);
|
RTABMAP_STATS(TimingMem, Compressing_data, ms);
|
||||||
RTABMAP_STATS(TimingMem, Post_decimation, ms);
|
RTABMAP_STATS(TimingMem, Post_decimation, ms);
|
||||||
RTABMAP_STATS(TimingMem, Scan_downsampling, ms);
|
RTABMAP_STATS(TimingMem, Scan_filtering, ms);
|
||||||
RTABMAP_STATS(TimingMem, Scan_normals, ms);
|
|
||||||
RTABMAP_STATS(TimingMem, Occupancy_grid, ms);
|
RTABMAP_STATS(TimingMem, Occupancy_grid, ms);
|
||||||
|
RTABMAP_STATS(TimingMem, Markers_detection, ms);
|
||||||
|
|
||||||
RTABMAP_STATS(Keypoint, Dictionary_size, words);
|
RTABMAP_STATS(Keypoint, Dictionary_size, words);
|
||||||
RTABMAP_STATS(Keypoint, Indexed_words, words);
|
RTABMAP_STATS(Keypoint, Indexed_words, words);
|
||||||
RTABMAP_STATS(Keypoint, Index_memory_usage, KB);
|
RTABMAP_STATS(Keypoint, Index_memory_usage, KB);
|
||||||
|
|
||||||
|
RTABMAP_STATS(Gt, Translational_rmse, m);
|
||||||
|
RTABMAP_STATS(Gt, Translational_mean, m);
|
||||||
|
RTABMAP_STATS(Gt, Translational_median, m);
|
||||||
|
RTABMAP_STATS(Gt, Translational_std, m);
|
||||||
|
RTABMAP_STATS(Gt, Translational_min, m);
|
||||||
|
RTABMAP_STATS(Gt, Translational_max, m);
|
||||||
|
RTABMAP_STATS(Gt, Rotational_rmse, deg);
|
||||||
|
RTABMAP_STATS(Gt, Rotational_mean, deg);
|
||||||
|
RTABMAP_STATS(Gt, Rotational_median, deg);
|
||||||
|
RTABMAP_STATS(Gt, Rotational_std, deg);
|
||||||
|
RTABMAP_STATS(Gt, Rotational_min, deg);
|
||||||
|
RTABMAP_STATS(Gt, Rotational_max, deg);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const std::map<std::string, float> & defaultData();
|
static const std::map<std::string, float> & defaultData();
|
||||||
static std::string serializeData(const std::map<std::string, float> & data);
|
static std::string serializeData(const std::map<std::string, float> & data);
|
||||||
@@ -152,17 +180,22 @@ public:
|
|||||||
|
|
||||||
// setters
|
// setters
|
||||||
void setExtended(bool extended) {_extended = extended;}
|
void setExtended(bool extended) {_extended = extended;}
|
||||||
void setRefImageId(int refImageId) {_refImageId = refImageId;}
|
void setRefImageId(int id) {_refImageId = id;}
|
||||||
void setLoopClosureId(int loopClosureId) {_loopClosureId = loopClosureId;}
|
void setRefImageMapId(int id) {_refImageMapId = id;}
|
||||||
|
void setLoopClosureId(int id) {_loopClosureId = id;}
|
||||||
|
void setLoopClosureMapId(int id) {_loopClosureMapId = id;}
|
||||||
void setProximityDetectionId(int id) {_proximiyDetectionId = id;}
|
void setProximityDetectionId(int id) {_proximiyDetectionId = id;}
|
||||||
|
void setProximityDetectionMapId(int id) {_proximiyDetectionMapId = id;}
|
||||||
void setStamp(double stamp) {_stamp = stamp;}
|
void setStamp(double stamp) {_stamp = stamp;}
|
||||||
|
|
||||||
void setSignatures(const std::map<int, Signature> & signatures) {_signatures = signatures;}
|
void setLastSignatureData(const Signature & data) {_lastSignatureData = data;}
|
||||||
|
|
||||||
void setPoses(const std::map<int, Transform> & poses) {_poses = poses;}
|
void setPoses(const std::map<int, Transform> & poses) {_poses = poses;}
|
||||||
void setConstraints(const std::multimap<int, Link> & constraints) {_constraints = constraints;}
|
void setConstraints(const std::multimap<int, Link> & constraints) {_constraints = constraints;}
|
||||||
void setMapCorrection(const Transform & mapCorrection) {_mapCorrection = mapCorrection;}
|
void setMapCorrection(const Transform & mapCorrection) {_mapCorrection = mapCorrection;}
|
||||||
void setLoopClosureTransform(const Transform & loopClosureTransform) {_loopClosureTransform = loopClosureTransform;}
|
void setLoopClosureTransform(const Transform & loopClosureTransform) {_loopClosureTransform = loopClosureTransform;}
|
||||||
|
void setLocalizationCovariance(const cv::Mat & covariance) {_localizationCovariance = covariance;}
|
||||||
|
void setLabels(const std::map<int, std::string> & labels) {_labels = labels;}
|
||||||
void setWeights(const std::map<int, int> & weights) {_weights = weights;}
|
void setWeights(const std::map<int, int> & weights) {_weights = weights;}
|
||||||
void setPosterior(const std::map<int, float> & posterior) {_posterior = posterior;}
|
void setPosterior(const std::map<int, float> & posterior) {_posterior = posterior;}
|
||||||
void setLikelihood(const std::map<int, float> & likelihood) {_likelihood = likelihood;}
|
void setLikelihood(const std::map<int, float> & likelihood) {_likelihood = likelihood;}
|
||||||
@@ -170,20 +203,26 @@ public:
|
|||||||
void setLocalPath(const std::vector<int> & localPath) {_localPath=localPath;}
|
void setLocalPath(const std::vector<int> & localPath) {_localPath=localPath;}
|
||||||
void setCurrentGoalId(int goal) {_currentGoalId=goal;}
|
void setCurrentGoalId(int goal) {_currentGoalId=goal;}
|
||||||
void setReducedIds(const std::map<int, int> & reducedIds) {_reducedIds = reducedIds;}
|
void setReducedIds(const std::map<int, int> & reducedIds) {_reducedIds = reducedIds;}
|
||||||
|
void setWmState(const std::vector<int> & state) {_wmState = state;}
|
||||||
|
|
||||||
// getters
|
// getters
|
||||||
bool extended() const {return _extended;}
|
bool extended() const {return _extended;}
|
||||||
int refImageId() const {return _refImageId;}
|
int refImageId() const {return _refImageId;}
|
||||||
|
int refImageMapId() const {return _refImageMapId;}
|
||||||
int loopClosureId() const {return _loopClosureId;}
|
int loopClosureId() const {return _loopClosureId;}
|
||||||
|
int loopClosureMapId() const {return _loopClosureMapId;}
|
||||||
int proximityDetectionId() const {return _proximiyDetectionId;}
|
int proximityDetectionId() const {return _proximiyDetectionId;}
|
||||||
|
int proximityDetectionMapId() const {return _proximiyDetectionMapId;}
|
||||||
double stamp() const {return _stamp;}
|
double stamp() const {return _stamp;}
|
||||||
|
|
||||||
const std::map<int, Signature> & getSignatures() const {return _signatures;}
|
const Signature & getLastSignatureData() const {return _lastSignatureData;}
|
||||||
|
|
||||||
const std::map<int, Transform> & poses() const {return _poses;}
|
const std::map<int, Transform> & poses() const {return _poses;}
|
||||||
const std::multimap<int, Link> & constraints() const {return _constraints;}
|
const std::multimap<int, Link> & constraints() const {return _constraints;}
|
||||||
const Transform & mapCorrection() const {return _mapCorrection;}
|
const Transform & mapCorrection() const {return _mapCorrection;}
|
||||||
const Transform & loopClosureTransform() const {return _loopClosureTransform;}
|
const Transform & loopClosureTransform() const {return _loopClosureTransform;}
|
||||||
|
const cv::Mat & localizationCovariance() const {return _localizationCovariance;}
|
||||||
|
const std::map<int, std::string> & labels() const {return _labels;}
|
||||||
const std::map<int, int> & weights() const {return _weights;}
|
const std::map<int, int> & weights() const {return _weights;}
|
||||||
const std::map<int, float> & posterior() const {return _posterior;}
|
const std::map<int, float> & posterior() const {return _posterior;}
|
||||||
const std::map<int, float> & likelihood() const {return _likelihood;}
|
const std::map<int, float> & likelihood() const {return _likelihood;}
|
||||||
@@ -191,6 +230,7 @@ public:
|
|||||||
const std::vector<int> & localPath() const {return _localPath;}
|
const std::vector<int> & localPath() const {return _localPath;}
|
||||||
int currentGoalId() const {return _currentGoalId;}
|
int currentGoalId() const {return _currentGoalId;}
|
||||||
const std::map<int, int> & reducedIds() const {return _reducedIds;}
|
const std::map<int, int> & reducedIds() const {return _reducedIds;}
|
||||||
|
const std::vector<int> & wmState() const {return _wmState;}
|
||||||
|
|
||||||
const std::map<std::string, float> & data() const {return _data;}
|
const std::map<std::string, float> & data() const {return _data;}
|
||||||
|
|
||||||
@@ -198,17 +238,22 @@ private:
|
|||||||
bool _extended; // 0 -> only loop closure and last signature ID fields are filled
|
bool _extended; // 0 -> only loop closure and last signature ID fields are filled
|
||||||
|
|
||||||
int _refImageId;
|
int _refImageId;
|
||||||
|
int _refImageMapId;
|
||||||
int _loopClosureId;
|
int _loopClosureId;
|
||||||
|
int _loopClosureMapId;
|
||||||
int _proximiyDetectionId;
|
int _proximiyDetectionId;
|
||||||
|
int _proximiyDetectionMapId;
|
||||||
double _stamp;
|
double _stamp;
|
||||||
|
|
||||||
std::map<int, Signature> _signatures;
|
Signature _lastSignatureData;
|
||||||
|
|
||||||
std::map<int, Transform> _poses;
|
std::map<int, Transform> _poses;
|
||||||
std::multimap<int, Link> _constraints;
|
std::multimap<int, Link> _constraints;
|
||||||
Transform _mapCorrection;
|
Transform _mapCorrection;
|
||||||
Transform _loopClosureTransform;
|
Transform _loopClosureTransform;
|
||||||
|
cv::Mat _localizationCovariance;
|
||||||
|
|
||||||
|
std::map<int, std::string> _labels;
|
||||||
std::map<int, int> _weights;
|
std::map<int, int> _weights;
|
||||||
std::map<int, float> _posterior;
|
std::map<int, float> _posterior;
|
||||||
std::map<int, float> _likelihood;
|
std::map<int, float> _likelihood;
|
||||||
@@ -219,6 +264,8 @@ private:
|
|||||||
|
|
||||||
std::map<int, int> _reducedIds;
|
std::map<int, int> _reducedIds;
|
||||||
|
|
||||||
|
std::vector<int> _wmState;
|
||||||
|
|
||||||
// Format for statistics (Plottable statistics must go in that map) :
|
// Format for statistics (Plottable statistics must go in that map) :
|
||||||
// {"Group/Name/Unit", value}
|
// {"Group/Name/Unit", value}
|
||||||
// Example : {"Timing/Total time/ms", 500.0f}
|
// Example : {"Timing/Total time/ms", 500.0f}
|
||||||
|
|||||||
@@ -53,8 +53,8 @@ public:
|
|||||||
cv::Size winSize() const {return cv::Size(winWidth_, winHeight_);}
|
cv::Size winSize() const {return cv::Size(winWidth_, winHeight_);}
|
||||||
int iterations() const {return iterations_;}
|
int iterations() const {return iterations_;}
|
||||||
int maxLevel() const {return maxLevel_;}
|
int maxLevel() const {return maxLevel_;}
|
||||||
int minDisparity() const {return minDisparity_;}
|
float minDisparity() const {return minDisparity_;}
|
||||||
int maxDisparity() const {return maxDisparity_;}
|
float maxDisparity() const {return maxDisparity_;}
|
||||||
bool winSSD() const {return winSSD_;}
|
bool winSSD() const {return winSSD_;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -62,8 +62,8 @@ private:
|
|||||||
int winHeight_;
|
int winHeight_;
|
||||||
int iterations_;
|
int iterations_;
|
||||||
int maxLevel_;
|
int maxLevel_;
|
||||||
int minDisparity_;
|
float minDisparity_;
|
||||||
int maxDisparity_;
|
float maxDisparity_;
|
||||||
bool winSSD_;
|
bool winSSD_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ public:
|
|||||||
bool isValidForRectification() const {return left_.isValidForRectification() && right_.isValidForRectification();}
|
bool isValidForRectification() const {return left_.isValidForRectification() && right_.isValidForRectification();}
|
||||||
|
|
||||||
void initRectificationMap() {left_.initRectificationMap(); right_.initRectificationMap();}
|
void initRectificationMap() {left_.initRectificationMap(); right_.initRectificationMap();}
|
||||||
|
bool isRectificationMapInitialized() {return left_.isRectificationMapInitialized() && right_.isRectificationMapInitialized();}
|
||||||
|
|
||||||
void setName(const std::string & name, const std::string & leftSuffix = "left", const std::string & rightSuffix = "right");
|
void setName(const std::string & name, const std::string & leftSuffix = "left", const std::string & rightSuffix = "right");
|
||||||
const std::string & name() const {return name_;}
|
const std::string & name() const {return name_;}
|
||||||
@@ -96,6 +97,9 @@ public:
|
|||||||
bool load(const std::string & directory, const std::string & cameraName, bool ignoreStereoTransform = true);
|
bool load(const std::string & directory, const std::string & cameraName, bool ignoreStereoTransform = true);
|
||||||
bool save(const std::string & directory, bool ignoreStereoTransform = true) const;
|
bool save(const std::string & directory, bool ignoreStereoTransform = true) const;
|
||||||
bool saveStereoTransform(const std::string & directory) const;
|
bool saveStereoTransform(const std::string & directory) const;
|
||||||
|
std::vector<unsigned char> serialize() const;
|
||||||
|
unsigned int deserialize(const std::vector<unsigned char>& data);
|
||||||
|
unsigned int deserialize(const unsigned char * data, unsigned int dataSize);
|
||||||
|
|
||||||
double baseline() const {return right_.fx()!=0.0 && left_.fx() != 0.0 ? left_.Tx() / left_.fx() - right_.Tx()/right_.fx():0.0;}
|
double baseline() const {return right_.fx()!=0.0 && left_.fx() != 0.0 ? left_.Tx() / left_.fx() - right_.Tx()/right_.fx():0.0;}
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
class RTABMAP_EXP StereoDense {
|
class RTABMAP_EXP StereoDense {
|
||||||
|
public:
|
||||||
|
enum Type {
|
||||||
|
kTypeBM = 0,
|
||||||
|
kTypeSGBM = 1
|
||||||
|
};
|
||||||
|
static StereoDense * create(const ParametersMap & parameters);
|
||||||
|
static StereoDense * create(StereoDense::Type type, const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~StereoDense() {}
|
virtual ~StereoDense() {}
|
||||||
|
|
||||||
@@ -48,29 +56,6 @@ protected:
|
|||||||
StereoDense(const ParametersMap & parameters = ParametersMap()) {}
|
StereoDense(const ParametersMap & parameters = ParametersMap()) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class RTABMAP_EXP StereoBM : public StereoDense {
|
|
||||||
public:
|
|
||||||
StereoBM(int blockSize, int numDisparities);
|
|
||||||
StereoBM(const ParametersMap & parameters = ParametersMap());
|
|
||||||
virtual ~StereoBM() {}
|
|
||||||
|
|
||||||
virtual void parseParameters(const ParametersMap & parameters);
|
|
||||||
virtual cv::Mat computeDisparity(
|
|
||||||
const cv::Mat & leftImage,
|
|
||||||
const cv::Mat & rightImage) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
int blockSize_; //15
|
|
||||||
int minDisparity_; //0
|
|
||||||
int numDisparities_; //64
|
|
||||||
int preFilterSize_; //9
|
|
||||||
int preFilterCap_; //31
|
|
||||||
int uniquenessRatio_; //15
|
|
||||||
int textureThreshold_; //10
|
|
||||||
int speckleWindowSize_; //100
|
|
||||||
int speckleRange_; //4
|
|
||||||
};
|
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|
||||||
#endif /* STEREODENSE_H_ */
|
#endif /* STEREODENSE_H_ */
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user