Go to the documentation of this file.00001
00026 #include "sr_movements/movement_publisher.hpp"
00027
00028 #include <math.h>
00029 #include <sr_utilities/sr_math_utils.hpp>
00030
00031 namespace shadowrobot
00032 {
00033 MovementPublisher::MovementPublisher(double min_value, double max_value,
00034 double rate, unsigned int repetition, unsigned int nb_mvt_step, std::string controller_type)
00035 : nh_tilde("~"), publishing_rate( rate ), repetition(repetition),
00036 min(min_value), max(max_value), last_target_(0.0), nb_mvt_step(nb_mvt_step),
00037 SError_(0.0), MSError_(0.0), n_samples_(0), controller_type(controller_type)
00038 {
00039 pub = nh_tilde.advertise<std_msgs::Float64>("targets", 5);
00040 pub_2 = nh_tilde.advertise<std_msgs::Float64>("mse_out", 5);
00041 if(controller_type.compare("sr")==0)
00042 {
00043
00044 sub_ = nh_tilde.subscribe("inputs", nb_mvt_step, &MovementPublisher::calculateErrorCallback, this);
00045 }
00046 else if(controller_type.compare("pr2")==0)
00047 {
00048 sub_ = nh_tilde.subscribe("inputs", nb_mvt_step, &MovementPublisher::pr2_calculateErrorCallback, this);
00049 }
00050 else
00051 {
00052 ROS_WARN_STREAM("Warning: You didn't choose a msg_type to listen. sr_robot_msgs was chosen by default");
00053
00054 sub_ = nh_tilde.subscribe("inputs", nb_mvt_step, &MovementPublisher::calculateErrorCallback, this);
00055 }
00056 }
00057
00058 MovementPublisher::~MovementPublisher()
00059 {}
00060
00061 void MovementPublisher::start()
00062 {
00063 double last_target = 0.0;
00064
00065 for(unsigned int i_rep = 0; i_rep < repetition; ++i_rep)
00066 {
00067 for( unsigned int i=0; i<partial_movements.size(); ++i)
00068 {
00069 for(unsigned int j=0; j<nb_mvt_step; ++j)
00070 {
00071 if( !ros::ok() )
00072 return;
00073
00074
00075 msg.data = partial_movements[i].get_target( static_cast<double>(j) / static_cast<double>(nb_mvt_step));
00076
00077
00078 if( msg.data == -1.0 )
00079 {
00080 msg.data = last_target;
00081 }
00082 else
00083 {
00084
00085 msg.data = min + msg.data * (max - min);
00086 }
00087
00088 pub.publish( msg );
00089
00090
00091 publishing_rate.sleep();
00092
00093 ros::spinOnce();
00094
00095 last_target = msg.data;
00096 }
00097 }
00098
00099 ROS_INFO_STREAM("MSE: " << MSError_ << " Error(deg): " << sr_math_utils::to_degrees( sqrt(MSError_) ) );
00100
00101
00102 msg.data = MSError_;
00103 pub_2.publish( msg );
00104
00105
00106 SError_ = 0.0;
00107 n_samples_ = 0;
00108 }
00109 }
00110
00111 void MovementPublisher::calculateErrorCallback(const sr_robot_msgs::JointControllerState::ConstPtr& msg)
00112 {
00113 double error = msg->set_point - msg->process_value;
00114 ROS_DEBUG_STREAM("Error: " << error);
00115 SError_ = SError_ + ( error * error );
00116 ROS_DEBUG_STREAM("SError: " << SError_);
00117 n_samples_++;
00118 ROS_DEBUG_STREAM("Samples: " << n_samples_);
00119 MSError_ = SError_ / ( static_cast<double>(n_samples_) );
00120 ROS_DEBUG_STREAM("MSe: " << MSError_);
00121 }
00122
00123 void MovementPublisher::pr2_calculateErrorCallback(const pr2_controllers_msgs::JointControllerState::ConstPtr& msg)
00124 {
00125 double error = msg->set_point - msg->process_value;
00126 ROS_DEBUG_STREAM("Error: " << error);
00127 SError_ = SError_ + ( error * error );
00128 ROS_DEBUG_STREAM("SError: " << SError_);
00129 n_samples_++;
00130 ROS_DEBUG_STREAM("Samples: " << n_samples_);
00131 MSError_ = SError_ / ( static_cast<double>(n_samples_) );
00132 ROS_DEBUG_STREAM("MSe: " << MSError_);
00133 }
00134
00135 void MovementPublisher::execute_step(int index_mvt_step, int index_partial_movement)
00136 {
00137 if( !ros::ok() )
00138 return;
00139
00140
00141 msg.data = partial_movements[index_partial_movement].get_target( static_cast<double>(index_mvt_step) / static_cast<double>(nb_mvt_step));
00142
00143 msg.data = min + msg.data * (max - min);
00144
00145
00146 if( msg.data == -1.0 )
00147 msg.data = last_target_;
00148
00149
00150 pub.publish( msg );
00151
00152
00153 publishing_rate.sleep();
00154
00155 last_target_ = msg.data;
00156 }
00157
00158 void MovementPublisher::stop()
00159 {}
00160
00161 void MovementPublisher::add_movement(PartialMovement mvt)
00162 {
00163 partial_movements.push_back( mvt );
00164 }
00165
00166 void MovementPublisher::set_publisher(ros::Publisher publisher)
00167 {
00168 pub = publisher;
00169 }
00170 }
00171
00172
00173
00174
00175
00176