00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #include <assert.h>
00045 #include <ode/ode.h>
00046 #include <osg/Matrix>
00047
00048 #include "raysensorbank.h"
00049
00050 using namespace osg;
00051
00052 namespace lpzrobots {
00053
00054 RaySensorBank::RaySensorBank(){
00055 initialized=false;
00056 };
00057
00058 RaySensorBank::~RaySensorBank(){
00059 clear();
00060 };
00061
00062 void RaySensorBank::init(const OdeHandle& odeHandle, const OsgHandle& osgHandle){
00063 this->odeHandle = odeHandle;
00064 this->osgHandle = osgHandle;
00065 this->odeHandle.space = dSimpleSpaceCreate ( this->odeHandle.space );
00066 initialized=true;
00067 };
00068
00069 unsigned int RaySensorBank::registerSensor(RaySensor* raysensor, Primitive* body,
00070 const Matrix& pose, double range,
00071 RaySensor::rayDrawMode drawMode){
00072 raysensor->init(odeHandle, osgHandle, body, pose, range, drawMode);
00073 bank.push_back(raysensor);
00074 return bank.size();
00075 };
00076
00077 void RaySensorBank::reset(){
00078 for (unsigned int i=0; i<bank.size(); i++){
00079 bank[i]->reset();
00080 }
00081 };
00082
00083 bool RaySensorBank::sense(dGeomID object){
00084 bool sth_sensed=false;
00085 for (unsigned int i=0; i<bank.size(); i++){
00086 if (bank[i]->sense(object)){
00087 sth_sensed=true;
00088 }
00089 }
00090 return sth_sensed;
00091 };
00092
00093 double RaySensorBank::get(unsigned int index){
00094 assert(index<bank.size());
00095 return bank[index]->get();
00096 };
00097
00098 int RaySensorBank::get(double* sensorarray, unsigned int array_size){
00099 int counter=0;
00100 for(unsigned int i=0; (i<array_size) && (i<bank.size()); i++){
00101 sensorarray[i]=bank[i]->get();
00102 counter++;
00103 }
00104 return counter;
00105 };
00106
00107 dSpaceID RaySensorBank::getSpaceID(){
00108 return odeHandle.space;
00109 };
00110
00111 void RaySensorBank::update(){
00112 for (unsigned int i=0; i<bank.size(); i++){
00113 bank[i]->update();
00114 }
00115 };
00116
00117
00118 void RaySensorBank::clear(){
00119 for (unsigned int i=0; i<bank.size(); i++){
00120 if(bank[i]) delete bank[i];
00121 }
00122 bank.clear();
00123 }
00124
00125
00126 }
00127
00128
00129
00130
00131