apollo PlanOnReferenceLine函数

本文详细解读了Apollo8.0中的PlanOnReferenceLine函数,涉及判断参考线类型、路径速度融合、终点判断和轨迹有效性检查等步骤,展示了自动驾驶规划中的关键决策过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

提示:这里可以添加本文要记录的大概内容:

随着自动驾驶技术热,百度的开源工程apollo也更新到8.0版本,很多爱好者们也争相学习apollo工程。本文就从apollo8.0planning模块下的public_road_planner下边的lane_follow_stage.cc浅介绍PlanOnReferenceLine函数


提示:以下是本篇文章正文内容,下面案例可供参考

一、PlanOnReferenceLine是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

        PlanOnReferenceLine是一个决策规划函数,该函数在已知参考线的情况下,在参考线附近生成一条局部轨迹。

二、本层函数内容

1.判断参考线是否是变道参考线

代码如下(示例):

  if (!reference_line_info->IsChangeLanePath()) {
    reference_line_info->AddCost(kStraightForwardLineCost);
  }

该参考线不是变道参考线的情况下,为该参考线增加直行线代价

2.循环执行任务

代码如下(示例):

  auto ret = Status::OK();
  for (auto* task : task_list_) {
    const double start_timestamp = Clock::NowInSeconds();

    ret = task->Execute(frame, reference_line_info);

    const double end_timestamp = Clock::NowInSeconds();
    const double time_diff_ms = (end_timestamp - start_timestamp) * 1000;
    ADEBUG << "after task[" << task->Name()
           << "]:" << reference_line_info->PathSpeedDebugString();
    ADEBUG << task->Name() << " time spend: " << time_diff_ms << " ms.";
    RecordDebugInfo(reference_line_info, task->Name(), time_diff_ms);

    if (!ret.ok()) {
      AERROR << "Failed to run tasks[" << task->Name()
             << "], Error message: " << ret.error_message();
      break;
    }

    // TODO(SHU): disable reference line order changes for now
    // updated reference_line_info, because it is changed in
    // lane_change_decider by PrioritizeChangeLane().
    // reference_line_info = &frame->mutable_reference_line_info()->front();
    // ADEBUG << "Current reference_line_info is IsChangeLanePath: "
    //        << reference_line_info->IsChangeLanePath();
  }

任务的输入为frame,和reference_line_info。frame是一帧规划中所需要的信息集合,reference_line_info是该参考线的相关信息,内容包含决策类信息,和轨迹信息的存放。这两个变量由apollo规划模块重要的两个类定义而成,这篇文章中暂时不做展开介绍,

3.路径速度融合

代码如下(示例):

  DiscretizedTrajectory trajectory;
  if (!reference_line_info->CombinePathAndSpeedProfile(
          planning_start_point.relative_time(),
          planning_start_point.path_point().s(), &trajectory)) {
    const std::string msg = "Fail to aggregate planning trajectory.";
    AERROR << msg;
    return Status(ErrorCode::PLANNING_ERROR, msg);
  }

路径速度融合的输入是规划起点的相对时间,规划起点的s弧长。输出是离散轨迹。

4.终点判断

代码如下(示例):

  double dest_stop_s = -1.0;
  for (const auto* obstacle :
       reference_line_info->path_decision()->obstacles().Items()) {
    if (obstacle->LongitudinalDecision().has_stop() &&
        obstacle->LongitudinalDecision().stop().reason_code() ==
            STOP_REASON_DESTINATION) {
      SLPoint dest_sl = GetStopSL(obstacle->LongitudinalDecision().stop(),
                                  reference_line_info->reference_line());
      dest_stop_s = dest_sl.s();
    }
  }

  for (const auto* obstacle :
       reference_line_info->path_decision()->obstacles().Items()) {
    if (obstacle->IsVirtual()) {
      continue;
    }
    if (!obstacle->IsStatic()) {
      continue;
    }
    if (obstacle->LongitudinalDecision().has_stop()) {
      bool add_stop_obstacle_cost = false;
      if (dest_stop_s < 0.0) {
        add_stop_obstacle_cost = true;
      } else {
        SLPoint stop_sl = GetStopSL(obstacle->LongitudinalDecision().stop(),
                                    reference_line_info->reference_line());
        if (stop_sl.s() < dest_stop_s) {
          add_stop_obstacle_cost = true;
        }
      }
      if (add_stop_obstacle_cost) {
        static constexpr double kReferenceLineStaticObsCost = 1e3;
        reference_line_info->AddCost(kReferenceLineStaticObsCost);
      }
    }
  }

判断参考线上是否包含目的地。若有静止的障碍物,在对应参考线的代价上加上静止障碍物代价

5.轨迹有效性检查

代码如下(示例):

  if (FLAGS_enable_trajectory_check) {
    if (ConstraintChecker::ValidTrajectory(trajectory) !=
        ConstraintChecker::Result::VALID) {
      const std::string msg = "Current planning trajectory is not valid.";
      AERROR << msg;
      return Status(ErrorCode::PLANNING_ERROR, msg);
    }
  }

不解释

6.赋值轨迹

代码如下(示例):

  reference_line_info->SetTrajectory(trajectory);
  reference_line_info->SetDrivable(true);
  return Status::OK();

将规划的路径赋值到参考线信息内部,并标记该参考线可行驶


总结

以上就是这篇介绍的内容,本文简单介绍了planonreferenceline函数的作用。从代码中可以看出,plaoonreferenceline函数执行过后,本次规划的轨迹已经存放在了reference_line_info当中。随程序流,轨迹将被reference_line_info带出本函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值