相关文件:
- 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中
- Channel:封装属性数据类型的容器的实现类
- ChannelBase:封装属性数据类型的容器的虚基类,提供了序列化等方法
- std::unordered_map<std::string, std::shared_ptr<ChannelBase>> ChannelMap
- ChannelGroup有一个ChannelMap channels_:很多个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)