/home/fwph/code/wurde/modules/sickLaser/sickLaser.cpp

Go to the documentation of this file.
00001 
00029 #include <CommsManager.H>
00030 #include <RangeFinder.H>
00031 #include <Logger.H>
00032 #include <sys/select.h>
00033 #include <sys/time.h>
00034 #include <time.h>
00035 #include <unistd.h>
00036 #include <string.h>
00037 #include <math.h>
00038 #include <fstream>
00039 #include <iostream>
00040 
00041 #include "sick.h"
00042 #include "serial.h"
00043 
00044 sick_laser_t laser;
00045 
00046 using namespace WURDE;
00047 using namespace std;
00048 
00049 string parseLaserConfig(std::string config,std::string laserName);
00050 bool initializeLaser(RangeFinder &myLaser,string port);
00051 
00052 int main (int argc, char *argv[]){
00053 
00054        CommsManager myManager("TomPLS");
00055 
00056        string port,confFile;
00057        bool log=false,invert=false;
00058        ofstream outfile;
00059        stringstream laserdata;
00060        Time timer;
00061 
00062        laserdata.fill('0');
00063 
00064        myManager.setRealName("sickServer");
00065        myManager.setHelpString("\t-c [config] Specifies alternate config file to use. Default is\n\t\tlaser-config.xml.\n\n\
00066 Note that the -n flag selects which config entity will be used from the laser-config file.\n\nThis module provides access to SICK PLS and LMS lasers.\n");
00067        myManager.parseOptions(argc,argv,"c:");
00068        Logger myLogger(myManager.getName());
00069        RangeFinder myLaser(myManager.getName());
00070 
00071        myManager.registerSupplier(&myLaser);
00072        myManager.setSleep(0.05);
00073 
00074        if(g_globalConfiguration.haveOption("c")){
00075               confFile=g_globalConfiguration.getOption("c");
00076               if(confFile[0]!='/'){
00077                      confFile=g_globalConfiguration.getConfigDirectory()+"/"+confFile;
00078               }
00079        }else{
00080               confFile=g_globalConfiguration.getConfigDirectory()+"/"+"laser-config.xml";
00081        }
00082 
00083        g_logdebug << "Reading configuration for " << myManager.getName() << " from " << confFile<< endl;
00084        port=parseLaserConfig(confFile,myManager.getName());
00085 
00086        if(g_globalConfiguration.getOption("logLaser")=="true"){
00087               log=true;
00088               outfile.open((g_globalConfiguration.getDataDirectory()+"/"+myManager.getName()+"LaserLog.txt").c_str());
00089        }
00090 
00091        if(g_globalConfiguration.getOption("invertLaser")=="true"){
00092               invert=true;
00093        }
00094 
00095        g_debug("sickLaser initializing.");
00096 
00097 
00098        if(myManager.getState()!=STATE_INFO){
00099               if(!initializeLaser(myLaser,port)){
00100                      myManager.cleanUp();
00101                      g_fatal("Failed to initialize laser! Exiting.");
00102                      exit(-1);
00103               }
00104        }
00105        
00106        while(myManager.runUpdate()==STATE_RUN){
00107               
00108               fd_set rfds;
00109               
00110               FD_ZERO(&rfds);
00111               FD_SET(laser.dev.fd, &rfds);
00112               
00113               while (!select(laser.dev.fd + 1, &rfds, NULL, NULL, NULL)) {
00114                      FD_SET(laser.dev.fd, &rfds);
00115               }
00116               
00117               sick_handle_laser(&laser);
00118               if (laser.new_reading) {
00119                      myLaser.data.ranges.clear();
00120                 
00121                      if(invert){
00122                             for(int i=laser.numvalues-1;i>=0;--i){
00123                                    myLaser.data.ranges.push_back(laser.raw[i]);
00124                             }
00125                      }else{
00126                             for(int i=0;i<laser.numvalues;++i){
00127                                    myLaser.data.ranges.push_back(laser.raw[i]);
00128                             }
00129                      }
00130                      myLaser.publishData();
00131 
00132                      if(log){
00133                             timer.now();
00134                             laserdata << timer.getSeconds() << ".";
00135                             laserdata.width(6);
00136                             laserdata << timer.getUSeconds() << " ";
00137                             if(invert){
00138                                    for(int i=laser.numvalues-1;i>=0;--i){
00139                                           laserdata << " " << laser.raw[i];
00140                                    }
00141                             }else{
00142                                    for(int i=0;i<laser.numvalues;++i){
00143                                           laserdata << " " << laser.raw[i];
00144                                    }
00145                             }
00146                             
00147                             laserdata << endl;
00148                      }
00149               }
00150        
00151         
00152               //    myLaser.publishInfo();
00153        }
00154        
00155        if(myManager.getState()!=STATE_INFO){
00156               sick_stop_laser(&laser);
00157        }
00158 
00159        g_info("sickLaser shutting down cleanly.");
00160        outfile << laserdata.str();
00161        outfile.close();
00162        myManager.cleanUp();
00163 
00164        return 0;
00165 }
00166 
00167 bool initializeLaser(RangeFinder &myLaser,string port){
00168 
00169   // FIXME: configuration variables
00170   strncpy(laser.settings.device_name, port.c_str(), MAX_NAME_LENGTH);
00171 
00172   if(g_globalConfiguration.getOption("laserType")=="PLS"){
00173          laser.settings.type=PLS;//Ok
00174          strncpy((char *)laser.settings.password, PLS_PASSWORD, 8);//?
00175          laser.settings.parity=E;//Ok
00176   }else if(g_globalConfiguration.getOption("laserType")=="LMS"){
00177          laser.settings.type=LMS;
00178          strncpy((char *)laser.settings.password, LMS_PASSWORD, 8);//?
00179          laser.settings.parity=N;//Ok
00180   }else{
00181          g_logwarn << "Don't recognize laser type " << g_globalConfiguration.getOption("laserType") << ", assuming PLS." << endl;
00182          laser.settings.type=PLS;
00183          laser.settings.parity=E;//Ok
00184          strncpy((char *)laser.settings.password, PLS_PASSWORD, 8);//?
00185   }
00186   
00187   laser.settings.range_res=CM; //?
00188   laser.settings.range_dist=RANGE80M;//?
00189   laser.settings.laser_num=0; //?
00190   laser.settings.detect_baudrate=1;//Ok
00191   laser.settings.use_highspeed=0;//?
00192   laser.settings.start_baudrate=9600;//Ok
00193   laser.settings.set_baudrate=38400;//Ok
00194   laser.settings.databits=8;//Ok
00195   laser.settings.stopbits=1;//Ok
00196   laser.settings.swf=0;
00197   laser.settings.hwf=0;
00198   laser.settings.angle_range=180;//Moot
00199   laser.settings.angle_resolution=RES_1_00_DEGREE;
00200   laser.settings.num_values=180;
00201   
00202   laser.raw=0;  
00203 
00204   laser.raw = new float[180];
00205   //  test_alloc(laser.raw);
00206   if (sick_start_laser(&laser) < 0) {
00207     //destroy_interface(this);
00208     return false;
00209   }
00210 
00211   /* populate framework info structures */
00212   myLaser.info.angle_min.setValueAndLock(-M_PI/2.0);
00213 
00214   myLaser.info.max_range.setValue(laser.settings.range_dist);
00215   myLaser.info.max_range.setLock();
00216   
00217   myLaser.info.uniform.setValue(true);
00218   myLaser.info.uniform.setLock();
00219   
00220   myLaser.info.theta_offset.setValue(-M_PI/2.0);
00221   myLaser.info.theta_offset.setLock();
00222   
00223   myLaser.info.x_offset.setValue(0);
00224   myLaser.info.x_offset.setLock();
00225   
00226   myLaser.info.y_offset.setValue(0);
00227   myLaser.info.y_offset.setLock();
00228   
00229   myLaser.info.half_angle.setValue(0); // laser is a ray
00230   myLaser.info.half_angle.setLock();
00231   
00232   myLaser.info.theta_separation.setValue(M_PI/181.0);
00233   myLaser.info.theta_separation.setLock();
00234   
00235   //pretend the following are true, for now
00236   myLaser.info.z_offset.setValue(0);
00237   myLaser.info.z_offset.setLock();
00238   
00239   myLaser.info.phi_offset.setValue(0);
00240   myLaser.info.phi_offset.setLock();
00241   
00242   myLaser.info.psi_offset.setValue(0);
00243   myLaser.info.psi_offset.setLock();
00244   
00245   myLaser.info.x_separation.setValue(0);
00246   myLaser.info.x_separation.setLock();
00247   
00248   myLaser.info.y_separation.setValue(0);
00249   myLaser.info.y_separation.setLock();
00250   
00251   myLaser.info.z_separation.setValue(0);
00252   myLaser.info.z_separation.setLock();
00253   
00254   myLaser.info.phi_separation.setValue(0);
00255   myLaser.info.phi_separation.setLock();
00256   
00257   myLaser.info.psi_separation.setValue(0);
00258   myLaser.info.psi_separation.setLock();
00259   
00260   myLaser.publishInfo();
00261 
00262   return true;
00263 }

Generated on Thu Feb 1 15:31:52 2007 for WURDE by  doxygen 1.5.1