diff --git a/garden/ros2_gz_docker_bridge.md b/garden/ros2_gz_docker_bridge.md new file mode 100644 index 0000000000..23bd1df4a4 --- /dev/null +++ b/garden/ros2_gz_docker_bridge.md @@ -0,0 +1,187 @@ +# ROS 2 + Gazebo Cross-Container Docker Bridge + +A two-container Docker setup for running Gazebo and ROS 2 as separate services connected over a custom Docker network, with the ros_gz_bridge handling topic communication between them + +--- + +## Compatibility + +| ROS 2 | Gazebo | +|---|---| +| Lyrical | Jetty | +| Rolling | Jetty | +| Kilted | Ionic | +| Jazzy | Harmonic | +| Iron | Harmonic | +| Humble | Fortress | + +--- + +## Prerequisites + +- Docker installed and running +- Both images built: + - `gazebo` — from your Gazebo Dockerfile + - `ros2` — from your ROS 2 Dockerfile +- `ros-gz-bridge` installed + +--- + +## Setup + +### 1. Create the Docker Network + +```bash +docker network create ros-link +``` + +### 2. Start Containers + +```bash +docker run -it -d --name gazebo-container --network ros-link gazebo sleep infinity +docker run -it -d --name ros2-container --network ros-link ros2 sleep infinity +``` + +### 3. Check Container IPs + + +```bash +docker network inspect ros-link +``` + +Example output: +```json +[ + { + "Name": "ros-link", + "Driver": "bridge", + "IPAM": { + "Config": [{ "Subnet": "172.21.0.0/16", "Gateway": "172.21.0.1" }] + }, + "Containers": { + "281b3cbfba6a...": { + "Name": "ros2-container", + "IPv4Address": "172.21.0.3/16" // + }, + "c2410d610249...": { + "Name": "gazebo-container", + "IPv4Address": "172.21.0.2/16" // + } + } + } +] +``` + +--- + +### 4. Configure Environment Variables + +**In `gazebo-container`:** +```bash +export GZ_IP= +export GZ_PARTITION=gazebo-container +``` + +**In `ros2-container`:** +```bash +export GZ_IP= +export GZ_PARTITION=gazebo-container +source /opt/ros//setup.bash +``` + +:::{important} +Add these to `~/.bashrc` in each container to be available across sessions. +::: + +:::{note} +When setting `GZ_IP`, use only the IP address without the subnet mask. For example: + +```bash +export GZ_IP=172.21.0.3 +``` + +Do not include `/16`. +::: + +--- + +### 5. Install the Bridge + +```bash +apt-get update && apt-get install -y ros--ros-gz-bridge +``` + +--- + +## Using a Config File (optional) + +if you have a `bridge.yaml` config file, you can use it instead of passing topics as arguments: + +```bash +ros2 run ros_gz_bridge parameter_bridge --ros-args -p config_file:=/path/to/bridge.yaml +``` + +See the [ros_gz_bridge](https://github.com/gazebosim/ros_gz/tree/ros2/ros_gz_bridge) documentation for configuration options. + +--- + +## Running the Bridge + +### Terminal 1 — Start Gazebo sim + +```bash +docker exec -it gazebo-container bash +gz sim shapes.sdf +``` + +### Terminal 2 — Start the bridge + +```bash +docker exec -it ros2-container bash +source /opt/ros//setup.bash +``` + +#### Option 1: Single topic (basic) +```bash +ros2 run ros_gz_bridge parameter_bridge \ + /clock@rosgraph_msgs/msg/Clock@gz.msgs.Clock +``` + +#### Option 2: Multiple topics +```bash +ros2 run ros_gz_bridge parameter_bridge \ + /clock@rosgraph_msgs/msg/Clock@gz.msgs.Clock \ + /world/default/model/vehicle/cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist \ + /world/default/model/vehicle/odometry@nav_msgs/msg/Odometry@gz.msgs.Odometry +``` + +#### Option 3: Using config file +```bash +ros2 run ros_gz_bridge parameter_bridge --ros-args -p config_file:=/path/to/bridge.yaml +``` +See the [ros_gz_bridge](https://github.com/gazebosim/ros_gz/tree/ros2/ros_gz_bridge) documentation for configuration options. + +### Terminal 3 — Verify + +```bash +docker exec -it ros2-container bash +source /opt/ros//setup.bash +ros2 topic echo /clock +``` +if you see something like this :- +```bash +clock: + sec: 0 + nanosec: 0 +--- +clock: + sec: 0 + nanosec: 0 +--- +clock: + sec: 0 + nanosec: 0 +--- +``` +then the connection between the two docker containers is succesfull + diff --git a/garden/tutorials.md b/garden/tutorials.md new file mode 100644 index 0000000000..a268af4dfa --- /dev/null +++ b/garden/tutorials.md @@ -0,0 +1,50 @@ +# Gazebo Tutorials + +These tutorials cover general concepts to help get you started with Gazebo. + +## Basics tutorials + +* [Building Your Own Robot](building_robot) +* [Moving the Robot](moving_robot) +* [SDF Worlds](sdf_worlds) +* [Sensors](sensors) +* [Actors](actors) + +## GUI tutorials + +* [Understanding the GUI](gui) +* [Manipulating Models](manipulating_models) +* [Model Insertion from Fuel](fuel_insert) +* [Keyboard Shortcuts](hotkeys) + +## ROS integration + +* [Spawn URDF](spawn_urdf) +* [ROS 2 Integration](ros2_integration) +* [ROS 2 Interoperability](ros2_interop) +* [ROS 2 Integration Template](ros_gz_project_template_guide) +* [ROS 2 Cross Docker Bridge Setup](ros2_gz_docker_bridge) + +## Per-library tutorials + +See the *API & Tutorials* sections on the [Libraries page](/libs){.external} page for more specific content correlating to each Gazebo library. + +The entrypoint library is Sim. +- [Sim](/api/sim/7/tutorials.html){.external} + +Other libraries: +- [Cmake](/api/cmake/3/tutorials.html){.external} +- [Common](/api/common/5/tutorials.html){.external} +- [Fuel_tools](/api/fuel_tools/8/tutorials.html){.external} +- [Gui](/api/gui/7/tutorials.html){.external} +- [Launch](/api/launch/6/tutorials.html){.external} +- [Math](/api/math/7/tutorials.html){.external} +- [Msgs](/api/msgs/9/tutorials.html){.external} +- [Physics](/api/physics/6/tutorials.html){.external} +- [Plugin](/api/plugin/2/tutorials.html){.external} +- [Rendering](/api/rendering/7/tutorials.html){.external} +- [Sensors](/api/sensors/7/tutorials.html){.external} +- [Tools](/api/tools/2/tutorials.html){.external} +- [Transport](/api/transport/12/tutorials.html){.external} +- [Utils](/api/utils/2/tutorials.html){.external} +- [Sdformat](/api/sdformat/13/){.external} diff --git a/harmonic/ros2_gz_docker_bridge.md b/harmonic/ros2_gz_docker_bridge.md new file mode 100644 index 0000000000..1b76f15043 --- /dev/null +++ b/harmonic/ros2_gz_docker_bridge.md @@ -0,0 +1,174 @@ +# ROS 2 + Gazebo Cross-Container Docker Bridge + +A two-container Docker setup for running Gazebo and ROS 2 as separate services connected over a custom Docker network, with the ros_gz_bridge handling topic communication between them + +--- + +## Compatibility + +| ROS 2 | Gazebo | +|---|---| +| Lyrical | Jetty | +| Rolling | Jetty | +| Kilted | Ionic | +| Jazzy | Harmonic | +| Iron | Harmonic | +| Humble | Fortress | + +--- + +## Prerequisites + +- Docker installed and running +- Both images built: + - `gazebo` — from your Gazebo Dockerfile + - `ros2` — from your ROS 2 Dockerfile +- `ros-gz-bridge` installed + +--- + +## Setup + +### 1. Create the Docker Network + +```bash +docker network create ros-link +``` + +### 2. Start Containers + +```bash +docker run -it -d --name gazebo-container --network ros-link gazebo sleep infinity +docker run -it -d --name ros2-container --network ros-link ros2 sleep infinity +``` + +### 3. Check Container IPs + + +```bash +docker network inspect ros-link +``` + +Example output: +```json +[ + { + "Name": "ros-link", + "Driver": "bridge", + "IPAM": { + "Config": [{ "Subnet": "172.21.0.0/16", "Gateway": "172.21.0.1" }] + }, + "Containers": { + "281b3cbfba6a...": { + "Name": "ros2-container", + "IPv4Address": "172.21.0.3/16" // + }, + "c2410d610249...": { + "Name": "gazebo-container", + "IPv4Address": "172.21.0.2/16" // + } + } + } +] +``` + +--- + +### 4. Configure Environment Variables + +**In `gazebo-container`:** +```bash +export GZ_IP= +export GZ_PARTITION=gazebo-container +``` + +**In `ros2-container`:** +```bash +export GZ_IP= +export GZ_PARTITION=gazebo-container +source /opt/ros//setup.bash +``` + +:::{important} +Add these to `~/.bashrc` in each container to be available across sessions. +::: + +:::{note} +When setting `GZ_IP`, use only the IP address without the subnet mask. For example: + +```bash +export GZ_IP=172.21.0.3 +``` + +Do not include `/16`. +::: + +--- + +### 5. Install the Bridge + +```bash +apt-get update && apt-get install -y ros--ros-gz-bridge +``` + +--- + +## Running the Bridge + +### Terminal 1 — Start Gazebo sim + +```bash +docker exec -it gazebo-container bash +gz sim shapes.sdf +``` + +### Terminal 2 — Start the bridge + +```bash +docker exec -it ros2-container bash +source /opt/ros//setup.bash +``` + +#### Option 1: Single topic (basic) +```bash +ros2 run ros_gz_bridge parameter_bridge \ + /clock@rosgraph_msgs/msg/Clock@gz.msgs.Clock +``` + +#### Option 2: Multiple topics +```bash +ros2 run ros_gz_bridge parameter_bridge \ + /clock@rosgraph_msgs/msg/Clock@gz.msgs.Clock \ + /world/default/model/vehicle/cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist \ + /world/default/model/vehicle/odometry@nav_msgs/msg/Odometry@gz.msgs.Odometry +``` + +#### Option 3: Using config file +```bash +ros2 run ros_gz_bridge parameter_bridge --ros-args -p config_file:=/path/to/bridge.yaml +``` +See the [ros_gz_bridge](https://github.com/gazebosim/ros_gz/tree/ros2/ros_gz_bridge) documentation for configuration options. + +### Terminal 3 — Verify + +```bash +docker exec -it ros2-container bash +source /opt/ros//setup.bash +ros2 topic echo /clock +``` +if you see something like this :- +```bash +clock: + sec: 0 + nanosec: 0 +--- +clock: + sec: 0 + nanosec: 0 +--- +clock: + sec: 0 + nanosec: 0 +--- +``` +then the connection between the two docker containers is succesfull \ No newline at end of file diff --git a/harmonic/tutorials.md b/harmonic/tutorials.md new file mode 100644 index 0000000000..62aef10e84 --- /dev/null +++ b/harmonic/tutorials.md @@ -0,0 +1,50 @@ +# Gazebo Tutorials + +These tutorials cover general concepts to help get you started with Gazebo. + +## Basics tutorials + +* [Building Your Own Robot](building_robot) +* [Moving the Robot](moving_robot) +* [SDF Worlds](sdf_worlds) +* [Sensors](sensors) +* [Actors](actors) + +## GUI tutorials + +* [Understanding the GUI](gui) +* [Manipulating Models](manipulating_models) +* [Model Insertion from Fuel](fuel_insert) +* [Keyboard Shortcuts](hotkeys) + +## ROS integration + +* [Spawn URDF](spawn_urdf) +* [ROS 2 Integration via Bridge](ros2_integration) +* [ROS 2 Interoperability](ros2_interop) +* [ROS 2 Integration Template](ros_gz_project_template_guide) +* [ROS 2 Cross Docker Bridge Setup](ros2_gz_docker_bridge) + +## Per-library tutorials + +See the *API & Tutorials* sections on the [Libraries page](/libs){.external} page for more specific content correlating to each Gazebo library. + +The entrypoint library is Sim. +- [Sim](/api/sim/8/tutorials.html){.external} + +Other libraries: +- [Cmake](/api/cmake/3/tutorials.html){.external} +- [Common](/api/common/5/tutorials.html){.external} +- [Fuel_tools](/api/fuel_tools/9/tutorials.html){.external} +- [Gui](/api/gui/8/tutorials.html){.external} +- [Launch](/api/launch/7/tutorials.html){.external} +- [Math](/api/math/7/tutorials.html){.external} +- [Msgs](/api/msgs/10/tutorials.html){.external} +- [Physics](/api/physics/7/tutorials.html){.external} +- [Plugin](/api/plugin/2/tutorials.html){.external} +- [Rendering](/api/rendering/8/tutorials.html){.external} +- [Sensors](/api/sensors/8/tutorials.html){.external} +- [Tools](/api/tools/2/tutorials.html){.external} +- [Transport](/api/transport/13/tutorials.html){.external} +- [Utils](/api/utils/2/tutorials.html){.external} +- [Sdformat](/api/sdformat/13/){.external} diff --git a/ionic/ros2_gz_docker_bridge.md b/ionic/ros2_gz_docker_bridge.md new file mode 100644 index 0000000000..ade432da0e --- /dev/null +++ b/ionic/ros2_gz_docker_bridge.md @@ -0,0 +1,187 @@ +# ROS 2 + Gazebo Cross-Container Docker Bridge + +A two-container Docker setup for running Gazebo and ROS 2 as separate services connected over a custom Docker network, with the ros_gz_bridge handling topic communication between them + +--- + +## Compatibility + +| ROS 2 | Gazebo | +|---|---| +| Lyrical | Jetty | +| Rolling | Jetty | +| Kilted | Ionic | +| Jazzy | Harmonic | +| Iron | Harmonic | +| Humble | Fortress | + +--- + +## Prerequisites + +- Docker installed and running +- Both images built: + - `gazebo` — from your Gazebo Dockerfile + - `ros2` — from your ROS 2 Dockerfile +- `ros-gz-bridge` installed + +--- + +## Setup + +### 1. Create the Docker Network + +```bash +docker network create ros-link +``` + +### 2. Start Containers + +```bash +docker run -it -d --name gazebo-container --network ros-link gazebo sleep infinity +docker run -it -d --name ros2-container --network ros-link ros2 sleep infinity +``` + +### 3. Check Container IPs + + +```bash +docker network inspect ros-link +``` + +Example output: +```json +[ + { + "Name": "ros-link", + "Driver": "bridge", + "IPAM": { + "Config": [{ "Subnet": "172.21.0.0/16", "Gateway": "172.21.0.1" }] + }, + "Containers": { + "281b3cbfba6a...": { + "Name": "ros2-container", + "IPv4Address": "172.21.0.3/16" // + }, + "c2410d610249...": { + "Name": "gazebo-container", + "IPv4Address": "172.21.0.2/16" // + } + } + } +] +``` + +--- + +### 4. Configure Environment Variables + +**In `gazebo-container`:** +```bash +export GZ_IP= +export GZ_PARTITION=gazebo-container +``` + +**In `ros2-container`:** +```bash +export GZ_IP= +export GZ_PARTITION=gazebo-container +source /opt/ros//setup.bash +``` + +:::{important} +Add these to `~/.bashrc` in each container to be available across sessions. +::: + +:::{note} +When setting `GZ_IP`, use only the IP address without the subnet mask. For example: + +```bash +export GZ_IP=172.21.0.3 +``` + +Do not include `/16`. +::: + +--- + +### 5. Install the Bridge + +```bash +apt-get update && apt-get install -y ros--ros-gz-bridge +``` + +--- + +## Using a Config File (optional) + +if you have a `bridge.yaml` config file, you can use it instead of passing topics as arguments: + +```bash +ros2 run ros_gz_bridge parameter_bridge --ros-args -p config_file:=/path/to/bridge.yaml +``` + +See the [ros_gz_bridge](https://github.com/gazebosim/ros_gz/tree/ros2/ros_gz_bridge) documentation for configuration options. + +--- + +## Running the Bridge + +### Terminal 1 — Start Gazebo sim + +```bash +docker exec -it gazebo-container bash +gz sim shapes.sdf +``` + +### Terminal 2 — Start the bridge + +```bash +docker exec -it ros2-container bash +source /opt/ros//setup.bash +``` + +#### Option 1: Single topic (basic) +```bash +ros2 run ros_gz_bridge parameter_bridge \ + /clock@rosgraph_msgs/msg/Clock@gz.msgs.Clock +``` + +#### Option 2: Multiple topics +```bash +ros2 run ros_gz_bridge parameter_bridge \ + /clock@rosgraph_msgs/msg/Clock@gz.msgs.Clock \ + /world/default/model/vehicle/cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist \ + /world/default/model/vehicle/odometry@nav_msgs/msg/Odometry@gz.msgs.Odometry +``` + +#### Option 3: Using config file +```bash +ros2 run ros_gz_bridge parameter_bridge --ros-args -p config_file:=/path/to/bridge.yaml +``` +See the [ros_gz_bridge](https://github.com/gazebosim/ros_gz/tree/ros2/ros_gz_bridge) documentation for configuration options. + +### Terminal 3 — Verify + +```bash +docker exec -it ros2-container bash +source /opt/ros//setup.bash +ros2 topic echo /clock +``` +if you see something like this :- +```bash +clock: + sec: 0 + nanosec: 0 +--- +clock: + sec: 0 + nanosec: 0 +--- +clock: + sec: 0 + nanosec: 0 +--- +``` +then the connection between the two docker containers is succesfull + diff --git a/ionic/tutorials.md b/ionic/tutorials.md new file mode 100644 index 0000000000..62aef10e84 --- /dev/null +++ b/ionic/tutorials.md @@ -0,0 +1,50 @@ +# Gazebo Tutorials + +These tutorials cover general concepts to help get you started with Gazebo. + +## Basics tutorials + +* [Building Your Own Robot](building_robot) +* [Moving the Robot](moving_robot) +* [SDF Worlds](sdf_worlds) +* [Sensors](sensors) +* [Actors](actors) + +## GUI tutorials + +* [Understanding the GUI](gui) +* [Manipulating Models](manipulating_models) +* [Model Insertion from Fuel](fuel_insert) +* [Keyboard Shortcuts](hotkeys) + +## ROS integration + +* [Spawn URDF](spawn_urdf) +* [ROS 2 Integration via Bridge](ros2_integration) +* [ROS 2 Interoperability](ros2_interop) +* [ROS 2 Integration Template](ros_gz_project_template_guide) +* [ROS 2 Cross Docker Bridge Setup](ros2_gz_docker_bridge) + +## Per-library tutorials + +See the *API & Tutorials* sections on the [Libraries page](/libs){.external} page for more specific content correlating to each Gazebo library. + +The entrypoint library is Sim. +- [Sim](/api/sim/8/tutorials.html){.external} + +Other libraries: +- [Cmake](/api/cmake/3/tutorials.html){.external} +- [Common](/api/common/5/tutorials.html){.external} +- [Fuel_tools](/api/fuel_tools/9/tutorials.html){.external} +- [Gui](/api/gui/8/tutorials.html){.external} +- [Launch](/api/launch/7/tutorials.html){.external} +- [Math](/api/math/7/tutorials.html){.external} +- [Msgs](/api/msgs/10/tutorials.html){.external} +- [Physics](/api/physics/7/tutorials.html){.external} +- [Plugin](/api/plugin/2/tutorials.html){.external} +- [Rendering](/api/rendering/8/tutorials.html){.external} +- [Sensors](/api/sensors/8/tutorials.html){.external} +- [Tools](/api/tools/2/tutorials.html){.external} +- [Transport](/api/transport/13/tutorials.html){.external} +- [Utils](/api/utils/2/tutorials.html){.external} +- [Sdformat](/api/sdformat/13/){.external} diff --git a/jetty/ros2_gz_docker_bridge.md b/jetty/ros2_gz_docker_bridge.md new file mode 100644 index 0000000000..ade432da0e --- /dev/null +++ b/jetty/ros2_gz_docker_bridge.md @@ -0,0 +1,187 @@ +# ROS 2 + Gazebo Cross-Container Docker Bridge + +A two-container Docker setup for running Gazebo and ROS 2 as separate services connected over a custom Docker network, with the ros_gz_bridge handling topic communication between them + +--- + +## Compatibility + +| ROS 2 | Gazebo | +|---|---| +| Lyrical | Jetty | +| Rolling | Jetty | +| Kilted | Ionic | +| Jazzy | Harmonic | +| Iron | Harmonic | +| Humble | Fortress | + +--- + +## Prerequisites + +- Docker installed and running +- Both images built: + - `gazebo` — from your Gazebo Dockerfile + - `ros2` — from your ROS 2 Dockerfile +- `ros-gz-bridge` installed + +--- + +## Setup + +### 1. Create the Docker Network + +```bash +docker network create ros-link +``` + +### 2. Start Containers + +```bash +docker run -it -d --name gazebo-container --network ros-link gazebo sleep infinity +docker run -it -d --name ros2-container --network ros-link ros2 sleep infinity +``` + +### 3. Check Container IPs + + +```bash +docker network inspect ros-link +``` + +Example output: +```json +[ + { + "Name": "ros-link", + "Driver": "bridge", + "IPAM": { + "Config": [{ "Subnet": "172.21.0.0/16", "Gateway": "172.21.0.1" }] + }, + "Containers": { + "281b3cbfba6a...": { + "Name": "ros2-container", + "IPv4Address": "172.21.0.3/16" // + }, + "c2410d610249...": { + "Name": "gazebo-container", + "IPv4Address": "172.21.0.2/16" // + } + } + } +] +``` + +--- + +### 4. Configure Environment Variables + +**In `gazebo-container`:** +```bash +export GZ_IP= +export GZ_PARTITION=gazebo-container +``` + +**In `ros2-container`:** +```bash +export GZ_IP= +export GZ_PARTITION=gazebo-container +source /opt/ros//setup.bash +``` + +:::{important} +Add these to `~/.bashrc` in each container to be available across sessions. +::: + +:::{note} +When setting `GZ_IP`, use only the IP address without the subnet mask. For example: + +```bash +export GZ_IP=172.21.0.3 +``` + +Do not include `/16`. +::: + +--- + +### 5. Install the Bridge + +```bash +apt-get update && apt-get install -y ros--ros-gz-bridge +``` + +--- + +## Using a Config File (optional) + +if you have a `bridge.yaml` config file, you can use it instead of passing topics as arguments: + +```bash +ros2 run ros_gz_bridge parameter_bridge --ros-args -p config_file:=/path/to/bridge.yaml +``` + +See the [ros_gz_bridge](https://github.com/gazebosim/ros_gz/tree/ros2/ros_gz_bridge) documentation for configuration options. + +--- + +## Running the Bridge + +### Terminal 1 — Start Gazebo sim + +```bash +docker exec -it gazebo-container bash +gz sim shapes.sdf +``` + +### Terminal 2 — Start the bridge + +```bash +docker exec -it ros2-container bash +source /opt/ros//setup.bash +``` + +#### Option 1: Single topic (basic) +```bash +ros2 run ros_gz_bridge parameter_bridge \ + /clock@rosgraph_msgs/msg/Clock@gz.msgs.Clock +``` + +#### Option 2: Multiple topics +```bash +ros2 run ros_gz_bridge parameter_bridge \ + /clock@rosgraph_msgs/msg/Clock@gz.msgs.Clock \ + /world/default/model/vehicle/cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist \ + /world/default/model/vehicle/odometry@nav_msgs/msg/Odometry@gz.msgs.Odometry +``` + +#### Option 3: Using config file +```bash +ros2 run ros_gz_bridge parameter_bridge --ros-args -p config_file:=/path/to/bridge.yaml +``` +See the [ros_gz_bridge](https://github.com/gazebosim/ros_gz/tree/ros2/ros_gz_bridge) documentation for configuration options. + +### Terminal 3 — Verify + +```bash +docker exec -it ros2-container bash +source /opt/ros//setup.bash +ros2 topic echo /clock +``` +if you see something like this :- +```bash +clock: + sec: 0 + nanosec: 0 +--- +clock: + sec: 0 + nanosec: 0 +--- +clock: + sec: 0 + nanosec: 0 +--- +``` +then the connection between the two docker containers is succesfull + diff --git a/jetty/tutorials.md b/jetty/tutorials.md new file mode 100644 index 0000000000..185b19d3ff --- /dev/null +++ b/jetty/tutorials.md @@ -0,0 +1,50 @@ +# Gazebo Tutorials + +These tutorials cover general concepts to help get you started with Gazebo. + +## Basics tutorials + +* [Building Your Own Robot](building_robot) +* [Moving the Robot](moving_robot) +* [SDF Worlds](sdf_worlds) +* [Sensors](sensors) +* [Actors](actors) + +## GUI tutorials + +* [Understanding the GUI](gui) +* [Manipulating Models](manipulating_models) +* [Model Insertion from Fuel](fuel_insert) +* [Keyboard Shortcuts](hotkeys) + +## ROS integration + +* [Spawn URDF](spawn_urdf) +* [ROS 2 Integration via Bridge](ros2_integration) +* [ROS 2 Interoperability](ros2_interop) +* [ROS 2 Integration Template](ros_gz_project_template_guide) +* [ROS 2 Cross Docker Bridge Setup](ros2_gz_docker_bridge) + +## Per-library tutorials + +See the *API & Tutorials* sections on the [Libraries page](/libs){.external} page for more specific content correlating to each Gazebo library. + +The entrypoint library is Sim. +- [Sim](/api/sim/10/tutorials.html){.external} + +Other libraries: +- [Cmake](/api/cmake/5/tutorials.html){.external} +- [Common](/api/common/7/tutorials.html){.external} +- [Fuel_tools](/api/fuel_tools/11/tutorials.html){.external} +- [Gui](/api/gui/10/tutorials.html){.external} +- [Launch](/api/launch/9/tutorials.html){.external} +- [Math](/api/math/9/tutorials.html){.external} +- [Msgs](/api/msgs/12/tutorials.html){.external} +- [Physics](/api/physics/9/tutorials.html){.external} +- [Plugin](/api/plugin/4/tutorials.html){.external} +- [Rendering](/api/rendering/10/tutorials.html){.external} +- [Sensors](/api/sensors/10/tutorials.html){.external} +- [Tools](/api/tools/2/tutorials.html){.external} +- [Transport](/api/transport/15/tutorials.html){.external} +- [Utils](/api/utils/4/tutorials.html){.external} +- [Sdformat](/api/sdformat/16/){.external}