--- title: "Writing an ODD Definition" slug: "creating-an-odd-definition" updated: 2026-02-06T12:10:29Z published: 2026-02-06T12:10:29Z canonical: "docs.safetypooldb.ai/creating-an-odd-definition" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.safetypooldb.ai/llms.txt > Use this file to discover all available pages before exploring further. # Writing an ODD Definition ## Overview This article describes what an ODD is, what its components are, and how to write one, starting with a simple example, and then explaining the concepts in depth. ## What is an ODD? An **Operational Design Domain** (ODD) is **the set of specific conditions under which an Automated Driving System (ADS) is designed to function**. Each ADS has its own associated ODD. > [!NOTE] > What is an ODD? > > Intuitively, an ODD describes the elements that a given Automated Driving System (ADS) can deal with: > > - The ADS **can** handle elements which are **inside the ODD** > - The ADS **cannot** handle elements which are **outside the ODD** ## What is an ODD definition? An **ODD definition** is a **document or file** that **clearly defines** these operating conditions. This is very useful for testing systems, and for communicating the capabilities of a given ADS. There are multiple ways to define an ODD, but the format used in Safety Pool**™** consists of **keywords** and **attribute names**. We’ll start with a simple example: **Example 1:** | ```plaintext MODE: DEFAULT INCLUDE "Drivable area type" is ["Motorways", "Distributor roads", "Slip roads"] INCLUDE "Junction" is [all] EXCLUDE 'Wind' is ['Hurricane force'] EXCLUDE 'Snowfall' is ['Heavy snow'] EXCLUDE 'Particulates' is ['Volcanic ash'] CONDITIONAL IF 'Drivable area type' is ['Motorways']: INCLUDE 'Drivable area surface type' is ["SurfaceTypeAsphalt", "SurfaceTypeCementConcrete"] INCLUDE "Number of lanes" is [1:4] ``` | | --- | **Explanation:** In this ODD, the system it refers to: - C*an* handle motorways, distributor roads, slip roads, and all junctions - C*annot* handle hurricane force winds, heavy snow, or volcanic ash - C*an* handle motorways, but only if they are asphalt or concrete - C*an* handle 1 to 4 lanes - Conversely, the system *cannot* handle 5 or more lanes The main keywords are: `INCLUDE` , `EXCLUDE` , `CONDITIONAL IF` , `MODE`, and `all`. We will now explain these components. ### Attribute Names The attribute names are the actual elements that are important to the relevant driving system. In the example above, they are the parts in single or double quotes, such as `“Motorways"` or `'Snowfall'` . The names come from the [BSI PAS 1883:2025](https://www.bsigroup.com/en-GB/insights-and-media/insights/brochures/operational-design-domain-implementation-of-bs-iso-34503/) standard. In Safety Pool, these tag names (and any associated units) are visible on the [Search Page](https://live.safetypooldb.ai/scenariosearches): | ![](https://cdn.document360.io/d9bf0084-0d5b-468a-971b-537dce7153b6/Images/Documentation/image(10).png) | ![](https://cdn.document360.io/d9bf0084-0d5b-468a-971b-537dce7153b6/Images/Documentation/image(11).png) | | --- | --- | | ![](https://cdn.document360.io/d9bf0084-0d5b-468a-971b-537dce7153b6/Images/Documentation/image(14).png) | | Tags and units visible on the search page. *If you need access to the raw taxonomy TTL file, please contact* [*support@safetypooldb.ai*](mailto:support@safetypooldb.ai)*.* | ### Basic Statements #### Includes and Excludes **Include** statements specify attributes that are **inside** of the ODD, and **Exclude** statements specify attributes that are **outside** of the ODD. **Example 2:** | ```plaintext INCLUDE "Drivable area type" is ["Motorways", "Radial roads"] EXCLUDE "Weather" is ["Snowfall", "Rainfall"] INCLUDE "Junctions" is [all] ``` | | --- | **Explanation:** In this example: - Motorways and radial roads are inside the ODD, so the system *can* handle them - Snowfall and rainfall are outside of the ODD, so the system *cannot* handle them - *All* junctions are considered within the ODD, so the system *can* handle them - `all` junctions refers to intersections and roundabouts, as these are the children of `Junctions` listed on the search page ### Mode Statements The **mode**, which must be specified for all definitions, is used to specify how any attributes which *aren’t explicitly listed* in the ODD file are handled. There are 3 modes: **Permissive**, **Restrictive**, and **Default**. #### Permissive mode In Permissive mode, any attributes that aren’t mentioned in the ODD definition are considered *inside* the ODD. **Example 3:** ```plaintext MODE: PERMISSIVE EXCLUDE "Weather" is ["Snowfall"] ``` **Explanation:** - The system with this ODD **cannot** handle snowfall - But it **can** handle everything else - In Permissive mode, it is assumed that all non-mentioned elements - including, in this example, all road types, all road surfaces, all traffic types, etc. - should be considered inside of the ODD - This also includes all other weather conditions that aren’t snowfall An empty ODD file in Permissive mode would automatically *include* everything. #### Restrictive mode In Restrictive mode, any attributes that aren’t mentioned in the ODD definition are considered *outside* of the ODD. **Example 4:** ```plaintext MODE: RESTRICTIVE INCLUDE "Environmental Conditions" is [all] INCLUDE "Dynamic elements" is [all] INCLUDE "SceneryDrivableArea" is [all] ``` **Explanation:** - The system with this ODD can handle all environmental conditions, and all dynamic elements (i.e. other vehicles) of a scenario - It can handle every kind of drivable area, which includes: - All road signs, all surface types, all road types, all road edge types, all kinds of road geometry, and all kinds of road specifications - These are all sub-elements of drivable area, listed on the Search Page - It *cannot* handle any kind of fixed road structure, junction, special structure, temporary road structure, or zone. These are all of the scenery elements which aren’t explicitly mentioned, and are therefore considered excluded. An empty ODD file in Restrictive mode would automatically *exclude* everything. #### Default mode In Default mode, any attributes that aren’t mentioned in the ODD definition are considered *inside* of the ODD definition, but **irrelevant for testing purposes**. To be more specific, the non-mentioned attributes are considered as not affecting ADS performance. In the context of ODD-based search, this acts similarly to Permissive mode. **Example 5:** ```plaintext MODE: DEFAULT INCLUDE "Dynamic elements" is [all] INCLUDE "Scenery" is [all] INCLUDE "Illumination" is [all] INCLUDE "ParticulatesType" is [all] INCLUDE "Weather" is [all] ``` **Explanation:** - The system with this ODD can handle all dynamic elements (other vehicles) and all scenery elements - Considering environmental elements: - The system *can* handle all kinds of illumination, all types of particulates, and all weather conditions - Connectivity isn’t mentioned in this ODD definition. Therefore, in default mode, it’s assumed that the system can handle all types of connectivity, but that it won’t affect ADS performance, and doesn’t need to be explicitly tested as part of the system deployment. ### Conditional Statements Conditional statements are used when the inclusion or exclusion of attributes depends on other attributes. As one example, you could use conditional statements to write part of the ODD for a system which can’t handle snowfall on a motorway, but can handle snowfall on any other road type. **Example 6:** ```plaintext CONDITIONAL IF 'Illumination' is ['IlluminationDay']: INCLUDE 'Drivable area type' is ['Motorways'] CONDITIONAL IF "Drivable area surface type" is ["Gravel", "Segmented"]:    EXCLUDE "DrivableAreaSurfaceCondition" are ["Flooded roadways", "Snow on drivable area"] ``` **Explanation:** This is a small snippet of a larger ODD definition. - This system can *only* handle motorways *if* it is also daytime - If the system is on gravel or segmented roads, it *cannot* also handle those roads being flooded or snow-covered *at the same time*. Conditional statements are useful for including or excluding edge cases, caused by unusual or uncommon combinations of attributes. ### Ranges Instead of listing elements directly, ranges can also be used to express values. Units can be found on the [Search Page](https://live.safetypooldb.ai/scenariosearches). **Examples:** - `EXCLUDE "LongitudinalUpSlope" is [15:-]` - This excludes any slopes above 15 degrees - `EXCLUDE "Lane dimensions" are [0:2.0]` - This excludes any lanes between 0 and 2m wide - `INCLUDE "Number of lanes" is [1:4]` - This allows 1, 2, 3 or 4 lanes. 5 or more lanes are implicitly excluded. ### Formatting - Single or double quotes can be used for attribute names: `'Snowfall'` , `“Rainfall"` - `is` and `are` can be used interchangeably in Include and Exclude statements: - `INCLUDE '...' is [...]` - `INCLUDE "..." are [...]` ## How to write an ODD definition If you’re writing an ODD definition in this format for an existing system - for example, in order to search for relevant test scenarios - you should already know its capabilities and limitations. As a rough guide, here is one method for taking an existing ODD definition and converting it into this format. ### Converting an ODD definition 1. Firstly, assess what your definition looks like. This is important for choosing the **mode** in which the ODD will be written. 1. If your system has a very capable ODD, with only a small number of restrictions, then Permissive mode will be easier. For this, you will only write Exclude statements for elements that the ADS cannot handle. 2. If your system has a limited ODD, that can only handle a relatively small set of conditions, it makes sense to use the Restrictive mode, and only add Include statements for all elements that the ADS can handle. 3. Similarly, if your system has a limited ODD, but will only ever expect to be in a subset of environments, then Default mode is the better option > [!NOTE] > Default vs. Permissive Mode > > In both Default and Permissive mode, it is implicitly assumed that, for any elements not mentioned in the ODD definition, that the system, if encountering these elements, **can** handle them. However, in Default mode, it’s assumed that these non-mentioned elements are irrelevant for testing purposes - that is, they may be elements that the ADS will never encounter. > > As an example: > > - A capable ODD for automated driving in a range of situations, but prohibited on motorways, should write an ODD definition using Restrictive mode, and not mention motorways. This implies that the system cannot handle motorways, but should be tested on them, to see how they respond in a motorway environment. > - An ODD for an automated micromobility shuttle, geofenced for use in a town centre, cannot handle motorways. However, as this shuttle will never find itself on a motorway, even as an edge case, it’s appropriate to use Default mode for the ODD definition. In a Default mode, motorways wouldn’t be mentioned anywhere in the definition. This implies that the system does not need to be tested in a motorway environment. > - Default mode can also be used to explicitly include *and* exclude elements 2. For Restrictive and Default mode: 1. Take a list of all elements that your system *can* handle. These are the elements that are *inside* your ODD 2. Group these into siblings according to the taxonomy available on the [Search Page](https://live.safetypooldb.ai/scenariosearches), making a note whenever all attributes from one parent are included, and note the parent of these groups 3. Write each of these groups as a single inclusion: 1. `INCLUDE "Parent 1" is ["Sibling 1", "Sibling 2", ... ,"Sibling X"]` 2. `INCLUDE "Parent 2" is [all]` 3. For Permissive and Default mode: 1. Take a list of all elements that your system *cannot* handle. These are *outside* of your ODD 2. Group these into siblings and note their parents, as described above 3. Write each of these groups as an exclusion: 1. `EXCLUDE "Parent 1" is ["Sibling 1", "Sibling 2", ... ,"Sibling X"]` 2. `EXCLUDE "Parent 2" is [all]` 4. For any outliers, or situations that haven’t been covered, these can often be written as conditional statements: - **Conditional Inclusions**: - This system can only handle `ElementB` when `ElementA` is present - This system can only handle `ElementB1` or `ElementB2` in the context of `ElementA1` - `CONDITIONAL IF "ParentA" is ["ElementA"]:  ` ` INCLUDE "ParentB" is ["ElementB1", "ElementB2"]` - **Example:** This system can only handle trucks and vans when they are on a motorway, slip road, or distributor road. - `CONDITIONAL IF "DrivableAreaType" is ["Motorways"]:  ` ` INCLUDE "Vehicle" is ["VehicleTruck", "VehicleVan"]` - **Conditional Exclusions:** - This system cannot handle `ElementB` when `ElementA` is also present - `CONDITIONAL IF "ParentA" is ["ElementA"]:  ` ` EXCLUDE "ParentB" is ["ElementB1", "ElementB2"]` - **Example:** The system cannot handle icy surfaces on slopes greater than 15 degrees: - `CONDITIONAL IF "LongitudinalUpSlope" is [15:-]:` ` EXCLUDE "DrivableAreaSurfaceCondition" is ["Icy"]` Once you’ve written out the ODD definition, you can then use it to search for scenarios. There’s more information on that available here: [Searching by ODD](/v1/docs/searching-by-odd). ## Validating an ODD definition In order to check the syntax - the keywords and structure - of the ODD definition you’ve written, you can try to search with it, and if there are errors in the text, a red box will appear, saying there’s a validation error. This usually just means you’ve mistyped a keyword, or missed some punctuation. By clicking ‘View Error Details’, the website will show more specifically which line and column (the location of the character in the line) caused the error. | ![](https://cdn.document360.io/d9bf0084-0d5b-468a-971b-537dce7153b6/Images/Documentation/image(33).png) | ![](https://cdn.document360.io/d9bf0084-0d5b-468a-971b-537dce7153b6/Images/Documentation/image(34).png)Here, it flags the fact that ‘INCLUDE’ isn’t spelled correctly. | | --- | --- | ### Conclusion You should now be able to write an ODD definition for your ADS, and check it for errors. To see exactly how to search for scenarios on Safety Pool**™** using it, see this guide: [Searching by ODD](/v1/docs/searching-by-odd). > [!NOTE] > Need more support? > > If this guidance doesn’t address your specific use case, please contact [SafetyPoolSCDB@warwick.ac.uk](mailto:SafetyPoolSCDB@warwick.ac.uk) for personalised support.