00001 #include <Ice/Ice.h>
00002
00003 #include "Component/ModelComponent.H"
00004 #include "Component/ModelManager.H"
00005 #include "Robots/Scorbot/Scorbot.ice.H"
00006 #include "Robots/Scorbot/ScorbotInterface.H"
00007
00008 #include <signal.h>
00009
00010
00011
00012 const ModelOptionCateg MOC_ScorbotServer =
00013 { MOC_SORTPRI_3, "Scorbot Server Related Options" };
00014
00015 const ModelOptionDef OPT_Port =
00016 { MODOPT_ARG(std::string), "Port", &MOC_ScorbotServer, OPTEXP_CORE,
00017 "Scorbot Server Port Number",
00018 "scorbot-port", '\0', "", "10000" };
00019
00020
00021
00022 class ScorbotI: public ScorbotIce::Scorbot, public ModelComponent
00023 {
00024 public:
00025 ScorbotI(OptionManager& mgr,
00026 const std::string& descrName = "ScorbotServer",
00027 const std::string& tagName = "ScorbotServer") :
00028 ModelComponent(mgr, descrName, tagName),
00029 itsScorbotInterface(new ScorbotInterface(mgr)),
00030 itsPort(&OPT_Port, this, 0)
00031 {
00032 addSubComponent(itsScorbotInterface);
00033
00034 JointType2Joint_t[ScorbotIce::Base] = ScorbotInterface::Base;
00035 JointType2Joint_t[ScorbotIce::Shoulder] = ScorbotInterface::Shoulder;
00036 JointType2Joint_t[ScorbotIce::Elbow] = ScorbotInterface::Elbow;
00037 JointType2Joint_t[ScorbotIce::Wrist1] = ScorbotInterface::Wrist1;
00038 JointType2Joint_t[ScorbotIce::Wrist2] = ScorbotInterface::Wrist2;
00039 JointType2Joint_t[ScorbotIce::Gripper] = ScorbotInterface::Gripper;
00040 JointType2Joint_t[ScorbotIce::Slider] = ScorbotInterface::Slider;
00041
00042 Joint_t2JointType[ScorbotInterface::Base] = ScorbotIce::Base;
00043 Joint_t2JointType[ScorbotInterface::Shoulder] = ScorbotIce::Shoulder;
00044 Joint_t2JointType[ScorbotInterface::Elbow] = ScorbotIce::Elbow;
00045 Joint_t2JointType[ScorbotInterface::Wrist1] = ScorbotIce::Wrist1;
00046 Joint_t2JointType[ScorbotInterface::Wrist2] = ScorbotIce::Wrist2;
00047 Joint_t2JointType[ScorbotInterface::Gripper] = ScorbotIce::Gripper;
00048 Joint_t2JointType[ScorbotInterface::Slider] = ScorbotIce::Slider;
00049 }
00050
00051
00052 ScorbotInterface::encoderVals_t encoderValsType2encoderVals_t(ScorbotIce::encoderValsType encodersT)
00053 {
00054 ScorbotInterface::encoderVals_t encoders_t;
00055 ScorbotIce::encoderValsType::iterator encIt;
00056 for(encIt = encodersT.begin(); encIt != encodersT.end(); ++encIt)
00057 encoders_t[JointType2Joint_t[encIt->first]] = encIt->second;
00058 return encoders_t;
00059 }
00060
00061
00062 ScorbotIce::encoderValsType encoderVals_t2encoderValsType(ScorbotInterface::encoderVals_t encoders_t)
00063 {
00064 ScorbotIce::encoderValsType encodersT;
00065 ScorbotInterface::encoderVals_t::iterator encIt;
00066 for(encIt = encoders_t.begin(); encIt != encoders_t.end(); ++encIt)
00067 encodersT[Joint_t2JointType[encIt->first]] = encIt->second;
00068 return encodersT;
00069 }
00070
00071
00072 ScorbotIce::pwmValsType pwmVals_t2pwmValsType(ScorbotInterface::pwmVals_t pwms_t)
00073 {
00074 ScorbotIce::pwmValsType pwmsT;
00075 ScorbotInterface::pwmVals_t::iterator encIt;
00076 for(encIt = pwms_t.begin(); encIt != pwms_t.end(); ++encIt)
00077 pwmsT[Joint_t2JointType[encIt->first]] = encIt->second;
00078 return pwmsT;
00079 }
00080
00081
00082 void init()
00083 {
00084 }
00085
00086
00087
00088 void setJoint(ScorbotIce::JointType joint, int encoderPos, int timeMS, const Ice::Current&)
00089 { itsScorbotInterface->setJoint(JointType2Joint_t[joint], encoderPos, timeMS); }
00090
00091
00092
00093
00094 void setJoints(const ScorbotIce::encoderValsType &pos, int timeMS, const Ice::Current&)
00095 { itsScorbotInterface->setJoints(encoderValsType2encoderVals_t(pos), timeMS); }
00096
00097
00098
00099 int getEncoder(ScorbotIce::JointType joint, const Ice::Current&)
00100 { return itsScorbotInterface->getEncoder(JointType2Joint_t[joint]); }
00101
00102
00103
00104 ScorbotIce::encoderValsType getEncoders(const Ice::Current&)
00105 { return encoderVals_t2encoderValsType(itsScorbotInterface->getEncoders()); }
00106
00107
00108
00109 void setEnabled(bool enabled, const Ice::Current&)
00110 { itsScorbotInterface->setEnabled(enabled); }
00111
00112
00113
00114 void resetEncoders(const Ice::Current&)
00115 { itsScorbotInterface->resetEncoders(); }
00116
00117
00118
00119 float getPWM(ScorbotIce::JointType joint, const Ice::Current&)
00120 { return itsScorbotInterface->getPWM(JointType2Joint_t[joint]); }
00121
00122
00123
00124 ScorbotIce::pwmValsType getPWMs(const Ice::Current&)
00125 { return pwmVals_t2pwmValsType(itsScorbotInterface->getPWMs()); }
00126
00127
00128
00129 void setControlParams(ScorbotIce::JointType joint,
00130 float pGain, float iGain, float dGain, float maxI, float maxPWM, float pwmOffset, const Ice::Current&)
00131 { itsScorbotInterface->setControlParams(JointType2Joint_t[joint], pGain, iGain, dGain, maxI, maxPWM, pwmOffset); }
00132
00133
00134
00135 void getPIDVals(ScorbotIce::JointType joint, float &pGain, float &iGain, float &dGain, float &maxI, float &maxPWM, float &pwmOffset, const Ice::Current&)
00136 { itsScorbotInterface->getPIDVals(JointType2Joint_t[joint], pGain, iGain, dGain, maxI, maxPWM, pwmOffset); }
00137
00138
00139
00140 void getTuningVals(ScorbotIce::JointType joint,
00141 int &targetPos, int &targetVel, float &gravityCompensation, const Ice::Current&)
00142 { itsScorbotInterface->getTuningVals(JointType2Joint_t[joint], targetPos, targetVel, gravityCompensation); }
00143
00144
00145
00146 void setGravityParameters(int upperArmMass, int foreArmMass, float compensationScale, const Ice::Current&)
00147 { itsScorbotInterface->setGravityParameters(upperArmMass, foreArmMass, compensationScale); }
00148
00149
00150
00151 void getGravityParameters(int &upperArmMass, int &foreArmMass, float &compensationScale, const Ice::Current&)
00152 { itsScorbotInterface->getGravityParameters(upperArmMass, foreArmMass, compensationScale); }
00153
00154
00155
00156 std::string getPort() { return itsPort.getVal(); }
00157
00158 void prepareForExit()
00159 {
00160 std::cerr << "#################### PREPARING FOR EXIT ####################" << std::endl;
00161
00162 sleep(1);
00163 }
00164
00165 private:
00166 std::map<ScorbotIce::JointType, ScorbotInterface::Joint_t> JointType2Joint_t;
00167 std::map<ScorbotInterface::Joint_t, ScorbotIce::JointType> Joint_t2JointType;
00168
00169 nub::soft_ref<ScorbotInterface> itsScorbotInterface;
00170 OModelParam<std::string> itsPort;
00171 };
00172 nub::soft_ref<ScorbotI> scorbotServer;
00173
00174
00175 void terminate(int s)
00176 {
00177 std::cerr <<
00178 std::endl << "#################### INTERRUPT - SHUTTING DOWN SCORBOT ####################" << std::endl;
00179
00180 scorbotServer->prepareForExit();
00181 exit(0);
00182 }
00183
00184
00185 int main(int argc, char** argv)
00186 {
00187 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00188 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00189 signal(SIGALRM, terminate);
00190
00191 ModelManager manager("ScorbotServerManager");
00192 scorbotServer.reset(new ScorbotI(manager));
00193 manager.addSubComponent(scorbotServer);
00194 manager.parseCommandLine(argc, argv, "", 0, 0);
00195 manager.start();
00196
00197 std::string connString("default -p ");
00198 connString += scorbotServer->getPort();
00199
00200 int status = 0;
00201 Ice::CommunicatorPtr ic;
00202
00203 try {
00204 ic = Ice::initialize(argc, argv);
00205 Ice::ObjectAdapterPtr adapter =
00206 ic->createObjectAdapterWithEndpoints(
00207 "ScorbotServerAdapter", connString.c_str());
00208 Ice::ObjectPtr object = scorbotServer.get();
00209 adapter->add(object, ic->stringToIdentity("ScorbotServer"));
00210 adapter->activate();
00211 scorbotServer->init();
00212 ic->waitForShutdown();
00213 } catch(const Ice::Exception& e) {
00214 std::cerr << e << std::endl;
00215 status = 1;
00216 } catch(const char* msg) {
00217 std::cerr << msg << std::endl;
00218 status = 1;
00219 }
00220 if(ic) {
00221 try {
00222 ic->destroy();
00223 } catch(const Ice::Exception& e) {
00224 std::cerr << e << std::endl;
00225 status = 1;
00226 }
00227 }
00228
00229 scorbotServer->prepareForExit();
00230 return status;
00231 }
00232