Skip to main content

Webots: ROSbot 2R + SLAM Toolbox

About

Webots is a popular simulation engine for ROS 2 projects. In this guide we show how to run the ROSbot simulation in Webots and create a map of the unknown world thanks to Slam Toolbox. The end result looks like that:

Quick Start

Prerequisites

Install Docker Enginer (+ Compose) by using the official guide. The project was tested on:

$ docker compose version
Docker Compose version v2.12.2
$
$ docker --version
Docker version 20.10.21, build baeda1f

The compose.sim.webots.yaml file uses NVIDIA Container Runtime. Make sure you have NVIDIA GPU and the NVIDIA Container Toolkit installed.

Clone the repository:

git clone https://github.com/husarion/rosbot-mapping
cd rosbot-mapping

Start the containers in a new terminal:

xhost +local:docker && \
docker compose -f compose.sim.webots.yaml up

And in the second terminal start telop-twist-keyboard for manual ROSbot XL control:

docker exec -it rviz bash

And inside the running container shell execute:

ros2 run teleop_twist_keyboard teleop_twist_keyboard

Source code

The full source code is here https://github.com/husarion/rosbot-mapping and it allows you to start SLAM Toolbox on ROSbot in the following configurations:

ConfigurationCompose FilesAdditional Requirements
Physical robot and PC in the same LANcompose.rosbot.yaml + compose.pc.yaml-
Physical robot and PC in different networks (VPN)compose.rosbot.yaml + compose.pc.yamlHusarnet VPN configuread on ROSbot and PC and DDS_CONFIG environment variable set to HUSARNET_SIMPLE_AUTO
Webots simulationcompose.sim.webots.yaml-

Let's focus on the Webots simulation:

compose.sim.webots.yaml
services:

rviz:
image: husarion/rviz2:humble-22-12-20
runtime: nvidia
container_name: rviz
network_mode: host
ipc: host
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix:rw
- ./config/rosbot.rviz:/root/.rviz2/default.rviz
environment:
- DDS_CONFIG
- RMW_IMPLEMENTATION
- DISPLAY=${DISPLAY:?err}
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=all

rosbot:
image: husarion/webots:galactic
runtime: nvidia
network_mode: host
ipc: host
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix:rw
environment:
- DDS_CONFIG
- RMW_IMPLEMENTATION
- DISPLAY=${DISPLAY:?err}
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=all
command: ros2 launch webots_ros2_husarion robot_launch.py

mapping:
image: husarion/slam-toolbox:humble-22-12-07
network_mode: host
ipc: host
volumes:
- ./config/slam_toolbox_params_webots.yaml:/slam_params.yaml
environment:
- DDS_CONFIG
- RMW_IMPLEMENTATION
command: >
ros2 launch slam_toolbox online_sync_launch.py
slam_params_file:=/slam_params.yaml
use_sim_time:=True

map-saver:
image: husarion/nav2-map-server:humble-22-12-07
network_mode: host
ipc: host
volumes:
- ./maps:/maps
environment:
- DDS_CONFIG
- RMW_IMPLEMENTATION
command: bash -c "while true; do ros2 run nav2_map_server map_saver_cli --free 0.15 --fmt png -f /maps/map; sleep 5; done"

There are 3 Docker services:

  • rviz that starts the RViz2 ROS 2 Visualisation tool. The source code for building that Docker image is here
  • rosbot that starts the ROSbot 2R Webots simulation in the Husarion world. The source code for building that Docker image is here
  • mapping it's a Dockerized SLAM Toolbox package.

Additionally config files are bind mounted to rviz and mapping services that are available in the project repository.

Summary

And thats all! If you would like to run your own ROS 2 code with Webots, all you need to do is building your own, minimal Docker image running only your own ROS 2 node. You can simply reuse the husarion/webots Docker image that contains launch files for Husarion robots.