diff --git a/CMakeLists.txt b/CMakeLists.txt index d25622ac..51de3a7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,7 +53,7 @@ find_package(octomap_msgs) #find_package(apriltag_msgs) #find_package(find_object_2d) find_package(move_base_msgs) -find_package(fiducial_msgs) +#find_package(fiducial_msgs) ## System dependencies are found with CMake's conventions find_package(RTABMap 0.20.15 REQUIRED) diff --git a/msg/NodeData.msg b/msg/NodeData.msg index 51b3694c..a19d0125 100644 --- a/msg/NodeData.msg +++ b/msg/NodeData.msg @@ -54,9 +54,11 @@ uint8[] grid_empty_cells float32 grid_cell_size Point3f grid_view_point -# std::multimap -# std::multimap -int32[] word_ids +# std::multimap +# std::vector +# std::vector +int32[] word_id_keys +int32[] word_id_values KeyPoint[] word_kpts Point3f[] word_pts # compressed descriptors diff --git a/package.xml b/package.xml index e651605d..2c6d6ba7 100644 --- a/package.xml +++ b/package.xml @@ -2,7 +2,7 @@ rtabmap_ros - 0.20.15 + 0.20.16 RTAB-Map's ros-pkg. RTAB-Map is a RGB-D SLAM approach with real-time constraints. Mathieu Labbe Mathieu Labbe diff --git a/src/MsgConversion.cpp b/src/MsgConversion.cpp index f1c682d5..3d9ae7b2 100644 --- a/src/MsgConversion.cpp +++ b/src/MsgConversion.cpp @@ -1074,31 +1074,45 @@ rtabmap::Signature nodeDataFromROS(const rtabmap_ros::msg::NodeData & msg) cv::Mat wordsDescriptors = rtabmap::uncompressData(msg.word_descriptors); - if(!msg.word_kpts.empty() && msg.word_kpts.size() != msg.word_ids.size()) + if(msg.word_id_keys.size() != msg.word_id_values.size()) { - UERROR("Word IDs and 2D keypoints should be the same size (%d, %d)!", (int)msg.word_ids.size(), (int)msg.word_kpts.size()); + UERROR("Word ID keys and values should be the same size (%d, %d)!", (int)msg.word_id_keys.size(), (int)msg.word_id_values.size()); } - if(!msg.word_pts.empty() && msg.word_pts.size() != msg.word_ids.size()) + if(!msg.word_kpts.empty() && msg.word_kpts.size() != msg.word_id_keys.size()) { - UERROR("Word IDs and 3D points should be the same size (%d, %d)!", (int)msg.word_ids.size(), (int)msg.word_pts.size()); + UERROR("Word IDs and 2D keypoints should be the same size (%d, %d)!", (int)msg.word_id_keys.size(), (int)msg.word_kpts.size()); } - if(!wordsDescriptors.empty() && wordsDescriptors.rows != (int)msg.word_ids.size()) + if(!msg.word_pts.empty() && msg.word_pts.size() != msg.word_id_keys.size()) { - UERROR("Word IDs and descriptors should be the same size (%d, %d)!", (int)msg.word_ids.size(), wordsDescriptors.rows); + UERROR("Word IDs and 3D points should be the same size (%d, %d)!", (int)msg.word_id_keys.size(), (int)msg.word_pts.size()); + } + if(!wordsDescriptors.empty() && wordsDescriptors.rows != (int)msg.word_id_keys.size()) + { + UERROR("Word IDs and descriptors should be the same size (%d, %d)!", (int)msg.word_id_keys.size(), wordsDescriptors.rows); wordsDescriptors = cv::Mat(); } - for(size_t i=0; i::const_iterator iter=signature.getWords().begin(); + iter!=signature.getWords().end(); + ++iter) { - for(size_t i=0; ifirst; + msg.word_id_values.at(i) = iter->second; + if(signature.getWordsKpts().size() == signature.getWords().size()) { - if(!msg.word_kpts.empty()) - keypointToROS(signature.getWordsKpts().at(i), msg.word_kpts.at(i)); - if(!msg.word_pts.empty()) - point3fToROS(signature.getWords3().at(i), msg.word_pts[i]); + if(msg.word_kpts.empty()) + { + msg.word_kpts.resize(signature.getWords().size()); + } + keypointToROS(signature.getWordsKpts().at(i), msg.word_kpts.at(i)); } + if(signature.getWords3().size() == signature.getWords().size()) + { + if(msg.word_pts.empty()) + { + msg.word_pts.resize(signature.getWords().size()); + } + point3fToROS(signature.getWords3().at(i), msg.word_pts.at(i)); + } + ++i; } if(!signature.getWordsDescriptors().empty())