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
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
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;
00174 strncpy((char *)laser.settings.password, PLS_PASSWORD, 8);
00175 laser.settings.parity=E;
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;
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;
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;
00191 laser.settings.use_highspeed=0;
00192 laser.settings.start_baudrate=9600;
00193 laser.settings.set_baudrate=38400;
00194 laser.settings.databits=8;
00195 laser.settings.stopbits=1;
00196 laser.settings.swf=0;
00197 laser.settings.hwf=0;
00198 laser.settings.angle_range=180;
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
00206 if (sick_start_laser(&laser) < 0) {
00207
00208 return false;
00209 }
00210
00211
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);
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
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 }