Statistics
| Branch: | Tag: | Revision:

humotion / examples / yarp_icub / src / icub_data_receiver.cpp @ bb35ea6e

History | View | Annotate | Download (3.218 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
    printf("\n");
53

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

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

    
73
        float left  = target_eye_pan_ + target_eye_vergence_/2.0;
74
        float right = target_eye_pan_ - target_eye_vergence_/2.0;
75

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