00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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 }
00169 }
00170 }