Search code examples
pythonpython-3.xxsdcarla

XMLSchemaChildrenValidationError in Carla simulator (Python 3.7)


I have been trying to use scenario runner with an openscenario file in Carla 0.9.5 (using Python 3.7):

python scenario_runner.py --openscenario openscenario_file.xosc

And I keep getting the following error:

    Traceback (most recent call last):
  File "scenario_runner.py", line 413, in <module>
    SCENARIORUNNER.run(ARGUMENTS)
  File "scenario_runner.py", line 224, in run
    self.run_openscenario(args)
  File "scenario_runner.py", line 311, in run_openscenario
    config = OpenScenarioConfiguration(args.openscenario)
  File "C:\scenario_runner-0.9.5.1\srunner\tools\openscenario_parser.py", line 37, in __init__
    self._validate_openscenario_configuration()
  File "C:\scenario_runner-0.9.5.1\srunner\tools\openscenario_parser.py", line 58, in _validate_openscenario_configuration
    xsd.validate(self.xml_tree)
  File "C:\Python\Python37\site-packages\xmlschema\validators\schema.py", line 1269, in validate
    raise error
xmlschema.validators.exceptions.XMLSchemaChildrenValidationError: failed validating <Element 'Event' at 0x000002621BDF6458> with XsdGroup(model='sequence', occurs=[1, 1]):

Reason: Unexpected child with tag 'Conditions' at position 2. Tag 'StartConditions' expected.

Schema:

  <xsd:complexType xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:sequence>
          <xsd:element maxOccurs="unbounded" name="Action">
              <xsd:complexType>
                  <xsd:choice>
                      <xsd:element name="Global" type="OSCGlobalAction" />
                      <xsd:element name="UserDefined" type="OSCUserDefinedAction" />
                      <xsd:element name="Private" type="OSCPrivateAction" />
                  </xsd:choice>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
              </xsd:complexType>
          </xsd:element>
          <xsd:element name="StartConditions">
              <xsd:complexType>
                  <xsd:sequence>
                      <xsd:element maxOccurs="unbounded" name="ConditionGroup" type="OSCConditionGroup" />
                  </xsd:sequence>
              </xsd:complexType>
          </xsd:element>
      </xsd:sequence>
      ...
      ...
  </xsd:complexType>

Instance:

  <Event name="MyLaneChangeLeftEvent" priority="overwrite">
      <Action name="MyLaneChangeLeftAction">
          <Private>
              <Lateral>
                  <LaneChange>
                      <Dynamics shape="sinusoidal" time="5" />
                      <Target>
                          <Relative object="$owner" value="1" />
                      </Target>
                  </LaneChange>
              </Lateral>
          </Private>
      </Action>
      <Conditions>
          <Start>
              <ConditionGroup>
                  <Condition delay="0" edge="rising" name="MyStartCondition1">
                      <ByEntity>
                          <TriggeringEntities rule="any">
                              <Entity name="$owner" />
      ...
      ...
  </Event>

Path: /OpenSCENARIO/Storyboard/Story/Act/Sequence/Maneuver/Event

I am quite new in python and carla. I looked up this type of error, however I couldn't find any useful information, any ideas? From what I understand it looks like the child "Conditions" is and invalid child element, but I am not sure why.


Solution

  • The error is quite clear

    Unexpected child with tag 'Conditions' at position 2. Tag 'StartConditions' expected.

    The validator sees a <Conditions> element where there would be a <StartConditions> expected.

    Your schema says "after 1..N occurrences of <Action> there must be a <StartConditions>":

    <xsd:complexType xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" name="Action">
                <xsd:complexType>
                    <xsd:choice>
                        <xsd:element name="Global" type="OSCGlobalAction" />
                        <xsd:element name="UserDefined" type="OSCUserDefinedAction" />
                        <xsd:element name="Private" type="OSCPrivateAction" />
                    </xsd:choice>
                    <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="StartConditions">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element maxOccurs="unbounded" name="ConditionGroup" type="OSCConditionGroup" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    

    And this is what your XML does:

    <Event name="MyLaneChangeLeftEvent" priority="overwrite">
        <Action name="MyLaneChangeLeftAction">  <!-- position 1 -->
            <!-- ... -->
        </Action>
        <Conditions>                            <!-- position 2 -->
            <!-- ... -->
        </Conditions>
    </Event>
    

    The solution is to either update your XML to match the schema, or to update your schema to match the XML.