我对以下代码有些疑问,问题如下:
在
bool result = inst->Init(subnode_config, subnode_sub_events_map[subnode_id], subnode_pub_events_map[subnode_id],&event_manager_, &shared_data_manager_)
函数中,每个节点不一定有subnode_sub_events_map和subnode_pub_events_map,这个函数在for循环中引用,不会出错吗
for (auto pair : subnode_config_map) {
const DAGConfig::Subnode& subnode_config = pair.second;
const SubnodeID subnode_id = pair.first;
Subnode* inst = SubnodeRegisterer::GetInstanceByName(subnode_config.name());
// AINFO << "subnode_name: " << subnode_config.name();
// AINFO << "subnode_id: " << subnode_id;
if (inst == NULL) {
AERROR << "failed to get subnode instance. name: "
<< subnode_config.name();
return false;
}
bool result = inst->Init(subnode_config, subnode_sub_events_map[subnode_id],
subnode_pub_events_map[subnode_id],
&event_manager_, &shared_data_manager_);
if (!result) {
AERROR << "failed to Init subnode. name: " << inst->name();
return false;
}
subnode_map_.emplace(subnode_id, std::unique_ptr<Subnode>(inst));
subnode_name_map_[subnode_config.name()] = subnode_id;
AINFO << "Init subnode succ. " << inst->DebugString();
}
以下是edge_config的配置参数
edge_config {
# input nodes --> segment nodes edge.
edges {
id: 101
from_node: 1
to_node: 11
events {
id: 1001
name: "64 lidar->segment"
}
}
edges {
id: 102
from_node: 2
to_node: 12
events {
id: 1002
name: "16_0 lidar->segment"
}
}
edges {
id: 103
from_node: 3
to_node: 13
events {
id: 1003
name: "16_1 lidar->segment"
}
}
# segment nodes --> obstacle nodes edges.
edges {
id: 104
from_node: 11
to_node: 21
events {
id: 1004
name: "64 segment -> obstacle"
}
}
edges {
id: 105
from_node: 12
to_node: 22
events {
id: 1005
name: "16_0 segment -> obstacle"
}
}
edges {
id: 106
from_node: 13
to_node: 23
events {
id: 1006
name: "16_1 segment -> obstacle"
}
}
# obstacle nodes --> track nodes edges.
edges {
id: 107
from_node: 21
to_node: 31
events {
id: 1007
name: "64 obstacle -> track"
}
}
edges {
id: 108
from_node: 22
to_node: 32
events {
id: 1008
name: "16_0 obstacle -> segment"
}
}
edges {
id: 109
from_node: 23
to_node: 33
events {
id: 1009
name: "16_0 obstacle -> segment"
}
}
# track nodes --> fusion nodes edges.
edges {
id: 110
from_node: 31
to_node: 41
events {
id: 1010
name: "64 track -> fusion"
}
}
edges {
id: 111
from_node: 32
to_node: 41
events {
id: 1011
name: "16_0 track -> fusion"
}
}
edges {
id: 112
from_node: 33
to_node: 41
events {
id: 1012
name: "16_1 track -> fusion"
}
}
}
以下是subnode_pub_events_map和subnode_sub_events_map的创建代码
for (auto& edge_proto : edge_config.edges()) {
SubnodeID from = edge_proto.from_node();
SubnodeID to = edge_proto.to_node();
if (subnode_config_map.find(from) == subnode_config_map.end() ||
subnode_config_map.find(to) == subnode_config_map.end()) {
AERROR << "SubnodeID not exists in subnode_config. <" << from << ", "
<< to << ">";
return false;
}
for (auto& event_proto : edge_proto.events()) {
subnode_pub_events_map[from].push_back(event_proto.id());
subnode_sub_events_map[to].push_back(event_proto.id());
}
}
经过一层一层代码阅读,终于找到问题所在处:
Subnode* inst = SubnodeRegisterer::GetInstanceByName(subnode_config.name());函数定义如下:
bool Subnode::Init(const DAGConfig::Subnode &subnode_config,
const vector<EventID> &sub_events,
const vector<EventID> &pub_events,
EventManager *event_manager,
SharedDataManager *shared_data_manager) {
name_ = subnode_config.name();
id_ = subnode_config.id();
std::cout<<id<<std::endl;
reserve_ = subnode_config.reserve();
if (subnode_config.has_type()) {
type_ = subnode_config.type();
}
CHECK(event_manager != nullptr) << "event_manager == nullptr";
event_manager_ = event_manager;
CHECK(shared_data_manager != nullptr) << "shared_data_manager == nullptr";
shared_data_manager_ = shared_data_manager;
// fill sub and pub meta events.
if (!event_manager_->GetEventMeta(sub_events, &sub_meta_events_)) {
AERROR << "failed to get Sub EventMeta. node: <" << name_ << ", " << id_
<< ">";
return false;
}
if (!event_manager_->GetEventMeta(pub_events, &pub_meta_events_)) {
AERROR << "failed to get Pub EventMeta. node: <" << id_ << ", " << name_
<< ">";
return false;
}
if (!InitInternal()) {
AERROR << "failed to Init inner members.";
return false;
}
inited_ = true;
return true;
}
event_manager_->GetEventMeta函数定义如下,由for循环判断是否决定添 加事件,这样pub和sub事件的存在与否问题解决了
bool EventManager::GetEventMeta(const vector<EventID> &event_ids,
vector<string> *str_list) const {
str_list->reserve(event_ids.size());
for (EventID event_id : event_ids) {
string str;
if (!GetEventMeta(event_id, &str)) {
return false;
}
str_list->push_back(str);
}
return true;
}