Robotics StackExchange | Archived questions

TF problems while using robot_localization with navigation stack/move_base in a static map environment

hello everyone, i have updated my question because of finding the error i have. I am using a static map which i provide to map server through this launch file.

<launch>

      <arg name="map_file" default="$(find provide_map)/maps/map.yaml"/>

      <!-- Run the map server -->
      <node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" >
            <param name="frame_id" value="odom"/>
     </node>

    </launch>

If i launch this file without fram id=odom, it gives me error in rviz that no Transform from map to odom.

Now i am using robotlocalization along with navigation stack/movebase. THe robot detects its position in map, go to goal accordingly. The only problem is of basefootprint. It is relying only on odomtery and not on output of robotlocalization. Error, when i pick and place rabot randomly, it works but sometimes base_footprint goes out of map, resulting in no path generation. Below is a picture of RVIZ to enlighten the problem.

image description

My move_base launch file is

<launch>
  <!-- Arguments -->
  <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
  <arg name="cmd_vel_topic" default="/cmd_vel" />
  <arg name="odom_topic" default="odom" />
  <arg name="move_forward_only" default="false"/>

      <!-- move_base -->
      <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
        <param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
        <rosparam file="$(find turtlebot3_2dnav)/param/costmap_common_params_$(arg model).yaml" command="load" ns="global_costmap" />
        <rosparam file="$(find turtlebot3_2dnav)/param/costmap_common_params_$(arg model).yaml" command="load" ns="local_costmap" />
        <rosparam file="$(find turtlebot3_2dnav)/param/local_costmap_params.yaml" command="load" />
        <rosparam file="$(find turtlebot3_2dnav)/param/global_costmap_params.yaml" command="load" />
        <rosparam file="$(find turtlebot3_2dnav)/param/base_local_planner_params.yaml" command="load" />
        <rosparam file="$(find turtlebot3_2dnav)/param/dwa_local_planner_params_$(arg model).yaml" command="load" />
        <remap from="cmd_vel" to="$(arg cmd_vel_topic)"/>
        <remap from="odom" to="$(arg odom_topic)"/>
        <param name="DWAPlannerROS/min_vel_x" value="0.0" if="$(arg move_forward_only)" />
      </node>
    </launch>

Local_coatmap.yaml

local_costmap:
  global_frame: base_footprint
  robot_base_frame: base_link

  update_frequency: 10.0
  publish_frequency: 10.0
  transform_tolerance: 0.5  

  static_map: true  
  rolling_window: true
  width: 3
  height: 3
  resolution: 0.05

Global_costmap:

global_costmap:
  global_frame: odom
  robot_base_frame: base_footprint

  update_frequency: 10.0
  publish_frequency: 10.0
  transform_tolerance: 0.5

  static_map: true

If i change the value of robotbase frame to baselink, it gives me error. Could not get robot pose. How should i make my tf tree and which frame should be used in which file?

Ekf_template.yaml

   frequency: 30
    sensor_timeout: 0.1
    two_d_mode: false
    transform_time_offset: 0.0
    transform_timeout: 0.0
    print_diagnostics: true
    debug: false
    debug_out_file: /path/to/debug/file.txt
    publish_tf: true
    map_frame: map            
    odom_frame: odom           
    base_link_frame: base_footprint
    world_frame: odom           
    odom0: odom

    odom0_config: [false, false,  false,
                   false, false, true,
                   false, false, false,
                   false, false, false,
                   false, false, false]

    odom0_queue_size: 2
    odom0_nodelay: false
    odom0_differential: false
    odom0_relative: false
    odom0_pose_rejection_threshold: 5
    odom0_twist_rejection_threshold: 1

    odom1: odom1
    odom1_config: [true, true, false,
                   false, false, false,
                   false, false, false,
                   false, false, false,
                   false, false, false]
    odom1_differential: false
    odom1_relative: true
    odom1_queue_size: 2
    odom1_pose_rejection_threshold: 2
    odom1_twist_rejection_threshold: 0.2
    odom1_nodelay: false
    use_control: false
    stamped_control: false
    control_timeout: 0.2
    control_config: [true, false, false, false, false, true]

    acceleration_limits: [1.0, 0.0, 0.0, 0.0, 0.0, 1.0]

    deceleration_limits: [1.0, 0.0, 0.0, 0.0, 0.0, 1.0]

    acceleration_gains: [0.5, 0.0, 0.0, 0.0, 0.0, 0.5]

    deceleration_gains: [0.5, 0.0, 0.0, 0.0, 0.0, 0.5]

    process_noise_covariance: [0.05, 0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                         ]
.......................................................................................

I am using turtlebot burger, with ros kinetic and ubuntu 16.04.

Asked by enthusiast.australia on 2019-09-30 07:56:49 UTC

Comments

Your odom0_config says that you are not taking x,y and z of odom0 into account.

Asked by Choco93 on 2019-09-30 09:07:05 UTC

yes. I am doing so. But i am taking x,y from odom1 instead of Odom0. And it is not working. Is my approach not possible/valid?

Asked by enthusiast.australia on 2019-09-30 09:13:37 UTC

Should be possible, but there was some problem with it if I remember correctly. Try switching, make odom0 odom1 and vice versa

Asked by Choco93 on 2019-09-30 09:17:17 UTC

I tried but still same error which i have mentioned in my main question.

Asked by enthusiast.australia on 2019-09-30 10:27:04 UTC

can you also share your tf_tree?

Asked by Choco93 on 2019-10-01 02:37:52 UTC

I have provided the tf tree in my updated question

Asked by enthusiast.australia on 2019-10-01 04:40:48 UTC

Did you solve the issue?

Asked by Ahmed1212 on 2019-10-06 14:51:02 UTC

Answers

Your frame_ids need some attention.

First, I'd read REP-105. ROS navigation generally assumes that you have three frames:

  • map - Your robot's pose in the map frame is meant to be referenced from the map itself, i.e., it should either come from something that's, e.g., matching laser scans to a map, or it could come from an r_l EKF instance that is fusing the output of a scan-to-map matching node. The robot's pose in the map frame should be very accurate, but may be subject to discrete discontinuities ("jumps"). move_base generates its plans in this frame.
  • odom - Your robot's pose in the odom frame is usually not referenced to the map, and will drift over time. Your pose estimate in this frame will come from things like wheel encoders, or an EKF instance that is fusing wheel odometry data. This is the frame in which control/local planning happens in move_base.
  • base_link (or base_footprint) - The coordinate frame whose origin is (usually) at your robot's centroid, or center of mass, projected into the ground plane.

Your robot's pose in the map frame is given by the map->base_link transform. Your robot's pose in the odom frame is given by the odom->base_link transform. But tf doesn't let you have two parents to the same frame, so we apply some simple transformation math and end up with a transform chain that goes map->odom->base_link.

It seems to me that you are trying to operate just in the odom frame for everything. That's fine to start, and will work well for simulation. However, tf will also be very unhappy if you let two different nodes publish the same transform. In this case, your EKF instance is generating odom->base_footprint. I'm thinking that whatever is generating your wheel encoder odometry is also publishing that transform, so you need to see if the node in question has a parameter to stop it from publishing that transform (most do).

Also, your move_base config is not going to work well, I think. I'd change it to this:

local_costmap:
  global_frame: odom
  robot_base_frame: base_footprint

  update_frequency: 10.0
  publish_frequency: 10.0
  transform_tolerance: 0.5  

  static_map: true  
  rolling_window: true
  width: 3
  height: 3
  resolution: 0.05

global_costmap:
  global_frame: odom
  robot_base_frame: base_footprint

  update_frequency: 10.0
  publish_frequency: 10.0
  transform_tolerance: 0.5

  static_map: true

Asked by Tom Moore on 2019-11-28 05:35:19 UTC

Comments