Covariance values on Piksi ROS Odometry Message
Why are the covariance values for position so high in the Odometry message published by swiftnav_ros package (piksi multi RTK setup is being used, with succesful RTK fix.)
header:
seq: 420
stamp:
secs: 1525036934
nsecs: 533197224
frame_id: "gps"
child_frame_id: ''
pose:
pose:
position:
x: 2.29
y: 3.038
z: -0.516
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 0.0
covariance: [100000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 100000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 484000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1000.0]
twist:
twist:
linear:
x: -0.004
y: 0.008
z: 0.008
angular:
x: 0.0
y: 0.0
z: 0.0
covariance: [0.015210000000000001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.015210000000000001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.03198, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1000.0]
Notice the values in the covariance in the position. I notice that in the driver, the covariance fields are populated as such:
// populate the pose covariance matrix if we have a good fix
double h_covariance = (sbp_ned.h_accuracy * sbp_ned.h_accuracy) / 1.0e-6;
double v_covariance = (sbp_ned.v_accuracy * sbp_ned.v_accuracy) / 1.0e-6;
// Pose x/y/z covariance
rtk_odom_msg->pose.covariance[0] = h_covariance; // x = 0, 0 in the 6x6 cov matrix
rtk_odom_msg->pose.covariance[7] = h_covariance; // y = 1, 1
rtk_odom_msg->pose.covariance[14] = v_covariance; // z = 2, 2
Why is there a division by 1.0e-6?
Asked by JadTawil on 2018-04-29 16:29:30 UTC
Answers
Hi,
as mentioned in the readme file of swiftnav_ros repo, you should use a different ROS driver: ethz_piksi_ros.
Moreover, this driver publishes a fixed (and specified by the user) covariance, based on in which mode Piksi is at the moment (SPP, RTK Float, RTK Fix). These settings can be set here: covariance settings
Regards,
Marco.
Asked by Femer on 2018-04-30 12:06:30 UTC
Comments
@Femer is right. I use the driver from ethz as well.
Asked by tuandl on 2018-05-02 03:08:00 UTC
Comments
My guess is that the driver just wants to show the accuracy cannot be trusted, e.g your filter should ignore it. Which driver are you using?
Asked by tuandl on 2018-04-30 01:56:40 UTC
I guess so, I recloned the ros_swiftnav driver and the code actually changed.. now h_covariance = pow(sbp_ned.h_accuracy * 1e-3, 2), and v_covariance = pow(sbp_ned.v_accuracy * 1e-3, 2), which gives much more realistic and reasonable values..
Asked by JadTawil on 2018-04-30 08:27:49 UTC