Skip to content
Snippets Groups Projects
Commit 943ed3d3 authored by Johannes Mey's avatar Johannes Mey
Browse files

Merge branch 'feature/waiting' into 'main'

festival updatesfestival updatesfestival updatesfestival updatesfestival

See merge request !1
parents b1da57bc 2852709c
Branches
No related tags found
1 merge request!1festival updatesfestival updatesfestival updatesfestival updatesfestival
Pipeline #15195 passed
Showing
with 645 additions and 371 deletions
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
max_line_length = 120
tab_width = 4
trim_trailing_whitespace = true
[{*.jadd,*.java,*.jrag}]
indent_size = 2
tab_width = 2
ij_continuation_indent_size = 4
...@@ -9,7 +9,7 @@ plugins { ...@@ -9,7 +9,7 @@ plugins {
group 'de.tudresden.inf.st' group 'de.tudresden.inf.st'
ext { ext {
mainClassName = 'de.tudresden.inf.st.mg.Main' mainClassName = 'de.tudresden.inf.st.mg.ImmersiveSortingController'
} }
// set the main class name for `gradle run` // set the main class name for `gradle run`
...@@ -44,7 +44,7 @@ idea.module.generatedSourceDirs += genSrc ...@@ -44,7 +44,7 @@ idea.module.generatedSourceDirs += genSrc
sourceSets.main.java.srcDir genSrc sourceSets.main.java.srcDir genSrc
dependencies { dependencies {
implementation group: 'de.tudresden.inf.st', name: 'dumpAst', version: "${relast2uml_version}" implementation group: 'de.tudresden.inf.st', name: 'dumpAst', version: "${dumpAst_version}"
grammar2uml group: 'de.tudresden.inf.st', name: 'grammar2uml', version: "${grammar2uml_version}" grammar2uml group: 'de.tudresden.inf.st', name: 'grammar2uml', version: "${grammar2uml_version}"
relast group: 'org.jastadd', name: 'relast', version: "${relast_version}" relast group: 'org.jastadd', name: 'relast', version: "${relast_version}"
testImplementation group: 'org.assertj', name: 'assertj-core', version: "${assertj_version}" testImplementation group: 'org.assertj', name: 'assertj-core', version: "${assertj_version}"
...@@ -52,10 +52,11 @@ dependencies { ...@@ -52,10 +52,11 @@ dependencies {
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "${jupyter_version}" testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "${jupyter_version}"
implementation group: 'io.javalin', name: 'javalin', version: "${javalin_version}" implementation group: 'io.javalin', name: 'javalin', version: "${javalin_version}"
implementation group: 'org.json', name: 'json', version: '20220320' implementation group: 'org.json', name: 'json', version: '20220320'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.3' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.4'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.13.3' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.13.4'
implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.13.4'
implementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.31' implementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.31'
ragconnect group: 'de.tudresden.inf.st', name: 'ragconnect', version: '1.0.0-alpha-203' ragconnect group: 'de.tudresden.inf.st', name: 'ragconnect', version: '1.0.0'
jastadd2 "org.jastadd:jastadd2:2.3.5-dresden-6" jastadd2 "org.jastadd:jastadd2:2.3.5-dresden-6"
implementation group: 'com.google.protobuf', name: 'protobuf-java', version: "${protobuf_version}" implementation group: 'com.google.protobuf', name: 'protobuf-java', version: "${protobuf_version}"
implementation group: 'com.google.protobuf', name: 'protobuf-java-util', version: "${protobuf_version}" implementation group: 'com.google.protobuf', name: 'protobuf-java-util', version: "${protobuf_version}"
...@@ -103,7 +104,7 @@ jar { ...@@ -103,7 +104,7 @@ jar {
duplicatesStrategy = DuplicatesStrategy.WARN duplicatesStrategy = DuplicatesStrategy.WARN
} }
def relastFiles = ['./src/main/jastadd/common/MotionGrammar.relast', './src/main/jastadd/load/LoadWorld.relast', './src/main/jastadd/cleanup/RobotWorld.relast', './src/main/jastadd/load/LoadUnload.relast', './src/main/jastadd/cleanup/Cleanup.relast'] def relastFiles = ['./src/gen/jastadd/MotionGrammar.relast', './src/main/jastadd/load/LoadWorld.relast', './src/gen/jastadd/RobotWorld.relast', './src/main/jastadd/load/LoadUnload.relast', './src/main/jastadd/cleanup/Cleanup.relast']
def loadingRelastFiles = ['./src/main/jastadd/common/MotionGrammar.relast', './src/main/jastadd/load/LoadWorld.relast', './src/main/jastadd/load/LoadUnload.relast'] def loadingRelastFiles = ['./src/main/jastadd/common/MotionGrammar.relast', './src/main/jastadd/load/LoadWorld.relast', './src/main/jastadd/load/LoadUnload.relast']
def cleaningRelastFiles = ['./src/main/jastadd/common/MotionGrammar.relast', './src/main/jastadd/cleanup/RobotWorld.relast', './src/main/jastadd/cleanup/Cleanup.relast'] def cleaningRelastFiles = ['./src/main/jastadd/common/MotionGrammar.relast', './src/main/jastadd/cleanup/RobotWorld.relast', './src/main/jastadd/cleanup/Cleanup.relast']
def grammarPrefix = './src/gen/jastadd/MotionGrammar' def grammarPrefix = './src/gen/jastadd/MotionGrammar'
...@@ -123,11 +124,11 @@ task ragConnect(type: JavaExec) { ...@@ -123,11 +124,11 @@ task ragConnect(type: JavaExec) {
'./src/main/jastadd/common/MotionGrammar.relast', './src/main/jastadd/common/MotionGrammar.relast',
'./src/main/jastadd/cleanup/RobotWorld.relast', './src/main/jastadd/cleanup/RobotWorld.relast',
'./src/main/jastadd/cleanup/RobotWorld.connect', './src/main/jastadd/cleanup/RobotWorld.connect',
'--logReads', // '--logReads',
'--logWrites', // '--logWrites',
// '--logIncremental', // '--logIncremental',
'--verbose', // '--verbose',
'--rootNode=RobotScene', '--rootNode=RobotWorld',
'--protocols=mqtt', '--protocols=mqtt',
"--List=${jastAddListName}", "--List=${jastAddListName}",
'--experimental-jastadd-329', '--experimental-jastadd-329',
...@@ -141,6 +142,7 @@ task ragConnect(type: JavaExec) { ...@@ -141,6 +142,7 @@ task ragConnect(type: JavaExec) {
task generateLoadingGrammarDiagrams(type: JavaExec) { task generateLoadingGrammarDiagrams(type: JavaExec) {
group = 'Documentation' group = 'Documentation'
classpath = configurations.grammar2uml classpath = configurations.grammar2uml
mainClass = 'de.tudresden.inf.st.jastadd.grammar2uml.compiler.Compiler'
args "--output=${loadingGrammarDiagramFile}", '--defaultFolders' args "--output=${loadingGrammarDiagramFile}", '--defaultFolders'
args loadingRelastFiles args loadingRelastFiles
...@@ -152,6 +154,7 @@ task generateLoadingGrammarDiagrams(type: JavaExec) { ...@@ -152,6 +154,7 @@ task generateLoadingGrammarDiagrams(type: JavaExec) {
task generateCleaningGrammarDiagrams(type: JavaExec) { task generateCleaningGrammarDiagrams(type: JavaExec) {
group = 'Documentation' group = 'Documentation'
classpath = configurations.grammar2uml classpath = configurations.grammar2uml
mainClass = 'de.tudresden.inf.st.jastadd.grammar2uml.compiler.Compiler'
args "--output=${cleaningGrammarDiagramFile}", '--defaultFolders' args "--output=${cleaningGrammarDiagramFile}", '--defaultFolders'
args cleaningRelastFiles args cleaningRelastFiles
...@@ -169,8 +172,9 @@ task relastToJastAdd(type: JavaExec) { ...@@ -169,8 +172,9 @@ task relastToJastAdd(type: JavaExec) {
'--useJastAddNames', '--useJastAddNames',
'--listClass=java.util.ArrayList', '--listClass=java.util.ArrayList',
"--jastAddList=${jastAddListName}", "--jastAddList=${jastAddListName}",
"--resolverHelper", '--resolverHelper',
'--file' '--file',
'--serializer=jackson'
args relastFiles args relastFiles
inputs.files relastFiles inputs.files relastFiles
......
.App { .App {
background-color: #282c34; background-color: #282c34;
text-align: left; text-align: left;
} }
.App-logo { .App-logo {
height: 40vmin; height: 40vmin;
pointer-events: none; pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
} }
.App-header { .App-header {
background-color: #282c34; background-color: #282c34;
min-height: 40px; /*100vmin*/ min-height: 40px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
font-size: calc(10px + 2vmin); font-size: calc(10px + 2vmin);
color: white; color: white;
} }
.CurrentAst { .ContextContainer {
width: 100vw; width: 100vw;
overflow-x:scroll;
white-space: nowrap;
direction:rtl;
} }
.AstInTimeline { .CurrentContext {
max-width: 100%; height: 50vh;
width: 100vw;
object-fit: contain;
/*object-fit: scale-down;*/
object-position: center;
} }
.App-link { .AstContainer {
color: #61dafb; width: 100vw;
overflow-x:scroll;
white-space: nowrap;
direction:rtl;
} }
.MG-Timeline { .CurrentAst {
max-width: 4000px !important; height: 50vh;
object-fit: cover;
object-position: bottom right;
} }
@keyframes App-logo-spin { .App-link {
from { color: #61dafb;
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
} }
import './App.css'; import './App.css';
import React, { useEffect, useRef } from 'react'; import React, { useEffect, useRef } from 'react';
import './index.css'; import './index.css';
import { VerticalTimeline, VerticalTimelineElement } from 'react-vertical-timeline-component';
import 'react-vertical-timeline-component/style.min.css'; import 'react-vertical-timeline-component/style.min.css';
import { GiFamilyTree } from "react-icons/gi";
import { useSelector, useDispatch } from 'react-redux' import { useSelector, useDispatch } from 'react-redux'
import { addAst, setAstList } from './mgSlice' import { setAst, setContext } from './mgSlice'
function App() { function App() {
const ws = useRef(null); const ws = useRef(null);
const dispatch = useDispatch(); const dispatch = useDispatch();
const asts = useSelector(state => state.mg.asts); const ast = useSelector(state => state.mg.ast);
const context = useSelector(state => state.mg.context);
useEffect(() => { useEffect(() => {
ws.current = new WebSocket("ws://localhost:7070/ast-events"); ws.current = new WebSocket("ws://localhost:7070/ast-events");
...@@ -20,8 +19,10 @@ function App() { ...@@ -20,8 +19,10 @@ function App() {
ws.current.onmessage = (event) => { ws.current.onmessage = (event) => {
const json = JSON.parse(event.data); const json = JSON.parse(event.data);
try { try {
if ((json.event = "data")) { if (json.type === "ast") {
dispatch(addAst(json)); dispatch(setAst(json));
} else if (json.type === "context") {
dispatch(setContext(json));
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err);
...@@ -36,72 +37,75 @@ function App() { ...@@ -36,72 +37,75 @@ function App() {
}, [dispatch]); }, [dispatch]);
useEffect(() => { useEffect(() => {
if (asts.length === 0) { if (ast.diagram == null) {
fetch('http://localhost:7070/asts/') console.log("setting ast from WS 1");
fetch('http://localhost:7070/ast/')
.then(res => res.json()) .then(res => res.json())
.then((asts) => { .then((ast) => {
dispatch(setAstList(asts)) console.log("setting ast from WS");
console.log(ast);
dispatch(setAst(ast))
}) })
.catch(console.log) .catch(console.log)
} }
}, [dispatch, asts.length]) if (context.diagram == null) {
console.log("setting ctx from WS");
fetch('http://localhost:7070/context/')
.then(res => res.json())
.then((context) => {
dispatch(setContext(context))
})
.catch(console.log)
} else {
console.log(context)
}
}, [dispatch, ast, context])
return ( return (
<div className="App"> <div className="App">
<header className="App-header"> <header className="App-header">
<ControlPanel /> <ControlPanel
ws={ws}
/>
</header> </header>
<main> <main>
<CurrentState <CurrentContextState
diagram={asts[0] ? asts[0].diagram : ''} diagram={context ? context.diagram : ''}
label={asts[0] ? asts[0].parseRule : ''} label=''
/> />
<VerticalTimeline <CurrentASTState
className='MG-Timeline'> diagram={ast ? ast.diagram : ''}
{asts.map(v => { label={ast ? ast.parseRule : ''}
console.log(v.parseRule) />
return (
<VerticalTimelineElement
className="ast-timeline-event"
contentStyle={{ background: 'rgb(33, 150, 243)', color: '#fff' }}
contentArrowStyle={{ borderRight: '7px solid rgb(33, 150, 243)' }}
date={new Date(v.timestamp).toLocaleTimeString('en-us', { hour12: false })}
iconStyle={{ background: 'rgb(33, 150, 243)', color: '#fff', rotate: '180deg' }}
icon={<GiFamilyTree />}
key={v.timestamp}
position={'right'}
>
<h3 className="vertical-timeline-element-title">{v.parseRule}()</h3>
<p>
<img className="AstInTimeline" src={`data:image/svg+xml;utf8,${encodeURIComponent(v.diagram)}`} alt={v.parseRule} />
</p>
</VerticalTimelineElement>
)
})}
</VerticalTimeline>
</main> </main>
</div> </div>
); );
} }
function CurrentState(props) { function CurrentASTState(props) {
return ( return (
<div className="curent-state"> <div className="AstContainer">
<img className="CurrentAst" src={`data:image/svg+xml;utf8,${encodeURIComponent(props.diagram)}`} alt={props.label} /> <img className="CurrentAst" src={`data:image/svg+xml;utf8,${encodeURIComponent(props.diagram)}`} alt={props.label} />
</div> </div>
) )
} }
class ControlPanel extends React.Component { function CurrentContextState(props) {
render() {
return ( return (
<div className='ControlPanel'> <div className="ContextContainer">
<button onClick={() => { alert('You clicked me!'); }}>connect</button> <img className="CurrentContext" src={`data:image/svg+xml;utf8,${encodeURIComponent(props.diagram)}`} alt={props.label} />
</div> </div>
); )
} }
function ControlPanel(props) {
return (
<div className='ControlPanel'>
<button onClick={() => { props.ws.current.send("cell1 parse") }}>start parsing in cell 1</button>
<button onClick={() => { props.ws.current.send("cell1 reset") }}>reset selections</button>
</div>
)
} }
export default App; export default App;
import { createSlice } from '@reduxjs/toolkit' import {createSlice} from '@reduxjs/toolkit'
export const mgSlice = createSlice({ export const mgSlice = createSlice({
name: 'mg', name: 'mg',
initialState: { initialState: {
asts: [], ast: {},
contexts: {}, context: {},
},
reducers: {
addAst: (state, action) => {
state.asts = [action.payload, ...state.asts];
console.log("added ast, size is " + state.asts.length);
}, },
setAstList: (state, action) => { reducers: {
state.asts = action.payload.reverse(); setAst: (state, action) => {
console.log("set AST list, size is " + state.asts.length); state.ast = action.payload;
console.log("set AST");
},
setContext: (state, action) => {
state.context = action.payload;
console.log("set context");
}
} }
}
}) })
export const { addAst, setAstList } = mgSlice.actions export const {setAst, setContext} = mgSlice.actions
export default mgSlice.reducer export default mgSlice.reducer
\ No newline at end of file
relast_version = 0.3.0-137 relast_version = 0.3.0-137
relast2uml_version = 1.1.0 dumpAst_version = 2.0.2-dev-91
jupyter_version = 5.8.2 jupyter_version = 5.8.2
assertj_version = 3.22.0 assertj_version = 3.22.0
grammar2uml_version = 0.2.1 grammar2uml_version = 0.2.5-21
jastaddgradle_version = 1.14.5 jastaddgradle_version = 1.14.5
javalin_version = 4.6.3 javalin_version = 4.6.4
protobuf_version = 4.0.0-rc-2 protobuf_version = 4.0.0-rc-2
protobuf_plugin_version = 0.8.18 protobuf_plugin_version = 0.8.18
File added
File added
File moved
...@@ -17,9 +17,9 @@ is parsed. ...@@ -17,9 +17,9 @@ is parsed.
## Use cases ## Use cases
- Very simple [Load-Unload grammar](load.md) taken from the original paper [^1] to show a minimal proof-of-concept. - Very simple [Load-Unload grammar](load.md) taken from the original paper [^1] to show a minimal proof-of-concept.
- A [robotic use case](sorting.md) sorting dynamically appearing objects into boxes by colour. - A [robotic use case](acsos.md) sorting dynamically appearing objects into boxes by colour ([ACSOS demo]()https://2022.acsos.org/details/acsos-2022-posters-and-demos/2/Specifying-Reactive-Robotic-Applications-With-Reference-Attribute-Motion-Grammars).
![type:video](https://www.youtube.com/embed/KBuFVsKjA1Q) ![type:video](https://www.youtube.com/embed/KBuFVsKjA1Q)
- A similar robotic use case, but with another input "teaching" where to put the objects and different time
## Bibliogaphy ## Bibliogaphy
[^1]: Dantam, N., Stilman, M., 2013. The Motion Grammar: Analysis of a Linguistic Method for Robot Control. IEEE Trans. Robot. 29, 704–718. https://doi.org/10.1109/TRO.2013.2239553 [^1]: Dantam, N., Stilman, M., 2013. The Motion Grammar: Analysis of a Linguistic Method for Robot Control. IEEE Trans. Robot. 29, 704–718. https://doi.org/10.1109/TRO.2013.2239553
......
AST-000-2022.07.18.17.43.35.270-initial.svg
AST-001-2022.07.18.17.43.39.588-parseEmptyTable.svg
AST-002-2022.07.18.17.43.47.871-parseWait.svg
AST-003-2022.07.18.17.43.48.060-parseWaitForFullTable.svg
AST-004-2022.07.18.17.43.48.272-parseEmptyTable.svg
AST-005-2022.07.18.17.43.56.518-parseWait.svg
AST-006-2022.07.18.17.43.56.718-parseWaitForFullTable.svg
AST-007-2022.07.18.17.43.56.889-parseEmptyTable.svg
AST-008-2022.07.18.17.44.05.105-parseWait.svg
AST-009-2022.07.18.17.44.05.370-parseWaitForFullTable.svg
AST-010-2022.07.18.17.44.05.769-parseObjectAtWrongPlace.svg
AST-011-2022.07.18.17.44.06.152-parseRobotIsReadyToPickToken.svg
AST-012-2022.07.18.17.44.06.526-parseRobotIsReallyReadyToPick.svg
AST-013-2022.07.18.17.44.06.859-parseRobotIsReadyToPick.svg
AST-014-2022.07.18.17.44.07.284-parsePickUpObject.svg
AST-015-2022.07.18.17.44.07.807-parseRobotIsNotReadyToDropToken.svg
AST-016-2022.07.18.17.44.16.137-parseWait.svg
AST-017-2022.07.18.17.44.16.336-parseRobotIsNotReadyToDropToken.svg
AST-018-2022.07.18.17.44.24.593-parseWait.svg
AST-019-2022.07.18.17.44.24.996-parseRobotIsNotReadyToDropToken.svg
AST-020-2022.07.18.17.44.33.736-parseWait.svg
AST-021-2022.07.18.17.44.34.344-parseRobotIsReadyToDropToken.svg
AST-022-2022.07.18.17.44.34.795-parseRobotIsReallyReadyToDrop.svg
AST-023-2022.07.18.17.44.35.148-parseRobotIsReadyToDrop.svg
AST-024-2022.07.18.17.44.35.616-parseRobotIsNotReadyToDrop.svg
AST-025-2022.07.18.17.44.36.052-parseRobotIsReadyToDrop.svg
AST-026-2022.07.18.17.44.36.493-parseRobotIsNotReadyToDrop.svg
AST-027-2022.07.18.17.44.36.798-parseRobotIsReadyToDrop.svg
AST-028-2022.07.18.17.44.37.173-parseRobotIsNotReadyToDrop.svg
AST-029-2022.07.18.17.44.37.512-parseRobotIsReadyToDrop.svg
AST-030-2022.07.18.17.44.37.872-parseRightPlace.svg
AST-031-2022.07.18.17.44.38.308-parseDropObjectAtRightPlace.svg
AST-032-2022.07.18.17.44.38.799-parseMoveObjectToCorrectPlace.svg
AST-033-2022.07.18.17.44.39.211-parseObjectAtWrongPlace.svg
AST-034-2022.07.18.17.44.39.524-parseRobotIsNotReadyToPickToken.svg
AST-035-2022.07.18.17.44.47.970-parseWait.svg
AST-036-2022.07.18.17.44.48.142-parseRobotIsNotReadyToPickToken.svg
AST-037-2022.07.18.17.44.56.356-parseWait.svg
AST-038-2022.07.18.17.44.56.572-parseRobotIsReadyToPickToken.svg
AST-039-2022.07.18.17.44.56.825-parseRobotIsReallyReadyToPick.svg
AST-040-2022.07.18.17.44.57.094-parseRobotIsReadyToPick.svg
AST-041-2022.07.18.17.44.57.328-parseRobotIsNotReadyToPick.svg
AST-042-2022.07.18.17.44.57.607-parseRobotIsReadyToPick.svg
AST-043-2022.07.18.17.44.57.896-parseRobotIsNotReadyToPick.svg
AST-044-2022.07.18.17.44.58.169-parseRobotIsReadyToPick.svg
AST-045-2022.07.18.17.44.58.456-parsePickUpObject.svg
AST-046-2022.07.18.17.44.58.783-parseRobotIsNotReadyToDropToken.svg
AST-047-2022.07.18.17.45.07.121-parseWait.svg
AST-048-2022.07.18.17.45.07.305-parseRobotIsNotReadyToDropToken.svg
AST-049-2022.07.18.17.45.15.564-parseWait.svg
AST-050-2022.07.18.17.45.15.800-parseRobotIsNotReadyToDropToken.svg
AST-051-2022.07.18.17.45.24.125-parseWait.svg
AST-052-2022.07.18.17.45.24.328-parseRobotIsReadyToDropToken.svg
AST-053-2022.07.18.17.45.24.535-parseRobotIsReallyReadyToDrop.svg
AST-054-2022.07.18.17.45.24.828-parseRobotIsReadyToDrop.svg
AST-055-2022.07.18.17.45.25.133-parseRobotIsNotReadyToDrop.svg
AST-056-2022.07.18.17.45.25.385-parseRobotIsReadyToDrop.svg
AST-057-2022.07.18.17.45.25.689-parseRobotIsNotReadyToDrop.svg
AST-058-2022.07.18.17.45.25.998-parseRobotIsReadyToDrop.svg
AST-059-2022.07.18.17.45.26.299-parseRobotIsNotReadyToDrop.svg
AST-060-2022.07.18.17.45.26.574-parseRobotIsReadyToDrop.svg
AST-061-2022.07.18.17.45.26.864-parseRightPlace.svg
AST-062-2022.07.18.17.45.27.156-parseDropObjectAtRightPlace.svg
AST-063-2022.07.18.17.45.27.617-parseMoveObjectToCorrectPlace.svg
AST-064-2022.07.18.17.45.27.991-parseObjectAtWrongPlace.svg
AST-065-2022.07.18.17.45.28.330-parseRobotIsNotReadyToPickToken.svg
AST-066-2022.07.18.17.45.36.597-parseWait.svg
AST-067-2022.07.18.17.45.37.022-parseRobotIsNotReadyToPickToken.svg
AST-068-2022.07.18.17.45.45.385-parseWait.svg
AST-069-2022.07.18.17.45.45.808-parseRobotIsNotReadyToPickToken.svg
AST-070-2022.07.18.17.45.54.253-parseWait.svg
AST-071-2022.07.18.17.45.54.524-parseRobotIsReadyToPickToken.svg
AST-072-2022.07.18.17.45.54.815-parseRobotIsReallyReadyToPick.svg
AST-073-2022.07.18.17.45.55.141-parseRobotIsReadyToPick.svg
AST-074-2022.07.18.17.45.55.508-parseRobotIsNotReadyToPick.svg
AST-075-2022.07.18.17.45.55.795-parseRobotIsReadyToPick.svg
AST-076-2022.07.18.17.45.56.159-parseRobotIsNotReadyToPick.svg
AST-077-2022.07.18.17.45.56.569-parseRobotIsReadyToPick.svg
AST-078-2022.07.18.17.45.56.870-parseRobotIsNotReadyToPick.svg
AST-079-2022.07.18.17.45.57.191-parseRobotIsReadyToPick.svg
AST-080-2022.07.18.17.45.57.480-parsePickUpObject.svg
AST-081-2022.07.18.17.45.57.813-parseRobotIsNotReadyToDropToken.svg
AST-082-2022.07.18.17.46.06.099-parseWait.svg
AST-083-2022.07.18.17.46.06.350-parseRobotIsNotReadyToDropToken.svg
AST-084-2022.07.18.17.46.14.753-parseWait.svg
AST-085-2022.07.18.17.46.15.104-parseRobotIsNotReadyToDropToken.svg
AST-086-2022.07.18.17.46.23.512-parseWait.svg
AST-087-2022.07.18.17.46.23.794-parseRobotIsReadyToDropToken.svg
AST-088-2022.07.18.17.46.24.101-parseRobotIsReallyReadyToDrop.svg
AST-089-2022.07.18.17.46.24.486-parseRobotIsReadyToDrop.svg
AST-090-2022.07.18.17.46.24.794-parseRobotIsNotReadyToDrop.svg
AST-091-2022.07.18.17.46.25.117-parseRobotIsReadyToDrop.svg
AST-092-2022.07.18.17.46.25.461-parseRobotIsNotReadyToDrop.svg
AST-093-2022.07.18.17.46.25.965-parseRobotIsReadyToDrop.svg
AST-094-2022.07.18.17.46.26.445-parseRobotIsNotReadyToDrop.svg
AST-095-2022.07.18.17.46.26.875-parseRobotIsReadyToDrop.svg
AST-096-2022.07.18.17.46.27.270-parseRightPlace.svg
AST-097-2022.07.18.17.46.27.571-parseDropObjectAtRightPlace.svg
AST-098-2022.07.18.17.46.28.040-parseMoveObjectToCorrectPlace.svg
AST-099-2022.07.18.17.46.28.378-parseObjectAtWrongPlace.svg
AST-100-2022.07.18.17.46.28.783-parseRobotIsNotReadyToPickToken.svg
AST-101-2022.07.18.17.46.37.214-parseWait.svg
AST-102-2022.07.18.17.46.37.839-parseRobotIsNotReadyToPickToken.svg
AST-103-2022.07.18.17.46.46.415-parseWait.svg
AST-104-2022.07.18.17.46.46.772-parseRobotIsReadyToPickToken.svg
AST-105-2022.07.18.17.46.47.259-parseRobotIsReallyReadyToPick.svg
AST-106-2022.07.18.17.46.47.773-parseRobotIsReadyToPick.svg
AST-107-2022.07.18.17.46.48.234-parseRobotIsNotReadyToPick.svg
AST-108-2022.07.18.17.46.48.689-parseRobotIsReadyToPick.svg
AST-109-2022.07.18.17.46.49.022-parseRobotIsNotReadyToPick.svg
AST-110-2022.07.18.17.46.49.401-parseRobotIsReadyToPick.svg
AST-111-2022.07.18.17.46.49.769-parsePickUpObject.svg
AST-112-2022.07.18.17.46.50.301-parseRobotIsNotReadyToDropToken.svg
AST-113-2022.07.18.17.46.58.748-parseWait.svg
AST-114-2022.07.18.17.46.59.083-parseRobotIsNotReadyToDropToken.svg
AST-115-2022.07.18.17.47.07.498-parseWait.svg
AST-116-2022.07.18.17.47.07.880-parseRobotIsNotReadyToDropToken.svg
AST-117-2022.07.18.17.47.16.397-parseWait.svg
AST-118-2022.07.18.17.47.16.801-parseRobotIsReadyToDropToken.svg
AST-119-2022.07.18.17.47.17.359-parseRobotIsReallyReadyToDrop.svg
AST-120-2022.07.18.17.47.17.845-parseRobotIsReadyToDrop.svg
AST-121-2022.07.18.17.47.18.346-parseRobotIsNotReadyToDrop.svg
AST-122-2022.07.18.17.47.18.751-parseRobotIsReadyToDrop.svg
AST-123-2022.07.18.17.47.19.190-parseRobotIsNotReadyToDrop.svg
AST-124-2022.07.18.17.47.19.584-parseRobotIsReadyToDrop.svg
AST-125-2022.07.18.17.47.20.046-parseRobotIsNotReadyToDrop.svg
AST-126-2022.07.18.17.47.20.492-parseRobotIsReadyToDrop.svg
AST-127-2022.07.18.17.47.20.938-parseRightPlace.svg
AST-128-2022.07.18.17.47.21.359-parseDropObjectAtRightPlace.svg
AST-129-2022.07.18.17.47.21.787-parseMoveObjectToCorrectPlace.svg
AST-130-2022.07.18.17.47.22.194-parseObjectAtWrongPlace.svg
AST-131-2022.07.18.17.47.22.574-parseRobotIsNotReadyToPickToken.svg
AST-132-2022.07.18.17.47.31.018-parseWait.svg
AST-133-2022.07.18.17.47.31.661-parseRobotIsReadyToPickToken.svg
AST-134-2022.07.18.17.47.32.242-parseRobotIsReallyReadyToPick.svg
AST-135-2022.07.18.17.47.32.687-parseRobotIsReadyToPick.svg
AST-136-2022.07.18.17.47.33.236-parseRobotIsNotReadyToPick.svg
AST-137-2022.07.18.17.47.33.791-parseRobotIsReadyToPick.svg
AST-138-2022.07.18.17.47.34.349-parsePickUpObject.svg
AST-139-2022.07.18.17.47.35.136-parseRobotIsNotReadyToDropToken.svg
AST-140-2022.07.18.17.47.44.054-parseWait.svg
AST-141-2022.07.18.17.47.44.477-parseRobotIsNotReadyToDropToken.svg
AST-142-2022.07.18.17.47.52.949-parseWait.svg
AST-143-2022.07.18.17.47.53.482-parseRobotIsReadyToDropToken.svg
AST-144-2022.07.18.17.47.53.970-parseRobotIsReallyReadyToDrop.svg
AST-145-2022.07.18.17.47.54.457-parseRobotIsReadyToDrop.svg
AST-146-2022.07.18.17.47.54.904-parseRobotIsNotReadyToDrop.svg
AST-147-2022.07.18.17.47.55.363-parseRobotIsReadyToDrop.svg
AST-148-2022.07.18.17.47.55.801-parseRobotIsNotReadyToDrop.svg
AST-149-2022.07.18.17.47.56.296-parseRobotIsReadyToDrop.svg
AST-150-2022.07.18.17.47.56.817-parseRightPlace.svg
AST-151-2022.07.18.17.47.57.276-parseDropObjectAtRightPlace.svg
AST-152-2022.07.18.17.47.57.822-parseMoveObjectToCorrectPlace.svg
AST-153-2022.07.18.17.47.58.320-parseObjectAtWrongPlace.svg
AST-154-2022.07.18.17.47.58.833-parseRobotIsNotReadyToPickToken.svg
AST-155-2022.07.18.17.48.07.320-parseWait.svg
AST-156-2022.07.18.17.48.07.777-parseRobotIsNotReadyToPickToken.svg
AST-157-2022.07.18.17.48.16.287-parseWait.svg
AST-158-2022.07.18.17.48.16.787-parseRobotIsReadyToPickToken.svg
AST-159-2022.07.18.17.48.17.286-parseRobotIsReallyReadyToPick.svg
AST-160-2022.07.18.17.48.17.803-parseRobotIsReadyToPick.svg
AST-161-2022.07.18.17.48.18.309-parseRobotIsNotReadyToPick.svg
AST-162-2022.07.18.17.48.18.793-parseRobotIsReadyToPick.svg
AST-163-2022.07.18.17.48.19.284-parseRobotIsNotReadyToPick.svg
AST-164-2022.07.18.17.48.19.763-parseRobotIsReadyToPick.svg
AST-165-2022.07.18.17.48.20.323-parsePickUpObject.svg
AST-166-2022.07.18.17.48.20.954-parseRobotIsNotReadyToDropToken.svg
AST-167-2022.07.18.17.48.29.505-parseWait.svg
AST-168-2022.07.18.17.48.29.956-parseRobotIsNotReadyToDropToken.svg
AST-169-2022.07.18.17.48.38.432-parseWait.svg
AST-170-2022.07.18.17.48.38.984-parseRobotIsReadyToDropToken.svg
AST-171-2022.07.18.17.48.39.487-parseRobotIsReallyReadyToDrop.svg
AST-172-2022.07.18.17.48.39.995-parseRobotIsReadyToDrop.svg
AST-173-2022.07.18.17.48.40.646-parseRobotIsNotReadyToDrop.svg
AST-174-2022.07.18.17.48.41.455-parseRobotIsReadyToDrop.svg
AST-175-2022.07.18.17.48.42.167-parseRobotIsNotReadyToDrop.svg
AST-176-2022.07.18.17.48.43.036-parseRobotIsReadyToDrop.svg
AST-177-2022.07.18.17.48.43.694-parseRightPlace.svg
AST-178-2022.07.18.17.48.44.270-parseDropObjectAtRightPlace.svg
AST-179-2022.07.18.17.48.45.067-parseMoveObjectToCorrectPlace.svg
AST-180-2022.07.18.17.48.45.805-parseObjectAtWrongPlace.svg
AST-181-2022.07.18.17.48.46.580-parseRobotIsNotReadyToPickToken.svg
AST-182-2022.07.18.17.48.55.311-parseWait.svg
AST-183-2022.07.18.17.48.55.877-parseRobotIsReadyToPickToken.svg
AST-184-2022.07.18.17.48.56.584-parseRobotIsReallyReadyToPick.svg
AST-185-2022.07.18.17.48.57.159-parseRobotIsReadyToPick.svg
AST-186-2022.07.18.17.48.57.767-parseRobotIsNotReadyToPick.svg
AST-187-2022.07.18.17.48.58.318-parseRobotIsReadyToPick.svg
AST-188-2022.07.18.17.48.58.854-parsePickUpObject.svg
AST-189-2022.07.18.17.48.59.568-parseRobotIsNotReadyToDropToken.svg
AST-190-2022.07.18.17.49.08.199-parseWait.svg
AST-191-2022.07.18.17.49.08.763-parseRobotIsNotReadyToDropToken.svg
AST-192-2022.07.18.17.49.17.390-parseWait.svg
AST-193-2022.07.18.17.49.17.940-parseRobotIsReadyToDropToken.svg
AST-194-2022.07.18.17.49.18.601-parseRobotIsReallyReadyToDrop.svg
AST-195-2022.07.18.17.49.19.185-parseRobotIsReadyToDrop.svg
AST-196-2022.07.18.17.49.19.787-parseRobotIsNotReadyToDrop.svg
AST-197-2022.07.18.17.49.20.367-parseRobotIsReadyToDrop.svg
AST-198-2022.07.18.17.49.20.988-parseRobotIsNotReadyToDrop.svg
AST-199-2022.07.18.17.49.21.715-parseRobotIsReadyToDrop.svg
AST-200-2022.07.18.17.49.22.301-parseRightPlace.svg
AST-201-2022.07.18.17.49.22.924-parseDropObjectAtRightPlace.svg
AST-202-2022.07.18.17.49.23.638-parseMoveObjectToCorrectPlace.svg
AST-203-2022.07.18.17.49.24.549-parseNotEmptyTable.svg
AST-204-2022.07.18.17.49.33.854-parseWait.svg
AST-205-2022.07.18.17.49.34.525-parseWaitForEmptyTable.svg
AST-206-2022.07.18.17.49.35.242-parseNotEmptyTable.svg
AST-207-2022.07.18.17.49.43.910-parseWait.svg
AST-208-2022.07.18.17.49.44.712-parseWaitForEmptyTable.svg
AST-209-2022.07.18.17.49.45.507-parseEmptyTable.svg
AST-210-2022.07.18.17.49.46.201-parseTidy.svg
AST-211-2022.07.18.17.49.46.867-complete.svg
Context-RobotScene-2022.07.18.17.43.35.056-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.43.59.407-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.44.07.337-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.44.22.245-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.44.25.162-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.44.30.153-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.44.54.865-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.44.55.053-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.44.58.520-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.45.13.036-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.45.19.256-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.45.21.852-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.45.43.100-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.45.47.121-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.45.47.402-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.45.57.532-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.46.20.101-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.46.40.928-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.46.42.453-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.46.42.683-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.46.49.833-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.47.08.325-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.47.31.345-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.47.31.546-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.47.34.407-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.47.52.294-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.48.09.459-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.48.09.552-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.48.20.392-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.48.35.692-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.48.55.068-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.48.55.168-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.48.58.861-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.49.12.098-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.49.37.572-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.49.37.666-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.49.46.244-RobotScene.setTable()-DONE.svg
Context-RobotScene-2022.07.18.17.49.56.229-RobotScene.setTable()-DONE.svg
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment