range_data_collator_test.cc
Go to the documentation of this file.
00001 /*
00002  * Copyright 2018 The Cartographer Authors
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *      http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 
00017 #include "cartographer/mapping/internal/range_data_collator.h"
00018 
00019 #include "cartographer/common/time.h"
00020 #include "gmock/gmock.h"
00021 #include "gtest/gtest.h"
00022 
00023 namespace cartographer {
00024 namespace mapping {
00025 namespace {
00026 
00027 const int kNumSamples = 10;
00028 
00029 sensor::TimedPointCloudData CreateFakeRangeData(int from, int to) {
00030   double duration = common::ToSeconds(common::FromUniversal(to) -
00031                                       common::FromUniversal(from));
00032   sensor::TimedPointCloudData result{
00033       common::FromUniversal(to), Eigen::Vector3f(0., 1., 2.), {}};
00034   result.ranges.reserve(kNumSamples);
00035   for (int i = 0; i < kNumSamples; ++i) {
00036     double fraction = static_cast<double>(i) / (kNumSamples - 1);
00037     float relative_time = (1.f - fraction) * -duration;
00038     result.ranges.push_back({Eigen::Vector3f{1., 2., 3.}, relative_time});
00039   }
00040   return result;
00041 }
00042 
00043 bool ArePointTimestampsSorted(const sensor::TimedPointCloudOriginData& data) {
00044   std::vector<float> timestamps;
00045   timestamps.reserve(data.ranges.size());
00046   for (const auto& range : data.ranges) {
00047     timestamps.push_back(range.point_time.time);
00048   }
00049   return std::is_sorted(timestamps.begin(), timestamps.end());
00050 }
00051 
00052 TEST(RangeDataCollatorTest, SingleSensor) {
00053   const std::string sensor_id = "single_sensor";
00054   RangeDataCollator collator({sensor_id});
00055   auto output_0 =
00056       collator.AddRangeData(sensor_id, CreateFakeRangeData(200, 300));
00057   EXPECT_EQ(common::ToUniversal(output_0.time), 300);
00058   EXPECT_EQ(output_0.origins.size(), 1);
00059   EXPECT_EQ(output_0.ranges.size(), kNumSamples);
00060   EXPECT_TRUE(ArePointTimestampsSorted(output_0));
00061   auto output_1 =
00062       collator.AddRangeData(sensor_id, CreateFakeRangeData(300, 500));
00063   EXPECT_EQ(common::ToUniversal(output_1.time), 500);
00064   EXPECT_EQ(output_1.origins.size(), 1);
00065   ASSERT_EQ(output_1.ranges.size(), kNumSamples);
00066   EXPECT_TRUE(ArePointTimestampsSorted(output_1));
00067   EXPECT_NEAR(common::ToUniversal(
00068                   output_1.time +
00069                   common::FromSeconds(output_1.ranges[0].point_time.time)),
00070               300, 2);
00071   auto output_2 =
00072       collator.AddRangeData(sensor_id, CreateFakeRangeData(-1000, 510));
00073   EXPECT_EQ(common::ToUniversal(output_2.time), 510);
00074   EXPECT_EQ(output_2.origins.size(), 1);
00075   EXPECT_EQ(output_2.ranges.size(), 1);
00076   EXPECT_EQ(output_2.ranges[0].point_time.time, 0.f);
00077   EXPECT_TRUE(ArePointTimestampsSorted(output_2));
00078 }
00079 
00080 TEST(RangeDataCollatorTest, SingleSensorEmptyData) {
00081   const std::string sensor_id = "single_sensor";
00082   RangeDataCollator collator({sensor_id});
00083   sensor::TimedPointCloudData empty_data{common::FromUniversal(300)};
00084   auto output_0 = collator.AddRangeData(sensor_id, empty_data);
00085   EXPECT_EQ(output_0.time, empty_data.time);
00086   EXPECT_EQ(output_0.ranges.size(), empty_data.ranges.size());
00087   EXPECT_TRUE(ArePointTimestampsSorted(output_0));
00088   auto output_1 =
00089       collator.AddRangeData(sensor_id, CreateFakeRangeData(300, 500));
00090   EXPECT_EQ(common::ToUniversal(output_1.time), 500);
00091   EXPECT_EQ(output_1.origins.size(), 1);
00092   ASSERT_EQ(output_1.ranges.size(), kNumSamples);
00093   EXPECT_TRUE(ArePointTimestampsSorted(output_1));
00094   EXPECT_NEAR(common::ToUniversal(
00095                   output_1.time +
00096                   common::FromSeconds(output_1.ranges[0].point_time.time)),
00097               300, 2);
00098   auto output_2 =
00099       collator.AddRangeData(sensor_id, CreateFakeRangeData(-1000, 510));
00100   EXPECT_EQ(common::ToUniversal(output_2.time), 510);
00101   EXPECT_EQ(output_2.origins.size(), 1);
00102   EXPECT_EQ(output_2.ranges.size(), 1);
00103   EXPECT_EQ(output_2.ranges[0].point_time.time, 0.f);
00104   EXPECT_TRUE(ArePointTimestampsSorted(output_2));
00105 }
00106 
00107 TEST(RangeDataCollatorTest, TwoSensors) {
00108   const std::string sensor_0 = "sensor_0";
00109   const std::string sensor_1 = "sensor_1";
00110   RangeDataCollator collator({sensor_0, sensor_1});
00111   auto output_0 =
00112       collator.AddRangeData(sensor_0, CreateFakeRangeData(200, 300));
00113   EXPECT_EQ(output_0.ranges.size(), 0);
00114   auto output_1 =
00115       collator.AddRangeData(sensor_1, CreateFakeRangeData(-1000, 310));
00116   EXPECT_EQ(output_1.origins.size(), 2);
00117   EXPECT_EQ(common::ToUniversal(output_1.time), 300);
00118   ASSERT_EQ(output_1.ranges.size(), 2 * kNumSamples - 1);
00119   EXPECT_NEAR(common::ToUniversal(
00120                   output_1.time +
00121                   common::FromSeconds(output_1.ranges[0].point_time.time)),
00122               -1000, 2);
00123   EXPECT_EQ(output_1.ranges.back().point_time.time, 0.f);
00124   EXPECT_TRUE(ArePointTimestampsSorted(output_1));
00125   auto output_2 =
00126       collator.AddRangeData(sensor_0, CreateFakeRangeData(300, 500));
00127   EXPECT_EQ(output_2.origins.size(), 2);
00128   EXPECT_EQ(common::ToUniversal(output_2.time), 310);
00129   ASSERT_EQ(output_2.ranges.size(), 2);
00130   EXPECT_NEAR(common::ToUniversal(
00131                   output_2.time +
00132                   common::FromSeconds(output_2.ranges[0].point_time.time)),
00133               300, 2);
00134   EXPECT_EQ(output_2.ranges.back().point_time.time, 0.f);
00135   EXPECT_TRUE(ArePointTimestampsSorted(output_2));
00136   // Sending the same sensor will flush everything before.
00137   auto output_3 =
00138       collator.AddRangeData(sensor_0, CreateFakeRangeData(600, 700));
00139   EXPECT_EQ(common::ToUniversal(output_3.time), 500);
00140   EXPECT_EQ(
00141       output_1.ranges.size() + output_2.ranges.size() + output_3.ranges.size(),
00142       3 * kNumSamples);
00143   EXPECT_EQ(output_3.ranges.back().point_time.time, 0.f);
00144   EXPECT_TRUE(ArePointTimestampsSorted(output_3));
00145 }
00146 
00147 TEST(RangeDataCollatorTest, ThreeSensors) {
00148   const std::string sensor_0 = "sensor_0";
00149   const std::string sensor_1 = "sensor_1";
00150   const std::string sensor_2 = "sensor_2";
00151   RangeDataCollator collator({sensor_0, sensor_1, sensor_2});
00152   auto output_0 =
00153       collator.AddRangeData(sensor_0, CreateFakeRangeData(100, 200));
00154   EXPECT_EQ(output_0.ranges.size(), 0);
00155   auto output_1 =
00156       collator.AddRangeData(sensor_1, CreateFakeRangeData(199, 250));
00157   EXPECT_EQ(output_1.ranges.size(), 0);
00158   auto output_2 =
00159       collator.AddRangeData(sensor_2, CreateFakeRangeData(210, 300));
00160   EXPECT_EQ(output_2.ranges.size(), kNumSamples + 1);
00161   EXPECT_TRUE(ArePointTimestampsSorted(output_2));
00162   auto output_3 =
00163       collator.AddRangeData(sensor_2, CreateFakeRangeData(400, 500));
00164   EXPECT_EQ(output_2.ranges.size() + output_3.ranges.size(), 3 * kNumSamples);
00165   EXPECT_TRUE(ArePointTimestampsSorted(output_3));
00166 }
00167 
00168 }  // namespace
00169 }  // namespace mapping
00170 }  // namespace cartographer


cartographer
Author(s): The Cartographer Authors
autogenerated on Thu May 9 2019 02:27:35