Revision 89374d69
| examples/meka/src/main.cpp | ||
|---|---|---|
| 22 | 22 | 
     | 
| 23 | 23 | 
    */  | 
| 24 | 24 | 
     | 
| 25 | 
        if (argc != 4){
   | 
|
| 26 | 
            printf("> ERROR: invalid number of parameters passed to server!\n\nusage: %s <humotion base topic> <jointstates topic> <control topic> (example: %s /meka /joint_states /meka_roscontrol/head_position_trajectory_controller/command)\n\n",argv[0],argv[0]);
   | 
|
| 27 | 
    exit(EXIT_FAILURE);  | 
|
| 28 | 
    }  | 
|
| 29 | 
     | 
|
| 25 | 30 | 
    //create humotion interface  | 
| 26 | 
    string scope = "/";  | 
|
| 27 | 
    MekaJointInterface *jointinterface = new MekaJointInterface(scope);  | 
|
| 28 | 
        humotion::server::Server *humotion_server = new humotion::server::Server("/flobi", "ROS", jointinterface);
   | 
|
| 31 | 
    string humotion_scope = argv[1];  | 
|
| 32 | 
    string jointstates_scope = argv[2];  | 
|
| 33 | 
    string control_scope = argv[3];  | 
|
| 34 | 
     | 
|
| 35 | 
     | 
|
| 36 | 
    MekaJointInterface *jointinterface = new MekaJointInterface(jointstates_scope, control_scope);  | 
|
| 37 | 
    humotion::server::Server *humotion_server = new humotion::server::Server(humotion_scope, "ROS", jointinterface);  | 
|
| 29 | 38 | 
     | 
| 30 | 39 | 
    //finally run it  | 
| 31 | 40 | 
    jointinterface->run();  | 
| examples/meka/src/mekajointinterface.cpp | ||
|---|---|---|
| 57 | 57 | 
    //! constructor  | 
| 58 | 58 | 
    MekaJointInterface::MekaJointInterface(string _scope) : humotion::server::JointInterface(){
   | 
| 59 | 59 | 
    scope = _scope;  | 
| 60 | 
        string js_topic = scope + "joint_states";
   | 
|
| 61 | 
    string target_topic = scope + "meka_roscontrol/head_position_trajectory_controller/command";  | 
|
| 60 | 
        string js_topic     = scope + "/joint_states";
   | 
|
| 61 | 
        string target_topic = scope + "/meka_roscontrol/head_position_trajectory_controller/command";
   | 
|
| 62 | 62 | 
     | 
| 63 | 63 | 
    //subscribe to meka joint states  | 
| 64 | 64 | 
    int argc = 0;  | 
| include/humotion/server/controller.h | ||
|---|---|---|
| 49 | 49 | 
     | 
| 50 | 50 | 
    private:  | 
| 51 | 51 | 
    void add_motion_generator(MotionGenerator *m);  | 
| 52 | 
    GazeState relative_gaze_to_absolute_gaze(GazeState relative);  | 
|
| 52 | 53 | 
     | 
| 53 | 54 | 
    typedef std::vector<MotionGenerator *> motion_generator_vector_t;  | 
| 54 | 55 | 
    motion_generator_vector_t motion_generator_vector;  | 
| src/client/middleware_ros.cpp | ||
|---|---|---|
| 131 | 131 | 
    msg.eyeblink_request_left = gaze_state.eyeblink_request_left;  | 
| 132 | 132 | 
    msg.eyeblink_request_right = gaze_state.eyeblink_request_right;  | 
| 133 | 133 | 
     | 
| 134 | 
    msg.type = humotion::gaze::ABSOLUTE;  | 
|
| 134 | 
        if (gaze_state.type == GazeState::ABSOLUTE){
   | 
|
| 135 | 
    msg.type = humotion::gaze::ABSOLUTE;  | 
|
| 136 | 
        }else{
   | 
|
| 137 | 
    msg.type = humotion::gaze::RELATIVE;  | 
|
| 138 | 
    }  | 
|
| 135 | 139 | 
     | 
| 136 | 140 | 
    //add position to send queue  | 
| 137 | 141 | 
    gaze_target_publisher.publish(msg);  | 
| src/client/middleware_rsb.cpp | ||
|---|---|---|
| 110 | 110 | 
    }  | 
| 111 | 111 | 
     | 
| 112 | 112 | 
    //! send mouth target to server  | 
| 113 | 
    void MiddlewareRSB::send_gaze_target(){
   | 
|
| 113 | 
    void MiddlewareRSB::send_gaze_target(int gaze_type){
   | 
|
| 114 | 114 | 
    //build target packet:  | 
| 115 | 115 | 
    boost::shared_ptr<rst::robot::HumotionGazeTarget> request(new rst::robot::HumotionGazeTarget());  | 
| 116 | 116 | 
     | 
| ... | ... | |
| 132 | 132 | 
    request->set_eyeblink_request_left(gaze_state.eyeblink_request_left);  | 
| 133 | 133 | 
    request->set_eyeblink_request_right(gaze_state.eyeblink_request_right);  | 
| 134 | 134 | 
     | 
| 135 | 
    request->set_type(rst::robot::HumotionGazeTarget::ABSOLUTE);  | 
|
| 135 | 
        if (gaze_state.type == GazeState::ABSOLUTE){
   | 
|
| 136 | 
    request->set_type(rst::robot::HumotionGazeTarget::ABSOLUTE);  | 
|
| 137 | 
        }else{
   | 
|
| 138 | 
    request->set_type(rst::robot::HumotionGazeTarget::RELATIVE);  | 
|
| 139 | 
    }  | 
|
| 140 | 
     | 
|
| 136 | 141 | 
     | 
| 137 | 142 | 
    //add position to send queue  | 
| 138 | 143 | 
    gaze_target_informer->publish(request);  | 
| src/server/controller.cpp | ||
|---|---|---|
| 86 | 86 | 
    }  | 
| 87 | 87 | 
    }  | 
| 88 | 88 | 
     | 
| 89 | 
    GazeState Controller::relative_gaze_to_absolute_gaze(GazeState relative){
   | 
|
| 90 | 
    GazeState absolute_gaze = relative;  | 
|
| 91 | 
     | 
|
| 92 | 
    //incoming gaze state wants to set a relative gaze angle  | 
|
| 93 | 
    //in order to calc the new absolute gaze, we need to go back  | 
|
| 94 | 
    //in time and find out where the head was pointing at that specific time:  | 
|
| 95 | 
    double relative_target_timestamp = relative.timestamp;  | 
|
| 96 | 
     | 
|
| 97 | 
    //fetch head / camera pose during that timestamp:  | 
|
| 98 | 
    double neck_pan = joint_interface->get_ts_position(JointInterface::ID_NECK_PAN).get_interpolated_value(relative_target_timestamp);  | 
|
| 99 | 
    double eye_l_pan = joint_interface->get_ts_position(JointInterface::ID_EYES_LEFT_LR).get_interpolated_value(relative_target_timestamp);  | 
|
| 100 | 
    double eye_r_pan = joint_interface->get_ts_position(JointInterface::ID_EYES_RIGHT_LR).get_interpolated_value(relative_target_timestamp);  | 
|
| 101 | 
    double pan = neck_pan + (eye_l_pan + eye_r_pan)/2.0;  | 
|
| 102 | 
    //  | 
|
| 103 | 
    double neck_tilt = joint_interface->get_ts_position(JointInterface::ID_NECK_TILT).get_interpolated_value(relative_target_timestamp);  | 
|
| 104 | 
    double eye_tilt = joint_interface->get_ts_position(JointInterface::ID_EYES_BOTH_UD).get_interpolated_value(relative_target_timestamp);  | 
|
| 105 | 
    double tilt = neck_tilt + eye_tilt;  | 
|
| 106 | 
    //  | 
|
| 107 | 
    double roll = joint_interface->get_ts_position(JointInterface::ID_NECK_ROLL).get_interpolated_value(relative_target_timestamp);  | 
|
| 108 | 
     | 
|
| 109 | 
    //build up absolute target:  | 
|
| 110 | 
    absolute_gaze.type = GazeState::ABSOLUTE;  | 
|
| 111 | 
    absolute_gaze.pan = pan + relative.pan;  | 
|
| 112 | 
    absolute_gaze.tilt = tilt + relative.tilt;  | 
|
| 113 | 
    absolute_gaze.roll = roll + relative.roll;  | 
|
| 114 | 
     | 
|
| 115 | 
    //FIXME: use ros TF for that calculation...  | 
|
| 116 | 
    //see http://wiki.ros.org/tf/Tutorials/Time%20travel%20with%20tf%20%28C%2B%2B%29  | 
|
| 117 | 
    //ros::Time past = now - ros::Duration(5.0);  | 
|
| 118 | 
        //listener.waitForTransform("/turtle2", now,J "/turtle1", past, "/world", ros::Duration(1.0));
   | 
|
| 119 | 
        //listener.lookupTransform("/turtle2", now, "/turtle1", past, "/world", transform);
   | 
|
| 120 | 
     | 
|
| 121 | 
    return absolute_gaze;  | 
|
| 122 | 
    }  | 
|
| 123 | 
     | 
|
| 124 | 
     | 
|
| 89 | 125 | 
     | 
| 90 | 126 | 
    //! update gaze target:  | 
| 91 | 127 | 
    //! \param GazeState with target values for the overall gaze  | 
| 92 | 128 | 
    void Controller::set_gaze_target(GazeState new_gaze_target){
   | 
| 129 | 
    GazeState target_gaze;  | 
|
| 130 | 
     | 
|
| 131 | 
    //relative or absolute gaze update?  | 
|
| 132 | 
        if (new_gaze_target.type == GazeState::RELATIVE){
   | 
|
| 133 | 
    //relative gaze target -> calculate target angles  | 
|
| 134 | 
    target_gaze = relative_gaze_to_absolute_gaze(new_gaze_target);  | 
|
| 135 | 
        }else{
   | 
|
| 136 | 
    //already absolute gaze, set this  | 
|
| 137 | 
    target_gaze = new_gaze_target;  | 
|
| 138 | 
    }  | 
|
| 139 | 
     | 
|
| 140 | 
     | 
|
| 93 | 141 | 
        for(motion_generator_vector_t::iterator it = motion_generator_vector.begin(); it<motion_generator_vector.end(); it++){
   | 
| 94 | 
            (*it)->set_gaze_target(new_gaze_target);
   | 
|
| 142 | 
            (*it)->set_gaze_target(target_gaze);
   | 
|
| 95 | 143 | 
    }  | 
| 96 | 144 | 
    }  | 
| 97 | 145 | 
     | 
Also available in: Unified diff