| 109 | } |
| 110 | |
| 111 | AnalyticalFunctions createGaussianWorld(grid_map::GridMap *map) |
| 112 | { |
| 113 | |
| 114 | struct Gaussian |
| 115 | { |
| 116 | double x0, y0; |
| 117 | double varX, varY; |
| 118 | double s; |
| 119 | }; |
| 120 | |
| 121 | AnalyticalFunctions func; |
| 122 | constexpr int numGaussians = 7; |
| 123 | std::array<std::pair<double, double>, numGaussians> vars = { { { 1.0, 0.3 }, { 0.25, 0.25 }, { |
| 124 | 0.1, 0.1 }, { 0.1, 0.1 }, { 0.1, 0.1 }, { 0.1, 0.05 }, { 0.05, 0.05 } } }; |
| 125 | std::array<std::pair<double, double>, numGaussians> means = { { { 1, -1 }, { 1, 1.7 }, |
| 126 | { -1, 1.6 }, { -1.8, -1.8 }, { -1, 1.8 }, { 0, 0 }, { -1.2, 0 } } }; |
| 127 | std::array<double, numGaussians> scales = { -2.0, -1.0, 2.0, 1.0, 3.0, 4.0, 1.0 }; |
| 128 | |
| 129 | std::array<Gaussian, numGaussians> g; |
| 130 | |
| 131 | for (int i = 0; i < numGaussians; ++i) { |
| 132 | g.at(i).x0 = means.at(i).first; |
| 133 | g.at(i).y0 = means.at(i).second; |
| 134 | g.at(i).varX = vars.at(i).first; |
| 135 | g.at(i).varY = vars.at(i).second; |
| 136 | g.at(i).s = scales.at(i); |
| 137 | } |
| 138 | |
| 139 | func.f_ = [g](double x,double y) { |
| 140 | double value = 0.0; |
| 141 | for (int i = 0; i < g.size(); ++i) { |
| 142 | const double x0 = g.at(i).x0; |
| 143 | const double y0 = g.at(i).y0; |
| 144 | const double varX = g.at(i).varX; |
| 145 | const double varY = g.at(i).varY; |
| 146 | const double s = g.at(i).s; |
| 147 | value += s * std::exp(-(x-x0)*(x-x0) / (2.0*varX) - (y-y0)*(y-y0) / (2.0 * varY)); |
| 148 | } |
| 149 | |
| 150 | return value; |
| 151 | }; |
| 152 | |
| 153 | fillGridMap(map, func); |
| 154 | |
| 155 | return func; |
| 156 | } |
| 157 | |
| 158 | void fillGridMap(grid_map::GridMap *map, const AnalyticalFunctions &functions) |
| 159 | { |
no test coverage detected