diff --git a/humanoid_common/package.xml b/humanoid_common/package.xml index 547264e27217e195e4ea712e1b3f9b6f36005d37..ea1ee83c3fa798caa081ee2af86300cf4b3954a3 100755 --- a/humanoid_common/package.xml +++ b/humanoid_common/package.xml @@ -54,7 +54,7 @@ <run_depend>grippers_client</run_depend> <run_depend>smart_charger_client</run_depend> <run_depend>automatic_charge</run_depend> - + <run_depend>stairs_client</run_depend> <!-- The export tag contains other, unspecified, tags --> <export> diff --git a/humanoid_modules/cfg/StairsModule.cfg b/humanoid_modules/cfg/StairsModule.cfg index 0a7ac29b36ed45b18b86655f18685dee0f8301d0..7e84ae83fb6e620a89d3df45a404ed7d2130aac2 100755 --- a/humanoid_modules/cfg/StairsModule.cfg +++ b/humanoid_modules/cfg/StairsModule.cfg @@ -40,6 +40,7 @@ gen = ParameterGenerator() set_modules = gen.add_group("Set Servo Modules service") set_params = gen.add_group("Set Stairs parameters service") get_params = gen.add_group("Get Stairs parameters service") +stairs_action = gen.add_group("Climb stairs") # Name Type Reconfiguration level Description Default Min Max #gen.add("velocity_scale_factor", double_t, 0, "Maximum velocity scale factor", 0.5, 0.0, 1.0) @@ -52,4 +53,9 @@ set_params.add("set_params_max_retries",int_t, 0, " get_params.add("get_params_max_retries",int_t, 0, "Maximum number of retries for the get params service", 1, 1, 10) +stairs_action.add("action_max_retries",int_t, 0, "Maximum number of retries fro the action start", 1, 1, 10) +stairs_action.add("feedback_watchdog_time_s",double_t, 0, "Maximum time between feedback messages", 1, 0.01, 10) +stairs_action.add("timeout_s", double_t, 0, "Maximum time allowed to complete the action", 1, 0.1, 30) +stairs_action.add("enable_timeout",bool_t, 0, "Enable joints timeout ", True) + exit(gen.generate(PACKAGE, "StairsModule", "StairsModule")) diff --git a/humanoid_modules/include/humanoid_modules/stairs_module.h b/humanoid_modules/include/humanoid_modules/stairs_module.h index 90d46f64261df4fc1179895eefe6d9ce577284b3..1962587308f55d2ce8336a3616f26170c3df21fe 100644 --- a/humanoid_modules/include/humanoid_modules/stairs_module.h +++ b/humanoid_modules/include/humanoid_modules/stairs_module.h @@ -17,11 +17,20 @@ typedef enum {STAIRS_MODULE_SERVO_ASSIGN_FAIL, STAIRS_MODULE_NOT_INITIALIZED, STAIRS_MODULE_SET_PARAMS_FAIL, STAIRS_MODULE_ROBOT_FELL, - STAIRS_MODULE_SUCCESS} stairs_module_status_t; + STAIRS_MODULE_RUNNING, + STAIRS_MODULE_SUCCESS, + STAIRS_MODULE_ACTION_START_FAIL, + STAIRS_MODULE_TIMEOUT, + STAIRS_MODULE_FB_WATCHDOG, + STAIRS_MODULE_ABORTED, + STAIRS_MODULE_PREEMPTED} stairs_module_status_t; class CStairsModule : public CHumanoidModule<stairs_module::StairsModuleConfig> { private: + /* stairs action */ + CModuleAction<humanoid_common_msgs::humanoid_stairsAction> climb_stairs; + humanoid_common_msgs::humanoid_stairsGoal goal; /* set stairs parameters service */ CModuleService<humanoid_common_msgs::set_stairs_params> set_stairs_params_service; CModuleService<humanoid_common_msgs::get_stairs_params> get_stairs_params_service; @@ -44,19 +53,20 @@ class CStairsModule : public CHumanoidModule<stairs_module::StairsModuleConfig> public: CStairsModule(const std::string &name); /* control functions */ + void start(bool up); void stop(void); bool is_finished(void); stairs_module_status_t get_status(void); /* configuration parameters */ - void set_phase_time(stairs_phase_t pahse_id, double time); + void set_phase_time(stairs_phase_t phase_id, double time); void set_x_offset(double offset); void set_y_offset(double offset); void set_z_offset(double offset); void set_roll_offset(double offset); void set_pitch_offset(double offset); void set_yaw_offset(double offset); - void set_y_shift(double shift); - void set_x_shift(double shift); + void set_y_shift(double distance); + void set_x_shift(double distance); void set_z_overshoot(double overshoot); void set_stair_height(double height); void set_hip_pitch_offset(double offset); diff --git a/humanoid_modules/src/joints_module.cpp b/humanoid_modules/src/joints_module.cpp index b56f64f277a34844f416830ecd8b092abd8c1e52..ee872b5c1d9c329deec3b4e412431658d8c1d242 100644 --- a/humanoid_modules/src/joints_module.cpp +++ b/humanoid_modules/src/joints_module.cpp @@ -290,9 +290,3 @@ CJointsModule::~CJointsModule() while(!this->joints_trajectory.is_finished()); } } -/* -Prueba -{ - CJointsModule - -}*/ diff --git a/humanoid_modules/src/stairs_module.cpp b/humanoid_modules/src/stairs_module.cpp index 8a5cfa7a8f04183d38ca4bd8319a452b43395182..43cf9362a54aa86ae508feba5c2a480a913a52c9 100644 --- a/humanoid_modules/src/stairs_module.cpp +++ b/humanoid_modules/src/stairs_module.cpp @@ -2,7 +2,8 @@ CStairsModule::CStairsModule(const std::string &name) : CHumanoidModule(name,WALK_MODULE), set_stairs_params_service("set_stairs_params",name), - get_stairs_params_service("get_stairs_params",name) + get_stairs_params_service("get_stairs_params",name), + climb_stairs("climb_stairs",name) { this->start_operation(); this->state=STAIRS_MODULE_GET_PARAMS; @@ -81,20 +82,63 @@ void CStairsModule::state_machine(void) } break; case STAIRS_MODULE_START: ROS_INFO("CStairsModule : state START"); - if(this->cancel_pending) + switch(this->climb_stairs.make_request(this->goal)) { - this->cancel_pending=false; - this->state=STAIRS_MODULE_WAIT; - } - else if(this->fallen) - { - this->state=STAIRS_MODULE_WAIT; - } - else - this->state=STAIRS_MODULE_START; - break; + case ACT_SRV_SUCCESS: this->state=STAIRS_MODULE_WAIT; + ROS_DEBUG("CStairsModule : goal start successfull"); + /* start timeout */ + if(this->config.enable_timeout) + this->climb_stairs.start_timeout(this->config.timeout_s); + break; + case ACT_SRV_PENDING: this->state=STAIRS_MODULE_START; + ROS_WARN("CStairsModule : goal start pending"); + break; + case ACT_SRV_FAIL: this->state=STAIRS_MODULE_IDLE; + this->status=STAIRS_MODULE_ACTION_START_FAIL; + ROS_ERROR("CStairsModule : goal start failed"); + break; + } + break; case STAIRS_MODULE_WAIT: ROS_INFO("CStairsModule : state WAIT"); - this->state=STAIRS_MODULE_IDLE; + switch(this->climb_stairs.get_state()) + { + case ACTION_IDLE: + case ACTION_RUNNING: ROS_DEBUG("CStairsModules : action running"); + this->state=STAIRS_MODULE_WAIT; + break; + case ACTION_SUCCESS: ROS_INFO("CStairsModules : action ended successfully"); + this->state=STAIRS_MODULE_IDLE; + this->status=STAIRS_MODULE_SUCCESS; + this->climb_stairs.stop_timeout(); + break; + case ACTION_TIMEOUT: ROS_ERROR("CStairsModules : action did not finish in the allowed time"); + this->climb_stairs.cancel(); + this->state=STAIRS_MODULE_IDLE; + this->status=STAIRS_MODULE_TIMEOUT; + this->climb_stairs.stop_timeout(); + break; + case ACTION_FB_WATCHDOG: ROS_ERROR("CStairsModules : No feeback received for a long time"); + this->climb_stairs.cancel(); + this->state=STAIRS_MODULE_IDLE; + this->status=STAIRS_MODULE_FB_WATCHDOG; + this->climb_stairs.stop_timeout(); + break; + case ACTION_ABORTED: ROS_ERROR("CStairsModules : Action failed to complete"); + this->state=STAIRS_MODULE_IDLE; + this->status=STAIRS_MODULE_ABORTED; + this->climb_stairs.stop_timeout(); + break; + case ACTION_PREEMPTED: ROS_ERROR("CStairsModules : Action was interrupted by another request"); + this->state=STAIRS_MODULE_IDLE; + this->status=STAIRS_MODULE_PREEMPTED; + this->climb_stairs.stop_timeout(); + break; + } + if(this->cancel_pending) + { + this->cancel_pending=false; + this->climb_stairs.cancel(); + } break; } if(this->update_parameters) @@ -110,7 +154,10 @@ void CStairsModule::state_machine(void) case ACT_SRV_FAIL: this->status=STAIRS_MODULE_SET_PARAMS_FAIL; this->update_parameters=false; if(this->state!=STAIRS_MODULE_GET_PARAMS && this->state!=STAIRS_MODULE_IDLE) + { + this->climb_stairs.cancel(); this->state=STAIRS_MODULE_WAIT; + } ROS_ERROR("CStairsModule: Impossible to set stairs parameters"); break; } @@ -130,6 +177,13 @@ void CStairsModule::reconfigure_callback(stairs_module::StairsModuleConfig &conf this->set_stairs_params_service.set_max_num_retries(config.set_params_max_retries); /* get stairs parameters service parameters */ this->get_stairs_params_service.set_max_num_retries(config.get_params_max_retries); + /* stairs action parameters */ + this->climb_stairs.set_max_num_retries(config.action_max_retries); + this->climb_stairs.set_feedback_watchdog_time(config.feedback_watchdog_time_s); + if(this->config.enable_timeout) + this->climb_stairs.enable_timeout(); + else + this->climb_stairs.disable_timeout(); this->unlock(); } @@ -146,6 +200,17 @@ void CStairsModule::fallen_state_callback(const std_msgs::Int8::ConstPtr& msg) } /* control functions */ +void CStairsModule::start(bool up) +{ + this->lock(); + if(this->state==STAIRS_MODULE_IDLE) + { + this->goal.up=up; + this->start_climbing=true; + } + this->unlock(); +} + void CStairsModule::stop(void) { if(this->state!=STAIRS_MODULE_IDLE && this->state!=STAIRS_MODULE_WAIT) @@ -168,7 +233,168 @@ bool CStairsModule::is_finished(void) } /* configuration parameters */ +void CStairsModule::set_phase_time(stairs_phase_t phase_id, double time) +{ + this->lock(); + switch(phase_id) + { + case SHIFT_WEIGHT_LEFT: this->stairs_params.PHASE1_TIME=time; + break; + case RISE_RIGHT_FOOT: this->stairs_params.PHASE2_TIME=time; + break; + case ADVANCE_RIGHT_FOOT: this->stairs_params.PHASE3_TIME=time; + break; + case CONTACT_RIGHT_FOOT: this->stairs_params.PHASE4_TIME=time; + break; + case SHIFT_WEIGHT_RIGHT: this->stairs_params.PHASE5_TIME=time; + break; + case RISE_LEFT_FOOT: this->stairs_params.PHASE6_TIME=time; + break; + case ADVANCE_LEFT_FOOT: this->stairs_params.PHASE7_TIME=time; + break; + case CONTACT_LEFT_FOOT: this->stairs_params.PHASE8_TIME=time; + break; + case CENTER_WEIGHT: this->stairs_params.PHASE9_TIME=time; + break; + } + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_x_offset(double offset) +{ + this->lock(); + this->stairs_params.X_OFFSET=offset; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_y_offset(double offset) +{ + this->lock(); + this->stairs_params.Y_OFFSET=offset; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_z_offset(double offset) +{ + this->lock(); + this->stairs_params.Z_OFFSET=offset; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_roll_offset(double offset) +{ + this->lock(); + this->stairs_params.R_OFFSET=offset; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_pitch_offset(double offset) +{ + this->lock(); + this->stairs_params.P_OFFSET=offset; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_yaw_offset(double offset) +{ + this->lock(); + this->stairs_params.A_OFFSET=offset; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_y_shift(double distance) +{ + this->lock(); + this->stairs_params.Y_SHIFT=distance; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_x_shift(double distance) +{ + this->lock(); + this->stairs_params.X_SHIFT=distance; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_z_overshoot(double overshoot) +{ + this->lock(); + this->stairs_params.Z_OVERSHOOT=overshoot; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_stair_height(double height) +{ + this->lock(); + this->stairs_params.Z_HEIGHT=height; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_hip_pitch_offset(double offset) +{ + this->lock(); + this->stairs_params.HIP_PITCH_OFFSET=offset; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_roll_shift(double distance) +{ + this->lock(); + this->stairs_params.R_SHIFT=distance; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_pitch_shift(double distance) +{ + this->lock(); + this->stairs_params.P_SHIFT=distance; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_yaw_shift(double distance) +{ + this->lock(); + this->stairs_params.A_SHIFT=distance; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_y_spread(double distance) +{ + this->lock(); + this->stairs_params.Y_SPREAD=distance; + this->update_parameters=true; + this->unlock(); +} + +void CStairsModule::set_x_shift_body(double distance) +{ + this->lock(); + this->stairs_params.X_SHIFT_BODY=distance; + this->update_parameters=true; + this->unlock(); +} + CStairsModule::~CStairsModule() { + if(!this->climb_stairs.is_finished()) + { + this->climb_stairs.cancel(); + while(!this->climb_stairs.is_finished()); + } }