Apollo 11.0
自动驾驶开放平台
polynomial_xd.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2017 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
22
23#include "cyber/common/log.h"
24
25namespace apollo {
26namespace planning {
27
28PolynomialXd::PolynomialXd(const std::uint32_t order)
29 : params_(order + 1, 0.0) {
30 CHECK_GE(order, 0U);
31}
32
33PolynomialXd::PolynomialXd(const std::vector<double>& params)
34 : params_(params) {
35 ACHECK(!params.empty());
36}
37
38std::uint32_t PolynomialXd::order() const {
39 return static_cast<std::uint32_t>(params_.size()) - 1;
40}
41
42void PolynomialXd::SetParams(const std::vector<double>& params) {
43 ACHECK(!params.empty());
44 params_ = params;
45}
46
47const std::vector<double>& PolynomialXd::params() const { return params_; }
48
50 std::vector<double> params;
51 if (base.order() <= 0) {
52 params.clear();
53 } else {
54 params.resize(base.params().size() - 1);
55 for (std::uint32_t i = 1; i < base.order() + 1; ++i) {
56 params[i - 1] = base[i] * i;
57 }
58 }
59 return PolynomialXd(params);
60}
61
63 const double intercept) {
64 std::vector<double> params;
65 params.resize(base.params().size() + 1);
66 params[0] = intercept;
67 for (std::uint32_t i = 0; i < base.params().size(); ++i) {
68 params[i + 1] = base[i] / (i + 1);
69 }
70 return PolynomialXd(params);
71}
72
73double PolynomialXd::operator()(const double value) const {
74 double result = 0.0;
75 for (auto rit = params_.rbegin(); rit != params_.rend(); ++rit) {
76 result *= value;
77 result += (*rit);
78 }
79 return result;
80}
81
82double PolynomialXd::operator[](const std::uint32_t index) const {
83 if (index >= params_.size()) {
84 return 0.0;
85 } else {
86 return params_[index];
87 }
88}
89
90} // namespace planning
91} // namespace apollo
static PolynomialXd IntegratedFrom(const PolynomialXd &base, const double intercept=0.0)
static PolynomialXd DerivedFrom(const PolynomialXd &base)
std::uint32_t order() const
void SetParams(const std::vector< double > &params)
double operator()(const double value) const
const std::vector< double > & params() const
double operator[](const std::uint32_t index) const
Planning module main class.
#define ACHECK(cond)
Definition log.h:80
class register implement
Definition arena_queue.h:37