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.
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
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
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