.. _TRIALS: =================== Configuration Files =================== Configuration files are described in the YAML format. YAML is a human-readable data serialization format. It is commonly used for configuration files and in applications where data is being stored or transmitted. For more information on YAML, see the `YAML website `_. -------------------- Sensor Configuration -------------------- The sensor configuration file is defined by the competitor and describes the location of sensors added to the competition environment. :numref:`sensor-config` shows an example of a sensor configuration file with one of each of the different possible sensors. The first field in the yaml file is :yamlname:`robot_cameras`. This is an optional field in the sensor configuration file. If this field is not present in the file, cameras will not be activated. Alternatively the :yamlname:`active` field can be used to enable or disable a camera for either robot. Last the :yamlname:`type` field should be either :yaml:`rgb` or :yaml:`rgbd`. The second field in the configuration file is :yamlname:`static_sensors`. This field should contain all the static sensors that the competitor wants to add. Static sensors each have four fields: 1. A name (e.g. :yamlname:`right_bins_camera`). This name has to be unique among all sensors in the same configuration file. 2. A type (e.g. :yamlname:`rgb_camera`). This type has to be one of the following types described in the section :ref:`STATIC_SENSORS`. 3. A pose defined in the world frame: * A position :yamlname:`xyz`. This should be a list with three elements representing the x, y, and z coordinates for the sensor origin. * An orientation :yamlname:`rpy`. This should be a three element list containing the roll, pitch and yaw of the sensor using `this convention `_ . The orientation should be defined in radians using either floating-point values or with the :yaml:`pi` constant (:yaml:`pi`, :yaml:`pi/2`, :yaml:`pi/4`, etc). 4. A toggle for visualizing the sensor field of view :yamlname:`visualize_fov`. This field is optional and if not present the default is :yaml:`false`. .. code-block:: yaml :caption: Example of a sensor configuration file :name: sensor-config robot_cameras: floor_robot_camera: active: true type: rgb ceiling_robot_camera: active: true type: rgbd static_sensors: breakbeam_0: type: break_beam visualize_fov: true pose: xyz: [-0.35, 3, 0.95] rpy: [0, 0, pi] proximity_sensor_0: type: proximity visualize_fov: true pose: xyz: [-0.573, 2.84, 1] rpy: [pi/2, pi/6, pi/2] laser_profiler_0: type: laser_profiler visualize_fov: true pose: xyz: [-0.573, 1.486, 1.526] rpy: [pi/2, pi/2, 0] lidar_0: type: lidar visualize_fov: false pose: xyz: [-2.286, -2.96, 1.8] rpy: [pi, pi/2, 0] rgb_camera_0: type: rgb_camera visualize_fov: false pose: xyz: [-2.286, 2.96, 1.8] rpy: [pi, pi/2, 0] rgbd_camera_0: type: rgbd_camera visualize_fov: false pose: xyz: [-2.286, 4.96, 1.8] rpy: [pi, pi/2, 0] basic_logical_camera_0: visualize_fov: false type: basic_logical_camera pose: xyz: [-2.286, 2.96, 1.8] rpy: [pi, pi/2, 0] ------------------- Trial Configuration ------------------- The trial configuration file contains all the information that the :term:`AM ` uses to run a given trial. This includes part and kit tray information, orders, and challenges. :numref:`trial-config` shows an example of a trial configuration file with all of the possible fields. Fields ====== :yamlname:`time_limit`, :yaml:`Float` ------------------------------------- The time limit is a positive floating point number that represents the number of seconds that the competitor has to complete the trial. At the end of the time limit the competition will end automatically. :yamlname:`kitting_trays`, :yaml:`Dictionary` --------------------------------------------- This section defines the kit trays that will be spawned onto the kit tray stations at the start of simulation. * :yamlname:`tray_ids`, :yaml:`List`: The IDs of the all the trays to be spawned (0-9). Several trays can have the same ID. * :yamlname:`slots`, :yaml:`List`: The slots on the kitting tray station where the trays will be spawned (kts1: 0-3, kts2: 4-6). Slots must be unique. .. note:: The :yamlname:`tray_ids` and :yamlname:`slots` lists should be the same length. :yamlname:`assembly_inserts`, :yaml:`Dictionary` ------------------------------------------------ This section defines the rotation for each of the assembly station inserts. * :yamlname:`as{n}`, :yaml:`Float` or :yaml:`String`: Rotation in radians of assembly insert n (1-4). Pi strings can be used. :yamlname:`parts`, :yaml:`Dictionary` ------------------------------------- This section defines all the parts that will be spawned into the environment. * :yamlname:`agvs`, :yaml:`Dictionary`: Parts that will placed directly onto the AGV at the start of the simulation. These parts are directly related to the assembly order and will be filled out automatically based on the assembly order if using the trial_generator. * :yamlname:`agv{n}`, :yaml:`Dictionary`: The AGV that will have parts (n: 1-4). Multiple agvs may have parts. * :yamlname:`tray_id`, :yaml:`Integer`: The ID of the kitting tray (0-9) that will be placed on the AGV. Parts on AGVs should always be placed onto a kit tray. * :yamlname:`parts`, :yaml:`List`: Parts that will be spawned on the tray. * :yamlname:`type`, :yaml:`String`: The type of the part (:yaml:`'sensor'`, :yaml:`'regulator'`, :yaml:`'pump'`, or :yaml:`'battery'`). * :yamlname:`color`, :yaml:`String`: The color of the part (:yaml:`'red'`, :yaml:`'blue'`, :yaml:`'green'`, :yaml:`'orange'`, or :yaml:`'purple'`). * :yamlname:`quadrant`, :yaml:`Integer`: The quadrant of the kit tray the part will be spawned onto (1-4). * :yamlname:`rotation`, :yaml:`Float` or :yaml:`String`: The rotation of the part in radians. Pi strings can be used. * :yamlname:`bins`, :yaml:`Dictionary`: Parts that will be placed into the bins at the start of the simulation. * :yamlname:`bin{n}`, :yaml:`Dictionary`: The bin that will have parts (n: 1-8). Multiple bins may have parts. * :yamlname:`type`, :yaml:`String`: The type of the part (:yaml:`'sensor'`, :yaml:`'regulator'`, :yaml:`'pump'`, or :yaml:`'battery'`). * :yamlname:`color`, :yaml:`String`: The color of the part (:yaml:`'red'`, :yaml:`'blue'`, :yaml:`'green'`, :yaml:`'orange'`, or :yaml:`'purple'`). * :yamlname:`rotation`, :yaml:`Float` or :yaml:`String`: The rotation of the part in radians. Pi strings can be used. * :yamlname:`flipped`, :yaml:`Boolean`: Whether the part will be flipped. If :yaml:`true` the z-axis of the part will face down instead of up. * :yamlname:`slots`, :yaml:`List`: The slots of the bin that this part can be found (1-9). Each slot should be unique for a given bin. * :yamlname:`conveyor_belt`, :yaml:`Dictionary`: Parts that will be spawned onto the conveyor when the competition is started. The cycle of parts will be repeated after all parts are spawned, up until the competition ends. * :yamlname:`active`, :yaml:`Boolean`: Whether the conveyor is active. This toggle is mostly used for testing to enable or disable the conveyor without removing all the parts. * :yamlname:`spawn_rate`, :yaml:`Integer`: The time in seconds between parts spawned on the conveyor. * :yamlname:`order`, :yaml:`String`: Either :yaml:`'sequential'` where all parts of the same type will appear before the next type, or :yaml:`'random'` where the parts will come out in a random order. * :yamlname:`parts_to_spawn`, :yaml:`Dictionary`: This is a list of part lots that will be found on the conveyor. * :yamlname:`type`, :yaml:`String`: The type of the part (:yaml:`'sensor'`, :yaml:`'regulator'`, :yaml:`'pump'`, or :yaml:`'battery'`). * :yamlname:`color`, :yaml:`String`: The color of the part (:yaml:`'red'`, :yaml:`'blue'`, :yaml:`'green'`, :yaml:`'orange'`, or :yaml:`'purple'`). * :yamlname:`number`, :yaml:`Integer`: The number of parts spawned with the selected :yamlname:`type`, :yamlname:`color`, :yamlname:`offset`, :yamlname:`flipped`, and :yamlname:`rotation`. * :yamlname:`offset`, :yaml:`Float`: The position on the conveyor belt. Positive offset is further from the bins and negative offset is closer to the bins. This value should be between -1.0 and 1.0. * :yamlname:`flipped`, :yaml:`Boolean`: Whether the part will be flipped. If :yaml:`true` the z-axis of the part will face down instead of up. * :yamlname:`rotation`, :yaml:`Float` or :yaml:`String`: The rotation of the part in radians. Pi strings can be used. :yamlname:`orders` ------------------ * :yamlname:`id`, :yaml:`String`: Unique identifier for each order. String with a length of 8 characters. * :yamlname:`type`, :yaml:`String`: Determines the type of order. Possible values are :yaml:`'kitting'`, :yaml:`'assembly'`, and :yaml:`'combined'`. * :yamlname:`announcement`, :yaml:`Dictionary`: Determines under what condition the order will be announced. * :yamlname:`priority`, :yaml:`Boolean`: Determines whether the order is a regular order, :yaml:`false`, or a high priority order, :yaml:`true`. * :yaml:`task_info`: The information for the task based on the order :yamlname:`type`. Either :yamlname:`kitting_task`, :yamlname:`assembly_task`, or :yamlname:`combined_task` * :yamlname:`kitting_task`, :yaml:`Dictionary`: This is only used if :yamlname:`type` is set to :yaml:`'kitting'`. * :yamlname:`agv_number`, :yaml:`Integer`: The agv number for the agv used in the kitting order. * :yamlname:`tray_id`, :yaml:`Integer`: The tray ID which will be placed on the agv for the kitting order. * :yamlname:`destination`, :yaml:`String`: The destination for the agv after all parts are placed on it. Destination should always be set to :yaml:`warehouse`. * :yamlname:`products`, :yaml:`List`: The list of parts to be placed on the agv for the kitting order. Maximum of four. * :yamlname:`type`, :yaml:`String`: The type of the part (:yaml:`'sensor'`, :yaml:`'regulator'`, :yaml:`'pump'`, or :yaml:`'battery'`). * :yamlname:`color`, :yaml:`String`: The color of the part (:yaml:`'red'`, :yaml:`'blue'`, :yaml:`'green'`, :yaml:`'orange'`, or :yaml:`'purple'`). * :yamlname:`quadrant`, :yaml:`Integer`: The quadrant of the kitting tray which the part should be placed on. * :yamlname:`assembly_task`, :yaml:`Dictionary`: This is only used if :yamlname:`type` is set to :yaml:`'assembly'`. * :yamlname:`agv_number`, :yaml:`List`: List of agvs which will be used for the assembly order. * :yamlname:`station`, :yaml:`String`: The assembly station where the assembly of the breifcase will take place. * :yamlname:`products`, :yaml:`List`: The list of parts to be assembled in the breifcase. Maximum of four. * :yamlname:`type`, :yaml:`String`: The type of the part (:yaml:`'sensor'`, :yaml:`'regulator'`, :yaml:`'pump'`, or :yaml:`'battery'`). * :yamlname:`color`, :yaml:`String`: The color of the part (:yaml:`'red'`, :yaml:`'blue'`, :yaml:`'green'`, :yaml:`'orange'`, or :yaml:`'purple'`). * :yamlname:`assembled_pose`, :yaml:`Dictionary`: The position and orientation of the part relative to the breifcase frame. * :yamlname:`xyz`, :yaml:`List`: A list of position coordinates of the part assembly pose relative to the breifcase frame. * :yamlname:`rpy`, :yaml:`List`: A list of orientation values of the part assembly pose relative to the breifcase frame. * :yamlname:`assembly_direction`, :yaml:`List`: A unit vector in the breifcase frame. * :yamlname:`combined_task`, :yaml:`Dictionary`: This is only used if :yamlname:`type` is set to :yaml:`'combined'`. * :yamlname:`station`, :yaml:`String`: The assembly station where the assembly of the breifcase will take place. * :yamlname:`products`, :yaml:`List`: The list of parts to be assembled in the breifcase. Maximum of four. * :yamlname:`type`, :yaml:`String`: The type of the part (:yaml:`'sensor'`, :yaml:`'regulator'`, :yaml:`'pump'`, or :yaml:`'battery'`). * :yamlname:`color`, :yaml:`String`: The color of the part (:yaml:`'red'`, :yaml:`'blue'`, :yaml:`'green'`, :yaml:`'orange'`, or :yaml:`'purple'`). * :yamlname:`assembled_pose`, :yaml:`Dictionary`: The position and orientation of the part relative to the breifcase frame. * :yamlname:`xyz`, :yaml:`List`: A list of position coordinates of the part assembly pose relative to the breifcase frame. * :yamlname:`rpy`, :yaml:`List`: A list of orientation values of the part assembly pose relative to the breifcase frame. * :yamlname:`assembly_direction`, :yaml:`List`: A unit vector in the breifcase frame. :yamlname:`challenges` ---------------------- * :yamlname:`dropped_part`, :yaml:`Dictionary`: Adds a dropped part challenge to the environment. * :yamlname:`robot`, :yaml:`String`: Determines which robot will drop the part. Options are :yaml:`'floor_robot'` or :yaml:`'ceiling_robot'`. * :yamlname:`type`, :yaml:`String`: Determines the type of part that will be dropped (:yaml:`'sensor'`, :yaml:`'regulator'`, :yaml:`'pump'`, or :yaml:`'battery'`). * :yamlname:`color`, :yaml:`String`: Determines the color of part that will be dropped (:yaml:`'red'`, :yaml:`'blue'`, :yaml:`'green'`, :yaml:`'orange'`, or :yaml:`'purple'`). * :yamlname:`drop_after`, :yaml:`Integer`: Determines the index of the part to drop after. For example, if :yamlname:`drop_after` is set to 2, the 3rd part the robot successfully picks will be dropped. * :yamlname:`delay`, :yaml:`Float`: Drops the part after the specified delay. * :yamlname:`robot_malfunction`, :yaml:`Dictionary`: Adds a robot malfunction challenge to the environment. * :yamlname:`duration`, :yaml:`Float`: Determines how long the robot malfunction will last. * :yamlname:`robots_to_disable`, :yaml:`List`: List of robots that can be disabled. Options are :yaml:`'floor_robot'` or :yaml:`'ceiling_robot'`. * :yamlname:`announcement`: One of the three :ref:`announcement conditions` * :yamlname:`time_condition`, :yaml:`Float`: After this amount of time has passed, the specified robot(s) will malfunction. * :yamlname:`part_place_condition`, :yaml:`Dictionary`: The robot malfunction starts after a part of a specific type and color is placed on a specified agv. * :yamlname:`type`, :yaml:`String`: The type of the part (:yaml:`'sensor'`, :yaml:`'regulator'`, :yaml:`'pump'`, or :yaml:`'battery'`). * :yamlname:`color`, :yaml:`String`: The color of the part (:yaml:`'red'`, :yaml:`'blue'`, :yaml:`'green'`, :yaml:`'orange'`, or :yaml:`'purple'`). * :yamlname:`agv`, :yaml:`Integer`: The agv number for the part place condition. * :yamlname:`submission_condition`: The robot malfunction will begin after the specified order has been submitted. * :yamlname:`order_id`, :yaml:`String`: ID of the order for the submission_condition. The robot malfunction will begin once the order associated with this order ID is submitted. * :yamlname:`sensor_blackout`, :yaml:`Dictionary`: Adds a sensor blackout challenge to the environment. * :yamlname:`duration`, :yaml:`Float`: Determines how long the sensor blackout will last. * :yamlname:`sensors_to_disable`, :yaml:`List`: List of sensors which will be disabled. Options are :yaml:`'break_beam'`, :yaml:`'proximity'`, :yaml:`'laser_profiler'`, :yaml:`'lidar'`, :yaml:`'camera'`, and :yaml:`'logical_camera'` * :yamlname:`announcement`: One of the three :ref:`announcement conditions`. See above. * :yamlname:`faulty_part`, :yaml:`Dictionary`: Adds a faulty part challenge to the environment. * :yamlname:`order_id`, :yaml:`String`: Specifies the order where the selected quadrants will have faulty parts at first. If faulty parts are removed and replaced with new parts, the new parts will be non-faulty. * :yamlname:`quadrant{n}`, :yaml:`Bool`: Specifies if quadrant :yaml:`n` has a faulty part or not. For example, if :yamlname:`quadrant1` is set to true, any first part placed in quadrant 1 is faulty. .. code-block:: yaml :caption: Example of a trial configuration file :name: trial-config :linenos: # Trial name: example.yaml # ARIAC2024 # Author: Justin Albrecht # 2024-01-03 14:23:37 # ENVIRONMENT SETUP time_limit: 500 # KITTING TRAYS kitting_trays: tray_ids: - 2 - 2 - 2 - 4 - 4 - 4 slots: - 1 - 2 - 3 - 4 - 5 - 6 # INSERT ROTATION assembly_inserts: as1: pi/3 as2: -pi/4 as3: 0.0 as4: pi/2 # PARTS INFORMATION parts: agvs: agv2: tray_id: 0 parts: - type: sensor color: blue quadrant: 1 rotation: 0.0 - type: pump color: blue quadrant: 2 rotation: 0.0 - type: regulator color: blue quadrant: 3 rotation: 0.0 - type: battery color: blue quadrant: 4 rotation: 0.0 bins: bin1: - type: sensor color: green rotation: pi/4 flipped: false slots: - 1 - 3 - 7 - 9 bin2: - type: pump color: purple rotation: 0.0 flipped: false slots: - 1 - 3 - 7 - 9 bin5: - type: battery color: orange rotation: 0.0 flipped: true slots: - 2 - 4 - 6 - 8 bin6: - type: regulator color: blue rotation: -pi flipped: false slots: - 2 - 4 - 6 - 8 conveyor_belt: active: true spawn_rate: 3.0 order: random parts_to_spawn: - type: sensor color: orange number: 3 offset: 0.2 flipped: false rotation: pi/3 - type: battery color: red number: 5 offset: 0.0 flipped: true rotation: 0.0 # ORDERS INFORMATION orders: - id: E414303S type: kitting announcement: time_condition: 0.0 priority: false kitting_task: agv_number: 1 tray_id: 2 destination: warehouse products: - type: sensor color: green quadrant: 1 - type: battery color: red quadrant: 2 - type: pump color: purple quadrant: 4 - id: YTDIGV7W type: assembly announcement: submission_condition: order_id: E414303S priority: false assembly_task: agv_number: - 2 station: as1 products: - type: sensor color: blue assembled_pose: xyz: - -0.1 - 0.395 - 0.045 rpy: - 0 - 0 - -pi/2 assembly_direction: - 0 - -1 - 0 - type: pump color: blue assembled_pose: xyz: - 0.14 - 0.0 - 0.02 rpy: - 0 - 0 - -pi/2 assembly_direction: - 0 - 0 - -1 - type: regulator color: blue assembled_pose: xyz: - 0.175 - -0.223 - 0.215 rpy: - pi/2 - 0 - -pi/2 assembly_direction: - 0 - 0 - -1 - type: battery color: blue assembled_pose: xyz: - -0.15 - 0.035 - 0.043 rpy: - 0 - 0 - pi/2 assembly_direction: - 0 - 1 - 0 - id: 7JADKH4U type: combined announcement: part_place_condition: color: purple type: pump agv: 1 priority: true combined_task: station: as3 products: - type: regulator color: blue assembled_pose: xyz: - 0.175 - -0.223 - 0.215 rpy: - pi/2 - 0 - -pi/2 assembly_direction: - 0 - 0 - -1 - type: sensor color: orange assembled_pose: xyz: - -0.1 - 0.395 - 0.045 rpy: - 0 - 0 - -pi/2 assembly_direction: - 0 - -1 - 0 # CHALLENGES INFORMATION challenges: - dropped_part: robot: floor_robot type: regulator color: blue drop_after: 0 delay: 0.5 - robot_malfunction: duration: 20.0 robots_to_disable: - floor_robot submission_condition: order_id: 7JADKH4U - sensor_blackout: duration: 20.0 sensors_to_disable: - logical_camera - camera time_condition: 100.0 - faulty_part: order_id: E414303S quadrant1: true Trial Generator GUI =================== Instructions to Start the Trial Generator ----------------------------------------- To run the ARIAC configuration GUI, first, install the dependencies with .. code-block:: sh cd ~/ariac_ws && pip install -r src/ARIAC/ariac_gui/requirements.txt After the dependencies are installed, run the GUI with .. code-block:: sh ros2 run ariac_gui trial_generator Start-Up Menu ------------- The first menu of the GUI gives two options. A new file can be created or an existing file can be loaded in and edited. When a file is loaded in, the GUI will be opened as usual, but all of the options will be loaded with those from the configuration file selected. .. figure:: ../images/file_creation_menu.png :width: 60% :align: center :alt: File Creation Menu File Creation Menu Setup Tab --------- The first tab of the GUI lets you edit the header of the configuration file. This includes the time limit, the trial name, and the name of the author. .. figure:: ../images/setup_menu.png :width: 60% :align: center :alt: Setup Menu Setup Menu Kitting Trays Tab ----------------- The second tab is the kitting trays menu. This menu lets you choose the kitting tray in each of the slots. When a kitting tray is selected, the kitting tray with the correct fiducial tag appears on the tables in the GUI. .. figure:: ../images/kitting_trays_menu.png :width: 60% :align: center :alt: Kitting Trays Menu Kitting Trays Menu Assembly Insert Rotation Tab ---------------------------- The third tab is the assembly insert rotation menu. At first, as long as a file with non-zero assembly insert rotations is not loaded in, this menu will be a button which states that all the inserts are currently set to 0.0. .. figure:: ../images/insert_initial_menu.png :width: 60% :align: center :alt: Assembly Inserts Initial Menu Assembly Inserts Initial Menu If this needs to be changed, press the button and four sliders appear, which allow you to change the rotation of each of the inserts. .. figure:: ../images/insert_slider_menu.png :width: 60% :align: center :alt: Assembly Inserts Slider Menu Assembly Inserts Slider Menu Bin Parts Tab ------------- The fourth tab is the bin parts menu. At the top of this menu, there is a dropdown menu which changes the bin being edited. On the left half of this menu, a diagram of the bin shows up with each slot acting as a button. If there is a part there, the button will be an figure of the part with the correct rotation. Clicking on a part allows it to be edited. If there is no part there, the button will be a plus sign. If this button is clicked, the add part menu will appear. On the right half of the menu, is a minimap which shows each of the bins. The one currently being edited will show up in blue and the others will be white. This minimap also shows the parts currently on each bin. Under the diagram and the minimap, there are two buttons. The top button allows for multiple parts to be added at the same time. The second button clears the selected bin. .. figure:: ../images/bins_menu.png :width: 60% :align: center :alt: Bins Menu Bins Menu Conveyor Parts Tab ------------------ The fifth tab is the conveyor parts menu. The top half of this menu has the basic conveyor settings, like spawn rate and whether the order is random or sequential. Under these options, there is an add part lot button, which adds parts to the conveyor belt. Under these settings, there is a scrollable sub-window with a list of the part lots currently on the conveyor belt. This list has buttons where the part lots can be edited or deleted. .. figure:: ../images/conveyor_parts_menu.png :width: 60% :align: center :alt: Conveyor Parts Menu Conveyor Parts Menu Orders Tab ---------- The sixth tab is the orders menu. There are three main buttons in this menu, the "Add kitting order", "Add assembly order", and "Add combined order". If any orders have already been created, a menu will show up under these buttons with edit and delete buttons. If no kitting trays have been selected, the GUI will not be able to create a kitting order. .. figure:: ../images/orders_menu.png :width: 60% :align: center :alt: Orders Menu Orders Menu Challenges Tab -------------- The seventh tab is the challenges menu. This menu can add any of the challenges available in the configuration file. Once challenges are made, they appear in a scrollable sub-window with edit and delete buttons for each of the challenges. .. figure:: ../images/challenge_menu.png :width: 60% :align: center :alt: Challenges Menu Challenges Menu Current File Tab ---------------- The eighth tab shows the current file in yaml format. This is updated live any time a change is made. .. figure:: ../images/current_file_menu.png :width: 60% :align: center :alt: Current File Tab Current File Tab Map Tab ------- The final tab is a map of the environment which shows each every part present on the AGVs, bins, and conveyor belt. It also shows the rotation of the assembly stations. To show the conveyor belt parts, set the "Show conveyor_parts" checkbox to true. The parts will move across the conveyor belt. Any time a part is added, edited, or deleted on the conveyor belt, the checkbox will automatically turn off. .. figure:: ../images/full_map_menu.png :width: 60% :align: center :alt: Full Map Menu Full Map Save Menu --------- To save the file, press the "Save file" button in the bottom left. If you loaded in a file at the beginning, you will be asked if you want to overwrite that file. .. figure:: ../images/overwrite_menu.png :width: 60% :align: center :alt: Overwrite Menu Overwrite Menu Otherwise, a file saving menu will appear. .. figure:: ../images/save_file_menu.png :width: 60% :align: center :alt: Save File Menu Save File Menu