roby 0.8.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: Task Hierarchies
3
3
  sort_info: 500
4
- --- pipeline:tags,markdown
4
+ ---
5
5
 
6
6
  What building blocks do we have until now ?
7
7
 
@@ -21,8 +21,6 @@ generating the plan needed to perform an action.
21
21
 
22
22
  This page presents the most important of them: the hierarchy relation.
23
23
 
24
- {include_file: {filename: src/basics_shell_header.txt, escape_html: false}}
25
-
26
24
  Semantics of task hierarchies
27
25
  -----------------------------
28
26
  The goal of that relation is to represent the hard dependencies between tasks.
@@ -46,11 +44,12 @@ Adding dependencies between tasks
46
44
  The code in that section is not meant to be tried out, but to support the
47
45
  explanations. A proper controller, that uses these principles, is shown in the
48
46
  following sections.
49
- {.warning}
47
+ {: .warning}
50
48
 
51
49
  Let's assume our robot's functional layer offers two services:
52
- * it has a way to compute a path from A to B (path planning)
53
- * it has a way to execute that path once its computed
50
+
51
+ * it has a way to compute a path from A to B (path planning)
52
+ * it has a way to execute that path once its computed
54
53
 
55
54
  What we want here is to build the plan that represents a _movement_ from the
56
55
  current robot's position to a goal position. That aggregate action will
@@ -64,9 +63,10 @@ end
64
63
  {coderay}
65
64
 
66
65
  So, now, we would have two options:
67
- * either call the functional layer directly from the MoveTo task
68
- * or integrate both services independently (in two different tasks) and then
69
- aggregate their functionality through the plan.
66
+
67
+ * either call the functional layer directly from the MoveTo task
68
+ * or integrate both services independently (in two different tasks) and then
69
+ aggregate their functionality through the plan.
70
70
 
71
71
  In Roby, we would usually use the second method, as it promotes reusability. The
72
72
  plan would therefore have to represent the following:
@@ -109,6 +109,7 @@ again, we could describe this plan with:
109
109
  The MoveTo task is a sequence of ComputePath followed by ExecutePath
110
110
 
111
111
  and could be written
112
+
112
113
  {coderay:: ruby}
113
114
  move = MoveTo.new :goal => a
114
115
  compute = ComputePath.new :goal => a
@@ -131,7 +132,7 @@ the ComputePath task to the ExecutePath task. In general, such an endeavour is
131
132
  done in Roby through the attributes on task objects. Here, we will simply define
132
133
  a 'path' attribute on the MoveTo class. Given that the actual actions are
133
134
  performed by ComputePath and ExecutePath, the definition of the MoveTo task is
134
- actually quite simple:
135
+ actually quite simple (add in models/tasks/move_to.rb)
135
136
 
136
137
  {coderay:: ruby}
137
138
  class MoveTo < Roby::Task
@@ -149,27 +150,25 @@ model point of view, it will require the 'goal' argument again, and also a
149
150
  'path\_task' argument which is the task holding the path data when computed.
150
151
 
151
152
  On the implementation side, we will use a standard task, the {rdoc_class:
152
- ThreadTask}. This task represents in Roby's plan a computation that is done in a
153
+ Tasks::Thread}. This task represents in Roby's plan a computation that is done in a
153
154
  separate thread. To use this task, one simply needs to define an
154
155
  "implementation" block (see below). This block is ran in a separate thread by
155
- ThreadTask and, upon successful execution of the thread, the result value is
156
+ Tasks::Thread and, upon successful execution of the thread, the result value is
156
157
  saved in the tasks's 'result' attribute (and success is emitted). The
157
158
  added value is that if the thread fails by raising an exception, the "failed"
158
159
  event is simply emitted with the exception as context. Now, open
159
- tasks/compute\_path.rb and add the following code to it:
160
+ models/tasks/compute\_path.rb and add the following code to it:
160
161
 
161
162
  {coderay:: ruby}
162
- require 'roby/thread_task'
163
- class ComputePath < Roby::ThreadTask
164
- # Where we should store the path when computed
165
- argument :path_task
163
+ require 'roby/tasks/thread'
164
+ class ComputePath < Roby::Tasks::Thread
166
165
  # The movement goal
167
166
  argument :goal
168
167
 
169
168
  # The robot position at which we started planning the path
170
169
  attr_reader :start_point
171
170
 
172
- # Initialize start_point and call ThreadTask's start command
171
+ # Initialize start_point and call Tasks::Thread's start command
173
172
  event :start do |context|
174
173
  @start_point = State.pos.dup
175
174
  super
@@ -189,33 +188,25 @@ class ComputePath < Roby::ThreadTask
189
188
  Robot.info "#{path.size} points between #{start_point} and #{goal}"
190
189
  path
191
190
  end
192
-
193
- on :success do |ev|
194
- path_task.path = result
195
- end
196
191
  end
197
192
  {coderay}
198
193
 
199
- Finally, ExecutePath takes the path generated and follows it. In the same way than
200
- done with ComputePath, a "path\_task" argument represents the task that holds the
201
- path (which is everything the task needs). So, edit tasks/execute\_path.rb and
194
+ Finally, ExecutePath takes the path generated and follows it. It assumes that
195
+ its path is stored on its parent task. Edit models/tasks/execute\_path.rb and
202
196
  add the following:
203
197
 
204
198
  {coderay:: ruby}
205
199
  class ExecutePath < Roby::Task
206
200
  terminates
207
201
 
208
- # The task holding the path data
209
- argument :path_task
210
-
211
202
  # The current waypoint
212
- def current_waypoint; path_task.task[@waypoint_index] end
203
+ def current_waypoint; parent_task.path[@waypoint_index] end
213
204
 
214
205
  poll do
215
206
  @waypoint_index ||= 0
216
207
  State.pos = current_waypoint
217
208
  @waypoint_index += 1
218
- if @waypoint_index == path_task.data.size
209
+ if @waypoint_index == parent_task.path.size
219
210
  emit :success
220
211
  end
221
212
 
@@ -225,51 +216,61 @@ end
225
216
  {coderay}
226
217
 
227
218
  There are two things left to do: properly initializing the position and adding
228
- the planning method. For the first point, we will use the Pos::Vector3D class
229
- that Roby provides (a simple x,y,z tuple). Edit controllers/goForward.rb and
219
+ the planning method. For the first point, we will use the Roby::Pos::Vector3D class
220
+ that Roby provides (a simple x,y,z tuple). Edit scripts/controllers/goForward.rb and
230
221
  add:
231
222
 
232
- {coderay:: ruby}
233
- State.pos = Pos::Vector3D.new
234
- {coderay}
223
+ ~~~ ruby
224
+ State.pos = Roby::Pos::Vector3D.new
225
+ ~~~
235
226
 
236
- Finally, edit planners/goForward/main.rb and add the following method:
227
+ Finally, edit models/planners/goForward/main.rb and add the following method:
237
228
 
238
- {coderay:: ruby}
239
- method(:planned_move) do
240
- goal = Pos::Vector3D.new(*arguments.values_at(:x, :y))
229
+ ~~~ ruby
230
+ describe("a movement that is using a planner").
231
+ required_arg('x', 'the X part of the position').
232
+ required_arg('y', 'the Y part of the position')
233
+ def planned_move(arguments)
234
+ goal = Roby::Pos::Vector3D.new(*arguments.values_at(:x, :y))
241
235
  move = MoveTo.new :goal => goal
242
- compute = ComputePath.new :goal => goal, :path_task => move
243
- execute = ExecutePath.new :path_task => move
236
+ compute = ComputePath.new :goal => goal
237
+ execute = ExecutePath.new
238
+ # ExecutePath expects its target path from its parent. Make sure that it
239
+ # happens
240
+ compute.on :success do |event|
241
+ move.path = compute.result
242
+ end
244
243
  (compute + execute).to_task(move)
245
244
  move
246
245
  end
247
- {coderay}
246
+ ~~~
248
247
 
249
248
  Trying it out
250
249
  -------------
251
250
 
252
251
  In one Unix shell, do
253
252
 
254
- $ scripts/run goForward
253
+ $ roby run -rgoForward -c
255
254
  344919:32:59.172 (Roby) GC.enable does not accept an argument. GC will not be controlled by Roby
256
255
  344919:32:59.204 (goForward) loaded Roby 0.7.90 on ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
257
256
  344919:32:59.272 (goForward) loading controller file /home/joyeux/dev/first_app/controllers/goForward.rb
258
257
  344919:32:59.273 (goForward) done initialization
259
- 0
260
- 0
261
258
 
262
259
  Then, **in another one**, start the Roby shell
263
260
 
264
- $ scripts/shell
261
+ $ roby shell
265
262
  localhost:48902 >
266
263
 
267
264
  And do
268
265
 
269
- {coderay:: ruby}
270
- localhost:48902 > task = planned_move! :x => 10, :y => 20
271
- => MoveTo{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}:0x7fd0ec1b1a38[]
272
- localhost:48902 >
273
- !task MoveTo{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}:0x7fd0ec1b1a38[] finished successfully
274
- {coderay}
266
+ ~~~ ruby
267
+ localhost:48902 > planned_move! :x => 10, :y => 20
268
+ => #<service Roby::Task:0x7f34d6dce5f8{}[]>
269
+ localhost:48902 >
270
+ [1] planned_move! started to plan
271
+ [1] planned_move!: Roby::Task:0x7f34d6dce5f8{}[] has been replaced by MoveTo:0x7f34d6db7358{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[]
272
+ [1] planned_move!: task MoveTo:0x7f34d6db7358{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] started
273
+ [1] planned_move!: task MoveTo:0x7f34d6db7358{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] finished successfully
274
+ [1] planned_move!: task MoveTo:0x7f34d6db7358{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] has been removed
275
+ ~~~
275
276
 
@@ -0,0 +1,13 @@
1
+ ---
2
+ title: Tutorials
3
+ sort_info: 0
4
+ ---
5
+ This section will present the basics of plan management using Roby, this time
6
+ with concrete examples. It assumes that you already have read the
7
+ [concepts](../concepts) section.
8
+
9
+ * the two core objects used in Roby to represent the robot's actions
10
+ * what is a Roby application and how create one
11
+ * how it is possible to interact with a running Roby application
12
+ * how to build complex actions from simple ones
13
+
@@ -0,0 +1,153 @@
1
+ ---
2
+ title: Using Plan Display
3
+ sort_info: 600
4
+ ---
5
+
6
+ What we will see in this page is how to trace the execution flow (the flow of
7
+ events), and understand a bit more how the plans you will build are actually
8
+ executed by the system. We will re-use the planned\_move planning action we just
9
+ built.
10
+
11
+ Getting a log file
12
+ ------------------
13
+
14
+ Using logging is the most common case, so it is enabled by default. However, it
15
+ is can be expensive from a CPU point of view. To disable, edit config/app.yml
16
+ and comment "events: false" around line 23.
17
+ {: .block}
18
+
19
+ Run the controller again
20
+
21
+ # roby run -rgoForward -c
22
+
23
+ and in the shell, do
24
+
25
+ localhost:48902 > planned_move! :x => 10, :y => 20 => #<service Roby::Task:0x7f48f073d6e8{}[]>
26
+ localhost:48902 >
27
+ [1] planned_move! started to plan
28
+ [1] planned_move!: Roby::Task:0x7f48f073d6e8{}[] has been replaced by MoveTo:0x7f48f0726448{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[]
29
+ [1] planned_move!: task MoveTo:0x7f48f0726448{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] started
30
+ [1] planned_move!: task MoveTo:0x7f48f0726448{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] finished successfully
31
+ [1] planned_move!: task MoveTo:0x7f48f0726448{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] has been removed
32
+
33
+ The log files are saved in the logs/ folder with a name that represents the
34
+ start time of the run (YYYYMMDD-HHMM). The last run (or the current run, if it
35
+ is still running) is symlinked to logs/current. One can use
36
+
37
+ roby results plan_display_tutorial
38
+
39
+ to rename the folder to YYYYMMDD-HHMM_plan_display_tutorial, so that finding
40
+ this particular dataset later is easier.
41
+
42
+ Displaying the log file
43
+ -----------------------
44
+ List the contents of the generated log directory:
45
+
46
+ $ cd /home/doudou/dev/roby-tutorials/
47
+ $ ls logs/current/
48
+ goForward-events.log
49
+ goForward-index.log
50
+
51
+ If you look into it, two goForward files are present:
52
+ <tt>goForward-events.log</tt> and "goForward-index.log". The first one includes
53
+ a trace of everything that happens in the Roby controller which has been traced
54
+ (which virtually includes everything). The second one can actually be generated
55
+ from data in the first one. It is simply used to speed up operations.
56
+
57
+ The data in the event log can be used to display the plan operations in a GUI.
58
+ For that, you need to have installed [Ruby/Qt4](http://korundum.rubyforge.org), as
59
+ the GUI is written using Qt and Ruby. This can be done by installing the
60
+ qtbindings rubygem.
61
+
62
+ To start it, simply do the following in the directory of the log files:
63
+
64
+ $ roby display logs/current/goForward-events.log
65
+
66
+ The following two windows should appear:
67
+
68
+ ![](log_replay/roby_log_main_window.png)
69
+
70
+ The right window is the replay control. It displays the execution cycles in
71
+ which something happened (an event has been emitted or the plan got modified).
72
+ The left window represents the plan structure at the currently selected cycle,
73
+ the events that got emitted during this cycle as well as the propagation between
74
+ these events. The set of task relations that should be displayed can be selected
75
+ by going into View/Configure.
76
+
77
+ **Very important note** your own display may not look exactly like the ones
78
+ displayed here. Some of the features showed here (like threaded planning) are
79
+ asynchronous and as such the exact displays depend on the execution timing. Note
80
+ that, even though it is the case, the robot _behaviour_ remains unchanged.
81
+ {: .warning}
82
+
83
+ Startup of the "planned\_move!" action {#planning}
84
+ ---------------------------------------
85
+
86
+ Let's get to the first task-related events. Click on the first element in
87
+ execution history (cycle @13 in the right window above). It should look like the
88
+ next image:
89
+
90
+ ![](log_replay/goForward_1.png)
91
+
92
+ What you see here is a representation of the plan built when the planned\_move!
93
+ command is entered in the shell. It consists of a generic task (Roby::Task)
94
+ which is planned\_by a Roby::PlanningTask. This is how Roby handles action
95
+ requests from the shell: (i) it searches a planner defined for that robot with
96
+ the specific action and (ii) generates the plan representing the planning
97
+ process _in a separate thread_.
98
+
99
+ Once that initial plan has been built, the Roby::PlanningTask task has been
100
+ started. The various cases of event propagation are represented in different
101
+ ways, based on whether or not the event is controlable or contingent, if it has been
102
+ called and/or emitted. Finally, two different arrow representations are used for
103
+ signalling (plain) and forwarding (dotted):
104
+
105
+ ![](log_replay/roby_replay_event_representation.png)
106
+
107
+ A note about propagation representation: it would be useless to represent all
108
+ the event propagation from the beginning of the execution to the current point.
109
+ The display therefore represents only the propagations that have taken place
110
+ _within the selected cycle_. In our case, we see that, in this cycle, the
111
+ planning task "start" event has been called and emitted.
112
+
113
+ The MoveTo plan
114
+ ---------------
115
+
116
+ Advance one step (to the next cycle)
117
+
118
+ ![](log_replay/goForward_2.png)
119
+
120
+ The MoveTo action has been planned and the executed plan is modified to reflect
121
+ that. The MoveTo action itself is then started, and that is propagated to the
122
+ ComputePath 'start' event through the signalling relation that was established
123
+ in planned\_move.
124
+
125
+ Next execution step gives us the following:
126
+
127
+ ![](log_replay/goForward_3.png)
128
+
129
+ ComputePath emitted its "success" event. We see here that the emission of the
130
+ "success" event of that task does not mean 'the plan modification has just took
131
+ place' but instead that 'it has taken place some time earlier'.
132
+
133
+ The ComputePath task has also finished generating the path, which is why
134
+ ExecutePath is started. Here, the dotted lines between the events
135
+ represent a forwarding relation between them, while the plain lines
136
+ represent signal relations.
137
+
138
+ Finally, light grey here represents tasks that have finished with the "success"
139
+ event. Tasks whose "failed" event has been emitted are represented in red.
140
+
141
+ To finish: the garbage collection process
142
+ -----------------------------------------
143
+
144
+ Advance a few more steps.
145
+
146
+ ![](log_replay/goForward_5.png)
147
+
148
+ Here, ExecutePath has finished its execution with success and MoveTo is
149
+ therefore finished as well -- per the forwarding relation between those two
150
+ events. Note that the tasks have this thick dark grey contour. It means that the
151
+ task got [garbage collected](../concepts/garbage_collection.html) in this cycle,
152
+ i.e. removed from the plan because it was not useful anymore.
153
+
@@ -0,0 +1,121 @@
1
+ ---
2
+ title: Interactive Shell
3
+ sort_info: 400
4
+ ---
5
+
6
+ As we saw earlier, the execution of Roby applications is done by an _event
7
+ loop_. The reactivity of the supervision system obviously depend on the
8
+ non-interruption of that event loop. Therefore, in a Roby application, the user
9
+ runs a remote shell that is used to send specific commands to the Roby
10
+ application itself.
11
+
12
+ Actions
13
+ --------
14
+ Right now, we saw two different places where code is stored:
15
+
16
+ 1. the models/tasks/ files, where task models are defined
17
+ 2. the scripts/controllers/ files, which is the startup code for the application
18
+
19
+ What we will see in this section is a third component: the **action
20
+ interfaces**. They define what the robot can do, i.e. the overall actions that
21
+ it is able to realize. What we will see here is that they also are the user
22
+ interface of the robot.
23
+
24
+ Exporting actions to the user's shell
25
+ -------------------------------------
26
+
27
+ Edit models/actions/goForward/main.rb and edit so that it looks like this:
28
+
29
+ ~~~ ruby
30
+ require 'models/actions/main'
31
+ class Main
32
+ describe('moves the robot in a forward direction').
33
+ required_arg('speed', 'the speed in m/s at which the robot should move')
34
+ def move(arguments)
35
+ GoForward.new :speed => arguments[:speed]
36
+ end
37
+ end
38
+ ~~~
39
+
40
+ That defines a very simple 'move' action. Now, we can try it out in the
41
+ Roby shell. First, remove the last three lines in scripts/controllers/goForward.rb so
42
+ that it looks like this:
43
+
44
+ {coderay:: ruby}
45
+ # Define the original value of x
46
+ State.pos.x = 0
47
+
48
+ # Will display the value of x every 1 second
49
+ Roby.every(1) do
50
+ puts State.pos.x
51
+ end
52
+ {coderay}
53
+
54
+ Start the roby application in one console:
55
+
56
+ $ roby run -rgoForward -c
57
+ 44848:44:51.498 (Roby) GC.enable does not accept an argument. GC will not be controlled by Roby
58
+ 344848:44:51.581 (goForward) loaded Roby 0.7.90 on ruby 1.8.7 (2008-08-11 patchlevel 72) [powerpc-linux]
59
+ 344848:44:51.603 (goForward) loading controller file /home/doudou/dev/roby-tutorials/controllers/goForward.rb
60
+ 344848:44:51.605 (goForward) done initialization
61
+ 0
62
+ 0
63
+
64
+ Finally, start the shell in another console:
65
+
66
+ $ roby shell
67
+ localhost:48902 >
68
+
69
+ Note that the shell does not have to be executed on the same machine than the controller.
70
+ You can connect remotely with the --host option. Moreover, even though it
71
+ requires a controller to be running when it starts, it will reconnect
72
+ automatically afterwards.
73
+ {: .note}
74
+
75
+ The new prompt you get is a Ruby prompt (i.e. you should type Ruby code in it).
76
+ Some special commands are available to interact with the Roby controller. For
77
+ instance:
78
+
79
+ ~~~ ruby
80
+ localhost:48902 > describe move
81
+ ~~~
82
+
83
+ The 'help' command lists the available actions that are exported
84
+ through the Main class. Let's try it (**notice the '!' at the end of
85
+ move!**):
86
+
87
+ ~~~ ruby
88
+ localhost:48902 > move! :speed => 1
89
+ => #<service Roby::Task:0x7f06da2ab308{}[]>
90
+ localhost:48902 >
91
+ [1] move! started to plan
92
+ [1] move!: Roby::Task:0x7f06da2ab308{}[] has been replaced by GoForward:0x7f06da28f298{speed => 1}[]
93
+ [1] move!: task GoForward:0x7f06da28f298{speed => 1}[] started
94
+ > kill_job 1
95
+ [1] move!: task GoForward:0x7f06da28f298{speed => 1}[] failed
96
+ [1] move!: task GoForward:0x7f06da28f298{speed => 1}[] has been removed
97
+ ~~~
98
+
99
+ The __intent__ to run the move is first added to the plan. Then, it gets
100
+ developped by calling the action interface (the "started to plan" stanza), and
101
+ the result replaces the placeholder task ("has been replaced by ..."). It then
102
+ becomes eligible for [scheduling](../concepts/execution.html#scheduling) and is started.
103
+
104
+ The value returned by the move! call can also be manipulated as if it was a task itself. For instance:
105
+
106
+ ~~~ ruby
107
+ > t = move! :speed => 1
108
+ => #<service Roby::Task:0x7f06da2ab308{}[]>
109
+ [1] move! started to plan
110
+ [1] move!: Roby::Task:0x7f06da2ab308{}[] has been replaced by GoForward:0x7f06da28f298{speed => 1}[]
111
+ [1] move!: task GoForward:0x7f06da28f298{speed => 1}[] started
112
+ > t.running?
113
+ => true
114
+ > t.stop!
115
+ [3] move!: task GoForward:0x7f06da215e20{speed => 1}[] failed
116
+ [3] move!: task GoForward:0x7f06da215e20{speed => 1}[] has been removed
117
+ ~~~
118
+
119
+ The action interface is described in details in the section about [Building Roby
120
+ applications](../building). The shell in the section about [interacting with
121
+ Roby applications](../interacting).