Skip to main content

Lesson 1: Gazebo Basics and World Building

Learning Objectives​

By the end of this lesson, students will be able to:

  • Install and configure Gazebo Harmonic
  • Create custom simulation worlds
  • Understand Gazebo's physics engine integration
  • Work with basic Gazebo models and environments

Introduction to Gazebo​

Gazebo is a 3D simulation environment for robotics that provides realistic physics simulation, high-quality rendering, and sensor simulation. It's an essential tool for testing and validating robotic systems before deployment on real hardware.

Key Features of Gazebo​

  1. Physics Simulation: Accurate simulation of rigid body dynamics using ODE, Bullet, or DART
  2. Sensor Simulation: Realistic simulation of cameras, LiDAR, IMUs, GPS, and other sensors
  3. Rendering: High-quality 3D visualization with support for multiple rendering engines
  4. ROS Integration: Seamless integration with ROS/ROS 2 for robotic simulation
  5. Model Database: Access to a large database of pre-built robot and environment models

Installing Gazebo Harmonic​

For this course, we'll use Gazebo Harmonic (the latest stable version):

# On Ubuntu 22.04
sudo apt update
sudo apt install gazebo libgazebo-dev

Basic Gazebo World Structure​

Gazebo worlds are defined using SDF (Simulation Description Format), an XML-based format:

<?xml version="1.0" ?>
<sdf version="1.7">
<world name="default">
<!-- Include the default Gazebo world -->
<include>
<uri>model://ground_plane</uri>
</include>

<include>
<uri>model://sun</uri>
</include>

<!-- Add your custom models here -->
<model name="my_robot">
<!-- Model definition -->
</model>
</world>
</sdf>

World Elements​

  • <physics>: Physics engine configuration (ODE, Bullet, DART)
  • <scene>: Visual properties (ambient lighting, shadows)
  • <light>: Light sources in the environment
  • <model>: Robot and object definitions
  • <include>: References to models in the Gazebo model database

Creating a Simple World​

Let's create a custom world file called simple_room.world:

<?xml version="1.0" ?>
<sdf version="1.7">
<world name="simple_room">
<!-- Physics engine -->
<physics type="ode">
<gravity>0 0 -9.8</gravity>
<max_step_size>0.001</max_step_size>
<real_time_factor>1</real_time_factor>
<real_time_update_rate>1000</real_time_update_rate>
</physics>

<!-- Scene settings -->
<scene>
<ambient>0.4 0.4 0.4</ambient>
<background>0.7 0.7 0.7</background>
<shadows>true</shadows>
</scene>

<!-- Sun light -->
<light name="sun" type="directional">
<cast_shadows>true</cast_shadows>
<pose>0 0 10 0 0 0</pose>
<diffuse>0.8 0.8 0.8 1</diffuse>
<specular>0.2 0.2 0.2 1</specular>
<attenuation>
<range>1000</range>
<constant>0.9</constant>
<linear>0.01</linear>
<quadratic>0.001</quadratic>
</attenuation>
<direction>-0.6 0.4 -0.8</direction>
</light>

<!-- Ground plane -->
<include>
<uri>model://ground_plane</uri>
</include>

<!-- Cube obstacle -->
<model name="cube_obstacle">
<pose>-1 0 0.5 0 0 0</pose>
<static>true</static>
<link name="link">
<collision name="collision">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
<material>
<ambient>0.8 0.2 0.2 1</ambient>
<diffuse>0.8 0.2 0.2 1</diffuse>
</material>
</visual>
</link>
</model>

<!-- Wall -->
<model name="wall">
<pose>0 2 1 0 0 0</pose>
<static>true</static>
<link name="link">
<collision name="collision">
<geometry>
<box>
<size>5 0.2 2</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>5 0.2 2</size>
</box>
</geometry>
<material>
<ambient>0.5 0.5 0.5 1</ambient>
<diffuse>0.5 0.5 0.5 1</diffuse>
</material>
</visual>
</link>
</model>
</world>
</sdf>

Running Gazebo with Custom Worlds​

To run Gazebo with your custom world:

# Run with a specific world file
gazebo simple_room.world

# Or run Gazebo and load the world later
gazebo --verbose

Gazebo GUI Overview​

When Gazebo starts, you'll see several key components:

  1. 3D View: The main simulation environment
  2. World Control: Play, pause, step through simulation
  3. Model Database: Pre-built models to insert into the world
  4. Scene Graph: Tree view of all objects in the simulation
  5. Tools: Additional utilities like the model editor

Physics Configuration​

The physics engine is crucial for realistic simulation. Key parameters include:

  • max_step_size: Time step for physics updates (smaller = more accurate but slower)
  • real_time_factor: Target simulation speed (1.0 = real-time)
  • real_time_update_rate: Update rate in Hz

Physics Engine Comparison​

  • ODE (Open Dynamics Engine): Stable and widely used, good for most applications
  • Bullet: Good for complex collision detection, handles soft bodies well
  • DART: Advanced dynamics, good for articulated robots and complex contacts

Practical Exercise: Create Your Own World​

Create a simple world file with the following elements:

  1. A ground plane
  2. A light source
  3. At least 3 different obstacles (cubes, spheres, or cylinders)
  4. A simple maze or path for navigation

Steps:

  1. Create a new directory for your world files: mkdir ~/gazebo_worlds
  2. Create your world file: nano ~/gazebo_worlds/my_world.world
  3. Copy the structure from the example above
  4. Add your custom elements
  5. Run with: gazebo ~/gazebo_worlds/my_world.world

Gazebo Commands and Tools​

Command Line Options​

  • gazebo --verbose: Show detailed output
  • gazebo --physics=bullet: Use a specific physics engine
  • gazebo --play: Start simulation automatically

Model Database​

Gazebo comes with a rich database of models:

  • Robots (PR2, TurtleBot, etc.)
  • Objects (cups, books, furniture)
  • Environments (rooms, outdoor scenes)

Troubleshooting Common Issues​

Simulation Runs Too Slow​

  • Reduce max_step_size or increase real_time_update_rate
  • Simplify collision geometries
  • Reduce the number of objects in the scene

Physics Behaviors Are Unrealistic​

  • Check mass and inertia values
  • Verify friction and damping coefficients
  • Adjust solver parameters

Rendering Issues​

  • Check graphics drivers
  • Try running with --verbose to see error messages
  • Consider using software rendering if hardware acceleration fails

Summary​

This lesson introduced Gazebo simulation environment and how to create custom worlds. Understanding world building is fundamental for creating realistic testing environments for your robots.

Next Steps​

In the next lesson, we'll explore sensor simulation in Gazebo, including cameras, LiDAR, and IMU sensors.