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,192 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Executing code
|
|
3
|
+
sort_info: 125
|
|
4
|
+
---
|
|
5
|
+
Roby allows you to mix model-based descriptions (the tasks, the plan, ...) with
|
|
6
|
+
model-free code.
|
|
7
|
+
|
|
8
|
+
The first forms an __explicit__ representation of the system's activity, on which other
|
|
9
|
+
tools can reason. That's the interest: one can reason on it, and -- for instance
|
|
10
|
+
-- detect problems before they actually appear, or provide information about the
|
|
11
|
+
future to other systems, or ...
|
|
12
|
+
|
|
13
|
+
The second allows to iron out the "gory details". While model-oriented
|
|
14
|
+
development is all nice on the paper, real systems are usually not "sticking" to
|
|
15
|
+
the model willingly. This aspect of Roby allows to adapt the model to the real
|
|
16
|
+
thing.
|
|
17
|
+
|
|
18
|
+
This page will cover how you can have some code executed at runtime, and in
|
|
19
|
+
which conditions
|
|
20
|
+
|
|
21
|
+
Event commands and event handlers
|
|
22
|
+
---------------------------------
|
|
23
|
+
These have already been described (see [here](tasks.html) and
|
|
24
|
+
[there](events.html)).
|
|
25
|
+
|
|
26
|
+
Executing an event command through a subtask (or subplan)
|
|
27
|
+
---------------------------------------------------------
|
|
28
|
+
It is, sometimes, desired that the command of an event is realized by a task
|
|
29
|
+
itself, instead of simply using a code block.
|
|
30
|
+
|
|
31
|
+
At execution time, this can be done with
|
|
32
|
+
|
|
33
|
+
{coderay:: ruby}
|
|
34
|
+
event.achieve_with(task)
|
|
35
|
+
{coderay}
|
|
36
|
+
|
|
37
|
+
The corresponding task will be started, and the event is going to be emitted as
|
|
38
|
+
soon as the task's success event is emitted. The task can, obviously, be the
|
|
39
|
+
root task of a complete Roby subplan.
|
|
40
|
+
|
|
41
|
+
Polling handlers
|
|
42
|
+
----------------
|
|
43
|
+
Poll handlers are code blocks attached to tasks. These code blocks are executed
|
|
44
|
+
__if the task is running__ at each of the system's execution cycle (by default,
|
|
45
|
+
it means once every 100ms).
|
|
46
|
+
|
|
47
|
+
A single polling block can be defined on task models:
|
|
48
|
+
|
|
49
|
+
{coderay:: ruby}
|
|
50
|
+
class MyTask < Roby::Task
|
|
51
|
+
poll do
|
|
52
|
+
# Code executed if any instance of class MyTask
|
|
53
|
+
# is running
|
|
54
|
+
#
|
|
55
|
+
# In here, +self+ refers to the task instance
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
{coderay}
|
|
59
|
+
|
|
60
|
+
It can also be attached to a task instance with
|
|
61
|
+
|
|
62
|
+
{coderay:: ruby}
|
|
63
|
+
task = MyTask.new
|
|
64
|
+
task.poll do
|
|
65
|
+
# Code executed if +task+ is running
|
|
66
|
+
# In here, +self+ refers to the caller object (i.e. the object that added the
|
|
67
|
+
# poll block). Use +task+ to refer to the task instance
|
|
68
|
+
end
|
|
69
|
+
{coderay}
|
|
70
|
+
|
|
71
|
+
While there can be only one class-level polling block, there can be more than
|
|
72
|
+
one instance-level polling blocks.
|
|
73
|
+
|
|
74
|
+
State machines
|
|
75
|
+
--------------
|
|
76
|
+
Users can detail a Roby task using a state machine concept. The interface described in the following
|
|
77
|
+
embeds the [state_machine gem](http://github.com/pluginaweek/state_machine).
|
|
78
|
+
When defining a Roby task the user can inject substates to the 'running' state. The initial state is 'running' by default.
|
|
79
|
+
|
|
80
|
+
With each state a poll block can be associated. This block is repeatedly called, as long as the task remain in the corresponding state.
|
|
81
|
+
{coderay:: ruby}
|
|
82
|
+
class MyTask < Roby::Task
|
|
83
|
+
..
|
|
84
|
+
refine_running_state do
|
|
85
|
+
state :running do
|
|
86
|
+
def poll(task)
|
|
87
|
+
# check for success condition and then
|
|
88
|
+
emit :success
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
event :pause do
|
|
93
|
+
transition [:running] => :paused
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
event :resume do
|
|
97
|
+
transition [:paused] => :running
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# In this simple example, 'pause' causes the task to sleep 4 second
|
|
101
|
+
# and then resumes
|
|
102
|
+
def :paused do
|
|
103
|
+
def poll(task)
|
|
104
|
+
sleep 4
|
|
105
|
+
task.emit :resume
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
on :pause do |ev|
|
|
111
|
+
# stop running actions
|
|
112
|
+
end
|
|
113
|
+
....
|
|
114
|
+
end
|
|
115
|
+
{coderay}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
Events which are defined in the 'refine_running_state' are transparently converted to roby events. This allows you to apply the usual syntax to include event actions or to emit events.
|
|
119
|
+
{coderay:: ruby}
|
|
120
|
+
on(:yourevent) do |ev|
|
|
121
|
+
# The event context will be a instance of StateMachine::Event
|
|
122
|
+
end
|
|
123
|
+
{coderay}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
Due to the current implementation you are required to call 'emit' on the task object within the poll block.
|
|
127
|
+
{: .warning}
|
|
128
|
+
|
|
129
|
+
In order to define your statemachine behaviour you have to specify when to transition from one state to another (as a reaction to an event). These transitions should be specified in the event definition (alternatively in the event handler). See [state_machine documentation](https://github.com/pluginaweek/state_machine) for an detailed example on the syntax which can be used. A simple example is given in the following:
|
|
130
|
+
|
|
131
|
+
{coderay:: ruby}
|
|
132
|
+
event :repair do
|
|
133
|
+
# First transition which matches the current state applies
|
|
134
|
+
transition [:exception, :fatal] => :running
|
|
135
|
+
transition [:running] => :halted
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
event :halt do
|
|
139
|
+
transition all => :halted
|
|
140
|
+
end
|
|
141
|
+
{coderay}
|
|
142
|
+
|
|
143
|
+
The current state of a task can be retrieved (as usual), however the list of states will be extended given the newly introduced substates of running:
|
|
144
|
+
{coderay:: ruby}
|
|
145
|
+
mytask = MyTask.new
|
|
146
|
+
if mytask.current_state? == :paused
|
|
147
|
+
...
|
|
148
|
+
end
|
|
149
|
+
{coderay}
|
|
150
|
+
|
|
151
|
+
A statemachine transition will be only executed if it is a valid transition, otherwise an InvalidTransition error is raised.
|
|
152
|
+
{: .note}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
Scripts
|
|
158
|
+
-------
|
|
159
|
+
Scripts offer a more script-like (i.e. step-by-step) representation of code
|
|
160
|
+
blocks, in ways that can interact with other. For instance:
|
|
161
|
+
|
|
162
|
+
{coderay:: ruby}
|
|
163
|
+
task = MyTask.new
|
|
164
|
+
task.script do
|
|
165
|
+
# Redirect log messages to the logger on Robot
|
|
166
|
+
setup_logger(Robot)
|
|
167
|
+
# Wait for the ready event of the task's localization child to
|
|
168
|
+
# be emitted. It returns immediately if the event has been
|
|
169
|
+
# emitted in the past
|
|
170
|
+
wait_any(localization_child.ready_event)
|
|
171
|
+
# Send a log message
|
|
172
|
+
info "localization ready, starting to move"
|
|
173
|
+
# Start the movement task
|
|
174
|
+
poll_until(movement_child.start_event) do
|
|
175
|
+
movement_child.start!
|
|
176
|
+
end
|
|
177
|
+
# Wait for the target position to be reached
|
|
178
|
+
poll do
|
|
179
|
+
if State.position.x > 10
|
|
180
|
+
transition! # exit from the poll loop
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
# Emit success
|
|
184
|
+
execute do
|
|
185
|
+
task.success!
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
{coderay}
|
|
189
|
+
|
|
190
|
+
The commands available in scripts are detailed [in the API
|
|
191
|
+
documentation](../../api/Roby/TaskScripting/Script)
|
|
192
|
+
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Events
|
|
3
|
-
sort_info:
|
|
4
|
-
---
|
|
3
|
+
sort_info: 75
|
|
4
|
+
---
|
|
5
5
|
|
|
6
6
|
This page will present the basic tools that allow to define and manipulate
|
|
7
|
-
events. In
|
|
8
|
-
{:link_text: the overview of plan objects}}}, we saw that
|
|
7
|
+
events. In , we saw that
|
|
9
8
|
events are two sided objects: one the one hand, they represent the
|
|
10
9
|
situations the system is in (event _emission_). On the other hand, they
|
|
11
10
|
represent the commands that the system accepts (event _commands_).
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: Plan representation and modifications to plans
|
|
3
|
+
sort_info: 200
|
|
4
|
+
---
|
|
2
5
|
|
|
3
6
|
Understanding the plan model, and how to modify it, is central to the use of
|
|
4
7
|
Roby. In effect, the plan *is* the information on which the controller bases
|
|
@@ -45,12 +48,11 @@ Modifying the plan therefore boils down to two things:
|
|
|
45
48
|
or between events).
|
|
46
49
|
|
|
47
50
|
The first point is done by the following methods:
|
|
48
|
-
* Roby::Plan#
|
|
51
|
+
* Roby::Plan#add: simply add tasks and events
|
|
49
52
|
* Roby::Plan#add_mission: adds special tasks, called missions. Missions are the
|
|
50
53
|
tasks the robot is supposed to execute. They are not subject to the plan's
|
|
51
54
|
garbage collection, and the tasks that are useful to them are not either.
|
|
52
55
|
|
|
53
|
-
|
|
54
56
|
To ease the plan management process, some synthetic
|
|
55
57
|
operations are defined on Roby::Plan:
|
|
56
58
|
* the _replacement_ operation: Roby::Plan#replace_task and
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Overview of Plan Objects
|
|
3
3
|
sort_info: 50
|
|
4
|
-
---
|
|
4
|
+
---
|
|
5
|
+
|
|
5
6
|
There are two basic objects in Roby plans, both objects being equally important.
|
|
6
7
|
* *events*. They are both the basic command interface and the way to follow what
|
|
7
8
|
happens in and outside of the robot.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Tasks
|
|
3
|
-
sort_info:
|
|
4
|
-
---
|
|
3
|
+
sort_info: 100
|
|
4
|
+
---
|
|
5
5
|
{include_file: {filename: src/basics_shell_header.txt, escape_html: false}}
|
|
6
6
|
|
|
7
7
|
Definition of Tasks
|
|
@@ -57,15 +57,12 @@ instanciated_:
|
|
|
57
57
|
=> false
|
|
58
58
|
{coderay}
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
Arguments can have default values. In this case, the argument's value is set
|
|
61
|
+
automatically when the task is started. The default argument can be nil.
|
|
62
|
+
|
|
62
63
|
{coderay:: ruby}
|
|
63
64
|
>> class MoveTo
|
|
64
|
-
?> argument :max_speed
|
|
65
|
-
?> def initialize(arguments)
|
|
66
|
-
?> arguments[:max_speed] ||= 1
|
|
67
|
-
?> super(arguments)
|
|
68
|
-
?> end
|
|
65
|
+
?> argument :max_speed, :default => 1
|
|
69
66
|
?> end
|
|
70
67
|
>> task = MoveTo.new(:x => 10, :y => 20)
|
|
71
68
|
>> task.max_speed
|
|
@@ -100,26 +97,29 @@ my\_task.rb file.
|
|
|
100
97
|
puts "start event called"
|
|
101
98
|
emit :start
|
|
102
99
|
end
|
|
103
|
-
event :controlable do
|
|
100
|
+
event :controlable do |ev|
|
|
104
101
|
puts "controlable event called"
|
|
105
102
|
emit :controlable
|
|
106
103
|
end
|
|
107
104
|
event :contingent
|
|
108
105
|
|
|
109
|
-
on(:start) { puts "start event emitted" }
|
|
110
|
-
on(:controlable) { puts "controlable event emitted" }
|
|
111
|
-
on(:contingent) { puts "contingent event emitted" }
|
|
112
|
-
on(:failed) { puts "failed event emitted" }
|
|
113
|
-
on(:stop) { puts "stop event emitted" }
|
|
114
|
-
|
|
115
|
-
event :finished
|
|
116
|
-
|
|
106
|
+
on(:start) { |ev| puts "start event emitted" }
|
|
107
|
+
on(:controlable) { |ev| puts "controlable event emitted" }
|
|
108
|
+
on(:contingent) { |ev| puts "contingent event emitted" }
|
|
109
|
+
on(:failed) { |ev| puts "failed event emitted" }
|
|
110
|
+
on(:stop) { |ev| puts "stop event emitted" }
|
|
111
|
+
|
|
112
|
+
event :finished
|
|
113
|
+
forward :finished => :success
|
|
114
|
+
on(:finished) { |ev| puts "finished event emitted" }
|
|
117
115
|
end
|
|
118
116
|
{coderay}
|
|
119
117
|
|
|
120
118
|
Finally, an event can be *terminal*: its emission means the end of the task's
|
|
121
|
-
execution. __failed__ and __success__ are examples of terminal events.
|
|
122
|
-
terminal
|
|
119
|
+
execution. __failed__ and __success__ are examples of terminal events. Events
|
|
120
|
+
can be declared terminal explicitely by adding :terminal => true to the event
|
|
121
|
+
declaration (see below) or by forwarding the event to another terminal event (as
|
|
122
|
+
for :finished above).
|
|
123
123
|
|
|
124
124
|
Now, read that code into the ruby shell with
|
|
125
125
|
{coderay:: ruby}
|
data/doc/guide/config.yaml
CHANGED
|
@@ -15,13 +15,11 @@
|
|
|
15
15
|
# The available configuration options can be listed using the `webgen config`
|
|
16
16
|
# command, for example: `webgen config sourcehandler` will list all options starting
|
|
17
17
|
# with sourcehandler.
|
|
18
|
-
default_processing_pipeline:
|
|
19
|
-
Page: rdoc,tags,blocks
|
|
20
|
-
|
|
21
|
-
|
|
22
18
|
default_meta_info:
|
|
23
19
|
Webgen::SourceHandler::Page:
|
|
24
20
|
in_menu: true
|
|
21
|
+
link:
|
|
22
|
+
css: /style_screen.css
|
|
25
23
|
|
|
26
24
|
tag.menu.nested: false
|
|
27
25
|
|
|
@@ -32,3 +30,8 @@ rdoclinks.base_module: Roby
|
|
|
32
30
|
|
|
33
31
|
tag.coderay.line_numbers: false
|
|
34
32
|
tag.coderay.lang: ruby
|
|
33
|
+
|
|
34
|
+
contentprocessor.kramdown.options:
|
|
35
|
+
:entity_output: :symbolic
|
|
36
|
+
:coderay_line_numbers: ~
|
|
37
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Webgen::Tag
|
|
2
|
+
class Menu
|
|
3
|
+
alias __specific_menu_tree_for__ specific_menu_tree_for
|
|
4
|
+
|
|
5
|
+
def specific_menu_tree_for(content_node)
|
|
6
|
+
tree = __specific_menu_tree_for__(content_node)
|
|
7
|
+
return if !tree
|
|
8
|
+
|
|
9
|
+
tree.children.delete_if do |menu_info|
|
|
10
|
+
si = menu_info.node['sort_info']
|
|
11
|
+
next if !si
|
|
12
|
+
|
|
13
|
+
if param('tag.menu.range_start') && si < param('tag.menu.range_start')
|
|
14
|
+
true
|
|
15
|
+
elsif param('tag.menu.range_end') && si > param('tag.menu.range_end')
|
|
16
|
+
true
|
|
17
|
+
else
|
|
18
|
+
false
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
tree
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
config = Webgen::WebsiteAccess.website.config
|
|
27
|
+
config.tag.menu.range_start nil, mandatory: false
|
|
28
|
+
config.tag.menu.range_end nil, mandatory: false
|
|
29
|
+
|
data/doc/guide/ext/init.rb
CHANGED
|
@@ -8,7 +8,13 @@
|
|
|
8
8
|
# The +config+ variable below can be used to access the Webgen::Configuration object for the current
|
|
9
9
|
# website.
|
|
10
10
|
config = Webgen::WebsiteAccess.website.config
|
|
11
|
+
config['sourcehandler.patterns']['Webgen::SourceHandler::Copy'] << '**/autoproj_bootstrap'
|
|
12
|
+
config['sourcehandler.patterns']['Webgen::SourceHandler::Copy'] << '**/manifest.xml'
|
|
13
|
+
config['sourcehandler.patterns']['Webgen::SourceHandler::Copy'] << '**/*.svg'
|
|
14
|
+
config['sourcehandler.patterns']['Webgen::SourceHandler::Copy'] << '**/*.pdf'
|
|
15
|
+
config['sourcehandler.patterns']['Webgen::SourceHandler::Copy'] << '**/*.rb'
|
|
11
16
|
|
|
12
17
|
$LOAD_PATH.unshift File.expand_path('..', File.dirname(__FILE__))
|
|
13
18
|
require 'ext/rdoc_links'
|
|
14
19
|
require 'ext/previous_next'
|
|
20
|
+
require 'ext/extended_menu'
|
data/doc/guide/ext/rdoc_links.rb
CHANGED
|
@@ -19,15 +19,16 @@ def call(tag, body, context)
|
|
|
19
19
|
path[-1] += ".html"
|
|
20
20
|
url = "#{param('rdoclinks.base_url')}/#{path.join("/")}"
|
|
21
21
|
|
|
22
|
-
"<a href=\"#{context.ref_node.route_to(url)}\">#{param('rdoclinks.name')}</a>"
|
|
22
|
+
"<a href=\"#{context.ref_node.route_to(url)}\">#{param('rdoclinks.text') || param('rdoclinks.name')}</a>"
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
config = Webgen::WebsiteAccess.website.config
|
|
27
|
-
config.rdoclinks.name "", :
|
|
28
|
-
config.rdoclinks.base_webgen "", :
|
|
29
|
-
config.rdoclinks.base_url "", :
|
|
30
|
-
config.rdoclinks.base_module nil, :
|
|
31
|
-
config.rdoclinks.full_name false, :
|
|
27
|
+
config.rdoclinks.name "", mandatory: 'default'
|
|
28
|
+
config.rdoclinks.base_webgen "", mandatory: false
|
|
29
|
+
config.rdoclinks.base_url "", mandatory: false
|
|
30
|
+
config.rdoclinks.base_module nil, mandatory: false
|
|
31
|
+
config.rdoclinks.full_name false, mandatory: false
|
|
32
|
+
config.rdoclinks.text nil, mandatory: false
|
|
32
33
|
config['contentprocessor.tags.map']['rdoc_class'] = 'RdocLinks'
|
|
33
34
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Advanced Concepts
|
|
3
|
+
sort_info: 0
|
|
4
|
+
---
|
|
5
|
+
This section will present some of the more advanced Roby concepts. It assumes
|
|
6
|
+
that you have a good understanding of the basics of Roby, namely that you have
|
|
7
|
+
read the [concepts](../concepts) section and followed the
|
|
8
|
+
[tutorial](../tutorial).
|
|
9
|
+
|
|
10
|
+
It is a bit a list of things, but some of them will refer to others for a better
|
|
11
|
+
understanding. Have a look on the left menu for the different topics.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Recognizing patterns in plans
|
|
3
|
+
sort_info: 20
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Plan Queries and Task Matchers {#plan-queries}
|
|
7
|
+
-----------------------------
|
|
8
|
+
Roby plan structure is semantically very rich: it allows to very finely
|
|
9
|
+
represent the relationships that tasks and events have with each other. In
|
|
10
|
+
principle, one could use __plan patterns__ to recognize situations or specific
|
|
11
|
+
behaviours in a plan (and act upon it).
|
|
12
|
+
|
|
13
|
+
Defining a pattern in the plan and testing for it is done by task matchers
|
|
14
|
+
({rdoc_class: TaskMatcher}). Task matchers are objects that allow to test
|
|
15
|
+
whether a certain task object match some criteria. The task matchers are
|
|
16
|
+
created by calling #match on the type of tasks that we want to match. For
|
|
17
|
+
instance, to create a match object for running Localization tasks, one would do
|
|
18
|
+
|
|
19
|
+
{coderay:: ruby}
|
|
20
|
+
matcher = Localization.match.running
|
|
21
|
+
{coderay}
|
|
22
|
+
|
|
23
|
+
One can also match the task's surroundings
|
|
24
|
+
|
|
25
|
+
{coderay:: ruby}
|
|
26
|
+
matcher = MoveTo.match.with_child(Localization.match.running).pending
|
|
27
|
+
{coderay}
|
|
28
|
+
|
|
29
|
+
An extension of task matchers are plan queries. Plan queries are ways to
|
|
30
|
+
enumerate all tasks, in a plan, that match a given task match object. The big
|
|
31
|
+
difference with simply enumerating all tasks is that, for some of the match
|
|
32
|
+
predicates, queries are O(1) instead of O(n), namely:
|
|
33
|
+
|
|
34
|
+
* task model
|
|
35
|
+
* task state (running, pending, finished)
|
|
36
|
+
|
|
37
|
+
For instance, to match all running tasks that fullfill the MoveTo model:
|
|
38
|
+
|
|
39
|
+
{coderay:: ruby}
|
|
40
|
+
set = plan.find_tasks(MoveTo).
|
|
41
|
+
running
|
|
42
|
+
set.each do |task|
|
|
43
|
+
pp task
|
|
44
|
+
end
|
|
45
|
+
{coderay}
|
|
46
|
+
|
|
47
|
+
To match all tasks that fullfill the MoveTo model and have a pending (not yet
|
|
48
|
+
running) child that fullfill the Localization model
|
|
49
|
+
|
|
50
|
+
{coderay:: ruby}
|
|
51
|
+
plan.find_tasks(MoveTo).
|
|
52
|
+
running.
|
|
53
|
+
with_child(Localization.match.pending)
|
|
54
|
+
{coderay}
|
|
55
|
+
|
|
56
|
+
Event Predicates {#event-predicates}
|
|
57
|
+
----------------
|
|
58
|
+
Event predicates (or, in full, unbounded event predicates) are a tool that
|
|
59
|
+
allows to decide whether the history of a certain task matches a pattern or not.
|
|
60
|
+
The event predicate being the representation of that pattern.
|
|
61
|
+
|
|
62
|
+
They are created from symbols (which are the names of the events that should be
|
|
63
|
+
matched). For instance:
|
|
64
|
+
|
|
65
|
+
{coderay:: ruby}
|
|
66
|
+
:start.followed_by(:blocked)
|
|
67
|
+
{coderay}
|
|
68
|
+
|
|
69
|
+
will return an instance of {rdoc_class: EventConstraints::UnboundTaskPredicate}
|
|
70
|
+
or of one of its subclasses that can then be evaluated on a task. See
|
|
71
|
+
{rdoc_class: EventConstraints::UnboundPredicateSupport} for the list of methods
|
|
72
|
+
available on symbols and {rdoc_class: EventConstraints::UnboundTaskPredicate}
|
|
73
|
+
for the predicate interface, which allows to logically combine predicates with
|
|
74
|
+
each other.
|
|
75
|
+
|
|
76
|
+
One very important aspects of these predicates is the ability to say whether the
|
|
77
|
+
predicate may change its value in the future or not
|
|
78
|
+
(UnboundTaskPredicate#static?). This is done through the notion of event
|
|
79
|
+
unreachability. Moreover, the predicates can give an __explanation__ of why they
|
|
80
|
+
have the value they have and/or why they won't change value anymore. This
|
|
81
|
+
explanation is formed as a set of events, a set of non-emitted events (i.e.
|
|
82
|
+
generators that should have emitted an event and did not) and a set of
|
|
83
|
+
unreachable events.
|