Revision 89374d69 src/server/controller.cpp
| 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