Program Listing for File RTABMapSLAM.hpp

Return to documentation for file (include/depthai/rtabmap/RTABMapSLAM.hpp)

#pragma once

#include "depthai/pipeline/DeviceNode.hpp"
#include "depthai/pipeline/Subnode.hpp"
#include "depthai/pipeline/ThreadedHostNode.hpp"
#include "depthai/pipeline/datatype/Buffer.hpp"
#include "depthai/pipeline/datatype/IMUData.hpp"
#include "depthai/pipeline/datatype/ImgFrame.hpp"
#include "depthai/pipeline/datatype/MapData.hpp"
#include "depthai/pipeline/datatype/MessageGroup.hpp"
#include "depthai/pipeline/datatype/PointCloudData.hpp"
#include "depthai/pipeline/datatype/TrackedFeatures.hpp"
#include "depthai/pipeline/datatype/TransformData.hpp"
#include "depthai/pipeline/node/Sync.hpp"
#include "depthai/utility/Pimpl.hpp"

namespace dai {
namespace node {

class RTABMapSLAM : public dai::NodeCRTP<dai::node::ThreadedHostNode, RTABMapSLAM> {
   public:
    constexpr static const char* NAME = "RTABMapSLAM";

    RTABMapSLAM();
    ~RTABMapSLAM() override;
    Subnode<node::Sync> sync{*this, "sync"};
    InputMap& inputs = sync->inputs;
    std::string rectInputName = "rect";
    std::string depthInputName = "depth";
    std::string featuresInputName = "features";

    Input& rect = inputs[rectInputName];
    Input& depth = inputs[depthInputName];
    Input features{*this, {featuresInputName, DEFAULT_GROUP, DEFAULT_BLOCKING, 15, {{{DatatypeEnum::TrackedFeatures, true}}}}};
    Input odom{*this, {"odom", DEFAULT_GROUP, DEFAULT_BLOCKING, 15, {{{dai::DatatypeEnum::TransformData, true}}}}};

    Output transform{*this, {"transform", DEFAULT_GROUP, {{{dai::DatatypeEnum::TransformData, true}}}}};
    Output odomCorrection{*this, {"odomCorrection", DEFAULT_GROUP, {{{dai::DatatypeEnum::TransformData, true}}}}};
    Output obstaclePCL{*this, {"obstaclePCL", DEFAULT_GROUP, {{{dai::DatatypeEnum::PointCloudData, true}}}}};
    Output groundPCL{*this, {"groundPCL", DEFAULT_GROUP, {{{dai::DatatypeEnum::PointCloudData, true}}}}};
    Output occupancyGridMap{*this, {"occupancyGridMap", DEFAULT_GROUP, {{{dai::DatatypeEnum::MapData, true}}}}};

    Output passthroughRect{*this, {"passthroughRect", DEFAULT_GROUP, {{{dai::DatatypeEnum::ImgFrame, true}}}}};
    Output passthroughDepth{*this, {"passthroughDepth", DEFAULT_GROUP, {{{dai::DatatypeEnum::ImgFrame, true}}}}};
    Output passthroughFeatures{*this, {"passthroughFeatures", DEFAULT_GROUP, {{{dai::DatatypeEnum::TrackedFeatures, true}}}}};
    Output passthroughOdom{*this, {"passthroughOdom", DEFAULT_GROUP, {{{dai::DatatypeEnum::TransformData, true}}}}};

    void setParams(const std::map<std::string, std::string>& params);

    void setDatabasePath(const std::string& path) {
        databasePath = path;
    }

    void setLoadDatabaseOnStart(bool load) {
        loadDatabaseOnStart = load;
    }

    void setSaveDatabaseOnClose(bool save) {
        saveDatabaseOnClose = save;
    }

    void saveDatabase();
    void setSaveDatabasePeriodically(bool save) {
        saveDatabasePeriodically = save;
    }
    void setSaveDatabasePeriod(double interval) {
        databaseSaveInterval = interval;
    }
    void setPublishObstacleCloud(bool publish);
    void setPublishGroundCloud(bool publish);
    void setPublishGrid(bool publish);
    void setFreq(float f) {
        freq = f;
    }
    void setAlphaScaling(float alpha) {
        alphaScaling = alpha;
    }
    void setUseFeatures(bool use);
    void setLocalTransform(std::shared_ptr<TransformData> transform);
    std::shared_ptr<TransformData> getLocalTransform();
    void triggerNewMap();

    void buildInternal() override;

   private:
    // pimpl
    class Impl;
    Pimpl<Impl> pimplRtabmap;
    void run() override;
    Input inSync{*this, {"inSync", DEFAULT_GROUP, DEFAULT_BLOCKING, 15, {{{dai::DatatypeEnum::MessageGroup, true}}}}};
    void syncCB(std::shared_ptr<dai::ADatatype> data);
    void odomPoseCB(std::shared_ptr<dai::ADatatype> data);
    void imuCB(std::shared_ptr<dai::ADatatype> msg);
    void initialize(dai::Pipeline& pipeline, int instanceNum, int width, int height);
    float alphaScaling = -1.0;
    bool useFeatures = false;
    bool initialized = false;
    std::map<std::string, std::string> rtabParams;
    std::string databasePath = "";
    double databaseSaveInterval = 30.0;
    bool loadDatabaseOnStart = false;
    bool saveDatabaseOnClose = false;
    bool saveDatabasePeriodically = false;
    bool publishObstacleCloud = true;
    bool publishGroundCloud = true;
    bool publishGrid = true;
    float freq = 1.0f;
};
}  // namespace node
}  // namespace dai