fastdds:topic instance
topic与唯一一个数据类型相对应。topic实例,说的是可以对同一个topic进行多种不同的实例化。与c++中的类和对象的概念是比较相似的。
TopicQos topic_qos = TOPIC_QOS_DEFAULT;
participant_->get_default_topic_qos(topic_qos);
topic_ = participant_->create_topic(topic_name, type_.get_type_name(), topic_qos);
if (topic_ == nullptr)
{
throw std::runtime_error("Topic initialization failed");
}
topic实例,是通过key来实现的,比如定义摄像头数据,可以定义一个数据类型。但是摄像头有前、后、左、右四个摄像头,四个摄像头都使用相同的数据类型,那么怎么区分数据来自于哪个摄像头呢?如果让我们自己实现,我们在定义数据类型的时候,除了摄像头数据之外,我们还可以增加一个id属性,用id来区分数据来源于哪个摄像头,这种方式直观,好理解,完全可行。
那么这么简单,易实现的功能,fastdds为什么还要专门提供topic instance来实现这样的功能呢?
- 与Qos策略的深度绑定
从fastdds官方文档上来看的话,有一些qos策略,比如HistoryQosPolicy、ResourceLimitWosPolicy,均可以对每个topic instance生效。
- 实例句柄
从fastdds example中的topic instances例子来看,DataWriter在创建的时候,可以针对每个key创建一个句柄,这样在发送数据的时候,不需要对数据类型中的key字段进行赋值,只需要使用key对应的句柄进行发送即可。
创建句柄:
发送数据:
- 状态机
fastdds对每个topic instance维护状态机。试想,如果我们自己实现对每个instance的状态机的维护,还是有一定的复杂度的。
ALIVE:实例存活,有DataWriter发数据
DISPOSED:当前writer不发送数据了