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