Quantcast
Channel: ROS Answers: Open Source Q&A Forum - RSS feed
Viewing all articles
Browse latest Browse all 398

robot_localization: "Global EKF" without absolute pose information

$
0
0
Hello there, I am attempting the obtain accurate pose information from my "global ekf" (with map -> odom transform) in the event that my lidar stops functioning, which results in AMCL to stop publishing pose updates. To give some context, I have two `r_l` nodes running. The first in "local mode" (odom -> base_link) and the second in "global mode" (map -> odom). My local EKF is providing me with splendid results (approximate error of <1m after travelling for 200m). Because of this, I do not see any reason why I would not be able to obtain similar results for the global EKF by using the same parameters. However, this is not the case. I have tried to run two instances of the `r_l` node with the exact same parameters, except for a difference in the `world_frame` parameter. The configuration that I use for both EKFs are as follows: frequency: 25 sensor_timeout: 0.1 two_d_mode: true 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 publish_acceleration: false map_frame: map # Defaults to "map" if unspecified odom_frame: odom # Defaults to "odom" if unspecified base_link_frame: base_footprint # Defaults to "base_link" if unspecified world_frame: odom or map # Defaults to the value of odom_frame if unspecified odom0: /odom odom0_config: [false, false, false, false, false, false, true, true, false, false, false, true, false, false, false] odom0_queue_size: 2 odom0_nodelay: false odom0_differential: false odom0_relative: false imu0: /imu imu0_config: [false, false, false, false, false, false, false, false, false, false, false, true, false, false, false] imu0_nodelay: false imu0_differential: false imu0_relative: true imu0_queue_size: 5 imu0_remove_gravitational_acceleration: false use_control: false stamped_control: false control_timeout: 0.2 control_config: [true, false, false, false, false, true] acceleration_limits: [2.6, 0.0, 0.0, 0.0, 0.0, 6.8] deceleration_limits: [2.6, 0.0, 0.0, 0.0, 0.0, 6.8] acceleration_gains: [0.8, 0.0, 0.0, 0.0, 0.0, 0.9] deceleration_gains: [1.0, 0.0, 0.0, 0.0, 0.0, 1.0] process_noise_covariance: [0.05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01] initial_estimate_covariance: [1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1e-9] The reason that I am doing this is to test the scenario when `AMCL` fails and stops publishing pose information. However, I am not able to obtain the same results in the "global EKF" as the "local EKF". I [started the robot](https://imgur.com/a/Sfjxe2s) facing a wall and rotated a mere 360 degrees to [obtain this result](https://imgur.com/qKWPPIX). The "local EKF" showed that the robot had made a full rotation on the spot. Is it possible that the `r_l` node for the `map->odom` transform requires some form of absolute pose information in order to work? Sample odom message header: seq: 48489 stamp: secs: 1544442326 nsecs: 437659820 frame_id: "odom_raw" child_frame_id: "base_footprint" pose: pose: position: x: 1.5341816435 y: 0.809427441743 z: 0.0 orientation: x: 0.0 y: 0.0 z: -0.721732381548 w: 0.692172210816 covariance: [1.820079789135575, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.3661946650827668, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 17.68160068807464] twist: twist: linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 covariance: [0.08, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15] Sample IMU message --- header: seq: 215838 stamp: secs: 1420085577 nsecs: 463144000 frame_id: "imu" orientation: x: -0.00431362167001 y: -0.00518451398239 z: -0.87710660696 w: 0.480248510838 orientation_covariance: [0.0008, 0.0, 0.0, 0.0, 0.0008, 0.0, 0.0, 0.0, 0.0008] angular_velocity: x: 0.000391137145925 y: 0.00038150511682 z: -3.88729167753e-05 angular_velocity_covariance: [0.001, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.001] linear_acceleration: x: -0.112193532288 y: -0.073157928884 z: -9.86964130402 linear_acceleration_covariance: [0.01, 0.0, 0.0, 0.0, 0.1, 0.0, 0.0, 0.0, 0.05] --- On a final note, by feeding in `amcl_pose` to the "global EKF", I am able to have an acceptably accurate filtered_odometry output. Thank you!

Viewing all articles
Browse latest Browse all 398

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>