NaoJointsAnalyzer.cpp
Go to the documentation of this file.
00001 
00006 #include "NaoJointsAnalyzer.h"
00007 
00008 #include <sstream>
00009 #include <fstream>
00010 
00011 PLUGINLIB_DECLARE_CLASS(nao_dashboard, NaoJointsAnalyzer,
00012                 diagnostic_aggregator::NaoJointsAnalyzer,
00013                 diagnostic_aggregator::Analyzer)
00014 
00015 namespace diagnostic_aggregator {
00016 
00020 NaoJointsAnalyzer::NaoJointsAnalyzer() :
00021         m_path(""), m_niceName("Joints"), m_lastSeen(0) {
00022 }
00023 
00027 NaoJointsAnalyzer::~NaoJointsAnalyzer() {
00028 }
00029 
00030 bool NaoJointsAnalyzer::init(const std::string base_name, const ros::NodeHandle &n) {
00031         if (!n.getParam("path", m_niceName))
00032         {
00033                 ROS_ERROR("NaoJointsAnalyzer was not given parameter \"path\". Namespace: %s",
00034                           n.getNamespace().c_str());
00035                 return false;
00036         }
00037 
00038         m_path = base_name;
00039 
00040         boost::shared_ptr<StatusItem> item(new StatusItem(m_niceName));
00041         m_jointsMasterItem = item;
00042 
00043         return true;
00044 }
00045 
00046 bool NaoJointsAnalyzer::match(const std::string name) {
00047         return name.find("nao_joint") == 0;
00048 }
00049 
00050 bool NaoJointsAnalyzer::analyze(const boost::shared_ptr<StatusItem> item) {
00051         if(item->getName().find("nao_joint") != 0)
00052                 return false;
00053 
00054         JointData data;
00055 
00056         std::stringstream ssStiffness(item->getValue("Stiffness"));
00057         ssStiffness >> data.stiffness;
00058 
00059         std::stringstream ssTemperature(item->getValue("Temperature"));
00060         ssTemperature >> data.temperature;
00061 
00062         data.status = item;
00063 
00064         if(m_joints.find(item->getName()) == m_joints.end())
00065                 m_joints.insert(make_pair(item->getName(), data));
00066         else
00067                 m_joints.at(item->getName()) = data;
00068 
00069         m_lastSeen = ros::Time::now();
00070 
00071         return true;
00072 }
00073 
00074 bool NaoJointsAnalyzer::compareByTemperature(const NaoJointsAnalyzer::JointData& a, const NaoJointsAnalyzer::JointData& b) {
00075     return (a.temperature > b.temperature);
00076 }
00077 
00085 template<typename T>
00086 void NaoJointsAnalyzer::addValue(boost::shared_ptr<diagnostic_msgs::DiagnosticStatus> joint_stat, const std::string& key, const T& value) const {
00087         std::stringstream ss;
00088         ss << value;
00089         diagnostic_msgs::KeyValue kv;
00090         kv.key = key;
00091         kv.value = ss.str();
00092         joint_stat->values.push_back(kv);
00093 }
00094 
00095 std::vector<boost::shared_ptr<diagnostic_msgs::DiagnosticStatus> > NaoJointsAnalyzer::report() {
00096     bool stale = (ros::Time::now()-m_lastSeen).toSec() > 5.0;
00097         boost::shared_ptr<diagnostic_msgs::DiagnosticStatus> joint_stat =
00098                         m_jointsMasterItem->toStatusMsg(m_path, stale);
00099 
00100         std::vector<boost::shared_ptr<diagnostic_msgs::DiagnosticStatus> > output;
00101         if(stale) {
00102                 output.push_back(joint_stat);
00103                 return output;
00104         }
00105 
00106         double maxTemperature = 0.0;
00107         double maxStiffness = 0.0;
00108         double minStiffness = 1.0;
00109         double minStiffnessWoHands = 1.0;
00110 
00111         std::vector<JointData> hotJoints;
00112         joint_stat->level = diagnostic_msgs::DiagnosticStatus::OK;
00113 
00114         for(JointsMapType::const_iterator it = m_joints.begin(); it != m_joints.end(); it++) {
00115                 if(it->first.find("RHipYawPitch") == std::string::npos) {
00116                         maxTemperature = std::max(maxTemperature, it->second.temperature);
00117                         maxStiffness = std::max(maxStiffness, it->second.stiffness);
00118                         minStiffness = std::min(minStiffness, it->second.stiffness);
00119                         if(it->first.find("Hand") == std::string::npos)
00120                                 minStiffnessWoHands = std::min(minStiffnessWoHands, it->second.stiffness);
00121                         if((int) it->second.status->getLevel() >= (int) diagnostic_msgs::DiagnosticStatus::WARN) {
00122                             hotJoints.push_back(it->second);
00123                         }
00124                         if(it->second.status->getLevel() > joint_stat->level)
00125                             joint_stat->level = it->second.status->getLevel();
00126                 }
00127         }
00128 
00129         addValue(joint_stat, "Highest Temperature", maxTemperature);
00130         addValue(joint_stat, "Highest Stiffness", maxStiffness);
00131         addValue(joint_stat, "Lowest Stiffness", minStiffness);
00132         addValue(joint_stat, "Lowest Stiffness without Hands", minStiffnessWoHands);
00133 
00134     std::sort(hotJoints.begin(), hotJoints.end(), NaoJointsAnalyzer::compareByTemperature);
00135     std::stringstream hotJointsSS;
00136     for(size_t i = 0; i < hotJoints.size(); i++) {
00137         hotJointsSS << std::endl << removeLeadingNameChaff(hotJoints[i].status->getName(), "nao_joint") << ": " << hotJoints[i].temperature << "°C";
00138     }
00139     addValue(joint_stat, "Hot Joints", hotJointsSS.str());
00140 
00141         if (joint_stat->level == diagnostic_msgs::DiagnosticStatus::OK) {
00142                 joint_stat->message = "OK";
00143         } else if (joint_stat->level == diagnostic_msgs::DiagnosticStatus::WARN) {
00144                 joint_stat->message = "WARN";
00145         } else {
00146                 joint_stat->message = "ERROR";
00147         }
00148 
00149         output.push_back(joint_stat);
00150 
00151         for(JointsMapType::const_iterator it = m_joints.begin(); it != m_joints.end(); it++) {
00152                 boost::shared_ptr<diagnostic_msgs::DiagnosticStatus> msg(it->second.status->toStatusMsg(m_path + "/" + m_niceName,
00153                                 (ros::Time::now() - it->second.status->getLastUpdateTime()).toSec() > 3.0));
00154                 msg->name = m_path + "/" + m_niceName + "/" + removeLeadingNameChaff(it->second.status->getName(), "nao_joint");
00155                 output.push_back(msg);
00156         }
00157 
00158         return output;
00159 }
00160 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Properties Friends


nao_dashboard
Author(s): Stefan Osswald
autogenerated on Tue Oct 15 2013 10:07:28