5 using namespace frame_helper;
8 : QFrame(parent), scaleX(1), scaleY(1), range(5), changedSize(true), changedSectorScan(false), isMultibeamSonar(true), continuous(true), enabledGrid(true)
18 QPalette Pal(palette());
19 Pal.setColor(QPalette::Background, QColor(0,0,255));
20 setAutoFillBackground(
true);
31 if (!sonar.beam_count || !sonar.bin_count)
40 || sonar.beam_count !=
lastSonar.beam_count
41 || !(sonar.bearings[0] ==
lastSonar.bearings[0])
42 || !((sonar.bearings[1] - sonar.bearings[0]) == (
lastSonar.bearings[1] -
lastSonar.bearings[0]))) {
84 base::Angle diffStep = bearing -
lastSonar.bearings[0];
85 diffStep.rad = fabs(diffStep.rad);
106 int id_beam = round((
numSteps - 1) * (sonar.bearings[0].rad + M_PI) / (2 * M_PI));
107 memcpy(&
sonarData[id_beam * sonar.bin_count], &sonar.bins[0], sonar.bin_count *
sizeof(
float));
115 QPainter painter(
this);
116 painter.setRenderHint(QPainter::Antialiasing,
true);
119 QImage img(width(), height(), QImage::Format_RGB888);
120 img.fill(QColor(0, 0, 255));
128 img.setPixel(i % width(), i / width(), qRgb(c.red(), c.green(), c.blue()));
132 painter.drawImage(0, 0, img);
152 QWidget::resizeEvent (event);
157 QPainter painter(
this);
158 painter.setRenderHint(QPainter::Antialiasing,
true);
161 for(
size_t i = 0; i < 256; i++) {
163 painter.drawRect(width() - 30,height() - 10 -i * 2, 20, 2);
170 painter.setPen(QPen(Qt::white));
177 for(
int i=1;i<=5;i++){
178 painter.drawArc(
origin.x() - i *
scaleX * 100,
origin.y() - i *
scaleY * 100, i * 200 *
scaleX, i * 200 *
scaleY, (90 - sectorSize.getDeg() / 2) * 16, sectorSize.getDeg() * 16);
179 QString str = QString::number(i *
range * 1.0 / 5);
180 int x =
origin.x() + i * 100 * scaleX * sin(sectorSize.rad / 2);
181 int y = height() - i * 100 * scaleY * cos(sectorSize.rad / 2);
182 painter.drawText(x,y-5,str);
186 painter.drawLine(
origin, point);
187 str = QString::number(ang.getDeg(),
'f', 1);
188 painter.drawText(point.x() - 10, point.y() - 10, str);
199 for (
int i = 1; i <= 5; ++i) {
200 int x = i * offsetX / 5;
201 int y = i * offsetY / 5;
202 painter.drawEllipse(
origin, x, y);
203 QString str_radius = QString::number(i *
range * 1.0 / 5);
204 painter.drawText(
origin.rx() + x + 2,
origin.ry() - 5, str_radius);
207 QString str = QString::number(
lastSonar.bearings[0].getDeg(),
'f', 1);
209 painter.setPen(QPen(Qt::green));
210 painter.drawLine(
origin, point);
211 painter.drawText(point.x() - 10, point.y() - 10, str);
216 painter.drawLine(
origin, point1);
217 painter.drawLine(
origin, point2);
242 if (this->continuous != continuous
243 || ((this->leftLimit.rad != leftLimit.rad || this->rightLimit.rad != rightLimit.rad) && !continuous))
258 float red, green, blue;
259 for (
int i = 0; i < 256; ++i) {
261 colorMap.push_back(QColor(red * 255, green * 255, blue * 255));
263 }
catch (
const std::out_of_range& e) {
264 std::cout << e.what() << std::endl;
274 origin.setY(height() - 30);
277 for (
int j = 0; j < height(); j++) {
279 for (
int i = 0; i < width(); i++) {
285 double radius = sqrt(point.x() * point.x() + point.y() * point.y());
286 double angle = atan2(point.x(), -point.y());
289 if (angle < sonar.bearings[0].rad || angle > sonar.bearings[sonar.beam_count - 1].rad || radius > sonar.bin_count || !radius || j >
origin.y())
294 while (angle < sonar.bearings[beam_idx].rad || angle >= sonar.bearings[beam_idx + 1].rad)
296 transfer.push_back(beam_idx * sonar.bin_count + radius);
312 origin.setY(height() / 2);
315 for (
int j = 0; j < height(); j++) {
316 for (
int i = 0; i < width(); i++) {
322 double radius = sqrt(point.x() * point.x() + point.y() * point.y());
325 if (radius > sonar.bin_count || !radius)
330 double angle = atan2(-point.x(), -point.y());
331 int idBeam = round((
numSteps - 1) * (angle + M_PI) / (2 * M_PI));
332 transfer.push_back(idBeam * sonar.bin_count + radius);
void applyColormap(ColorGradientType type)
void addScanningData(const base::samples::Sonar &sonar)
SonarPlot(QWidget *parent=0)
void generateScanningTransferTable(const base::samples::Sonar &sonar)
ColorGradient heatMapGradient
void setData(const base::samples::Sonar &sonar)
std::vector< float > sonarData
base::samples::Sonar lastSonar
void resizeEvent(QResizeEvent *event)
void paintEvent(QPaintEvent *event)
std::vector< QColor > colorMap
void generateMultibeamTransferTable(const base::samples::Sonar &sonar)
bool isMotorStepChanged(const base::Angle &bearing)
void setSectorScan(bool continuous, base::Angle leftLimit, base::Angle rightLimit)
void sonarPaletteChanged(int)
std::vector< int > transfer