diff --git a/darwin_controller/include/darwin_controller.h b/darwin_controller/include/darwin_controller.h index 5351b66786d4d8656dc1699bf267260588bca994..8b551ad04af2272188fdb3e89692a00fade41553 100644 --- a/darwin_controller/include/darwin_controller.h +++ b/darwin_controller/include/darwin_controller.h @@ -61,8 +61,11 @@ #include <humanoid_common_msgs/humanoid_motionAction.h> #include <humanoid_common_msgs/humanoid_gripperAction.h> #include <humanoid_common_msgs/humanoid_follow_targetAction.h> +#include <humanoid_common_msgs/humanoid_stairsAction.h> #include <humanoid_common_msgs/set_walk_params.h> #include <humanoid_common_msgs/get_walk_params.h> +#include <humanoid_common_msgs/set_stairs_params.h> +#include <humanoid_common_msgs/get_stairs_params.h> #include <humanoid_common_msgs/set_servo_modules.h> #include <humanoid_common_msgs/set_pid.h> #include <humanoid_common_msgs/get_pid.h> @@ -148,11 +151,23 @@ namespace darwin_controller void right_gripper_getResultCallback(humanoid_common_msgs::humanoid_gripperResultPtr& result); void right_gripper_getFeedbackCallback(humanoid_common_msgs::humanoid_gripperFeedbackPtr& feedback); + IriActionServer<humanoid_common_msgs::humanoid_stairsAction> *stairs_aserver_; + void stairs_startCallback(const humanoid_common_msgs::humanoid_stairsGoalConstPtr& goal); + void stairs_stopCallback(void); + bool stairs_isFinishedCallback(void); + bool stairs_hasSucceedCallback(void); + void stairs_getResultCallback(humanoid_common_msgs::humanoid_stairsResultPtr& result); + void stairs_getFeedbackCallback(humanoid_common_msgs::humanoid_stairsFeedbackPtr& feedback); + // service servers ros::ServiceServer set_walk_params_server_; bool set_walk_paramsCallback(humanoid_common_msgs::set_walk_params::Request &req, humanoid_common_msgs::set_walk_params::Response &res); ros::ServiceServer get_walk_params_server_; bool get_walk_paramsCallback(humanoid_common_msgs::get_walk_params::Request &req, humanoid_common_msgs::get_walk_params::Response &res); + ros::ServiceServer set_stairs_params_server_; + bool set_stairs_paramsCallback(humanoid_common_msgs::set_stairs_params::Request &req, humanoid_common_msgs::set_stairs_params::Response &res); + ros::ServiceServer get_stairs_params_server_; + bool get_stairs_paramsCallback(humanoid_common_msgs::get_stairs_params::Request &req, humanoid_common_msgs::get_stairs_params::Response &res); ros::ServiceServer set_servo_modules_server_; bool set_servo_modulesCallback(humanoid_common_msgs::set_servo_modules::Request &req, humanoid_common_msgs::set_servo_modules::Response &res); ros::ServiceServer get_pan_pid_server_; diff --git a/darwin_controller/include/darwin_controller_impl.h b/darwin_controller/include/darwin_controller_impl.h index 52160aa616d4a42471c0b7deaf58b89dbd62f08f..76eaf96b4c6665c1cf23cb9e75c1a59a784663d4 100644 --- a/darwin_controller/include/darwin_controller_impl.h +++ b/darwin_controller/include/darwin_controller_impl.h @@ -12,6 +12,7 @@ #include "ram.h" #include "imu.h" #include "darwin_math.h" +#include "stairs.h" #ifdef _HAVE_XSD #include "../src/xml/darwin_config.hxx" #endif @@ -243,10 +244,21 @@ namespace darwin_controller this->right_gripper_aserver_->registerGetFeedbackCallback(boost::bind(&DarwinController<HardwareInterface>::right_gripper_getFeedbackCallback, this, _1)); this->right_gripper_aserver_->start(); + this->stairs_aserver_=new IriActionServer<humanoid_common_msgs::humanoid_stairsAction>(root_nh,"robot/climb_stairs"); + this->stairs_aserver_->registerStartCallback(boost::bind(&DarwinController<HardwareInterface>::stairs_startCallback, this, _1)); + this->stairs_aserver_->registerStopCallback(boost::bind(&DarwinController<HardwareInterface>::stairs_stopCallback, this)); + this->stairs_aserver_->registerIsFinishedCallback(boost::bind(&DarwinController<HardwareInterface>::stairs_isFinishedCallback, this)); + this->stairs_aserver_->registerHasSucceedCallback(boost::bind(&DarwinController<HardwareInterface>::stairs_hasSucceedCallback, this)); + this->stairs_aserver_->registerGetResultCallback(boost::bind(&DarwinController<HardwareInterface>::stairs_getResultCallback, this, _1)); + this->stairs_aserver_->registerGetFeedbackCallback(boost::bind(&DarwinController<HardwareInterface>::stairs_getFeedbackCallback, this, _1)); + this->stairs_aserver_->start(); + /* initialize services */ this->set_servo_modules_server_=root_nh.advertiseService("robot/set_servo_modules", &DarwinController<HardwareInterface>::set_servo_modulesCallback, this); this->set_walk_params_server_=root_nh.advertiseService("robot/set_walk_params", &DarwinController<HardwareInterface>::set_walk_paramsCallback, this); this->get_walk_params_server_=root_nh.advertiseService("robot/get_walk_params", &DarwinController<HardwareInterface>::get_walk_paramsCallback, this); + this->set_stairs_params_server_=root_nh.advertiseService("robot/set_stairs_params", &DarwinController<HardwareInterface>::set_stairs_paramsCallback, this); + this->get_stairs_params_server_=root_nh.advertiseService("robot/get_stairs_params", &DarwinController<HardwareInterface>::get_stairs_paramsCallback, this); this->set_pan_pid_server_=root_nh.advertiseService("robot/set_pan_pid", &DarwinController<HardwareInterface>::set_pan_pidCallback, this); this->get_pan_pid_server_=root_nh.advertiseService("robot/get_pan_pid", &DarwinController<HardwareInterface>::get_pan_pidCallback, this); this->set_tilt_pid_server_=root_nh.advertiseService("robot/set_tilt_pid", &DarwinController<HardwareInterface>::set_tilt_pidCallback, this); @@ -699,6 +711,49 @@ namespace darwin_controller } /************************************ right_gripper_action *********************************************/ +/************************************ stairs_action *********************************************/ + template <class HardwareInterface> + void DarwinController<HardwareInterface>::stairs_startCallback(const humanoid_common_msgs::humanoid_stairsGoalConstPtr& goal) + { + ROS_INFO("CDarwinSim : start climbing stairs "); + stairs_start(); + } + + template <class HardwareInterface> + void DarwinController<HardwareInterface>::stairs_stopCallback(void) + { + ROS_INFO("CDarwinSim : Stop climbing stairs "); + stairs_stop(); + } + + template <class HardwareInterface> + bool DarwinController<HardwareInterface>::stairs_isFinishedCallback(void) + { + if(is_climbing_stairs()) + return false; + else + return true; + } + + template <class HardwareInterface> + bool DarwinController<HardwareInterface>::stairs_hasSucceedCallback(void) + { + return true; + } + + template <class HardwareInterface> + void DarwinController<HardwareInterface>::stairs_getResultCallback(humanoid_common_msgs::humanoid_stairsResultPtr& result) + { + + } + + template <class HardwareInterface> + void DarwinController<HardwareInterface>::stairs_getFeedbackCallback(humanoid_common_msgs::humanoid_stairsFeedbackPtr& feedback) + { + feedback->current_phase=stairs_get_phase(); + } +/************************************ stairs_action *********************************************/ + /************************************ set_walk_params *******************************************/ template <class HardwareInterface> bool DarwinController<HardwareInterface>::set_walk_paramsCallback(humanoid_common_msgs::set_walk_params::Request &req, humanoid_common_msgs::set_walk_params::Response &res) @@ -779,6 +834,104 @@ namespace darwin_controller } /************************************ get_walk_params *******************************************/ +/************************************ set_walk_params *******************************************/ + template <class HardwareInterface> + bool DarwinController<HardwareInterface>::set_stairs_paramsCallback(humanoid_common_msgs::set_stairs_params::Request &req, humanoid_common_msgs::set_stairs_params::Response &res) + { + ROS_INFO("CDarwinSim : Setting stairs parameters ..."); + ram_write_word(DARWIN_STAIRS_PHASE1_TIME_L,(unsigned short int)(req.params.PHASE1_TIME*1000.0)); + ram_write_word(DARWIN_STAIRS_PHASE2_TIME_L,(unsigned short int)(req.params.PHASE2_TIME*1000.0)); + ram_write_word(DARWIN_STAIRS_PHASE3_TIME_L,(unsigned short int)(req.params.PHASE3_TIME*1000.0)); + ram_write_word(DARWIN_STAIRS_PHASE4_TIME_L,(unsigned short int)(req.params.PHASE4_TIME*1000.0)); + ram_write_word(DARWIN_STAIRS_PHASE5_TIME_L,(unsigned short int)(req.params.PHASE5_TIME*1000.0)); + ram_write_word(DARWIN_STAIRS_PHASE6_TIME_L,(unsigned short int)(req.params.PHASE6_TIME*1000.0)); + ram_write_word(DARWIN_STAIRS_PHASE7_TIME_L,(unsigned short int)(req.params.PHASE7_TIME*1000.0)); + ram_write_word(DARWIN_STAIRS_PHASE8_TIME_L,(unsigned short int)(req.params.PHASE8_TIME*1000.0)); + ram_write_word(DARWIN_STAIRS_PHASE9_TIME_L,(unsigned short int)(req.params.PHASE9_TIME*1000.0)); + ram_write_byte(DARWIN_STAIRS_X_OFFSET,(unsigned char)(req.params.X_OFFSET*1000.0)); + ram_write_byte(DARWIN_STAIRS_Y_OFFSET,(unsigned char)(req.params.Y_OFFSET*1000.0)); + ram_write_byte(DARWIN_STAIRS_Z_OFFSET,(unsigned char)(req.params.Z_OFFSET*1000.0)); + ram_write_byte(DARWIN_STAIRS_R_OFFSET,(unsigned char)((req.params.R_OFFSET*180/PI)*8.0)); + ram_write_byte(DARWIN_STAIRS_P_OFFSET,(unsigned char)((req.params.P_OFFSET*180/PI)*8.0)); + ram_write_byte(DARWIN_STAIRS_A_OFFSET,(unsigned char)((req.params.A_OFFSET*180/PI)*8.0)); + ram_write_byte(DARWIN_STAIRS_Y_SHIFT,(unsigned char)(req.params.Y_SHIFT*1000.0)); + ram_write_byte(DARWIN_STAIRS_X_SHIFT,(unsigned char)(req.params.X_SHIFT*1000.0)); + ram_write_byte(DARWIN_STAIRS_Z_OVERSHOOT,(unsigned char)(req.params.Z_OVERSHOOT*1000.0)); + ram_write_byte(DARWIN_STAIRS_Z_HEIGHT,(unsigned char)(req.params.Z_HEIGHT*1000.0)); + ram_write_word(DARWIN_STAIRS_HIP_PITCH_OFF_L,(unsigned short int)((req.params.HIP_PITCH_OFFSET*180.0/PI)*1024.0)); + ram_write_byte(DARWIN_STAIRS_R_SHIFT,(unsigned char)((req.params.R_SHIFT*180/PI)*8.0)); + ram_write_byte(DARWIN_STAIRS_P_SHIFT,(unsigned char)((req.params.P_SHIFT*180/PI)*8.0)); + ram_write_byte(DARWIN_STAIRS_A_SHIFT,(unsigned char)((req.params.A_SHIFT*180/PI)*4.0)); + ram_write_byte(DARWIN_STAIRS_Y_SPREAD,(unsigned char)(req.params.Y_SPREAD*1000.0)); + ram_write_byte(DARWIN_STAIRS_X_SHIFT_BODY,(unsigned char)(req.params.X_SHIFT_BODY*1000.0)); + + res.ret=true; + } +/************************************ set_walk_params *******************************************/ + +/************************************ get_walk_params *******************************************/ + template <class HardwareInterface> + bool DarwinController<HardwareInterface>::get_stairs_paramsCallback(humanoid_common_msgs::get_stairs_params::Request &req, humanoid_common_msgs::get_stairs_params::Response &res) + { + unsigned char byte_value; + unsigned short int word_value; + + ROS_INFO("CDarwinSim : Getting current stairs parameters ..."); + ram_read_word(DARWIN_STAIRS_PHASE1_TIME_L,&word_value); + res.params.PHASE1_TIME=((double)word_value)/1000.0; + ram_read_word(DARWIN_STAIRS_PHASE2_TIME_L,&word_value); + res.params.PHASE2_TIME=((double)word_value)/1000.0; + ram_read_word(DARWIN_STAIRS_PHASE3_TIME_L,&word_value); + res.params.PHASE3_TIME=((double)word_value)/1000.0; + ram_read_word(DARWIN_STAIRS_PHASE4_TIME_L,&word_value); + res.params.PHASE4_TIME=((double)word_value)/1000.0; + ram_read_word(DARWIN_STAIRS_PHASE5_TIME_L,&word_value); + res.params.PHASE5_TIME=((double)word_value)/1000.0; + ram_read_word(DARWIN_STAIRS_PHASE6_TIME_L,&word_value); + res.params.PHASE6_TIME=((double)word_value)/1000.0; + ram_read_word(DARWIN_STAIRS_PHASE7_TIME_L,&word_value); + res.params.PHASE7_TIME=((double)word_value)/1000.0; + ram_read_word(DARWIN_STAIRS_PHASE8_TIME_L,&word_value); + res.params.PHASE8_TIME=((double)word_value)/1000.0; + ram_read_word(DARWIN_STAIRS_PHASE9_TIME_L,&word_value); + res.params.PHASE9_TIME=((double)word_value)/1000.0; + ram_read_byte(DARWIN_STAIRS_X_OFFSET,&byte_value); + res.params.X_OFFSET=((double)byte_value)/1000.0; + ram_read_byte(DARWIN_STAIRS_Y_OFFSET,&byte_value); + res.params.Y_OFFSET=((double)byte_value)/1000.0; + ram_read_byte(DARWIN_STAIRS_Z_OFFSET,&byte_value); + res.params.Z_OFFSET=((double)byte_value)/1000.0; + ram_read_byte(DARWIN_STAIRS_R_OFFSET,&byte_value); + res.params.R_OFFSET=((double)byte_value)*PI/1440.0; + ram_read_byte(DARWIN_STAIRS_P_OFFSET,&byte_value); + res.params.P_OFFSET=((double)byte_value)*PI/1440.0; + ram_read_byte(DARWIN_STAIRS_A_OFFSET,&byte_value); + res.params.A_OFFSET=((double)byte_value)*PI/1440.0; + ram_read_byte(DARWIN_STAIRS_Y_SHIFT,&byte_value); + res.params.Y_SHIFT=((double)byte_value)/1000.0; + ram_read_byte(DARWIN_STAIRS_X_SHIFT,&byte_value); + res.params.X_SHIFT=((double)byte_value)/1000.0; + ram_read_byte(DARWIN_STAIRS_Z_OVERSHOOT,&byte_value); + res.params.Z_OVERSHOOT=((double)byte_value)/1000.0; + ram_read_byte(DARWIN_STAIRS_Z_HEIGHT,&byte_value); + res.params.Z_HEIGHT=((double)byte_value)/1000.0; + ram_read_word(DARWIN_STAIRS_HIP_PITCH_OFF_L,&word_value); + res.params.HIP_PITCH_OFFSET=(((double)word_value)*PI/180.0)/1024.0; + ram_read_byte(DARWIN_STAIRS_R_SHIFT,&byte_value); + res.params.R_SHIFT=((double)byte_value)*PI/1440.0; + ram_read_byte(DARWIN_STAIRS_P_SHIFT,&byte_value); + res.params.P_SHIFT=((double)byte_value)*PI/1440.0; + ram_read_byte(DARWIN_STAIRS_A_SHIFT,&byte_value); + res.params.A_SHIFT=((double)byte_value)*PI/720.0; + ram_read_byte(DARWIN_STAIRS_Y_SPREAD,&byte_value); + res.params.Y_SPREAD=((double)byte_value)/1000.0; + ram_read_byte(DARWIN_STAIRS_X_SHIFT_BODY,&byte_value); + res.params.X_SHIFT_BODY=((double)byte_value)/1000.0; + + return true; + } +/************************************ get_walk_params *******************************************/ + /************************************ set_servo_modules *****************************************/ template <class HardwareInterface> bool DarwinController<HardwareInterface>::set_servo_modulesCallback(humanoid_common_msgs::set_servo_modules::Request &req, humanoid_common_msgs::set_servo_modules::Response &res)