[Rviz, gmapping] my robot randomly jumps in rviz

asked 2020-01-16 05:45:50 -0600

Marcus Barnet gravatar image

updated 2020-01-16 05:46:57 -0600

I created my own robot with mecanum wheels and I'm able to correctly move it under Gazebo. The problem is that when I try to use gmapping to simulate the robot in RVIZ, it starts jumping around the map as soon as I try to move it in Gazebo. I guess the problem is with the laser since I get this error when I run gmapping:

Scan Matching Failed, using odometry

This is my world in Gazebo: image description

and this is the result in RVIZ: image description

and this is a short video that shows what happens in RVIZ while the robot moves in Gazebo.

This is my code:

 //pavioliner.launch
    <launch>

  <arg name="paused" default="false"/>
  <arg name="use_sim_time" default="true"/>
  <arg name="extra_gazebo_args" default=""/>
  <arg name="gui" default="true"/>
  <arg name="recording" default="false"/>
  <!-- Note that 'headless' is currently non-functional.  See gazebo_ros_pkgs issue #491 (-r arg does not disable
       rendering, but instead enables recording). The arg definition has been left here to prevent breaking downstream
       launch files, but it does nothing. -->
  <arg name="headless" default="false"/>
  <arg name="debug" default="false"/>
  <arg name="physics" default="ode"/>
  <arg name="verbose" default="false"/>


   <include file="$(find gazebo_ros)/launch/empty_world.launch">
   <arg name="world_name" value="$(find pavioliner_gazebo)/worlds/pavilion.world"/>


  <arg name="respawn_gazebo" default="false"/>
  <arg name="use_clock_frequency" default="false"/>
  <arg name="pub_clock_frequency" default="100"/>
  <arg name="enable_ros_network" default="true" />

  <!-- set use_sim_time flag -->
  <param name="/use_sim_time" value="$(arg use_sim_time)"/>



  <!-- start gazebo server-->
  <group if="$(arg use_clock_frequency)">
    <param name="gazebo/pub_clock_frequency" value="$(arg pub_clock_frequency)" />
  </group>
  <group>
    <param name="gazebo/enable_ros_network" value="$(arg enable_ros_network)" />
  </group>
  <node name="gazebo" pkg="gazebo_ros" type="$(arg script_type)" respawn="$(arg respawn_gazebo)" output="screen"
    args="$(arg command_arg1) $(arg command_arg2) $(arg command_arg3) -e $(arg physics) $(arg extra_gazebo_args) $(arg world_name)" />

  <!-- start gazebo client -->
  <group if="$(arg gui)">
    <node name="gazebo_gui" pkg="gazebo_ros" type="gzclient" respawn="false" output="screen" args="$(arg command_arg3)"/>
  </group>


  </include>

<!-- Load the URDF into ROS parameter server -->
  <param name="robot_description" command="$(find xacro)/xacro '$(find pavioliner_description)/robot/pavioliner.urdf.xacro' --inorder" />

  <!-- Publish joint values -->
  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

  <!-- convert joint states to TF transforms for rviz, etc  -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/>

  <!-- Spawn model -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
    args="-urdf -x 0 -y 0 -z 0  -model pavioliner -param robot_description"/>

</launch>

this is my pavioliner.urdf.xacro

<?xml version="1.0"?>

<robot name="pavioliner_xl" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <!-- Import pavioliner XL wheels -->
    <xacro:include filename="$(find pavioliner_description)/urdf/wheels/omni_wheel.urdf.xacro" />
    <xacro:include filename="$(find pavioliner_description)/urdf/base/pavioliner_base.urdf.xacro" />

     <!-- Laser  -->
         <xacro:include filename="$(find pavioliner_description)/plugins/laser/hokuyo.xacro"/>
         <xacro:laser name="pavioliner/laser" parent ...
(more)
edit retag flag offensive close merge delete

Comments

I'm not a navigation or mapping expert at all, but your Gazebo world is very empty, with only a few objects in it. Most mapping (and localisation) approaches need features to match (ie: objects they can 'recognise').

I'd try adding some more features (or increasing the scan range of the laser, as that may allow it to 'see' sufficient features).

gvdhoorn gravatar imagegvdhoorn ( 2020-01-16 05:50:24 -0600 )edit

I tried to increase the number of objects inside the World and i also increased the laser range to 80 meters, but nothing changed, I still got the same message error Scan Matching Failed, using odometry. Likelihood=0 and the robot randomly and quickly jumps on the map under RVIZ without any logic reason.

Marcus Barnet gravatar imageMarcus Barnet ( 2020-01-16 06:22:02 -0600 )edit

I think your error is pretty clear: scan matching failed, not enough features. Its not just the range, its the stuff you have and since its a simulation those walls are perfectly flat so you're not getting ambient features from cracks and misplacments.

stevemacenski gravatar imagestevemacenski ( 2020-01-16 12:57:58 -0600 )edit

Can't it be a problem related to the laser? I can't see the laser points in rviz when I set fixed frame to laser frame and this sounds strange to me. I added the hokuyo.acro that I've found online, may be I have a problem with it. What do you think?

Marcus Barnet gravatar imageMarcus Barnet ( 2020-01-16 15:21:10 -0600 )edit

I guess my/the assumption was that you've got the laserscanner working properly.

If you're not sure about that, I would certainly recommend to diagnose that first.

gvdhoorn gravatar imagegvdhoorn ( 2020-01-16 15:36:07 -0600 )edit

Unfortunately I do not know how to diagnose it correctly. I can read successfully from the laser topic, the laser tf is OK as you can see from the tf tree. The only problem is that I don't know if the hokuyo.xacro file is correctly configured. I added the code of it in my first post. I'm almost sure that the problem is in the laser file but I don't know how to find it

Marcus Barnet gravatar imageMarcus Barnet ( 2020-01-16 16:06:20 -0600 )edit