From f22a69d1cec3e3643b7b94a2a91534cbe4a0a16f Mon Sep 17 00:00:00 2001 From: matlabbe Date: Fri, 24 Dec 2021 17:22:08 -0500 Subject: [PATCH] NodeData: fixed wrong word indexes (causing visualization issues of corresponding features in rtabmapviz) --- msg/NodeData.msg | 8 ++-- src/MsgConversion.cpp | 106 ++++++++++++++++++++++++------------------ 2 files changed, 67 insertions(+), 47 deletions(-) diff --git a/msg/NodeData.msg b/msg/NodeData.msg index 9a1123fe..e6833078 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[] wordIds +# std::multimap +# std::vector +# std::vector +int32[] wordIdKeys +int32[] wordIdValues KeyPoint[] wordKpts Point3f[] wordPts # compressed descriptors diff --git a/src/MsgConversion.cpp b/src/MsgConversion.cpp index 62d32de7..68b944e9 100644 --- a/src/MsgConversion.cpp +++ b/src/MsgConversion.cpp @@ -1067,31 +1067,45 @@ rtabmap::Signature nodeDataFromROS(const rtabmap_ros::NodeData & msg) std::vector words3D; cv::Mat wordsDescriptors = rtabmap::uncompressData(msg.wordDescriptors); - if(!msg.wordKpts.empty() && msg.wordKpts.size() != msg.wordIds.size()) + if(msg.wordIdKeys.size() != msg.wordIdValues.size()) { - ROS_ERROR("Word IDs and 2D keypoints should be the same size (%d, %d)!", (int)msg.wordIds.size(), (int)msg.wordKpts.size()); + ROS_ERROR("Word ID keys and values should be the same size (%d, %d)!", (int)msg.wordIdKeys.size(), (int)msg.wordIdValues.size()); } - if(!msg.wordPts.empty() && msg.wordPts.size() != msg.wordIds.size()) + if(!msg.wordKpts.empty() && msg.wordKpts.size() != msg.wordIdKeys.size()) { - ROS_ERROR("Word IDs and 3D points should be the same size (%d, %d)!", (int)msg.wordIds.size(), (int)msg.wordPts.size()); + ROS_ERROR("Word IDs and 2D keypoints should be the same size (%d, %d)!", (int)msg.wordIdKeys.size(), (int)msg.wordKpts.size()); } - if(!wordsDescriptors.empty() && wordsDescriptors.rows != (int)msg.wordIds.size()) + if(!msg.wordPts.empty() && msg.wordPts.size() != msg.wordIdKeys.size()) { - ROS_ERROR("Word IDs and descriptors should be the same size (%d, %d)!", (int)msg.wordIds.size(), wordsDescriptors.rows); + ROS_ERROR("Word IDs and 3D points should be the same size (%d, %d)!", (int)msg.wordIdKeys.size(), (int)msg.wordPts.size()); + } + if(!wordsDescriptors.empty() && wordsDescriptors.rows != (int)msg.wordIdKeys.size()) + { + ROS_ERROR("Word IDs and descriptors should be the same size (%d, %d)!", (int)msg.wordIdKeys.size(), wordsDescriptors.rows); wordsDescriptors = cv::Mat(); } - for(unsigned int i=0; i::const_iterator iter=signature.getWords().begin(); + iter!=signature.getWords().end(); + ++iter) { - for(size_t i=0; ifirst; + msg.wordIdValues.at(i) = iter->second; + if(signature.getWordsKpts().size() == signature.getWords().size()) { - if(!msg.wordKpts.empty()) - keypointToROS(signature.getWordsKpts().at(i), msg.wordKpts.at(i)); - if(!msg.wordPts.empty()) - point3fToROS(signature.getWords3().at(i), msg.wordPts[i]); + if(msg.wordKpts.empty()) + { + msg.wordKpts.resize(signature.getWords().size()); + } + keypointToROS(signature.getWordsKpts().at(i), msg.wordKpts.at(i)); } + if(signature.getWords3().size() == signature.getWords().size()) + { + if(msg.wordPts.empty()) + { + msg.wordPts.resize(signature.getWords().size()); + } + point3fToROS(signature.getWords3().at(i), msg.wordPts.at(i)); + } + ++i; } if(!signature.getWordsDescriptors().empty())