4 #include <QtCore/QtPlugin>
6 #include <vtkPolyDataMapper.h>
8 #include <vtkImageViewer.h>
9 #include <vtkRenderer.h>
10 #include <vtkLookupTable.h>
11 #include <vtkCellData.h>
13 #include <vtkFieldData.h>
14 #include <vtkPolyData.h>
15 #include <vtkXYPlotActor.h>
16 #include <vtkStructuredGrid.h>
17 #include <vtkStructuredGridToPolyDataFilter.h>
18 #include <vtkStructuredGridGeometryFilter.h>
19 #include <vtkDataSetMapper.h>
20 #include <vtkStructuredPoints.h>
21 #include "vtkPointData.h"
22 #include "vtkPoints.h"
23 #include "vtkProperty.h"
24 #include <vtkPicker.h>
25 #include <vtkPropPicker.h>
26 #include "vtkCamera.h"
30 vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::SafeDownCast(caller);
31 vtkPropPicker *picker = vtkPropPicker::SafeDownCast(interactor->GetPicker());
32 if(picker->GetActor())
34 int id = p_sonar_display->
getActorID(picker->GetActor());
35 vtkStructuredGridGeometryFilter *filter = p_sonar_display->
getFilter(
id);
37 filter->GetExtent(extent);
39 switch(interactor->GetKeyCode())
45 p_sonar_display->
reset();
59 filter->SetExtent(0,1,0,2000,1,1);
63 filter->SetExtent(0,0,0,2000,0,1);
67 filter->SetExtent(0,1,bin_number,bin_number,0,1);
71 if(extent[1] == 1 && extent[5] == 1)
74 filter->SetExtent(0,1,bin_number,bin_number,0,1);
79 if(extent[1] == 1 && extent[5] == 1)
82 filter->SetExtent(0,1,bin_number,bin_number,0,1);
87 p_sonar_display->GetRenderWindow()->Render();
91 switch(interactor->GetKeyCode())
94 p_sonar_display->
reset();
103 number_of_beams(120),
107 horizontal_resolution(3.0/180.0*M_PI),
108 vertical_resolution(30.0/180.0*M_PI),
109 distance_resolution(0.1),
110 paramerter_auto(false),
113 sonar_wireframe(vtkSmartPointer<vtkStructuredGrid>::New()),
114 render_window(vtkSmartPointer<vtkRenderWindow>::New()),
115 renderer(vtkSmartPointer<vtkRenderer>::New()),
116 plot_actor(vtkSmartPointer<vtkXYPlotActor>::New())
118 this->resize(256,256);
119 render_window->AddRenderer(renderer);
120 this->SetRenderWindow(render_window);
121 render_window->GetInteractor()->AddObserver(vtkCommand::KeyReleaseEvent,&key_event,0.0);
123 setUpSonar(number_of_beams,number_of_bins,horizontal_resolution,distance_resolution,vertical_resolution);
131 std::vector<vtkSmartPointer<vtkActor> >::iterator iter = sonar_actor.begin();
132 for(
int i=0;iter != sonar_actor.end();++iter,++i)
133 if((*iter).GetPointer() == actor)
141 return sonar_filter[id];
145 return sonar_data[id];
152 vtkSmartPointer<vtkFieldData> field = vtkSmartPointer<vtkFieldData>::New();
153 vtkSmartPointer<vtkDataObject> data = vtkSmartPointer<vtkDataObject>::New();
154 field->AddArray(sonar_data[
id]);
155 data->SetFieldData(field);
156 plot_actor->RemoveAllInputs();
157 plot_actor->AddDataObjectInput(data);
161 return plot_actor->GetVisibility();
166 plot_actor->SetVisibility(val);
172 std::vector<vtkSmartPointer<vtkStructuredGridGeometryFilter> >::iterator iter = sonar_filter.begin();
173 while(iter != sonar_filter.end())
175 (*iter)->SetExtent(0,1,0,number_of_bins,1,1);
180 renderer->SetBackground(0.1,0.1,0.1);
181 renderer->GetActiveCamera()->SetPosition(0,0,1);
186 renderer->GetActiveCamera()->Yaw(0.0);
187 renderer->GetActiveCamera()->Roll(0.0);
188 renderer->GetActiveCamera()->Pitch(0.0);
189 renderer->GetActiveCamera()->SetFocalPoint(0,0,0);
190 renderer->ResetCamera();
191 renderer->GetActiveCamera()->ParallelProjectionOn();
192 renderer->GetActiveCamera()->Zoom(1.40);
193 render_window->Render();
198 float horizontal_resolution,
float distance_resolution,
199 float vertical_resolution)
202 if(number_of_beams < 10 || number_of_bins < 10 || horizontal_resolution < 0||
203 horizontal_resolution > M_PI*0.3 || distance_resolution < 0.01 || vertical_resolution > M_PI*0.45)
204 throw std::runtime_error(
"invalid configuration");
206 renderer->RemoveAllViewProps();
207 sonar_wireframe->ReleaseData();
208 sonar_wireframe->RemoveAllObservers();
210 sonar_mapper.clear();
211 sonar_filter.clear();
215 sonar_wireframe = vtkSmartPointer<vtkStructuredGrid>::New();
217 this->number_of_beams = number_of_beams;
218 this->number_of_bins = number_of_bins;
221 this->horizontal_resolution = horizontal_resolution;
222 this->vertical_resolution = vertical_resolution;
223 this->distance_resolution = distance_resolution;
225 int missing = number_of_beams - sonar_data.size();
226 for(;missing > 0 ;--missing)
228 sonar_data.push_back(vtkSmartPointer<vtkUnsignedCharArray>::New());
229 sonar_grid.push_back(vtkSmartPointer<vtkStructuredGrid>::New());
232 std::vector<vtkSmartPointer<vtkStructuredGrid> >::iterator iter = sonar_grid.begin();
233 std::vector<vtkSmartPointer<vtkUnsignedCharArray> >::iterator iter2 = sonar_data.begin();
234 for(
float val=0;iter != sonar_grid.end();val+=horizontal_resolution, ++iter,++iter2)
236 setUpStructuredGrid(*iter,2,number_of_bins+1,horizontal_resolution,distance_resolution,vertical_resolution,val);
237 void *p = (*iter2)->WriteVoidPointer(0,number_of_bins);
238 memset(p,0,number_of_bins);
239 (*iter)->GetCellData()->SetScalars(*iter2);
240 (*iter2)->Modified();
245 setUpStructuredGrid(sonar_wireframe,25,number_of_bins*distance_resolution*0.5,15.0/180.0*M_PI,2,vertical_resolution);
249 vtkLookupTable *lut = vtkLookupTable::New();
250 lut->SetNumberOfColors(255);
251 lut->SetHueRange(0.55,1);
252 lut->SetValueRange(1,1.0);
253 lut->SetSaturationRange(1,1.0);
254 lut->SetTableRange(0,255);
256 iter = sonar_grid.begin();
257 for(;iter != sonar_grid.end(); ++iter)
259 vtkSmartPointer<vtkStructuredGridGeometryFilter> filter = vtkSmartPointer<vtkStructuredGridGeometryFilter>::New();
260 filter->SetInputConnection((*iter)->GetProducerPort());
261 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
262 mapper->SetInputConnection(filter->GetOutputPort());
263 mapper->SetLookupTable(lut);
264 mapper->UseLookupTableScalarRangeOn();
265 mapper->SetColorModeToMapScalars();
268 vtkSmartPointer<vtkActor> sonar_grid_actor = vtkSmartPointer<vtkActor>::New();
269 sonar_grid_actor->SetMapper(mapper);
272 sonar_filter.push_back(filter);
273 sonar_mapper.push_back(mapper);
274 sonar_actor.push_back(sonar_grid_actor);
276 renderer->AddActor(sonar_grid_actor);
281 vtkDataSetMapper *set_mapper = vtkDataSetMapper::New();
282 set_mapper->SetInputConnection(sonar_wireframe->GetProducerPort());
283 set_mapper->ScalarVisibilityOff();
285 vtkSmartPointer<vtkActor> wireframe_actor = vtkSmartPointer<vtkActor>::New();
286 wireframe_actor->SetMapper(set_mapper);
287 wireframe_actor->GetProperty()->SetColor(0.5,0.5,0.5);
288 wireframe_actor->GetProperty()->SetRepresentationToWireframe();
289 wireframe_actor->GetProperty()->SetLineWidth(1.2);
290 wireframe_actor->PickableOff();
291 wireframe_actor->SetPosition(0,0,0.1);
292 set_mapper->Delete();
294 renderer->AddActor(wireframe_actor);
297 plot_actor->ExchangeAxesOff();
298 plot_actor->SetXValuesToValue();
299 plot_actor->SetWidth(0.9);
300 plot_actor->SetXTitle(
"");
301 plot_actor->SetYTitle(
"");
302 plot_actor->SetHeight(0.50);
303 plot_actor->SetPosition(0.04,0);
304 plot_actor->PlotPointsOn();
305 plot_actor->PlotLinesOn();
306 plot_actor->SetVisibility(
false);
307 renderer->AddActor(plot_actor);
313 float horizontal_resolution,
float distance_resolution,
314 float vertical_resolution,
float start_angle)
321 sgrid->SetDimensions(number_of_beams,number_of_bins,2);
323 vtkPoints *points = vtkPoints::New();
324 points->Allocate(number_of_bins*number_of_beams*2);
327 if (vertical_resolution == 0)
331 for (
int j=1; j<=number_of_bins; j++)
333 radius = j* distance_resolution;
334 point[2] = k*radius*sin(0.5*vertical_resolution);
335 for (
int i=1; i<= number_of_beams; i++)
337 theta = horizontal_resolution*i+start_angle;
338 point[0] = radius * cos(theta);
339 point[1] = radius * sin(theta);
340 points->InsertNextPoint(point);
344 sgrid->SetPoints(points);
350 paramerter_auto = value;
356 for(
int i = from;i <= to;++i)
358 void* p = sonar_data[i]->WriteVoidPointer(0,number_of_bins);
359 memset(p,0,number_of_bins);
360 sonar_data[i]->Modified();
367 if(start_bearing > bearing || end_bearing < bearing)
369 std::cout <<
"SonarDisplay: Bearing is out of range!" << std::endl;
373 if(number_of_bins > this->number_of_bins)
375 std::cout <<
"SonarDisplay: Bin is out of range!" << std::endl;
382 int index = bearing/horizontal_resolution+0.5;
383 if((
unsigned int)index >= sonar_data.size())
396 if(index == last_index)
405 start_index = last_index+1;
411 end_index = last_index-1;
413 end_index = number_of_beams-1;
418 std::vector<vtkSmartPointer<vtkUnsignedCharArray> >::iterator iter2 = sonar_data.begin();
419 std::vector<vtkSmartPointer<vtkUnsignedCharArray> >::iterator oldest = sonar_data.begin();
420 for(;iter2 != sonar_data.end();++iter2)
422 if((*oldest)->GetMTime() > (*iter2)->GetMTime())
428 if(start_index >= number_of_beams)
430 void* p = sonar_data[start_index]->WriteVoidPointer(0,number_of_bins);
431 memcpy(p,pbuffer,number_of_bins);
432 sonar_data[start_index]->Modified();
433 }
while(start_index != end_index && ++start_index);
435 if(last_index%3 && last_index != index && abs((*oldest)->GetMTime() - sonar_data[end_index]->GetMTime()) > 10e4)
437 void* p = (*oldest)->WriteVoidPointer(0,number_of_bins);
438 memset(p,0,number_of_bins);
439 (*oldest)->Modified();
443 render_window->Render();
448 if(delta > 0.5*number_of_beams)
449 return delta - number_of_beams;
450 else if(delta < -0.5*number_of_beams)
451 return delta + number_of_beams;
vtkUnsignedCharArray * getData(int id)
vtkStructuredGridGeometryFilter * getFilter(int id)
void setPlotVisible(bool val)
void setParameterToAuto(bool value)
void deleteBeams(int from, int to)
int normalizeDelata(int delta)
void setUpStructuredGrid(vtkSmartPointer< vtkStructuredGrid > sgrid, int number_of_beams, int number_of_bins, float horizontal_resolution, float distance_resolution, float vertical_resolution, float start_angle=0)
virtual void Execute(vtkObject *caller, unsigned long eventId, void *callData)
void addSonarBeam(float bearing, int number_of_bins, const char *pbuffer)
void setUpSonar(int number_of_beams, int number_of_bins, float horizontal_resolution, float distance_resolution, float vertical_resolution)
int getActorID(const vtkActor *actor)
SonarDisplay(QWidget *parent=NULL)