LogoLogo
TRIK StudioTRIKLego EV3Lego NXT
English
English
  • TRIK help
  • TRIK Studio
    • About TRIK Studio
      • How to find out the version of TRIK Studio
    • Getting started and creating a project
    • TRIK Studio interface
      • TRIK Studio main menu
      • Working with graphs
      • How to open robot settings
      • How to change TRIK Studio interface language
    • TRIK Studio settings
    • 2D model
      • 2D model tuning
      • Adding restrictions to the 2D Model
        • Restrictions setting examples
    • Visual programming
      • Adding and removing blocks
      • Common blocks
      • Links between blocks
      • Syntax of expressions in the blocks
        • TRIK Studio language types
          • Array
        • TRIK Studio language tokens
        • TRIK Studio language operators
        • Constants
        • Sensor variables
        • Built-in functions
      • Property editing
      • Subprograms
    • Textual programming
    • Exercises
    • External tools
      • PuTTY
      • WinSCP
    • TRIK Studio shortcuts
    • Antivirus conflicts
      • Avast antivirus blocks TRIK Studio. What to do?
  • TRIK Studio Junior
    • About TRIK Studio Junior
      • How to find out the version of TRIK Studio Junior
    • Getting started and creating a project in TRIK Studio Junior
    • TRIK Studio Junior interface
      • How do I replace the "Character movement" image?
    • TRIK Studio Junior settings
    • Visual programming in TRIK Studio Junior
      • Adding and removing blocks in TRIK Studio Junior
      • Blocks in TRIK Studio Junior
      • Links between blocks in TRIK Studio Junior
      • Syntax of expressions in the blocks in TRIK Studio Junior
      • Property editing in TRIK Studio Junior
      • Subprograms in TRIK Studio Junior
    • Exercises in TRIK Studio Junior
  • INTEGRATIONS
    • PyCharm
      • Running a 2D model in TRIK Studio from PyCharm
    • Sublime Text
      • Running a 2D model in TRIK Studio from Sublime Text
      • Uploading programs to several TRIK robots from Sublime Text
    • VSCode
      • Running a 2D model in TRIK Studio from VSCode
      • Uploading programs to several TRIK robots from VSCode
  • TRIK controller
    • About the TRIK controller
      • Screenshot of the TRIK controller screen
    • TRIK controller firmware
      • How to find out the firmware version of the TRIK controller?
    • TRIK controller menu
    • Connecting to the TRIK controller via Wi-Fi
      • Connecting the TRIK controller to a computer and smartphone
      • Connecting the TRIK controller to TRIK Studio
      • Interaction of TRIK controllers
        • An example of solving a problem on the interaction of two robots
    • Connecting to the TRIK controller using UART
    • Launching and uploading programs to the TRIK controller
    • Programming TRIK with the visual programming language
      • TRIK specific blocks
      • Sensory variables for the TRIK controller
    • TRIK controller programming in Python and JavaScript
      • Object «brick»
        • Class «accelerometer»
        • Class «battery»
        • Class «colorSensor»
        • Class «display»
        • Class «encoder»
        • Class «gyroscope»
        • Class «keys»
        • Class «led»
        • Class «lineSensor»
        • Class «motor»
        • Class «objectSensor»
        • Class «sensor»
      • Object «script»
      • Object «mailbox»
      • Object «gamepad»
      • Object «Threading»
      • Function getPhoto
      • Function include
    • TRIK controller web interface
    • Connecting devices to TRIK and working with them
      • Connecting and working with the video module
      • Testing devices connected to the TRIK controller
      • Configuring the operation of a USB camera with a TRIK controller
      • Capturing images with TRIK camera and using them in TRIK Studio
      • Working with battery and charger
  • LEGO EV3 Controller
    • About LEGO EV3
    • Connecting a LEGO EV3 Controller to TRIK Studio
    • LEGO EV3 specific blocks
    • Sensory Variables for the LEGO EV3 Controller
    • Launching and uploading programs to the LEGO EV3
  • LEGO NXT Controller
    • About LEGO NXT
    • LEGO NXT Controller Firmware
    • Connecting a LEGO NXT Controller to TRIK Studio
    • LEGO NXT specific blocks
    • Sensory Variables for the LEGO NXT Controller
    • LEGO NXT C Programming
    • Launching and uploading programs to the LEGO NXT
  • Quadcopter Geoscan Pioneer
    • About quadcopter Geoscan Pioneer
    • Geoscan Pioneer specific blocks
  • TRIK Gamepad
    • About TRIK Gamepad
      • TRIK Gamepad App
      • TRIK Gamepad Utility
    • Robot control from the remote control
  • Feedback
    • Actions in case of TRIK Studio or TRIK controller malfunction
    • Ask a Question
    • trikset.com
Powered by GitBook
On this page
  • Constraint description structure
  • <constraints>...</constraints>
  • <timelimit/>
  • <constraint>...</constraint>
  • <event>...</event>
  • <init>...</init>
  • Conditions
  • <condition>...</condition>
  • <conditions>...</conditions>
  • Atomic conditions
  • <equals>...</equals>
  • <notEqual>...</notEqual>
  • <greater>...</greater>
  • <less>...</less>
  • <inside/>
  • <settedUp/> and <dropped/>
  • <timer/>
  • Variable types and arithmetic operations
  • <int/>, <double/>, <string>, <bool/>
  • <variableValue/>
  • <objectState/>
  • <typeOf/>
  • <minus>..</minus>, <abs>...</abs>
  • <sum>, <difference>, <min>, <max>
  • Triggers
  • <trigger>...</trigger>
  • <fail/>
  • <success/>
  • <setter>...</setter>
  • <setUp/>, <drop/>
  • Sensor names
  • Additional robot properties
  • Working with the controller display
  • Restrictions example

Was this helpful?

Export as PDF
  1. TRIK Studio
  2. 2D model

Adding restrictions to the 2D Model

Previous2D model tuningNextRestrictions setting examples

Last updated 4 years ago

Was this helpful?

It is possible to add restrictions by to prepare for students.

There are three types of restrictions:

  1. Time restrictions. For example, a time limit to complete a task or a specific action in a specific time frame.

  2. Spatial. For example, adding regions ("Start", "Finish") or prohibiting/forcing a robot, its sensor, or some moving object to be at a certain time in a certain place.

  3. Device restrictions. For example, a limitation on the set of sensors or on the behavior of devices.

Constraint description structure

The main tagwhich contains all the restrictions is used to describe them. Used as a container. Restrictions are described inside the tag, each inner tag must be one of four:

Tag

Description

Time limit.

A constraint with an arbitrary condition in violation of which a specified error will be generated.

The main tool for setting dynamic constraints. Used as a container.

An unconditional event that runs before the program starts executing.

<constraints>...</constraints>

The main tag containing all restrictions. Used as a container.

<constraints>
     <!-- Time limit -->
     <timelimit value="30000"/>
     
     <!-- Conditional constraint. An error message will be shown at violation. -->
     <constraint checkOnce="true" failMessage="The robot must be at start before run!">
          <inside objectId="robot1" regionId="start_zone"/>
     </constraint>
     
     <!-- Initializing variable x with value 2 -->
     <init>
          <setter name="x">
               <int value="2"/>
          </setter>
      </init>

</constraints>

<timelimit/>

Time limit. Mandatory.

Attributes

Attribute

Description

value="value"

Timeout in milliseconds after which the execution will be terminated and the "Time limit exceeded" error will be displayed.

Syntax:

<timelimit value="35000"/>

<constraint>...</constraint>

A constraint with an arbitrary condition. If the condition is violated a specified error message will be displayed. Can be used as a container. Has one child tag: <conditions>...</conditions>.

Attributes

Attribute

Description

checkOnce="true"

Boolean attribute. If the value is true, then the restriction will be checked once at program startup. Is useful for one-time checks such as sensor layout etc.

failMessage="Error!"

An error message will be displayed when a restriction is violated.

Syntax:

<constraint checkOnce="true" failMessage="The robot must be at start before run!">
<!-- Checks if the IR distance sensor is connected to the A1 port -->
<constraint checkOnce="true" failMessage="The IR distance sensor must be connected to the robots A1 port!">
    <equals>
        <typeOf objectId="robot1.A1"/>
        <string value="twoDModel::robotModel::parts::RangeSensor"/>
    </equals>
</constraint>
<!-- Checks if the robot is inside the specified region for the entire program execution time-->
<constraint failMessage="The robot has left the allowed zone!">
    <inside objectId="robot1" regionId="warzone"/>
</constraint>

<event>...</event>

The main tool for setting dynamic constraints. Used as a container.

Attributes

Attribute

Description

settedUpInitially="true"

An attribute that allows you to indicate whether the event is set up at the start of the program. The event can be set up or dropped. In the setup state, the event pulls its trigger if its condition is met, otherwise it's just ignored by the system.

The default value is false.

id="finish checker"

Events unique ID. The event can be referred by id from others. Optional.

dropsOnFire = "true"

A boolean attribute that indicates whether the event should continue to be set up after it is triggered or not. Optional. The default value is true.

Syntax:

<event id="finish checker" settedUpInitially="false">
	<condition>
		<inside objectId="robot1" regionId="finish"/>
	</condition>
	<trigger>
		<success/>
	</trigger>
</event>

<init>...</init>

Unconditional event executing before the program starts.

Example:

<!-- Setting the "my_value" variable to the value of two-->
<init>
    <setter name="my_value">
        <int value="2"/>
    </setter>
</init>

Conditions

<condition>...</condition>

The condition being checked is described inside this tag.

Example:

<condition>
    <!-- The condition of equality of two values is described inside the tag -->
    <equals>
        <objectState object="robot1.display.smiles"/>
        <bool value="true"/>
    </equals>
</condition>

<conditions>...</conditions>

Used to create compound conditions. The logical bond is the mandatory attribute. The bond may be and or or. Negation is specified by the <not> tag without attributes. Other <conditions> elements may also appear among subexpressions.

Attributes:

Attribute

Description

glue="and"

Logical bond.

Syntax:

<conditions glue="and">
   <!-- Condition1 -->
   <!-- Condition2 -->
   <!--    ...   -->
   <!-- ConditionN -->
</conditions>

<conditions glue="and">
   <not>
      <!-- Condition1 -->
   </not>
</conditions>

<conditions glue="and">
   <timer timeout="1000" forceDropOnTimeout="true"/>
   <conditions glue="or">
      <greater>
         <objectState object="robot1.display.labels.size"/>
         <int value="20"/>
      </greater>
      <less>
         <objectState object="robot1.display.labels.size"/>
         <int value="19"/>
       </less>    
    </conditions>
</conditions>

Atomic conditions

Atomic condition is one of the following elements:

Tag

Description

Value comparison operations.

Sets spatial constraints.

Checks whether an event is set up or not.

Sets the time in ms after which the specified condition is considered true.

<equals>...</equals>

Equals. The functional symbols value comparison operation. Can be used as a container.

Syntax:

<equals>
	<objectState object="robot1.display.labels.first.text"/>
	<string value="finish"/>
</equals>

<notEqual>...</notEqual>

Not equal. The functional symbols value comparison operation. Can be used as a container.

Syntax:

<notEqual>
	<objectState object="robot1.display.labels.first.text"/>
	<string value="finish"/>
</notEqual>

<greater>...</greater>

Greater. The functional symbols value comparison operation. Can be used as a container.

Syntax:

<greater>
	<objectState object="robot1.display.labels.size"/>
	<int value="0"/>
</greater>

<less>...</less>

Less. The functional symbols value comparison operation. Can be used as a container.

Syntax:

<less>
    <objectState object="robot1.display.labels.size"/>
    <int value="10"/>
</less>

<inside/>

Sets spatial constraints.

Attributes

Attribute

Description

objectId="id"

Object ID.

regionId="id"

Region ID.

Syntax:

<!-- Limits the location of the "robot1" robot to the "start" zone -->
<inside objectId="robot1" regionId="start"/>

<settedUp/> and <dropped/>

Checks whether the event set up or not.

Attributes

Attribute

Description

id="event1"

The ID of the event is checked

Syntax:

<!-- The "event1" event is set up condition -->
<condition>
    <settedUp id="event1"/>
</condition>

<!-- The "event2" event is dropped condition -->
<condition>
    <dropped id="event2"/>
</condition>

Example:

The "check event" event conditions check that the other "Try move" event is set up and the "Go back" event is dropped. If both of them return "true" after the check the program successfully ends.

<event id="check event" settedUpInitially="true">
    <conditions glue="and">
        <settedUp id="Try move"/>
        <dropped id="Go back"/>
    </conditions>
    <trigger>
        <success/>
    </trigger>
</event>

<timer/>

A predicate that starts to return "true" when the specified time has passed since the moment when this event was set, and up to that moment it returns "false".

Attributes

Attribute

Description

timeout="1000"

The time interval after which this predicate will become true. Mandatory. The value must be a non-negative integer.

forceDropOnTimeout="true"

A Boolean attribute that allows you to drop the event that has this timer in a condition.

If set to true, the event will be dropped even if there are other active timers and unmet conditions. Optional. The default value is true.

Syntax:

<timer timeout="1000" forceDropOnTimeout="false"/>

Example

Let's look at using <timer/> with different forceDropOnTimeout attribute values.

The "check region" event checks time and spatial limits. The first condition (timer) becomes true after 1000ms. Its value doesn't change after that. The second one (inside) checks that the robot is inside the "start_zone" region. When both conditions will be met simultaneously the program will end successfully.

1. Since the forceDropOnTimeout attribute is "false", the event will be still set up after a specified timeframe and wait for the second condition to be met.

<event id="check region" settedUpInitially="true">
    <conditions glue="and">
        <timer timeout="1000" forceDropOnTimeout="false"/>
        <inside objectId="robot1" regionId="start_zone"/>
    </conditions>
    <trigger>
        <success/>
    </trigger>
</event>

2. Since the forceDropOnTimeout attribute is "true", the event will be dropped after the specified timeframe despite the presence of a second condition. Therefore, if the robot is not in the required region right after 1000 ms, then the success message will not be displayed even if the robot will be there after some time.

<event id="check region" settedUpInitially="true">
    <conditions glue="and">
        <timer timeout="1000" forceDropOnTimeout="true"/>
        <inside objectId="robot1" regionId="start_zone"/>
    </conditions>
    <trigger>
        <success/>
    </trigger>
</event>

Variable types and arithmetic operations

Variable or operation

Description

Integer, fractional, string, and boolean constants.

Variable value.

Get the object state.

Get the meta-type of the object with the specified identifier.

Unary arithmetic functions that have exactly one child, which must be an integer value.

Binary arithmetic functions that have exactly two child elements, each of them must be an integer.

<int/>, <double/>, <string>, <bool/>

Setting a constant.

Attributes

Attribute

Description

value="0″

Constant value.

Syntax:

<int value="0"/>

<string value="finish"/>

<variableValue/>

Variable value.

It is possible to take the property of any variable using a dot. For example, "rect.width" will return the width of the rectangle stored in "rect".

Attributes

Attribute

Description

name="my_value"

Variable name

Syntax:

<variableValue name="rotation"/>

<objectState/>

Get the object state.

Attributes

Attribute

Description

object="robot1.display.labels.size"

Object ID

Syntax:

<objectState object="robot1.display.labels.first.text"/>

Example

<!-- Assign to the "rotation" variable the robots rotation angle -->
<setter name="rotation">
     <objectState object="robot1.rotation"/>
 </setter>
<!-- Checking if the "rotation" value equals to the robots rotation angle -->
<equals>
   <variableValue name="rotation"/>
   <objectState object="robot1.rotation"/>
</equals>

<typeOf/>

Get the objects with specified ID meta-type. For example, the type of the wall object with id=777 will be wall.

Most often, this element will be needed to check the type of connected sensors and motors.

Attributes

Attribute

Description

objectId="id"

Objects unique ID.

Syntax:

<typeOf objectId="robot1.A3"/>

<minus>..</minus>, <abs>...</abs>

Unary arithmetic operations for changing the sign and taking the modulus of a number.

Syntax:

<minus>
    <objectState object="robot1.rotation"/>
</minus>

<abs>
    <objectState object="robot1.rotation"/>
</abs>

Example:

<!-- Modulus of the difference of the "rotation" variable and the robots rotation angle -->
<abs>
    <difference>
        <variableValue name="rotation"/>
        <objectState object="robot1.rotation"/>
    </difference>
</abs>

<sum>, <difference>, <min>, <max>

Sum and difference of values. Minimum and maximum value.

Example:

<!-- The difference of the "rotation" variable and the robots rotation angle -->
<difference>
       <variableValue name="rotation"/>
       <objectState object="robot1.rotation"/>
</difference>

<!-- The sum of the "counter" variable and one -->
<sum>
       <variableValue name="counter"/>
       <int value="1"/>
</sum>

Triggers

Tag

Description

An action or a group of actions that will be performed one or many times after the event condition is met.

Display an error message. Finish checking the task.

Display success message, finish the check.

Set the variable value.

Setting or dropping the event.

<trigger>...</trigger>

An action or a group of actions that will be performed one or many times after the event condition is met.

Syntax:

<trigger>
	<success/>
</trigger>

<fail/>

Display an error message. Finish checking the task.

Attributes

Attribute

Description

message="Wrong answer!"

Error message text

Syntax:

<fail message="Wrong answer!"/>

<success/>

The task is successfully done.

Attributes

Attribute

Description

deffered="false"

Optional. The default value is "false". If set to "true" the trigger won't stop the program, I. e. the checker will wait until the program finishes and either reports the success if there were no errors, or otherwise, it will finish with an error. In other words, you won't get the error "The program has finished, but the task is not completed": the program will either terminate successfully or with a meaningful error like "Time limit exceeded".

Syntax:

<success/>

<setter>...</setter>

Set the variable value.

Attributes

Attribute

Description

name="my_value"

Variable name

Example:

<!-- Creating the "total_score" variable with the value of zero -->
<setter name="total_score">
       <int value="0"/>
 </setter>

<!-- Addind 2 to the "total_score" -->
<setter name="total_score">
       <sum>
              <variableValue name="total_score"/>
              <int value="2"/>
       </sum>
</setter>

<setUp/>, <drop/>

Setting up or dropping an event.

Attributes

Attribute

Description

id="finish checker"

The ID of the event.

Example:

<!-- Set up the "finish checker" event -->
<triggers>
				<setUp id="finish checker"/>
</triggers>

Sensor names

TRIK Robot Sensors

Name

Description

twoDModel::robotModel::parts::RangeSensor

Distance sensor

trik::robotModel::twoD::parts::TwoDLightSensor

Light sensor

twoDModel::robotModel::parts::TouchSensor

Touch sensor

trik::robotModel::twoD::parts::LineSensor

Line sensor

Lego EV3 Robot sensors

Name

Description

twoDModel::robotModel::parts::RangeSensor

Distance sensor

twoDModel::robotModel::parts::LightSensor

Light sensor

twoDModel::robotModel::parts::TouchSensor

Touch sensor

twoDModel::robotModel::parts::ColorSensorRed

Color sensor (red)

twoDModel::robotModel::parts::ColorSensorGreen

Color sensor (green)

twoDModel::robotModel::parts::ColorSensorBlue

Color sensor (blue)

twoDModel::robotModel::parts::ColorSensorPassive

Color sensor (passive)

twoDModel::robotModel::parts::ColorSensorFull

Color sensor EVX/NXT (color)

twoDModel::robotModel::parts::ColorSensorAmbient

Color sensor EV3 (ambient)

ev3::robotModel::twoD::parts::GyroscopeSensor

Gyroscope

ev3::robotModel::twoD::parts::GyroscopeSensor

Compass

Additional robot properties

Property

Description

robot1.rotation

A current robot's rotation angle

robot1.x and robot1.y

Robots coordinate

robot1.led.color

LED color

robot1.marker.isDown

Checks if the robot has a marker and it draws a line on the field. Returns "true" or "false".

robot1.shell.lastPhrase

Get the last robots phrase.

Working with the controller display

Property

Description

robot1.display.sadSmiles

Checks if there is a sad smile on the controller display. Returns "true" or "false".

robot1.display.smiles

Checks if there is a happy smile on the controller display. Returns "true" or "false".

robot1.display.labels.first.text

Message (label) text that was displayed first.

robot1.display.labels.last.text

Message (label) text that was displayed last.

robot1.display.labels.size

Get the displayed label number.

Example

Checking that the word “message” was displayed on the controller screen. The case is important.

<equals>
        <objectState object="robot1.display.labels.first.text"/>
        <string value="message"/>
</equals>

Restrictions example

You need to start in the blue square then drive along the wall to the red one using the IR distance sensor.

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <world>
      <background />
      <walls>
         <!-- The wall-->
         <wall id="{wall1}" end="300:150" begin="0:100" />
         <wall id="{wall2}" end="550:100" begin="300:150" />
         <wall id="{wall3}" end="650:200" begin="550:100" />
         <wall id="{wall4}" end="850:300" begin="650:200" />
         <wall id="{wall5}" end="1200:300" begin="850:300" />
         <wall id="{wall6}" end="1600:50" begin="1200:300" />
      </walls>
      <skittles />
      <balls />
      <colorFields />
      <images />
      <regions>
         <!-- Regions-->
         <region visible="true" id="finish" x="1300" color="#ff0000" text="Finish" type="rectangle" width="300" textX="0" textY="0" y="-200" filled="true" height="300" />
         <region visible="true" id="start_zone" x="-50" color="#0000ff" text="Start" type="rectangle" width="150" textX="0" textY="0" y="100" filled="true" height="-150" />
         <region visible="false" id="warzone_1" x="-50" color="#ffff00" text="warzone1" type="rectangle" width="650" textX="0" textY="0" y="-50" filled="true" height="200" />
         <region visible="false" id="warzone_2" x="600" color="#ffff00" text="warzone2" type="rectangle" width="250" textX="0" textY="0" y="0" filled="true" height="250" />
         <region visible="false" id="warzone_3" x="850" color="#ffff00" text="warzone3" type="rectangle" width="750" textX="0" textY="0" y="50" filled="true" height="250" />
      </regions>
   </world>
   <robots>
      <!-- Robot description -->
      <robot id="trikKitRobot" position="0:0" direction="0">
         <sensors>
            <sensor port="A1###input###А1###sensorA1" position="75:25" type="trik::robotModel::parts::TrikInfraredSensor" direction="45" />
            <sensor port="M3###output###JM3$$$C$$$3###" position="75:25" type="kitBase::robotModel::robotParts::Motor" direction="0" />
            <sensor port="M4###output###JM4$$$D$$$4###" position="75:25" type="kitBase::robotModel::robotParts::Motor" direction="0" />
         </sensors>
         <startPosition id="{ee2c46c1-23fc-4cda-98f4-77d9de775305}" x="25" y="25" direction="0" />
         <wheels left="M3###output###М3###" right="M4###output###М4###" />
      </robot>
   </robots>
   <constraints>
      <!-- Time limit (30 seconds) -->
      <timelimit value="30000" />
      <!-- Spatial restriction of the start region. Checks once at the program start -->
      <constraint checkOnce="true" failMessage="The robot must be inside the blue square at the start!">
         <inside regionId="start_zone" objectId="robot1" />
      </constraint>
      <!-- Sensors type and presence restriction -->
      <constraint checkOnce="true" failMessage="Only the IR distance sensor must be connected to the A1 port">
         <conditions glue="and">
            <equals>
               <typeOf objectId="robot1.A1" />
               <string value="trik::twoDModel::robotModel::parts::RangeSensor" />
            </equals>
            <equals>
               <typeOf objectId="robot1.A2" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.A3" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.A4" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.A5" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.A6" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.D1" />
               <string value="undefined" />
            </equals>
            <equals>
               <typeOf objectId="robot1.D2" />
               <string value="undefined" />
            </equals>
         </conditions>
      </constraint>
      <!-- Robot ride control -->
      <constraint failMessage="The robot tried to move out of the permitted area!">
         <conditions glue="or">
            <inside regionId="warzone_1" objectId="robot1" />
            <inside regionId="warzone_2" objectId="robot1" />
            <inside regionId="warzone_3" objectId="robot1" />
         </conditions>
      </constraint>
      <!-- An event that checks if the robot has entered the finish area -->
      <event settedUpInitially="true">
         <condition>
            <timer timeout="100" forceDropOnTimeout="true" />
         </condition>
         <trigger>
            <setUp id="finish checker" />
         </trigger>
      </event>
      <!-- Event reporting the successful finish -->
      <event id="finish checker" settedUpInitially="false">
         <condition>
            <inside regionId="finish" objectId="robot1" />
         </condition>
         <trigger>
            <success />
         </trigger>
      </event>
   </constraints>
</root>

An event is just a pair (, ).

Now lets talk about the conditions in the and elements. Conditions are set using the tag if only one of the is tested, or the tag if a compound condition is tested.

, , ,

editing an XML file
exercises
Constraint description structure
Conditions
Atomic conditions
Variable types and arithmetic operations
Triggers
Sensor names
Additional robot properties
Working with the controller screen
Restrictions example
<constraints>...</constraints>
condition
trigger
<constraint>
<event>
<condition>
atomic conditions
<conditions>
timelimit
constraint
event
init
equals
notEqual
greater
less
inside
settedUp and dropped
timer
int, double, string, bool
variableValue
objectState
typeOf
minus, abs
sum, difference, min, max
trigger
fail
success
setter
setUp, drop