| 122 | } |
| 123 | |
| 124 | AnalyticalFunctions createGaussianWorld(grid_map::GridMap *map) |
| 125 | { |
| 126 | |
| 127 | struct Gaussian |
| 128 | { |
| 129 | double x0, y0; |
| 130 | double varX, varY; |
| 131 | double s; |
| 132 | }; |
| 133 | |
| 134 | AnalyticalFunctions func; |
| 135 | |
| 136 | std::uniform_real_distribution<double> var(0.1, 3.0); |
| 137 | std::uniform_real_distribution<double> mean(-4.0, 4.0); |
| 138 | std::uniform_real_distribution<double> scale(-3.0, 3.0); |
| 139 | constexpr int numGaussians = 3; |
| 140 | std::array<Gaussian, numGaussians> g; |
| 141 | |
| 142 | for (int i = 0; i < numGaussians; ++i) { |
| 143 | g.at(i).x0 = mean(rndGenerator); |
| 144 | g.at(i).y0 = mean(rndGenerator); |
| 145 | g.at(i).varX = var(rndGenerator); |
| 146 | g.at(i).varY = var(rndGenerator); |
| 147 | g.at(i).s = scale(rndGenerator); |
| 148 | } |
| 149 | |
| 150 | func.f_ = [g](double x,double y) { |
| 151 | double value = 0.0; |
| 152 | for (int i = 0; i < g.size(); ++i) { |
| 153 | const double x0 = g.at(i).x0; |
| 154 | const double y0 = g.at(i).y0; |
| 155 | const double varX = g.at(i).varX; |
| 156 | const double varY = g.at(i).varY; |
| 157 | const double s = g.at(i).s; |
| 158 | value += s * std::exp(-(x-x0)*(x-x0) / (2.0*varX) - (y-y0)*(y-y0) / (2.0 * varY)); |
| 159 | } |
| 160 | |
| 161 | return value; |
| 162 | }; |
| 163 | |
| 164 | fillGridMap(map, func); |
| 165 | |
| 166 | return func; |
| 167 | } |
| 168 | |
| 169 | void fillGridMap(grid_map::GridMap *map, const AnalyticalFunctions &functions) |
| 170 | { |
no test coverage detected