00001 #include <CommsManager.H>
00002 #include <PTUnit.H>
00003 #include <Time.H>
00004
00005 #include "ptu.h"
00006 #include "ptu_types.h"
00007
00008 using namespace WURDE;
00009
00010 #define ANG_CONVERSION (3.086 * 2.0 * M_PI / 21600.0)
00011 #define PTU_DEV "/dev/ttyR2"
00012 #define PAN_TOL .001
00013 #define TILT_TOL .001
00014
00015 portstream_fd _fd;
00016 float pan_goal;
00017 float tilt_goal;
00018 bool pan_has_goal=false;
00019 bool tilt_has_goal=false;
00020
00021 void initialize (void);
00022 void cancel_all(void);
00023 void pan_to (double rad);
00024 void pan (double rad);
00025 void tilt_to (double rad);
00026 void tilt (double rad);
00027 void set_pan_vel (double radps);
00028 void set_pan_accel (double radpss);
00029 void set_pan_upper (double rad);
00030 void set_tilt_vel (double radps);
00031 void set_tilt_accel (double radpss);
00032 void set_tilt_upper (double rad);
00033
00034 int main(int argc, char *argv[]){
00035
00036 CommsManager myManager("PTUServer");
00037 myManager.setRealName("PTUServer");
00038 myManager.setHelpString("This module provides access to Directed Perception Pan-Tilt units.\n");
00039 myManager.parseOptions(argc,argv);
00040
00041 PTUnit myPTUnit("TomPTU");
00042 Logger myLogger("PTUServer");
00043 bool running=true;
00044
00045
00046 if(myManager.getState()!=STATE_INFO){
00047 initialize();
00048 g_debug("Pan tilt unit initialized");
00049 }else{
00050 g_debug("PTU Server in registration mode");
00051 running=false;
00052 }
00053
00054 myManager.registerSupplier(&myPTUnit);
00055 myManager.setSleep(0.05);
00056
00057 if(myManager.getState()!=STATE_INFO){
00058 myPTUnit.info.pan.setValue(get_current(PAN,POSITION)*ANG_CONVERSION);
00059 myPTUnit.info.tilt.setValue(get_current(TILT,POSITION)*ANG_CONVERSION);
00060
00061 myPTUnit.info.pan_vel.setValueAndLock(get_desired(PAN,SPEED)*ANG_CONVERSION);
00062 myPTUnit.info.tilt_vel.setValueAndLock(get_desired(TILT,SPEED)*ANG_CONVERSION);
00063
00064 myPTUnit.info.pan_accel.setValueAndLock(get_desired(PAN,ACCELERATION)*ANG_CONVERSION);
00065 myPTUnit.info.tilt_accel.setValueAndLock(get_desired(TILT,ACCELERATION)*ANG_CONVERSION);
00066
00067 myPTUnit.info.pan_upper.setValueAndLock(get_desired(PAN,UPPER_SPEED_LIMIT)*ANG_CONVERSION);
00068 myPTUnit.info.tilt_upper.setValueAndLock(get_desired(TILT,UPPER_SPEED_LIMIT)*ANG_CONVERSION);
00069 }
00070
00071
00072 while(myManager.runUpdate()==STATE_RUN){
00073
00074 while(myPTUnit.newRequest()){
00075 myPTUnit.getNextRequest();
00076 g_debug("Just received a request.");
00077
00078 pan_to(myPTUnit.requests.pan.getValue());
00079 tilt_to(myPTUnit.requests.tilt.getValue());
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 }
00114
00115
00116
00117 myPTUnit.info.pan.setValue(get_current(PAN,POSITION)*ANG_CONVERSION);
00118 if (pan_has_goal && fabs(get_current(PAN,POSITION)*ANG_CONVERSION-pan_goal)<PAN_TOL){
00119 pan_has_goal=false;
00120 myPTUnit.info.pan.setStatus(STAT_OKAY);
00121 }
00122
00123 myPTUnit.info.tilt.setValue(get_current(TILT,POSITION)*ANG_CONVERSION);
00124 if (tilt_has_goal && fabs(get_current(TILT,POSITION)*ANG_CONVERSION-tilt_goal)<TILT_TOL){
00125 tilt_has_goal=false;
00126 myPTUnit.info.tilt.setStatus(STAT_OKAY);
00127 }
00128
00129
00130
00131 myPTUnit.info.pan_vel.setValue(get_desired(PAN,SPEED)*ANG_CONVERSION);
00132 myPTUnit.info.tilt_vel.setValue(get_desired(TILT,SPEED)*ANG_CONVERSION);
00133
00134 myPTUnit.info.pan_accel.setValue(get_desired(PAN,ACCELERATION)*ANG_CONVERSION);
00135 myPTUnit.info.tilt_accel.setValue(get_desired(TILT,ACCELERATION)*ANG_CONVERSION);
00136
00137 myPTUnit.info.pan_upper.setValue(get_desired(PAN,UPPER_SPEED_LIMIT)*ANG_CONVERSION);
00138 myPTUnit.info.tilt_upper.setValue(get_desired(TILT,UPPER_SPEED_LIMIT)*ANG_CONVERSION);
00139
00140 myPTUnit.publishInfo();
00141 }
00142
00143 if(running){
00144 cancel_all();
00145 }
00146
00147 myManager.cleanUp();
00148
00149 return 0;
00150 }
00151
00152 void initialize (void){
00153 int res;
00154 _fd = open_host_port(PTU_DEV);
00155 if(_fd == PORT_NOT_OPENED){
00156 g_fatal("Error openening serial port.\n");
00157 exit(1);
00158 }
00159
00160
00161
00162 res=reset_PTU_parser(1000);
00163
00164 if(res!=PTU_OK){
00165 g_fatal("Error resetting ptu parser\n");
00166 exit(1);
00167 }
00168
00169 reset_ptu();
00170 pan_has_goal=false;
00171 tilt_has_goal=false;
00172 }
00173
00174
00175 void cancel_all(void){
00176
00177 pan_has_goal=false;
00178 tilt_has_goal=false;
00179
00180 pan_to(0.0);
00181 pan_has_goal=false;
00182
00183 tilt_to(0.0);
00184 tilt_has_goal=false;
00185 }
00186
00187
00189 void pan_to (double rad){
00190 PTU_PARM_PTR value = (PTU_PARM_PTR) ((rad) / ANG_CONVERSION);
00191 set_desired(PAN, POSITION, &value, ABSOLUTE);
00192
00193 tilt_has_goal=false;
00194 pan_has_goal=true;
00195 pan_goal=rad;
00196 }
00197
00199 void pan (double rad){
00200 pan_to(get_current(PAN,POSITION)*ANG_CONVERSION + rad);
00201 }
00202
00204 void tilt_to (double rad){
00205 PTU_PARM_PTR value = (PTU_PARM_PTR)((rad) / ANG_CONVERSION);
00206 set_desired(TILT, POSITION, &value, ABSOLUTE);
00207
00208 pan_has_goal=false;
00209 tilt_has_goal=true;
00210 tilt_goal=rad;
00211 }
00212
00214 void tilt (double rad){
00215 tilt_to(rad+get_current(TILT,POSITION)*ANG_CONVERSION);
00216 }
00217
00219 void set_pan_vel (double radps){
00220 PTU_PARM_PTR value = (PTU_PARM_PTR)(radps / ANG_CONVERSION);
00221
00222 set_desired(PAN, SPEED, &value, ABSOLUTE);
00223
00224
00225 }
00226
00228 void set_pan_accel (double radpss){
00229 PTU_PARM_PTR value = (PTU_PARM_PTR)(radpss / ANG_CONVERSION);
00230 set_desired(PAN, ACCELERATION, &value, ABSOLUTE);
00231 }
00232
00234 void set_pan_upper (double rad){
00235 PTU_PARM_PTR value = (PTU_PARM_PTR)((rad) / ANG_CONVERSION);
00236 set_desired(PAN, UPPER_SPEED_LIMIT, &value, ABSOLUTE);
00237 }
00238
00240 void set_tilt_vel (double radps){
00241 PTU_PARM_PTR value = (PTU_PARM_PTR)(radps / ANG_CONVERSION);
00242 set_desired(TILT, SPEED, &value, ABSOLUTE);
00243 }
00244
00246 void set_tilt_accel (double radpss){
00247 PTU_PARM_PTR value = (PTU_PARM_PTR)(radpss / ANG_CONVERSION);
00248 set_desired(TILT, ACCELERATION, &value, ABSOLUTE);
00249 }
00250
00252 void set_tilt_upper (double rad){
00253 PTU_PARM_PTR value = (PTU_PARM_PTR)((rad) / ANG_CONVERSION);
00254 set_desired(TILT, UPPER_SPEED_LIMIT, &value, ABSOLUTE);
00255 }
00256