谢奇明 2019-10-31 14:55 采纳率: 0%
浏览 313

apollo3.0.0中perception问题

我对以下代码有些疑问,请大神解答:
在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 &sub_events,
const vector &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 &event_ids,
vector *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;
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-20 19:24
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器