Go to the documentation of this file.00001
00002 #include <pluginlib/class_list_macros.h>
00003
00004 #include <force_sensor_handler/Force_sensorHandler.h>
00005 #include <v_repLib.h>
00006 #include <vrep_ros_plugin/access.h>
00007
00008 #include <geometry_msgs/WrenchStamped.h>
00009 #include <Eigen/Geometry>
00010
00011 #include <vrep_ros_plugin/ConsoleHandler.h>
00012
00013
00014 Force_sensorHandler::Force_sensorHandler() : GenericObjectHandler(),
00015
00016 _lastPublishedForceSensor(0.0),
00017 _acquisitionFrequency(-1.0)
00018 {
00019 }
00020
00021 Force_sensorHandler::~Force_sensorHandler(){
00022 }
00023
00024 unsigned int Force_sensorHandler::getObjectType() const {
00025 return CustomDataHeaders::FORCE_SENSOR_DATA_MAIN;
00026 }
00027
00028 void Force_sensorHandler::synchronize(){
00029
00030
00031
00032 _associatedObjectName = simGetObjectName(_associatedObjectID);
00033 std::string objectName(_associatedObjectName);
00034 std::replace( objectName.begin(), objectName.end(), '#', '_');
00035 _pub = _nh.advertise<geometry_msgs::WrenchStamped>(objectName+"/data", 1000);
00036
00037 }
00038
00039 void Force_sensorHandler::handleSimulation(){
00040
00041 if(!_initialized){
00042 _initialize();
00043 }
00044
00045 ros::Time now = ros::Time::now();
00046
00047 const simFloat currentSimulationTime = simGetSimulationTime();
00048
00049
00050 if ( ((currentSimulationTime - _lastPublishedForceSensor) >= 1.0/_acquisitionFrequency) ){
00051
00052
00053 simFloat force[3];
00054 simFloat torque[3];
00055
00056 int read_check = -1;
00057
00058 read_check = simReadForceSensor(_associatedObjectID, force, torque);
00059
00060 if(read_check > 0){
00061
00062
00063
00064
00065 geometry_msgs::WrenchStamped msg;
00066 msg.header.stamp = ros::Time::now();
00067 msg.wrench.force.x = force[0];
00068 msg.wrench.force.y = force[1];
00069 msg.wrench.force.z = force[2];
00070 msg.wrench.torque.x = torque[0];
00071 msg.wrench.torque.y = torque[1];
00072 msg.wrench.torque.z = torque[2];
00073 _pub.publish(msg);
00074
00075 _lastPublishedForceSensor = currentSimulationTime;
00076 }
00077
00078 else
00079 {
00080 std::cout <<"- [" << _associatedObjectName << "]: Cannot read the data from the force sensor" << std::endl;
00081
00082 }
00083
00084
00085 }
00086
00087 }
00088
00089
00090 void Force_sensorHandler::_initialize(){
00091 if (_initialized)
00092 return;
00093
00094
00095 std::vector<unsigned char> developerCustomData;
00096 getDeveloperCustomData(developerCustomData);
00097
00098
00099
00100 std::vector<unsigned char> tempMainData;
00101 std::stringstream ss;
00102
00103 if (CAccess::extractSerializationData(developerCustomData, CustomDataHeaders::FORCE_SENSOR_DATA_MAIN,tempMainData)){
00104 _acquisitionFrequency=CAccess::pop_float(tempMainData);
00105 if (_acquisitionFrequency > 0.0){
00106 ss << "- [" << _associatedObjectName << "] Frequency publisher: " << _acquisitionFrequency << "." << std::endl;
00107 } else {
00108 ss << "- [" << _associatedObjectName << "] Frequency publisher: simulation frequency." << std::endl;
00109 }
00110 } else {
00111 ss << "- [" << _associatedObjectName << "] Force Sensor frequency publisher not specified. using simulation frequency as default." << std::endl;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 ConsoleHandler::printInConsole(ss);
00157
00158 _lastPublishedForceSensor = -1.0;
00159
00160 _initialized=true;
00161 }
00162
00163 bool Force_sensorHandler::endOfSimulation(){
00164
00165 _initialized=false;
00166 return(false);
00167 }
00168
00169 PLUGINLIB_EXPORT_CLASS(Force_sensorHandler, GenericObjectHandler)