Robotics StackExchange | Archived questions

Output of robot_localization node cannot converge until fusing absolute pose data

Hi There,

I am working with a mobile robot CLEARPATH Jackal. It has two instances ekf_localization_node running inside, one for local and one for global.

For the first test, ekf_local_node was fused with wheel odometry and IMU. ekf_global_node was fused with wheel odometry, IMU and the output of RTabMap which took /odometry/filtered/local as the input. The launch files are shown below:

ekflocalnode:

  <param name="odom_frame" value="odom"/>
  <param name="base_link_frame" value="base_link"/>
  <param name="world_frame" value="odom"/>

  <param name="transform_time_offset" value="0.0"/>

  <param name="odom0" value="/jackal_velocity_controller/odom"/> <!-- jackal odometry -->
  <param name="imu0" value="/imu/data"/> <!-- IMU -->

  <!-- The order of the values is x, y, z, roll, pitch, yaw, vx, vy, vz, vroll, vpitch, vyaw, ax, ay, az. -->
  <rosparam param="odom0_config">[false, false, false,                                                  
                                  false, false, false,                                                
                                  true, true, false,                                                  
                                  false, false, true,                                                 
                                  false, false, false]</rosparam>

  <rosparam param="imu0_config">[false, false, false,                                                 
                                 false, false, true,                                                  
                                 false, false, false,                                                 
                                 false, false, true,                                                  
                                 false, false, false] </rosparam>

  <param name="odom0_differential" value="false"/>
  <param name="imu0_differential" value="false"/>

  <param name="odom0_relative" value="true"/>
  <param name="imu0_relative" value="true"/>

ekfglobalnode:

   <node pkg="robot_localization" type="ekf_localization_node" name="ekf_localization_global_1" output="screen" >
  <remap from="/odometry/filtered" to="/odometry/filtered/global1"/>
  <param name="frequency" value="50"/>
  <param name="sensor_timeout" value="0.1"/>
  <param name="two_d_mode" value="false"/>

  <param name="odom_frame" value="odom"/>
  <param name="base_link_frame" value="base_link"/>
  <param name="world_frame" value="map"/>

  <param name="transform_time_offset" value="0.0"/>

  <param name="odom0" value="/jackal_velocity_controller/odom"/>
  <param name="pose0" value="/rtabmap/localization_pose"/>
  <param name="imu0" value="/imu/data"/>

  <!-- The order of the values is x, y, z, roll, pitch, yaw, vx, vy, vz, vroll, vpitch, vyaw, ax, ay, az. -->

  <rosparam param="odom0_config">[false, false, false,                                                   
                                  false, false, false,                                                
                                  true, true, true,                                                   
                                  false, false, true,                                                 
                                  false, false, false]</rosparam>
 <rosparam param="pose0_config">[true, true, true,                                                   
                                  false, false, true,                                                
                                  false, false, false,                                                
                                  false, false, false,                                                
                                  false, false, false]</rosparam>
  <rosparam param="imu0_config">[false, false, false,                                                 
                                  false, false, true,                                                 
                                  false, false, false,                                                
                                  false, false, true,                                                 
                                  false, false, false]</rosparam>

  <param name="odom0_differential" value="false"/>
  <param name="pose0_differential" value="true"/>
  <param name="imu0_differential" value="false"/>

  <param name="odom0_relative" value="false"/>
  <param name="pose0_relative" value="false"/>
  <param name="imu0_relative" value="true"/>

The first test worked perfectly. I generated plots of positions x versus y for ekfnodes (both ekflocal and ekf_global) and they have good agreements with those obtained fromvicon cameras. However, after a few days when I did the second test with the same launch file, both ekf nodes had convergence problems, i.e. position x grew boundlessly which is unphysical. This problem is weird because I used the same launch file and the experiment environment was the same as before.

I investigated the problem for a bit, and I found fusing the absolute pose of wheel odometry with ekf_local node can fix the convergence problem for 'ekflocalnode'. For ekf_global_node, if I fuse absolute poses from both wheel odometry and Rtabmap, or only one of them, it showed a discontinuous plot of position x-y, but the trend looks nice.

I am wondering is this normal for that discontinuous plot, and why the initial launch file did not work?

Asked by raewu on 2018-06-12 14:38:31 UTC

Comments

This will be impossible to answer without sample input messages from each of your sensor inputs, I'm afraid.

Asked by Tom Moore on 2018-06-19 05:42:31 UTC

Any update on this? I may be able to help if you provide sample sensor messages.

Asked by Tom Moore on 2018-07-17 05:51:15 UTC

Answers

Hi Tom, Thank you for your reply. After reinstalling the robot_localization package. It worked all of a sudden. I still don't know what caused this though.

Asked by raewu on 2018-07-17 14:48:27 UTC

Comments