rock_widget_collection  0.1
SonarView.cc
Go to the documentation of this file.
1 /*
2  * File: SonarViewGL.cc
3  * Author: Matthias Goldhoorn (matthias.goldhoorn@dfki.de)
4  *
5  */
6 
7 #include <stdexcept>
8 #include "SonarView.h"
9 #include "SonarViewGL.h"
10 #include <QtCore/QtPlugin>
11 #include "SonarViewGL.h"
12 
13 SonarView::SonarView(QWidget *parent,bool use_openGL):
14 ImageViewOld(parent,false),
15 img(10, 10, QImage::Format_RGB888)
16 {
17  resize(width(),height());
18  image_view_gl = 0;
19  use_openGL=false;
20  setOpenGL(use_openGL);
21  lastScale=0;
22 
23 }
24 
25 
27 {
28 }
29 
30 void SonarView::setOpenGL(bool flag)
31 {
32  if(flag)
33  {
34  //prevent activating if it is already activated
35  if(image_view_gl)
36  return;
37 
38  image_view_gl = new SonarViewGL(*this);
39  if (!image_view_gl)
40  return;
41  image_view_gl->resize(width(),height());
42  //image_view_gl->setAspectRatio(aspect_ratio);
43  image_view_gl->show();
44  //SonarViewGL *window = dynamic_cast<SonarViewGL*>(image_view_gl);
45  //window->reset(0.024); //TODO hardcoded value
46  }
47  else
48  {
49  delete image_view_gl;
50  image_view_gl = NULL;
51  }
52 
53 }
54 
55 void SonarView::setDistance(double distance, double angle){
56  SonarViewGL *window = dynamic_cast<SonarViewGL*>(image_view_gl);
57  double bearing = angle/(M_PI*2.0)*6399.0;
58  if(window){
59  window->setWallDist(bearing,distance,0);
60  }else{
61  //printf("scale: %f, distance: %f\n",lastScale,distance);
62  paintReference(angle,distance/lastScale);
63  }
64 }
65 
66 void SonarView::setSonarScan(const char *data_, int size, double angle, double timeBetweenBins,bool fromBearing){
67  SonarViewGL *window = dynamic_cast<SonarViewGL*>(image_view_gl);
68  double bearing = angle;
69  double newScale = ((timeBetweenBins*640.0)*1e-9);
70  if(!fromBearing){
71  bearing = angle/(M_PI*2.0)*6399.0;
72  newScale = timeBetweenBins*size/2.0;
73  }
74  newScale = (newScale*1500.0)/size;
75 
76  if(window){
77  if(newScale != lastScale){
78  lastScale = newScale;
79  printf("new Scale: %f\n",newScale);
80  window->reset(newScale);
81  }
82 
83  std::vector<uint8_t> data;
84  for(int i=0;i<size;i++){
85  data.push_back(data_[i]);
86  }
87  window->setData(data,bearing);
88  }else{
89  lastScale = newScale;
90  if(img.size().width() != size*2.0){
91  //img = QImage(size*2.0,size*2.0,QImage::Format_Mono);
92  img = QImage(size*2.0,size*2.0,QImage::Format_RGB888);
93  img.fill(0);
94  printf("Creating new Image with: %i,%i\n",img.size().width(),img.size().height());
95  }
96  int begin,end;
97  if(lastBearing-bearing>0 || lastBearing-bearing < -3000){
98  begin = lastBearing;
99  end = lastBearing-bearing;
100  }else{
101  begin = bearing;
102  end = bearing-lastBearing;
103  }
104 
105  for(int j=0;j<end;j++){
106  int i = ((begin+j));
107  if(i < 0 || i > 6399){
108  break;
109  }
110  paintLine(((double)i)/6399*2.0*M_PI,(const uint8_t*)data_,(size_t)size);
111  }
112  }
113  lastBearing = bearing;
114  addImage(img);
115  resize(width(),height());
116  //ImageView::update();
117 }
118 
119 void SonarView::paintReference(double bearing, int distance){
120  if(distance > img.size().width()){
121  return;
122  }
123  QPainter painter(&img);
124  double s = sin(bearing);
125  double c = cos(bearing);
126  int x = (img.size().width()/2.0)+(c*distance);
127  int y = (img.size().width()/2.0)+(s*distance);
128 
129  painter.setPen(QColor(255,255,0));
130  painter.drawEllipse(QPoint(x,y),5,5);
131  addImage(img);
132  //painter.drawPoint(x,y);
133 }
134 
135 void SonarView::paintPos(int posX, int posY, int sizeX, int sizeY){
136  QPainter painter(&img);
137  painter.setPen(QColor(255,0,0));
138  painter.drawEllipse(QPoint(posX,posY),sizeX,sizeY);
139  addImage(img);
140 }
141 
142 void SonarView::paintLine(double bearing, const uint8_t *data, size_t len){
143  double s = sin(bearing);
144  double c = cos(bearing);
145  for (size_t i = 0; i < len; i++)
146  img.setPixel((len) + (c * i), (len) + (s * i), qRgb(data[i], data[i], data[i]));
147 }
148 
149 
150 void SonarView::keyPressEvent ( QKeyEvent * event ){
151  SonarViewGL *window = dynamic_cast<SonarViewGL*>(image_view_gl);
152  if(window) window->keyPressEvent(event);
153 }
154 
155 
156 void SonarView::setPosition(double posX, double posY, double sigmaX, double sigmaY){
157  SonarViewGL *window = dynamic_cast<SonarViewGL*>(image_view_gl);
158  if(window)window->setPosition(posX,posY,sigmaX,sigmaY);
159 }
160 
161 void SonarView::setOrientation(const double orientation){
162  SonarViewGL *window = dynamic_cast<SonarViewGL*>(image_view_gl);
163  if(window)window->setOrientation(orientation);
164 }
165 
166 
167 void SonarView::paintEvent(QPaintEvent *event)
168 {
169  QPainter painter(this);
170  painter.drawImage(0, 0, img);
171 }
172 
173 /*
174 void SonarView::resizeEvent ( QResizeEvent * event )
175 {
176  ImageView::resizeEvent(event);
177  int x_offset = 0;
178  int y_offset = 0;
179  if(aspect_ratio)
180  {
181  float x =1;
182  float y =1;
183  if (image.width() && image.height())
184  {
185  x = ((float)width())/ image.width();
186  y = ((float)height())/ image.height();
187  }
188  if(x < y)
189  y_offset = 0.5f*(height()-x*image.height());
190  else
191  x_offset = 0.5f*(width()-y*image.width());
192  }
193  target.setRect(x_offset, y_offset, width()-x_offset*2, height()-y_offset*2);
194  source.setRect(0.0, 0.0, image.width(), image.height());
195 }
196 */
void setSonarScan(const char *data, int size, double angle, double timeBetweenBins, bool fromBearing=false)
Definition: SonarView.cc:66
void setOrientation(const double orientation)
Definition: SonarView.cc:161
void setWallDist(int bearing, int dist, int dist2)
Definition: SonarViewGL.cc:501
void setPosition(double posX, double posY, double sigmaX, double sigmaY)
Definition: SonarView.cc:156
void setOpenGL(bool flag)
Definition: SonarView.cc:30
void paintLine(double bearing, const uint8_t *data, size_t len)
Definition: SonarView.cc:142
void reset(double currentScale)
Definition: SonarViewGL.cc:74
int lastBearing
Definition: SonarView.h:34
SonarView(QWidget *parent=NULL, bool use_openGL=true)
Definition: SonarView.cc:13
double lastScale
Definition: SonarView.h:33
void setOrientation(const double orientation)
Definition: SonarViewGL.cc:738
void paintEvent(QPaintEvent *event)
Definition: SonarView.cc:167
void setDistance(double distance, double angle)
Definition: SonarView.cc:55
void paintPos(int posX, int posY, int sizeX=10, int sizeY=10)
Definition: SonarView.cc:135
ImageViewOldGL * image_view_gl
Definition: ImageViewOld.h:195
void addImage(const QImage &image)
bool event(QEvent *event)
Definition: MultiWidget.h:63
void paintReference(double bearing, int distance)
Definition: SonarView.cc:119
void keyPressEvent(QKeyEvent *event)
Definition: SonarViewGL.cc:606
void setData(const std::vector< uint8_t > data, int bearing)
Definition: SonarViewGL.cc:102
void setPosition(int xRot, int yRot, int zRot, int xMove, int yMove, int zMove, float zoom, int width, int height)
Definition: SonarViewGL.cc:592
void keyPressEvent(QKeyEvent *)
Definition: SonarView.cc:150
QImage img
Definition: SonarView.h:36
virtual ~SonarView()
Definition: SonarView.cc:26