ScenarIO#
In this getting started section we show how to use the Gazebo ScenarIO library to simulate a pendulum system. We will use the models of the ground plane and the pendulum stored in the repository gym_gz_models.
The final outcome of this section is shown in the following GIF:
Tip
We fully support Gz Fuel, a constantly enlarging database of SDF models.
You can use get_model_file_from_fuel()
to download any model of the database:
from scenario import gazebo as scenario_gazebo
model_name = "Electrical Box"
model_file = scenario_gazebo.get_model_file_from_fuel(
uri=f"https://fuel.gazebosim.org/openrobotics/models/{model_name}")
Python#
import time
import gym_gz_models
from scenario import gazebo as scenario_gazebo
# Create the simulator
gazebo = scenario_gazebo.GazeboSimulator(step_size=0.001,
rtf=1.0,
steps_per_run=1)
# Initialize the simulator
gazebo.initialize()
# Get the default world and insert the ground plane
world = gazebo.get_world()
world.insert_model(gym_gz_models.get_model_file("ground_plane"))
# Select the physics engine
world.set_physics_engine(scenario_gazebo.PhysicsEngine_dart)
# Open the GUI
gazebo.gui()
time.sleep(3)
gazebo.run(paused=True)
# Insert a pendulum
world.insert_model(gym_gz_models.get_model_file("pendulum"))
gazebo.run(paused=True)
time.sleep(3)
# Get the pendulum model
pendulum = world.get_model("pendulum")
# Reset the pole position
pendulum.get_joint("pivot").to_gazebo().reset_position(0.01)
gazebo.run(paused=True)
time.sleep(3)
# Simulate 30 seconds
for _ in range(int(30.0 / gazebo.step_size())):
gazebo.run()
# Close the simulator
time.sleep(5)
gazebo.close()
C++#
#include <scenario/gazebo/GazeboSimulator.h>
#include <scenario/gazebo/Joint.h>
#include <scenario/gazebo/Model.h>
#include <scenario/gazebo/World.h>
#include <chrono>
#include <string>
#include <thread>
int main(int argc, char* argv[])
{
// Create the simulator
auto gazebo = scenario::gazebo::GazeboSimulator(
/*stepSize=*/0.001, /*rtf=*/1.0, /*stepsPerRun=*/1);
// Initialize the simulator
gazebo.initialize();
// Get the default world
auto world = gazebo.getWorld();
// Insert the ground plane
const std::string groundPlaneSDF = "ground_plane.sdf";
world->insertModel(groundPlaneSDF);
// Select the physics engine
world->setPhysicsEngine(scenario::gazebo::PhysicsEngine::Dart);
// Open the GUI
gazebo.gui();
std::this_thread::sleep_for(std::chrono::seconds(3));
gazebo.run(/*paused=*/true);
// Insert a pendulum
const std::string pendulumURDF = "pendulum.urdf";
world->insertModel(/*modelFile=*/pendulumURDF);
gazebo.run(/*paused=*/true);
// Get the pendulum
auto pendulum = world->getModel(/*modelName=*/"pendulum");
// Reset the pole position
auto pivot = pendulum->getJoint("pivot");
auto pivotGazebo = std::static_pointer_cast<scenario::gazebo::Joint>(pivot);
pivotGazebo->resetPosition(0.001);
// Simulate 30 seconds
for (size_t i = 0; i < 30.0 / gazebo.stepSize(); ++i) {
gazebo.run();
}
// Close the simulator
std::this_thread::sleep_for(std::chrono::seconds(3));
gazebo.close();
return 0;
}
cmake_minimum_required(VERSION 3.16)
project(ExampleWithScenario VERSION 1.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Scenario COMPONENTS Gazebo REQUIRED)
add_executable(ExampleWithScenario example.cpp)
target_link_libraries(ExampleWithScenario PRIVATE
ScenarioGazebo::ScenarioGazebo
ScenarioGazebo::GazeboSimulator)
Note
The environment should be properly configured to find the plugins and the models.
Use GZ_SIM_SYSTEM_PLUGIN_PATH
for the plugins and GZ_SIM_RESOURCE_PATH
for the models and meshes.