# Configuring the Simulator
The configuration of the Simulator's state is done through the use of YAML files. Below is an example of a sample YAML file.
```yaml
robots:
- id: robot0
pose:
- -6.295703
- 7.076855
- 0.0
vel:
- 0.0
- 0.0
lidar: true
footprint:
- 0.25
drive_type: Differential
add_noise: false
- id: robot1
pose:
- -4.0486326
- 4.9811525
- 0.0
vel:
- 0.0
- 0.0
lidar: true
footprint:
- 0.25
drive_type: Differential
add_noise: false
walls:
- endpoints:
- - -9.1560545
- 8.704004
- - -1.0940428
- 8.6789055
- - -0.99091816
- 3.9499025
- - -9.038574
- 4.1187496
- endpoints:
- - 1.0652351
- 8.664355
- - 1.0892582
- 4.006152
- - 9.079687
- 4.0520506
static_objects:
- center:
- 2.2917004
- 6.981738
width: 0.625
height: 0.625
rotation: 0.0
- center:
- 7.0378914
- 6.6941404
width: 0.625
height: 0.625
rotation: 0.0
- center:
- 0.020019531
- 2.6319332
width: 0.625
height: 0.625
rotation: 0.0
```
## Three categories of objects
There are three main categories of Objects used in the Simulator, `Robot`, `Static Object`, `Wall`. The configuration for each of these is described differently.
In general, the YAML can be split as a combination of these categories as below
```yaml
robots:
- ...
- ...
- ...
walls:
- ...
- ...
- ...
static_objects:
- ...
- ...
- ...
```
## Configuring a Robot
| Property | Description | Data Type |
|---------------|------------------------------------------------------------------------------------------------------|-----------------|
| `id` | Describes the `id` of the Robot. | `string` |
| `pose` | Describes the `pose` of the Robot. This is a tuple of [`x`, `y`, `yaw`]. | Tuple of [`x`, `y`, `yaw`] |
| `vel` | Describes the `velocity` of the Robot. Varies according to drive type:
Differential drive: `[vx, vy]`
Omnidirectional drive: velocity in x and y direction
Ackermann drive: linear velocity and steering angle. | Varies according to drive type:
Differential drive: `[vx, vy]`
Omnidirectional drive: velocity in x and y direction
Ackermann drive: linear velocity and steering angle. |
| `lidar` | Describes the presence of a lidar. | `bool` |
| `footprint` | Describes the footprint. If `float`, the shape of the robot is circular with the given number as radius. If a tuple of `float`, the first number is taken as width and the second number as height. | `float` or Tuple of `float` |
| `drive_type` | Describes the drive type. Can be `Differential`, `OmniDirectional`, or `Ackermann`. | `string` |
| `add_noise` | Adds noise to the kinematics model. | `bool` |
An example YAML configuration with `Ackermann` drive and Rectangular Footprint is given below
```yaml
- id: robot1
pose:
- -4.825901
- 8.391234
- 0.35
vel:
- 1.5
- 0.0
lidar: true
footprint:
- 0.4
- 1.2
drive_type: Ackermann
add_noise: true
```
## Configuring a Static Object
Here's a table generated from the YAML data:
| Property | Description | Data Type |
|-----------------|-------------------------------------------------------|--------------------|
| static_objects | List of static objects | List of objects |
| center | Center coordinates of the object | Tuple of [`x`, `y`] |
| width | Width of the object | `float` |
| height | Height of the object | `float` |
| rotation | Rotation of the object | `float` |
In this table, I've represented the YAML data as a table with property names, descriptions, and data types for each field.
## Configuring a Wall
| Property | Description | Data Type |
|------------|-------------------------------------------|--------------------|
| endpoints | List of endpoint coordinates | List of Tuples of XY coordinates of vertices |
### Note
It is highly recommended to create a starting configuration using the [GUI](./gui_usage.md) and edit the specifics from the YAML file.