Simulation world This page gives you information about the simulation world that is used in this project
The world that is used in the project contains a few obstacles, one is which avoided by the robot in the video that was shown on the Getting started page. The section below gives you information about the file that describes this world.
To help the SLAM algorithm it is beneficial to have more obstacles arranged in a non-symmetrical way. This enables the algorithm to find its place in the map more effectively, while a symmetrical design makes this work harder.
The world file used in this project is shown below. Here first, the necessary plugins are sourced, then, a light source, four obstacles and the ground plane is added as elements to the world.
Copy <? xml version = "1.0" ?>
< sdf version = "1.6" >
< world name = "maze" >
< plugin filename = "libignition-gazebo-physics-system.so" name = "ignition::gazebo::systems::Physics" />
< plugin filename = "libignition-gazebo-sensors-system.so" name = "ignition::gazebo::systems::Sensors" >
< render_engine >ogre2</ render_engine >
</ plugin >
< plugin filename = "libignition-gazebo-user-commands-system.so" name = "ignition::gazebo::systems::UserCommands" />
< plugin filename = "libignition-gazebo-scene-broadcaster-system.so" name = "ignition::gazebo::systems::SceneBroadcaster" />
< plugin filename = "ignition-gazebo-contact-system" name = "ignition::gazebo::systems::Contact" />
< plugin filename = "libignition-gazebo-imu-system.so" name = "ignition::gazebo::systems::Imu" />
< plugin filename = "ignition-gazebo-magnetometer-system" name = "ignition::gazebo::systems::Magnetometer" />
< scene >
< grid >false</ grid >
</ scene >
< gui fullscreen = "0" >
<!-- 3D scene -->
< plugin filename = "GzScene3D" name = "3D View" >
< ignition-gui >
< title >3D View</ title >
< property type = "bool" key = "showTitleBar" >false</ property >
< property type = "string" key = "state" >docked</ property >
</ ignition-gui >
< engine >ogre2</ engine >
< scene >scene</ scene >
< ambient_light >0.7 0.7 0.7</ ambient_light >
< background_color >0.8 0.8 0.8</ background_color >
< camera_pose >1 1 1 0 0.5 3.92</ camera_pose >
</ plugin >
<!-- World control -->
< plugin filename = "WorldControl" name = "World control" >
< ignition-gui >
< title >World control</ title >
< property type = "bool" key = "showTitleBar" >false</ property >
< property type = "bool" key = "resizable" >false</ property >
< property type = "double" key = "height" >72</ property >
< property type = "double" key = "width" >121</ property >
< property type = "double" key = "z" >1</ property >
< property type = "string" key = "state" >floating</ property >
< anchors target = "3D View" >
< line own = "left" target = "left" />
< line own = "bottom" target = "bottom" />
</ anchors >
</ ignition-gui >
< play_pause >true</ play_pause >
< step >true</ step >
< start_paused >true</ start_paused >
</ plugin >
<!-- World statistics -->
< plugin filename = "WorldStats" name = "World stats" >
< ignition-gui >
< title >World stats</ title >
< property type = "bool" key = "showTitleBar" >false</ property >
< property type = "bool" key = "resizable" >false</ property >
< property type = "double" key = "height" >110</ property >
< property type = "double" key = "width" >290</ property >
< property type = "double" key = "z" >1</ property >
< property type = "string" key = "state" >floating</ property >
< anchors target = "3D View" >
< line own = "right" target = "right" />
< line own = "bottom" target = "bottom" />
</ anchors >
</ ignition-gui >
< sim_time >true</ sim_time >
< real_time >true</ real_time >
< real_time_factor >true</ real_time_factor >
< iterations >true</ iterations >
</ plugin >
</ gui >
< light type = "directional" name = "sun" >
< 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 >
< linear >0.01</ linear >
< constant >0.9</ constant >
< quadratic >0.001</ quadratic >
</ attenuation >
< direction >-0.5 0.1 -0.9</ direction >
< cast_shadows >true</ cast_shadows >
</ light >
< model name = 'obstale_1' >
< pose frame = '' >1 0 0.25 0 -0 0</ pose >
< static >1</ static >
< link name = 'obstacle_1' >
< pose frame = '' >0 0 0 0 -0 0</ pose >
< collision name = 'collision' >
< geometry >
< box >
< size >0.1 0.1 0.5</ size >
</ box >
</ geometry >
< max_contacts >10</ max_contacts >
< surface >
< contact >
< ode />
</ contact >
< bounce />
< friction >
< torsional >
< ode />
</ torsional >
< ode />
</ friction >
</ surface >
</ collision >
< visual name = 'visual' >
< geometry >
< box >
< size >0.1 0.1 0.5</ size >
</ box >
</ geometry >
< material >
< ambient >0.5 0.5 0.5 1</ ambient >
< diffuse >0.57 0.417 0.25 1</ diffuse >
< specular >0.1 0.1 0.1 1</ specular >
< emissive >0 0 0 0</ emissive >
</ material >
</ visual >
< self_collide >0</ self_collide >
< kinematic >0</ kinematic >
< gravity >1</ gravity >
</ link >
</ model >
< model name = 'obstale_2' >
< pose frame = '' >0 3 0.25 0 -0 0</ pose >
< static >1</ static >
< link name = 'obstacle_2' >
< pose frame = '' >0 0 0 0 -0 0</ pose >
< collision name = 'collision' >
< geometry >
< box >
< size >0.1 0.1 0.5</ size >
</ box >
</ geometry >
< max_contacts >10</ max_contacts >
< surface >
< contact >
< ode />
</ contact >
< bounce />
< friction >
< torsional >
< ode />
</ torsional >
< ode />
</ friction >
</ surface >
</ collision >
< visual name = 'visual' >
< geometry >
< box >
< size >0.1 0.1 0.5</ size >
</ box >
</ geometry >
< material >
< ambient >0.5 0.5 0.5 1</ ambient >
< diffuse >0.57 0.417 0.25 1</ diffuse >
< specular >0.1 0.1 0.1 1</ specular >
< emissive >0 0 0 0</ emissive >
</ material >
</ visual >
< self_collide >0</ self_collide >
< kinematic >0</ kinematic >
< gravity >1</ gravity >
</ link >
</ model >
< model name = 'obstale_3' >
< pose frame = '' >0 -2 0.25 0 -0 0</ pose >
< static >1</ static >
< link name = 'obstacle_3' >
< pose frame = '' >0 0 0 0 -0 0</ pose >
< collision name = 'collision' >
< geometry >
< box >
< size >0.1 0.1 0.5</ size >
</ box >
</ geometry >
< max_contacts >10</ max_contacts >
< surface >
< contact >
< ode />
</ contact >
< bounce />
< friction >
< torsional >
< ode />
</ torsional >
< ode />
</ friction >
</ surface >
</ collision >
< visual name = 'visual' >
< geometry >
< box >
< size >0.1 0.1 0.5</ size >
</ box >
</ geometry >
< material >
< ambient >0.5 0.5 0.5 1</ ambient >
< diffuse >0.57 0.417 0.25 1</ diffuse >
< specular >0.1 0.1 0.1 1</ specular >
< emissive >0 0 0 0</ emissive >
</ material >
</ visual >
< self_collide >0</ self_collide >
< kinematic >0</ kinematic >
< gravity >1</ gravity >
</ link >
</ model >
< model name = 'obstale_4' >
< pose frame = '' >3 3 0.25 0 -0 0</ pose >
< static >1</ static >
< link name = 'obstacle_4' >
< pose frame = '' >0 0 0 0 -0 0</ pose >
< collision name = 'collision' >
< geometry >
< box >
< size >0.1 0.1 0.5</ size >
</ box >
</ geometry >
< max_contacts >10</ max_contacts >
< surface >
< contact >
< ode />
</ contact >
< bounce />
< friction >
< torsional >
< ode />
</ torsional >
< ode />
</ friction >
</ surface >
</ collision >
< visual name = 'visual' >
< geometry >
< box >
< size >0.1 0.1 0.5</ size >
</ box >
</ geometry >
< material >
< ambient >0.5 0.5 0.5 1</ ambient >
< diffuse >0.57 0.417 0.25 1</ diffuse >
< specular >0.1 0.1 0.1 1</ specular >
< emissive >0 0 0 0</ emissive >
</ material >
</ visual >
< self_collide >0</ self_collide >
< kinematic >0</ kinematic >
< gravity >1</ gravity >
</ link >
</ model >
< 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 >
< surface >
< friction >
< ode />
</ friction >
< bounce />
< contact />
</ surface >
</ collision >
< visual name = 'visual' >
< geometry >
< plane >
< normal >0 0 1</ normal >
< size >100 100</ size >
</ plane >
</ geometry >
< material >
< ambient >0.8 0.8 0.8 1</ ambient >
< diffuse >0.8 0.8 0.8 1</ diffuse >
< specular >0.8 0.8 0.8 1</ specular >
</ material >
</ visual >
< pose >0 0 0 0 -0 0</ pose >
< inertial >
< pose >0 0 0 0 -0 0</ pose >
< mass >1</ mass >
< inertia >
< ixx >1</ ixx >
< ixy >0</ ixy >
< ixz >0</ ixz >
< iyy >1</ iyy >
< iyz >0</ iyz >
< izz >1</ izz >
</ inertia >
</ inertial >
< enable_wind >false</ enable_wind >
</ link >
< pose >0 0 0 0 -0 0</ pose >
< self_collide >false</ self_collide >
</ model >
</ world >
</ sdf >
In this project the simulation world provides the lidar sensor data about the obstacles for the robot's navigation system. However, the robot's position is not determined based on the simulation, but based on its real life movement. The reason behind this is the presence of simulation gap. This phenomena describes that the simulated events and objects do not fully behave the same way as the real life ones. For example, with the same velocity command, the robot might move 1m in simulation, while in real life it has only moved 0.7m.
The simulation gap concerns both the simulation world and the robot's model. In case the world's model or the robot's model and behavior would be made more realistic, the effect of simulation gap could be lessened. However, this is out of the bounds of this project. This is why in this project a ROS2 node was created to update the position and orientation of the robot model inside the simulated world. The file is available here .
Setting the appropriate QoS policy is very important for this script. It needs to be set to Best effort
, as with the reliable
setting the node transfers messages too slowly. Moreover, it needs to be set to VOLATILE instead of TRANSIENT_LOCAL, otherwise the node does not transmit messages at all.
Last updated 11 months ago