Hello,
I wanted to run a sanity check using the demo_mapping.bag file found at http://wiki.ros.org/rtabmap_ros#Robot_mapping to see if I could reproduce the results in the your video. I'm using ROS Indigo (Debian install) under Ubuntu 14.04. I first ran 'rosbag fix' on the bag file to make sure it was compatible with my setup. I then played the bag file while running rtabmap in mapping mode. I will list my rtabmap parameters below. The problem I am seeing is that the hallway walls are not lining up consistently and the laser scans reflect this same misalignment. Here are two screen shots of my resulting map: Note how the walls tend to have double images in both the 3D map and the laser scans. The map in your video does not have this problem. Here now are my current rtabmap parameters: rosrun rtabmap_ros rtabmap --params [ INFO] [1472048466.650221048]: Starting node... Param: BRIEF/Bytes = "32" [Bytes is a length of descriptor in bytes. It can be equal 16, 32 or 64 bytes.] Param: BRISK/Octaves = "3" [Detection octaves. Use 0 to do single scale.] Param: BRISK/PatternScale = "1" [Apply this scale to the pattern used for sampling the neighbourhood of a keypoint.] Param: BRISK/Thresh = "30" [FAST/AGAST detection threshold score.] Param: Bayes/FullPredictionUpdate = "false" [Regenerate all the prediction matrix on each iteration (otherwise only removed/added ids are updated).] Param: Bayes/PredictionLC = "0.1 0.36 0.30 0.16 0.062 0.0151 0.00255 0.000324 2.5e-05 1.3e-06 4.8e-08 1.2e-09 1.9e-11 2.2e-13 1.7e-15 8.5e-18 2.9e-20 6.9e-23" [Prediction of loop closures (Gaussian-like, here with sigma=1.6) - Format: {VirtualPlaceProb, LoopClosureProb, NeighborLvl1, NeighborLvl2, ...}.] Param: Bayes/VirtualPlacePriorThr = "0.9" [Virtual place prior] Param: DbSqlite3/CacheSize = "10000" [Sqlite cache size (default is 2000).] Param: DbSqlite3/InMemory = "false" [Using database in the memory instead of a file on the hard disk.] Param: DbSqlite3/JournalMode = "3" [0=DELETE, 1=TRUNCATE, 2=PERSIST, 3=MEMORY, 4=OFF (see sqlite3 doc : "PRAGMA journal_mode")] Param: DbSqlite3/Synchronous = "0" [0=OFF, 1=NORMAL, 2=FULL (see sqlite3 doc : "PRAGMA synchronous")] Param: DbSqlite3/TempStore = "2" [0=DEFAULT, 1=FILE, 2=MEMORY (see sqlite3 doc : "PRAGMA temp_store")] Param: FAST/Gpu = "false" [GPU-FAST: Use GPU version of FAST. This option is enabled only if OpenCV is built with CUDA and GPUs are detected.] Param: FAST/GpuKeypointsRatio = "0.05" [Used with FAST GPU.] Param: FAST/GridCols = "4" [Grid cols (0 to disable). Adapts the detector to partition the source image into a grid and detect points in each cell.] Param: FAST/GridRows = "4" [Grid rows (0 to disable). Adapts the detector to partition the source image into a grid and detect points in each cell.] Param: FAST/MaxThreshold = "200" [Maximum threshold. Used only when FAST/GridRows and FAST/GridCols are set.] Param: FAST/MinThreshold = "1" [Minimum threshold. Used only when FAST/GridRows and FAST/GridCols are set.] Param: FAST/NonmaxSuppression = "true" [If true, non-maximum suppression is applied to detected corners (keypoints).] Param: FAST/Threshold = "10" [Threshold on difference between intensity of the central pixel and pixels of a circle around this pixel.] Param: FREAK/NOctaves = "4" [Number of octaves covered by the detected keypoints.] Param: FREAK/OrientationNormalized = "true" [Enable orientation normalization.] Param: FREAK/PatternScale = "22" [Scaling of the description pattern.] Param: FREAK/ScaleNormalized = "true" [Enable scale normalization.] Param: GFTT/BlockSize = "3" [] Param: GFTT/K = "0.04" [] Param: GFTT/MinDistance = "5" [] Param: GFTT/QualityLevel = "0.001" [] Param: GFTT/UseHarrisDetector = "false" [] Param: Icp/CorrespondenceRatio = "0.2" [Ratio of matching correspondences to accept the transform.] Param: Icp/DownsamplingStep = "1" [Downsampling step size (1=no sampling). This is done before uniform sampling.] Param: Icp/Epsilon = "0" [Set the transformation epsilon (maximum allowable difference between two consecutive transformations) in order for an optimization to be considered as having converged to the final solution.] Param: Icp/Iterations = "30" [Max iterations.] Param: Icp/MaxCorrespondenceDistance = "0.05" [Max distance for point correspondences.] Param: Icp/MaxRotation = "0.78" [Maximum ICP rotation correction accepted (rad).] Param: Icp/MaxTranslation = "0.2" [Maximum ICP translation correction accepted (m).] Param: Icp/PointToPlane = "false" [Use point to plane ICP.] Param: Icp/PointToPlaneNormalNeighbors = "20" [Number of neighbors to compute normals for point to plane.] Param: Icp/VoxelSize = "0.025" [Uniform sampling voxel size (0=disabled).] Param: Kp/BadSignRatio = "0.5" [Bad signature ratio (less than Ratio x AverageWordsPerImage = bad).] Param: Kp/DetectorStrategy = "2" [0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB.] Param: Kp/DictionaryPath = "" [Path of the pre-computed dictionary] Param: Kp/IncrementalDictionary = "true" [] Param: Kp/IncrementalFlann = "true" [When using FLANN based strategy, add/remove points to its index without always rebuilding the index (the index is built only when the dictionary doubles in size).] Param: Kp/MaxDepth = "0" [Filter extracted keypoints by depth (0=inf).] Param: Kp/MaxFeatures = "400" [Maximum features extracted from the images (0 means not bounded, <0 means no extraction).] Param: Kp/MinDepth = "0" [Filter extracted keypoints by depth.] Param: Kp/NNStrategy = "1" [kNNFlannNaive=0, kNNFlannKdTree=1, kNNFlannLSH=2, kNNBruteForce=3, kNNBruteForceGPU=4] Param: Kp/NewWordsComparedTogether = "true" [When adding new words to dictionary, they are compared also with each other (to detect same words in the same signature).] Param: Kp/NndrRatio = "0.8" [NNDR ratio (A matching pair is detected, if its distance is closer than X times the distance of the second nearest neighbor.)] Param: Kp/Parallelized = "true" [If the dictionary update and signature creation were parallelized.] Param: Kp/RoiRatios = "0.0 0.0 0.0 0.0" [Region of interest ratios [left, right, top, bottom].] Param: Kp/SubPixEps = "0.02" [See cv::cornerSubPix().] Param: Kp/SubPixIterations = "0" [See cv::cornerSubPix(). 0 disables sub pixel refining.] Param: Kp/SubPixWinSize = "3" [See cv::cornerSubPix().] Param: Kp/TfIdfLikelihoodUsed = "true" [Use of the td-idf strategy to compute the likelihood.] Param: Mem/BadSignaturesIgnored = "false" [Bad signatures are ignored.] Param: Mem/BinDataKept = "true" [Keep binary data in db.] Param: Mem/GenerateIds = "true" [True=Generate location IDs, False=use input image IDs.] Param: Mem/ImageKept = "false" [Keep raw images in RAM.] Param: Mem/ImagePostDecimation = "1" [Image decimation (>=1) of saved data in created signatures (after features extraction). Decimation is done from the original image.] Param: Mem/ImagePreDecimation = "1" [Image decimation (>=1) before features extraction.] Param: Mem/IncrementalMemory = "true" [SLAM mode, otherwise it is Localization mode.] Param: Mem/InitWMWithAllNodes = "false" [Initialize the Working Memory with all nodes in Long-Term Memory. When false, it is initialized with nodes of the previous session.] Param: Mem/LaserScanDownsampleStepSize = "1" [If > 1, downsample the laser scans when creating a signature.] Param: Mem/MapLabelsAdded = "true" [Create map labels. The first node of a map will be labelled as "map#" where # is the map ID.] Param: Mem/NotLinkedNodesKept = "true" [Keep not linked nodes in db (rehearsed nodes and deleted nodes).] Param: Mem/RawDescriptorsKept = "true" [Raw descriptors kept in memory.] Param: Mem/RecentWmRatio = "0.2" [Ratio of locations after the last loop closure in WM that cannot be transferred.] Param: Mem/ReduceGraph = "false" [Reduce graph. Merge nodes when loop closures are added (ignoring those with user data set).] Param: Mem/RehearsalIdUpdatedToNewOne = "false" [On merge, update to new id. When false, no copy.] Param: Mem/RehearsalSimilarity = "0.6" [Rehearsal similarity.] Param: Mem/RehearsalWeightIgnoredWhileMoving = "false" [When the robot is moving, weights are not updated on rehearsal.] Param: Mem/STMSize = "10" [Short-term memory size.] Param: Mem/SaveDepth16Format = "false" [Save depth image into 16 bits format to reduce memory used. Warning: values over ~65 meters are ignored (maximum 65535 millimeters).] Param: Mem/TransferSortingByWeightId = "false" [On transfer, signatures are sorted by weight->ID only (i.e. the oldest of the lowest weighted signatures are transferred first). If false, the signatures are sorted by weight->Age->ID (i.e. the oldest inserted in WM of the lowest weighted signatures are transferred first). Note that retrieval updates the age, not the ID.] Param: Mem/UseOdomFeatures = "false" [Use odometry features.] Param: ORB/EdgeThreshold = "31" [This is size of the border where the features are not detected. It should roughly match the patchSize parameter.] Param: ORB/FirstLevel = "0" [It should be 0 in the current implementation.] Param: ORB/Gpu = "false" [GPU-ORB: Use GPU version of ORB. This option is enabled only if OpenCV is built with CUDA and GPUs are detected.] Param: ORB/NLevels = "8" [The number of pyramid levels. The smallest level will have linear size equal to input_image_linear_size/pow(scaleFactor, nlevels).] Param: ORB/PatchSize = "31" [size of the patch used by the oriented BRIEF descriptor. Of course, on smaller pyramid layers the perceived image area covered by a feature will be larger.] Param: ORB/ScaleFactor = "1.2" [Pyramid decimation ratio, greater than 1. scaleFactor==2 means the classical pyramid, where each next level has 4x less pixels than the previous, but such a big scale factor will degrade feature matching scores dramatically. On the other hand, too close to 1 scale factor will mean that to cover certain scale range you will need more pyramid levels and so the speed will suffer.] Param: ORB/ScoreType = "0" [The default HARRIS_SCORE=0 means that Harris algorithm is used to rank features (the score is written to KeyPoint::score and is used to retain best nfeatures features); FAST_SCORE=1 is alternative value of the parameter that produces slightly less stable keypoints, but it is a little faster to compute.] Param: ORB/WTA_K = "2" [The number of points that produce each element of the oriented BRIEF descriptor. The default value 2 means the BRIEF where we take a random point pair and compare their brightnesses, so we get 0/1 response. Other possible values are 3 and 4. For example, 3 means that we take 3 random points (of course, those point coordinates are random, but they are generated from the pre-defined seed, so each element of BRIEF descriptor is computed deterministically from the pixel rectangle), find point of maximum brightness and output index of the winner (0, 1 or 2). Such output will occupy 2 bits, and therefore it will need a special variant of Hamming distance, denoted as NORM_HAMMING2 (2 bits per bin). When WTA_K=4, we take 4 random points to compute each bin (that will also occupy 2 bits with possible values 0, 1, 2 or 3).] Param: Optimizer/Epsilon = "0.0001" [Stop optimizing when the error improvement is less than this value.] Param: Optimizer/Iterations = "100" [Optimization iterations.] Param: Optimizer/Robust = "false" [Robust graph optimization using Vertigo (only work for g2o and GTSAM optimization strategies). Not compatible with "RGBD/OptimizeMaxError" if enabled.] Param: Optimizer/Slam2D = "false" [If optimization is done only on x,y and theta (3DoF). Otherwise, it is done on full 6DoF poses.] Param: Optimizer/Strategy = "0" [Graph optimization strategy: 0=TORO, 1=g2o and 2=GTSAM.] Param: Optimizer/VarianceIgnored = "false" [Ignore constraints' variance. If checked, identity information matrix is used for each constraint. Otherwise, an information matrix is generated from the variance saved in the links.] Param: RGBD/AngularUpdate = "0.1" [Minimum angular displacement to update the map. Rehearsal is done prior to this, so weights are still updated.] Param: RGBD/Enabled = "true" [] Param: RGBD/GoalReachedRadius = "0.5" [Goal reached radius (m).] Param: RGBD/GoalsSavedInUserData = "false" [When a goal is received and processed with success, it is saved in user data of the location with this format: "GOAL:#".] Param: RGBD/LinearUpdate = "0.1" [Minimum linear displacement to update the map. Rehearsal is done prior to this, so weights are still updated.] Param: RGBD/LocalImmunizationRatio = "0.25" [Ratio of working memory for which local nodes are immunized from transfer.] Param: RGBD/LocalRadius = "10" [Local radius (m) for nodes selection in the local map. This parameter is used in some approaches about the local map management.] Param: RGBD/LoopClosureReextractFeatures = "false" [Extract features even if there are some already in the nodes.] Param: RGBD/MaxLocalRetrieved = "2" [Maximum local locations retrieved (0=disabled) near the current pose in the local map or on the current planned path (those on the planned path have priority).] Param: RGBD/NeighborLinkRefining = "false" [When a new node is added to the graph, the transformation of its neighbor link to the previous node is refined using ICP (laser scans required!).] Param: RGBD/NewMapOdomChangeDistance = "0" [A new map is created if a change of odometry translation greater than X m is detected (0 m = disabled).] Param: RGBD/OptimizeFromGraphEnd = "false" [Optimize graph from the newest node. If false, the graph is optimized from the oldest node of the current graph (this adds an overhead computation to detect to oldest mode of the current graph, but it can be useful to preserve the map referential from the oldest node). Warning when set to false: when some nodes are transferred, the first referential of the local map may change, resulting in momentary changes in robot/map position (which are annoying in teleoperation).] Param: RGBD/OptimizeMaxError = "1" [Reject loop closures if optimization error is greater than this value (0=disabled). This will help to detect when a wrong loop closure is added to the graph. Not compatible with "Optimizer/Robust" if enabled.] Param: RGBD/PlanAngularVelocity = "0" [Angular velocity (rad/sec) used to compute path weights.] Param: RGBD/PlanLinearVelocity = "0" [Linear velocity (m/sec) used to compute path weights.] Param: RGBD/PlanStuckIterations = "0" [Mark the current goal node on the path as unreachable if it is not updated after X iterations (0=disabled). If all upcoming nodes on the path are unreachabled, the plan fails.] Param: RGBD/ProximityAngle = "45" [Maximum angle (degrees) for visual proximity detection.] Param: RGBD/ProximityBySpace = "true" [Detection over locations (in Working Memory or STM) near in space.] Param: RGBD/ProximityByTime = "false" [Detection over all locations in STM.] Param: RGBD/ProximityMaxGraphDepth = "50" [Maximum depth from the current/last loop closure location and the local loop closure hypotheses. Set 0 to ignore.] Param: RGBD/ProximityPathFilteringRadius = "0.5" [Path filtering radius.] Param: RGBD/ProximityPathRawPosesUsed = "true" [When comparing to a local path, merge the scan using the odometry poses (with neighbor link optimizations) instead of the ones in the optimized local graph.] Param: RGBD/ScanMatchingIdsSavedInLinks = "true" [Save scan matching IDs in link's user data.] Param: Reg/Force3DoF = "false" [Force 3 degrees-of-freedom transform (3Dof: x,y and yaw). Parameters z, roll and pitch will be set to 0.] Param: Reg/Strategy = "0" [0=Vis, 1=Icp, 2=VisIcp] Param: Reg/VarianceFromInliersCount = "false" [Set variance as the inverse of the number of inliers. Otherwise, the variance is computed as the average 3D position error of the inliers.] Param: Rtabmap/CreateIntermediateNodes = "false" [Create intermediate nodes between loop closure detection. Only used when Rtabmap/DetectionRate>0.] Param: Rtabmap/DetectionRate = "1" [Detection rate. RTAB-Map will filter input images to satisfy this rate.] Param: Rtabmap/ImageBufferSize = "1" [Data buffer size (0 min inf).] Param: Rtabmap/LoopRatio = "0" [The loop closure hypothesis must be over LoopRatio x lastHypothesisValue.] Param: Rtabmap/LoopThr = "0.11" [Loop closing threshold.] Param: Rtabmap/MaxRetrieved = "2" [Maximum locations retrieved at the same time from LTM.] Param: Rtabmap/MemoryThr = "0" [Maximum signatures in the Working Memory (ms) (0 means infinity).] Param: Rtabmap/PublishLastSignature = "true" [Publishing last signature.] Param: Rtabmap/PublishLikelihood = "true" [Publishing likelihood.] Param: Rtabmap/PublishPdf = "true" [Publishing pdf.] Param: Rtabmap/PublishStats = "true" [Publishing statistics.] Param: Rtabmap/StartNewMapOnLoopClosure = "false" [Start a new map only if there is a global loop closure with a previous map.] Param: Rtabmap/StatisticLogged = "false" [Logging enabled.] Param: Rtabmap/StatisticLoggedHeaders = "true" [Add column header description to log files.] Param: Rtabmap/StatisticLogsBufferedInRAM = "true" [Statistic logs buffered in RAM instead of written to hard drive after each iteration.] Param: Rtabmap/TimeThr = "0" [Maximum time allowed for the detector (ms) (0 means infinity).] Param: Rtabmap/VhStrategy = "0" [None 0, Similarity 1, Epipolar 2.] Param: Rtabmap/WorkingDirectory = "/home/patrick/.ros" [Working directory.] Param: SIFT/ContrastThreshold = "0.04" [The contrast threshold used to filter out weak features in semi-uniform (low-contrast) regions. The larger the threshold, the less features are produced by the detector.] Param: SIFT/EdgeThreshold = "10" [The threshold used to filter out edge-like features. Note that the its meaning is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are filtered out (more features are retained).] Param: SIFT/NFeatures = "0" [The number of best features to retain. The features are ranked by their scores (measured in SIFT algorithm as the local contrast).] Param: SIFT/NOctaveLayers = "3" [The number of layers in each octave. 3 is the value used in D. Lowe paper. The number of octaves is computed automatically from the image resolution.] Param: SIFT/Sigma = "1.6" [The sigma of the Gaussian applied to the input image at the octave #0. If your image is captured with a weak camera with soft lenses, you might want to reduce the number.] Param: SURF/Extended = "false" [Extended descriptor flag (true - use extended 128-element descriptors; false - use 64-element descriptors).] Param: SURF/GpuKeypointsRatio = "0.01" [Used with SURF GPU.] Param: SURF/GpuVersion = "false" [GPU-SURF: Use GPU version of SURF. This option is enabled only if OpenCV is built with CUDA and GPUs are detected.] Param: SURF/HessianThreshold = "500" [Threshold for hessian keypoint detector used in SURF.] Param: SURF/OctaveLayers = "2" [Number of octave layers within each octave.] Param: SURF/Octaves = "4" [Number of pyramid octaves the keypoint detector will use.] Param: SURF/Upright = "false" [Up-right or rotated features flag (true - do not compute orientation of features; false - compute orientation).] Param: Stereo/Eps = "0.01" [[Stereo/OpticalFlow = true] Epsilon stop criterion.] Param: Stereo/Iterations = "30" [Maximum iterations.] Param: Stereo/MaxDisparity = "128" [Maximum disparity.] Param: Stereo/MaxLevel = "3" [Maximum pyramid level.] Param: Stereo/MinDisparity = "1" [Minimum disparity.] Param: Stereo/OpticalFlow = "true" [Use optical flow to find stereo correspondences, otherwise a simple block matching approach is used.] Param: Stereo/SSD = "true" [[Stereo/OpticalFlow = false] Use Sum of Squared Differences (SSD) window, otherwise Sum of Absolute Differences (SAD) window is used.] Param: Stereo/WinHeight = "3" [Window height.] Param: Stereo/WinWidth = "15" [Window width.] Param: StereoBM/BlockSize = "15" [See cv::StereoBM] Param: StereoBM/MinDisparity = "0" [See cv::StereoBM] Param: StereoBM/NumDisparities = "64" [See cv::StereoBM] Param: StereoBM/PreFilterCap = "31" [See cv::StereoBM] Param: StereoBM/PreFilterSize = "9" [See cv::StereoBM] Param: StereoBM/SpeckleRange = "4" [See cv::StereoBM] Param: StereoBM/SpeckleWindowSize = "100" [See cv::StereoBM] Param: StereoBM/TextureThreshold = "10" [See cv::StereoBM] Param: StereoBM/UniquenessRatio = "15" [See cv::StereoBM] Param: VhEp/MatchCountMin = "8" [Minimum of matching visual words pairs to accept the loop hypothesis.] Param: VhEp/RansacParam1 = "3" [Fundamental matrix (see cvFindFundamentalMat()): Max distance (in pixels) from the epipolar line for a point to be inlier.] Param: VhEp/RansacParam2 = "0.99" [Fundamental matrix (see cvFindFundamentalMat()): Performance of the RANSAC.] Param: Vis/CorFlowEps = "0.01" [[Vis/CorrespondenceType=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.] Param: Vis/CorFlowIterations = "30" [[Vis/CorrespondenceType=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.] Param: Vis/CorFlowMaxLevel = "3" [[Vis/CorrespondenceType=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.] Param: Vis/CorFlowWinSize = "16" [[Vis/CorrespondenceType=1] See cv::calcOpticalFlowPyrLK(). Used for optical flow approach.] Param: Vis/CorGuessWinSize = "50" [[Vis/CorrespondenceType=0] Matching window size (pixels) around projected points when a guess transform is provided to find correspondences. 0 means disabled.] Param: Vis/CorNNDR = "0.8" [[Vis/CorrespondenceType=0] NNDR: nearest neighbor distance ratio. Used for features matching approach.] Param: Vis/CorNNType = "1" [[Vis/CorrespondenceType=0] kNNFlannNaive=0, kNNFlannKdTree=1, kNNFlannLSH=2, kNNBruteForce=3, kNNBruteForceGPU=4. Used for features matching approach.] Param: Vis/CorType = "0" [Correspondences computation approach: 0=Features Matching, 1=Optical Flow] Param: Vis/EpipolarGeometryVar = "0.02" [[Vis/EstimationType = 2] Epipolar geometry maximum variance to accept the transformation.] Param: Vis/EstimationType = "0" [Motion estimation approach: 0:3D->3D, 1:3D->2D (PnP), 2:2D->2D (Epipolar Geometry)] Param: Vis/FeatureType = "6" [0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB.] Param: Vis/ForwardEstOnly = "true" [Forward estimation only (A->B). If false, a transformation is also computed in backward direction (B->A), then the two resulting transforms are merged (middle interpolation between the transforms).] Param: Vis/InlierDistance = "0.1" [[Vis/EstimationType = 0] Maximum distance for feature correspondences. Used by 3D->3D estimation approach.] Param: Vis/Iterations = "100" [Maximum iterations to compute the transform.] Param: Vis/MaxDepth = "0" [Max depth of the features (0 means no limit).] Param: Vis/MaxFeatures = "1000" [0 no limits.] Param: Vis/MinDepth = "0" [Min depth of the features (0 means no limit).] Param: Vis/MinInliers = "20" [Minimum feature correspondences to compute/accept the transformation.] Param: Vis/PnPFlags = "1" [[Vis/EstimationType = 1] PnP flags: 0=Iterative, 1=EPNP, 2=P3P] Param: Vis/PnPRefineIterations = "1" [[Vis/EstimationType = 1] Refine iterations.] Param: Vis/PnPReprojError = "2" [[Vis/EstimationType = 1] PnP reprojection error.] Param: Vis/RefineIterations = "5" [[Vis/EstimationType = 0] Number of iterations used to refine the transformation found by RANSAC. 0 means that the transformation is not refined.] Param: Vis/RoiRatios = "0.0 0.0 0.0 0.0" [Region of interest ratios [left, right, top, bottom].] Param: Vis/SubPixEps = "0.02" [See cv::cornerSubPix().] Param: Vis/SubPixIterations = "0" [See cv::cornerSubPix(). 0 disables sub pixel refining.] Param: Vis/SubPixWinSize = "3" [See cv::cornerSubPix().] Param: g2o/Optimizer = "0" [0=Levenberg 1=GaussNewton] Param: g2o/PixelVariance = "1" [Pixel variance used for SBA.] Param: g2o/Solver = "0" [0=csparse 1=pcg 2=cholmod] |
Administrator
|
Hi,
Did you try launching rtabmap with demo_robot_mapping.launch file? Here are the modified parameters (from defaults): <param name="RGBD/NeighborLinkRefining" type="string" value="true"/> <!-- Do odometry correction with consecutive laser scans --> <param name="Reg/Strategy" type="string" value="1"/> <!-- 0=Visual, 1=ICP, 2=Visual+ICP --> <param name="Optimizer/Slam2D" type="string" value="true"/> <param name="Reg/Force3DoF" type="string" value="true"/> Just re-tested the demo with Indigo binaries (0.11.8): $ rosbag fix demo_mapping.bag demo_mapping_fix.bag $ roslaunch rtabmap_ros demo_robot_mapping.launch rviz:=true rtabmapviz:=false $ rosbag play --clock demo_mapping_fix.bag If I publish the map not optimized after the bag is finished: $ rosservice call /rtabmap/publish_map 1 0 0 The results are similar to yours. I also tested with removing the modified parameters of the launch file, but I still have very similar results than the first screenshot above. It doesn't seem to be the modified parameters the problem. To get results like the second screenshot, either graph optimization is disabled or proximity detection is disabled (yellow links above). The later case is like in this video: only global loop closures are detected at the end (at 1:41, red link above) when the camera is facing the same direction than in previous traversal, so the map can be corrected. In your screenshot, it seems you didn't finish the bag, so we can see if it could be also a graph optimization problem. Maybe not a big deal, but your fixed_frame in global options of RVIZ seems not set to /map, this can influence how MapCloud assembles the clouds. cheers, Mathieu |
Many thanks Matt. Running demo_robot_mapping.launch worked perfectly so I checked the parameters I was using in my mapping launch file and it appears some of them are out of date (probably from when I was using ROS Hydro.) So I copied over the parameters from the demo_robot_mapping.launch file and I should be good to go.
Just for the record, here are the parameters I was setting in my older launch file: <param name="RGBD/PoseScanMatching" type="string" value="true"/> <!-- Do odometry correction with consecutive laser scans --> <param name="RGBD/LocalLoopDetectionSpace" type="string" value="true"/> <!-- Local loop closure detection (using estimated position) with locations in WM --> <param name="RGBD/LocalLoopDetectionTime" type="string" value="false"/> <!-- Local loop closure detection with locations in STM --> <param name="LccIcp/Type" type="string" value="2"/> <!-- 0=No ICP, 1=ICP 3D, 2=ICP 2D --> <param name="LccBow/InlierDistance" type="string" value="0.1"/> <!-- 3D visual words correspondence distance --> <param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/> <!-- Optimize graph from initial node so /map -> /odom transform will be generated --> --patrick |
Administrator
|
Hi Patrick,
thx for sharing the old parameters. Indeed with them, the results are worst. Note that errors/warnings should be shown on terminal when starting rtabmap if some old parameters have changed or have been removed: [ERROR] [1472077919.890084897]: Rtabmap: Parameter "LccBow/InlierDistance" doesn't exist anymore! You may look at this similar parameter: "Vis/InlierDistance" [ERROR] [1472077919.894659316]: Rtabmap: Parameter "LccIcp/Type" doesn't exist anymore! You may look at this similar parameter: "Reg/Strategy" [ WARN] [1472077919.947354431]: Rtabmap: Parameter name changed: "RGBD/LocalLoopDetectionSpace" -> "RGBD/ProximityBySpace". Please update your launch file accordingly. Value "true" is still set to the new parameter name. [ WARN] [1472077919.947996984]: Rtabmap: Parameter name changed: "RGBD/LocalLoopDetectionTime" -> "RGBD/ProximityByTime". Please update your launch file accordingly. Value "false" is still set to the new parameter name. [ WARN] [1472077919.954105308]: Rtabmap: Parameter name changed: "RGBD/PoseScanMatching" -> "RGBD/NeighborLinkRefining". Please update your launch file accordingly. Value "true" is still set to the new parameter name.I think the problem here is that "RGBD/PoseScanMatching" is still used, but not "LccIcp/Type", leaving "Reg/Strategy" to "0" (visual). In that kind of environment (not a lot of visual features) and with the camera sensor used (Xtion, quite noisy over 4 meters), refining odom with visual features can add more errors. It is why "Reg/Strategy" is set to "1" (ICP) to refine only with the laser scans. cheers, Mathieu |
Hi Mathieu,
Thanks for the explanation which makes perfect sense. And yes, regarding the parameter warnings, I have been flipping back and forth between a Hydro machine and an Indigo machine and I wasn't paying close enough attention to the startup messages. I just now ditched Hydro once and for all so that all of my machines are running Indigo. --patrick |
Free forum by Nabble | Edit this page |