diff --git a/docs/source/schema.rst b/docs/source/schema.rst index 6f9d69d9..bcb8c632 100644 --- a/docs/source/schema.rst +++ b/docs/source/schema.rst @@ -784,6 +784,15 @@ All of the following object types have the `pickupable` attribute by default. - x=0.9,y=0.36,z=0.42 - Right - Toy car + * - `"car_6"` + - car + - 0.5 + - + - + - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` + - x=1.06,y=0.58,z=0.54 + - Right + - Toy old-fashioned car * - `"cart_2"` - cart - 0.5 @@ -856,6 +865,24 @@ All of the following object types have the `pickupable` attribute by default. - x=0.195,y=0.036,z=0.134 - Forward - Suitcase + * - `"case_8"` + - case + - 5 + - X + - X + - :ref:`metal `, :ref:`plastic ` + - x=0.52,y=0.6,z=0.54 + - Forward + - + * - `"case_9"` + - case + - 5 + - X + - X + - :ref:`metal `, :ref:`plastic ` + - x=0.18,y=0.44,z=0.4 + - Forward + - * - `"crate_1"` - crate - 5 @@ -892,6 +919,24 @@ All of the following object types have the `pickupable` attribute by default. - x=0.76,y=0.74,z=0.88 - Forward - Cuboid wooden crate + * - `"crate_5"` + - crate + - 5 + - X + - X + - :ref:`wood ` + - x=0.82,y=1.44,z=0.82 + - Forward + - Cuboid wooden crate + * - `"crate_6"` + - crate + - 5 + - X + - X + - :ref:`wood ` + - x=0.9,y=1.68,z=1.06 + - Forward + - Cuboid wooden crate * - `"crayon_black"` - crayon - 0.125 @@ -1009,6 +1054,15 @@ All of the following object types have the `pickupable` attribute by default. - x=0.224,y=0.176,z=0.06 - Right - Toy duck on wheels + * - `"firetruck"` + - firetruck + - 0.5 + - + - + - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` + - x=1.2,y=0.4,z=0.54 + - Right + - Toy firetruck * - `"jeep"` - jeep - 0.5 @@ -1017,7 +1071,7 @@ All of the following object types have the `pickupable` attribute by default. - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` - x=0.06,y=0.057,z=0.098 - Forward - - Toy car + - Toy jeep * - `"military_case_1"` - case - 5 @@ -1054,6 +1108,33 @@ All of the following object types have the `pickupable` attribute by default. - x=0.86,y=0.32,z=0.68 - Forward - + * - `"military_case_5"` + - case + - 5 + - X + - X + - :ref:`metal `, :ref:`plastic ` + - x=1.3,y=1.1,z=1.04 + - Forward + - + * - `"military_case_6"` + - case + - 5 + - X + - X + - :ref:`metal `, :ref:`plastic ` + - x=0.7,y=0.76,z=0.72 + - Forward + - + * - `"military_truck"` + - truck + - 0.5 + - + - + - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` + - x=1.36,y=0.6,z=0.58 + - Forward + - Toy military truck * - `"pacifier"` - pacifier - 0.5 @@ -1108,6 +1189,24 @@ All of the following object types have the `pickupable` attribute by default. - x=0.07,y=0.06,z=0.15 - Forward - Toy racecar + * - `"racecar_2"` + - car + - 0.5 + - + - + - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` + - x=1.3,y=0.5,z=0.58 + - Forward + - Toy racecar + * - `"racecar_3"` + - car + - 0.5 + - + - + - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` + - x=1.0,y=0.52,z=0.5 + - Forward + - Toy racecar * - `"road_scraper"` - road_scraper - 0.5 @@ -1171,7 +1270,7 @@ All of the following object types have the `pickupable` attribute by default. - x=0.065,y=0.067,z=0.17 - Forward - Toy tank - * - `"tank_2"` + * - `"tank_3"` - tank - 0.5 - @@ -1180,6 +1279,24 @@ All of the following object types have the `pickupable` attribute by default. - x=0.21,y=0.12,z=0.094 - Right - Toy tank + * - `"taxi"` + - taxi + - 0.5 + - + - + - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` + - x=1.2,y=0.8,z=0.5 + - Right + - Toy three-wheeled taxi + * - `"toddler_ride_on_car"` + - car + - 0.5 + - + - + - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` + - x=1.14,y=1.24,z=0.66 + - Right + - Toy toddler ride-on car * - `"toolbox_1"` - toolbox - 5 @@ -1234,6 +1351,24 @@ All of the following object types have the `pickupable` attribute by default. - x=0.22,y=0.108,z=0.192 - Forward - Toolbox + * - `"toolbox_7"` + - toolbox + - 5 + - X + - X + - :ref:`metal `, :ref:`plastic ` + - x=0.21,y=0.14,z=0.154 + - Forward + - Toolbox + * - `"toolbox_8"` + - toolbox + - 5 + - X + - X + - :ref:`metal `, :ref:`plastic ` + - x=0.134,y=0.14,z=0.12 + - Forward + - Toolbox * - `"train_1"` - train - 0.5 @@ -1261,6 +1396,33 @@ All of the following object types have the `pickupable` attribute by default. - x=0.4,y=0.26,z=0.22 - Right - Toy train + * - `"train_4"` + - train + - 0.5 + - + - + - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` + - x=1.54,y=0.94,z=0.86 + - Right + - Toy train + * - `"train_5"` + - train + - 0.5 + - + - + - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` + - x=1.2,y=1.04,z=0.7 + - Right + - Toy train + * - `"train_6"` + - train + - 0.5 + - + - + - :ref:`block_blank `, :ref:`flat `, :ref:`wood ` + - x=1.8,y=1.16,z=0.74 + - Right + - Toy train * - `"trike"` - trike - 0.5 @@ -1502,6 +1664,42 @@ Furniture Objects - :ref:`wood ` - x=2,y=2.2,z=3.2 - + * - `"bed_13"` + - bed + - 50 + - + - X + - + - :ref:`wood ` + - x=2,y=2.2,z=3.5 + - + * - `"bed_14"` + - bed + - 50 + - + - X + - + - :ref:`wood ` + - x=2,y=2.2,z=3.5 + - + * - `"bed_15"` + - bed + - 50 + - + - X + - + - :ref:`wood ` + - x=1.4,y=3,z=2.4 + - Bunk bed + * - `"bed_16"` + - bed + - 50 + - + - X + - + - :ref:`wood ` + - x=1.4,y=3,z=2.4 + - Elevated bed with desk underneath * - `"bookcase_1_shelf"` - bookcase - 10 @@ -1574,6 +1772,24 @@ Furniture Objects - :ref:`metal `, :ref:`plastic `, :ref:`wood ` - x=1,y=2.5,z=0.5 - + * - `"bookcase_duplex_2_4"` + - bookcase + - 30 + - + - X + - + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=2,y=2,z=0.5 + - 2 shelves on left, 4 shelves on right + * - `"bookcase_duplex_4_2"` + - bookcase + - 30 + - + - X + - + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=2,y=2,z=0.5 + - 4 shelves on left, 2 shelves on right * - `"cart_1"` - cart - 4 @@ -1727,6 +1943,24 @@ Furniture Objects - :ref:`metal `, :ref:`plastic ` - x=0.5,y=0.92,z=0.5 - + * - `"chair_17"` + - chair + - 5 + - X + - X + - + - :ref:`metal `, :ref:`plastic ` + - x=0.45,y=0.85,z=0.45 + - + * - `"chair_18"` + - chair + - 5 + - X + - X + - + - :ref:`metal `, :ref:`plastic ` + - x=0.45,y=1.1,z=0.5 + - * - `"changing_table"` - changing table - 100 @@ -1817,6 +2051,33 @@ Furniture Objects - :ref:`metal `, :ref:`plastic `, :ref:`wood ` - x=0.84,y=0.41,z=0.68 - Chest with trapezoidal lid + * - `"chest_10"` + - chest + - 15 + - + - X + - X + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=0.37,y=0.39,z=0.38 + - Chest with curved lid + * - `"chest_11"` + - chest + - 15 + - + - X + - X + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=0.74,y=0.76,z=0.66 + - Chest with flat lid + * - `"circular_container"` + - container + - 5 + - + - X + - X + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=0.25,y=0.42,z=0.36 + - * - `"crib"` - crib - 25 @@ -1862,6 +2123,87 @@ Furniture Objects - :ref:`metal `, :ref:`plastic `, :ref:`wood ` - x=1,y=2,z=1 - Square desk with 3 sides on bottom and top + * - `"desk_5"` + - desk + - 30 + - + - X + - + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=2,y=1,z=0.5 + - Rectangular desk with 2 shelves on the left + * - `"desk_6"` + - desk + - 30 + - + - X + - + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=2,y=1,z=0.5 + - Rectangular desk with 2 shelves on the right + * - `"desk_7"` + - desk + - 20 + - + - X + - + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=1.17,y=0.93,z=0.56 + - Can see through underneath the desk + * - `"desk_8"` + - desk + - 20 + - + - X + - + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=1.15,y=0.82,z=0.55 + - Can see through underneath the desk + * - `"desk_9"` + - desk + - 20 + - + - X + - + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=0.85,y=0.95,z=0.58 + - Can see through underneath the desk + * - `"desk_10"` + - desk + - 20 + - + - X + - + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=1.7,y=1,z=0.93 + - Can see through underneath the desk + * - `"folding_chair"` + - chair + - 5 + - X + - X + - + - :ref:`metal `, :ref:`plastic ` + - x=0.48,y=0.86,z=0.56 + - + * - `"hamper"` + - hamper + - 5 + - + - X + - X + - none + - x=0.5,y=0.66,z=0.4 + - Short laundry hamper with a brown wicker texture + * - `"high_chair"` + - chair + - 5 + - X + - X + - + - :ref:`wood `, :ref:`plastic ` + - x=0.64,y=0.84,z=0.8 + - * - `"shelf_1"` - shelf - 10 @@ -1961,6 +2303,15 @@ Furniture Objects - :ref:`sofa_9 ` - x=2.54,y=1.62,z=1.52 - + * - `"sofa_10"` + - sofa + - 100 + - + - X + - + - :ref:`sofa_thorkea ` + - x=1.75,y=0.72,z=0.82 + - * - `"sofa_11"` - sofa - 100 @@ -2060,6 +2411,15 @@ Furniture Objects - :ref:`sofa_9 ` - x=1.38,y=1.46,z=1.36 - + * - `"sofa_chair_10"` + - sofa chair + - 50 + - + - X + - + - :ref:`armchair_thorkea ` + - x=0.96,y=0.89,z=0.76 + - * - `"table_1"` - table - 10 @@ -2231,6 +2591,24 @@ Furniture Objects - :ref:`metal `, :ref:`plastic `, :ref:`wood ` - x=1.431,y=0.652,z=0.695 - Short oval table + * - `"table_23"` + - table + - 10 + - X + - X + - + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=1.24,y=0.64,z=0.79 + - Short rectangular table + * - `"table_24"` + - table + - 10 + - X + - X + - + - :ref:`metal `, :ref:`plastic `, :ref:`wood ` + - x=1.63,y=0.4,z=0.6 + - Short rectangular table * - `"table_25"` - table - 5 @@ -2299,85 +2677,201 @@ All the tools have the `tool` shape, `metal` salient material, `moveable` and `r - Base Size - Details + * - `"tool_big_0_50_x_33_00"` + - 3 + - x=0.5,y=0.3,z=33 + - Rectangular (symmetric) tool, too big to be used successfully + * - `"tool_big_0_50_x_36_00"` + - 3 + - x=0.5,y=0.3,z=36 + - Rectangular (symmetric) tool, too big to be used successfully + * - `"tool_big_0_50_x_39_00"` + - 3 + - x=0.5,y=0.3,z=39 + - Rectangular (symmetric) tool, too big to be used successfully + * - `"tool_big_0_75_x_33_00"` + - 3 + - x=0.75,y=0.3,z=33 + - Rectangular (symmetric) tool, too big to be used successfully + * - `"tool_big_0_75_x_36_00"` + - 3 + - x=0.75,y=0.3,z=36 + - Rectangular (symmetric) tool, too big to be used successfully + * - `"tool_big_0_75_x_39_00"` + - 3 + - x=0.75,y=0.3,z=39 + - Rectangular (symmetric) tool, too big to be used successfully + * - `"tool_big_1_00_x_33_00"` + - 3 + - x=1.0,y=0.3,z=33 + - Rectangular (symmetric) tool, too big to be used successfully + * - `"tool_big_1_00_x_36_00"` + - 3 + - x=1.0,y=0.3,z=36 + - Rectangular (symmetric) tool, too big to be used successfully + * - `"tool_big_1_00_x_39_00"` + - 3 + - x=1.0,y=0.3,z=39 + - Rectangular (symmetric) tool, too big to be used successfully + * - `"tool_hooked_0_50_x_4_00"` - 3 - - x=0.5,y=0.3,z=4 - - Hooked (asymmetric) tool + - x=1.5,y=0.3,z=4 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_50_x_5_00"` - 3.25 - - x=0.5,y=0.3,z=5 - - Hooked (asymmetric) tool + - x=1.5,y=0.3,z=5 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_50_x_6_00"` - 3.5 - - x=0.5,y=0.3,z=6 - - Hooked (asymmetric) tool + - x=1.5,y=0.3,z=6 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_50_x_7_00"` - 3.75 - - x=0.5,y=0.3,z=7 - - Hooked (asymmetric) tool + - x=1.5,y=0.3,z=7 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_50_x_8_00"` - 4 - - x=0.5,y=0.3,z=8 - - Hooked (asymmetric) tool + - x=1.5,y=0.3,z=8 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_50_x_9_00"` - 4.25 - - x=0.5,y=0.3,z=9 - - Hooked (asymmetric) tool + - x=1.5,y=0.3,z=9 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_75_x_4_00"` - 3.33 - - x=0.75,y=0.3,z=4 - - Hooked (asymmetric) tool + - x=2.25,y=0.3,z=4 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_75_x_5_00"` - 3.66 - - x=0.75,y=0.3,z=5 - - Hooked (asymmetric) tool + - x=2.25,y=0.3,z=5 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_75_x_6_00"` - 4 - - x=0.75,y=0.3,z=6 - - Hooked (asymmetric) tool + - x=2.25,y=0.3,z=6 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_75_x_7_00"` - 4.33 - - x=0.75,y=0.3,z=7 - - Hooked (asymmetric) tool + - x=2.25,y=0.3,z=7 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_75_x_8_00"` - 4.66 - - x=0.75,y=0.3,z=8 - - Hooked (asymmetric) tool + - x=2.25,y=0.3,z=8 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_0_75_x_9_00"` - 5 - - x=0.75,y=0.3,z=9 - - Hooked (asymmetric) tool + - x=2.25,y=0.3,z=9 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_1_00_x_4_00"` - 4 - - x=1,y=0.3,z=4 - - Hooked (asymmetric) tool + - x=3,y=0.3,z=4 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_1_00_x_5_00"` - 4.5 - - x=1,y=0.3,z=5 - - Hooked (asymmetric) tool + - x=3,y=0.3,z=5 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_1_00_x_6_00"` - 5 - - x=1,y=0.3,z=6 - - Hooked (asymmetric) tool + - x=3,y=0.3,z=6 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_1_00_x_7_00"` - 5.5 - - x=1,y=0.3,z=7 - - Hooked (asymmetric) tool + - x=3,y=0.3,z=7 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_1_00_x_8_00"` - 6 - - x=1,y=0.3,z=8 - - Hooked (asymmetric) tool + - x=3,y=0.3,z=8 + - L-shaped (asymmetric) tool with two unequal sides * - `"tool_hooked_1_00_x_9_00"` - 6.5 - - x=1,y=0.3,z=9 - - Hooked (asymmetric) tool + - x=3,y=0.3,z=9 + - L-shaped (asymmetric) tool with two unequal sides + + * - `"tool_isosceles_0_50_x_4_00"` + - 3 + - x=4,y=0.3,z=4 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_0_50_x_5_00"` + - 3.25 + - x=5,y=0.3,z=5 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_0_50_x_6_00"` + - 3.5 + - x=6,y=0.3,z=6 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_0_50_x_7_00"` + - 3.75 + - x=7,y=0.3,z=7 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_0_50_x_8_00"` + - 4 + - x=8,y=0.3,z=8 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_0_50_x_9_00"` + - 4.25 + - x=9,y=0.3,z=9 + - L-shaped (asymmetric) tool with two equal sides + + * - `"tool_isosceles_0_75_x_4_00"` + - 3.33 + - x=4,y=0.3,z=4 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_0_75_x_5_00"` + - 3.66 + - x=5,y=0.3,z=5 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_0_75_x_6_00"` + - 4 + - x=6,y=0.3,z=6 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_0_75_x_7_00"` + - 4.33 + - x=7,y=0.3,z=7 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_0_75_x_8_00"` + - 4.66 + - x=8,y=0.3,z=8 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_0_75_x_9_00"` + - 5 + - x=9,y=0.3,z=9 + - L-shaped (asymmetric) tool with two equal sides + + * - `"tool_isosceles_1_00_x_4_00"` + - 4 + - x=4,y=0.3,z=4 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_1_00_x_5_00"` + - 4.5 + - x=5,y=0.3,z=5 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_1_00_x_6_00"` + - 5 + - x=6,y=0.3,z=6 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_1_00_x_7_00"` + - 5.5 + - x=7,y=0.3,z=7 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_1_00_x_8_00"` + - 6 + - x=8,y=0.3,z=8 + - L-shaped (asymmetric) tool with two equal sides + * - `"tool_isosceles_1_00_x_9_00"` + - 6.5 + - x=9,y=0.3,z=9 + - L-shaped (asymmetric) tool with two equal sides * - `"tool_rect_0_50_x_1_00"` - 5 - x=0.5,y=0.3,z=1 - - Rectangular (symmetric) tool, too small + - Rectangular (symmetric) tool, too small to be used successfully + * - `"tool_rect_0_50_x_3_00"` + - 3 + - x=0.5,y=0.3,z=3 + - Rectangular (symmetric) tool, used in the secondary tool task * - `"tool_rect_0_50_x_4_00"` - 3 - x=0.5,y=0.3,z=4 @@ -2406,36 +2900,40 @@ All the tools have the `tool` shape, `metal` salient material, `moveable` and `r * - `"tool_rect_0_63_x_1_00"` - 5 - x=0.63,y=0.3,z=1 - - Rectangular (symmetric) tool, too small + - Rectangular (symmetric) tool, too small to be used successfully * - `"tool_rect_0_63_x_4_00"` - 3 - x=0.63,y=0.3,z=4 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_63_x_5_00"` - 3.25 - x=0.63,y=0.3,z=5 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_63_x_6_00"` - 3.5 - x=0.63,y=0.3,z=6 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_63_x_7_00"` - 3.75 - x=0.63,y=0.3,z=7 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_63_x_8_00"` - 4 - x=0.63,y=0.3,z=8 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_63_x_9_00"` - 4.25 - x=0.63,y=0.3,z=9 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_75_x_1_00"` - 5 - x=0.75,y=0.3,z=1 - - Rectangular (symmetric) tool, too small + - Rectangular (symmetric) tool, too small to be used successfully + * - `"tool_rect_0_75_x_3_00"` + - 3.33 + - x=0.75,y=0.3,z=3 + - Rectangular (symmetric) tool, used in the secondary tool task * - `"tool_rect_0_75_x_4_00"` - 3.33 - x=0.75,y=0.3,z=4 @@ -2464,36 +2962,40 @@ All the tools have the `tool` shape, `metal` salient material, `moveable` and `r * - `"tool_rect_0_88_x_1_00"` - 5 - x=0.88,y=0.3,z=1 - - Rectangular (symmetric) tool, too small + - Rectangular (symmetric) tool, too small to be used successfully * - `"tool_rect_0_88_x_4_00"` - 3.33 - x=0.88,y=0.3,z=4 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_88_x_5_00"` - 3.66 - x=0.88,y=0.3,z=5 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_88_x_6_00"` - 4 - x=0.88,y=0.3,z=6 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_88_x_7_00"` - 4.33 - x=0.88,y=0.3,z=7 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_88_x_8_00"` - 4.66 - x=0.88,y=0.3,z=8 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_0_88_x_9_00"` - 5 - x=0.88,y=0.3,z=9 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_1_00_x_1_00"` - 5 - x=1,y=0.3,z=1 - - Rectangular (symmetric) tool, too small + - Rectangular (symmetric) tool, too small to be used successfully + * - `"tool_rect_1_00_x_3_00"` + - 4 + - x=1,y=0.3,z=4 + - Rectangular (symmetric) tool, used in the secondary tool task * - `"tool_rect_1_00_x_4_00"` - 4 - x=1,y=0.3,z=4 @@ -2522,31 +3024,31 @@ All the tools have the `tool` shape, `metal` salient material, `moveable` and `r * - `"tool_rect_1_13_x_1_00"` - 5 - x=1.13,y=0.3,z=1 - - Rectangular (symmetric) tool, too small + - Rectangular (symmetric) tool, too small to be used successfully * - `"tool_rect_1_13_x_4_00"` - 4 - x=1.13,y=0.3,z=4 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_1_13_x_5_00"` - 4.5 - x=1.13,y=0.3,z=5 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_1_13_x_6_00"` - 5 - x=1.13,y=0.3,z=6 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_1_13_x_7_00"` - 5.5 - x=1.13,y=0.3,z=7 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_1_13_x_8_00"` - 6 - x=1.13,y=0.3,z=8 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width * - `"tool_rect_1_13_x_9_00"` - 6.5 - x=1.13,y=0.3,z=9 - - Rectangular (symmetric) tool + - Rectangular (symmetric) tool, used in Eval 6 as a novel width Agents ****** @@ -2577,6 +3079,12 @@ These agents are used in scenes for the interactive tasks. * - `"agent_female_06"` - 70 - x=0.5,y=1.6,z=0.5 + * - `"agent_female_07"` + - 70 + - x=0.5,y=1.6,z=0.5 + * - `"agent_female_08"` + - 70 + - x=0.5,y=1.6,z=0.5 * - `"agent_male_01"` - 80 - x=0.5,y=1.6,z=0.5 @@ -2589,6 +3097,12 @@ These agents are used in scenes for the interactive tasks. * - `"agent_male_04"` - 80 - x=0.5,y=1.6,z=0.5 + * - `"agent_male_05"` + - 80 + - x=0.5,y=1.6,z=0.5 + * - `"agent_male_06"` + - 80 + - x=0.5,y=1.6,z=0.5 * - `"agent_male_07"` - 80 - x=0.5,y=1.6,z=0.5 @@ -2596,6 +3110,84 @@ These agents are used in scenes for the interactive tasks. - 80 - x=0.5,y=1.6,z=0.5 +Blobs +***** + +These blobs are used in scenes for the passive agent tasks, as well as some scenes for the interactive tasks. Each blob type also has a variant type with a nose-like protrusion ending in `_nose` (for example, `blob_01` and `blob_01_nose`). + +.. list-table:: + :header-rows: 1 + + * - Object Type + - Base Size + - Standing Y Position + * - `"blob_01"` + - x=0.26,y=0.8,z=0.36 + - 0.4 + * - `"blob_02"` + - x=0.33,y=0.78,z=0.33 + - 0.39 + * - `"blob_03"` + - x=0.25,y=0.69,z=0.25 + - 0.345 + * - `"blob_04"` + - x=0.3,y=0.53,z=0.3 + - 0.225 + * - `"blob_05"` + - x=0.38,y=0.56,z=0.38 + - 0.24 + * - `"blob_06"` + - x=0.52,y=0.5,z=0.54 + - 0.25 + * - `"blob_07"` + - x=0.25,y=0.55,z=0.25 + - 0.245 + * - `"blob_08"` + - x=0.27,y=0.62,z=0.15 + - 0.31 + * - `"blob_09"` + - x=0.33,y=0.78,z=0.44 + - 0.39 + * - `"blob_10"` + - x=0.24,y=0.5,z=0.2 + - 0.25 + * - `"blob_11"` + - x=0.35,y=0.58,z=0.35 + - 0.29 + * - `"blob_12"` + - x=0.3,y=0.48,z=0.3 + - 0.24 + * - `"blob_13"` + - x=0.32,y=0.71,z=0.3 + - 0.37 + * - `"blob_14"` + - x=0.52,y=0.55,z=0.3 + - 0.42 + * - `"blob_15"` + - x=0.32,y=0.41,z=0.58 + - 0.17 + * - `"blob_16"` + - x=0.46,y=0.52,z=0.54 + - 0.27 + * - `"blob_17"` + - x=0.32,y=0.78,z=0.41 + - 0.385 + * - `"blob_18"` + - x=0.32,y=0.79,z=0.39 + - 0.37 + * - `"blob_19"` + - x=0.39,y=0.8,z=0.39 + - 0.45 + * - `"blob_20"` + - x=0.21,y=0.61,z=0.27 + - 0.26 + * - `"blob_21"` + - x=0.21,y=0.72,z=0.36 + - 0.265 + * - `"blob_22"` + - x=0.19,y=0.73,z=0.37 + - 0.265 + Primitive Objects ***************** @@ -2680,6 +3272,18 @@ The following objects have a default mass of 1 and no material restrictions. You * - `"rollable_8"` - (x=1,y=1,z=1) - 0 + * - `"rollable_9"` + - (x=1,y=1,z=1) + - 0 + * - `"rollable_10"` + - (x=1,y=1,z=1) + - 0 + * - `"rollable_11"` + - (x=1,y=1,z=1) + - 0 + * - `"rollable_12"` + - (x=1,y=1,z=1) + - 0 * - `"tie_fighter"` - (x=1,y=1,z=1) - 0 @@ -3073,10 +3677,14 @@ Specific textures for `sofa_4`, `sofa_5`, `sofa_6`, AND `sofa_7` only. Tool Materials ************** -- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_13"` (grey) +- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_11"` (black) +- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_13"` (grey, default) - `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_15"` (brown) +- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_23"` (grey) - `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_34"` (pink) - `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_36"` (green) +- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_40"` (blue) +- `"UnityAssetStore/YughuesFreeMetalMaterials/Materials/M_YFMM_42"` (brown) Wall Materials ************** @@ -3215,8 +3823,8 @@ Chest Options .. list-table:: :header-rows: 1 - * - Chest Option (Female 5-6) - - Chest Option (Male 7-8) + * - Chest Option (Female 5-8) + - Chest Option (Male 5-8) - Description * - 0 - @@ -3327,8 +3935,8 @@ Feet Options .. list-table:: :header-rows: 1 - * - Feet Option (Female 5-6) - - Feet Option (Male 7-8) + * - Feet Option (Female 5-8) + - Feet Option (Male 5-8) - Description * - 0 - 0 @@ -3402,8 +4010,8 @@ Hair Material Options :header-rows: 1 * - Hair Options - - Hair Material Options (Female 5-6) - - Hair Material Options (Male 7-8) + - Hair Material Options (Female 5-8) + - Hair Material Options (Male 5-8) * - 0 - 0 (yellow), 1 (brown), 2 (black), or 3 (red) - 0 (yellow), 1 (brown), 2 (black), or 3 (yellow highlights) @@ -3476,8 +4084,8 @@ Legs Options .. list-table:: :header-rows: 1 - * - Legs Option (Female 5-6) - - Legs Option (Male 7-8) + * - Legs Option (Female 5-8) + - Legs Option (Male 5-8) - Description * - 0 - 1 diff --git a/integration_tests/data/107.lava.oracle.outputs.json b/integration_tests/data/107.lava.oracle.outputs.json index 48215f96..18487ae9 100644 --- a/integration_tests/data/107.lava.oracle.outputs.json +++ b/integration_tests/data/107.lava.oracle.outputs.json @@ -166,7 +166,7 @@ ], "objects_count": 0, "position_x": 0.0, - "position_z": 0.5, + "position_z": 0.51, "return_status": "SUCCESSFUL", "reward": -100.005, "rotation_y": 0.0, diff --git a/integration_tests/data/119.lava_end_scene.oracle.outputs.json b/integration_tests/data/119.lava_end_scene.oracle.outputs.json index e7ea873f..14d1a8fe 100644 --- a/integration_tests/data/119.lava_end_scene.oracle.outputs.json +++ b/integration_tests/data/119.lava_end_scene.oracle.outputs.json @@ -76,7 +76,7 @@ "lava": [[-0.5, 0.5, 0.5, 1.5], [0.5, -0.5, 1.5, 0.5]], "objects_count": 0, "position_x": 0.0, - "position_z": 0.5, + "position_z": 0.51, "return_status": "SUCCESSFUL", "reward": -100.005, "rotation_y": 0.0, diff --git a/webenabled/README.md b/webenabled/README.md index e597f1ff..3e7bbceb 100644 --- a/webenabled/README.md +++ b/webenabled/README.md @@ -4,13 +4,10 @@ First, "git clone" this repository. Then run the following commands from this folder to setup your python environment: -_(TODO: Remove the 4th line once 0.7.0 is released)_ - ``` python3 -m venv --prompt webenabled venv source venv/bin/activate python -m pip install --upgrade pip setuptools wheel -python -m pip install -e ../ python -m pip install -r requirements.txt ``` @@ -29,9 +26,9 @@ scene files will appear on the web page First, run `cache_addressables` to cache all addressable assets and prevent possible timeout issues. You should do this each time you reboot your machine. -For development, run `python mcsweb.py` to start the flask server with host `0.0.0.0` (so the page will be accessable from any machine on the network) and port `8080`. +Then, run `python mcsweb.py` to start the flask server with host `0.0.0.0` (so the page will be accessable from any machine on the network) and port `8080`. -For production, use a WSGI server (not sure what to put here....) +Alternatively, run `python mcsweb.py` to see all of the available options. The `--debug` flag is very helpful for development. ## Use diff --git a/webenabled/mcs_interface.py b/webenabled/mcs_interface.py index 42f924ef..b6336fd5 100644 --- a/webenabled/mcs_interface.py +++ b/webenabled/mcs_interface.py @@ -1,6 +1,7 @@ import datetime import glob import json +import logging import os import sys import time @@ -35,9 +36,9 @@ def convert_key_to_action(key: str, logger): for action in mcs.Action: if key.lower() == action.key: - logger.info(f"Converting '{key}' into {action.value}") + logger.debug(f"Converting '{key}' into {action.value}") return action.value - logger.info(f"Unable to convert '{key}'. Returning Pass...") + logger.debug(f"Unable to convert '{key}'. Returning Pass...") return "Pass" @@ -52,7 +53,7 @@ class MCSInterface: def __init__(self, user: str): self.logger = current_app.logger - self.logger.info(f'MCS interface directory: {TMP_DIR_FULL_PATH}') + self.logger.debug(f'MCS interface directory: {TMP_DIR_FULL_PATH}') self.step_number = 0 self.scene_id = None self.scene_filename = None @@ -91,7 +92,11 @@ def get_latest_step_output(self): def start_mcs(self): # Start the unity controller. (the function is in a different # file so we can pickle / store MCSInterface in the session) - self.pid = start_subprocess(self.command_out_dir, self.step_output_dir) + self.pid = start_subprocess( + self.command_out_dir, + self.step_output_dir, + self.logger.isEnabledFor(logging.DEBUG) + ) # Read in the image images, _ = self.get_images_and_step_output(startup=True) @@ -218,7 +223,7 @@ def get_images_and_step_output(self, startup=False, init_scene=False): timenow = time.time() elapsed = (timenow - timestart) if (startup and elapsed > UNITY_STARTUP_WAIT_TIMEOUT): - self.logger.info( + self.logger.debug( "Display blank image on default when starting up.") self.img_name = self.blank_path return [self.img_name], self.step_output @@ -230,7 +235,7 @@ def get_images_and_step_output(self, startup=False, init_scene=False): if (quick_error_check): log_message = "Error returned from MCS controller." - self.logger.info(log_message) + self.logger.warn(log_message) list_of_error_files = glob.glob( self.step_output_dir + "/error_*.json") @@ -363,18 +368,18 @@ def get_goal_info(self, scene_filename): def get_task_desc(self, scene_filename): """Get task description based on filename from mcs_task_desc.py""" - self.logger.info( + self.logger.debug( f"Attempt to get task description based" f"on scene_filename: {scene_filename}") scene_type = scene_filename.split('/')[-1].split('0')[0][:-1].upper() for description in TaskDescription: if (description.name == scene_type): - self.logger.info( + self.logger.debug( f"Scene type identified: {description.name}") return description.value - self.logger.info("Scene type not found, returning 'N/A'") + self.logger.warn("Scene type not found, returning 'N/A'") return "N/A" def get_controller_pid(self): diff --git a/webenabled/mcsweb.py b/webenabled/mcsweb.py index 34657e0e..b5f23cfe 100644 --- a/webenabled/mcsweb.py +++ b/webenabled/mcsweb.py @@ -1,9 +1,11 @@ +import argparse import logging import random import string import psutil import typeguard +import waitress # Override the typechecked decorator used in machine_common_sense to do nothing @@ -74,22 +76,22 @@ def get_mcs_interface(request, label, on_exit=False): # If old user, get stored mcs interface if uniq_id_str is not None: - app.logger.info(f"{label}: existing user: {uniq_id_str}") + app.logger.debug(f"{label}: existing user: {uniq_id_str}") mcs_interface = session.get(uniq_id_str) if mcs_interface is not None: controller_alive = mcs_interface.is_controller_alive() if controller_alive: return mcs_interface, uniq_id_str - app.logger.info("MCS controller is unavailable") + app.logger.debug("MCS controller is unavailable") else: - app.logger.info("MCS interface is unavailable") + app.logger.debug("MCS interface is unavailable") # skip for exit_unity route, since in that case, we don't # need to start a new interface/controller if one isn't found if (on_exit is False): letters = string.ascii_lowercase uniq_id_str = ''.join(random.choice(letters) for i in range(10)) - app.logger.info(f"{label}: new user: {uniq_id_str}") + app.logger.debug(f"{label}: new user: {uniq_id_str}") # Don't recognize, create new mcs interface mcs_interface = MCSInterface(uniq_id_str) @@ -101,8 +103,8 @@ def get_mcs_interface(request, label, on_exit=False): @app.route('/mcs') def show_mcs_page(): - app.logger.info("=" * 30) - app.logger.info( + app.logger.debug("=" * 30) + app.logger.debug( "Initialize page before checking for " "controller and existing user session...") rendered_template = render_template( @@ -116,7 +118,7 @@ def show_mcs_page(): @app.route('/load_controller', methods=["POST"]) def handle_load_controller(): - app.logger.info("=" * 30) + app.logger.debug("=" * 30) mcs_interface, uniq_id_str = get_mcs_interface(request, "Load page") if mcs_interface is None: app.logger.warn("Cannot load MCS interface") @@ -135,7 +137,7 @@ def handle_load_controller(): @app.route("/keypress", methods=["POST"]) def handle_keypress(): - app.logger.info("=" * 30) + app.logger.debug("=" * 30) mcs_interface, _ = get_mcs_interface(request, "Key press") if mcs_interface is None: app.logger.warn("Cannot load MCS interface") @@ -151,12 +153,12 @@ def handle_keypress(): img = images[0] step_number = mcs_interface.step_number if key: - app.logger.info( + app.logger.debug( f"Key press: '{key}', action string: {action_string}, " f"step: {step_number}, img: {img}, output: {step_output}" ) else: - app.logger.info( + app.logger.debug( f"Action: '{action}', " f"step: {step_number}, img: {img}, output: {step_output}" ) @@ -172,7 +174,7 @@ def handle_keypress(): @app.route("/exit_unity", methods=["POST"]) def exit_unity(): - app.logger.info("=" * 30) + app.logger.debug("=" * 30) mcs_interface, unique_id = get_mcs_interface( request, "Exit Unity", on_exit=True) if mcs_interface is None: @@ -188,26 +190,26 @@ def exit_unity(): controller_pid = mcs_interface.get_controller_pid() - app.logger.info( + app.logger.debug( "Attempting to clean up processes after browser has been closed.") for p in psutil.process_iter(['pid']): if p.info['pid'] == controller_pid: children = p.children(recursive=True) for c_process in children: - app.logger.info( + app.logger.debug( f"Found child process of controller: {c_process}, " f"will attempt to end.") c_process.kill() - app.logger.info( + app.logger.debug( f"Found controller process: {p}, will attempt to end.") p.kill() if (unique_id is None): unique_id = request.cookies.get("uniq_id") - app.logger.info( + app.logger.debug( f"Clear user session for: {unique_id}") del session[unique_id] @@ -222,7 +224,7 @@ def exit_unity(): @app.route("/scene_selection", methods=["POST"]) def handle_scene_selection(): - app.logger.info("=" * 30) + app.logger.debug("=" * 30) mcs_interface, _ = get_mcs_interface(request, "Start scene") if mcs_interface is None: app.logger.warn("Cannot load MCS interface") @@ -233,7 +235,7 @@ def handle_scene_selection(): load_output = mcs_interface.load_scene("scenes/" + scene_filename) images, step_output, action_list, goal_info, task_desc = load_output img = convert_image_path(images[0]) - app.logger.info(f"Start scene: {scene_filename}, output: {img}") + app.logger.debug(f"Start scene: {scene_filename}, output: {img}") resp = jsonify( last_action="Initialize", action_list=action_list, @@ -249,4 +251,44 @@ def handle_scene_selection(): if __name__ == "__main__": - app.run(host='0.0.0.0', port=8080, debug=True) + parser = argparse.ArgumentParser(description=( + 'Machine Common Sense Web Interface' + )) + parser.add_argument( + '--host', + type=str, + default='0.0.0.0', + help='Host' + ) + parser.add_argument( + '--port', + type=int, + default=8080, + help='Port' + ) + parser.add_argument( + '--dev', + default=False, + action='store_true', + help='Development server' + ) + parser.add_argument( + '--debug', + default=False, + action='store_true', + help='Debug logging' + ) + args = parser.parse_args() + app.logger.info( + f'Starting MCS web interface: host={args.host} port={args.port} ' + f'dev={args.dev} debug={args.debug}' + ) + + if args.dev: + app.run(host=args.host, port=args.port, debug=True) + else: + waitress.serve(app, host=args.host, port=args.port) + waitress_logger = logging.getLogger('waitress') + waitress_logger.setLevel(logging.DEBUG if args.debug else logging.INFO) + + app.logger.setLevel(logging.DEBUG if args.debug else logging.INFO) diff --git a/webenabled/requirements.txt b/webenabled/requirements.txt index e275b75c..f2205efd 100644 --- a/webenabled/requirements.txt +++ b/webenabled/requirements.txt @@ -8,3 +8,4 @@ isort==5.11.5; python_version<"3.8" isort==5.12.0; python_version>="3.8" psutil==5.9.5 pytest==7.3.0 +waitress==2.1.2 diff --git a/webenabled/run_scene_with_dir.py b/webenabled/run_scene_with_dir.py index e2b2b1a1..abe9eba5 100644 --- a/webenabled/run_scene_with_dir.py +++ b/webenabled/run_scene_with_dir.py @@ -40,7 +40,7 @@ def __init__(self, command_in_dir, output_dir): self.step_number = 0 def run_loop(self): - logger.info( + logger.debug( f"Starting controller: watching command directory " f"{self.command_in_dir[(self.command_in_dir.rfind('/') + 1):]}" f", writing to output directory " @@ -109,7 +109,7 @@ def load_command_file(self, command_text_file): self.step_and_save(command) def load_scene(self): - logger.info(f"Loading file {self.scene_file}") + logger.debug(f"Loading file {self.scene_file}") if not exists(self.scene_file): logger.warn(f"Missing file {self.scene_file}") @@ -125,7 +125,7 @@ def load_scene(self): logger.exception(f"Error loading file {self.scene_file}") def step_and_save(self, command): - logger.info(f"Executing command {command}") + logger.debug(f"Executing command {command}") try: output: StepMetadata = self.controller.step(command) if output is not None: @@ -169,7 +169,7 @@ def log_error(self, error): f"Error saving error output to file {error_output_file}") def save_output_info(self, output: StepMetadata): - logger.info(f"Saving output info at step {output.step_number}") + logger.debug(f"Saving output info at step {output.step_number}") output_to_save_dict = { 'step_number': output.step_number, @@ -188,7 +188,7 @@ def save_output_info(self, output: StepMetadata): f'{self.output_dir}/step_output_{scene_id}_step_' f'{output.step_number}.json' ) - logger.info( + logger.debug( f"Saved json file on step {output.step_number} to " f"{output_path}" ) @@ -200,7 +200,7 @@ def save_output_info(self, output: StepMetadata): f"Error saving output info on step {output.step_number}") def save_output_image(self, output: StepMetadata): - logger.info(f"Saving output image at step {output.step_number}") + logger.debug(f"Saving output image at step {output.step_number}") scene_id = self.scene_file[ (self.scene_file.rfind('/') + 1):(self.scene_file.rfind('.')) ] @@ -211,7 +211,7 @@ def save_output_image(self, output: StepMetadata): f'{self.output_dir}/rgb_{scene_id}_step_' f'{output.step_number}.png' ) - logger.info( + logger.debug( f"Saved RGB image on step {output.step_number} to " f"{img_path}" ) @@ -236,13 +236,13 @@ def convert_file_path(self, path: str) -> str: # ---------------------------------- def on_created(self, event): path = self.convert_file_path(event.src_path) - logger.info(f"File creation: {path}") + logger.debug(f"File creation: {path}") self.load_command_file(path) os.unlink(event.src_path) def on_modified(self, event): path = self.convert_file_path(event.src_path) - logger.info(f"File modified: {path}") + logger.debug(f"File modified: {path}") self.load_command_file(path) os.unlink(event.src_path) @@ -264,6 +264,11 @@ def parse_args(): parser.add_argument( '--mcs_output_dir', help='MCS directory that images will appear in') + parser.add_argument( + '--debug', + default=False, + action='store_true', + help='Debug logging') return parser.parse_args() @@ -272,6 +277,7 @@ def parse_args(): # scene_file = args.mcs_scene_json_file command_in_dir = args.mcs_command_in_dir output_dir = args.mcs_output_dir + logger.setLevel(logging.DEBUG if args.debug else logging.INFO) run_scene = RunSceneWithDir(command_in_dir, output_dir) run_scene.run_loop() diff --git a/webenabled/subprocess_runner.py b/webenabled/subprocess_runner.py index 532624bf..85d30d3b 100644 --- a/webenabled/subprocess_runner.py +++ b/webenabled/subprocess_runner.py @@ -11,14 +11,15 @@ from flask import current_app -def start_subprocess(command_dir, output_dir): +def start_subprocess(command_dir, output_dir, debug): logger = current_app.logger - proc = subprocess.Popen( - ["python3", "run_scene_with_dir.py", - "--mcs_command_in_dir", command_dir, - "--mcs_output_dir", output_dir]) + proc = subprocess.Popen([ + "python3", "run_scene_with_dir.py", + "--mcs_command_in_dir", command_dir, + "--mcs_output_dir", output_dir + ] + (["--debug"] if debug else [])) pid_str = str(proc.pid) - logger.info( + logger.debug( f"Running script to start the MCS Controller with command directory " f"{command_dir[(command_dir.rfind('/') + 1):]}" f" and output directory "