From c462dbb2693e7771a22c6132b6b15d76a2b5ad51 Mon Sep 17 00:00:00 2001 From: Zhang Liangliang Date: Tue, 10 Oct 2017 12:05:27 -0700 Subject: [PATCH] Planning: added 2d boundary test for spline_2d_constraint. --- modules/planning/math/smoothing_spline/BUILD | 12 ++ .../spline_2d_constraint_test.cc | 114 ++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 modules/planning/math/smoothing_spline/spline_2d_constraint_test.cc diff --git a/modules/planning/math/smoothing_spline/BUILD b/modules/planning/math/smoothing_spline/BUILD index 0adc83f24d..446683b854 100644 --- a/modules/planning/math/smoothing_spline/BUILD +++ b/modules/planning/math/smoothing_spline/BUILD @@ -320,4 +320,16 @@ cc_test( ], ) +cc_test( + name = "spline_2d_constraint_test", + size = "small", + srcs = [ + "spline_2d_constraint_test.cc", + ], + deps = [ + ":spline_2d_constraint", + "@gtest//:main", + ], +) + cpplint() diff --git a/modules/planning/math/smoothing_spline/spline_2d_constraint_test.cc b/modules/planning/math/smoothing_spline/spline_2d_constraint_test.cc new file mode 100644 index 0000000000..03fea71548 --- /dev/null +++ b/modules/planning/math/smoothing_spline/spline_2d_constraint_test.cc @@ -0,0 +1,114 @@ +/****************************************************************************** + * Copyright 2017 The Apollo Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +/** + * @file + **/ +#include "modules/planning/math/smoothing_spline/spline_2d_constraint.h" + +#include "glog/logging.h" +#include "gtest/gtest.h" + +namespace apollo { +namespace planning { + +using apollo::common::math::Vec2d; + +TEST(Spline2dConstraint, add_boundary_01) { + std::vector x_knots = {0.0, 1.0}; + int32_t spline_order = 4; + Spline2dConstraint constraint(x_knots, spline_order); + + std::vector t_coord = {0.0}; + std::vector angle = {0.0}; + std::vector ref_point; + ref_point.emplace_back(Vec2d(0.0, 0.0)); + std::vector longitidinal_bound = {1.0}; + std::vector lateral_bound = {2.0}; + + constraint.Add2dBoundary(t_coord, angle, ref_point, longitidinal_bound, + lateral_bound); + const auto mat = constraint.inequality_constraint().constraint_matrix(); + const auto boundary = + constraint.inequality_constraint().constraint_boundary(); + + // clang-format off + Eigen::MatrixXd ref_mat = Eigen::MatrixXd::Zero(4, 8); + ref_mat << + -0, -0, -0, -0, 1, 0, 0, 0, + 0, 0, 0, 0, -1, -0, -0, -0, + 1, 0, 0, 0, 6.12323e-17, 0, 0, 0, + -1, -0, -0, -0, -6.12323e-17, -0, -0, -0; + // clang-format on + + for (int i = 0; i < mat.rows(); ++i) { + for (int j = 0; j < mat.cols(); ++j) { + EXPECT_NEAR(mat(i, j), ref_mat(i, j), 1e-6); + } + } + + Eigen::MatrixXd ref_boundary = Eigen::MatrixXd::Zero(4, 1); + ref_boundary << -1.0, -1.0, -2.0, -2.0; + + for (int i = 0; i < ref_boundary.rows(); ++i) { + EXPECT_NEAR(boundary(i, 0), ref_boundary(i, 0), 1e-5); + } +} + +// test add boundary with non-zero angle +TEST(Spline2dConstraint, add_boundary_02) { + std::vector x_knots = {0.0, 1.0}; + int32_t spline_order = 4; + Spline2dConstraint constraint(x_knots, spline_order); + + std::vector t_coord = {0.0}; + std::vector angle = {0.2}; + std::vector ref_point; + ref_point.emplace_back(Vec2d(0.0, 0.0)); + std::vector longitidinal_bound = {1.0}; + std::vector lateral_bound = {2.0}; + + constraint.Add2dBoundary(t_coord, angle, ref_point, longitidinal_bound, + lateral_bound); + const auto mat = constraint.inequality_constraint().constraint_matrix(); + const auto boundary = + constraint.inequality_constraint().constraint_boundary(); + + // clang-format off + Eigen::MatrixXd ref_mat = Eigen::MatrixXd::Zero(4, 8); + ref_mat << + -0.198669, -0, -0, -0, 0.980067, 0, 0, 0, + 0.198669, 0, 0, 0, -0.980067, -0, -0, -0, + 0.980067, 0, 0, 0, 0.198669, 0, 0, 0, + -0.980067, -0, -0, -0, -0.198669, -0, -0, -0; + // clang-format on + + for (int i = 0; i < mat.rows(); ++i) { + for (int j = 0; j < mat.cols(); ++j) { + EXPECT_NEAR(mat(i, j), ref_mat(i, j), 1e-6); + } + } + + Eigen::MatrixXd ref_boundary = Eigen::MatrixXd::Zero(4, 1); + ref_boundary << -1.0, -1.0, -2.0, -2.0; + + for (int i = 0; i < ref_boundary.rows(); ++i) { + EXPECT_NEAR(boundary(i, 0), ref_boundary(i, 0), 1e-5); + } +} + +} // namespace planning +} // namespace apollo -- GitLab