-
Notifications
You must be signed in to change notification settings - Fork 3
/
Mission2.qml
157 lines (141 loc) · 3.56 KB
/
Mission2.qml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import QtQuick 2.6
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.0
import "qrc:/thymio-ar"
import "qrc:/thymio-vpl2"
import "qrc:/storytelling"
Item {
readonly property Vision vision: _vision
readonly property int motorMin: -500
readonly property int motorMax: 500
property vector2d robotPos: vision.robotPose.times(Qt.vector3d(0, 0, 0)).toVector2d()
property vector2d targetCenter: Qt.vector2d(0.5, 0)
property real targetRadius: 0.1
Component.onCompleted: {
camera.start();
}
Component.onDestruction: {
camera.stop();
}
Vision {
id: _vision
landmarks: Landmark {
id: landmark
fileName: ":/assets/marker.xml"
property string icon: "images/marker-312.png"
}
}
Scene3d {
anchors.fill: parent
camera: landmark.pose
lens: vision.lens
robotPose: vision.robotPose
Cave {}
}
Dialogue {
ThymioLookAt {
poseOk: vision.robot.found && landmark.found
pose: vision.robotPose
eye: Qt.vector2d(-0.1, -0.1)
center: targetCenter
}
// TODO: move erratically
ThymioSays { message: "That’s a problem. It seems I don’t have a good control on my motors…" }
ThymioSays { message: "… and I don’t see anything in here." }
Choice {
ThymioSays { message: "Could you lead me outside of this cave?" }
choices: ["Yes, of course. What should I do?"]
}
ThymioSays { message: "It’s not hard for you." }
ThymioSays {
onEnabledChanged: if (enabled) {
controls.visible = true
}
message: "These bars control the motors of each of my wheels."
}
ThymioSays { message: "Try to use them and get me out of this cave." }
ThymioSays { message: "And please, don’t crash me into a wall…" }
Wait {
onEnabledChanged: if (enabled) {
controls.enabled = true
}
SystemSays { message: "<u>Objective</u>: Help Thymio out of this cave by driving it." }
// TODO: prevent crashes
// * Watch out!
// * Please, don’t crash me into a wall…
// * That was close!
// * Emergency stop!
until: targetCenter.minus(robotPos).length() < targetRadius
}
}
MultiPointTouchArea {
id: controls
visible: false
enabled: false
onEnabledChanged: if (enabled) {
thymio.events = {
"setMotorTarget": 2,
};
thymio.source =
"onevent setMotorTarget" + "\n" +
"motor.left.target = event.args[0]" + "\n" +
"motor.right.target = event.args[1]" + "\n";
}
Timer {
interval: 100
running: controls.enabled
repeat: true
onTriggered: {
aseba.emit(0, [motorLeftTarget.value, motorRightTarget.value]);
}
}
mouseEnabled: false
height: parent.height / 2
width: parent.width
anchors.verticalCenter: parent.verticalCenter
onTouchUpdated: {
var left = undefined;
var right = undefined;
for (var i = 0; i < touchPoints.length; ++i) {
var point = touchPoints[i];
if (point.startX < width / 2) {
if (left === undefined) {
left = motorMax - (point.y * (motorMax - motorMin) / height);
}
} else {
if (right === undefined) {
right = motorMax - (point.y * (motorMax - motorMin) / height);
}
}
}
motorLeftTarget.value = left || 0;
motorRightTarget.value = right || 0;
}
RowLayout {
anchors.fill: parent
Rectangle {
width: parent.width / 5
}
Slider {
id: motorLeftTarget
Layout.fillHeight: true
orientation: Qt.Vertical
from: motorMin
to: motorMax
}
Rectangle {
Layout.fillWidth: true
}
Slider {
id: motorRightTarget
Layout.fillHeight: true
orientation: Qt.Vertical
from: motorMin
to: motorMax
}
Rectangle {
width: parent.width / 5
}
}
}
}