apollo中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<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;
		}
		
### 回答1: Apollo Planning是一个自动驾驶规划模块,它负责生成自动驾驶车辆的行驶路线和行驶轨迹。该模块代码主要包括以下几个部分: 1. 地图数据处理:该部分代码主要负责处理地图数据,包括地图的加载、解析和存储等。 2. 车辆状态估计:该部分代码主要负责估计车辆的状态,包括车辆的位置、速度、加速度等。 3. 障碍物检测:该部分代码主要负责检测车辆周围的障碍物,包括车辆前方的障碍物、车辆后方的障碍物等。 4. 路径规划:该部分代码主要负责生成车辆的行驶路线,包括起点、终点、途经点等。 5. 轨迹规划:该部分代码主要负责生成车辆的行驶轨迹,包括车辆的速度、加速度、转向角度等。 总的来说,Apollo Planning的代码解读需要对自动驾驶技术有一定的了解,需要熟悉相关的算法和数据结构。同时,还需要对C++编程语言有一定的掌握,能够理解和修改代码。 ### 回答2: Apollo Planning是Apollo平台的一部分,是一种规划算法,用于生成具有速度、加速度、路径跟踪、动态碰撞检测等约束条件的行驶路径。本文将对Apollo Planning代码进行解读Apollo Planning的核心代码包括两个部分:路径规划器和速度规划器。其路径规划器的主要任务是在路网寻找一条从起点到终点的路径,而速度规划器的主要任务则是为规划出的路径生成相应的速度规划和轨迹。 路径规划器采用的主要算法是基于A*算法的全局规划器和基于Dijkstra算法的局部规划器。全局规划器用于从起点到终点寻找全局路径,而局部规划器则用于在全局路径的基础上进行优化,以生成最终的路径。 在速度规划器,采用了二次规划、线性插值和基于速度和加速度约束的时间分配等算法,用于根据路网上提供的速度信息和预计的路况等因素生成规划速度和轨迹。 除此之外,还应用了动态碰撞检测算法,用于在行驶过程实时检测障碍物,并调整行驶路径以避免碰撞。 总之,Apollo Planning的代码实现了较为完善的路径规划和速度规划功能,并且综合应用了多种算法和约束条件,使得车辆行驶更加安全、稳定。 ### 回答3: Apollo Planning 代码是百度自动驾驶平台 Apollo 用于路径规划的组件。通过对代码解读,我们可以了解到路径规划背后的一系列算法和原理。 首先,Apollo Planning 首先需要载入地图信息,以确定行驶的区域和道路网络。这些地图信息包括道路形状、道路宽度、车道数量、速度限制和限制规则等。 然后,Apollo Planning 根据车辆当前位置和目的地位置,通过 A*算法或 Dijkstra 算法等规划出车辆行驶的路径。这一过程Apollo Planning 需要考虑各种限制条件,如道路的长度、转弯半径、速度限制、停止标志和交通信号灯等。 接下来,Apollo Planning 将规划出的路径转换为轨迹,以让车辆根据轨迹规划进行动作。这一过程需要考虑车辆的动力学特性,比如加速度、最大速度限制和最大转弯速度等。 在最终生成的行驶轨迹,需要包含一些基础信息,如轨迹的时间戳、各个点的速度和加速度信息等。这些信息有助于车辆在运行过程准确地遵守路径规划,并在行驶做出适时的调整。 总之,Apollo Planning 的核心功能是确定车辆行驶的路线、行驶轨迹和行驶速度等。该组件通过高效的算法和细致的条件考虑,实现自动驾驶车辆的稳定、安全和高效的路径规划。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值