Skip to content

Read IMU Data from Gazebo harmonic

prerequisites

1
2
3
4
5
6
7
sudo apt install build-essential
sudo apt install \
    libgz-transport12-dev
    libgz-msgs10-dev
    libgz-tools-dev
    libgz-common5-dev
    libgz-math7-dev
world with IMU
<?xml version="1.0"?>
<sdf version="1.6">
  <world name="default">
    <physics name="1ms" type="ignored">
      <max_step_size>0.001</max_step_size>
      <real_time_factor>1.0</real_time_factor>
    </physics>
    <plugin
      filename="gz-sim-physics-system"
      name="gz::sim::systems::Physics">
    </plugin>
    <plugin
      filename="gz-sim-user-commands-system"
      name="gz::sim::systems::UserCommands">
    </plugin>
    <plugin
      filename="gz-sim-scene-broadcaster-system"
      name="gz::sim::systems::SceneBroadcaster">
    </plugin>
    <plugin
      filename="gz-sim-contact-system"
      name="gz::sim::systems::Contact">
    </plugin>
    <plugin
      filename="gz-sim-imu-system"
      name="gz::sim::systems::Imu">
    </plugin>

    <light type="directional" name="sun">
      <cast_shadows>true</cast_shadows>
      <pose>0 0 10 0 0 0</pose>
      <diffuse>1 1 1 1</diffuse>
      <specular>0.5 0.5 0.5 1</specular>
      <attenuation>
        <range>1000</range>
        <constant>0.9</constant>
        <linear>0.01</linear>
        <quadratic>0.001</quadratic>
      </attenuation>
      <direction>-0.5 0.1 -0.9</direction>
    </light>

    <model name="ground_plane">
      <static>true</static>
      <link name="link">
        <collision name="collision">
          <geometry>
            <plane>
              <normal>0 0 1</normal>
              <size>100 100</size>
            </plane>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <plane>
              <normal>0 0 1</normal>
              <size>100 100</size>
            </plane>
          </geometry>
          <material>
            <ambient>0.8 0.8 0.8 1</ambient>
            <diffuse>0.8 0.8 0.8 1</diffuse>
            <specular>0.8 0.8 0.8 1</specular>
          </material>
        </visual>
      </link>
    </model>

    <model name="my_box">
      <pose>1 2 0.5 0 0 0</pose> <!-- x y z roll pitch yaw -->
      <static>false</static>

      <link name="box_link">
        <collision name="box_collision">
          <geometry>
            <box>
              <size>1 1 1</size> <!-- x y z dimensions -->
            </box>
          </geometry>
        </collision>

        <visual name="box_visual">
          <geometry>
            <box>
              <size>1 1 1</size>
            </box>
          </geometry>
          <material>
            <ambient>0.1 0.3 0.8 1</ambient>
            <diffuse>0.1 0.3 0.8 1</diffuse>
          </material>
        </visual>

        <sensor name="imu" type="imu">
          <always_on>1</always_on>
          <update_rate>50</update_rate>
          <visualize>true</visualize>
          <topic>imu</topic>
          <enable_metrics>true</enable_metrics>
        </sensor>
      </link>

    </model>
  </world>
</sdf>
read_imu.cpp
#include <gz/transport.hh>
#include <gz/msgs.hh>
#include <iostream>

void imuCallback(const gz::msgs::IMU &msg)
{
  std::cout << "IMU Data:" << std::endl;
  std::cout << "  Linear Accel: "
            << msg.linear_acceleration().x() << ", "
            << msg.linear_acceleration().y() << ", "
            << msg.linear_acceleration().z() << std::endl;

  // std::cout << "  Angular Vel: "
  //           << msg.angular_velocity().x() << ", "
  //           << msg.angular_velocity().y() << ", "
  //           << msg.angular_velocity().z() << std::endl;
}

int main()
{
  gz::transport::Node node;

  std::string topic = "/imu";
  if (!node.Subscribe(topic, imuCallback))
  {
    std::cerr << "Failed to subscribe to topic: " << topic << std::endl;
    return -1;
  }

  std::cout << "Listening to IMU data on: " << topic << std::endl;
  gz::transport::waitForShutdown();
  return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(imu_subscriber)

# Find Gazebo dependencies
find_package(gz-transport12 REQUIRED)
find_package(gz-msgs10 REQUIRED)


# Add executable
add_executable(read_imu read_imu.cpp)
target_link_libraries(read_imu
    gz-transport12::gz-transport12
    ${GZ-MSGS_LIBRARIES}
)