Wiki | Home | Documentation | Tutorials | Qualifiers | Finals
- Wiki | Documentation | YAML Configuration Files
This page describes how to configure the simulated workcell environment by selecting and placing sensors. Moreover, during development, competitors will find it useful to create new or update existing trial configuration files in order to configure the behavior and the challenges during trials. Therefore, this page consists of a section describing each field of a trial configuration file. Trial and user configuration files are YAML formatted files.
- A trial configuration file details specifics of a particular trial of the competition. In a trial configuration file, ARIAC organizers can describe orders, shipments, agility challenges, and the location of parts in the environment. These files are used to test competitors' systems during the qualifier and final rounds. Configuration files are located in the nist_gear/config directory.
- A user configuration file is a file created by each competitor which describes the type and the location of each sensor in the workcell. During the qualifier and final rounds, one single user configuration file will be used for all the trials. User configuration files should be placed in the nist_gear/config/user_config directory.
Both these files are passed to the sample_environment.launch
file (see code snippet below).
<node name="ariac_sim" pkg="nist_gear" type="gear.py"
args="--development-mode
$(arg verbose_args)
$(arg state_logging_args)
$(arg gui_args)
$(arg load_moveit_args)
$(arg load_gantry_moveit_args)
$(arg load_kitting_moveit_args)
$(arg fill_demo_shipment_args)
--visualize-sensor-views
-f $(find nist_gear)/config/trial_config/sample_test.yaml
$(find nist_gear)/config/user_config/sample_user_config.yaml
" required="true" output="screen" />
Competitors are allowed to select the quantity, type, and location of sensors.Sensors can only be placed in static locations, they cannot be attached to the robots (unless done by the organizers themselves) or otherwise be moved around the environment. Choices of sensors must be written using the YAML syntax. A sensor's position and orientation is specified in global coordinates using and XYZ vector and Euler angles (roll, pitch, yaw).
The configuration YAML file contains a list of sensors denoted by the sensors:
tag. Each sensor should have a unique name followed by the type of sensor and the sensor's position and orientation. Available sensor types include:
- break_beam
- proximity
- logical_camera
- laser_profiler
- depth_camera
- rgbd_camera
An example of a user configuration file is shown below:
sensors:
logical_camera_0:
type: logical_camera
pose:
xyz: [-2.515033, 2.925223, 1.82]
rpy: [-1.570796, 1.570796, 0]
breakbeam_0:
type: break_beam
pose:
xyz: [-0.557152, 4.485425, 0.879306]
rpy: [0, 0, -1.557900]
By default, the view of the sensors in the Gazebo simulation will not be displayed. Enabling the sensor visualization may be useful while you are decided where to place sensors in the world. Competitors can enable sensor visualization by adding --visualize-sensor-views
in the launch file (as seen in sample_environment.launch
file above).
This is covered by the sensor interface tutorial.
Each trial of the competition is specified using a separate configuration file. A number of example trials are provided with the ARIAC software in the nist_gear/config/trial_config
directory. Each config file has a description of its behavior at the top of the file, e.g.:
#Number of orders: 1
#Tasks: kitting
#Number of shipments: 1
#Insufficiently many products: No
#Part re-orientation: No
#In-process order update: No
#Dropped products: Yes
#In-process order interruption: No
#Faulty products: No
#Sensor blackout: No
#Time limit: No
These config files can be used to practice with the various agility challenges.
This section describes the different fields that can be found in trial configuration files. Some of these fields are optional and work only in development mode. Various settings can be specified, including:
- The number of orders.
- The number of shipments per order.
- The product types and pose in each shipment.
- Location to build the shipments (AGVs or briefcases).
- The location of AGVs in the workcell.
- The models in each bin, in briefcases, and on AGVs (type and pose).
- Agility challenges:
- Which products are faulty products.
- What causes the high-priority order to be announced.
- Which products should be used in faulty gripper,
- Which robot to disable and when.
- When to trigger faulty sensors and how long does it last.
- Which parts need to be flipped.
An example of a trial configuration file is given below. This file consists of all the possible fields and are explained a little farther down in this section.
options:
insert_models_over_bins: true
insert_models_over_stations: true
belt_population_cycles: 15
enable_robot_camera: true
time_limit: -1
agv_infos:
agv1:
location: ks1
agv2:
location: ks2
agv3:
location: ks3
agv4:
location: as3
products:
part_0:
type: assembly_pump_blue
pose:
xyz: [0.15, -0.1, 0]
rpy: [0, 0, 0]
part_1:
type: assembly_battery_green
pose:
xyz: [0.0, 0, 0]
rpy: [0, 0, 0]
orders:
order_0:
priority: 1
kitting_robot_health: 1
assembly_robot_health: 1
disable_robot: [kitting_robot, as3, 1]
announcement_condition: time
announcement_condition_value: 0.0
kitting:
shipment_count: 1
agvs: [agv2]
destinations: [as1]
products:
part_0:
type: assembly_battery_blue
pose:
xyz: [0.1, 0.1, 0]
rpy: [0, 0, 0]
part_1:
type: assembly_regulator_red
pose:
xyz: [0.15, 0.0, 0]
rpy: [0, 0, 'pi/4']
assembly:
shipment_count: 1
stations: [as3]
products:
part_0:
type: assembly_pump_blue
pose:
xyz: [-0.032465, 0.174845, 0.15]
rpy: [0, 0, 0]
part_1:
type: assembly_battery_green
pose:
xyz: [0.032085, -0.152835, 0.25]
rpy: [0, 0, 0]
order_1:
priority: 3 # default is 1 if omitted, we could omit this line
kitting_robot_health: 1 # information on health for kitting robot
assembly_robot_health: 1 # information on health for assembly robot
announcement_condition: unwanted_products
announcement_condition_value: 1
kitting:
shipment_count: 1
agvs: [agv3]
destinations: [as4]
products:
part_0:
type: assembly_sensor_blue
pose:
xyz: [0.1, 0.1, 0]
rpy: ['pi/2', 0, 0]
models_over_bins:
bin1:
models:
assembly_battery_blue:
xyz_start: [0.2, 0.2, 0.0]
xyz_end: [0.4, 0.4, 0.0]
rpy: [0, 0, 'pi/4']
num_models_x: 2
num_models_y: 2
bin4:
models:
assembly_battery_red:
xyz_start: [0.2, 0.2, 0.0]
xyz_end: [0.4, 0.4, 0.0]
rpy: [0, 0, 'pi/4']
num_models_x: 2
num_models_y: 2
models_over_stations:
as4:
models:
assembly_battery_green:
xyz: [-0.032465, 0.174845, 0.15]
rpy: [0, 0, 0]
belt_models:
assembly_pump_blue:
1.0:
pose:
xyz: [0.0, 4.3, 0.92]
rpy: [0, 0, 'pi/2']
assembly_regulator_red:
2.0:
pose:
xyz: [0.0, 4.3, 0.92]
rpy: [0, 0, 'pi/2']
faulty_products:
- assembly_battery_blue_2
- assembly_regulator_red_1
drops:
drop_regions:
shipping_box_0_impeding:
frame: agv3::kit_tray_3
min:
xyz: [-0.3, -0.3, 0.0]
max:
xyz: [0.3, 0.3, 0.5]
destination:
xyz: [0.3, 0.3, 0.05]
rpy: [0, 0, 0.2]
product_type_to_drop: assembly_regulator_red
shipping_box_1_impeding:
frame: agv3::kit_tray_3
min:
xyz: [-0.3, -0.3, 0.0]
max:
xyz: [0.3, 0.3, 0.5]
destination:
xyz: [0.3, 0.3, 0.05]
rpy: [0, 0, 0.2]
product_type_to_drop: assembly_sensor_blue
sensor_blackout:
product_count: 1 #sensor blackout triggered after second product is placed
duration: 50
options:
insert_models_over_bins: true
insert_models_over_stations: true
belt_population_cycles: 15
enable_robot_camera: true
time_limit: -1
The options:
field is used for optional parameters.
insert_models_over_bins
allows models in bins to spawn in the workcell.insert_models_over_stations
allows to start the trial with briefcases partially filled with some parts. Competitors will need to complete the briefcases with missing parts for the ventilators.belt_population_cycles
informs how many parts will spawn on the belt. In this example, 15 parts. This option is linked with the fieldbelt_models
. Setting the value for this field to 0 will deactivate the belt for this trial.enable_robot_camera
is used to enable/disable the camera mounted on the gantry torso. See the section on Sensor Interface to learn about this camera.time_limit
dictates how long competitors have to complete the trial.-1
: No time limit.500
: Time limit used during qualifiers and finals (in simulation seconds unit).
agv_infos:
agv1:
location: ks1
agv2:
location: ks2
agv3:
location: ks3
agv4:
location: as3
products:
part_0:
type: assembly_pump_blue
pose:
xyz: [0.15, -0.1, 0]
rpy: [0, 0, 0]
part_1:
type: assembly_battery_green
pose:
xyz: [0.0, 0, 0]
rpy: [0, 0, 0]
The agv_infos
field is mandatory. It describes the location of each AGV (agv1
, agv2
, agv3
, and agv4
) when a trial starts. Each AGV has 3 different locations (as seen in the Table below) where ks
stands for kitting station and as
stands for assembly station.
agv1 |
agv2 |
agv3 |
agv4 |
|
---|---|---|---|---|
ks1 |
x | |||
ks2 |
x | |||
ks3 |
x | |||
ks4 |
x | |||
as1 |
x | x | ||
as2 |
x | x | ||
as3 |
x | x | ||
as4 |
x | x |
The products
field is optional and describes products located in AGV trays. When the products
field is used, each part's type (type
) and pose pose
(xyz
and rpy
) must be present. The pose is referenced in the tray frame. Note that each part must be represented by a unique id (part_0
and part_1
in this example).
orders:
order_0:
priority: 1
kitting_robot_health: 1
assembly_robot_health: 1
disable_robot: [kitting_robot, as3, 1]
announcement_condition: time
announcement_condition_value: 0.0
kitting:
shipment_count: 1
agvs: [agv2]
destinations: [as1]
products:
part_0:
type: assembly_battery_blue
pose:
xyz: [0.1, 0.1, 0]
rpy: [0, 0, 0]
part_1:
type: assembly_regulator_red
pose:
xyz: [0.15, 0.0, 0]
rpy: [0, 0, 'pi/4']
assembly:
shipment_count: 1
stations: [as3]
products:
part_0:
type: assembly_pump_blue
pose:
xyz: [-0.032465, 0.174845, 0.15]
rpy: [0, 0, 0]
part_1:
type: assembly_battery_green
pose:
xyz: [0.032085, -0.152835, 0.25]
rpy: [0, 0, 0]
order_1:
priority: 3 # default is 1 if omitted, we could omit this line
kitting_robot_health: 1 # information on health for kitting robot
assembly_robot_health: 1 # information on health for assembly robot
announcement_condition: unwanted_products
announcement_condition_value: 1
kitting:
shipment_count: 1
agvs: [agv3]
destinations: [as4]
products:
part_0:
type: assembly_sensor_blue
pose:
xyz: [0.1, 0.1, 0]
rpy: ['pi/2', 0, 0]
This field is mandatory and consists of at least one order. Each order must have a unique id, with the first order being order_0
and the second order being order_1
. Situations where the current order must be updated will be signaled with the _update
suffix (e.g., order_0_update
).
priority
: This field informs on the priority of the order. If this field is not provided then the priority of the order is 1. In the example, we could have omitted the linepriority: 1
. However, if an order is of high priority, such asorder_1
in the example, we must set thepriority
field, otherwise it would be set to 1 by default.kitting_robot_health
andassembly_robot_health
describe whether the kitting and assembly robots are enabled (1
) or disabled (0
). These two fields are optional and if not used, their values are set to1
. In this example, when the first order is announced, both robots are enabled. Inorder_1
both robots are also enabled.disable_robot
: This field is optional but when provided it will disable one of the two robots when a certain condition is reached. In this example, the kitting robot will be disabled as soon as one part is placed in the briefcase located at assembly station 3. A new message will be published on the topicariac/robot_health
, setting the status of the kitting robot toFalse
. NOTE: This field can not appear twice in the same order.announcement_condition
andannouncement_condition_value
informs GEAR when to announceorder_0
. In this example the order will be announced attime = 0.0
, that is, as soon as the serviceariac/start_competition
is called. There are three other possibilities forannouncement_condition
, they arewanted_products
,unwanted_products
, andagv<id>_at_as<id>
(see Competition Specifications for more information on these fields).
The kitting
and assembly
fields are both shipments. In this example, order_0
consists of two shipments, a kitting
shipment which needs to be submitted by delivering an AGV to an assembly station and an assembly
shipment which needs to be submitted "in place" (nothing moves in the environment when an assembly
shipment is submitted).
-
kitting
field.-
All the fields in the
kitting
field are mandatory.shipment_count
specifies how many times akitting
shipment must be submitted,agvs
informs on the AGV to use for this shipment, anddestinations
informs on the assembly station that the shipment must be delivered.agvs
anddestinations
must have the same number of items and there is a one to one match. For instance, if this shipment was to be submitted twice (shipment_count: 2
), then we would have two entries foragvs
and two entries fordestinations
. The first entry foragvs
pairs with the first entry indestinations
and the second entry inagvs
pairs with the second entry indestinations
. NOTE:destinations
must be one of the two assembly stations for the given AGV (see Table above). An error will be raised if a non-reachable assembly station is provided for the given AGV. -
products
describes the products' types and poses that need to be placed in the tray reference frame.kitting: shipment_count: 1 agvs: [agv2] destinations: [as1] products: part_0: type: assembly_battery_blue pose: xyz: [0.1, 0.1, 0] rpy: [0, 0, 0] part_1: type: assembly_regulator_red pose: xyz: [0.15, 0.0, 0] rpy: [0, 0, 'pi/4']
-
-
assembly
field.-
The subfields for this field are also mandatory and have the same meanings as the subfields for the
kitting
field. Thestations
field informs competitors where the assembly must be performed. The number of entries forstations
has to match the value for the fieldshipment_count
.assembly: shipment_count: 1 stations: [as3] products: part_0: type: assembly_pump_blue pose: xyz: [-0.032465, 0.174845, 0.15] rpy: [0, 0, 0] part_1: type: assembly_battery_green pose: xyz: [0.032085, -0.152835, 0.25] rpy: [0, 0, 0]
-
models_over_bins:
bin1:
models:
assembly_battery_blue:
xyz_start: [0.2, 0.2, 0.0]
xyz_end: [0.4, 0.4, 0.0]
rpy: [0, 0, 'pi/4']
num_models_x: 2
num_models_y: 2
bin4:
models:
assembly_battery_red:
xyz_start: [0.2, 0.2, 0.0]
xyz_end: [0.4, 0.4, 0.0]
rpy: [0, 0, 'pi/4']
num_models_x: 2
num_models_y: 2
This field is optional (products can spawn on the conveyor belt only) and informs the type and the configuration of products in bins. All the subfields for this field are mandatory. The models
field describes the products and their configuration within a matrix. In this example, there are 4 products in each bin (num_models_x
num_models_y
). While the position of each product is not explicitly specified, their orientation is set with the subfield rpy
.
models_over_stations:
as4:
models:
assembly_battery_green:
xyz: [-0.032465, 0.174845, 0.15]
rpy: [0, 0, 0]
This field is optional. When used, all the subfields for this field are mandatory. The first subfield (as4
) informs GEAR to place parts in a briefcase. Competitors will only need to place the missing parts to complete the ventilators.
belt_models:
assembly_pump_blue:
1.0:
pose:
xyz: [0.0, 4.3, 0.92]
rpy: [0, 0, 'pi/2']
assembly_regulator_red:
2.0:
pose:
xyz: [0.0, 4.3, 0.92]
rpy: [0, 0, 'pi/2']
For this field to be used by GEAR, the option belt_population_cycles
must be set to non-zero. In our example, belt_population_cycles: 15
will spawn 15 parts (30 parts in total) for each part type defined in belt_models
. In the code snippet provided above, the belt will spawn two different part types. The firs part (assembly_pump_blue
) will spawn 1 s after the competition starts, 2 s after the first part spawns, an assembly_regulator_red
will spawn. Another assembly_pump_blue
will spawn 1 s after assembly_regulator_red
is spawned and so forth. In trials, the belt will only spawn one part type and not two, as shown in the example.
faulty_products:
- assembly_battery_blue_2
- assembly_regulator_red_1
This field informs GEAR which products in the environment are faulty and is used to set the Faulty Product challenge. The subfields consist of parts with the same ids as parts found in the simulation environment.
drops:
drop_regions:
shipping_box_0_impeding:
frame: agv3::kit_tray_3
min:
xyz: [-0.3, -0.3, 0.0]
max:
xyz: [0.3, 0.3, 0.5]
destination:
xyz: [0.3, 0.3, 0.05]
rpy: [0, 0, 0.2]
product_type_to_drop: assembly_regulator_red
shipping_box_1_impeding:
frame: agv3::kit_tray_3
min:
xyz: [-0.3, -0.3, 0.0]
max:
xyz: [0.3, 0.3, 0.5]
destination:
xyz: [0.3, 0.3, 0.05]
rpy: [0, 0, 0.2]
product_type_to_drop: assembly_sensor_blue
This field is used for the Faulty Gripper challenge and informs which part types to drop and where in the tray frame. This can be easily customized to drop parts anywhere in the tray or even on the floor.
sensor_blackout:
product_count: 1 #sensor blackout triggered after second product is placed
duration: 50
This field is used to trigger the Faulty Sensor challenge. The condition to start the challenge is described with product_count
and duration
describes how long the sensors stay disabled (in simulation seconds). In this example, the challenge starts as soon as one product is placed on any AGV. The NIST organizers will decide whether this challenge can be triggered during kitting.
- The real-time factor of a scenario is impacted by the number of models in the environment.
- For users experiencing low real-time factors, reducing the number of products that are in the scenario will help.
- If you are focusing on grasping products from the bins, you can set
belt_population_cycles
to0
to avoid spawning parts on the conveyor belt. - If you are focusing on grasping products from a particular bin, you can comment out the other bins listed in
models_over_bins
to temporarily not spawn them. - If you are focusing on grasping products from a particular shelf, you can comment out the other shelves listed in
models_over_shelves
to temporarily not spawn them.
- If you are focusing on grasping products from the bins, you can set
Wiki | Home | Documentation | Tutorials | Qualifiers | Finals