Big odom error when moving forward with plain environment
I have a simulated autonomous base running in ROS1, Melodic, Gazebo with move_base, gmapping and robot_pose_ekf for the odom. When I move my robot straight forward, with the environment remaining unchanged for the entire path, then I get a bad map > odom transformation, making the robot perceive the straight path much shorter than how it actually is in reality.
I suppose this won't be a problem with a good wheel odom encoder on a real robot, but the simulation is problematic. This is similar to this question, however the answers didn't really help.
I checked the launch files of many autonomous robots (pr2, turtlebot, husky, jackal etc) to compare, but I couldn't identify the culprit. Below I post the rviz image with the map - odom error.
I tried with hector mapping but it doesn't work neither with pub_map_odom_transform = true or false since it mostly relies on lidar (not odom), and since the environment is unchanged.
I also tried changing the <publishodomtf>false</publishodomtf> of my gazebo plugin: differential_drive_controller (libgazebo_ros_diff_drive.so) to true, but it doesn't work (I think because it has many broadcasters of odom tf).
I also upload some important files for your reference:
global_costmap.yaml
global_costmap:
global_frame: map #map
robot_base_frame: base_link
update_frequency: 5 # Set this as high as the cpu resources allow
publish_frequency: 5 #2.5
static_map: true
rolling_window: false
track_unknown_space: true
width: 1024
height: 1024
origin_x: -51.25
origin_y: -51.25
resolution: 0.1
transform_tolerance: 1.0
plugins:
- {name: static_layer, type: "costmap_2d::StaticLayer"}
local_costmap.yaml
local_costmap:
global_frame: odom # odom_combined
robot_base_frame: base_link
update_frequency: 10 # 5.0
publish_frequency: 10 # 5.0
static_map: false
rolling_window: true
width: 4.0
height: 4.0
resolution: 0.05
transform_tolerance: 1.0
plugins:
- {name: static_layer, type: "costmap_2d::StaticLayer"}
- {name: obstacle_layer, type: "costmap_2d::VoxelLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
gmapping.launch
<launch>
<arg name="scan_topic" default="scan"/> <!--scan_filtered-->
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<param name="odom_frame" value="odom"/>
<param name="base_frame" value="base_link"/>
<param name="map_frame" value="map"/>
<param name="throttle_scans" value="1"/>
<param name="map_update_interval" value="0.1"/> <!-- default: 5.0 -->
<param name="maxUrange" value="10.0"/>
<param name="maxRange" value="10.0"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="minimumScore" value="150.0"/>
<param name="lskip" value="0"/>
<param name="srr" value="0.01"/>
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<param name="linearUpdate" value="0.1"/>
<param name="angularUpdate" value="0.05"/>
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="20"/>
<param name="xmin" value="-10.0"/>
<param ...
Have you added any features to the map? If every frame of the laserscan looks the same (since it measures perfectly), it is quite possible the slam algorithm is interpreting it as a drift in odometry (since scan matching is usually quite reliable). To confirm this, try adding a few random objects in the room so that the lasers can see the robot is moving forward.
Thank you for your reply. Unfortunately I cannot add features in my environment because in the real-world scenario the robot will operate in a big empty building (with a wall at the side of the robot being the only "feature"). Thus I would like gmapping or hector to rely more on the odometry values.
For your reference if I add features in the environment then the problem disappears