提交 c5db6fb9 编写于 作者: L Liangliang Zhang 提交者: Aaron Xiao

Planning: fixed an inconsistent trajectory issue by using historical speed...

Planning: fixed an inconsistent trajectory issue by using historical speed data to estimate travel distance at each evaluate time. (#1833)
上级 89423cd4
...@@ -48,6 +48,8 @@ class SpeedData { ...@@ -48,6 +48,8 @@ class SpeedData {
double TotalTime() const; double TotalTime() const;
bool Empty() const { return speed_vector_.empty(); }
void Clear(); void Clear();
virtual std::string DebugString() const; virtual std::string DebugString() const;
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <utility> #include <utility>
#include "modules/common/log.h" #include "modules/common/log.h"
#include "modules/planning/common/frame.h"
#include "modules/planning/common/planning_gflags.h" #include "modules/planning/common/planning_gflags.h"
namespace apollo { namespace apollo {
...@@ -35,6 +36,7 @@ using apollo::common::ErrorCode; ...@@ -35,6 +36,7 @@ using apollo::common::ErrorCode;
using apollo::common::Status; using apollo::common::Status;
using apollo::common::VehicleParam; using apollo::common::VehicleParam;
using apollo::planning_internal::STGraphDebug; using apollo::planning_internal::STGraphDebug;
using apollo::common::SpeedPoint;
QpSplineStGraph::QpSplineStGraph(Spline1dGenerator* spline_generator, QpSplineStGraph::QpSplineStGraph(Spline1dGenerator* spline_generator,
const QpStSpeedConfig& qp_st_speed_config, const QpStSpeedConfig& qp_st_speed_config,
...@@ -452,6 +454,21 @@ Status QpSplineStGraph::GetSConstraintByTime( ...@@ -452,6 +454,21 @@ Status QpSplineStGraph::GetSConstraintByTime(
return Status::OK(); return Status::OK();
} }
const SpeedData QpSplineStGraph::GetHistorySpeed() const {
const auto* last_frame = FrameHistory::instance()->Latest();
if (!last_frame) {
AWARN << "last frame is empty";
return SpeedData();
}
const ReferenceLineInfo* last_reference_line_info =
last_frame->DriveReferenceLineInfo();
if (!last_reference_line_info) {
ADEBUG << "last reference line info is empty";
return SpeedData();
}
return last_reference_line_info->speed_data();
}
Status QpSplineStGraph::EstimateSpeedUpperBound( Status QpSplineStGraph::EstimateSpeedUpperBound(
const common::TrajectoryPoint& init_point, const SpeedLimit& speed_limit, const common::TrajectoryPoint& init_point, const SpeedLimit& speed_limit,
std::vector<double>* speed_upper_bound) const { std::vector<double>* speed_upper_bound) const {
...@@ -463,6 +480,7 @@ Status QpSplineStGraph::EstimateSpeedUpperBound( ...@@ -463,6 +480,7 @@ Status QpSplineStGraph::EstimateSpeedUpperBound(
// processing. We can do the following process multiple times and use // processing. We can do the following process multiple times and use
// previous cycle's results for better estimation. // previous cycle's results for better estimation.
const double v = init_point.v(); const double v = init_point.v();
auto last_speed_data = GetHistorySpeed();
if (static_cast<double>(t_evaluated_.size() + if (static_cast<double>(t_evaluated_.size() +
speed_limit.speed_limit_points().size()) < speed_limit.speed_limit_points().size()) <
...@@ -473,7 +491,12 @@ Status QpSplineStGraph::EstimateSpeedUpperBound( ...@@ -473,7 +491,12 @@ Status QpSplineStGraph::EstimateSpeedUpperBound(
const double kDistanceEpsilon = 1e-6; const double kDistanceEpsilon = 1e-6;
while (i < t_evaluated_.size() && while (i < t_evaluated_.size() &&
j + 1 < speed_limit.speed_limit_points().size()) { j + 1 < speed_limit.speed_limit_points().size()) {
const double distance = v * t_evaluated_[i]; double distance = v * t_evaluated_[i];
if (!last_speed_data.Empty()) {
SpeedPoint p;
last_speed_data.EvaluateByTime(t_evaluated_[i], &p);
distance = p.s();
}
if (fabs(distance - speed_limit.speed_limit_points()[j].first) < if (fabs(distance - speed_limit.speed_limit_points()[j].first) <
kDistanceEpsilon) { kDistanceEpsilon) {
speed_upper_bound->push_back( speed_upper_bound->push_back(
...@@ -502,7 +525,12 @@ Status QpSplineStGraph::EstimateSpeedUpperBound( ...@@ -502,7 +525,12 @@ Status QpSplineStGraph::EstimateSpeedUpperBound(
const auto& speed_limit_points = speed_limit.speed_limit_points(); const auto& speed_limit_points = speed_limit.speed_limit_points();
for (const double t : t_evaluated_) { for (const double t : t_evaluated_) {
const double s = v * t; double s = v * t;
if (!last_speed_data.Empty()) {
SpeedPoint p;
last_speed_data.EvaluateByTime(t, &p);
s = p.s();
}
// NOTICE: we are using binary search here based on two assumptions: // NOTICE: we are using binary search here based on two assumptions:
// (1) The s in speed_limit_points increase monotonically. // (1) The s in speed_limit_points increase monotonically.
......
...@@ -84,6 +84,7 @@ class QpSplineStGraph { ...@@ -84,6 +84,7 @@ class QpSplineStGraph {
common::Status AddFollowReferenceLineKernel( common::Status AddFollowReferenceLineKernel(
const std::vector<const StBoundary*>& boundaries, const double weight); const std::vector<const StBoundary*>& boundaries, const double weight);
const SpeedData GetHistorySpeed() const;
common::Status EstimateSpeedUpperBound( common::Status EstimateSpeedUpperBound(
const common::TrajectoryPoint& init_point, const SpeedLimit& speed_limit, const common::TrajectoryPoint& init_point, const SpeedLimit& speed_limit,
std::vector<double>* speed_upper_bound) const; std::vector<double>* speed_upper_bound) const;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册