LUADOC - Farming Simulator 19

Script v1.7.1.0

Engine v1.7.1.0

Foundation Reference

AITurnStrategyBulb2Reverse

Description
- / \ | | | / | | | | Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved.
Parent
AITurnStrategy
Functions

delete

Description
Definition
delete()
Code
31function AITurnStrategyBulb2Reverse:delete()
32 self.maxTurningSizeBox = {}
33 self.maxTurningSizeBox2 = {}
34end

new

Description
Definition
new()
Code
15function AITurnStrategyBulb2Reverse:new(customMt)
16 if customMt == nil then
17 customMt = AITurnStrategyBulb2Reverse_mt
18 end
19
20 local self = AITurnStrategy:new(customMt)
21 self.strategyName = "AITurnStrategyBulb2Reverse"
22 self.isReverseStrategy = true
23
24 self.turnBox = self:createTurningSizeBox()
25
26 return self
27end

startTurn

Description
Definition
startTurn()
Code
38function AITurnStrategyBulb2Reverse:startTurn(driveStrategyStraight)
39 if not AITurnStrategyDefault:superClass().startTurn(self, driveStrategyStraight) then
40 return false
41 end
42 local turnData = driveStrategyStraight.turnData
43
44 local sideOffset
45 if self.turnLeft then
46 sideOffset = turnData.sideOffsetLeft
47 else
48 sideOffset = turnData.sideOffsetRight
49 end
50
51 -- shall we check for free space ?
52 local zOffset = self.distanceToCollision
53 self:updateTurningSizeBox(self.turnBox, self.turnLeft, turnData, 0)
54 if self.collisionDetected == false then
55 zOffset = self:getZOffsetForTurn(self.turnBox, zOffset)
56 else
57 zOffset = zOffset + 2*self.turnBox.size[3]
58 end
59
60 -- start with centre of second circle
61 local c2X,c2Y,c2Z
62 if sideOffset >= 0 then
63 c2X,c2Y,c2Z = turnData.radius+2*sideOffset,0,0
64 else
65 c2X,c2Y,c2Z = -turnData.radius+2*sideOffset,0,0
66 end
67
68 local alpha = math.acos(math.abs(sideOffset)/turnData.radius)
69
70 -- center of first circle
71 local c1X,c1Y,c1Z
72 if sideOffset >= 0 then
73 c1X = turnData.radius
74 else
75 c1X = -turnData.radius
76 end
77 c1Y = 0
78 c1Z = math.sin(alpha)*2*turnData.radius
79
80 c1Z = c1Z + turnData.zOffsetTurn
81 c2Z = c2Z + turnData.zOffsetTurn
82
83 local rvX,rvY,rvZ = getWorldRotation(self.vehicle:getAIVehicleDirectionNode())
84
85 -- now shift segments by length of bulb
86 local xb = math.max(turnData.toolOverhang.front.xb, turnData.toolOverhang.back.xb)
87 local zb = 0 --math.max(turnData.toolOverhang.front.zb, turnData.toolOverhang.back.zb)
88 local xt = math.max(turnData.toolOverhang.front.xt, turnData.toolOverhang.back.xt)
89 local zt = 0 --math.max(turnData.toolOverhang.front.zt, turnData.toolOverhang.back.zt)
90 local delta = math.max(xb, zb, turnData.radius + xt, turnData.radius + zt)
91
92 local fullBulbLength = c1Z + delta
93 local bulbLength = math.max(0, fullBulbLength - zOffset) --self.distanceToCollision - maxZ)
94
95 --# first straight
96 local segment = {}
97 segment.isCurve = false
98 segment.moveForward = (c1Z-bulbLength) > 0
99 segment.slowDown = true
100 if segment.moveForward then
101 segment.skipToNextSegmentDistanceThreshold = 3
102 end
103 segment.startPoint = self:getVehicleToWorld(0,0,0, true)
104 segment.endPoint = self:getVehicleToWorld(0,0,c1Z-bulbLength, true)
105 table.insert(self.turnSegments, segment)
106
107 --# first curve
108 local segment = {}
109 segment.isCurve = true
110 segment.moveForward = true
111 segment.radius = turnData.radius
112 segment.o = createTransformGroup("segment1")
113 link(getRootNode(), segment.o)
114 setTranslation(segment.o, self:getVehicleToWorld(c1X,c1Y,c1Z-bulbLength) )
115 setRotation(segment.o, rvX,rvY,rvZ)
116 if sideOffset >= 0 then
117 segment.startAngle = math.pi
118 segment.endAngle = -alpha
119 else
120 segment.startAngle = 0
121 segment.endAngle = math.pi + alpha
122 end
123 table.insert(self.turnSegments, segment)
124
125 --# second curve
126 local segment = {}
127 segment.isCurve = true
128 segment.moveForward = true
129 segment.radius = turnData.radius
130 segment.o = createTransformGroup("segment2")
131 link(getRootNode(), segment.o)
132 setTranslation(segment.o, self:getVehicleToWorld(c2X,c2Y,c2Z-bulbLength) )
133 setRotation(segment.o, rvX,rvY,rvZ)
134 if sideOffset >= 0 then
135 segment.startAngle = math.pi - alpha
136 segment.endAngle = math.pi
137 else
138 segment.startAngle = alpha
139 segment.endAngle = 0
140 end
141 table.insert(self.turnSegments, segment)
142
143 --# pre final straight
144 local segment = {}
145 segment.isCurve = false
146 --segment.moveForward = true
147 segment.moveForward = (c2Z-bulbLength) > (c2Z-2*fullBulbLength)
148 segment.slowDown = true
149 segment.checkAlignmentToSkipSegment = true
150 --segment.checkForValidArea = not self.vehicle.aiAlignedProcessing --true
151 local x = 2*sideOffset
152 segment.startPoint = self:getVehicleToWorld(x,0,c2Z-bulbLength, true)
153 segment.endPoint = self:getVehicleToWorld(x,0,c2Z-2*fullBulbLength, true)
154 table.insert(self.turnSegments, segment)
155
156 --# final straight
157 --local zFinal = math.min(turnData.zOffset, turnData.toolOverhang.front.zt - turnData.toolOverhang.back.zt)
158 local zFinal = turnData.zOffset
159 local segment = {}
160 segment.isCurve = false
161 segment.moveForward = (c2Z-2*fullBulbLength) > zFinal
162 segment.slowDown = true
163 --segment.findEndOfField = true
164 segment.startPoint = self:getVehicleToWorld(x,0,c2Z-2*fullBulbLength, true)
165 segment.endPoint = self:getVehicleToWorld(x,0,zFinal, true)
166 table.insert(self.turnSegments, segment)
167
168 self:startTurnFinalization()
169
170 return true
171end

updateTurningSizeBox

Description
Definition
updateTurningSizeBox()
Code
176function AITurnStrategyBulb2Reverse:updateTurningSizeBox(box, turnLeft, turnData, lookAheadDistance)
177
178 local sideOffset
179 if turnLeft then
180 sideOffset = turnData.sideOffsetLeft
181 else
182 sideOffset = turnData.sideOffsetRight
183 end
184
185 -- start with centre of second circle
186 local c2X,c2Y,c2Z
187 if sideOffset >= 0 then
188 c2X,c2Y,c2Z = turnData.radius+2*sideOffset,0,0
189 else
190 c2X,c2Y,c2Z = -turnData.radius+2*sideOffset,0,0
191 end
192
193 local alpha = math.acos(math.abs(sideOffset)/turnData.radius)
194
195 -- center of first circle
196 local c1X,c1Y,c1Z
197 if sideOffset >= 0 then
198 c1X = turnData.radius
199 else
200 c1X = -turnData.radius
201 end
202 c1Y = 0
203 c1Z = math.sin(alpha)*2*turnData.radius
204
205 c1Z = c1Z + turnData.zOffsetTurn
206 c2Z = c2Z + turnData.zOffsetTurn
207
208 --local bulbLength = c1Z + math.max(turnData.sideOffsetLeft, turnData.sideOffsetRight, turnData.toolOverhang.back.xt, turnData.toolOverhang.back.zt, turnData.toolOverhang.front.xt, turnData.toolOverhang.front.zt)
209 --c1Z = c1Z - bulbLength
210 --c2Z = c2Z - bulbLength
211
212 --# 3) estimate final size of bounding box
213
214 local xb = math.max(turnData.toolOverhang.front.xb, turnData.toolOverhang.back.xb)
215 --local zb = math.max(turnData.toolOverhang.front.zb, turnData.toolOverhang.back.zb)
216 local xt = math.max(turnData.toolOverhang.front.xt, turnData.toolOverhang.back.xt)
217 --local zt = math.max(turnData.toolOverhang.front.zt, turnData.toolOverhang.back.zt)
218 --local delta = math.max(xb, zb, turnData.radius + xt, turnData.radius + zt)
219 local delta = math.max(xb, turnData.radius + xt)
220
221 local maxX = c1X + delta
222 local minX = c1X - delta
223
224 local maxZ = math.max(turnData.toolOverhang.front.zt, turnData.zOffset + turnData.toolOverhang.back.zt)
225 --local maxZ = turnData.toolOverhang.front.zt
226
227 box.center[1], box.center[2], box.center[3] = maxX - (maxX-minX)/2, 0, maxZ/2 + lookAheadDistance/2
228 box.size[1], box.size[2], box.size[3] = (maxX-minX)/2, 5, maxZ/2 + lookAheadDistance/2
229
230 self:adjustHeightOfTurningSizeBox(box)
231end