ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Revision history [back]

One data source will work.

What message type is Pioneer3AT/pose? If it's a PoseWithCovarianceStamped, then your configuration is wrong. Change it to

<param name="pose0" value="Pioneer3AT/pose" />

When in doubt, start with one sensor at a time. Get your pose data working, then add the IMU, etc.

One data source will work.

What message type is Pioneer3AT/pose? If it's a PoseWithCovarianceStamped, then your configuration is wrong. Change it to

<param name="pose0" value="Pioneer3AT/pose" />

When in doubt, start with one sensor at a time. Get your pose data working, then add the IMU, etc.

EDIT: Also, the best thing to do is paste your entire ekf_localization_node launch file, and post a sample message from each sensor.

One data source will work.

What message type is Pioneer3AT/pose? If it's a PoseWithCovarianceStamped, then your configuration is wrong. Change it to

<param name="pose0" value="Pioneer3AT/pose" />

When in doubt, start with one sensor at a time. Get your pose data working, then add the IMU, etc.

EDIT: Also, the best thing to do is paste your entire ekf_localization_node launch file, and post a sample message from each sensor.

EDIT 2: Your IMU data appears to be in the /imu frame. Are you providing a transform from /imu to /Pioneer3AT/base_link? Also, you want to make sure that your Pioneer code is not broadcasting a /Pioneer3AT/odom->/Pioneer3AT/base_link transform.

One data source will work.

What message type is Pioneer3AT/pose? If it's a PoseWithCovarianceStamped, then your configuration is wrong. Change it to

<param name="pose0" value="Pioneer3AT/pose" />

When in doubt, start with one sensor at a time. Get your pose data working, then add the IMU, etc.

EDIT: Also, the best thing to do is paste your entire ekf_localization_node launch file, and post a sample message from each sensor.

EDIT 2: Your IMU data appears to be in the /imu frame. Are you providing a transform from /imu to /Pioneer3AT/base_link? Also, you want to make sure that your Pioneer code is not broadcasting a /Pioneer3AT/odom->/Pioneer3AT/base_link transform.

EDIT 3: So I ran your bag file with the launch file you posted. I am definitely getting publications on /odometry/filtered, though the only data going into it is IMU data, because your bag didn't have any Pioneer odometry messages in it. If you're still having trouble, do this for me:

  1. Set up your robot as before, without ekf_localization_node running. Bring everything up.
  2. Start bagging everything.
  3. Drive your robot in some pattern. A square works well. Make note of how you drove the robot (e.g., clockwise turns, leg lengths, etc.).
  4. Post the bag, and let me know what, if any, output you were getting from ekf_localization_node.

    It'll help me debug. Thanks!

One data source will work.

What message type is Pioneer3AT/pose? If it's a PoseWithCovarianceStamped, then your configuration is wrong. Change it to

<param name="pose0" value="Pioneer3AT/pose" />

When in doubt, start with one sensor at a time. Get your pose data working, then add the IMU, etc.

EDIT: Also, the best thing to do is paste your entire ekf_localization_node launch file, and post a sample message from each sensor.

EDIT 2: Your IMU data appears to be in the /imu frame. Are you providing a transform from /imu to /Pioneer3AT/base_link? Also, you want to make sure that your Pioneer code is not broadcasting a /Pioneer3AT/odom->/Pioneer3AT/base_link transform.

EDIT 3: So I ran your bag file with the launch file you posted. I am definitely getting publications on /odometry/filtered, though the only data going into it is IMU data, because your bag didn't have any Pioneer odometry messages in it. If you're still having trouble, do this for me:

  1. Set up your robot as before, without ekf_localization_node running. Bring everything up.
  2. Start bagging everything.
  3. Drive your robot in some pattern. A square works well. Make note of how you drove the robot (e.g., clockwise turns, leg lengths, etc.).
  4. Post the bag, and let me know what, if any, output you were getting from ekf_localization_node.

    It'll help me debug. Thanks!

EDIT 4: If you download the bag file you posted, and then start playing it back, and do rostopic echo /Pioneer3AT/pose, you'll see that no messages are published to /Pioneer3AT/pose (or you can just do rosbag info on the bag and see that no odometry messages are in there). Now run your system live, and do rostopic echo /Pioneer3AT/pose. If nothing comes out, then you've got a problem with your odometry publishing.

One data source will work.

What message type is Pioneer3AT/pose? If it's a PoseWithCovarianceStamped, then your configuration is wrong. Change it to

<param name="pose0" value="Pioneer3AT/pose" />

When in doubt, start with one sensor at a time. Get your pose data working, then add the IMU, etc.

EDIT: Also, the best thing to do is paste your entire ekf_localization_node launch file, and post a sample message from each sensor.

EDIT 2: Your IMU data appears to be in the /imu frame. Are you providing a transform from /imu to /Pioneer3AT/base_link? Also, you want to make sure that your Pioneer code is not broadcasting a /Pioneer3AT/odom->/Pioneer3AT/base_link transform.

EDIT 3: So I ran your bag file with the launch file you posted. I am definitely getting publications on /odometry/filtered, though the only data going into it is IMU data, because your bag didn't have any Pioneer odometry messages in it. If you're still having trouble, do this for me:

  1. Set up your robot as before, without ekf_localization_node running. Bring everything up.
  2. Start bagging everything.
  3. Drive your robot in some pattern. A square works well. Make note of how you drove the robot (e.g., clockwise turns, leg lengths, etc.).
  4. Post the bag, and let me know what, if any, output you were getting from ekf_localization_node.

EDIT 4: If you download the bag file you posted, and then start playing it back, and do rostopic echo /Pioneer3AT/pose, you'll see that no messages are published to /Pioneer3AT/pose (or you can just do rosbag info on the bag and see that no odometry messages are in there). Now run your system live, and do rostopic echo /Pioneer3AT/pose. If nothing comes out, then you've got a problem with your odometry publishing.

EDIT 5 (in response to comment): here's a screenshot of the output of your bag after about 30 seconds. Is this what you mean by "light years"?

image description

This is exactly what I would expect to see from a single IMU being used for your state estimate. You're fusing linear acceleration, which is typically pretty noisy, and is clearly not zero-mean in this case, as you are creeping along in all three dimensions. If you have no other measurements from other sensors to help, small errors in your IMU acceleration will accumulate and lead to false velocity, which will continue to grow infinitely, and your position will as well.

Long story short: you can't get a good state estimate with a single IMU by itself.

Re: the odom->base_link transform, see REP-105. ROS assumes three principal frames: map, odom, and base_link (or whatever naming scheme you want). The purpose of packages like robot_localization is to provide two things:

  1. A nav_msgs/Odometry message with the robot's current pose estimate
  2. A transform from odom->base_link or a transform from map->odom. With your configuration, we are going from /Pioneer3/odom->/Pioneer3/base_link. This transform will contain effectively the same data as the message, but will be used by tf. Note that the transform from the odom frame to the base_link frame is equivalent to your pose in the world (technically, it's the inverse, but when you put the transform together, you use the same data as your message).

Now, tf does not like two different nodes broadcasting the same transform. The Pioneer node you're using has an option that allows it to broadcast the /Pioneer3/odom->/Pioneer3/base_link based on its raw wheel odometry. You want a better estimate of your position, so you fuse the raw wheel odometry with IMU data. This produces the two outputs above.