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!
↧