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,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Dependency
|
|
3
|
+
sort_info: 100
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Available as Roby::TaskStructure::Dependency
|
|
7
|
+
|
|
8
|
+
See {rdoc_class: TaskStructure::DependencyGraphClass::Extension} for the list
|
|
9
|
+
of methods that are defined on Roby::Task and
|
|
10
|
+
Roby::TaskStructure::DependencyGraphClass for the methods accessible on the
|
|
11
|
+
relation graph.
|
|
12
|
+
|
|
13
|
+
Semantics
|
|
14
|
+
---------
|
|
15
|
+
The dependency relation defines that a task requires the result, or the
|
|
16
|
+
execution, of another task. If task t1 is a parent of task t2 in that relation,
|
|
17
|
+
it means that the successful execution of t1 requires the successful execution
|
|
18
|
+
of t2.
|
|
19
|
+
|
|
20
|
+
To add a new dependency relation between two tasks +t1+ and +t2+, simply do
|
|
21
|
+
|
|
22
|
+
{coderay:: ruby}
|
|
23
|
+
t1.depends_on t2
|
|
24
|
+
{coderay}
|
|
25
|
+
|
|
26
|
+
More specifically, the dependency relation expresses that +t2+ must achieve a
|
|
27
|
+
specific thing for +t1+. In Roby, such an achievement is of course defined by a
|
|
28
|
+
set of events.
|
|
29
|
+
|
|
30
|
+
So, in Roby terms, _depends\_on_ specifies that +t2+ should achieve a specific
|
|
31
|
+
thing for +t1+. By default, that achievement is the _success_ of the child task.
|
|
32
|
+
That can be changed through the +:success+ option of _depends\_on_. By default,
|
|
33
|
+
that set is <tt>:success</tt> (i.e. +t1+ requires a successful execution of
|
|
34
|
+
+t2+). As another example, the following
|
|
35
|
+
|
|
36
|
+
{coderay:: ruby}
|
|
37
|
+
t1.depends_on t2, :success => [:updated]
|
|
38
|
+
{coderay}
|
|
39
|
+
|
|
40
|
+
specifies that +t1+ needs +t2+ to emit its _updated_ event at least once. The
|
|
41
|
+
default is obviously equivalent to
|
|
42
|
+
|
|
43
|
+
{coderay:: ruby}
|
|
44
|
+
t1.depends_on t2, :success => [:success]
|
|
45
|
+
{coderay}
|
|
46
|
+
|
|
47
|
+
A different constraint that can be specified is that some events <b>should
|
|
48
|
+
not</b> be emitted. That is specified through the +:failure+ option. For
|
|
49
|
+
instance, if it is required that +t2+ does not stop while +t1+ is running, do
|
|
50
|
+
|
|
51
|
+
{coderay:: ruby}
|
|
52
|
+
t1.depends_on t2, :success => [], :failure => [:stop]
|
|
53
|
+
{coderay}
|
|
54
|
+
|
|
55
|
+
Moreover, it is possible to refine what the parent task actually needs by
|
|
56
|
+
specifying a __fullfilled model__ explicitely. I.e. by adding the :model
|
|
57
|
+
option, one can specifically tell what tasks are acceptable as children in this
|
|
58
|
+
particular relation. This can be used during plan transformations to replace tasks
|
|
59
|
+
by other tasks.
|
|
60
|
+
|
|
61
|
+
For instance:
|
|
62
|
+
|
|
63
|
+
{coderay:: ruby}
|
|
64
|
+
# Tells that t1 needs a task that fullfills the Localization model with the
|
|
65
|
+
# given mode argument. Other arguments are left free.
|
|
66
|
+
t1.depends_on t2, :model => [Localization, :mode => :icp]
|
|
67
|
+
{coderay}
|
|
68
|
+
|
|
69
|
+
Both the :success and :failure options accept [event
|
|
70
|
+
predicates](../advanced_concepts/recognizing_patterns.html#event-predicates) as
|
|
71
|
+
values.
|
|
72
|
+
|
|
73
|
+
__Important__ The dependency relation does not express any assumption on the
|
|
74
|
+
_succcess_ of the parent task, only (1) the conditions in which a child is not
|
|
75
|
+
needed anymore (the success events) and (2) the conditions in which the child
|
|
76
|
+
did not achieve what the parent task required (the failure events and the
|
|
77
|
+
unreachability of the success events). To represent e.g. a relationship between
|
|
78
|
+
the success of a child and the success of a parent, use the forward relation
|
|
79
|
+
{: .warning}
|
|
80
|
+
|
|
81
|
+
Error Conditions
|
|
82
|
+
----------------
|
|
83
|
+
The two types of errors that can occur in the context of a dependency relation
|
|
84
|
+
are:
|
|
85
|
+
|
|
86
|
+
* no success event will ever be emitted
|
|
87
|
+
* one of the failure events is emitted
|
|
88
|
+
|
|
89
|
+
The first condition is reached when the event predicate given for :success is
|
|
90
|
+
(1) static and has a "false" value. When giving simple events, it means that the
|
|
91
|
+
events have never been emitted and are marked [as
|
|
92
|
+
unreachable](../advanced_concepts/unreachability.html). For instance, the
|
|
93
|
+
default parameters of :success => \[:success], :failure => [] both specify that
|
|
94
|
+
:success is a success event __and__ that :stop without :sucess is an error (as,
|
|
95
|
+
once :stop is emitted, :success becomes unreachable)
|
|
96
|
+
|
|
97
|
+
In both cases, a {rdoc_class: ChildFailedError} exception is generated. In the
|
|
98
|
+
first case, the failure point is the event generator that is unreachable. In the
|
|
99
|
+
second case, it is the event that triggered the failure. In both cases, the
|
|
100
|
+
explanation field contains the Roby::EventConstraints::Explanation object that
|
|
101
|
+
explains why the event condition has been triggered.
|
|
102
|
+
|
|
103
|
+
Relationship to Scheduling
|
|
104
|
+
--------------------------
|
|
105
|
+
The planned_by relation has an influence on both [the basic and
|
|
106
|
+
temporal schedulers](../advanced_concepts/scheduling.html).
|
|
107
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ExecutionAgent
|
|
3
|
+
sort_info: 140
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Available as Roby::TaskStructure::ExecutionAgent
|
|
7
|
+
|
|
8
|
+
See {rdoc_class: TaskStructure::ExecutionAgentGraphClass::Extension} for the list
|
|
9
|
+
of methods that are defined on Roby::Task and
|
|
10
|
+
{rdoc_class: TaskStructure::ExecutionAgentGraphClass} for the methods accessible on the relation graph.
|
|
11
|
+
|
|
12
|
+
Semantics
|
|
13
|
+
---------
|
|
14
|
+
Very often, especially in Roby, one will have to start external processes to do
|
|
15
|
+
some computation. In some cases, a single process could even support multiple
|
|
16
|
+
Roby tasks: i.e. it does multiple things at the same time -- for instance in the
|
|
17
|
+
[Rock deployed
|
|
18
|
+
components](http://rock-robotics.org/advanced_tutorials/100_deployments.html), one single
|
|
19
|
+
process can support the execution of multiple components.
|
|
20
|
+
|
|
21
|
+
When using such a pattern, it is important to represent the (very tight)
|
|
22
|
+
relationship between the _executed_ task and the underlying process. This
|
|
23
|
+
is done in Roby through the __ExecutionAgent__ relation.
|
|
24
|
+
|
|
25
|
+
'''How this is different from the Dependency relation''' The big difference
|
|
26
|
+
between a dependency relation and an execution agent relation is how tight the
|
|
27
|
+
relationship is. In the former, the relation is one of two tasks that are
|
|
28
|
+
interacting together, but where the end of one does not have any direct
|
|
29
|
+
implication about the end of the other. In the latter case, if the execution
|
|
30
|
+
agent dies, then the executed task is __already dead__. There is no recovery
|
|
31
|
+
possible.
|
|
32
|
+
|
|
33
|
+
The following event ordering constraints apply when using the execution agent
|
|
34
|
+
relation:
|
|
35
|
+
|
|
36
|
+
* the execution agent must have a _ready_ event. The executed tasks can start
|
|
37
|
+
only once this event has been emitted. This is used to differentiate, at the
|
|
38
|
+
agent level, between having a started agent and an agent that can accept the
|
|
39
|
+
execution of subtasks.
|
|
40
|
+
* the emission of _stop_ on the agent is forwarded to the _aborted_ event of
|
|
41
|
+
all running executed tasks.
|
|
42
|
+
|
|
43
|
+
An execution agent is added on a task using #executed_by
|
|
44
|
+
|
|
45
|
+
{coderay:: ruby}
|
|
46
|
+
executed_task.executed_by(execution_agent)
|
|
47
|
+
{coderay}
|
|
48
|
+
|
|
49
|
+
Automatic Spawning - Execution Agents at the model level
|
|
50
|
+
--------------------------------------------------------
|
|
51
|
+
One can declare execution agents at the level of task models. For instance:
|
|
52
|
+
|
|
53
|
+
{coderay:: ruby}
|
|
54
|
+
class MyTask < Roby::Task
|
|
55
|
+
executed_by MyTaskAgent
|
|
56
|
+
end
|
|
57
|
+
{coderay}
|
|
58
|
+
|
|
59
|
+
It expresses two things:
|
|
60
|
+
|
|
61
|
+
1. the tasks of that type must have an execution agent of the required task
|
|
62
|
+
model
|
|
63
|
+
2. if a task does not have such an agent, the plan manager is allowed, at
|
|
64
|
+
runtime, to create and start one. This is OK for simple cases but should be
|
|
65
|
+
discouraged for complex cases.
|
|
66
|
+
|
|
67
|
+
Additionally, the plan manager could respawn the agent if the :respawn => true
|
|
68
|
+
option is given on the executed_by line.
|
|
69
|
+
|
|
70
|
+
Error Conditions
|
|
71
|
+
----------------
|
|
72
|
+
The ExecutionAgent relation does not imply any plan constraints.
|
|
73
|
+
|
|
74
|
+
Relationship to Scheduling
|
|
75
|
+
--------------------------
|
|
76
|
+
The ExecutionAgent relation has no direct influence on scheduling. It is up to
|
|
77
|
+
the plan building mechanisms to enforce the desired scheduling.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Task Relations
|
|
3
|
+
sort_info: 0
|
|
4
|
+
--- name:content pipeline:tags,markdown,blocks
|
|
5
|
+
|
|
6
|
+
This section is a reference for the task relations. As you should already know
|
|
7
|
+
now, these relations are used to build the plans that are executed by Roby.
|
|
8
|
+
|
|
9
|
+
The objects representing each of these relations are stored in
|
|
10
|
+
Roby::TaskStructure. New relations are defined with Roby::TaskStructure.relation
|
|
11
|
+
(whose documentation is in {rdoc_class: RelationGraph}).
|
|
12
|
+
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Defining new relations
|
|
3
|
+
sort_info: 1000
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This page will detail the mechanisms Roby has to define new relations (tasks or
|
|
7
|
+
events), as well as how relations can be plugged into the overall execution
|
|
8
|
+
system.
|
|
9
|
+
|
|
10
|
+
Relation spaces
|
|
11
|
+
---------------
|
|
12
|
+
|
|
13
|
+
Generally speaking, relations are graphs that allow to link plan objects _of the
|
|
14
|
+
same type_ (i.e. tasks together and/or events together).
|
|
15
|
+
|
|
16
|
+
To ease relation management, relations on one given object are gathered in a
|
|
17
|
+
relation space (instance of {rdoc_class: RelationSpace}). Two relation spaces
|
|
18
|
+
are defined by default:
|
|
19
|
+
|
|
20
|
+
{coderay:: ruby}
|
|
21
|
+
TaskStructure = RelationSpace(Task)
|
|
22
|
+
EventStructure = RelationSpace(EventGenerator)
|
|
23
|
+
{coderay}
|
|
24
|
+
|
|
25
|
+
where {rdoc_class: Task} is the task class and {rdoc_class: EventGenerator} are
|
|
26
|
+
the objects that emit events
|
|
27
|
+
|
|
28
|
+
In the API, EventGenerator is the plan object that has a command and can emit
|
|
29
|
+
events (i.e. the class on which #emit and #call is defined). Event is the
|
|
30
|
+
representation of an emission (i.e. it is created by #emit and stored in
|
|
31
|
+
histories).
|
|
32
|
+
{.block}
|
|
33
|
+
|
|
34
|
+
Defining new relations
|
|
35
|
+
----------------------
|
|
36
|
+
|
|
37
|
+
When you define a relation, you basically declare that a certain type of object
|
|
38
|
+
(the object on which the associated relation space applies) can be part of the
|
|
39
|
+
given relation. Moreover, you add methods on the same object that allow to
|
|
40
|
+
easily inspect the relation graph.
|
|
41
|
+
|
|
42
|
+
A new relation is created with RelationSpace#relation. Its first argument is the
|
|
43
|
+
constant name of the newly created relation, which is added to the associated
|
|
44
|
+
relation space.
|
|
45
|
+
|
|
46
|
+
For instance, to define [the Dependency relation](dependency.html), one does:
|
|
47
|
+
|
|
48
|
+
{coderay:: ruby}
|
|
49
|
+
TaskStructure.relation 'Dependency'
|
|
50
|
+
{coderay}
|
|
51
|
+
|
|
52
|
+
See the documentation of {rdoc_class: RelationSpace}#relation for the various
|
|
53
|
+
parametrization that is possible to do on a relation.
|
|
54
|
+
|
|
55
|
+
Management of information embedded in a relation
|
|
56
|
+
-----------------------------------------------
|
|
57
|
+
|
|
58
|
+
Relations can have embed edge information (it is on by default). This
|
|
59
|
+
information can be an arbitrary Ruby object and allows to describe specific
|
|
60
|
+
edges in the relation. For instance, for the Dependency relation, this object is
|
|
61
|
+
a hash in which various parameters as the child's roles, the set of success
|
|
62
|
+
events and so on are saved.
|
|
63
|
+
If a relation does *not* have the need for additional information, the <tt>:noinfo</tt>
|
|
64
|
+
flag should be set in the relation declaration.
|
|
65
|
+
|
|
66
|
+
Information embedded in this object *must* no directly refer to the parent or
|
|
67
|
+
child, as during execution this parent/child can change (for instance through
|
|
68
|
+
Plan#replace\_task). In the dependency relation, the <tt>success</tt> set is
|
|
69
|
+
defined as event names, not actual EventGenerator objects for this very reason.
|
|
70
|
+
|
|
71
|
+
Finally, for some relation, it can be meaningful to 'merge' these additional
|
|
72
|
+
information objects, i.e. to represent the union of the constraints of what was
|
|
73
|
+
previously two separate relations. This happens in particular in a replacement
|
|
74
|
+
context: a parent task A has two children B and C, but C is used to replace B.
|
|
75
|
+
In the end, the A => C relation must therefore contain the information that was
|
|
76
|
+
embedded in both the A => B and the original A => C relations.
|
|
77
|
+
|
|
78
|
+
Supporting this is done by defining a merge\_info method on the relation object:
|
|
79
|
+
|
|
80
|
+
{coderay:: ruby}
|
|
81
|
+
module TaskStructure
|
|
82
|
+
relation 'Dependency', ... do
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def Dependency.merge_info(old, new)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
{coderay}
|
|
89
|
+
|
|
90
|
+
Plugging into the constraint verification mechanism
|
|
91
|
+
---------------------------------------------------
|
|
92
|
+
|
|
93
|
+
As presented [in the concepts section](../concepts), the execution cycle is split
|
|
94
|
+
into an event propagation phase (where things happen) and a constraint
|
|
95
|
+
verification phase (where things are checked).
|
|
96
|
+
|
|
97
|
+
It is the job of each relation to check that the constraints it represents are
|
|
98
|
+
actually met. Structure checks can be added either on a per-plan basis or on all
|
|
99
|
+
running plans.
|
|
100
|
+
|
|
101
|
+
In practice, adding a structure checking method is done by defining a
|
|
102
|
+
check\_structure method on the relation object:
|
|
103
|
+
|
|
104
|
+
{coderay:: ruby}
|
|
105
|
+
module TaskStructure
|
|
106
|
+
relation 'Dependency', ... do
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def Dependency.check_structure(plan)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
{coderay}
|
|
113
|
+
|
|
114
|
+
This method must return an array of exception objects, that must all be
|
|
115
|
+
subclasses of {rdoc_class: LocalizedError}. On a general level, these exception
|
|
116
|
+
objects must assign the problem to one particular plan object (event, event
|
|
117
|
+
generator or task). This assignation will be used by the error propagation
|
|
118
|
+
mechanism to decide what to do with it.
|
|
119
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: PlannedBy
|
|
3
|
+
sort_info: 120
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Available as Roby::TaskStructure::PlannedBy
|
|
7
|
+
|
|
8
|
+
See {rdoc_class: TaskStructure::PlannedByGraphClass::Extension} for the list
|
|
9
|
+
of methods that are defined on Roby::Task and
|
|
10
|
+
{rdoc_class: TaskStructure::PlannedByGraphClass} for the methods accessible on the
|
|
11
|
+
relation graph.
|
|
12
|
+
|
|
13
|
+
Semantics
|
|
14
|
+
---------
|
|
15
|
+
The planned_by relation expresses that information necessary to execute a task
|
|
16
|
+
(the parent in the relation) is going to be produced by another task (the child in the relation)
|
|
17
|
+
|
|
18
|
+
This relation accepts a certain task to have only a single planning task. A
|
|
19
|
+
given planning task can have multiple planned tasks.
|
|
20
|
+
|
|
21
|
+
The relation is added with #planned_by
|
|
22
|
+
|
|
23
|
+
{coderay:: ruby}
|
|
24
|
+
task.planned_by(planner_task)
|
|
25
|
+
task.planning_task # => planner_task
|
|
26
|
+
planner_task.planned_task # => task. Would raise if there was more than one
|
|
27
|
+
{coderay}
|
|
28
|
+
|
|
29
|
+
This is commonly used to implement the [planning
|
|
30
|
+
pattern](../building/runtime.html#planning-pattern). In this case, the
|
|
31
|
+
planned task is [marked as
|
|
32
|
+
abstract](../building/patterns.html#abstract-tasks)
|
|
33
|
+
|
|
34
|
+
Error Conditions
|
|
35
|
+
----------------
|
|
36
|
+
The planned_by relation fails if (1) the planning task has terminated and (2)
|
|
37
|
+
the planned task is abstract. In other ways, it fails if a task could not be
|
|
38
|
+
planned properly. To avoid having "partial plans" lingering around, planning
|
|
39
|
+
tasks that modify the plan should always do so [in a
|
|
40
|
+
transaction](../advanced_concepts/transactions.html).
|
|
41
|
+
|
|
42
|
+
Relationship to Scheduling
|
|
43
|
+
--------------------------
|
|
44
|
+
The planned_by relation has no influence on [the basic and
|
|
45
|
+
temporal schedulers](../advanced_concepts/scheduling.html).
|
|
46
|
+
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: A First Roby Application
|
|
3
|
+
sort_info: 300
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This page will present another facet of Roby. What we saw until now is how,
|
|
7
|
+
in Roby, one can represent the task actions and build plans that describe the
|
|
8
|
+
task execution. What we will see here is how Roby tie the different models
|
|
9
|
+
together to offer an application environment.
|
|
10
|
+
|
|
11
|
+
Creation
|
|
12
|
+
--------
|
|
13
|
+
|
|
14
|
+
Go into a *regular shell* (i.e. not the Ruby shell) and create a new directory.
|
|
15
|
+
That directory will become your first Roby application by running "roby init":
|
|
16
|
+
|
|
17
|
+
$ mkdir first_app
|
|
18
|
+
$ cd first_app
|
|
19
|
+
$ roby init
|
|
20
|
+
creating README.txt
|
|
21
|
+
creating models/
|
|
22
|
+
creating models/tasks/
|
|
23
|
+
creating models/tasks/.gitattributes
|
|
24
|
+
creating models/actions/
|
|
25
|
+
creating models/actions/main.rb
|
|
26
|
+
creating scripts/
|
|
27
|
+
creating scripts/controllers/
|
|
28
|
+
creating scripts/controllers/.gitattributes
|
|
29
|
+
creating Rakefile
|
|
30
|
+
creating config/
|
|
31
|
+
creating config/init.rb
|
|
32
|
+
creating config/app.yml
|
|
33
|
+
creating data/
|
|
34
|
+
creating data/.gitattributes
|
|
35
|
+
|
|
36
|
+
There's a lot of stuff created, but don't worry we'll learn what this is all
|
|
37
|
+
about later on. Right now, we're only interested in two small parts of it:
|
|
38
|
+
|
|
39
|
+
* the models/tasks/ directory, which is where task models (task classes) should
|
|
40
|
+
be defined
|
|
41
|
+
* the robot's controllers in scripts/controllers/. These files contain the code
|
|
42
|
+
that is run when the application is started.
|
|
43
|
+
|
|
44
|
+
The goForward robot
|
|
45
|
+
-------------------
|
|
46
|
+
As an introduction, we will create a simulated robot controller which makes the
|
|
47
|
+
robot go forward at constant speed.
|
|
48
|
+
|
|
49
|
+
First, let's create the files specific to this robot
|
|
50
|
+
|
|
51
|
+
$ roby add-robot goForward
|
|
52
|
+
creating models/tasks/goForward/
|
|
53
|
+
creating models/tasks/goForward/.gitattributes
|
|
54
|
+
creating models/actions/goForward/
|
|
55
|
+
creating models/actions/goForward/main.rb
|
|
56
|
+
creating scripts/controllers/goForward.rb
|
|
57
|
+
creating config/goForward.rb
|
|
58
|
+
|
|
59
|
+
Let's define the task model. Edit models/tasks/go\_forward.rb and add
|
|
60
|
+
|
|
61
|
+
{coderay:: ruby}
|
|
62
|
+
class GoForward < Roby::Task
|
|
63
|
+
# The GoForward task needs the robot speed to be specified
|
|
64
|
+
argument :speed
|
|
65
|
+
|
|
66
|
+
# Block called at every execution loop if the task is running. It simulates
|
|
67
|
+
# the robot moving at the specified speed.
|
|
68
|
+
poll do
|
|
69
|
+
State.pos.x += speed
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# This task does not need any specific action to stop
|
|
73
|
+
terminates
|
|
74
|
+
end
|
|
75
|
+
{coderay}
|
|
76
|
+
|
|
77
|
+
In the controller file, scripts/controllers/goForward.rb, we add the code that
|
|
78
|
+
should run at startup:
|
|
79
|
+
|
|
80
|
+
{coderay:: ruby}
|
|
81
|
+
# Define the original value of x
|
|
82
|
+
State.pos.x = 0
|
|
83
|
+
|
|
84
|
+
# Block will be called once every one second
|
|
85
|
+
Roby.every(1) do
|
|
86
|
+
puts State.pos.x
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Create the task and start moving !
|
|
90
|
+
Roby.plan.add_mission(go = GoForward.new(:speed => 0.1))
|
|
91
|
+
puts "Going forward at speed #{go.speed}"
|
|
92
|
+
go.start!
|
|
93
|
+
{coderay}
|
|
94
|
+
|
|
95
|
+
You can then start the robot controller, and then stop it with CTRL+C.
|
|
96
|
+
|
|
97
|
+
$ roby run -rgoForward -c
|
|
98
|
+
335705:25:08.324 (goForward) loading controller file /home/doudou/dev/goForward/scripts/controllers/goForward.rb
|
|
99
|
+
Going forward at speed 0.1
|
|
100
|
+
335705:25:08.356 (goForward) done initialization
|
|
101
|
+
0
|
|
102
|
+
0.9
|
|
103
|
+
1.9
|
|
104
|
+
2.9
|
|
105
|
+
335705:25:16.449 (Roby) received interruption request
|
|
106
|
+
335705:25:16.524 (Roby) control quitting. Waiting for 1 tasks to finish (1 tasks still in plan)
|
|
107
|
+
|
|
108
|
+
Broken down explanation
|
|
109
|
+
-----------------------
|
|
110
|
+
* the State object holds all the state data that
|
|
111
|
+
represents the robot's state. In our case, we initialize the robot's position
|
|
112
|
+
in the controller file, and then update it when the robot moves. An equivalent
|
|
113
|
+
singleton exists for configuration, Conf
|
|
114
|
+
|
|
115
|
+
* the poll statement adds a block that should be executed during each execution
|
|
116
|
+
cycle **if the task is running** (see the [concepts](../concepts/execution.html))
|
|
117
|
+
|