maplab系列1:channel

相关文件:

  • maplab/aslam_cv2/aslam_cv_common/include/aslam/common/channel-declaration.h
  • maplab/aslam_cv2/aslam_cv_common/include/aslam/common/channel-definitions.h
  • maplab/aslam_cv2/aslam_cv_common/include/aslam/common/channel.h

channel是ViewFrame中数据存储的结构,其本质是std::map<std::string, any data type>。但作者使用了很多宏来把不同类型的数据封装成ViewFrame的属性。


每个属性包含多种访问接口:XXX代表某个属性名

  • hasXXX
    • 参看是否有某个属性,无参数,返回bool
    • 本质是看std::map中是否有这个key
    • 在第一次调用set或者swap的时候,会自动添加key
  • getXXXs
    • 得到某个属性的所有数据,无参数,返回对应属性类型的列表
  • getXXX
    • 得到某个属性中的某个元素,比如地i个kp的scale。参数为序号,返回属性类型
  • getXXXsMutable
    • 得到某个属性的所有数据的拷贝,如果有其他线程修改这个属性,不会影响。
  • setXXXs
    • 设置某个属性的所有数据,参数为属性类型的列表
  • swapXXXs
    • 换入某个属性的所有数据,参数为属性类型的列表

使用DECLARE_CHANNEL(XXX, 属性类型)来定义一个新的属性,定义后就能用上面几种交互的接口了

  • ChannelGroup:ChannelGroup基本就是ChannelMap,多了printParameters和线程同步的东西
    • ChannelGroup有一个ChannelMap    channels_:很多个channel的集合
      • std::unordered_map<std::string, std::shared_ptr<ChannelBase>>    ChannelMap
        • ChannelBase:封装属性数据类型的容器的虚基类,提供了序列化等方法
          • Channel:封装属性数据类型的容器的实现类
            • DECLARE_CHANNEL宏会自动把属性类型封装到Channel中

下面几个函数可以不同过属性的专有接口,而直接操作ChannelGroup对象

  • CHANNEL_DATA_TYPE& getChannelData(const std::string& channel_name, const ChannelGroup& channel_group)
  • inline bool hasChannel(const std::string& channel_name, const ChannelGroup& channel_group)
  • CHANNEL_DATA_TYPE& addChannel(const std::string& channel_name, ChannelGroup* channel_group)

猜你喜欢

转载自blog.csdn.net/ziliwangmoe/article/details/82852460