roby 0.8.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (644) hide show
  1. checksums.yaml +7 -0
  2. data/.deep-cover.rb +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +24 -0
  5. data/.simplecov +10 -0
  6. data/.travis.yml +17 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +15 -0
  9. data/README.md +11 -0
  10. data/Rakefile +47 -177
  11. data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
  12. data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
  13. data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
  14. data/benchmark/{genom.rb → attic/genom.rb} +0 -0
  15. data/benchmark/attic/transactions.rb +62 -0
  16. data/benchmark/plan_basic_operations.rb +28 -0
  17. data/benchmark/relations/graph.rb +63 -0
  18. data/benchmark/ruby/identity.rb +18 -0
  19. data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
  20. data/benchmark/ruby/yield_vs_block.rb +35 -0
  21. data/benchmark/run +5 -0
  22. data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
  23. data/benchmark/transactions.rb +99 -51
  24. data/bin/roby +38 -197
  25. data/bin/roby-display +14 -0
  26. data/bin/roby-log +3 -176
  27. data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
  28. data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
  29. data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
  30. data/doc/guide/{src → attic}/abstraction/index.page +1 -1
  31. data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
  32. data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
  33. data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
  34. data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
  35. data/doc/guide/attic/cycle/error_handling.page +98 -0
  36. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
  37. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
  38. data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
  39. data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
  40. data/doc/guide/{src → attic}/cycle/index.page +1 -1
  41. data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
  42. data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
  43. data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
  44. data/doc/guide/attic/plans/building_plans.page +89 -0
  45. data/doc/guide/attic/plans/code.page +192 -0
  46. data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
  47. data/doc/guide/attic/plans/index.page +7 -0
  48. data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
  49. data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
  50. data/doc/guide/attic/plans/querying_plans.page +5 -0
  51. data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
  52. data/doc/guide/config.yaml +7 -4
  53. data/doc/guide/ext/extended_menu.rb +29 -0
  54. data/doc/guide/ext/init.rb +6 -0
  55. data/doc/guide/ext/rdoc_links.rb +7 -6
  56. data/doc/guide/src/advanced_concepts/history.page +5 -0
  57. data/doc/guide/src/advanced_concepts/index.page +11 -0
  58. data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
  59. data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
  60. data/doc/guide/src/advanced_concepts/transactions.page +5 -0
  61. data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
  62. data/doc/guide/src/base.template +96 -0
  63. data/doc/guide/src/basics_shell_header.txt +5 -7
  64. data/doc/guide/src/building/action_coordination.page +96 -0
  65. data/doc/guide/src/building/actions.page +124 -0
  66. data/doc/guide/src/building/file_layout.page +71 -0
  67. data/doc/guide/src/building/index.page +50 -0
  68. data/doc/guide/src/building/patterns.page +86 -0
  69. data/doc/guide/src/building/patterns_forwarding.png +0 -0
  70. data/doc/guide/src/building/patterns_forwarding.svg +277 -0
  71. data/doc/guide/src/building/runtime.page +95 -0
  72. data/doc/guide/src/building/task_models.page +94 -0
  73. data/doc/guide/src/building/tasks.page +284 -0
  74. data/doc/guide/src/concepts/error_handling.page +100 -0
  75. data/doc/guide/src/concepts/exception_propagation.png +0 -0
  76. data/doc/guide/src/concepts/exception_propagation.svg +445 -0
  77. data/doc/guide/src/concepts/execution.page +85 -0
  78. data/doc/guide/src/concepts/execution.png +0 -0
  79. data/doc/guide/src/concepts/execution.svg +573 -0
  80. data/doc/guide/src/concepts/execution_cycle.png +0 -0
  81. data/doc/guide/src/concepts/garbage_collection.page +57 -0
  82. data/doc/guide/src/concepts/index.page +27 -0
  83. data/doc/guide/src/concepts/plans.page +101 -0
  84. data/doc/guide/src/concepts/policy.page +31 -0
  85. data/doc/guide/src/concepts/reactor.page +61 -0
  86. data/doc/guide/src/concepts/simple_plan_example.png +0 -0
  87. data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
  88. data/doc/guide/src/default.template +9 -74
  89. data/doc/guide/src/event_relations/forward.page +71 -0
  90. data/doc/guide/src/event_relations/index.page +12 -0
  91. data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
  92. data/doc/guide/src/event_relations/signal.page +55 -0
  93. data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
  94. data/doc/guide/src/htmldoc.metainfo +21 -8
  95. data/doc/guide/src/index.page +8 -3
  96. data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
  97. data/doc/guide/src/installation/publications.page +14 -0
  98. data/doc/guide/src/{introduction → installation}/videos.page +14 -7
  99. data/doc/guide/src/interacting/index.page +16 -0
  100. data/doc/guide/src/interacting/run.page +33 -0
  101. data/doc/guide/src/interacting/shell.page +95 -0
  102. data/doc/guide/src/plugins/creating_plugins.page +72 -0
  103. data/doc/guide/src/plugins/index.page +27 -5
  104. data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
  105. data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
  106. data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
  107. data/doc/guide/src/style_screen.css +687 -0
  108. data/doc/guide/src/task_relations/dependency.page +107 -0
  109. data/doc/guide/src/task_relations/executed_by.page +77 -0
  110. data/doc/guide/src/task_relations/index.page +12 -0
  111. data/doc/guide/src/task_relations/new_relations.page +119 -0
  112. data/doc/guide/src/task_relations/planned_by.page +46 -0
  113. data/doc/guide/src/tutorial/app.page +117 -0
  114. data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
  115. data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
  116. data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
  117. data/doc/guide/src/tutorial/events.page +195 -0
  118. data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
  119. data/doc/guide/src/tutorial/index.page +13 -0
  120. data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
  121. data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
  122. data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
  123. data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
  124. data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
  125. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
  126. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
  127. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
  128. data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
  129. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
  130. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
  131. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
  132. data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
  133. data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
  134. data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
  135. data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
  136. data/doc/guide/src/tutorial/relations_display.page +153 -0
  137. data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
  138. data/doc/guide/src/tutorial/shell.page +121 -0
  139. data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
  140. data/doc/guide/src/tutorial/tasks.page +374 -0
  141. data/lib/roby.rb +102 -47
  142. data/lib/roby/actions.rb +17 -0
  143. data/lib/roby/actions/action.rb +80 -0
  144. data/lib/roby/actions/interface.rb +45 -0
  145. data/lib/roby/actions/library.rb +23 -0
  146. data/lib/roby/actions/models/action.rb +224 -0
  147. data/lib/roby/actions/models/coordination_action.rb +58 -0
  148. data/lib/roby/actions/models/interface.rb +22 -0
  149. data/lib/roby/actions/models/interface_base.rb +294 -0
  150. data/lib/roby/actions/models/library.rb +12 -0
  151. data/lib/roby/actions/models/method_action.rb +90 -0
  152. data/lib/roby/actions/task.rb +114 -0
  153. data/lib/roby/and_generator.rb +125 -0
  154. data/lib/roby/app.rb +2795 -829
  155. data/lib/roby/app/autotest_console_reporter.rb +138 -0
  156. data/lib/roby/app/base.rb +21 -0
  157. data/lib/roby/app/cucumber.rb +2 -0
  158. data/lib/roby/app/cucumber/controller.rb +439 -0
  159. data/lib/roby/app/cucumber/helpers.rb +280 -0
  160. data/lib/roby/app/cucumber/world.rb +32 -0
  161. data/lib/roby/app/debug.rb +136 -0
  162. data/lib/roby/app/gen.rb +2 -0
  163. data/lib/roby/app/rake.rb +178 -38
  164. data/lib/roby/app/robot_config.rb +9 -0
  165. data/lib/roby/app/robot_names.rb +115 -0
  166. data/lib/roby/app/run.rb +3 -2
  167. data/lib/roby/app/scripts.rb +72 -0
  168. data/lib/roby/app/scripts/autotest.rb +173 -0
  169. data/lib/roby/app/scripts/display.rb +2 -0
  170. data/lib/roby/app/scripts/restart.rb +52 -0
  171. data/lib/roby/app/scripts/results.rb +17 -8
  172. data/lib/roby/app/scripts/run.rb +155 -24
  173. data/lib/roby/app/scripts/shell.rb +147 -62
  174. data/lib/roby/app/scripts/test.rb +107 -22
  175. data/lib/roby/app/test_reporter.rb +74 -0
  176. data/lib/roby/app/test_server.rb +159 -0
  177. data/lib/roby/app/vagrant.rb +47 -0
  178. data/lib/roby/backports.rb +16 -0
  179. data/lib/roby/cli/display.rb +190 -0
  180. data/lib/roby/cli/exceptions.rb +17 -0
  181. data/lib/roby/cli/gen/actions/class.rb +5 -0
  182. data/lib/roby/cli/gen/actions/test.rb +6 -0
  183. data/lib/roby/cli/gen/app/.yardopts +6 -0
  184. data/lib/roby/cli/gen/app/README.md +28 -0
  185. data/lib/roby/cli/gen/app/Rakefile +15 -0
  186. data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
  187. data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
  188. data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
  189. data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
  190. data/lib/roby/cli/gen/class/class.rb +6 -0
  191. data/lib/roby/cli/gen/class/test.rb +7 -0
  192. data/lib/roby/cli/gen/helpers.rb +203 -0
  193. data/lib/roby/cli/gen/module/module.rb +5 -0
  194. data/lib/roby/cli/gen/module/test.rb +6 -0
  195. data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
  196. data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
  197. data/lib/roby/cli/gen/task/class.rb +44 -0
  198. data/lib/roby/cli/gen/task/test.rb +6 -0
  199. data/lib/roby/cli/gen_main.rb +120 -0
  200. data/lib/roby/cli/log.rb +276 -0
  201. data/lib/roby/cli/log/flamegraph.html +499 -0
  202. data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
  203. data/lib/roby/cli/main.rb +153 -0
  204. data/lib/roby/coordination.rb +60 -0
  205. data/lib/roby/coordination/action_script.rb +25 -0
  206. data/lib/roby/coordination/action_state_machine.rb +125 -0
  207. data/lib/roby/coordination/actions.rb +106 -0
  208. data/lib/roby/coordination/base.rb +145 -0
  209. data/lib/roby/coordination/calculus.rb +40 -0
  210. data/lib/roby/coordination/child.rb +28 -0
  211. data/lib/roby/coordination/event.rb +29 -0
  212. data/lib/roby/coordination/fault_handler.rb +25 -0
  213. data/lib/roby/coordination/fault_handling_task.rb +13 -0
  214. data/lib/roby/coordination/fault_response_table.rb +110 -0
  215. data/lib/roby/coordination/models/action_script.rb +64 -0
  216. data/lib/roby/coordination/models/action_state_machine.rb +224 -0
  217. data/lib/roby/coordination/models/actions.rb +191 -0
  218. data/lib/roby/coordination/models/arguments.rb +55 -0
  219. data/lib/roby/coordination/models/base.rb +176 -0
  220. data/lib/roby/coordination/models/capture.rb +86 -0
  221. data/lib/roby/coordination/models/child.rb +35 -0
  222. data/lib/roby/coordination/models/event.rb +41 -0
  223. data/lib/roby/coordination/models/exceptions.rb +42 -0
  224. data/lib/roby/coordination/models/fault_handler.rb +219 -0
  225. data/lib/roby/coordination/models/fault_response_table.rb +77 -0
  226. data/lib/roby/coordination/models/root.rb +22 -0
  227. data/lib/roby/coordination/models/script.rb +283 -0
  228. data/lib/roby/coordination/models/task.rb +184 -0
  229. data/lib/roby/coordination/models/task_from_action.rb +50 -0
  230. data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
  231. data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
  232. data/lib/roby/coordination/models/task_from_variable.rb +27 -0
  233. data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
  234. data/lib/roby/coordination/models/variable.rb +32 -0
  235. data/lib/roby/coordination/script.rb +200 -0
  236. data/lib/roby/coordination/script_instruction.rb +12 -0
  237. data/lib/roby/coordination/task.rb +45 -0
  238. data/lib/roby/coordination/task_base.rb +69 -0
  239. data/lib/roby/coordination/task_script.rb +293 -0
  240. data/lib/roby/coordination/task_state_machine.rb +308 -0
  241. data/lib/roby/decision_control.rb +33 -21
  242. data/lib/roby/distributed_object.rb +76 -0
  243. data/lib/roby/droby.rb +17 -0
  244. data/lib/roby/droby/droby_id.rb +6 -0
  245. data/lib/roby/droby/enable.rb +153 -0
  246. data/lib/roby/droby/event_logger.rb +189 -0
  247. data/lib/roby/droby/event_logging.rb +57 -0
  248. data/lib/roby/droby/exceptions.rb +14 -0
  249. data/lib/roby/droby/identifiable.rb +22 -0
  250. data/lib/roby/droby/logfile.rb +141 -0
  251. data/lib/roby/droby/logfile/client.rb +176 -0
  252. data/lib/roby/droby/logfile/file_format.md +97 -0
  253. data/lib/roby/droby/logfile/index.rb +117 -0
  254. data/lib/roby/droby/logfile/reader.rb +139 -0
  255. data/lib/roby/droby/logfile/server.rb +199 -0
  256. data/lib/roby/droby/logfile/writer.rb +114 -0
  257. data/lib/roby/droby/marshal.rb +264 -0
  258. data/lib/roby/droby/marshallable.rb +12 -0
  259. data/lib/roby/droby/null_event_logger.rb +25 -0
  260. data/lib/roby/droby/object_manager.rb +205 -0
  261. data/lib/roby/droby/peer_id.rb +6 -0
  262. data/lib/roby/droby/plan_rebuilder.rb +373 -0
  263. data/lib/roby/droby/rebuilt_plan.rb +160 -0
  264. data/lib/roby/droby/remote_droby_id.rb +6 -0
  265. data/lib/roby/droby/timepoints.rb +205 -0
  266. data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
  267. data/lib/roby/droby/timepoints_ctf.rb +125 -0
  268. data/lib/roby/droby/v5.rb +14 -0
  269. data/lib/roby/droby/v5/builtin.rb +120 -0
  270. data/lib/roby/droby/v5/droby_class.rb +45 -0
  271. data/lib/roby/droby/v5/droby_constant.rb +81 -0
  272. data/lib/roby/droby/v5/droby_dump.rb +1026 -0
  273. data/lib/roby/droby/v5/droby_id.rb +44 -0
  274. data/lib/roby/droby/v5/droby_model.rb +82 -0
  275. data/lib/roby/droby/v5/peer_id.rb +10 -0
  276. data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
  277. data/lib/roby/event.rb +79 -957
  278. data/lib/roby/event_constraints.rb +835 -0
  279. data/lib/roby/event_generator.rb +1047 -0
  280. data/lib/roby/event_structure/causal_link.rb +6 -0
  281. data/lib/roby/event_structure/forwarding.rb +6 -0
  282. data/lib/roby/event_structure/precedence.rb +7 -0
  283. data/lib/roby/event_structure/signal.rb +8 -0
  284. data/lib/roby/event_structure/temporal_constraints.rb +640 -0
  285. data/lib/roby/exceptions.rb +446 -152
  286. data/lib/roby/executable_plan.rb +549 -0
  287. data/lib/roby/execution_engine.rb +1997 -950
  288. data/lib/roby/filter_generator.rb +26 -0
  289. data/lib/roby/gui/chronicle_view.rb +225 -0
  290. data/lib/roby/gui/chronicle_widget.rb +925 -0
  291. data/lib/roby/gui/dot_id.rb +11 -0
  292. data/lib/roby/gui/exception_view.rb +44 -0
  293. data/lib/roby/gui/log_display.rb +273 -0
  294. data/lib/roby/gui/model_views.rb +2 -0
  295. data/lib/roby/gui/model_views/action_interface.rb +53 -0
  296. data/lib/roby/gui/model_views/task.rb +47 -0
  297. data/lib/roby/gui/model_views/task.rhtml +41 -0
  298. data/lib/roby/gui/object_info_view.rb +89 -0
  299. data/lib/roby/gui/plan_dot_layout.rb +427 -0
  300. data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
  301. data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
  302. data/lib/roby/gui/relations_view.rb +278 -0
  303. data/lib/roby/gui/relations_view/relations.ui +139 -0
  304. data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
  305. data/lib/roby/gui/relations_view/relations_config.rb +292 -0
  306. data/lib/roby/gui/relations_view/relations_view.ui +53 -0
  307. data/lib/roby/gui/scheduler_view.css +24 -0
  308. data/lib/roby/gui/scheduler_view.rb +46 -0
  309. data/lib/roby/gui/scheduler_view.rhtml +53 -0
  310. data/lib/roby/gui/stepping.rb +93 -0
  311. data/lib/roby/gui/stepping.ui +181 -0
  312. data/lib/roby/gui/styles.rb +81 -0
  313. data/lib/roby/gui/task_display_configuration.rb +42 -0
  314. data/lib/roby/gui/task_state_at.rb +38 -0
  315. data/lib/roby/hooks.rb +26 -0
  316. data/lib/roby/interface.rb +136 -469
  317. data/lib/roby/interface/async.rb +20 -0
  318. data/lib/roby/interface/async/action_monitor.rb +188 -0
  319. data/lib/roby/interface/async/interface.rb +498 -0
  320. data/lib/roby/interface/async/job_monitor.rb +213 -0
  321. data/lib/roby/interface/async/log.rb +238 -0
  322. data/lib/roby/interface/async/new_job_listener.rb +79 -0
  323. data/lib/roby/interface/async/ui_connector.rb +183 -0
  324. data/lib/roby/interface/client.rb +553 -0
  325. data/lib/roby/interface/command.rb +24 -0
  326. data/lib/roby/interface/command_argument.rb +16 -0
  327. data/lib/roby/interface/command_library.rb +92 -0
  328. data/lib/roby/interface/droby_channel.rb +174 -0
  329. data/lib/roby/interface/exceptions.rb +22 -0
  330. data/lib/roby/interface/interface.rb +655 -0
  331. data/lib/roby/interface/job.rb +47 -0
  332. data/lib/roby/interface/rest.rb +10 -0
  333. data/lib/roby/interface/rest/api.rb +29 -0
  334. data/lib/roby/interface/rest/helpers.rb +24 -0
  335. data/lib/roby/interface/rest/server.rb +212 -0
  336. data/lib/roby/interface/server.rb +154 -0
  337. data/lib/roby/interface/shell_client.rb +468 -0
  338. data/lib/roby/interface/shell_subcommand.rb +24 -0
  339. data/lib/roby/interface/subcommand_client.rb +35 -0
  340. data/lib/roby/interface/tcp.rb +168 -0
  341. data/lib/roby/models/arguments.rb +112 -0
  342. data/lib/roby/models/plan_object.rb +83 -0
  343. data/lib/roby/models/task.rb +835 -0
  344. data/lib/roby/models/task_event.rb +62 -0
  345. data/lib/roby/models/task_service.rb +78 -0
  346. data/lib/roby/or_generator.rb +88 -0
  347. data/lib/roby/plan.rb +1751 -864
  348. data/lib/roby/plan_object.rb +611 -0
  349. data/lib/roby/plan_service.rb +200 -0
  350. data/lib/roby/promise.rb +332 -0
  351. data/lib/roby/queries.rb +23 -0
  352. data/lib/roby/queries/and_matcher.rb +32 -0
  353. data/lib/roby/queries/any.rb +27 -0
  354. data/lib/roby/queries/code_error_matcher.rb +58 -0
  355. data/lib/roby/queries/event_generator_matcher.rb +9 -0
  356. data/lib/roby/queries/execution_exception_matcher.rb +165 -0
  357. data/lib/roby/queries/index.rb +165 -0
  358. data/lib/roby/queries/localized_error_matcher.rb +149 -0
  359. data/lib/roby/queries/matcher_base.rb +107 -0
  360. data/lib/roby/queries/none.rb +27 -0
  361. data/lib/roby/queries/not_matcher.rb +30 -0
  362. data/lib/roby/queries/op_matcher.rb +8 -0
  363. data/lib/roby/queries/or_matcher.rb +30 -0
  364. data/lib/roby/queries/plan_object_matcher.rb +363 -0
  365. data/lib/roby/queries/query.rb +188 -0
  366. data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
  367. data/lib/roby/queries/task_matcher.rb +344 -0
  368. data/lib/roby/relations.rb +42 -678
  369. data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
  370. data/lib/roby/relations/directed_relation_support.rb +268 -0
  371. data/lib/roby/relations/event_relation_graph.rb +19 -0
  372. data/lib/roby/relations/fork_merge_visitor.rb +154 -0
  373. data/lib/roby/relations/graph.rb +533 -0
  374. data/lib/roby/relations/models/directed_relation_support.rb +11 -0
  375. data/lib/roby/relations/models/graph.rb +75 -0
  376. data/lib/roby/relations/models/task_relation_graph.rb +18 -0
  377. data/lib/roby/relations/space.rb +380 -0
  378. data/lib/roby/relations/task_relation_graph.rb +20 -0
  379. data/lib/roby/robot.rb +85 -38
  380. data/lib/roby/schedulers/basic.rb +155 -25
  381. data/lib/roby/schedulers/null.rb +20 -0
  382. data/lib/roby/schedulers/reporting.rb +31 -0
  383. data/lib/roby/schedulers/state.rb +129 -0
  384. data/lib/roby/schedulers/temporal.rb +91 -0
  385. data/lib/roby/singletons.rb +87 -0
  386. data/lib/roby/standalone.rb +4 -2
  387. data/lib/roby/standard_errors.rb +405 -82
  388. data/lib/roby/state.rb +6 -3
  389. data/lib/roby/state/conf_model.rb +5 -0
  390. data/lib/roby/state/events.rb +181 -95
  391. data/lib/roby/state/goal_model.rb +77 -0
  392. data/lib/roby/state/open_struct.rb +591 -0
  393. data/lib/roby/state/open_struct_model.rb +68 -0
  394. data/lib/roby/state/pos.rb +45 -45
  395. data/lib/roby/state/shapes.rb +11 -11
  396. data/lib/roby/state/state_model.rb +303 -0
  397. data/lib/roby/state/task.rb +43 -0
  398. data/lib/roby/support.rb +88 -148
  399. data/lib/roby/task.rb +1361 -1750
  400. data/lib/roby/task_arguments.rb +428 -0
  401. data/lib/roby/task_event.rb +127 -0
  402. data/lib/roby/task_event_generator.rb +337 -0
  403. data/lib/roby/task_service.rb +6 -0
  404. data/lib/roby/task_structure/conflicts.rb +104 -0
  405. data/lib/roby/task_structure/dependency.rb +932 -0
  406. data/lib/roby/task_structure/error_handling.rb +118 -0
  407. data/lib/roby/task_structure/executed_by.rb +234 -0
  408. data/lib/roby/task_structure/planned_by.rb +90 -0
  409. data/lib/roby/tasks/aggregator.rb +37 -0
  410. data/lib/roby/tasks/external_process.rb +275 -0
  411. data/lib/roby/tasks/group.rb +27 -0
  412. data/lib/roby/tasks/null.rb +19 -0
  413. data/lib/roby/tasks/parallel.rb +43 -0
  414. data/lib/roby/tasks/sequence.rb +88 -0
  415. data/lib/roby/tasks/simple.rb +21 -0
  416. data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
  417. data/lib/roby/tasks/timeout.rb +17 -0
  418. data/lib/roby/tasks/virtual.rb +55 -0
  419. data/lib/roby/template_plan.rb +7 -0
  420. data/lib/roby/test/aruba_minitest.rb +74 -0
  421. data/lib/roby/test/assertion.rb +16 -0
  422. data/lib/roby/test/assertions.rb +490 -0
  423. data/lib/roby/test/common.rb +368 -591
  424. data/lib/roby/test/dsl.rb +149 -0
  425. data/lib/roby/test/error.rb +18 -0
  426. data/lib/roby/test/event_reporter.rb +83 -0
  427. data/lib/roby/test/execution_expectations.rb +1134 -0
  428. data/lib/roby/test/expect_execution.rb +151 -0
  429. data/lib/roby/test/minitest_helpers.rb +166 -0
  430. data/lib/roby/test/roby_app_helpers.rb +200 -0
  431. data/lib/roby/test/run_planners.rb +155 -0
  432. data/lib/roby/test/self.rb +112 -0
  433. data/lib/roby/test/spec.rb +198 -0
  434. data/lib/roby/test/tasks/empty_task.rb +4 -4
  435. data/lib/roby/test/tasks/goto.rb +28 -27
  436. data/lib/roby/test/teardown_plans.rb +100 -0
  437. data/lib/roby/test/testcase.rb +239 -307
  438. data/lib/roby/test/tools.rb +159 -155
  439. data/lib/roby/test/validate_state_machine.rb +75 -0
  440. data/lib/roby/transaction.rb +1125 -0
  441. data/lib/roby/transaction/event_generator_proxy.rb +63 -0
  442. data/lib/roby/transaction/plan_object_proxy.rb +99 -0
  443. data/lib/roby/transaction/plan_service_proxy.rb +43 -0
  444. data/lib/roby/transaction/proxying.rb +120 -0
  445. data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
  446. data/lib/roby/transaction/task_proxy.rb +135 -0
  447. data/lib/roby/until_generator.rb +30 -0
  448. data/lib/roby/version.rb +5 -0
  449. data/lib/roby/yard.rb +169 -0
  450. data/lib/yard-roby.rb +1 -0
  451. data/manifest.xml +32 -6
  452. data/roby.gemspec +59 -0
  453. metadata +788 -587
  454. data/Manifest.txt +0 -321
  455. data/NOTES +0 -4
  456. data/README.txt +0 -166
  457. data/TODO.txt +0 -146
  458. data/app/README.txt +0 -24
  459. data/app/Rakefile +0 -8
  460. data/app/config/ROBOT.rb +0 -5
  461. data/app/config/init.rb +0 -33
  462. data/app/config/roby.yml +0 -3
  463. data/app/controllers/ROBOT.rb +0 -2
  464. data/app/planners/ROBOT/main.rb +0 -6
  465. data/app/planners/main.rb +0 -5
  466. data/app/scripts/distributed +0 -3
  467. data/app/scripts/generate/bookmarks +0 -3
  468. data/app/scripts/replay +0 -3
  469. data/app/scripts/results +0 -3
  470. data/app/scripts/run +0 -3
  471. data/app/scripts/server +0 -3
  472. data/app/scripts/shell +0 -3
  473. data/app/scripts/test +0 -3
  474. data/app/tasks/.gitattributes +0 -0
  475. data/app/tasks/ROBOT/.gitattributes +0 -0
  476. data/bin/roby-shell +0 -25
  477. data/doc/guide/src/basics/app.page +0 -139
  478. data/doc/guide/src/basics/index.page +0 -11
  479. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  480. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  481. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  482. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  483. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  484. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  485. data/doc/guide/src/basics/relations_display.page +0 -203
  486. data/doc/guide/src/basics/shell.page +0 -102
  487. data/doc/guide/src/default.css +0 -319
  488. data/doc/guide/src/introduction/index.page +0 -29
  489. data/doc/guide/src/introduction/publications.page +0 -14
  490. data/doc/guide/src/relations/dependency.page +0 -89
  491. data/doc/guide/src/relations/index.page +0 -12
  492. data/ext/droby/dump.cc +0 -175
  493. data/ext/droby/extconf.rb +0 -3
  494. data/ext/graph/algorithm.cc +0 -746
  495. data/ext/graph/extconf.rb +0 -7
  496. data/ext/graph/graph.cc +0 -575
  497. data/ext/graph/graph.hh +0 -183
  498. data/ext/graph/iterator_sequence.hh +0 -102
  499. data/ext/graph/undirected_dfs.hh +0 -226
  500. data/ext/graph/undirected_graph.hh +0 -421
  501. data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
  502. data/lib/roby/app/scripts/replay.rb +0 -31
  503. data/lib/roby/app/scripts/server.rb +0 -18
  504. data/lib/roby/basic_object.rb +0 -151
  505. data/lib/roby/config.rb +0 -14
  506. data/lib/roby/distributed.rb +0 -36
  507. data/lib/roby/distributed/base.rb +0 -448
  508. data/lib/roby/distributed/communication.rb +0 -875
  509. data/lib/roby/distributed/connection_space.rb +0 -616
  510. data/lib/roby/distributed/distributed_object.rb +0 -206
  511. data/lib/roby/distributed/drb.rb +0 -62
  512. data/lib/roby/distributed/notifications.rb +0 -531
  513. data/lib/roby/distributed/peer.rb +0 -555
  514. data/lib/roby/distributed/protocol.rb +0 -529
  515. data/lib/roby/distributed/proxy.rb +0 -343
  516. data/lib/roby/distributed/subscription.rb +0 -311
  517. data/lib/roby/distributed/transaction.rb +0 -498
  518. data/lib/roby/external_process_task.rb +0 -225
  519. data/lib/roby/graph.rb +0 -160
  520. data/lib/roby/log.rb +0 -3
  521. data/lib/roby/log/chronicle.rb +0 -303
  522. data/lib/roby/log/console.rb +0 -74
  523. data/lib/roby/log/data_stream.rb +0 -275
  524. data/lib/roby/log/dot.rb +0 -279
  525. data/lib/roby/log/event_stream.rb +0 -161
  526. data/lib/roby/log/file.rb +0 -396
  527. data/lib/roby/log/gui/basic_display.ui +0 -83
  528. data/lib/roby/log/gui/basic_display_ui.rb +0 -89
  529. data/lib/roby/log/gui/chronicle.rb +0 -26
  530. data/lib/roby/log/gui/chronicle_view.rb +0 -40
  531. data/lib/roby/log/gui/chronicle_view.ui +0 -70
  532. data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
  533. data/lib/roby/log/gui/data_displays.rb +0 -171
  534. data/lib/roby/log/gui/data_displays.ui +0 -155
  535. data/lib/roby/log/gui/data_displays_ui.rb +0 -146
  536. data/lib/roby/log/gui/notifications.rb +0 -26
  537. data/lib/roby/log/gui/relations.rb +0 -269
  538. data/lib/roby/log/gui/relations.ui +0 -123
  539. data/lib/roby/log/gui/relations_ui.rb +0 -120
  540. data/lib/roby/log/gui/relations_view.rb +0 -185
  541. data/lib/roby/log/gui/relations_view.ui +0 -149
  542. data/lib/roby/log/gui/relations_view_ui.rb +0 -144
  543. data/lib/roby/log/gui/replay.rb +0 -366
  544. data/lib/roby/log/gui/replay_controls.rb +0 -206
  545. data/lib/roby/log/gui/replay_controls.ui +0 -282
  546. data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
  547. data/lib/roby/log/gui/runtime.rb +0 -130
  548. data/lib/roby/log/hooks.rb +0 -186
  549. data/lib/roby/log/logger.rb +0 -203
  550. data/lib/roby/log/notifications.rb +0 -244
  551. data/lib/roby/log/plan_rebuilder.rb +0 -468
  552. data/lib/roby/log/relations.rb +0 -1084
  553. data/lib/roby/log/server.rb +0 -547
  554. data/lib/roby/log/sqlite.rb +0 -47
  555. data/lib/roby/log/timings.rb +0 -233
  556. data/lib/roby/plan-object.rb +0 -371
  557. data/lib/roby/planning.rb +0 -13
  558. data/lib/roby/planning/loops.rb +0 -309
  559. data/lib/roby/planning/model.rb +0 -1012
  560. data/lib/roby/planning/task.rb +0 -180
  561. data/lib/roby/query.rb +0 -655
  562. data/lib/roby/relations/conflicts.rb +0 -67
  563. data/lib/roby/relations/dependency.rb +0 -358
  564. data/lib/roby/relations/ensured.rb +0 -19
  565. data/lib/roby/relations/error_handling.rb +0 -22
  566. data/lib/roby/relations/events.rb +0 -7
  567. data/lib/roby/relations/executed_by.rb +0 -208
  568. data/lib/roby/relations/influence.rb +0 -10
  569. data/lib/roby/relations/planned_by.rb +0 -63
  570. data/lib/roby/state/information.rb +0 -55
  571. data/lib/roby/state/state.rb +0 -367
  572. data/lib/roby/task-operations.rb +0 -186
  573. data/lib/roby/task_index.rb +0 -80
  574. data/lib/roby/test/distributed.rb +0 -230
  575. data/lib/roby/test/tasks/simple_task.rb +0 -23
  576. data/lib/roby/transactions.rb +0 -507
  577. data/lib/roby/transactions/proxy.rb +0 -325
  578. data/plugins/fault_injection/History.txt +0 -4
  579. data/plugins/fault_injection/README.txt +0 -34
  580. data/plugins/fault_injection/Rakefile +0 -12
  581. data/plugins/fault_injection/TODO.txt +0 -0
  582. data/plugins/fault_injection/app.rb +0 -52
  583. data/plugins/fault_injection/fault_injection.rb +0 -89
  584. data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
  585. data/plugins/subsystems/README.txt +0 -37
  586. data/plugins/subsystems/Rakefile +0 -13
  587. data/plugins/subsystems/app.rb +0 -182
  588. data/plugins/subsystems/test/app/README +0 -24
  589. data/plugins/subsystems/test/app/Rakefile +0 -8
  590. data/plugins/subsystems/test/app/config/app.yml +0 -71
  591. data/plugins/subsystems/test/app/config/init.rb +0 -12
  592. data/plugins/subsystems/test/app/config/roby.yml +0 -3
  593. data/plugins/subsystems/test/app/planners/main.rb +0 -20
  594. data/plugins/subsystems/test/app/scripts/distributed +0 -3
  595. data/plugins/subsystems/test/app/scripts/replay +0 -3
  596. data/plugins/subsystems/test/app/scripts/results +0 -3
  597. data/plugins/subsystems/test/app/scripts/run +0 -3
  598. data/plugins/subsystems/test/app/scripts/server +0 -3
  599. data/plugins/subsystems/test/app/scripts/shell +0 -3
  600. data/plugins/subsystems/test/app/scripts/test +0 -3
  601. data/plugins/subsystems/test/app/tasks/services.rb +0 -15
  602. data/plugins/subsystems/test/test_subsystems.rb +0 -78
  603. data/test/distributed/test_communication.rb +0 -195
  604. data/test/distributed/test_connection.rb +0 -284
  605. data/test/distributed/test_execution.rb +0 -378
  606. data/test/distributed/test_mixed_plan.rb +0 -341
  607. data/test/distributed/test_plan_notifications.rb +0 -238
  608. data/test/distributed/test_protocol.rb +0 -525
  609. data/test/distributed/test_query.rb +0 -106
  610. data/test/distributed/test_remote_plan.rb +0 -491
  611. data/test/distributed/test_transaction.rb +0 -466
  612. data/test/mockups/external_process +0 -28
  613. data/test/mockups/tasks.rb +0 -27
  614. data/test/planning/test_loops.rb +0 -432
  615. data/test/planning/test_model.rb +0 -427
  616. data/test/planning/test_task.rb +0 -126
  617. data/test/relations/test_conflicts.rb +0 -42
  618. data/test/relations/test_dependency.rb +0 -324
  619. data/test/relations/test_ensured.rb +0 -38
  620. data/test/relations/test_executed_by.rb +0 -224
  621. data/test/relations/test_planned_by.rb +0 -56
  622. data/test/suite_core.rb +0 -29
  623. data/test/suite_distributed.rb +0 -10
  624. data/test/suite_planning.rb +0 -4
  625. data/test/suite_relations.rb +0 -8
  626. data/test/tasks/test_external_process.rb +0 -126
  627. data/test/tasks/test_thread_task.rb +0 -70
  628. data/test/test_bgl.rb +0 -528
  629. data/test/test_event.rb +0 -969
  630. data/test/test_exceptions.rb +0 -591
  631. data/test/test_execution_engine.rb +0 -987
  632. data/test/test_gui.rb +0 -20
  633. data/test/test_interface.rb +0 -43
  634. data/test/test_log.rb +0 -125
  635. data/test/test_log_server.rb +0 -133
  636. data/test/test_plan.rb +0 -418
  637. data/test/test_query.rb +0 -424
  638. data/test/test_relations.rb +0 -260
  639. data/test/test_state.rb +0 -432
  640. data/test/test_support.rb +0 -16
  641. data/test/test_task.rb +0 -1181
  642. data/test/test_testcase.rb +0 -138
  643. data/test/test_transactions.rb +0 -610
  644. data/test/test_transactions_proxy.rb +0 -216
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Summary
3
3
  sort_info: 900
4
- --- pipeline:tags,rdoc,blocks
4
+ ---
5
5
 
6
6
 
7
7
  * *events* allow you to represent the robot's situations and the commands that the
@@ -0,0 +1,374 @@
1
+ ---
2
+ title: Tasks
3
+ sort_info: 200
4
+ ---
5
+ {include_file: {filename: src/basics_shell_header.txt, escape_html: false}}
6
+
7
+ Definition of Tasks
8
+ -------------------
9
+
10
+ Unlike with event objects, which are usually created and parametrized
11
+ on-the-fly, tasks are mostly first _defined_ and then _used_. To define a task,
12
+ one creates a subclass of {rdoc_class: Task}. In our examples, we'll take "the mother
13
+ of all tasks in robotic systems": the MoveTo task.
14
+
15
+ {coderay:: ruby}
16
+ class MoveTo < Roby::Task
17
+ end
18
+ {coderay}
19
+
20
+ Then, to use it, one would do:
21
+
22
+ {coderay:: ruby}
23
+ plan.add(task = MoveTo.new)
24
+ {coderay}
25
+
26
+ As for events, the task must be included in a plan to be usable, which is done
27
+ by calling plan.add(). Don't forget that !
28
+
29
+ Parametrization
30
+ ---------------
31
+
32
+ Obviously, a plain MoveTo task is nothing if the system does not know *where*
33
+ to go to ... That is called parametrization and has to be declared in the task
34
+ definition, using Task.argument
35
+
36
+ {coderay:: ruby}
37
+ >> class MoveTo < Roby::Task
38
+ ?> argument :x
39
+ ?> argument :y
40
+ >> end
41
+ {coderay}
42
+
43
+ Then, the arguments are provided at instanciation through an argument hash:
44
+
45
+ {coderay:: ruby}
46
+ >> task = MoveTo.new :x => 10, :y => 20
47
+ >> task.x
48
+ => 10
49
+ >> task.y
50
+ => 20
51
+ {coderay}
52
+
53
+ A task instance (i.e. the result of TaskClass.new) will *not* be usable unless
54
+ you initialize all its arguments. Such a task is called _partially
55
+ instanciated_:
56
+
57
+ {coderay:: ruby}
58
+ >> task = MoveTo.new
59
+ >> task.partially_instanciated?
60
+ => true
61
+ >> task.x = 10
62
+ >> task.y = 20
63
+ >> task.partially_instanciated?
64
+ => false
65
+ {coderay}
66
+
67
+ It is possible to declare default arguments:
68
+
69
+ {coderay:: ruby}
70
+ >> class MoveTo
71
+ ?> argument :max_speed, :default => 1
72
+ ?> end
73
+ >> task = MoveTo.new(:x => 10, :y => 20)
74
+ >> task.max_speed
75
+ => nil
76
+ >> task.partially_instanciated?
77
+ => false
78
+ {coderay}
79
+
80
+ You can see that, even though the task has a default for the max_speed
81
+ argument, task.max_speed initially returns nil but task.partially_instanciated?
82
+ returns false. This is because the default value gets assigned when the task is
83
+ started, not before. To "freeze" all default arguments, one can use the
84
+ Task#freeze_delayed_arguments call. This should be seldom needed, though.
85
+
86
+ Task control and monitoring: defining events
87
+ --------------------------------------------
88
+
89
+ In Roby, tasks are a __collection of events__. Now that you know the basics
90
+ about events, the purpose of those events should be clear:
91
+
92
+ * the controllable events allow to change the process' behaviour (the obvious
93
+ one being "start" which allows to start the task)
94
+ * both contingent and controllable events allow to monitor the task's execution.
95
+
96
+ The basic task already defines four events:
97
+
98
+ * the *start* event
99
+ * the *stop* event
100
+ * the *success* event
101
+ * and finally the *failed* event
102
+
103
+ In the class definition, events are defined using Roby::Task.event. To define a
104
+ controllable event, simply associate a block. First, copy/paste the following code in a
105
+ my\_task.rb file.
106
+
107
+ {coderay:: ruby}
108
+ class MyTask < Roby::Task
109
+ event :start do |context|
110
+ puts "start event called"
111
+ emit :start
112
+ end
113
+ event :controlable do |context|
114
+ puts "controlable event called"
115
+ emit :controlable
116
+ end
117
+ event :contingent
118
+
119
+ on(:start) { |event| puts "start event emitted" }
120
+ on(:controlable) { |event| puts "controlable event emitted" }
121
+ on(:contingent) { |event| puts "contingent event emitted" }
122
+ on(:failed) { |event| puts "failed event emitted" }
123
+ on(:stop) { |event| puts "stop event emitted" }
124
+
125
+ event :finished, :terminal => true
126
+ on(:finished) { |event| puts "finished event emitted" }
127
+ end
128
+ {coderay}
129
+
130
+ Finally, an event can be *terminal*: its emission means the end of the task's
131
+ execution. __failed__ and __success__ are examples of terminal events. To declare a
132
+ terminal event, one does as for the "finished" event above.
133
+
134
+ Now, read that code into the ruby shell with
135
+
136
+ {coderay:: ruby}
137
+ >> source "my_task.rb"
138
+ {coderay}
139
+
140
+ Using task events
141
+ -----------------
142
+ Task event generators are defined using a subclass of EventGenerator,
143
+ {rdoc_class: TaskEventGenerator}. One can access them from the task by using
144
+ either Task#event or the more widely used ${task_name}_event shortcuts. Then,
145
+ you can manipulate them as for normal events:
146
+
147
+ {coderay:: ruby}
148
+ >> plan.add(task = MyTask.new)
149
+ >> ev = task.start_event
150
+ >> ev.call
151
+ start event called
152
+ start event emitted
153
+ >> task.running?
154
+ => true
155
+ >> ev = task.contingent_event
156
+ >> ev.controlable?
157
+ => false
158
+ >> ev.emit
159
+ contingent event emitted
160
+ {coderay}
161
+
162
+ Instead of calling #on, #signal, #emit and #call on the event object, one can use
163
+ shortcuts that are defined on {rdoc_class: Task}:
164
+
165
+ {coderay:: ruby}
166
+ # Same as task.event(:contingent).on { |ev| ... }
167
+ >> task.on(:contingent) { |ev| puts "contingent event emitted" }
168
+ # Same as task.event(:contingent).emit
169
+ >> task.emit(:contingent)
170
+ # There's two handlers now, so we should have two lines displayed
171
+ contingent event emitted
172
+ contingent event emitted
173
+ # Same as task.event(:controlable).call
174
+ >> task.controlable!
175
+ controlable event called
176
+ controlable event emitted
177
+ # Same as task.event(:contingent).signals task.event(:controlable)
178
+ >> task.signals(:contingent, task, :controlable)
179
+ >> task.emit :contingent
180
+ contingent event emitted
181
+ contingent event emitted
182
+ controlable event called
183
+ controlable event emitted
184
+ >> task.emit :finished
185
+ finished event emitted
186
+ stop event emitted
187
+ >> task.running?
188
+ => false
189
+ {coderay}
190
+
191
+ Event classification: using the *forward* relation
192
+ --------------------------------------------------
193
+ As we in the above examples, it is possible to have terminal events, which are events
194
+ that end the task. Obviously, the "stop" event should be emitted when they are
195
+ emitted ("stop" represents the task end, does not it ?).
196
+
197
+ In a more generic way, these terminal events are likely to be either special
198
+ cases of the task success or of the task failure. Then, we actually need a way
199
+ to *classify* events: to say "success is a special case of stop, or
200
+ "wheel\_blocked is a special case of failed, which is a special case of
201
+ stop".
202
+
203
+ To represent this specific event relationship, Roby provides a *forward*
204
+ relation between events, which can be added as follows:
205
+
206
+ {coderay:: ruby}
207
+ >> class MyTask < Roby::Task
208
+ ?> event :wheel_blocked
209
+ ?> on(:wheel_blocked) { |ev| puts "wheel_blocked emitted" }
210
+ ?> end
211
+ >> plan.add(task = MyTask.new)
212
+ >> task.start!
213
+ start event called
214
+ start event emitted
215
+ >> blocked = task.event(:wheel_blocked)
216
+ >> failed = task.event(:failed)
217
+ >> blocked.forward_to failed
218
+ >> task.emit :wheel_blocked
219
+ wheel_blocked emitted
220
+ stop event emitted
221
+ {coderay}
222
+
223
+ In practice, a _forward_ relation between two events a and b says "b should be
224
+ emitted when a is". Or "b is a superset of the situations that a represents".
225
+
226
+ This relation is also available on "plain" events (i.e. EventGenerator.new).
227
+
228
+ Task model and event relations
229
+ ------------------------------
230
+ Until now, we only saw how to add relations between events of task instances.
231
+ Sometime (especially with forwarding relations), some relations should be
232
+ defined on _all_ the task instances of a given task class. To do that, use the
233
+ class methods <tt>signal</tt> and <tt>forward</tt> defined on {rdoc_class:
234
+ Task}:
235
+
236
+ {coderay:: ruby}
237
+ >> class MyTask < Roby::Task
238
+ ?> signal :start => :controlable
239
+ ?> forward :wheel_blocked => :failed
240
+ ?> end
241
+ >> plan.add(task = MyTask.new)
242
+ >> task.start!
243
+ start event called
244
+ start event emitted
245
+ controlable event called
246
+ controlable event emitted
247
+ >> task.emit :wheel_blocked
248
+ wheel_blocked emitted
249
+ failed event emitted
250
+ stop event emitted
251
+ {coderay}
252
+
253
+ Tasks that terminates
254
+ ---------------------
255
+ A very important characteristic of tasks is their ability to be _interrupted_
256
+ (or lack of). What is meant by that is that Roby should be able to stop some
257
+ (actually, most) tasks. In Roby, that ability is represented by giving a command
258
+ to the 'stop' event.
259
+
260
+ For most of the tasks, there is actually no need to perform specific actions.
261
+ Simply having Roby mark the task as 'stopped' is enough. For those tasks, using
262
+ the 'terminates' statement is enough:
263
+
264
+ {coderay:: ruby}
265
+ >> class MyTask
266
+ ?> terminates
267
+ ?> end
268
+ >> plan.add(task = MyTask.new)
269
+ >> task.start!
270
+ start event called
271
+ start event emitted
272
+ controlable event called
273
+ controlable event emitted
274
+ >> task.stop!
275
+ failed event emitted
276
+ stop event emitted
277
+ {coderay}
278
+
279
+ As you can see, 'terminates' is equivalent to
280
+
281
+ {coderay:: ruby}
282
+ >> class MyTask
283
+ ?> event(:failed) { emit :failed }
284
+ ?> event(:stop) { failed! }
285
+ ?> end
286
+ {coderay}
287
+
288
+ Common errors when manipulating tasks
289
+ -------------------------------------
290
+
291
+ As for the event, a common error is to forget to include the task in a plan
292
+ before calling events on it:
293
+
294
+ {coderay:: ruby}
295
+ >> task = MyTask.new
296
+ >> task.start!
297
+ Roby::EventNotExecutable: start! called on MyTask{}:0x7f336c455af0[] but the task is in no plan
298
+ {coderay}
299
+
300
+ Another related error is to emit/call events other than "start" while the task is not yet running ...
301
+
302
+ {coderay:: ruby}
303
+ >> plan.add(task = MyTask.new)
304
+ >> task.controllable!
305
+ Roby::CommandFailed: controlable!() called by [] but the task has never been started
306
+ from (irb):30
307
+ >> task.emit :contingent
308
+ Roby::EmissionFailed: emit(contingent, []) called by [] but the task has never been started
309
+ from (irb):31
310
+ {coderay}
311
+
312
+ ... or when it has stopped
313
+
314
+ {coderay:: ruby}
315
+ >> task.start!
316
+ >> task.stop!
317
+ >> task.controlable!
318
+ Roby::CommandFailed: controlable!() called by [] but the task has finished. Task has been terminated by [MyTask{}:0x7ff179064358[]/failed@7 [344917:00:42.215]:
319
+ from (irb):32
320
+ >> task.emit :contingent
321
+ Roby::EmissionFailed: emit(contingent, []) called by [] but the task has finished. Task has been terminated by [MyTask{}:0x7ff179064358[]/failed@7 [344917:00:42.215]: ].
322
+ from (irb):33
323
+ {coderay}
324
+
325
+ <div markdown="1" class="info">
326
+ In these messages, the notation
327
+
328
+ MyTask{}:0x7ff179064358[]
329
+
330
+ represents a task, the notation
331
+
332
+ MyTask{}:0x7ff179064358[]/failed
333
+
334
+ represents the event "failed" of the same task and finally
335
+
336
+ MyTask{}:0x7ff179064358[]/failed@7 [344917:00:42.215]
337
+
338
+ is an emitted event that has been generated by the "failed" event of the given
339
+ task. The time on the right is the time of emission, and the "@x" notation is
340
+ the propagation cycle (usually, you don't care about this but it is VERY useful
341
+ for debugging Roby itself).
342
+ </div>
343
+
344
+ Of course, as we saw at the beginning of this page, a task must be fully
345
+ instanciated to be started:
346
+
347
+ {coderay:: ruby}
348
+ >> class Bla < Roby::Task
349
+ >> argument :foo
350
+ >> end
351
+ >> plan.add(task = Bla.new)
352
+ >> task.start!
353
+ Roby::EventNotExecutable: start! called on Bar{}:0x7ff17901c1e8[] which is partially instanciated
354
+ The following arguments were not set:
355
+ foo
356
+ {coderay}
357
+
358
+ Summary
359
+ -------
360
+
361
+ What do we do know ?
362
+
363
+ * we know how the robot's situation is represented: through the *emission
364
+ of events*
365
+ * we know how the robot is controlled: through the call of *controlable
366
+ events*
367
+ * we know how to sort events in tasks, in order to represent the different
368
+ processes that run on the robot.
369
+
370
+ One important question is still left open: how all of this can be made into a
371
+ whole that allows to control a robot ? Right now, we only have an overview of
372
+ the basics of Roby plan. What follows will show what a *Roby application* is
373
+ made of.
374
+
@@ -1,8 +1,9 @@
1
+ require 'utilrb/logger'
2
+
1
3
  # The main namespace for the Roby library. The namespace is divided as follows:
2
4
  #
3
5
  # [Roby] core namespace for the Roby kernel
4
- # [Roby::Distributed] parts that are very specific to distributed plan management
5
- # [Roby::Planning] basic tools for plan generation
6
+ # [Roby::Actions] basic tools for plan generation
6
7
  # [Roby::Transactions] implementation of transactions. Transactions represent a
7
8
  # change in the main plan, and can be distributed among different plan managers.
8
9
  # [Roby::EventStructure] main namespace for event relations. The methods listed
@@ -10,68 +11,122 @@
10
11
  # [Roby::TaskStructure] main namespace for task relations. The methods listed in
11
12
  # the documentation of TaskStructure are actually methods of Roby::Task
12
13
  module Roby
13
- class BasicObject; end
14
- class PlanObject < BasicObject; end
15
- class Plan < BasicObject; end
14
+ class DistributedObject; end
15
+ class PlanObject < DistributedObject; end
16
+ class Plan < DistributedObject; end
16
17
  class Control; end
17
18
  class EventGenerator < PlanObject; end
18
19
  class Task < PlanObject; end
20
+
21
+ extend Logger::Root('Roby', Logger::WARN)
19
22
  end
20
23
 
21
- require 'drb'
22
- require 'utilrb/weakref'
24
+ require 'concurrent'
25
+ require 'backports/2.4.0/regexp/match'
26
+ require 'roby/backports'
27
+
23
28
  require 'pp'
24
29
  require 'thread'
25
30
  require 'set'
26
31
  require 'yaml'
27
- require 'utilrb/value_set'
32
+ require 'pastel'
33
+ require 'hooks'
34
+ require 'fcntl'
35
+ require 'metaruby/dsls'
28
36
  require 'utilrb/object/attribute'
37
+ require 'utilrb/object/address'
29
38
  require 'utilrb/module/ancestor_p'
30
39
  require 'utilrb/kernel/options'
31
40
  require 'utilrb/module/attr_enumerable'
32
41
  require 'utilrb/module/attr_predicate'
33
- require 'utilrb/module/inherited_enumerable'
34
42
  require 'utilrb/module/include'
35
43
  require 'utilrb/kernel/arity'
36
- require 'utilrb/kernel/swap'
37
44
  require 'utilrb/exception/full_message'
38
45
  require 'utilrb/unbound_method/call'
46
+ require 'metaruby'
47
+
48
+ require 'roby/version'
49
+ require 'roby/droby/marshallable'
50
+ require 'roby/droby/event_logging'
51
+
52
+ require 'roby/support'
53
+ require 'roby/promise'
54
+ require 'roby/hooks'
55
+ require 'roby/distributed_object'
56
+ require 'roby/standard_errors'
57
+ require 'roby/exceptions'
58
+
59
+ require 'roby/relations'
60
+ require 'roby/plan'
61
+ require 'roby/executable_plan'
62
+ require 'roby/template_plan'
63
+
64
+ require 'roby/transaction'
65
+ require 'roby/transaction/proxying'
66
+
67
+ require 'roby/models/plan_object'
68
+ require 'roby/plan_object'
69
+ require 'roby/event_generator'
70
+ require "roby/event_structure/signal"
71
+ require "roby/event_structure/forwarding"
72
+ require "roby/event_structure/causal_link"
73
+ require "roby/event_structure/precedence"
74
+ require "roby/event_structure/temporal_constraints"
75
+
76
+ require 'roby/queries'
77
+ require 'roby/event'
78
+ require 'roby/filter_generator'
79
+ require 'roby/and_generator'
80
+ require 'roby/or_generator'
81
+ require 'roby/until_generator'
82
+ require 'roby/models/arguments'
83
+ require 'roby/models/task_service'
84
+ require 'roby/models/task'
85
+ require 'roby/models/task_event'
86
+ require 'roby/task_event'
87
+ require 'roby/task_event_generator'
88
+ require 'roby/task_arguments'
89
+ require 'roby/task_service'
90
+ require 'roby/task'
91
+ require "roby/task_structure/conflicts"
92
+ require "roby/task_structure/dependency"
93
+ require "roby/task_structure/error_handling"
94
+ require "roby/task_structure/executed_by"
95
+ require "roby/task_structure/planned_by"
39
96
 
40
- require 'roby/config.rb'
41
- require 'roby/support.rb'
42
- require 'roby/basic_object.rb'
43
- require 'roby/standard_errors.rb'
44
- require 'roby/exceptions.rb'
45
- require 'roby_bgl'
46
- require 'roby/graph.rb'
47
- require 'roby/relations.rb'
48
-
49
- require 'roby/plan-object.rb'
50
- require 'roby/event.rb'
51
- require 'roby/task.rb'
52
- require 'roby/task-operations.rb'
53
-
54
- require 'roby/relations/conflicts.rb'
55
- require 'roby/relations/ensured.rb'
56
- require 'roby/relations/error_handling.rb'
57
- require 'roby/relations/events.rb'
58
- require 'roby/relations/executed_by.rb'
59
- require 'roby/relations/dependency.rb'
60
- require 'roby/relations/influence.rb'
61
- require 'roby/relations/planned_by.rb'
62
-
63
- require 'roby/task_index.rb'
64
- require 'roby/plan.rb'
65
- require 'roby/transactions/proxy.rb'
66
- require 'roby/transactions.rb'
67
- require 'roby/query.rb'
68
-
69
- require 'roby/distributed/base'
70
- require 'roby/decision_control.rb'
71
- require 'roby/execution_engine.rb'
72
- require 'roby/app.rb'
73
-
74
- require 'roby/robot.rb'
75
- require 'roby/planning.rb'
76
- require 'roby/state.rb'
97
+ require 'roby/tasks/aggregator'
98
+ require 'roby/tasks/parallel'
99
+ require 'roby/tasks/sequence'
100
+ require 'roby/event_constraints'
101
+
102
+ require 'roby/transaction/plan_object_proxy'
103
+ require 'roby/transaction/event_generator_proxy'
104
+ require 'roby/transaction/task_event_generator_proxy'
105
+ require 'roby/transaction/task_proxy'
106
+
107
+ require 'roby/plan_service'
108
+ require 'roby/transaction/plan_service_proxy'
109
+
110
+ require 'roby/decision_control'
111
+ require 'roby/schedulers/null'
112
+ require 'roby/execution_engine'
113
+ begin
114
+ require 'gctools/oobgc'
115
+ Roby::ExecutionEngine.use_oob_gc = true
116
+ rescue LoadError
117
+ end
118
+ require 'roby/app'
119
+ require 'roby/state'
120
+ require 'roby/singletons'
121
+
122
+ require 'roby/interface/job'
123
+ require 'roby/robot'
124
+ require 'roby/actions'
125
+ require 'roby/coordination'
126
+
127
+ require 'roby/droby/enable'
128
+
129
+ module Roby
130
+ BIN_DIR = File.expand_path(File.join("..", "bin"), __dir__)
131
+ end
77
132