Skip to main content

Model Placement and Environmental Setup in Gazebo

Proper model placement and environmental setup are crucial for creating realistic and functional simulation environments. This section covers techniques for positioning robots and objects in Gazebo worlds, configuring their properties, and establishing the environmental context for effective digital twin simulation.

Understanding Coordinate Systems

Gazebo World Coordinates

Gazebo uses a right-handed coordinate system:

  • X-axis: Positive forward (toward the front of the world)
  • Y-axis: Positive left (toward the left side of the world)
  • Z-axis: Positive up (opposite to gravity direction)

Model Pose Definition

Models are positioned using the <pose> element which defines position and orientation:

<pose>x y z roll pitch yaw</pose>

Where:

  • x, y, z: Position in meters
  • roll, pitch, yaw: Orientation in radians (Euler angles in XYZ order)

Example Pose

<pose>2.5 1.0 0.0 0.0 0.0 1.5708</pose>
  • Positioned at (2.5m, 1.0m, 0.0m) in the world
  • Rotated 90 degrees (π/2 radians) around the Z-axis

Model Placement Techniques

Static Model Placement

For static objects like furniture, walls, or terrain features:

<model name="table">
<static>true</static>
<pose>1.0 2.0 0.0 0.0 0.0 0.0</pose>
<link name="chassis">
<collision name="collision">
<geometry>
<box><size>1.0 0.5 0.8</size></box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box><size>1.0 0.5 0.8</size></box>
</geometry>
<material>
<ambient>0.8 0.6 0.4 1</ambient>
<diffuse>0.8 0.6 0.4 1</diffuse>
</material>
</visual>
</link>
</model>

Dynamic Model Placement

For robots and moving objects:

<model name="mobile_robot">
<pose>0.0 0.0 0.5 0.0 0.0 0.0</pose> <!-- 0.5m above ground -->
<link name="base_link">
<!-- Robot definition -->
</link>
<joint name="wheel_joint" type="continuous">
<!-- Joint definition -->
</joint>
</model>

Environmental Setup

Ground Plane Configuration

The ground plane is typically the foundation of any environment:

<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.7 0.7 0.7 1</ambient>
<diffuse>0.7 0.7 0.7 1</diffuse>
</material>
</visual>
</link>
</model>

Creating Obstacles and Barriers

Different types of obstacles serve various purposes:

Static obstacles:

<model name="obstacle_1">
<static>true</static>
<pose>3.0 2.0 0.0 0.0 0.0 0.0</pose>
<link name="link">
<collision name="collision">
<geometry>
<cylinder>
<radius>0.3</radius>
<length>1.0</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>0.3</radius>
<length>1.0</length>
</cylinder>
</geometry>
<material>
<ambient>0.8 0.2 0.2 1</ambient>
<diffuse>0.8 0.2 0.2 1</diffuse>
</material>
</visual>
</link>
</model>

Robot-Specific Placement Considerations

Initial Robot Pose

When placing robots in simulation:

  • Safe starting position: Away from obstacles
  • Appropriate height: Usually slightly above ground to avoid initial contact
  • Clear heading: Oriented appropriately for planned tasks
  • Joint initialization: Start with stable joint configurations

Multiple Robot Coordination

For multi-robot environments:

<model name="robot1">
<pose>0.0 0.0 0.5 0.0 0.0 0.0</pose>
<!-- Robot 1 definition -->
</model>

<model name="robot2">
<pose>2.0 0.0 0.5 0.0 0.0 1.5708</pose> <!-- Offset position and 90° rotation -->
<!-- Robot 2 definition -->
</model>

Spawn Areas

Designate specific areas for robot spawning:

  • Clear zones: Free of obstacles
  • Consistent heights: Uniform starting elevation
  • Appropriate orientations: Facing logical directions
  • Safety margins: Adequate space between robots

Advanced Placement Techniques

Relative Positioning

Using relative transforms for complex arrangements:

<model name="assembly_station">
<pose>5.0 5.0 0.0 0.0 0.0 0.0</pose>

<!-- Robot positioned relative to station -->
<model name="manipulator">
<pose>0.5 0.0 1.0 0.0 0.0 3.14159</pose> <!-- Attached to station -->
<!-- Robot definition -->
</model>

<!-- Objects positioned relative to station -->
<model name="workpiece">
<pose>0.0 0.0 1.2 0.0 0.0 0.0</pose> <!-- On station -->
<!-- Workpiece definition -->
</model>
</model>

Procedural Placement

For environments with many similar objects:

  • Grid patterns: For systematic arrangement
  • Random distributions: For natural-looking environments
  • Cluster arrangements: For grouped objects
  • Path-following: For objects along routes

Dynamic Placement

For runtime model spawning:

// Example C++ code for dynamic model spawning
gazebo::msgs::SpawnModel spawn_msg;
spawn_msg.set_name("dynamic_object");
spawn_msg.set_xml(model_xml_string);
spawn_msg.mutable_pose()->mutable_position()->set_x(1.0);
spawn_msg.mutable_pose()->mutable_position()->set_y(2.0);
spawn_msg.mutable_pose()->mutable_position()->set_z(0.5);

// Publish to spawn model topic
spawn_pub->Publish(spawn_msg);

Environmental Context Setup

Object Relationships

Establish meaningful relationships between objects:

  • Functional groups: Related objects placed together
  • Activity zones: Areas designated for specific tasks
  • Traffic flows: Paths for mobile robots
  • Safety zones: Restricted areas for protection

Scale and Proportion

Maintain realistic scales:

  • Room dimensions: Match real-world spaces
  • Object sizes: Accurate proportions to real objects
  • Robot sizing: Correct scale relative to environment
  • Detail levels: Appropriate complexity for simulation goals

Best Practices for Model Placement

Accuracy and Precision

  • Measure carefully: Use accurate measurements from real environments
  • Verify clearances: Ensure adequate space for robot movement
  • Check alignments: Verify proper orientation of objects
  • Validate interactions: Test robot-object interactions

Performance Considerations

  • Minimize overlaps: Avoid unnecessary collision calculations
  • Optimize density: Balance realism with simulation speed
  • Group static objects: Combine static models when possible
  • Use appropriate geometry: Simplify collision meshes for distant objects

Repeatability

  • Document positions: Keep records of successful configurations
  • Parameterize locations: Use variables for easy modification
  • Version control: Track changes to world configurations
  • Validation tests: Verify that placement works across multiple runs

Troubleshooting Common Placement Issues

Collision Problems

Issue: Robots colliding with environment at startup Solution:

  • Increase initial Z-position slightly
  • Verify collision mesh alignment
  • Check for overlapping models

Issue: Objects falling through ground Solution:

  • Verify ground plane is static
  • Check model pose Z-value
  • Ensure collision geometry is properly defined

Visibility Issues

Issue: Objects not appearing correctly Solution:

  • Verify visual geometry definition
  • Check material properties
  • Ensure proper lighting in the area

Physics Issues

Issue: Unstable or jittery objects Solution:

  • Check mass properties
  • Verify collision geometry
  • Adjust physics parameters if needed

Example: Warehouse Environment Setup

Here's a complete example of setting up a simple warehouse environment:

<?xml version="1.0"?>
<sdf version="1.7">
<world name="warehouse">
<!-- Ground plane -->
<include>
<uri>model://ground_plane</uri>
</include>

<!-- Lighting -->
<include>
<uri>model://sun</uri>
</include>

<!-- Storage racks -->
<model name="rack_1">
<static>true</static>
<pose>5.0 0.0 0.0 0.0 0.0 0.0</pose>
<link name="rack_base">
<collision name="collision">
<geometry>
<box><size>2.0 0.5 2.0</size></box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box><size>2.0 0.5 2.0</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>

<!-- Robot starting position -->
<model name="delivery_robot">
<pose>0.0 0.0 0.5 0.0 0.0 0.0</pose>
<!-- Robot model definition -->
</model>

<!-- Charging station -->
<model name="charging_station">
<static>true</static>
<pose>8.0 2.0 0.0 0.0 0.0 1.5708</pose>
<link name="station_base">
<!-- Station definition -->
</link>
</model>
</world>
</sdf>

This setup demonstrates proper placement techniques for creating a functional warehouse simulation environment with appropriate spacing, clear navigation paths, and logical object relationships.