diff --git a/include/darwin_head_tracking.h b/include/darwin_head_tracking.h new file mode 100644 index 0000000000000000000000000000000000000000..8ce3a4ede81186f40294b55fa9836f1eec776e45 --- /dev/null +++ b/include/darwin_head_tracking.h @@ -0,0 +1,27 @@ +#ifndef _DARWIN_HEAD_TRACKING_H +#define _DARWIN_HEAD_TRACKING_H + +#include "darwin_robot_base.h" +#include "darwin_registers.h" + +class CDarwinHeadTracking : public CDarwinRobotBase +{ + public: + CDarwinHeadTracking(const std::string &name,std::string &bus_id,int bus_speed, unsigned char id,bool sim=false); + void set_pan_pid(double p,double i,double d,double i_clamp); + void get_pan_pid(double *p,double *i,double *d,double *i_clamp); + void set_tilt_pid(double p,double i,double d,double i_clamp); + void get_tilt_pid(double *p,double *i,double *d,double *i_clamp); + void set_pan_range(double max,double min); + void get_pan_range(double *max,double *min); + void set_tilt_range(double max,double min); + void get_tilt_range(double *max,double *min); + void start_tracking(double pan,double tilt); + void stop_tracking(void); + bool is_tracking(void); + void set_new_target(double pan,double tilt); + void get_current_target(double *pan,double *tilt); + ~CDarwinHeadTracking(); +}; + +#endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 47fa514beeab58b0e4be2ad2791b8efd2ead8ea5..8c6a06879f30ef8a4e47d15e165065736a09d4ff 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -11,9 +11,9 @@ SET(KDL_INSTALL /opt/ros/indigo) INCLUDE (${PROJECT_SOURCE_DIR}/FindKDL.cmake) # driver source files -SET(robot_sources darwin_robot_base.cpp darwin_robot_exceptions.cpp darwin_imu.cpp darwin_dyn_manager.cpp darwin_mmanager.cpp darwin_action.cpp darwin_balance.cpp darwin_joint_motion.cpp darwin_walk.cpp) +SET(robot_sources darwin_robot_base.cpp darwin_robot_exceptions.cpp darwin_imu.cpp darwin_dyn_manager.cpp darwin_mmanager.cpp darwin_action.cpp darwin_balance.cpp darwin_joint_motion.cpp darwin_walk.cpp darwin_head_tracking.cpp) # application header files -SET(robot_headers ../include/darwin_robot.h ../include/darwin_robot_exceptions.h ../include/darwin_imu.h ../include/darwin_dyn_manager.h ../include/darwin_mmanager.h ../include/darwin_action.h ../include/darwin_balance.h ../include/darwin_joint_motion.h ../include/darwin_walk.h) +SET(robot_headers ../include/darwin_robot.h ../include/darwin_robot_exceptions.h ../include/darwin_imu.h ../include/darwin_dyn_manager.h ../include/darwin_mmanager.h ../include/darwin_action.h ../include/darwin_balance.h ../include/darwin_joint_motion.h ../include/darwin_walk.h ../include/darwin_head_tracking.h) # locate the necessary dependencies FIND_PACKAGE(iriutils REQUIRED) diff --git a/src/darwin_head_tracking.cpp b/src/darwin_head_tracking.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1b1119a5df9a8b5a1eea35974a7cc6ac93be996b --- /dev/null +++ b/src/darwin_head_tracking.cpp @@ -0,0 +1,176 @@ +#include "darwin_head_tracking.h" +#include "darwin_robot_exceptions.h" + +CDarwinHeadTracking::CDarwinHeadTracking(const std::string &name,std::string &bus_id,int bus_speed, unsigned char id,bool sim) : CDarwinRobotBase(name,bus_id,bus_speed,id,sim) +{ +} + +// head tracking interface +void CDarwinHeadTracking::set_pan_pid(double p,double i,double d,double i_clamp) +{ + unsigned short int value; + + this->is_valid(); + value=p*65536.0; + this->robot_device->write_word_register(HEAD_TRACKING_PAN_P_GAIN,value); + usleep(10000); + value=i*65536.0; + this->robot_device->write_word_register(HEAD_TRACKING_PAN_I_GAIN,value); + usleep(10000); + value=d*65536.0; + this->robot_device->write_word_register(HEAD_TRACKING_PAN_D_GAIN,value); + usleep(10000); + value=i_clamp*128.0; + this->robot_device->write_word_register(HEAD_TRACKING_PAN_I_CLAMP,value); + usleep(10000); +} + +void CDarwinHeadTracking::get_pan_pid(double *p,double *i,double *d,double *i_clamp) +{ + unsigned short int value; + + this->is_valid(); + this->robot_device->read_word_register(HEAD_TRACKING_PAN_P_GAIN,&value); + *p=((double)value)/65536.0; + this->robot_device->read_word_register(HEAD_TRACKING_PAN_I_GAIN,&value); + *i=((double)value)/65536.0; + this->robot_device->read_word_register(HEAD_TRACKING_PAN_D_GAIN,&value); + *d=((double)value)/65536.0; + this->robot_device->read_word_register(HEAD_TRACKING_PAN_I_CLAMP,&value); + *i_clamp=((double)value)/128.0; +} + +void CDarwinHeadTracking::set_tilt_pid(double p,double i,double d,double i_clamp) +{ + unsigned short int value; + + this->is_valid(); + value=p*65536.0; + this->robot_device->write_word_register(HEAD_TRACKING_TILT_P_GAIN,value); + usleep(10000); + value=i*65536.0; + this->robot_device->write_word_register(HEAD_TRACKING_TILT_I_GAIN,value); + usleep(10000); + value=d*65536.0; + this->robot_device->write_word_register(HEAD_TRACKING_TILT_D_GAIN,value); + usleep(10000); + value=i_clamp*128.0; + this->robot_device->write_word_register(HEAD_TRACKING_TILT_I_CLAMP,value); + usleep(10000); +} + +void CDarwinHeadTracking::get_tilt_pid(double *p,double *i,double *d,double *i_clamp) +{ + unsigned short int value; + + this->is_valid(); + this->robot_device->read_word_register(HEAD_TRACKING_TILT_P_GAIN,&value); + *p=((double)value)/65536.0; + this->robot_device->read_word_register(HEAD_TRACKING_TILT_I_GAIN,&value); + *i=((double)value)/65536.0; + this->robot_device->read_word_register(HEAD_TRACKING_TILT_D_GAIN,&value); + *d=((double)value)/65536.0; + this->robot_device->read_word_register(HEAD_TRACKING_TILT_I_CLAMP,&value); + *i_clamp=((double)value)/128.0; +} + +void CDarwinHeadTracking::set_pan_range(double max,double min) +{ + unsigned short int value; + + this->is_valid(); + value=max*128.0; + this->robot_device->write_word_register(HEAD_TRACKING_MAX_PAN,value); + value=min*128.0; + this->robot_device->write_word_register(HEAD_TRACKING_MIN_PAN,value); +} + +void CDarwinHeadTracking::get_pan_range(double *max,double *min) +{ + unsigned short int value; + + this->is_valid(); + this->robot_device->read_word_register(HEAD_TRACKING_MAX_PAN,&value); + *max=((double)value)/128.0; + this->robot_device->read_word_register(HEAD_TRACKING_MIN_PAN,&value); + *min=((double)value)/128.0; +} + +void CDarwinHeadTracking::set_tilt_range(double max,double min) +{ + unsigned short int value; + + this->is_valid(); + value=max*128.0; + this->robot_device->write_word_register(HEAD_TRACKING_MAX_TILT,value); + value=min*128.0; + this->robot_device->write_word_register(HEAD_TRACKING_MIN_TILT,value); +} + +void CDarwinHeadTracking::get_tilt_range(double *max,double *min) +{ + unsigned short int value; + + this->is_valid(); + this->robot_device->read_word_register(HEAD_TRACKING_MAX_TILT,&value); + *max=((double)value)/128.0; + this->robot_device->read_word_register(HEAD_TRACKING_MIN_TILT,&value); + *min=((double)value)/128.0; +} + +void CDarwinHeadTracking::start_tracking(double pan,double tilt) +{ + unsigned short int value; + + this->is_valid(); + value=pan*128.0; + this->robot_device->write_word_register(HEAD_TRACKING_TARGET_PAN,value); + value=tilt*128.0; + this->robot_device->write_word_register(HEAD_TRACKING_TARGET_TILT,value); + this->robot_device->write_byte_register(HEAD_TRACKING_CONTROL,HEAD_TRACKING_START); +} + +void CDarwinHeadTracking::stop_tracking(void) +{ + this->is_valid(); + this->robot_device->write_byte_register(HEAD_TRACKING_CONTROL,HEAD_TRACKING_STOP); +} + +bool CDarwinHeadTracking::is_tracking(void) +{ + unsigned char value; + + this->is_valid(); + this->robot_device->read_byte_register(HEAD_TRACKING_CONTROL,&value); + if(value&HEAD_TRACKING_RUNNING) + return true; + else + return false; +} + +void CDarwinHeadTracking::set_new_target(double pan,double tilt) +{ + unsigned short int value; + + this->is_valid(); + value=pan*128.0; + this->robot_device->write_word_register(HEAD_TRACKING_TARGET_PAN,value); + value=tilt*128.0; + this->robot_device->write_word_register(HEAD_TRACKING_TARGET_TILT,value); +} + +void CDarwinHeadTracking::get_current_target(double *pan,double *tilt) +{ + unsigned short int value; + + this->is_valid(); + this->robot_device->read_word_register(HEAD_TRACKING_TARGET_PAN,&value); + *pan=((double)value)/128.0; + this->robot_device->read_word_register(HEAD_TRACKING_TARGET_TILT,&value); + *tilt=((double)value)/128.0; +} + +CDarwinHeadTracking::~CDarwinHeadTracking() +{ +} +