ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Omnidirectional square robot in Nav2

asked 2022-07-14 14:02:52 -0500

marpeja gravatar image

updated 2022-07-15 04:17:47 -0500


I am trying to navigate an omnidirectional square robot using Nav2 and RTABMap. RTABMap is used for creating the map and afterwards localize the robot in it, therefore I don't need to use the AMCL nor the Map Server. Moreover I am using Ros2 Foxy.

I am pretty new with Nav2 and I am not able to tune the parameters correctly as there are some of them that I don't really understand how they work, although I have read the Nav2 documentation. I need to get the robot pass along a very narrow cave through where the robot enters roughly-

First of all, I tried to define my robot's footprint in the local and global costmap, however it seems like the footprint doesn't change, that is why I used the robot_radius although my robot has a square footprint... (I don't know if I have set something wrong)

Secondly, my robot gets stuck with the cave walls as the route created by the planner doesn't avoid part of them (when it seems it is possible to go through other path. As there are not many Planner parameters I don't know if maybe it has to something with the critics of the controller, but I don't understand them properly. It is also worth to mention that I am using the NavFnPlanner although in the Nav2 documentation ( they recommend the Smac Lattice Planner for my type of robot, however, this planner is not available for Ros2 Foxy (distribution I have to work with).

Finally, when the robot gets stuck, it doesn't enter in the recovery mode (I am using the predefined behavior tree where, after the robot isn't able to compute or follow the path, it spins 90º and waits), although the controller_server shows: Failed to make progess, Aborting handle.

Here it is my configuration file, any idea or clue will be very well appreciated:

    use_sim_time: True
    global_frame: map
    robot_base_frame: base_link
    odom_topic: world
    enable_groot_monitoring: True
    groot_zmq_publisher_port: 1666
    groot_zmq_server_port: 1667
    default_bt_xml_filename: "navigate_w_replanning_and_recovery.xml"
    - nav2_compute_path_to_pose_action_bt_node
    - nav2_follow_path_action_bt_node
    - nav2_back_up_action_bt_node
    - nav2_spin_action_bt_node
    - nav2_wait_action_bt_node
    - nav2_clear_costmap_service_bt_node
    - nav2_is_stuck_condition_bt_node
    - nav2_goal_reached_condition_bt_node
    - nav2_goal_updated_condition_bt_node
    - nav2_initial_pose_received_condition_bt_node
    - nav2_reinitialize_global_localization_service_bt_node
    - nav2_rate_controller_bt_node
    - nav2_distance_controller_bt_node
    - nav2_speed_controller_bt_node
    - nav2_truncate_path_action_bt_node
    - nav2_goal_updater_node_bt_node
    - nav2_recovery_node_bt_node
    - nav2_pipeline_sequence_bt_node
    - nav2_round_robin_node_bt_node
    - nav2_transform_available_condition_bt_node
    - nav2_time_expired_condition_bt_node
    - nav2_distance_traveled_condition_bt_node

    use_sim_time: True

    use_sim_time: True
    odom_topic: "odom/unfiltered"
    controller_frequency: 5.0
    min_x_velocity_threshold: 0.001
    min_y_velocity_threshold: 0.001
    min_theta_velocity_threshold: 0.001
    progress_checker_plugin: "progress_checker"
    goal_checker_plugin: "goal_checker"
    controller_plugins: ["FollowPath"]

    # Progress checker parameters
      plugin: "nav2_controller::SimpleProgressChecker"
      required_movement_radius: 0.1
      movement_time_allowance: 20.0
    # Goal checker parameters
      plugin: "nav2_controller::SimpleGoalChecker"
      xy_goal_tolerance: 0.25
      yaw_goal_tolerance: 0.25
      stateful: True
    # DWB parameters
      plugin: "dwb_core::DWBLocalPlanner"
      debug_trajectory_details: True
      min_vel_x: 0.0
      min_vel_y: 0.0
      max_vel_x: 2.0
      max_vel_y: 1.0
      max_vel_theta: 4.5
      min_speed_xy: 0.2
      max_speed_xy: 1.0
      min_speed_theta: 0.0
      # Add high threshold velocity for turtlebot 3 issue.
      acc_lim_x: 2.5
      acc_lim_y: 0.0
      acc_lim_theta: 3.2
      decel_lim_x: -2.5
      decel_lim_y: 0.0
      decel_lim_theta: -3.2
      vx_samples: 20
      vy_samples: 10
      vtheta_samples: 20
      sim_time ...
edit retag flag offensive close merge delete

1 Answer

Sort by » oldest newest most voted

answered 2022-07-14 14:27:41 -0500

updated 2022-07-14 14:29:03 -0500

If you specify both a robot radius and a footprint, it will use the radius I believe, so you should make sure to specify your footprint and _not_ a radius to model a square robot. For the planner this is important so that you have properly modeled your footprint to plan through a space and make sure it doesn't try to enter something too small. But with NavFn or the holonomic planners its going to take the largest cross section of the robot and essentially treat the robot as a circle with that maximum radius, as it assumes it can pivot in place as a holonomic planner. So if you used a radius for the global planner and had that set to the diagonal of your square robot, it would be virtually the same.

You should use something like Hybrid- A* or state lattice if you want feasible behavior with footprint collision checking, but you're right, its not available in your distribution. You'd need to upgrade.

I can't speak to the tuning of DWB or other local trajectory planners, that specific to each person's platform and I'm not going to wade into that. Though, you should make sure to model your footprint correctly for the local costmap since that is what is going to forward project trajectories to score them based on their feasibility if you use the footprint scoring critic.

edit flag offensive delete link more


Hi Steve!

It was my error, I copied a wrong version of my configuration file (already fixed it in the question). The problem is that having defined the footprint, it appears me a small circle as the robot footprint in Rviz which is much more smaller than it should. In fact it doesn't increase when I increase the footprint dimensions... Therefore I think I would go the other way defining a robot_radius that covers my whole robot (both in the global and local costmap)

I also added the ObstacleFootprintCritic to my controller and gave it the highest scale factor, but it still doesn't avoid the walls correctly.

Moreover, the robot doesn't enter into the recovery mode when it gets stuck... Do I have something bad configured?

Thank you in advance for all your help!!

marpeja gravatar image marpeja  ( 2022-07-15 04:25:30 -0500 )edit

Here are my up to date critics:

  critics: ["RotateToGoal", "Oscillation", "BaseObstacle", "GoalAlign", "PathAlign", "PathDist", "GoalDist", "ObstacleFootprint"]
  BaseObstacle.scale: 38.0
  ObstacleFootprint.scale: 80.0
  PathAlign.scale: 32.0
  PathAlign.forward_point_distance: 0.4
  GoalAlign.scale: 10.0
  GoalAlign.forward_point_distance: 0.1
  PathDist.scale: 32.0
  GoalDist.scale: 10.0
  RotateToGoal.scale: 32.0
  RotateToGoal.slowing_factor: 5.0
  RotateToGoal.lookahead_time: -1.0
marpeja gravatar image marpeja  ( 2022-07-15 04:25:59 -0500 )edit

I'm unfortunately not going to be able to help you tune your controllers.

stevemacenski gravatar image stevemacenski  ( 2022-07-15 15:07:59 -0500 )edit

Question Tools



Asked: 2022-07-14 14:02:52 -0500

Seen: 312 times

Last updated: Jul 15 '22