forked from tuuzdu/lua_pioneer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrajectoryEight.lua
124 lines (103 loc) · 2.8 KB
/
trajectoryEight.lua
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
-- создание порта управления магнитом
local magnet = Gpio.new(Gpio.A, 1, Gpio.OUTPUT)
-- создание порта управления светодиодом
local ledbar = Ledbar.new(29)
local colors = { red = {1, 0, 0},
green = {0, 1, 0},
blue = {0, 0, 1},
purple = {1, 0, 1},
cyan = {0, 1, 1},
yellow = {1, 1, 0},
white = {1, 1, 1},
black = {0, 0, 0} }
local ledStateRed = false
local ledStateGreen = false
local ledStateBlue = false
-- переменная текущего состояния
local curr_state = "START"
local angle = 1.5
local function LEDRed()
if ledStateRed then
ledStateRed = false
ledbar:set(0, 0, 0, 0)
else
ledStateRed = true
ledbar:set(0, 1, 0, 0)
end
end
local function LEDGreen()
if ledStateGreen then
ledStateGreen = false
ledbar:set(3, 0, 0, 0)
else
ledStateGreen = true
ledbar:set(3, 0, 1 , 0)
end
end
local function LEDBlue()
if ledStateBlue then
ledStateBlue = false
ledbar:set(1, 0, 0, 0)
ledbar:set(2, 0, 0, 0)
else
ledStateBlue = true
ledbar:set(1, 0, 0, 1)
ledbar:set(2, 0, 0, 1)
end
end
-- таблица функций, вызываемых в зависимости от состояния
action = {
["START"] = function(x)
ledbar:set(1, 1, 0, 1)
ledbar:set(2, 1, 0, 1)
-- sleep(2)
ap.push(Ev.MCE_PREFLIGHT)
-- sleep(2)
ap.push(Ev.MCE_TAKEOFF)
-- переход в следующее состояние
curr_state = "_PIONEER_POINT_2"
end,
["_PIONEER_POINT_2"] = function (x)
ap.goToLocalPoint(0, 0, 1.2)
-- переход в следующее состояние
curr_state = "_PIONEER_LED_2"
end,
["_PIONEER_LED_2"] = function (x)
x1 = 1.5 * math.cos(angle)
y1 = 0.75 * math.sin(2 * angle)
-- x1 = 2500 + 1500 * math.cos(angle)
-- y1 = 2500 + 750 * math.sin(2 * angle)
-- angle = angle + 0.1
ap.goToLocalPoint(x1, y1, 1.2)
-- переход в следующее состояние
--curr_state = "_PIONEER_POINT_2"
end
}
-- функция обработки событий, автоматически вызывается автопилотом
function callback(event)
if (event == Ev.ALTITUDE_REACHED) then
LEDRed()
action[curr_state]()
end
if (event == Ev.SHOCK) then
ledbar:set(0, 1, 0, 0)
ledbar:set(1, 1, 0, 0)
ledbar:set(2, 1, 0, 0)
ledbar:set(3, 1, 0, 0)
end
if (event == Ev.POINT_REACHED) then
LEDGreen()
end
if (event == Ev.COPTER_LANDED) then
action[curr_state]()
end
if (event == Ev.POINT_DECELERATION) then
LEDBlue()
action[curr_state]()
end
if (event == Ev.SYNC_START) then
ap.push(Ev.MCE_LANDING)
end
end
-- вызов функции из таблицы состояний, соответствующей первому состоянию
action[curr_state]()