Compare commits

..

962 Commits

Author SHA1 Message Date
matlabbe
db3b901063 Update package.xml
Bump package version
2018-09-29 11:58:58 -04:00
matlabbe
8b055752aa RegistrationIcp: Fixed invalid variance set when structural complexity is low and input doesn't have normals. DBViewer: added check on angular error after optimizing the graph when adding a new constraint. Memory: added warning if odom angular variance detected is very high. 2018-09-28 22:02:07 -04:00
matlabbe
dbb9cfa77a Parameters: Updated description of Rtabmap/TimeThr and Rtabmap/MemoryThr (https://github.com/introlab/rtabmap_ros/issues/276) 2018-09-28 15:37:24 -04:00
matlabbe
95e87fed14 MLS: added output voxel size parameter 2018-09-28 09:45:43 -04:00
matlabbe
02fdd677cf 💄 2018-09-27 16:08:55 -04:00
matlabbe
3b74534567 Parameters: Mem/LaserScanNormalRadius should be a float 2018-09-27 14:28:51 -04:00
matlabbe
790b0e5cf7 Memory: undistortion of features can be done also for RGB-only case 2018-09-27 10:19:28 -04:00
matlabbe
5e08da51aa RealSense: fixed color rectification. Fixed ZR300 odometry frame. 2018-09-26 20:51:12 -04:00
matlabbe
0c2287df77 CameraModel fisheye model: fixed typo 2018-09-25 14:36:59 -04:00
matlabbe
b581a62c89 Fixed build with opencv < 2.4.10 for missing fisheye model 2018-09-24 15:09:12 -04:00
matlabbe
c341648a44 Added parameter "Rtabmap/RectifyOnlyFeatures". Added support of fisheye distortion model. 2018-09-24 14:36:54 -04:00
matlabbe
f903ffb927 Fixed regression errors for OpencV2 (#309) 2018-09-18 23:03:40 -04:00
matlabbe
124543c57d Fixed compilation errors with OpenCV 4.0.0 (#309) 2018-09-18 22:43:18 -04:00
matlabbe
829f05e2fb Implemented missing max angular optimization error check for RGBD/OptimizeMaxError 2018-09-18 22:34:15 -04:00
matlabbe
d936b2d35a Added '*' to cmake info to show dependencies affecting default parameters 2018-09-18 17:00:37 -04:00
matlabbe
84a8e5830e fixed https://github.com/introlab/rtabmap_ros/issues/274 2018-09-18 12:30:01 -04:00
matlabbe
eedc68c360 fixed #312 2018-09-18 12:20:15 -04:00
matlabbe
0cf37fbbf1 Added D415 icon 2018-09-15 11:37:02 -04:00
matlabbe
5f6dd0846d NoEventsExample: updated usage example info 2018-09-07 13:11:39 -04:00
matlabbe
3c15563569 fixed sqlite3 cmake info not correctly shown 2018-09-05 15:03:50 -04:00
matlabbe
1f985ddef0 FindSqlite3.cmake: removed sqlite3 executable search 2018-09-05 12:05:16 -04:00
matlabbe
43e144e7b6 CMake: using external sqlite3 is available, otherwise use internal copy. 2018-09-05 14:22:34 -04:00
matlabbe
9c70b7116b fixed a cmake warning 2018-09-04 19:01:43 -04:00
matlabbe
3c1095be65 Windows: BUILD_AS_BUNDLE option should now be set to ON to create package with all dependencies embedded, otherwise only rtabmap libraries and headers are installed (like default on linux and Mac). 2018-09-04 15:44:37 -04:00
matlabbe
89f27e84d0 💄 2018-08-29 15:36:53 -04:00
matlabbe
f64a5e75d5 fixed fovis.hpp not found when using kinetic libfovis branch of https://github.com/srv/libfovis 2018-08-29 14:48:30 -04:00
matlabbe
94178c8cde LOAM: set back to ON by default as the pull request (https://github.com/laboshinl/loam_velodyne/pull/66) has been integrated 2018-08-29 14:38:50 -04:00
matlabbe
30290c36d7 Rtabmap: Added deleteLastLocation() and rejectLastLoopClosure() methods 2018-08-29 12:29:11 -04:00
matlabbe
956f07785b Fixed build error (vtk version issue) 2018-08-28 17:29:20 -04:00
matlabbe
3e6f14f3bd CloudViewer: added camera Ortho mode context menu option 2018-08-28 17:07:36 -04:00
matlabbe
7cb39f02f2 CloudViewer: Reduced interactor motion from 10 to 5 2018-08-28 11:49:32 -04:00
matlabbe
c105804572 Moved DBDriverSqlite3.h to installed headers (changed some members from private to protected for easier inheritance) 2018-08-27 16:54:23 -04:00
matlabbe
f498cf1b1a CloudViewer: added getColor(id) and setColor(id) to change color of an actor 2018-08-25 11:41:28 -04:00
matlabbe
c0a2efe7e2 Fixed build with PCL <1.7.2 2018-08-24 16:17:30 -04:00
matlabbe
080d044c99 CloudViewer: added setInteractorLayer() function 2018-08-24 15:27:42 -04:00
matlabbe
cbf14bfa08 CloudViewer: set minimum ambiant light of 0.5 for all meshes 2018-08-23 16:18:04 -04:00
matlabbe
110f4a99ee CloudViewer: added addOrUpdateQuad() function 2018-08-23 11:59:24 -04:00
matlabbe
63af05ef88 CloudViewer: refactoring + added CloudViewerCellPicker class to ignore picking backfaces (when backface culling is on) 2018-08-21 16:11:05 -04:00
matlabbe
0c790005b2 ImageView: colormap not updated if depth cv image is not set 2018-08-17 15:30:13 -04:00
matlabbe
3ce6de573d ImageView: added depth colormap menu option 2018-08-17 15:28:23 -04:00
matlabbe
67aa4cd28e DbViewer: added decimation parameter for cloud visualization. ImageView: adding scaling to height menu option. 2018-08-17 14:01:11 -04:00
matlabbe
c18f3cd539 Added rtabmap-export example 2018-08-16 17:01:02 -04:00
matlabbe
9e13d5600a GUI: Fixed ProbMiss assert when resetting value to default 2018-08-16 16:51:29 -04:00
matlabbe
35d5200a3b Parameters in group GridGlobal: renamed OctoMapOccupancyThr to OccupancyThr, added ProbHit, ProbMiss, ProbClampingMin, ProbClampingMax. Using logodds approach from OctoMap to evaluate occupancy of standard grid map. ref https://github.com/introlab/rtabmap_ros/issues/269 2018-08-16 14:42:05 -04:00
matlabbe
e0858a9c2a GraphView: added orientation visualization on nodes 2018-08-16 11:21:25 -04:00
matlabbe
b8847fd006 0.17.5: added --version option on command line 2018-08-14 14:21:44 -04:00
matlabbe
714d95cc34 Removing redundant non null check before deleting a ptr in destructors #301 2018-08-09 15:53:47 -04:00
matlabbe
5e60a2596c DbViewer: show full covariance in Constraints View 2018-08-09 15:20:19 -04:00
matlabbe
f281db8dd0 Windows: removed yaml_cpp required if pkgconfig is installed 2018-08-07 20:34:46 -04:00
matlabbe
7f09a9e0cb fixed #293 2018-08-06 16:34:09 -04:00
matlabbe
fe52060de7 Update .travis.yml 2018-08-06 15:04:38 -04:00
matlabbe
d5128ddc18 Added parameter Mem/CovOffDiagIgnored (default true) 2018-08-05 12:51:50 -04:00
matlabbe
f938e8ce29 Calibration dialog: updated some tooltips 2018-08-03 14:49:39 -04:00
matlabbe
a0342671ac OccupancyGrid: added getCache() method 2018-08-02 16:53:44 -04:00
matlabbe
e03da92a90 FAST: disabled grid parameters by default 2018-07-27 16:41:19 -04:00
matlabbe
4d5b42ab79 rtabmap: parameters passed by arguments override those in the database loaded from command line. Dictionary: set words saved to avoid saving them in database (causing db error when remapping from an old db created by fixed dictionary). G2O: ba supporting words with negative ids. 2018-07-27 16:01:17 -04:00
matlabbe
b63590bf1d Memory: Fixed features with no id (-1) ignored for triangulation from motion. Dictionary: matching with negative word ids is now allowed 2018-07-26 20:41:54 -04:00
matlabbe
cfdee23d33 Statistics: added variance info of the loop closure/localization. GUI: Graph view option to show nodes on which loop closures/localizations happened 2018-07-26 14:40:16 -04:00
matlabbe
60499e895f Updated About dialog 2018-07-24 17:11:27 -04:00
matlabbe
ddacee6d8b rtabmap-report: ignoring --scale option if no ground truth is found 2018-07-24 14:38:14 -04:00
matlabbe
ae226cb1a2 0.17.4 (integrated MSCKF odom approach) 2018-07-23 15:56:53 -04:00
matlabbe
a7e70ab80b Set LOAM default off as a special pull request should be used to use it as a library without ros 2018-07-20 19:41:50 -04:00
matlabbe
e95cabb1fc fixed optimization error ratio bug where comparison was done using not highest ratio link but on highest abs error link instead. 2018-07-20 15:11:46 -04:00
matlabbe
173bd49a26 Handling intial odometry pose in all odometry approaches. For VIO approaches, gravity initialization is handled too. (#298) 2018-07-19 14:10:36 -04:00
matlabbe
9ae47b79f9 Working MSCKF 2018-07-18 16:15:41 -04:00
matlabbe
15e09cd0a8 Devel: new feature msckf_vio 2018-07-14 20:40:44 -04:00
matlabbe
89a0eb506b Fixed yaml-cpp not found on Ubuntu 14.04 2018-07-12 11:50:46 -04:00
matlabbe
4632c7650f Reloading fixed dictionary when clearing memory 2018-07-12 10:06:02 -04:00
Nicolai Behmann
281452434c Added support for OpenCV 3 CUDA ORB feature extractor and descriptor (#296)
* added cuda support for orb with OpenCV 3

* added support for OpenCV 3 CUDA ORB feature detector and descriptor
2018-07-11 12:33:31 -04:00
matlabbe
ccdde45323 fixed build without RealSense2 2018-07-10 15:06:20 -04:00
matlabbe
a3e13b8e72 appveyor: updated gtsam/pcl binaries 2018-07-10 13:58:34 -04:00
matlabbe
35bc2d06a6 Fixed building with RealSense2 on Windows 2018-07-10 13:09:52 -04:00
matlabbe
ee00f81b5b updated appveyor script 2018-07-10 12:30:23 -04:00
matlabbe
974db316ce updated appveyor script 2018-07-10 12:21:55 -04:00
matlabbe
d41c15dbc7 Rtabmap::computePath() added tolerance parameter to overwrite default RGBD/LocalRadius 2018-07-09 15:11:19 -04:00
matlabbe
41d5e11511 Preferences: updated a description text 2018-07-09 12:01:31 -04:00
matlabbe
c8100e1464 Gui: show graph color based on visual features 2018-07-09 11:33:39 -04:00
matlabbe
b783df397a fixed a cmake warning 2018-07-03 10:13:22 -04:00
matlabbe
62a64cd156 CameraRealSense2: increased wait time from 10 msec to 100 msec 2018-06-28 16:55:33 -04:00
matlabbe
675da6201a Added OdomLOAM/LocalMapping parameter 2018-06-28 11:30:21 -04:00
matlabbe
d447329bf1 Added LOAM (loam_velodyne) odometry support 2018-06-28 11:10:46 -04:00
matlabbe
10b452197d fixed build without realsense 2018-06-19 14:00:26 -04:00
matlabbe
973bf93c77 RealSense: added depthScaledToRGBSize option to be able to feed ORB_SLAM2 with depth and RGB images with same size #287. 2018-06-19 13:53:03 -04:00
matlabbe
c91431410e fixed g2o crash when failing computing marginals 2018-06-15 16:31:45 -04:00
matlabbe
a3bdb027e7 0.17.3: realsense2 and zed-m support 2018-06-15 14:37:22 -04:00
matlabbe
502d5e75e8 CameraRealSense2: added IR-Depth mode option 2018-06-15 14:35:54 -04:00
matlabbe
eb4de8e724 Added RealSense2 driver to UI 2018-06-15 13:29:08 -04:00
matlabbe
2060e0b1da Added CameraRealsSense2 driver (tested only with D435) 2018-06-15 12:24:00 -04:00
matlabbe
dfcd7ae1a8 Added QT_NO_KEYWORDS definition to avoid conflicts between boost and qt macros 2018-06-15 12:17:11 -04:00
matlabbe
c6d893bc98 MainWindow: Odometry visualization not updated if msgs are received faster than they can be visualized. ZED: self-calibration set to true by default (should be true for ZED-M vio) 2018-06-14 17:25:35 -04:00
matlabbe
f638add755 fixed #286 2018-06-14 15:20:54 -04:00
matlabbe
9f22a2b1f8 Updated CameraStereoZed to latest zed sdk (2.4) 2018-06-03 02:40:19 -04:00
matlabbe
432b0dc6f6 fixed a build error 2018-06-01 16:33:11 -04:00
matlabbe
7424a1f463 When Mem/DepthAsMask is false, features without depth are triangulated using odometry. Added parameter RGBD/LocalBundleOnLoopClosure. 2018-06-01 16:26:09 -04:00
matlabbe
0bf83c0cd6 fixed frame trail on ros indigo 2018-05-30 17:24:21 -04:00
matlabbe
230e6a311d fixed previous commit 2018-05-30 17:20:54 -04:00
matlabbe
26c004eee0 Fixed g2o build error on 14.04/Indigo 2018-05-30 16:21:06 -04:00
matlabbe
1914275fa8 0.17.2: compute marginals (covariance) on graph optimization 2018-05-30 15:35:08 -04:00
matlabbe
055cccd151 rtabmap: support two usb devices for stereo input 2018-05-29 15:43:02 -04:00
matlabbe
b6b0b9a984 Refactored and integrated pull request https://github.com/introlab/rtabmap/pull/285 2018-05-29 13:59:43 -04:00
matlabbe
0fc97c28c6 Merge pull request #284 from patrickelectric/corrections
PreferencesDialog: Add forgotten include
2018-05-29 12:48:49 -04:00
Patrick José Pereira
11c34d383d PreferencesDialog: Add forgotten include
Signed-off-by: Patrick José Pereira <patrickelectric@gmail.com>
2018-05-26 21:40:24 -03:00
matlabbe
c68dde70ec Memory: added getDatabaseUrl() function 2018-05-25 13:54:29 -04:00
matlabbe
124d78fefd CloudViewer: custom interactor can be set for convenience 2018-05-25 12:32:22 -04:00
matlabbe
d34a529116 Added Rtabmap/StartNewMapOnGoodSignature parameter 2018-05-24 14:53:47 -04:00
matlabbe
4df9ac995a Update .appveyor.yml 2018-05-22 15:42:45 -04:00
matlabbe
4149be47e0 appveyor: fixing gtsam and g2o download links 2018-05-22 12:28:55 -04:00
matlabbe
b7da3f7a97 appveyor: added g2o and gtsam dependencies 2018-05-22 12:04:15 -04:00
matlabbe
206c4fe09c appveyor: using qt 5.10.1 instead of deprecated 5.8 2018-05-22 11:50:30 -04:00
matlabbe
df7539a48e Update Parameters.h 2018-05-17 11:10:00 -04:00
matlabbe
9c91fb8cd8 0.17.1: Fixed issue #282 and https://github.com/introlab/rtabmap_ros/issues/243 2018-05-14 20:50:21 +00:00
matlabbe
5cdede1482 fixed a compilation warning 2018-05-10 13:57:02 -04:00
matlabbe
fa174be741 Updated rtabmap-kitti tool 2018-05-10 13:14:07 -04:00
matlabbe
5e93803eef GUI: Fixed "map id of node -1 not found" error when enabling nodes filtering (https://github.com/introlab/rtabmap_ros/issues/235) 2018-05-08 20:05:29 -04:00
matlabbe
bb0b12be27 Updated not incremental dictionary approach for save/reload (can set a database path as dictionary for convenience) 2018-05-08 18:50:39 -04:00
matlabbe
41e93ac6f0 Docker: re-added post_push so that additional tags are pushed with automated build 2018-05-07 09:28:08 -04:00
matlabbe
1df99efa14 Docker: added --cache-from to use cache 2018-05-06 23:46:04 -04:00
matlabbe
911b8158a4 Docker: added post_push hooks to add tags 2018-05-06 17:42:30 -04:00
matlabbe
e875c7d6d1 Docker: android scripts updated 2018-05-04 19:52:11 -04:00
matlabbe
0ddbb28fd2 RGBD example: added code example to generate/update the global occupancy grid from rtabmap events. 2018-05-04 19:13:07 -04:00
matlabbe
e54234ec50 Docker: fixing missing tag in automated build 2018-05-04 09:25:17 -04:00
matlabbe
6dd0cd27e1 Docker: added quotes around date, updated install_deps to use saved pwd instead of cd alone to return to root 2018-05-03 18:06:37 -04:00
matlabbe
ec50b0c366 Docker: added hooks for main docker images 2018-05-03 09:11:27 -04:00
matlabbe
97b61f885d Docker: added hooks/build to xenial build with CACHE_DATE 2018-05-03 08:56:47 -04:00
matlabbe
0d7b8f13d8 Docker replaced -j3 by -j8 2018-05-02 16:19:15 -04:00
matlabbe
2bf7d87b29 Docker: add g2o/gtsam/libpointmatcher to dockerfiles 2018-05-02 16:10:36 -04:00
matlabbe
8d5d50a198 Fixed 2 cmake minor warnings on standard build 2018-05-02 12:46:45 -04:00
matlabbe
aa743fc397 ROS: added libg2o dependency 2018-05-02 09:18:23 -04:00
matlabbe
29d16633f5 Added bionic dockerfile 2018-05-01 15:53:19 -04:00
matlabbe
d92debe356 rtabmap::triggerNewMap(): reverting commit d9716590b1 to clear optimized poses so that occupancy grid is cleared when triggering a new map. MapCorrection is kept not cleared to support Tango switching mapping<->localization mode without jumping. 2018-04-30 20:03:01 -04:00
matlabbe
52aed1041c using copied version of solvePnPRansac for OpencV 3.3.1 too (along OpenCV2) to have stable transformation estimation (e.g., outdoor stereo demo is getting lost very often with the version of 3.3.1) 2018-04-30 17:44:13 -04:00
matlabbe
8fec570c13 Added Rtabmap::setInitialPose() 2018-04-30 14:49:41 -04:00
matlabbe
a39d0840ce fixed #279 2018-04-30 11:16:26 -04:00
matlabbe
63cc86bdcd rtabmap: fixed optimization error seg fault when no maxLinearLink can be found 2018-04-27 19:42:30 -04:00
matlabbe
637514d00d DbViewer: fixed odom pose not added to odomPoses_ when a location doesn't have any links 2018-04-27 19:07:43 -04:00
matlabbe
b2db31ff18 Fixed backward compatibility error when saving statistics to db 2018-04-27 18:48:10 -04:00
matlabbe
b044bae304 DbViewer: added menu actions to view/update/export optimized mesh saved in database. CloudViewer: cubes can be added for convenience, fixed double-click not always working. util3d: added conversion function from LaserScan to PointCloud2, added conversion functions between polygons format saved in database and PCL polygons format with vertices. 2018-04-25 12:34:47 -04:00
matlabbe
f13e384a1b Added util3d::fixTextureMeshForVisualization() 2018-04-16 17:50:00 -04:00
matlabbe
bfce5cceb5 Fixed #275. Removed Grid/Scan2dMaxFilledRange parameter (use Grid/RangeMax instead). 2018-04-14 16:48:29 -04:00
matlabbe
344dc165bc fixed #276 and #277 2018-04-14 13:41:04 -04:00
matlabbe
79c4bd7850 Export: Added load and save settings buttons (#274) 2018-04-13 18:54:52 -04:00
matlabbe
a82261a4df Export: Added Poisson auto depth (value=0). CloudViewer: Added measuring tool. 2018-04-13 18:19:13 -04:00
matlabbe
57a62dbbfd util3d::mergeTextures: Added assert msg 2018-04-10 12:21:48 -04:00
matlabbe
cd125ae274 util3d::mergeTextures() added interface with single calibrations for convenience 2018-04-09 12:26:09 -04:00
matlabbe
d9716590b1 Rtabmap: don't reset mapCorrection transform when triggering a new map 2018-04-05 11:28:07 -04:00
matlabbe
2b00b2c1c5 Tango: 0.17 fixing broken localization on visualization 2018-04-05 11:00:16 -04:00
matlabbe
b3b0caa038 DbDriver: fixed save/load optimized mesh errors (0.17) 2018-04-05 10:15:06 -04:00
matlabbe
db0e833ce9 Tango: fixed build 2018-04-05 09:44:14 -04:00
matlabbe
592b7c66c5 0.17.0: saving optimized poses and last localization pose to database (https://github.com/introlab/rtabmap_ros/issues/220). Parameters: fixed Icp default parameters when not built with libpointmatcher, added RGBD/SavedLocalizationIgnored (default false). DbViewer: added Export/Import 2D map (https://github.com/introlab/rtabmap_ros/issues/213). 2018-04-04 19:14:13 -04:00
matlabbe
34b32f53f6 Merge pull request #273 from mlong-xii/patch-1
Fix laserscan from depth
2018-03-28 15:33:31 -04:00
mlong-xii
9ade28ee00 Fix laserscan from depth
Mathieu, unless I'm missing something, you intended to change this to isEmpty() correct?
2018-03-28 14:14:13 -04:00
matlabbe
99acc9a6e7 Windows: Reordered libraries with gtsam at the end (which is static on Windows) 2018-03-28 11:04:18 -04:00
matlabbe
d886c788e7 Fixed CMake keeping old install version path when changing version 2018-03-27 15:50:27 -04:00
matlabbe
d2f7d8a9c4 ExportDialog: Added OpenChisel meshing option 2018-03-26 18:06:41 -04:00
matlabbe
7143f693d2 Euroc tool: fixed build error when c++11 is not used #272 2018-03-26 11:13:06 -04:00
matlabbe
9cfdc00d64 Okvis: removed some compilation warnings when not built with okvis 2018-03-23 14:54:49 -04:00
matlabbe
4f6ab68318 Update README.md 2018-03-23 12:49:21 -04:00
matlabbe
7c6439e075 CameraStereoImages: removed warning telling to calibrate the camera when only pose calibration file is not found 2018-03-22 12:40:16 -04:00
matlabbe
420fecad51 Docker updated artful image. Memory: fixed 2x icp correspondence ratio error (>1.0) when creating registration for icp proximity detection 2018-03-22 11:22:47 -04:00
matlabbe
ef017c9e9d Docker: updated artful build 2018-03-22 10:07:19 -04:00
matlabbe
00412749e7 IMU: changed members from Eigen to cv to avoid seg faults about Eigen memory alignment when copying IMU object created dynamically (#270) 2018-03-21 21:31:41 -04:00
matlabbe
4188da2ef2 Docker: updated xenial with freenect/openni2 dependencies 2018-03-21 16:36:18 -04:00
matlabbe
8d93c275ab Tango: fixed optimized mesh where nans were removed before saving (causing trouble with corresponding polygons) 2018-03-21 16:00:12 -04:00
matlabbe
b0b3b491a0 Docker: added android/install_deps_host.bash. ExportClouds: default voxel size 0.02->0.01 2018-03-20 16:47:18 -04:00
matlabbe
dd59d3c713 Tango: fixed MaxOptimizeError value that now is a factor. Docker: updated tango download links 2018-03-18 18:47:13 -04:00
matlabbe
548f0b6130 Fixed Android build 2018-03-18 16:00:03 -04:00
matlabbe
f7e007018f fixed Windows build 2018-03-18 19:43:20 -04:00
matlabbe
436e82653c Parameters: updated default of Icp/CorrespondenceRatio and Icp/PMOutlierRatio. Fixed OptimizerG2O build with ORB_SLAM2. Fixed seg fault after restarting ORB_SLAM2 odometry. 2018-03-17 18:20:32 -04:00
matlabbe
ecf598e412 util3d::laserScanFromPointCloud(...): ignore NaN points and normals. RegistrationIcp: ignoring NaNs on conversion to PD format to fix some registration fails caused by NaNs. 2018-03-13 02:27:59 -04:00
matlabbe
257fe20c4f OdometryF2F: fixed published localScanMap in wrong frame 2018-03-13 00:01:32 -04:00
matlabbe
ba011169b8 DbViewer: don't modify ground truth values (previously they were aligned with root) 2018-03-12 20:57:34 -04:00
matlabbe
ffe50dad22 When exporting poses, set txt extension by default if not set 2018-03-12 20:26:34 -04:00
matlabbe
dc289ba635 DbViewer: when align with ground truth is enabled, exported poses are those aligned with ground truth 2018-03-12 18:51:55 -04:00
matlabbe
10724fac3b fixed opencv2/core.hpp not found 2018-03-07 20:55:10 -05:00
matlabbe
4969ece356 0.16.3: Added OKVIS support (tested only on EuRoC dataset). Added IMU/IMUThread classes. Added OdomOKVIS/ConfigPath and Rtabmap/ImagesAlreadyRectified parameters. MainWindow, limited odom local feature map to maximum 50 meters from current pose (to avoid VTK glitching with near/far clipping plane). 2018-03-07 19:43:30 -05:00
matlabbe
2fad881202 fixed a compilation warning 2018-02-23 17:55:31 -05:00
matlabbe
39b363d0b5 Memory: compute scan max range if not set on signature creation. 2018-02-23 15:52:59 -05:00
matlabbe
215eff3212 MainWindow: updated default 2d scan with normals color for map and odom 2018-02-23 11:13:26 -05:00
matlabbe
e1a0fc42ea Rtabmap: added ebug info when proximity scan matching is disabled 2018-02-23 10:47:07 -05:00
matlabbe
69d28db660 DbViewer: optimized fetching wm states from db, added checkbox along graph iteration slider to generate intermediate graphes. 2018-02-23 10:12:36 -05:00
matlabbe
c3ab04b436 Report: removed a test UERROR 2018-02-22 16:37:55 -05:00
matlabbe
918281a804 Rgbd_dataset: fixed Rtabmap/CreateIntermediateNodes not used 2018-02-22 12:09:03 -05:00
matlabbe
297cf3f51e 0.16.2: Added wm_state field to database's Statistics table. New parameter "Rtabmap/SaveWMState" (default false). DbViewer: added option in GraphView to show only poses of the root id that were in WM at that time 2018-02-21 18:19:20 -05:00
matlabbe
93e1d732c9 DbViewer: added option to align scans/clouds to ground truth for convenience 2018-02-21 15:13:02 -05:00
matlabbe
1bfde1f9f0 Neigbor refining can be done with any Registration approach. Memory::computeIcpTransformMulti(): correspondences ratio increased by two times to accept transform 2018-02-21 12:23:12 -05:00
matlabbe
489ab86ac7 dbviewer: fixed variance*100 for proximity by space links (multi-scan). 2018-02-21 10:08:48 -05:00
matlabbe
e8f7746c87 dbviewer: removed voxel filtering from scan display 2018-02-21 08:38:35 -05:00
matlabbe
db1139e89e Gui: fixed default color for scans from odom in MainWindow and constraint view in dbviewer. Recovery/reprocess: fixed triggering new map on covariance >=9999. Reg: repeatOnce not done if it has a child. Statistics: added time proximity by space visual info. 2018-02-20 17:33:48 -05:00
matlabbe
5c04ce257b DbViewer: can launch with a directory argument to set current workspace for convenience. 2018-02-19 16:37:17 -05:00
matlabbe
6cdb2a48fd OctoMap: improved projection performance 2018-02-19 16:25:55 -05:00
matlabbe
37cbf79b4c DbViewer: fixed occupancy grid color options. Reprocess: added grid total time including rtabmap stats 2018-02-18 21:32:19 -05:00
matlabbe
00559ce8d6 ground segmentaiton: adjusted cluster inlier with centroid below max height of biggest cluster 2018-02-18 15:30:20 -05:00
matlabbe
07244a8a73 Fixed occupancy grid created from PointNormal with RGB 2018-02-18 15:10:25 -05:00
matlabbe
d181bedbfc Gui 3d rendering: added default color scheme option, added min and max range options for laser scans 2018-02-17 09:46:08 -05:00
matlabbe
077b3ab59e RegistrationIcp: Added laserScanToDP() 2018-02-17 07:48:10 -05:00
matlabbe
edbed67afe Windows: added missing RTABMAP_EXP in LaserScan class. Memory: fixed wrong laser scan format set when filtering is enabled. 2018-02-16 20:56:48 -05:00
matlabbe
a947f8c783 Fixed 2d multi-scan matching fatal error 2018-02-16 20:23:42 -05:00
matlabbe
6e131dcd7e fixed build on linux 2018-02-16 19:54:49 -05:00
matlabbe
d24097f73d 0.16.1: Added LaserScan class with new "format" field to distinguish easier between all kind of laser scans (XYZ, XYZRGB, XYZI, XYZNormal...) 2018-02-16 19:20:54 -05:00
matlabbe
bfb3a58c01 Optimizer: added optimizeIncremental() method to solve optimization error problems when re-opening the database (when graph should be re-optimized from raw odometry poses, not latest optimized poses, #172) 2018-02-13 18:18:42 -05:00
matlabbe
02a64a7fa3 Added ctrl-c handling to reprocess and recovery tools. 2018-02-13 16:54:31 -05:00
matlabbe
3dfe1ccb1a DbViewer: updated warning msg when graph optimization fails. 2018-02-13 14:14:08 -05:00
matlabbe
c6e5f1c9f8 Fixed PCL extract indices filter workaround for PointNormal type (not defined in current released PCL). Compression: Fixed OpenCV memory leak when converting uncompressed depth image to 32F format. 2018-02-13 12:36:23 -05:00
matlabbe
4c0a612ab5 util3d_filtering: refactored implementations using templates. Parameters: Changed Grid/DepthMin|Max to Grid/RangeMin|Max, added Grid/PreVoxelFiltering, added GridBlobal/OctoMapOccupancyThr. OccupancyGrid: supporting input clouds already having normals. Memory: don't save working directory parameter to database. 2018-02-13 10:16:48 -05:00
matlabbe
09cae9cbd3 DbViewer: added color selectors for obstacle, ground and empty cells. 2018-02-12 11:32:17 -05:00
matlabbe
1595405871 DbSqlite3: fixed Feature.depth_[x,y,z] not saving correctly NaN values (then NaNs were wrongly converted to 0 on reload). Gui: Added stereo exposure compensation option in Source panel. 2018-02-11 16:07:26 -05:00
matlabbe
1c8c233ebf fixed compilation errors on octomap >=1.8 introduced by previous commit for octomap < 1.8 2018-02-09 11:02:01 -05:00
matlabbe
c2d0628da1 Fixed compilation errors with octomap < 1.8 2018-02-09 10:53:39 -05:00
matlabbe
2e58fa3c2f Fixed OctoMap build error with version <1.8 2018-02-08 22:04:50 -05:00
matlabbe
fced2c521c 0.16.0: Database updated with Data.empty_cells, Admin.opt_map, Admin.opt_map_x_min and Admin.opt_map_y_min fields. Changed Parameter Grid/ProjRayTracing to Grid/RayTracing (OctoMap ray tracing done for 3D local grids). Improved OctoMap performance. 2018-02-08 21:40:17 -05:00
matlabbe
e7ceacc215 Fixed broken incremental prediction matrix from commit 977d21e 2018-02-07 18:16:19 -05:00
matlabbe
a320eb5d8e ExportCloudsDialog: voxel size is now to 0.02 by default to limit the size of generated cloud (using too much RAM may result in a crash) 2018-02-06 11:34:54 -05:00
matlabbe
42199eefd2 Added --poses option to report tool. Reprocess tool: Export ground/obstacles when 3d map is created. 2018-02-06 11:31:39 -05:00
matlabbe
56df87e60c GraphViewer: Added "hide/show graph nodes" menu action, added 1% border when exporting to SVG 2018-02-04 14:18:39 -05:00
matlabbe
90ed9cd15c Added support for latest g2o code (with c++11 interface) 2018-02-03 15:43:32 -05:00
matlabbe
8ca3bca810 Fixed build error in rtabmap-reprocess without octomap. Fixed non c++11 build for BayesFilter. 2018-02-02 13:12:14 -05:00
matlabbe
5d2912baa1 Merge branch 'master' of github.com:introlab/rtabmap into devel 2018-02-02 11:47:54 -05:00
matlabbe
129ec29af5 Update .appveyor.yml
Added devel branch
2018-02-02 11:47:20 -05:00
matlabbe
70991cf173 fixed a compilation warning and updated usage of benchmarking tools 2018-02-02 08:51:38 -05:00
matlabbe
61199eff9c fixed CameraThread compilation error with OpenCV<3, added yaml-cpp dependency to travis 2018-02-02 08:35:06 -05:00
matlabbe
4991d3dbab fixed yaml-cpp optional requirement 2018-02-02 08:27:49 -05:00
matlabbe
3405e8b8e1 Merge branch 'master' of https://github.com/introlab/rtabmap into devel 2018-02-01 22:19:34 -05:00
matlabbe
977d21eed5 Update 0.15.4.
Parameters:
-Added "GridGlobal/MaxNodes=0", "Rtabmap/PublishRAMUsage=false", "Mem/DepthAsMask=true", "Kp/FlannRebalancingFactor=2.0", "Vis/DepthAsMask=true".
-Modified "Kp/DetectorStrategy=6", "Kp/MaxFeatures=500",  "Mem/UseOdomFeatures=true", "GFTT/QualityLevel=0.001", "GFTT/MinDistance=3", "RGBD/OptimizeMaxError=1", "RGBD/ProximityPathFilteringRadius=1", "Odom/GuessMotion=true", "Odom/VisKeyFrameThr=150", "OdomF2M/BundleAdjustment=1", "Vis/Iterations=300" if built with g2o, "OdomF2M/BundleAdjustmentMaxFrames=10", "OdomFovis/MinFeaturesForEstimate=20", "OdomORBSLAM2/MapSize=3000", "Reg/RepeatOnce=true", "Vis/PnPRefineIterations=0" if built with g2o, "Vis/CorGuessMatchToProjection=true", "Vis/BundleAdjustment=1" if built with g2o, "Icp/MaxCorrespondenceDistance=0.1", "Icp/PointToPlaneK=5", "Icp/PointToPlaneRadius=1", "Icp/PM=true" if built with libpointmatcher, "Stereo/MaxLevel=5", "Stereo/MinDisparity=0.5".

BayesFilter: optimized prediction matrix update. Use of new argument "ignoreLocalSpaceLoopIds" of Memory::getNeighborsId() to ignore loop closure link by space in prediction update.
CameraThread: Added stereo exposure compensation option.
CameraRGB: Added forceGroundNormalsUp option and added support of ground truth from EuRoC dataset.
Statistics: Added "Memory/RAM_usage/MB".
Transform: Added clone() method to do deep copy.
Graph::importPoses(): EuRoC format support (9).
Rtabmap: Local visual loop closures are now identified as GlobalClosure link type.
OccupancyGrid/OctoMap: updated how cache is used (old node retrieved can be re-added to map without re-assembling the whole map).
OdometryF2F: when using ICP, increasing correspondence distance for first two frames. If Vis/CorType=1 and registration fails, second guess without motion is done with Vis/CorType=0.
OdometryF2M/RegVis: updated how features are removed from the map, using new projectedIDs filled in RegistrationInfo by RegistrationVis.
OdometryORBSLAM2: Maximum size of the feature map can be set with "OdomORBSLAM2/MapSize" parameter.
CloudViewer: fixed opengl camera drifting in follow mode.
DatabaseViewer: Added optimization scale option. ConstraintsView: hide loop closure links if type is ignored in gui parameters.
MainWindow: Support of "GridGlobal/MaxNodes" parameters when updating the maps.
UPlot: don't show ellipses when not in graphics view mode, updated how "random" colors are attributed to curves
Added rtabmap-euroc_dataset tool. Updated rtabmap-kitti_dataset and rtabmap-rgbd_dataset tools.
Added rtabmap-reprocess tool.
2018-02-01 22:17:46 -05:00
matlabbe
09e0d0b9d8 Added RTAB-Map100.png logo of 100 pixels height for main readme to fix docker main page <a><img> tags not supported 2018-01-14 17:20:39 -05:00
matlabbe
79c38d66cb Fixed #255 2018-01-03 20:03:36 -05:00
matlabbe
d7871fec2b Db: Fixed octave field missing when opening databases prior to 0.12 2017-12-21 14:58:16 -05:00
matlabbe
9f80f4ac42 RegVis: convert to 3dof before SBA 2017-12-21 10:16:46 -05:00
matlabbe
d6058768fc RegVis: fixed out-of-range vector error when guess is used and we match to projections. ImageView: Added right-click menu option to set a fixed size for features 2017-12-18 14:38:54 -05:00
matlabbe
6a50b3f149 util3d::voxelize() added warning if cloud is not dense, indices empty but cloud not empty 2017-12-15 15:25:37 -05:00
matlabbe
35045aa9d7 CameraRGB: updated error msg when depth format is wrong 2017-12-15 11:14:02 -05:00
matlabbe
398ca1f8e4 0.15.3: util3d::computeVarianceAndCorrespondences(): added max angle parameters for normal type. util3d::downsample(): added Normal types support. OccupancyGrid: fixed 2d scan with 5 channels not handled correctly on update. 2017-12-13 18:12:40 -05:00
matlabbe
7091406abc Merge branch 'master' of https://github.com/introlab/rtabmap into devel 2017-12-13 18:07:54 -05:00
matlabbe
c21d478f5d ExportCloudsDialog: added more decimals to camera filtering options 2017-12-12 11:16:12 -05:00
matlabbe
f973fc3743 Merge branch 'master' of https://github.com/introlab/rtabmap into devel 2017-12-11 17:10:08 -05:00
matlabbe
d776092b35 RtabmapThread: when receiving new map event from odometry, wait until the buffer has reached the corresponding timestamp before triggering a new map. DBReader: regenerate stamps when sync capture rate with stamps in database is false. MainWindow: ask for PNG or JPEG format when activating auto capture. 2017-12-11 17:09:04 -05:00
matlabbe
775b80eff5 0.15.2: Fixed Transform's not orthogonal rotation matrix causing problems with GTSAM (normalize rotation each time transforms are multiplied, and for backward compatibility automatically normalize rotation of all transforms loaded from old databases prior to 0.15.2). Added Vis/CorGuessMatchToProjection, Icp/PMMatcherKnn and Icp/PMMatcherEpsilon parameters. CameraRGB: fixed max scans number when filtering. Link: transfering maximum covariance when merging. OptimizerGTSAM: updated how covariance are copied based on GTSAM official example. util3d::loadBINCloud(): fixed dim parameter not used. DatabaseViewer: Added option in graph view to ignore intermediate nodes when optimizing the graph. 2017-12-09 21:44:53 -05:00
matlabbe
ff135322f6 Odom/AlignWithGround: fixed random crash when input is stereo and voxel filter is complaining about leaf size too small (limited max depth to 10 meters) 2017-12-06 15:40:41 -05:00
matlabbe
dafaac412f DbViewer: fit in view the graph when changing iterations. Limited to 900MB creation of the grid map (in case graph is very erroneous). 2017-12-01 11:56:27 -05:00
matlabbe
4452e637ad 0.15.1: CameraImages: added ground truth time diff, fixed memory leak when loading binary scans. CameraRGBDImages and CameraStereoImages: fixed start id. Feature2D: added grid rows and cols parameters (Kp/GridRows, Kp/GridCols, Vis/GridRows, Vis/GridCols). OdomInfo: publish bundle frames. OdometryORBSLAM2: added OdomORBSLAM2/Fps and OdomORBSLAM2/MaxFeatures parameters. Registration: added Reg/RepeatOnce parameter and removed variance normalization. For util2d::getDepth() and util3d::projectDepthTo3D(), maxZError parameter is now depthErrorRatio to be dependent of the sensor range. Database: save image width and height from stereo calibration. OptimizerG2O: fixed SBA optimization when using g2o built from ORBSLAM2 library. OptimizerGTSAM: to increase optimization stability, all rotations in information matrix are divided by 100000. Added rtabmap-report tool. 2017-11-30 16:52:03 -05:00
matlabbe
821c1c938e DataRecorder: Can record odometry data if odometry is published by the camera (zed or realsense) 2017-11-21 14:14:37 -05:00
matlabbe
1df95702a3 DbViewer: Fixed octomap visualization when ground is not segmented 2017-11-21 13:24:21 -05:00
matlabbe
274e7c579e Added some warnings 2017-11-14 16:28:47 -05:00
matlabbe
b820e98bdc Stereo: min and max disparity parameters are now float. ImageView: adjusted background color of info boxes. 2017-11-14 11:36:37 -05:00
matlabbe
10c5cb3721 GUI: Added missing Rtabmap/ComputeRMSE parameter 2017-11-10 16:03:25 -05:00
matlabbe
cc7db6190f fixed --quiet option in dataset tools 2017-11-09 12:48:47 -05:00
matlabbe
9a9d81ca18 fixed build error with g2o: no member named 'linear' in 'g2o::SE2' 2017-11-09 12:22:32 -05:00
matlabbe
71d9816f4b 0.15: statistics are now compressed in database. Eigen issue: using linear() instead of rotation() to get rotation from affine3f. Increased loading speed of statistics in DatabaseViewer. Added graph:calcRMSE(). 2017-11-09 12:03:01 -05:00
matlabbe
8cdd138143 CameraK4W2: added depth to color registration. For CameraFreenect2, kTypeColor2DepthSD is now used by default. 2017-11-06 22:59:12 -05:00
matlabbe
7dabfdc207 Added CameraK4W2 (Kinect for Windows SDK v2 driver) 2017-11-06 00:19:12 -05:00
matlabbe
65e82eb37e appveyor: updated PATH to put qt bin before cmake bin 2017-11-05 18:03:33 -05:00
matlabbe
8a14e6ccb4 Update .appveyor.yml 2017-11-03 22:14:37 -04:00
matlabbe
5dadcf3862 apppveyor: activated gui build 2017-11-04 01:38:16 -04:00
matlabbe
c001ff763a appveyor: disabled GUI build as QVTK lib is not built yet 2017-11-03 23:20:35 -04:00
matlabbe
3c59b601b5 updated appveyor.yml 2017-11-03 22:13:18 -04:00
matlabbe
4cb0d23136 updated appveyor.yml 2017-11-03 22:12:40 -04:00
matlabbe
2fd29c4b78 updated appveyor.yml 2017-11-03 22:04:07 -04:00
matlabbe
c0344a56ff updated appveyor.yml 2017-11-03 21:39:13 -04:00
matlabbe
16692d47b2 updated appveyor.yml 2017-11-03 21:19:54 -04:00
matlabbe
204b3e1159 updated appveyor.yml 2017-11-03 21:10:24 -04:00
matlabbe
41d4ee20b0 updated appveyor.yml 2017-11-03 20:59:34 -04:00
matlabbe
4d17f3c2ff updated appveyor.yml 2017-11-03 20:54:27 -04:00
matlabbe
353fe177f4 updated appveyor.yml 2017-11-03 20:53:22 -04:00
matlabbe
4dc4239963 updated appveyor.yml 2017-11-03 20:48:36 -04:00
matlabbe
0a72cab089 updated appveyor.yml 2017-11-03 20:31:01 -04:00
matlabbe
57202b3ea0 updated appveyor.yml 2017-11-03 20:24:44 -04:00
matlabbe
69e7006cc8 updated appveyor.yml 2017-11-03 20:13:13 -04:00
matlabbe
7ee8652cc3 updated appveyor.yml 2017-11-03 20:02:11 -04:00
matlabbe
8f1331dab3 updated appveyor.yml 2017-11-03 19:54:57 -04:00
matlabbe
2998a54713 updated appveyor.yml 2017-11-03 19:47:45 -04:00
matlabbe
ccba8e155e updated appveyor.yml 2017-11-03 19:42:55 -04:00
matlabbe
e9317dc2c7 updated appveyor.yml 2017-11-03 19:36:04 -04:00
matlabbe
77f88e5cac appveyor.yml update 2017-11-03 11:47:10 -04:00
matlabbe
43649328cb update appveyor.yml 2017-11-03 11:35:33 -04:00
matlabbe
3629c8c493 added appveyor.yml 2017-11-03 11:33:21 -04:00
matlabbe
426a2f983c fixed mapId for pose -1 not found error when filtering nodes to be shown 2017-10-29 13:23:38 -04:00
matlabbe
85273b9ed7 fixed max tango pose radius 2017-10-29 10:48:04 -04:00
matlabbe
461dba87db fixed build without openni2 2017-10-25 17:58:08 +02:00
matlabbe
d4982a8f24 CameraOpenni2: added ir/depth shift parameter 2017-10-25 15:11:26 +02:00
matlabbe
de5f3657ab PreferencesDialog: added virtual getDefaultWorkingDirectory() for convenience (can be changed in inherited class) 2017-10-25 10:56:43 +02:00
matlabbe
7a2ddd3905 fixed statsProcessed() not emitted at the right place 2017-10-25 09:56:05 +02:00
matlabbe
d5200f859d MainWindow: added signals after statistics/cameraInfo/odometry and 3D map event have been processed 2017-10-25 09:48:00 +02:00
matlabbe
6cee1d9ee6 RtabmapThread: UserData events are added to next node created instead of the last node created (same as rtabmap_ros UserData service) 2017-10-24 19:53:40 +02:00
matlabbe
6b9d4fe7c5 Fixed reset camera orientation 2017-10-24 12:33:50 +02:00
matlabbe
303f315b3e fixed assert when Odom/AlignWithGround is true and generated cloud is empty 2017-10-24 11:40:58 +02:00
matlabbe
b6f41eecfd MainWindow: Fixed recovery msg error 2017-10-24 11:34:39 +02:00
matlabbe
c880366aaf Removed pcl visualization dependency from core lib 2017-10-24 10:05:39 +02:00
matlabbe
e40a7d6681 0.14.3: exposed all gui widgets to public API. CloudViewer: fixed camera orientation reset 2017-10-20 12:09:34 +02:00
matlabbe
b3149a2b55 Tango: fixed bug where black point clound is shown when visualizing a mesh with texture 2017-10-19 20:58:51 +02:00
matlabbe
37a9712532 CloudViewer: added pcl visualizer access for inherited classes 2017-10-18 12:28:07 +02:00
matlabbe
bcf65d4cae Windows: qvtk missing lib on apps building against rtabmap 2017-10-17 11:13:17 +02:00
matlabbe
521126c982 fixing docker latest build (exit not defined) 2017-10-13 09:29:13 -04:00
matlabbe
e2aea92e3b Tango: asking for sharing before showing share intent (to avoid automatically stop tango is we don't want to share) 2017-10-12 20:55:14 -04:00
matlabbe
e595f564b1 Parameters: removed Mem/LaserScanVoxelSize from getRemovedParameters() 2017-10-12 17:03:09 -04:00
matlabbe
bfbabc62c4 Tango: Localization mode can be used in visualization 2017-10-12 15:54:16 -04:00
matlabbe
d4248385f0 Added rtabmap::databaseRecovery() function, added rtabmap-recovery tool, added "Database recovery" menu action in DbViewer 2017-10-11 19:36:00 -04:00
matlabbe
ab0aad87ec Increased ZED version requirement to 2 2017-10-11 16:44:53 -04:00
matlabbe
5ac5ff638e Update README.md 2017-10-11 13:45:45 -04:00
matlabbe
ed80acd87f Update README.md 2017-10-11 13:45:24 -04:00
matlabbe
fa27757719 Update README.md 2017-10-11 13:44:55 -04:00
matlabbe
c02cc6d193 Updated About dialog 2017-10-11 13:40:31 -04:00
matlabbe
312f6515ff CameraFreenect2: fixed compilation error when not built with libfreenect2 2017-10-11 13:05:14 -04:00
matlabbe
f6315e48d0 CameraFreenect2: added pipelineName parameter 2017-10-11 12:50:57 -04:00
matlabbe
8b3cff9f4c Tango: bump apk version 2017-10-10 12:39:51 -04:00
matlabbe
400952b327 ProximitySpace: extracting all paths inside local radius up to max graph depth, no length limit of the proximity space links. Fixed local scan matching assembling bug when laser local transform is set. DbViewer: we can now refine proximity detection by space (laser scan matching). 2017-10-09 18:45:42 -04:00
matlabbe
007d23308a Tango: updated how memory used and database size are computed 2017-10-09 18:04:54 -04:00
matlabbe
66e79e23cb Tango: kill camera instead of join to avoid lag when clicking pause 2017-10-09 13:05:41 -04:00
matlabbe
4de2ed767b FlannIndex: Fixed size_t matrix allocation error on 64 bits system 2017-10-09 10:51:18 -04:00
matlabbe
49f9a1e8d7 Tango: fixed database saved in memory option when disabled (now disabled by default) 2017-10-08 21:55:27 -04:00
matlabbe
9a09db9212 Tango: added "Pose (x,y,z)" in debug view 2017-10-06 13:42:12 -04:00
matlabbe
1aad6d0517 Merge pull request #238 from nrasulnrasul/patch-1
Proper closing of name space with in the #RTABMAP_H_
2017-10-06 11:22:16 -04:00
nayabrasul
d927f1886c Update Rtabmap.h
Proper closing of name space with in the #RTABMAP_H_. Multiple includes of "Rtabmap.h" with in the application causing the compilation problem.
2017-10-06 16:57:30 +02:00
matlabbe
0b8ff7cc01 DbViewer: sorting loop closures by parent ids. When checking ignore pose correction, graph is optimized without them. 2017-10-05 17:10:15 -04:00
matlabbe
c4ae4919a5 Tango: some default parameters tuning 2017-10-02 17:44:59 -04:00
matlabbe
83e7f06500 Tango: offset odom origin when reset 2017-10-02 13:19:02 -04:00
matlabbe
9abd925ab7 Reset bayes filter when new map is triggered 2017-09-29 13:28:17 -04:00
matlabbe
7e0c17c5aa Bump tango apk version 2017-09-29 12:47:53 -04:00
matlabbe
6da7788f61 Tango: added GPS to default status when saved, reduced to 1 sec for GPS too old 2017-09-29 12:45:02 -04:00
matlabbe
b187409e59 ExportCloudsDialog: fixed assembled cloud not set to dense (as it should) before voxel filter 2017-09-29 12:03:48 -04:00
matlabbe
079be0e072 incremented release version in readme 2017-09-28 17:25:02 -04:00
matlabbe
81c8e1b192 Tango: add Maximum Motion Speed option (default low) to avoid blurry images 2017-09-28 17:15:53 -04:00
matlabbe
1220eab47a Added RGBD/LinearSpeedUpdate and RGBD/AngularSpeedUpdate parameters 2017-09-28 13:34:55 -04:00
matlabbe
44d1877892 Update AndroidManifest.xml.in
bumping apk version (google play store console error...)
2017-09-27 00:52:53 -04:00
matlabbe
11f8fda585 Tango: fixed switch preferences changing on scrolling on Jelly bean (https://issuetracker.google.com/issues/36941388#comment4) 2017-09-26 23:11:53 -04:00
matlabbe
81fe104f1b Update AndroidManifest.xml.in
Increased apk version
2017-09-26 19:48:40 -04:00
matlabbe
feab6211d4 fixed tango build 2017-09-26 16:34:02 -04:00
matlabbe
9691a4f361 Added GPS class for convenience, database viewer can view GPS values and export to KML format 2017-09-26 14:13:06 -04:00
matlabbe
8759fda632 Merge pull request #237 from Oubayda/patch-1
Update CameraThread.cpp
2017-09-26 11:40:27 -04:00
Oubayda
74ee322312 Update CameraThread.cpp
When Mirroring option is checked, a depth calibration cannot be done because of the new mirrored CameraModel named tmpModel have its imageSize set to cv::Size(0, 0) so the method named isValidForReprojection() (which used in CalibrationDialog.cpp to check that the camera model is valid to do the calibration method) always returns false
2017-09-25 21:50:09 +03:00
matlabbe
ef4aff7d34 fixed gps fields missing in non-android build 2017-09-21 21:28:39 -04:00
matlabbe
bfc393a090 0.14: added gps field to Node table in database (#226). Tango: saving gps if enabled, added Rename/Remove/Share on long click in Open dialog (fixed #233) 2017-09-21 20:59:45 -04:00
matlabbe
114490f01e Docker: added tango-dev Dockerfile 2017-09-20 12:38:46 -04:00
matlabbe
ad38632fc1 Fixed Tango build errors 2017-09-20 15:03:10 +00:00
matlabbe
b737df9c40 Merge branch 'devel' of https://github.com/introlab/rtabmap 2017-09-19 14:40:19 -04:00
matlabbe
fd18c0b2e9 Added Mem/LaserScanVoxelSize and OdomF2M/ScanSubtractAngle parameters. util3d::computeNormalsComplexity() now returns PCA's eigen vectors and values optionally. RegistrationIcp: detecting complexity of environment when PointToPLane is used, if too low, PointToPoint is done and movements are limited to main direction of the normals. 2017-09-19 14:15:17 -04:00
matlabbe
cf6478b633 util3d::transformLaserScan(): supporting 7 channels 2017-09-18 21:49:57 -04:00
matlabbe
a70996f079 util3d: Fixed color not copied on laser scan conversion 2017-09-18 17:00:15 -04:00
matlabbe
2aa56c8d49 MainWindow: Fixed seg fault on scan rgb without normals 2017-09-18 15:52:39 -04:00
matlabbe
b2fb7d5d5b Supporting g2o from ORB_SLAM2 2017-09-17 13:28:25 -04:00
matlabbe
16ffcc7684 DatabaseViewer: just show single axis on constraint viewer if built with PCL < 1.7.2 2017-09-11 20:59:36 -04:00
matlabbe
16c428e360 GUI: update logger filter ids after starting the camera. Update default value of parameters "Odom/ScanKeyFrameThr=0.9" and "Icp/PointToPlaneMinComplexity=0.02" 2017-09-11 14:44:39 -04:00
matlabbe
77bdff1e4b removed a debug log 2017-09-11 14:03:57 -04:00
matlabbe
1ae15911fc Fixed compilation warning of not used variables when some odom approaches are not supported 2017-09-11 14:00:08 -04:00
matlabbe
aca005c287 Added parameter "IcpPointToPlaneMaxComplexity". Added util3d::computeNormalsComplexity(). OdomInfo has now RegistrationInfo field to avoid duplicating members. 2017-09-11 13:17:53 -04:00
matlabbe
68fb5d7252 Calibration tool: fixed usb stereo option 2017-09-08 11:30:29 -04:00
matlabbe
380fc2cbde PreferencesDialog: Fixed odom stack widget index always set to ORB-SLAM2 on loading 2017-09-06 11:01:39 -04:00
matlabbe
39283a5526 RegistrationIcp: libpointmatcher setting PointToPLane force2D parameter 2017-09-01 18:12:19 -04:00
matlabbe
3e38e467a2 Merge pull request #231 from mlong-xii/master
KAZE - fix loading custom feature params
2017-08-31 18:06:51 -04:00
matlabbe
4f55b56d6b Odometry: 2D scans + normals support 2017-08-31 18:01:46 -04:00
mlong-xii
54c0b3e196 KAZE - fix loading custom feature params
KAZE feature detector does not load custom feature params (min/max depth, ROI, etc).
2017-08-31 16:41:01 -04:00
matlabbe
9eac47f7e8 Tango: Optional sharing to other apps after saving on device 2017-08-31 11:10:46 -04:00
matlabbe
7ec58c63e9 SensorData/Memory: fixed assert for scan channels 5 an 7 2017-08-28 17:37:57 -04:00
matlabbe
b70ffb6331 fixed multi scans matching with normals, removed some debug logs 2017-08-28 16:40:08 -04:00
matlabbe
423b47a5ff New 2d scan type: CV_32FC5 (x,y,normal_x,normal_y,normal_z) 2017-08-28 16:40:08 -04:00
matlabbe
52a4e8964f 0.13.3: scan2d with normals support/registration 2017-08-28 16:40:07 -04:00
matlabbe
964a052be1 Merge branch 'lunar-devel' of github.com:introlab/rtabmap 2017-08-28 16:38:43 -04:00
matlabbe
15a14e86ba Merge pull request #228 from mikaelarguedas/revert_libmpi_hack
remove hack now that upstream pcl has been rebuilt
2017-08-28 13:55:21 -04:00
Mikael Arguedas
eca0c72063 remove hack now that upstream pcl has been rebuilt 2017-08-28 09:54:40 -07:00
matlabbe
2353c98919 Update README.md 2017-08-25 12:00:11 -04:00
matlabbe
30e5a1a7aa Update README.md 2017-08-25 11:50:08 -04:00
matlabbe
d94db237a9 Update README.md 2017-08-25 11:45:27 -04:00
matlabbe
317aa3b6ed Parameters: added Icp/PMOutlierRatio for convenience 2017-08-23 12:22:58 -04:00
matlabbe
268c92a1af RegistrationIcp: added some debug logs to track down seg fault error caused by multiple Eigen version used to build third party libraries (should be same version than one used by libpointmatcher) 2017-08-22 17:40:05 -04:00
matlabbe
bc2c998b7c MainWindow: Enabled Help action menu 2017-08-22 16:47:48 -04:00
matlabbe
73c05d2d9d fixed build without libpointmatcher 2017-08-22 16:31:31 -04:00
matlabbe
f7872d346b libpointmatcher integration 2017-08-22 16:20:49 -04:00
matlabbe
d0d387a42f icp: set epsilon^2 as in pcl::DefaultConvergenceCriteria 2017-08-18 15:59:49 -04:00
matlabbe
84af88ee40 Update main.cpp 2017-08-17 10:37:28 -04:00
matlabbe
aa4f7571b9 C++ example: explicitly close rtabmap without saving to db to avoid error when quitting 2017-08-16 15:03:43 -04:00
matlabbe
b5b96a3edb Fixed ProximityByTime wrong guess transform. Fixed Icp correspondence ratio computation when using voxel filter. OdometryResetEvent: added pose to constructor. 2017-08-15 15:26:03 -04:00
matlabbe
1e335e53ba OdometryEvent: fixed velocity() returning always empty. Export: added options to filter blurred cameras based on laplacian threshold or velocity (#225). 2017-08-07 16:31:49 -04:00
matlabbe
75854fc026 OccupancyGrid: updated parameters check 2017-08-04 11:41:50 -04:00
matlabbe
d8a6ed4ba6 DbViewer: fixed voxelize assert when voxel size is set and there are no laser scans in database 2017-08-04 10:47:25 -04:00
matlabbe
459bbda60c increased package version to 0.13.2 2017-08-03 16:42:46 -04:00
matlabbe
2a9508b4e3 Fixed build for Lunar 2017-08-03 16:40:12 -04:00
matlabbe
c0c288e0d9 Tango: removed seekbar for FOV(use pinch zoom instead), show UI on single tap instead of swipe down 2017-08-03 11:52:18 -04:00
matlabbe
82fd5b36a8 util3d::cloud[RGB]FromSensorData(): supporting roi ratios for stereo images 2017-08-02 15:14:03 -04:00
matlabbe
dd3c7d8fa4 CameraStereoZed: fixed build for ZED sdk 2.1 (https://github.com/introlab/rtabmap_ros/issues/192) 2017-07-31 15:12:05 -04:00
matlabbe
b63f073d90 CameraStereoZed: handling initialization failures 2017-07-31 14:11:32 -04:00
matlabbe
0491125e92 fixed voxelize assertion with c++ rgbd mapping example 2017-07-26 16:00:02 -04:00
matlabbe
3443c3b8ea RegistrationVis: fixed assert covariance in bundle adjustement when transform is perfect (covariance is null) by setting an epsilon to generated covariance is null or very close to 0 2017-07-26 15:27:54 -04:00
matlabbe
be720be74a 💄 2017-07-26 11:46:59 -04:00
matlabbe
f3e491f15b Added KAZE feature detector (OpenCV3) 2017-07-25 16:20:05 -04:00
matlabbe
5855198b5f Tango: swipe down to show hud, added notification sound after saving or exporting, added polygon cluster filtering export option, action and status bars are transparent 2017-07-24 20:24:16 -04:00
matlabbe
62de6fcdae util3d::denseMeshPostProcessing(): coloredOutput param not used anymore 2017-07-24 19:21:22 -04:00
matlabbe
57dc0cd53e DepthCalibration: support depth images smaller than RGB images 2017-07-24 13:06:30 -04:00
matlabbe
0a1694dd78 MainWindow: Detect more loop closures: uncompress images when reextract features on loop closure is enabled 2017-07-24 12:18:19 -04:00
matlabbe
edc690973a DbViewer: added warning when reextract feature is false and signatures have no features 2017-07-24 11:48:49 -04:00
matlabbe
48148a9e26 DbViewer: fixed voxel assert 2017-07-23 22:33:26 -04:00
matlabbe
62b9911176 docker: fixed tango build with res tool prebuild 2017-07-13 14:33:52 -04:00
matlabbe
fb69a37445 docker missing g++ 2017-07-13 14:18:58 -04:00
matlabbe
81ae1eae51 docker update 2017-07-13 14:14:51 -04:00
matlabbe
517c70d855 CMake: added ANDROID_PREBUILD option 2017-07-13 13:36:34 -04:00
matlabbe
85f7c1e73c OccupancyGrid/voxelize: if organized cloud, indices should not be null 2017-07-13 12:23:03 -04:00
matlabbe
b4cfa0e844 RtabmapThread: use largest covariance instead of summation 2017-07-13 11:36:55 -04:00
matlabbe
3c758ab2f6 Update .travis.yml 2017-07-13 11:32:14 -04:00
matlabbe
1ed01b8d3d Memory: fixed cov->inf conversion error 2017-07-13 11:07:00 -04:00
matlabbe
19abbe0dbd DBViewer: fixing previous commit for very large databases (where we don't want to regenerate map if we don't show it) 2017-07-12 21:39:51 -04:00
matlabbe
c833af1ae6 DBViewer: fixed disabled show/hide map option while map is available 2017-07-12 21:26:14 -04:00
matlabbe
78bdd4a087 Added check if covariance is invertible, if not an error is thrown 2017-07-12 16:41:47 -04:00
matlabbe
dc77bb4332 OdometryViso2: updated for dynamic local transform 2017-07-10 17:34:37 -04:00
matlabbe
9e011d6ad9 Fixed changing local transform not handled correctly when changing for third party odometries 2017-07-07 19:41:11 -04:00
matlabbe
f9ed36ed54 Parameters: renamed Rtabmap/VhStrategy to VhEp/Enabled 2017-07-05 13:38:27 -04:00
matlabbe
495681770e Tango: updated About copyright year 2017-07-03 18:48:02 -04:00
matlabbe
eb1f0e0a8a Tango: aligned share sketchfab button to top (over pause) 2017-07-03 16:52:22 -04:00
matlabbe
23ae5caa3c Tango: bump apk version 2017-07-03 14:48:04 -04:00
matlabbe
4b7d558026 Tango: moved export to file button under share to sketchfab (fixing overlap of button on opengl status text), fixed export empty poses after resuming without relocalizing (append mode) 2017-07-03 14:42:48 -04:00
matlabbe
44969a7fdf Docker: added zesty 2017-06-29 14:32:12 -04:00
matlabbe
5f5c74f260 RGBDMapping example: fixed -lvtkproj4 not found error on Xenial 2017-06-29 16:59:15 +00:00
matlabbe
5646751f88 RTABMapConfig.cmake: Set WITH_GUI default true if no components are specified 2017-06-29 15:31:05 -04:00
matlabbe
b6d3e785df Tango: fixed export failing after saving the database 2017-06-29 10:31:59 -04:00
matlabbe
ebada30984 Tango: updated UI 2017-06-28 13:59:20 -04:00
matlabbe
64fc9f203e Tango: fixed build for Ikariotikos release 2017-06-27 11:45:51 -04:00
matlabbe
653d4fef4b Fixed Windows+PCL1.8 build (std::vector/Eigen error) 2017-06-26 15:45:30 -04:00
matlabbe
5cc04b58a4 Tango: updated sdk to Ikariotikos 2017-06-26 15:45:04 -04:00
matlabbe
f628da7a91 Merge branch 'master' of https://github.com/introlab/rtabmap into devel 2017-06-26 13:04:20 -04:00
matlabbe
a8853bdee6 ExportCloudsDialog: fixed scan output frame 2017-06-26 12:02:48 -04:00
matlabbe
5f8ffa7afc Fixed compilation warning 2017-06-22 11:49:02 -04:00
matlabbe
d74f4f64f7 Tango: Open: use small launcher image for old databases without preview image 2017-06-21 22:11:09 -04:00
matlabbe
3e7929bed6 Tango: Fullscreen mode 2017-06-21 20:54:16 -04:00
matlabbe
7a2d1c29f0 Tango: fixed saveOnDevice and shareSketchfab actions when visualizing optimized mesh of a just opened database 2017-06-21 17:14:40 -04:00
matlabbe
0a841f17a4 fixed desktop app with new util3d::mergeTextures() return value 2017-06-20 17:57:32 -04:00
matlabbe
ee8d48a915 Database: added "opt_****" fields in Admin table. Tango: optimized mesh saved in database for quick open, open menu shows preview images. util3d::mergeTextures() return all textures in same cv::Mat. 2017-06-20 17:29:06 -04:00
matlabbe
539d500528 Tango: bump version 2017-06-16 22:14:57 +00:00
matlabbe
3d1de43ff1 Tango: Hidden Presets chromium webview 2017-06-16 21:57:57 +00:00
matlabbe
e7998acf66 Update build.bash 2017-06-16 17:38:24 -04:00
matlabbe
e0640418e4 ExportCloudsDialog: fixed compilation warning 2017-06-16 16:59:55 -04:00
matlabbe
52a6cc5bad Tango: fixed sketchfab export ply error, exported objs are now rotated -90deg x-axis by default for sketchfab 2017-06-16 16:24:38 -04:00
matlabbe
8787ecceb8 Tango: refactored mesh creation 2017-06-16 14:44:48 -04:00
matlabbe
a1f2f95d1b fixed build 2017-06-15 19:39:22 -04:00
matlabbe
c3aeae5ed7 Moved clean texture mesh stuff from ExportCloudsDialog to util3d::cleanTextureMesh() 2017-06-15 14:10:08 -04:00
matlabbe
29ff2c5d0a RTABMapConfig.cmake: added components support 2017-06-15 15:59:52 -04:00
matlabbe
a7880dc3b0 RTABMapConfig.cmake: fixed dependencies path error when path has a space (LINK : fatal error LNK1181: cannot open input file 'C:\Program.obj') 2017-06-14 19:55:23 -04:00
matlabbe
ba4437edee Tango: replaced RTABMapApp::mergeTextures() by util3d::mergeTextures() 2017-06-14 10:33:26 -04:00
matlabbe
811afa1171 Moved ExportCloudsDialog::mergeTextures() method in util3d_surface module 2017-06-13 19:20:09 -04:00
matlabbe
29a48aba66 Tango: added wireframe button (#191) 2017-06-12 19:08:51 -04:00
matlabbe
c00119989e Tango: Added Ortho mode (#193) 2017-06-12 15:36:33 -04:00
matlabbe
bbaac8b2b1 Grid: support negative ground/obstacle height thresholds 2017-06-12 11:48:13 -04:00
matlabbe
9554597948 Tango: added multi-texturing support (#189) 2017-06-10 21:45:51 -04:00
matlabbe
774afe9fdd Tango: added presets (#190) 2017-06-10 12:29:57 -04:00
matlabbe
fa2199c3ea Merged master to devel 2017-06-10 10:34:52 -04:00
matlabbe
e321e1bb2c fixed output textures count 2017-06-09 17:51:13 -04:00
matlabbe
dfc425a7c5 Update Parameters.h 2017-06-09 14:58:23 -04:00
matlabbe
4ac422314d fixed some compilation warnings 2017-06-09 13:44:09 -04:00
matlabbe
ff6e42fa6d DbViewer: added more info about size of all tables in database 2017-06-06 18:22:19 -04:00
matlabbe
7a0a82bcb4 Texturing: using depth image to filter wrongly projected textures 2017-06-06 11:42:42 -04:00
matlabbe
fa95ede3e9 Fixed build 2017-06-05 19:35:03 -04:00
matlabbe
26147c97cf PArameters: don't show usage with ORBSLAM2 parameters if not built with it. 2017-06-05 19:10:04 -04:00
matlabbe
c4ca6a0bac Integrated ORB_SLAM2 as an odometry approach Odom/Strategy=5. 2017-06-05 19:04:23 -04:00
matlabbe
8de694b2d7 Tango: Hide buttons after 5 seconds not touching the screen 2017-06-03 20:06:45 -04:00
matlabbe
de797b644e Export: added rgb/gray gain compensation option, added maximum outout textures option (can be useful for #189). 2017-06-03 18:24:56 -04:00
matlabbe
c8357be4d0 cloudRGBFromSensorData(): just return empty cloud if inputs are not valid (don't assert) 2017-06-01 13:09:34 -04:00
matlabbe
657f0314e4 Updated warning when stereo is used with DVO odometry 2017-05-31 20:59:35 -04:00
matlabbe
4f26e34717 Integrated DVO odometry approach 2017-05-31 20:57:24 -04:00
matlabbe
133ed68152 Parameters --params: don't show those related to dependencies not built in RTAB-Map 2017-05-31 11:33:51 -04:00
matlabbe
e2c5b87a7e Parameters.h: normalized indendation 2017-05-31 11:09:06 -04:00
matlabbe
21e716b08a Updated default Vis/EstimationType=1 (PnP). Added all fovis and viso2 parameters. 2017-05-30 18:29:49 -04:00
matlabbe
f6e21bd6c8 Integration of viso2 odometry approach. 2017-05-30 14:03:46 -04:00
matlabbe
4ffbc0fb58 Integrated Fovis (Odom/Strategy=2) 2017-05-30 09:27:31 -04:00
matlabbe
6d6c5e2e17 Updated Create Calibration dialog 2017-05-26 11:46:02 -04:00
matlabbe
d795bea543 fixed #201 2017-05-25 14:48:39 -04:00
matlabbe
10c23e60b7 OptimizerG2O: removed fixed frame if a posePrior link is detected 2017-05-24 15:03:27 -04:00
matlabbe
6f9ac4b88b fixed some compilation warnings 2017-05-23 17:30:23 -04:00
matlabbe
f92025e120 docker: finally using OpenCV3 built from source with opencv_contrib (arm64-v8a is not in 2.4.13 android binaries) 2017-05-23 16:24:38 -04:00
matlabbe
392ae832b8 Docker: added opencv2 android, tango now linking on opencv2 (fixing gftt/brief not available) 2017-05-23 14:20:32 -04:00
matlabbe
87a5f69335 MainWindow: fixed localization pose reset to latest pose in map when lost (localization mode) 2017-05-23 12:00:33 -04:00
matlabbe
c8e1060ea4 Merge branch 'dronecrew-g2o_prior' into devel 2017-05-22 21:14:02 -04:00
matlabbe
e361abcecd Reg: normalize covariance angle /10 2017-05-22 21:11:36 -04:00
matlabbe
e8af8f7792 Added SensorData's globalPose and globalPoseCovariance field. Link: added new type PosePrior. g2o: adding edge prior for self-refering edges. Memory: adding self-refering link when SensorData's globalPose is set. 2017-05-22 21:05:34 -04:00
matlabbe
2e906f9b8a Merge branch 'g2o_prior' of https://github.com/dronecrew/rtabmap into dronecrew-g2o_prior 2017-05-22 11:59:16 -04:00
matlabbe
385b7e3389 Parameters: Added "Reg/VarianceNormalized". Registration: Transforms are now only normalized in Registration. Added rgbd_dataset tool. MainWindow: odom inliers-only shown option. ExportCloudsDialog: ignoring intermediate nodes for texturing (if they don't have data). DatabaseViewer: "optimized" checkbox enabled in Constraints view for non-neighbor links too. 2017-05-22 11:48:01 -04:00
matlabbe
48ba55d02c Fixed #197 (handling zed pose confidence == -1) 2017-05-18 17:32:00 -04:00
matlabbe
5223629ab1 Windows: fixe build error (discrete_depth_distortion_model.h) 2017-05-18 16:23:39 -04:00
James Goppert
a2a8638f28 Add edge prior to g2o. 2017-05-17 22:58:26 -04:00
matlabbe
58e6424bf7 Export Clouds: export scans integrated in the same dialog (remove export scans dialog) 2017-05-11 15:02:18 -04:00
matlabbe
d2255adc4e fixed unknown character 2017-05-11 15:02:18 -04:00
matlabbe
7f8ca64f64 DbViewer: added frame selection when exporting poses. DBDriver: added getLaserScanInfo(). 2017-05-11 15:02:18 -04:00
matlabbe
104c1e6945 0.13.0 Database: Added velocity field to Node table, renamed Map_Node_Word table to Feature, added information_matrix field to Link table (replacing rot_variance and trans_variance). Added graph::calcKittiSequenceErrors().Added "Mem/IntermediateNodeDataKept" parameter (default false). Updated all interfaces using rotVariance and transVariance values with covariance matrix instead. g2o SBA: always use covariance in links. kitti-dataset tool: added --disp option and kitti statistics are shown at the end. StatsToolBox: units can have "/". 2017-05-11 15:02:18 -04:00
matlabbe
414e3555a5 DepthCalibrationDialog: added distortion model parameters 2017-05-11 14:44:15 -04:00
matlabbe
c63b45dbf3 Merge pull request #194 from T0ny0/fix_Kinect2_depth_calibration
Depth calibration: using appropriate bin_width and bin_height for all cameras
2017-05-11 13:22:38 -04:00
Anton Onishchenko
197bb2179f Depth calibration: move GetBinSize to clams namespace 2017-05-11 11:38:42 +03:00
matlabbe
62fdb8d0af DbViewer: fixed not reextracted features when reextract features is on 2017-05-10 18:00:30 -04:00
matlabbe
98184c31de Export clouds/poses: frame reference can be selected when clouds are not assembled 2017-05-10 15:53:02 -04:00
matlabbe
ee04ad500a Fixed build when opencv2 gpu module is not here 2017-05-10 10:26:37 -04:00
Anton Onishchenko
df40b0b8d3 Depth calibration: using appropriate bin_width and bin_height for all cameras 2017-05-10 13:54:11 +03:00
matlabbe
8eab31c469 Docker: android-deps build with API19 2017-05-09 17:06:27 -04:00
matlabbe
474011033b CameraStereoZed: fixed parameters not used with svo input 2017-05-09 15:46:47 -04:00
matlabbe
5893e42a8d Docker: backward compatibility for yellowstone API=19 2017-05-09 11:55:08 -04:00
matlabbe
9d18f7b15f Update CameraStereo.cpp
fixed #192
2017-05-09 09:02:02 -04:00
matlabbe
b0c22e7a3a Docker: fixed armeabi-v7a copy to arm64-v8a 2017-05-08 13:23:38 -04:00
matlabbe
9ab78acf09 Docker: fixed android-deps api 21 2017-05-08 12:30:15 -04:00
matlabbe
aa6499e7e4 Docker: fixed final tango workdir 2017-05-08 11:58:17 -04:00
matlabbe
fffd3592d3 Tango: increased min API to 21 2017-05-08 11:51:51 -04:00
matlabbe
842da98e61 Docker: updated android files to build for arm64_v8a 2017-05-08 11:49:25 -04:00
matlabbe
eadeb3841b Export: CPU-TSDF mesh reconstruction integration 2017-05-05 21:44:06 -04:00
matlabbe
b25379c243 Odometry: Don't assert if dt is negative, just show error if guess from motion / kalman filter is used (https://github.com/introlab/rtabmap_ros/issues/169) 2017-05-05 16:25:03 -04:00
matlabbe
4d025568dc updated FindRealSense.cmake 2017-05-05 16:10:09 -04:00
matlabbe
c3ec7fbbe4 💄 2017-05-01 15:40:30 -04:00
matlabbe
14baca125d cloudFromDisparity(): adjusting decimation if not valid with current image size. Standalone: ask user to set other parameters to default if some were set on command line. 2017-04-28 11:43:27 -04:00
matlabbe
1ea94c0356 DbViewer: refining cancelable, statistics labels selectable and x-axis can be time or IDs 2017-04-27 16:13:27 -04:00
matlabbe
57dbece417 DbViewer: Updated doubleSpinBox decimals/singleStep for ParametersToolbox 2017-04-27 14:42:58 -04:00
matlabbe
f023adff4b Export: supporting texturing with multi-camera 2017-04-26 18:39:57 -04:00
matlabbe
6a2fe47b22 Preferences: updated RGBD/ProximityPathMaxNeighbors description and default value (now 0=disabled) 2017-04-26 14:06:42 -04:00
matlabbe
461d167547 DbViewer: update loop closure slider after detecting more loop closures 2017-04-25 16:50:57 -04:00
matlabbe
13425e1ad4 3D Rendering: Added floor/ceiling filtering and normal estimation for scans 2017-04-24 19:12:53 -04:00
matlabbe
c7deb5ed33 StereoBM: Fixed speckle window size parameter not set correctly (creating a lot of noise in generated disparity images) 2017-04-24 17:14:57 -04:00
matlabbe
27313bc3d6 DBViewer: added "Restore default GUI settings" menu action 2017-04-24 16:20:41 -04:00
matlabbe
6e1dbbcf4f Reverted change of cloudFromStereoImages() decimation, should be done after StereoBM to avoid backward compatibility problems 2017-04-24 15:26:12 -04:00
matlabbe
4e3216a75d SourceRGB: added rectify option for all types (including usb camera) 2017-04-24 14:11:38 -04:00
matlabbe
51c353e504 DatabaseViewer: Added ground truth statistics 2017-04-24 13:04:31 -04:00
matlabbe
1b71a96a3d Added rtabmap-kitti_dataset tool 2017-04-24 12:17:18 -04:00
matlabbe
a0a7237c01 Occupancy grid graph changed detection: Quiet warning when map is empty 2017-04-22 19:29:13 -04:00
matlabbe
af576ea0c4 Force full global occupancy grid udpate when the graph has changed (e.g., localizing in other map not connected to current one in database) 2017-04-22 18:43:22 -04:00
matlabbe
183c6abc98 Fixed stereo optical flow crash when no keypoints are extracted 2017-04-22 16:56:38 -04:00
matlabbe
559e65a4e1 disabled label realsense odometry when not built with realsense slam 2017-04-21 22:35:45 -04:00
matlabbe
b93ca148a8 fixed build realsense on Windows 2017-04-21 21:59:53 -04:00
matlabbe
07d6763e69 Fixed build without realsense 2017-04-21 21:58:38 -04:00
matlabbe
bc2da10713 RealSense driver: added odometry option (ZR300) 2017-04-21 21:24:23 -04:00
matlabbe
2e515f5fc7 Export: texture roiRatios default "0.0 0.0 0.0 0.0" 2017-04-20 12:01:20 -04:00
matlabbe
a274f3cf01 Export Added RoiRatios parameter to texturing (#171) 2017-04-20 11:51:23 -04:00
matlabbe
c068c3c33a MainWindow: added ZR300 menu 2017-04-19 15:24:42 -04:00
matlabbe
e258a7cf64 Update build.bash 2017-04-19 11:13:53 -04:00
matlabbe
5814724600 Fixed cloud -1 not found on export, fixed cloud visibility doing nothing to cloud -1 2017-04-18 23:08:28 -04:00
matlabbe
220a454859 fixed compile error 2017-04-18 20:22:05 -04:00
matlabbe
42fb02c36f zed 2.0: fixed sensing mode order, fixed conversion from zed pose to transform (when zed odometry is enabled) 2017-04-18 20:16:04 -04:00
matlabbe
732223e832 Tango: refactored shaders (to remove most "if" in them), added "Auto" to reconstruction depth option 2017-04-18 17:30:14 -04:00
matlabbe
286ab7a600 Merge pull request #184 from akirayou/zed20
change for zed sdk 2.0
2017-04-18 08:37:14 -04:00
akria_you
b402ce1564 change for zed sdk 2.0 2017-04-18 15:03:10 +09:00
matlabbe
0ccba3281e Tango: added online blending option, background color option, double tap, fixed meshes jiggering on touch, removed raw mesh option 2017-04-17 21:42:01 -04:00
matlabbe
6f148c47e2 0.12.15 Parameters: added "GridGlobal" parameter group, fixed https://github.com/introlab/rtabmap_ros/issues/162 2017-04-10 16:59:48 -04:00
matlabbe
98a96a897b Tango: improved optimized texture colors 2017-04-09 20:00:23 -04:00
matlabbe
f1d96a30a4 Export: Added blending option, gain compensation performance increased when exporting with textures 2017-04-09 19:16:50 -04:00
matlabbe
2509a842f0 DBViewer: fixed Export dialog parameters not loaded correctly 2017-04-08 16:46:06 -04:00
matlabbe
b7dbf27931 Parameters: added Grid/FullUpdate (default true). Updated how occupancy grid is updated after loop closure. OctoMap: added tree depth argument when creating 2d map, added full update argument on constructor (default false). MainWindow: using OccupancyGrid object instead of keeping in cache local grids (we can have actual time to update the global grid). 2017-04-07 18:31:11 -04:00
matlabbe
6bfce63060 fixed compilation warning 2017-04-06 14:39:46 -04:00
matlabbe
6ca3b8246a fixed some compilation warnings 2017-04-06 12:41:16 -04:00
matlabbe
1d8952867d MainWindow: added timing stats on global map creation. Updated util3d::occupancy2DFromLaserScan() and util3d::create2DMap() interfaces (hit/noHit scans in opencv matrix format). Parameter default: Grid/ProjRayTracing=true, Grid/NormalK=true 2017-04-06 12:27:12 -04:00
matlabbe
e415dd8504 Fixed inf loop when all signatures are loaded in WM and if a signature has a -1 word 2017-04-04 12:26:06 -04:00
matlabbe
aa37ac6038 Increased version to 0.12.4, Tango: gain compensation on each channel, added min depth parameter, fixed exporting failing when doing export just after opening a database 2017-04-01 14:14:36 -04:00
matlabbe
d68eeada0e Export: Disabled exposure fusion when built with Opencv < 3 2017-03-31 18:56:52 -04:00
matlabbe
accbe5a423 Export: Added exposure fusion option 2017-03-31 18:56:52 -04:00
matlabbe
f33b838204 DBViewer: updated more loop closures dialog default size 2017-03-31 18:56:52 -04:00
matlabbe
767b29d5a3 Updated detect more loop closures with optimization check to accept (like in dbviewer). DBViewer: added Depth image edition dialog. GainCompensator: now doing it on 3 channels separatly. Export: removed gain's alpha option, added max polygons option, added brightness/contrast auto balance option 2017-03-31 18:56:52 -04:00
matlabbe
a928a0b404 Moved create occupancy grid parameter to Ocupancy Grid panel 2017-03-31 18:56:52 -04:00
matlabbe
2574f3a8ee DatabaseViewer: Added ExportCloudsDialog, added Occupancy Grid View 2017-03-31 18:56:52 -04:00
matlabbe
622352b411 Freenect2: fixed noisy rectification of depth image on IR+Depth mode. 2017-03-31 18:28:19 -04:00
matlabbe
900de0a5c9 SimpleCalibrationDialog: width and height are now mandatory to save 2017-03-31 15:07:24 -04:00
matlabbe
def90355a9 Tango: fixed "Waiting creating clouds..." dialog not closing 2017-03-26 13:40:25 -04:00
matlabbe
a3f1e04a4d Update README.md 2017-03-22 22:24:57 -04:00
matlabbe
39286deb19 Dockerfile: updated tags 2017-03-22 21:48:01 -04:00
matlabbe
504bffa57a Update README.md 2017-03-22 21:23:10 -04:00
matlabbe
d89c43befa Dockerfile: fixed aapt error 2017-03-22 21:09:21 -04:00
matlabbe
d95818f1b2 update dockerfile (pcl ply headers not found) 2017-03-22 13:54:09 -04:00
matlabbe
9b0faaac34 updated dockerfiles 2017-03-21 19:52:18 -04:00
matlabbe
eaafe91ade Docker: added Dockerfile for android 2017-03-21 10:35:46 -04:00
matlabbe
f84bfd8384 Tango: Updated some files for docker 2017-03-20 15:45:24 +00:00
matlabbe
79709f3f06 Update util3d_surface.cpp
Added PCL_ONLY_CORE_POINT_TYPES check
2017-03-20 11:09:15 -04:00
matlabbe
ce6edf893a Update util3d_surface.cpp
Removed NormalEstimationOMP instantiate with PointXYZRGB/Normal for PCL > 1.8.0
2017-03-19 23:42:16 -04:00
matlabbe
5d5d602f1d Updated Dockfile for xenial 2017-03-17 21:03:14 -04:00
matlabbe
ad3aa30471 Added Docker file for xenial 2017-03-16 16:24:25 -04:00
matlabbe
69d174309d Tango: fixed bundle adjustment poses not used for export 2017-03-16 11:47:04 -04:00
matlabbe
5b08a69607 Tango: added comptible fisheye cloud density level 2017-03-15 17:05:19 -04:00
matlabbe
1bd9d41164 Tango: updated default export max polygons, added more values to color radius parameter 2017-03-14 10:54:23 -04:00
matlabbe
ef7bf87187 Tango: added fisheye option 2017-03-13 20:51:59 -04:00
matlabbe
d21ae76fff 0.12.3: Increased Tango rendering performance, modified all handleEvent() with new interface (now returning bool) 2017-03-12 21:21:09 -04:00
matlabbe
c12980ee91 Tango: Fixed scan local transform 2017-03-08 12:55:21 -05:00
matlabbe
719416741f Fixed "Export octomap..." not enabled on first load of the OctoMap 2017-03-08 08:33:43 -05:00
matlabbe
1b14263bb8 fixed #174 2017-03-07 20:58:38 -05:00
matlabbe
5c8da20eea Tango: Fixed color gain bug on pointcloud and mesh (without texture) 2017-03-07 10:53:29 -05:00
matlabbe
560fcdc541 Grid: Adjusting viewpoint when projecting into map frame 2017-03-06 13:32:48 -05:00
matlabbe
d1e9525052 Added viewpoint to laser scan 2D ray tracing 2017-03-06 12:07:59 -05:00
matlabbe
9f65ef199b Tango: Added Level of detail rendering depending on the distance from the camera 2017-03-05 21:48:18 -05:00
matlabbe
fed9d4ef3b Tango: zipping obj files, exporting in Export sub directory 2017-03-05 13:05:26 -05:00
matlabbe
867e8727c1 GraphViewer: Fixed scale of saved PNG/SVG 2017-03-05 11:55:22 -05:00
matlabbe
d927b82020 Tango: added min texture cluster size option 2017-03-04 19:34:40 -05:00
matlabbe
e003fb8d35 Texturing: Added min polygon cluster size parameter 2017-03-04 18:20:26 -05:00
matlabbe
4db957f437 Increased polygon texturing step speed 2017-03-04 02:53:11 -05:00
matlabbe
46ec0b8f70 Fixed Freenect2 calibration default rgb/depth/switched config not working 2017-03-03 18:12:55 -05:00
matlabbe
d1aa8bf5ae changed a warning to debug (about loop ratio) 2017-03-03 16:22:22 -05:00
matlabbe
3cf8ea63d8 Fixed a bug where camera facing polygons were not textured 2017-03-03 15:22:20 -05:00
matlabbe
fd55828c42 0.12.2: ros package sync 2017-03-03 11:36:07 -05:00
matlabbe
1ce4db5604 Fixed backward compatibility for exporting texture mesh with old databases 2017-03-03 00:19:46 -05:00
matlabbe
300e37124c GTSAM: added optimizer approach option #172 2017-03-02 16:46:15 -05:00
matlabbe
9b3b7b09a0 Projection ray tracing, keep empty cells from projection 2017-03-01 17:34:28 -05:00
matlabbe
17121d5861 Added parameter "Grid/ProjRayTracing" and renamed "Grid/3DGroundIsObstacle" to "Grid/GroundIsObstacle" 2017-03-01 14:06:21 -05:00
matlabbe
c9f6dabfc6 Tango: added progression bar when exporting, averaging colors in color radius when exporting without texture 2017-02-28 21:50:50 -05:00
matlabbe
b76952f016 Export: using color transfer radius to limit texturing far polygons from the orignal cloud 2017-02-27 17:31:02 -05:00
matlabbe
6c9572714f Tango: added sketchfab links, Color Radius is used when texturing optimized mesh 2017-02-27 16:53:05 -05:00
matlabbe
2565239a1b Export dialog: hiding not used options, exporting can be now canceled on texturing phase 2017-02-26 18:17:00 -05:00
matlabbe
8ab609471a CLAMS: added isFinite conditions in coneFit (before reproject) http://official-rtab-map-forum.67519.x6.nabble.com/Depth-calibration-fatal-error-td2682.html 2017-02-25 16:14:18 -05:00
matlabbe
3cf21a7e7f fixed laserScanFromDepthImage order (counterclockwise) 2017-02-24 15:26:42 -05:00
matlabbe
b0170d1f6f OdometryF2M: generating custom ids for bundle adjustement https://github.com/introlab/rtabmap_ros/issues/151 2017-02-24 11:50:29 -05:00
matlabbe
45ca3500c6 Removed assert when data.id = 0 (only requirement for odom is that id >=0) 2017-02-23 15:57:50 -05:00
matlabbe
526fdb495b Loop closure view: Added legend "gray" color for features not quantized in vocabulary (-1) 2017-02-23 11:49:33 -05:00
matlabbe
8de6cb1ca0 Added util3d::projectCloudToCamera() with PCLPointcloud2 interface, update util2d::fillDeptHoles() to support CV_32FC1 2017-02-23 00:15:43 -05:00
matlabbe
a1c036a7e2 removed warning when setting user data to SensorData if compressed user data is already here 2017-02-22 14:38:42 -05:00
matlabbe
a9b03bb39e Tango: 0.12.0 (performance optimization, time and memory) 2017-02-22 09:48:45 -05:00
matlabbe
595ac49552 0.12.0: database update: added missing octave field, added preview_image field 2017-02-17 14:37:41 -05:00
matlabbe
af1cdadabd Tango: updated export workflow, added sketchfab activity, added graph optimization parameters, fixed raw images kept in memory (disabled reexctract words on loop closure while updating memory to be able to create more features for transform estimation than needed in vocabulary), portrait/landscape orientation, updated to Eisa TangoSDK. DBReader: fixed high variance when node has no links (if not the first in the current map id). MainWindow: remove frustums not in the current graph. 2017-02-15 19:07:10 -05:00
matlabbe
1be0d52051 Fixed compilation error with PCL < 1.7.2 (disabled graph frustums option) 2017-02-09 19:25:35 -05:00
matlabbe
0d0577a886 3D Rendering: Added option to show graph's frustums, added option to filter floor and/or ceiling. 2017-02-09 18:32:44 -05:00
matlabbe
e4629cc740 Tango: file name using 0-24 hours format 2017-02-07 19:00:52 -05:00
matlabbe
1c555f321b Fixed Tango odometry variance 2017-02-07 15:57:52 -05:00
matlabbe
5e9c4fde95 Tango: added Privacy Policy link 2017-02-07 00:37:37 -05:00
matlabbe
6aecebcf2c ExportDialog: fixed minClusterSize signal/slot error 2017-02-06 21:07:27 -05:00
matlabbe
9a2c9f607f DBViewer: compute normals when showing clouds 2017-02-06 17:05:53 -05:00
matlabbe
3a9b725c0c Tango: doing mesh decimation only when texturing 2017-02-05 18:04:22 -05:00
matlabbe
f7616f6e94 Tango: update to 0.11.14 2017-02-05 17:24:45 -05:00
matlabbe
ce8bd9ac40 Export: for min polygon cluster size, added option -1 to just keep the largest cluster 2017-02-04 18:28:43 -05:00
matlabbe
5c44082c42 updated log commment in memory when changing feature type 2017-02-04 09:27:35 -05:00
matlabbe
585f0c54bf Adjusted min polygon cluster size for applying texture 2017-02-03 17:40:55 -05:00
matlabbe
31453d187d Updated how texturing is done (occlusion+distance) 2017-02-03 17:27:54 -05:00
matlabbe
53ff5b56e6 fixed texture not exported with single image scan 2017-02-01 12:53:05 -05:00
matlabbe
a1ceff8ce8 Texturing: ignore polygons not facing the camera 2017-02-01 00:29:13 -05:00
matlabbe
bfb9feaf07 TextureMapping: added maximum camera distance 2017-01-31 23:26:35 -05:00
matlabbe
8e0e04eae9 CloudViewer: added point picker on doubleclick 2017-01-30 19:51:06 -05:00
matlabbe
0f96bf7709 Added FREAK detector/descriptor option with OpenCV3 2017-01-30 22:24:51 -05:00
matlabbe
f61569622a CloudViewer: no need to save texture on disk before rendering TextureMesh (opencv image to vtk texture directly) 2017-01-30 21:23:56 -05:00
matlabbe
31d8ae08c8 Fixed a compilation warning... 2017-01-30 13:35:16 -05:00
matlabbe
4e324e34d8 About dialog: Added VTK version and updated copyright year 2017-01-30 13:17:03 -05:00
matlabbe
7b5761106d Tango: updated how RGB and depth images are synchronized (to minimize the dt between them). Added time offset to get stamps in epoch time. Trajectory Mode: fixed top button not selected. 2017-01-30 12:29:34 -05:00
matlabbe
819db9538f Ask to set detection rate to 0 when selecting a source database. DBReader: set 9999 covariance for the first odom pose of a database. 2017-01-29 18:24:10 -05:00
matlabbe
e3b3a08f5f DbViewer: fixed features not added in right image when adding loop closure 2017-01-28 15:49:29 -05:00
matlabbe
e3d9ad005e Tango default feature set to BRIEF 2017-01-28 01:17:32 -05:00
matlabbe
bcacf2fe74 Export: darker background to see grid lines 2017-01-27 16:55:01 -05:00
matlabbe
b3a6650a6f Updated error msg when database cannot be written on disk (write permission issue) 2017-01-27 14:31:44 -05:00
matlabbe
534efcb987 updated version to 0.11.14 2017-01-27 12:19:39 -05:00
matlabbe
79a211ad02 RtabmapThread: changed state stack for a queue to process events in FIFO order (instead of FILO). Tango: Added detector type parameter (FREAK is now the default with 400 features). 2017-01-27 11:47:57 -05:00
matlabbe
b4a0fe54cd Tango: added gain radius and min cluster size parameters 2017-01-26 17:34:15 -05:00
matlabbe
3a73414972 Tango: Added Settings/Optimized Mesh/Sketchfab Upload 2017-01-26 16:46:24 -05:00
matlabbe
66ee792e8c Export: fixed white squares in exported texture (shifting next tex coords to wrong sub texture). Transfer color radius option use nearest point when =0. Fixed a crash on export dense with texture when last materials are not used (they have no polygons associated). 2017-01-26 09:42:52 -05:00
matlabbe
496319a2b0 Export: Added merging textures option (default true) 2017-01-19 11:20:48 -05:00
matlabbe
0a98df922e Export: added texture format option (jpg, png) 2017-01-17 14:57:50 -05:00
matlabbe
4c7d46c8a0 createTextureCameras: using CameraModel's localTransform instead of hard coded optical rotation 2017-01-17 12:44:30 -05:00
matlabbe
a011a6af64 Refactored texture projection (avoid saving image on disk at this step) 2017-01-16 18:29:14 -05:00
matlabbe
2b8f40e505 fixed compilation warnings 2017-01-16 11:21:40 -05:00
matlabbe
8f797e81ae Export: added option to remove not textured/colored polygons. Cloud generation: Black pixels can be projected. Added RoiRatios options to 3D Rendering and Export. Added fill depth holes option to Export. 2017-01-16 01:32:53 -05:00
matlabbe
f8ec338fa3 Added Poisson surface reconstruction in export options 2017-01-15 19:09:37 -05:00
matlabbe
ea5f0fadb8 Tango: added more Map Update Rate options 2017-01-12 16:49:02 -05:00
matlabbe
bf01a1d138 consoleApp: fixed redefined i 2017-01-07 15:04:36 -05:00
matlabbe
32c051320c UCv2Qt: fixed min/max of depth to grayscale conversion for CV_32FC1 type 2017-01-06 16:57:47 -05:00
matlabbe
74ae1429a1 Camera tool: fixed compilation warning 2017-01-06 13:57:07 -05:00
matlabbe
00c93abd1b Memory: ignore reextract features when registration is not visual 2017-01-06 08:20:32 -05:00
matlabbe
7fa559247d DbViewer: disable "Add" button if one of the current images selected is not in the graph 2017-01-05 21:10:26 -05:00
matlabbe
8895173a2b Memory::computeTransform(): Fixed empty "from" image when reextract features is true and ICP-only registration is used 2017-01-05 19:31:18 -05:00
matlabbe
f20cb6ff52 Preferences: fixed map opacity limited to 0.75 min. Making sure that normalized variances are set to epsilon if result is 0. 2017-01-05 18:08:20 -05:00
matlabbe
4b12fb3a9a Normalize variance in refined/added loop closure (DbViewer) 2017-01-05 17:23:55 -05:00
matlabbe
716337b71a normalize variance in loop closure 2017-01-05 17:22:49 -05:00
matlabbe
dfb965cfa9 Fixed bundler exportation not using local transform 2017-01-04 17:49:59 -05:00
matlabbe
91f78b54d8 bump android version 2017-01-03 22:34:16 -05:00
matlabbe
ac1c5f81ae fixed some compilation warnings 2017-01-03 22:14:21 -05:00
matlabbe
6abed48af6 0.11.13. OdometryF2M: fixed/improved bundle adjustment option. OptimizerG2O: now doing stereo BA instead of mono BA (interface of Optimizer::optimzeBA() has slightly changed to include depth in word references). Registration and Odometry set angular and linear variances separately. RegistrationVis set x100 smaller variance for rotation. Added keypoints3D member to SensorData. Added Transform::getAngle() for convenience. Odometry normalizes variances. RtabmapThread does variance summation when frames are discarded. Updated how variance is computed by util3d::estimateMotion3Dto2D(), ignoring very large variance from the computation (stereo issue with very far matched features). MainWindow: added option to align with ground truth or not (default true as before), added for odometry statistics (including bundle stuff), update ground truth statistics every time a graph is loaded/optimized. CameraRGB can now load odometry files (to fake an input odometry). PreferencesDialog: Added option to Odometry so it can use a different registration approach than the default one (the one used for loop closure). Parameters: added new g2o/Solver option 3 (Eigen), added g2o/RobustKernelDelta, g2o/Baseline and Odom/VisKeyFrameThr. Database: from 0.11.13, ignoring patch version when comparing is database version is newer than app version used. 2017-01-03 21:05:00 -05:00
matlabbe
6550a52cee fixed #152 2016-12-05 15:53:19 -05:00
matlabbe
cd62e67011 Localization: Revert mapCorrection transform to one before being lost (when odom can be computed again) 2016-12-05 15:16:04 -05:00
matlabbe
e5524ddc1d Tango: fixed black clouds. Rtabmap: only add latest optimized pose to graph if localized. 2016-12-05 13:27:29 -05:00
matlabbe
3c17049084 Tango: Added Rendering Options... -> Mesh Rendering -> Mesh Decimation 2016-12-03 21:49:40 -05:00
matlabbe
d2287ab9f4 Backward compatibility (DBViewer, DBReader) with old database format not saving CameraModel's image size, cx and cy 2016-12-02 13:43:44 -05:00
matlabbe
a5f4468c54 Fixed build warnings about variables not used in CameraRGBD and CameraStereo classes (depending on which sensor is available) 2016-12-02 12:29:38 -05:00
matlabbe
f2dbfa9b33 StereoCameraModel: baseline computed with Tx of left camera too. Fixed QMultiComboBox not showing on windows. Avoid updating grid view if there are no local grids in signatrues. Clear cached data of StatsItem when detecting smaller timestamp than last ones. 2016-12-01 21:46:09 -05:00
matlabbe
d0dddaf7cc DbViewer: fixed bug where null links were added when added links doen't have enough inliers. g2o/Optimizer: changed back to Levenberg as GaussNewton seems worst on Kinect multi-session mapping 2016-12-01 11:59:49 -05:00
matlabbe
40d0be5828 Preferences: fixed groupbox modified signal not sent when reading a config file 2016-11-30 21:24:17 -05:00
matlabbe
d879491a58 Fixed #149 2016-11-30 14:25:01 -05:00
matlabbe
4d585cbb11 Fixed bug where Grid/MaxObstacleHeight didn't work when the ground is not observable 2016-11-28 14:02:06 -05:00
matlabbe
2f6d7f81cc Fixed accumulated words bug in highest hypothesis view 2016-11-27 20:55:53 -05:00
matlabbe
3363772ce5 CloudViewer: added backface culling option on right-click menu. MainWindow: removed error msg on wrong decimation (util3d already handle this case) 2016-11-27 20:10:05 -05:00
matlabbe
1910cef3d1 g2o/Optimizer changed default to 1 (Gauss Newton) 2016-11-27 18:32:48 -05:00
matlabbe
121446d648 Removed parameter "OdomF2M/FixedMapPath". GUI: added odometry disabled option. Rtabmap can now localize even if odometry input is null (only in localization mode). 2016-11-27 14:30:11 -05:00
matlabbe
693f623e5e Fixed GUI crash when using rectified RGB only (with odometry). Fixed empty local map when loading a fixed local map for OdometryF2M. 2016-11-25 19:52:34 -05:00
matlabbe
da1cac1e55 Tango: fixed map not optimized when opening a database 2016-11-25 16:05:14 -05:00
matlabbe
22089a9e45 Tango: Fixed supporting devices for appropriate listing in play store (only for Tango-enabled phones/tablets) 2016-11-25 15:35:18 -05:00
matlabbe
e65db3cba5 Tango: fixed localization mode not working 2016-11-25 15:20:42 -05:00
matlabbe
5b183d9105 DbViewer: do the max optimization error test when adding a new loop closure (rejecting it if it fails) 2016-11-24 15:09:16 -05:00
matlabbe
2a43a95ddd flann serialize unordered_map compilation error (#126): modified define name to avoid conflicts with the one defined in OpenCV 2016-11-23 17:36:38 -05:00
matlabbe
23bb5d5147 DBDriver: when an empty database url is provided, an empty database "in memory" is used by default. Tango: fixed second database not recorded in Data Recorder mode (now creating a new one on save). Mapping parameters are saved in database instead of the one used to record data (Data Recorder mode). 2016-11-23 15:13:09 -05:00
matlabbe
639896b309 CloudViewer: fixed dark textures 2016-11-21 19:10:30 -05:00
matlabbe
3d5699ef4a Tango: fixed second database not saved when hitting Save two times consecutively 2016-11-21 18:13:56 -05:00
matlabbe
1c41882bf0 bump tango version 2016-11-21 17:13:32 -05:00
matlabbe
14908e3a11 rtabmap: refining neighbor links uses computeIcpTransform() instead of computeTransform() (to ignore Visual registration, which adds more errors most of the time). When database is in RAM, we can close under a different name than the one used when the database was loaded.
Tango: Added Append Mode option (only start a new map after being localized, default true) and the old map is still shown for convenience until localization. Increased minInliers to 25. Increased ICP correspondenceRatio to 0.5. Decreased time to open a database. Saving doesn't close the database anymore and overwrite only if we save with the same name. Removed ICP refining from standard optimization.
2016-11-21 17:09:04 -05:00
matlabbe
4c559a3191 Preview: reduced minimum size of the window 2016-11-21 12:02:29 -05:00
matlabbe
0802f9158c MainWindow: backward compatibility: load default parameters for those not saved in a db 2016-11-18 16:59:14 -05:00
matlabbe
ceb5c38ca3 util3d: find maximum decimation if the one set is not compatible (instead of returning an empty cloud) 2016-11-18 16:19:41 -05:00
matlabbe
f0d36e71a1 Memory: fixed missing parameters in database on close 2016-11-18 15:53:35 -05:00
matlabbe
e809b30cb9 Tango: removed post-processing done after resuming the app 2016-11-18 14:18:04 -05:00
matlabbe
e5db40e4ae Tango: Fixed a bug where gain compensation was done while mapping (causing big lags) 2016-11-18 13:07:53 -05:00
matlabbe
43ff7e4b3e rtabmap-console: added "skip" option for convenience 2016-11-17 16:18:19 -05:00
matlabbe
a3afc249ef Fixed old parameters ignored when reading config file from GUI 2016-11-17 16:08:55 -05:00
matlabbe
ed83d90603 RTAB-Map.exe can be started with parameters as arguments (in similar way than rtabmap-console) 2016-11-16 17:39:17 -05:00
matlabbe
daf0a9c6e8 cleanup 2016-11-16 14:20:14 -05:00
matlabbe
4271fb37e9 Tango: Forcing landscape mode only (#143) 2016-11-16 12:56:30 -05:00
matlabbe
8560baca87 Fixed fx=0 error when running multi-session databases 2016-11-16 12:28:33 -05:00
matlabbe
d73394abd8 DBViewer: show local transform in calibration parameters, increased precision of small numbers < 0.001 for parameters toolbox 2016-11-16 11:39:44 -05:00
matlabbe
f6cca3313a Tango: Using tango_support library to get depth to color transform (#143), poses are in device frames and camera local transform is from device to camera (including optical rotation), "720" Mode is now called "HD Mode" 2016-11-16 10:13:16 -05:00
matlabbe
76edd53e40 Update showlogs.m 2016-11-15 17:54:43 -05:00
matlabbe
cb31a717cf rtabmap-console: added fake initialization at startup to make sure all external libraries are loaded before processing the first frame 2016-11-15 16:49:58 -05:00
matlabbe
b9b3dcb5e3 QMultiComboBox: removed "DONT USE IT" msg 2016-11-15 10:21:19 -05:00
matlabbe
acf55e0c9b DatabaseViewer: fixed just 50 last values shown on statistics view 2016-11-15 09:52:24 -05:00
matlabbe
c40456a2ec ULogger::unregsiterCurrentThread: unregister ALL values related to same thread 2016-11-15 08:53:26 -05:00
matlabbe
6d9f1828c6 fixed iterator error on some systems (#145) 2016-11-15 08:47:41 -05:00
matlabbe
9276607920 Added Bundle Adjustment options to OdometryF2M (OdomF2M/BundleAdjustment) and RegistrationVis (Vis/BundleAdjustment). Added logger thread filter. RegistrationVis: Copy back corresponding input word IDs to output words when available. Memory::computeTransform() added option to use already computed corespondences if possible (proximity detection by time uses this). Updated Optimizer::optimizeBA() interface. 2016-11-14 19:54:31 -05:00
matlabbe
9fbd02b06d fixed bug of wrong likelihood when KDTree is used with Kp/IncrementalFlann=false (maybe related to #144) 2016-11-10 14:07:00 -05:00
matlabbe
4885a9e65a fixed a warning 2016-11-10 10:22:47 -05:00
matlabbe
98851ed686 ExportCloudsDialog: decreased minimum triangle size from 2 to 1 2016-11-10 09:48:51 -05:00
matlabbe
edcd92fbb7 DBViewer: merged Refine (visual) and Refine (ICP) in the same Refine action (registration used is defined by Reg/Strategy value). Updated how detect more loop closures work in MainWindow and DBViewer (using current registration parameters, visual and/or icp) 2016-11-09 16:44:08 -05:00
matlabbe
fdcfb3eb7c Merge pull request #142 from TomasBedrnik/upstream
Fix missing space in ostream operator <<  for Transform
2016-11-08 13:17:31 -05:00
Tomas
55ff45064f Fix missing space in ostream << operator for Transform 2016-11-08 19:40:34 +02:00
matlabbe
f88eadd312 Merge pull request #141 from TomasBedrnik/upstream
Fix bug with ostream operator<< for Transform
2016-11-07 13:31:01 -05:00
Tomas
874e9dafc2 Fix bug with ostream operator>> for Transform 2016-11-07 14:42:01 +02:00
matlabbe
d6b334ab02 nump tango version 2016-11-04 17:32:29 -04:00
matlabbe
efbee6796f Tango: sorting files on Open 2016-11-04 17:03:06 -04:00
matlabbe
cdeba51ccd fixed typo 2016-11-04 16:46:30 -04:00
matlabbe
7fd3d9f331 Tango: added mesh smoothing, show file size on Open, default timestamp filename on save/export 2016-11-04 16:39:52 -04:00
matlabbe
c8d5a446ea fixed Ubuntu build (Eigen error in util2d::fastBilateralFiltering) 2016-11-03 17:43:32 -04:00
matlabbe
fe19d277ac Fixed OdomF2M ICP local scan transform bug (was not in 0.11.8) 2016-11-03 17:27:01 -04:00
matlabbe
a7971373a6 Added bilateral filtering option. CloudViewer: lighting and edge visibility options. 2016-11-03 17:04:31 -04:00
matlabbe
70dbac10c7 Updated .travis.yml with email notifications 2016-11-03 11:22:11 -04:00
matlabbe
82b352d519 Updated .travis.yml with ros paths 2016-11-03 11:12:16 -04:00
matlabbe
421926f7ac Updated .travis.yml 2016-11-03 11:03:47 -04:00
matlabbe
53d555dceb Updated .travis.yml with g2o, openni2 and octomap dependencies 2016-11-03 11:00:31 -04:00
matlabbe
043e288d70 Fixed assert "((int)path.size() < = maxGraphDepth*2+1)" when Mem/ReduceGraph=On 2016-11-02 13:06:38 -04:00
matlabbe
8718bb4ff1 Fixed #137 2016-11-01 12:04:10 -04:00
matlabbe
0a06648c02 Updated Tango namespace (see Qianru release notes) for Phab 2 Pro 2016-10-31 23:16:24 -04:00
matlabbe
276992d654 Fixed laser scans not saved when Mem/BinDataKept is false (they are still required for scan matching) 2016-10-31 14:29:32 -04:00
matlabbe
f07bb17442 Find/Link explicitly OpenCL libraries if Freenect2 is detected (moved in main CMakeLists.txt to be added to exported in RTABMapConfig.cmake) 2016-10-31 14:28:17 -04:00
matlabbe
2529952982 ExportClouds: set minimum K (for normal estimation) to 3. Also added a check if the created cloud is empty. 2016-10-31 11:29:07 -04:00
matlabbe
e3c290269b cloudFromDepthRGB: Don't assert if decimation is wrong, just throw error and return empty cloud 2016-10-31 11:10:16 -04:00
matlabbe
4bcb31e532 Refactored GainCompsensator for backward compatibility with PCL <1.7.2 2016-10-30 17:46:11 -04:00
matlabbe
768c864766 Image Decimation can now be negative, meaning that decimation is done from RGB size instead of depth. If Depth size is smaller than RGB, it may be upsampled depending on the decimation value. Export Dialog: Fixed MLS not done even when checked. 2016-10-30 16:03:23 -04:00
matlabbe
20a5d80647 bump tango version 2016-10-29 18:42:39 -04:00
matlabbe
a09aebeca4 Tango: Added Data Recorder mode (See Mapping menu) 2016-10-29 18:14:25 -04:00
matlabbe
9e0b45e27a Fixed "UNIQUE constraint failed: Statistics.id" error when loading a previous map with last id saved in Statistics not in Node table (this happened when ignored locations are not saved to database). 2016-10-29 18:12:27 -04:00
matlabbe
9123889876 Tango: Added full gain compensation option 2016-10-27 15:35:19 -04:00
matlabbe
d06abbbd91 Tango: updated to use TangoPointCloud callback (fixed deprecated TangoXYZij) 2016-10-27 14:44:11 -04:00
matlabbe
8f90d25468 Tango: added camera movement when moving 2 fingers 2016-10-27 14:22:21 -04:00
matlabbe
69219eb340 Fixed MLS still done when not visible if checked before 2016-10-26 20:41:33 -04:00
matlabbe
185f03985e Refactored GainCompensator. Export Dialog: Added option to do full gain compensation with all locations. 2016-10-26 19:03:44 -04:00
matlabbe
d102c43f9a ZED: Added self calibration option (default false) 2016-10-25 16:06:55 -04:00
matlabbe
063e019653 Export Images: fixed images still saved when cancelling the dialog 2016-10-25 14:54:02 -04:00
matlabbe
49cb35175f fixed build error backward compatibility pcl 1.7 < pcl 1.8 2016-10-24 16:31:57 -04:00
matlabbe
5d1ea43b9e Fixed build error on Windows 2016-10-24 14:44:49 -04:00
matlabbe
a1c3a60f87 DB Viewer: added message box at the end of extracting images 2016-10-23 18:32:07 -04:00
matlabbe
60c406d6ec EipolarGeometry: added missing dictionary.update() 2016-10-23 14:01:44 -04:00
matlabbe
7b2bf9ac13 GUI: Fixed crash when adding Texture Dense Mesh to CloudViewer 2016-10-21 19:34:29 -04:00
matlabbe
856b83ac53 GUI: Fixing some minor Export dialog bugs (texture option disabled on export or failing to save mesh without extension set) 2016-10-21 16:56:29 -04:00
matlabbe
4017db1d15 fixed #132 2016-10-21 16:54:32 -04:00
matlabbe
5a24bcfe51 GUI: added option to show octomap as a point cloud (less GPU power required) 2016-10-18 13:29:40 -04:00
matlabbe
73268c2af2 GUI: Fixed current image and loop closure image features not shown when Mem/BinDataKept is false 2016-10-18 12:27:14 -04:00
matlabbe
bcc6354c04 fixed strange ellipse shape in GraphView with Qt5 2016-10-17 19:30:44 -04:00
matlabbe
1853cfde9b ImageView: Fixed feature's depth value when depth image is not the same size as the RGB image 2016-10-17 13:30:35 -04:00
matlabbe
07ff1a7717 Fixed save/loading of binary distortion model on Windows #128 2016-10-14 16:03:08 -04:00
matlabbe
0ce6ef8d8d CLAMS: cleanup eigen_extensions.h, models can be saved/loaded in binary (*.bin) or ascii (*.txt) formats 2016-10-14 15:24:24 -04:00
matlabbe
e13454fe3f Memory: Disabled occupancy grid update if no depth image 2016-10-14 13:37:21 -04:00
matlabbe
94c25e2017 fixed #123 2016-10-11 13:06:16 -04:00
matlabbe
b09c97169a clams: added some debug log on reading 2016-10-06 21:31:21 -04:00
matlabbe
37192422be Fixed util3d::laserScanToPointCloudRGB for 2 channels scan (added also default color param) 2016-10-05 18:11:58 -04:00
matlabbe
9e7b905c0b undistort: check nan values too 2016-10-05 13:55:02 -04:00
matlabbe
33501fdb0f max optimization error checked on link with variance <=1 instead of <1 (to make it work also when TF odom is used, for which variance of 1 is set) 2016-10-03 17:11:20 -04:00
matlabbe
6f00cba872 Added OccupancyGrid::isGridFromDepth() method for convenience 2016-10-02 16:47:22 -04:00
matlabbe
29f4734ec6 Calibration 3-steps: updated warning msg 2016-09-30 14:47:55 -04:00
matlabbe
b17e0dc26d Calibration 3-steps: fixed crash on step 3 if intrinsic parameters are not correctly loaded (empty distorsion model) 2016-09-30 14:38:45 -04:00
matlabbe
403bfc2b44 Merge branch 'kinetic-devel' of https://github.com/introlab/rtabmap 2016-09-29 12:45:21 -04:00
matlabbe
4d6cfbba20 RTABMapConfig.cmake: added find VTK if vtkGUISupportQt target is required 2016-09-29 12:40:51 -04:00
matlabbe
a1593a69a4 Enabled esport to g2o even if not built with g2o support (export doesn't need the library) 2016-09-28 16:07:01 -04:00
matlabbe
8c05ae332c Merge branch 'kinetic-devel' of https://github.com/introlab/rtabmap 2016-09-27 16:35:06 -04:00
matlabbe
7f0c49b14d Fixing QVTKWidget linker errors on Kinetic/VTK6/PCL for armhf build 2016-09-27 15:43:23 -04:00
matlabbe
b7fae1a65b SensorData: updated how compressed user_data is detected 2016-09-26 16:33:24 -04:00
matlabbe
a4dd47374e Backward compatibility: Fixed wrong image height set in SensorData::uncompressData() 2016-09-25 18:13:49 -04:00
matlabbe
4062b960c7 fixed a compilation warning 2016-09-22 14:35:37 -04:00
matlabbe
44bf3d40ad Fixed invalid controlling predicate compilation error on linux 2016-09-20 16:26:46 -04:00
matlabbe
5f85c2a7a0 Fixed missing left/right suffixes when loading stereo calibration files 2016-09-20 11:52:06 -04:00
matlabbe
3530da935b 0.11.11: changed Statistics table name to Info and added new Statistics table containing detection statistics. StatisticsToolBox can cache statistics (true by default). DatabaseViewer: new Statistics panel to see all statistics contained in the database. 2016-09-20 11:19:34 -04:00
matlabbe
a0972158dc PostProcessing, added some processEvents to see updates in progress dialog 2016-09-19 17:54:51 -04:00
matlabbe
3434b95d68 Integration of CLAMS depth calibration #114 2016-09-19 14:01:06 -04:00
matlabbe
861cc437f4 Updated Freenect2 calibration lookup names 2016-09-13 18:57:44 -04:00
matlabbe
2b2dc2be39 Fixed Windows build errors #115 2016-09-13 18:46:05 -04:00
matlabbe
acb700bd27 Added OpenNI2 and Freenect calibration #115 2016-09-13 18:26:18 -04:00
matlabbe
e5977d6157 Ignoring black pixels when creating clouds (recfification artifacts). Slightly improved depth retification speed. 2016-09-13 12:10:14 -04:00
matlabbe
44caa12fa5 CameraStereoVideo: added left and right separated video streams. Fixed issue #117 2016-09-11 12:45:12 -04:00
matlabbe
26c7078923 Tango: slight modifications of the default parameters 2016-09-10 18:45:46 -04:00
matlabbe
94a4fb4579 fixed 2 compilation warnings 2016-09-09 15:10:19 -04:00
matlabbe
d6f9f29835 Fixed list not defined error in util3d_surface.h. Updated rgbd_mapping example with Freenect2, zed and realsense options 2016-09-09 18:35:56 -04:00
matlabbe
2eb2362da8 Tango: Handling app pause/resume without having to restart mapping (OpenGL context flushed issue). 2016-09-08 11:55:44 -04:00
matlabbe
53c3981651 Tango: Fixed typo making textures not appearing... 2016-09-07 20:25:41 -04:00
matlabbe
d252b1fb13 GUI: Fixed cannot delete rtabmap.tmp.db error when closing and if database is in memory. 2016-09-07 20:15:30 -04:00
matlabbe
d3173d8533 Tango: Optimized memory for created meshes (keeping dense clouds instead of organized clouds) 2016-09-07 19:59:25 -04:00
matlabbe
4a072b3dfc Tango: Added "Adjust colors" post-processing option. Updated ICP parameters. Added "Mem/LaserScanNormalK" parameter for convenience. 2016-09-07 17:19:21 -04:00
matlabbe
ce1acd9d44 DatabaseViewer: showing normals if scans have 6 channels 2016-09-07 17:14:09 -04:00
matlabbe
ff4300d525 Added GainCompensator class. GUI/3D Rendering: added texturing option. 2016-09-07 12:15:44 -04:00
matlabbe
3b25fef852 Tango: updated manifest to version 10 2016-09-03 20:46:22 -04:00
matlabbe
91da92346d Tango: added Noise Filtering post-processing option, set RGBD/MaxLocalRetrieved to 0 (avoiding some high processing time peaks), fill depth holes up to 5 pixels 2016-09-03 20:38:27 -04:00
matlabbe
7f2c118f8d Added min polygon cluster size option (DbViewer and GUI export) 2016-09-03 18:59:43 -04:00
matlabbe
0848b03127 DBReader: set calibrated to true if database is empty (avoiding not calibrated warning) 2016-09-03 14:45:10 -04:00
matlabbe
e5074afdeb Tango: Added ICP refining option, mesh vs texture vs point cloud options, show/hide grid option, drift correction option 2016-09-02 22:37:12 -04:00
matlabbe
4bd9e4f847 OctoMap: Added occupancy threshold to constructor 2016-09-01 20:33:05 -04:00
matlabbe
717e82c09e fixed typos 2016-09-01 19:22:04 -04:00
matlabbe
d069dedf34 PostProcessing: fixed scans not uncompressed before refining 2016-09-01 18:36:55 -04:00
matlabbe
dd2f89628e cloudFromDepthRGB() iterating over depth image size instead of RGB image size. DbViewer: fixed scale of image view when depth is smaller than rgb. 2016-09-01 16:42:34 -04:00
matlabbe
87b9f30dce fixed warning ("centroid" may be not initialized)... 2016-09-01 14:55:19 -04:00
matlabbe
76298e86be CMake: set WITH_QT=OFF for android by default 2016-09-01 13:40:44 -04:00
matlabbe
aaef1ac997 Merge pull request #111 from willdzeng/master
include list in FlannIndex.h
2016-08-31 22:19:00 -04:00
Di Zeng
794ee2f562 include list in FlannIndex.h 2016-08-31 15:06:50 -07:00
Mathieu Labbe
546c66ea3c cloudFromDepth(): changed roi ratios warning to error 2016-08-31 14:15:48 -04:00
matlabbe
7a4de966d4 cloudFromDepth(): fixed roi ratios not used if one value was null. DbViewer: Added occupancy grid clouds to 3d views, add action to regenerate occupancy grids only for the current selected ids. 2016-08-31 12:43:54 -04:00
matlabbe
c404234635 OccupancyGrid: added Grid/Footprint*** parameters, templated segmentCloud() function, added Grid/ClusterRadius parameter. Parameters: fixed getDefaultParameters(group) function to correctly compare groups. 2016-08-31 12:43:54 -04:00
matlabbe
6fe7d5a856 OccupancyGrid: fixed 2d scan not transformed before creating grid 2016-08-31 12:43:54 -04:00
matlabbe
2fb71445da Added warning when requesting a path before beeing localized 2016-08-31 12:43:54 -04:00
matlabbe
79b51311bc DatabaseViewer: removed unknown grid cell filled parameter 2016-08-31 12:43:54 -04:00
matlabbe
fe6eb01404 Fixed opencv setSize assert error (RegistrationVis):
[DEBUG] (2016-08-29 10:26:03.821) RegistrationVis.cpp:460::computeTransformationImpl() kptsFrom=0
[DEBUG] (2016-08-29 10:26:03.821) RegistrationVis.cpp:461::computeTransformationImpl() kptsTo=0
OpenCV Error: Assertion failed (s >= 0) in setSize, file /home/mathieu/workspace/opencv-2.4.11/modules/core/src/matrix.cpp, line 116
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/mathieu/workspace/opencv-2.4.11/modules/core/src/matrix.cpp:116: error: (-215) s >= 0 in function setSize
2016-08-31 12:43:54 -04:00
matlabbe
5542918b04 Fixed holes in 2d occupancy grids created from scans. Fixed grid map in 3D view not updated. 2016-08-31 12:43:54 -04:00
matlabbe
e93ef025a1 DatabaseViewer: added occupancy grid to 3D view 2016-08-31 12:43:54 -04:00
matlabbe
8d31b6140d CloudViewer: added occupancy grid support for PCL < 1.7.2 2016-08-31 12:43:54 -04:00
matlabbe
4e027a6515 Grid/DetectFlatObstacles default true. segmentObstaclesFromGround(): Fixed not used indices still kept in obstacles output 2016-08-31 12:43:54 -04:00
matlabbe
797f1f0f1c DatabaseViewer: added regeneration of occupancy grids action and saving back to database on close 2016-08-31 12:43:54 -04:00
matlabbe
4d8200fef3 Added "RGBD/ProximityPathMaxNeighbors" parameter 2016-08-31 12:43:54 -04:00
matlabbe
edee909324 RegistrationICP: fixed local scan transform issue 2016-08-31 12:43:54 -04:00
matlabbe
48f54cf2f2 FlannIndex: changed how detection of index rebuilt is done (to handle index that always rebuild on addPoints()). CameraImages: Fixed null scan local transform 2016-08-31 12:43:54 -04:00
matlabbe
c8cb961108 Refactored FlannIndex: Moved class into its own include file. Added radiusSearch() and buildKDtreeSingleIndex() methods. If dimensions <= 3 and float, use L2_Simple distance type. 2016-08-31 12:43:53 -04:00
matlabbe
013eba1d58 0.11.10: Database update with occupancy grid and laser scan info. Added class LaserScanInfo and OccupancyGrid (incremental 2d grid map). Gui: 2d grid and octomap are udpated using occupancy grids saved in nodes. 2016-08-31 12:43:53 -04:00
matlabbe
af02e02978 Added Occupancy class. Database SQL: added ground_cells, obstacle_cells and cell_size fields to Node table (updated Signature too). 2016-08-31 12:43:53 -04:00
matlabbe
b947bde3db ZED SDK v1.1.0: Fixed compilation errors 2016-08-31 11:37:27 -04:00
matlabbe
34b8fdfe6d Merge pull request #110 from berkaydeniz/finddc1394-fix
in FindDC1394.cmake Mac OS X based framework setup gives errror.
2016-08-31 11:07:55 -04:00
Berkay Deniz Ilhan
47e7b621ad in FindDC1394.cmake Mac OS X based framework setup gives errror. 2016-08-30 02:30:35 -04:00
Mathieu Labbe
52c7395578 fixed rgbdMatC4 not declared compilation error (bug from #108) 2016-08-28 16:06:49 -04:00
matlabbe
fb527e5df4 util2d::getDepth() fixed tmp not divided 2016-08-27 09:06:15 -04:00
matlabbe
7161756cc9 Merge pull request #108 from lesterlo/nvidia_jetson_fix
Improve Freenect2 performance
2016-08-26 09:50:22 -04:00
lesterlo
f180beb3f9 1. Add freenect2 cuda pipeline
2. Fix TegraJPEG Color problem, convert from RGB to BGR
2016-08-26 15:40:10 +08:00
matlabbe
a302a6334d Fixed #107 2016-08-24 09:02:58 -04:00
matlabbe
18b1931e7c Added occupancy grid footprintRadius parameter to clear obstacles under path 2016-08-14 14:52:42 -04:00
matlabbe
ae7436a41b Fixed bug where very long paths (over maxGraphDepth) were used for scan matching. Added "RGBD/ProximityMaxPaths" parameter (default 3) to limit the number of path comparisons for proximity detection. 2016-08-12 18:43:12 -04:00
matlabbe
a0d76eabe5 RegistrationVis: don't assert if descriptorsFrom is 0, only if kptsFrom and descriptorsFrom are non null and not equal 2016-08-12 10:59:43 -04:00
matlabbe
5557701f44 suppressing CMP0020 and CMP0043 warnings 2016-08-11 14:13:29 -04:00
matlabbe
0ccb69bc06 Fixed calibrations not loaded for bad signatures 2016-08-10 10:35:53 -04:00
matlabbe
0152941ecf MainWindow: Fixed a bug creating more error with refining with ICP in Post-Processing 2016-08-10 10:06:22 -04:00
matlabbe
28462bb2b5 Preferences/Source: fixed disabled RGBD Images source 2016-08-09 17:13:08 -04:00
matlabbe
a824b24058 Added util3d::transformLaserScan(). OdomF2F: filling local scan map field with key frame scane in odom info. DbViewer: Print database parameters in Info view. 2016-08-08 14:35:39 -04:00
matlabbe
6ef9034a67 Fixed ICP-only odometry when guess from motion is enabled 2016-08-07 20:54:56 -04:00
matlabbe
93f1ae501c Fixed disabled KDTree in Preferences when built without nonfree OpenCV module 2016-08-05 16:55:06 -04:00
matlabbe
d9b3eafc39 DatabaseViewer: cloud in 3D view is now in base frame instead of camera frame 2016-08-05 15:30:38 -04:00
matlabbe
5dd42cf925 Added r200 icon 2016-08-03 20:03:31 -04:00
matlabbe
e4c4c8c468 Added c++11 flag when RealSense is detected 2016-08-03 11:39:43 -04:00
matlabbe
72a76f6c80 Tango: Fixed computeNormals() type conversion build error #90 2016-08-01 16:00:58 -04:00
matlabbe
071670e24c Added c++11 flag for Android build (Tango) issue #90 2016-08-01 15:38:22 -04:00
matlabbe
c25c1db3da Odometry: changed isF2M() and isF2F() by getType() (following pull request https://github.com/introlab/rtabmap/pull/102) 2016-08-01 15:26:35 -04:00
matlabbe
c0cc57d1d8 Merge pull request #102 from willdzeng/master
added the type virtual function to avoid dynamic cast
2016-08-01 15:13:15 -04:00
Di Zeng
33dab87765 added the type virtual function to avoid dynamic cast 2016-07-28 11:59:24 -07:00
matlabbe
9d09c509ab Added librealsense support #100 2016-07-26 18:39:34 -04:00
matlabbe
dbb29c7661 databaseViewer: Fixed link's covariance modified when pose correction was disabled. Link: setVariance() and setInfMatrix are now private, to force re-cloning the link if we want to change these info. 2016-07-24 13:23:22 -04:00
matlabbe
1a1cf5f672 Freenect2: Fixed initRectifyMap error with custom calibration 2016-07-21 12:40:25 -04:00
matlabbe
759c917498 Octomap: changed warning log "Did not find...in cahe" to a debug log 2016-07-21 10:14:22 -04:00
matlabbe
d7b1d617ea GUI: Fixed loaded parameters not actually modified from opened database 2016-07-20 17:07:35 -04:00
matlabbe
1e47271c91 DBReader: Fixed wrong virtual inherited function name odometryProvided() -> odomProvided() 2016-07-20 16:37:32 -04:00
matlabbe
1dca6116be Fixed default parameters on init for octomap 2016-07-20 15:17:59 -04:00
matlabbe
ff59274c95 updated LICENSE year 2016-07-17 22:01:57 -04:00
matlabbe
ca6cd19fb1 Updated Copyright year and About dialog summary 2016-07-17 21:57:10 -04:00
matlabbe
be61eefdf9 Fixed build errors without octomap 2016-07-17 21:36:54 -04:00
matlabbe
cf2bb6b599 CMake: Added PCL_OMP option (default ON) to use OMP implementations of some PCL classes (#50) 2016-07-17 21:04:11 -04:00
matlabbe
d739d04232 Disable multi-arch lib by default (#97) 2016-07-17 20:12:13 -04:00
matlabbe
711ff2692c Updated default x-axis units of the figures with time stamps instead of IDs (#48). 2016-07-17 19:58:32 -04:00
matlabbe
705f4337e4 Fixed #42 2016-07-17 17:44:12 -04:00
matlabbe
237ab2be45 Projection map frame is still doing roll/pitch transformation (without z) 2016-07-17 17:06:36 -04:00
matlabbe
536136af77 Fixed octomap height when in /map frame. Preferences: added Cloud Filtering and Occupancy Grid Map subpanels to 3D Rendering 2016-07-17 16:47:06 -04:00
matlabbe
d4e5cfb548 fixed octomap ground cells removed when updating graph 2016-07-17 15:37:08 -04:00
matlabbe
b5e5e9508c fixed crash when activating octomap while mapping 2016-07-17 14:58:28 -04:00
matlabbe
f161609a24 Added octomap ground is an obstacle option 2016-07-16 10:57:59 -04:00
matlabbe
b4b7b6f455 Added Octomap visualization and export options 2016-07-15 17:46:13 -04:00
Mathieu Labbe
c24079884d Reset stuck when moving toward the goal 2016-07-11 17:40:34 -04:00
matlabbe
38c3e3600d Planning stuck detection updated: now using distance to goal 2016-07-11 17:16:11 -04:00
matlabbe
09795678ef Merge branch 'master' of github.com:introlab/rtabmap into devel 2016-07-08 19:45:00 -04:00
matlabbe
b3207d6402 PLanning: Detect if the pose is reachable from the current node before looking for the nearest one 2016-07-08 19:44:44 -04:00
matlabbe
c6439cb1b7 Merge branch 'master' of github.com:introlab/rtabmap into devel 2016-07-08 19:23:05 -04:00
matlabbe
61f6e5ff79 Using fly distance instead of path distance to update the farthest goals 2016-07-08 19:22:48 -04:00
matlabbe
4cd8705710 Fixed cloudFromDepth() method when depth image is not the same size as the calibration file. That fixes projection map created from Tango databases (where depth size != rgb size) 2016-07-08 12:47:23 -04:00
matlabbe
c8cd2545d3 fixed build without octomap 2016-07-08 00:21:36 -04:00
matlabbe
6f310ff63a util2d::getDepth(): fixed small error on depth assignation (mm) 2016-07-05 18:21:39 -04:00
matlabbe
20862f07bc RegistrationInfo: added IcpTranslation and IcpRotation members 2016-07-05 11:23:59 -04:00
matlabbe
1365eaca3a Merged master to devel 2016-07-04 15:38:28 -04:00
matlabbe
9dfc7801a0 Fixed fatal error in #91 2016-07-04 13:39:33 -04:00
matlabbe
02d4ca5c8b util3d::segmentObstaclesFromGround: added viewPoint argument (default 0,0,100) 2016-07-04 11:47:10 -04:00
matlabbe
c2a7b2f13a Odometry: Added process() with optional guess interface 2016-06-30 11:34:46 -04:00
matlabbe
4115bc416e Added OctoMap class 2016-06-28 19:00:44 -04:00
matlabbe
060a3fd47e Merge branch 'master' of github.com:introlab/rtabmap into devel 2016-06-27 16:11:08 -04:00
matlabbe
84726fa45c Update Odometry.cpp 2016-06-27 16:10:18 -04:00
matlabbe
3609c961ea Merge branch 'master' of github.com:introlab/rtabmap into devel 2016-06-27 16:08:53 -04:00
matlabbe
756e176878 Update Odometry.cpp
Odometry: Added additional debug information on dt>0 assert
2016-06-27 16:08:25 -04:00
matlabbe
1398b71b60 Merge branch 'master' of github.com:introlab/rtabmap into devel 2016-06-27 12:17:55 -04:00
matlabbe
f69ca56179 Features2D: Using 255 mask values for ORB (#89). Fixed ignored mask by FAST when called from ORB. 2016-06-27 11:54:21 -04:00
matlabbe
a310b5e864 DB: Added error when loading a database with version more recent than installed rtabmap version 2016-06-25 13:28:26 -04:00
matlabbe
517bfa5272 OdometryF2M: updated how local scan map is updated 2016-06-25 13:18:09 -04:00
matlabbe
ca95c9de97 Changed an OpenCV_LIBS to OpenCV_LIBRARIES 2016-06-24 21:00:12 -04:00
matlabbe
37c269bc0b fixed a warning 2016-06-24 19:23:11 -04:00
matlabbe
e90c97f8a4 ZED driver: added option to use visual odometry approach from zed sdk. RtabmapThread: fixed thread state change on new map trigger on Odometry init (variance=9999). Odometry: on init, verify that the first frame is ok before sending first pose. Parameters: Mem/SaveDepth16Format is now false by default 2016-06-24 18:49:34 -04:00
matlabbe
af6e17fce8 GUI: Added color code for odometry features 2016-06-24 16:02:27 -04:00
matlabbe
b86352bfc0 merged master to devel 2016-06-23 15:44:24 -04:00
matlabbe
f03a1b50ef Fixed build with ZED SDK 1.0.0... cmake find_package ZED version 1 (#85) 2016-06-23 15:41:32 -04:00
matlabbe
70da8d26c0 Fixed build with ZED SDK 1.0.0 (#85) 2016-06-23 15:40:11 -04:00
matlabbe
333c7433e8 Merge branch 'master' of https://github.com/introlab/rtabmap into devel 2016-06-23 11:27:58 -04:00
matlabbe
f2d48cb894 Fixed ICP-only registration with already provided guess (no need to do visual guess, as the guess can be already good) 2016-06-23 11:08:20 -04:00
matlabbe
22766e958f Update VWDictionary.cpp
Fixed "HAVE_OPENCV_CUDAFEATURES2D" build error of https://github.com/introlab/rtabmap/issues/85
2016-06-22 19:28:22 -04:00
matlabbe
42c3186a53 Memory::computeTransform(): fixed null guess sent to pure ICP registration 2016-06-21 16:42:21 -04:00
matlabbe
530919c531 CameraThread: fixed scan from depth max points with multi-camera 2016-06-21 11:36:50 -04:00
matlabbe
0ec39e3c77 DBReader now inherits from Camera (so that CameraThread's post processing stuff can be used with a database stream) 2016-06-21 11:22:24 -04:00
matlabbe
cdddb1209e DBReader: added camera selection 2016-06-20 10:50:01 -04:00
matlabbe
62db5370aa CloudViewer: Added updateCameraFrustum() method (multi-cameras supported) 2016-06-19 18:33:36 -04:00
matlabbe
ab991c2a7d CameraModel::scaled() scale Tx an Ty too 2016-06-17 16:47:02 -04:00
matlabbe
d03b54d95a Parameters: removed trailing 0 for double/float parameters, to avoid serializing with them (so that we don't have the 0.0 != 0 when loading parameters from database) 2016-06-16 15:34:27 -04:00
matlabbe
62a982ef9f DbDriverSqlite3: Fixed multi-camera calibration loading error with version >= 0.11.2 2016-06-16 14:57:55 -04:00
matlabbe
798c3cb373 Registration: added warning when GuessFlowSize is set and multi-camera is detected instead of crashing on an assert 2016-06-15 18:13:11 -04:00
matlabbe
7f55e2c9bb Merge branch 'master' of github.com:introlab/rtabmap into devel 2016-06-15 16:39:25 -04:00
matlabbe
8e76de7d34 Fixed GTSAM/Eigen include dir 2016-06-15 15:48:56 -04:00
matlabbe
ac284ab067 GUI: fixed odometry visibility flickering 2016-06-15 14:18:26 -04:00
matlabbe
95f9304f4f CameraStereo: fixed rectify=false ignored 2016-06-15 11:36:37 -04:00
matlabbe
7b733686cb Updated CameraVideo and CameraStereoVideo constructor interface with USB 2016-06-15 11:30:05 -04:00
matlabbe
bdafb9a3f1 Merge branch 'master' of github.com:introlab/rtabmap into devel 2016-06-14 11:56:22 -04:00
matlabbe
abd376a44c segmentObstaclesFromGround() fixed identical ground and obstacles indices 2016-06-14 11:55:58 -04:00
matlabbe
38a7993a9b Database: added "parameters" field in Statistics table. GUI: detecting if parameters in database are different from the Preferences, if so ask user to update them. 2016-06-13 17:34:17 -04:00
matlabbe
3edb133727 Increased default Stereo/MaxDisparity to 128 2016-06-13 14:37:19 -04:00
matlabbe
84dd258777 Added "Odom/AligWithGround" parameter. Added util3d::extractPlane(). 2016-06-12 21:45:22 -04:00
matlabbe
543b8df045 MainWindow: Added statistics about how much size the created clouds take in RAM. Avoid caching data on small movements. Export: Fixed meshing checkbox and pipeline combo box not saved/loaded. PreferencesDialog: Added option to disable caching the point clouds. computeNormals(): added viewpoint parameter. mls(): making sure that all returned normals are normalized. 2016-06-12 17:53:35 -04:00
matlabbe
cb7c76889d API achange (0.11.8): computeNormals returns only pcl::Normal cloud, not pcl::PointNormal or pcl::PointXYZRGBNormal types. MainWindow: Normals are not kept in cache to save RAM. ProgressDialog: check if auto-close is still checked when close() slot is called. 2016-06-12 13:51:49 -04:00
matlabbe
9f296c67b2 GUI: Added more parameters for 3D projection grid map 2016-06-10 20:12:13 -04:00
matlabbe
4a3f490814 Added Reg/Force2D compatibility name for Reg/Force3DoF 2016-06-09 15:49:17 -04:00
matlabbe
cbf348fafa labels can be saved in localization mode 2016-06-08 18:19:51 -04:00
matlabbe
e205883de5 Export: set 0 voxel size by default 2016-06-08 11:53:25 -04:00
matlabbe
ce04336648 fixed cmake warning, removed a .DS_Store from repository 2016-06-04 16:21:00 -04:00
matlabbe
a8bf7e5d5f Fixed Qt5 plugins release. Zed driver: sdded 2 seconds delay before sending grab error. 2016-06-04 15:17:13 -04:00
matlabbe
69e1973544 Update MainWindow.cpp 2016-06-03 15:06:18 -04:00
matlabbe
2f817568e2 MainWindow: Don't show an error if a created cloud is empty 2016-06-02 17:52:22 -04:00
matlabbe
d9611f784c Added ZED parameters 2016-06-02 17:27:12 -04:00
matlabbe
9430bcbf2e Increased ROS package version to 0.11.7 2016-06-01 14:53:00 -04:00
matlabbe
a6f7062f92 Export intern dependencies in RTABMapConfig.cmake 2016-06-01 13:13:30 -04:00
matlabbe
e234717129 Fixed ZED sdk build on Linux (added c++11) 2016-05-31 20:19:04 -04:00
matlabbe
6f1f490370 0.11.7: Added ZED sdk support 2016-05-31 19:09:49 -04:00
matlabbe
b2bb421063 Fixed pcl:OrganizedFastMesh link error for type pcl::PointXYZRGBNormal with PCL 1.8 (issue #75) 2016-05-31 12:23:13 -04:00
matlabbe
be13a9b967 Fixed localization bug when virtual links are added 2016-05-26 17:28:06 -04:00
matlabbe
0fa41d317a Added log msg to tell when switching from Mapping to Localization is finished 2016-05-26 12:51:32 -04:00
matlabbe
a4d36e0212 MainWindow: fixed same bug as previous commit 30fecd412c but on runtime 2016-05-26 12:38:18 -04:00
matlabbe
30fecd412c MainWindow: Fixed clouds shown (and should not) after refreshing map with grid from projection enabled and cloud map visualization unchecked 2016-05-26 12:35:02 -04:00
matlabbe
0d61c12dcd Create map from projection: Removed debug cloud saved 2016-05-26 12:23:44 -04:00
matlabbe
7f2a899c6f Updated default decimation to 4 instead of 8 2016-05-26 12:13:59 -04:00
matlabbe
0bbb773e95 fixed passthrough not using input indices 2016-05-21 16:02:57 -04:00
matlabbe
7aa9c92971 Added util3d::pasthrough returning indices for convenience. segmentObstaclesFromGound(): filtering obstacles under maxGroundHeight if set 2016-05-21 15:54:37 -04:00
Mathieu Labbe
904f4bb4d8 Features2d: updated computeROI() to be more precise 2016-05-21 14:56:25 -04:00
matlabbe
09696195f4 Version 0.11.6 2016-05-20 17:27:03 -04:00
matlabbe
971c96f566 MainWindow projected map: fixed bad occupancy from wrong normals after voxel filtering. util3d::segmentObstaclesFromGround(): added flatObstacles argument. 2016-05-20 17:25:52 -04:00
matlabbe
4fdaa2b708 CloudViewer: fixed numpad color not working -> reverted changes from ad0afc58c0 (diff-d7a550026127f42ccabdb5e42979eeeb) 2016-05-20 16:38:35 -04:00
matlabbe
9f6af75f79 Local scan matching: set larger scan points for max scan points when it is not set. Fixed missing scan Ids in links' user data to correctly visualize proximity links by space in DatabaseViewer. CloudViewer: using line instead of arrow between the referential and the frustum. removed parameter "RGBD/ProximityPathScansMerged" as visual proximity by space already does that. 2016-05-20 11:44:50 -04:00
matlabbe
b29ce28877 CloudViewer: Fixed crash when changing frustum's color 2016-05-19 17:19:11 -04:00
matlabbe
ff7406a755 Memory::computeTransform(): removed setting guess to identity if input guess is null 2016-05-19 17:01:46 -04:00
matlabbe
a8be08a19a Registration: if parent registration fails, continue with the child if the prior guess is not null 2016-05-19 16:11:26 -04:00
matlabbe
1ecaae364c Generalized neighbor link refining using registration done in Memory (can be visual, visual+icp or, icp) 2016-05-19 15:35:30 -04:00
Mathieu Labbe
2637f74094 Added some debug info 2016-05-19 14:31:29 -04:00
Mathieu Labbe
02d944aa67 CalibrationDialog: fixed D not shown properly, add scroll area for small screens 2016-05-19 11:40:48 -04:00
matlabbe
a6bad6d2a5 F2F nonholonomic bad transforms fixed (https://github.com/introlab/rtabmap_ros/issues/74) 2016-05-17 18:10:24 -04:00
matlabbe
0ae131108d CloudViewer: Added local transformation between base frame and camera frame (when they are not the same) 2016-05-17 16:32:21 -04:00
matlabbe
2db6b2ceef segmentObstaclesFromGround: Added epsilon for ground surface inclusion inside maximum and minimum heights 2016-05-16 16:26:16 -04:00
matlabbe
f19c058634 Merge branch 'jade-devel' of https://github.com/introlab/rtabmap into jade-devel 2016-05-14 12:11:10 -04:00
matlabbe
ceb4acd749 Merge branch 'master' of https://github.com/introlab/rtabmap into jade-devel 2016-05-14 12:09:29 -04:00
matlabbe
dde0e26110 Tango: C-API Code Migration to Mira release 2016-05-12 14:34:51 -04:00
matlabbe
b0629d626e Merge branch 'master' of github.com:introlab/rtabmap into jade-devel 2015-10-17 14:16:14 -04:00
matlabbe
ec09d69145 jade package: libfreenect -> libfreenect-dev 2015-08-04 15:52:13 -04:00
matlabbe
8ddbc6bf96 Merge branch 'master' of https://github.com/introlab/rtabmap into jade-devel 2015-05-12 08:37:38 -04:00
matlabbe
b608e50296 Merge branch 'master' of https://github.com/introlab/rtabmap into jade-devel 2015-05-12 08:29:41 -04:00
matlabbe
7fa791992c Jade branch: changed libfreenect to libfreenect-dev ROS dependency (run-depend) 2015-05-10 21:22:59 -04:00
matlabbe
fae21132ee Jade branch: changed libfreenect to libfreenect-dev ROS dependency 2015-05-10 21:13:52 -04:00
404 changed files with 94738 additions and 20895 deletions

107
.appveyor.yml Normal file
View File

@@ -0,0 +1,107 @@
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
- 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 PCL:"
- 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 PCL:"
- 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 PCL:"
- 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 PCL:"
- ps: "ls \"C:/Program Files/Eigen\""
# PCL
- ps: wget 'https://dl.dropboxusercontent.com/s/r9tvi9md54zlul2/PCL-1_8_1-July2018-msvc140.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
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" -DZLIB_ROOT="C:\Program Files\zlib" -DBUILD_AS_BUNDLE=ON ..
after_build :
- cmake --build . --config Release --target package
artifacts:
- path: build\RTABMap-*
notifications:
- provider: Email
to:
- matlabbe@email.com
on_build_success: false
on_build_failure: false
on_build_status_changed: true

3
.gitignore vendored
View File

@@ -1,6 +1,9 @@
/lib
.DS_Store
.settings/language.settings.xml
.idea/
.vscode
cmake-build-debug/
app/android/.classpath
app/android/.project
app/android/AndroidManifest.xml

View File

@@ -1,6 +1,7 @@
sudo: true
dist: trusty
language: cpp
group: deprecated-2017Q3
compiler:
- gcc
@@ -13,17 +14,21 @@ addons:
- libopencv-dev
- libqt4-dev
- libsqlite3-dev
- libyaml-cpp-dev
install:
- 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 -
- sudo apt-get update
- sudo apt-get -y install libpcl-1.7-all libfreenect-dev
- 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
script:
- source /opt/ros/indigo/setup.bash
- mkdir -p build && cd build
- cmake ..
- make
notifications:
email: false
email:
- matlabbe@gmail.com

View File

@@ -6,9 +6,10 @@ SET(PROJECT_PREFIX rtabmap)
# Catkin doesn't support multiarch library path,
# fix to "lib" if not set by user.
#IF(NOT DEFINED CMAKE_INSTALL_LIBDIR)
# set(CMAKE_INSTALL_LIBDIR "lib")
#ENDIF(NOT DEFINED CMAKE_INSTALL_LIBDIR)
OPTION(MULTI_ARCH "Activate multi-arch lib directory (debian)" OFF)
IF(NOT MULTI_ARCH AND NOT DEFINED CMAKE_INSTALL_LIBDIR)
set(CMAKE_INSTALL_LIBDIR "lib")
ENDIF(NOT MULTI_ARCH AND NOT DEFINED CMAKE_INSTALL_LIBDIR)
INCLUDE(GNUInstallDirs)
@@ -19,8 +20,8 @@ SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
# VERSION
#######################
SET(RTABMAP_MAJOR_VERSION 0)
SET(RTABMAP_MINOR_VERSION 11)
SET(RTABMAP_PATCH_VERSION 5)
SET(RTABMAP_MINOR_VERSION 17)
SET(RTABMAP_PATCH_VERSION 6)
SET(RTABMAP_VERSION
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
@@ -45,18 +46,25 @@ IF(NOT ANDROID)
ENDIF(NOT ANDROID)
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")
ELSE ()
ADD_DEFINITIONS( "-Wall" )
ADD_DEFINITIONS("-Wno-unknown-pragmas")
ADD_DEFINITIONS( "-Wall" )
ADD_DEFINITIONS("-Wno-unknown-pragmas")
ENDIF()
if(POLICY CMP0020)
cmake_policy(SET CMP0020 OLD)
endif()
if(POLICY CMP0043)
cmake_policy(SET CMP0043 OLD)
endif()
IF(MINGW)
# Hide the --enable-auto-import warning
SET(CMAKE_EXE_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_EXE_LINKER_FLAGS "-Wl,--enable-auto-import")
SET(CMAKE_MODULE_LINKER_FLAGS "-Wl,--enable-auto-import")
SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--enable-auto-import")
ENDIF(MINGW)
# GCC 4 required
@@ -105,29 +113,40 @@ SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
####### INSTALL DIR #######
set(INSTALL_INCLUDE_DIR include/${PROJECT_PREFIX}-${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION} CACHE PATH
"Installation directory for header files")
set(INSTALL_INCLUDE_DIR include/${PROJECT_PREFIX}-${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION})
if(WIN32 AND NOT CYGWIN)
set(DEF_INSTALL_CMAKE_DIR CMake)
else()
set(DEF_INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/${PROJECT_PREFIX}-${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION})
endif()
set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
"Installation directory for CMake files")
set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR})
####### BUILD OPTIONS #######
IF(APPLE)
OPTION(BUILD_AS_BUNDLE "Set to ON to build as bundle (DragNDrop)" OFF)
ENDIF(APPLE)
# ANDROID_PREBUILD (early exit if true)
OPTION( ANDROID_PREBUILD "Set to ON to build rtabmap resource build tool (required for android build)" OFF )
IF(ANDROID_PREBUILD)
MESSAGE("Option ANDROID_PREBUILD is set, only rtabmap resource tool will be built. You can use android toolchain after that.")
ADD_SUBDIRECTORY( utilite )
return()
ENDIF(ANDROID_PREBUILD)
IF(APPLE 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_TOOLS "Build tools" ON)
OPTION(BUILD_EXAMPLES "Build examples" ON)
####### DEPENDENCIES #######
IF(ANDROID)
option(WITH_QT "Include Qt support" OFF)
ELSE()
option(WITH_QT "Include Qt support" ON)
ENDIF()
option(WITH_FREENECT "Include Freenect 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_DC1394 "Include dc1394 support" ON)
option(WITH_G2O "Include g2o support" ON)
@@ -135,14 +154,46 @@ option(WITH_GTSAM "Include GTSAM support" ON)
option(WITH_TORO "Include TORO support" ON)
option(WITH_VERTIGO "Include Vertigo 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_ZED "Include ZED sdk support" ON)
option(WITH_REALSENSE "Include RealSense 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_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(PCL_OMP "With PCL OMP implementations" ON)
FIND_PACKAGE(OpenCV REQUIRED QUIET)
FIND_PACKAGE(PCL 1.7 REQUIRED QUIET)
IF(WITH_QT)
FIND_PACKAGE(PCL 1.7 REQUIRED QUIET COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization)
ELSE()
FIND_PACKAGE(PCL 1.7 REQUIRED QUIET COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation )
ENDIF()
if("${PCL_DEFINITIONS}" MATCHES "-march=native")
MESSAGE(WARNING "PCL definitions contain \"-march=native\", make sure all libraries using Eigen are also compiled with that flag to avoid some segmentation faults (with gdb referring to some Eigen functions).")
else()
MESSAGE(STATUS "PCL definitions don't contain \"-march=native\", make sure all libraries using Eigen are also compiled without that flag to avoid some segmentation faults (with gdb referring to some Eigen functions).")
endif()
FIND_PACKAGE(ZLIB REQUIRED QUIET)
# 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 "")
# fix libproj.so not found on Xenial
list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4")
endif()
@@ -155,6 +206,9 @@ if(OPENMP_FOUND)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
message (STATUS "Found OpenMP")
if(PCL_OMP)
add_definitions(-DPCL_OMP)
endif(PCL_OMP)
else(OPENMP_FOUND)
message (STATUS "Not found OpenMP")
endif()
@@ -169,6 +223,7 @@ IF(ZLIB_FOUND)
MESSAGE(STATUS "Found ZLIB: ${ZLIB_INCLUDE_DIRS}")
ENDIF(ZLIB_FOUND)
SET(ADD_VTK_GUI_SUPPORT_QT_TO_CONF FALSE)
IF(WITH_QT)
FIND_PACKAGE(VTK)
IF(NOT VTK_FOUND)
@@ -178,17 +233,31 @@ IF(WITH_QT)
# If Qt is here, the GUI will be built
# look for Qt5 (if vtk>5 is installed) before Qt4
IF("${VTK_MAJOR_VERSION}" GREATER 5)
FIND_PACKAGE(Qt5 COMPONENTS Widgets Core Gui Svg QUIET)
FIND_PACKAGE(Qt5 COMPONENTS Widgets Core Gui QUIET)
IF(Qt5_FOUND)
FIND_PACKAGE(Qt5 COMPONENTS Widgets Core Gui OPTIONAL_COMPONENTS Svg)
ENDIF(Qt5_FOUND)
ENDIF("${VTK_MAJOR_VERSION}" GREATER 5)
IF(NOT Qt5_FOUND)
FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui QtSvg)
FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui OPTIONAL_COMPONENTS QtSvg)
ENDIF(NOT Qt5_FOUND)
IF(QT4_FOUND OR Qt5_FOUND)
IF("${VTK_MAJOR_VERSION}" EQUAL 5)
FIND_PACKAGE(QVTK REQUIRED) # only for VTK 5
ENDIF("${VTK_MAJOR_VERSION}" EQUAL 5)
ELSE()
list(FIND PCL_LIBRARIES vtkGUISupportQt value)
IF(value EQUAL -1)
SET(PCL_LIBRARIES "${PCL_LIBRARIES};vtkGUISupportQt")
SET(ADD_VTK_GUI_SUPPORT_QT_TO_CONF TRUE)
ENDIF(value EQUAL -1)
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()
ADD_DEFINITIONS(-DQT_NO_KEYWORDS) # To avoid conflicts with boost signals/foreach and Qt macros
ENDIF(QT4_FOUND OR Qt5_FOUND)
ENDIF(WITH_QT)
@@ -202,13 +271,28 @@ ENDIF(WITH_FREENECT)
IF(WITH_FREENECT2)
FIND_PACKAGE(freenect2 QUIET)
IF(freenect2_FOUND)
IF(NOT freenect2_INCLUDE_DIRS)
SET(freenect2_INCLUDE_DIRS ${freenect2_INCLUDE_DIR})
ENDIF(NOT freenect2_INCLUDE_DIRS)
IF(NOT freenect2_INCLUDE_DIRS)
SET(freenect2_INCLUDE_DIRS ${freenect2_INCLUDE_DIR})
ENDIF(NOT freenect2_INCLUDE_DIRS)
MESSAGE(STATUS "Found freenect2: ${freenect2_INCLUDE_DIRS}")
# Explicitly link to OpenCL (in case of CUDA installed)
FIND_PACKAGE(OpenCL QUIET)
IF(OpenCL_FOUND)
SET(freenect2_LIBRARIES
${OpenCL_LIBRARIES}
${freenect2_LIBRARIES}
)
ENDIF(OpenCL_FOUND)
ENDIF(freenect2_FOUND)
ENDIF(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(WITH_OPENNI2 OR OpenNI2_FOUND)
FIND_PACKAGE(OpenNI2 QUIET)
@@ -235,22 +319,6 @@ IF(WITH_GTSAM)
FIND_PACKAGE(GTSAM QUIET)
ENDIF(WITH_GTSAM)
IF(G2O_FOUND OR GTSAM_FOUND)
#Newest versions require std11
IF(NOT MSVC)
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
IF(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
ELSEIF(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
ELSE()
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler if you want to use g2o or gtsam (set \"-DWITH_G2O=OFF -DWITH_GTSAM=OFF\" to build without g2o and gtsam).")
ENDIF()
ENDIF()
ENDIF(G2O_FOUND OR GTSAM_FOUND)
IF(WITH_FLYCAPTURE2)
FIND_PACKAGE(FlyCapture2 QUIET)
IF(FlyCapture2_FOUND)
@@ -265,6 +333,184 @@ IF(WITH_CVSBA)
ENDIF(cvsba_FOUND)
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(WIN32) # Windows
SET(ZED_INCLUDE_DIRS $ENV{ZED_INCLUDE_DIRS})
if (CMAKE_CL_64) # 64 bits
SET(ZED_LIBRARIES $ENV{ZED_LIBRARIES_64})
else(CMAKE_CL_64) # 32 bits
message("32bits compilation is no more available with CUDA7.0")
endif(CMAKE_CL_64)
SET(ZED_LIBRARY_DIR $ENV{ZED_LIBRARY_DIR})
IF(ZED_LIBRARIES AND ZED_INCLUDE_DIRS)
SET(ZED_FOUND TRUE)
LINK_DIRECTORIES( ${LINK_DIRECTORIES} ${ZED_LIBRARY_DIR})
ENDIF(ZED_LIBRARIES AND ZED_INCLUDE_DIRS)
ELSE() # Linux
find_package(ZED 2 QUIET)
ENDIF(WIN32)
IF(ZED_FOUND)
MESSAGE(STATUS "Found ZED sdk: ${ZED_INCLUDE_DIRS}")
## look for CUDA
find_package(CUDA)
IF(CUDA_FOUND)
MESSAGE(STATUS "Found CUDA: ${CUDA_INCLUDE_DIRS}")
ELSE()
MESSAGE(FATAL_ERROR "CUDA is required to build with Zed sdk! Set -DWITH_ZED=OFF if you don't have CUDA.")
ENDIF()
ENDIF(ZED_FOUND)
ENDIF(WITH_ZED)
IF(WITH_REALSENSE)
IF(WITH_REALSENSE_SLAM)
FIND_PACKAGE(RealSense QUIET COMPONENTS slam)
ELSE()
FIND_PACKAGE(RealSense QUIET)
ENDIF()
IF(RealSense_FOUND)
MESSAGE(STATUS "Found RealSense: ${RealSense_INCLUDE_DIRS}")
ENDIF(RealSense_FOUND)
IF(RealSenseSlam_FOUND)
MESSAGE(STATUS "Found RealSenseSlam: ${RealSense_INCLUDE_DIRS}")
ENDIF(RealSenseSlam_FOUND)
ENDIF(WITH_REALSENSE)
IF(WITH_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)
FIND_PACKAGE(OCTOMAP QUIET)
IF(OCTOMAP_FOUND)
MESSAGE(STATUS "Found octomap ${OCTOMAP_VERSION}: ${OCTOMAP_INCLUDE_DIRS}")
IF(OCTOMAP_VERSION VERSION_LESS 1.8)
ADD_DEFINITIONS("-DOCTOMAP_PRE_18")
ENDIF(OCTOMAP_VERSION VERSION_LESS 1.8)
ENDIF(OCTOMAP_FOUND)
ENDIF(WITH_OCTOMAP)
IF(WITH_CPUTSDF)
FIND_PACKAGE(CPUTSDF QUIET)
IF(CPUTSDF_FOUND)
MESSAGE(STATUS "Found CPUTSDF: ${CPUTSDF_INCLUDE_DIRS}")
ENDIF(CPUTSDF_FOUND)
ENDIF(WITH_CPUTSDF)
IF(WITH_OPENCHISEL)
find_package(open_chisel QUIET)
if(open_chisel_FOUND)
MESSAGE(STATUS "Found open_chisel: ${open_chisel_INCLUDE_DIRS}")
endif(open_chisel_FOUND)
ENDIF(WITH_OPENCHISEL)
IF(WITH_FOVIS)
FIND_PACKAGE(libfovis QUIET)
IF(libfovis_FOUND)
MESSAGE(STATUS "Found libfovis: ${libfovis_INCLUDE_DIRS}")
ENDIF(libfovis_FOUND)
ENDIF(WITH_FOVIS)
IF(WITH_VISO2)
FIND_PACKAGE(libviso2 QUIET)
IF(libviso2_FOUND)
MESSAGE(STATUS "Found libviso2: ${libviso2_INCLUDE_DIRS}")
ENDIF(libviso2_FOUND)
ENDIF(WITH_VISO2)
IF(WITH_DVO)
FIND_PACKAGE(dvo_core QUIET)
IF(dvo_core_FOUND)
MESSAGE(STATUS "Found dvo_core: ${dvo_core_INCLUDE_DIRS}")
ENDIF(dvo_core_FOUND)
ENDIF(WITH_DVO)
IF(WITH_OKVIS)
FIND_PACKAGE(okvis 1.1 QUIET)
IF(okvis_FOUND)
MESSAGE(STATUS "Found okvis: ${OKVIS_INCLUDE_DIRS}")
find_package(brisk 2 REQUIRED)
MESSAGE(STATUS "Found brisk: ${BRISK_INCLUDE_DIRS}")
find_package(opengv REQUIRED)
MESSAGE(STATUS "Found opengv: ${OPENGV_INCLUDE_DIRS}")
find_package(Ceres REQUIRED CONFIG PATHS ${OKVIS_CERES_CONFIG} NO_DEFAULT_PATH)
MESSAGE(STATUS "Found ceres: ${CERES_INCLUDE_DIRS}")
ENDIF(okvis_FOUND)
ENDIF(WITH_OKVIS)
IF(WITH_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_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)
#Newest versions require std11
IF(NOT MSVC)
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
IF(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
ELSEIF(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
ELSE()
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
ENDIF()
ENDIF()
ENDIF()
####### OSX BUNDLE CMAKE_INSTALL_PREFIX #######
IF(APPLE AND BUILD_AS_BUNDLE)
IF(Qt5_FOUND OR (QT4_FOUND AND QT_QTCORE_FOUND AND QT_QTGUI_FOUND))
@@ -294,15 +540,27 @@ ENDIF(APPLE AND BUILD_AS_BUNDLE)
####### SOURCES (Projects) #######
# CONF_DEPENDENCIES contains only dependencies not required by the headers
SET(CONF_DEPENDENCIES
${ZLIB_LIBRARIES}
)
IF(NOT (OPENCV_NONFREE_FOUND OR OPENCV_XFEATURES2D_FOUND))
SET(NONFREE "//")
ENDIF(NOT (OPENCV_NONFREE_FOUND OR OPENCV_XFEATURES2D_FOUND))
IF(NOT G2O_FOUND)
SET(G2O "//")
ENDIF(NOT G2O_FOUND)
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${G2O_LIBRARIES})
IF(NOT G2O_CPP11)
SET(G2O_CPP_CONF "//")
ENDIF(NOT G2O_CPP11)
ENDIF()
IF(NOT GTSAM_FOUND)
SET(GTSAM "//")
ENDIF(NOT GTSAM_FOUND)
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${GTSAM_LIBRARIES})
ENDIF()
IF(NOT WITH_TORO)
SET(TORO "//")
ENDIF(NOT WITH_TORO)
@@ -311,25 +569,121 @@ IF(NOT WITH_VERTIGO)
ENDIF(NOT WITH_VERTIGO)
IF(NOT cvsba_FOUND)
SET(CVSBA "//")
ENDIF(NOT cvsba_FOUND)
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${cvsba_LIBRARIES})
ENDIF()
IF(NOT libpointmatcher_FOUND)
SET(POINTMATCHER "//")
ENDIF(NOT libpointmatcher_FOUND)
IF(NOT loam_velodyne_FOUND)
SET(LOAM "//")
ENDIF(NOT loam_velodyne_FOUND)
IF(NOT Freenect_FOUND)
SET(FREENECT "//")
ENDIF(NOT Freenect_FOUND)
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${Freenect_LIBRARIES})
ENDIF()
IF(NOT freenect2_FOUND)
SET(FREENECT2 "//")
ENDIF(NOT freenect2_FOUND)
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${freenect2_LIBRARIES})
ENDIF()
IF(NOT KinectSDK2_FOUND)
SET(K4W2 "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${KinectSDK2_LIBRARIES})
ENDIF()
IF(NOT OpenNI2_FOUND)
SET(OPENNI2 "//")
ENDIF(NOT OpenNI2_FOUND)
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${OpenNI2_LIBRARIES})
ENDIF()
IF(NOT DC1394_FOUND)
SET(DC1394 "//")
ENDIF(NOT DC1394_FOUND)
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${DC1394_LIBRARIES})
ENDIF()
IF(NOT FlyCapture2_FOUND)
SET(FLYCAPTURE2 "//")
ENDIF(NOT FlyCapture2_FOUND)
IF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${FlyCapture2_LIBRARIES})
ENDIF()
IF(NOT ZED_FOUND)
SET(ZED "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${ZED_LIBRARIES} ${CUDA_LIBRARIES})
ENDIF()
IF(NOT RealSense_FOUND)
SET(REALSENSE "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${RealSense_LIBRARIES})
ENDIF()
IF(NOT RealSenseSlam_FOUND)
SET(REALSENSESLAM "//")
ENDIF(NOT RealSenseSlam_FOUND)
IF(NOT realsense2_FOUND)
SET(REALSENSE2 "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${realsense2_LIBRARIES})
ENDIF()
IF(NOT OCTOMAP_FOUND)
SET(OCTOMAP "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${OCTOMAP_LIBRARIES})
ENDIF()
IF(NOT CPUTSDF_FOUND)
SET(CPUTSDF "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${CPUTSDF_LIBRARIES})
ENDIF()
IF(NOT open_chisel_FOUND)
SET(OPENCHISEL "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${open_chisel_LIBRARIES})
ENDIF()
IF(NOT libfovis_FOUND)
SET(FOVIS "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${libfovis_LIBRARIES})
ENDIF()
IF(NOT libviso2_FOUND)
SET(VISO2 "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${libviso2_LIBRARIES})
ENDIF()
IF(NOT dvo_core_FOUND)
SET(DVO "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${dvo_core_LIBRARIES})
ENDIF()
IF(NOT okvis_FOUND)
SET(OKVIS "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${OKVIS_LIBRARIES})
ENDIF()
IF(NOT msckf_vio_FOUND)
SET(MSCKF_VIO "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${msckf_vio_LIBRARIES})
ENDIF()
IF(NOT ORB_SLAM2_FOUND)
SET(ORB_SLAM2 "//")
ELSE()
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${ORB_SLAM2_LIBRARIES})
ENDIF()
IF(ADD_VTK_GUI_SUPPORT_QT_TO_CONF)
SET(CONF_VTK_QT true)
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} vtkGUISupportQt)
ELSE()
SET(CONF_VTK_QT false)
ENDIF()
IF(VTK_USE_QVTK)
SET(CONF_DEPENDENCIES ${CONF_DEPENDENCIES} ${QVTK_LIBRARY})
ENDIF(VTK_USE_QVTK)
IF(NOT (OpenCV_FOUND AND NOT (OpenCV_VERSION_MAJOR LESS 3)))
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)
ADD_SUBDIRECTORY( utilite )
@@ -375,8 +729,8 @@ file(RELATIVE_PATH REL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/${INSTALL_CMAKE_DIR}" "$
# ... for the build tree
set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/corelib/include"
"${PROJECT_SOURCE_DIR}/guilib/include"
"${PROJECT_SOURCE_DIR}/utilite/include")
"${PROJECT_SOURCE_DIR}/guilib/include"
"${PROJECT_SOURCE_DIR}/utilite/include")
set(CONF_LIB_DIR "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
IF(QT4_FOUND OR Qt5_FOUND)
set(CONF_WITH_GUI ON)
@@ -449,7 +803,11 @@ IF(WIN32)
ELSE()
SET(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES")
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_NSIS_PACKAGE_NAME "${PROJECT_NAME}")
SET(ICON_PATH "${PROJECT_SOURCE_DIR}/app/src/${PROJECT_NAME}.ico")
@@ -501,30 +859,38 @@ MESSAGE(STATUS " BUILD_APP = ${BUILD_APP}")
MESSAGE(STATUS " BUILD_TOOLS = ${BUILD_TOOLS}")
MESSAGE(STATUS " BUILD_EXAMPLES = ${BUILD_EXAMPLES}")
IF(NOT WIN32)
# see comment above for the BUILD_SHARED_LIBS option on Windows
MESSAGE(STATUS " BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}")
# see comment above for the BUILD_SHARED_LIBS option on Windows
MESSAGE(STATUS " BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}")
ENDIF(NOT WIN32)
IF(APPLE)
IF(APPLE OR WIN32)
MESSAGE(STATUS " BUILD_AS_BUNDLE = ${BUILD_AS_BUNDLE}")
ENDIF(APPLE)
ENDIF(APPLE OR WIN32)
MESSAGE(STATUS " CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
MESSAGE(STATUS " PCL_DEFINITIONS = ${PCL_DEFINITIONS}")
MESSAGE(STATUS "Optional dependencies ('*' affects some default parameters) :")
IF(OpenCV_FOUND)
IF(OpenCV_VERSION_MAJOR EQUAL 2)
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()
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()
ELSE()
IF(OPENCV_XFEATURES2D_FOUND)
MESSAGE(STATUS " With OpenCV 3 xfeatures2d module (SIFT/SURF/BRIEF/FREAK) = YES (License: Non commercial)")
MESSAGE(STATUS " *With OpenCV 3 xfeatures2d module (SIFT/SURF/BRIEF/FREAK) = YES (License: Non commercial)")
ELSE()
MESSAGE(STATUS " With OpenCV 3 xfeatures2d module (SIFT/SURF/BRIEF/FREAK) = NO (not found, License: BSD)")
MESSAGE(STATUS " *With OpenCV 3 xfeatures2d module (SIFT/SURF/BRIEF/FREAK) = NO (not found, License: BSD)")
ENDIF()
ENDIF()
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(Freenect_FOUND)
MESSAGE(STATUS " With Freenect = YES (License: Apache v2 and/or GPLv2)")
ELSEIF(NOT WITH_FREENECT)
@@ -549,6 +915,14 @@ ELSE()
MESSAGE(STATUS " With Freenect2 = NO (libfreenect2 not found)")
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)
MESSAGE(STATUS " With dc1394 = YES (License: LGPL)")
ELSEIF(NOT WITH_DC1394)
@@ -572,26 +946,30 @@ MESSAGE(STATUS " With TORO = NO (WITH_TORO=OFF)")
ENDIF()
IF(G2O_FOUND)
MESSAGE(STATUS " With g2o = YES (License: BSD)")
MESSAGE(STATUS " *With g2o = YES (License: BSD)")
ELSEIF(NOT WITH_G2O)
MESSAGE(STATUS " With g2o = NO (WITH_G2O=OFF)")
MESSAGE(STATUS " *With g2o = NO (WITH_G2O=OFF)")
ELSE()
MESSAGE(STATUS " With g2o = NO (g2o not found)")
MESSAGE(STATUS " *With g2o = NO (g2o not found)")
ENDIF()
IF(GTSAM_FOUND)
MESSAGE(STATUS " With GTSAM = YES (License: BSD)")
MESSAGE(STATUS " *With GTSAM = YES (License: BSD)")
ELSEIF(NOT WITH_GTSAM)
MESSAGE(STATUS " With GTSAM = NO (WITH_GTSAM=OFF)")
MESSAGE(STATUS " *With GTSAM = NO (WITH_GTSAM=OFF)")
ELSE()
MESSAGE(STATUS " With GTSAM = NO (GTSAM not found)")
MESSAGE(STATUS " *With GTSAM = NO (GTSAM not found)")
ENDIF()
IF(G2O_FOUND OR GTSAM_FOUND)
IF(WITH_VERTIGO)
MESSAGE(STATUS " With VERTIGO = YES (License: GPLv3)")
ELSE()
MESSAGE(STATUS " With VERTIGO = NO (WITH_VERTIGO=OFF)")
ENDIF()
ELSE()
MESSAGE(STATUS " With VERTIGO = NO (GTSAM or g2o required)")
ENDIF()
IF(cvsba_FOUND)
MESSAGE(STATUS " With cvsba = YES (License: GPLv2)")
@@ -601,6 +979,131 @@ ELSE()
MESSAGE(STATUS " With cvsba = NO (cvsba not found)")
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(CUDA_FOUND)
MESSAGE(STATUS " With ZED = YES (With CUDA)")
ELSE()
MESSAGE(STATUS " With ZED = YES (Without CUDA)")
ENDIF()
ELSEIF(NOT WITH_ZED)
MESSAGE(STATUS " With ZED = NO (WITH_ZED=OFF)")
ELSE()
MESSAGE(STATUS " With ZED = NO (ZED sdk not found)")
ENDIF()
IF(RealSense_FOUND)
MESSAGE(STATUS " With RealSense = YES (License: Apache-2)")
IF(RealSenseSlam_FOUND)
MESSAGE(STATUS " With RealSenseSlam = YES")
ELSEIF(NOT WITH_REALSENSE)
MESSAGE(STATUS " With RealSenseSlam = NO (librealsense_slam not found)")
ELSE()
MESSAGE(STATUS " With RealSenseSlam = NO (WITH_REALSENSE_SLAM=OFF)")
ENDIF()
ELSEIF(NOT WITH_REALSENSE)
MESSAGE(STATUS " With RealSense = NO (WITH_REALSENSE=OFF)")
ELSE()
MESSAGE(STATUS " With RealSense = NO (librealsense not found)")
ENDIF()
IF(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)
MESSAGE(STATUS " With OCTOMAP = YES (License: BSD)")
ELSEIF(NOT WITH_OCTOMAP)
MESSAGE(STATUS " With OCTOMAP = NO (WITH_OCTOMAP=OFF)")
ELSE()
MESSAGE(STATUS " With OCTOMAP = NO (octomap not found)")
ENDIF()
IF(CPUTSDF_FOUND)
MESSAGE(STATUS " With CPUTSDF = YES (License: BSD)")
ELSEIF(NOT WITH_CPUTSDF)
MESSAGE(STATUS " With CPUTSDF = NO (WITH_CPUTSDF=OFF)")
ELSE()
MESSAGE(STATUS " With CPUTSDF = NO (CPUTSDF not found)")
ENDIF()
IF(open_chisel_FOUND)
MESSAGE(STATUS " With OpenChisel = YES (License: ???)")
ELSEIF(NOT WITH_OPENCHISEL)
MESSAGE(STATUS " With OpenChisel = NO (WITH_OPENCHISEL=OFF)")
ELSE()
MESSAGE(STATUS " With OpenChisel = NO (open_chisel not found)")
ENDIF()
IF(libfovis_FOUND)
MESSAGE(STATUS " With libfovis = YES (License: GPLv2)")
ELSEIF(NOT WITH_FOVIS)
MESSAGE(STATUS " With libfovis = NO (WITH_FOVIS=OFF)")
ELSE()
MESSAGE(STATUS " With libfovis = NO (libfovis not found)")
ENDIF()
IF(libviso2_FOUND)
MESSAGE(STATUS " With libviso2 = YES (License: GPLv3)")
ELSEIF(NOT WITH_VISO2)
MESSAGE(STATUS " With libviso2 = NO (WITH_VISO2=OFF)")
ELSE()
MESSAGE(STATUS " With libviso2 = NO (libviso2 not found)")
ENDIF()
IF(dvo_core_FOUND)
MESSAGE(STATUS " With dvo_core = YES (License: GPLv3)")
ELSEIF(NOT WITH_DVO)
MESSAGE(STATUS " With dvo_core = NO (WITH_DVO=OFF)")
ELSE()
MESSAGE(STATUS " With dvo_core = NO (dvo_core not found)")
ENDIF()
IF(okvis_FOUND)
MESSAGE(STATUS " With okvis = YES (License: BSD)")
ELSEIF(NOT WITH_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(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)
MESSAGE(STATUS " With Qt4 = YES (License: Open Source or Commercial)")
ELSEIF(Qt5_FOUND)
@@ -619,3 +1122,5 @@ MESSAGE(SEND_ERROR "No graph optimizer found! You should have at least one of th
GTSAM (https://collab.cc.gatech.edu/borg/gtsam)
set -DWITH_TORO=ON")
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 :

View File

@@ -1,4 +1,4 @@
Copyright (c) 2010-2015, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@@ -106,14 +106,14 @@ else
end
ylabel('Time (s)')
xlabel('Node indexes')
meanTime = mean(LogF(:,1))*1000
meanTimeMS = mean(LogF(:,1))*1000
plot([1 length(LogF(:,1))], [0.7 0.7], 'r')
plot([1 length(LogF(:,1))], [1 1], 'k')
%plot([1 length(LogF(:,1))], [350 350], 'r')
%legend('Processing time', 'Time limit')%, 'Acquisition rate (1 Hz)')
%title('Processing time')
maxTime = max(sum(LogF(:,2:7),2)+LogF(:,17))
maxTimeMS = max(sum(LogF(:,2:7),2)+LogF(:,17))*1000
maxDict = max(LogI(:, 6))
maxWM = max(LogI(:,7))
%%

View File

@@ -1,10 +1,20 @@
rtabmap [![Build Status](https://travis-ci.org/introlab/rtabmap.svg?branch=master)](https://travis-ci.org/introlab/rtabmap)
rtabmap ![Analytics](https://ga-beacon.appspot.com/UA-56986679-3/github-main?pixel)
=======
[![RTAB-Map Logo](https://raw.githubusercontent.com/introlab/rtabmap/master/guilib/src/images/RTAB-Map100.png)](http://introlab.github.io/rtabmap)
[![Release][release-image]][releases]
[![License][license-image]][license]
Linux: [![Build Status](https://travis-ci.org/introlab/rtabmap.svg?branch=master)](https://travis-ci.org/introlab/rtabmap) Windows: [![Build status](https://ci.appveyor.com/api/projects/status/hr73xspix9oqa26h/branch/master?svg=true)](https://ci.appveyor.com/project/matlabbe/rtabmap/branch/master)
[release-image]: https://img.shields.io/badge/release-0.16.3-green.svg?style=flat
[releases]: https://github.com/introlab/rtabmap/releases
[license-image]: https://img.shields.io/badge/license-BSD-green.svg?style=flat
[license]: https://github.com/introlab/rtabmap/blob/master/LICENSE
RTAB-Map library and standalone application.
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.

View File

@@ -1,4 +1,8 @@
# - Config file for the RTABMap package
# Components:
# core (required)
# gui (optional)
# utilite (required)
# It defines the following variables
# RTABMap_INCLUDE_DIRS - include directories for RTABMap
# RTABMap_LIBRARIES - libraries to link against
@@ -42,8 +46,18 @@ ENDIF()
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)
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_DEBUG NAMES rtabmap_guid NO_DEFAULT_PATH HINTS @CONF_LIB_DIR@)
@@ -59,7 +73,15 @@ if(@CONF_WITH_GUI@)
ENDIF()
set(RTABMap_LIBRARIES ${RTABMap_LIBRARIES} ${RTABMap_GUI})
endif(@CONF_WITH_GUI@)
elseif(${WITH_GUI})
MESSAGE(ERROR "Asked for \"gui\" module but RTABMap hasn't been built with gui support.")
endif()
# Dependencies
if(@CONF_VTK_QT@ AND ${WITH_GUI})
find_package(VTK COMPONENTS vtkGUISupportQt NO_MODULE) # to define vtkGUISupportQt target
endif(@CONF_VTK_QT@ AND ${WITH_GUI})
SET(RTABMap_LIBRARIES ${RTABMap_LIBRARIES} "@CONF_DEPENDENCIES@")
#backward compatibilities
set(RTABMAP_CORE ${RTABMap_CORE})
@@ -68,3 +90,7 @@ if(RTABMap_GUI)
set(RTABMAP_GUI ${RTABMap_GUI})
set(RTABMAP_QT_VERSION @CONF_QT_VERSION@)
endif(RTABMap_GUI)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(RTABMap DEFAULT_MSG RTABMap_LIBRARIES RTABMap_INCLUDE_DIRS)
mark_as_advanced(RTABMap_LIBRARIES RTABMap_INCLUDE_DIRS RTABMap_LIBRARY_DIRS)

View File

@@ -40,15 +40,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@NONFREE@#define RTABMAP_NONFREE
@TORO@#define RTABMAP_TORO
@G2O@#define RTABMAP_G2O
@G2O_CPP_CONF@#define RTABMAP_G2O_CPP11
@GTSAM@#define RTABMAP_GTSAM
@VERTIGO@#define RTABMAP_VERTIGO
@OPENCV3@#define RTABMAP_OPENCV3
@OPENNI2@#define RTABMAP_OPENNI2
@FREENECT@#define RTABMAP_FREENECT
@FREENECT2@#define RTABMAP_FREENECT2
@K4W2@#define RTABMAP_K4W2
@CVSBA@#define RTABMAP_CVSBA
@POINTMATCHER@#define RTABMAP_POINTMATCHER
@LOAM@#define RTABMAP_LOAM
@DC1394@#define RTABMAP_DC1394
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
@ZED@#define RTABMAP_ZED
@REALSENSE@#define RTABMAP_REALSENSE
@REALSENSESLAM@#define RTABMAP_REALSENSE_SLAM
@REALSENSE2@#define RTABMAP_REALSENSE2
@OCTOMAP@#define RTABMAP_OCTOMAP
@CPUTSDF@#define RTABMAP_CPUTSDF
@OPENCHISEL@#define RTABMAP_OPENCHISEL
@FOVIS@#define RTABMAP_FOVIS
@VISO2@#define RTABMAP_VISO2
@DVO@#define RTABMAP_DVO
@OKVIS@#define RTABMAP_OKVIS
@MSCKF_VIO@#define RTABMAP_MSCKF_VIO
@ORB_SLAM2@#define RTABMAP_ORB_SLAM2
#endif /* VERSION_H_ */

BIN
app/.DS_Store vendored

Binary file not shown.

1
app/android/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/bin/

View File

@@ -2,7 +2,7 @@
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.introlab.rtabmap"
android:versionCode="8"
android:versionCode="70"
android:versionName="@RTABMAP_VERSION@">
<uses-permission android:name="android.permission.CAMERA" />
@@ -10,23 +10,31 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-feature android:glEsVersion="0x00020000" />
<uses-library android:name="com.projecttango.libtango_device" android:required="true" />
<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="17" />
<uses-sdk android:minSdkVersion="19" />
<!-- This .apk has no Java code itself, so set hasCode to false. -->
<application
android:label="@string/app_name"
android:icon="@drawable/ic_launcher">
android:icon="@drawable/ic_launcher"
android:debuggable="@ANDROID_DEBUGGABLE@">
<uses-library android:name="com.projecttango.libtango_device2" android:required="true" />
<!-- Our activity is the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity android:name="RTABMapActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="nosensor">
android:screenOrientation="fullSensor"
android:configChanges="orientation|screenSize|keyboardHidden"
android:theme="@style/ThemeApp">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name"
android:value="NativeRTABMap" />
@@ -35,6 +43,9 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="SettingsActivity" android:label="@string/settings" android:screenOrientation="fullSensor"/>
<activity android:name="SketchfabActivity" android:label="@string/sketchfab" android:screenOrientation="fullSensor"/>
</application>
</manifest>

View File

@@ -1,4 +1,17 @@
option(DISABLE_LOG "Disable Android logging (should be true in release)" ON)
IF(DISABLE_LOG)
ADD_DEFINITIONS(-DDISABLE_LOG)
ENDIF(DISABLE_LOG)
MESSAGE(STATUS "DISABLE_LOG = ${DISABLE_LOG}")
IF(DISABLE_LOG)
SET(ANDROID_DEBUGGABLE false)
ELSE()
SET(ANDROID_DEBUGGABLE true)
ENDIF()
add_subdirectory(jni)
@@ -32,6 +45,11 @@ configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/ant.properties.in"
"${CMAKE_CURRENT_BINARY_DIR}/ant.properties"
@ONLY)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/custom_rules.xml"
"${CMAKE_CURRENT_BINARY_DIR}/custom_rules.xml"
COPYONLY)
add_custom_target(NativeRTABMap-ant-configure ALL
COMMAND "${ANDROID_EXECUTABLE}"

View File

@@ -1,5 +1,6 @@
builddir=@CMAKE_CURRENT_BINARY_DIR@
srcdir=@CMAKE_CURRENT_SOURCE_DIR@
android.abi=@ANDROID_ABI@
source.dir=${srcdir}/src
gen.dir=${builddir}/gen

View File

@@ -0,0 +1,13 @@
<project>
<target name="-pre-build">
<copy todir="${jar.libs.dir}">
<fileset dir="${srcdir}/libs" includes="**/*.jar" excludes="**/*sources.jar, **/*javadoc.jar" />
</copy>
<copy todir="${native.libs.dir}/${android.abi}">
<fileset dir="${srcdir}/jni/third-party/lib" includes="*.so"/>
</copy>
<copy todir="${native.libs.dir}">
<fileset dir="${srcdir}/jni/third-party/lib" includes="${android.abi}/*.so"/>
</copy>
</target>
</project>

View File

@@ -1,8 +1,7 @@
<h3>Real-Time Appearance-Based Mapping</h3>
Version @RTABMAP_VERSION@<br>
Author: Mathieu Labb&eacute;<br>
Copyright 2016<br>
Copyright 2016-2017<br>
IntRoLab - Universit&eacute; de Sherbrooke<br>
<b>http://introlab.github.io/rtabmap</b><br><br>

File diff suppressed because it is too large Load Diff

View File

@@ -29,12 +29,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define CAMERATANGO_H_
#include <rtabmap/core/Camera.h>
#include <rtabmap/core/GeodeticCoords.h>
#include <rtabmap/utilite/UMutex.h>
#include <rtabmap/utilite/USemaphore.h>
#include <rtabmap/utilite/UEventsSender.h>
#include <rtabmap/utilite/UThread.h>
#include <rtabmap/utilite/UEvent.h>
#include <rtabmap/utilite/UTimer.h>
#include <boost/thread/mutex.hpp>
#include <tango_support_api.h>
class TangoPoseData;
@@ -69,16 +72,26 @@ private:
class CameraTango : public Camera, public UThread, public UEventsSender {
public:
CameraTango(int decimation, bool autoExposure);
static const float bilateralFilteringSigmaS;
static const float bilateralFilteringSigmaR;
public:
CameraTango(bool colorCamera, int decimation, bool publishRawScan, bool smoothing);
virtual ~CameraTango();
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
void close(); // close Tango connection
void resetOrigin();
virtual bool isCalibrated() const;
virtual std::string getSerial() const;
rtabmap::Transform tangoPoseToTransform(const TangoPoseData * tangoPose, bool inOpenGLFrame) const;
const CameraModel & getCameraModel() const {return model_;}
rtabmap::Transform tangoPoseToTransform(const TangoPoseData * tangoPose) const;
void setColorCamera(bool enabled) {if(!this->isRunning()) colorCamera_ = enabled;}
void setDecimation(int value) {decimation_ = value;}
void setAutoExposure(bool enabled) {autoExposure_ = enabled;}
void setSmoothing(bool enabled) {smoothing_ = enabled;}
void setRawScanPublished(bool enabled) {rawScanPublished_ = enabled;}
void setScreenRotation(TangoSupportRotation colorCameraToDisplayRotation) {colorCameraToDisplayRotation_ = colorCameraToDisplayRotation;}
void setGPS(const GPS & gps);
void cloudReceived(const cv::Mat & cloud, double timestamp);
void rgbReceived(const cv::Mat & tangoImage, int type, double timestamp);
@@ -86,19 +99,24 @@ public:
void tangoEventReceived(int type, const char * key, const char * value);
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
rtabmap::Transform getPoseAtTimestamp(double timestamp, bool inOpenGLFrame);
rtabmap::Transform getPoseAtTimestamp(double timestamp);
virtual void mainLoopBegin();
virtual void mainLoop();
private:
void * tango_config_;
bool firstFrame_;
Transform previousPose_;
double previousStamp_;
UTimer cameraStartedTime_;
double stampEpochOffset_;
bool colorCamera_;
int decimation_;
bool autoExposure_;
bool rawScanPublished_;
bool smoothing_;
cv::Mat cloud_;
double cloudStamp_;
cv::Mat tangoColor_;
@@ -106,10 +124,14 @@ private:
double tangoColorStamp_;
boost::mutex dataMutex_;
USemaphore dataReady_;
rtabmap::Transform imuTDevice_;
rtabmap::Transform imuTDepthCamera_;
rtabmap::Transform deviceTDepth_;
CameraModel model_;
Transform deviceTColorCamera_;
TangoSupportRotation colorCameraToDisplayRotation_;
cv::Mat fisheyeRectifyMapX_;
cv::Mat fisheyeRectifyMapY_;
GPS lastKnownGPS_;
Transform originOffset_;
bool originUpdate_;
};
} /* namespace rtabmap */

View File

@@ -0,0 +1,124 @@
/*
* ProgressionStatus.h
*
* Created on: Feb 28, 2017
* Author: mathieu
*/
#ifndef APP_ANDROID_JNI_PROGRESSIONSTATUS_H_
#define APP_ANDROID_JNI_PROGRESSIONSTATUS_H_
#include <rtabmap/core/ProgressState.h>
#include <rtabmap/utilite/ULogger.h>
#include <rtabmap/utilite/UEventsManager.h>
#include <jni.h>
namespace rtabmap {
class ProgressEvent : public UEvent
{
public:
ProgressEvent(int count = 1) : count_(count){}
virtual std::string getClassName() const {return "ProgressEvent";}
int count_;
};
class ProgressionStatus: public ProgressState, public UEventsHandler
{
public:
ProgressionStatus() : count_(0), max_(100), jvm_(0), rtabmap_(0)
{
registerToEventsManager();
}
void setJavaObjects(JavaVM * jvm, jobject rtabmap)
{
jvm_ = jvm;
rtabmap_ = rtabmap;
}
void reset(int max)
{
count_=-1;
max_ = max;
setCanceled(false);
increment();
}
void setMax(int max)
{
max_ = max;
}
int getMax() const {return max_;}
void increment(int count = 1) const
{
UEventsManager::post(new ProgressEvent(count));
}
void finish()
{
}
virtual bool callback(const std::string & msg) const
{
if(!isCanceled())
{
increment();
}
return ProgressState::callback(msg);
}
virtual ~ProgressionStatus(){}
protected:
virtual bool handleEvent(UEvent * event)
{
if(event->getClassName().compare("ProgressEvent") == 0)
{
count_ += ((ProgressEvent*)event)->count_;
// Call JAVA callback
bool success = false;
if(jvm_ && rtabmap_)
{
JNIEnv *env = 0;
jint rs = jvm_->AttachCurrentThread(&env, NULL);
if(rs == JNI_OK && env)
{
jclass clazz = env->GetObjectClass(rtabmap_);
if(clazz)
{
jmethodID methodID = env->GetMethodID(clazz, "updateProgressionCallback", "(II)V" );
if(methodID)
{
env->CallVoidMethod(rtabmap_, methodID,
count_,
max_);
success = true;
}
}
}
jvm_->DetachCurrentThread();
}
if(!success)
{
UERROR("Failed to call rtabmap::updateProgressionCallback");
}
}
return false;
}
private:
int count_;
int max_;
JavaVM *jvm_;
jobject rtabmap_;
};
}
#endif /* APP_ANDROID_JNI_PROGRESSIONSTATUS_H_ */

File diff suppressed because it is too large Load Diff

View File

@@ -34,14 +34,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <tango_client_api.h> // NOLINT
#include <tango-gl/util.h>
#include <scene.h>
#include <CameraTango.h>
#include <util.h>
#include "scene.h"
#include "CameraTango.h"
#include "util.h"
#include "ProgressionStatus.h"
#include <rtabmap/core/RtabmapThread.h>
#include <rtabmap/utilite/UEventsHandler.h>
#include <boost/thread/mutex.hpp>
#include <pcl/pcl_base.h>
#include <pcl/TextureMesh.h>
// RTABMapApp handles the application lifecycle and resources.
class RTABMapApp : public UEventsHandler {
@@ -50,14 +52,13 @@ class RTABMapApp : public UEventsHandler {
RTABMapApp();
~RTABMapApp();
// Initialize the Tango Service, this function starts the communication
// between the application and the Tango Service.
// The activity object is used for checking if the API version is outdated.
int TangoInitialize(JNIEnv* env, jobject caller_activity);
void onCreate(JNIEnv* env, jobject caller_activity);
void openDatabase(const std::string & databasePath);
void setScreenRotation(int displayRotation, int cameraRotation);
int onResume();
int openDatabase(const std::string & databasePath, bool databaseInMemory, bool optimize, const std::string & databaseSource=std::string());
bool onTangoServiceConnected(JNIEnv* env, jobject iBinder);
// Explicitly reset motion tracking and restart the pipeline.
// Note that this will cause motion tracking to re-initialize.
@@ -113,31 +114,74 @@ class RTABMapApp : public UEventsHandler {
float x0, float y0, float x1, float y1);
void setPausedMapping(bool paused);
void setOnlineBlending(bool enabled);
void setMapCloudShown(bool shown);
void setOdomCloudShown(bool shown);
void setMeshRendering(bool enabled);
void setMeshRendering(bool enabled, bool withTexture);
void setPointSize(float value);
void setFOV(float angle);
void setOrthoCropFactor(float value);
void setGridRotation(float value);
void setLighting(bool enabled);
void setBackfaceCulling(bool enabled);
void setWireframe(bool enabled);
void setLocalizationMode(bool enabled);
void setTrajectoryMode(bool enabled);
void setGraphOptimization(bool enabled);
void setNodesFiltering(bool enabled);
void setGraphVisible(bool visible);
void setAutoExposure(bool enabled);
void setGridVisible(bool visible);
void setRawScanSaved(bool enabled);
void setCameraColor(bool enabled);
void setFullResolution(bool enabled);
void setSmoothing(bool enabled);
void setAppendMode(bool enabled);
void setDataRecorderMode(bool enabled);
void setMaxCloudDepth(float value);
void setMinCloudDepth(float value);
void setCloudDensityLevel(int value);
void setMeshAngleTolerance(float value);
void setMeshTriangleSize(int value);
void setClusterRatio(float value);
void setMaxGainRadius(float value);
void setRenderingTextureDecimation(int value);
void setBackgroundColor(float gray);
int setMappingParameter(const std::string & key, const std::string & value);
void setGPS(const rtabmap::GPS & gps);
void resetMapping();
void save();
bool exportMesh(const std::string & filePath);
void save(const std::string & databasePath);
void cancelProcessing();
bool exportMesh(
float cloudVoxelSize,
bool regenerateCloud,
bool meshing,
int textureSize,
int textureCount,
int normalK,
bool optimized,
float optimizedVoxelSize,
int optimizedDepth,
int optimizedMaxPolygons,
float optimizedColorRadius,
bool optimizedCleanWhitePolygons,
int optimizedMinClusterSize,
float optimizedMaxTextureDistance,
int optimizedMinTextureClusterSize,
bool blockRendering);
bool postExportation(bool visualize);
bool writeExportedMesh(const std::string & directory, const std::string & name);
int postProcessing(int approach);
protected:
virtual void handleEvent(UEvent * event);
virtual bool handleEvent(UEvent * event);
private:
rtabmap::ParametersMap getRtabmapParameters();
bool smoothMesh(int id, Mesh & mesh);
void gainCompensation(bool full = false);
std::vector<pcl::Vertices> filterOrganizedPolygons(const std::vector<pcl::Vertices> & polygons, int cloudSize) const;
std::vector<pcl::Vertices> filterPolygons(const std::vector<pcl::Vertices> & polygons, int cloudSize) const;
private:
rtabmap::CameraTango * camera_;
@@ -150,45 +194,76 @@ class RTABMapApp : public UEventsHandler {
bool nodesFiltering_;
bool localizationMode_;
bool trajectoryMode_;
bool autoExposure_;
bool rawScanSaved_;
bool smoothing_;
bool cameraColor_;
bool fullResolution_;
bool appendMode_;
float maxCloudDepth_;
float minCloudDepth_;
int cloudDensityLevel_;
int meshTrianglePix_;
float meshAngleToleranceDeg_;
float clusterRatio_;
float maxGainRadius_;
int renderingTextureDecimation_;
float backgroundColor_;
rtabmap::ParametersMap mappingParameters_;
bool paused_;
bool dataRecorderMode_;
bool clearSceneOnNextRender_;
bool openingDatabase_;
bool exporting_;
bool postProcessing_;
bool filterPolygonsOnNextRender_;
int gainCompensationOnNextRender_;
bool bilateralFilteringOnNextRender_;
bool takeScreenshotOnNextRender_;
bool cameraJustInitialized_;
int meshDecimation_;
int totalPoints_;
int totalPolygons_;
int lastDrawnCloudsCount_;
float renderingTime_;
double lastPostRenderEventTime_;
double lastPoseEventTime_;
std::map<std::string, float> bufferedStatsData_;
bool visualizingMesh_;
bool exportedMeshUpdated_;
pcl::TextureMesh::Ptr optMesh_;
cv::Mat optTexture_;
int optRefId_;
rtabmap::Transform * optRefPose_; // App crashes when loading native library if not dynamic
// main_scene_ includes all drawable object for visualizing Tango device's
// movement and point cloud.
Scene main_scene_;
std::list<rtabmap::Statistics> rtabmapEvents_;
std::list<rtabmap::RtabmapEvent*> rtabmapEvents_;
std::list<rtabmap::RtabmapEvent*> visLocalizationEvents_;
std::list<rtabmap::OdometryEvent> odomEvents_;
std::list<rtabmap::Transform> poseEvents_;
rtabmap::Transform mapToOdom_;
boost::mutex rtabmapMutex_;
boost::mutex visLocalizationMutex_;
boost::mutex meshesMutex_;
boost::mutex odomMutex_;
boost::mutex poseMutex_;
boost::mutex renderingMutex_;
struct Mesh
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
std::vector<pcl::Vertices> polygons;
rtabmap::Transform pose;
cv::Mat texture;
};
USemaphore screenshotReady_;
std::map<int, Mesh> createdMeshes_;
std::map<int, rtabmap::Transform> rawPoses_;
std::pair<rtabmap::RtabmapEventInit::Status, std::string> status_;
rtabmap::ProgressionStatus progressionStatus_;
};
#endif // TANGO_POINT_CLOUD_POINT_CLOUD_APP_H_

View File

@@ -0,0 +1,131 @@
/*
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Universite de Sherbrooke nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef BOUNDING_BOX_DRAWABLE_H_
#define BOUNDING_BOX_DRAWABLE_H_
#include "tango-gl/line.h"
class BoundingBoxDrawable : public tango_gl::Line
{
public:
BoundingBoxDrawable() :
Line(3.0f, GL_LINES)
{
vec_vertices_.resize(24);
}
void updateVertices(const pcl::PointXYZ & min, const pcl::PointXYZ & max)
{
int index = 0;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = min.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = max.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = min.y;
vec_vertices_[index++].z = max.z;
vec_vertices_[index].x = min.x;
vec_vertices_[index].y = max.y;
vec_vertices_[index++].z = max.z;
}
};
#endif // TANGO_GL_LINE_H_

View File

@@ -48,26 +48,44 @@ void GetJStringContent(JNIEnv *AEnv, jstring AStr, std::string &ARes) {
AEnv->ReleaseStringUTFChars(AStr,s);
}
JNIEXPORT jint JNICALL
Java_com_introlab_rtabmap_RTABMapLib_initialize(
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_onCreate(
JNIEnv* env, jobject, jobject activity)
{
return app.TangoInitialize(env, activity);
return app.onCreate(env, activity);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setScreenRotation(
JNIEnv* env, jobject, int displayRotation, int cameraRotation)
{
return app.setScreenRotation(displayRotation, cameraRotation);
}
JNIEXPORT int JNICALL
Java_com_introlab_rtabmap_RTABMapLib_openDatabase(
JNIEnv* env, jobject, jstring databasePath)
JNIEnv* env, jobject, jstring databasePath, bool databaseInMemory, bool optimize)
{
std::string databasePathC;
GetJStringContent(env,databasePath,databasePathC);
return app.openDatabase(databasePathC);
return app.openDatabase(databasePathC, databaseInMemory, optimize);
}
JNIEXPORT jint JNICALL
Java_com_introlab_rtabmap_RTABMapLib_onResume(
JNIEnv*, jobject) {
return app.onResume();
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
Java_com_introlab_rtabmap_RTABMapLib_onTangoServiceConnected(
JNIEnv* env, jobject, jobject iBinder) {
return app.onTangoServiceConnected(env, iBinder);
}
JNIEXPORT void JNICALL
@@ -120,6 +138,12 @@ Java_com_introlab_rtabmap_RTABMapLib_setPausedMapping(
return app.setPausedMapping(paused);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setOnlineBlending(
JNIEnv*, jobject, bool enabled)
{
return app.setOnlineBlending(enabled);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setMapCloudShown(
JNIEnv*, jobject, bool shown)
{
@@ -133,9 +157,51 @@ Java_com_introlab_rtabmap_RTABMapLib_setOdomCloudShown(
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setMeshRendering(
JNIEnv*, jobject, bool enabled, bool withTexture)
{
return app.setMeshRendering(enabled, withTexture);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setPointSize(
JNIEnv*, jobject, float value)
{
return app.setPointSize(value);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setFOV(
JNIEnv*, jobject, float fov)
{
return app.setFOV(fov);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setOrthoCropFactor(
JNIEnv*, jobject, float value)
{
return app.setOrthoCropFactor(value);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setGridRotation(
JNIEnv*, jobject, float value)
{
return app.setGridRotation(value);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setLighting(
JNIEnv*, jobject, bool enabled)
{
return app.setMeshRendering(enabled);
return app.setLighting(enabled);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setBackfaceCulling(
JNIEnv*, jobject, bool enabled)
{
return app.setBackfaceCulling(enabled);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setWireframe(
JNIEnv*, jobject, bool enabled)
{
return app.setWireframe(enabled);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setLocalizationMode(
@@ -168,10 +234,16 @@ Java_com_introlab_rtabmap_RTABMapLib_setGraphVisible(
return app.setGraphVisible(visible);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setAutoExposure(
Java_com_introlab_rtabmap_RTABMapLib_setGridVisible(
JNIEnv*, jobject, bool visible)
{
return app.setGridVisible(visible);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setRawScanSaved(
JNIEnv*, jobject, bool enabled)
{
return app.setAutoExposure(enabled);
return app.setRawScanSaved(enabled);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setFullResolution(
@@ -180,12 +252,48 @@ Java_com_introlab_rtabmap_RTABMapLib_setFullResolution(
return app.setFullResolution(enabled);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setSmoothing(
JNIEnv*, jobject, bool enabled)
{
return app.setSmoothing(enabled);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setCameraColor(
JNIEnv*, jobject, bool enabled)
{
return app.setCameraColor(enabled);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setAppendMode(
JNIEnv*, jobject, bool enabled)
{
return app.setAppendMode(enabled);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setDataRecorderMode(
JNIEnv*, jobject, bool enabled)
{
return app.setDataRecorderMode(enabled);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setMaxCloudDepth(
JNIEnv*, jobject, float value)
{
return app.setMaxCloudDepth(value);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setMinCloudDepth(
JNIEnv*, jobject, float value)
{
return app.setMinCloudDepth(value);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setCloudDensityLevel(
JNIEnv*, jobject, int value)
{
return app.setCloudDensityLevel(value);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setMeshAngleTolerance(
JNIEnv*, jobject, float value)
{
@@ -197,6 +305,30 @@ Java_com_introlab_rtabmap_RTABMapLib_setMeshTriangleSize(
{
return app.setMeshTriangleSize(value);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setClusterRatio(
JNIEnv*, jobject, float value)
{
return app.setClusterRatio(value);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setMaxGainRadius(
JNIEnv*, jobject, float value)
{
return app.setMaxGainRadius(value);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setRenderingTextureDecimation(
JNIEnv*, jobject, int value)
{
return app.setRenderingTextureDecimation(value);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setBackgroundColor(
JNIEnv*, jobject, float value)
{
return app.setBackgroundColor(value);
}
JNIEXPORT jint JNICALL
Java_com_introlab_rtabmap_RTABMapLib_setMappingParameter(
JNIEnv* env, jobject, jstring key, jstring value)
@@ -207,6 +339,24 @@ Java_com_introlab_rtabmap_RTABMapLib_setMappingParameter(
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_resetMapping(
JNIEnv*, jobject)
@@ -216,20 +366,78 @@ Java_com_introlab_rtabmap_RTABMapLib_resetMapping(
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_save(
JNIEnv* env, jobject, jstring databasePath)
{
std::string databasePathC;
GetJStringContent(env,databasePath,databasePathC);
return app.save(databasePathC);
}
JNIEXPORT void JNICALL
Java_com_introlab_rtabmap_RTABMapLib_cancelProcessing(
JNIEnv* env, jobject)
{
return app.save();
return app.cancelProcessing();
}
JNIEXPORT bool JNICALL
Java_com_introlab_rtabmap_RTABMapLib_exportMesh(
JNIEnv* env, jobject, jstring filePath)
JNIEnv* env, jobject,
float cloudVoxelSize,
bool regenerateCloud,
bool meshing,
int textureSize,
int textureCount,
int normalK,
bool optimized,
float optimizedVoxelSize,
int optimizedDepth,
int optimizedMaxPolygons,
float optimizedColorRadius,
bool optimizedCleanWhitePolygons,
int optimizedMinClusterSize,
float optimizedMaxTextureDistance,
int optimizedMinTextureClusterSize,
bool blockRendering)
{
std::string filePathC;
GetJStringContent(env,filePath,filePathC);
return app.exportMesh(filePathC);
return app.exportMesh(
cloudVoxelSize,
regenerateCloud,
meshing,
textureSize,
textureCount,
normalK,
optimized,
optimizedVoxelSize,
optimizedDepth,
optimizedMaxPolygons,
optimizedColorRadius,
optimizedCleanWhitePolygons,
optimizedMinClusterSize,
optimizedMaxTextureDistance,
optimizedMinTextureClusterSize,
blockRendering);
}
JNIEXPORT bool JNICALL
Java_com_introlab_rtabmap_RTABMapLib_postExportation(
JNIEnv* env, jobject, bool visualize)
{
return app.postExportation(visualize);
}
JNIEXPORT bool JNICALL
Java_com_introlab_rtabmap_RTABMapLib_writeExportedMesh(
JNIEnv* env, jobject, jstring directory, jstring name)
{
std::string directoryC;
GetJStringContent(env,directory,directoryC);
std::string nameC;
GetJStringContent(env,name,nameC);
return app.writeExportedMesh(directoryC, nameC);
}
JNIEXPORT int JNICALL
Java_com_introlab_rtabmap_RTABMapLib_postProcessing(
JNIEnv* env, jobject, int approach)

File diff suppressed because it is too large Load Diff

View File

@@ -40,19 +40,41 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// PointCloudDrawable is responsible for the point cloud rendering.
class PointCloudDrawable {
public:
static void createShaderPrograms();
static void releaseShaderPrograms();
private:
static std::vector<GLuint> shaderPrograms_;
public:
PointCloudDrawable(
GLuint cloudShaderProgram,
GLuint textureShaderProgram,
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
const std::vector<pcl::Vertices> & polygons = std::vector<pcl::Vertices>(),
const cv::Mat & image = cv::Mat());
const pcl::IndicesPtr & indices,
float gainR = 1.0f,
float gainG = 1.0f,
float gainB = 1.0f);
PointCloudDrawable(
const Mesh & mesh,
bool createWireframe = false);
virtual ~PointCloudDrawable();
void updatePolygons(const std::vector<pcl::Vertices> & polygons, const std::vector<pcl::Vertices> & polygonsLowRes = std::vector<pcl::Vertices>(), bool createWireframe = false);
void updateCloud(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud, const pcl::IndicesPtr & indices);
void updateMesh(const Mesh & mesh, bool createWireframe = false);
void setPose(const rtabmap::Transform & pose);
void setVisible(bool visible) {visible_=visible;}
rtabmap::Transform getPose() const {return glmToTransform(pose_);}
void setGains(float gainR, float gainG, float gainB) {gainR_ = gainR; gainG_ = gainG; gainB_ = gainB;}
rtabmap::Transform getPose() const {return pose_;}
const glm::mat4 & getPoseGl() const {return poseGl_;}
bool isVisible() const {return visible_;}
bool hasMesh() const {return polygons_.size()!=0;}
bool hasTexture() const {return textures_ != 0;}
float getMinHeight() const {return minHeight_;}
const pcl::PointXYZ & aabbMinModel() const {return aabbMinModel_;}
const pcl::PointXYZ & aabbMaxModel() const {return aabbMaxModel_;}
const pcl::PointXYZ & aabbMinWorld() const {return aabbMinWorld_;}
const pcl::PointXYZ & aabbMaxWorld() const {return aabbMaxWorld_;}
// Update current point cloud data.
//
@@ -60,19 +82,61 @@ class PointCloudDrawable {
// @param view_mat: view matrix from current render camera.
// @param model_mat: model matrix for this point cloud frame.
// @param vertices: all vertices in this point cloud frame.
void Render(const glm::mat4 & projectionMatrix, const glm::mat4 & viewMatrix, bool meshRendering = true, float pointSize = 3.0f);
void Render(
const glm::mat4 & projectionMatrix,
const glm::mat4 & viewMatrix,
bool meshRendering = true,
float pointSize = 3.0f,
bool textureRendering = false,
bool lighting = true,
float distanceToCamSqr = 0.0f,
const GLuint & depthTexture = 0,
int screenWidth = 0, // nonnull if depthTexture>0
int screenHeight = 0, // nonnull if depthTexture>0
float nearClipPlane = 0, // nonnull if depthTexture>0
float farClipPlane = 0, // nonnull if depthTexture>0
bool packDepthToColorChannel = false,
bool wireFrame = false) const;
private:
template<class PointT>
void updateAABBMinMax(const PointT & pt, pcl::PointXYZ & min, pcl::PointXYZ & max)
{
if(pt.x<min.x) min.x = pt.x;
if(pt.y<min.y) min.y = pt.y;
if(pt.z<min.z) min.z = pt.z;
if(pt.x>max.x) max.x = pt.x;
if(pt.y>max.y) max.y = pt.y;
if(pt.z>max.z) max.z = pt.z;
}
void updateAABBWorld(const rtabmap::Transform & pose);
private:
// Vertex buffer of the point cloud geometry.
GLuint vertex_buffers_;
GLuint textures_;
std::vector<GLushort> polygons_;
std::vector<GLuint> polygons_;
std::vector<GLuint> polygonsLowRes_;
std::vector<GLuint> polygonLines_;
std::vector<GLuint> polygonLinesLowRes_;
std::vector<GLuint> verticesLowRes_;
std::vector<GLuint> verticesLowLowRes_;
int nPoints_;
glm::mat4 pose_;
rtabmap::Transform pose_;
glm::mat4 poseGl_;
bool visible_;
bool hasNormals_;
std::vector<unsigned int> organizedToDenseIndices_;
float minHeight_; // odom frame
GLuint cloud_shader_program_;
GLuint texture_shader_program_;
float gainR_;
float gainG_;
float gainB_;
pcl::PointXYZ aabbMinModel_;
pcl::PointXYZ aabbMaxModel_;
pcl::PointXYZ aabbMinWorld_;
pcl::PointXYZ aabbMaxWorld_;
};
#endif // TANGO_POINT_CLOUD_POINT_CLOUD_DRAWABLE_H_

View File

@@ -16,10 +16,18 @@
#include <tango-gl/conversions.h>
#include <tango-gl/gesture_camera.h>
#include <tango-gl/util.h>
#include <rtabmap/utilite/ULogger.h>
#include <rtabmap/utilite/UStl.h>
#include <rtabmap/utilite/UTimer.h>
#include <rtabmap/core/util3d_filtering.h>
#include <rtabmap/core/util3d_transforms.h>
#include <rtabmap/core/util3d_surface.h>
#include <pcl/common/transforms.h>
#include <pcl/common/common.h>
#include <glm/gtx/transform.hpp>
#include "scene.h"
#include "util.h"
@@ -28,7 +36,7 @@
// 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
// 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.
const tango_gl::Color kTraceColor(0.66f, 0.66f, 0.66f);
@@ -39,47 +47,6 @@ const tango_gl::Color kGridColor(0.85f, 0.85f, 0.85f);
// Frustum scale.
const glm::vec3 kFrustumScale = glm::vec3(0.4f, 0.3f, 0.5f);
const std::string kPointCloudVertexShader =
"precision mediump float;\n"
"precision mediump int;\n"
"attribute vec3 vertex;\n"
"attribute vec3 color;\n"
"uniform mat4 mvp;\n"
"uniform float point_size;\n"
"varying vec3 v_color;\n"
"void main() {\n"
" gl_Position = mvp*vec4(vertex.x, vertex.y, vertex.z, 1.0);\n"
" gl_PointSize = point_size;\n"
" v_color = color;\n"
"}\n";
const std::string kPointCloudFragmentShader =
"precision mediump float;\n"
"precision mediump int;\n"
"varying vec3 v_color;\n"
"void main() {\n"
" gl_FragColor = vec4(v_color.z, v_color.y, v_color.x, 1.0);\n"
"}\n";
const std::string kTextureMeshVertexShader =
"precision mediump float;\n"
"precision mediump int;\n"
"attribute vec3 vertex;\n"
"attribute vec2 a_TexCoordinate;\n"
"uniform mat4 mvp;\n"
"varying vec2 v_TexCoordinate;\n"
"void main() {\n"
" gl_Position = mvp*vec4(vertex.x, vertex.y, vertex.z, 1.0);\n"
" v_TexCoordinate = a_TexCoordinate;\n"
"}\n";
const std::string kTextureMeshFragmentShader =
"precision mediump float;\n"
"precision mediump int;\n"
"uniform sampler2D u_Texture;\n"
"varying vec2 v_TexCoordinate;\n"
"void main() {\n"
" gl_FragColor = texture2D(u_Texture, v_TexCoordinate);\n"
"}\n";
const std::string kGraphVertexShader =
"precision mediump float;\n"
"precision mediump int;\n"
@@ -106,91 +73,109 @@ Scene::Scene() :
axis_(0),
frustum_(0),
grid_(0),
box_(0),
trace_(0),
graph_(0),
graphVisible_(true),
gridVisible_(true),
traceVisible_(true),
color_camera_to_display_rotation_(ROTATION_0),
currentPose_(0),
cloud_shader_program_(0),
texture_mesh_shader_program_(0),
graph_shader_program_(0),
blending_(true),
mapRendering_(true),
meshRendering_(true),
pointSize_(3.0f) {}
meshRenderingTexture_(true),
pointSize_(5.0f),
boundingBoxRendering_(false),
lighting_(false),
backfaceCulling_(true),
wireFrame_(false),
r_(0.0f),
g_(0.0f),
b_(0.0f),
fboId_(0),
depthTexture_(0),
screenWidth_(0),
screenHeight_(0),
doubleTapOn_(false)
{
gesture_camera_ = new tango_gl::GestureCamera();
gesture_camera_->SetCameraType(
tango_gl::GestureCamera::kFirstPerson);
}
Scene::~Scene() {DeleteResources();}
Scene::~Scene() {
DeleteResources();
delete gesture_camera_;
}
//Should only be called in OpenGL thread!
void Scene::InitGLContent()
{
if(gesture_camera_ != 0)
if(axis_ != 0)
{
DeleteResources();
}
UASSERT(gesture_camera_ == 0);
gesture_camera_ = new tango_gl::GestureCamera();
axis_ = new tango_gl::Axis();
frustum_ = new tango_gl::Frustum();
trace_ = new tango_gl::Trace();
grid_ = new tango_gl::Grid();
currentPose_ = new rtabmap::Transform();
UASSERT(axis_ == 0);
axis_->SetScale(glm::vec3(0.5f,0.5f,0.5f));
frustum_->SetColor(kTraceColor);
trace_->ClearVertexArray();
trace_->SetColor(kTraceColor);
grid_->SetColor(kGridColor);
grid_->SetPosition(-kHeightOffset);
gesture_camera_->SetCameraType(
tango_gl::GestureCamera::kFirstPerson);
axis_ = new tango_gl::Axis();
frustum_ = new tango_gl::Frustum();
trace_ = new tango_gl::Trace();
grid_ = new tango_gl::Grid();
box_ = new BoundingBoxDrawable();
currentPose_ = new rtabmap::Transform();
if(cloud_shader_program_ == 0)
{
cloud_shader_program_ = tango_gl::util::CreateProgram(kPointCloudVertexShader.c_str(), kPointCloudFragmentShader.c_str());
UASSERT(cloud_shader_program_ != 0);
}
if(texture_mesh_shader_program_ == 0)
{
texture_mesh_shader_program_ = tango_gl::util::CreateProgram(kTextureMeshVertexShader.c_str(), kTextureMeshFragmentShader.c_str());
UASSERT(texture_mesh_shader_program_ != 0);
}
if(graph_shader_program_ == 0)
{
graph_shader_program_ = tango_gl::util::CreateProgram(kGraphVertexShader.c_str(), kGraphFragmentShader.c_str());
UASSERT(graph_shader_program_ != 0);
}
axis_->SetScale(glm::vec3(0.5f,0.5f,0.5f));
frustum_->SetColor(kTraceColor);
trace_->ClearVertexArray();
trace_->SetColor(kTraceColor);
grid_->SetColor(kGridColor);
grid_->SetPosition(kHeightOffset);
box_->SetShader();
box_->SetColor(1,0,0);
PointCloudDrawable::createShaderPrograms();
if(graph_shader_program_ == 0)
{
graph_shader_program_ = tango_gl::util::CreateProgram(kGraphVertexShader.c_str(), kGraphFragmentShader.c_str());
UASSERT(graph_shader_program_ != 0);
}
}
//Should only be called in OpenGL thread!
void Scene::DeleteResources() {
LOGI("Scene::DeleteResources()");
if(gesture_camera_)
if(axis_)
{
delete gesture_camera_;
delete axis_;
delete frustum_;
delete trace_;
delete grid_;
delete currentPose_;
gesture_camera_ = 0;
delete axis_;
axis_ = 0;
delete frustum_;
delete trace_;
delete grid_;
delete currentPose_;
delete box_;
}
if (cloud_shader_program_) {
glDeleteShader(cloud_shader_program_);
cloud_shader_program_ = 0;
}
if (texture_mesh_shader_program_) {
glDeleteShader(texture_mesh_shader_program_);
texture_mesh_shader_program_ = 0;
}
PointCloudDrawable::releaseShaderPrograms();
if (graph_shader_program_) {
glDeleteShader(graph_shader_program_);
graph_shader_program_ = 0;
}
}
if(fboId_>0)
{
glDeleteFramebuffers(1, &fboId_);
fboId_ = 0;
glDeleteTextures(1, &depthTexture_);
depthTexture_ = 0;
}
clear();
}
@@ -213,142 +198,360 @@ void Scene::clear()
graph_ = 0;
}
pointClouds_.clear();
if(grid_)
{
grid_->SetPosition(kHeightOffset);
}
}
//Should only be called in OpenGL thread!
void Scene::SetupViewPort(int w, int h) {
if (h == 0) {
LOGE("Setup graphic height not valid");
if (h == 0) {
LOGE("Setup graphic height not valid");
}
UASSERT(gesture_camera_ != 0);
gesture_camera_->SetWindowSize(static_cast<float>(w), static_cast<float>(h));
glViewport(0, 0, w, h);
if(screenWidth_ != w || fboId_ == 0)
{
if(fboId_>0)
{
glDeleteFramebuffers(1, &fboId_);
fboId_ = 0;
glDeleteTextures(1, &depthTexture_);
depthTexture_ = 0;
}
// Create depth texture
glGenTextures(1, &depthTexture_);
glBindTexture(GL_TEXTURE_2D, depthTexture_);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
// regenerate fbo texture
// create a framebuffer object, you need to delete them when program exits.
glGenFramebuffers(1, &fboId_);
glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
// Set the texture to be at the depth attachment point of the FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture_, 0);
GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if ( status != GL_FRAMEBUFFER_COMPLETE)
{
LOGE("Frame buffer cannot be generated! Status: %in", status);
}
glBindFramebuffer(GL_FRAMEBUFFER,0);
}
screenWidth_ = w;
screenHeight_ = h;
}
std::vector<glm::vec4> computeFrustumPlanes(const glm::mat4 & mat, bool normalize = true)
{
// http://www.txutxi.com/?p=444
std::vector<glm::vec4> planes(6);
// Left Plane
// col4 + col1
planes[0].x = mat[0][3] + mat[0][0];
planes[0].y = mat[1][3] + mat[1][0];
planes[0].z = mat[2][3] + mat[2][0];
planes[0].w = mat[3][3] + mat[3][0];
// Right Plane
// col4 - col1
planes[1].x = mat[0][3] - mat[0][0];
planes[1].y = mat[1][3] - mat[1][0];
planes[1].z = mat[2][3] - mat[2][0];
planes[1].w = mat[3][3] - mat[3][0];
// Bottom Plane
// col4 + col2
planes[2].x = mat[0][3] + mat[0][1];
planes[2].y = mat[1][3] + mat[1][1];
planes[2].z = mat[2][3] + mat[2][1];
planes[2].w = mat[3][3] + mat[3][1];
// Top Plane
// col4 - col2
planes[3].x = mat[0][3] - mat[0][1];
planes[3].y = mat[1][3] - mat[1][1];
planes[3].z = mat[2][3] - mat[2][1];
planes[3].w = mat[3][3] - mat[3][1];
// Near Plane
// col4 + col3
planes[4].x = mat[0][3] + mat[0][2];
planes[4].y = mat[1][3] + mat[1][2];
planes[4].z = mat[2][3] + mat[2][2];
planes[4].w = mat[3][3] + mat[3][2];
// Far Plane
// col4 - col3
planes[5].x = mat[0][3] - mat[0][2];
planes[5].y = mat[1][3] - mat[1][2];
planes[5].z = mat[2][3] - mat[2][2];
planes[5].w = mat[3][3] - mat[3][2];
//if(normalize)
{
for(unsigned int i=0;i<planes.size(); ++i)
{
if(normalize)
{
float d = std::sqrt(planes[i].x * planes[i].x + planes[i].y * planes[i].y + planes[i].z * planes[i].z); // for normalizing the coordinates
planes[i].x/=d;
planes[i].y/=d;
planes[i].z/=d;
planes[i].w/=d;
}
}
}
return planes;
}
/**
* Tells whether or not b is intersecting f.
* http://www.txutxi.com/?p=584
* @param f Viewing frustum.
* @param b An axis aligned bounding box.
* @return True if b intersects f, false otherwise.
*/
bool intersectFrustumAABB(
const std::vector<glm::vec4> &planes,
const pcl::PointXYZ &boxMin,
const pcl::PointXYZ &boxMax)
{
// Indexed for the 'index trick' later
const pcl::PointXYZ * box[] = {&boxMin, &boxMax};
// We only need to do 6 point-plane tests
for (unsigned int i = 0; i < planes.size(); ++i)
{
// This is the current plane
const glm::vec4 &p = planes[i];
// p-vertex selection (with the index trick)
// According to the plane normal we can know the
// indices of the positive vertex
const int px = p.x > 0.0f?1:0;
const int py = p.y > 0.0f?1:0;
const int pz = p.z > 0.0f?1:0;
// Dot product
// project p-vertex on plane normal
// (How far is p-vertex from the origin)
const float dp =
(p.x*box[px]->x) +
(p.y*box[py]->y) +
(p.z*box[pz]->z) + p.w;
// Doesn't intersect if it is behind the plane
if (dp < 0) {return false; }
}
UASSERT(gesture_camera_ != 0);
gesture_camera_->SetAspectRatio(static_cast<float>(w) /
static_cast<float>(h));
glViewport(0, 0, w, h);
return true;
}
//Should only be called in OpenGL thread!
int Scene::Render() {
UASSERT(gesture_camera_ != 0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
if(!currentPose_->isNull())
{
glm::vec3 position(currentPose_->x(), currentPose_->y(), currentPose_->z());
Eigen::Quaternionf quat = currentPose_->getQuaternionf();
glm::quat rotation(quat.w(), quat.x(), quat.y(), quat.z());
if (gesture_camera_->GetCameraType() == tango_gl::GestureCamera::kFirstPerson)
{
// In first person mode, we directly control camera's motion.
gesture_camera_->SetPosition(position);
gesture_camera_->SetRotation(rotation);
}
else
{
// In third person or top down more, we follow the camera movement.
gesture_camera_->SetAnchorPosition(position, rotation);
frustum_->SetPosition(position);
frustum_->SetRotation(rotation);
// Set the frustum scale to 4:3, this doesn't necessarily match the physical
// camera's aspect ratio, this is just for visualization purposes.
frustum_->SetScale(kFrustumScale);
frustum_->Render(gesture_camera_->GetProjectionMatrix(),
gesture_camera_->GetViewMatrix());
axis_->SetPosition(position);
axis_->SetRotation(rotation);
axis_->Render(gesture_camera_->GetProjectionMatrix(),
gesture_camera_->GetViewMatrix());
}
trace_->UpdateVertexArray(position);
if(traceVisible_)
{
trace_->Render(gesture_camera_->GetProjectionMatrix(),
gesture_camera_->GetViewMatrix());
}
}
grid_->Render(gesture_camera_->GetProjectionMatrix(),
gesture_camera_->GetViewMatrix());
bool frustumCulling = true;
int cloudDrawn=0;
if(mapRendering_ && frustumCulling)
glm::vec3 position(currentPose_->x(), currentPose_->y(), currentPose_->z());
Eigen::Quaternionf quat = currentPose_->getQuaternionf();
glm::quat rotation(quat.w(), quat.x(), quat.y(), quat.z());
glm::mat4 rotateM;
if(!currentPose_->isNull())
{
//Use camera frustum to cull nodes that don't need to be drawn
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
std::vector<int> ids(pointClouds_.size());
rotateM = glm::rotate<float>(float(color_camera_to_display_rotation_)*-1.57079632679489661923132169163975144, glm::vec3(0.0f, 0.0f, 1.0f));
cloud->resize(pointClouds_.size());
ids.resize(pointClouds_.size());
int oi=0;
for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
if (gesture_camera_->GetCameraType() == tango_gl::GestureCamera::kFirstPerson)
{
if(!iter->second->getPose().isNull() && iter->second->isVisible())
{
(*cloud)[oi] = pcl::PointXYZ(iter->second->getPose().x(), iter->second->getPose().y(), iter->second->getPose().z());
ids[oi++] = iter->first;
}
// In first person mode, we directly control camera's motion.
gesture_camera_->SetPosition(position);
gesture_camera_->SetRotation(rotation*glm::quat(rotateM));
}
cloud->resize(oi);
ids.resize(oi);
if(oi)
else
{
float fov = 45.0f;
rtabmap::Transform openglCamera = GetOpenGLCameraPose(&fov)*rtabmap::Transform(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f);
// transform in same coordinate as frustum filtering
openglCamera *= rtabmap::Transform(
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
-1.0f, 0.0f, 0.0f, 0.0f);
pcl::IndicesPtr indices = rtabmap::util3d::frustumFiltering(
cloud,
pcl::IndicesPtr(new std::vector<int>),
openglCamera,
fov*2.0f,
fov*2.0f,
0.1f,
100.0f);
// In third person or top down mode, we follow the camera movement.
gesture_camera_->SetAnchorPosition(position, rotation*glm::quat(rotateM));
}
}
//LOGI("Frustum poses filtered = %d (showing %d/%d)",
// (int)(pointClouds_.size()-indices->size()),
// (int)indices->size(),
// (int)pointClouds_.size());
glm::mat4 projectionMatrix = gesture_camera_->GetProjectionMatrix();
glm::mat4 viewMatrix = gesture_camera_->GetViewMatrix();
for(unsigned int i=0; i<indices->size(); ++i)
rtabmap::Transform openglCamera = GetOpenGLCameraPose();//*rtabmap::Transform(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f);
// transform in same coordinate as frustum filtering
openglCamera *= rtabmap::Transform(
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
-1.0f, 0.0f, 0.0f, 0.0f);
//Culling
std::vector<glm::vec4> planes = computeFrustumPlanes(projectionMatrix*viewMatrix, true);
std::vector<PointCloudDrawable*> cloudsToDraw(pointClouds_.size());
int oi=0;
for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
{
if(!mapRendering_ && iter->first > 0)
{
break;
}
if(iter->second->isVisible())
{
if(intersectFrustumAABB(planes,
iter->second->aabbMinWorld(),
iter->second->aabbMaxWorld()))
{
++cloudDrawn;
pointClouds_.find(ids[indices->at(i)])->second->Render(gesture_camera_->GetProjectionMatrix(), gesture_camera_->GetViewMatrix(), meshRendering_, pointSize_);
cloudsToDraw[oi++] = iter->second;
}
}
}
cloudsToDraw.resize(oi);
// First rendering to get depth texture
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glDepthMask(GL_TRUE);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDisable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
if(backfaceCulling_)
{
glEnable(GL_CULL_FACE);
}
else
{
for(std::map<int, PointCloudDrawable*>::const_iterator iter=pointClouds_.begin(); iter!=pointClouds_.end(); ++iter)
glDisable(GL_CULL_FACE);
}
UTimer timer;
bool onlineBlending = blending_ && gesture_camera_->GetCameraType()!=tango_gl::GestureCamera::kTopOrtho && mapRendering_ && meshRendering_ && cloudsToDraw.size()>1;
if(onlineBlending && fboId_)
{
// set the rendering destination to FBO
glBindFramebuffer(GL_FRAMEBUFFER, fboId_);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glClearColor(1, 1, 1, 1);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
// Draw scene
for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
{
if((mapRendering_ || iter->first < 0) && iter->second->isVisible())
{
++cloudDrawn;
iter->second->Render(gesture_camera_->GetProjectionMatrix(), gesture_camera_->GetViewMatrix(), meshRendering_, pointSize_);
}
// set large distance to cam to use low res polygons for fast processing
(*iter)->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, false, false, 999.0f);
}
// back to normal window-system-provided framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0); // unbind
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
}
if(doubleTapOn_ && gesture_camera_->GetCameraType() != tango_gl::GestureCamera::kFirstPerson)
{
glClearColor(0, 0, 0, 0);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
{
// set large distance to cam to use low res polygons for fast processing
(*iter)->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_*10.0f, false, false, 999.0f, 0, 0, 0, 0, 0, true);
}
GLubyte zValue[4];
glReadPixels(doubleTapPos_.x*screenWidth_, screenHeight_-doubleTapPos_.y*screenHeight_, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, zValue);
float fromFixed = 256.0f/255.0f;
float zValueF = float(zValue[0]/255.0f)*fromFixed + float(zValue[1]/255.0f)*fromFixed/255.0f + float(zValue[2]/255.0f)*fromFixed/65025.0f + float(zValue[3]/255.0f)*fromFixed/160581375.0f;
if(zValueF != 0.0f)
{
zValueF = zValueF*2.0-1.0;//NDC
glm::vec4 point = glm::inverse(projectionMatrix*viewMatrix)*glm::vec4(doubleTapPos_.x*2.0f-1.0f, (1.0f-doubleTapPos_.y)*2.0f-1.0f, zValueF, 1.0f);
point /= point.w;
gesture_camera_->SetAnchorOffset(glm::vec3(point.x, point.y, point.z) - position);
}
}
doubleTapOn_ = false;
glClearColor(r_, g_, b_, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
if(!currentPose_->isNull())
{
if (gesture_camera_->GetCameraType() != tango_gl::GestureCamera::kFirstPerson)
{
frustum_->SetPosition(position);
frustum_->SetRotation(rotation);
// Set the frustum scale to 4:3, this doesn't necessarily match the physical
// camera's aspect ratio, this is just for visualization purposes.
frustum_->SetScale(kFrustumScale);
frustum_->Render(projectionMatrix, viewMatrix);
axis_->SetPosition(position);
axis_->SetRotation(rotation);
axis_->Render(projectionMatrix, viewMatrix);
}
trace_->UpdateVertexArray(position);
if(traceVisible_)
{
trace_->Render(projectionMatrix, viewMatrix);
}
if(gridVisible_)
{
grid_->Render(projectionMatrix, viewMatrix);
}
}
if(graphVisible_ && graph_)
{
graph_->Render(gesture_camera_->GetProjectionMatrix(), gesture_camera_->GetViewMatrix());
graph_->Render(projectionMatrix, viewMatrix);
}
return cloudDrawn;
if(onlineBlending)
{
glEnable (GL_BLEND);
glDepthMask(GL_FALSE);
}
for(std::vector<PointCloudDrawable*>::const_iterator iter=cloudsToDraw.begin(); iter!=cloudsToDraw.end(); ++iter)
{
PointCloudDrawable * cloud = *iter;
if(boundingBoxRendering_)
{
box_->updateVertices(cloud->aabbMinWorld(), cloud->aabbMaxWorld());
box_->Render(projectionMatrix, viewMatrix);
}
Eigen::Vector3f cloudToCamera(
cloud->getPose().x() - openglCamera.x(),
cloud->getPose().y() - openglCamera.y(),
cloud->getPose().z() - openglCamera.z());
float distanceToCameraSqr = cloudToCamera[0]*cloudToCamera[0] + cloudToCamera[1]*cloudToCamera[1] + cloudToCamera[2]*cloudToCamera[2];
cloud->Render(projectionMatrix, viewMatrix, meshRendering_, pointSize_, meshRenderingTexture_, lighting_, distanceToCameraSqr, onlineBlending?depthTexture_:0, screenWidth_, screenHeight_, gesture_camera_->getNearClipPlane(), gesture_camera_->getFarClipPlane(), false, wireFrame_);
}
if(onlineBlending)
{
glDisable (GL_BLEND);
glDepthMask(GL_TRUE);
}
return (int)cloudsToDraw.size();
}
void Scene::SetCameraType(tango_gl::GestureCamera::CameraType camera_type) {
@@ -362,6 +565,24 @@ void Scene::SetCameraPose(const rtabmap::Transform & 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
{
if(fov)
@@ -369,14 +590,27 @@ rtabmap::Transform Scene::GetOpenGLCameraPose(float * fov) const
*fov = gesture_camera_->getFOV();
}
return glmToTransform(gesture_camera_->GetTransformationMatrix());
}
void Scene::OnTouchEvent(int touch_count,
tango_gl::GestureCamera::TouchEvent event, float x0,
float y0, float x1, float y1) {
UASSERT(gesture_camera_ != 0);
gesture_camera_->OnTouchEvent(touch_count, event, x0, y0, x1, y1);
if(touch_count == 3)
{
//doubletap
if(!doubleTapOn_)
{
doubleTapPos_.x = x0;
doubleTapPos_.y = y0;
doubleTapOn_ = true;
}
}
else
{
// rotate/translate/zoom
gesture_camera_->OnTouchEvent(touch_count, event, x0, y0, x1, y1);
}
}
void Scene::updateGraph(
@@ -391,8 +625,11 @@ void Scene::updateGraph(
}
//create
UASSERT(graph_shader_program_ != 0);
graph_ = new GraphDrawable(graph_shader_program_, poses, links);
if(graphVisible_)
{
UASSERT(graph_shader_program_ != 0);
graph_ = new GraphDrawable(graph_shader_program_, poses, links);
}
}
void Scene::setGraphVisible(bool visible)
@@ -400,6 +637,11 @@ void Scene::setGraphVisible(bool visible)
graphVisible_ = visible;
}
void Scene::setGridVisible(bool visible)
{
gridVisible_ = visible;
}
void Scene::setTraceVisible(bool visible)
{
traceVisible_ = visible;
@@ -409,11 +651,10 @@ void Scene::setTraceVisible(bool visible)
void Scene::addCloud(
int id,
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
const std::vector<pcl::Vertices> & polygons,
const rtabmap::Transform & pose,
const cv::Mat & image)
const pcl::IndicesPtr & indices,
const rtabmap::Transform & pose)
{
LOGI("addOrUpdateCloud cloud %d", id);
LOGI("add cloud %d (%d points %d indices)", id, (int)cloud->size(), indices.get()?(int)indices->size():0);
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
if(iter != pointClouds_.end())
{
@@ -422,17 +663,83 @@ void Scene::addCloud(
}
//create
UASSERT(cloud_shader_program_ != 0 && texture_mesh_shader_program_!=0);
PointCloudDrawable * drawable = new PointCloudDrawable(
cloud_shader_program_,
texture_mesh_shader_program_,
cloud,
polygons,
image);
PointCloudDrawable * drawable = new PointCloudDrawable(cloud, indices);
drawable->setPose(pose);
pointClouds_.insert(std::make_pair(id, drawable));
}
void Scene::addMesh(
int id,
const Mesh & mesh,
const rtabmap::Transform & pose,
bool createWireframe)
{
LOGI("add mesh %d", id);
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
if(iter != pointClouds_.end())
{
delete iter->second;
pointClouds_.erase(iter);
}
//create
PointCloudDrawable * drawable = new PointCloudDrawable(mesh, createWireframe);
drawable->setPose(pose);
pointClouds_.insert(std::make_pair(id, drawable));
if(!mesh.pose.isNull() && mesh.cloud->size() && (!mesh.cloud->isOrganized() || mesh.indices->size()))
{
UTimer time;
float height = 0.0f;
Eigen::Affine3f affinePose = mesh.pose.toEigen3f();
if(mesh.polygons.size())
{
for(unsigned int i=0; i<mesh.polygons.size(); ++i)
{
for(unsigned int j=0; j<mesh.polygons[i].vertices.size(); ++j)
{
pcl::PointXYZRGB pt = pcl::transformPoint(mesh.cloud->at(mesh.polygons[i].vertices[j]), affinePose);
if(pt.z < height)
{
height = pt.z;
}
}
}
}
else
{
if(mesh.cloud->isOrganized())
{
for(unsigned int i=0; i<mesh.indices->size(); ++i)
{
pcl::PointXYZRGB pt = pcl::transformPoint(mesh.cloud->at(mesh.indices->at(i)), affinePose);
if(pt.z < height)
{
height = pt.z;
}
}
}
else
{
for(unsigned int i=0; i<mesh.cloud->size(); ++i)
{
pcl::PointXYZRGB pt = pcl::transformPoint(mesh.cloud->at(i), affinePose);
if(pt.z < height)
{
height = pt.z;
}
}
}
}
if(grid_->GetPosition().y == kHeightOffset.y || grid_->GetPosition().y > height)
{
grid_->SetPosition(glm::vec3(0,height,0));
}
LOGD("compute min height %f s", time.ticks());
}
}
void Scene::setCloudPose(int id, const rtabmap::Transform & pose)
{
@@ -458,7 +765,52 @@ bool Scene::hasCloud(int id) const
return pointClouds_.find(id) != pointClouds_.end();
}
bool Scene::hasMesh(int id) const
{
return pointClouds_.find(id) != pointClouds_.end() && pointClouds_.at(id)->hasMesh();
}
bool Scene::hasTexture(int id) const
{
return pointClouds_.find(id) != pointClouds_.end() && pointClouds_.at(id)->hasTexture();
}
std::set<int> Scene::getAddedClouds() const
{
return uKeysSet(pointClouds_);
}
void Scene::updateCloudPolygons(int id, const std::vector<pcl::Vertices> & polygons)
{
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
if(iter != pointClouds_.end())
{
iter->second->updatePolygons(polygons);
}
}
void Scene::updateMesh(int id, const Mesh & mesh)
{
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
if(iter != pointClouds_.end())
{
iter->second->updateMesh(mesh);
}
}
void Scene::updateGains(int id, float gainR, float gainG, float gainB)
{
std::map<int, PointCloudDrawable*>::iterator iter=pointClouds_.find(id);
if(iter != pointClouds_.end())
{
iter->second->setGains(gainR, gainG, gainB);
}
}
void Scene::setGridColor(float r, float g, float b)
{
if(grid_)
{
grid_->SetColor(r, g, b);
}
}

View File

@@ -37,6 +37,7 @@
#include <point_cloud_drawable.h>
#include <graph_drawable.h>
#include <bounding_box_drawable.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
@@ -56,6 +57,10 @@ class Scene {
// Setup GL view port.
void SetupViewPort(int w, int h);
int getViewPortWidth() const {return screenWidth_;}
int getViewPortHeight() const {return screenHeight_;}
void setScreenRotation(TangoSupportRotation colorCameraToDisplayRotation) {color_camera_to_display_rotation_ = colorCameraToDisplayRotation;}
void clear(); // removed all point clouds
@@ -75,7 +80,7 @@ class Scene {
void SetCameraPose(const rtabmap::Transform & pose);
rtabmap::Transform GetCameraPose() const {return currentPose_!=0?*currentPose_:rtabmap::Transform();}
rtabmap::Transform GetOpenGLCameraPose(float * fov) const;
rtabmap::Transform GetOpenGLCameraPose(float * fov = 0) const;
// Touch event passed from android activity. This function only support two
// touches.
@@ -94,23 +99,50 @@ class Scene {
const std::multimap<int, rtabmap::Link> & links);
void setGraphVisible(bool visible);
void setGridVisible(bool visible);
void setTraceVisible(bool visible);
void addCloud(
int id,
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
const std::vector<pcl::Vertices> & polygons,
const rtabmap::Transform & pose,
const cv::Mat & image = cv::Mat());
const pcl::IndicesPtr & indices,
const rtabmap::Transform & pose);
void addMesh(
int id,
const Mesh & mesh,
const rtabmap::Transform & pose,
bool createWireframe = false);
void setCloudPose(int id, const rtabmap::Transform & pose);
void setCloudVisible(int id, bool visible);
bool hasCloud(int id) const;
bool hasMesh(int id) const;
bool hasTexture(int id) const;
std::set<int> getAddedClouds() const;
void updateCloudPolygons(int id, const std::vector<pcl::Vertices> & polygons);
void updateMesh(int id, const Mesh & mesh);
void updateGains(int id, float gainR, float gainG, float gainB);
void setBlending(bool enabled) {blending_ = enabled;}
void setMapRendering(bool enabled) {mapRendering_ = enabled;}
void setMeshRendering(bool enabled) {meshRendering_ = enabled;}
void setMeshRendering(bool enabled, bool withTexture) {meshRendering_ = enabled; meshRenderingTexture_ = withTexture;}
void setPointSize(float size) {pointSize_ = size;}
void setFOV(float angle);
void setOrthoCropFactor(float value);
void setGridRotation(float angleDeg);
void setLighting(bool enabled) {lighting_ = enabled;}
void setBackfaceCulling(bool enabled) {backfaceCulling_ = enabled;}
void setWireframe(bool enabled) {wireFrame_ = enabled;}
void setBackgroundColor(float r, float g, float b) {r_=r; g_=g; b_=b;} // 0.0f <> 1.0f
void setGridColor(float r, float g, float b);
bool isBlending() const {return blending_;}
bool isMapRendering() const {return mapRendering_;}
bool isMeshRendering() const {return meshRendering_;}
bool isMeshTexturing() const {return meshRendering_ && meshRenderingTexture_;}
float getPointSize() const {return pointSize_;}
bool isLighting() const {return lighting_;}
bool isBackfaceCulling() const {return backfaceCulling_;}
private:
// Camera object that allows user to use touch input to interact with.
@@ -125,24 +157,43 @@ class Scene {
// Ground grid.
tango_gl::Grid* grid_;
// Bounding box
BoundingBoxDrawable * box_;
// Trace of pose data.
tango_gl::Trace* trace_;
GraphDrawable * graph_;
bool graphVisible_;
bool gridVisible_;
bool traceVisible_;
TangoSupportRotation color_camera_to_display_rotation_;
std::map<int, PointCloudDrawable*> pointClouds_;
rtabmap::Transform * currentPose_;
// Shader to display point cloud.
GLuint cloud_shader_program_;
GLuint texture_mesh_shader_program_;
GLuint graph_shader_program_;
bool blending_;
bool mapRendering_;
bool meshRendering_;
bool meshRenderingTexture_;
float pointSize_;
bool boundingBoxRendering_;
bool lighting_;
bool backfaceCulling_;
bool wireFrame_;
float r_;
float g_;
float b_;
GLuint fboId_;
GLuint depthTexture_;
GLsizei screenWidth_;
GLsizei screenHeight_;
bool doubleTapOn_;
cv::Point2f doubleTapPos_;
};
#endif // TANGO_POINT_CLOUD_SCENE_H_

View File

@@ -22,8 +22,13 @@ namespace tango_gl {
Camera::Camera() {
field_of_view_ = 45.0f * DEGREE_2_RADIANS;
aspect_ratio_ = 4.0f / 3.0f;
near_clip_plane_ = 0.1f;
far_clip_plane_ = 100.0f;
width_ = 800.0f;
height_ = 600.0f;
near_clip_plane_ = 0.2f;
far_clip_plane_ = 1000.0f;
ortho_ = false;
orthoScale_ = 2.0f;
orthoCropFactor_ = -1.0f;
}
glm::mat4 Camera::GetViewMatrix() {
@@ -31,18 +36,29 @@ glm::mat4 Camera::GetViewMatrix() {
}
glm::mat4 Camera::GetProjectionMatrix() {
return glm::perspective(field_of_view_, aspect_ratio_,
near_clip_plane_, far_clip_plane_);
if(ortho_)
{
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) {
aspect_ratio_ = aspect_ratio;
void Camera::SetWindowSize(float width, float height) {
width_ = width;
height_ = height;
aspect_ratio_ = width/height;
}
void Camera::SetFieldOfView(float fov) {
field_of_view_ = fov * DEGREE_2_RADIANS;
}
void Camera::SetNearFarClipPlanes(const float near, const float far)
{
near_clip_plane_ = near;
far_clip_plane_ = far;
}
Camera::~Camera() {
}

View File

@@ -16,6 +16,7 @@
#include "tango-gl/gesture_camera.h"
#include "tango-gl/util.h"
#include "glm/gtx/quaternion.hpp"
namespace {
// Render camera observation distance in third person camera mode.
@@ -30,8 +31,14 @@ const float kTopDownCameraDist = 5.0f;
// Zoom in speed.
const float kZoomSpeed = 10.0f;
// Move speed
const float kMoveSpeed = 10.0f;
// Rotation speed
const float kRotationSpeed = 2.0f;
// Min/max clamp value of camera observation distance.
const float kCamViewMinDist = 1.0f;
const float kCamViewMinDist = .1f;
const float kCamViewMaxDist = 100.f;
// FOV set up values.
@@ -55,55 +62,83 @@ GestureCamera::GestureCamera() :
GestureCamera::~GestureCamera() { delete cam_parent_transform_; }
void GestureCamera::OnTouchEvent(int touch_count, TouchEvent event, float x0,
float y0, float x1, float y1) {
if (camera_type_ == kFirstPerson) {
return;
}
float y0, float x1, float y1) {
if (touch_count == 1) {
switch (event) {
case kTouch0Down: {
cam_start_angle_ = cam_cur_angle_;
if (camera_type_!=kFirstPerson && touch_count == 1) {
switch (event) {
case kTouch0Down: {
cam_start_angle_ = cam_cur_angle_;
touch0_start_position_.x = x0;
touch0_start_position_.y = y0;
break;
}
case kTouchMove: {
float rotation_x = touch0_start_position_.y - y0;
float rotation_y = touch0_start_position_.x - x0;
touch0_start_position_.x = x0;
touch0_start_position_.y = y0;
break;
}
case kTouchMove: {
glm::vec2 offset;
cam_cur_angle_.x = cam_start_angle_.x + rotation_x;
cam_cur_angle_.y = cam_start_angle_.y + rotation_y;
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;
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,
kCamViewMinDist, kCamViewMaxDist);
StartCameraToCurrentTransform();
break;
}
default: { break; }
}
}
float rotation_x = (touch0_start_position_.y - y0) * kRotationSpeed;
float rotation_y = (touch0_start_position_.x - x0) * kRotationSpeed;
if(camera_type_!=kTopOrtho)
cam_cur_angle_.x = cam_start_angle_.x + rotation_x;
cam_cur_angle_.y = cam_start_angle_.y + rotation_y;
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;
cam_start_fov_ = this->getFOV();
// 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);
if(camera_type_ == kFirstPerson)
{
this->SetFieldOfView(tango_gl::util::Clamp(cam_start_fov_ + dist * kZoomSpeed*10.0f, 45, 90));
}
else
{
cam_cur_dist_ = tango_gl::util::Clamp(cam_start_dist_ + dist * kZoomSpeed,
kCamViewMinDist, kCamViewMaxDist);
this->SetOrthoMode(camera_type_ == kTopOrtho);
if(camera_type_ == kTopOrtho)
{
this->SetOrthoScale(cam_cur_dist_);
}
glm::vec2 touch_center_position((x0+x1)/2.0f, (y0+y1)/2.0f);
glm::vec2 offset;
offset.x = (touch_center_position.x - touch0_start_position_.x) * kMoveSpeed;
offset.y = (touch_center_position.y - touch0_start_position_.y) * kMoveSpeed;
touch0_start_position_ = touch_center_position;
StartCameraToCurrentTransform();
anchor_offset_ += glm::rotate(cam_parent_transform_->GetRotation(), glm::vec3(-offset.x, offset.y, 0));
}
break;
}
default: { break; }
}
}
}
Segment GestureCamera::GetSegmentFromTouch(float normalized_x,
@@ -126,7 +161,10 @@ Segment GestureCamera::GetSegmentFromTouch(float normalized_x,
}
void GestureCamera::SetAnchorPosition(const glm::vec3& pos, const glm::quat & rotation) {
cam_parent_transform_->SetPosition(pos);
// Anchor position
cam_parent_transform_->SetPosition(pos+anchor_offset_);
// Anchor rotation
if(camera_type_ == kThirdPersonFollow)
{
cam_cur_target_rot_ = rotation;
@@ -141,10 +179,12 @@ void GestureCamera::SetCameraType(CameraType camera_index) {
camera_type_ = camera_index;
switch (camera_index) {
case kFirstPerson:
SetOrthoMode(false);
SetFieldOfView(kLowFov);
SetPosition(glm::vec3(0.0f, 0.0f, 0.0f));
SetRotation(glm::quat(1.0f, 0.0f, 0.0f, 0.0f));
cam_cur_dist_ = 0.0f;
anchor_offset_ = glm::vec3(0.0f,0.0f,0.0f);
cam_cur_angle_.x = 0.0f;
cam_cur_angle_.y = 0.0f;
cam_cur_target_rot_ = glm::quat(1,0,0,0);
@@ -153,25 +193,42 @@ void GestureCamera::SetCameraType(CameraType camera_index) {
break;
case kThirdPerson:
case kThirdPersonFollow:
SetFieldOfView(kHighFov);
SetOrthoMode(false);
SetFieldOfView(kHighFov);
SetPosition(glm::vec3(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_angle_.x = -M_PI / 4.0f;
anchor_offset_ = glm::vec3(0.0f,0.0f,0.0f);
cam_cur_angle_.x = -M_PI / 6.0f;
cam_cur_angle_.y = kThirdPersonFollow?0:M_PI / 4.0f;
cam_cur_target_rot_ = glm::quat(1,0,0,0);
StartCameraToCurrentTransform();
break;
case kTopDown:
SetFieldOfView(kHighFov);
SetPosition(glm::vec3(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;
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;
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:
break;
}
@@ -179,9 +236,12 @@ void GestureCamera::SetCameraType(CameraType camera_index) {
void GestureCamera::StartCameraToCurrentTransform()
{
//Anchor rotation
glm::quat parent_cam_rot = glm::rotate(cam_cur_target_rot_, cam_cur_angle_.y, glm::vec3(0, 1, 0));
parent_cam_rot = glm::rotate(parent_cam_rot, cam_cur_angle_.x, glm::vec3(1, 0, 0));
SetPosition(glm::vec3(0.0f, 0.0f, cam_cur_dist_));
cam_parent_transform_->SetRotation(parent_cam_rot);
//Camera position
SetPosition(glm::vec3(0, 0, cam_cur_dist_));
}
} // namespace tango_gl

View File

@@ -27,11 +27,17 @@ class Camera : public Transform {
Camera& operator=(const Camera&) = delete;
~Camera();
void SetAspectRatio(const float aspect_ratio);
void SetWindowSize(const float width, const float height);
void SetFieldOfView(const float fov);
void SetOrthoMode(bool enabled) {ortho_ = enabled;}
void SetOrthoScale(float scale) {orthoScale_ = scale;}
void SetOrthoCropFactor(float value) {orthoCropFactor_ = value;}
void SetNearFarClipPlanes(const float near, const float far);
glm::mat4 GetViewMatrix();
glm::mat4 GetProjectionMatrix();
float getNearClipPlane() const {return near_clip_plane_;}
float getFarClipPlane() const {return far_clip_plane_;}
/**
* Create an OpenGL perspective matrix from window size, camera intrinsics, and clip settings.
@@ -52,7 +58,12 @@ class Camera : public Transform {
protected:
float field_of_view_;
float aspect_ratio_;
float width_;
float height_;
float near_clip_plane_, far_clip_plane_;
bool ortho_;
float orthoScale_;
float orthoCropFactor_;
};
} // namespace tango_gl
#endif // TANGO_GL_CAMERA_H_

View File

@@ -29,7 +29,8 @@ class GestureCamera : public Camera {
kFirstPerson = 0,
kThirdPersonFollow = 1,
kTopDown = 2,
kThirdPerson = 3
kTopOrtho = 3,
kThirdPerson = 4
};
enum TouchEvent {
@@ -55,6 +56,11 @@ class GestureCamera : public Camera {
float touch_range);
void SetAnchorPosition(const glm::vec3& pos, const glm::quat & rotation);
void SetAnchorOffset(const glm::vec3& pos) {anchor_offset_ = pos;}
const glm::vec3& GetAnchorOffset() const {return anchor_offset_;}
void SetCameraDistance(float cameraDistance) {cam_cur_dist_ = cameraDistance;}
float GetCameraDistance() const {return cam_cur_dist_;}
// Set camera type, set render camera's parent position and rotation.
void SetCameraType(CameraType camera_index);
@@ -75,7 +81,9 @@ class GestureCamera : public Camera {
glm::quat cam_cur_target_rot_;
float cam_start_dist_;
float cam_start_fov_;
float cam_cur_dist_;
glm::vec3 anchor_offset_;
float start_touch_dist_;
float cur_touch_dist_;

View File

@@ -25,6 +25,7 @@
#include <android/log.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <tango_support_api.h>
#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"
@@ -33,9 +34,15 @@
#include "glm/gtx/matrix_decompose.hpp"
#define LOG_TAG "rtabmap"
#ifdef DISABLE_LOG
#define LOGD(...) ;
#define LOGI(...) ;
#define LOGW(...) ;
#else
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#endif
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#ifndef M_PI
@@ -76,6 +83,33 @@ namespace util {
const glm::vec3& start, const glm::vec3& end);
glm::vec3 ApplyTransform(const glm::mat4& mat, const glm::vec3& vec);
// Get the Android rotation integer value from color camera to display.
// This function is used to compute the orientation difference to handle
// the portrait and landscape mode for color camera display.
//
// @param display: integer value of display orientation, values available
// are 0, 1, 2 ,3. Followed by Android display orientation standard:
// https://developer.android.com/reference/android/view/Display.html#getRotation()
// @param color_camera: integer value of color camera oreintation, values
// available are 0, 90, 180, 270. Followed by Android camera orientation
// standard:
// https://developer.android.com/reference/android/hardware/Camera.CameraInfo.html#orientation
TangoSupportRotation GetAndroidRotationFromColorCameraToDisplay(
int display_rotation, int color_camera_rotation);
// Get the Android rotation integer value from color camera to display.
// This function is used to compute the orientation difference to handle
// the portrait and landscape mode for color camera display.
//
// @param display: the device display orientation.
// @param color_camera: integer value of color camera oreintation, values
// available are 0, 90, 180, 270. Followed by Android camera orientation
// standard:
// https://developer.android.com/reference/android/hardware/Camera.CameraInfo.html#orientation
TangoSupportRotation GetAndroidRotationFromColorCameraToDisplay(
TangoSupportRotation display_rotation, int color_camera_rotation);
} // namespace util
} // namespace tango_gl
#endif // TANGO_GL_RENDERER_GL_UTIL

View File

@@ -19,6 +19,27 @@
namespace tango_gl {
namespace {
int NormalizedColorCameraRotation(int camera_rotation) {
int camera_n = 0;
switch (camera_rotation) {
case 90:
camera_n = 1;
break;
case 180:
camera_n = 2;
break;
case 270:
camera_n = 3;
break;
default:
camera_n = 0;
break;
}
return camera_n;
}
} // annonymous namespace
void util::CheckGlError(const char* operation) {
for (GLint error = glGetError(); error; error = glGetError()) {
LOGE("after %s() glError (0x%x)\n", operation, error);
@@ -217,4 +238,23 @@ glm::vec3 util::ApplyTransform(const glm::mat4& mat, const glm::vec3& vec) {
return glm::vec3(mat * glm::vec4(vec, 1.0f));
}
TangoSupportRotation util::GetAndroidRotationFromColorCameraToDisplay(
int display_rotation, int color_camera_rotation) {
TangoSupportRotation r =
static_cast<TangoSupportRotation>(display_rotation);
return util::GetAndroidRotationFromColorCameraToDisplay(
r, color_camera_rotation);
}
TangoSupportRotation util::GetAndroidRotationFromColorCameraToDisplay(
TangoSupportRotation display_rotation, int color_camera_rotation) {
int color_camera_n = NormalizedColorCameraRotation(color_camera_rotation);
int ret = static_cast<int>(display_rotation) - color_camera_n;
if (ret < 0) {
ret += 4;
}
return static_cast<TangoSupportRotation>(ret % 4);
}
} // namespace tango_gl

View File

@@ -0,0 +1 @@

View File

@@ -32,17 +32,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <android/log.h>
#include <rtabmap/utilite/UEventsHandler.h>
#include <rtabmap/utilite/ULogger.h>
#include <rtabmap/core/CameraModel.h>
#include <tango-gl/util.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/Vertices.h>
#include <pcl/pcl_base.h>
class LogHandler : public UEventsHandler
{
public:
LogHandler()
{
ULogger::setLevel(ULogger::kDebug);
ULogger::setEventLevel(ULogger::kDebug);
ULogger::setPrintThreadId(true);
registerToEventsManager();
}
protected:
virtual void handleEvent(UEvent * event)
virtual bool handleEvent(UEvent * event)
{
if(event->getClassName().compare("ULogEvent") == 0)
{
@@ -65,25 +74,31 @@ protected:
}
}
return false;
}
};
static const rtabmap::Transform opengl_world_T_tango_world(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f);
static const rtabmap::Transform depth_camera_T_opengl_camera(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, -1.0f, 0.0f);
static const rtabmap::Transform rtabmap_world_T_tango_world(
0.0f, 1.0f, 0.0f, 0.0f,
-1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f);
static const rtabmap::Transform tango_device_T_rtabmap_device(
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
-1.0f, 0.0f, 0.0f, 0.0f);
static const rtabmap::Transform opengl_world_T_rtabmap_world(
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
-1.0f, 0.0f, 0.0f, 0.0f);
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
-1.0f, 0.0f, 0.0f, 0.0f);
static const rtabmap::Transform rtabmap_world_T_opengl_world(
static const rtabmap::Transform rtabmap_device_T_opengl_device(
0.0f, 0.0f, -1.0f, 0.0f,
-1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f);
@@ -129,4 +144,33 @@ inline rtabmap::Transform glmToTransform(const glm::mat4 & mat)
return transform;
}
class Mesh
{
public:
Mesh() :
cloud(new pcl::PointCloud<pcl::PointXYZRGB>),
normals(new pcl::PointCloud<pcl::Normal>),
indices(new std::vector<int>),
visible(true)
{
gains[0] = gains[1] = gains[2] = 1.0f;
}
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud; // organized cloud
pcl::PointCloud<pcl::Normal>::Ptr normals;
pcl::IndicesPtr indices;
std::vector<pcl::Vertices> polygons;
std::vector<pcl::Vertices> polygonsLowRes;
rtabmap::Transform pose; // in rtabmap coordinates
bool visible;
rtabmap::CameraModel cameraModel;
double gains[3]; // RGB gains
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > texCoords;
#else
std::vector<Eigen::Vector2f> texCoords;
#endif
cv::Mat texture;
};
#endif /* UTIL_H_ */

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape>
<gradient
android:endColor="#00ffffff"
android:startColor="#ff686868"
android:useLevel="false" />
</shape>
</item>
</layer-list>

View File

@@ -15,244 +15,130 @@
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
android:layout_height="wrap_content">
<android.opengl.GLSurfaceView
android:id="@+id/gl_surface_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="top" />
<LinearLayout
android:id="@+id/debug_layout"
android:layout_gravity="top"/>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:orientation="vertical"
android:paddingLeft="5dp" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/status" />
<TextView
android:id="@+id/status"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/nodes" />
<TextView
android:id="@+id/nodes"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/words" />
<TextView
android:id="@+id/words"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/memory" />
<TextView
android:id="@+id/memory"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/db_size" />
<TextView
android:id="@+id/db_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/points" />
<TextView
android:id="@+id/points"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/polygons" />
<TextView
android:id="@+id/polygons"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/update_time" />
<TextView
android:id="@+id/update_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/features" />
<TextView
android:id="@+id/features"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/total_loop" />
<TextView
android:id="@+id/total_loop"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/inliers" />
<TextView
android:id="@+id/inliers"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hypothesis" />
<TextView
android:id="@+id/hypothesis"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/first_person_button"
android:layout_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/third_person_button"
android:layout_alignLeft="@+id/third_person_button"
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:text="@string/first_person" />
<Button
android:id="@+id/top_down_button"
android:textOff="@string/wireframe"
android:textOn="@string/wireframe" />
<ToggleButton
android:id="@+id/light_button"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_above="@+id/backface_button"
android:layout_alignLeft="@+id/backface_button"
android:layout_alignParentRight="true"
android:layout_marginBottom="5dp"
android:layout_marginRight="5dp"
android:paddingRight="5dp"
android:textOff="@string/light_off"
android:textOn="@string/light_on" />
<ToggleButton
android:id="@+id/backface_button"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_above="@+id/camera_button"
android:layout_alignRight="@+id/camera_button"
android:layout_alignParentRight="true"
android:layout_marginBottom="15dp"
android:layout_marginRight="5dp"
android:paddingRight="5dp"
android:textOff="@string/backface_off"
android:textOn="@string/backface_on" />
<com.introlab.rtabmap.NDSpinner
android:id="@+id/camera_button"
android:layout_width="140dp"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="5dp"
android:layout_marginBottom="10dp"
android:paddingRight="5dp"
android:text="@string/top_down" />
android:paddingBottom="10dp"
android:text="@string/camera_button"
android:spinnerMode="dropdown"/>
<Button
android:id="@+id/third_person_button"
<ToggleButton
android:id="@+id/pause_button"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_above="@+id/top_down_button"
android:layout_marginRight="5dp"
android:layout_alignParentTop="true"
android:layout_marginTop="10dp"
android:layout_alignParentRight="true"
android:layout_marginBottom="5dp"
android:layout_marginRight="5dp"
android:paddingRight="5dp"
android:text="@string/third_person" />
android:textOff="@string/pause"
android:textOn="@string/resume" />
<Button
android:id="@+id/button_shareToSketchfab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
android:layout_marginTop="10dp"
android:layout_alignParentRight="true"
android:layout_below="@+id/pause_button"
android:text="@string/share_to_sketchfab" />
<Button
android:id="@+id/button_saveOnDevice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/button_shareToSketchfab"
android:layout_below="@+id/button_shareToSketchfab"
android:text="@string/save_to_file" />
<Button
android:id="@+id/close_visualization_button"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_above="@+id/camera_button"
android:layout_centerHorizontal="true"
android:text="@string/close_visualization" />
<SeekBar
android:id="@+id/seekBar_ortho_cut"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:rotation="270"
android:layout_above="@+id/light_button"
android:layout_alignParentLeft="true"
android:layout_gravity="center"
android:layout_marginLeft="-50dp"
android:progressDrawable="@drawable/custom_seekbar" />
<SeekBar
android:id="@+id/seekBar_grid"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignBottom="@+id/camera_button"
android:layout_marginLeft="35dp"
android:paddingBottom="10dp"
android:progressDrawable="@drawable/custom_seekbar" />
</RelativeLayout>
</RelativeLayout>

View File

@@ -0,0 +1,348 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/pref_title_rendering">
<ListPreference
android:key="@string/pref_key_density"
android:title="@string/pref_title_density"
android:summary="@string/pref_summary_density"
android:entries="@array/pref_density_keys"
android:entryValues="@array/pref_density_values"
android:defaultValue="@string/pref_default_density"/>
<ListPreference
android:key="@string/pref_key_depth"
android:title="@string/pref_title_depth"
android:summary="@string/pref_summary_depth"
android:entries="@array/pref_depth_keys"
android:entryValues="@array/pref_depth_values"
android:defaultValue="@string/pref_default_depth"/>
<ListPreference
android:key="@string/pref_key_min_depth"
android:title="@string/pref_title_min_depth"
android:summary="@string/pref_summary_min_depth"
android:entries="@array/pref_min_depth_keys"
android:entryValues="@array/pref_min_depth_values"
android:defaultValue="@string/pref_default_min_depth"/>
<ListPreference
android:key="@string/pref_key_point_size"
android:title="@string/pref_title_point_size"
android:summary="@string/pref_summary_point_size"
android:entries="@array/pref_point_size_values"
android:entryValues="@array/pref_point_size_values"
android:defaultValue="@string/pref_default_point_size"/>
<ListPreference
android:key="@string/pref_key_angle"
android:title="@string/pref_title_angle"
android:summary="@string/pref_summary_angle"
android:entries="@array/pref_angle_keys"
android:entryValues="@array/pref_angle_values"
android:defaultValue="@string/pref_default_angle"/>
<ListPreference
android:key="@string/pref_key_triangle"
android:title="@string/pref_title_triangle"
android:summary="@string/pref_summary_triangle"
android:entries="@array/pref_triangle_keys"
android:entryValues="@array/pref_triangle_values"
android:defaultValue="@string/pref_default_triangle"/>
<ListPreference
android:key="@string/pref_key_rendering_texture_decimation"
android:title="@string/pref_title_rendering_texture_decimation"
android:summary="@string/pref_summary_rendering_texture_decimation"
android:entries="@array/pref_rendering_texture_decimation_keys"
android:entryValues="@array/pref_rendering_texture_decimation_values"
android:defaultValue="@string/pref_default_rendering_texture_decimation"/>
<ListPreference
android:key="@string/pref_key_background_color"
android:title="@string/pref_title_background_color"
android:summary="@string/pref_summary_background_color"
android:entries="@array/pref_background_color_keys"
android:entryValues="@array/pref_background_color_values"
android:defaultValue="@string/pref_default_background_color"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_blending"
android:title="@string/pref_title_blending"
android:summary="@string/pref_summary_blending"
android:defaultValue="@string/pref_default_blending"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_nodes_filtering"
android:title="@string/pref_title_nodes_filtering"
android:summary="@string/pref_summary_nodes_filtering"
android:defaultValue="@string/pref_default_nodes_filtering"/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/pref_title_general">
<PreferenceScreen
android:key="pref_button_mapping"
android:title="@string/pref_title_mapping_sub"
android:summary="@string/pref_summary_mapping"
android:persistent="false">
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_append"
android:title="@string/pref_title_append"
android:summary="@string/pref_summary_append"
android:defaultValue="@string/pref_default_append"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_resolution"
android:title="@string/pref_title_resolution"
android:summary="@string/pref_summary_resolution"
android:defaultValue="@string/pref_default_resolution"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_smoothing"
android:title="@string/pref_title_smoothing"
android:summary="@string/pref_summary_smoothing"
android:defaultValue="@string/pref_default_smoothing"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_fisheye"
android:title="@string/pref_title_fisheye"
android:summary="@string/pref_summary_fisheye"
android:defaultValue="@string/pref_default_fisheye"/>
<PreferenceCategory
android:title="@string/pref_title_mapping_core">
<ListPreference
android:key="@string/pref_key_update_rate"
android:title="@string/pref_title_update_rate"
android:summary="@string/pref_summary_update_rate"
android:entries="@array/pref_update_rate_keys"
android:entryValues="@array/pref_update_rate_values"
android:defaultValue="@string/pref_default_update_rate"/>
<ListPreference
android:key="@string/pref_key_max_speed"
android:title="@string/pref_title_max_speed"
android:summary="@string/pref_summary_max_speed"
android:entries="@array/pref_max_speed_keys"
android:entryValues="@array/pref_max_speed_values"
android:defaultValue="@string/pref_default_max_speed"/>
<ListPreference
android:key="@string/pref_key_time_thr"
android:title="@string/pref_title_time_thr"
android:summary="@string/pref_summary_time_thr"
android:entries="@array/pref_time_thr_keys"
android:entryValues="@array/pref_time_thr_values"
android:defaultValue="@string/pref_default_time_thr"/>
<ListPreference
android:key="@string/pref_key_mem_thr"
android:title="@string/pref_title_mem_thr"
android:summary="@string/pref_summary_mem_thr"
android:entries="@array/pref_mem_thr_keys"
android:entryValues="@array/pref_mem_thr_values"
android:defaultValue="@string/pref_default_mem_thr"/>
<ListPreference
android:key="@string/pref_key_loop_thr"
android:title="@string/pref_title_loop_thr"
android:summary="@string/pref_summary_loop_thr"
android:entries="@array/pref_loop_thr_keys"
android:entryValues="@array/pref_loop_thr_values"
android:defaultValue="@string/pref_default_loop_thr"/>
<ListPreference
android:key="@string/pref_key_sim_thr"
android:title="@string/pref_title_sim_thr"
android:summary="@string/pref_summary_sim_thr"
android:entries="@array/pref_sim_thr_keys"
android:entryValues="@array/pref_sim_thr_values"
android:defaultValue="@string/pref_default_sim_thr"/>
<ListPreference
android:key="@string/pref_key_min_inliers"
android:title="@string/pref_title_min_inliers"
android:summary="@string/pref_summary_min_inliers"
android:entries="@array/pref_min_inliers_keys"
android:entryValues="@array/pref_min_inliers_values"
android:defaultValue="@string/pref_default_min_inliers"/>
<ListPreference
android:key="@string/pref_key_opt_error"
android:title="@string/pref_title_opt_error"
android:summary="@string/pref_summary_opt_error"
android:entries="@array/pref_opt_error_keys"
android:entryValues="@array/pref_opt_error_values"
android:defaultValue="@string/pref_default_opt_error"/>
<ListPreference
android:key="@string/pref_key_features_voc"
android:title="@string/pref_title_features_voc"
android:summary="@string/pref_summary_features_voc"
android:entries="@array/pref_features_voc_keys"
android:entryValues="@array/pref_features_voc_values"
android:defaultValue="@string/pref_default_features_voc"/>
<ListPreference
android:key="@string/pref_key_features"
android:title="@string/pref_title_features"
android:summary="@string/pref_summary_features"
android:entries="@array/pref_features_keys"
android:entryValues="@array/pref_features_values"
android:defaultValue="@string/pref_default_features"/>
<ListPreference
android:key="@string/pref_key_features_type"
android:title="@string/pref_title_features_type"
android:summary="@string/pref_summary_features_type"
android:entries="@array/pref_features_type_keys"
android:entryValues="@array/pref_features_type_values"
android:defaultValue="@string/pref_default_features_type"/>
<ListPreference
android:key="@string/pref_key_optimizer"
android:title="@string/pref_title_optimizer"
android:summary="@string/pref_summary_optimizer"
android:entries="@array/pref_optimizer_keys"
android:entryValues="@array/pref_optimizer_values"
android:defaultValue="@string/pref_default_optimizer"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_optimize_end"
android:title="@string/pref_title_optimize_end"
android:summary="@string/pref_summary_optimize_end"
android:defaultValue="@string/pref_default_optimize_end"/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/pref_title_mapping_database">
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_keep_all_db"
android:title="@string/pref_title_keep_all_db"
android:summary="@string/pref_summary_keep_all_db"
android:defaultValue="@string/pref_default_keep_all_db"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_raw_scan_saved"
android:title="@string/pref_title_raw_scan_saved"
android:summary="@string/pref_summary_raw_scan_saved"
android:defaultValue="@string/pref_default_raw_scan_saved"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_gps_saved"
android:title="@string/pref_title_gps_saved"
android:summary="@string/pref_summary_gps_saved"
android:defaultValue="@string/pref_default_gps_saved"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_db_in_memory"
android:title="@string/pref_title_db_in_memory"
android:summary="@string/pref_summary_db_in_memory"
android:defaultValue="@string/pref_default_db_in_memory"/>
</PreferenceCategory>
</PreferenceScreen>
<PreferenceScreen
android:key="pref_button_export"
android:title="@string/pref_title_export_sub"
android:summary="@string/pref_summary_export"
android:persistent="false">
<ListPreference
android:key="@string/pref_key_cloud_voxel"
android:title="@string/pref_title_cloud_voxel"
android:summary="@string/pref_summary_cloud_voxel"
android:entries="@array/pref_cloud_voxel_keys"
android:entryValues="@array/pref_cloud_voxel_values"
android:defaultValue="@string/pref_default_cloud_voxel"/>
<ListPreference
android:key="@string/pref_key_texture_size"
android:title="@string/pref_title_texture_size"
android:summary="@string/pref_summary_texture_size"
android:entries="@array/pref_texture_size_keys"
android:entryValues="@array/pref_texture_size_values"
android:defaultValue="@string/pref_default_texture_size"/>
<ListPreference
android:key="@string/pref_key_texture_count"
android:title="@string/pref_title_texture_count"
android:summary="@string/pref_summary_texture_count"
android:entries="@array/pref_texture_count_keys"
android:entryValues="@array/pref_texture_count_values"
android:defaultValue="@string/pref_default_texture_count"/>
<ListPreference
android:key="@string/pref_key_normal_k"
android:title="@string/pref_title_normal_k"
android:summary="@string/pref_summary_normal_k"
android:entries="@array/pref_normal_k_values"
android:entryValues="@array/pref_normal_k_values"
android:defaultValue="@string/pref_default_normal_k"/>
<ListPreference
android:key="@string/pref_key_max_texture_distance"
android:title="@string/pref_title_max_texture_distance"
android:summary="@string/pref_summary_max_texture_distance"
android:entries="@array/pref_max_texture_distance_keys"
android:entryValues="@array/pref_max_texture_distance_values"
android:defaultValue="@string/pref_default_max_texture_distance"/>
<ListPreference
android:key="@string/pref_key_min_texture_cluster_size"
android:title="@string/pref_title_min_texture_cluster_size"
android:summary="@string/pref_summary_min_texture_cluster_size"
android:entries="@array/pref_min_texture_cluster_size_keys"
android:entryValues="@array/pref_min_texture_cluster_size_values"
android:defaultValue="@string/pref_default_min_texture_cluster_size"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_block_render"
android:title="@string/pref_title_block_render"
android:summary="@string/pref_summary_block_render"
android:defaultValue="@string/pref_default_block_render"/>
<PreferenceCategory
android:title="@string/pref_title_optimized">
<ListPreference
android:key="@string/pref_key_opt_depth"
android:title="@string/pref_title_opt_depth"
android:summary="@string/pref_summary_opt_depth"
android:entries="@array/pref_opt_depth_keys"
android:entryValues="@array/pref_opt_depth_values"
android:defaultValue="@string/pref_default_opt_depth"/>
<ListPreference
android:key="@string/pref_key_opt_color_radius"
android:title="@string/pref_title_opt_color_radius"
android:summary="@string/pref_summary_opt_color_radius"
android:entries="@array/pref_opt_color_radius_keys"
android:entryValues="@array/pref_opt_color_radius_values"
android:defaultValue="@string/pref_default_opt_color_radius"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_opt_clean_white"
android:title="@string/pref_title_opt_clean_white"
android:summary="@string/pref_summary_opt_clean_white"
android:defaultValue="@string/pref_default_opt_clean_white"/>
<ListPreference
android:key="@string/pref_key_opt_min_cluster_size"
android:title="@string/pref_title_opt_min_cluster_size"
android:summary="@string/pref_summary_opt_min_cluster_size"
android:entries="@array/pref_opt_min_cluster_size_keys"
android:entryValues="@array/pref_opt_min_cluster_size_values"
android:defaultValue="@string/pref_default_opt_min_cluster_size"/>
</PreferenceCategory>
</PreferenceScreen>
<ListPreference
android:key="@string/pref_key_gain_max_radius"
android:title="@string/pref_title_gain_max_radius"
android:summary="@string/pref_summary_gain_max_radius"
android:entries="@array/pref_gain_max_radius_keys"
android:entryValues="@array/pref_gain_max_radius_values"
android:defaultValue="@string/pref_default_gain_max_radius"/>
<ListPreference
android:key="@string/pref_key_cluster_ratio"
android:title="@string/pref_title_cluster_ratio"
android:summary="@string/pref_summary_cluster_ratio"
android:entries="@array/pref_cluster_ratio_keys"
android:entryValues="@array/pref_cluster_ratio_values"
android:defaultValue="@string/pref_default_cluster_ratio"/>
<com.introlab.rtabmap.CustomSwitchPreference
android:key="@string/pref_key_notification_sound"
android:title="@string/pref_title_notification_sound"
android:summary="@string/pref_summary_notification_sound"
android:defaultValue="@string/pref_default_notification_sound"/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/pref_title_presets">
<Preference android:title="@string/pref_title_open_button"
android:key="@string/pref_key_open_button"/>
<Preference android:title="@string/pref_title_save_button"
android:key="@string/pref_key_save_button"/>
<Preference android:title="@string/pref_title_remove_button"
android:key="@string/pref_key_remove_button"/>
<Preference android:title="@string/pref_title_reset_button"
android:key="@string/pref_key_reset_button"/>
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:focusableInTouchMode="true" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Model Name*:" />
<EditText
android:id="@+id/editText_filename"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="flagNoExtractUi"
android:ems="10" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Description:" />
<EditText
android:id="@+id/editText_description"
android:ems="10"
android:lines="4"
android:minLines="2"
android:gravity="top|left"
android:maxLines="8"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:scrollbars="vertical"
android:imeOptions="flagNoExtractUi"
android:inputType="textMultiLine" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tags:" />
<EditText
android:id="@+id/editText_tags"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="flagNoExtractUi"
android:ems="10" />
<CheckBox
android:id="@+id/checkBox_draft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="Draft Mode" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="right|bottom"
android:orientation="horizontal" >
<Button
android:id="@+id/button_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.06"
android:text="Upload" />
</LinearLayout>
</LinearLayout>
</ScrollView>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<WebView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/webv"/>
</LinearLayout>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#fff">
<ImageView
android:id="@+id/imageView"
android:layout_width="@dimen/image_width"
android:layout_height="@dimen/image_width"
android:layout_marginLeft="10dp"
android:padding="5dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Demo"
android:textColor="#000" />
</LinearLayout>

View File

@@ -1,68 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/group_pause" android:checkableBehavior="all">
<item android:id="@+id/pause" android:checked="false" android:title="Pause"/>
</group>
<group android:id="@+id/group_actions">
<item android:id="@+id/post_processing" android:title="Post-Processing...">
<group android:checkableBehavior="single">
<item android:id="@+id/point_cloud" android:title="Point Cloud" />
<item android:id="@+id/mesh" android:title="Mesh" />
<item android:id="@+id/texture_mesh" android:checked="true" android:title="Texture Mesh" />
</group>
<item android:id="@+id/save" android:title="Save" android:showAsAction="ifRoom"/>
<item android:id="@+id/export" android:showAsAction="ifRoom" android:title="Export">
<menu>
<group android:id="@+id/group_post_processing">
<item android:id="@+id/detect_more_loop_closures" android:title="Detect More Loop Closures" />
<item android:id="@+id/global_graph_optimization" android:title="Global Graph Optimization" />
<item android:id="@+id/sba" android:title="Bundle Adjustement" />
</group>
<item android:id="@+id/export_point_cloud_menu" android:title="Point Cloud">
<menu>
<item android:id="@+id/export_point_cloud" android:title="Current Density" />
<item android:id="@+id/export_point_cloud_highrez" android:title="Max Density" />
</menu>
</item>
<item android:id="@+id/export_optimized_mesh_menu" android:title="Optimized Mesh..." >
<menu>
<item android:id="@+id/export_optimized_mesh" android:title="Colored Mesh" />
<item android:id="@+id/export_optimized_mesh_texture" android:title="Textured Mesh" />
</menu>
</item>
</menu>
</item>
<item android:id="@+id/open" android:title="Open"/>
<item android:id="@+id/save" android:title="Save"/>
<item android:id="@+id/export" android:title="Export...">
<menu>
<group android:id="@+id/group_export">
<item android:id="@+id/export_ply" android:title="Mesh (.ply)" />
<item android:id="@+id/export_obj" android:title="Mesh with texture (*.obj)" />
</group>
</menu>
</item>
<item android:id="@+id/reset" android:title="Reset"/>
<item android:id="@+id/menu_rendering_settings" android:title="Rendering Options...">
<item android:id="@+id/post_processing" android:title="Optimize" android:showAsAction="ifRoom">
<menu>
<item android:id="@+id/post_processing_standard" android:title="Standard Optimization" />
<item android:id="@+id/post_processing_advanced" android:title="Advanced..." >
<menu>
<item android:id="@+id/global_graph_optimization" android:title="Global Graph Optimization" />
<item android:id="@+id/detect_more_loop_closures" android:title="Detect More Loop Closures" />
<item android:id="@+id/gain_compensation_fast" android:title="Adjust Colors (Fast)" />
<item android:id="@+id/gain_compensation_full" android:title="Adjust Colors (Full)" />
<item android:id="@+id/bilateral_filtering" android:title="Mesh Smoothing" />
<item android:id="@+id/sba" android:title="Bundle Adjustement" />
<item android:id="@+id/polygons_filtering" android:title="Noise Filtering" />
</menu>
</item>
</menu>
</item>
<item android:id="@+id/open" android:title="Open" android:showAsAction="ifRoom"/>
<item android:id="@+id/menu_rendering_settings" android:title="Visibility...">
<menu >
<group android:id="@+id/group_rendering_visibility" android:checkableBehavior="all">
<item android:id="@+id/status" android:checked="true" android:title="Status" />
<item android:id="@+id/debug" android:checked="false" android:title="Debug" />
<item android:id="@+id/mesh_rendering" android:checked="true" android:title="Mesh Rendering" />
<item android:id="@+id/map_shown" android:checked="true" android:title="Map Visible" />
<item android:id="@+id/odom_shown" android:checked="true" android:title="Odom Visible" />
<item android:id="@+id/graph_visible" android:checked="true" android:title="Graph Visible" />
<item android:id="@+id/auto_exposure" android:checked="false" android:title="Auto Exposure" />
<item android:id="@+id/max_depth" android:checkable="false" android:title="Cloud/Mesh Max Depth..." />
<item android:id="@+id/mesh_angle_tolerance" android:checkable="false" android:title="Mesh Angle Tolerance..." />
<item android:id="@+id/mesh_triangle_size" android:checkable="false" android:title="Mesh Triangle Size..." />
<item android:id="@+id/grid_visible" android:checked="true" android:title="Grid Visible" />
<item android:id="@+id/graph_optimization" android:checked="true" android:title="Optimized Graph" />
</group>
</menu>
</item>
<item android:id="@+id/menu_mapping_settings" android:title="Mapping Options...">
<item android:id="@+id/modes" android:title="Modes...">
<menu >
<group android:id="@+id/group_mapping_visibility" android:checkableBehavior="all">
<item android:id="@+id/localization_mode" android:checked="false" android:title="Localization Mode" />
<item android:id="@+id/trajectory_mode" android:checked="false" android:title="Trajectory Mode" />
<item android:id="@+id/graph_optimization" android:checked="true" android:title="Optimized Graph" />
<item android:id="@+id/nodes_filtering" android:checked="false" android:title="Nodes Filtering" />
<item android:id="@+id/resolution" android:checked="false" android:title="720p Mode" />
<item android:id="@+id/menu_param_settings" android:checkable="false" android:title="Parameters...">
<menu >
<item android:id="@+id/update_rate" android:title="Map Update Rate..." />
<item android:id="@+id/time_threshold" android:title="Time Threshold..." />
<item android:id="@+id/loop_threshold" android:title="Loop Closure Threshold..." />
<item android:id="@+id/optimize_error" android:title="Max Optimization Error..." />
<item android:id="@+id/features" android:title="Max Features Extracted..." />
</menu>
</item>
<item android:id="@+id/data_recorder" android:checked="false" android:title="Data Recorder Mode" />
</group>
</menu>
</item>
<item android:id="@+id/settings" android:title="Settings"/>
<item android:id="@+id/reset" android:title="Reset"/>
<item android:id="@+id/about" android:title="About"/>
</group>
</menu>

View File

@@ -0,0 +1,9 @@
<resources>
<string-array name="camera_view_array">
<item>First View</item>
<item>Third-P. View</item>
<item>Top View</item>
<item>Ortho View</item>
</string-array>
</resources>

View File

@@ -0,0 +1,4 @@
<resources>
<dimen name="image_width">150dp</dimen>
</resources>

View File

@@ -1,24 +1,846 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">RTAB-Map</string>
<string name="sys_name">RTAB-Map</string>
<string name="menu_name">Real-Time Appearance-Based Mapping</string>
<string name="menu_name">RTAB-Map</string>
<string name="settings">Settings</string>
<string name="sketchfab">Upload to Sketchfab&#8230;</string>
<string name="status">"Status: "</string>
<string name="words">"Words: "</string>
<string name="first_person">First</string>
<string name="third_person">Third</string>
<string name="top_down">Top</string>
<string name="camera_button">First View</string>
<string name="pause">Pause</string>
<string name="resume">Resume</string>
<string name="backface_on">Backface</string>
<string name="backface_off">Backface</string>
<string name="light_on">Lighting</string>
<string name="light_off">Lighting</string>
<string name="wireframe">Wireframe</string>
<string name="close_visualization">Close Visualization</string>
<string name="save_to_file">Export to File&#8230;</string>
<string name="share_to_sketchfab">Share to Sketchfab&#8230;</string>
<string name="start">Start</string>
<string name="nodes">"Nodes (WM): "</string>
<string name="points">"Number of points: "</string>
<string name="update_time">"Update time (ms): "</string>
<string name="loop_closure">"Loop closure ID: "</string>
<string name="db_size">"Database (MB): "</string>
<string name="free_memory">"Free Memory (MB): "</string>
<string name="database_size">"Database (MB): "</string>
<string name="total_loop">"Loop closures: "</string>
<string name="inliers">"Inliers: "</string>
<string name="features">"Features: "</string>
<string name="rehearsal">"Rehearsal (%): "</string>
<string name="polygons">"Polygons: "</string>
<string name="memory">"Memory (MB): "</string>
<string name="hypothesis">"Hypothesis: "</string>
<string name="memory">"Used Memory (MB): "</string>
<string name="hypothesis">"Hypothesis (%): "</string>
<string name="fps">"FPS (rendering): "</string>
<string name="distance">"Distance travelled: "</string>
<string name="gps">"GPS (long,lat,alt,bearing,err): "</string>
<string name="time">"Time: "</string>
<!-- Preference keys: BEGIN -->
<string name="pref_key_tags">pref_key_tags</string>
<string name="pref_default_tags">rtabmap 3dscan tango</string>
<string name="pref_key_rendering">pref_key_rendering</string>
<string name="pref_default_rendering">2</string>
<string name="pref_key_open_button">pref_key_open_button</string>
<string name="pref_key_save_button">pref_key_save_button</string>
<string name="pref_key_remove_button">pref_key_remove_button</string>
<string name="pref_key_reset_button">pref_key_reset_button</string>
<string name="pref_key_density">pref_key_density</string>
<string name="pref_default_density">1</string>
<string name="pref_key_min_depth">pref_key_min_depth</string>
<string name="pref_default_min_depth">0</string>
<string name="pref_key_depth">pref_key_depth</string>
<string name="pref_default_depth">2.5</string>
<string name="pref_key_point_size">pref_key_point_size</string>
<string name="pref_default_point_size">10</string>
<string name="pref_key_angle">pref_key_angle</string>
<string name="pref_default_angle">20</string>
<string name="pref_key_triangle">pref_key_triangle</string>
<string name="pref_default_triangle">2</string>
<string name="pref_key_rendering_texture_decimation">pref_key_rendering_texture_decimation</string>
<string name="pref_default_rendering_texture_decimation">4</string>
<string name="pref_key_blending">pref_key_blending</string>
<string name="pref_default_blending">true</string>
<string name="pref_key_background_color">pref_key_background_color</string>
<string name="pref_default_background_color">0.2</string>
<string name="pref_key_nodes_filtering">pref_key_nodes_filtering</string>
<string name="pref_default_nodes_filtering">false</string>
<string name="pref_key_append">pref_key_append</string>
<string name="pref_default_append">true</string>
<string name="pref_key_resolution">pref_key_resolution</string>
<string name="pref_default_resolution">false</string>
<string name="pref_key_smoothing">pref_key_smoothing</string>
<string name="pref_default_smoothing">true</string>
<string name="pref_key_fisheye">pref_key_fisheye</string>
<string name="pref_default_fisheye">false</string>
<string name="pref_key_update_rate">pref_key_update_rate</string>
<string name="pref_default_update_rate">1</string>
<string name="pref_key_max_speed">pref_key_max_speed</string>
<string name="pref_default_max_speed">0</string>
<string name="pref_key_time_thr">pref_key_time_thr</string>
<string name="pref_default_time_thr">1000</string>
<string name="pref_key_mem_thr">pref_key_mem_thr</string>
<string name="pref_default_mem_thr">0</string>
<string name="pref_key_loop_thr">pref_key_loop_thr</string>
<string name="pref_default_loop_thr">0.11</string>
<string name="pref_key_sim_thr">pref_key_sim_thr</string>
<string name="pref_default_sim_thr">0.3</string>
<string name="pref_key_min_inliers">pref_key_min_inliers</string>
<string name="pref_default_min_inliers">25</string>
<string name="pref_key_opt_error">pref_key_opt_error</string>
<string name="pref_default_opt_error">2</string>
<string name="pref_key_features_voc">pref_key_features_voc</string>
<string name="pref_default_features_voc">200</string>
<string name="pref_key_features">pref_key_features</string>
<string name="pref_default_features">400</string>
<string name="pref_key_features_type">pref_key_features_type</string>
<string name="pref_default_features_type">6</string>
<string name="pref_key_optimizer">pref_key_optimizer</string>
<string name="pref_default_optimizer">2</string>
<string name="pref_key_optimize_end">pref_key_optimize_end</string>
<string name="pref_default_optimize_end">true</string>
<string name="pref_key_keep_all_db">pref_key_keep_all_db</string>
<string name="pref_default_keep_all_db">true</string>
<string name="pref_key_raw_scan_saved">pref_key_raw_scan_saved</string>
<string name="pref_default_raw_scan_saved">false</string>
<string name="pref_key_gps_saved">pref_key_gps_saved</string>
<string name="pref_default_gps_saved">false</string>
<string name="pref_key_db_in_memory">pref_key_db_in_memory</string>
<string name="pref_default_db_in_memory">false</string>
<string name="pref_key_cloud_voxel">pref_key_cloud_voxel</string>
<string name="pref_default_cloud_voxel">0.01</string>
<string name="pref_key_texture_size">pref_key_texture_size</string>
<string name="pref_default_texture_size">4096</string>
<string name="pref_key_texture_count">pref_key_texture_count</string>
<string name="pref_default_texture_count">1</string>
<string name="pref_key_normal_k">pref_key_normal_k</string>
<string name="pref_default_normal_k">18</string>
<string name="pref_key_max_texture_distance">pref_key_max_texture_distance</string>
<string name="pref_default_max_texture_distance">3</string>
<string name="pref_key_min_texture_cluster_size">pref_key_min_texture_cluster_size</string>
<string name="pref_default_min_texture_cluster_size">50</string>
<string name="pref_key_block_render">pref_key_block_render</string>
<string name="pref_default_block_render">false</string>
<string name="pref_key_opt_depth">pref_key_opt_depth</string>
<string name="pref_default_opt_depth">0</string>
<string name="pref_key_opt_color_radius">pref_key_opt_color_radius</string>
<string name="pref_default_opt_color_radius">0.05</string>
<string name="pref_key_opt_clean_white">pref_key_opt_clean_white</string>
<string name="pref_default_opt_clean_white">true</string>
<string name="pref_key_opt_min_cluster_size">pref_key_opt_min_cluster_size</string>
<string name="pref_default_opt_min_cluster_size">0</string>
<string name="pref_key_gain_max_radius">pref_key_gain_max_radius</string>
<string name="pref_default_gain_max_radius">0.02</string>
<string name="pref_key_cluster_ratio">pref_key_cluster_ratio</string>
<string name="pref_default_cluster_ratio">0.05</string>
<string name="pref_key_notification_sound">pref_key_notification_sound</string>
<string name="pref_default_notification_sound">true</string>
<!-- Preference keys: END -->
<string name="pref_title_rendering">Rendering</string>
<string name="pref_title_density">Point Cloud Density</string>
<string name="pref_summary_density">Decrease density to reduce rendering time and memory. Tip: To apply a different density to current map: save the map, change density and re-open the same map to regenerate the point clouds at this density.</string>
<string name="pref_title_angle">Mesh Angle Tolerance</string>
<string name="pref_summary_angle">Minimum polygon angle. Increase to force scanning perpendicular to surfaces.</string>
<string name="pref_title_triangle">Mesh Triangle Size</string>
<string name="pref_summary_triangle">Size in pixels of the polygons created from the depth image.</string>
<string name="pref_title_rendering_texture_decimation">Texture Resolution</string>
<string name="pref_summary_rendering_texture_decimation">Resolution of the texture for online rendering. This doesn\'t affect Export results.</string>
<string name="pref_title_min_depth">Min Depth</string>
<string name="pref_summary_min_depth">Points under the minimum depth are not rendered.</string>
<string name="pref_title_depth">Max Depth</string>
<string name="pref_summary_depth">Points over the maximum depth are not rendered.</string>
<string name="pref_title_point_size">Point Size</string>
<string name="pref_summary_point_size">Size of the points when rendering only the point cloud.</string>
<string name="pref_title_blending">Blending</string>
<string name="pref_summary_blending">Blend close surfaces together to get more smooth colors on overlapping surfaces. May decrease rendering frame rate.</string>
<string name="pref_title_background_color">Background Color</string>
<string name="pref_summary_background_color"></string>
<string name="pref_title_nodes_filtering">Nodes Filtering</string>
<string name="pref_summary_nodes_filtering">Render only the newest point cloud of a loop closure.</string>
<string-array name="pref_density_keys">
<item>"Maximum"</item>
<item>"High"</item>
<item>"Low"</item>
<item>"Very Low"</item>
</string-array>
<string-array name="pref_density_values">
<item>"0"</item>
<item>"1"</item>
<item>"2"</item>
<item>"3"</item>
</string-array>
<string-array name="pref_min_depth_keys">
<item>"0 m"</item>
<item>"0.3 m"</item>
<item>"0.5 m"</item>
<item>"0.75 m"</item>
<item>"1 m"</item>
<item>"1.5 m"</item>
<item>"2 m"</item>
<item>"2.5 m"</item>
<item>"3 m"</item>
</string-array>
<string-array name="pref_min_depth_values">
<item>"0"</item>
<item>"0.3"</item>
<item>"0.5"</item>
<item>"0.75"</item>
<item>"1"</item>
<item>"1.5"</item>
<item>"2"</item>
<item>"2.5"</item>
<item>"3"</item>
</string-array>
<string-array name="pref_depth_keys">
<item>"No Limit"</item>
<item>"5 m"</item>
<item>"4.5 m"</item>
<item>"4 m"</item>
<item>"3.5 m"</item>
<item>"3 m"</item>
<item>"2.5 m"</item>
<item>"2 m"</item>
<item>"1.5 m"</item>
<item>"1 m"</item>
</string-array>
<string-array name="pref_depth_values">
<item>"0"</item>
<item>"5"</item>
<item>"4.5"</item>
<item>"4"</item>
<item>"3.5"</item>
<item>"3"</item>
<item>"2.5"</item>
<item>"2"</item>
<item>"1.5"</item>
<item>"1"</item>
</string-array>
<string-array name="pref_point_size_values">
<item>"50"</item>
<item>"30"</item>
<item>"25"</item>
<item>"15"</item>
<item>"10"</item>
<item>"5"</item>
<item>"1"</item>
</string-array>
<string-array name="pref_angle_keys">
<item>"60 deg"</item>
<item>"45 deg"</item>
<item>"35 deg"</item>
<item>"30 deg"</item>
<item>"25 deg"</item>
<item>"20 deg"</item>
<item>"15 deg"</item>
<item>"10 deg"</item>
<item>"5 deg"</item>
</string-array>
<string-array name="pref_angle_values">
<item>"60"</item>
<item>"45"</item>
<item>"35"</item>
<item>"30"</item>
<item>"25"</item>
<item>"20"</item>
<item>"15"</item>
<item>"10"</item>
<item>"5"</item>
</string-array>
<string-array name="pref_triangle_keys">
<item>"6 pix"</item>
<item>"5 pix"</item>
<item>"4 pix"</item>
<item>"3 pix"</item>
<item>"2 pix"</item>
</string-array>
<string-array name="pref_triangle_values">
<item>"6"</item>
<item>"5"</item>
<item>"4"</item>
<item>"3"</item>
<item>"2"</item>
</string-array>
<string-array name="pref_rendering_texture_decimation_keys">
<item>"Maximum"</item>
<item>"High"</item>
<item>"Low"</item>
<item>"Very Low"</item>
</string-array>
<string-array name="pref_rendering_texture_decimation_values">
<item>"1"</item>
<item>"2"</item>
<item>"4"</item>
<item>"8"</item>
</string-array>
<string-array name="pref_background_color_keys">
<item>"White"</item>
<item>"0.9"</item>
<item>"Light Gray"</item>
<item>"0.7"</item>
<item>"0.6"</item>
<item>"Gray"</item>
<item>"0.4"</item>
<item>"0.3"</item>
<item>"Dark Gray"</item>
<item>"0.1"</item>
<item>"Black"</item>
</string-array>
<string-array name="pref_background_color_values">
<item>"1.0"</item>
<item>"0.9"</item>
<item>"0.8"</item>
<item>"0.7"</item>
<item>"0.6"</item>
<item>"0.5"</item>
<item>"0.4"</item>
<item>"0.3"</item>
<item>"0.2"</item>
<item>"0.1"</item>
<item>"0.0"</item>
</string-array>
<string name="pref_title_mapping_sub">Mapping&#8230;</string>
<string name="pref_title_mapping">Mapping</string>
<string name="pref_summary_mapping">Advanced mapping parameters for fine tuning.</string>
<string name="pref_title_mapping_core">Core</string>
<string name="pref_title_mapping_database">Database</string>
<string name="pref_title_append">Append Mode</string>
<string name="pref_summary_append">When resuming mapping, wait for a relocalization on the current map before starting a new map.</string>
<string name="pref_title_resolution">HD Mode</string>
<string name="pref_summary_resolution">Save HD images of the color camera if you want very detailed textures. More memory will be required.</string>
<string name="pref_title_smoothing">Smoothing</string>
<string name="pref_summary_smoothing">Smooth the point clouds.</string>
<string name="pref_title_fisheye">Fish Eye Camera</string>
<string name="pref_summary_fisheye">Use fish eye camera instead of the color camera. May not work on some devices.</string>
<string name="pref_title_update_rate">Update Rate</string>
<string name="pref_summary_update_rate">Rate at which a new node is added to map.</string>
<string name="pref_title_max_speed">Maximum Motion Speed</string>
<string name="pref_summary_max_speed">Images taken when the camera is moving too fast are ignored to avoid blurry textures.</string>
<string name="pref_title_time_thr">Time Limit</string>
<string name="pref_summary_time_thr">Maximum time allowed for map updates. If time to add a new node is above this theshold, some old parts of the map are temporarly forgotten to reduce time of next updates.</string>
<string name="pref_title_mem_thr">Memory Limit</string>
<string name="pref_summary_mem_thr">Maximum nodes kept in working memory.</string>
<string name="pref_title_loop_thr">Loop Closure Threshold</string>
<string name="pref_summary_loop_thr">Threshold at which loop closure hypotheses are accepted. Higher means more robust to false loop closures while rejecting more good loop closures.</string>
<string name="pref_title_sim_thr">Similarity Threshold</string>
<string name="pref_summary_sim_thr">Threshold at which consecutive images are considered the same, so the corresponding node\'s weight is increased. The background turns dark blue when this happens.</string>
<string name="pref_title_min_inliers">Min Inliers</string>
<string name="pref_summary_min_inliers">Minimum visual inliers to accept a loop closure.</string>
<string name="pref_title_opt_error">Max Optimization Error</string>
<string name="pref_summary_opt_error">Reject any loop closures causing error corrections in the map higher than this factor of the link\'s variance.</string>
<string name="pref_title_features_voc">Max Features Extracted (Vocabulary)</string>
<string name="pref_summary_features_voc">Extracting more features per image would result in better loop closure hypotheses but more processing time is required.</string>
<string name="pref_title_features">Max Features Extracted (Loop Closure)</string>
<string name="pref_summary_features">Extracting more features per image would result in better loop closure transforms but more processing time is required.</string>
<string name="pref_title_features_type">Feature Type</string>
<string name="pref_summary_features_type">BRIEF features are fast to compute but are not rotation invariant like FREAK. Warning: Changing feature type will automatically reset the map!</string>
<string name="pref_title_optimizer">Graph Optimizer</string>
<string name="pref_summary_optimizer">Graph optimization approach.</string>
<string name="pref_title_optimize_end">Optimization from Graph End</string>
<string name="pref_summary_optimize_end">The map\'s graph is optimized from the last node. The map is moved when a loop closure happens instead of jumping the current pose back to localized area. </string>
<string name="pref_title_keep_all_db">Save All Frames in Database</string>
<string name="pref_summary_keep_all_db">Discarded frames while not moving are still saved in database. Useful to replay exactly the scanning on RTAB-Map Desktop.</string>
<string name="pref_title_raw_scan_saved">Save Raw Scan</string>
<string name="pref_summary_raw_scan_saved">Save raw point clouds in database.</string>
<string name="pref_title_gps_saved">Save GPS</string>
<string name="pref_summary_gps_saved">Save GPS in database.</string>
<string name="pref_title_db_in_memory">Database In Memory</string>
<string name="pref_summary_db_in_memory">The database is kept in RAM for fast access. Set to false to reduce RAM used at the cost of slower access. This parameter is applied on reset or when a database is opened.</string>
<string-array name="pref_update_rate_keys">
<item>"Max"</item>
<item>"5 Hz"</item>
<item>"4 Hz"</item>
<item>"3 Hz"</item>
<item>"2 Hz"</item>
<item>"1 Hz"</item>
<item>"0.5 Hz"</item>
</string-array>
<string-array name="pref_update_rate_values">
<item>"0"</item>
<item>"5"</item>
<item>"4"</item>
<item>"3"</item>
<item>"2"</item>
<item>"1"</item>
<item>"0.5"</item>
</string-array>
<string-array name="pref_max_speed_keys">
<item>"No Limit"</item>
<item>"High"</item>
<item>"Medium"</item>
<item>"Low"</item>
<item>"Very Low"</item>
</string-array>
<string-array name="pref_max_speed_values">
<item>"0"</item>
<item>"0.4"</item>
<item>"0.3"</item>
<item>"0.2"</item>
<item>"0.1"</item>
</string-array>
<string-array name="pref_time_thr_keys">
<item>"No Limit"</item>
<item>"1500 ms"</item>
<item>"1400 ms"</item>
<item>"1300 ms"</item>
<item>"1200 ms"</item>
<item>"1100 ms"</item>
<item>"1000 ms"</item>
<item>"900 ms"</item>
<item>"800 ms"</item>
<item>"700 ms"</item>
<item>"600 ms"</item>
<item>"500 ms"</item>
<item>"400"</item>
</string-array>
<string-array name="pref_time_thr_values">
<item>"0"</item>
<item>"1500"</item>
<item>"1400"</item>
<item>"1300"</item>
<item>"1200"</item>
<item>"1100"</item>
<item>"1000"</item>
<item>"900"</item>
<item>"800"</item>
<item>"700"</item>
<item>"600"</item>
<item>"500"</item>
<item>"400"</item>
</string-array>
<string-array name="pref_mem_thr_keys">
<item>"No Limit"</item>
<item>"500 nodes"</item>
<item>"400 nodes"</item>
<item>"300 nodes"</item>
<item>"200 nodes"</item>
<item>"100 nodes"</item>
<item>"50 nodes"</item>
</string-array>
<string-array name="pref_mem_thr_values">
<item>"0"</item>
<item>"500"</item>
<item>"400"</item>
<item>"300"</item>
<item>"200"</item>
<item>"100"</item>
<item>"50"</item>
</string-array>
<string-array name="pref_loop_thr_keys">
<item>"0.90"</item>
<item>"0.80"</item>
<item>"0.70"</item>
<item>"0.60"</item>
<item>"0.50"</item>
<item>"0.40"</item>
<item>"0.30"</item>
<item>"0.20"</item>
<item>"0.15"</item>
<item>"0.11"</item>
<item>"0.10"</item>
</string-array>
<string-array name="pref_loop_thr_values">
<item>"0.90"</item>
<item>"0.80"</item>
<item>"0.70"</item>
<item>"0.60"</item>
<item>"0.50"</item>
<item>"0.40"</item>
<item>"0.30"</item>
<item>"0.20"</item>
<item>"0.15"</item>
<item>"0.11"</item>
<item>"0.10"</item>
</string-array>
<string-array name="pref_sim_thr_keys">
<item>"Disabled"</item>
<item>"0.60"</item>
<item>"0.50"</item>
<item>"0.40"</item>
<item>"0.30"</item>
<item>"0.20"</item>
<item>"0.10"</item>
</string-array>
<string-array name="pref_sim_thr_values">
<item>"0"</item>
<item>"0.6"</item>
<item>"0.5"</item>
<item>"0.4"</item>
<item>"0.3"</item>
<item>"0.2"</item>
<item>"0.1"</item>
</string-array>
<string-array name="pref_min_inliers_keys">
<item>"35"</item>
<item>"30"</item>
<item>"25"</item>
<item>"20"</item>
<item>"15"</item>
<item>"10"</item>
</string-array>
<string-array name="pref_min_inliers_values">
<item>"35"</item>
<item>"30"</item>
<item>"25"</item>
<item>"20"</item>
<item>"15"</item>
<item>"10"</item>
</string-array>
<string-array name="pref_opt_error_keys">
<item>"10x"</item>
<item>"9x"</item>
<item>"8x"</item>
<item>"7x"</item>
<item>"6x"</item>
<item>"5x"</item>
<item>"4x"</item>
<item>"3x"</item>
<item>"2x"</item>
<item>"1x"</item>
<item>"Disabled"</item>
</string-array>
<string-array name="pref_opt_error_values">
<item>"10"</item>
<item>"9"</item>
<item>"8"</item>
<item>"7"</item>
<item>"6"</item>
<item>"5"</item>
<item>"4"</item>
<item>"3"</item>
<item>"2"</item>
<item>"1"</item>
<item>"0"</item>
</string-array>
<string-array name="pref_features_voc_keys">
<item>"No Limit"</item>
<item>"1000"</item>
<item>"900"</item>
<item>"800"</item>
<item>"700"</item>
<item>"600"</item>
<item>"500"</item>
<item>"400"</item>
<item>"300"</item>
<item>"200"</item>
<item>"100"</item>
<item>"Disabled"</item>
</string-array>
<string-array name="pref_features_voc_values">
<item>"0"</item>
<item>"1000"</item>
<item>"900"</item>
<item>"800"</item>
<item>"700"</item>
<item>"600"</item>
<item>"500"</item>
<item>"400"</item>
<item>"300"</item>
<item>"200"</item>
<item>"100"</item>
<item>"-1"</item>
</string-array>
<string-array name="pref_features_keys">
<item>"No Limit"</item>
<item>"1000"</item>
<item>"900"</item>
<item>"800"</item>
<item>"700"</item>
<item>"600"</item>
<item>"500"</item>
<item>"400"</item>
<item>"300"</item>
<item>"200"</item>
<item>"100"</item>
</string-array>
<string-array name="pref_features_values">
<item>"0"</item>
<item>"1000"</item>
<item>"900"</item>
<item>"800"</item>
<item>"700"</item>
<item>"600"</item>
<item>"500"</item>
<item>"400"</item>
<item>"300"</item>
<item>"200"</item>
<item>"100"</item>
</string-array>
<string-array name="pref_features_type_keys">
<item>"BRIEF"</item>
<item>"FREAK"</item>
</string-array>
<string-array name="pref_features_type_values">
<item>"6"</item>
<item>"5"</item>
</string-array>
<string-array name="pref_optimizer_keys">
<item>"GTSAM"</item>
<item>"g2o"</item>
<item>"TORO"</item>
</string-array>
<string-array name="pref_optimizer_values">
<item>"2"</item>
<item>"1"</item>
<item>"0"</item>
</string-array>
<string name="pref_title_export_sub">Exporting&#8230;</string>
<string name="pref_title_export">Exporting</string>
<string name="pref_summary_export">Advanced parameters used when exporting the map.</string>
<string name="pref_title_cloud_voxel">Voxel Size</string>
<string name="pref_summary_cloud_voxel">If you don\'t need a very precise point cloud, you can set this to reduce the output point cloud size. This is also used for optimized mesh.</string>
<string name="pref_title_texture_size">Texture Size</string>
<string name="pref_summary_texture_size">If the map is large, you may want to increase this to maximize the texture resolution.</string>
<string name="pref_title_texture_count">Maximum Output Textures</string>
<string name="pref_summary_texture_count">Note that all textures are still merged into one for visualization, but exported in multiple files.</string>
<string name="pref_title_normal_k">Normal K</string>
<string name="pref_summary_normal_k">K-nearest neighbors used for normal computation when a mesh is created.</string>
<string name="pref_title_max_texture_distance">Max Texture Distance</string>
<string name="pref_summary_max_texture_distance">Maximum distance from a camera for polygons to be textured by this camera.</string>
<string name="pref_title_min_texture_cluster_size">Min Texture Cluster Size</string>
<string name="pref_summary_min_texture_cluster_size">Minimum polygon cluster size to be textured by a camera. This helps to filter sparse textured polygons.</string>
<string name="pref_title_block_render">Block Rendering Thread While Exporting</string>
<string name="pref_summary_block_render">This decreases exporting time, but freezes rendering while exporting. This also clears temporary the rendered clouds/meshes from memory during exporting, this can be useful to avoid out of memory errors.</string>
<string-array name="pref_cloud_voxel_keys">
<item>"0.2 m"</item>
<item>"0.1 m"</item>
<item>"0.05 m"</item>
<item>"0.02 m"</item>
<item>"0.01 m"</item>
<item>"0.005 m"</item>
<item>"Disabled"</item>
</string-array>
<string-array name="pref_cloud_voxel_values">
<item>"0.2"</item>
<item>"0.1"</item>
<item>"0.05"</item>
<item>"0.02"</item>
<item>"0.01"</item>
<item>"0.005"</item>
<item>"0"</item>
</string-array>
<string-array name="pref_texture_size_keys">
<item>"16384x16384"</item>
<item>"8192x8192"</item>
<item>"4096x4096"</item>
<item>"2048x2048"</item>
<item>"1024x1024"</item>
</string-array>
<string-array name="pref_texture_size_values">
<item>"16384"</item>
<item>"8192"</item>
<item>"4096"</item>
<item>"2048"</item>
<item>"1024"</item>
</string-array>
<string-array name="pref_texture_count_keys">
<item>"8"</item>
<item>"7"</item>
<item>"6"</item>
<item>"5"</item>
<item>"4"</item>
<item>"3"</item>
<item>"2"</item>
<item>"1"</item>
</string-array>
<string-array name="pref_texture_count_values">
<item>"8"</item>
<item>"7"</item>
<item>"6"</item>
<item>"5"</item>
<item>"4"</item>
<item>"3"</item>
<item>"2"</item>
<item>"1"</item>
</string-array>
<string-array name="pref_normal_k_values">
<item>"30"</item>
<item>"24"</item>
<item>"18"</item>
<item>"12"</item>
<item>"6"</item>
</string-array>
<string-array name="pref_max_texture_distance_keys">
<item>"No Limit"</item>
<item>"5 m"</item>
<item>"4.5 m"</item>
<item>"4 m"</item>
<item>"3.5 m"</item>
<item>"3 m"</item>
<item>"2.5 m"</item>
<item>"2 m"</item>
</string-array>
<string-array name="pref_max_texture_distance_values">
<item>"0"</item>
<item>"5"</item>
<item>"4.5"</item>
<item>"4"</item>
<item>"3.5"</item>
<item>"3"</item>
<item>"2.5"</item>
<item>"2"</item>
</string-array>
<string-array name="pref_min_texture_cluster_size_keys">
<item>"1000"</item>
<item>"500"</item>
<item>"200"</item>
<item>"100"</item>
<item>"50"</item>
<item>"10"</item>
<item>"Disabled"</item>
</string-array>
<string-array name="pref_min_texture_cluster_size_values">
<item>"1000"</item>
<item>"500"</item>
<item>"200"</item>
<item>"100"</item>
<item>"50"</item>
<item>"10"</item>
<item>"0"</item>
</string-array>
<string name="pref_title_optimized">Optimized</string>
<string name="pref_title_opt_voxel">Voxel Size</string>
<string name="pref_summary_opt_voxel">Increasing this can reduce reconstruction time at the cost of less geometry precision.</string>
<string name="pref_title_opt_depth">Reconstruction Depth</string>
<string name="pref_summary_opt_depth">Lowering this parameter decreases reconstruction time, but geometry precision is lower. Minimum polygon size: map length / 2^depth). \"Auto\" means that depth is chosen so that polygon size is just under 3 cm.</string>
<string name="pref_title_opt_color_radius">Color Radius</string>
<string name="pref_summary_opt_color_radius">Radius used to transfer nearest color from the point cloud to reconstructed mesh. When exporting with texture, if Clean Mesh is also enabled, this will limit the number of polygons textured in holes.</string>
<string name="pref_title_opt_clean_white">Clean Mesh</string>
<string name="pref_summary_opt_clean_white">Clean mesh from textureless or colorless reconstructed polygons.</string>
<string name="pref_summary_opt_min_cluster_size">This can be used to filter polygons before texturing.</string>
<string name="pref_title_opt_min_cluster_size">Polygon Filtering</string>
<string-array name="pref_opt_depth_keys">
<item>"Auto"</item>
<item>"12"</item>
<item>"11"</item>
<item>"10"</item>
<item>"9"</item>
<item>"8"</item>
<item>"7"</item>
<item>"6"</item>
</string-array>
<string-array name="pref_opt_depth_values">
<item>"0"</item>
<item>"12"</item>
<item>"11"</item>
<item>"10"</item>
<item>"9"</item>
<item>"8"</item>
<item>"7"</item>
<item>"6"</item>
</string-array>
<string-array name="pref_opt_color_radius_keys">
<item>"Nearest"</item>
<item>"2 m"</item>
<item>"1 m"</item>
<item>"0.5 m"</item>
<item>"0.2 m"</item>
<item>"0.1 m"</item>
<item>"0.05 m"</item>
<item>"0.025"</item>
<item>"0.02"</item>
<item>"0.015"</item>
<item>"0.01"</item>
<item>"Disabled"</item>
</string-array>
<string-array name="pref_opt_color_radius_values">
<item>"0"</item>
<item>"2"</item>
<item>"1"</item>
<item>"0.5"</item>
<item>"0.2"</item>
<item>"0.1"</item>
<item>"0.05"</item>
<item>"0.025"</item>
<item>"0.02"</item>
<item>"0.015"</item>
<item>"0.01"</item>
<item>"-1"</item>
</string-array>
<string-array name="pref_opt_min_cluster_size_keys">
<item>"Only biggest cluster kept"</item>
<item>"Keep all polygons"</item>
</string-array>
<string-array name="pref_opt_min_cluster_size_values">
<item>"-1"</item>
<item>"0"</item>
</string-array>
<string name="pref_title_general">General</string>
<string name="pref_title_gain_max_radius">Color Correction Radius</string>
<string name="pref_summary_gain_max_radius">Radius used to find pixel correspondences for Adjust Colors optimization.</string>
<string name="pref_title_cluster_ratio">Noise Filtering Ratio</string>
<string name="pref_summary_cluster_ratio">Polygon clusters with size smaller than this ratio of the largest cluster are removed by the Noise Filtering optimization.</string>
<string name="pref_title_notification_sound">Notification Sound</string>
<string name="pref_summary_notification_sound">After saving database or preparing data to export, a notification sound is played.</string>
<string-array name="pref_gain_max_radius_keys">
<item>"0.3 m"</item>
<item>"0.2 m"</item>
<item>"0.1 m"</item>
<item>"0.05 m"</item>
<item>"0.025 m"</item>
<item>"0.02 m"</item>
<item>"0.015 m"</item>
<item>"0.01 m"</item>
</string-array>
<string-array name="pref_gain_max_radius_values">
<item>"0.3"</item>
<item>"0.2"</item>
<item>"0.1"</item>
<item>"0.05"</item>
<item>"0.025"</item>
<item>"0.02"</item>
<item>"0.015"</item>
<item>"0.01"</item>
</string-array>
<string-array name="pref_cluster_ratio_keys">
<item>"Keep Largest Only"</item>
<item>"0.9"</item>
<item>"0.8"</item>
<item>"0.7"</item>
<item>"0.6"</item>
<item>"0.5"</item>
<item>"0.4"</item>
<item>"0.3"</item>
<item>"0.2"</item>
<item>"0.1"</item>
<item>"0.05"</item>
<item>"0.01"</item>
</string-array>
<string-array name="pref_cluster_ratio_values">
<item>"1.0"</item>
<item>"0.9"</item>
<item>"0.8"</item>
<item>"0.7"</item>
<item>"0.6"</item>
<item>"0.5"</item>
<item>"0.4"</item>
<item>"0.3"</item>
<item>"0.2"</item>
<item>"0.1"</item>
<item>"0.05"</item>
<item>"0.01"</item>
</string-array>
<string name="pref_title_presets">Presets</string>
<string name="pref_title_open_button">Open</string>
<string name="pref_title_save_button">Save</string>
<string name="pref_title_remove_button">Remove</string>
<string name="pref_title_reset_button">Restore All Default Settings</string>
<string name="title_activity_sketchfab">SketchfabActivity</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
</resources>

View File

@@ -0,0 +1,10 @@
<resources>
<style name="ThemeActionBar" parent="@android:style/Widget.DeviceDefault.ActionBar.Solid">
<item name="android:background">#20000000</item>
</style>
<style name="ThemeApp" parent="@android:style/Theme.DeviceDefault">
<item name="android:actionBarStyle">@style/ThemeActionBar</item>
<item name="android:windowActionBarOverlay">true</item>
</style>
</resources>

View File

@@ -8,11 +8,13 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.widget.TextView;
@@ -33,8 +35,10 @@ public class AboutDialog extends Dialog{
setContentView(R.layout.about);
TextView tv = (TextView)findViewById(R.id.info_text);
tv.setText(Html.fromHtml(readRawTextFile(R.raw.info)));
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setLinkTextColor(Color.WHITE);
Linkify.addLinks(tv, Linkify.ALL);
tv.append(Html.fromHtml("<b><a href=http://introlab.github.io/rtabmap/index.html#privacy-policy>Privacy Policy</a></b>"));
}
public static String readRawTextFile(int id) {

View File

@@ -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);
}
}
}
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,148 @@
package com.introlab.rtabmap;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
/**
* This utility class provides an abstraction layer for sending multipart HTTP
* POST requests to a web server.
* @author www.codejava.net
* http://www.codejava.net/java-se/networking/upload-files-by-sending-multipart-request-programmatically
*
*/
public class MultipartUtility {
private final String boundary;
private static final String LINE_FEED = "\r\n";
private HttpURLConnection httpConn;
private String charset;
private OutputStream outputStream;
private PrintWriter writer;
/**
* This constructor initializes a new HTTP POST request with content type
* is set to multipart/form-data
* @param requestURL
* @param charset
* @throws IOException
*/
public MultipartUtility(String requestURL, String token, String charset)
throws IOException {
this.charset = charset;
// creates a unique boundary based on time stamp
boundary = "===" + System.currentTimeMillis() + "===";
URL url = new URL(requestURL);
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setUseCaches(false);
httpConn.setDoOutput(true); // indicates POST method
httpConn.setDoInput(true);
httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
httpConn.setRequestProperty("Authorization", "Bearer " + token);
outputStream = httpConn.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
true);
}
/**
* Adds a form field to the request
* @param name field name
* @param value field value
*/
public void addFormField(String name, String value) {
writer.append("--" + boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name=\"" + name + "\"").append(LINE_FEED);
writer.append("Content-Type: text/plain; charset=" + charset).append(LINE_FEED);
writer.append(LINE_FEED);
writer.append(value).append(LINE_FEED);
writer.flush();
}
/**
* Adds a upload file section to the request
* @param fieldName name attribute in <input type="file" name="..." />
* @param uploadFile a File to be uploaded
* @throws IOException
*/
public void addFilePart(String fieldName, File uploadFile)
throws IOException {
String fileName = uploadFile.getName();
writer.append("--" + boundary).append(LINE_FEED);
writer.append(
"Content-Disposition: form-data; name=\"" + fieldName
+ "\"; filename=\"" + fileName + "\"")
.append(LINE_FEED);
writer.append(
"Content-Type: "
+ URLConnection.guessContentTypeFromName(fileName))
.append(LINE_FEED);
writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
writer.append(LINE_FEED);
writer.flush();
FileInputStream inputStream = new FileInputStream(uploadFile);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
inputStream.close();
writer.append(LINE_FEED);
writer.flush();
}
/**
* Adds a header field to the request.
* @param name - name of the header field
* @param value - value of the header field
*/
public void addHeaderField(String name, String value) {
writer.append(name + ": " + value).append(LINE_FEED);
writer.flush();
}
/**
* Completes the request and receives response from the server.
* @return a list of Strings as response in case the server returned
* status OK, otherwise an exception is thrown.
* @throws IOException
*/
public List<String> finish() throws IOException {
List<String> response = new ArrayList<String>();
writer.append(LINE_FEED).flush();
writer.append("--" + boundary + "--").append(LINE_FEED);
writer.close();
// checks server's status code first
int status = httpConn.getResponseCode();
if (status == 201) {
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpConn.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
response.add(line);
}
reader.close();
httpConn.disconnect();
} else {
throw new IOException("Server returned non-OK status: " + status + ", msg: " + httpConn.getResponseMessage());
}
return response;
}
}

View File

@@ -0,0 +1,43 @@
package com.introlab.rtabmap;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Spinner;
/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value
Author: Mattia Ruggiero
https://stackoverflow.com/questions/5335306/how-can-i-get-an-event-in-android-spinner-when-the-current-selected-item-is-sele
*/
public class NDSpinner extends Spinner {
public NDSpinner(Context context)
{ super(context); }
public NDSpinner(Context context, AttributeSet attrs)
{ super(context, attrs); }
public NDSpinner(Context context, AttributeSet attrs, int defStyle)
{ super(context, attrs, defStyle); }
@Override
public void setSelection(int position, boolean animate) {
boolean sameSelected = position == getSelectedItemPosition();
super.setSelection(position, animate);
if (sameSelected) {
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
//getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
}
}
@Override
public void setSelection(int position) {
boolean sameSelected = position == getSelectedItemPosition();
super.setSelection(position);
if (sameSelected) {
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,8 @@
package com.introlab.rtabmap;
import android.os.IBinder;
import android.view.KeyEvent;
import android.util.Log;
// Wrapper for native library
@@ -8,19 +10,32 @@ import android.view.KeyEvent;
public class RTABMapLib
{
static
{
System.loadLibrary("NativeRTABMap");
static {
// This project depends on tango_client_api, so we need to make sure we load
// the correct library first.
if (TangoInitializationHelper.loadTangoSharedLibrary() ==
TangoInitializationHelper.ARCH_ERROR) {
Log.e(RTABMapActivity.class.getSimpleName(), "ERROR! Unable to load libtango_client_api.so!");
}
System.loadLibrary("NativeRTABMap");
}
// Initialize the Tango Service, this function starts the communication
// between the application and Tango Service.
// The activity object is used for checking if the API version is outdated.
public static native int initialize(RTABMapActivity activity);
public static native void onCreate(RTABMapActivity activity);
public static native void openDatabase(String databasePath);
public static native void setScreenRotation(int displayRotation, int cameraRotation);
public static native int onResume();
public static native int openDatabase(String databasePath, boolean databaseInMemory, boolean optimize);
public static native int openDatabase2(String databaseSource, String databasePath, boolean databaseInMemory, boolean optimize);
/*
* Called when the Tango service is connected.
*
* @param binder The native binder object.
*/
public static native boolean onTangoServiceConnected(IBinder binder);
// Release all non OpenGl resources that are allocated from the program.
public static native void onPause();
@@ -44,24 +59,69 @@ public class RTABMapLib
public static native void setPausedMapping(boolean paused);
public static native void setOnlineBlending(boolean enabled);
public static native void setMapCloudShown(boolean shown);
public static native void setOdomCloudShown(boolean shown);
public static native void setMeshRendering(boolean enabled);
public static native void setMeshRendering(boolean enabled, boolean withTexture);
public static native void setLocalizationMode(boolean enabled);
public static native void setTrajectoryMode(boolean enabled);
public static native void setGraphOptimization(boolean enabled);
public static native void setNodesFiltering(boolean enabled);
public static native void setGraphVisible(boolean visible);
public static native void setAutoExposure(boolean enabled);
public static native void setGridVisible(boolean visible);
public static native void setRawScanSaved(boolean enabled);
public static native void setFullResolution(boolean enabled);
public static native void setSmoothing(boolean enabled);
public static native void setCameraColor(boolean enabled);
public static native void setAppendMode(boolean enabled);
public static native void setDataRecorderMode(boolean enabled);
public static native void setMaxCloudDepth(float value);
public static native void setMinCloudDepth(float value);
public static native void setPointSize(float value);
public static native void setFOV(float value);
public static native void setOrthoCropFactor(float value);
public static native void setGridRotation(float value);
public static native void setLighting(boolean enabled);
public static native void setBackfaceCulling(boolean enabled);
public static native void setWireframe(boolean enabled);
public static native void setCloudDensityLevel(int value);
public static native void setMeshAngleTolerance(float value);
public static native void setMeshTriangleSize(int value);
public static native void setClusterRatio(float value);
public static native void setMaxGainRadius(float value);
public static native void setRenderingTextureDecimation(int value);
public static native void setBackgroundColor(float gray);
public static native int setMappingParameter(String key, String value);
public static native void setGPS(
double stamp,
double longitude,
double latitude,
double altitude,
double accuracy,
double bearing);
public static native void resetMapping();
public static native void save();
public static native boolean exportMesh(String filePath);
public static native void save(String outputDatabasePath);
public static native void cancelProcessing();
public static native boolean exportMesh(
float cloudVoxelSize,
boolean regenerateCloud,
boolean meshing,
int textureSize,
int textureCount,
int normalK,
boolean optimized,
float optimizedVoxelSize,
int optimizedDepth,
int optimizedMaxPolygons,
float optimizedColorRadius,
boolean optimizedCleanWhitePolygons,
int optimizedMinClusterSize,
float optimizedMaxTextureDistance,
int optimizedMinTextureClusterSize,
boolean blockRendering);
public static native boolean writeExportedMesh(String directory, String name);
public static native boolean postExportation(boolean visualize);
public static native int postProcessing(int approach);
public static native String getStatus();

View File

@@ -16,8 +16,16 @@
package com.introlab.rtabmap;
import java.util.Vector;
import java.util.concurrent.locks.ReentrantLock;
import android.app.Activity;
import android.app.ProgressDialog;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import android.util.Log;
import android.widget.Toast;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
@@ -26,30 +34,195 @@ import javax.microedition.khronos.opengles.GL10;
// ground grid, camera frustum, camera axis, and trajectory based on the Tango
// device's pose.
public class Renderer implements GLSurfaceView.Renderer {
private final float[] mtrxProjection = new float[16];
private final float[] mtrxView = new float[16];
private final float[] mtrxProjectionAndView = new float[16];
private TextManager mTextManager = null;
private float mSurfaceHeight = 0.0f;
private float mTextColor = 1.0f;
private int mOffset = 0;
private ProgressDialog mProgressDialog;
private Vector<TextObject> mTexts;
private static RTABMapActivity mActivity;
public Renderer(RTABMapActivity c) {
mActivity = c;
}
private ProgressDialog mProgressDialog = null;
private Toast mToast = null;
private boolean mTextChanged = false;
private ReentrantLock mTextLock = new ReentrantLock();
public void setProgressDialog(ProgressDialog progressDialog)
{
mProgressDialog = progressDialog;
}
public void setToast(Toast toast)
{
mToast = toast;
}
// Render loop of the Gl context.
public void onDrawFrame(GL10 gl) {
int value = RTABMapLib.render();
if(value == 1 && mProgressDialog != null)
{
mProgressDialog.dismiss();
}
}
public void setOffset(int offset)
{
mOffset = offset;
}
// Called when the surface size changes.
public void onSurfaceChanged(GL10 gl, int width, int height) {
RTABMapLib.setupGraphic(width, height);
}
// Render loop of the Gl context.
public void onDrawFrame(GL10 useGLES20instead) {
// Called when the surface is created or recreated.
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
RTABMapLib.initGlContent();
}
try
{
final int value = RTABMapLib.render();
if(mTextManager!=null)
{
if(mTextChanged)
{
mTextChanged = false;
Vector<TextObject> txtcollection = new Vector<TextObject>();
mTextLock.lock();
try {
if(mTexts.size() > 0)
{
txtcollection.addAll(mTexts);
}
} finally {
mTextLock.unlock();
}
// Prepare the text for rendering
mTextManager.PrepareDraw(txtcollection);
}
float[] mvp = new float[16];
Matrix.translateM(mvp, 0, mtrxProjectionAndView, 0, 0, mOffset, 0);
mTextManager.Draw(mvp);
}
if(value != 0 && mProgressDialog != null && mProgressDialog.isShowing())
{
mActivity.runOnUiThread(new Runnable() {
public void run() {
if(!RTABMapActivity.DISABLE_LOG) Log.i("RTABMapActivity", "Renderer: dismiss dialog, value received=" + String.valueOf(value));
mProgressDialog.dismiss();
mActivity.resetNoTouchTimer();
}
});
}
if(value==-1)
{
mActivity.runOnUiThread(new Runnable() {
public void run() {
if(mToast!=null)
{
mToast.makeText(mActivity, String.format("Out of Memory!"), Toast.LENGTH_SHORT).show();
}
}
});
}
else if(value==-2)
{
mActivity.runOnUiThread(new Runnable() {
public void run() {
if(mToast!=null)
{
mToast.makeText(mActivity, String.format("Rendering Error!"), Toast.LENGTH_SHORT).show();
}
}
});
}
}
catch(final Exception e)
{
mActivity.runOnUiThread(new Runnable() {
public void run() {
if(mToast!=null)
{
mToast.makeText(mActivity, String.format("Rendering error! %s", e.getMessage()), Toast.LENGTH_SHORT).show();
}
}
});
}
}
// Called when the surface size changes.
public void onSurfaceChanged(GL10 useGLES20instead, int width, int height) {
RTABMapLib.setupGraphic(width, height);
mSurfaceHeight = (float)height;
// Clear our matrices
for(int i=0;i<16;i++)
{
mtrxProjection[i] = 0.0f;
mtrxView[i] = 0.0f;
mtrxProjectionAndView[i] = 0.0f;
}
// Setup our screen width and height for normal sprite translation.
Matrix.orthoM(mtrxProjection, 0, 0f, width, 0.0f, height, 0, 50);
// Set the camera position (View matrix)
Matrix.setLookAtM(mtrxView, 0, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// Calculate the projection and view transformation
Matrix.multiplyMM(mtrxProjectionAndView, 0, mtrxProjection, 0, mtrxView, 0);
}
// Called when the surface is created or recreated.
public void onSurfaceCreated(GL10 useGLES20instead, EGLConfig config) {
RTABMapLib.initGlContent();
// Create our text manager
mTextManager = new TextManager(mActivity);
mTextManager.setColor(mTextColor);
}
public void updateTexts(String[] texts)
{
if(mTextManager != null && mSurfaceHeight > 0.0f)
{
Vector<TextObject> textObjects = new Vector<TextObject>();
float offset = mSurfaceHeight-mTextManager.getMaxTextHeight();
if(texts != null)
{
for(int i=0;i<texts.length; ++i)
{
if(texts[i]!=null && texts[i].length()>0)
{
TextObject txt = new TextObject(texts[i], 0, offset);
textObjects.add(txt);
}
offset-=mTextManager.getMaxTextHeight();
}
}
mTextLock.lock();
try {
mTexts = textObjects;
} finally {
mTextLock.unlock();
}
mTextChanged = true;
}
}
public void setTextColor(float color)
{
mTextColor = color;
if(mTextManager != null)
{
mTextManager.setColor(mTextColor);
}
}
}

View File

@@ -0,0 +1,330 @@
package com.introlab.rtabmap;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map.Entry;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.text.InputType;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
private SettingsActivity getActivity() {return this;}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.layout.activity_settings);
Preference buttonReset = findPreference(getString(R.string.pref_key_reset_button));
buttonReset.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
getPreferenceScreen().getSharedPreferences().edit().clear().commit();
recreate();
return true;
}
});
Preference buttonOpen = findPreference(getString(R.string.pref_key_open_button));
buttonOpen.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
File prefsdir = new File(getApplicationInfo().dataDir,"shared_prefs");
if(prefsdir.exists() && prefsdir.isDirectory()){
ArrayList<String> filesArray = new ArrayList<String>(Arrays.asList(prefsdir.list()));
ArrayList<String> newList = new ArrayList<String>();
filesArray.remove("com.introlab.rtabmap_preferences.xml");
filesArray.remove("WebViewChromiumPrefs.xml");
for (String s : filesArray) {
newList.add(s.substring(0, s.length()-4)); // rip off the ".xml"
}
final String[] files = newList.toArray(new String[filesArray.size()]);
if(files.length > 0)
{
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Choose Presets:");
builder.setItems(files, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, final int which) {
//sp1 is the shared pref to copy to
SharedPreferences.Editor ed = getPreferenceScreen().getSharedPreferences().edit();
SharedPreferences sp = getActivity().getSharedPreferences(files[which], MODE_PRIVATE); //The shared preferences to copy from
//Cycle through all the entries in the sp
for(Entry<String,?> entry : sp.getAll().entrySet()){
Object v = entry.getValue();
String key = entry.getKey();
//Now we just figure out what type it is, so we can copy it.
// Note that i am using Boolean and Integer instead of boolean and int.
// That's because the Entry class can only hold objects and int and boolean are primatives.
if(v instanceof Boolean)
// Also note that i have to cast the object to a Boolean
// and then use .booleanValue to get the boolean
ed.putBoolean(key, ((Boolean)v).booleanValue());
else if(v instanceof Float)
ed.putFloat(key, ((Float)v).floatValue());
else if(v instanceof Integer)
ed.putInt(key, ((Integer)v).intValue());
else if(v instanceof Long)
ed.putLong(key, ((Long)v).longValue());
else if(v instanceof String)
ed.putString(key, ((String)v));
}
ed.commit(); //save it.
recreate();
return;
}
});
builder.show();
}
}
return true;
}
});
Preference buttonSave = findPreference(getString(R.string.pref_key_save_button));
buttonSave.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Save Presets:");
final EditText input = new EditText(getActivity());
input.setInputType(InputType.TYPE_CLASS_TEXT);
input.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
builder.setView(input);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which)
{
final String fileName = input.getText().toString();
dialog.dismiss();
if(!fileName.isEmpty())
{
File newFile = new File(getApplicationInfo().dataDir + "/shared_prefs/" + fileName + ".xml");
if(newFile.exists())
{
new AlertDialog.Builder(getActivity())
.setTitle("Presets Already Exist")
.setMessage("Do you want to overwrite the existing file?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
saveConfig(fileName);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
}
else
{
saveConfig(fileName);
}
}
}
});
AlertDialog alertToShow = builder.create();
alertToShow.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
alertToShow.show();
return true;
}
});
Preference buttonRemove = findPreference(getString(R.string.pref_key_remove_button));
buttonRemove.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
File prefsdir = new File(getApplicationInfo().dataDir,"shared_prefs");
if(prefsdir.exists() && prefsdir.isDirectory()){
ArrayList<String> filesArray = new ArrayList<String>(Arrays.asList(prefsdir.list()));
ArrayList<String> newList = new ArrayList<String>();
filesArray.remove("com.introlab.rtabmap_preferences.xml");
filesArray.remove("WebViewChromiumPrefs.xml");
for (String s : filesArray) {
newList.add(s.substring(0, s.length()-4)); // rip off the ".xml"
}
final String[] files = newList.toArray(new String[filesArray.size()]);
if(files.length > 0)
{
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Remove Presets:");
builder.setItems(files, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, final int which) {
File file = new File(getApplicationInfo().dataDir + "/shared_prefs/" + files[which] + ".xml");
if(file.exists())
{
file.delete();
}
return;
}
});
builder.show();
}
}
return true;
}
});
((Preference)findPreference(getString(R.string.pref_key_density))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_density))).getEntry() + ") "+getString(R.string.pref_summary_density));
((Preference)findPreference(getString(R.string.pref_key_depth))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_depth))).getEntry() + ") "+getString(R.string.pref_summary_depth));
((Preference)findPreference(getString(R.string.pref_key_min_depth))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_min_depth))).getEntry() + ") "+getString(R.string.pref_summary_min_depth));
((Preference)findPreference(getString(R.string.pref_key_point_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_point_size))).getEntry() + ") "+getString(R.string.pref_summary_point_size));
((Preference)findPreference(getString(R.string.pref_key_angle))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_angle))).getEntry() + ") "+getString(R.string.pref_summary_angle));
((Preference)findPreference(getString(R.string.pref_key_triangle))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_triangle))).getEntry() + ") "+getString(R.string.pref_summary_triangle));
((Preference)findPreference(getString(R.string.pref_key_background_color))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_background_color))).getEntry() + ") "+getString(R.string.pref_summary_background_color));
((Preference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_rendering_texture_decimation))).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
((Preference)findPreference(getString(R.string.pref_key_update_rate))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_update_rate))).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
((Preference)findPreference(getString(R.string.pref_key_max_speed))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_speed))).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
((Preference)findPreference(getString(R.string.pref_key_time_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_time_thr))).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
((Preference)findPreference(getString(R.string.pref_key_mem_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_mem_thr))).getEntry() + ") "+getString(R.string.pref_summary_mem_thr));
((Preference)findPreference(getString(R.string.pref_key_loop_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_loop_thr))).getEntry() + ") "+getString(R.string.pref_summary_loop_thr));
((Preference)findPreference(getString(R.string.pref_key_sim_thr))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_sim_thr))).getEntry() + ") "+getString(R.string.pref_summary_sim_thr));
((Preference)findPreference(getString(R.string.pref_key_min_inliers))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_min_inliers))).getEntry() + ") "+getString(R.string.pref_summary_min_inliers));
((Preference)findPreference(getString(R.string.pref_key_opt_error))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_error))).getEntry() + ") "+getString(R.string.pref_summary_opt_error));
((Preference)findPreference(getString(R.string.pref_key_features_voc))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_features_voc))).getEntry() + ") "+getString(R.string.pref_summary_features_voc));
((Preference)findPreference(getString(R.string.pref_key_features))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_features))).getEntry() + ") "+getString(R.string.pref_summary_features));
((Preference)findPreference(getString(R.string.pref_key_features_type))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_features_type))).getEntry() + ") "+getString(R.string.pref_summary_features_type));
((Preference)findPreference(getString(R.string.pref_key_optimizer))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_optimizer))).getEntry() + ") "+getString(R.string.pref_summary_optimizer));
((Preference)findPreference(getString(R.string.pref_key_cloud_voxel))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_cloud_voxel))).getEntry() + ") "+getString(R.string.pref_summary_cloud_voxel));
((Preference)findPreference(getString(R.string.pref_key_texture_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_texture_size))).getEntry() + ") "+getString(R.string.pref_summary_texture_size));
((Preference)findPreference(getString(R.string.pref_key_texture_count))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_texture_count))).getEntry() + ") "+getString(R.string.pref_summary_texture_count));
((Preference)findPreference(getString(R.string.pref_key_normal_k))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_normal_k))).getEntry() + ") "+getString(R.string.pref_summary_normal_k));
((Preference)findPreference(getString(R.string.pref_key_max_texture_distance))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_max_texture_distance))).getEntry() + ") "+getString(R.string.pref_summary_max_texture_distance));
((Preference)findPreference(getString(R.string.pref_key_min_texture_cluster_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_min_texture_cluster_size))).getEntry() + ") "+getString(R.string.pref_summary_min_texture_cluster_size));
((Preference)findPreference(getString(R.string.pref_key_opt_depth))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_depth))).getEntry() + ") "+getString(R.string.pref_summary_opt_depth));
((Preference)findPreference(getString(R.string.pref_key_opt_color_radius))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_color_radius))).getEntry() + ") "+getString(R.string.pref_summary_opt_color_radius));
((Preference)findPreference(getString(R.string.pref_key_opt_min_cluster_size))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_opt_min_cluster_size))).getEntry() + ") "+getString(R.string.pref_summary_opt_min_cluster_size));
((Preference)findPreference(getString(R.string.pref_key_cluster_ratio))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_cluster_ratio))).getEntry() + ") "+getString(R.string.pref_summary_cluster_ratio));
((Preference)findPreference(getString(R.string.pref_key_gain_max_radius))).setSummary("("+((ListPreference)findPreference(getString(R.string.pref_key_gain_max_radius))).getEntry() + ") "+getString(R.string.pref_summary_gain_max_radius));
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference pref = findPreference(key);
if (pref instanceof ListPreference) {
if(key.compareTo(getString(R.string.pref_key_density))==0) pref.setSummary("("+ ((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_density));
if(key.compareTo(getString(R.string.pref_key_depth))==0)
{
pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_depth));
float maxDepth = Float.parseFloat(((ListPreference)pref).getValue());
float minDepth = Float.parseFloat(((ListPreference)findPreference(getString(R.string.pref_key_min_depth))).getValue());
if(maxDepth > 0.0f && maxDepth <= minDepth)
{
((ListPreference)findPreference(getString(R.string.pref_key_min_depth))).setValueIndex(0);
}
}
if(key.compareTo(getString(R.string.pref_key_min_depth))==0)
{
pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_min_depth));
float maxDepth = Float.parseFloat(((ListPreference)findPreference(getString(R.string.pref_key_depth))).getValue());
float minDepth = Float.parseFloat(((ListPreference)pref).getValue());
if(minDepth >= maxDepth)
{
((ListPreference)findPreference(getString(R.string.pref_key_depth))).setValueIndex(0);
}
}
if(key.compareTo(getString(R.string.pref_key_point_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_point_size));
if(key.compareTo(getString(R.string.pref_key_angle))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_angle));
if(key.compareTo(getString(R.string.pref_key_triangle))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_triangle));
if(key.compareTo(getString(R.string.pref_key_background_color))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_background_color));
if(key.compareTo(getString(R.string.pref_key_rendering_texture_decimation))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_rendering_texture_decimation));
if(key.compareTo(getString(R.string.pref_key_update_rate))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_update_rate));
if(key.compareTo(getString(R.string.pref_key_max_speed))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_speed));
if(key.compareTo(getString(R.string.pref_key_time_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_time_thr));
if(key.compareTo(getString(R.string.pref_key_mem_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_mem_thr));
if(key.compareTo(getString(R.string.pref_key_loop_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_loop_thr));
if(key.compareTo(getString(R.string.pref_key_sim_thr))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_sim_thr));
if(key.compareTo(getString(R.string.pref_key_min_inliers))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_min_inliers));
if(key.compareTo(getString(R.string.pref_key_opt_error))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_opt_error));
if(key.compareTo(getString(R.string.pref_key_features_voc))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_features_voc));
if(key.compareTo(getString(R.string.pref_key_features))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_features));
if(key.compareTo(getString(R.string.pref_key_features_type))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_features_type));
if(key.compareTo(getString(R.string.pref_key_optimizer))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_optimizer));
if(key.compareTo(getString(R.string.pref_key_cloud_voxel))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_cloud_voxel));
if(key.compareTo(getString(R.string.pref_key_texture_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_texture_size));
if(key.compareTo(getString(R.string.pref_key_texture_count))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_texture_count));
if(key.compareTo(getString(R.string.pref_key_normal_k))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_normal_k));
if(key.compareTo(getString(R.string.pref_key_max_texture_distance))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_max_texture_distance));
if(key.compareTo(getString(R.string.pref_key_min_texture_cluster_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_min_texture_cluster_size));
if(key.compareTo(getString(R.string.pref_key_opt_depth))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_opt_depth));
if(key.compareTo(getString(R.string.pref_key_opt_color_radius))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_opt_color_radius));
if(key.compareTo(getString(R.string.pref_key_opt_min_cluster_size))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_opt_min_cluster_size));
if(key.compareTo(getString(R.string.pref_key_cluster_ratio))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_cluster_ratio));
if(key.compareTo(getString(R.string.pref_key_gain_max_radius))==0) pref.setSummary("("+((ListPreference)pref).getEntry() + ") "+getString(R.string.pref_summary_gain_max_radius));
}
}
@Override
protected void onResume() {
super.onResume();
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
// Unregister the listener whenever a key changes
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
private void saveConfig(String fileName)
{
//sp1 is the shared pref to copy to
SharedPreferences.Editor ed = getActivity().getSharedPreferences(fileName, MODE_PRIVATE).edit();
SharedPreferences sp = getPreferenceScreen().getSharedPreferences(); //The shared preferences to copy from
ed.clear(); // This clears the one we are copying to, but you don't necessarily need to do that.
//Cycle through all the entries in the sp
for(Entry<String,?> entry : sp.getAll().entrySet()){
Object v = entry.getValue();
String key = entry.getKey();
//Now we just figure out what type it is, so we can copy it.
// Note that i am using Boolean and Integer instead of boolean and int.
// That's because the Entry class can only hold objects and int and boolean are primatives.
if(v instanceof Boolean)
// Also note that i have to cast the object to a Boolean
// and then use .booleanValue to get the boolean
ed.putBoolean(key, ((Boolean)v).booleanValue());
else if(v instanceof Float)
ed.putFloat(key, ((Float)v).floatValue());
else if(v instanceof Integer)
ed.putInt(key, ((Integer)v).intValue());
else if(v instanceof Long)
ed.putLong(key, ((Long)v).longValue());
else if(v instanceof String)
ed.putString(key, ((String)v));
}
ed.commit(); //save it.
}
}

View File

@@ -0,0 +1,453 @@
package com.introlab.rtabmap;
import java.io.File;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class SketchfabActivity extends Activity implements OnClickListener {
private static final String AUTHORIZE_PATH = "https://sketchfab.com/oauth2/authorize";
private static final String CLIENT_ID = "RXrIJYAwlTELpySsyM8TrK9r3kOGQ5Qjj9VVDIfV";
private static final String REDIRECT_URI = "https://introlab.github.io/rtabmap/oauth2_redirect";
ProgressDialog mProgressDialog;
private Dialog mAuthDialog;
private String mAuthToken;
private String mWorkingDirectory;
EditText mFilename;
EditText mDescription;
EditText mTags;
CheckBox mDraft;
Button mButtonOk;
private SketchfabActivity getActivity() {return this;}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sketchfab);
mFilename = (EditText)findViewById(R.id.editText_filename);
mDescription = (EditText)findViewById(R.id.editText_description);
mTags = (EditText)findViewById(R.id.editText_tags);
mDraft = (CheckBox)findViewById(R.id.checkBox_draft);
mButtonOk = (Button)findViewById(R.id.button_ok);
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setCanceledOnTouchOutside(false);
mAuthToken = getIntent().getExtras().getString(RTABMapActivity.RTABMAP_AUTH_TOKEN_KEY);
mFilename.setText(getIntent().getExtras().getString(RTABMapActivity.RTABMAP_FILENAME_KEY));
mWorkingDirectory = getIntent().getExtras().getString(RTABMapActivity.RTABMAP_WORKING_DIR_KEY);
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String tags = sharedPref.getString(getString(R.string.pref_key_tags), getString(R.string.pref_default_tags));
if(tags.isEmpty())
{
tags = getString(R.string.pref_default_tags);
}
mTags.setText(tags);
mButtonOk.setEnabled(mFilename.getText().toString().length()>0);
mButtonOk.setOnClickListener(this);
mFilename.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
mButtonOk.setEnabled(s.length() != 0);
}
});
mFilename.setSelectAllOnFocus(true);
mFilename.requestFocus();
}
@Override
public void onClick(View v) {
// Handle button clicks.
switch (v.getId()) {
case R.id.button_ok:
shareToSketchfab();
break;
default:
return;
}
}
private void shareToSketchfab()
{
if(!mTags.getText().toString().isEmpty())
{
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(getString(R.string.pref_key_tags), mTags.getText().toString());
// Commit the edits!
editor.commit();
}
authorizeAndPublish(mFilename.getText().toString());
}
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
private void authorizeAndPublish(final String fileName)
{
if(!isNetworkAvailable())
{
// Visualize the result?
new AlertDialog.Builder(this)
.setTitle("Sharing to Sketchfab...")
.setMessage("Network is not available. Make sure you have internet before continuing.")
.setPositiveButton("Try Again", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
authorizeAndPublish(fileName);
}
})
.setNeutralButton("Abort", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
return;
}
// get token the first time
if(mAuthToken == null)
{
Log.i(RTABMapActivity.TAG,"We don't have the token, get it!");
WebView web;
mAuthDialog = new Dialog(this);
mAuthDialog.setContentView(R.layout.auth_dialog);
web = (WebView)mAuthDialog.findViewById(R.id.webv);
web.setWebContentsDebuggingEnabled(!RTABMapActivity.DISABLE_LOG);
web.getSettings().setJavaScriptEnabled(true);
String auth_url = AUTHORIZE_PATH+"?redirect_uri="+REDIRECT_URI+"&response_type=token&client_id="+CLIENT_ID;
Log.i(RTABMapActivity.TAG, "Auhorize url="+auth_url);
web.setWebViewClient(new WebViewClient() {
boolean authComplete = false;
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//Log.i(TAG,"onPageFinished url="+url);
if(url.contains("error=access_denied")){
Log.e(RTABMapActivity.TAG, "ACCESS_DENIED_HERE");
authComplete = true;
Toast.makeText(getApplicationContext(), "Error Occured", Toast.LENGTH_SHORT).show();
mAuthDialog.dismiss();
}
else if (url.startsWith(REDIRECT_URI) && url.contains("access_token") && authComplete != true) {
//Log.i(TAG,"onPageFinished received token="+url);
String[] sArray = url.split("access_token=");
mAuthToken = (sArray[1].split("&token_type=Bearer"))[0];
authComplete = true;
mAuthDialog.dismiss();
zipAndPublish(fileName);
}
}
});
mAuthDialog.show();
mAuthDialog.setTitle("Authorize RTAB-Map");
mAuthDialog.setCancelable(true);
web.loadUrl(auth_url);
}
else
{
zipAndPublish(fileName);
}
}
private void zipAndPublish(final String fileName)
{
mProgressDialog.setTitle("Upload to Sketchfab");
mProgressDialog.setMessage(String.format("Compressing the files..."));
mProgressDialog.show();
Thread workingThread = new Thread(new Runnable() {
public void run() {
try{
File tmpDir = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR);
tmpDir.mkdirs();
String[] fileNames = Util.loadFileList(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR, false);
if(!RTABMapActivity.DISABLE_LOG) Log.i(RTABMapActivity.TAG, String.format("Deleting %d files in \"%s\"", fileNames.length, mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR));
for(int i=0; i<fileNames.length; ++i)
{
File f = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR + "/" + fileNames[i]);
if(f.delete())
{
if(!RTABMapActivity.DISABLE_LOG) Log.i(RTABMapActivity.TAG, String.format("Deleted \"%s\"", f.getPath()));
}
else
{
if(!RTABMapActivity.DISABLE_LOG) Log.i(RTABMapActivity.TAG, String.format("Failed deleting \"%s\"", f.getPath()));
}
}
File exportDir = new File(mWorkingDirectory + RTABMapActivity.RTABMAP_EXPORT_DIR);
exportDir.mkdirs();
if(RTABMapLib.writeExportedMesh(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR, RTABMapActivity.RTABMAP_TMP_FILENAME))
{
String[] files = new String[0];
// verify if we have all files
fileNames = Util.loadFileList(mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR, false);
if(fileNames.length > 0)
{
files = new String[fileNames.length];
for(int i=0; i<fileNames.length; ++i)
{
files[i] = mWorkingDirectory + RTABMapActivity.RTABMAP_TMP_DIR + "/" + fileNames[i];
}
}
else
{
if(!RTABMapActivity.DISABLE_LOG) Log.i(RTABMapActivity.TAG, "Missing files!");
}
if(files.length > 0)
{
final String[] filesToZip = files;
final String zipOutput = mWorkingDirectory+fileName+".zip";
Util.zip(filesToZip, zipOutput);
runOnUiThread(new Runnable() {
public void run() {
mProgressDialog.dismiss();
File f = new File(zipOutput);
// Continue?
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("File(s) compressed and ready to upload!");
final int fileSizeMB = (int)f.length()/(1024 * 1024);
final int fileSizeKB = (int)f.length()/(1024);
if(fileSizeMB == 0)
{
Log.i(RTABMapActivity.TAG, String.format("Zipped files = %d KB", fileSizeKB));
builder.setMessage(String.format("Total size to upload = %d KB. Do you want to continue?\n\n", fileSizeKB));
}
else
{
Log.i(RTABMapActivity.TAG, String.format("Zipped files = %d MB", fileSizeMB));
builder.setMessage(String.format("Total size to upload = %d MB. %sDo you want to continue?\n\n"
+ "Tip: To reduce the model size, you can also look at the Settings->Exporting options.", fileSizeMB,
fileSizeMB>=50?"Note that for size over 50 MB, a Sketchfab PRO account is required, otherwise the upload may fail. ":""));
}
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mProgressDialog.setTitle("Upload to Sketchfab");
if(fileSizeMB == 0)
{
mProgressDialog.setMessage(String.format("Uploading model \"%s\" (%d KB) to Sketchfab...", fileName, fileSizeKB));
}
else
{
mProgressDialog.setMessage(String.format("Uploading model \"%s\" (%d MB) to Sketchfab...", fileName, fileSizeMB));
}
mProgressDialog.show();
new uploadToSketchfabTask().execute(zipOutput, fileName);
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing...
}
});
builder.show();
}
});
}
}
else
{
runOnUiThread(new Runnable() {
public void run() {
mProgressDialog.dismiss();
Toast.makeText(getActivity(), String.format("Failed writing files!"), Toast.LENGTH_LONG).show();
}
});
}
}
catch(IOException ex) {
Log.e(RTABMapActivity.TAG, "Failed to zip", ex);
}
}
});
workingThread.start();
}
private class uploadToSketchfabTask extends AsyncTask<String, Void, Void>
{
String mModelUri;
String mModelFilePath;
String error = "";
String mFileName;
protected void onPreExecute() {
//display progress dialog.
}
@Override
protected void onPostExecute(Void result) {
mProgressDialog.dismiss();
//Task you want to do on UIThread after completing Network operation
//onPostExecute is called after doInBackground finishes its task.
if(mModelFilePath!= null)
{
File f = new File(mModelFilePath);
f.delete(); // cleanup
// See on sketchfab?
final SpannableString s = new SpannableString(
"Model \"" + mFileName + "\" is now processing on Sketchfab! You can click "
+ "on the link below to see it on Sketchfab.\n\nhttps://sketchfab.com/models/"+mModelUri);
Linkify.addLinks(s, Linkify.WEB_URLS);
final AlertDialog d = new AlertDialog.Builder(getActivity())
.setTitle("Upload finished!")
.setCancelable(false)
.setMessage(s)
.setPositiveButton("Close", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent resultIntent = new Intent();
resultIntent.putExtra(RTABMapActivity.RTABMAP_AUTH_TOKEN_KEY, mAuthToken);
setResult(Activity.RESULT_OK, resultIntent);
finish();
}
}).create();
d.show();
((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
}
else
{
Toast.makeText(getApplicationContext(), String.format("Upload failed! Error=\"%s\"", error), Toast.LENGTH_SHORT).show();
}
}
@Override
protected Void doInBackground(String... files) {
String charset = "UTF-8";
File uploadFile = new File(files[0]);
mFileName = files[1];
String requestURL = "https://api.sketchfab.com/v3/models";
Log.i(RTABMapActivity.TAG, "Uploading " + files[0]);
try {
MultipartUtility multipart = new MultipartUtility(requestURL, mAuthToken, charset);
multipart.addFormField("name", mFileName);
multipart.addFormField("description", mDescription.getText().toString());
multipart.addFormField("tags", mTags.getText().toString());
multipart.addFormField("source", "RTAB-Map");
multipart.addFormField("isPublished", mDraft.isChecked()?"false":"true");
multipart.addFilePart("modelFile", uploadFile);
Log.i(RTABMapActivity.TAG, "Starting multipart request");
List<String> response = multipart.finish();
Log.i(RTABMapActivity.TAG, "SERVER REPLIED:");
for (String line : response) {
Log.i(RTABMapActivity.TAG, line);
//{"uri":"https:\/\/api.sketchfab.com\/v3\/models\/XXXXXXXXX","uid":"XXXXXXXXXX"}
if(line.contains("\"uid\":\""))
{
String[] sArray = line.split("\"uid\":\"");
mModelUri = (sArray[1].split("\""))[0];
mModelFilePath = files[0];
//patch model for orientation
/*HttpClient httpClient = new DefaultHttpClient();
try {
String patchURL = "https://api.sketchfab.com/v3/models/"+ mModelUri +"/options";
HttpPatch request = new HttpPatch(patchURL);
String json =
"{\n"+
"uid: "+ mModelUri + "\n" +
"shading: shadeless\n"+
//"orientation:\n"+
//"{\n"+
// "axis : [1, 0, 0]\n"+
// "angle : 0\n"+
//"}\n"+
"}";
request.setHeader("Authorization", "Bearer " + mAuthToken);
StringEntity params =new StringEntity(json, "UTF-8");
params.setContentType("application/json");
request.setEntity(params);
HttpResponse responsePatch = httpClient.execute(request);
int responseStatus = responsePatch.getStatusLine().getStatusCode();
Log.i(RTABMapActivity.TAG, "get data responseStatus: " + responseStatus);
}catch (Exception e) {
Log.e(RTABMapActivity.TAG, "Error while patching model", e);
error = e.getMessage();
}*/
}
}
} catch (IOException ex) {
Log.e(RTABMapActivity.TAG, "Error while uploading", ex);
error = ex.getMessage();
}
return null;
}
}
}

View File

@@ -0,0 +1,136 @@
/*
* Copyright 2016 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Copied for convenience from https://github.com/googlesamples/tango-examples-c/blob/master/cpp_example_util/app/src/main/java/com/projecttango/examples/cpp/util/TangoInitializationHelper.java
*/
package com.introlab.rtabmap;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
import java.io.File;
/**
* Functions for simplifying the process of initializing TangoService, and function
* handles loading correct libtango_client_api.so.
*/
public class TangoInitializationHelper {
public static final int ARCH_ERROR = -2;
public static final int ARCH_FALLBACK = -1;
public static final int ARCH_DEFAULT = 0;
public static final int ARCH_ARM64 = 1;
public static final int ARCH_ARM32 = 2;
public static final int ARCH_X86_64 = 3;
public static final int ARCH_X86 = 4;
/**
* Only for apps using the C API:
* Initializes the underlying TangoService for native apps.
*
* @return returns false if the device doesn't have the Tango running as Android Service.
* Otherwise ture.
*/
public static final boolean bindTangoService(final Context context,
ServiceConnection connection) {
Intent intent = new Intent();
intent.setClassName("com.google.tango", "com.google.atap.tango.TangoService");
boolean hasJavaService = (context.getPackageManager().resolveService(intent, 0) != null);
// User doesn't have the latest packagename for TangoCore, fallback to the previous name.
if (!hasJavaService) {
intent = new Intent();
intent.setClassName("com.projecttango.tango", "com.google.atap.tango.TangoService");
hasJavaService = (context.getPackageManager().resolveService(intent, 0) != null);
}
// User doesn't have a Java-fied TangoCore at all; fallback to the deprecated approach
// of doing nothing and letting the native side auto-init to the system-service version
// of Tango.
if (!hasJavaService) {
return false;
}
return context.bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
/**
* Load the libtango_client_api.so library based on different Tango device setup.
*
* @return returns the loaded architecture id.
*/
public static final int loadTangoSharedLibrary() {
int loadedSoId = ARCH_ERROR;
String basePath = "/data/data/com.google.tango/libfiles/";
if (!(new File(basePath).exists())) {
basePath = "/data/data/com.projecttango.tango/libfiles/";
}
Log.i("TangoInitializationHelper", "basePath: " + basePath);
try {
System.load(basePath + "arm64-v8a/libtango_client_api.so");
loadedSoId = ARCH_ARM64;
Log.i("TangoInitializationHelper", "Success! Using arm64-v8a/libtango_client_api.");
} catch (UnsatisfiedLinkError e) {
}
if (loadedSoId < ARCH_DEFAULT) {
try {
System.load(basePath + "armeabi-v7a/libtango_client_api.so");
loadedSoId = ARCH_ARM32;
Log.i("TangoInitializationHelper", "Success! Using armeabi-v7a/libtango_client_api.");
} catch (UnsatisfiedLinkError e) {
}
}
if (loadedSoId < ARCH_DEFAULT) {
try {
System.load(basePath + "x86_64/libtango_client_api.so");
loadedSoId = ARCH_X86_64;
Log.i("TangoInitializationHelper", "Success! Using x86_64/libtango_client_api.");
} catch (UnsatisfiedLinkError e) {
}
}
if (loadedSoId < ARCH_DEFAULT) {
try {
System.load(basePath + "x86/libtango_client_api.so");
loadedSoId = ARCH_X86;
Log.i("TangoInitializationHelper", "Success! Using x86/libtango_client_api.");
} catch (UnsatisfiedLinkError e) {
}
}
if (loadedSoId < ARCH_DEFAULT) {
try {
System.load(basePath + "default/libtango_client_api.so");
loadedSoId = ARCH_DEFAULT;
Log.i("TangoInitializationHelper", "Success! Using default/libtango_client_api.");
} catch (UnsatisfiedLinkError e) {
}
}
if (loadedSoId < ARCH_DEFAULT) {
try {
System.loadLibrary("tango_client_api");
loadedSoId = ARCH_FALLBACK;
Log.i("TangoInitializationHelper", "Falling back to libtango_client_api.so symlink.");
} catch (UnsatisfiedLinkError e) {
}
}
return loadedSoId;
}
}

View File

@@ -0,0 +1,419 @@
//package ri.blog.opengl008;
package com.introlab.rtabmap;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
import java.util.Iterator;
import java.util.Vector;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.opengl.GLES20;
import android.opengl.GLUtils;
import android.text.TextPaint;
public class TextManager {
/* SHADER Text
*
* This shader is for rendering 2D text textures straight from a texture
* Color and alpha blended.
*
*/
public static final String vs_Text =
"uniform mat4 uMVPMatrix;" +
"attribute vec4 vPosition;" +
"attribute vec2 a_texCoord;" +
"varying vec2 v_texCoord;" +
"void main() {" +
" gl_Position = uMVPMatrix * vPosition;" +
" v_texCoord = a_texCoord;" +
"}";
public static final String fs_Text =
"precision mediump float;" +
"uniform float uColor;" +
"varying vec2 v_texCoord;" +
"uniform sampler2D s_texture;" +
"void main() {" +
" gl_FragColor = texture2D( s_texture, v_texCoord );" +
" gl_FragColor.rgb *= uColor;" +
"}";
public static int sp_Text;
public static final int RI_TEXT_TEXTURE_SIZE = 512; // 512
public static final float RI_TEXT_HEIGHT_BASE = 32.0f;
public static final char RI_TEXT_START = ' ';
public static final char RI_TEXT_STOP = '~'+1;
public float getMaxTextHeight() {return mTextHeight;}
private float mUVWidth;
private float mUVHeight;
private float mTextHeight;
private float mColor;
private FloatBuffer vertexBuffer;
private FloatBuffer textureBuffer;
private ShortBuffer drawListBuffer;
private float[] vecs;
private float[] uvs;
private short[] indices;
private int index_vecs;
private int index_indices;
private int index_uvs;
private int texturenr;
private int[] mTextures;
private float uniformscale = 1.0f;
float[] mCharacterWidth;
public TextManager(Context context)
{
// Create the arrays
vecs = new float[3 * 10];
uvs = new float[2 * 10];
indices = new short[10];
// init as 0 as default
texturenr = 0;
// Text shader
int vshadert = TextManager.loadShader(GLES20.GL_VERTEX_SHADER, TextManager.vs_Text);
int fshadert = TextManager.loadShader(GLES20.GL_FRAGMENT_SHADER, TextManager.fs_Text);
TextManager.sp_Text = GLES20.glCreateProgram();
GLES20.glAttachShader(TextManager.sp_Text, vshadert);
GLES20.glAttachShader(TextManager.sp_Text, fshadert); // add the fragment shader to program
GLES20.glLinkProgram(TextManager.sp_Text); // creates OpenGL ES program executables
// Generate Textures, if more needed, alter these numbers.
mTextures = new int[1];
GLES20.glGenTextures(1, mTextures, 0);
// Create an empty, mutable bitmap
Bitmap bitmap = Bitmap.createBitmap(RI_TEXT_TEXTURE_SIZE, RI_TEXT_TEXTURE_SIZE, Bitmap.Config.ARGB_4444);
// get a canvas to paint over the bitmap
Canvas canvas = new Canvas(bitmap);
bitmap.eraseColor(0);
// Draw the text
TextPaint textPaint = new TextPaint();
textPaint.setTextSize(RI_TEXT_HEIGHT_BASE);
textPaint.setColor(Color.WHITE);
textPaint.setAntiAlias(true);
textPaint.setTypeface(Typeface.create("Arial", Typeface.BOLD));
// compute real maximum height
mTextHeight=0.0f;
for(char c=RI_TEXT_START; c<RI_TEXT_STOP; ++c)
{
Rect textBounds = new Rect();
textPaint.getTextBounds(String.valueOf(c), 0, 1, textBounds);
if(textBounds.height() + textBounds.bottom > mTextHeight)
{
mTextHeight = textBounds.height() + textBounds.bottom;
}
}
mUVWidth = (float)RI_TEXT_HEIGHT_BASE/(float)RI_TEXT_TEXTURE_SIZE;
mUVHeight = mTextHeight/(float)RI_TEXT_TEXTURE_SIZE;
mColor = 1.0f;
int colCount = RI_TEXT_TEXTURE_SIZE/(int)RI_TEXT_HEIGHT_BASE;
mCharacterWidth = new float[RI_TEXT_STOP-RI_TEXT_START];
int i=0;
for(char c=RI_TEXT_START; c<RI_TEXT_STOP; ++c)
{
Rect textBounds = new Rect();
textPaint.getTextBounds(String.valueOf(c), 0, 1, textBounds);
canvas.drawText(String.valueOf(c), (i%colCount)*RI_TEXT_HEIGHT_BASE, (i/colCount) * mTextHeight + RI_TEXT_HEIGHT_BASE, textPaint);
mCharacterWidth[i] = textPaint.measureText(String.valueOf(c));
++i;
}
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures[0]);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
//Clean up
bitmap.recycle();
}
public void setTextureID(int val)
{
texturenr = val;
}
public static int loadShader(int type, String shaderCode){
// create a vertex shader type (GLES20.GL_VERTEX_SHADER)
// or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
int shader = GLES20.glCreateShader(type);
// add the source code to the shader and compile it
GLES20.glShaderSource(shader, shaderCode);
GLES20.glCompileShader(shader);
// return the shader
return shader;
}
public void AddCharRenderInformation(float[] vec, float[] cs, float[] uv, short[] indi)
{
// We need a base value because the object has indices related to
// that object and not to this collection so basicly we need to
// translate the indices to align with the vertexlocation in ou
// vecs array of vectors.
short base = (short) (index_vecs / 3);
// We should add the vec, translating the indices to our saved vector
for(int i=0;i<vec.length;i++)
{
vecs[index_vecs] = vec[i];
index_vecs++;
}
// We should add the uvs
for(int i=0;i<uv.length;i++)
{
uvs[index_uvs] = uv[i];
index_uvs++;
}
// We handle the indices
for(int j=0;j<indi.length;j++)
{
indices[index_indices] = (short) (base + indi[j]);
index_indices++;
}
}
public void PrepareDrawInfo(Vector<TextObject> txtcollection)
{
// Reset the indices.
index_vecs = 0;
index_indices = 0;
index_uvs = 0;
// Get the total amount of characters
int charcount = 0;
for (TextObject txt : txtcollection) {
if(txt!=null)
{
if(!(txt.text==null))
{
charcount += txt.text.length();
}
}
}
// Create the arrays we need with the correct size.
vecs = null;
uvs = null;
indices = null;
vecs = new float[charcount * 12];
uvs = new float[charcount * 8];
indices = new short[charcount * 6];
}
public void PrepareDraw(Vector<TextObject> txtcollection)
{
// Setup all the arrays
PrepareDrawInfo(txtcollection);
// Using the iterator protects for problems with concurrency
for( Iterator< TextObject > it = txtcollection.iterator(); it.hasNext() ; )
{
TextObject txt = it.next();
if(txt!=null)
{
if(!(txt.text==null))
{
convertTextToTriangleInfo(txt);
}
}
}
}
public void Draw(float[] m)
{
if(vecs.length > 0)
{
GLES20.glDisable(GLES20.GL_DEPTH_TEST);
GLES20.glEnable(GLES20.GL_BLEND);
// Set the correct shader for our grid object.
GLES20.glUseProgram(sp_Text);
// The vertex buffer.
ByteBuffer bb = ByteBuffer.allocateDirect(vecs.length * 4);
bb.order(ByteOrder.nativeOrder());
vertexBuffer = bb.asFloatBuffer();
vertexBuffer.put(vecs);
vertexBuffer.position(0);
// The texture buffer
ByteBuffer bb2 = ByteBuffer.allocateDirect(uvs.length * 4);
bb2.order(ByteOrder.nativeOrder());
textureBuffer = bb2.asFloatBuffer();
textureBuffer.put(uvs);
textureBuffer.position(0);
// initialize byte buffer for the draw list
ByteBuffer dlb = ByteBuffer.allocateDirect(indices.length * 2);
dlb.order(ByteOrder.nativeOrder());
drawListBuffer = dlb.asShortBuffer();
drawListBuffer.put(indices);
drawListBuffer.position(0);
// get handle to vertex shader's vPosition member
int mPositionHandle = GLES20.glGetAttribLocation(sp_Text, "vPosition");
// Enable a handle to the triangle vertices
GLES20.glEnableVertexAttribArray(mPositionHandle);
// Prepare the background coordinate data
GLES20.glVertexAttribPointer(mPositionHandle, 3,
GLES20.GL_FLOAT, false,
0, vertexBuffer);
int mTexCoordLoc = GLES20.glGetAttribLocation(sp_Text, "a_texCoord" );
// Prepare the texturecoordinates
GLES20.glVertexAttribPointer ( mTexCoordLoc, 2, GLES20.GL_FLOAT,
false,
0, textureBuffer);
GLES20.glEnableVertexAttribArray ( mPositionHandle );
GLES20.glEnableVertexAttribArray ( mTexCoordLoc );
// get handle to shape's transformation matrix
int mtrxhandle = GLES20.glGetUniformLocation(sp_Text, "uMVPMatrix");
// Apply the projection and view transformation
GLES20.glUniformMatrix4fv(mtrxhandle, 1, false, m, 0);
// get handle to color value
int colorhandle = GLES20.glGetUniformLocation(sp_Text, "uColor");
GLES20.glUniform1f(colorhandle, mColor);
int mSamplerLoc = GLES20.glGetUniformLocation (sp_Text, "s_texture" );
// Texture activate unit 0
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
// Bind the texture to this unit.
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures[0]);
// Set the sampler texture unit to our selected id
GLES20.glUniform1i ( mSamplerLoc, texturenr);
// Draw the triangle
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
// Disable vertex array
GLES20.glDisableVertexAttribArray(mPositionHandle);
GLES20.glDisableVertexAttribArray(mTexCoordLoc);
}
}
private void convertTextToTriangleInfo(TextObject val)
{
// Get attributes from text object
float x = val.x;
float y = val.y;
String text = val.text;
// Create
for(int j=0; j<text.length(); j++)
{
// get ascii value
char c = text.charAt(j);
int c_val = (int)c;
int indx = c_val-RI_TEXT_START;
if(indx<0 || indx>=mCharacterWidth.length) {
// unknown character, we will add a space for it to be save.
indx = 0;
}
int colCount = RI_TEXT_TEXTURE_SIZE/(int)RI_TEXT_HEIGHT_BASE;
// Calculate the uv parts
int row = indx / colCount;
int col = indx % colCount;
float v = row * mUVHeight;
float v2 = v + mUVHeight;
float u = col * mUVWidth;
float u2 = u + mCharacterWidth[indx]/(float)RI_TEXT_TEXTURE_SIZE;
// Creating the triangle information
float[] vec = new float[12];
float[] uv = new float[8];
float[] colors = new float[16];
vec[0] = x;
vec[1] = y + (mTextHeight * uniformscale);
vec[2] = 0.99f;
vec[3] = x;
vec[4] = y;
vec[5] = 0.99f;
vec[6] = x + (mCharacterWidth[indx] * uniformscale);
vec[7] = y;
vec[8] = 0.99f;
vec[9] = x + (mCharacterWidth[indx] * uniformscale);
vec[10] = y + (mTextHeight * uniformscale);
vec[11] = 0.99f;
colors = new float[]
{val.color[0], val.color[1], val.color[2], val.color[3],
val.color[0], val.color[1], val.color[2], val.color[3],
val.color[0], val.color[1], val.color[2], val.color[3],
val.color[0], val.color[1], val.color[2], val.color[3]
};
// 0.001f = texture bleeding hack/fix
uv[0] = u+0.001f;
uv[1] = v+0.001f;
uv[2] = u+0.001f;
uv[3] = v2-0.001f;
uv[4] = u2-0.001f;
uv[5] = v2-0.001f;
uv[6] = u2-0.001f;
uv[7] = v+0.001f;
short[] inds = {0, 1, 2, 0, 2, 3};
// Add our triangle information to our collection for 1 render call.
AddCharRenderInformation(vec, colors, uv, inds);
// Calculate the new position
x += (mCharacterWidth[indx] * uniformscale);
}
}
public float getUniformscale() {
return uniformscale;
}
public void setUniformscale(float uniformscale) {
this.uniformscale = uniformscale;
}
public void setColor(float color) {
mColor = color;
}
}

View File

@@ -0,0 +1,33 @@
//package ri.blog.opengl008;
package com.introlab.rtabmap;
public class TextObject {
public String text;
public float x;
public float y;
public float[] color;
public TextObject()
{
text = "default";
x = 0f;
y = 0f;
color = new float[] {1f, 1f, 1f, 1.0f};
}
public TextObject(String txt, float xcoord, float ycoord)
{
text = txt;
x = xcoord;
y = ycoord;
color = new float[] {1f, 1f, 1f, 1.0f};
}
/*public boolean validate()
{
if(text.compareTo("")==0) return false;
return true;
}*/
}

View File

@@ -0,0 +1,126 @@
package com.introlab.rtabmap;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
public class Util {
public static final int ZIP_BUFFER_SIZE = 1<<20; // 1MB
public static void zip(String file, String zipFile) throws IOException {
Log.i(RTABMapActivity.TAG, "Zipping " + file +" to " + zipFile);
String[] files = new String[1];
files[0] = file;
zip(files, zipFile);
}
public static void zip(String[] files, String zipFile) throws IOException {
Log.i(RTABMapActivity.TAG, "Zipping " + String.valueOf(files.length) +" files to " + zipFile);
BufferedInputStream origin = null;
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
try {
byte data[] = new byte[ZIP_BUFFER_SIZE];
for (int i = 0; i < files.length; i++) {
FileInputStream fi = new FileInputStream(files[i]);
origin = new BufferedInputStream(fi, ZIP_BUFFER_SIZE);
try {
ZipEntry entry = new ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1));
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, ZIP_BUFFER_SIZE)) != -1) {
out.write(data, 0, count);
}
}
finally {
origin.close();
}
}
}
finally {
out.close();
}
}
public static String[] loadFileList(String directory, final boolean databasesOnly) {
File path = new File(directory);
String fileList[];
try {
path.mkdirs();
}
catch(SecurityException e) {
Log.e(RTABMapActivity.TAG, "unable to write on the sd card " + e.toString());
}
if(path.exists()) {
FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
File sel = new File(dir, filename);
if(databasesOnly)
{
return filename.compareTo(RTABMapActivity.RTABMAP_TMP_DB) != 0 && filename.endsWith(".db");
}
else
{
return sel.isFile();
}
}
};
fileList = path.list(filter);
Arrays.sort(fileList);
}
else {
fileList = new String[0];
}
return fileList;
}
/**
* https://stackoverflow.com/questions/6701948/efficient-way-to-compare-version-strings-in-java
* Compares two version strings.
*
* Use this instead of String.compareTo() for a non-lexicographical
* comparison that works for version strings. e.g. "1.10".compareTo("1.6").
*
* @note It does not work if "1.10" is supposed to be equal to "1.10.0".
*
* @param str1 a string of ordinal numbers separated by decimal points.
* @param str2 a string of ordinal numbers separated by decimal points.
* @return The result is a negative integer if str1 is _numerically_ less than str2.
* The result is a positive integer if str1 is _numerically_ greater than str2.
* The result is zero if the strings are _numerically_ equal.
*/
public static int versionCompare(String str1, String str2) {
String[] vals1 = str1.split("\\.");
String[] vals2 = str2.split("\\.");
int i = 0;
// set index to first non-equal ordinal or length of shortest version string
while (i < vals1.length && i < vals2.length && vals1[i].equals(vals2[i])) {
i++;
}
// compare first non-equal ordinal number
if (i < vals1.length && i < vals2.length) {
int diff = Integer.valueOf(vals1[i]).compareTo(Integer.valueOf(vals2[i]));
return Integer.signum(diff);
}
// the strings are equal or one string is a substring of the other
// e.g. "1.2.3" = "1.2.3" or "1.2.3" < "1.2.3.4"
return Integer.signum(vals1.length - vals2.length);
}
}

View File

@@ -74,7 +74,11 @@ ELSE()
ENDIF()
TARGET_LINK_LIBRARIES(rtabmap rtabmap_core rtabmap_gui rtabmap_utilite ${LIBRARIES})
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)
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)")
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(plugin_dest_dir bin)
SET(qtconf_dest_dir bin)
@@ -137,11 +141,25 @@ IF((APPLE AND BUILD_AS_BUNDLE) OR WIN32)
# Install needed Qt plugins by copying directories from the qt installation
# One can cull what gets copied by using 'REGEX "..." EXCLUDE'
# Exclude debug libraries
INSTALL(DIRECTORY "${QT_PLUGINS_DIR}/imageformats"
IF(QT_PLUGINS_DIR)
INSTALL(DIRECTORY "${QT_PLUGINS_DIR}/imageformats"
DESTINATION ${plugin_dest_dir}/plugins
COMPONENT runtime
REGEX ".*d4.dll" EXCLUDE
REGEX ".*d4.a" EXCLUDE)
ELSE()
#Qt5
foreach(plugin ${Qt5Gui_PLUGINS})
get_target_property(plugin_loc ${plugin} LOCATION)
get_filename_component(plugin_dir ${plugin_loc} DIRECTORY)
string(REPLACE "plugins" ";" loc_list ${plugin_dir})
list(GET loc_list 1 plugin_type)
#MESSAGE(STATUS "Qt5 plugin \"${plugin_loc}\" installed in \"${plugin_dest_dir}/plugins${plugin_type}\"")
INSTALL(FILES ${plugin_loc}
DESTINATION ${plugin_dest_dir}/plugins${plugin_type}
COMPONENT runtime)
endforeach()
ENDIF()
# install a qt.conf file
# this inserts some cmake code into the install script to write the file
@@ -171,5 +189,5 @@ IF((APPLE AND BUILD_AS_BUNDLE) OR WIN32)
include(\"BundleUtilities\")
fixup_bundle(\"${APPS}\" \"\${QTPLUGINS}\" \"${DIRS}\")
" COMPONENT runtime)
ENDIF((APPLE AND BUILD_AS_BUNDLE) OR WIN32)
ENDIF(BUILD_AS_BUNDLE AND (APPLE OR WIN32))

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -46,17 +46,18 @@ public:
}
virtual ~ObjDeletionHandler() {}
signals:
Q_SIGNALS:
void objDeletionEventReceived(int);
protected:
virtual void handleEvent(UEvent * event)
virtual bool handleEvent(UEvent * event)
{
if(event->getClassName().compare("UObjDeletedEvent") == 0 &&
event->getCode() == _watchedId)
{
emit objDeletionEventReceived(_watchedId);
Q_EMIT objDeletionEventReceived(_watchedId);
}
return false;
}
private:
int _watchedId;

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -47,6 +47,9 @@ int main(int argc, char* argv[])
/* Create tasks */
QApplication * app = new QApplication(argc, argv);
app->setStyleSheet("QMessageBox { messagebox-text-interaction-flags: 5; }"); // selectable message box
ParametersMap parameters = Parameters::parseArguments(argc, argv, false);
MainWindow * mainWindow = new MainWindow();
app->installEventFilter(mainWindow); // to catch FileOpen events.
@@ -82,7 +85,11 @@ int main(int argc, char* argv[])
if(!database.empty())
{
QMetaObject::invokeMethod(mainWindow, "openDatabase", Qt::QueuedConnection, Q_ARG(QString, QString(database.c_str())));
mainWindow->openDatabase(database.c_str(), parameters);
}
else if(parameters.size())
{
mainWindow->updateParameters(parameters);
}
// Now wait for application to finish

View File

@@ -13,9 +13,9 @@ IF (DC1394_INCLUDE_DIRS AND DC1394_LIBRARIES)
SET(DC1394_FOUND TRUE)
#On Mac OS X
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(DC1394_LIBRARIES ${DC1394_LIBRARIES} "-framework CoreServices")
endif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
#if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
# set(DC1394_LIBRARIES ${DC1394_LIBRARIES} "-framework CoreServices")
#endif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
ENDIF (DC1394_INCLUDE_DIRS AND DC1394_LIBRARIES)

View File

@@ -19,13 +19,13 @@ set(Triclops_LIBDIR $ENV{Triclops_ROOT_DIR}/lib)
endif()
#FlyCapture2 SDK
find_path(FlyCapture2_INCLUDE_DIR NAMES FlyCapture2.h PATHS $ENV{FlyCapture2_ROOT_DIR}/include)
find_library(FlyCapture2_LIBRARY NAMES FlyCapture2_v100 FlyCapture2 flycapture2 NO_DEFAULT_PATH PATHS ${FlyCapture2_LIBDIR})
find_path(FlyCapture2_INCLUDE_DIR NAMES FlyCapture2.h PATHS $ENV{FlyCapture2_ROOT_DIR}/include $ENV{FlyCapture2_ROOT_DIR}/include/flycapture)
find_library(FlyCapture2_LIBRARY NAMES FlyCapture2_v100 FlyCapture2 flycapture2 flycapture NO_DEFAULT_PATH PATHS ${FlyCapture2_LIBDIR})
# Triclops SDK
find_path(Triclops_INCLUDE_DIR NAMES triclops.h PATHS $ENV{Triclops_ROOT_DIR}/include)
find_library(Triclops_LIBRARY NAMES triclops triclops_v100 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
find_library(FlyCaptureBridge_LIBRARY NAMES flycapture2bridge flycapture2bridge_v100 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
find_path(Triclops_INCLUDE_DIR NAMES triclops.h PATHS $ENV{Triclops_ROOT_DIR}/include $ENV{Triclops_ROOT_DIR}/include/triclops)
find_library(Triclops_LIBRARY NAMES triclops triclops_v100 libtriclops.so.3 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
find_library(FlyCaptureBridge_LIBRARY NAMES flycapture2bridge flycapture2bridge_v100 libflycapture2bridge.so.3 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
find_library(pnmutils_LIBRARY NAMES pnmutils pnmutils_v100 NO_DEFAULT_PATH PATHS ${Triclops_LIBDIR})
IF (FlyCapture2_INCLUDE_DIR AND Triclops_INCLUDE_DIR AND FlyCapture2_LIBRARY AND Triclops_LIBRARY AND FlyCaptureBridge_LIBRARY AND pnmutils_LIBRARY)

View File

@@ -17,9 +17,16 @@ FIND_LIBRARY(CHOLMOD_LIB cholmod)
FIND_PATH(G2O_INCLUDE_DIR g2o/core/base_vertex.h
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
# libraries; this is adapted from the OpenSceneGraph FIND_LIBRARY
# macro.
# libraries; this is adapted from the rtabmap config
MACRO(FIND_G2O_LIBRARY MYLIBRARY MYLIBRARYNAME)
@@ -31,11 +38,14 @@ MACRO(FIND_G2O_LIBRARY MYLIBRARY MYLIBRARYNAME)
NAMES "g2o_${MYLIBRARYNAME}"
PATHS "C:\\Program Files\\g2o\\lib")
IF(NOT ${MYLIBRARY}_DEBUG)
IF(MYLIBRARY)
SET(${MYLIBRARY}_DEBUG ${MYLIBRARY})
ENDIF(MYLIBRARY)
ENDIF( NOT ${MYLIBRARY}_DEBUG)
IF(${MYLIBRARY}_DEBUG AND ${MYLIBRARY})
SET(${MYLIBRARY}
debug ${${MYLIBRARY}_DEBUG}
optimized ${${MYLIBRARY}}
)
ELSEIF(${MYLIBRARY}_DEBUG)
SET(${MYLIBRARY} ${${MYLIBRARY}_DEBUG})
ENDIF()
ENDMACRO(FIND_G2O_LIBRARY LIBRARY LIBRARYNAME)
@@ -73,7 +83,7 @@ ENDIF(G2O_SOLVER_CHOLMOD OR G2O_SOLVER_CSPARSE OR G2O_SOLVER_DENSE OR G2O_SOLVER
# G2O itself declared found if we found the core libraries and at least one solver
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_LIBRARIES
${G2O_CORE_LIBRARY}
@@ -103,5 +113,15 @@ IF(G2O_STUFF_LIBRARY AND G2O_CORE_LIBRARY AND G2O_INCLUDE_DIR AND G2O_SOLVERS_FO
${CHOLMOD_LIB})
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")
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)

View File

@@ -0,0 +1,183 @@
#.rst:
# FindKinectSDK2
# --------------
#
# Find Kinect for Windows SDK v2 (Kinect SDK v2) include dirs, library dirs, libraries
#
# Use this module by invoking find_package with the form::
#
# find_package( KinectSDK2 [REQUIRED] )
#
# Results for users are reported in following variables::
#
# KinectSDK2_FOUND - Return "TRUE" when Kinect SDK v2 found. Otherwise, Return "FALSE".
# KinectSDK2_INCLUDE_DIRS - Kinect SDK v2 include directories. (${KinectSDK2_DIR}/inc)
# KinectSDK2_LIBRARY_DIRS - Kinect SDK v2 library directories. (${KinectSDK2_DIR}/Lib/x86 or ${KinectSDK2_DIR}/Lib/x64)
# KinectSDK2_LIBRARIES - Kinect SDK v2 library files. (${KinectSDK2_LIBRARY_DIRS}/Kinect20.lib (If check the box of any application festures, corresponding library will be added.))
# KinectSDK2_COMMANDS - Copy commands of redist files for application functions of Kinect SDK v2. (If uncheck the box of all application features, this variable has defined empty command.)
#
# This module reads hints about search locations from following environment variables::
#
# KINECTSDK20_DIR - Kinect SDK v2 root directory. (This environment variable has been set by installer of Kinect SDK v2.)
#
# CMake entries::
#
# KinectSDK2_DIR - Kinect SDK v2 root directory. (Default $ENV{KINECTSDK20_DIR})
# KinectSDK2_FACE - Check the box when using Face or HDFace features. (Default uncheck)
# KinectSDK2_FUSION - Check the box when using Fusion features. (Default uncheck)
# KinectSDK2_VGB - Check the box when using Visual Gesture Builder features. (Default uncheck)
#
# Example to find Kinect SDK v2::
#
# cmake_minimum_required( VERSION 2.8 )
#
# project( project )
# add_executable( project main.cpp )
# set_property( DIRECTORY PROPERTY VS_STARTUP_PROJECT "project" )
#
# # Find package using this module.
# find_package( KinectSDK2 REQUIRED )
#
# if(KinectSDK2_FOUND)
# # [C/C++]>[General]>[Additional Include Directories]
# include_directories( ${KinectSDK2_INCLUDE_DIRS} )
#
# # [Linker]>[General]>[Additional Library Directories]
# link_directories( ${KinectSDK2_LIBRARY_DIRS} )
#
# # [Linker]>[Input]>[Additional Dependencies]
# target_link_libraries( project ${KinectSDK2_LIBRARIES} )
#
# # [Build Events]>[Post-Build Event]>[Command Line]
# add_custom_command( TARGET project POST_BUILD ${KinectSDK2_COMMANDS} )
# endif()
#
# =============================================================================
#
# Copyright (c) 2016 Tsukasa SUGIURA
# Distributed under the MIT License.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# =============================================================================
##### Utility #####
# Check Directory Macro
macro(CHECK_DIR _DIR)
if(NOT EXISTS "${${_DIR}}")
message(WARNING "Directory \"${${_DIR}}\" not found.")
set(KinectSDK2_FOUND FALSE)
unset(_DIR)
endif()
endmacro()
# Check Files Macro
macro(CHECK_FILES _FILES _DIR)
set(_MISSING_FILES)
foreach(_FILE ${${_FILES}})
if(NOT EXISTS "${_FILE}")
get_filename_component(_FILE ${_FILE} NAME)
set(_MISSING_FILES "${_MISSING_FILES}${_FILE}, ")
endif()
endforeach()
if(_MISSING_FILES)
message(WARNING "In directory \"${${_DIR}}\" not found files: ${_MISSING_FILES}")
set(KinectSDK2_FOUND FALSE)
unset(_FILES)
endif()
endmacro()
# Target Platform
set(TARGET_PLATFORM)
if(NOT CMAKE_CL_64)
set(TARGET_PLATFORM x86)
else()
set(TARGET_PLATFORM x64)
endif()
##### Find Kinect SDK v2 #####
# Found
set(KinectSDK2_FOUND TRUE)
if(MSVC_VERSION LESS 1700)
message(WARNING "Kinect for Windows SDK v2 supported Visual Studio 2012 or later.")
set(KinectSDK2_FOUND FALSE)
endif()
# Options
option(KinectSDK2_FACE "Face and HDFace features" FALSE)
option(KinectSDK2_FUSION "Fusion features" FALSE)
option(KinectSDK2_VGB "Visual Gesture Builder features" FALSE)
# Root Directoty
set(KinectSDK2_DIR)
if(KinectSDK2_FOUND)
set(KinectSDK2_DIR $ENV{KINECTSDK20_DIR} CACHE PATH "Kinect for Windows SDK v2 Install Path." FORCE)
check_dir(KinectSDK2_DIR)
endif()
# Include Directories
set(KinectSDK2_INCLUDE_DIRS)
if(KinectSDK2_FOUND)
set(KinectSDK2_INCLUDE_DIRS ${KinectSDK2_DIR}/inc)
check_dir(KinectSDK2_INCLUDE_DIRS)
endif()
# Library Directories
set(KinectSDK2_LIBRARY_DIRS)
if(KinectSDK2_FOUND)
set(KinectSDK2_LIBRARY_DIRS ${KinectSDK2_DIR}/Lib/${TARGET_PLATFORM})
check_dir(KinectSDK2_LIBRARY_DIRS)
endif()
# Dependencies
set(KinectSDK2_LIBRARIES)
if(KinectSDK2_FOUND)
set(KinectSDK2_LIBRARIES ${KinectSDK2_LIBRARY_DIRS}/Kinect20.lib)
if(KinectSDK2_FACE)
set(KinectSDK2_LIBRARIES ${KinectSDK2_LIBRARIES};${KinectSDK2_LIBRARY_DIRS}/Kinect20.Face.lib)
endif()
if(KinectSDK2_FUSION)
set(KinectSDK2_LIBRARIES ${KinectSDK2_LIBRARIES};${KinectSDK2_LIBRARY_DIRS}/Kinect20.Fusion.lib)
endif()
if(KinectSDK2_VGB)
set(KinectSDK2_LIBRARIES ${KinectSDK2_LIBRARIES};${KinectSDK2_LIBRARY_DIRS}/Kinect20.VisualGestureBuilder.lib)
endif()
check_files(KinectSDK2_LIBRARIES KinectSDK2_LIBRARY_DIRS)
endif()
# Custom Commands
set(KinectSDK2_COMMANDS)
if(KinectSDK2_FOUND)
if(KinectSDK2_FACE)
set(KinectSDK2_REDIST_DIR ${KinectSDK2_DIR}/Redist/Face/${TARGET_PLATFORM})
check_dir(KinectSDK2_REDIST_DIR)
list(APPEND KinectSDK2_COMMANDS COMMAND xcopy "${KinectSDK2_REDIST_DIR}" "$(OutDir)" /e /y /i /r > NUL)
endif()
if(KinectSDK2_FUSION)
set(KinectSDK2_REDIST_DIR ${KinectSDK2_DIR}/Redist/Fusion/${TARGET_PLATFORM})
check_dir(KinectSDK2_REDIST_DIR)
list(APPEND KinectSDK2_COMMANDS COMMAND xcopy "${KinectSDK2_REDIST_DIR}" "$(OutDir)" /e /y /i /r > NUL)
endif()
if(KinectSDK2_VGB)
set(KinectSDK2_REDIST_DIR ${KinectSDK2_DIR}/Redist/VGB/${TARGET_PLATFORM})
check_dir(KinectSDK2_REDIST_DIR)
list(APPEND KinectSDK2_COMMANDS COMMAND xcopy "${KinectSDK2_REDIST_DIR}" "$(OutDir)" /e /y /i /r > NUL)
endif()
# Empty Commands
if(NOT KinectSDK2_COMMANDS)
set(KinectSDK2_COMMANDS COMMAND)
endif()
endif()
message(STATUS "KinectSDK2_FOUND : ${KinectSDK2_FOUND}")

View File

@@ -0,0 +1,33 @@
# - Find ORB_SLAM2
#
# It sets the following variables:
# ORB_SLAM2_FOUND - Set to false, or undefined, if ORB_SLAM2 isn't found.
# ORB_SLAM2_INCLUDE_DIRS - The ORB_SLAM2 include directory.
# ORB_SLAM2_LIBRARIES - The ORB_SLAM2 library to link against.
#
# Set ORB_SLAM2_ROOT_DIR environment variable as the path to ORB_SLAM2 root folder.
find_path(ORB_SLAM2_INCLUDE_DIR NAMES System.h PATHS $ENV{ORB_SLAM2_ROOT_DIR}/include)
find_library(ORB_SLAM2_LIBRARY NAMES ORB_SLAM2 PATHS $ENV{ORB_SLAM2_ROOT_DIR}/lib)
find_path(g2o_INCLUDE_DIR NAMES g2o/core/sparse_optimizer.h PATHS $ENV{ORB_SLAM2_ROOT_DIR}/Thirdparty/g2o NO_DEFAULT_PATH)
find_library(g2o_LIBRARY NAMES g2o PATHS $ENV{ORB_SLAM2_ROOT_DIR}/Thirdparty/g2o/lib NO_DEFAULT_PATH)
find_library(DBoW2_LIBRARY NAMES DBoW2 PATHS $ENV{ORB_SLAM2_ROOT_DIR}/Thirdparty/DBoW2/lib NO_DEFAULT_PATH)
IF (ORB_SLAM2_INCLUDE_DIR AND ORB_SLAM2_LIBRARY AND DBoW2_LIBRARY AND g2o_INCLUDE_DIR AND g2o_LIBRARY)
SET(ORB_SLAM2_FOUND TRUE)
SET(ORB_SLAM2_INCLUDE_DIRS ${ORB_SLAM2_INCLUDE_DIR} ${g2o_INCLUDE_DIR} $ENV{ORB_SLAM2_ROOT_DIR})
SET(ORB_SLAM2_LIBRARIES ${g2o_LIBRARY} ${ORB_SLAM2_LIBRARY} ${DBoW2_LIBRARY})
ENDIF (ORB_SLAM2_INCLUDE_DIR AND ORB_SLAM2_LIBRARY AND DBoW2_LIBRARY AND g2o_INCLUDE_DIR AND g2o_LIBRARY)
IF (ORB_SLAM2_FOUND)
# show which ORB_SLAM2 was found only if not quiet
IF (NOT ORB_SLAM2_FIND_QUIETLY)
MESSAGE(STATUS "Found ORB_SLAM2: ${ORB_SLAM2_LIBRARIES}")
ENDIF (NOT ORB_SLAM2_FIND_QUIETLY)
ELSE (ORB_SLAM2_FOUND)
# fatal error if ORB_SLAM2 is required but not found
IF (ORB_SLAM2_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find ORB_SLAM2")
ENDIF (ORB_SLAM2_FIND_REQUIRED)
ENDIF (ORB_SLAM2_FOUND)

View File

@@ -0,0 +1,78 @@
# - Find librealsense (https://github.com/IntelRealSense/librealsense)
#
# RealSense_ROOT_DIR environment variable can be set to find the library.
#
# It sets the following variables:
# RealSense_FOUND - Set to false, or undefined, if RealSense isn't found.
# RealSenseSlam_FOUND - Set to false, or undefined, if RealSense slam module isn't found.
# RealSense_INCLUDE_DIRS - The RealSense include directory.
# RealSense_LIBRARIES - The RealSense library to link against.
# Use find_package( RealSense COMPONENTS slam ) to search for realsense slam library
if( RealSense_FIND_COMPONENTS )
foreach( component ${RealSense_FIND_COMPONENTS} )
string( TOUPPER ${component} _COMPONENT )
set( REALSENSE_USE_${_COMPONENT} 1 )
endforeach()
endif()
#RealSense library
find_path(RealSense_INCLUDE_DIRS NAMES librealsense/rs.hpp PATHS $ENV{RealSense_ROOT_DIR}/include)
if(CMAKE_CL_64)
find_library(RealSense_LIBRARY NAMES realsense PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/x64)
else()
find_library(RealSense_LIBRARY NAMES realsense PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/Win32)
endif()
IF (RealSense_INCLUDE_DIRS AND RealSense_LIBRARY)
SET(RealSense_FOUND TRUE)
ENDIF (RealSense_INCLUDE_DIRS AND RealSense_LIBRARY)
#SLAM
if(REALSENSE_USE_SLAM)
find_path(RealSenseSlam_INCLUDE_DIRS NAMES librealsense/slam/slam.h PATHS $ENV{RealSense_ROOT_DIR}/include)
if(CMAKE_CL_64)
find_library(RealSenseSlam_LIBRARY NAMES realsense_slam PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/x64)
find_library(RealSenseImage_LIBRARY NAMES realsense_image PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/x64)
find_library(RealSenseSP_Core_LIBRARY NAMES SP_Core PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/x64)
find_library(RealSenseTracker_LIBRARY NAMES tracker PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/x64)
else()
find_library(RealSenseSlam_LIBRARY NAMES realsense_slam PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/Win32)
find_library(RealSenseImage_LIBRARY NAMES realsense_image PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/Win32)
find_library(RealSenseSP_Core_LIBRARY NAMES SP_Core PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/Win32)
find_library(RealSenseTracker_LIBRARY NAMES tracker PATHS $ENV{RealSense_ROOT_DIR}/lib $ENV{RealSense_ROOT_DIR}/bin $ENV{RealSense_ROOT_DIR}/bin/Win32)
endif()
else()
set(RealSenseSlam_INCLUDE_DIRS "")
endif()
IF (RealSense_FOUND)
IF (RealSenseSlam_INCLUDE_DIRS AND RealSenseSlam_LIBRARY AND RealSenseImage_LIBRARY AND RealSenseSP_Core_LIBRARY AND RealSenseTracker_LIBRARY)
SET(RealSenseSlam_FOUND TRUE)
ENDIF (RealSenseSlam_INCLUDE_DIRS AND RealSenseSlam_LIBRARY AND RealSenseImage_LIBRARY AND RealSenseSP_Core_LIBRARY AND RealSenseTracker_LIBRARY)
SET(RealSense_LIBRARIES ${RealSense_LIBRARY})
IF (RealSenseSlam_FOUND)
IF (RealSenseSlam_INCLUDE_DIRS AND RealSenseSlam_LIBRARY AND RealSenseImage_LIBRARY AND RealSenseSP_Core_LIBRARY AND RealSenseTracker_LIBRARY)
SET(RealSenseSlam_FOUND TRUE)
ENDIF (RealSenseSlam_INCLUDE_DIRS AND RealSenseSlam_LIBRARY AND RealSenseImage_LIBRARY AND RealSenseSP_Core_LIBRARY AND RealSenseTracker_LIBRARY)
SET(RealSense_LIBRARIES
${RealSense_LIBRARIES}
${RealSenseSlam_LIBRARY}
${RealSenseImage_LIBRARY}
${RealSenseSP_Core_LIBRARY}
${RealSenseTracker_LIBRARY})
ENDIF(RealSenseSlam_FOUND)
# show which RealSense was found only if not quiet
IF (NOT RealSense_FIND_QUIETLY)
MESSAGE(STATUS "Found RealSense: ${RealSense_LIBRARIES}")
ENDIF (NOT RealSense_FIND_QUIETLY)
ELSE (RealSense_FOUND)
# fatal error if RealSense is required but not found
IF (RealSense_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find RealSense (librealsense)")
ENDIF (RealSense_FIND_REQUIRED)
ENDIF (RealSense_FOUND)

View File

@@ -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)

View File

@@ -2,46 +2,29 @@
# This module finds an installed Sqlite3 package.
#
# It sets the following variables:
# SQLITE3_FOUND - Set to false, or undefined, if Sqlite3 isn't found.
# SQLITE3_INCLUDE_DIR - The Sqlite3 include directory.
# SQLITE3_LIBRARY - The Sqlite3 library to link against.
# Sqlite3_FOUND - Set to false, or undefined, if Sqlite3 isn't found.
# Sqlite3_INCLUDE_DIR - The Sqlite3 include directory.
# 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_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_LIBRARY(Sqlite3_LIBRARY NAMES sqlite3 PATHS $ENV{Sqlite3_ROOT_DIR}/lib $ENV{Sqlite3_ROOT_DIR})
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_INCLUDE_DIR AND SQLITE3_LIBRARY)
SET(SQLITE3_FOUND TRUE)
ENDIF (SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARY)
IF (SQLITE3_FOUND)
IF (Sqlite3_FOUND)
# show which Sqlite3 was found only if not quiet
IF (NOT Sqlite3_FIND_QUIETLY)
MESSAGE(STATUS "Found Sqlite3")
MESSAGE(STATUS "Found Sqlite3: ${Sqlite3_INCLUDE_DIRS} ${Sqlite3_LIBRARIES}")
ENDIF (NOT Sqlite3_FIND_QUIETLY)
ELSE (SQLITE3_FOUND)
ELSE (Sqlite3_FOUND)
# fatal error if Sqlite3 is required but not found
IF (Sqlite3_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find Sqlite3")
ENDIF (Sqlite3_FIND_REQUIRED)
ENDIF (SQLITE3_FOUND)
ENDIF (Sqlite3_FOUND)

View File

@@ -8,13 +8,14 @@
FIND_PATH(Tango_INCLUDE_DIR tango_client_api.h)
FIND_LIBRARY(Tango_LIBRARY NAMES tango_client_api)
FIND_LIBRARY(Tango_LIBRARY NAMES tango_client_api PATH_SUFFIXES ${ANDROID_ABI})
FIND_LIBRARY(Tango_support_LIBRARY NAMES tango_support_api PATH_SUFFIXES ${ANDROID_ABI})
IF (Tango_INCLUDE_DIR AND Tango_LIBRARY)
IF (Tango_INCLUDE_DIR AND Tango_LIBRARY AND Tango_support_LIBRARY)
SET(Tango_FOUND TRUE)
SET(Tango_INCLUDE_DIRS ${Tango_INCLUDE_DIR})
SET(Tango_LIBRARIES ${Tango_LIBRARY})
ENDIF (Tango_INCLUDE_DIR AND Tango_LIBRARY)
SET(Tango_LIBRARIES ${Tango_LIBRARY} ${Tango_support_LIBRARY})
ENDIF (Tango_INCLUDE_DIR AND Tango_LIBRARY AND Tango_support_LIBRARY)
IF (Tango_FOUND)
# show which Tango was found only if not quiet
@@ -24,7 +25,7 @@ IF (Tango_FOUND)
ELSE (Tango_FOUND)
# fatal error if Tango is required but not found
IF (Tango_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find Tango")
MESSAGE(FATAL_ERROR "Could not find Tango (client and/or support libraries)")
ENDIF (Tango_FIND_REQUIRED)
ENDIF (Tango_FOUND)

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -59,18 +59,14 @@ public:
const std::vector<double> & getPredictionLC() const; // {Vp, Lc, l1, l2, l3, l4...}
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:
cv::Mat updatePrediction(const cv::Mat & oldPrediction,
const Memory * memory,
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);
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;
private:
@@ -80,6 +76,7 @@ private:
std::vector<double> _predictionLC; // {Vp, Lc, l1, l2, l3, l4...}
bool _fullPredictionUpdate;
float _totalPredictionLCValues;
std::map<int, std::map<int, int> > _neighborsIndex;
};
} // namespace rtabmap

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -56,6 +56,7 @@ public:
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "") = 0;
virtual bool isCalibrated() const = 0;
virtual std::string getSerial() const = 0;
virtual bool odomProvided() const { return false; }
//getters
float getImageRate() const {return _imageRate;}
@@ -65,6 +66,7 @@ public:
void setImageRate(float imageRate) {_imageRate = imageRate;}
void setLocalTransform(const Transform & localTransform) {_localTransform= localTransform;}
void resetTimer();
protected:
/**
* Constructor
@@ -76,7 +78,7 @@ protected:
/**
* returned rgb and depth images should be already rectified if calibration was loaded
*/
virtual SensorData captureImage() = 0;
virtual SensorData captureImage(CameraInfo * info = 0) = 0;
int getNextSeqID() {return ++_seq;}

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -39,22 +39,35 @@ public:
CameraInfo() :
cameraName(""),
id(0),
stamp(0.0),
timeCapture(0.0f),
timeDisparity(0.0f),
timeMirroring(0.0f),
timeImageDecimation(0.0f),
timeScanFromDepth(0.0f)
timeScanFromDepth(0.0f),
timeUndistortDepth(0.0f),
timeBilateralFiltering(0.0f),
timeTotal(0.0f),
odomCovariance(cv::Mat::eye(6,6,CV_64FC1))
{
}
virtual ~CameraInfo() {}
std::string cameraName;
int id;
double stamp;
float timeCapture;
float timeDisparity;
float timeMirroring;
float timeStereoExposureCompensation;
float timeImageDecimation;
float timeScanFromDepth;
float timeUndistortDepth;
float timeBilateralFiltering;
float timeTotal;
Transform odomPose;
cv::Mat odomCovariance;
std::vector<float> odomVelocity;
};
} // namespace rtabmap

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -75,8 +75,10 @@ public:
virtual ~CameraModel() {}
void initRectificationMap();
bool isRectificationMapInitialized() {return !mapX_.empty() && !mapY_.empty();}
bool isValidForProjection() const {return fx()>0.0 && fy()>0.0;}
bool isValidForProjection() const {return fx()>0.0 && fy()>0.0 && cx()>0.0 && cy()>0.0;}
bool isValidForReprojection() const {return fx()>0.0 && fy()>0.0 && cx()>0.0 && cy()>0.0 && imageWidth()>0 && imageHeight()>0;}
bool isValidForRectification() const
{
return imageSize_.width>0 &&
@@ -106,7 +108,7 @@ public:
void setLocalTransform(const Transform & transform) {localTransform_ = transform;}
const Transform & localTransform() const {return localTransform_;}
void setImageSize(const cv::Size & size) {imageSize_ = size;}
void setImageSize(const cv::Size & size);
const cv::Size & imageSize() const {return imageSize_;}
int imageWidth() const {return imageSize_.width;}
int imageHeight() const {return imageSize_.height;}
@@ -115,6 +117,7 @@ public:
bool save(const std::string & directory) const;
CameraModel scaled(double scale) const;
CameraModel roi(const cv::Rect & roi) const;
double horizontalFOV() const; // in degrees
double verticalFOV() const; // in degrees
@@ -123,6 +126,13 @@ public:
cv::Mat rectifyImage(const cv::Mat & raw, int interpolation = cv::INTER_LINEAR) const;
cv::Mat rectifyDepth(const cv::Mat & raw) const;
// Project 2D pixel to 3D (in /camera_link frame)
void project(float u, float v, float depth, float & x, float & y, float & z) const;
// Reproject 3D point (in /camera_link frame) to pixel
void reproject(float x, float y, float z, float & u, float & v) const;
void reproject(float x, float y, float z, int & u, int & v) const;
bool inFrame(int u, int v) const;
private:
std::string name_;
cv::Size imageSize_;

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -59,6 +59,7 @@ public:
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
virtual bool 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;
@@ -67,7 +68,7 @@ public:
const CameraModel & cameraModel() const {return _model;}
void setPath(const std::string & dir) {_path=dir;}
void setStartIndex(int index) {_startAt = index;} // negative means last
virtual void setStartIndex(int index) {_startAt = index;} // negative means last
void setDirRefreshed(bool enabled) {_refreshDir = enabled;}
void setImagesRectified(bool enabled) {_rectifyImages = enabled;}
void setBayerMode(int mode) {_bayerMode = mode;} // -1=disabled (default) 0=BayerBG, 1=BayerGB, 2=BayerRG, 3=BayerGR
@@ -75,8 +76,8 @@ public:
void setTimestamps(bool fileNamesAreStamps, const std::string & filePath = "", bool syncImageRateWithStamps=true)
{
_filenamesAreTimestamps = fileNamesAreStamps;
timestampsPath_=filePath;
syncImageRateWithStamps_ = syncImageRateWithStamps;
_timestampsPath=filePath;
_syncImageRateWithStamps = syncImageRateWithStamps;
}
void setScanPath(
@@ -84,19 +85,19 @@ public:
int maxScanPts = 0,
int downsampleStep = 1,
float voxelSize = 0.0f,
int normalsK = 0, // compute normals if > 0
const Transform & localTransform=Transform::getIdentity())
int normalsK = 0, // compute normals if > 0
float normalsRadius = 0, // compute normals if > 0
const Transform & localTransform=Transform::getIdentity(),
bool forceGroundNormalsUp = false)
{
_scanPath = dir;
_scanLocalTransform = localTransform;
_scanMaxPts = maxScanPts;
_scanDownsampleStep = downsampleStep;
_scanNormalsK = normalsK;
_scanNormalsRadius = normalsRadius;
_scanVoxelSize = voxelSize;
if(_scanDownsampleStep>1)
{
_scanMaxPts /= _scanDownsampleStep;
}
_scanForceGroundNormalsUp = forceGroundNormalsUp;
}
void setDepthFromScan(bool enabled, int fillHoles = 1, bool fillHolesFromBorder = false)
@@ -106,12 +107,23 @@ public:
_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;
_groundTruthPath = filePath;
_groundTruthFormat = format;
}
void setMaxPoseTimeDiff(double diff) {_maxPoseTimeDiff = diff;}
double getMaxPoseTimeDiff() const {return _maxPoseTimeDiff;}
void setDepth(bool isDepth, float depthScaleFactor = 1.0f)
{
_isDepth = isDepth;
@@ -119,7 +131,13 @@ public:
}
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
bool readPoses(
std::list<Transform> & outputPoses,
std::list<double> & stamps,
const std::string & filePath,
int format,
double maxTimeDiff) const;
private:
std::string _path;
@@ -144,19 +162,25 @@ private:
int _scanDownsampleStep;
float _scanVoxelSize;
int _scanNormalsK;
float _scanNormalsRadius;
bool _scanForceGroundNormalsUp;
bool _depthFromScan;
int _depthFromScanFillHoles; // <0:horizontal 0:disabled >0:vertical
bool _depthFromScanFillHolesFromBorder;
bool _filenamesAreTimestamps;
std::string timestampsPath_;
bool syncImageRateWithStamps_;
std::string _timestampsPath;
bool _syncImageRateWithStamps;
std::string groundTruthPath_;
std::string _odometryPath;
int _odometryFormat;
std::string _groundTruthPath;
int _groundTruthFormat;
double _maxPoseTimeDiff;
std::list<double> stamps_;
std::list<double> _stamps;
std::list<Transform> odometry_;
std::list<Transform> groundTruth_;
CameraModel _model;
@@ -178,6 +202,7 @@ public:
public:
CameraVideo(int usbDevice = 0,
bool rectifyImages = false,
float imageRate = 0,
const Transform & localTransform = Transform::getIdentity());
CameraVideo(const std::string & filePath,
@@ -193,7 +218,7 @@ public:
const std::string & getFilePath() const {return _filePath;}
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
// File type

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -34,13 +34,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "rtabmap/core/CameraModel.h"
#include "rtabmap/core/Camera.h"
#include "rtabmap/core/CameraRGB.h"
#include "rtabmap/core/Version.h"
#include <pcl/pcl_config.h>
#ifdef HAVE_OPENNI
#if __linux__ && __i386__ && __cplusplus >= 201103L
#warning "Openni driver is not available on i386 when building with c++11 support"
#else
#define RTABMAP_OPENNI
#include <pcl/io/openni_camera/openni_depth_image.h>
#include <pcl/io/openni_camera/openni_image.h>
#endif
#endif
#include <boost/signals2/connection.hpp>
@@ -64,9 +70,34 @@ class Registration;
class PacketPipeline;
}
namespace rs
{
class context;
class device;
namespace slam {
class slam;
}
}
namespace rs2
{
class context;
class device;
class syncer;
}
struct rs2_intrinsics;
struct rs2_extrinsics;
typedef struct _freenect_context freenect_context;
typedef struct _freenect_device freenect_device;
typedef struct IKinectSensor IKinectSensor;
typedef struct ICoordinateMapper ICoordinateMapper;
typedef struct _DepthSpacePoint DepthSpacePoint;
typedef struct _ColorSpacePoint ColorSpacePoint;
typedef struct tagRGBQUAD RGBQUAD;
typedef struct IMultiSourceFrameReader IMultiSourceFrameReader;
namespace rtabmap
{
@@ -85,7 +116,7 @@ public:
float imageRate = 0,
const Transform & localTransform = Transform::getIdentity());
virtual ~CameraOpenni();
#ifdef HAVE_OPENNI
#ifdef RTABMAP_OPENNI
void image_cb (
const boost::shared_ptr<openni_wrapper::Image>& rgb,
const boost::shared_ptr<openni_wrapper::DepthImage>& depth,
@@ -97,7 +128,7 @@ public:
virtual std::string getSerial() const;
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
pcl::Grabber* interface_;
@@ -131,7 +162,7 @@ public:
virtual std::string getSerial() const {return "";} // unknown with OpenCV
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
bool _asus;
@@ -149,9 +180,11 @@ class RTABMAP_EXP CameraOpenNI2 :
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();
@@ -165,12 +198,15 @@ public:
bool setExposure(int value);
bool setGain(int value);
bool setMirroring(bool enabled);
void setOpenNI2StampsAndIDsUsed(bool used) {_openNI2StampsAndIDsUsed = used;}
void setOpenNI2StampsAndIDsUsed(bool used);
void setIRDepthShift(int horizontal, int vertical);
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
#ifdef RTABMAP_OPENNI2
Type _type;
openni::Device * _device;
openni::VideoStream * _color;
openni::VideoStream * _depth;
@@ -178,6 +214,10 @@ private:
float _depthFy;
std::string _deviceId;
bool _openNI2StampsAndIDsUsed;
StereoCameraModel _stereoModel;
int _depthHShift;
int _depthVShift;
#endif
};
@@ -191,10 +231,12 @@ class RTABMAP_EXP CameraFreenect :
{
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();
@@ -204,12 +246,16 @@ public:
virtual std::string getSerial() const;
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
#ifdef RTABMAP_FREENECT
int deviceId_;
Type type_;
freenect_context * ctx_;
FreenectDevice * freenectDevice_;
StereoCameraModel stereoModel_;
#endif
};
/////////////////////////
@@ -234,14 +280,15 @@ public:
public:
// default local transform z in, x right, y down));
CameraFreenect2(int deviceId= 0,
Type type = kTypeColor2DepthSD,
Type type = kTypeDepth2ColorSD,
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);
bool noiseFiltering = true,
const std::string & pipelineName = "");
virtual ~CameraFreenect2();
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
@@ -249,9 +296,10 @@ public:
virtual std::string getSerial() const;
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
#ifdef RTABMAP_FREENECT2
int deviceId_;
Type type_;
StereoCameraModel stereoModel_;
@@ -264,6 +312,165 @@ private:
bool bilateralFiltering_;
bool edgeAwareFiltering_;
bool noiseFiltering_;
std::string pipelineName_;
#endif
};
/////////////////////////
// CameraK4W2
/////////////////////////
class RTABMAP_EXP CameraK4W2 :
public Camera
{
public:
static bool available();
enum Type {
kTypeColor2DepthSD,
kTypeDepth2ColorSD,
kTypeDepth2ColorHD
};
public:
static const int cDepthWidth = 512;
static const int cDepthHeight = 424;
static const int cColorWidth = 1920;
static const int cColorHeight = 1080;
public:
// default local transform z in, x right, y down));
CameraK4W2(int deviceId = 0, // not used
Type type = kTypeDepth2ColorSD,
float imageRate = 0.0f,
const Transform & localTransform = Transform::getIdentity());
virtual ~CameraK4W2();
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
virtual bool isCalibrated() const;
virtual std::string getSerial() const;
protected:
virtual SensorData captureImage(CameraInfo * info = 0);
private:
void close();
private:
#ifdef RTABMAP_K4W2
Type type_;
IKinectSensor* pKinectSensor_;
ICoordinateMapper* pCoordinateMapper_;
DepthSpacePoint* pDepthCoordinates_;
ColorSpacePoint* pColorCoordinates_;
IMultiSourceFrameReader* pMultiSourceFrameReader_;
RGBQUAD * pColorRGBX_;
INT_PTR hMSEvent;
CameraModel colorCameraModel_;
#endif
};
/////////////////////////
// CameraRealSense
/////////////////////////
class slam_event_handler;
class RTABMAP_EXP CameraRealSense :
public Camera
{
public:
static bool available();
enum RGBSource {kColor, kInfrared, kFishEye};
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();
void setDepthScaledToRGBSize(bool enabled);
void setRGBSource(RGBSource source);
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_;
bool depthScaledToRGBSize_;
RGBSource rgbSource_;
CameraModel cameraModel_;
std::vector<int> rsRectificationTable_;
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
};
/////////////////////////
// CameraRealSense2
/////////////////////////
class slam_event_handler;
class RTABMAP_EXP CameraRealSense2 :
public Camera
{
public:
static bool available();
public:
// default local transform z in, x right, y down));
CameraRealSense2(
const std::string & deviceId = "",
float imageRate = 0,
const Transform & localTransform = Transform::getIdentity());
virtual ~CameraRealSense2();
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
virtual bool isCalibrated() const;
virtual std::string getSerial() const;
// parameters are set during initialization
void setEmitterEnabled(bool enabled);
void setIRDepthFormat(bool enabled);
protected:
virtual SensorData captureImage(CameraInfo * info = 0);
private:
#ifdef RTABMAP_REALSENSE2
rs2::context * ctx_;
rs2::device * dev_;
std::string deviceId_;
rs2::syncer * syncer_;
float depth_scale_meters_;
rs2_intrinsics * depthIntrinsics_;
rs2_intrinsics * rgbIntrinsics_;
rs2_extrinsics * depthToRGBExtrinsics_;
cv::Mat depthBuffer_;
cv::Mat rgbBuffer_;
CameraModel model_;
bool emitterEnabled_;
bool irDepth_;
#endif
};
@@ -290,8 +497,10 @@ public:
virtual bool isCalibrated() const;
virtual std::string getSerial() const;
virtual void setStartIndex(int index) {CameraImages::setStartIndex(index);cameraDepth_.setStartIndex(index);} // negative means last
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
CameraImages cameraDepth_;

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "rtabmap/core/CameraModel.h"
#include "rtabmap/core/Camera.h"
#include "rtabmap/core/CameraRGB.h"
#include "rtabmap/core/Version.h"
#include <list>
namespace FlyCapture2
@@ -39,6 +40,11 @@ namespace FlyCapture2
class Camera;
}
namespace sl
{
class Camera;
}
namespace rtabmap
{
@@ -62,11 +68,13 @@ public:
virtual std::string getSerial() const;
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
#ifdef RTABMAP_DC1394
DC1394Device *device_;
StereoCameraModel stereoModel_;
#endif
};
/////////////////////////
@@ -87,11 +95,69 @@ public:
virtual std::string getSerial() const;
protected:
virtual SensorData captureImage();
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 = true);
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 = true);
virtual ~CameraStereoZed();
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
virtual bool isCalibrated() const;
virtual std::string getSerial() const;
virtual bool odomProvided() const;
protected:
virtual SensorData captureImage(CameraInfo * info = 0);
private:
#ifdef RTABMAP_ZED
sl::Camera * zed_;
StereoCameraModel stereoModel_;
CameraVideo::Source src_;
int usbDevice_;
std::string svoFilePath_;
int resolution_;
int quality_;
bool selfCalibration_;
int sensingMode_;
int confidenceThr_;
bool computeOdometry_;
bool lost_;
#endif
};
/////////////////////////
@@ -122,8 +188,10 @@ public:
virtual bool isCalibrated() const;
virtual std::string getSerial() const;
virtual void setStartIndex(int index) {CameraImages::setStartIndex(index);camera2_->setStartIndex(index);} // negative means last
protected:
virtual SensorData captureImage();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
CameraImages * camera2_;
@@ -143,10 +211,27 @@ public:
public:
CameraStereoVideo(
const std::string & path,
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());
CameraStereoVideo(
int deviceLeft,
int deviceRight,
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 = "");
@@ -154,14 +239,19 @@ public:
virtual std::string getSerial() const;
protected:
virtual SensorData captureImage();
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_;
int usbDevice2_;
};
} // namespace rtabmap

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -33,10 +33,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <rtabmap/utilite/UThread.h>
#include <rtabmap/utilite/UEventsSender.h>
namespace clams
{
class DiscreteDepthDistortionModel;
}
namespace rtabmap
{
class Camera;
class CameraInfo;
class SensorData;
class StereoDense;
/**
@@ -53,38 +60,48 @@ public:
virtual ~CameraThread();
void setMirroringEnabled(bool enabled) {_mirroring = enabled;}
void setStereoExposureCompensation(bool enabled) {_stereoExposureCompensation = enabled;}
void setColorOnly(bool colorOnly) {_colorOnly = colorOnly;}
void setImageDecimation(int decimation) {_imageDecimation = decimation;}
void setStereoToDepth(bool enabled) {_stereoToDepth = enabled;}
void setImageRate(float imageRate);
void setDistortionModel(const std::string & path);
void enableBilateralFiltering(float sigmaS, float sigmaR);
void disableBilateralFiltering() {_bilateralFiltering = false;}
void setScanFromDepth(
bool enabled,
int decimation=4,
float maxDepth=4.0f,
float voxelSize = 0.0f,
int normalsK = 0)
int normalsK = 0,
int normalsRadius = 0.0f)
{
_scanFromDepth = enabled;
_scanDecimation=decimation;
_scanMaxDepth = maxDepth;
_scanVoxelSize = voxelSize;
_scanNormalsK = normalsK;
_scanNormalsRadius = normalsRadius;
}
void postUpdate(SensorData * data, CameraInfo * info = 0) const;
//getters
bool isPaused() const {return !this->isRunning();}
bool isCapturing() const {return this->isRunning();}
void setImageRate(float imageRate);
Camera * camera() {return _camera;} // return null if not set, valid until CameraThread is deleted
private:
virtual void mainLoopBegin();
virtual void mainLoop();
virtual void mainLoopKill();
private:
Camera * _camera;
bool _mirroring;
bool _stereoExposureCompensation;
bool _colorOnly;
int _imageDecimation;
bool _stereoToDepth;
@@ -94,7 +111,12 @@ private:
float _scanMinDepth;
float _scanVoxelSize;
int _scanNormalsK;
float _scanNormalsRadius;
StereoDense * _stereoDense;
clams::DiscreteDepthDistortionModel * _distortionModel;
bool _bilateralFiltering;
float _bilateralSigmaS;
float _bilateralSigmaR;
};
} // namespace rtabmap

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -83,5 +83,8 @@ cv::Mat RTABMAP_EXP uncompressData(const cv::Mat & bytes);
cv::Mat RTABMAP_EXP uncompressData(const std::vector<unsigned char> & bytes);
cv::Mat RTABMAP_EXP uncompressData(const 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 */
#endif /* COMPRESSION_H_ */

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -39,6 +39,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "rtabmap/utilite/UThreadNode.h"
#include "rtabmap/core/Parameters.h"
#include "rtabmap/core/SensorData.h"
#include <rtabmap/core/Statistics.h>
#include <rtabmap/core/Transform.h>
#include <rtabmap/core/Link.h>
@@ -67,6 +68,7 @@ public:
virtual ~DBDriver();
virtual void parseParameters(const ParametersMap & parameters);
virtual bool isInMemory() const {return _url.empty();}
const std::string & getUrl() const {return _url;}
void beginTransaction() const;
@@ -86,41 +88,84 @@ public:
void addLink(const Link & link);
void removeLink(int from, int to);
void updateLink(const Link & link);
void updateOccupancyGrid(
int nodeId,
const cv::Mat & ground,
const cv::Mat & obstacles,
const cv::Mat & empty,
float cellSize,
const cv::Point3f & viewpoint);
void updateDepthImage(int nodeId, const cv::Mat & image);
public:
void addStatisticsAfterRun(int stMemSize, int lastSignAdded, int processMemUsed, int databaseMemUsed, int dictionarySize) const;
void addInfoAfterRun(int stMemSize, int lastSignAdded, int processMemUsed, int databaseMemUsed, int dictionarySize, const ParametersMap & parameters) const;
void addStatistics(const Statistics & statistics) const;
void savePreviewImage(const cv::Mat & image) const;
cv::Mat loadPreviewImage() const;
void saveOptimizedPoses(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const;
std::map<int, Transform> loadOptimizedPoses(Transform * lastlocalizationPose) const;
void save2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize) const;
cv::Mat load2DMap(float & xMin, float & yMin, float & cellSize) const;
void saveOptimizedMesh(
const cv::Mat & cloud,
const std::vector<std::vector<std::vector<unsigned int> > > & polygons = std::vector<std::vector<std::vector<unsigned int> > >(), // Textures -> polygons -> vertices
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords = std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > >(), // Textures -> uv coords for each vertex of the polygons
#else
const std::vector<std::vector<Eigen::Vector2f> > & texCoords = std::vector<std::vector<Eigen::Vector2f> >(), // Textures -> uv coords for each vertex of the polygons
#endif
const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size);
cv::Mat loadOptimizedMesh(
std::vector<std::vector<std::vector<unsigned int> > > * polygons = 0,
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
#else
std::vector<std::vector<Eigen::Vector2f> > * texCoords = 0,
#endif
cv::Mat * textures = 0) const;
public:
// Mutex-protected methods of abstract versions below
bool openConnection(const std::string & url, bool overwritten = false);
void closeConnection(bool save = true);
void closeConnection(bool save = true, const std::string & outputUrl = "");
bool isConnected() const;
long getMemoryUsed() const; // In bytes
std::string getDatabaseVersion() const;
long getNodesMemoryUsed() const;
long getLinksMemoryUsed() const;
long getImagesMemoryUsed() const;
long getDepthImagesMemoryUsed() const;
long getCalibrationsMemoryUsed() const;
long getGridsMemoryUsed() const;
long getLaserScansMemoryUsed() const;
long getUserDataMemoryUsed() const;
long getWordsMemoryUsed() const;
long getFeaturesMemoryUsed() const;
long getStatisticsMemoryUsed() const;
int getLastNodesSize() const; // working memory
int getLastDictionarySize() const; // working memory
int getTotalNodesSize() const;
int getTotalDictionarySize() const;
ParametersMap getLastParameters() const;
std::map<std::string, float> getStatistics(int nodeId, double & stamp, std::vector<int> * wmState=0) const;
std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatistics() const;
std::map<int, std::vector<int> > getAllStatisticsWmStates() const;
void executeNoResult(const std::string & sql) const;
// Load objects
void load(VWDictionary * dictionary) const;
void load(VWDictionary * dictionary, bool lastStateOnly = true) 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 loadWords(const std::set<int> & wordIds, std::list<VisualWord *> & vws);
// Specific queries...
void loadNodeData(std::list<Signature *> & signatures) const;
void getNodeData(int signatureId, SensorData & data) 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;
bool getCalibration(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const;
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose) const;
bool getLaserScanInfo(int signatureId, LaserScan & info) const;
bool getNodeInfo(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps) const;
void loadLinks(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
void getWeight(int signatureId, int & weight) const;
void getAllNodeIds(std::set<int> & ids, bool ignoreChildren = false, bool ignoreBadSignatures = false) const;
@@ -134,27 +179,36 @@ public:
protected:
DBDriver(const ParametersMap & parameters = ParametersMap());
private:
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false) = 0;
virtual void disconnectDatabaseQuery(bool save = true) = 0;
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "") = 0;
virtual bool isConnectedQuery() const = 0;
virtual long getMemoryUsedQuery() const = 0; // In bytes
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 getDepthImagesMemoryUsedQuery() const = 0;
virtual long getCalibrationsMemoryUsedQuery() const = 0;
virtual long getGridsMemoryUsedQuery() const = 0;
virtual long getLaserScansMemoryUsedQuery() const = 0;
virtual long getUserDataMemoryUsedQuery() const = 0;
virtual long getWordsMemoryUsedQuery() const = 0;
virtual long getFeaturesMemoryUsedQuery() const = 0;
virtual long getStatisticsMemoryUsedQuery() const = 0;
virtual int getLastNodesSizeQuery() const = 0;
virtual int getLastDictionarySizeQuery() const = 0;
virtual int getTotalNodesSizeQuery() const = 0;
virtual int getTotalDictionarySizeQuery() const = 0;
virtual ParametersMap getLastParametersQuery() const = 0;
virtual std::map<std::string, float> getStatisticsQuery(int nodeId, double & stamp, std::vector<int> * wmState) const = 0;
virtual std::map<int, std::pair<std::map<std::string, float>, double> > getAllStatisticsQuery() const = 0;
virtual std::map<int, std::vector<int> > getAllStatisticsWmStatesQuery() const = 0;
virtual void executeNoResultQuery(const std::string & sql) const = 0;
virtual void 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 updateQuery(const std::list<Signature *> & signatures, bool updateTimestamp) const = 0;
virtual void updateQuery(const std::list<VisualWord *> & words, bool updateTimestamp) const = 0;
@@ -162,16 +216,54 @@ private:
virtual void addLinkQuery(const Link & link) const = 0;
virtual void updateLinkQuery(const Link & link) const = 0;
virtual void updateOccupancyGridQuery(
int nodeId,
const cv::Mat & ground,
const cv::Mat & obstacles,
const cv::Mat & empty,
float cellSize,
const cv::Point3f & viewpoint) const = 0;
virtual void updateDepthImageQuery(
int nodeId,
const cv::Mat & image) const = 0;
virtual void addStatisticsQuery(const Statistics & statistics) const = 0;
virtual void savePreviewImageQuery(const cv::Mat & image) const = 0;
virtual cv::Mat loadPreviewImageQuery() const = 0;
virtual void saveOptimizedPosesQuery(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const = 0;
virtual std::map<int, Transform> loadOptimizedPosesQuery(Transform * lastlocalizationPose) const = 0;
virtual void save2DMapQuery(const cv::Mat & map, float xMin, float yMin, float cellSize) const = 0;
virtual cv::Mat load2DMapQuery(float & xMin, float & yMin, float & cellSize) const = 0;
virtual void saveOptimizedMeshQuery(
const cv::Mat & cloud,
const std::vector<std::vector<std::vector<unsigned int> > > & polygons,
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords,
#else
const std::vector<std::vector<Eigen::Vector2f> > & texCoords,
#endif
const cv::Mat & textures) const = 0;
virtual cv::Mat loadOptimizedMeshQuery(
std::vector<std::vector<std::vector<unsigned int> > > * polygons,
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords,
#else
std::vector<std::vector<Eigen::Vector2f> > * texCoords,
#endif
cv::Mat * textures) const = 0;
// Load objects
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 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 loadLinksQuery(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const = 0;
virtual void loadNodeDataQuery(std::list<Signature *> & signatures) const = 0;
virtual void loadNodeDataQuery(std::list<Signature *> & signatures, bool images=true, bool scan=true, bool userData=true, bool occupancyGrid=true) const = 0;
virtual bool getCalibrationQuery(int signatureId, std::vector<CameraModel> & models, StereoCameraModel & stereoModel) const = 0;
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose) const = 0;
virtual bool getLaserScanInfoQuery(int signatureId, LaserScan & info) const = 0;
virtual bool getNodeInfoQuery(int signatureId, Transform & pose, int & mapId, int & weight, std::string & label, double & stamp, Transform & groundTruthPose, std::vector<float> & velocity, GPS & gps) const = 0;
virtual void getAllNodeIdsQuery(std::set<int> & ids, bool ignoreChildren, bool ignoreBadSignatures) const = 0;
virtual void getAllLinksQuery(std::multimap<int, Link> & links, bool ignoreNullLinks) const = 0;
virtual void getLastIdQuery(const std::string & tableName, int & id) const = 0;
@@ -181,7 +273,7 @@ private:
private:
//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;
//thread stuff

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -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/DBDriver.h"
#include <opencv2/features2d/features2d.hpp>
#include "sqlite3/sqlite3.h"
typedef struct sqlite3_stmt sqlite3_stmt;
typedef struct sqlite3 sqlite3;
namespace rtabmap {
@@ -41,33 +43,44 @@ public:
virtual ~DBDriverSqlite3();
virtual void parseParameters(const ParametersMap & parameters);
virtual bool isInMemory() const {return getUrl().empty() || _dbInMemory;}
void setDbInMemory(bool dbInMemory);
void setJournalMode(int journalMode);
void setCacheSize(unsigned int cacheSize);
void setSynchronous(int synchronous);
void setTempStore(int tempStore);
private:
protected:
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false);
virtual void disconnectDatabaseQuery(bool save = true);
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "");
virtual bool isConnectedQuery() const;
virtual long getMemoryUsedQuery() const; // In bytes
virtual bool getDatabaseVersionQuery(std::string & version) const;
virtual long getNodesMemoryUsedQuery() const;
virtual long getLinksMemoryUsedQuery() const;
virtual long getImagesMemoryUsedQuery() const;
virtual long getDepthImagesMemoryUsedQuery() const;
virtual long getCalibrationsMemoryUsedQuery() const;
virtual long getGridsMemoryUsedQuery() const;
virtual long getLaserScansMemoryUsedQuery() const;
virtual long getUserDataMemoryUsedQuery() const;
virtual long getWordsMemoryUsedQuery() const;
virtual long getFeaturesMemoryUsedQuery() const;
virtual long getStatisticsMemoryUsedQuery() const;
virtual int getLastNodesSizeQuery() const;
virtual int getLastDictionarySizeQuery() const;
virtual int getTotalNodesSizeQuery() const;
virtual int getTotalDictionarySizeQuery() const;
virtual ParametersMap getLastParametersQuery() 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 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 updateQuery(const std::list<Signature *> & signatures, bool updateTimestamp) const;
virtual void updateQuery(const std::list<VisualWord *> & words, bool updateTimestamp) const;
@@ -75,16 +88,54 @@ private:
virtual void addLinkQuery(const Link & link) const;
virtual void updateLinkQuery(const Link & link) const;
virtual void updateOccupancyGridQuery(
int nodeId,
const cv::Mat & ground,
const cv::Mat & obstacles,
const cv::Mat & empty,
float cellSize,
const cv::Point3f & viewpoint) const;
virtual void updateDepthImageQuery(
int nodeId,
const cv::Mat & image) 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) 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
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 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 loadLinksQuery(int signatureId, std::map<int, Link> & links, Link::Type type = Link::kUndef) const;
virtual void loadNodeDataQuery(std::list<Signature *> & signatures) 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 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) 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 getLastIdQuery(const std::string & tableName, int & id) const;
@@ -96,29 +147,42 @@ private:
std::string queryStepNode() const;
std::string queryStepImage() const;
std::string queryStepDepth() const;
std::string queryStepDepthUpdate() const;
std::string queryStepSensorData() const;
std::string queryStepLinkUpdate() const;
std::string queryStepLink() const;
std::string queryStepWordsChanged() const;
std::string queryStepKeypoint() const;
std::string queryStepOccupancyGridUpdate() const;
void stepNode(sqlite3_stmt * ppStmt, const Signature * s) const;
void stepImage(
sqlite3_stmt * ppStmt,
int id,
const cv::Mat & imageBytes) const;
void stepDepth(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
void stepDepthUpdate(sqlite3_stmt * ppStmt, int nodeId, const cv::Mat & imageCompressed) const;
void stepSensorData(sqlite3_stmt * ppStmt, const SensorData & sensorData) const;
void stepLink(sqlite3_stmt * ppStmt, const Link & link) const;
void stepWordsChanged(sqlite3_stmt * ppStmt, int signatureId, int oldWordId, int newWordId) const;
void stepKeypoint(sqlite3_stmt * ppStmt, int signatureId, int wordId, const cv::KeyPoint & kp, const cv::Point3f & pt, const cv::Mat & descriptor) const;
void stepOccupancyGridUpdate(sqlite3_stmt * ppStmt,
int nodeId,
const cv::Mat & ground,
const cv::Mat & obstacles,
const cv::Mat & empty,
float cellSize,
const cv::Point3f & viewpoint) const;
private:
void loadLinksQuery(std::list<Signature *> & signatures) const;
int loadOrSaveDb(sqlite3 *pInMemory, const std::string & fileName, int isSave) const;
private:
protected:
sqlite3 * _ppDb;
std::string _version;
private:
long _memoryUsedEstimate;
bool _dbInMemory;
unsigned int _cacheSize;
int _journalMode;

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -30,11 +30,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
#include <rtabmap/utilite/UThreadNode.h>
#include <rtabmap/utilite/UTimer.h>
#include <rtabmap/utilite/UEventsSender.h>
#include <rtabmap/core/Transform.h>
#include <rtabmap/core/OdometryEvent.h>
#include <rtabmap/core/Camera.h>
#include <opencv2/core/core.hpp>
@@ -45,41 +43,55 @@ namespace rtabmap {
class DBDriver;
class RTABMAP_EXP DBReader : public UThreadNode, public UEventsSender {
class RTABMAP_EXP DBReader : public Camera {
public:
DBReader(const std::string & databasePath,
float frameRate = 0.0f,
float frameRate = 0.0f, // -1 = use Database stamps, 0 = inf
bool odometryIgnored = false,
bool ignoreGoalDelay = false,
bool goalsIgnored = false);
bool goalsIgnored = false,
int startIndex = 0,
int cameraIndex = -1);
DBReader(const std::list<std::string> & databasePaths,
float frameRate = 0.0f,
float frameRate = 0.0f, // -1 = use Database stamps, 0 = inf
bool odometryIgnored = false,
bool ignoreGoalDelay = false,
bool goalsIgnored = false);
bool goalsIgnored = false,
int startIndex = 0,
int cameraIndex = -1);
virtual ~DBReader();
bool init(int startIndex=0);
void setFrameRate(float frameRate);
OdometryEvent getNextData();
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 !_odometryIgnored;}
protected:
virtual void mainLoopBegin();
virtual void mainLoop();
virtual SensorData captureImage(CameraInfo * info = 0);
private:
SensorData getNextData(CameraInfo * info = 0);
private:
std::list<std::string> _paths;
float _frameRate; // -1 = use Database stamps, 0 = inf
bool _odometryIgnored;
bool _ignoreGoalDelay;
bool _goalsIgnored;
int _startIndex;
int _cameraIndex;
DBDriver * _dbDriver;
UTimer _timer;
std::set<int> _ids;
std::set<int>::iterator _currentId;
int _previousMapId;
cv::Mat _previousInfMatrix;
double _previousStamp;
int _previousMapID;
bool _calibrated;
};
} /* namespace rtabmap */

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -94,7 +94,8 @@ public:
static int findPairs(
const std::map<int, cv::KeyPoint> & wordsA,
const std::map<int, cv::KeyPoint> & wordsB,
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs);
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
bool ignoreNegativeIds = true);
/**
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(1,1a) (2,2) (4,4) (6a,6a) (6b,6b)]
@@ -103,7 +104,8 @@ public:
static int findPairs(
const std::multimap<int, cv::KeyPoint> & wordsA,
const std::multimap<int, cv::KeyPoint> & wordsB,
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs);
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
bool ignoreNegativeIds = true);
/**
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(2,2) (4,4)]
@@ -112,7 +114,8 @@ public:
static int findPairsUnique(
const std::multimap<int, cv::KeyPoint> & wordsA,
const std::multimap<int, cv::KeyPoint> & wordsB,
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs);
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
bool ignoreNegativeIds = true);
/**
* if a=[1 2 3 4 6 6], b=[1 1 2 4 5 6 6], results= [(1,1a) (1,1b) (2,2) (4,4) (6a,6a) (6a,6b) (6b,6a) (6b,6b)]
@@ -121,7 +124,8 @@ public:
static int findPairsAll(
const std::multimap<int, cv::KeyPoint> & wordsA,
const std::multimap<int, cv::KeyPoint> & wordsB,
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs);
std::list<std::pair<int, std::pair<cv::KeyPoint, cv::KeyPoint> > > & pairs,
bool ignoreNegativeIds = true);
static cv::Mat linearLSTriangulation(
cv::Point3d u, //homogenous image point (u,v,1)

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -104,7 +104,8 @@ public:
kFeatureGfttFreak=5,
kFeatureGfttBrief=6,
kFeatureBrisk=7,
kFeatureGfttOrb=8}; //new 0.10.11
kFeatureGfttOrb=8, //new 0.10.11
kFeatureKaze=9}; //new 0.13.2
static Feature2D * create(const ParametersMap & parameters = ParametersMap());
static Feature2D * create(Feature2D::Type type, const ParametersMap & parameters = ParametersMap()); // for convenience
@@ -133,6 +134,8 @@ public:
static void limitKeypoints(std::vector<cv::KeyPoint> & keypoints, int maxKeypoints);
static void limitKeypoints(std::vector<cv::KeyPoint> & keypoints, cv::Mat & descriptors, int maxKeypoints);
static void limitKeypoints(std::vector<cv::KeyPoint> & keypoints, std::vector<cv::Point3f> & keypoints3D, cv::Mat & descriptors, int maxKeypoints);
static void limitKeypoints(const std::vector<cv::KeyPoint> & keypoints, std::vector<bool> & inliers, int maxKeypoints);
static cv::Rect computeRoi(const cv::Mat & image, const std::string & roiRatios);
static cv::Rect computeRoi(const cv::Mat & image, const std::vector<float> & roiRatios);
@@ -174,6 +177,8 @@ private:
int _subPixWinSize;
int _subPixIterations;
double _subPixEps;
int gridRows_;
int gridCols_;
// Stereo stuff
Stereo * _stereo;
};
@@ -430,6 +435,33 @@ private:
cv::Ptr<CV_BRISK> brisk_;
};
//KAZE
class RTABMAP_EXP KAZE : public Feature2D
{
public:
KAZE(const ParametersMap & parameters = ParametersMap());
virtual ~KAZE();
virtual void parseParameters(const ParametersMap & parameters);
virtual Feature2D::Type getType() const { return kFeatureKaze; }
private:
virtual std::vector<cv::KeyPoint> generateKeypointsImpl(const cv::Mat & image, const cv::Rect & roi, const cv::Mat & mask = cv::Mat()) const;
virtual cv::Mat generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::KeyPoint> & keypoints) const;
private:
bool extended_;
bool upright_;
float threshold_;
int nOctaves_;
int nOctaveLayers_;
int diffusivity_;
#if CV_MAJOR_VERSION > 2
cv::Ptr<cv::KAZE> kaze_;
#endif
};
}

View File

@@ -0,0 +1,119 @@
/*
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Universite de Sherbrooke nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef CORELIB_SRC_FLANNINDEX_H_
#define CORELIB_SRC_FLANNINDEX_H_
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
#include <list>
#include <opencv2/opencv.hpp>
namespace rtabmap {
class RTABMAP_EXP FlannIndex
{
public:
FlannIndex();
virtual ~FlannIndex();
void release();
unsigned int indexedFeatures() const;
// return KB
unsigned int memoryUsed() const;
// Note that useDistanceL1 doesn't have any effect if LSH is used
void buildLinearIndex(
const cv::Mat & features,
bool useDistanceL1 = false,
float rebalancingFactor = 2.0f);
void buildKDTreeIndex(
const cv::Mat & features,
int trees = 4,
bool useDistanceL1 = false,
float rebalancingFactor = 2.0f);
void buildKDTreeSingleIndex(
const cv::Mat & features,
int leafMaxSize = 10,
bool reorder = true,
bool useDistanceL1 = false,
float rebalancingFactor = 2.0f);
void buildLSHIndex(
const cv::Mat & features,
unsigned int table_number = 12,
unsigned int key_size = 20,
unsigned int multi_probe_level = 2,
float rebalancingFactor = 2.0f);
bool isBuilt();
int featuresType() const {return featuresType_;}
int featuresDim() const {return featuresDim_;}
unsigned int addPoints(const cv::Mat & features);
void removePoint(unsigned int index);
// return squared distances (indices should be casted in size_t)
void knnSearch(
const cv::Mat & query,
cv::Mat & indices,
cv::Mat & dists,
int knn,
int checks = 32,
float eps = 0.0,
bool sorted = true) const;
// return squared distances
void radiusSearch(
const cv::Mat & query,
std::vector<std::vector<size_t> > & indices,
std::vector<std::vector<float> > & dists,
float radius,
int maxNeighbors = 0,
int checks = 32,
float eps = 0.0,
bool sorted = true) const;
private:
void * index_;
unsigned int nextIndex_;
int featuresType_;
int featuresDim_;
bool isLSH_;
bool useDistanceL1_; // true=EUCLEDIAN_L2 false=MANHATTAN_L1
float rebalancingFactor_;
// keep feature in memory until the tree is rebuilt
// (in case the word is deleted when removed from the VWDictionary)
std::map<int, cv::Mat> addedDescriptors_;
std::list<int> removedIndexes_;
};
} /* namespace rtabmap */
#endif /* CORELIB_SRC_FLANNINDEX_H_ */

View File

@@ -0,0 +1,108 @@
/*
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Universite de Sherbrooke nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef CORELIB_SRC_GAINCOMPENSATOR_H_
#define CORELIB_SRC_GAINCOMPENSATOR_H_
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/pcl_base.h>
#include <opencv2/opencv.hpp>
#include <rtabmap/core/Link.h>
namespace rtabmap {
/**
* Works like cv::GainCompensator but with point clouds
*/
class RTABMAP_EXP GainCompensator {
public:
GainCompensator(double maxCorrespondenceDistance = 0.02, double minOverlap = 0.0, double alpha = 0.01, double beta = 10);
virtual ~GainCompensator();
void feed(
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloudA, // should not contain NaNs
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloudB, // should not contain NaNs
const Transform & transformB);
void feed(
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloudA,
const pcl::IndicesPtr & indicesA,
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloudB,
const pcl::IndicesPtr & indicesB,
const Transform & transformB);
void feed(
const std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr> & clouds, // should not contain NaNs
const std::multimap<int, Link> & links);
void feed(
const std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr> & clouds,
const std::map<int, pcl::IndicesPtr> & indices,
const std::multimap<int, Link> & links);
void feed(
const std::map<int, pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr> & clouds,
const std::map<int, pcl::IndicesPtr> & indices,
const std::multimap<int, Link> & links);
void feed(
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & clouds,
const std::multimap<int, Link> & links);
void apply(
int id,
pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
bool rgb = true) const;
void apply(
int id,
pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
const pcl::IndicesPtr & indices,
bool rgb = true) const;
void apply(
int id,
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr & cloud,
const pcl::IndicesPtr & indices,
bool rgb = true) const;
void apply(
int id,
cv::Mat & image,
bool rgb = true) const;
double getGain(int id, double * r=0, double * g=0, double * b=0) const;
int getIndex(int id) const;
private:
cv::Mat_<double> gains_;
std::map<int, int> idToIndex_;
double maxCorrespondenceDistance_;
double minOverlap_;
double alpha_;
double beta_;
};
} /* namespace rtabmap */
#endif /* CORELIB_SRC_GAINCOMPENSATOR_H_ */

View File

@@ -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.
*/
/*
* 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_
#define GEODETICCOORDS_H_
@@ -52,12 +66,58 @@ public:
cv::Point3d toGeocentric_WGS84() const;
cv::Point3d toENU_WGS84(const GeodeticCoords & origin) const; // East=X, North=Y
void fromGeocentric_WGS84(const cv::Point3d& geocentric);
void fromENU_WGS84(const cv::Point3d & enu, const GeodeticCoords & origin);
static cv::Point3d ENU_WGS84ToGeocentric_WGS84(const cv::Point3d & enu, const GeodeticCoords & origin);
private:
double latitude_; // deg
double longitude_; // deg
double altitude_; // m
};
class GPS
{
public:
GPS():
stamp_(0.0),
longitude_(0.0),
latitude_(0.0),
altitude_(0.0),
error_(0.0),
bearing_(0.0)
{}
GPS(const double & stamp,
const double & longitude,
const double & latitude,
const double & altitude,
const double & error,
const double & bearing):
stamp_(stamp),
longitude_(longitude),
latitude_(latitude),
altitude_(altitude),
error_(error),
bearing_(bearing)
{}
const double & stamp() const {return stamp_;}
const double & longitude() const {return longitude_;}
const double & latitude() const {return latitude_;}
const double & altitude() const {return altitude_;}
const double & error() const {return error_;}
const double & bearing() const {return bearing_;}
GeodeticCoords toGeodeticCoords() const {return GeodeticCoords(latitude_, longitude_, altitude_);}
private:
double stamp_; // in sec
double longitude_; // DD
double latitude_; // DD
double altitude_; // m
double error_; // m
double bearing_; // deg (North 0->360 clockwise)
};
}
#endif /* GEODETICCOORDS_H_ */

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <map>
#include <list>
#include <rtabmap/core/Link.h>
#include <rtabmap/core/GeodeticCoords.h>
namespace rtabmap {
class Memory;
@@ -53,11 +54,54 @@ bool RTABMAP_EXP exportPoses(
bool RTABMAP_EXP importPoses(
const std::string & filePath,
int format, // 0=Raw, 1=RGBD-SLAM, 2=KITTI, 3=TORO, 4=g2o, GPS (t,x,y)
int format, // 0=Raw, 1=RGBD-SLAM, 2=KITTI, 3=TORO, 4=g2o, 5=NewCollege(t,x,y), 6=Malaga Urban GPS, 7=St Lucia INS, 8=Karlsruhe
std::map<int, Transform> & poses,
std::multimap<int, Link> * constraints = 0, // optional for formats 3 and 4
std::map<int, double> * stamps = 0); // optional for format 1
bool RTABMAP_EXP exportGPS(
const std::string & filePath,
const std::map<int, GPS> & gpsValues,
unsigned int rgba = 0xFFFFFFFF);
/**
* Compute translation and rotation errors for KITTI datasets.
* See http://www.cvlibs.net/datasets/kitti/eval_odometry.php.
* @param poses_gt, Ground Truth poses
* @param poses_result, Estimated poses
* @param t_err, Output translation error (%)
* @param r_err, Output rotation error (deg/m)
*/
void RTABMAP_EXP calcKittiSequenceErrors(
const std::vector<Transform> &poses_gt,
const std::vector<Transform> &poses_result,
float & t_err,
float & r_err);
/**
* Compute root-mean-square error (RMSE) like the TUM RGBD
* dataset's evaluation tool (absolute trajectory error).
* See https://vision.in.tum.de/data/datasets/rgbd-dataset
* @param groundTruth, Ground Truth poses
* @param poses, Estimated poses
* @return Gt to Map transform
*/
Transform RTABMAP_EXP calcRMSE(
const std::map<int, Transform> &groundTruth,
const std::map<int, Transform> &poses,
float & translational_rmse,
float & translational_mean,
float & translational_median,
float & translational_std,
float & translational_min,
float & translational_max,
float & rotational_rmse,
float & rotational_mean,
float & rotational_median,
float & rotational_std,
float & rotational_min,
float & rotational_max);
std::multimap<int, Link>::iterator RTABMAP_EXP findLink(
std::multimap<int, Link> & links,
int from,
@@ -79,6 +123,15 @@ std::multimap<int, int>::const_iterator RTABMAP_EXP findLink(
int to,
bool checkBothWays = true);
std::multimap<int, Link> RTABMAP_EXP filterDuplicateLinks(
const std::multimap<int, Link> & links);
std::multimap<int, Link> RTABMAP_EXP filterLinks(
const std::multimap<int, Link> & links,
Link::Type filteredType);
std::map<int, Link> RTABMAP_EXP filterLinks(
const std::map<int, Link> & links,
Link::Type filteredType);
//Note: This assumes a coordinate system where X is forward, * Y is up, and Z is right.
std::map<int, Transform> RTABMAP_EXP frustumPosesFiltering(
const std::map<int, Transform> & poses,
@@ -176,6 +229,11 @@ int RTABMAP_EXP findNearestNode(
const std::map<int, rtabmap::Transform> & nodes,
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
* @param nodeId the query id
@@ -198,6 +256,10 @@ float RTABMAP_EXP computePathLength(
unsigned int fromIndex = 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::map<int, Transform> poses,
const std::multimap<int, Link> & links);

View File

@@ -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,
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)
{
}
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_ */

View File

@@ -0,0 +1,70 @@
/*
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Universite de Sherbrooke nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
#include <rtabmap/core/Transform.h>
#include <rtabmap/utilite/UThread.h>
#include <rtabmap/utilite/UEventsSender.h>
#include <rtabmap/utilite/UTimer.h>
#include <fstream>
namespace rtabmap
{
/**
* Class IMUThread
*
*/
class RTABMAP_EXP IMUThread :
public UThread,
public UEventsSender
{
public:
IMUThread(int rate, const Transform & localTransform);
virtual ~IMUThread();
bool init(const std::string & path);
void setRate(int rate);
private:
virtual void mainLoopBegin();
virtual void mainLoop();
private:
int rate_;
Transform localTransform_;
std::ifstream imuFile_;
UTimer frameRateTimer_;
double captureDelay_;
double previousStamp_;
};
} // namespace rtabmap

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@@ -0,0 +1,95 @@
/*
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Universite de Sherbrooke nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef CORELIB_INCLUDE_RTABMAP_CORE_LASERSCAN_H_
#define CORELIB_INCLUDE_RTABMAP_CORE_LASERSCAN_H_
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
#include <rtabmap/core/Transform.h>
namespace rtabmap {
class RTABMAP_EXP LaserScan
{
public:
enum Format{kUnknown=0,
kXY=1,
kXYI=2,
kXYNormal=3,
kXYINormal=4,
kXYZ=5,
kXYZI=6,
kXYZRGB=7,
kXYZNormal=8,
kXYZINormal=9,
kXYZRGBNormal=10};
static int channels(Format format);
static bool isScan2d(const Format & format);
static bool isScanHasNormals(const Format & format);
static bool isScanHasRGB(const Format & format);
static bool isScanHasIntensity(const Format & format);
static LaserScan backwardCompatibility(const cv::Mat & oldScanFormat, int maxPoints = 0, int maxRange = 0, const Transform & localTransform = Transform::getIdentity());
public:
LaserScan();
LaserScan(const cv::Mat & data, int maxPoints, float maxRange, Format format, const Transform & localTransform = Transform::getIdentity());
const cv::Mat & data() const {return data_;}
int maxPoints() const {return maxPoints_;}
float maxRange() const {return maxRange_;}
Format format() const {return format_;}
Transform localTransform() const {return localTransform_;}
bool isEmpty() const {return data_.empty();}
int size() const {return data_.cols;}
int dataType() const {return data_.type();}
bool is2d() const {return isScan2d(format_);}
bool hasNormals() const {return isScanHasNormals(format_);}
bool hasRGB() const {return isScanHasRGB(format_);}
bool hasIntensity() const {return isScanHasIntensity(format_);}
bool isCompressed() const {return !data_.empty() && data_.type()==CV_8UC1;}
LaserScan clone() const {return LaserScan(data_.clone(), maxPoints_, maxRange_, format_, localTransform_.clone());}
int getIntensityOffset() const {return hasIntensity()?(is2d()?2:3):-1;}
int getRGBOffset() const {return hasRGB()?(is2d()?2:3):-1;}
int getNormalsOffset() const {return hasNormals()?(2 + (is2d()?0:1) + ((hasRGB() || hasIntensity())?1:0)):-1;}
void clear() {data_ = cv::Mat();}
private:
cv::Mat data_;
int maxPoints_;
float maxRange_;
Format format_;
Transform localTransform_;
};
}
#endif /* CORELIB_INCLUDE_RTABMAP_CORE_LASERSCAN_H_ */

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -46,20 +46,14 @@ public:
kUserClosure,
kVirtualClosure,
kNeighborMerged,
kUndef};
kPosePrior,
kUndef = 99};
Link();
Link(int from,
int to,
Type type,
const Transform & transform,
const cv::Mat & infMatrix = cv::Mat::eye(6,6,CV_64FC1),
const cv::Mat & userData = cv::Mat());
Link(int from,
int to,
Type type,
const Transform & transform,
double rotVariance,
double transVariance,
const cv::Mat & infMatrix = cv::Mat::eye(6,6,CV_64FC1), // information matrix: inverse of covariance matrix
const cv::Mat & userData = cv::Mat());
bool isValid() const {return from_ > 0 && to_ > 0 && !transform_.isNull() && type_!=kUndef;}
@@ -76,11 +70,7 @@ public:
void setTo(int to) {to_ = to;}
void setTransform(const Transform & transform) {transform_ = transform;}
void setType(Type type) {type_ = type;}
void setInfMatrix(const cv::Mat & infMatrix);
void setVariance(double rotVariance, double transVariance);
void setUserDataRaw(const cv::Mat & userDataRaw); // only set raw
void setUserData(const cv::Mat & userData); // detect automatically if raw or compressed. If raw, the data is compressed too.
const cv::Mat & userDataRaw() const {return _userDataRaw;}
const cv::Mat & userDataCompressed() const {return _userDataCompressed;}
void uncompressUserData();
@@ -89,6 +79,9 @@ public:
Link merge(const Link & link, Type outputType) const;
Link inverse() const;
private:
void setInfMatrix(const cv::Mat & infMatrix);
private:
int from_;
int to_;

View File

@@ -1,5 +1,5 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -42,6 +42,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "rtabmap/utilite/UStl.h"
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <pcl/pcl_config.h>
namespace rtabmap {
@@ -55,6 +56,7 @@ class Registration;
class RegistrationInfo;
class RegistrationIcp;
class Stereo;
class OccupancyGrid;
class RTABMAP_EXP Memory
{
@@ -74,12 +76,13 @@ public:
bool update(const SensorData & data,
const Transform & pose,
const cv::Mat & covariance,
const std::vector<float> & velocity = std::vector<float>(), // vx,vy,vz,vroll,vpitch,vyaw
Statistics * stats = 0);
bool init(const std::string & dbUrl,
bool dbOverwritten = false,
const ParametersMap & parameters = ParametersMap(),
bool postInitClosingEvents = false);
void close(bool databaseSaved = true, bool postInitClosingEvents = false);
void close(bool databaseSaved = true, bool postInitClosingEvents = false, const std::string & ouputDatabasePath = "");
std::map<int, float> computeLikelihood(const Signature * signature,
const std::list<int> & ids);
int incrementMapId(std::map<int, int> * reducedIds = 0);
@@ -89,11 +92,34 @@ public:
std::set<int> reactivateSignatures(const std::list<int> & ids, unsigned int maxLoaded, double & timeDbAccess);
int cleanup();
void saveStatistics(const Statistics & statistics);
void savePreviewImage(const cv::Mat & image) const;
cv::Mat loadPreviewImage() const;
void saveOptimizedPoses(const std::map<int, Transform> & optimizedPoses, const Transform & lastlocalizationPose) const;
std::map<int, Transform> loadOptimizedPoses(Transform * lastlocalizationPose) const;
void save2DMap(const cv::Mat & map, float xMin, float yMin, float cellSize) const;
cv::Mat load2DMap(float & xMin, float & yMin, float & cellSize) const;
void saveOptimizedMesh(
const cv::Mat & cloud,
const std::vector<std::vector<std::vector<unsigned int> > > & polygons = std::vector<std::vector<std::vector<unsigned int> > >(), // Textures -> polygons -> vertices
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
const std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > & texCoords = std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > >(), // Textures -> uv coords for each vertex of the polygons
#else
const std::vector<std::vector<Eigen::Vector2f> > & texCoords = std::vector<std::vector<Eigen::Vector2f> >(), // Textures -> uv coords for each vertex of the polygons
#endif
const cv::Mat & textures = cv::Mat()) const; // concatenated textures (assuming square textures with all same size)
cv::Mat loadOptimizedMesh(
std::vector<std::vector<std::vector<unsigned int> > > * polygons = 0,
#if PCL_VERSION_COMPARE(>=, 1, 8, 0)
std::vector<std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > > * texCoords = 0,
#else
std::vector<std::vector<Eigen::Vector2f> > * texCoords = 0,
#endif
cv::Mat * textures = 0) const;
void emptyTrash();
void joinTrashThread();
bool addLink(const Link & link, bool addInDatabase = false);
void updateLink(int fromId, int toId, const Transform & transform, float rotVariance, float transVariance);
void updateLink(int fromId, int toId, const Transform & transform, const cv::Mat & covariance);
void updateLink(const Link & link, bool updateInDatabase = false);
void removeAllVirtualLinks();
void removeVirtualLinks(int signatureId);
std::map<int, int> getNeighborsId(
@@ -103,6 +129,8 @@ public:
bool incrementMarginOnLoop = false,
bool ignoreLoopIds = false,
bool ignoreIntermediateNodes = false,
bool ignoreLocalSpaceLoopIds = false,
const std::set<int> & nodesSet = std::set<int>(),
double * dbAccessTime = 0) const;
std::map<int, float> getNeighborsIdRadius(
int signatureId,
@@ -110,6 +138,7 @@ public:
const std::map<int, Transform> & optimizedPoses,
int maxGraphDepth) const;
void deleteLocation(int locationId, std::list<int> * deletedWords = 0);
void saveLocationData(int locationId);
void removeLink(int idA, int idB);
void removeRawData(int id, bool image = true, bool scan = true, bool userData = true);
@@ -132,9 +161,17 @@ public:
int getSignatureIdByLabel(const std::string & label, bool lookInDatabase = true) const;
bool labelSignature(int id, const std::string & label);
std::map<int, std::string> getAllLabels() const;
/**
* Set user data. Detect automatically if raw or compressed. If raw, the data is
* compressed too. A matrix of type CV_8UC1 with 1 row is considered as compressed.
* If you have one dimension unsigned 8 bits raw data, make sure to transpose it
* (to have multiple rows instead of multiple columns) in order to be detected as
* not compressed.
*/
bool setUserData(int id, const cv::Mat & data);
int getDatabaseMemoryUsed() const; // in bytes
std::string getDatabaseVersion() const;
std::string getDatabaseUrl() const;
double getDbSavingTime() const;
Transform getOdomPose(int signatureId, bool lookInDatabase = false) const;
Transform getGroundTruthPose(int signatureId, bool lookInDatabase = false) const;
@@ -145,6 +182,8 @@ public:
std::string & label,
double & stamp,
Transform & groundTruth,
std::vector<float> & velocity,
GPS & gps,
bool lookInDatabase = false) const;
cv::Mat getImageCompressed(int signatureId) const;
SensorData getNodeData(int nodeId, bool uncompressedData = false) const;
@@ -155,7 +194,7 @@ public:
void getNodeCalibration(int nodeId,
std::vector<CameraModel> & models,
StereoCameraModel & stereoModel);
SensorData getSignatureDataConst(int locationId) const;
SensorData getSignatureDataConst(int locationId, bool images = true, bool scan = true, bool userData = true, bool occupancyGrid = true) const;
std::set<int> getAllSignatureIds() const;
bool memoryChanged() const {return _memoryChanged;}
bool isIncremental() const {return _incrementalMemory;}
@@ -185,9 +224,8 @@ public:
std::multimap<int, Link> & links,
bool lookInDatabase = false);
Transform computeTransform(Signature & fromS, Signature & toS, Transform guess, RegistrationInfo * info = 0) const;
Transform computeTransform(int fromId, int toId, Transform guess, RegistrationInfo * info = 0);
Transform computeIcpTransform(int fromId, int toId, Transform guess, RegistrationInfo * info = 0);
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 computeIcpTransformMulti(
int newId,
int oldId,
@@ -198,6 +236,7 @@ private:
void preUpdate();
void addSignatureToStm(Signature * signature, const cv::Mat & covariance);
void clear();
void loadDataFromDb(bool postInitClosingEvents);
void moveToTrash(Signature * s, bool keepLinkedToGraph = true, std::list<int> * deletedWords = 0);
void moveSignatureToWMFromSTM(int id, int * reducedTo = 0);
@@ -235,6 +274,7 @@ private:
bool _rawDescriptorsKept;
bool _saveDepth16Format;
bool _notLinkedNodesKeptInDb;
bool _saveIntermediateNodeData;
bool _incrementalMemory;
bool _reduceGraph;
int _maxStMemSize;
@@ -244,14 +284,26 @@ private:
bool _generateIds;
bool _badSignaturesIgnored;
bool _mapLabelsAdded;
bool _depthAsMask;
int _imagePreDecimation;
int _imagePostDecimation;
bool _compressionParallelized;
float _laserScanDownsampleStepSize;
float _laserScanVoxelSize;
int _laserScanNormalK;
float _laserScanNormalRadius;
bool _reextractLoopClosureFeatures;
bool _localBundleOnLoopClosure;
float _rehearsalMaxDistance;
float _rehearsalMaxAngle;
bool _rehearsalWeightIgnoredWhileMoving;
bool _useOdometryFeatures;
bool _createOccupancyGrid;
int _visMaxFeatures;
int _visCorType;
bool _imagesAlreadyRectified;
bool _rectifyOnlyFeatures;
bool _covOffDiagonalIgnored;
int _idCount;
int _idMapCount;
@@ -260,6 +312,9 @@ private:
bool _memoryChanged; // False by default, become true only when Memory::update() is called.
bool _linksChanged; // False by default, become true when links are modified.
int _signaturesAdded;
GPS _gpsOrigin;
std::vector<CameraModel> _rectCameraModels;
StereoCameraModel _rectStereoCameraModel;
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
@@ -273,7 +328,9 @@ private:
bool _parallelized;
Registration * _registrationPipeline;
RegistrationIcp * _registrationIcp;
RegistrationIcp * _registrationIcpMulti;
OccupancyGrid * _occupancy;
};
} // namespace rtabmap

View File

@@ -0,0 +1,165 @@
/*
Copyright (c) 2010-2016, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Universite de Sherbrooke nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef CORELIB_SRC_OCCUPANCYGRID_H_
#define CORELIB_SRC_OCCUPANCYGRID_H_
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
#include <pcl/point_cloud.h>
#include <pcl/pcl_base.h>
#include <rtabmap/core/Parameters.h>
#include <rtabmap/core/Signature.h>
namespace rtabmap {
class RTABMAP_EXP OccupancyGrid
{
public:
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:
OccupancyGrid(const ParametersMap & parameters = ParametersMap());
void parseParameters(const ParametersMap & parameters);
void setMap(const cv::Mat & map, float xMin, float yMin, float cellSize, const std::map<int, Transform> & poses);
void setCellSize(float cellSize);
float getCellSize() const {return cellSize_;}
void setCloudAssembling(bool enabled);
float getMinMapSize() const {return minMapSize_;}
bool isGridFromDepth() const {return occupancyFromDepth_;}
bool isFullUpdate() const {return fullUpdate_;}
float getUpdateError() const {return updateError_;}
bool isMapFrameProjection() const {return projMapFrame_;}
const std::map<int, Transform> & addedNodes() const {return addedNodes_;}
int cacheSize() const {return (int)cache_.size();}
const std::map<int, std::pair<std::pair<cv::Mat, cv::Mat>, cv::Mat> > & getCache() const {return cache_;}
template<typename PointT>
typename pcl::PointCloud<PointT>::Ptr segmentCloud(
const typename pcl::PointCloud<PointT>::Ptr & cloud,
const pcl::IndicesPtr & indices,
const Transform & pose,
const cv::Point3f & viewPoint,
pcl::IndicesPtr & groundIndices, // output cloud indices
pcl::IndicesPtr & obstaclesIndices, // output cloud indices
pcl::IndicesPtr * flatObstacles = 0) const; // output cloud indices
void createLocalMap(
const Signature & node,
cv::Mat & groundCells,
cv::Mat & obstacleCells,
cv::Mat & emptyCells,
cv::Point3f & viewPoint) const;
void createLocalMap(
const LaserScan & cloud,
const Transform & pose,
cv::Mat & groundCells,
cv::Mat & obstacleCells,
cv::Mat & emptyCells,
cv::Point3f & viewPointInOut) const;
void clear();
void addToCache(
int nodeId,
const cv::Mat & ground,
const cv::Mat & obstacles,
const cv::Mat & empty);
void update(const std::map<int, Transform> & poses);
cv::Mat getMap(float & xMin, float & yMin) const;
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:
ParametersMap parameters_;
int cloudDecimation_;
float cloudMaxDepth_;
float cloudMinDepth_;
std::vector<float> roiRatios_;
float footprintLength_;
float footprintWidth_;
float footprintHeight_;
int scanDecimation_;
float cellSize_;
bool preVoxelFiltering_;
bool occupancyFromDepth_;
bool projMapFrame_;
float maxObstacleHeight_;
int normalKSearch_;
float maxGroundAngle_;
float clusterRadius_;
int minClusterSize_;
bool flatObstaclesDetected_;
float minGroundHeight_;
float maxGroundHeight_;
bool normalsSegmentation_;
bool grid3D_;
bool groundIsObstacle_;
float noiseFilteringRadius_;
int noiseFilteringMinNeighbors_;
bool scan2dUnknownSpaceFilled_;
bool rayTracing_;
bool fullUpdate_;
float minMapSize_;
bool erode_;
float footprintRadius_;
float updateError_;
float occupancyThr_;
float probHit_;
float probMiss_;
float probClampingMin_;
float probClampingMax_;
std::map<int, std::pair<std::pair<cv::Mat, cv::Mat>, cv::Mat> > cache_; //<node id, < <ground, obstacles>, empty> >
cv::Mat map_;
cv::Mat mapInfo_;
std::map<int, std::pair<int, int> > cellCount_; //<node Id, cells>
float xMin_;
float yMin_;
std::map<int, Transform> addedNodes_;
bool cloudAssembling_;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr assembledGround_;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr assembledObstacles_;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr assembledEmptyCells_;
};
}
#include <rtabmap/core/impl/OccupancyGrid.hpp>
#endif /* CORELIB_SRC_OCCUPANCYGRID_H_ */

Some files were not shown because too many files have changed in this diff Show More