Statistics
| Branch: | Tag: | Revision:

humotion / examples / yarp_icub / src / icub_data_receiver.cpp @ 35b3ca25

History | View | Annotate | Download (3.101 KB)

1
#include "icub_data_receiver.h"
2
#include <humotion/server/joint_interface.h>
3
#include <yarp/os/Property.h>
4
//using namespace yarp::dev;
5
//using namespace yarp::sig;
6
//using namespace yarp::os;
7
using std::cout;
8
using std::string;
9

    
10
using humotion::server::JointInterface;
11
using yarp::dev::IEncodersTimed;
12
using yarp::sig::Vector;
13

    
14
iCubDataReceiver::iCubDataReceiver(int period, iCubJointInterface *icub_jointinterface)
15
    : yarp::os::RateThread(period) {
16

    
17
    // store pointer to icub jointinterface
18
    icub_jointinterface_ = icub_jointinterface;
19

    
20
    //fetch yarp iencs view:
21
    yarp::dev::PolyDriver *poly_driver = icub_jointinterface->get_yarp_polydriver();
22
    bool success = poly_driver->view(yarp_iencs_);
23
    if (!success) {
24
        cout << "ERROR: polydriver failed to init iencs view\n";
25
        exit(EXIT_FAILURE);
26
    }
27

    
28
    // resize data storage vectors to match the number of axes:
29
    int joints;
30
    yarp_iencs_->getAxes(&joints);
31
    yarp_positions_.resize(joints);
32
    yarp_timestamps_.resize(joints);
33
}
34

    
35
bool iCubDataReceiver::threadInit() {
36
    return true;
37
}
38

    
39
void iCubDataReceiver::threadRelease() {
40
}
41

    
42
void iCubDataReceiver::run() {
43
    //grab pos+vel data:
44
    yarp_iencs_->getEncodersTimed(yarp_positions_.data(), yarp_timestamps_.data());
45
    //iencs->getEncoderSpeeds(velocities.data());
46

    
47
    //publish data to humotion
48
    for(int i=0; i<yarp_positions_.size(); i++){
49
        store_incoming_position(i, yarp_positions_[i], yarp_timestamps_[i]);
50
    }
51

    
52
    //small hack to tell humotion to update the lid angle
53
    //fixme: use real id
54
    store_incoming_position(100, 0.0, yarp_timestamps_[0]);
55
}
56

    
57
void iCubDataReceiver::store_incoming_position(int icub_id, double value, double timestamp) {
58
    // store joint position in humotion backend
59
    if ((icub_id == iCubJointInterface::ICUB_ID_EYES_PAN) ||
60
            (icub_id == iCubJointInterface::ICUB_ID_EYES_VERGENCE)) {
61
        // the icub handles eyes differently
62
        // instead of using seperate left/right pan the icub uses
63
        // a combined pan angle and vergence. therfore we have to convert this here:
64
        if (icub_id == iCubJointInterface::ICUB_ID_EYES_PAN) {
65
            target_eye_pan_ = value;
66
        } else {
67
            target_eye_vergence_ = value;
68
        }
69

    
70
        float left  = target_eye_pan_ + target_eye_vergence_/2.0;
71
        float right = target_eye_pan_ - target_eye_vergence_/2.0;
72

    
73
        icub_jointinterface_->store_incoming_position(JointInterface::ID_EYES_LEFT_LR,
74
                                                     left, timestamp);
75
        icub_jointinterface_->store_incoming_position(JointInterface::ID_EYES_RIGHT_LR,
76
                                                     right, timestamp);
77
    } else if (icub_id == 100) {
78
        //HACK
79
        //icub_jointinterface->store_incoming_position(ID_EYES_RIGHT_LID_UPPER,
80
        //                                             lid_angle, timestamp);
81
    } else {
82
        // known configured mapping between joint ids
83
        int humotion_id = icub_jointinterface_->convert_icub_jointid_to_humotion(icub_id);
84
        icub_jointinterface_->store_incoming_position(humotion_id, value, timestamp);
85
    }
86
}