CCNYRoboticsLab/imu_tools

Orientation calculation using IMU and magnetometer from hector_gazebo_plugins

Opened this issue · 0 comments

Hi,

I am trying to set up a simulation environment in order to get a grasp of how these two filters work and how to get an orientation using the magnetometer. I have configured a Husky simulated vehicle robot with a GPS, an IMU and magnetometer from hector_gazebo_plugins. The configuration of each of these simulated sensors is

<gazebo>
  <plugin name="imu_controller" filename="libhector_gazebo_ros_imu.so">
    <robotNamespace>$(arg robot_namespace)</robotNamespace>
    <updateRate>50.0</updateRate>
    <bodyName>base_link</bodyName>
    <topicName>imu/data_raw</topicName>
    <accelDrift>0.005 0.005 0.005</accelDrift>
    <accelGaussianNoise>0.005 0.005 0.005</accelGaussianNoise>
    <rateDrift>0.005 0.005 0.005 </rateDrift>
    <rateGaussianNoise>0.005 0.005 0.005 </rateGaussianNoise>
    <headingDrift>0.005</headingDrift>
    <headingGaussianNoise>0.005</headingGaussianNoise>
  </plugin>
</gazebo>

<gazebo>
  <plugin name="magnetometer_controller" filename="libhector_gazebo_ros_magnetic.so">
    <alwaysOn>true</alwaysOn>
    <updateRate>50.0</updateRate>
    <bodyName>base_link</bodyName>
    <topicName>imu/mag</topicName>
    <offset>0 0 0</offset>
    <drift>0.0 0.0 0.0</drift>
    <gaussianNoise>0.0 0.0 0.0</gaussianNoise>
    <declination>-9.3748</declination>
    <inclination>-36.7067</inclination>
    <magnitude>0.0000224340</magnitude>  <!-- 22434.0 nT -->
    <referenceHeading>0</referenceHeading>
    <useMagneticFieldMsgs>true</useMagneticFieldMsgs>
  </plugin>
</gazebo>

<gazebo>
  <plugin name="gps_controller" filename="libhector_gazebo_ros_gps.so">
    <robotNamespace>$(arg robot_namespace)</robotNamespace>
    <updateRate>50</updateRate>
    <bodyName>base_link</bodyName>
    <frameId>base_link</frameId>
    <topicName>navsat/fix</topicName>
    <velocityTopicName>navsat/vel</velocityTopicName>
    <referenceLatitude>-31.64053550641323</referenceLatitude>
    <referenceLongitude>-60.67061589856969</referenceLongitude>
    <referenceHeading>0</referenceHeading>
    <referenceAltitude>0</referenceAltitude>
    <drift>0.0001 0.0001 0.0001</drift>
  </plugin>
</gazebo>

then I launch both imu_complementary_filter and imu_filter_madgwick as follows

<?xml version="1.0"?>
<!-- ComplementaryFilter launch file -->
<launch>

  <!-- Filter raw gyro, accel and mag data into a usable orientation -->
  <node pkg="imu_complementary_filter" type="complementary_filter_node"
      name="complementary_filter_gain_node" output="screen">
    <param name="do_bias_estimation" value="true"/>
    <param name="do_adaptive_gain" value="true"/>
    <param name="use_mag" value="true"/>
    <param name="gain_acc" value="0.01"/>
    <param name="gain_mag" value="0.01"/>

    <remap from="/imu/data" to="/complementary/imu/data" />
  </node>

</launch>

and

<?xml version="1.0"?>
<!-- IMU filter Madgwick launch file -->
<launch>

  <!-- Filter raw gyro, accel and mag data into a usable orientation -->
  <node name="imu_filter" pkg="imu_filter_madgwick" type="imu_filter_node" >
  <!-- Hector Gazebo plugins use NWU, Gazebo uses ENU. Not really sure about this.
        Seems that we should set up this parameter as follows:
        1) NWU if we use the magnetometer, because of hector_gazebo_plugins.
        2) ENU if we don't use the magnetometer, because of Gazebo inertial frame. -->
    <param name="world_frame" value="nwu" />
    <param name="use_mag" value="true" />
    <param name="use_magnetic_field_msg" value="true" />

    <param name="declination" value="-9.3748" />
    <param name="yaw_offset" value="0" />
    <param name="publish_tf" value="false" />

    <remap from="/imu/data" to="/madgwick/imu/data" />
  </node>

</launch>

Now, according to hector_gazebo_plugins documentation, the world frame is using NWU convention and these can be tweaked by using the referenceHeading parameter. As you can see, I left them at 0 degrees in both the GPS and magnetometer configuration. The magnetic field values seem to be correct to what is expected (as the NOAA web page says). When the vehicle x-axis is facing North and its y-axis is facing West, the /imu/mag topic output is:

header: 
  seq: 379
  stamp: 
    secs: 7
    nsecs: 760000000
  frame_id: "base_link"
magnetic_field: 
  x: 1.7745176055738856e-05
  y: 2.9296682395335064e-06
  z: 1.3409329839969677e-05
magnetic_field_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

while the NOAA web page says this is the magnetic field that should be measured using that configuration:

Declination ( + E  | - W ): -9.3748°
Inclination ( + D  | - U ): -36.7067°
Horizontal Intensity: 17,985.5 nT
North Comp (+ N  | - S): 17,745.3 nT
East Comp (+ E  | - W): -2,929.7 nT
Vertical Comp (+ D  | - U): -13,409.2 nT
Total Field: 22,434.0 nT

if I understand this correctly, the NOAA reference frames uses NED and because of that it would be right to expect the changed signs for the yz-axis of the /imu/mag topic (which I assume uses NWU too).

To sum up, using this setup both of the filters provide an initial orientation equal to the declination at startup (in this case, -9.3748) and then they keep this offset while the vehicle moves. If the vehicle starts with its x-axis facing North, shouldn't the initial orientation obtained by the filters be 0 degrees?

Thanks in advance!