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.
- checksums.yaml +7 -0
- data/.deep-cover.rb +3 -0
- data/.gitattributes +1 -0
- data/.gitignore +24 -0
- data/.simplecov +10 -0
- data/.travis.yml +17 -0
- data/.yardopts +4 -0
- data/Gemfile +15 -0
- data/README.md +11 -0
- data/Rakefile +47 -177
- data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
- data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
- data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
- data/benchmark/{genom.rb → attic/genom.rb} +0 -0
- data/benchmark/attic/transactions.rb +62 -0
- data/benchmark/plan_basic_operations.rb +28 -0
- data/benchmark/relations/graph.rb +63 -0
- data/benchmark/ruby/identity.rb +18 -0
- data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
- data/benchmark/ruby/yield_vs_block.rb +35 -0
- data/benchmark/run +5 -0
- data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
- data/benchmark/transactions.rb +99 -51
- data/bin/roby +38 -197
- data/bin/roby-display +14 -0
- data/bin/roby-log +3 -176
- data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
- data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
- data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
- data/doc/guide/{src → attic}/abstraction/index.page +1 -1
- data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
- data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
- data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
- data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
- data/doc/guide/attic/cycle/error_handling.page +98 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
- data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
- data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
- data/doc/guide/{src → attic}/cycle/index.page +1 -1
- data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
- data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
- data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
- data/doc/guide/attic/plans/building_plans.page +89 -0
- data/doc/guide/attic/plans/code.page +192 -0
- data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
- data/doc/guide/attic/plans/index.page +7 -0
- data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
- data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
- data/doc/guide/attic/plans/querying_plans.page +5 -0
- data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
- data/doc/guide/config.yaml +7 -4
- data/doc/guide/ext/extended_menu.rb +29 -0
- data/doc/guide/ext/init.rb +6 -0
- data/doc/guide/ext/rdoc_links.rb +7 -6
- data/doc/guide/src/advanced_concepts/history.page +5 -0
- data/doc/guide/src/advanced_concepts/index.page +11 -0
- data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
- data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
- data/doc/guide/src/advanced_concepts/transactions.page +5 -0
- data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
- data/doc/guide/src/base.template +96 -0
- data/doc/guide/src/basics_shell_header.txt +5 -7
- data/doc/guide/src/building/action_coordination.page +96 -0
- data/doc/guide/src/building/actions.page +124 -0
- data/doc/guide/src/building/file_layout.page +71 -0
- data/doc/guide/src/building/index.page +50 -0
- data/doc/guide/src/building/patterns.page +86 -0
- data/doc/guide/src/building/patterns_forwarding.png +0 -0
- data/doc/guide/src/building/patterns_forwarding.svg +277 -0
- data/doc/guide/src/building/runtime.page +95 -0
- data/doc/guide/src/building/task_models.page +94 -0
- data/doc/guide/src/building/tasks.page +284 -0
- data/doc/guide/src/concepts/error_handling.page +100 -0
- data/doc/guide/src/concepts/exception_propagation.png +0 -0
- data/doc/guide/src/concepts/exception_propagation.svg +445 -0
- data/doc/guide/src/concepts/execution.page +85 -0
- data/doc/guide/src/concepts/execution.png +0 -0
- data/doc/guide/src/concepts/execution.svg +573 -0
- data/doc/guide/src/concepts/execution_cycle.png +0 -0
- data/doc/guide/src/concepts/garbage_collection.page +57 -0
- data/doc/guide/src/concepts/index.page +27 -0
- data/doc/guide/src/concepts/plans.page +101 -0
- data/doc/guide/src/concepts/policy.page +31 -0
- data/doc/guide/src/concepts/reactor.page +61 -0
- data/doc/guide/src/concepts/simple_plan_example.png +0 -0
- data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
- data/doc/guide/src/default.template +9 -74
- data/doc/guide/src/event_relations/forward.page +71 -0
- data/doc/guide/src/event_relations/index.page +12 -0
- data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
- data/doc/guide/src/event_relations/signal.page +55 -0
- data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
- data/doc/guide/src/htmldoc.metainfo +21 -8
- data/doc/guide/src/index.page +8 -3
- data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
- data/doc/guide/src/installation/publications.page +14 -0
- data/doc/guide/src/{introduction → installation}/videos.page +14 -7
- data/doc/guide/src/interacting/index.page +16 -0
- data/doc/guide/src/interacting/run.page +33 -0
- data/doc/guide/src/interacting/shell.page +95 -0
- data/doc/guide/src/plugins/creating_plugins.page +72 -0
- data/doc/guide/src/plugins/index.page +27 -5
- data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
- data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
- data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
- data/doc/guide/src/style_screen.css +687 -0
- data/doc/guide/src/task_relations/dependency.page +107 -0
- data/doc/guide/src/task_relations/executed_by.page +77 -0
- data/doc/guide/src/task_relations/index.page +12 -0
- data/doc/guide/src/task_relations/new_relations.page +119 -0
- data/doc/guide/src/task_relations/planned_by.page +46 -0
- data/doc/guide/src/tutorial/app.page +117 -0
- data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
- data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
- data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
- data/doc/guide/src/tutorial/events.page +195 -0
- data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
- data/doc/guide/src/tutorial/index.page +13 -0
- data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
- data/doc/guide/src/tutorial/relations_display.page +153 -0
- data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
- data/doc/guide/src/tutorial/shell.page +121 -0
- data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
- data/doc/guide/src/tutorial/tasks.page +374 -0
- data/lib/roby.rb +102 -47
- data/lib/roby/actions.rb +17 -0
- data/lib/roby/actions/action.rb +80 -0
- data/lib/roby/actions/interface.rb +45 -0
- data/lib/roby/actions/library.rb +23 -0
- data/lib/roby/actions/models/action.rb +224 -0
- data/lib/roby/actions/models/coordination_action.rb +58 -0
- data/lib/roby/actions/models/interface.rb +22 -0
- data/lib/roby/actions/models/interface_base.rb +294 -0
- data/lib/roby/actions/models/library.rb +12 -0
- data/lib/roby/actions/models/method_action.rb +90 -0
- data/lib/roby/actions/task.rb +114 -0
- data/lib/roby/and_generator.rb +125 -0
- data/lib/roby/app.rb +2795 -829
- data/lib/roby/app/autotest_console_reporter.rb +138 -0
- data/lib/roby/app/base.rb +21 -0
- data/lib/roby/app/cucumber.rb +2 -0
- data/lib/roby/app/cucumber/controller.rb +439 -0
- data/lib/roby/app/cucumber/helpers.rb +280 -0
- data/lib/roby/app/cucumber/world.rb +32 -0
- data/lib/roby/app/debug.rb +136 -0
- data/lib/roby/app/gen.rb +2 -0
- data/lib/roby/app/rake.rb +178 -38
- data/lib/roby/app/robot_config.rb +9 -0
- data/lib/roby/app/robot_names.rb +115 -0
- data/lib/roby/app/run.rb +3 -2
- data/lib/roby/app/scripts.rb +72 -0
- data/lib/roby/app/scripts/autotest.rb +173 -0
- data/lib/roby/app/scripts/display.rb +2 -0
- data/lib/roby/app/scripts/restart.rb +52 -0
- data/lib/roby/app/scripts/results.rb +17 -8
- data/lib/roby/app/scripts/run.rb +155 -24
- data/lib/roby/app/scripts/shell.rb +147 -62
- data/lib/roby/app/scripts/test.rb +107 -22
- data/lib/roby/app/test_reporter.rb +74 -0
- data/lib/roby/app/test_server.rb +159 -0
- data/lib/roby/app/vagrant.rb +47 -0
- data/lib/roby/backports.rb +16 -0
- data/lib/roby/cli/display.rb +190 -0
- data/lib/roby/cli/exceptions.rb +17 -0
- data/lib/roby/cli/gen/actions/class.rb +5 -0
- data/lib/roby/cli/gen/actions/test.rb +6 -0
- data/lib/roby/cli/gen/app/.yardopts +6 -0
- data/lib/roby/cli/gen/app/README.md +28 -0
- data/lib/roby/cli/gen/app/Rakefile +15 -0
- data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
- data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
- data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
- data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
- data/lib/roby/cli/gen/class/class.rb +6 -0
- data/lib/roby/cli/gen/class/test.rb +7 -0
- data/lib/roby/cli/gen/helpers.rb +203 -0
- data/lib/roby/cli/gen/module/module.rb +5 -0
- data/lib/roby/cli/gen/module/test.rb +6 -0
- data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
- data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
- data/lib/roby/cli/gen/task/class.rb +44 -0
- data/lib/roby/cli/gen/task/test.rb +6 -0
- data/lib/roby/cli/gen_main.rb +120 -0
- data/lib/roby/cli/log.rb +276 -0
- data/lib/roby/cli/log/flamegraph.html +499 -0
- data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
- data/lib/roby/cli/main.rb +153 -0
- data/lib/roby/coordination.rb +60 -0
- data/lib/roby/coordination/action_script.rb +25 -0
- data/lib/roby/coordination/action_state_machine.rb +125 -0
- data/lib/roby/coordination/actions.rb +106 -0
- data/lib/roby/coordination/base.rb +145 -0
- data/lib/roby/coordination/calculus.rb +40 -0
- data/lib/roby/coordination/child.rb +28 -0
- data/lib/roby/coordination/event.rb +29 -0
- data/lib/roby/coordination/fault_handler.rb +25 -0
- data/lib/roby/coordination/fault_handling_task.rb +13 -0
- data/lib/roby/coordination/fault_response_table.rb +110 -0
- data/lib/roby/coordination/models/action_script.rb +64 -0
- data/lib/roby/coordination/models/action_state_machine.rb +224 -0
- data/lib/roby/coordination/models/actions.rb +191 -0
- data/lib/roby/coordination/models/arguments.rb +55 -0
- data/lib/roby/coordination/models/base.rb +176 -0
- data/lib/roby/coordination/models/capture.rb +86 -0
- data/lib/roby/coordination/models/child.rb +35 -0
- data/lib/roby/coordination/models/event.rb +41 -0
- data/lib/roby/coordination/models/exceptions.rb +42 -0
- data/lib/roby/coordination/models/fault_handler.rb +219 -0
- data/lib/roby/coordination/models/fault_response_table.rb +77 -0
- data/lib/roby/coordination/models/root.rb +22 -0
- data/lib/roby/coordination/models/script.rb +283 -0
- data/lib/roby/coordination/models/task.rb +184 -0
- data/lib/roby/coordination/models/task_from_action.rb +50 -0
- data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
- data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
- data/lib/roby/coordination/models/task_from_variable.rb +27 -0
- data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
- data/lib/roby/coordination/models/variable.rb +32 -0
- data/lib/roby/coordination/script.rb +200 -0
- data/lib/roby/coordination/script_instruction.rb +12 -0
- data/lib/roby/coordination/task.rb +45 -0
- data/lib/roby/coordination/task_base.rb +69 -0
- data/lib/roby/coordination/task_script.rb +293 -0
- data/lib/roby/coordination/task_state_machine.rb +308 -0
- data/lib/roby/decision_control.rb +33 -21
- data/lib/roby/distributed_object.rb +76 -0
- data/lib/roby/droby.rb +17 -0
- data/lib/roby/droby/droby_id.rb +6 -0
- data/lib/roby/droby/enable.rb +153 -0
- data/lib/roby/droby/event_logger.rb +189 -0
- data/lib/roby/droby/event_logging.rb +57 -0
- data/lib/roby/droby/exceptions.rb +14 -0
- data/lib/roby/droby/identifiable.rb +22 -0
- data/lib/roby/droby/logfile.rb +141 -0
- data/lib/roby/droby/logfile/client.rb +176 -0
- data/lib/roby/droby/logfile/file_format.md +97 -0
- data/lib/roby/droby/logfile/index.rb +117 -0
- data/lib/roby/droby/logfile/reader.rb +139 -0
- data/lib/roby/droby/logfile/server.rb +199 -0
- data/lib/roby/droby/logfile/writer.rb +114 -0
- data/lib/roby/droby/marshal.rb +264 -0
- data/lib/roby/droby/marshallable.rb +12 -0
- data/lib/roby/droby/null_event_logger.rb +25 -0
- data/lib/roby/droby/object_manager.rb +205 -0
- data/lib/roby/droby/peer_id.rb +6 -0
- data/lib/roby/droby/plan_rebuilder.rb +373 -0
- data/lib/roby/droby/rebuilt_plan.rb +160 -0
- data/lib/roby/droby/remote_droby_id.rb +6 -0
- data/lib/roby/droby/timepoints.rb +205 -0
- data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
- data/lib/roby/droby/timepoints_ctf.rb +125 -0
- data/lib/roby/droby/v5.rb +14 -0
- data/lib/roby/droby/v5/builtin.rb +120 -0
- data/lib/roby/droby/v5/droby_class.rb +45 -0
- data/lib/roby/droby/v5/droby_constant.rb +81 -0
- data/lib/roby/droby/v5/droby_dump.rb +1026 -0
- data/lib/roby/droby/v5/droby_id.rb +44 -0
- data/lib/roby/droby/v5/droby_model.rb +82 -0
- data/lib/roby/droby/v5/peer_id.rb +10 -0
- data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
- data/lib/roby/event.rb +79 -957
- data/lib/roby/event_constraints.rb +835 -0
- data/lib/roby/event_generator.rb +1047 -0
- data/lib/roby/event_structure/causal_link.rb +6 -0
- data/lib/roby/event_structure/forwarding.rb +6 -0
- data/lib/roby/event_structure/precedence.rb +7 -0
- data/lib/roby/event_structure/signal.rb +8 -0
- data/lib/roby/event_structure/temporal_constraints.rb +640 -0
- data/lib/roby/exceptions.rb +446 -152
- data/lib/roby/executable_plan.rb +549 -0
- data/lib/roby/execution_engine.rb +1997 -950
- data/lib/roby/filter_generator.rb +26 -0
- data/lib/roby/gui/chronicle_view.rb +225 -0
- data/lib/roby/gui/chronicle_widget.rb +925 -0
- data/lib/roby/gui/dot_id.rb +11 -0
- data/lib/roby/gui/exception_view.rb +44 -0
- data/lib/roby/gui/log_display.rb +273 -0
- data/lib/roby/gui/model_views.rb +2 -0
- data/lib/roby/gui/model_views/action_interface.rb +53 -0
- data/lib/roby/gui/model_views/task.rb +47 -0
- data/lib/roby/gui/model_views/task.rhtml +41 -0
- data/lib/roby/gui/object_info_view.rb +89 -0
- data/lib/roby/gui/plan_dot_layout.rb +427 -0
- data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
- data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
- data/lib/roby/gui/relations_view.rb +278 -0
- data/lib/roby/gui/relations_view/relations.ui +139 -0
- data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
- data/lib/roby/gui/relations_view/relations_config.rb +292 -0
- data/lib/roby/gui/relations_view/relations_view.ui +53 -0
- data/lib/roby/gui/scheduler_view.css +24 -0
- data/lib/roby/gui/scheduler_view.rb +46 -0
- data/lib/roby/gui/scheduler_view.rhtml +53 -0
- data/lib/roby/gui/stepping.rb +93 -0
- data/lib/roby/gui/stepping.ui +181 -0
- data/lib/roby/gui/styles.rb +81 -0
- data/lib/roby/gui/task_display_configuration.rb +42 -0
- data/lib/roby/gui/task_state_at.rb +38 -0
- data/lib/roby/hooks.rb +26 -0
- data/lib/roby/interface.rb +136 -469
- data/lib/roby/interface/async.rb +20 -0
- data/lib/roby/interface/async/action_monitor.rb +188 -0
- data/lib/roby/interface/async/interface.rb +498 -0
- data/lib/roby/interface/async/job_monitor.rb +213 -0
- data/lib/roby/interface/async/log.rb +238 -0
- data/lib/roby/interface/async/new_job_listener.rb +79 -0
- data/lib/roby/interface/async/ui_connector.rb +183 -0
- data/lib/roby/interface/client.rb +553 -0
- data/lib/roby/interface/command.rb +24 -0
- data/lib/roby/interface/command_argument.rb +16 -0
- data/lib/roby/interface/command_library.rb +92 -0
- data/lib/roby/interface/droby_channel.rb +174 -0
- data/lib/roby/interface/exceptions.rb +22 -0
- data/lib/roby/interface/interface.rb +655 -0
- data/lib/roby/interface/job.rb +47 -0
- data/lib/roby/interface/rest.rb +10 -0
- data/lib/roby/interface/rest/api.rb +29 -0
- data/lib/roby/interface/rest/helpers.rb +24 -0
- data/lib/roby/interface/rest/server.rb +212 -0
- data/lib/roby/interface/server.rb +154 -0
- data/lib/roby/interface/shell_client.rb +468 -0
- data/lib/roby/interface/shell_subcommand.rb +24 -0
- data/lib/roby/interface/subcommand_client.rb +35 -0
- data/lib/roby/interface/tcp.rb +168 -0
- data/lib/roby/models/arguments.rb +112 -0
- data/lib/roby/models/plan_object.rb +83 -0
- data/lib/roby/models/task.rb +835 -0
- data/lib/roby/models/task_event.rb +62 -0
- data/lib/roby/models/task_service.rb +78 -0
- data/lib/roby/or_generator.rb +88 -0
- data/lib/roby/plan.rb +1751 -864
- data/lib/roby/plan_object.rb +611 -0
- data/lib/roby/plan_service.rb +200 -0
- data/lib/roby/promise.rb +332 -0
- data/lib/roby/queries.rb +23 -0
- data/lib/roby/queries/and_matcher.rb +32 -0
- data/lib/roby/queries/any.rb +27 -0
- data/lib/roby/queries/code_error_matcher.rb +58 -0
- data/lib/roby/queries/event_generator_matcher.rb +9 -0
- data/lib/roby/queries/execution_exception_matcher.rb +165 -0
- data/lib/roby/queries/index.rb +165 -0
- data/lib/roby/queries/localized_error_matcher.rb +149 -0
- data/lib/roby/queries/matcher_base.rb +107 -0
- data/lib/roby/queries/none.rb +27 -0
- data/lib/roby/queries/not_matcher.rb +30 -0
- data/lib/roby/queries/op_matcher.rb +8 -0
- data/lib/roby/queries/or_matcher.rb +30 -0
- data/lib/roby/queries/plan_object_matcher.rb +363 -0
- data/lib/roby/queries/query.rb +188 -0
- data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
- data/lib/roby/queries/task_matcher.rb +344 -0
- data/lib/roby/relations.rb +42 -678
- data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
- data/lib/roby/relations/directed_relation_support.rb +268 -0
- data/lib/roby/relations/event_relation_graph.rb +19 -0
- data/lib/roby/relations/fork_merge_visitor.rb +154 -0
- data/lib/roby/relations/graph.rb +533 -0
- data/lib/roby/relations/models/directed_relation_support.rb +11 -0
- data/lib/roby/relations/models/graph.rb +75 -0
- data/lib/roby/relations/models/task_relation_graph.rb +18 -0
- data/lib/roby/relations/space.rb +380 -0
- data/lib/roby/relations/task_relation_graph.rb +20 -0
- data/lib/roby/robot.rb +85 -38
- data/lib/roby/schedulers/basic.rb +155 -25
- data/lib/roby/schedulers/null.rb +20 -0
- data/lib/roby/schedulers/reporting.rb +31 -0
- data/lib/roby/schedulers/state.rb +129 -0
- data/lib/roby/schedulers/temporal.rb +91 -0
- data/lib/roby/singletons.rb +87 -0
- data/lib/roby/standalone.rb +4 -2
- data/lib/roby/standard_errors.rb +405 -82
- data/lib/roby/state.rb +6 -3
- data/lib/roby/state/conf_model.rb +5 -0
- data/lib/roby/state/events.rb +181 -95
- data/lib/roby/state/goal_model.rb +77 -0
- data/lib/roby/state/open_struct.rb +591 -0
- data/lib/roby/state/open_struct_model.rb +68 -0
- data/lib/roby/state/pos.rb +45 -45
- data/lib/roby/state/shapes.rb +11 -11
- data/lib/roby/state/state_model.rb +303 -0
- data/lib/roby/state/task.rb +43 -0
- data/lib/roby/support.rb +88 -148
- data/lib/roby/task.rb +1361 -1750
- data/lib/roby/task_arguments.rb +428 -0
- data/lib/roby/task_event.rb +127 -0
- data/lib/roby/task_event_generator.rb +337 -0
- data/lib/roby/task_service.rb +6 -0
- data/lib/roby/task_structure/conflicts.rb +104 -0
- data/lib/roby/task_structure/dependency.rb +932 -0
- data/lib/roby/task_structure/error_handling.rb +118 -0
- data/lib/roby/task_structure/executed_by.rb +234 -0
- data/lib/roby/task_structure/planned_by.rb +90 -0
- data/lib/roby/tasks/aggregator.rb +37 -0
- data/lib/roby/tasks/external_process.rb +275 -0
- data/lib/roby/tasks/group.rb +27 -0
- data/lib/roby/tasks/null.rb +19 -0
- data/lib/roby/tasks/parallel.rb +43 -0
- data/lib/roby/tasks/sequence.rb +88 -0
- data/lib/roby/tasks/simple.rb +21 -0
- data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
- data/lib/roby/tasks/timeout.rb +17 -0
- data/lib/roby/tasks/virtual.rb +55 -0
- data/lib/roby/template_plan.rb +7 -0
- data/lib/roby/test/aruba_minitest.rb +74 -0
- data/lib/roby/test/assertion.rb +16 -0
- data/lib/roby/test/assertions.rb +490 -0
- data/lib/roby/test/common.rb +368 -591
- data/lib/roby/test/dsl.rb +149 -0
- data/lib/roby/test/error.rb +18 -0
- data/lib/roby/test/event_reporter.rb +83 -0
- data/lib/roby/test/execution_expectations.rb +1134 -0
- data/lib/roby/test/expect_execution.rb +151 -0
- data/lib/roby/test/minitest_helpers.rb +166 -0
- data/lib/roby/test/roby_app_helpers.rb +200 -0
- data/lib/roby/test/run_planners.rb +155 -0
- data/lib/roby/test/self.rb +112 -0
- data/lib/roby/test/spec.rb +198 -0
- data/lib/roby/test/tasks/empty_task.rb +4 -4
- data/lib/roby/test/tasks/goto.rb +28 -27
- data/lib/roby/test/teardown_plans.rb +100 -0
- data/lib/roby/test/testcase.rb +239 -307
- data/lib/roby/test/tools.rb +159 -155
- data/lib/roby/test/validate_state_machine.rb +75 -0
- data/lib/roby/transaction.rb +1125 -0
- data/lib/roby/transaction/event_generator_proxy.rb +63 -0
- data/lib/roby/transaction/plan_object_proxy.rb +99 -0
- data/lib/roby/transaction/plan_service_proxy.rb +43 -0
- data/lib/roby/transaction/proxying.rb +120 -0
- data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
- data/lib/roby/transaction/task_proxy.rb +135 -0
- data/lib/roby/until_generator.rb +30 -0
- data/lib/roby/version.rb +5 -0
- data/lib/roby/yard.rb +169 -0
- data/lib/yard-roby.rb +1 -0
- data/manifest.xml +32 -6
- data/roby.gemspec +59 -0
- metadata +788 -587
- data/Manifest.txt +0 -321
- data/NOTES +0 -4
- data/README.txt +0 -166
- data/TODO.txt +0 -146
- data/app/README.txt +0 -24
- data/app/Rakefile +0 -8
- data/app/config/ROBOT.rb +0 -5
- data/app/config/init.rb +0 -33
- data/app/config/roby.yml +0 -3
- data/app/controllers/ROBOT.rb +0 -2
- data/app/planners/ROBOT/main.rb +0 -6
- data/app/planners/main.rb +0 -5
- data/app/scripts/distributed +0 -3
- data/app/scripts/generate/bookmarks +0 -3
- data/app/scripts/replay +0 -3
- data/app/scripts/results +0 -3
- data/app/scripts/run +0 -3
- data/app/scripts/server +0 -3
- data/app/scripts/shell +0 -3
- data/app/scripts/test +0 -3
- data/app/tasks/.gitattributes +0 -0
- data/app/tasks/ROBOT/.gitattributes +0 -0
- data/bin/roby-shell +0 -25
- data/doc/guide/src/basics/app.page +0 -139
- data/doc/guide/src/basics/index.page +0 -11
- data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/basics/relations_display.page +0 -203
- data/doc/guide/src/basics/shell.page +0 -102
- data/doc/guide/src/default.css +0 -319
- data/doc/guide/src/introduction/index.page +0 -29
- data/doc/guide/src/introduction/publications.page +0 -14
- data/doc/guide/src/relations/dependency.page +0 -89
- data/doc/guide/src/relations/index.page +0 -12
- data/ext/droby/dump.cc +0 -175
- data/ext/droby/extconf.rb +0 -3
- data/ext/graph/algorithm.cc +0 -746
- data/ext/graph/extconf.rb +0 -7
- data/ext/graph/graph.cc +0 -575
- data/ext/graph/graph.hh +0 -183
- data/ext/graph/iterator_sequence.hh +0 -102
- data/ext/graph/undirected_dfs.hh +0 -226
- data/ext/graph/undirected_graph.hh +0 -421
- data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
- data/lib/roby/app/scripts/replay.rb +0 -31
- data/lib/roby/app/scripts/server.rb +0 -18
- data/lib/roby/basic_object.rb +0 -151
- data/lib/roby/config.rb +0 -14
- data/lib/roby/distributed.rb +0 -36
- data/lib/roby/distributed/base.rb +0 -448
- data/lib/roby/distributed/communication.rb +0 -875
- data/lib/roby/distributed/connection_space.rb +0 -616
- data/lib/roby/distributed/distributed_object.rb +0 -206
- data/lib/roby/distributed/drb.rb +0 -62
- data/lib/roby/distributed/notifications.rb +0 -531
- data/lib/roby/distributed/peer.rb +0 -555
- data/lib/roby/distributed/protocol.rb +0 -529
- data/lib/roby/distributed/proxy.rb +0 -343
- data/lib/roby/distributed/subscription.rb +0 -311
- data/lib/roby/distributed/transaction.rb +0 -498
- data/lib/roby/external_process_task.rb +0 -225
- data/lib/roby/graph.rb +0 -160
- data/lib/roby/log.rb +0 -3
- data/lib/roby/log/chronicle.rb +0 -303
- data/lib/roby/log/console.rb +0 -74
- data/lib/roby/log/data_stream.rb +0 -275
- data/lib/roby/log/dot.rb +0 -279
- data/lib/roby/log/event_stream.rb +0 -161
- data/lib/roby/log/file.rb +0 -396
- data/lib/roby/log/gui/basic_display.ui +0 -83
- data/lib/roby/log/gui/basic_display_ui.rb +0 -89
- data/lib/roby/log/gui/chronicle.rb +0 -26
- data/lib/roby/log/gui/chronicle_view.rb +0 -40
- data/lib/roby/log/gui/chronicle_view.ui +0 -70
- data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
- data/lib/roby/log/gui/data_displays.rb +0 -171
- data/lib/roby/log/gui/data_displays.ui +0 -155
- data/lib/roby/log/gui/data_displays_ui.rb +0 -146
- data/lib/roby/log/gui/notifications.rb +0 -26
- data/lib/roby/log/gui/relations.rb +0 -269
- data/lib/roby/log/gui/relations.ui +0 -123
- data/lib/roby/log/gui/relations_ui.rb +0 -120
- data/lib/roby/log/gui/relations_view.rb +0 -185
- data/lib/roby/log/gui/relations_view.ui +0 -149
- data/lib/roby/log/gui/relations_view_ui.rb +0 -144
- data/lib/roby/log/gui/replay.rb +0 -366
- data/lib/roby/log/gui/replay_controls.rb +0 -206
- data/lib/roby/log/gui/replay_controls.ui +0 -282
- data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
- data/lib/roby/log/gui/runtime.rb +0 -130
- data/lib/roby/log/hooks.rb +0 -186
- data/lib/roby/log/logger.rb +0 -203
- data/lib/roby/log/notifications.rb +0 -244
- data/lib/roby/log/plan_rebuilder.rb +0 -468
- data/lib/roby/log/relations.rb +0 -1084
- data/lib/roby/log/server.rb +0 -547
- data/lib/roby/log/sqlite.rb +0 -47
- data/lib/roby/log/timings.rb +0 -233
- data/lib/roby/plan-object.rb +0 -371
- data/lib/roby/planning.rb +0 -13
- data/lib/roby/planning/loops.rb +0 -309
- data/lib/roby/planning/model.rb +0 -1012
- data/lib/roby/planning/task.rb +0 -180
- data/lib/roby/query.rb +0 -655
- data/lib/roby/relations/conflicts.rb +0 -67
- data/lib/roby/relations/dependency.rb +0 -358
- data/lib/roby/relations/ensured.rb +0 -19
- data/lib/roby/relations/error_handling.rb +0 -22
- data/lib/roby/relations/events.rb +0 -7
- data/lib/roby/relations/executed_by.rb +0 -208
- data/lib/roby/relations/influence.rb +0 -10
- data/lib/roby/relations/planned_by.rb +0 -63
- data/lib/roby/state/information.rb +0 -55
- data/lib/roby/state/state.rb +0 -367
- data/lib/roby/task-operations.rb +0 -186
- data/lib/roby/task_index.rb +0 -80
- data/lib/roby/test/distributed.rb +0 -230
- data/lib/roby/test/tasks/simple_task.rb +0 -23
- data/lib/roby/transactions.rb +0 -507
- data/lib/roby/transactions/proxy.rb +0 -325
- data/plugins/fault_injection/History.txt +0 -4
- data/plugins/fault_injection/README.txt +0 -34
- data/plugins/fault_injection/Rakefile +0 -12
- data/plugins/fault_injection/TODO.txt +0 -0
- data/plugins/fault_injection/app.rb +0 -52
- data/plugins/fault_injection/fault_injection.rb +0 -89
- data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
- data/plugins/subsystems/README.txt +0 -37
- data/plugins/subsystems/Rakefile +0 -13
- data/plugins/subsystems/app.rb +0 -182
- data/plugins/subsystems/test/app/README +0 -24
- data/plugins/subsystems/test/app/Rakefile +0 -8
- data/plugins/subsystems/test/app/config/app.yml +0 -71
- data/plugins/subsystems/test/app/config/init.rb +0 -12
- data/plugins/subsystems/test/app/config/roby.yml +0 -3
- data/plugins/subsystems/test/app/planners/main.rb +0 -20
- data/plugins/subsystems/test/app/scripts/distributed +0 -3
- data/plugins/subsystems/test/app/scripts/replay +0 -3
- data/plugins/subsystems/test/app/scripts/results +0 -3
- data/plugins/subsystems/test/app/scripts/run +0 -3
- data/plugins/subsystems/test/app/scripts/server +0 -3
- data/plugins/subsystems/test/app/scripts/shell +0 -3
- data/plugins/subsystems/test/app/scripts/test +0 -3
- data/plugins/subsystems/test/app/tasks/services.rb +0 -15
- data/plugins/subsystems/test/test_subsystems.rb +0 -78
- data/test/distributed/test_communication.rb +0 -195
- data/test/distributed/test_connection.rb +0 -284
- data/test/distributed/test_execution.rb +0 -378
- data/test/distributed/test_mixed_plan.rb +0 -341
- data/test/distributed/test_plan_notifications.rb +0 -238
- data/test/distributed/test_protocol.rb +0 -525
- data/test/distributed/test_query.rb +0 -106
- data/test/distributed/test_remote_plan.rb +0 -491
- data/test/distributed/test_transaction.rb +0 -466
- data/test/mockups/external_process +0 -28
- data/test/mockups/tasks.rb +0 -27
- data/test/planning/test_loops.rb +0 -432
- data/test/planning/test_model.rb +0 -427
- data/test/planning/test_task.rb +0 -126
- data/test/relations/test_conflicts.rb +0 -42
- data/test/relations/test_dependency.rb +0 -324
- data/test/relations/test_ensured.rb +0 -38
- data/test/relations/test_executed_by.rb +0 -224
- data/test/relations/test_planned_by.rb +0 -56
- data/test/suite_core.rb +0 -29
- data/test/suite_distributed.rb +0 -10
- data/test/suite_planning.rb +0 -4
- data/test/suite_relations.rb +0 -8
- data/test/tasks/test_external_process.rb +0 -126
- data/test/tasks/test_thread_task.rb +0 -70
- data/test/test_bgl.rb +0 -528
- data/test/test_event.rb +0 -969
- data/test/test_exceptions.rb +0 -591
- data/test/test_execution_engine.rb +0 -987
- data/test/test_gui.rb +0 -20
- data/test/test_interface.rb +0 -43
- data/test/test_log.rb +0 -125
- data/test/test_log_server.rb +0 -133
- data/test/test_plan.rb +0 -418
- data/test/test_query.rb +0 -424
- data/test/test_relations.rb +0 -260
- data/test/test_state.rb +0 -432
- data/test/test_support.rb +0 -16
- data/test/test_task.rb +0 -1181
- data/test/test_testcase.rb +0 -138
- data/test/test_transactions.rb +0 -610
- data/test/test_transactions_proxy.rb +0 -216
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Runtime Considerations
|
|
3
|
+
sort_info: 300
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The Planning Pattern {#planning-pattern}
|
|
7
|
+
----------------
|
|
8
|
+
Generating plans can be a pretty expensive operation. This is why, in Roby, it
|
|
9
|
+
is done __asynchronously__ whenever possible.
|
|
10
|
+
|
|
11
|
+
Injecting new tasks-that-should-be-planned is a plan is done by actually adding
|
|
12
|
+
two tasks:
|
|
13
|
+
|
|
14
|
+
* an instance of Roby::Task or of one of its subclasses which is a placeholder
|
|
15
|
+
for the final task
|
|
16
|
+
* a planning task, i.e. a Roby task that is the child of the placeholder in
|
|
17
|
+
the planned_by relation. When using the standard Roby action interface,
|
|
18
|
+
the task used is Roby::Actions::Task.
|
|
19
|
+
|
|
20
|
+
There is an example of that pattern in action [in the
|
|
21
|
+
tutorial](../tutorial/relations_display.html#planning)
|
|
22
|
+
|
|
23
|
+
When using the action interface, the type declared as being the returned task
|
|
24
|
+
type for the action is used as the placeholder. It allows to make it obvious
|
|
25
|
+
what the system __intends__ to do.
|
|
26
|
+
|
|
27
|
+
Failures in the planning methods
|
|
28
|
+
--------------------------------
|
|
29
|
+
The failures in the planning methods are handled through [the planned_by
|
|
30
|
+
relation](../task_relations/planned_by.html)
|
|
31
|
+
|
|
32
|
+
Accessing other tasks
|
|
33
|
+
---------------------
|
|
34
|
+
It is common to access related tasks at runtime, to for instance synchronize
|
|
35
|
+
with the other task's events.
|
|
36
|
+
|
|
37
|
+
The only guideline here is: __always__ use the relations to find about these
|
|
38
|
+
tasks. This is a very common use case of the :role option in the [depends_on
|
|
39
|
+
relation](../task_relations/dependency.html), which allows to use for instance
|
|
40
|
+
localization_child to get the child with the localization role. Another common
|
|
41
|
+
use-case is to use [the #planned_task and #planning_task
|
|
42
|
+
accessors](../task_relations/planned_by.html), or
|
|
43
|
+
[#execution_agent](../task_relations/executed_by.html).
|
|
44
|
+
|
|
45
|
+
However, the only rule here is: __never__ cache the value of these accessors
|
|
46
|
+
across execution cycles (e.g. two calls to a poll block). If you want to access
|
|
47
|
+
the localization child, then access it using #localization_child. There are no
|
|
48
|
+
guarantee that the localization child at one execution cycle will be the same
|
|
49
|
+
at the next, as for instance because of error handling.
|
|
50
|
+
|
|
51
|
+
Delayed planning and task access
|
|
52
|
+
--------------------------------
|
|
53
|
+
When one calls another planner, the planning method is called right away. The
|
|
54
|
+
returned task is, therefore, an actual plan (i.e. task with children and so
|
|
55
|
+
on). However, interfaces with other plan-generation tools (such as
|
|
56
|
+
[syskit](http://rock-robotics.org/documentation/system/index.html)) might
|
|
57
|
+
decide to always return a planner that will be executed when it is needed.
|
|
58
|
+
|
|
59
|
+
In this case, you can obviously not access the children of the returned task directly.
|
|
60
|
+
|
|
61
|
+
__First__, it is not a very good practice: one should only use the toplevel
|
|
62
|
+
task as the "interface" to the task's subplan. [The next page](patterns.html)
|
|
63
|
+
covers these issues.
|
|
64
|
+
|
|
65
|
+
__However__, life being what it is, it is sometimes a good solution to access these children
|
|
66
|
+
directly. To do this, you must wait for the task to be planned. This can be done in two ways:
|
|
67
|
+
|
|
68
|
+
* you wait for the task to be started. If it is started, it is planned !
|
|
69
|
+
* you synchronize on the task's planning task _success_ event
|
|
70
|
+
|
|
71
|
+
Synchronizing on running tasks
|
|
72
|
+
------------------------------
|
|
73
|
+
__Never__ assume a relation between a task's running state and its children /
|
|
74
|
+
parent unless it is explicitely defined by some constraints. Startup of tasks
|
|
75
|
+
is managed by the a scheduler, which can make any decision valid w.r.t.
|
|
76
|
+
the constraints encoded in the plan. Roby is very flexible in this respect, so
|
|
77
|
+
-- unless you explicitely specify e.g. temporal constraints -- you should not
|
|
78
|
+
assume that e.g. a task is running if its parent is. If you need
|
|
79
|
+
synchronization, do it explicitely __on the exact task that you want to
|
|
80
|
+
synchronize with__.
|
|
81
|
+
|
|
82
|
+
This can be hard to achieve, though, when combined with delayed planning (see
|
|
83
|
+
above). However, the scripting interface do take into account delayed planning,
|
|
84
|
+
so it is possible to for instance:
|
|
85
|
+
|
|
86
|
+
{coderay:: ruby}
|
|
87
|
+
script do
|
|
88
|
+
wait_any localization_child.gps_child.start_event
|
|
89
|
+
end
|
|
90
|
+
{coderay}
|
|
91
|
+
|
|
92
|
+
At runtime, this will take into account delayed planning. I.e., if the localization
|
|
93
|
+
child or the gps child are not present, it will wait for any delayed planning on the
|
|
94
|
+
path before generating an error.
|
|
95
|
+
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Creating Task Models
|
|
3
|
+
sort_info: 10
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
As we [just explained](index.html), tasks are used to form
|
|
7
|
+
higher-level _interfaces_ to either lower-level tasks / behaviours, or to other
|
|
8
|
+
processes that are being controlled by Roby.
|
|
9
|
+
|
|
10
|
+
In both cases, the task interface model contains:
|
|
11
|
+
|
|
12
|
+
- __arguments__, the set of parameters for the actual behaviour
|
|
13
|
+
- __events__ represent situations that are of interest by the users of this
|
|
14
|
+
task / behaviour. They also form the __command interface__ on the task.
|
|
15
|
+
|
|
16
|
+
A task model is created by defining a subclass of Roby::Task or of another task
|
|
17
|
+
class. When inheriting from each other, the events and arguments of the base
|
|
18
|
+
class also apply on the subclass. By default, you should always add the
|
|
19
|
+
"terminates" statement in the task definition (alternatives will be explained
|
|
20
|
+
later in this document).
|
|
21
|
+
|
|
22
|
+
~~~ ruby
|
|
23
|
+
module MyApp
|
|
24
|
+
class MoveTo < Roby::Task
|
|
25
|
+
terminates
|
|
26
|
+
...
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
~~~
|
|
30
|
+
|
|
31
|
+
Task models are defined in files in the models/tasks/ subdirectory
|
|
32
|
+
of the Roby application. The file name is usually (but not necessarily) the
|
|
33
|
+
snake_case version of the task name. For instance, the MoveTo task would be
|
|
34
|
+
defined in models/tasks/move_to.rb.
|
|
35
|
+
|
|
36
|
+
If you need to overload the #initialize method, it __must__ accept a single
|
|
37
|
+
optional argument of type Hash:
|
|
38
|
+
|
|
39
|
+
~~~ ruby
|
|
40
|
+
module MyApp
|
|
41
|
+
class MoveTo < Roby::Task
|
|
42
|
+
def initialize(options = Hash.new)
|
|
43
|
+
super
|
|
44
|
+
...
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
~~~
|
|
49
|
+
|
|
50
|
+
Arguments
|
|
51
|
+
---------
|
|
52
|
+
Arguments are defined using the _argument_ statement:
|
|
53
|
+
|
|
54
|
+
~~~ ruby
|
|
55
|
+
module MyApp
|
|
56
|
+
class MoveTo < Roby::Task
|
|
57
|
+
argument :target
|
|
58
|
+
...
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
~~~
|
|
62
|
+
|
|
63
|
+
Arguments can be given defaults:
|
|
64
|
+
|
|
65
|
+
~~~ ruby
|
|
66
|
+
module MyApp
|
|
67
|
+
class MoveTo < Roby::Task
|
|
68
|
+
argument :target, :default => nil
|
|
69
|
+
...
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
~~~
|
|
73
|
+
|
|
74
|
+
A task will only be allowed to start if all its arguments are set. Setting to
|
|
75
|
+
nil counts as "set".
|
|
76
|
+
|
|
77
|
+
Events
|
|
78
|
+
------
|
|
79
|
+
Events are defined using the 'event' statement:
|
|
80
|
+
|
|
81
|
+
~~~ ruby
|
|
82
|
+
module MyApp
|
|
83
|
+
class MoveTo < Roby::Task
|
|
84
|
+
event :reached_target
|
|
85
|
+
...
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
~~~
|
|
89
|
+
|
|
90
|
+
Summary
|
|
91
|
+
-------
|
|
92
|
+
This page described how to create task models, i.e. to define interfaces in a
|
|
93
|
+
Roby plan. [The next page](tasks.html) will tell you how to add code to your tasks to
|
|
94
|
+
actually "do" something.
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Adding runtime code to tasks
|
|
3
|
+
sort_info: 100
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Roby allows you to mix model-based descriptions (the tasks, the plan, ...) with
|
|
7
|
+
model-free code.
|
|
8
|
+
|
|
9
|
+
The first forms an __explicit__ representation of the system's activity, on which other
|
|
10
|
+
tools can reason. That's the interest: one can reason on it, and -- for instance
|
|
11
|
+
-- detect problems before they actually appear, or provide information about the
|
|
12
|
+
future to other systems, or ...
|
|
13
|
+
|
|
14
|
+
The second allows to iron out the "gory details". While model-oriented
|
|
15
|
+
development is all nice on the paper, real systems are usually not "sticking" to
|
|
16
|
+
the model willingly. This aspect of Roby allows to adapt the model to the real
|
|
17
|
+
thing.
|
|
18
|
+
|
|
19
|
+
Some of these code blocks can only be added in the context of the task model
|
|
20
|
+
(i.e. in the task class), while other can be added both at the class and
|
|
21
|
+
instance levels. What can be done where is given in details.
|
|
22
|
+
|
|
23
|
+
This page will cover how you can have some code executed at runtime, and in
|
|
24
|
+
which conditions
|
|
25
|
+
|
|
26
|
+
Event commands
|
|
27
|
+
--------------
|
|
28
|
+
One can associate a single code block, at the model level, as the __command__ of
|
|
29
|
+
a task event. It is done at the event creation:
|
|
30
|
+
|
|
31
|
+
~~~ ruby
|
|
32
|
+
class MoveTo < Roby::Task
|
|
33
|
+
event :start do |context|
|
|
34
|
+
emit :start
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
~~~
|
|
38
|
+
|
|
39
|
+
If the only thing that the command should do is emitting the event, one can use
|
|
40
|
+
the :controlable => true option to Task.event instead:
|
|
41
|
+
|
|
42
|
+
~~~ ruby
|
|
43
|
+
class MoveTo < Roby::Task
|
|
44
|
+
event :start, :controlable => true
|
|
45
|
+
end
|
|
46
|
+
~~~
|
|
47
|
+
|
|
48
|
+
When done in subclasses, one can use the super keyword to call the command from
|
|
49
|
+
the parent task. Note that due to Ruby's language limitations, you must call
|
|
50
|
+
super with explicit arguments (i.e. super() and not super).
|
|
51
|
+
|
|
52
|
+
Event handlers
|
|
53
|
+
--------------
|
|
54
|
+
Any number of event handlers can be associated with a single task event, both at
|
|
55
|
+
the model and instance levels. The syntax is identical in both cases (you will
|
|
56
|
+
see examples below) and the blocks gets an instance of Roby::Event that
|
|
57
|
+
represents the emitted event.
|
|
58
|
+
|
|
59
|
+
At the model level, the code block is evaluated as if it was a method of the
|
|
60
|
+
class (i.e. self == task). At the instance level, the code block is instanciated
|
|
61
|
+
as all blocks (i.e. self != task). If referring to the task is needed,
|
|
62
|
+
|
|
63
|
+
__Model-level example__
|
|
64
|
+
|
|
65
|
+
~~~ ruby
|
|
66
|
+
class MoveTo < Roby::Task
|
|
67
|
+
on :start do |event|
|
|
68
|
+
puts "movement started by task #{self}"
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
~~~
|
|
72
|
+
|
|
73
|
+
__Instance-level example__
|
|
74
|
+
|
|
75
|
+
~~~ ruby
|
|
76
|
+
task = MoveTo.new
|
|
77
|
+
task.on :start do |event|
|
|
78
|
+
puts "movement started by task #{event.task}"
|
|
79
|
+
end
|
|
80
|
+
~~~
|
|
81
|
+
|
|
82
|
+
Executing an event command through a subtask (or subplan)
|
|
83
|
+
---------------------------------------------------------
|
|
84
|
+
It is, sometimes, desired that the command of an event is realized by a task
|
|
85
|
+
itself, instead of simply using a code block.
|
|
86
|
+
|
|
87
|
+
At execution time, this can be done with
|
|
88
|
+
|
|
89
|
+
~~~ ruby
|
|
90
|
+
event.achieve_with(task)
|
|
91
|
+
~~~
|
|
92
|
+
|
|
93
|
+
The corresponding task will be started, and the event is going to be emitted as
|
|
94
|
+
soon as the task's success event is emitted. The task can, obviously, be the
|
|
95
|
+
root task of a complete Roby subplan.
|
|
96
|
+
|
|
97
|
+
Polling handlers
|
|
98
|
+
----------------
|
|
99
|
+
Poll handlers are code blocks attached to tasks. These code blocks are executed
|
|
100
|
+
__if the task is running__ at each of the system's execution cycle (by default,
|
|
101
|
+
it means once every 100ms).
|
|
102
|
+
|
|
103
|
+
A single polling block can be defined on task models, in which case the poll
|
|
104
|
+
block is evaluated as if it was an instance method on the class. super() can be
|
|
105
|
+
used to call the parent task's poll block if there is one.
|
|
106
|
+
|
|
107
|
+
~~~ ruby
|
|
108
|
+
class MyTask < Roby::Task
|
|
109
|
+
poll do
|
|
110
|
+
# Code executed if any instance of class MyTask
|
|
111
|
+
# is running
|
|
112
|
+
#
|
|
113
|
+
# In here, +self+ refers to the task instance
|
|
114
|
+
puts "polling in #{self}"
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
~~~
|
|
118
|
+
|
|
119
|
+
It can also be attached to a task instance with
|
|
120
|
+
|
|
121
|
+
~~~ ruby
|
|
122
|
+
t = MyTask.new
|
|
123
|
+
t.poll do |task|
|
|
124
|
+
# Code executed if +task+ is running
|
|
125
|
+
# In here, +self+ refers to the caller object (i.e. the object that added the
|
|
126
|
+
# poll block). Use +task+ to refer to the task instance. Do NOT use the
|
|
127
|
+
# toplevel instance 't'.
|
|
128
|
+
puts "polling in #{task}"
|
|
129
|
+
end
|
|
130
|
+
~~~
|
|
131
|
+
|
|
132
|
+
While there can be only one class-level polling block, there can be more than
|
|
133
|
+
one instance-level polling blocks.
|
|
134
|
+
|
|
135
|
+
If a poll block has a coding error, the task is going to be terminated by
|
|
136
|
+
emitting its __internal_error__ event.
|
|
137
|
+
|
|
138
|
+
Scripts
|
|
139
|
+
-------
|
|
140
|
+
Scripts offer a step-by-step representation of a long running process in a way
|
|
141
|
+
that is compatible with the underlying [reactor
|
|
142
|
+
mechanisms](../concepts/reactor.html) of Roby. For instance:
|
|
143
|
+
|
|
144
|
+
~~~ ruby
|
|
145
|
+
task = MyTask.new
|
|
146
|
+
movement = move_to :target => [12, 11]
|
|
147
|
+
task.script do
|
|
148
|
+
# Redirect log messages to the logger on Robot
|
|
149
|
+
setup_logger(Robot)
|
|
150
|
+
# Wait for the ready event of the task child that has a 'localization' role to
|
|
151
|
+
# be emitted. It returns immediately if the event has been
|
|
152
|
+
# emitted in the past
|
|
153
|
+
wait_any(localization_child.ready_event)
|
|
154
|
+
# Send a log message
|
|
155
|
+
info "localization ready, starting to move"
|
|
156
|
+
# Start the movement task. It also adds +movement+ as a child of +task+
|
|
157
|
+
start(movement, :role => 'movement_child')
|
|
158
|
+
# Wait for the target position to be reached
|
|
159
|
+
poll do
|
|
160
|
+
if State.position.x > 10
|
|
161
|
+
transition! # exit from the poll loop
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
# Emit success
|
|
165
|
+
emit :success
|
|
166
|
+
end
|
|
167
|
+
~~~
|
|
168
|
+
|
|
169
|
+
The commands available in scripts are detailed in the API
|
|
170
|
+
documentation: {rdoc_class: Roby::TaskScripting::Script}
|
|
171
|
+
|
|
172
|
+
Any number of scripts can be associated, both at the model and instance levels,
|
|
173
|
+
on a given task class or object.
|
|
174
|
+
|
|
175
|
+
__Important__ The toplevel context is evaluated as soon as the script is
|
|
176
|
+
defined. It means that if you do an error there, it is going to be raised right
|
|
177
|
+
away. However, the code blocks provided to e.g. poll or execute will only be
|
|
178
|
+
evaluated when the script reaches this point.
|
|
179
|
+
{: .warning}
|
|
180
|
+
|
|
181
|
+
State machines
|
|
182
|
+
--------------
|
|
183
|
+
Users can detail a Roby task using a state machine concept. The interface described in the following
|
|
184
|
+
embeds the [state_machine gem](http://github.com/pluginaweek/state_machine).
|
|
185
|
+
When defining a Roby task the user can inject substates to the 'running' state. The initial state is 'running' by default.
|
|
186
|
+
|
|
187
|
+
With each state a poll block can be associated. This block is repeatedly called, as long as the task remain in the corresponding state.
|
|
188
|
+
|
|
189
|
+
~~~ ruby
|
|
190
|
+
class MyTask < Roby::Task
|
|
191
|
+
def success_condition_reached?
|
|
192
|
+
# Check for the success condition and return true if it is reached
|
|
193
|
+
end
|
|
194
|
+
refine_running_state do
|
|
195
|
+
poll_in_state :running do
|
|
196
|
+
if success_condition_reached?
|
|
197
|
+
emit :success
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
on :pause do
|
|
202
|
+
transition [:running] => :paused
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
on :resume do
|
|
206
|
+
transition [:paused] => :running
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# In this simple example, 'pause' causes the task to sleep 4 second
|
|
210
|
+
# and then resumes
|
|
211
|
+
poll_in_state :paused do |task|
|
|
212
|
+
if rand < 0.1
|
|
213
|
+
task.emit :resume
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
script_in_state :running do
|
|
218
|
+
start(MoveTo, :role => 'movement')
|
|
219
|
+
wait movement_child.success_event
|
|
220
|
+
info "now pausing and trying again"
|
|
221
|
+
emit :pause
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
on :pause do |ev|
|
|
226
|
+
# stop running actions
|
|
227
|
+
end
|
|
228
|
+
....
|
|
229
|
+
end
|
|
230
|
+
~~~
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
If an event is referred to by a __on__ call in refine_running_state, then it is
|
|
234
|
+
created on the Roby task model as well. This allows you to apply the usual
|
|
235
|
+
syntax to include event actions or to emit events __after__ the
|
|
236
|
+
refine_running_state block.
|
|
237
|
+
|
|
238
|
+
~~~ ruby
|
|
239
|
+
on :yourevent do |ev|
|
|
240
|
+
# The event context will be a instance of StateMachine::Event
|
|
241
|
+
end
|
|
242
|
+
~~~
|
|
243
|
+
|
|
244
|
+
In order to define your state machine behaviour you have to specify when to
|
|
245
|
+
transition from one state to another (as a reaction to an event). These
|
|
246
|
+
transitions should be specified in the __on__ handlers inside the
|
|
247
|
+
refine_running_state block. See [state_machine
|
|
248
|
+
documentation](https://github.com/pluginaweek/state_machine) for an detailed
|
|
249
|
+
example on the syntax which can be used. A simple example is given in the
|
|
250
|
+
following:
|
|
251
|
+
|
|
252
|
+
~~~ ruby
|
|
253
|
+
on :repair do
|
|
254
|
+
# First transition which matches the current state applies
|
|
255
|
+
transition [:exception, :fatal] => :running
|
|
256
|
+
transition [:running] => :halted
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
on :halt do
|
|
260
|
+
transition all => :halted
|
|
261
|
+
end
|
|
262
|
+
~~~
|
|
263
|
+
|
|
264
|
+
The current state of a task can be retrieved (as usual). However the list of states will be extended given the newly introduced substates of running:
|
|
265
|
+
|
|
266
|
+
~~~ ruby
|
|
267
|
+
mytask = MyTask.new
|
|
268
|
+
if mytask.current_state == :paused
|
|
269
|
+
...
|
|
270
|
+
end
|
|
271
|
+
~~~
|
|
272
|
+
|
|
273
|
+
A statemachine transition will be only executed if it is a valid transition, otherwise an InvalidTransition error is raised.
|
|
274
|
+
{: .note}
|
|
275
|
+
|
|
276
|
+
Summary
|
|
277
|
+
-------
|
|
278
|
+
This page and the previous one told you how to build single tasks that represent
|
|
279
|
+
processing, either by abstracting sets of tasks in the roby plan, or external
|
|
280
|
+
processes.
|
|
281
|
+
|
|
282
|
+
The [next page](actions.html) will go to the next level and tell you about Roby's means of
|
|
283
|
+
coordination across tasks: the action interface.
|
|
284
|
+
|