Go to the documentation of this file.00001
00028 #include "sr_self_test/sensor_noise_test.hpp"
00029
00030 namespace shadow_robot
00031 {
00032 const double SensorNoiseTest::MAX_NOISE_CONST_ = 0.0087;
00033 const double SensorNoiseTest::NOISE_EPSILON_CONST_ = 0.000000001;
00034
00035 SensorNoiseTest::SensorNoiseTest()
00036 {
00037 }
00038
00039 void SensorNoiseTest::test_sensor_noise(diagnostic_updater::DiagnosticStatusWrapper& status)
00040 {
00041
00042
00043
00044
00045 joint_states_sub_ = nh_.subscribe("joint_states", 50, &SensorNoiseTest::joint_states_cb_, this);
00046
00047 ros::Rate rate(100);
00048 for (size_t i = 0; i < 400; ++i)
00049 {
00050 ros::spinOnce();
00051 rate.sleep();
00052 }
00053
00054 std::vector<std::string> failed_joints;
00055 std::vector<double> failed_noises;
00056 double min, max;
00057 std::map<std::string, std::vector<double> >::iterator joint_states;
00058 for(joint_states = all_joint_states_.begin(); joint_states != all_joint_states_.end(); ++joint_states)
00059 {
00060 if(joint_states->second.size() > 1 )
00061 {
00062 min = joint_states->second[0];
00063 max = joint_states->second[0];
00064
00065
00066 for (size_t i = 1; i < joint_states->second.size(); ++i)
00067 {
00068 if(joint_states->second[i] < min)
00069 min = joint_states->second[i];
00070 if(joint_states->second[i] > max)
00071 max = joint_states->second[i];
00072 }
00073
00074 double noise = max - min;
00075 ROS_DEBUG("Joint %s Pos min: %lf max: %lf noise: %lf", joint_states->first.c_str(), min , max , noise );
00076
00077 if( noise > MAX_NOISE_CONST_ || noise <= NOISE_EPSILON_CONST_ )
00078 {
00079 failed_joints.push_back(joint_states->first);
00080 failed_noises.push_back( noise );
00081 }
00082 }
00083 }
00084
00085 if( failed_joints.size() > 0 )
00086 {
00087 std::stringstream ss;
00088 ss << "Noises out of threshold: ";
00089 for (size_t i = 0; i < failed_joints.size(); ++i)
00090 {
00091 ss << "[" << failed_joints[i] << " -> " << failed_noises[i] << " ] ";
00092 }
00093 status.summary(diagnostic_msgs::DiagnosticStatus::ERROR, ss.str());
00094 }
00095 else
00096 status.summary(diagnostic_msgs::DiagnosticStatus::OK, "All the noises are below threshold.");
00097
00098 joint_states_sub_.shutdown();
00099 }
00100
00101 void SensorNoiseTest::joint_states_cb_(const sensor_msgs::JointState::ConstPtr& msg)
00102 {
00103 for (size_t i = 0; i < msg->name.size(); ++i)
00104 {
00105 all_joint_states_[ msg->name[i] ].push_back( msg->position[i] );
00106 }
00107 }
00108 }
00109
00110
00111
00112
00113
00114
00115