Revision cc3bdc80 examples/yarp_icub/src/icub_jointinterface.cpp
examples/yarp_icub/src/icub_jointinterface.cpp | ||
---|---|---|
61 | 61 |
enum_id_bimap.insert(enum_id_bimap_entry_t(ICUB_ID_EYES_RIGHT_BROW, ID_EYES_RIGHT_BROW)); |
62 | 62 |
|
63 | 63 |
//init pd control variables |
64 |
enum_id_bimap_t::right_const_iterator it; |
|
65 |
for(it = enum_id_bimap.left.begin(); it == enum_id_bimap.left.end(); it++) { |
|
66 |
last_position_error[*it] = 0.0; |
|
64 |
enum_id_bimap_t::const_iterator it; |
|
65 |
for(it = enum_id_bimap.begin(); it != enum_id_bimap.end(); ++it) { |
|
66 |
int id = it->left; |
|
67 |
last_position_error[id] = 0.0; |
|
67 | 68 |
PID_P[id] = 0.5; |
68 | 69 |
PID_D[id] = 0.1; |
69 | 70 |
} |
... | ... | |
207 | 208 |
void iCubJointInterface::set_target_in_velocitymode(int id){ |
208 | 209 |
// set speed cacluated as in velocity + set position -> replicates smoothmotion from flobi?! |
209 | 210 |
//first: calculate necessary speed to reach the given target within the next clock tick: |
210 |
double distance = value - target_angle_previous[id];
|
|
211 |
double distance = target_angle[id] - target_angle_previous[id];
|
|
211 | 212 |
|
212 | 213 |
//make the motion smooth: we want to reach 85% of the target in the next iteration: |
213 | 214 |
distance = 0.85 * distance; |
... | ... | |
241 | 242 |
//TODO: add interpolation into future! |
242 | 243 |
//humotion::Timestamp data_ts = humotion::Timestamp::now(); and extend get_interpol value with get_future_value |
243 | 244 |
double position_error = target_angle[id] - get_ts_position(id).get_interpolated_value(data_ts); |
244 |
double error_d = (position_error - last_position_error[id]) / (((double) rate)*1000.0);
|
|
245 |
double error_d = (position_error - last_position_error[id]) / (framerate*1000.0);
|
|
245 | 246 |
last_position_error[id] = position_error; |
246 | 247 |
//finally do a PD loop to get the target velocity |
247 | 248 |
double target_velocity = PID_P[id] * position_error + PID_D[id]*error_d + speed; |
248 | 249 |
|
249 | 250 |
//if (id == ICUB_ID_NECK_PAN) speed = -speed; |
250 | 251 |
ivel->velocityMove(id, target_velocity); |
251 |
printf("> VEL now=%3.2f target=%3.2f --> dist=%3.2f speed=%3.2f\n",target_angle_previous[id],value,distance,speed);
|
|
252 |
printf("> VEL now=%3.2f target=%3.2f --> dist=%3.2f speed=%3.2f\n",target_angle_previous[id],target_angle[id],distance,speed);
|
|
252 | 253 |
} |
253 | 254 |
|
254 | 255 |
target_angle_previous[id] = get_ts_position(convert_motorid_to_enum(id)).get_newest_value(); |
... | ... | |
261 | 262 |
if (POSITION_CONTROL){ |
262 | 263 |
//position control |
263 | 264 |
for(int i=ICUB_ID_NECK_TILT; i<=ICUB_ID_EYES_VERGENCE; i++){ |
264 |
set_target_in_positionmode(i, target_angle[i]);
|
|
265 |
set_target_in_positionmode(i); |
|
265 | 266 |
} |
266 | 267 |
}else{ |
267 | 268 |
//velocity control |
268 | 269 |
for(int i=ICUB_ID_NECK_TILT; i<=ICUB_ID_EYES_VERGENCE; i++){ |
269 |
set_target_in_velocitymode(i, target_angle[i]);
|
|
270 |
set_target_in_velocitymode(i); |
|
270 | 271 |
} |
271 | 272 |
} |
272 | 273 |
//printf("> TARGET PAN = %3.2f\n",target_angle[ICUB_ID_NECK_PAN]); |
Also available in: Unified diff