| 32 | 
  32 | 
  
    #include <rsb/converter/Repository.h>
 
   | 
  | 33 | 
  33 | 
  
    #include <rsb/converter/ProtocolBufferConverter.h>
 
   | 
  | 34 | 
  34 | 
  
    
 
   | 
  | 35 | 
   | 
  
    #include <rst/robot/EmotionState.pb.h>
 
   | 
  | 36 | 
   | 
  
    #include <rst/robot/Animation.pb.h>
 
   | 
  | 37 | 
   | 
  
    #include <rst/robot/GazeTarget.pb.h>
 
   | 
  | 38 | 
   | 
  
    #include <rst/robot/MouthTarget.pb.h>
 
   | 
   | 
  35 | 
  
    #include <rst/animation/EmotionExpression.pb.h>
 
   | 
   | 
  36 | 
  
    #include <rst/animation/BinocularHeadGaze.pb.h>
 
   | 
   | 
  37 | 
  
    #include <rst/animation/HeadAnimation.pb.h>
 
   | 
  | 39 | 
  38 | 
  
    #include <rst/audition/Utterance.pb.h>
 
   | 
   | 
  39 | 
  
    #include <rst/audition/SoundChunk.pb.h>
 
   | 
  | 40 | 
  40 | 
  
    #include <boost/algorithm/string.hpp>
 
   | 
  | 41 | 
  41 | 
  
    #include <boost/range/algorithm_ext/erase.hpp>
 
   | 
  | 42 | 
  42 | 
  
    
 
   | 
  | 43 | 
   | 
  
    WARNING: RSB interface might be deprtecated and needs some backporting
 
   | 
  | 44 | 
   | 
  
    from the ROS code. [todo]
 
   | 
  | 45 | 
   | 
  
    
 
   | 
  | 46 | 
  43 | 
  
    using namespace std;
 
   | 
  | 47 | 
  44 | 
  
    using namespace rsb;
 
   | 
  | 48 | 
  45 | 
  
    using namespace rsb::patterns;
 
   | 
  | ... | ... |  | 
  | 57 | 
  54 | 
  
    
 
   | 
  | 58 | 
  55 | 
  
        try{
   | 
  | 59 | 
  56 | 
  
            //converter for EmotionState
 
   | 
  | 60 | 
   | 
  
            rsb::converter::Converter<string>::Ptr emotionStateConverter(new rsb::converter::ProtocolBufferConverter<rst::robot::EmotionState>());
 
   | 
   | 
  57 | 
  
            rsb::converter::Converter<string>::Ptr emotionStateConverter(new rsb::converter::ProtocolBufferConverter<rst::animation::EmotionExpression>());
 
   | 
  | 61 | 
  58 | 
  
            rsb::converter::converterRepository<string>()->registerConverter(emotionStateConverter);
 
   | 
  | 62 | 
  59 | 
  
    
 
   | 
  | 63 | 
  60 | 
  
            //converter for Utterance
 
   | 
  | ... | ... |  | 
  | 65 | 
  62 | 
  
            //rsb::converter::converterRepository<string>()->registerConverter(UtteranceConverter);
 
   | 
  | 66 | 
  63 | 
  
    
 
   | 
  | 67 | 
  64 | 
  
            //converter for GazeTarget
 
   | 
  | 68 | 
   | 
  
            rsb::converter::Converter<string>::Ptr gazeTargetConverter(new rsb::converter::ProtocolBufferConverter<rst::robot::GazeTarget>());
 
   | 
   | 
  65 | 
  
            rsb::converter::Converter<string>::Ptr gazeTargetConverter(new rsb::converter::ProtocolBufferConverter<rst::animation::BinocularHeadGaze>());
 
   | 
  | 69 | 
  66 | 
  
            rsb::converter::converterRepository<string>()->registerConverter(gazeTargetConverter);
 
   | 
  | 70 | 
  67 | 
  
    
 
   | 
  | 71 | 
  68 | 
  
            //converter for MouthTarget
 
   | 
  | 72 | 
   | 
  
            rsb::converter::Converter<string>::Ptr mouthTargetConverter(new rsb::converter::ProtocolBufferConverter<rst::robot::MouthTarget>());
 
   | 
  | 73 | 
   | 
  
            rsb::converter::converterRepository<string>()->registerConverter(mouthTargetConverter);
 
   | 
   | 
  69 | 
  
            ///rsb::converter::Converter<string>::Ptr mouthTargetConverter(new rsb::converter::ProtocolBufferConverter<rst::robot::MouthTarget>());
 
   | 
   | 
  70 | 
  
            ///rsb::converter::converterRepository<string>()->registerConverter(mouthTargetConverter);
 
   | 
  | 74 | 
  71 | 
  
    
 
   | 
  | 75 | 
  72 | 
  
    
 
   | 
  | 76 | 
  73 | 
  
            //converter for Animation
 
   | 
  | 77 | 
   | 
  
            rsb::converter::Converter<string>::Ptr animationConverter(new rsb::converter::ProtocolBufferConverter<rst::robot::Animation>());
 
   | 
   | 
  74 | 
  
            rsb::converter::Converter<string>::Ptr animationConverter(new rsb::converter::ProtocolBufferConverter<rst::animation::HeadAnimation>());
 
   | 
  | 78 | 
  75 | 
  
            rsb::converter::converterRepository<string>()->registerConverter(animationConverter);
 
   | 
  | 79 | 
  76 | 
  
    
 
   | 
  | 80 | 
  77 | 
  
        }catch(std::invalid_argument e){
   | 
  | ... | ... |  | 
  | 93 | 
  90 | 
  
    }
 
   | 
  | 94 | 
  91 | 
  
    
 
   | 
  | 95 | 
  92 | 
  
    void MiddlewareRSB::publish_emotion(string scope_target, RobotEmotion e, bool blocking){
   | 
  | 96 | 
   | 
  
        boost::shared_ptr<rst::robot::EmotionState> request(new rst::robot::EmotionState());
 
   | 
   | 
  93 | 
  
        boost::shared_ptr<rst::animation::EmotionExpression> request(new rst::animation::EmotionExpression());
 
   | 
  | 97 | 
  94 | 
  
    
 
   | 
  | 98 | 
  95 | 
  
        switch(e.value){
   | 
  | 99 | 
  96 | 
  
            default:
 
   | 
  | 100 | 
  97 | 
  
                printf("> WANRING: invalid emotion id %d. defaulting to NEUTRAL\n",e.value);
   | 
  | 101 | 
  98 | 
  
                //fall through:
 
   | 
  | 102 | 
  99 | 
  
            case(RobotEmotion::NEUTRAL):
 
   | 
  | 103 | 
   | 
  
                request->set_value(rst::robot::EmotionState::NEUTRAL);
 
   | 
   | 
  100 | 
  
                request->set_emotion(rst::animation::EmotionExpression::NEUTRAL);
 
   | 
  | 104 | 
  101 | 
  
                break;
 
   | 
  | 105 | 
  102 | 
  
            case(RobotEmotion::HAPPY):
 
   | 
  | 106 | 
   | 
  
                request->set_value(rst::robot::EmotionState::HAPPY);
 
   | 
   | 
  103 | 
  
                request->set_emotion(rst::animation::EmotionExpression::HAPPY);
 
   | 
  | 107 | 
  104 | 
  
                break;
 
   | 
  | 108 | 
  105 | 
  
            case(RobotEmotion::SAD):
 
   | 
  | 109 | 
   | 
  
                request->set_value(rst::robot::EmotionState::SAD);
 
   | 
   | 
  106 | 
  
                request->set_emotion(rst::animation::EmotionExpression::SAD);
 
   | 
  | 110 | 
  107 | 
  
                break;
 
   | 
  | 111 | 
  108 | 
  
            case(RobotEmotion::ANGRY):
 
   | 
  | 112 | 
   | 
  
                request->set_value(rst::robot::EmotionState::ANGRY);
 
   | 
   | 
  109 | 
  
                request->set_emotion(rst::animation::EmotionExpression::ANGRY);
 
   | 
  | 113 | 
  110 | 
  
                break;
 
   | 
  | 114 | 
  111 | 
  
            case(RobotEmotion::SURPRISED):
 
   | 
  | 115 | 
   | 
  
                request->set_value(rst::robot::EmotionState::SURPRISED);
 
   | 
   | 
  112 | 
  
                request->set_emotion(rst::animation::EmotionExpression::SURPRISED);
 
   | 
  | 116 | 
  113 | 
  
                break;
 
   | 
  | 117 | 
  114 | 
  
            case(RobotEmotion::FEAR):
 
   | 
  | 118 | 
   | 
  
                request->set_value(rst::robot::EmotionState::FEAR);
 
   | 
   | 
  115 | 
  
                request->set_emotion(rst::animation::EmotionExpression::FEAR);
 
   | 
  | 119 | 
  116 | 
  
                break;
 
   | 
  | 120 | 
  117 | 
  
        }
 
   | 
  | 121 | 
  118 | 
  
    
 
   | 
  | 122 | 
  119 | 
  
        request->set_duration(e.time_ms);
 
   | 
  | 123 | 
  120 | 
  
    
 
   | 
  | 124 | 
  121 | 
  
        if (blocking){
   | 
  | 125 | 
   | 
  
            hlrc_server->call<rst::robot::EmotionState>(scope_target, request);
 
   | 
   | 
  122 | 
  
            hlrc_server->call<rst::animation::EmotionExpression>(scope_target, request);
 
   | 
  | 126 | 
  123 | 
  
        }else{
   | 
  | 127 | 
   | 
  
            hlrc_server->callAsync<rst::robot::EmotionState>(scope_target, request);
 
   | 
   | 
  124 | 
  
            hlrc_server->callAsync<rst::animation::EmotionExpression>(scope_target, request);
 
   | 
  | 128 | 
  125 | 
  
        }
 
   | 
  | 129 | 
  126 | 
  
    }
 
   | 
  | 130 | 
  127 | 
  
    
 
   | 
  | ... | ... |  | 
  | 137 | 
  134 | 
  
        publish_emotion("defaultEmotion", e, blocking);
   | 
  | 138 | 
  135 | 
  
    }
 
   | 
  | 139 | 
  136 | 
  
    
 
   | 
  | 140 | 
   | 
  
    void MiddlewareRSB::publish_gaze_target(RobotGaze target, bool blocking){
   | 
  | 141 | 
   | 
  
        boost::shared_ptr<rst::robot::GazeTarget> request(new rst::robot::GazeTarget());
 
   | 
   | 
  137 | 
  
    void MiddlewareRSB::publish_gaze_target(RobotGaze incoming_target, bool blocking){
   | 
   | 
  138 | 
  
        boost::shared_ptr<rst::animation::BinocularHeadGaze> request(new rst::animation::BinocularHeadGaze ());
 
   | 
   | 
  139 | 
  
    
 
   | 
   | 
  140 | 
  
        boost::shared_ptr<rst::geometry::SphericalDirectionFloat> target(new rst::geometry::SphericalDirectionFloat ());
 
   | 
   | 
  141 | 
  
        target->set_azimuth(incoming_target.pan);
 
   | 
   | 
  142 | 
  
        target->set_elevation(incoming_target.tilt);
 
   | 
   | 
  143 | 
  
        request->set_allocated_target(target.get());
 
   | 
  | 142 | 
  144 | 
  
    
 
   | 
  | 143 | 
   | 
  
        request->set_pan(target.pan);
 
   | 
  | 144 | 
   | 
  
        request->set_tilt(target.tilt);
 
   | 
  | 145 | 
   | 
  
        request->set_roll(target.roll);
 
   | 
  | 146 | 
   | 
  
        request->set_vergence(target.vergence);
 
   | 
  | 147 | 
   | 
  
        request->set_pan_offset(target.pan_offset);
 
   | 
  | 148 | 
   | 
  
        request->set_tilt_offset(target.tilt_offset);
 
   | 
   | 
  145 | 
  
        request->set_eye_vergence(incoming_target.vergence);
 
   | 
   | 
  146 | 
  
    
 
   | 
   | 
  147 | 
  
        boost::shared_ptr<rst::geometry::SphericalDirectionFloat> offset(new rst::geometry::SphericalDirectionFloat());
 
   | 
   | 
  148 | 
  
        offset->set_azimuth(incoming_target.pan_offset);
 
   | 
   | 
  149 | 
  
        offset->set_elevation(incoming_target.tilt_offset);
 
   | 
   | 
  150 | 
  
        request->set_allocated_offset(offset.get());
 
   | 
  | 149 | 
  151 | 
  
    
 
   | 
  | 150 | 
  152 | 
  
        if (blocking){
   | 
  | 151 | 
   | 
  
            hlrc_server->call<rst::robot::GazeTarget>("gaze", request);
   | 
   | 
  153 | 
  
            hlrc_server->call<rst::animation::BinocularHeadGaze >("gaze", request);
   | 
  | 152 | 
  154 | 
  
        }else{
   | 
  | 153 | 
   | 
  
            hlrc_server->callAsync<rst::robot::GazeTarget>("gaze", request);
   | 
   | 
  155 | 
  
            hlrc_server->callAsync<rst::animation::BinocularHeadGaze >("gaze", request);
   | 
  | 154 | 
  156 | 
  
        }
 
   | 
  | 155 | 
  157 | 
  
    }
 
   | 
  | 156 | 
  158 | 
  
    
 
   | 
  | 157 | 
  159 | 
  
    void MiddlewareRSB::publish_mouth_target(RobotMouth target, bool blocking){
   | 
   | 
  160 | 
  
    /*
 
   | 
  | 158 | 
  161 | 
  
        boost::shared_ptr<rst::robot::MouthTarget> request(new rst::robot::MouthTarget());
 
   | 
  | 159 | 
  162 | 
  
    
 
   | 
  | 160 | 
  163 | 
  
        request->set_position_left(  target.position_left);
 
   | 
  | ... | ... |  | 
  | 170 | 
  173 | 
  
        }else{
   | 
  | 171 | 
  174 | 
  
            hlrc_server->callAsync<rst::robot::MouthTarget>("mouth", request);
   | 
  | 172 | 
  175 | 
  
        }
 
   | 
   | 
  176 | 
  
    */
 
   | 
   | 
  177 | 
  
        printf("> ERROR: mouth targets not yet implemented in RSB middleware!\n");
   | 
  | 173 | 
  178 | 
  
    }
 
   | 
  | 174 | 
  179 | 
  
    
 
   | 
  | 175 | 
  180 | 
  
    void MiddlewareRSB::publish_head_animation(RobotHeadAnimation a, bool blocking){
   | 
  | 176 | 
   | 
  
        boost::shared_ptr<rst::robot::Animation> request(new rst::robot::Animation());
 
   | 
   | 
  181 | 
  
        boost::shared_ptr<rst::animation::HeadAnimation> request(new rst::animation::HeadAnimation());
 
   | 
  | 177 | 
  182 | 
  
    
 
   | 
  | 178 | 
  183 | 
  
        switch(a.value){
   | 
  | 179 | 
  184 | 
  
            default:
 
   | 
  | 180 | 
  185 | 
  
                printf("> WANRING: invalid animation id %d. defaulting to IDLE",a.value);
   | 
  | 181 | 
  186 | 
  
                //fall through:
 
   | 
  | 182 | 
  187 | 
  
            case(RobotHeadAnimation::IDLE):
 
   | 
  | 183 | 
   | 
  
                request->set_target(rst::robot::Animation::IDLE);
 
   | 
   | 
  188 | 
  
                request->set_animation(rst::animation::HeadAnimation::IDLE);
 
   | 
  | 184 | 
  189 | 
  
                break;
 
   | 
  | 185 | 
  190 | 
  
            case(RobotHeadAnimation::HEAD_NOD):
 
   | 
  | 186 | 
   | 
  
                request->set_target(rst::robot::Animation::HEAD_NOD);
 
   | 
   | 
  191 | 
  
                request->set_animation(rst::animation::HeadAnimation::HEAD_NOD);
 
   | 
  | 187 | 
  192 | 
  
                break;
 
   | 
  | 188 | 
  193 | 
  
            case(RobotHeadAnimation::HEAD_SHAKE):
 
   | 
  | 189 | 
   | 
  
                request->set_target(rst::robot::Animation::HEAD_SHAKE);
 
   | 
   | 
  194 | 
  
                request->set_animation(rst::animation::HeadAnimation::HEAD_SHAKE);
 
   | 
  | 190 | 
  195 | 
  
                break;
 
   | 
  | 191 | 
  196 | 
  
            case(RobotHeadAnimation::EYEBLINK_L):
 
   | 
  | 192 | 
   | 
  
                request->set_target(rst::robot::Animation::EYEBLINK_L);
 
   | 
   | 
  197 | 
  
                request->set_animation(rst::animation::HeadAnimation::EYEBLINK_LEFT);
 
   | 
  | 193 | 
  198 | 
  
                break;
 
   | 
  | 194 | 
  199 | 
  
            case(RobotHeadAnimation::EYEBLINK_R):
 
   | 
  | 195 | 
   | 
  
                request->set_target(rst::robot::Animation::EYEBLINK_R);
 
   | 
   | 
  200 | 
  
                request->set_animation(rst::animation::HeadAnimation::EYEBLINK_RIGHT);
 
   | 
  | 196 | 
  201 | 
  
                break;
 
   | 
  | 197 | 
  202 | 
  
            case(RobotHeadAnimation::EYEBLINK_BOTH):
 
   | 
  | 198 | 
   | 
  
                request->set_target(rst::robot::Animation::EYEBLINK_BOTH);
 
   | 
   | 
  203 | 
  
                request->set_animation(rst::animation::HeadAnimation::EYEBLINK_BOTH);
 
   | 
  | 199 | 
  204 | 
  
                break;
 
   | 
  | 200 | 
  205 | 
  
            case(RobotHeadAnimation::EYEBROWS_RAISE):
 
   | 
  | 201 | 
   | 
  
                request->set_target(rst::robot::Animation::EYEBROWS_RAISE);
 
   | 
   | 
  206 | 
  
                request->set_animation(rst::animation::HeadAnimation::EYEBROWS_RAISE);
 
   | 
  | 202 | 
  207 | 
  
                break;
 
   | 
  | 203 | 
  208 | 
  
            case(RobotHeadAnimation::EYEBROWS_LOWER):
 
   | 
  | 204 | 
   | 
  
                request->set_target(rst::robot::Animation::EYEBROWS_LOWER);
 
   | 
   | 
  209 | 
  
                request->set_animation(rst::animation::HeadAnimation::EYEBROWS_LOWER);
 
   | 
   | 
  210 | 
  
                break;
 
   | 
   | 
  211 | 
  
            case(RobotHeadAnimation::ENGAGEMENT_LEFT):
 
   | 
   | 
  212 | 
  
                request->set_animation(rst::animation::HeadAnimation::ENGAGEMENT_LEFT);
 
   | 
   | 
  213 | 
  
                break;
 
   | 
   | 
  214 | 
  
            case(RobotHeadAnimation::ENGAGEMENT_RIGHT):
 
   | 
   | 
  215 | 
  
                request->set_animation(rst::animation::HeadAnimation::ENGAGEMENT_RIGHT);
 
   | 
  | 205 | 
  216 | 
  
                break;
 
   | 
  | 206 | 
  217 | 
  
        }
 
   | 
  | 207 | 
  218 | 
  
    
 
   | 
  | 208 | 
  219 | 
  
        request->set_repetitions(a.repetitions);
 
   | 
  | 209 | 
   | 
  
        request->set_scale(a.scale);
 
   | 
   | 
  220 | 
  
        request->set_emphasis_scale(a.scale);
 
   | 
  | 210 | 
  221 | 
  
        request->set_duration_each(a.time_ms);
 
   | 
  | 211 | 
  222 | 
  
    
 
   | 
  | 212 | 
  223 | 
  
        if (blocking){
   | 
  | 213 | 
   | 
  
            hlrc_server->call<rst::robot::Animation>("animation", request);
   | 
   | 
  224 | 
  
            hlrc_server->call<rst::animation::HeadAnimation>("animation", request);
   | 
  | 214 | 
  225 | 
  
        }else{
   | 
  | 215 | 
   | 
  
            hlrc_server->callAsync<rst::robot::Animation>("animation", request);
   | 
   | 
  226 | 
  
            hlrc_server->callAsync<rst::animation::HeadAnimation>("animation", request);
   | 
  | 216 | 
  227 | 
  
        }
 
   | 
  | 217 | 
  228 | 
  
    }
 
   | 
  | 218 | 
  229 | 
  
    
 
   |