119 QComboBox* deviceBox = widget->deviceComboBox;
121 std::unique_lock lock(scanMutex);
122 for (
auto& pair : scans)
124 QString deviceName(QString::fromStdString(pair.first.c_str()));
125 if (deviceBox->findText(deviceName) < 0)
127 deviceBox->addItem(deviceName);
131 std::string deviceName(deviceBox->currentText().toUtf8().data());
132 float stepSize = 0.25f;
133 for (LaserScannerInfo
const& scanner : laserScanners)
135 if (scanner.device == deviceName)
137 stepSize = scanner.stepSize;
141 QGraphicsView* view = widget->graphicsView;
143 scene.reset(
new QGraphicsScene());
144 widget->graphicsView->setScene(scene.get());
145 int outerR = std::min(view->width() / 2, view->height() / 2);
146 scene->addEllipse(-outerR, -outerR, 2 * outerR, 2 * outerR, QPen(QColor(255, 255, 255)));
149 QColor stepColor(QColor::fromRgb(100, 100, 255));
150 QPen stepPen(stepColor);
151 QBrush stepBrush(stepColor);
152 auto line = [&](
float angle,
float d)
155 QGraphicsEllipseItem* item =
156 scene->addEllipse(-di, -di, 2 * di, 2 * di, stepPen, stepBrush);
158 item->setStartAngle(std::round(16.0f *
angle * 180.0 /
M_PI) + 90 * 16);
159 item->setSpanAngle(std::round(stepSize * 16.0f * 180.0 /
M_PI));
162 LaserScan& scan = scans[deviceName];
163 float maxDistance = 1000.0f;
164 for (LaserScanStep& step : scan)
166 if (step.distance > maxDistance)
168 maxDistance = step.distance;
171 float ringDistance = 1000.0f;
172 int numberOfRings = (std::size_t)std::ceil(maxDistance / ringDistance);
173 std::deque<int>& history = numberOfRingsHistory[deviceName];
174 history.push_back(numberOfRings);
175 if (history.size() > 256)
179 int maxNumberOfRings = *std::max_element(history.begin(), history.end());
180 float outerRadius = maxNumberOfRings * ringDistance;
182 for (LaserScanStep& step : scan)
184 line(step.angle, step.distance / outerRadius);
187 for (
int ringIndex = 1; ringIndex <= maxNumberOfRings; ++ringIndex)
189 float ri = 1.0f * ringIndex / maxNumberOfRings * r;
190 scene->addEllipse(-ri, -ri, 2 * ri, 2 * ri, QPen(QColor(200, 200, 200)));
193 view->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
203 std::string deviceName = widget->deviceComboBox->itemText(
index).toStdString();
204 for (LaserScannerInfo
const& scanner : laserScanners)
206 if (scanner.device == deviceName)
208 widget->frameLabel->setText(QString::fromStdString(scanner.frame));
209 widget->minAngleLabel->setText(QString::number(scanner.minAngle));
210 widget->maxAngleLabel->setText(QString::number(scanner.minAngle));
211 widget->stepSizeLabel->setText(QString::number(scanner.stepSize));