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,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Scheduling
|
|
3
|
+
sort_info: 5
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Roby plans are encoding a lot of things. One thing they do not encode in general
|
|
7
|
+
is __exactly__ which tasks should be started at every point in the execution.
|
|
8
|
+
|
|
9
|
+
It would in principle be possible: one could use the signal relation to
|
|
10
|
+
completely define the execution flow. However, this is both not very practical,
|
|
11
|
+
and would break one of the main ideas behind Roby: that one should encode as
|
|
12
|
+
much information as possible to represent the _context_ of running activities,
|
|
13
|
+
and enough constraints to verify that the execution goes well. Based on that
|
|
14
|
+
information, global reasoning can then be used to maintain the system in a "good
|
|
15
|
+
state".
|
|
16
|
+
|
|
17
|
+
In this scheme, the scheduling object is the object that decides which tasks
|
|
18
|
+
should be started in the plan. This page will tell about the two existing
|
|
19
|
+
scheduling objects (the basic and temporal schedulers), and will then talk about
|
|
20
|
+
the generic scheduler interface in Roby.
|
|
21
|
+
|
|
22
|
+
The basic scheduler
|
|
23
|
+
-------------------
|
|
24
|
+
The basic scheduler will start any task that is needed and for which the start
|
|
25
|
+
event has no explicit mean of synchronization. It means that it will start a
|
|
26
|
+
task that:
|
|
27
|
+
|
|
28
|
+
* is either toplevel or has a parent running in [the dependency
|
|
29
|
+
relation](../task_relations/dependency.html) (is needed by a running task).
|
|
30
|
+
* has a start event that is not the target of an edge in either the signal and
|
|
31
|
+
forward relations (won't be started explicitly because of one of these
|
|
32
|
+
relations).
|
|
33
|
+
|
|
34
|
+
The temporal scheduler
|
|
35
|
+
-------------------
|
|
36
|
+
The temporal scheduler adds on top of the basic scheduler the ability to specify
|
|
37
|
+
temporal constraints between any event and the task's start event. Moreover, it
|
|
38
|
+
allows to tie the ability to schedule a task to the ability to schedule another.
|
|
39
|
+
|
|
40
|
+
More specifically, the temporal scheduler will start a task if:
|
|
41
|
+
|
|
42
|
+
* it is either toplevel or has a parent running in [the dependency
|
|
43
|
+
relation](../task_relations/dependency.html) (is needed by a running task).
|
|
44
|
+
This is so unless there is a temporal constraint between the child and the
|
|
45
|
+
parent (in which case the child will be started before its parent).
|
|
46
|
+
* has a start event that is not the target of an edge in either the signal and
|
|
47
|
+
forward relations (won't be started explicitly because of one of these
|
|
48
|
+
relations).
|
|
49
|
+
* emitting the start event would not violate [temporal
|
|
50
|
+
constraints](../event_relations/temporal_constraints.html)
|
|
51
|
+
* if child in the [scheduling constraint
|
|
52
|
+
relation](../event_relations/scheduling_constraints.html), the parent has to
|
|
53
|
+
be schedulable.
|
|
54
|
+
|
|
55
|
+
A simple example of the usage of temporal constraints is to specify a sequence:
|
|
56
|
+
|
|
57
|
+
~~~ ruby
|
|
58
|
+
t2.should_start_after t1
|
|
59
|
+
~~~
|
|
60
|
+
|
|
61
|
+
__How is this different from using the signal relation ?__ A sequence of tasks
|
|
62
|
+
T1 and T2 for which there is a signal between T1.stop_event and t2.start_event
|
|
63
|
+
means "t2.start MUST be called JUST AFTER t1.stop has been emitted". Adding a
|
|
64
|
+
temporal constraint means that t2.start MAY be called as long as t1.stop has
|
|
65
|
+
been emitted. The scheduler can decide to call it anytime after.
|
|
66
|
+
{: .block}
|
|
67
|
+
|
|
68
|
+
A simple example of the usage of both temporal constraints and scheduling
|
|
69
|
+
constraints is to add a plan pattern to a sequence, requiring that the planner
|
|
70
|
+
should only run when the task should be started (and not before).
|
|
71
|
+
|
|
72
|
+
~~~ ruby
|
|
73
|
+
t2.should_start_after t1
|
|
74
|
+
t2.should_start_after t2.planning_task
|
|
75
|
+
t2.planning_task.schedule_as(t2)
|
|
76
|
+
~~~
|
|
77
|
+
|
|
78
|
+
Choosing the scheduler
|
|
79
|
+
----------------------
|
|
80
|
+
The scheduler is in general chosen globally by setting Roby.scheduler. For
|
|
81
|
+
instance:
|
|
82
|
+
|
|
83
|
+
~~~ ruby
|
|
84
|
+
require 'roby/schedulers/temporal'
|
|
85
|
+
Roby.scheduler = Roby::Schedulers::Temporal.new
|
|
86
|
+
~~~
|
|
87
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Event Unreachability
|
|
3
|
+
sort_info: 10
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
What we saw about events, so far, is the ability to listen to their emission
|
|
7
|
+
(event handlers) and to trigger this emission (event commands).
|
|
8
|
+
|
|
9
|
+
Now, let's think a pretty common situation: something is waiting for event A to
|
|
10
|
+
be emitted. In other words, the follow-up execution of the system depends on
|
|
11
|
+
having an event be emitted. But, for whatever reason, this event is __not__
|
|
12
|
+
going to happen.
|
|
13
|
+
|
|
14
|
+
This is covered by another event-related triggering mechanism: the event
|
|
15
|
+
unreachability. An event generator is marked as unreachable when it is known
|
|
16
|
+
that it cannot be emitted anymore.
|
|
17
|
+
|
|
18
|
+
By default, this happens for all the generators of a task when the task
|
|
19
|
+
finishes. Other conditions can apply (it can even be done by the tasks
|
|
20
|
+
themselves to provide more information to the rest of the system).
|
|
21
|
+
|
|
22
|
+
A generator is declared as unreachable by calling unreachable! on it:
|
|
23
|
+
|
|
24
|
+
{coderay:: ruby}
|
|
25
|
+
task.success_event.unreachable!
|
|
26
|
+
{coderay}
|
|
27
|
+
|
|
28
|
+
The fact that event becomes unreachable can be listened to with
|
|
29
|
+
EventGenerator#when_unreachable
|
|
30
|
+
|
|
31
|
+
{coderay:: ruby}
|
|
32
|
+
task.success_event.when_unreachable do |reason|
|
|
33
|
+
end
|
|
34
|
+
{coderay}
|
|
35
|
+
|
|
36
|
+
Additionally, one can use #when_unreachable without a block. Then, an event
|
|
37
|
+
generator is returned that is emitted when the event becomes unreachable.
|
|
38
|
+
|
|
39
|
+
A reason can be given, which is then stored in the #unreachability_reason
|
|
40
|
+
attribute of the generator. The reason can be any object but is traditionally
|
|
41
|
+
either an instance of Roby::Event or an instance of Exception.
|
|
42
|
+
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
template: ~
|
|
3
|
+
--- pipeline:erb,tags,blocks,head
|
|
4
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
|
6
|
+
|
|
7
|
+
<!-- Recommended XHTML-Editor: HTML-Kit 292 (Freeware) -->
|
|
8
|
+
<!-- http://www.chami.com/html-kit/download/ -->
|
|
9
|
+
|
|
10
|
+
<head>
|
|
11
|
+
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
|
12
|
+
<meta name="description" content="The Robot Construction Kit - a robot software development environment" />
|
|
13
|
+
<meta name="keywords" content="robotics,toolchain,components,field robotics,underwater robotics" />
|
|
14
|
+
<meta name="author" content="The Rock core team" />
|
|
15
|
+
<meta name="google-site-verification" content="xipSGJiBKGluvNX8Y3Wr4zVMDSDJz5HIutUhfQSmXl8" />
|
|
16
|
+
<!-- <link rel="stylesheet" type="text/css" media="screen,projection" href="" />-->
|
|
17
|
+
<!-- <link rel="stylesheet" type="text/css" media="print" href="css/style_print.css" />-->
|
|
18
|
+
<title>Roby - Plan Management for Robotic Systems</title>
|
|
19
|
+
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
|
|
20
|
+
</head>
|
|
21
|
+
|
|
22
|
+
<body>
|
|
23
|
+
<div class="page-container-2">
|
|
24
|
+
<div class="nav1-container">
|
|
25
|
+
<div class="nav1">
|
|
26
|
+
<webgen:block name="navbar" notfound="ignore"/>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div class="site-name" onclick="location.href='{relocatable: /}';" style="cursor: pointer; z-index: 10;">
|
|
31
|
+
<p class="title">Roby</p>
|
|
32
|
+
<p class="subtitle">Plan Management for Robotic Systems</p>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<div class="title_buffer"></div>
|
|
36
|
+
|
|
37
|
+
<div class="nav2">
|
|
38
|
+
<ul>
|
|
39
|
+
<li>{breadcrumb_trail: { separator: '' }}<span class="empty"> </span></li>
|
|
40
|
+
</ul>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div class="buffer"></div>
|
|
44
|
+
|
|
45
|
+
<div class="leftnav">
|
|
46
|
+
<webgen:block name="leftbar" notfound="ignore"/>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
<div class="content2" <%= 'style="margin-left: 110px;"' if context.node.meta_info['rock_page_style'] == 'centered' %>>
|
|
51
|
+
<% if context.node.node_info[:page].meta_info.has_key?('page_title') %>
|
|
52
|
+
<div class="content2-pagetitle"><%= context.node.node_info[:page].meta_info['page_title'] %></div>
|
|
53
|
+
<% else %>
|
|
54
|
+
<div class="content2-pagetitle">{title: }</div>
|
|
55
|
+
<% end %>
|
|
56
|
+
<div class="content2-container line-box">
|
|
57
|
+
<div class="content2-container-1col">
|
|
58
|
+
<% if false %>
|
|
59
|
+
<% if context.node.node_info[:page].blocks.has_key?('localtoc') %>
|
|
60
|
+
<div markdown="1" class="localtoc">
|
|
61
|
+
<webgen:block name="localtoc" />
|
|
62
|
+
</div>
|
|
63
|
+
<% end %>
|
|
64
|
+
<% if context.node.node_info[:page].blocks.has_key?('biglocaltoc') %>
|
|
65
|
+
<div markdown="1" class="biglocaltoc localtoc">
|
|
66
|
+
<webgen:block name="biglocaltoc" />
|
|
67
|
+
</div>
|
|
68
|
+
<% end %>
|
|
69
|
+
<% end %>
|
|
70
|
+
<% if flavors = context.node.node_info[:page].meta_info['only_on'] %>
|
|
71
|
+
<div class="warning">
|
|
72
|
+
The information present on this page is only valid on the <b><%= flavors %></b> flavors of Rock
|
|
73
|
+
</div>
|
|
74
|
+
<% end %>
|
|
75
|
+
<%= context.node.node_info[:page].meta_info['page_title'] %>
|
|
76
|
+
<webgen:block name="content" />
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<!-- FOOTER -->
|
|
82
|
+
<div class="footer">
|
|
83
|
+
<div class="nav1">
|
|
84
|
+
<ul>
|
|
85
|
+
<li><a href="http://rock-robotics.org/stable/documentation/about/index.html">About Rock</a></li>
|
|
86
|
+
</ul>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
</body>
|
|
91
|
+
</html>
|
|
92
|
+
|
|
93
|
+
<!--
|
|
94
|
+
vim:set ts=2:
|
|
95
|
+
-->
|
|
96
|
+
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
Code examples
|
|
2
2
|
-------------
|
|
3
3
|
This page includes code samples that you can try out in Ruby or Unix shells. See
|
|
4
|
-
[this page](code_examples.html) for explanations on the notation.
|
|
5
|
-
{.warning}
|
|
4
|
+
[this page]({relocatable: /tutorial/code_examples.html}) for explanations on the notation.
|
|
5
|
+
{: .warning}
|
|
6
6
|
|
|
7
7
|
Moreover, to run the examples on this page, you must first set up your ruby
|
|
8
8
|
shell:
|
|
9
9
|
|
|
10
|
-
$ irb
|
|
10
|
+
$ irb -rroby/standalone
|
|
11
|
+
|
|
11
12
|
{coderay:: ruby}
|
|
12
|
-
|
|
13
|
-
>> include Roby
|
|
14
|
-
>> plan = Roby.plan
|
|
13
|
+
>> plan = Roby.plan
|
|
15
14
|
{coderay}
|
|
16
|
-
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Action Coordination
|
|
3
|
+
sort_info: 210
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This page will present the high-level means of coordinating different actions to
|
|
7
|
+
create a high-level system behaviour (i.e. "a mission").
|
|
8
|
+
|
|
9
|
+
Action State Machines
|
|
10
|
+
---------------------
|
|
11
|
+
The easiest way to create an action is to define a state machine that calls
|
|
12
|
+
other actions and/or some Roby tasks.
|
|
13
|
+
|
|
14
|
+
~~~ ruby
|
|
15
|
+
class Main
|
|
16
|
+
describe("move").
|
|
17
|
+
required_arg('speed', 'the speed it should move at in m/s').
|
|
18
|
+
optional_arg('time', 'how long it should move in seconds')
|
|
19
|
+
action_state_machine 'move' do
|
|
20
|
+
... state machine definition ...
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
~~~
|
|
24
|
+
|
|
25
|
+
The string argument to #action_state_machine being the action name. At runtime, the
|
|
26
|
+
state machine will be represented by a toplevel task of the type given in the
|
|
27
|
+
description, or if none is given by the automatically created task type
|
|
28
|
+
mentioned earlier (here: Main::Move).
|
|
29
|
+
|
|
30
|
+
Within the state machine, states are represented by __single Roby tasks__. These
|
|
31
|
+
tasks are generated by calling #state with an argument which is either
|
|
32
|
+
another action or a Roby task model, and some arguments. Note that the same
|
|
33
|
+
action can be used to define multiple states (even with the same arguments).
|
|
34
|
+
The starting state is defined with the start(state) statement and transitions
|
|
35
|
+
with transition(event, next_state).
|
|
36
|
+
|
|
37
|
+
~~~ ruby
|
|
38
|
+
state_machine 'move' do
|
|
39
|
+
# Call other actions to get our states
|
|
40
|
+
planning = state path_planning(:target => [10, 10, 0])
|
|
41
|
+
execution = state path_execution
|
|
42
|
+
|
|
43
|
+
start(planning)
|
|
44
|
+
transition(planning.success_event, execution)
|
|
45
|
+
end
|
|
46
|
+
~~~
|
|
47
|
+
|
|
48
|
+
Defining a state from an action or task model basically tells Roby to start such
|
|
49
|
+
an action / task each time the state is entered. Moreover, if the task that
|
|
50
|
+
represents the current state terminates through an event for which no
|
|
51
|
+
transitions is defined, this is going to generate a [dependency
|
|
52
|
+
error](../task_relations/dependency.html) (ChildFailedError)
|
|
53
|
+
|
|
54
|
+
If the action has arguments, they can be referred to as local variables:
|
|
55
|
+
|
|
56
|
+
~~~ ruby
|
|
57
|
+
describe("move to a given target point").
|
|
58
|
+
required_arg('target', 'the speed it should move at in m/s')
|
|
59
|
+
state_machine 'move' do
|
|
60
|
+
planning = state path_planning(:target => target)
|
|
61
|
+
execution = state path_execution
|
|
62
|
+
|
|
63
|
+
start(planning)
|
|
64
|
+
transition(planning.success_event, execution)
|
|
65
|
+
end
|
|
66
|
+
~~~
|
|
67
|
+
|
|
68
|
+
Finally, one needs to tell the system when the toplevel task is terminated. This
|
|
69
|
+
is done, as usual in Roby, by [forwarding](../event_relations/forward.html) a
|
|
70
|
+
state event to a terminal event on the toplevel task:
|
|
71
|
+
|
|
72
|
+
~~~ ruby
|
|
73
|
+
describe("move to a given target point").
|
|
74
|
+
required_arg('target', 'the speed it should move at in m/s')
|
|
75
|
+
state_machine 'move_to' do
|
|
76
|
+
planning = state path_planning(:target => target)
|
|
77
|
+
execution = state path_execution
|
|
78
|
+
|
|
79
|
+
start(path_planning)
|
|
80
|
+
transition(path_planning.success_event, path_execution)
|
|
81
|
+
forward path_execution.reached_the_end_event, success_event
|
|
82
|
+
end
|
|
83
|
+
~~~
|
|
84
|
+
|
|
85
|
+
As an example, a retry-until-it-works action can be specified with:
|
|
86
|
+
|
|
87
|
+
~~~ ruby
|
|
88
|
+
state_machine 'wait_until_it_works' do
|
|
89
|
+
act = state my_action
|
|
90
|
+
start(act)
|
|
91
|
+
transition(act.failed_event, act)
|
|
92
|
+
forward act.success_event, success_event
|
|
93
|
+
end
|
|
94
|
+
~~~
|
|
95
|
+
|
|
96
|
+
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Actions
|
|
3
|
+
sort_info: 200
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
As explained in [the introduction of this section](index.html), the action
|
|
7
|
+
interface presented on this page has two roles:
|
|
8
|
+
|
|
9
|
+
- to define actual behaviours, that can run on the robot, by coordinating sets
|
|
10
|
+
of smaller behaviours
|
|
11
|
+
- to present this set of behaviours to the rest of the Roby application as well
|
|
12
|
+
as to outside (for instance to a user or to an automated planner). This
|
|
13
|
+
aspect of the usage of the action interfaces is covered in [another
|
|
14
|
+
section](../interacting)
|
|
15
|
+
|
|
16
|
+
This section will describe the capabilities of this interface to __build
|
|
17
|
+
plans__. Modifying running plans is a bit of a harder problem, so we keep it
|
|
18
|
+
for a different time.
|
|
19
|
+
|
|
20
|
+
In general, an action interface is defined by creating a subclass of
|
|
21
|
+
{rdoc_class: Roby::Actions::Interface}. Action interfaces are defined in
|
|
22
|
+
a file in the models/actions/ subfolder of the Roby application. The file name is usually
|
|
23
|
+
the snake_case version of the class name, as e.g. my_actions.rb for the MyAction
|
|
24
|
+
class:
|
|
25
|
+
|
|
26
|
+
~~~ ruby
|
|
27
|
+
class MyAction < Roby::Actions::Interface
|
|
28
|
+
end
|
|
29
|
+
~~~
|
|
30
|
+
|
|
31
|
+
Roby expects an action interface class called Main to exist per Roby
|
|
32
|
+
application, and registers it automatically. The Roby app template creates such
|
|
33
|
+
a class in models/actions/main.rb (or model/actions/myrobot/main.rb for
|
|
34
|
+
per-robot action interfaces). There is generally no point of defining another
|
|
35
|
+
one. To foster reuse of action definitions, one creates an action library:
|
|
36
|
+
|
|
37
|
+
~~~ ruby
|
|
38
|
+
module MyApp
|
|
39
|
+
module Movements
|
|
40
|
+
action_library
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
~~~
|
|
44
|
+
|
|
45
|
+
Action libraries accept the same statements than the action interfaces, but can
|
|
46
|
+
be added to action interfaces (or other action libraries):
|
|
47
|
+
|
|
48
|
+
~~~ ruby
|
|
49
|
+
class Main < Roby::Actions::Interface
|
|
50
|
+
use_library MyApp::Movements
|
|
51
|
+
end
|
|
52
|
+
~~~
|
|
53
|
+
|
|
54
|
+
Defining actions
|
|
55
|
+
----------------
|
|
56
|
+
Generally speaking, an __action__ is simply "something" that returns a Roby
|
|
57
|
+
task. It is up to the action to create all the tasks required for the
|
|
58
|
+
behaviour, bind them together using Roby's plan building API and return the
|
|
59
|
+
toplevel task that will represent the action.
|
|
60
|
+
|
|
61
|
+
This page will not dwelve too much into how to do this. Higher-level
|
|
62
|
+
representations allow to define actions without having to dwelve too much into
|
|
63
|
+
Roby's plan model and plan building API.
|
|
64
|
+
|
|
65
|
+
In any case, an action definition always start with an action _description_.
|
|
66
|
+
This is done by calling the "describe" statement in the context of the action
|
|
67
|
+
interface class or action library module and then chaining description calls on
|
|
68
|
+
the returned object (which is of type {rdoc_class: Actions::ActionModel}).
|
|
69
|
+
|
|
70
|
+
~~~ ruby
|
|
71
|
+
class Main
|
|
72
|
+
describe("move").
|
|
73
|
+
required_arg('speed', 'the speed it should move at in m/s').
|
|
74
|
+
optional_arg('time', 'how long it should move in seconds').
|
|
75
|
+
returns(MoveTo)
|
|
76
|
+
... define the actual action ...
|
|
77
|
+
end
|
|
78
|
+
~~~
|
|
79
|
+
|
|
80
|
+
The way the action name is retrieved depends on the action type. We will
|
|
81
|
+
describe each action type later in this page and talk about this.
|
|
82
|
+
|
|
83
|
+
One very important attribute is the 'returns' statement. It defines the type of
|
|
84
|
+
task this action is going to return. If it is not provided, one is created by
|
|
85
|
+
the action interface using the action's name but CamelCased. I.e. a move_to
|
|
86
|
+
action would return, by default, a MoveTo task type that is defined in the
|
|
87
|
+
action's namespace (e.g. Main::MoveTo)
|
|
88
|
+
|
|
89
|
+
Raw Interface
|
|
90
|
+
-------------
|
|
91
|
+
"Raw" actions are the one that are building Roby plans using Roby's plan
|
|
92
|
+
building interface. They are defined as plain methods on the action interface
|
|
93
|
+
class or the action library module. The action name is the name of the method.
|
|
94
|
+
This interface requires a deep understanding of the Roby plan model.
|
|
95
|
+
Higher-level coordination models (presented [on the next
|
|
96
|
+
page](action_coordination.html)) are most often than not enough.
|
|
97
|
+
|
|
98
|
+
If the action description specifies arguments, then the method must accept to be
|
|
99
|
+
called with an argument of type Hash that is going to get the arguments. If it
|
|
100
|
+
accepts only optional arguments, it is best practice to make that argument
|
|
101
|
+
optional.
|
|
102
|
+
|
|
103
|
+
__Important__ only methods that are directly preceded by a #describe block are
|
|
104
|
+
turned into actions. You can freely add "helper" methods to the interface.
|
|
105
|
+
{: .block}
|
|
106
|
+
|
|
107
|
+
~~~ ruby
|
|
108
|
+
class Main
|
|
109
|
+
describe("move").
|
|
110
|
+
required_arg('speed', 'the speed it should move at in m/s').
|
|
111
|
+
optional_arg('time', 'how long it should move in seconds')
|
|
112
|
+
def move_to(arguments)
|
|
113
|
+
Main::MoveTo.new(:speed => arguments[:speed], :time => arguments[:time])
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
~~~
|
|
117
|
+
|
|
118
|
+
One can always call another action from within a raw action method to integrate
|
|
119
|
+
the toplevel task of that action. However, you should really see the returned
|
|
120
|
+
value as an interface (as it should) and never assume anything about the
|
|
121
|
+
subtasks of the returned task. In particular, some actions will return you a
|
|
122
|
+
[planning pattern](runtime.html#planning-pattern) which, at the time the action
|
|
123
|
+
is called, will have no children.
|
|
124
|
+
|