百度apollo自动驾驶planning代码学习-Apollo\modules\planning\common\IndexedList类代码详解

概述

IndexedList类是apollo planning模块下modules\planning\common\indexed_list.h实现

从类名来看,应该是实现了一个模板列表,可以存放任意的类型数据list,以及建立id和这类数据的映射map

从代码来看IndexedList类主要是实现:
一个通用的索引列表容器?
里面存放一个任意类型对象的list,和一个id和对象映射的map
比如其可以用来存放障碍物对象和其id的列表及映射关系。
这个容器可以任意的增加(id,对象)对,也可以通过Id去查询并返回这个对象。

就是个通用的小工具,实现任意类型对象的list,以及储存对象及id的映射map。

indexed_list.h

#pragma once

#include <unordered_map>
#include <vector>

#include <boost/thread/shared_mutex.hpp>

#include "cyber/common/log.h"
#include "modules/common/util/map_util.h"

namespace apollo {
namespace planning {

template <typename I, typename T>
class IndexedList {
 public:
  /**
   * @brief 拷贝输入的object对象到IndexedList这个列表里,如果相应的id已经存在了
   * 那么就更新这个列表里id对应的值
   * @param id Object对象的id
   * @param 要被拷贝进IndexedList这个列表里的对象
   * @return 返回指向这个列表里这个对象的指针
   */
   //这个函数就是在这个IndexedList这个列表里object_list_增减这个对象
   //以及在其map里存放id与对象的映射关系
  T* Add(const I id, const T& object) {
    auto obs = Find(id);
    if (obs) {
      AWARN << "object " << id << " is already in container";
      *obs = object;
      return obs;
    } else {
      object_dict_.insert({id, object});
      auto* ptr = &object_dict_.at(id);
      object_list_.push_back(ptr);
      return ptr;
    }
  }

 //根据id查找该容器里存放的对象
  T* Find(const I id) {
    return apollo::common::util::FindOrNull(object_dict_, id);
  }

   //根据id查找该容器里存放的对象
  const T* Find(const I id) const {
    return apollo::common::util::FindOrNull(object_dict_, id);
  }

  //返回容器里的对象列表
  const std::vector<const T*>& Items() const { return object_list_; }

  //获取容器里存放的id和对象的字典,也就是id和对象的映射map
  const std::unordered_map<I, T>& Dict() const { return object_dict_; }

  //对于IndexedList类重载运算符=,进行值的拷贝
  IndexedList& operator=(const IndexedList& other) {
    this->object_list_.clear();
    this->object_dict_.clear();
    for (const auto& item : other.Dict()) {
      Add(item.first, item.second);
    }
    return *this;
  }

 private:
 //数据成员,就是存放的任意类型的对象列表
  std::vector<const T*> object_list_;
  
  //数据成员,就是存放的id和任意类型的对象列表,通常是Id,也可以是Name或者其他
  std::unordered_map<I, T> object_dict_;
};

//又定义了一个模板类,线程安全的索引列表类ThreadSafeIndexedList 
//跟上面功能差不多
template <typename I, typename T>
class ThreadSafeIndexedList : public IndexedList<I, T> {
 public:
 //在容器里增加一个任意类型要存放的对象object,以及id和object的映射Map
  T* Add(const I id, const T& object) {
    boost::unique_lock<boost::shared_mutex> writer_lock(mutex_);
    return IndexedList<I, T>::Add(id, object);
  }

//根据id去map查询这个对象并返回
  T* Find(const I id) {
    boost::shared_lock<boost::shared_mutex> reader_lock(mutex_);
    return IndexedList<I, T>::Find(id);
  }

//获取该容器里的整个对象列表
  std::vector<const T*> Items() const {
    boost::shared_lock<boost::shared_mutex> reader_lock(mutex_);
    return IndexedList<I, T>::Items();
  }

 private:
  mutable boost::shared_mutex mutex_;
};

}  // namespace planning
}  // namespace apollo

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wujiangzhu_xjtu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值