diff --git a/cfg/AckermannLocalPlanner.cfg b/cfg/AckermannLocalPlanner.cfg index a22f7c557e360847c22b3af2c1d1ee5835b0728e..65920621b6185752127ac3b1b0bc07d73542d403 100755 --- a/cfg/AckermannLocalPlanner.cfg +++ b/cfg/AckermannLocalPlanner.cfg @@ -63,6 +63,8 @@ gen.add("trans_vel_samples", int_t, 0, "The number of samples to use w gen.add("steer_angle_samples", int_t, 0, "The number of samples to use when exploring the steer angle space", 10, 1) gen.add("angular_vel_samples", int_t, 0, "The number of samples to use when exploring the angular velocity space", 10, 1) gen.add("use_steer_angle_cmd", bool_t, 0, "Whether to use the steer angle or the angular velocity.", False) +gen.add("stopped_steering", bool_t, 0, "Whether to allow steering while stopped or not.", True) +gen.add("invert_steer_angle_cmd", bool_t, 0, "Whether to use the invert the steer angle command or not.", False) gen.add("prune_plan", bool_t, 0, "Start following closest point of global plan, not first point (if different).", False) gen.add("xy_goal_tolerance", double_t, 0, "Within what maximum distance we consider the robot to be in goal", 0.1) diff --git a/include/ackermann_planner_ros.h b/include/ackermann_planner_ros.h index 5b45993a7f58b41d6fe62a4b52fc97c86f2060cb..5a34c8c64ddb4da9b72a14a99be90b588809698a 100644 --- a/include/ackermann_planner_ros.h +++ b/include/ackermann_planner_ros.h @@ -148,5 +148,7 @@ class AckermannPlannerROS : public nav_core::BaseLocalPlanner bool stucked; bool first; bool use_steer_angle_cmd; + bool stopped_steering; + bool invert_steer_angle_cmd; }; #endif diff --git a/src/ackermann_planner_ros.cpp b/src/ackermann_planner_ros.cpp index 7d08e2f61c3ca02efffc82b9611667de89b91464..9c43ed8f637f2f1459387bcd0d0de8866019d0fc 100644 --- a/src/ackermann_planner_ros.cpp +++ b/src/ackermann_planner_ros.cpp @@ -100,6 +100,8 @@ void AckermannPlannerROS::reconfigure_callback(iri_ackermann_local_planner::Acke planner_util_.reconfigure_callback(limits, config.restore_defaults); this->last_cmds.resize(config.cmd_vel_avg); this->use_steer_angle_cmd=config.use_steer_angle_cmd; + this->invert_steer_angle_cmd=config.invert_steer_angle_cmd; + this->stopped_steering=config.stopped_steering; odom_helper_.set_average_samples(config.odom_avg); patience_=config.planner_patience; @@ -216,7 +218,10 @@ bool AckermannPlannerROS::ackermann_compute_velocity_commands(geometry_msgs::Pos //pass along drive commands cmd_vel.linear.x = drive_cmds.pose.position.x; cmd_vel.linear.y = drive_cmds.pose.position.y; - cmd_vel.angular.z = tf::getYaw(drive_cmds.pose.orientation); + if(this->invert_steer_angle_cmd) + cmd_vel.angular.z = -tf::getYaw(drive_cmds.pose.orientation); + else + cmd_vel.angular.z = tf::getYaw(drive_cmds.pose.orientation); //if we cannot move... tell someone std::vector<geometry_msgs::PoseStamped> local_plan; @@ -442,7 +447,7 @@ bool AckermannPlannerROS::computeVelocityCommands(geometry_msgs::Twist& cmd_vel) ackermann_msgs::AckermannDrive ackermann; odom_helper_.get_ackermann_state(ackermann); // steer the car without moving if the steering angle is big - if(this->use_steer_angle_cmd) + if(this->use_steer_angle_cmd && this->stopped_steering) { if(fabs(ackermann.steering_angle-cmd_vel.angular.z)>0.05) {