1.Apollo Planning 模块总结

Apollo开发-apollo介绍之planning模块(四) 规划(planning)模块的作用是根据感知预测的结果,当前的车辆信息和路况规划出一条车辆能够行驶的轨迹,这个轨迹会交给控制(control)模块,控制模块通过油门,刹车和方向盘使得车辆按照规划的轨迹运行。规划模块的轨迹是短期轨迹,即车辆短期内行驶的轨迹,长期的轨迹是routing模块规划出的导航轨迹,即起点到目的地的轨迹,规划模块会先生成导航轨迹,然后根据导航轨迹和路况的情况,沿着短期轨迹行驶,直到目的地。 阅读详情

1.整体架构

1.1 Planning 的上下游

在这里插入图片描述
Planning 模块的输入为:
HMI : 人机交互界面,也就是司机开启了自动驾驶
External Comand:转发的导航命令
Localization : 位置信息
Planning 模块的输出为:
control:输出方向盘和踏板

1.2 Planning 具体运行机制

在这里插入图片描述
Planning 模块由 Planning 基础库和 Planning 插件组成,基础库中包含了一些父类方法,比如 scenario.cc 是一种通用类,插件就是该类的子类
Planning component :是 Planning 模块的外部接口,Init 函数用于初始化组件
TrafficRule :主要运行 ApplyRule 函数对交通规则进行处理
PublicRoadPlanner : 对开放道路进行规划
Plan():使用场景机制进行规划
ScenarioManager:Update() 场景选择,切换
Scenario:具体轨迹规划

在这里插入图片描述

  • planning_interface_base 是 planning 插件的父类接口,也保存了 scenario tasks traffic_rules 的父类文件
  • palnner 文件夹中包含几种规划器
  • pnc_map 是用来生成参考线的插件
  • scenario 是场景插件
  • task 是任务插件
  • traffic_rule 是交通规则插件

1.3 工程架构

架构图

1.3.1 PlanningComponent::Init()

在这里插入图片描述
(1) 定义 Planning 的两种模式

if (FLAGS_use_navigation_mode) {
  planning_base_ = std::make_unique<NaviPlanning>(injector_);
} else {
  planning_base_ = std::make_unique<OnLanePlanning>(injector_);
}

一共有两种规划模式:
NaviPlanning 比较简单用于规划高速场景
OnLanePlanning 用于规划城市道路场,泊车
(2) 订阅模块的初始化
在 planing_component.cc 中对规划的输入和输出进行初始化,也就是调用他们的 Reader 和 Writer 方法
在这里插入图片描述

1.3.2 PlanningComponent::Proc()

在这里插入图片描述

1.4 Senario Stage Task 机制

在不同的 Planner 下有不同的 Scenario,在不同的 Scenario 下又会有不同的动作也就是 Stage ,在不同的 Stage 下又有不同的 task,他们之间相互调用
每个 Senario 使用双层状态机机制,双层状态机 Top Layer 是 Scenario 状态机,BottomLayer 是 Stage 状态机
最外层状态机:
Pull Over 靠边
Parking 泊车
Junction
在这里插入图片描述

2.Planning Base

在这里插入图片描述
这两个 Planner 主要保存在:
在这里插入图片描述
navi_planning 和 on_lane_planning 都继承 PlanningBase,这里以 on_lane_planning 为例

2.1 Init 函数

S1:启动参考线

// 参考线提供器,每 50ms 提供一次参考线
reference_line_provider_ = std::make_unique<ReferenceLineProvider>(
    injector_->vehicle_state(), reference_line_config);
reference_line_provider_->Start();

S2:创建 Planner
OnLanePlanning 继承于 public PlanningBase 在该类中有一个 std::shared_ptr<Planner> planner_; 的成员变量
Planner 是具体执行规划的类,在 planner 文件夹下 planner 一共有四种

在这里插入图片描述
每个 Planner 的作用如下:

  • rtk- 根据录制的轨迹来规划行车路线,
  • public_road- 开放道路的轨迹规划器,
  • lattice- 基于网格算法的轨迹规划器,
  • navi- 基于实时相对地图的规划器。
    这里根据不同 config 和 injector_ 创建不同的具体 Planner

首先创建具体 Planner

LoadPlanner();

在该函数中根据 config 创建具体的 Planner ,默认是 PublicRoadPlanner

void PlanningBase::LoadPlanner() {
  // Use PublicRoadPlanner as default Planner
  std::string planner_name = "apollo::planning::PublicRoadPlanner";
  if ("" != config_.planner()) {
    planner_name = config_.planner();
    planner_name = ConfigUtil::GetFullPlanningClassName(planner_name);
  }
  planner_ =
      cyber::plugin_manager::PluginManager::Instance()->CreateInstance<Planner>(
          planner_name);
}

Planner 的 Init 主要是对 Planner 的 injector 进行赋值

return planner_->Init(injector_, FLAGS_planner_config_path);
virtual apollo::common::Status Init(
    const std::shared_ptr<DependencyInjector>& injector,
    const std::string& config_path = "") {
  injector_ = injector;
  return common::Status::OK();
}

2.2 RunOnce 函数

S1:初始化 Frame

// 初始化Frame   
status = InitFrame(frame_num, stitching_trajectory.back(), vehicle_state);

S2:判断是否符合交通规则

// 判断是否符合交通规则
 for (auto& ref_line_info : *frame_->mutable_reference_line_info()) {
   auto traffic_status =
       traffic_decider_.Execute(frame_.get(), &ref_line_info);
   if (!traffic_status.ok() || !ref_line_info.IsDrivable()) {
     ref_line_info.SetDrivable(false);
     AWARN << "Reference line " << ref_line_info.Lanes().Id()
           << " traffic decider failed";
   }
 }

S3:Plan
1.调用 OnLanePlanning 的 Plan 方法

// Plan
status = Plan(start_timestamp, stitching_trajectory, ptr_trajectory_pb);

2.在具体的 Plan 函数中,planner 调用自己的 Plan 函数

// 调用具体的 planner 执行
auto status = planner_->Plan(stitching_trajectory.back(), frame_.get(),
                             ptr_trajectory_pb);

3.PublicRoadPlanner

OnLanePlanning 类使用的 planner_ 为 PublicRoadPlanner 这个 Planner 也是默认的 Planner

3.1 配置文件

所有 planner 的配置文件都在目标文件夹下的 conf 子文件夹下,定义了每个 Planner 的 scenario
在这里插入图片描述

2.2 PublicRoadPlanner::Init

会对 Senario Manager 进行初始化,也就是创建多个 scenario 放在一个 list 中

scenario_manager_.Init(injector, config_);

这个 planner_ 支持的场景如下:
在这里插入图片描述

2.2 Plan

在 Plan 中会对 Senario 进行更新,然后执行

Status PublicRoadPlanner::Plan(const TrajectoryPoint& planning_start_point,
                               Frame* frame,
                               ADCTrajectory* ptr_computed_trajectory) {
  // 更新场景
  scenario_manager_.Update(planning_start_point, frame);
  // 得到场景
  scenario_ = scenario_manager_.mutable_scenario();
  if (!scenario_) {
    return Status(apollo::common::ErrorCode::PLANNING_ERROR,
                  "Unknown Scenario");
  }
  // 执行场景
  auto result = scenario_->Process(planning_start_point, frame);

  if (FLAGS_enable_record_debug) {
    auto scenario_debug = ptr_computed_trajectory->mutable_debug()
                              ->mutable_planning_data()
                              ->mutable_scenario();
    scenario_debug->set_scenario_plugin_type(scenario_->Name());
    scenario_debug->set_stage_plugin_type(scenario_->GetStage());
    scenario_debug->set_msg(scenario_->GetMsg());
  }
  // 更新执行的状态
  if (result.GetScenarioStatus() == ScenarioStatusType::STATUS_DONE) {
    // only updates scenario manager when previous scenario's status is
    // STATUS_DONE
    scenario_manager_.Update(planning_start_point, frame);
  } else if (result.GetScenarioStatus() == ScenarioStatusType::STATUS_UNKNOWN) {
    return Status(common::PLANNING_ERROR,
                  result.GetTaskStatus().error_message());
  }
  return Status(common::OK, result.GetTaskStatus().error_message());
}

3.Scenario

场景介绍
有如下的 Scenario 场景,所有的 Senario 都用 SenarioManager 进行管理,所有的 Scenario 都会继承 Scenario 类重写里面的方法
在这里插入图片描述

在这里插入图片描述
在 SenarioManager 中有一个 list 用于存放需要运行的 senario

std::vector<std::shared_ptr<Scenario>> scenario_list_;

3.1 SenarioManager Init

将场景加载到 list 中
在这里插入图片描述

3.2 SenarioManager Update

在 scenario.cc 文件中 Process 函数会对 Stage 进行调用,首先先对当前 Stage 进行处理,然后更新 Stage 的状态,然后在创建下一个 Stage
在这里插入图片描述

在这个函数中主要是调用 ,判断是否可以进行该 scenario 的场景奇切换

scenario->IsTransferable(current_scenario_.get(), *frame)

3.3 Scenario IsTransferable

这里拿最简单的 Lane_follow 的场景来说,下面是判断是否可以 Lane follow 的条件:

bool LaneFollowScenario::IsTransferable(const Scenario* other_scenario,
                                        const Frame& frame) {
  if (!frame.local_view().planning_command->has_lane_follow_command()) {
    return false;
  }
  if (frame.reference_line_info().empty()) {
    return false;
  }
  if (other_scenario == nullptr) {
    return true;
  }
  return true;
}

lane follow 比较简单,下面是判断是否可以靠边停车的代码:
判断是否可以靠边停车
代码中主要判断 Reference 的点是否与红绿灯,停止等标志有 Overlap

auto first_encountered_overlaps =
 frame.reference_line_info().front().FirstEncounteredOverlaps();
// 如果处于红绿灯路口、具有停止标志、避让标志,则不允许靠边停车
if (pull_over_scenario) {
  static constexpr double kDistanceToAvoidJunction = 8.0;  // meter
  for (const auto& overlap : first_encountered_overlaps) {
     if (overlap.first == ReferenceLineInfo::PNC_JUNCTION ||
        overlap.first == ReferenceLineInfo::SIGNAL ||
        overlap.first == ReferenceLineInfo::STOP_SIGN ||
        overlap.first == ReferenceLineInfo::YIELD_SIGN) {
        const double distance_to = overlap.second.start_s - dest_sl.s();
        const double distance_passed = dest_sl.s() - overlap.second.end_s;
       if ((distance_to > 0.0 && distance_to < kDistanceToAvoidJunction) ||
         (distance_passed > 0.0 &&
          distance_passed < kDistanceToAvoidJunction)) {
          pull_over_scenario = false;
          break;
       }
    }
  }
}

3.4 Scenario::Process

会运行具体的 Stage

auto ret = current_stage_->Process(planning_init_point, frame);

3.5 Enter

场景的进⼊函数继承于基类的Enter()函数,在⾸次进⼊场景前调⽤做⼀些预处理的⼯作,重置场景内变量。 ⽐如,在停⽌标记场景的Enter()函数,⾸先寻找参考线的停⽌标记id保存到上下⽂变量中,然后重置停⽌标记的全局变量。

3.6 Exit

场景的退出函数继承于基类的Exit()函数,在场景切出时会被调⽤,可以⽤来清除⼀些全局变量,⽐如停⽌标记场景的切出函数

bool PullOverScenario::Exit(Frame* frame) {
  injector_->planning_context()->mutable_planning_status()->clear_pull_over();
  return true;
}

3.7 Scenario::Init()

场景的初始化需要继承Scenario的Init()函数,场景基类的Init函数主要是从场景插件中加载场景的流⽔线,将加载的 Stage 实例保存到stage_pipeline_map_中
下面以 pull_over_scenario.cc 为例

if (!Scenario::Init(injector, name)) {
    AERROR << "failed to init scenario" << Name();
    return false;
}

如果场景⾃身还有配置⽂件,则可以调⽤Scenario::LoadConfig()函数加载场景⾃身的配置⽂件,保存到场景实例上下⽂变量中context_。

if (!Scenario::LoadConfig<ScenarioPullOverConfig>(
          &context_.scenario_config)) {
    AERROR << "fail to get config of scenario" << Name();
    return false;
}

4.Stage

每个场景⼜分为⼀个或者多个阶段(stage),每个阶段⼜由不同的任务(task)组成,
每个 Stage 都包含了:路径决策,路径优化,速度决策,速度优化

4.1 配置文件

当场景中存在先后顺序的业务逻辑时,可以将其划分成多个 Stage。⽐如,在红绿灯⽆保护左转场景中可以划分为三个阶段,第⼀个阶段是接近⾏驶到红绿灯停⽌线前的过程,第⼆个是红绿灯为绿灯时慢速观望的过程,第三个是对向直⾏⻋道通畅快速通过的过程

可以根据 Scenario 的 conf 文件中定义不同的 task 文件,
下面以 lane follow stage 为例:
对于 lane follow 来讲他会有 lane follow 的 stage,lane change ,lane borrow 等等的状态
在这里插入图片描述
下面是 stop sign unprotected Stage ,在开边停车的 Scenario 中就可以看出

stage: { 
  name: "STOP_SIGN_UNPROTECTED_PRE_STOP" // 车辆到达停止牌之前
  type: "StopSignUnprotectedStagePreStop"
  enabled: true
  task {
    name: "LANE_FOLLOW_PATH"
    type: "LaneFollowPath"
  }
  ....
}
stage: {
  name: "STOP_SIGN_UNPROTECTED_STOP" // 到达车辆停止牌处如何处理
  type: "StopSignUnprotectedStageStop"
  enabled: true
  task {
    name: "LANE_FOLLOW_PATH"
    type: "LaneFollowPath"
  }
  ......
}
stage: {
  name: "STOP_SIGN_UNPROTECTED_CREEP" // 在停牌处停好车,起步,缓慢前行
  type: "StopSignUnprotectedStageCreep"
  enabled: true
  task {
    name: "LANE_FOLLOW_PATH"
    type: "LaneFollowPath"
  }
  .......
}
stage: {
  name: "STOP_SIGN_UNPROTECTED_INTERSECTION_CRUISE" // 通过了停牌路口,进入路口巡航阶段
  type: "StopSignUnprotectedStageIntersectionCruise"
  enabled: true
  task {
    name: "LANE_FOLLOW_PATH"
    type: "LaneFollowPath"
  ......
}

4.2 Stage 的状态机

RUNNING:表示当前状态正在运⾏,Scenario:将继续维持当前阶段运⾏;
FINISHED:表示当前阶段完成,Scenario将会切⼊下⼀个阶段运⾏;
ERROR:表示当前规划存在严重故障。Scenario 会将其上报,主⻋将会刹停。

4.3 LaneFollowStage::Process

这里会对每一条参考线进行处理,这里会对每条参考线调用 task 方法

result =
        PlanOnReferenceLine(planning_start_point, frame, &reference_line_info);

4.4 LaneFollowStage::PlanOnReferenceLine

在这个函数中会逐个调用 task 执行

for (auto task : task_list_) {
    const double start_timestamp = Clock::NowInSeconds();
    const auto start_planning_perf_timestamp =
        std::chrono::duration<double>(
            std::chrono::system_clock::now().time_since_epoch())
            .count();

    ret.SetTaskStatus(task->Execute(frame, reference_line_info));

5.Task

task 可以理解为具体步骤,如 path 求解器的定义,boundery 函数的定义,以及速度求解器的定义等等
在这里插入图片描述

5.1 配置文件

在这里插入图片描述

5.2 Init()

5.3 Excute()

所有的 task 都会继承 Task 父类,每个子类实现 Execute 函数
在这里插入图片描述

6.Traffic rule

交通规则插件 TrafficRule 主要是在规划模块执行 Scenario 前对交通规则进⾏处理
在这里插入图片描述

6.1 配置文件

配置文件在每个文件夹下的 conf 子文件夹下

6.2 Init()

这里以 Crosswalk 类为例,Init 函数主要是将 conf 文件加载进来

// Load the config this task.
return TrafficRule::LoadConfig<CrosswalkConfig>(&config_);

6.3 Crosswalk::ApplyRule

traffic rule 的运行函数为 applyRule 函数,该函数会将判断结果保存在 reference line 中

...
  if (!FindCrosswalks(reference_line_info)) {
    injector_->planning_context()->mutable_planning_status()->clear_crosswalk();
    return Status::OK();
  }
...
}

7.参数设置

7.1 全局参数设置

全局参数定义在 plannning.conf 文件夹下
在这里插入图片描述
在 plannig_gflags.cc 中进行初始化,使用 FLAGS_XXX 的方式进行调用

Apollo Planning模块源代码分析 严正声明:本文系作者davidhopper原创,未经允许,严禁转载! 阿波罗项目(https://github.com/ApolloAuto/apollo)规划(Planning)模块位于命名空间:apollo::planning,其作用在于构建无人车从起点到终的局部行驶路径,具体而言,就是给定导航地图、导航路径、当前定位点、车辆状态(包括:位置、速度、加速度、底盘)、 周边目标的感知及预测信息... 阅读详情

相关推荐

ros版本apollo3.0.0规划控制算法

此项目为基于'apollo3.0.0'的`ros1`移植版本,目前移植版本能实现车辆在高精度地图下进行`routing`、`planning`和`control`仿真测试。

Forrest's Space 1万+

Apollo:planning模块概况

在最新的Apollo源码中,一共包含了5个Planner的实现。它们的结构如下图所示:每个Planner都会有一个字符串描述的唯一类型,在配置文件中(见下文)通过这个类型来选择相应的Planner。名称加入版本类型说明1.0RTK 根据录制的轨迹来规划行车路线。1.5实现了EM算法的规划器,这是目前的默认Planner。2.5LATTICE基于网格算法的轨迹规划器。3.0NAVI基于实时相对地图的规划器。3.5OPEN_SPACE算法源于论文:《

OceanStar的博客 2002

UniAD端到端自动驾驶复现:CUDA版本锁死与轨迹优化实战指南

端到端自动驾驶是将感知、预测、规划统一建模的前沿范式,其核心在于摆脱传统模块化流水线,实现从原始传感器输入到物理可行轨迹输出的联合优化。这一范式依赖BEV特征空间构建、时空交叉注意力与可微分轨迹优化等关键技术,对CUDA算子定制、硬件-驱动-框架三重版本对齐提出严苛要求。尤其在UniAD等典型框架中,自定义CUDA内核(如bev_pool、traj_opt_kernel)深度绑定特定CUDA Toolkit版本(如11.1),稍有偏差即引发NaN输出、kernel不可用或显存冲突。本文聚焦真实工程落地场景,

weixin_33743703的博客 380

入门必看丨解析百度Apollo之决策规划模块

转自Apollo开发者社区 Apollo系统中的Planning模块实际上是整合了决策和规划两个功能,该模块是自动驾驶系统中最核心的模块之一(另外三个核心模块是:定位、感知和控制)。本章主要讲解自动驾驶系统中最核心的模块——决策规划模块。 下面是由社区开发者—强波提供的文章,对百度Apollo之决策规划模块进行详细讲解(Apollo 3.5之前版本),希望这篇文章能给感兴趣的开发者带来更多帮助。 01 Apollo系统与Planning 下图是Apollo系统的整体架构图。从这幅图中我们可以看出,整个系统可

weixin_43619346的博客 1万+

【Apollo学习笔记】—— Planning模块

本文记录学习planning模块时的一些笔记,总体流程参照中的流程图,如上图所示。

sinat_52032317的博客 3146

Apollo 3.5 各功能模块的启动过程解析

Apollo 3.5彻底摒弃ROS,改用自研的Cyber作为底层通讯与调度平台。本文对Apollo 3.5 各功能模块的启动与关闭进行解析,希望给感兴趣的同学带来一定的帮助。 一、DreamView模块启动过程 启动脚本文件scripts/bootstrap.sh的start文件中可执行文件配置项定义如下: function start() { ./scripts/monitor.sh s...

davidhopper的博客 2万+

Apollo学习——planning模块(1)之框架

规划(planning)模块的作用是根据感知预测的结果,当前的车辆信息和路况规划出一条车辆能够行驶的轨迹,这个轨迹会交给控制(control)模块,控制模块通过油门,刹车和方向盘使得车辆按照规划的轨迹运行。规划模块的轨迹是短期轨迹,即车辆短期内行驶的轨迹,长期的轨迹是routing模块规划出的导航轨迹,即起点到目的地的轨迹,规划模块会先生成导航轨迹,然后根据导航轨迹和路况的情况,沿着短期轨迹行驶,直到目的地。

小墨迹的博客 719

Apollo Planning决策规划算法代码详解 (22):决策规划算法最完整介绍

前言: 后台已经写完了Apollo Planning决策规划算法的完整解析,一路从规划模块的入口OnLanePlanning,介绍到常见的规划器PublicRoadPlanner;接着介绍了在PublicRoadPlanner中如何通过类似有限状态机的ScenarioDispatch进行场景决策。之后又介绍了在每个场景Scenario中如何配置以及判断当前所处的stage,以及对于每个stage又是如何注册tasks来执行具体的规划任务。 现在回头来看,这个系列应该是目前全网最完整的apollo规划算法

自动驾驶Player的博客 1万+

P-1 _Apollo3.5:planning模块

模块概述 决策规划模块主要任务:根据导航信息以及车辆的当前状态,在有限的时间范围内,计算出一条合适的轨迹供车辆行驶。 车辆的全局行驶路线由Routing模块提供. 车辆的当前状态包括了:车辆的自身状态(姿态,速度,角速度等等),当前所处的位置,周边环境以及交通状态等等. Planning模块响应速度必须稳定可靠. 合适的轨迹有多个层次含义.轨迹不仅包括行驶路线,还要包括 每个时刻车辆的速度 加速度 方向转向等信息.转弯角度.也要考虑乘客体验. 模块架构 Apollo项目采用了模块化、适用于特定场景和整体

ymh博客 683

apollo自动驾驶进阶学习之:如何实现障碍物绕行及其参数调试

首先需要理解Planning模块是基于Scenario、Stage、Task这样的层次来进行的,即场景->步骤->具体的决策方法。Apollo可以应对自动驾驶所面临的不同道路场景,都是通过Scenario统一注册与管理。Scenario通过一个有限状态机来判断选择当前行车场景,每个Scenario下又有多个Stage,指当前场景下需要执行的粗略步骤。...

qq_41593516的博客 6068

planning模块(12)-路径规划后构建速度规划所用的数据

上一篇已经详细介绍过piecewise jerk path optimizer算法优化后,得到自车沿参考线方向上的优化后的ll′l′′。

让复杂的问题变得更容易理解 113

Apollo Planning学习(1)-------模块流程

记录自己学习,也方便后面回忆

m0_71477431的博客 1538

奥比中光Dabai深度相机SDK在Ubuntu22.04的兼容性安装指南

本文详细指导如何在Ubuntu22.04系统上安装奥比中光Dabai深度相机的SDK。针对新旧版本不兼容的核心问题,重点推荐使用经过验证的v1.10.18版本SDK,并提供了从系统依赖检查、SDK下载安装、Python环境配置到编译测试的完整步骤,帮助用户成功解决安装难题并实现相机驱动。

j2k3l4的博客 1000

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

apollo planning ConstraintChecker1d类代码详解

weixin_39199083的博客 504

【HDL系列】除法器(3)——基2 SRT算法

目录 一、除法表示 二、数字递归算法基础公式 三、QDS(Quotient Digit Selection)函数 四、基2 SRT算法 一、除法表示 除法被定义如下: 其中,x是被除数,d是除数,q是商,rem是余数。 商的精度由ulp(unit of last position)来决定: 如果ulp=1, 商q则是整数; 如果ulp=r^(-n),n是商数个数,r是所有输入操作数的基,此时商为小数。 二、数字递归算法基础公式 在使用数字递归算法(Digit Re...

纸上谈芯的专栏 8155

ZEMAX学习第7天-手机镜头光学系统设计全过程案例

接下来对系统微调,依次缩小CRA和畸变,首先对CRA进行依次递减(39°、38°、37°、36°、35°),目前CRA角度40度,每次下降一度进行优化,利用MAXX加OPLT一起控制,控制小于35°。可以看出在标注的三个地方镜头曲率变化,导致PY=1的光线走向奇特,因此需要对矢高进行调整,按照标注的地方依次调整(从右到左)至传函变好,越靠近右边对其余视场影响越小。3.圆锥系数值较大,透镜形状怪异;一、第1,3镜子偏厚,第4镜子偏薄,45镜子间隔边缘偏小,第5片镜子中心厚度与边缘厚度相差较大,需要控制;

liningliwei的博客 1067

百度apollo planning代码学习-Apollo\modules\planning\lattice\trajectory_generation\LatticeTrajectory1d类详解

LatticeTrajectory1d类代码详解

weixin_39199083的博客 517

TensorRT的安装:一步一步教会你如何安装TensorRT

TensorRT(Tensor Runtime)是由NVIDIA开发的一个用于深度学习推理(inference)优化的库,它可以在NVIDIA的GPU上加速神经网络模型的推理过程,从而提高模型的性能和效率。安装完成后,需要将CUDA的安装路径添加到系统环境变量中,以便系统能够找到CUDA的库文件。根据你安装的CUDA版本,将CUDNN的库文件复制到CUDA的安装目录中。要使用TensorRT,首先需要安装NVIDIA的CUDA和cuDNN库,并根据NVIDIA官方文档安装TensorRT。

Science prince的博客 2372

百度apollo planning代码学习-Apollo\modules\planning\math\curve1d\QuinticSpiralPathWithDerivation类代码详解

apollo planning QuinticSpiralPathWithDerivation类代码详解

weixin_39199083的博客 484

Autosar诊断实战系列07-Dcm之0x19 06扩展数据配置及工程问题讨论

19 06扩展数据如何配置?如果某DTC没有出现过故障扩展数据该如何响应?

initiallizer的博客 1704

文末含资料链接和视频讲解!YOLOv8+RepVGG+QueryDet小目标检测终极指南:从理论到实战,突破遥感图像检测难题

QueryDet(Query Detection)机制代表了目标检测领域的一个重要范式转变。传统的目标检测方法基于anchor或anchor-free的密集预测,需要为图像中的每个可能位置生成预测。而QueryDet采用了稀疏查询的方式,通过少量的可学习查询向量来直接预测目标。 这种设计灵感来源于Transformer架构中的注意力机制。在自然语言处理中,Transformer通过query-key-value机制实现了高效的序列建模。QueryDet将这一思想引入到目标检测中,将检测问题转化为查询匹配问

FJN110的博客 384

Apollo介绍

定位 Localization:RTK GPS + IMU 感知 Perception:识别障碍物,车道线,交通灯等各种信息的模块 预测 Prediction:基于感知信息进行预测 决策 Decision:无人车系统最高层的决策系统,它的作用是基于现有的信息来判断下一步动作 规划 Planning:一般意义上的全局规划器,用途是找到可行路径,一般会采用各种各样的花式规划算法

hkok123的专栏 1956

Visual Studio Code + MCP Server + Claude Code 三件套进行 ABAP 开发

本文介绍了如何在Visual Studio Code中利用Claude Code和SAP官方提供的MCP Server进行ABAP开发。作者分享了19年ABAP开发经验,从手动编码到如今通过自然语言生成高质量代码的技术演进。详细说明了配置步骤:启用ADT MCP Server、安装Claude Code扩展、配置.claude.json文件,并验证MCP Server的14个功能。通过实例演示了如何用自然语言指令让Claude Code创建包含冒泡排序实现和单元测试的ABAP类,展示了MCP Server在

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1296

Apollo自动驾驶规划:AABB与OBB包围盒碰撞检测源码解析与实践

在自动驾驶、机器人等实时系统中,碰撞检测是保障运动安全的核心基础技术。其核心原理是快速判断两个或多个几何物体是否发生空间干涉。为了平衡计算效率与检测精度,业界普遍采用分层检测策略:先使用计算简单的包围盒进行快速筛选,再对潜在碰撞对象进行精确的几何计算。其中,轴对齐包围盒(AABB)凭借其极快的相交测试速度,常作为第一层“海选”过滤器;而有向包围盒(OBB)则因其能紧密贴合物体轮廓,显著减少误报,适用于更精确的碰撞判断。这种AABB与OBB结合的混合策略,在Apollo自动驾驶平台的规划模块中得到了典型应用。

weixin_29061821的博客 324

微信支付接口「系统繁忙 SYSTEM_ERROR」/「文件不存在」报错分析与解决方案 接口开发实现SDK

微信支付的“平台证书模式”只有5年的有效期,过期后微信支付将不再签发新的平台证书,转而要求开发者使用“微信支付公钥”来处理敏感信息加密及回调签名验证。然而,由于以下几点原因,许多开发者在调用 获取平台证书。尽管微信支付在技术迭代上有其必要性,但报错设计过于不友好。诸如“系统繁忙”这样的提示很难直接关联到平台证书失效或公钥切换问题。这样的信息表达,开发者不仅看不懂,还需要花费大量时间分析排查,非常影响效率。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 779

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Apollo 中 Planning 模块的框架

这个还是挺复杂的!结合PPT和博客,进行梳理: Apollo3.5之后,引入Cyber和Scenario 需要了解Proto数据结构,以及模块配置 Cyber Planner PlannerDispatcher PlanningBase PlanningComponent Scenario、Stage、Task ScenarioManager TrafficRule ReferenceLineProvider pnc_map apollo介绍之planning模块(四) -

牛仔很忙 3931

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 最优控制理论
许菠萝
博客等级 码龄10年 263粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值