00001
00005 #include "robodyn_mechanisms/JointControlCommandGripper.h"
00006
00011 JointControlCommandGripper::JointControlCommandGripper(const std::string& mechanism, IoFunctions ioFunctions, NodeRegisterManagerPtr nodeRegisterManager)
00012 : JointControlCommandInterface(mechanism, ioFunctions), nodeRegisterManager(nodeRegisterManager), logCategory("gov.nasa.JointControlCommandGripper")
00013 {
00014 flea3Enable = cbnEnable = led2Enable = 0;
00015 setParameters();
00016 bootLoader();
00017 motCom();
00018 disableCalibrationMode();
00019 disableClearFaultMode();
00020 }
00021
00022 JointControlCommandGripper::~JointControlCommandGripper()
00023 {
00024
00025 }
00026 void JointControlCommandGripper::setParameters()
00027 {
00028 std::string parameterFile = io.getControlFile(mechanism);
00029
00031 TiXmlDocument file(parameterFile.c_str());
00032
00033 if (!file.LoadFile())
00034 {
00035 std::stringstream err;
00036 err << "Failed to load file [" << parameterFile << "]";
00037 NasaCommonLogging::Logger::log(logCategory, log4cpp::Priority::FATAL, err.str());
00038 throw std::runtime_error(err.str());
00039 }
00040
00041 TiXmlHandle doc(&file);
00042 NasaCommonLogging::Logger::log(logCategory, log4cpp::Priority::INFO, "File [" + parameterFile + "] successfully loaded.");
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 TiXmlHandle parametersElement(doc.FirstChildElement("ApiMap"));
00053
00054 if (parametersElement.ToElement())
00055 {
00056
00057 BootEnableControlName = ApiMap::getXmlElementValue(parametersElement, "BootEnableControl");
00058 BridgeEnableControlName = ApiMap::getXmlElementValue(parametersElement, "BridgeEnableControl");
00059 BrakeReleaseControlName = ApiMap::getXmlElementValue(parametersElement, "BrakeReleaseControl");
00060 MotorEnableControlName = ApiMap::getXmlElementValue(parametersElement, "MotorEnableControl");
00061 MotComSourceControlName = ApiMap::getXmlElementValue(parametersElement, "MotComSourceControl");
00062 ControlModeControlName = ApiMap::getXmlElementValue(parametersElement, "ControlModeControl");
00063 CalibrationModeControlName = ApiMap::getXmlElementValue(parametersElement, "CalibrationModeControl");
00064 ClearFaultControlName = ApiMap::getXmlElementValue(parametersElement, "ClearFaultControl");
00065 CrabEnableControlName = ApiMap::getXmlElementValue(parametersElement, "CrabEnableControl");
00066 AtiEnableControlName = ApiMap::getXmlElementValue(parametersElement, "AtiEnableControl");
00067 Flea3EnableControlName = ApiMap::getXmlElementValue(parametersElement, "Flea3EnableControl");
00068 CBNEnableControlName = ApiMap::getXmlElementValue(parametersElement, "CBNEnableControl");
00069 Led2EnableControlName = ApiMap::getXmlElementValue(parametersElement, "Led2EnableControl");
00070 }
00071 else
00072 {
00073 std::stringstream err;
00074 err << "The file " << parameterFile << " has no element named [ApiMap]";
00075 NasaCommonLogging::Logger::log(logCategory, log4cpp::Priority::ERROR, err.str());
00076 throw std::runtime_error(err.str());
00077 }
00078
00079 AtiEnableName = StringUtilities::makeFullyQualifiedRoboDynElement(mechanism, AtiEnableControlName);
00080 Flea3EnableName = StringUtilities::makeFullyQualifiedRoboDynElement(mechanism, Flea3EnableControlName);
00081 CBNEnableName = StringUtilities::makeFullyQualifiedRoboDynElement(mechanism, CBNEnableControlName);
00082 Led2EnableName = StringUtilities::makeFullyQualifiedRoboDynElement(mechanism, Led2EnableControlName);
00083
00084
00085 if (nodeRegisterManager->hasControlProperty(mechanism, CrabEnableControlName))
00086 {
00087 nodeRegisterManager->setControlValue(mechanism, CrabEnableControlName, 1);
00088 }
00089
00090 if (nodeRegisterManager->hasControlProperty(mechanism, AtiEnableControlName))
00091 {
00092 atiEnable = 1;
00093 io.setIntParam(AtiEnableName, atiEnable);
00094 nodeRegisterManager->setControlValue(mechanism, AtiEnableControlName, atiEnable);
00095 }
00096
00097 if (nodeRegisterManager->hasControlProperty(mechanism, Flea3EnableControlName))
00098 {
00099 flea3Enable = nodeRegisterManager->getControlValue(mechanism, Flea3EnableControlName);
00100 io.setIntParam(Flea3EnableName, flea3Enable);
00101 }
00102
00103 if (nodeRegisterManager->hasControlProperty(mechanism, CBNEnableControlName))
00104 {
00105 cbnEnable = nodeRegisterManager->getControlValue(mechanism, CBNEnableControlName);
00106 io.setIntParam(CBNEnableName, cbnEnable);
00107 }
00108
00109 if (nodeRegisterManager->hasControlProperty(mechanism, Led2EnableControlName))
00110 {
00111 led2Enable = nodeRegisterManager->getControlValue(mechanism, Led2EnableControlName);
00112 io.setIntParam(Led2EnableName, led2Enable);
00113 }
00114
00115
00116 }
00117
00118
00124 void JointControlCommandGripper::getStates(r2_msgs::JointControlData& commandStates)
00125 {
00126 updateParameters();
00127 commandStates = states;
00128 }
00129
00130 void JointControlCommandGripper::updateParameters()
00131 {
00132 if (nodeRegisterManager->hasControlProperty(mechanism, Flea3EnableControlName))
00133 {
00134 io.getIntParam(Flea3EnableName, flea3Enable);
00135 nodeRegisterManager->setControlValue(mechanism, Flea3EnableControlName, flea3Enable);
00136 }
00137
00138 if (nodeRegisterManager->hasControlProperty(mechanism, CBNEnableControlName))
00139 {
00140 io.getIntParam(CBNEnableName, cbnEnable);
00141 nodeRegisterManager->setControlValue(mechanism, CBNEnableControlName, cbnEnable);
00142 }
00143
00144 if (nodeRegisterManager->hasControlProperty(mechanism, Led2EnableControlName))
00145 {
00146 io.getIntParam(Led2EnableName, led2Enable);
00147 nodeRegisterManager->setControlValue(mechanism, Led2EnableControlName, led2Enable);
00148 }
00149
00150 if (nodeRegisterManager->hasControlProperty(mechanism, AtiEnableControlName))
00151 {
00152 io.getIntParam(AtiEnableName, atiEnable);
00153 nodeRegisterManager->setControlValue(mechanism, AtiEnableControlName, atiEnable);
00154 }
00155
00156 }
00157
00158
00159
00164 void JointControlCommandGripper::bootLoader(void)
00165 {
00166 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlMode::BOOTLOADER successful on joint: " << mechanism;
00167 nodeRegisterManager->setControlValue(mechanism, BootEnableControlName, 0);
00168 nodeRegisterManager->setControlValue(mechanism, BridgeEnableControlName, 1);
00169 nodeRegisterManager->setControlValue(mechanism, BrakeReleaseControlName, 0);
00170 nodeRegisterManager->setControlValue(mechanism, MotorEnableControlName, 0);
00171 states.controlMode.state = r2_msgs::JointControlMode::BOOTLOADER;
00172 }
00173
00178 void JointControlCommandGripper::off(void)
00179 {
00180 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlMode::OFF successful on joint: " << mechanism;
00181 nodeRegisterManager->setControlValue(mechanism, BootEnableControlName, 1);
00182 nodeRegisterManager->setControlValue(mechanism, BridgeEnableControlName, 1);
00183 nodeRegisterManager->setControlValue(mechanism, BrakeReleaseControlName, 0);
00184 nodeRegisterManager->setControlValue(mechanism, MotorEnableControlName, 0);
00185 states.controlMode.state = r2_msgs::JointControlMode::OFF;
00186 }
00187
00192 void JointControlCommandGripper::park(void)
00193 {
00194 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlMode::PARK successful on joint: " << mechanism;
00195 nodeRegisterManager->setControlValue(mechanism, BridgeEnableControlName, 1);
00196 nodeRegisterManager->setControlValue(mechanism, BrakeReleaseControlName, 0);
00197 nodeRegisterManager->setControlValue(mechanism, MotorEnableControlName, 1);
00198 states.controlMode.state = r2_msgs::JointControlMode::PARK;
00199 }
00200
00205 void JointControlCommandGripper::neutral(void)
00206 {
00207 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlMode::NEUTRAL successful on joint: " << mechanism;
00208 nodeRegisterManager->setControlValue(mechanism, BridgeEnableControlName, 1);
00209 nodeRegisterManager->setControlValue(mechanism, BrakeReleaseControlName, 1);
00210 nodeRegisterManager->setControlValue(mechanism, MotorEnableControlName, 0);
00211 states.controlMode.state = r2_msgs::JointControlMode::NEUTRAL;
00212 }
00213
00218 void JointControlCommandGripper::drive(void)
00219 {
00220 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlMode::DRIVE successful on joint: " << mechanism;
00221 nodeRegisterManager->setControlValue(mechanism, BrakeReleaseControlName, 1);
00222 nodeRegisterManager->setControlValue(mechanism, MotorEnableControlName, 1);
00223 states.controlMode.state = r2_msgs::JointControlMode::DRIVE;
00224 }
00225
00226
00227
00232 void JointControlCommandGripper::motCom(void)
00233 {
00234 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlMode::MOTCOM successful on joint: " << mechanism;
00235 nodeRegisterManager->setControlValue(mechanism, MotComSourceControlName, 0);
00236 nodeRegisterManager->setControlValue(mechanism, ControlModeControlName, 0);
00237 states.commandMode.state = r2_msgs::JointControlCommandMode::MOTCOM;
00238 }
00239
00244 void JointControlCommandGripper::stallMode(void)
00245 {
00246 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlMode::STALLMODE successful on joint: " << mechanism;
00247
00248 nodeRegisterManager->setControlValue(mechanism, MotComSourceControlName, 1);
00249 nodeRegisterManager->setControlValue(mechanism, ControlModeControlName, 1);
00250
00251 states.commandMode.state = r2_msgs::JointControlCommandMode::STALLMODE;
00252 return;
00253 }
00254
00259 void JointControlCommandGripper::multiLoopStep(void)
00260 {
00261 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlMode::MULTILOOPSTEP successful on joint: " << mechanism;
00262
00263 nodeRegisterManager->setControlValue(mechanism, MotComSourceControlName, 1);
00264 nodeRegisterManager->setControlValue(mechanism, ControlModeControlName, 3);
00265
00266 states.commandMode.state = r2_msgs::JointControlCommandMode::MULTILOOPSTEP;
00267 return;
00268 }
00269
00270
00275 void JointControlCommandGripper::multiLoopSmooth(void)
00276 {
00277 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::INFO << "MULTILOOPSMOOTH not defined for Grippers, trying MULTILOOPSTEP instead on joint: " << mechanism;
00278 multiLoopStep();
00279 }
00280
00281 void JointControlCommandGripper::actuator(void)
00282 {
00283 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::WARN << "ACTUATOR is not a valid JointControlCommandMode for Grippers , trying MULTILOOPSTEP instead on joint: " << mechanism;
00284 multiLoopStep();
00285 }
00286
00287
00288
00293 void JointControlCommandGripper::disableCalibrationMode(void)
00294 {
00295 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlCalibrationMode::DISABLE successful on joint: " << mechanism;
00296 nodeRegisterManager->setControlValue(mechanism, CalibrationModeControlName, 0);
00297 states.calibrationMode.state = r2_msgs::JointControlCalibrationMode::DISABLE;
00298 }
00299
00304 void JointControlCommandGripper::enableCalibrationMode(void)
00305 {
00306 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlCalibrationMode::ENABLE successful on joint: " << mechanism;
00307 nodeRegisterManager->setControlValue(mechanism, CalibrationModeControlName, 1);
00308 states.calibrationMode.state = r2_msgs::JointControlCalibrationMode::ENABLE;
00309 }
00310
00315 void JointControlCommandGripper::resetCalibrationMode(void)
00316 {
00317 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlCalibrationMode::DISABLE successful on joint: " << mechanism;
00318 nodeRegisterManager->setControlValue(mechanism, CalibrationModeControlName, 0);
00319 states.calibrationMode.state = r2_msgs::JointControlCalibrationMode::DISABLE;
00320 }
00321
00322
00327 void JointControlCommandGripper::disableClearFaultMode(void)
00328 {
00329 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlClearFaultMode::DISABLE successful on joint: " << mechanism;
00330 nodeRegisterManager->setControlValue(mechanism, ClearFaultControlName, 0);
00331 states.clearFaultMode.state = r2_msgs::JointControlClearFaultMode::DISABLE;
00332 }
00333
00338 void JointControlCommandGripper::enableClearFaultMode(void)
00339 {
00340 NasaCommonLogging::Logger::getCategory(logCategory) << log4cpp::Priority::DEBUG << "Command transition to JointControlClearFaultMode::ENABLE successful on joint: " << mechanism;
00341 nodeRegisterManager->setControlValue(mechanism, ClearFaultControlName, 1);
00342 states.clearFaultMode.state = r2_msgs::JointControlClearFaultMode::ENABLE;
00343 }