LCOV - code coverage report
Current view: top level - src/HAL - EEHal.cpp (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 30 136 22.1 %
Date: 2021-10-05 16:55:17 Functions: 8 24 33.3 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (C) 2019 IIT-HHCM
       3             :  * Author: Luca Muratore
       4             :  * email:  luca.muratore@iit.it
       5             :  *
       6             :  * Licensed under the Apache License, Version 2.0 (the "License");
       7             :  * you may not use this file except in compliance with the License.
       8             :  * You may obtain a copy of the License at
       9             :  * http://www.apache.org/licenses/LICENSE-2.0
      10             :  *
      11             :  * Unless required by applicable law or agreed to in writing, software
      12             :  * distributed under the License is distributed on an "AS IS" BASIS,
      13             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      14             :  * See the License for the specific language governing permissions and
      15             :  * limitations under the License.
      16             : */
      17             : 
      18             : #include <ros_end_effector/HAL/EEHal.h>
      19             : 
      20          41 : ROSEE::EEHal::EEHal(ros::NodeHandle* nh) {
      21             :     
      22          41 :     _nh = nh;
      23             :     
      24             :     //init sub to receive reference from UniversalROSEEEX
      25             :     //TODO take topic name from roslaunch
      26          82 :     std::string motor_reference_topic  = "/ros_end_effector/motor_reference_pos";
      27             : 
      28          82 :     _motor_reference_sub = _nh->subscribe(motor_reference_topic, 10,
      29          41 :                                           &ROSEE::EEHal::motor_reference_clbk, this);
      30             :     
      31          82 :     std::string joint_state_topic = "/ros_end_effector/joint_states";
      32             :     
      33          41 :     _joint_state_pub = _nh->advertise<sensor_msgs::JointState>(joint_state_topic, 10);    
      34             :     
      35          41 :     _hand_info_present = parseHandInfo();
      36             :    
      37          41 :     if (_hand_info_present) { 
      38           0 :         _hand_info_service_name = "hand_info";
      39             :     }
      40             :     
      41          41 :     _pressure_active = false; // if a derived class want to use this, it must call initPressureSensing()
      42             :     
      43             : 
      44             :     
      45          41 : }
      46             : 
      47       22393 : bool ROSEE::EEHal::checkCommandPub() {
      48             :     
      49       22393 :     return (_motor_reference_sub.getNumPublishers() > 0 && _mr_msg.name.size() != 0);
      50             : }
      51             : 
      52          41 : bool ROSEE::EEHal::isHandInfoPresent() { return _hand_info_present; }
      53             : 
      54       20367 : void ROSEE::EEHal::motor_reference_clbk(const sensor_msgs::JointState::ConstPtr& msg) {
      55             :     
      56       20367 :     _mr_msg = *msg;
      57             :     
      58       20367 : }
      59             : 
      60       22393 : bool ROSEE::EEHal::publish_joint_state() {
      61             :     
      62             :     //NOTE _js_msg must be filled by the derived class
      63       22393 :     _joint_state_pub.publish(_js_msg);
      64             :     
      65       22393 :     return true;
      66             :     
      67             : }
      68             : 
      69           0 : bool ROSEE::EEHal::getFingersNames(std::vector<std::string> &fingers_names){
      70             :     
      71           0 :     if (this->fingers_names.size() != 0) {
      72             :     
      73           0 :         fingers_names = this->fingers_names;
      74           0 :         return true;
      75             : 
      76             :     } else {
      77           0 :         return false;
      78             :     }
      79             :     
      80             : }
      81           0 : bool ROSEE::EEHal::getMotorsNames(std::vector<std::string> &motors_names){
      82             :     
      83           0 :     if (this->motors_names.size() != 0) {
      84             :     
      85           0 :         motors_names = this->motors_names;
      86           0 :         return true;
      87             : 
      88             :     } else {
      89           0 :         return false;
      90             :     }
      91             :     
      92             : }
      93             : 
      94           0 : bool ROSEE::EEHal::getMotorStiffness(Eigen::VectorXd &motors_stiffness){
      95             :     
      96           0 :     if (this->motors_stiffness.size() != 0) {
      97             :     
      98           0 :         motors_stiffness = this->motors_stiffness;
      99           0 :         return true;
     100             : 
     101             :     } else {
     102           0 :         return false;
     103             :     }
     104             :     
     105             : }
     106             : 
     107           0 : bool ROSEE::EEHal::getTipsFrictions(Eigen::VectorXd &tips_frictions){
     108             :     
     109           0 :     if (this->tips_frictions.size() != 0) {
     110             :     
     111           0 :         tips_frictions = this->tips_frictions;
     112           0 :         return true;
     113             : 
     114             :     } else {
     115           0 :         return false;
     116             :     }
     117             :     
     118             : }
     119             : 
     120           0 : bool ROSEE::EEHal::getMotorTorqueLimits(Eigen::VectorXd &motors_torque_limits){
     121             :     
     122           0 :     if (this->motors_torque_limits.size() != 0) {
     123             :     
     124           0 :         motors_torque_limits = this->motors_torque_limits;
     125           0 :         return true;
     126             : 
     127             :     } else {
     128           0 :         return false;
     129             :     }
     130             :     
     131             : }
     132             : 
     133           0 : bool ROSEE::EEHal::getTipJointToTipFrameX(Eigen::VectorXd &tip_joint_to_tip_frame_x) {
     134             :    
     135           0 :     if (this->tip_joint_to_tip_frame_x.size() != 0) {
     136             : 
     137           0 :         tip_joint_to_tip_frame_x = this->tip_joint_to_tip_frame_x;
     138           0 :         return true;
     139             : 
     140             :     } else {
     141           0 :         return false;
     142             :     }  
     143             : }
     144             : 
     145           0 : bool ROSEE::EEHal::getTipJointToTipFrameY(Eigen::VectorXd &tip_joint_to_tip_frame_y) {
     146             :    
     147           0 :     if (this->tip_joint_to_tip_frame_y.size() != 0) {
     148             : 
     149           0 :         tip_joint_to_tip_frame_y = this->tip_joint_to_tip_frame_y;
     150           0 :         return true;
     151             : 
     152             :     } else {
     153           0 :         return false;
     154             :     }  
     155             : }
     156             : 
     157          41 : bool ROSEE::EEHal::parseHandInfo() {
     158             :     
     159          82 :     std::string _rosee_config_path;
     160          41 :     if (! _nh->getParam ( "/ros_ee_config_path", _rosee_config_path )) {
     161           0 :         return false;
     162             :     }
     163             :     
     164          82 :     std::ifstream ifile(_rosee_config_path);
     165          41 :     if (! ifile) {
     166           0 :         ROS_WARN_STREAM ("EEHALExecutor: config file " << _rosee_config_path << " not found");
     167           0 :         return false;
     168             :     }
     169             :     
     170          82 :     YAML::Node node = YAML::LoadFile(_rosee_config_path);
     171             :     
     172          41 :     if (! node["hand_info"]) {
     173          41 :         ROS_WARN_STREAM ("EEHALExecutor: config file " << _rosee_config_path << " does not contain "
     174             :             << "hand_info node. I will not parse hand information");
     175             :         
     176          41 :         return false;
     177             :     }
     178             :     
     179           0 :     if(node["hand_info"]["fingers_names"]){
     180             : 
     181           0 :        fingers_names = node["hand_info"]["fingers_names"].as<std::vector<std::string>>();
     182             :     }
     183             :     
     184           0 :     if(node["hand_info"]["motors_names"]){
     185             : 
     186           0 :        motors_names = node["hand_info"]["motors_names"].as<std::vector<std::string>>();
     187             :     }
     188             :     
     189           0 :     if(node["hand_info"]["motors_stiffness"]){
     190             : 
     191           0 :        motors_stiffness = ROSEE::Utils::yamlVectorToEigen(node["hand_info"]["motors_stiffness"]);
     192             :     }
     193             :     
     194           0 :     if(node["hand_info"]["tips_frictions"]){
     195             : 
     196           0 :        tips_frictions = ROSEE::Utils::yamlVectorToEigen(node["hand_info"]["tips_frictions"]);
     197             :     }
     198             :     
     199           0 :     if(node["hand_info"]["motors_torque_limits"]){
     200             : 
     201           0 :        motors_torque_limits = ROSEE::Utils::yamlVectorToEigen(node["hand_info"]["motors_torque_limits"]);
     202             :     }
     203             :     
     204           0 :     if(node["hand_info"]["tip_joint_to_tip_frame_x"]){
     205             : 
     206           0 :        tip_joint_to_tip_frame_x = ROSEE::Utils::yamlVectorToEigen(node["hand_info"]["tip_joint_to_tip_frame_x"]);
     207             :     }
     208             :     
     209           0 :     if(node["hand_info"]["tip_joint_to_tip_frame_y"]){
     210             : 
     211           0 :        tip_joint_to_tip_frame_y = ROSEE::Utils::yamlVectorToEigen(node["hand_info"]["tip_joint_to_tip_frame_y"]);
     212             :     }
     213             :     
     214           0 :     return true;
     215             : }
     216             : 
     217           0 : bool ROSEE::EEHal::init_hand_info_response() {
     218             :     
     219           0 :     _hand_info_response.fingers_names = fingers_names;
     220             :     
     221           0 :     _hand_info_response.motors_names = motors_names;
     222             :         
     223           0 :     _hand_info_response.motors_stiffness =
     224           0 :         ROSEE::Utils::eigenVectorToStdVector(motors_stiffness);
     225             :         
     226           0 :     _hand_info_response.tips_frictions =
     227           0 :         ROSEE::Utils::eigenVectorToStdVector(tips_frictions);
     228             :         
     229           0 :     _hand_info_response.motors_torque_limits =
     230           0 :         ROSEE::Utils::eigenVectorToStdVector(motors_torque_limits);
     231             :     
     232           0 :     return true;
     233             : }
     234             : 
     235           0 : bool ROSEE::EEHal::setHandInfoCallback() {
     236             :     
     237           0 :     _hand_info_server = _nh->advertiseService(_hand_info_service_name, 
     238           0 :         &ROSEE::EEHal::handInfoEEHalCallback, this);
     239           0 :     return true;
     240             : }
     241             : 
     242           0 : bool ROSEE::EEHal::handInfoEEHalCallback (    
     243             :     rosee_msg::HandInfo::Request& request,
     244             :     rosee_msg::HandInfo::Response& response) {
     245             :    
     246             :     //generic hal does not read the request
     247             :     
     248           0 :     response = _hand_info_response;
     249             :     
     250           0 :     return true;
     251             : }
     252             : 
     253           0 : bool ROSEE::EEHal::initPressureSensing()
     254             : {
     255             :     
     256           0 :     std::string topic_name = "/ros_end_effector/pressure_phalanges";
     257             :     
     258           0 :     _pressure_pub = _nh->advertise<rosee_msg::MotorPhalangePressure>(topic_name, 10);
     259             : 
     260           0 :     _pressure_active = true;
     261             :     
     262           0 :     return true;
     263             : }
     264             : 
     265           0 : bool ROSEE::EEHal::publish_pressure() {
     266             :     
     267             :     //NOTE _pressure_msg must be filled by the derived class
     268           0 :     _pressure_pub.publish(_pressure_msg);
     269             :     
     270           0 :     return true;
     271             :     
     272             : }
     273             : 
     274           0 : Eigen::VectorXd ROSEE::EEHal::getMotorReference() const {
     275             :     
     276           0 :     Eigen::VectorXd motorRef;
     277           0 :     motorRef.resize(_mr_msg.name.size());
     278           0 :     for (int i=0; i<_mr_msg.name.size(); i++ ) {
     279             :         
     280           0 :         motorRef(i) = _mr_msg.position.at(i);
     281             :     }
     282             :     
     283           0 :     return motorRef;
     284             : }
     285             : 
     286           0 : Eigen::VectorXd ROSEE::EEHal::getJointPosition() const {
     287             : 
     288           0 :     Eigen::VectorXd jointPos;
     289           0 :     jointPos.resize(_js_msg.name.size());
     290           0 :     for (int i=0; i<_js_msg.name.size(); i++ ) {
     291             :         
     292           0 :         jointPos(i) = _js_msg.position.at(i);
     293             :     }
     294             :     
     295           0 :     return jointPos;
     296             : }
     297             : 
     298           0 : Eigen::VectorXd ROSEE::EEHal::getJointEffort() const {
     299             : 
     300           0 :     Eigen::VectorXd jointEffort;
     301           0 :     jointEffort.resize(_js_msg.name.size());
     302           0 :     for (int i=0; i<_js_msg.name.size(); i++ ) {
     303             :         
     304           0 :         jointEffort(i) = _js_msg.effort.at(i);
     305             :     }
     306             :     
     307           0 :     return jointEffort;
     308             : }
     309             : 
     310           0 : Eigen::MatrixXd ROSEE::EEHal::getPressure() const {
     311             : 
     312           0 :     Eigen::MatrixXd pressure;
     313           0 :     pressure.resize(4, _pressure_msg.pressure_finger1.size()); //message has 4 finger field
     314           0 :     for (int i=0; i<_pressure_msg.pressure_finger1.size(); i++ ) {
     315             : 
     316           0 :         pressure(0, i) = _pressure_msg.pressure_finger1.at(i);
     317           0 :         pressure(1, i) = _pressure_msg.pressure_finger2.at(i);
     318           0 :         pressure(2, i) = _pressure_msg.pressure_finger3.at(i);
     319           0 :         pressure(3, i) = _pressure_msg.pressure_thumb.at(i);
     320             :     }
     321             :     
     322           0 :     return pressure;
     323             :     
     324         123 : }

Generated by: LCOV version 1.13