ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange |
1 | initial version |
I would suspect that your IMU data is not modifying the transform tree correctly. You should check that the right effect is created.
It is very important to understand how your IMU works. Some IMUs calculate angular rotation with respect to the Earth. For example, an IMU that is world-referenced would obtain its z-rotation using a magnetometer. It would then use the gravity vector to calculate all rotations with respect to the Earth. A relative-reference IMU would simply calculate the amount that it has rotated about each axis since the last time you reset its gyros. Thus, if you reset the gyros with the robot upside down, that would be considered 0,0,0 rpy.
For example, on my robot, we use the IMU data (relative-reference) to calculate the transform from /base_footprint
to /base_link
. We mark /base_footprint
as the point on the ground directly below the robot's center of mass/rotation. Thus, /base_footprint
is modified by the position of the robot with respect to the static /odom
frame. We obtain our z-axis rotation for /odom
by resetting the gyros (so the IMU is not outputting 0 degrees for rotation about the z-axis) and then adding the heading obtained by our digital magnetometers. We then obtain x and y positions from the GPS. This sets our /odom
frame with respect to the world (Earth).
After setting /odom
with respect to the /world
frame, all future calculations are performed between /odom
and /base_footprint
. This is because both wheel odometry and our IMU are relative to the starting point of the robot (/odom
). Thus, the z-axis rotation from the IMU will set the heading of the robot with respect to /odom
.
/base_link
represents the center of mass/rotation for the robot. This frame's z-distance from /base_footprint
is static (the robot cannot move up and down). This frame's rotation about the z-axis is fixed to /base_footprint
's rotation. Finally, this frame's pitch (rotation about the y-axis) and roll (rotation about the x-axis) are calculated by the IMU.
I know this is very specific to my robot, but the idea is to give you an idea of the thought process you can use to check your IMU calculations. I'd be happy to clarify any points if necessary. I know this was a lot of information to understand.