Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.31 KB | None | 0 0
  1. <!DOCTYPE aesl-source>
  2. <network>
  3.  
  4.  
  5. <!--list of global events-->
  6. <event size="0" name="start_calibration"/>
  7. <event size="0" name="follow_line"/>
  8. <event size="2" name="vars"/>
  9.  
  10.  
  11. <!--list of constants-->
  12. <constant value="2" name="CALIBRATION_STEPS"/>
  13. <constant value="35" name="MAX_REFLECTION_VARIATION_PERCENTAGE"/>
  14.  
  15.  
  16. <!--show keywords state-->
  17. <keywords flag="true"/>
  18.  
  19.  
  20. <!--node thymio-II-->
  21. <node nodeId="7198" name="thymio-II">var calibrating = -1
  22. var following_line = -1
  23. #var min_ambiant[2] = [32767, 32767]
  24. #var max_ambiant[2] = [-32768, -32768]
  25. var min_reflected[2] = [32767, 32767]
  26. var max_reflected[2] = [-32768, -32768]
  27. var white_threshold[2] = [-32768, -32768]
  28. #var black_threshold[2] = [32767, 32767]
  29.  
  30. # [((last) time, motor.left, motor.right), (pre-last), ...]
  31. var calibration_values[CALIBRATION_STEPS * 3] = [0, 0, 0, 3000, 200, 200]
  32. #[0, 0, 0, 3000, 100, 100, 2500, 100, -100, 3000, 100, 100, 2500, 100, -100, 3000, 100, 100, 2500, 100, -100, 3000, 100, 100]
  33.  
  34. var var1 = -1
  35. var var2 = -1
  36. var var3 = -1
  37. var var4 = -1
  38.  
  39. var lastTurned = 0
  40. var emergency = 0
  41.  
  42. timer.period[0] = 0
  43. timer.period[1] = 0
  44.  
  45. sub start_calibration
  46. #min_ambiant = [32767, 32767]
  47. #max_ambiant = [-32768, -32768]
  48. min_reflected = [32767, 32767]
  49. max_reflected = [-32768, -32768]
  50. calibrating = CALIBRATION_STEPS
  51. timer.period[0] = 100
  52. return
  53.  
  54. sub update_calibration
  55. # min_ambiant
  56. #call math.min(min_ambiant[0], min_ambiant[0], prox.ground.ambiant[0])
  57. #call math.min(min_ambiant[1], min_ambiant[1], prox.ground.ambiant[1])
  58.  
  59. # max_ambiant
  60. #call math.max(max_ambiant[0], max_ambiant[0], prox.ground.ambiant[0])
  61. #call math.max(max_ambiant[1], max_ambiant[1], prox.ground.ambiant[1])
  62.  
  63. # min_reflected
  64. call math.min(min_reflected[0], min_reflected[0], prox.ground.reflected[0])
  65. call math.min(min_reflected[1], min_reflected[1], prox.ground.reflected[1])
  66.  
  67. # max_reflected
  68. call math.max(max_reflected[0], max_reflected[0], prox.ground.reflected[0])
  69. call math.max(max_reflected[1], max_reflected[1], prox.ground.reflected[1])
  70. return
  71.  
  72. sub follow_line
  73. following_line = 1
  74. return
  75.  
  76. onevent prox
  77. # collision detection
  78. if (motor.left.target != -motor.right.target) and (((motor.left.target > 20 or motor.right.target > 20) and (prox.horizontal[0] > 3000 or prox.horizontal[1] > 3000 or prox.horizontal[2] > 3000 or prox.horizontal[3] > 3000 or prox.horizontal[4] > 3000)) or ((motor.left.target < -20 or motor.right.target < -20) and (prox.horizontal[5] > 3000 or prox.horizontal[6] > 3000))) then
  79. motor.left.target = 0
  80. motor.right.target = 0
  81. following_line = 0
  82. return
  83. end
  84.  
  85.  
  86. if calibrating > 0 then
  87. callsub update_calibration
  88. elseif following_line > 0 then
  89. var1 = prox.ground.reflected[0]
  90. var2 = prox.ground.reflected[1]
  91.  
  92. lastTurned = 0
  93.  
  94. if var1 &lt; white_threshold[0] then
  95. var1 = 500
  96. lastTurned = lastTurned - 1
  97. else
  98. var1 = 0
  99. end
  100. if var2 &lt; white_threshold[1] then
  101. var2 = 500
  102. else
  103. var2 = 0
  104. lastTurned = lastTurned + 1
  105. end
  106.  
  107. motor.left.target = var2
  108. motor.right.target = var1
  109.  
  110. if var1 == 0 and var2 == 0 then
  111. if emergency == 0 then
  112. if lastTurned != 0 then
  113. emergency = lastTurned
  114. timer.period[1] = 1000
  115. end
  116. elseif emergency == 2 then
  117. # lost the line :(
  118. emergency = 0
  119. following_line = 0
  120. else
  121. # emergency turn
  122. motor.left.target = 200 * emergency
  123. motor.right.target = -200 * emergency
  124. end
  125. else
  126. emergency = 0
  127. end
  128. end
  129. return
  130.  
  131. onevent timer0
  132. if calibrating > 0 then
  133. if calibrating == 1 then
  134. var1 = (max_reflected[0] - min_reflected[0]) / 10 * MAX_REFLECTION_VARIATION_PERCENTAGE / 10
  135. white_threshold[0] = max_reflected[0] - var1
  136. var1 = (max_reflected[1] - min_reflected[1]) / 10 * MAX_REFLECTION_VARIATION_PERCENTAGE / 10
  137. white_threshold[1] = max_reflected[1] - var1
  138. timer.period[0] = 0
  139. end
  140. calibrating--
  141. timer.period[0] = calibration_values[calibrating*3]
  142. motor.left.target = calibration_values[(calibrating*3)+1]
  143. motor.right.target = calibration_values[(calibrating*3)+2]
  144. end
  145. return
  146.  
  147. onevent timer1
  148. if emergency != 0 then
  149. emergency = 2
  150. timer.period[1] = 0
  151. end
  152. return
  153.  
  154. onevent start_calibration
  155. callsub start_calibration
  156. return
  157.  
  158. onevent follow_line
  159. callsub follow_line
  160. return</node>
  161.  
  162.  
  163. </network>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement