Parallelize cloud generation in export/view clouds dialog and rtabmap-export (#1757)

* Parallelize cloud generation in export/view clouds dialog and rtabmap-export

* Simplified NodeExportData by holding Signature directly. Added --threads option (default max cores) for CLI and UI.

* Parallelized texturing phase the same way than cloud generation

* Fixed not cancelable (right away) cloud generation in UI

---------

Co-authored-by: matlabbe <[email protected]>
This commit is contained in:
Torjus Iveland
2026-08-30 17:49:28 -07:00
committed by GitHub
co-authored by matlabbe
parent 9279ab68ca
commit 7eb26e1dc2
8 changed files with 901 additions and 515 deletions
@@ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <QDialog>
#include <QMap>
#include <QColor>
#include <QtCore/QSettings>
#include <rtabmap/core/Signature.h>
@@ -46,6 +47,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
class Ui_ExportCloudsDialog;
class QAbstractButton;
namespace clams {
class DiscreteDepthDistortionModel;
}
namespace rtabmap {
class ProgressDialog;
class GainCompensator;
@@ -132,7 +137,30 @@ private Q_SLOTS:
void cancel();
private:
int numThreads() const; // resolves the "Auto" value of the threads spin box
std::map<int, Transform> filterNodes(const std::map<int, Transform> & poses);
struct CloudGenResult
{
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud;
pcl::IndicesPtr indices;
bool hasScan = false;
bool scanHasRGB = false;
std::vector<std::pair<QString, QColor> > messages;
};
CloudGenResult generateCloudForNode(
int nodeId,
const Transform & pose,
int index,
int totalPoses,
const std::vector<float> & roiRatios,
const clams::DiscreteDepthDistortionModel * model,
const QMap<int, Signature> & cachedSignatures,
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGB>::Ptr, pcl::IndicesPtr> > & cachedClouds,
const std::map<int, LaserScan> & cachedScans,
const ParametersMap & parameters,
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr * previousCloud,
pcl::IndicesPtr * previousIndices,
Transform * previousPose) const;
std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > getClouds(
const std::map<int, Transform> & poses,
const QMap<int, Signature> & cachedSignatures,