diff --git a/cfg/TwistToManualControl.cfg b/cfg/TwistToManualControl.cfg index 3fc36d8e0c869df4123dd57f9220d8556a90050b..50e2aba3087aec816c519f61dfd65d5da26fceec 100755 --- a/cfg/TwistToManualControl.cfg +++ b/cfg/TwistToManualControl.cfg @@ -39,18 +39,20 @@ gen = ParameterGenerator() # 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) -gen.add("steering_min", int_t, 0, "Minimum steering value", 45, 0, 180) -gen.add("steering_max", int_t, 0, "Maximum steering value", 135, 0, 180) -gen.add("angular_sat_min", double_t, 0, "Maximum angular speed value to take into account", -0.5, -5.0, 5.0) -gen.add("angular_sat_max", double_t, 0, "Minimum angular speed value to take into account", 0.5, -5.0, 5.0) - -gen.add("speed_min", int_t, 0, "Minimum speed value", -500, -1000, 1000) -gen.add("speed_max", int_t, 0, "Maximum speed value", 500, -1000, 1000) -gen.add("linear_sat_min", double_t, 0, "Maximum linear speed value to take into account", -0.5, -5.0, 5.0) -gen.add("linear_sat_max", double_t, 0, "Minimum linear speed value to take into account", 0.5, -5.0, 5.0) - -gen.add("invert_speed", bool_t, 0, "Invert speed signum", False) -gen.add("invert_steering", bool_t, 0, "Invert steering direction", False) +gen.add("steering_min", int_t, 0, "Minimum output steering value", 45, 0, 180) +gen.add("steering_zero", int_t, 0, "Zero output steering value", 90, 0, 180) +gen.add("steering_max", int_t, 0, "Maximum output steering value", 135, 0, 180) +gen.add("angular_sat_min", double_t, 0, "Maximum input angular speed", -0.5, -5.0, 5.0) +gen.add("angular_sat_max", double_t, 0, "Minimum input angular speed", 0.5, -5.0, 5.0) + +gen.add("speed_min", int_t, 0, "Minimum output speed value", -500, -1000, 1000) +gen.add("speed_zero", int_t, 0, "Zero output speed value", 0, -1000, 1000) +gen.add("speed_max", int_t, 0, "Maximum output speed value", 500, -1000, 1000) +gen.add("linear_sat_min", double_t, 0, "Maximum input linear speed", -0.5, -5.0, 5.0) +gen.add("linear_sat_max", double_t, 0, "Minimum input linear speed ", 0.5, -5.0, 5.0) + +gen.add("invert_speed", bool_t, 0, "Invert speed signum", False) +gen.add("invert_steering", bool_t, 0, "Invert steering direction", False) diff --git a/config/ps3.yaml b/config/ps3.yaml index 993c3dc7898f3681379ff603ed0a370a48120a29..c66e7f5515fb22fda0f6aeb609eb8974324a1af1 100644 --- a/config/ps3.yaml +++ b/config/ps3.yaml @@ -3,7 +3,7 @@ scale_linear: 0.5 scale_linear_turbo: 2.0 axis_angular: 2 -scale_angular: 0.5 +scale_angular: 1.0 enable_button: 11 # R1 shoulder button enable_turbo_button: 9 # R2 shoulder button diff --git a/include/twist_to_manual_control_alg_node.h b/include/twist_to_manual_control_alg_node.h index fa73d60b5d17424d4e4f2f358fc848b1aa753a7f..81dcd9730132ed21058ec92a355b6b33b3cea77c 100644 --- a/include/twist_to_manual_control_alg_node.h +++ b/include/twist_to_manual_control_alg_node.h @@ -67,6 +67,8 @@ class TwistToManualControlAlgNode : public algorithm_base::IriBaseAlgorithm<Twis // [action server attributes] // [action client attributes] + + double clip(double n, double lower, double upper); /** * \brief config variable diff --git a/launch/node.launch b/launch/node.launch index 408e5d9b32e4f613c42dc3b0af39ae34c16b73eb..4c779e603e3ab7597febf22326f3627ca461855f 100644 --- a/launch/node.launch +++ b/launch/node.launch @@ -1,7 +1,9 @@ <!-- --> <launch> - <arg name="node_name" default="twist_to_manual_control"/> + <arg name="node_name" default="twist_to_manual_control"/> + <arg name="invert_speed" default="True"/> + <arg name="invert_steering" default="True"/> <!-- <group ns="$(optenv ROBOT car)">--> @@ -12,21 +14,23 @@ <remap from="~cmd_vel" to="/cmd_vel"/> <remap from="~steering" to="/manual_control/steering"/> <remap from="~speed" to="/manual_control/speed"/> - - <param name="steering_min" value="70"/> - <param name="steering_max" value="110"/> + + <param name="steering_min" value="20"/> + <param name="steering_zero" value="90"/> + <param name="steering_max" value="160"/> - <param name="angular_sat_min" value="-0.5"/> - <param name="angular_sat_max" value="0.5"/> + <param name="angular_sat_min" value="-1.0"/> + <param name="angular_sat_max" value="1.0"/> - <param name="speed_min" value="-500"/> - <param name="speed_max" value="500"/> + <param name="speed_min" value="-1000"/> + <param name="speed_zero" value="0"/> + <param name="speed_max" value="1000"/> <param name="linear_sat_min" value="-1.0"/> <param name="linear_sat_max" value="1.0"/> - <param name="invert_speed" value="True"/> - <param name="invert_steering" value="True"/> + <param name="invert_speed" value="$(arg invert_speed)"/> + <param name="invert_steering" value="$(arg invert_steering)"/> </node> <!-- </group>--> diff --git a/src/twist_to_manual_control_alg_node.cpp b/src/twist_to_manual_control_alg_node.cpp index df5eeef06897e3ef1bd5d7f47df28832c85f7533..e3250cb33b8cdc9ded9c5b88cede6b4f002d5643 100644 --- a/src/twist_to_manual_control_alg_node.cpp +++ b/src/twist_to_manual_control_alg_node.cpp @@ -59,58 +59,87 @@ void TwistToManualControlAlgNode::mainNodeThread(void) /* [subscriber callbacks] */ void TwistToManualControlAlgNode::cmd_vel_callback(const geometry_msgs::Twist::ConstPtr& msg) { - double min; - double max; - //ROS_INFO("TwistToManualControlAlgNode::cmd_vel_callback: New Message Received"); + double min_in, max_in, zero_in; + int min_out, max_out, zero_out; - //use appropiate mutex to shared variables if necessary - //this->alg_.lock(); - //this->cmd_vel_mutex_enter(); - - // NewValue = (((OldValue - OldMin)*(NewMax - NewMin)) / (OldMax - OldMin)) + NewMin - double angular = msg->angular.z; - if (angular > this->config_.angular_sat_max) - angular=this->config_.angular_sat_max; - - if (angular < this->config_.angular_sat_min) - angular=this->config_.angular_sat_min; + //STEERING + int steering; + double angular; + + if(this->config_.invert_steering) + angular = - msg->angular.z; + else + angular = msg->angular.z; - if(!this->config_.invert_steering) + min_in=this->config_.angular_sat_min; + max_in=this->config_.angular_sat_max; + zero_in=0.0; + + angular = this->clip(angular, min_in, max_in); + + zero_out = this->config_.steering_zero; + + if(angular>0) { - min=this->config_.steering_min; - max=this->config_.steering_max; + min_in = zero_in; + min_out = zero_out; + max_out = this->config_.steering_max; + } - else + else //if(angular<=0) { - min=this->config_.steering_max; - max=this->config_.steering_min; + max_in = zero_in; + min_out = this->config_.steering_min; + max_out = zero_out; } - int steering = (((angular - this->config_.angular_sat_min) * (max - min)) / (this->config_.angular_sat_max - this->config_.angular_sat_min)) + min; - - double linear = msg->linear.x; - if (linear > this->config_.linear_sat_max) - linear=this->config_.linear_sat_max; - - if (linear < this->config_.linear_sat_min) - linear=this->config_.linear_sat_min; - - min=this->config_.speed_min; - max=this->config_.speed_max; - int speed = (((linear - this->config_.linear_sat_min) * (max - min)) / (this->config_.linear_sat_max - this->config_.linear_sat_min)) + min; + steering = (((angular - min_in) * (max_out - min_out)) / (max_in - min_in)) + min_out; this->steering_Int16_msg_.data = steering; + + //SPEED + int speed; + double linear; + if(this->config_.invert_speed) - this->speed_Int16_msg_.data = -speed; + linear = - msg->linear.x; else - this->speed_Int16_msg_.data = speed; + linear = msg->linear.x; + + min_in=this->config_.linear_sat_min; + max_in=this->config_.linear_sat_max; + zero_in=0.0; + + linear = this->clip(linear, min_in, max_in); + + zero_out = this->config_.speed_zero; + + if(linear>0) + { + min_in = zero_in; + min_out = zero_out; + max_out = this->config_.speed_max; + + } + else //if(linear<=0) + { + max_in = zero_in; + min_out = this->config_.speed_min; + max_out = zero_out; + } + + speed = (((linear - min_in) * (max_out - min_out)) / (max_in - min_in)) + min_out; + + this->speed_Int16_msg_.data = speed; + + //PUBLISH this->steering_publisher_.publish(this->steering_Int16_msg_); this->speed_publisher_.publish(this->speed_Int16_msg_); +} - //std::cout << msg->data << std::endl; - //unlock previously blocked shared variables - //this->alg_.unlock(); - //this->cmd_vel_mutex_exit(); +double TwistToManualControlAlgNode::clip(double n, double lower, double upper) +{ + return std::max(lower, std::min(n, upper)); } void TwistToManualControlAlgNode::cmd_vel_mutex_enter(void)