Hector Gazebo IMU not transforming data
I have a hector_gazebo IMU in my .urdf.xacro robot model. To match the orientation of the IMU on our real robot, I need to roll it by 180 degrees (relative to base_link) so that +z is down, +y is right. I want imu data to be published in the local imu frame (imu_link
). With this 180 degree rotation, the data in the imu message does not look to be transformed correctly, and I can't figure out what I'm doing wrong. Am I missing something with how tf works, or am i incorrectly specifying the frameId
in the plugin, or is this an error in the plugin?
I instantiate the plugin using the following code:
<plugin name="imu" filename="libhector_gazebo_ros_imu.so">
<serviceName>/imu/calibrate</serviceName>
<updateRate>200.0</updateRate>
<bodyName>imu_link</bodyName>
<frameId>imu_link</frameId>
<topicName>imu</topicName>
<rpyOffset>0 0 0</rpyOffset>
<xyzOffset>0 0 0</xyzOffset>
<gaussianNoise>0.00000001</gaussianNoise>
<accelDrift>0.00000001 0.00000001 0.00000001</accelDrift>
<accelDriftFrequency>0.00000001 0.00000001 0.00000001</accelDriftFrequency>
<accelGaussianNoise>0.00000001 0.00000001 0.00000001</accelGaussianNoise>
<rateDrift>0.0 0.0 0.0</rateDrift>
<rateDriftFrequency>0.0 0.0 0.0</rateDriftFrequency>
<rateGaussianNoise>0.0 0.0 0.0</rateGaussianNoise>
<headingDrift>0.0 0.0 0.0</headingDrift>
<headingDriftFrequency>0.0 0.0 0.0</headingDriftFrequency>
<headingGaussianNoise>0.0 0.0 0.0</headingGaussianNoise>
</plugin>
The test I constructed is a simple transform from base_link
that rolls 180 degrees. Attached are screenshots showing the two frames (base_link
and imu_link
) and the imu data when driving in a left circle. In both cases the frame_id
of the imu message is imu_link
.
When I roll the 'imu_joint' by 180 degrees, which connects base_link
and imu_link
, the imu data is not transformed how I expect when performing a left turn. The z angular rate should now be negative and the oscillations in the linear_acceleration
look like the data is being transformed into a global frame instead of the local imu frame:
Hi, I have the same problem recently when fusing imu. How do you solve it?