Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Hello turtlebot uses 1e-3 covairance for wheel odometry x,y and Ch robotic's UM6 driver for ros uses 1e-6 covairance for yaw. If you don't give covairances for imu to robot_pose_ekf it will manually set covariance until imu sends covariance

// manually set covariance untile imu sends covariance
if (imu_covariance_(1,1) == 0.0){
  SymmetricMatrix measNoiseImu_Cov(3);  measNoiseImu_Cov = 0;
  measNoiseImu_Cov(1,1) = pow(0.00017,2);  // = 0.01 degrees / sec
  measNoiseImu_Cov(2,2) = pow(0.00017,2);  // = 0.01 degrees / sec
  measNoiseImu_Cov(3,3) = pow(0.00017,2);  // = 0.01 degrees / sec
  imu_covariance_ = measNoiseImu_Cov;
}

as you can see above. I think it will be easier for you starting with turtlebot's odom covariances increase them if you get poor odometry. Because picking covairances heavily depends on system configuration(encoders,motors,wheels,slippage,drive system type)

Hello turtlebot uses 1e-3 covairance for wheel odometry x,y and Ch robotic's UM6 driver for ros uses 1e-6 covairance for yaw. If you don't give covairances for imu to robot_pose_ekf it will manually set covariance until imu sends covariance

// manually set covariance untile imu sends covariance
if (imu_covariance_(1,1) == 0.0){
  SymmetricMatrix measNoiseImu_Cov(3);  measNoiseImu_Cov = 0;
  measNoiseImu_Cov(1,1) = pow(0.00017,2);  // = 0.01 degrees / sec
  measNoiseImu_Cov(2,2) = pow(0.00017,2);  // = 0.01 degrees / sec
  measNoiseImu_Cov(3,3) = pow(0.00017,2);  // = 0.01 degrees / sec
  imu_covariance_ = measNoiseImu_Cov;
}

as you can see above. I think it will be easier for you starting with turtlebot's odom covariances increase them if you get poor odometry. Because picking covairances heavily depends on system configuration(encoders,motors,wheels,slippage,drive configuration(encoders,encoders resolution,motors,wheels,slippage,speed controller,drive system type) type etc..)

For optimal values, I recommend you to perform an odometry calibration alogirthm such as UMBMark. Calibrate it as possible as it can be. Then set your covairances. Covairances show how much you depend on your odometry data. If covairances are high, this shows that you don't depend very much on your odometry data.

Hello turtlebot uses 1e-3 covairance for wheel odometry x,y and Ch robotic's UM6 driver for ros uses 1e-6 covairance for yaw. If you don't give covairances for imu to robot_pose_ekf it will manually set covariance until imu sends covariance

// manually set covariance untile imu sends covariance
if (imu_covariance_(1,1) == 0.0){
  SymmetricMatrix measNoiseImu_Cov(3);  measNoiseImu_Cov = 0;
  measNoiseImu_Cov(1,1) = pow(0.00017,2);  // = 0.01 degrees / sec
  measNoiseImu_Cov(2,2) = pow(0.00017,2);  // = 0.01 degrees / sec
  measNoiseImu_Cov(3,3) = pow(0.00017,2);  // = 0.01 degrees / sec
  imu_covariance_ = measNoiseImu_Cov;
}

as you can see above. I think it will be easier for you starting with turtlebot's odom covariances increase them if you get poor odometry. Because picking covairances heavily depends on system configuration(encoders,encoders resolution,motors,wheels,slippage,speed controller,drive system type etc..)

For optimal values, I recommend you to perform an odometry calibration alogirthm such as UMBMark. Calibrate it as possible as it can be. Then set your covairances. Covairances show how much you depend on your odometry data. If covairances are high, this shows that you don't depend very much on your odometry data.

How to set covairances ? your wheel odometry data is being published by you generally from base_link frame to odom frame. Check here. Odometry message type and IMU message type have parts where you can set covairances. Check out here for odometry and Check out here for imu