Revision 0c8d22a5 src/server/motion_generator.cpp
| src/server/motion_generator.cpp | ||
|---|---|---|
| 25 | 25 |
* Excellence Initiative. |
| 26 | 26 |
*/ |
| 27 | 27 |
|
| 28 |
#include "server/motion_generator.h"
|
|
| 29 |
#include "boost/date_time/posix_time/posix_time.hpp"
|
|
| 28 |
#include <boost/date_time/posix_time/posix_time.hpp>
|
|
| 29 |
#include "humotion/server/motion_generator.h"
|
|
| 30 | 30 |
|
| 31 |
using namespace std; |
|
| 32 |
using namespace humotion; |
|
| 33 |
using namespace humotion::server; |
|
| 34 |
using namespace boost; |
|
| 31 |
using humotion::server::MotionGenerator; |
|
| 35 | 32 |
|
| 36 | 33 |
//! constructor |
| 37 |
MotionGenerator::MotionGenerator(JointInterface *j){
|
|
| 34 |
MotionGenerator::MotionGenerator(JointInterface *j) {
|
|
| 38 | 35 |
joint_interface = j; |
| 39 |
last_mouth_target_update = posix_time::ptime(posix_time::min_date_time);
|
|
| 40 |
last_gaze_target_update = posix_time::ptime(posix_time::min_date_time);
|
|
| 36 |
last_mouth_target_update = boost::posix_time::ptime(boost::posix_time::min_date_time);
|
|
| 37 |
last_gaze_target_update = boost::posix_time::ptime(boost::posix_time::min_date_time);
|
|
| 41 | 38 |
} |
| 42 | 39 |
|
| 43 | 40 |
|
| 44 | 41 |
//! destructor |
| 45 |
MotionGenerator::~MotionGenerator(){
|
|
| 42 |
MotionGenerator::~MotionGenerator() {
|
|
| 46 | 43 |
} |
| 47 | 44 |
|
| 48 | 45 |
//! fetch the latest position and velocity and return the timestamp of that dataset |
| ... | ... | |
| 61 | 58 |
//! fetch the latest (=current) speed of a joint |
| 62 | 59 |
//! \param joint_id |
| 63 | 60 |
//! \return float value of joint speed |
| 64 |
float MotionGenerator::get_current_speed(int joint_id){
|
|
| 61 |
float MotionGenerator::get_current_speed(int joint_id) {
|
|
| 65 | 62 |
return joint_interface->get_ts_speed(joint_id).get_newest_value(); |
| 66 | 63 |
} |
| 67 | 64 |
|
| 68 | 65 |
//! fetch the latest (=current) position of a joint |
| 69 | 66 |
//! \param joint_id |
| 70 | 67 |
//! \return float value of joint position |
| 71 |
float MotionGenerator::get_current_position(int joint_id){
|
|
| 68 |
float MotionGenerator::get_current_position(int joint_id) {
|
|
| 72 | 69 |
/*Timestamp tsl = joint_interface->get_ts_position(joint_id).get_last_timestamp(); |
| 73 | 70 |
Timestamp now = Timestamp::now(); |
| 74 | 71 |
Timestamp diff=now-tsl; |
| ... | ... | |
| 79 | 76 |
|
| 80 | 77 |
//! update gaze target: |
| 81 | 78 |
//! \param GazeState with target values for the overall gaze |
| 82 |
void MotionGenerator::set_gaze_target(GazeState new_gaze_target){
|
|
| 83 |
//store value for next iteration |
|
| 79 |
void MotionGenerator::set_gaze_target(GazeState new_gaze_target) {
|
|
| 80 |
// store value for next iteration
|
|
| 84 | 81 |
requested_gaze_state = new_gaze_target; |
| 85 | 82 |
|
| 86 |
//keep track if the gaze targets are comming in regulary |
|
| 87 |
last_gaze_target_update = get_system_time(); |
|
| 83 |
// keep track if the gaze targets are comming in regulary
|
|
| 84 |
last_gaze_target_update = boost::get_system_time();
|
|
| 88 | 85 |
} |
| 89 | 86 |
|
| 90 | 87 |
//! update mouth state: |
| 91 | 88 |
//! \param MouthState with target values for the mouth joints |
| 92 |
void MotionGenerator::set_mouth_target(MouthState s){
|
|
| 93 |
//store value |
|
| 89 |
void MotionGenerator::set_mouth_target(MouthState s) {
|
|
| 90 |
// store value
|
|
| 94 | 91 |
requested_mouth_target = s; |
| 95 | 92 |
|
| 96 |
//keep track if the mouth targets are comming in regulary |
|
| 97 |
last_mouth_target_update = get_system_time(); |
|
| 93 |
// keep track if the mouth targets are comming in regulary
|
|
| 94 |
last_mouth_target_update = boost::get_system_time();
|
|
| 98 | 95 |
} |
| 99 | 96 |
|
| 100 | 97 |
|
| 101 | 98 |
//! was there incoming gaze data the last second? |
| 102 | 99 |
//! \return true if there was data incoming in the last second, false otherwise |
| 103 |
bool MotionGenerator::gaze_target_input_active(){
|
|
| 104 |
if (last_gaze_target_update + posix_time::milliseconds(1000) > get_system_time() ){
|
|
| 105 |
//incoming data -> if gaze is disabled, enable it! |
|
| 100 |
bool MotionGenerator::gaze_target_input_active() {
|
|
| 101 |
if (last_gaze_target_update + boost::posix_time::milliseconds(1000) |
|
| 102 |
> boost::get_system_time() ) {
|
|
| 103 |
// incoming data -> if gaze is disabled, enable it! |
|
| 106 | 104 |
joint_interface->enable_gaze_joints(); |
| 107 | 105 |
return true; |
| 108 |
}else{
|
|
| 109 |
//no incoming data, disable! |
|
| 110 |
joint_interface->disable_gaze_joints(); |
|
| 111 |
return false; |
|
| 112 | 106 |
} |
| 107 |
|
|
| 108 |
// else: no incoming data, disable! |
|
| 109 |
joint_interface->disable_gaze_joints(); |
|
| 110 |
return false; |
|
| 113 | 111 |
} |
| 114 | 112 |
|
| 115 | 113 |
//! was there incoming mouth data the last second? |
| 116 | 114 |
//! \return true if there was data incoming in the last second, false otherwise |
| 117 |
bool MotionGenerator::mouth_target_input_active(){
|
|
| 118 |
if (last_mouth_target_update + posix_time::milliseconds(1000) > get_system_time() ){
|
|
| 119 |
//incoming data -> if mouth is disabled, enable it! |
|
| 115 |
bool MotionGenerator::mouth_target_input_active() {
|
|
| 116 |
if (last_mouth_target_update + boost::posix_time::milliseconds(1000) |
|
| 117 |
> boost::get_system_time() ) {
|
|
| 118 |
// incoming data -> if mouth is disabled, enable it! |
|
| 120 | 119 |
joint_interface->enable_mouth_joints(); |
| 121 | 120 |
return true; |
| 122 |
}else{
|
|
| 123 |
//no incoming data, disable! |
|
| 124 |
joint_interface->disable_mouth_joints(); |
|
| 125 |
return false; |
|
| 126 | 121 |
} |
| 122 |
|
|
| 123 |
// else: no incoming data, disable! |
|
| 124 |
joint_interface->disable_mouth_joints(); |
|
| 125 |
return false; |
|
| 127 | 126 |
} |
| 128 | 127 |
|
| 129 | 128 |
//! limit target to min/max bounds: |
| 130 |
float MotionGenerator::limit_target(int joint_id, float val){
|
|
| 129 |
float MotionGenerator::limit_target(int joint_id, float val) {
|
|
| 131 | 130 |
assert(joint_id < JointInterface::JOINT_ID_ENUM_SIZE); |
| 132 | 131 |
|
| 133 |
//fetch min/max for joint: |
|
| 132 |
// fetch min/max for joint:
|
|
| 134 | 133 |
float min = joint_interface->get_joint_min(joint_id); |
| 135 | 134 |
float max = joint_interface->get_joint_max(joint_id); |
| 136 | 135 |
|
| 137 |
if (max < min){
|
|
| 138 |
printf("> ERROR: how can min (%4.2f) be bigger than max (%4.2f)?? FIX THIS! EXITING NOW\n",min,max);
|
|
| 136 |
if (max < min) {
|
|
| 137 |
printf("> ERROR: how can min (%4.2f) be bigger than max (%4.2f)?? EXITING NOW\n", min, max);
|
|
| 138 |
printf("> HINT : did you initialize the joints' min/max positions properly?\n");
|
|
| 139 | 139 |
exit(0); |
| 140 | 140 |
} |
| 141 | 141 |
|
Also available in: Unified diff