diff --git a/include/darwin_balance.h b/include/darwin_balance.h new file mode 100644 index 0000000000000000000000000000000000000000..053af76a789629a7c01cc9585c7f071ebc27562d --- /dev/null +++ b/include/darwin_balance.h @@ -0,0 +1,23 @@ +#ifndef _DARWIN_BALANCE_H +#define _DARWIN_BALANCE_H + +#include "darwin_robot_base.h" +#include "darwin_registers.h" + +typedef enum {FWD_FALL=0,BWD_FALL=1,STANDING=2} fall_t; + +class CDarwinBalance : public CDarwinRobotBase +{ + public: + CDarwinBalance(const std::string &name,std::string &bus_id,int bus_speed, unsigned char id,bool sim=false); + void enable(void); + void disable(void); + bool is_enabled(void); + bool has_fallen(void); + fall_t get_fallen_position(void); + void set_gains(double knee,double ankle_pitch,double hip_roll,double ankle_roll); + void get_gains(double *knee,double *ankle_pitch,double *hip_roll,double *ankle_roll); + ~CDarwinBalance(); +}; + +#endif diff --git a/include/darwin_imu.h b/include/darwin_imu.h index 925ce24ba723a00864af8b0fb77dc2e15d71f8d0..05dcec3f9f3d19e421841853890e611d06b6a648 100644 --- a/include/darwin_imu.h +++ b/include/darwin_imu.h @@ -4,8 +4,6 @@ #include "darwin_robot_base.h" #include "darwin_registers.h" -typedef enum {MM_FWD_FALL=0,MM_BWD_FALL=1,MM_STANDING=2} fall_t; - class CDarwinIMU : public CDarwinRobotBase { public: diff --git a/include/darwin_mmanager.h b/include/darwin_mmanager.h index 30aee7284c652aa522d5ddb895d63e4fc660d3c0..b7acd13fee648b1055c65945dda194563c401e69 100644 --- a/include/darwin_mmanager.h +++ b/include/darwin_mmanager.h @@ -10,8 +10,6 @@ extern const std::string servo_names[MAX_NUM_SERVOS]; /* available motion modules */ typedef enum {DARWIN_MM_NONE=0x07,DARWIN_MM_ACTION=0x00,DARWIN_MM_WALKING=0x01,DARWIN_MM_JOINTS=0x02,DARWIN_MM_HEAD=0x03,DARWIN_MM_GRIPPER=0x04} mm_mode_t; -typedef enum {MM_FWD_FALL=0,MM_BWD_FALL=1,MM_STANDING=2} fall_t; - class CDarwinMManager : public CDarwinDynManager { protected: @@ -27,22 +25,15 @@ class CDarwinMManager : public CDarwinDynManager void assign_module(unsigned char servo_id, mm_mode_t mode); void assign_module(std::string &servo,std::string &module); mm_mode_t get_module(unsigned char servo_id); -// void enable_balance(void); -// void disable_balance(void); -// bool is_balance_enabled(void); // void enable_power(void); // void disable_power(void); // bool is_power_enabled(void); -// bool has_fallen(void); -// fall_t get_fallen_position(void); // std::vector<double> get_servo_angles(void); // double get_servo_angle(unsigned char servo_id); // void set_servo_offset(unsigned char servo_id,double offset); // double get_servo_offset(unsigned char servo_id); // std::vector<double> get_servo_offsets(void); // void load_config(std::string &filename); -// void set_balance_gains(double knee,double ankle_pitch,double hip_roll,double ankle_roll); -// void get_balance_gains(double *knee,double *ankle_pitch,double *hip_roll,double *ankle_roll); virtual ~CDarwinMManager(); }; diff --git a/include/darwin_registers.h b/include/darwin_registers.h index 717a599996c5a6e36063d17b69ac106508f79e42..20ae712813e21fcc4fa31b69b721560cde5f4b30 100644 --- a/include/darwin_registers.h +++ b/include/darwin_registers.h @@ -47,5 +47,16 @@ #define IMU_ACCEL_Y_OFFSET 171 #define IMU_ACCEL_Z_OFFSET 173 +#define BALANCE_KNEE_GAIN_OFFSET 7 +#define BALANCE_ANKLE_ROLL_GAIN_OFFSET 9 +#define BALANCE_ANKLE_PITCH_GAIN_OFFSET 11 +#define BALANCE_HIP_ROLL_GAIN_OFFSET 13 + +#define BALANCE_CONTROL_OFFSET 175// bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 + // standing | bwd fall | fwd fall | | | | | enable + #define BALANCE_ENABLE 0x01 + #define BALANCE_STANDING 0x80 + #define BALANCE_BWD_FALL 0x40 + #define BALANCE_FWD_FALL 0x20 #endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 40bfbb9d64684005d55ca9b0577a80c7dd31b3e9..a1426e99afe2fa5a23a8310cdc7687ee2c8e33e3 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) +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) # 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) +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) # locate the necessary dependencies FIND_PACKAGE(iriutils REQUIRED) diff --git a/src/darwin_balance.cpp b/src/darwin_balance.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ae246ddeae7b7261e3440303eb9095cd618d65ce --- /dev/null +++ b/src/darwin_balance.cpp @@ -0,0 +1,110 @@ +#include "darwin_balance.h" +#include "darwin_robot_exceptions.h" + +CDarwinBalance::CDarwinBalance(const std::string &name,std::string &bus_id,int bus_speed, unsigned char id,bool sim) : CDarwinRobotBase(name,bus_id,bus_speed,id,sim) +{ +} + +void CDarwinBalance::enable(void) +{ + this->is_valid(); + this->robot_device->write_byte_register(BALANCE_CONTROL_OFFSET,BALANCE_ENABLE); +} + +void CDarwinBalance::disable(void) +{ + this->is_valid(); + this->robot_device->write_byte_register(BALANCE_CONTROL_OFFSET,0x00); +} + +bool CDarwinBalance::is_enabled(void) +{ + unsigned char value; + + this->is_valid(); + this->robot_device->read_byte_register(BALANCE_CONTROL_OFFSET,&value); + if(value&BALANCE_ENABLE) + return true; + else + return false; +} + +bool CDarwinBalance::has_fallen(void) +{ + unsigned char value; + + this->is_valid(); + this->robot_device->read_byte_register(BALANCE_CONTROL_OFFSET,&value); + if(value&(BALANCE_FWD_FALL | BALANCE_BWD_FALL)) + return true; + else + return false; +} + +fall_t CDarwinBalance::get_fallen_position(void) +{ + unsigned char value; + + this->is_valid(); + this->robot_device->read_byte_register(BALANCE_CONTROL_OFFSET,&value); + if(value&BALANCE_FWD_FALL) + return FWD_FALL; + else if(value&BALANCE_BWD_FALL) + return BWD_FALL; + else + return STANDING; +} + +void CDarwinBalance::set_gains(double knee,double ankle_pitch,double hip_roll,double ankle_roll) +{ + unsigned short int value; + + this->is_valid(); + if(knee<0.0) + knee=0.0; + else if(knee>1.0) + knee=1.0; + value=(unsigned short int)(knee*65535.0); + this->robot_device->write_word_register(BALANCE_KNEE_GAIN_OFFSET,value); + + if(ankle_pitch<0.0) + ankle_pitch=0.0; + else if(ankle_pitch>1.0) + ankle_pitch=1.0; + value=(unsigned short int)(ankle_pitch*65535.0); + this->robot_device->write_word_register(BALANCE_ANKLE_PITCH_GAIN_OFFSET,value); + + if(ankle_roll<0.0) + ankle_roll=0.0; + else if(ankle_roll>1.0) + ankle_roll=1.0; + value=(unsigned short int)(ankle_roll*65535.0); + this->robot_device->write_word_register(BALANCE_ANKLE_ROLL_GAIN_OFFSET,value); + + if(hip_roll<0.0) + hip_roll=0.0; + else if(hip_roll>1.0) + hip_roll=1.0; + value=(unsigned short int)(hip_roll*65535.0); + this->robot_device->write_word_register(BALANCE_HIP_ROLL_GAIN_OFFSET,value); +} + +void CDarwinBalance::get_gains(double *knee,double *ankle_pitch,double *hip_roll,double *ankle_roll) +{ + unsigned short int value; + + this->is_valid(); + this->robot_device->read_word_register(BALANCE_KNEE_GAIN_OFFSET,&value); + (*knee)=((double)value)/65535.0; + this->robot_device->read_word_register(BALANCE_ANKLE_PITCH_GAIN_OFFSET,&value); + (*ankle_pitch)=((double)value)/65535.0; + this->robot_device->read_word_register(BALANCE_ANKLE_ROLL_GAIN_OFFSET,&value); + (*ankle_roll)=((double)value)/65535.0; + this->robot_device->read_word_register(BALANCE_HIP_ROLL_GAIN_OFFSET,&value); + (*hip_roll)=((double)value)/65535.0; +} + +CDarwinBalance::~CDarwinBalance() +{ +} + diff --git a/src/darwin_mmanager.cpp b/src/darwin_mmanager.cpp index 51ea996a39d02ebcf06a5b667f01e8f01fb47023..af6972f285a5116009451c15ad06422f04ede9dd 100644 --- a/src/darwin_mmanager.cpp +++ b/src/darwin_mmanager.cpp @@ -190,32 +190,6 @@ mm_mode_t CDarwinMManager::get_module(unsigned char servo_id) } /* -void CDarwinMManager::enable_balance(void) -{ - this->is_valid(); - this->manager_status|=MANAGER_EN_BAL; - this->robot_device->write_byte_register(DARWIN_MM_CNTRL,this->manager_status); -} - -void CDarwinMManager::disable_balance(void) -{ - this->is_valid(); - this->manager_status&=(~MANAGER_EN_BAL); - this->robot_device->write_byte_register(DARWIN_MM_CNTRL,this->manager_status); -} - -bool CDarwinMManager::is_balance_enabled(void) -{ - unsigned char value; - - this->is_valid(); - this->robot_device->read_byte_register(DARWIN_MM_CNTRL,&value); - if(value&MANAGER_EN_BAL) - return true; - else - return false; -} - void CDarwinMManager::enable_power(void) { this->is_valid(); @@ -242,32 +216,6 @@ bool CDarwinMManager::is_power_enabled(void) return false; } -bool CDarwinMManager::has_fallen(void) -{ - unsigned char value; - - this->is_valid(); - this->robot_device->read_byte_register(DARWIN_MM_CNTRL,&value); - if(value&(MANAGER_FWD_FALL | MANAGER_BWD_FALL)) - return true; - else - return false; -} - -fall_t CDarwinMManager::get_fallen_position(void) -{ - unsigned char value; - - this->is_valid(); - this->robot_device->read_byte_register(DARWIN_MM_CNTRL,&value); - if(value&MANAGER_FWD_FALL) - return MM_FWD_FALL; - else if(value&MANAGER_BWD_FALL) - return MM_BWD_FALL; - else - return MM_STANDING; -} - void CDarwinMManager::load_config(std::string &filename) { darwin_config_t::servo_iterator iterator; @@ -365,16 +313,6 @@ std::vector<double> CDarwinMManager::get_servo_offsets(void) return offsets; } - -void CDarwinMManager::set_balance_gains(double knee,double ankle_pitch,double hip_roll,double ankle_roll) -{ - -} - -void CDarwinMManager::get_balance_gains(double *knee,double *ankle_pitch,double *hip_roll,double *ankle_roll) -{ - -} */ CDarwinMManager::~CDarwinMManager()