Demo worlds

This page describes the worlds provided as examples ready to run within MVSim.

Note

The 3D models used in these demos belong to either the MVSim main repository or the mvsim-models repository (and downloaded automatically via Remote resources notation). In any case, each model is accompanied by its corresponding LICENSE and attribution to the author(s).

demo_1robot

A simple 2D world defined via an occupancy grid map and a robot equipped with 2D lidars.

roslaunch mvsim demo_1robot.launch
ros2 launch mvsim demo_1robot.launch.py

Assuming you compiled MVSim in the directory MVSIM_ROOT, with cmake build directory build-Release, run:

cd MVSIM_ROOT
build-Release/bin/mvsim launch mvsim_tutorial/demo_1robot.world.xml
World XML code

File: mvsim_tutorial/demo_1robot.world.xml

<mvsim_world version="1.0">
	<!-- General simulation options -->
	<simul_timestep>0</simul_timestep> <!-- Simulation fixed-time interval for numerical integration [seconds] or 0 to autodetermine -->

	<!-- GUI options -->
	<gui>
		<ortho>false</ortho>
		<show_forces>true</show_forces>  <force_scale>0.01</force_scale>
		<cam_distance>35</cam_distance>
		<fov_deg>60</fov_deg>
		<refresh_fps>20</refresh_fps>
		<!-- <follow_vehicle>r1</follow_vehicle> -->
	</gui>

	<!-- Light parameters -->
	<lights>
	</lights>

	<!-- ========================
		   Scenario definition
	     ======================== -->
	<element class="occupancy_grid">
		<!-- File can be an image or an MRPT .gridmap file -->
		<file>uma_campus.gridmap.gz</file>

		<!--<show_collisions>true</show_collisions>-->
	</element>

	<!-- ground grid (for visual reference) -->
	<element class="ground_grid">
		<floating>true</floating>
	</element>

	<!-- =============================
		   Vehicle classes definition
	     ============================= -->
	<include file="../definitions/ackermann.vehicle.xml" />

	<!-- ========================
		   Vehicle(s) definition
	     ======================== -->
	<vehicle name="r1" class="car_ackermann">
		<init_pose>0 0 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
		<init_vel>0 0 0</init_vel>  <!-- In local coords: vx,vy, omega(deg/s) -->

		<!-- Sensors -->
		<include file="../definitions/lidar2d.sensor.xml" sensor_x="1.7" sensor_z="1.01" sensor_yaw="0" max_range="70.0" sensor_name="laser1" />
		<include file="../definitions/lidar2d.sensor.xml" sensor_x="-0.5" sensor_z="1.01" sensor_yaw="180" max_range="70.0" sensor_name="laser2" />
	</vehicle>

</mvsim_world>

demo_2robots

A world with 2 simple robots and a couple of custom “blocks” (furniture).

roslaunch mvsim demo_2robots.launch
ros2 launch mvsim demo_2robots.launch.py

Assuming you compiled MVSim in the directory MVSIM_ROOT, with cmake build directory build-Release, run:

cd MVSIM_ROOT
build-Release/bin/mvsim launch mvsim_tutorial/demo_2robots.world.xml
World XML code

File: mvsim_tutorial/demo_2robots.world.xml

<mvsim_world version="1.0">
	<!-- General simulation options -->
	<simul_timestep>0</simul_timestep> <!-- Simulation fixed-time interval for numerical integration [seconds] or 0 to autodetermine -->

	<!-- GUI options -->
	<gui>
		<ortho>false</ortho>
		<show_forces>true</show_forces>  <force_scale>0.01</force_scale>
		<cam_distance>35</cam_distance>
		<fov_deg>60</fov_deg>
		<refresh_fps>20</refresh_fps>
		<!-- <follow_vehicle>r1</follow_vehicle> -->
	</gui>

	<!-- Light parameters -->
	<lights>
	</lights>


	<!-- ========================
		   Scenario definition
	     ======================== -->
	<!-- ground -->
	<element class="horizontal_plane">
		<cull_face>BACK</cull_face>
		<x_min>-20</x_min>
		<y_min>-20</y_min>
		<x_max> 20</x_max>
		<y_max> 20</y_max>
		<z>0.0</z>
	</element>

	<!-- ground grid (for visual reference) -->
	<element class="ground_grid">
		<!--<floating>true</floating>-->
	</element>

	<!-- =============================
		   Vehicle classes definition
	     ============================= -->
	<include file="../definitions/ackermann.vehicle.xml" />
	<include file="../definitions/small_robot.vehicle.xml" />

	<!-- ========================
		   Vehicle(s) definition
	     ======================== -->
	<vehicle name="r1" class="small_robot">
		<init_pose>17 0 90.0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
		<init_vel>0 0 0</init_vel>  <!-- In local coords: vx,vy, omega(deg/s) -->

		<publish>
		  <publish_pose_topic>/${NAME}/pose</publish_pose_topic>
		  <publish_pose_period>50e-3</publish_pose_period>
		</publish>

		<!-- Sensors -->
		<include file="../definitions/lidar2d.sensor.xml" 
			sensor_x="0.5" sensor_y="0" sensor_z="0.70" sensor_yaw="0" sensor_name="laser1" raytrace_3d="true" 
			sensor_publish="true"
		/>
		<include file="../definitions/rgbd_camera.sensor.xml"
			sensor_x="0.6" sensor_y="0" sensor_z="0.65"
		/>
	</vehicle>

	<vehicle name="r2" class="car_ackermann">
		<init_pose>-10.0 0 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
		<init_vel>0 0 0</init_vel>  <!-- In local coords: vx,vy, omega(deg/s) -->

		<publish>
		  <publish_pose_topic>/${NAME}/pose</publish_pose_topic>
		  <publish_pose_period>50e-3</publish_pose_period>
		</publish>

		<!-- Sensors -->
		<include file="../definitions/lidar2d.sensor.xml"
			raytrace_3d="true" sensor_x="1.7" sensor_z="1.01" sensor_yaw="0" sensor_name="laser1"
			sensor_publish="true"
		/>
		<!-- Sensors -->
		<include file="../definitions/camera.sensor.xml"
			sensor_x="1.9" sensor_z="0.5"
			sensor_publish="true"
		/>
	</vehicle>

	<!-- ======================================
	      Obstacle blocks classes definition
	     ====================================== -->
	<block:class name="square_obstacle">
		<mass>20</mass>
		<color>#0080ff</color>
		<zmax>1.5</zmax>
		<ground_friction>0.3</ground_friction>
		<shape>
			<pt>-1.0 -0.6</pt>
			<pt>-1.0  0.6</pt>
			<pt> 1.0  0.5</pt>
			<pt> 1.0 -0.5</pt>
		</shape>
	</block:class>

	<block:class name="nurse_station">
		<mass>300</mass>
		<color>#0080ff</color>
		<ground_friction>100.0</ground_friction>
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model -->
		<!-- 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/aws_robomaker_hospital_nursesstation_01.zip/aws_robomaker_hospital_nursesstation_01/aws_robomaker_hospital_nursesstation_01_visual.dae</model_uri>
		</visual>
	</block:class>


	<!-- ========================
		Obstacle blocks
	     ======================== -->
	<block class="square_obstacle">
		<init_pose>6 5 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
		<publish>
		  <publish_pose_topic>/${NAME}/pose</publish_pose_topic>
		  <publish_pose_period>50e-3</publish_pose_period>
		</publish>
	</block>

	<!-- Example intangible block, used as a reference for relative pose sensing -->
	<block  name="blockSensor1">
		<shape>
			<pt>-0.05 -0.05</pt>
			<pt>-0.05  0.05</pt>
			<pt> 0.05  0.05</pt>
			<pt> 0.05 -0.05</pt>
		</shape>
		
		<intangible>true</intangible>
		<zmin>0.0</zmin>
		<zmax>0.2</zmax>
	
		<init_pose>2.5 -12 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
		<publish>
		  <publish_pose_period>100e-3</publish_pose_period>
		  
		  <!-- Comma separated list of objects, robots, etc. to sense and publish relative poses -->
		  <publish_relative_pose_objects>r1, r2</publish_relative_pose_objects>
		  <publish_relative_pose_topic>/relative_pose_readings</publish_relative_pose_topic>
		</publish>
	</block>

	
	<!-- ========================================================
		Standalone sensors (placed freely on the environment)
	     ======================================================== -->
	<sensor class="laser" name="proximitySensor1">
		<pose>1.3  -18.3  90.0 </pose>
		<fov_degrees>30</fov_degrees>
		<nrays>5</nrays>
		<range_std_noise>0.01</range_std_noise>
		<angle_std_noise_deg>0.01</angle_std_noise_deg>
		<publish>
		  <publish_topic>/${NAME}</publish_topic>
		</publish>
	</sensor>


	<block class="nurse_station">
		<init_pose>15 2 30</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
	</block>

</mvsim_world>

demo_camera

Example of a robot with a camera sensor (RGB).

roslaunch mvsim demo_camera.launch
ros2 launch mvsim demo_camera.launch.py

Assuming you compiled MVSim in the directory MVSIM_ROOT, with cmake build directory build-Release, run:

cd MVSIM_ROOT
build-Release/bin/mvsim launch mvsim_tutorial/demo_camera.world.xml
World XML code

File: mvsim_tutorial/demo_camera.world.xml

<mvsim_world version="1.0">
	<!-- General simulation options -->
	<simul_timestep>0</simul_timestep> <!-- Simulation fixed-time interval for numerical integration [seconds] or 0 to autodetermine -->

	<!-- GUI options -->
	<gui>
		<ortho>false</ortho>
		<show_forces>true</show_forces>  <force_scale>0.01</force_scale>
		<cam_distance>35</cam_distance>
		<fov_deg>60</fov_deg>
		<refresh_fps>20</refresh_fps>
		<!-- <follow_vehicle>r1</follow_vehicle> -->
	</gui>


	<!-- ========================
		   Scenario definition
	     ======================== -->
	<!-- ground -->
	<element class="horizontal_plane">
		<cull_face>BACK</cull_face>
		<x_min>-20</x_min>
		<y_min>-20</y_min>
		<x_max> 20</x_max>
		<y_max> 20</y_max>
		<z>0.0</z>
	</element>

	<!-- =============================
		   Vehicle classes definition
	     ============================= -->
	<include file="../definitions/small_robot.vehicle.xml" />

	<!-- ========================
		   Vehicle(s) definition
	     ======================== -->
	<vehicle name="r1" class="small_robot">
		<init_pose>0 0 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
		<init_vel>0 0 0</init_vel>  <!-- In local coords: vx,vy, omega(deg/s) -->

		<publish>
		  <publish_pose_topic>/${NAME}/pose</publish_pose_topic>
		  <publish_pose_period>50e-3</publish_pose_period>
		</publish>

		<!-- Sensors -->
		<include file="../definitions/camera.sensor.xml" 
		  sensor_x="0.6"  sensor_y="0" sensor_z="0.65"
		  sensor_period_sec="0.10"
		  />

	</vehicle>

	<!-- ======================================
	      Obstacle blocks classes definition
	     ====================================== -->
	<block:class name="square_obstacle">
		<mass>20</mass>
		<color>#0080ff</color>
		<zmax>1.5</zmax>
		<ground_friction>0.3</ground_friction>
		<shape>
			<pt>-1.0 -0.6</pt>
			<pt>-1.0  0.6</pt>
			<pt> 1.0  0.5</pt>
			<pt> 1.0 -0.5</pt>
		</shape>
	</block:class>


	<block:class name="nurse_station">
		<static>true</static> <!-- Does not move -->
		<color>#0080ff</color>
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model -->
		<!-- 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/aws_robomaker_hospital_nursesstation_01.zip/aws_robomaker_hospital_nursesstation_01/aws_robomaker_hospital_nursesstation_01_visual.dae</model_uri>
		</visual>
	</block:class>

	<!-- ========================
		Obstacle blocks
	     ======================== -->
	<block class="square_obstacle">
		<init_pose>6 5 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
		<publish>
		  <publish_pose_topic>/${NAME}/pose</publish_pose_topic>
		  <publish_pose_period>50e-3</publish_pose_period>
		</publish>
	</block>

	<block class="nurse_station">
		<init_pose>10 0 -90</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
	</block>

</mvsim_world>

demo_depth_camera

Example of a robot with a depth camera sensor (RGB+D).

roslaunch mvsim demo_depth_camera.launch
ros2 launch mvsim demo_depth_camera.launch.py

Assuming you compiled MVSim in the directory MVSIM_ROOT, with cmake build directory build-Release, run:

cd MVSIM_ROOT
build-Release/bin/mvsim launch mvsim_tutorial/demo_depth_camera.world.xml
World XML code

File: mvsim_tutorial/demo_depth_camera.world.xml

<mvsim_world version="1.0">
	<!-- General simulation options -->
	<simul_timestep>0</simul_timestep> <!-- Simulation fixed-time interval for numerical integration [seconds] or 0 to autodetermine -->

	<!-- GUI options -->
	<gui>
		<ortho>false</ortho>
		<show_forces>true</show_forces>  <force_scale>0.01</force_scale>
		<cam_distance>35</cam_distance>
		<fov_deg>60</fov_deg>
		<refresh_fps>20</refresh_fps>
		<!-- <follow_vehicle>r1</follow_vehicle> -->
	</gui>

	<!-- Light parameters -->
	<lights>
	</lights>

	<!-- ========================
		   Scenario definition
	     ======================== -->
	<!-- ground -->
	<element class="horizontal_plane">
		<cull_face>BACK</cull_face>
		<x_min>-20</x_min>
		<y_min>-20</y_min>
		<x_max> 20</x_max>
		<y_max> 20</y_max>
		<z>0.0</z>
	</element>

	<!-- =============================
		   Vehicle classes definition
	     ============================= -->
	<include file="../definitions/small_robot.vehicle.xml" />

	<!-- ========================
		   Vehicle(s) definition
	     ======================== -->
	<vehicle name="r1" class="small_robot">
		<init_pose>0 0 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
		<init_vel>0 0 0</init_vel>  <!-- In local coords: vx,vy, omega(deg/s) -->

		<publish>
		  <publish_pose_topic>/${NAME}/pose</publish_pose_topic>
		  <publish_pose_period>50e-3</publish_pose_period>
		</publish>

		<!-- Sensors -->
		<include file="../definitions/lidar2d.sensor.xml" 
		  sensor_x="0.5" sensor_y="0" sensor_z="0.70" sensor_yaw="0" sensor_name="laser1" raytrace_3d="true" 
		  sensor_period_sec="0.10" 
		/>

		<include file="../definitions/rgbd_camera.sensor.xml" 
		  sensor_x="0.6"  sensor_y="0" sensor_z="0.65"
		  sensor_period_sec="0.10"
		  show_3d_pointcloud="true"
		/>

	</vehicle>

	<!-- ======================================
	      Obstacle blocks classes definition
	     ====================================== -->
	<block:class name="square_obstacle">
		<mass>20</mass>
		<color>#0080ff</color>
		<zmax>1.5</zmax>
		<ground_friction>0.3</ground_friction>
		<shape>
			<pt>-1.0 -0.6</pt>
			<pt>-1.0  0.6</pt>
			<pt> 1.0  0.5</pt>
			<pt> 1.0 -0.5</pt>
		</shape>
	</block:class>


	<block:class name="nurse_station">
		<static>true</static> <!-- Does not move -->
		<color>#0080ff</color>
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model -->
		<!-- 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/aws_robomaker_hospital_nursesstation_01.zip/aws_robomaker_hospital_nursesstation_01/aws_robomaker_hospital_nursesstation_01_visual.dae</model_uri>
		</visual>
	</block:class>

	<!-- ========================
		Obstacle blocks
	     ======================== -->
	<block class="square_obstacle">
		<init_pose>6 5 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
		<publish>
		  <publish_pose_topic>/${NAME}/pose</publish_pose_topic>
		  <publish_pose_period>50e-3</publish_pose_period>
		</publish>
	</block>

	<block class="nurse_station">
		<init_pose>10 0 -90</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
	</block>

</mvsim_world>

demo_elevation_map

Example of a 3D Lidar robot in a “2.5D” world defined by an elevation map.

roslaunch mvsim demo_elevation_map.launch
ros2 launch mvsim demo_elevation_map.launch.py

Assuming you compiled MVSim in the directory MVSIM_ROOT, with cmake build directory build-Release, run:

cd MVSIM_ROOT
build-Release/bin/mvsim launch mvsim_tutorial/demo_elevation_map.world.xml
World XML code

File: mvsim_tutorial/demo_elevation_map.world.xml

<mvsim_world version="1.0">
	<!-- General simulation options -->
	<simul_timestep>5e-3</simul_timestep> <!-- Simulation fixed-time interval for numerical integration [seconds] or 0 to autodetermine -->
	
	<!-- GUI options -->
	<gui>
		<ortho>false</ortho>
		<show_forces>false</show_forces>  <force_scale>0.01</force_scale>
		<cam_distance>5</cam_distance>
		<cam_azimuth>150</cam_azimuth>
		<cam_elevation>15</cam_elevation>
		<fov_deg>80</fov_deg>
		<!-- <follow_vehicle>r1</follow_vehicle> -->
	</gui>

	<!-- Light parameters -->
	<lights>
		<enable_shadows>true</enable_shadows>
		<light_azimuth_deg>-25.0</light_azimuth_deg>
		<light_elevation_deg>10.0</light_elevation_deg>
	</lights>

	
	<!-- ========================
		   Scenario definition
	     ======================== -->
	<element class='elevation_map'>
		<!-- File can be an image or a .txt matrix -->
		<resolution>0.5</resolution>
		<elevation_image>elevation_mesh1.png</elevation_image>
		<elevation_image_min_z>-1.0</elevation_image_min_z>
		<elevation_image_max_z>1.0</elevation_image_max_z>
		
		<texture_image>https://mrpt.github.io/mvsim-models/textures-cgbookcase/Pebbles02_512_BaseColor.png</texture_image>
		<texture_extension_x>2.0</texture_extension_x>
		<texture_extension_y>2.0</texture_extension_y>
		
		<mesh_color>#a0e0a0</mesh_color> <!-- Used only if mesh_image is not provided -->
	</element>

	<!-- A SkyBox decoration -->
	<element class='skybox'>
		<!-- Provide the URI printf-like "pattern" to the six texture files, 
		     such that replacing "%s" with the following strings gives the path
		     to the files: "Up", "Right", "Left", "Front", "Down", "Back".
		 -->
		<textures>https://mrpt.github.io/mvsim-models/skyboxes/SunSet.zip/SunSet/SunSet%s.jpg</textures>
	</element>
	
	
	<!-- =============================
		   Vehicle classes definition
	     ============================= -->
	<include file="../definitions/jackal.vehicle.xml"
		default_sensors="false"
	/>

	<!-- ========================
		   Vehicle(s) definition
	     ======================== -->
	<vehicle name="r1" class="jackal">
		<init_pose>4 -8 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->

		<!-- Sensors -->

		<include file="../definitions/velodyne-vlp16.sensor.xml"
		  sensor_x="0.15" sensor_y="0" sensor_z="0.38" sensor_yaw="0"
		  sensor_std_noise="0.005"
		  sensor_publish="false"
		  sensor_name="lidar1"
		  sensor_rpm="600"
		  horz_resolution_factor="2.0"
		  vert_resolution_factor="2.0"
		/>
		
		<include file="../definitions/rgbd_camera.sensor.xml" 
		  sensor_x="0.22" sensor_z="0.29"
		  sensor_period_sec="0.10"
		  show_3d_pointcloud="false"
		/>

	</vehicle>
	
	

	<!-- ======================================
	      Obstacle blocks classes definition
	     ====================================== -->
	<block:class name="rock_01">
		<static>true</static> <!-- Does not move -->
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/rock01.zip/rock01/FallingRock01.dae</model_uri>
		</visual>
	</block:class>

	<block:class name="rock_02">
		<static>true</static> <!-- Does not move -->
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/rock02.zip/rock02/FallingRock02.dae</model_uri>
		</visual>
	</block:class>


	<!-- ========================
		Obstacle blocks
	     ======================== -->
	<variable name="ROCKS_SPREAD_X" value="35.0"></variable>
	<variable name="ROCKS_SPREAD_Y" value="35.0"></variable>
	<variable name="ROCKS_SPREAD_Z" value="0.5"></variable>
	     
	<for var="i" from="1" to="12">
		<block class="rock_01">
			<!-- In global coords: x,y,z, yaw(deg),pitch(deg),roll(deg) -->
			<init_pose3d>$f{(-0.5+rand())*ROCKS_SPREAD_X} $f{(-0.5+rand())*ROCKS_SPREAD_Y} $f{(-0.5+rand())*ROCKS_SPREAD_Z} $f{-180+rand()*360} 0 0</init_pose3d>
		</block>
	</for>

</mvsim_world>

demo_greenhouse

Example of a 3D Lidar robot in a greenhouse. The XML illustrates features such as XML-level variables, XML-for loops for repetitive patterns of objects, slightly randomized-perturbations in plant poses, etc.

roslaunch mvsim demo_greenhouse.launch
ros2 launch mvsim demo_greenhouse.launch.py

Assuming you compiled MVSim in the directory MVSIM_ROOT, with cmake build directory build-Release, run:

cd MVSIM_ROOT
build-Release/bin/mvsim launch mvsim_tutorial/demo_greenhouse.world.xml
World XML code

File: mvsim_tutorial/demo_greenhouse.world.xml

<mvsim_world version="1.0">
	<!-- General simulation options -->
	<simul_timestep>0</simul_timestep> <!-- Simulation fixed-time interval for numerical integration [seconds] or 0 to autodetermine -->

	<joystick_enabled>true</joystick_enabled>

	<!-- GUI options -->
	<gui>
		<ortho>false</ortho>
		<show_forces>false</show_forces>  <force_scale>0.01</force_scale>
		<cam_distance>10</cam_distance>
		<fov_deg>60</fov_deg>
		<refresh_fps>15</refresh_fps>
		<cam_point_to>1.5 13</cam_point_to>
		<!-- <follow_vehicle>r1</follow_vehicle> -->

	</gui>

	<!-- Light parameters -->
	<lights>
		<enable_shadows>true</enable_shadows>
		<!-- <shadow_map_size>1024</shadow_map_size> -->

		<light_azimuth_deg>160.0</light_azimuth_deg>
		<light_elevation_deg>40.0</light_elevation_deg>
	</lights>

	<variable name="NUM_TILTED_BEAMS_X" value="21"></variable>
	<variable name="NUM_TILTED_BEAMS_Y" value="10"></variable>
	
	<variable name="NUM_CORRIDORS_X" value="10"></variable>
	
	<variable name="NUM_PLANTS_CORRIDOR_SOUTH" value="8"></variable>
	<variable name="NUM_PLANTS_CORRIDOR_NORTH" value="12"></variable>

	<variable name="NUM_POLES_X" value="10"></variable>
	<variable name="NUM_POLES_Y" value="10"></variable>

	<variable name="PLANTS_RAND_XY" value="0.35"></variable>
	
	<variable name="CEILING_HEIGHT" value="3.0"></variable>

	<!-- ========================
		   Scenario definition
	     ======================== -->
	<!-- ground -->
	<element class="horizontal_plane">
		<cull_face>BACK</cull_face>
		<x_min>0</x_min> <y_min>0</y_min>
		<x_max>46</x_max> <y_max>28.6</y_max>
		<z>0.0</z>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/Dirt01_512_BaseColor.png</texture>
		<texture_size_x>1.5</texture_size_x>
		<texture_size_y>1.5</texture_size_y>
	</element>

	<!-- ceiling -->
	<element class="horizontal_plane">
		<cull_face>FRONT</cull_face>
		<x_min>0</x_min> <y_min>0</y_min>
		<x_max>46</x_max> <y_max>28.6</y_max>
		<z>$f{CEILING_HEIGHT}</z>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/BathroomTiles03_1K_BaseColor.png</texture>
		<texture_size_x>3.0</texture_size_x>
		<texture_size_y>3.0</texture_size_y>
	</element>

	<!-- perimeter walls: -->
	<!--<element class="vertical_plane">
		<cull_face>FRONT</cull_face>
		<x0>-15</x0> <y0>13</y0>
		<x1>-15</x1> <y1>-13</y1>
		<z>0.0</z> <height>$f{CEILING_HEIGHT}</height>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/wall-bricks-01.png</texture>
		<texture_size_x>3.0</texture_size_x>
		<texture_size_y>3.0</texture_size_y>
	</element>
	<element class="vertical_plane">
		<cull_face>FRONT</cull_face>
		<x0> 20</x0> <y0>13</y0>
		<x1>-15</x1> <y1>13</y1>
		<z>0.0</z> <height>$f{CEILING_HEIGHT}</height>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/wall-bricks-01.png</texture>
		<texture_size_x>3.0</texture_size_x>
		<texture_size_y>3.0</texture_size_y>
	</element>
	<element class="vertical_plane">
		<cull_face>FRONT</cull_face>
		<x0> 20</x0> <y0>-13</y0>
		<x1> 20</x1> <y1>13</y1>
		<z>0.0</z> <height>$f{CEILING_HEIGHT}</height>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/wall-bricks-01.png</texture>
		<texture_size_x>3.0</texture_size_x>
		<texture_size_y>3.0</texture_size_y>
	</element>
	<element class="vertical_plane">
		<cull_face>FRONT</cull_face>
		<x0>-15</x0> <y0>-13</y0>
		<x1> 20</x1> <y1>-13</y1>
		<z>0.0</z> <height>$f{CEILING_HEIGHT}</height>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/wall-bricks-01.png</texture>
		<texture_size_x>3.0</texture_size_x>
		<texture_size_y>3.0</texture_size_y>
	</element>
	-->

	<!-- =============================
		   Vehicle classes definition
	     ============================= -->
	<include file="../definitions/agricobiot2.vehicle.xml" />

	<!-- ========================
		   Vehicle(s) definition
	     ======================== -->
	<vehicle name="r1" class="agricobiot2">
		<init_pose>1.5 13 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->

		<!--<publish>
		  <publish_pose_topic>/${NAME}/pose</publish_pose_topic>
		  <publish_pose_period>50e-3</publish_pose_period>
		</publish>-->

		<!-- Sensors -->
<!--		<include file="../definitions/lidar2d.sensor.xml"
		  sensor_x="-0.15" sensor_z="0.25" sensor_yaw="180"
		  sensor_period_sec="0.10"
		  raytrace_3d="false"
		  sensor_name="scanner1"
		/>-->

		<!-- velodyne-vlp16.sensor.xml -->
		<!-- helios-32.sensor.xml -->
		<include file="../definitions/velodyne-vlp16.sensor.xml"
		  sensor_x="-0.34" sensor_y="0.01" sensor_z="1.53" sensor_yaw="180"
		  sensor_std_noise="0.005"
		  sensor_publish="false"
		  sensor_name="lidar1"
		  sensor_rpm="600"
		  horz_resolution_factor="1.5"
		  vert_resolution_factor="1.0"
		/>
		
		<include file="../definitions/camera.sensor.xml" 
		  sensor_x="0.9"  sensor_y="0" sensor_z="0.75"
		  sensor_period_sec="0.20"
		  sensor_name="cam1"
		  />		

	</vehicle>

	<!-- ======================================
	      Object types
	     ====================================== -->
	<block:class name="pole_tilted">
		<static>true</static> <!-- Does not move -->
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/greenhouse.zip/greenhouse/pole_tilted_he120e.stl</model_uri>
			<model_offset_z>1.2</model_offset_z>
			<model_roll>90.0</model_roll>
		</visual>
	</block:class>

	<block:class name="pole_009">
		<static>true</static> <!-- Does not move -->
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/greenhouse.zip/greenhouse/pole_009.stl</model_uri>
			<model_offset_z>1.2</model_offset_z>
		</visual>
	</block:class>

	<block:class name="pole_004">
		<static>true</static> <!-- Does not move -->
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/greenhouse.zip/greenhouse/pole_004.stl</model_uri>
			<model_offset_z>1.2</model_offset_z>
		</visual>
	</block:class>

	<block:class name="plant_tomato">
		<static>true</static> <!-- Does not move -->
		<mass>5</mass>
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/greenhouse.zip/greenhouse/tomato_plant_240cm.dae</model_uri>
			<model_roll>90.0</model_roll>
			<model_offset_z>-0.05</model_offset_z>
		</visual>
	</block:class>

	<!-- ======================================
	      Object instances
	     ====================================== -->
	<!-- You can assign an optional custom name to each object, as an attribute to block, like name="shelf_001", etc. -->

	<!-- All coordinates are global coords: 
	     SE(2) <init_pose>x y yaw(deg)</init_pose> or
	     SE(3) <init_pose3d>x y z yaw(deg) pitch(deg) roll(deg)</init_pose3d> 
	-->

	<!-- H-beams along the X axis -->
	<for var="iX" from="0" to="$f{NUM_TILTED_BEAMS_X-1}">
		<block class="pole_tilted">
			<init_pose>$f{3.95+2*iX} 1.35 180</init_pose>
		</block>
		<block class="pole_tilted">
			<init_pose>$f{3.95+2*iX} $f{28.6-1.35} 0</init_pose>
		</block>
	</for>

	<!-- H-beams along the Y axis -->
	<for var="iY" from="0" to="$f{NUM_TILTED_BEAMS_Y-1}">
		<block class="pole_tilted">
			<init_pose>1.30 $f{3.9+2*iY} 90</init_pose>
		</block>
		<block class="pole_tilted">
			<init_pose>$f{46-1.30} $f{3.9+2*iY} -90</init_pose>
		</block>
	</for>

	<!-- Thick poles -->
	<for var="iX" from="0" to="4">
		<for var="iY" from="0" to="10">
			<if condition="$f{if(iY<=3 or iY>=6, 1, 0)}">
				<block class="pole_009">
					<init_pose>$f{4+8*iX} $f{3.9+2*iY} 0</init_pose>
				</block>
			</if>
		</for>
	</for>

	<!-- Thin poles -->
	<for var="iX" from="0" to="4">
		<for var="iY" from="0" to="10">
			<if condition="$f{if(iY<=3 or iY>=6, 1, 0)}">
				<block class="pole_004">
					<init_pose>$f{4+4+8*iX} $f{3.9+2*iY} 0</init_pose>
				</block>
			</if>
		</for>
	</for>


	<!-- Plants -->
	<for var="iX" from="0" to="$f{NUM_CORRIDORS_X-1}">
		<for var="iY" from="0" to="$f{NUM_PLANTS_CORRIDOR_SOUTH-1}">
			<block class="plant_tomato">
				<init_pose>$f{3.95+4*iX+rand()*PLANTS_RAND_XY} $f{3.0+iY*(9/NUM_PLANTS_CORRIDOR_SOUTH)+rand()*PLANTS_RAND_XY} $f{rand()*360}</init_pose>
			</block>
			<block class="plant_tomato">
				<init_pose>$f{3.95+4*iX+3.0+rand()*PLANTS_RAND_XY} $f{3.0+iY*(9/NUM_PLANTS_CORRIDOR_SOUTH)+rand()*PLANTS_RAND_XY} $f{rand()*360}</init_pose>
			</block>
		</for>
		<for var="iY" from="0" to="$f{NUM_PLANTS_CORRIDOR_NORTH-1}">
			<block class="plant_tomato">
				<init_pose>$f{3.95+4*iX+rand()*PLANTS_RAND_XY} $f{15.0+iY*(12/NUM_PLANTS_CORRIDOR_NORTH)+rand()*PLANTS_RAND_XY} $f{rand()*360}</init_pose>
			</block>
			<block class="plant_tomato">
				<init_pose>$f{3.95+4*iX+3.0+rand()*PLANTS_RAND_XY} $f{15.0+iY*(12/NUM_PLANTS_CORRIDOR_NORTH)+rand()*PLANTS_RAND_XY} $f{rand()*360}</init_pose>
			</block>
		</for>
	</for>

</mvsim_world>

demo_turtlebot_world

The MVSim port of the classic ROS “turtlebot world” scenario. The XML illustrates how to define obstacle blocks with basic geometric shapes without external .dae or .stl files.

roslaunch mvsim demo_turtlebot_world.launch
ros2 launch mvsim demo_turtlebot_world.launch.py

Assuming you compiled MVSim in the directory MVSIM_ROOT, with cmake build directory build-Release, run:

cd MVSIM_ROOT
build-Release/bin/mvsim launch mvsim_tutorial/demo_turtlebot_world.world.xml
World XML code

File: mvsim_tutorial/demo_turtlebot_world.world.xml

<!--
	This "Turtlebot world" world file is intended to mimic
	ROS2 Gazebo world that is launched with:
	ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
-->
<mvsim_world version="1.0">
	<!-- General simulation options -->
	<simul_timestep>0</simul_timestep> <!-- Simulation fixed-time interval for numerical integration [seconds] or 0 to autodetermine -->

	<!-- <joystick_enabled>true</joystick_enabled> -->

	<!-- GUI options -->
	<gui>
		<ortho>false</ortho>
		<show_forces>false</show_forces>  <force_scale>0.01</force_scale>
		<cam_distance>10</cam_distance>
		<cam_azimuth>180</cam_azimuth>
		<cam_elevation>70</cam_elevation>
		<fov_deg>60</fov_deg>
		<refresh_fps>60</refresh_fps>
		<!-- <follow_vehicle>r1</follow_vehicle> -->
	</gui>

	<!-- Light parameters -->
	<lights>
		<enable_shadows>true</enable_shadows>
		<!-- <shadow_map_size>4096</shadow_map_size> -->
		<light_azimuth_deg>-20.0</light_azimuth_deg>
		<light_elevation_deg>70.0</light_elevation_deg>
		
		<!-- clip planes for shadow calculation -->
		<light_clip_plane_min>0.1</light_clip_plane_min>
		<light_clip_plane_max>100</light_clip_plane_max>
		
		<!-- Tuning parameters for shadow rendering anti acne corrections. These should change if light_clip_* change -->
		<shadow_bias>1e-5</shadow_bias>
		<shadow_bias_cam2frag>1e-5</shadow_bias_cam2frag>
		<shadow_bias_normal>1e-3</shadow_bias_normal>
	</lights>

	<!-- ========================
		   Scenario definition
	     ======================== -->
	<!-- ground -->
	<element class="horizontal_plane">
		<cull_face>BACK</cull_face>
		<x_min>-20</x_min>
		<y_min>-20</y_min>
		<x_max> 20</x_max>
		<y_max> 20</y_max>
		<z>0.0</z>
	</element>


	<!-- =============================
		   Vehicle classes definition
	     ============================= -->
	<include file="../definitions/turtlebot3_burger.vehicle.xml" 
		default_sensors="true"
	/>

	<!-- ========================
		   Vehicle(s) definition
	     ======================== -->
	<vehicle name="r1" class="turtlebot3_burger">
		<init_pose>-2 -0.5 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
	</vehicle>

	<!-- ======================================
	      World
	     ====================================== -->
	<walls>
	  <color>#404040</color>
	  <wallThickness>0.3</wallThickness>
	  <wallHeight>1.0</wallHeight>
	  <!-- Walls shape must contain pairs of <pt>s defining wall segments -->
	  <shape>
	    <pt>-3 0</pt> <pt>-2 -2.75</pt>
	    <pt>-2 -2.75</pt> <pt>2 -2.75</pt>
	    <pt>2 -2.75</pt> <pt>3.5 0</pt>
	    <pt>3.5 0</pt> <pt>2 2.75</pt>
	    <pt>2 2.75</pt> <pt>-2 2.75</pt>
	    <pt>-2 2.75</pt> <pt>-3 0</pt>
	  </shape>
	</walls>
	
	<block:class name="green_column_small">
		<static>true</static> <!-- Does not move -->
		<color>#00ff00</color>
		<zmin>0</zmin> <zmax>2</zmax>
		<shape_from_visual/> <!-- automatic collision shape from 3D model -->
		<geometry type="cylinder" radius="0.75" length="2.0" vertex_count="6"/>
	</block:class>

	<block:class name="green_column_large">
		<static>true</static> <!-- Does not move -->
		<color>#00ff00</color>
		<zmin>0</zmin> <zmax>2</zmax>
		<shape_from_visual/> <!-- automatic collision shape from 3D model -->
		<geometry type="cylinder" radius="1.25" length="2.0" vertex_count="6"/>
	</block:class>

	<!-- obstacle columns: radius=0.15m height=0.5m -->
	<block:class name="white_column">
		<static>true</static> <!-- Does not move -->
		<color>#e0e0e0</color>
		<zmin>0</zmin> <zmax>0.5</zmax>
		<shape_from_visual/> <!-- automatic collision shape from 3D model -->
		<geometry type="cylinder" radius="0.15" length="0.5" vertex_count="16"/>
	</block:class>

	<block class="green_column_small"> <init_pose>-2 -2.75 0</init_pose> </block>
	<block class="green_column_small"> <init_pose>+2 -2.75 0</init_pose> </block>
	<block class="green_column_small"> <init_pose>-2 +2.75 0</init_pose> </block>
	<block class="green_column_small"> <init_pose>+2 +2.75 0</init_pose> </block>

	<block class="green_column_large"> <init_pose>3 0 0</init_pose> </block>

	<for var="iX" from="0" to="2">
		<for var="iY" from="0" to="2">
			<block class="white_column">
				<init_pose>$f{1.1*(iX-1)} $f{1.1*(iY-1)} 0</init_pose>
			</block>
		</for>
	</for>

</mvsim_world>

demo_warehouse

Example of a 3D Lidar Jackal robot in a warehouse. The XML illustrates how to animate an object to make it to follow a given trajectory in a loop.

roslaunch mvsim demo_warehouse.launch
ros2 launch mvsim demo_warehouse.launch.py

Assuming you compiled MVSim in the directory MVSIM_ROOT, with cmake build directory build-Release, run:

cd MVSIM_ROOT
build-Release/bin/mvsim launch mvsim_tutorial/demo_warehouse.world.xml
World XML code

File: mvsim_tutorial/demo_warehouse.world.xml

<mvsim_world version="1.0">
	<!-- General simulation options -->
	<simul_timestep>0</simul_timestep> <!-- Simulation fixed-time interval for numerical integration [seconds] or 0 to autodetermine -->
	
	<joystick_enabled>true</joystick_enabled>

	<!-- Optional: save all sensor data into an MRPT .rawlog dataset file: -->
	<!-- <save_to_rawlog>warehouse_dataset.rawlog</save_to_rawlog> -->
	<!-- If save_to_rawlog is enabled, this defines the rate in Hz to generate odometry observations -->
	<!-- <rawlog_odometry_rate>20.0</rawlog_odometry_rate> -->
	<!-- <save_ground_truth_trajectory>warehouse_dataset_gt.txt</save_ground_truth_trajectory> -->

	<!-- GUI options -->
	<gui>
		<ortho>false</ortho>
		<show_forces>false</show_forces>  <force_scale>0.01</force_scale>
		<cam_distance>25</cam_distance>
		<fov_deg>60</fov_deg>
		<refresh_fps>40</refresh_fps>
		<!-- <follow_vehicle>r1</follow_vehicle> -->

	</gui>

	<!-- Light parameters -->
	<lights>
		<enable_shadows>true</enable_shadows>
		<light_azimuth_deg>60.0</light_azimuth_deg>
		<light_elevation_deg>75.0</light_elevation_deg>
		<!-- <eye_distance_to_shadow_map_extension>2</eye_distance_to_shadow_map_extension> -->
		<!-- <minimum_shadow_map_extension_ratio>0.005</minimum_shadow_map_extension_ratio> -->
	</lights>

	<variable name="CEILING_HEIGHT" value="6.0"></variable>

	<!-- ========================
		   Scenario definition
	     ======================== -->
	<!-- ground -->
	<element class="horizontal_plane">
		<cull_face>BACK</cull_face>
		<x_min>-15</x_min> <y_min>-13</y_min>
		<x_max> 20</x_max> <y_max> 13</y_max>
		<z>0.0</z>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/concrete-ground-1.jpg</texture>
		<texture_size_x>2.0</texture_size_x>
		<texture_size_y>2.0</texture_size_y>
	</element>

	<!-- ceiling -->
	<element class="horizontal_plane">
		<cull_face>FRONT</cull_face>
		<x_min>-15</x_min> <y_min>-13</y_min>
		<x_max> 20</x_max> <y_max> 13</y_max>
		<z>$f{CEILING_HEIGHT}</z>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/BathroomTiles03_1K_BaseColor.png</texture>
		<texture_size_x>3.0</texture_size_x>
		<texture_size_y>3.0</texture_size_y>
	</element>

	<!-- perimeter walls: -->
	<element class="vertical_plane">
		<cull_face>FRONT</cull_face>
		<x0>-15</x0> <y0>13</y0>
		<x1>-15</x1> <y1>-13</y1>
		<z>0.0</z> <height>$f{CEILING_HEIGHT}</height>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/wall-bricks-01.png</texture>
		<texture_size_x>3.0</texture_size_x>
		<texture_size_y>3.0</texture_size_y>
	</element>
	<element class="vertical_plane">
		<cull_face>FRONT</cull_face>
		<x0> 20</x0> <y0>13</y0>
		<x1>-15</x1> <y1>13</y1>
		<z>0.0</z> <height>$f{CEILING_HEIGHT}</height>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/wall-bricks-01.png</texture>
		<texture_size_x>3.0</texture_size_x>
		<texture_size_y>3.0</texture_size_y>
	</element>
	<element class="vertical_plane">
		<cull_face>FRONT</cull_face>
		<x0> 20</x0> <y0>-13</y0>
		<x1> 20</x1> <y1>13</y1>
		<z>0.0</z> <height>$f{CEILING_HEIGHT}</height>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/wall-bricks-01.png</texture>
		<texture_size_x>3.0</texture_size_x>
		<texture_size_y>3.0</texture_size_y>
	</element>
	<element class="vertical_plane">
		<cull_face>FRONT</cull_face>
		<x0>-15</x0> <y0>-13</y0>
		<x1> 20</x1> <y1>-13</y1>
		<z>0.0</z> <height>$f{CEILING_HEIGHT}</height>
		<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/wall-bricks-01.png</texture>
		<texture_size_x>3.0</texture_size_x>
		<texture_size_y>3.0</texture_size_y>
	</element>

	<!-- =============================
		   Vehicle classes definition
	     ============================= -->
	<include file="../definitions/jackal.vehicle.xml"
		default_sensors="true"
	/>

	<!-- ========================
		   Vehicle(s) definition
	     ======================== -->
	<vehicle name="r1" class="jackal">
		<init_pose>0 0 0</init_pose>  <!-- In global coords: x,y, yaw(deg) -->
	</vehicle>

	<!-- ======================================
	      Object types
	     ====================================== -->
	<block:class name="shelf">
		<static>true</static> <!-- Does not move -->
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/shelf_big_moveai.zip/shelf_big_moveai/shelf_big_movai.dae</model_uri>
			<model_roll>90.0</model_roll>
		</visual>
	</block:class>

	<block:class name="stairs">
		<static>true</static> <!-- Does not move -->
		<zmin>0.0</zmin> <zmax>0.5</zmax>
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/metal-stairs.dae</model_uri>
			<model_offset_z>4.31</model_offset_z>
			<model_roll>90.0</model_roll>
		</visual>
	</block:class>

	<block:class name="tote">
		<mass>6</mass> <ground_friction>0.1</ground_friction>
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/tote.dae</model_uri>
			<model_roll>90.0</model_roll>
		</visual>
	</block:class>

	<block:class name="pallet">
		<mass>2</mass> <ground_friction>0.1</ground_friction>
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/pallet.zip/pallet/pallet.dae</model_uri>
			<model_roll>90.0</model_roll>
		</visual>
	</block:class>

	<block:class name="pallet_jack">
		<mass>20</mass> <ground_friction>1.0</ground_friction>
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/pallet_jack.zip/pallet_jack/pallet_jack.dae</model_uri>
			<model_roll>90.0</model_roll>
		</visual>
	</block:class>

	<block:class name="chair_x3">
		<mass>6</mass> <ground_friction>0.1</ground_friction>
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/chair_x3.dae</model_uri>
			<model_roll>90.0</model_roll>
		</visual>
	</block:class>

	<block:class name="extinguisher">
		<static>true</static> <!-- Does not move -->
		<mass>2</mass> <ground_friction>1</ground_friction>
		<shape_from_visual/> <!-- automatic shape,zmin,zmax from 3D mesh-->
		<!--  Custom visualization model. 3D model filename to load (local or remote http://uri ) -->
		<visual>
			<model_uri>https://mrpt.github.io/mvsim-models/extinguisher.zip/extinguisher/extinguisher.dae</model_uri>
			<model_roll>90.0</model_roll>
		</visual>
	</block:class>


	<!-- ======================================
	      Object instances
	     ====================================== -->
	<!-- You can assign an optional custom name to each object, as an attribute to block, like name="shelf_001", etc. -->

	<!-- All coordinates are global coords: 
	     SE(2) <init_pose>x y yaw(deg)</init_pose> or
	     SE(3) <init_pose3d>x y z yaw(deg) pitch(deg) roll(deg)</init_pose3d> 
	-->

	<block class="shelf"> <init_pose>0 5 0</init_pose> </block>
	<block class="shelf"> <init_pose>0 9 180</init_pose> </block>

	<block class="shelf"> <init_pose>0 -5 0</init_pose> </block>
	<block class="shelf"> <init_pose>0 -9 180</init_pose> </block>

	<block class="shelf"> <init_pose>12 0 90</init_pose> </block>
	<block class="shelf"> <init_pose>17 0 -90</init_pose> </block>

	<block class="pallet_jack"> <init_pose>3 3 0</init_pose> </block>
	<block class="pallet_jack"> <init_pose>-12.5 11.5 -10</init_pose> </block>
	<block class="pallet_jack"> <init_pose>-11 12 80</init_pose> </block>

	<block class="pallet_jack"> 
		<init_pose>0 0 0</init_pose>
		<animation type="keyframes">
			<time_pose>0.0  -13 -3  0</time_pose>
			<time_pose>10.0  5  -3  0</time_pose>
			<time_pose>11.0  5  -3  0</time_pose>
			<time_pose>14.0  5  -3  180</time_pose>
			<time_pose>24.0  -13 -3 180</time_pose>
			<time_pose>25.0  -13 -3 180</time_pose>
			<time_pose>26.0  -13 -3 0</time_pose>
		</animation>
	</block>


	<block class="stairs"> <init_pose>-12 -11.5 -90</init_pose> </block>
	<block class="stairs"> <init_pose> 15  11.5 90</init_pose> </block>

	<block class="tote"> <init_pose>-2 3 -40</init_pose> </block>
	<block class="tote"> <init_pose> 2 3 10</init_pose> </block>

	<block class="pallet"> <init_pose>10.4 -1.1 85</init_pose> </block>
	<block class="pallet"> <init_pose>10.3 -2.3 91</init_pose> </block>
	<block class="pallet"> <init_pose>10.5 1.15 80</init_pose> </block>
	<block class="pallet"> <init_pose>10.2 0.1 86</init_pose> </block>

	<for var="iX" from="0" to="2">
		<for var="iY" from="0" to="1">
			<block class="pallet">
				<init_pose>$f{-7.9+iX*1.3} $f{0.9*iY+2} 0</init_pose>
			</block>
		</for>
	</for>


	<block class="chair_x3"> <init_pose>-14.5 1 90</init_pose> </block>
	<block class="chair_x3"> <init_pose>-14.5 3 90</init_pose> </block>

	<block class="extinguisher"> <init_pose3d>-14.8 12 1.1 90 0 0</init_pose3d> </block>
	<block class="extinguisher"> <init_pose3d> 6.5 12.9 1.1 0 0 0</init_pose3d> </block>
	<block class="extinguisher"> <init_pose3d> 2.5 -12.9 1.1 180 0 0</init_pose3d> </block>

</mvsim_world>