Program Listing for File MapSourceBase.h

Return to documentation for file (include/mola_kernel/interfaces/MapSourceBase.h)

/* -------------------------------------------------------------------------
 *   A Modular Optimization framework for Localization and mApping  (MOLA)
 * Copyright (C) 2018-2024 Jose Luis Blanco, University of Almeria
 * See LICENSE for license information.
 * ------------------------------------------------------------------------- */
#pragma once

#include <mrpt/maps/CMetricMap.h>

#include <functional>
#include <iostream>
#include <mutex>
#include <string>
#include <vector>

namespace mola
{
class MapSourceBase
{
   public:
    MapSourceBase()          = default;
    virtual ~MapSourceBase() = default;

    struct MapUpdate
    {
        MapUpdate() = default;

        mrpt::Clock::time_point timestamp;

        std::string reference_frame = "map";

        std::string method = "slam";

        std::string map_name = "local_map";

        mrpt::maps::CMetricMap::Ptr map;
    };

    using map_updates_callback_t = std::function<void(const MapUpdate&)>;

    void subscribeToMapUpdates(const map_updates_callback_t& callback)
    {
        auto lck = mrpt::lockHelper(mapUpdSubsMtx_);
        mapUpdSubs_.push_back(callback);
    }

   protected:
    bool anyUpdateMapSubscriber()
    {
        auto lck = mrpt::lockHelper(mapUpdSubsMtx_);
        return !mapUpdSubs_.empty();
    }

    void advertiseUpdatedMap(const MapUpdate& l)
    {
        auto lck = mrpt::lockHelper(mapUpdSubsMtx_);
        for (const auto& callback : mapUpdSubs_)
        {
            try
            {
                callback(l);
            }
            catch (const std::exception& e)
            {
                std::cerr << "[MapSourceBase] Exception in callback: "
                          << e.what();
            }
        }
    }

   private:
    std::vector<map_updates_callback_t> mapUpdSubs_;
    std::mutex                          mapUpdSubsMtx_;
};

}  // namespace mola