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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Code Examples
|
|
3
3
|
sort_info: 10
|
|
4
|
-
---
|
|
4
|
+
---
|
|
5
5
|
Notations
|
|
6
6
|
---------
|
|
7
7
|
In the following pages, the example code is meant to be run either in a Ruby
|
|
@@ -24,10 +24,11 @@ Setting up the Ruby shell
|
|
|
24
24
|
Moreover, before typing in the Roby shell, you will need to prepare it a bit. Do
|
|
25
25
|
the following:
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
{coderay:: text}
|
|
28
|
+
$ irb -rroby/standalone
|
|
29
|
+
{coderay}
|
|
30
|
+
|
|
28
31
|
{coderay:: ruby}
|
|
29
|
-
|
|
30
|
-
>> include Roby
|
|
31
|
-
>> plan = Roby.plan
|
|
32
|
+
>> plan = Roby.plan
|
|
32
33
|
{coderay}
|
|
33
34
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Don't repeat yourself !
|
|
3
3
|
sort_info: 800
|
|
4
|
-
---
|
|
4
|
+
---
|
|
5
5
|
|
|
6
6
|
Unlike most (all ?) other supervision system, Roby is *not* a domain-specific
|
|
7
7
|
language (DSL). Instead, it uses the facilities offered by the Ruby programming
|
|
@@ -16,24 +16,24 @@ MyTask task model that way:
|
|
|
16
16
|
|
|
17
17
|
{coderay:: ruby}
|
|
18
18
|
class MyTask < Roby::Task
|
|
19
|
-
event :start do
|
|
19
|
+
event :start do |context|
|
|
20
20
|
puts "start event called"
|
|
21
21
|
emit :start
|
|
22
22
|
end
|
|
23
|
-
event :controlable do
|
|
23
|
+
event :controlable do |context|
|
|
24
24
|
puts "controlable event called"
|
|
25
25
|
emit :controlable
|
|
26
26
|
end
|
|
27
27
|
event :contingent
|
|
28
28
|
|
|
29
|
-
on(:start) { puts "start event emitted" }
|
|
30
|
-
on(:controlable) { puts "controlable event emitted" }
|
|
31
|
-
on(:contingent) { puts "contingent event emitted" }
|
|
32
|
-
on(:failed) { puts "failed event emitted" }
|
|
33
|
-
on(:stop) { puts "stop event emitted" }
|
|
29
|
+
on(:start) { |event| puts "start event emitted" }
|
|
30
|
+
on(:controlable) { |event| puts "controlable event emitted" }
|
|
31
|
+
on(:contingent) { |event| puts "contingent event emitted" }
|
|
32
|
+
on(:failed) { |event| puts "failed event emitted" }
|
|
33
|
+
on(:stop) { |event| puts "stop event emitted" }
|
|
34
34
|
|
|
35
35
|
event :finished, :terminal => true
|
|
36
|
-
on(:finished) { puts "finished event emitted" }
|
|
36
|
+
on(:finished) { |event| puts "finished event emitted" }
|
|
37
37
|
end
|
|
38
38
|
{coderay}
|
|
39
39
|
|
|
@@ -41,29 +41,29 @@ Full of repetitions ... Now, one could have written, instead:
|
|
|
41
41
|
|
|
42
42
|
{coderay:: ruby}
|
|
43
43
|
class MyTask < Roby::Task
|
|
44
|
-
event :start do
|
|
44
|
+
event :start do |context|
|
|
45
45
|
puts "start event called"
|
|
46
46
|
emit :start
|
|
47
47
|
end
|
|
48
|
-
event :controlable do
|
|
48
|
+
event :controlable do |context|
|
|
49
49
|
puts "controlable event called"
|
|
50
50
|
emit :controlable
|
|
51
51
|
end
|
|
52
52
|
event :finished, :terminal => true
|
|
53
53
|
|
|
54
54
|
each_event do |ev|
|
|
55
|
-
on(ev.symbol) { puts "#{ev.symbol} event emitted" }
|
|
55
|
+
on(ev.symbol) { |event| puts "#{ev.symbol} event emitted" }
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
58
|
{coderay}
|
|
59
59
|
|
|
60
60
|
This way:
|
|
61
|
+
|
|
61
62
|
* if we want to display more information, changing one line does the trick
|
|
62
63
|
* if a new event is added, it gets displayed automatically
|
|
63
64
|
|
|
64
|
-
|
|
65
|
-
|
|
66
65
|
**Don't forget !**: every piece of text you write in a Roby application is Ruby
|
|
67
66
|
code, so you have the means to avoid ugly repetitions.
|
|
68
|
-
{.warning}
|
|
67
|
+
{: .warning}
|
|
68
|
+
|
|
69
69
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Error handling
|
|
3
3
|
sort_info: 700
|
|
4
|
-
---
|
|
4
|
+
---
|
|
5
5
|
|
|
6
6
|
One thing about robotics, and in particular plan execution, is that Murphy's
|
|
7
7
|
rule applies quite well. This is due to a few things. Among them, the first is
|
|
@@ -37,7 +37,7 @@ because the event 'failed' was emitted) and who is the culprit (in the
|
|
|
37
37
|
ChildFailedError, the child).
|
|
38
38
|
|
|
39
39
|
Let's see an example of such an error. We'll cheat a bit and make our
|
|
40
|
-
ComputePath task fail. Edit tasks/compute\_path.rb and add an error at the beginning of the implementation block. Make it so that it looks like the following:
|
|
40
|
+
ComputePath task fail. Edit models/tasks/compute\_path.rb and add an error at the beginning of the implementation block. Make it so that it looks like the following:
|
|
41
41
|
|
|
42
42
|
{coderay:: ruby}
|
|
43
43
|
implementation do
|
|
@@ -51,7 +51,7 @@ Now, start the controller in one console and the roby shell in another and:
|
|
|
51
51
|
!Roby::ChildFailedError
|
|
52
52
|
!at [345013:53:51.812/109] in the failed event of ComputePath:0x7f6ff6a8f0a8
|
|
53
53
|
!implementation failed ! (RuntimeError)
|
|
54
|
-
! ./tasks/compute_path.rb:19,
|
|
54
|
+
! ./models/tasks/compute_path.rb:19,
|
|
55
55
|
! /home/joyeux/dev/roby/lib/roby/thread_task.rb:63:in `value',
|
|
56
56
|
! /home/joyeux/dev/roby/lib/roby/thread_task.rb:63:in the polling handler,
|
|
57
57
|
! /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require',
|
|
@@ -77,6 +77,7 @@ Now, start the controller in one console and the roby shell in another and:
|
|
|
77
77
|
!task MoveTo{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}:0x7f6ff6a8f198[] failed
|
|
78
78
|
|
|
79
79
|
What information is there ?
|
|
80
|
+
|
|
80
81
|
* we do have a ChildFailedError
|
|
81
82
|
* the source is the emission at 345013:53:51.812/109 of the 'failed' event of
|
|
82
83
|
ComputePath. Roby::ThreadTask will automatically emit _failed_ if the
|
|
@@ -86,7 +87,7 @@ What information is there ?
|
|
|
86
87
|
its backtrace.
|
|
87
88
|
|
|
88
89
|
!implementation failed ! (RuntimeError)
|
|
89
|
-
! ./tasks/compute_path.rb:19,
|
|
90
|
+
! ./models/tasks/compute_path.rb:19,
|
|
90
91
|
! /home/joyeux/dev/roby/lib/roby/thread_task.rb:63:in `value',
|
|
91
92
|
! /home/joyeux/dev/roby/lib/roby/thread_task.rb:63:in the polling handler,
|
|
92
93
|
! /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require',
|
|
@@ -119,10 +120,10 @@ that we can't rely on it). In that case, Roby tries to hang up as cleanly as
|
|
|
119
120
|
possible by killing all tasks that are being executed.
|
|
120
121
|
|
|
121
122
|
Let's try one code error. Add the following event handler in the definition of
|
|
122
|
-
MoveTo in tasks/move\_to.rb
|
|
123
|
+
MoveTo in models/tasks/move\_to.rb
|
|
123
124
|
|
|
124
125
|
{coderay:: ruby}
|
|
125
|
-
on :start do
|
|
126
|
+
on :start do |event|
|
|
126
127
|
raise "the start handler failed !"
|
|
127
128
|
end
|
|
128
129
|
{coderay}
|
|
@@ -130,55 +131,30 @@ end
|
|
|
130
131
|
Start (or restart) the controller and launch a planned\_move! action in
|
|
131
132
|
the shell. The following should happen:
|
|
132
133
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
! scripts/run:3
|
|
141
|
-
!
|
|
142
|
-
!The following tasks have been killed:
|
|
143
|
-
! MoveTo:0x2b4330b4fae8
|
|
134
|
+
= fatal exception 1: uncaught exception in an event handler of the start event of MoveTo:0x7f2c665a24b0
|
|
135
|
+
| called during the propagation of [16:10:25.191 @2] MoveTo:0x7f2c665a24b0{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[]/start
|
|
136
|
+
| /media/Data/rock/imoby/tutorials/roby/models/tasks/move_to.rb:10:in `event_handler_start_7f2c67500010': bla (RuntimeError)
|
|
137
|
+
| ./models/tasks/move_to.rb:10:in event handler for 'start',
|
|
138
|
+
| /media/Data/rock/imoby/tools/roby/bin/roby:7
|
|
139
|
+
| The following tasks have been killed:
|
|
140
|
+
| MoveTo:0x7f2c665a24b0
|
|
144
141
|
|
|
145
142
|
Now, what happens during execution: how Roby does react to that error ? What we
|
|
146
|
-
can see in the relation display is the
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-

|
|
150
|
-
{.fullfigure}
|
|
143
|
+
can see in the relation display is that, just after the action got expanded, the
|
|
144
|
+
following happens:
|
|
151
145
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
emitted).
|
|
155
|
-
{.figurecaption}
|
|
146
|
+

|
|
147
|
+
{: .fullfigure}
|
|
156
148
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
{.figurecaption}
|
|
163
|
-
|
|
164
|
-

|
|
165
|
-
{.fullfigure}
|
|
166
|
-
|
|
167
|
-
**Killing useless tasks**: the now useless ExecutePath is killed as well.
|
|
168
|
-
{.figurecaption}
|
|
169
|
-
|
|
170
|
-
From Roby's point of view, the event has already happened when the event
|
|
171
|
-
handlers get called. Therefore, the event propagation should go on even though
|
|
172
|
-
one of the event handlers failed, and therefore ComputePath is started.
|
|
173
|
-
|
|
174
|
-
However, since an error occured and has not been handled, the MoveTo task cannot
|
|
175
|
-
keep running and is stopped at the next cycle. The tasks that are now useless
|
|
176
|
-
are also stopped (in this particular execution, ComputePath took only one cycle
|
|
177
|
-
to execute and therefore only ExecutePath is stopped).
|
|
149
|
+
The MoveTo is started, and therefore the event handler is called. Note that the
|
|
150
|
+
event is still propagated as it __already happened__. Because of the failure,
|
|
151
|
+
the task is killed by the garbage collection mechanism and the children are
|
|
152
|
+
stopped as well since they are not useful anymore
|
|
153
|
+
{: .caption}
|
|
178
154
|
|
|
179
155
|
For event commands, all depends on where the exception actually appears. If
|
|
180
156
|
'emit' has already been called, then the event will be emitted and propagated.
|
|
181
|
-
Otherwise, it counts as a cancelling of the event command -- which is an error
|
|
157
|
+
Otherwise, it counts as a cancelling of the event command -- which is also an error
|
|
182
158
|
itself.
|
|
183
159
|
|
|
184
160
|
Handling errors
|
|
@@ -224,7 +200,7 @@ possible to actually restart the failing child directly in the event handler of
|
|
|
224
200
|
_failed_ and replace the failed task through this new one. This is as simple as:
|
|
225
201
|
|
|
226
202
|
{coderay:: ruby}
|
|
227
|
-
on(:failed) do
|
|
203
|
+
on(:failed) do |event|
|
|
228
204
|
plan.respawn(self)
|
|
229
205
|
end
|
|
230
206
|
{coderay}
|
|
@@ -234,14 +210,14 @@ error:
|
|
|
234
210
|
|
|
235
211
|
{coderay:: ruby}
|
|
236
212
|
attr_accessor :should_pass
|
|
237
|
-
event :start do
|
|
213
|
+
event :start do |context|
|
|
238
214
|
if !should_pass
|
|
239
215
|
forward :start, self, :failed, :delay => 0.2
|
|
240
216
|
end
|
|
241
217
|
emit :start
|
|
242
218
|
end
|
|
243
219
|
|
|
244
|
-
on :failed do
|
|
220
|
+
on :failed do |event|
|
|
245
221
|
if !should_pass
|
|
246
222
|
Robot.info "respawning ..."
|
|
247
223
|
new_task = plan.respawn(self)
|
|
@@ -262,8 +238,6 @@ Note that doing such a thing on the failed event is a bad idea, as failed is
|
|
|
262
238
|
emitted when the task gets interrupted. You would, in general, do that on a more
|
|
263
239
|
specific error event (i.e. an event that is forwarded to _failed_).
|
|
264
240
|
|
|
265
|
-
TODO: figure.
|
|
266
|
-
|
|
267
241
|
Asynchronous repairs
|
|
268
242
|
--------------------
|
|
269
243
|
|
|
@@ -281,12 +255,13 @@ task.event(error_event_name).handle_with(my_repair_task)
|
|
|
281
255
|
{coderay}
|
|
282
256
|
|
|
283
257
|
Let's try it in our application. What we will do is the following:
|
|
258
|
+
|
|
284
259
|
* add a _blocked_ fault event to the model of ExecutePath, and make the poll
|
|
285
260
|
block of ExecutePath emit _blocked_ randomly.
|
|
286
261
|
* have a repair task wait 2 seconds and either (randomly) respawn the path
|
|
287
262
|
execution after those two seconds, or emit _failed_.
|
|
288
263
|
|
|
289
|
-
The first point is straightforward: just change tasks/execute\_path.rb so that
|
|
264
|
+
The first point is straightforward: just change models/tasks/execute\_path.rb so that
|
|
290
265
|
the bottom of it looks like the following code. Changed lines are 4, 5, 10 and
|
|
291
266
|
11.
|
|
292
267
|
|
|
@@ -304,27 +279,27 @@ the bottom of it looks like the following code. Changed lines are 4, 5, 10 and
|
|
|
304
279
|
end
|
|
305
280
|
{coderay}
|
|
306
281
|
|
|
307
|
-
A new RepairTask model has to be added. Open tasks/repair\_task.rb and add the
|
|
282
|
+
A new RepairTask model has to be added. Open models/tasks/repair\_task.rb and add the
|
|
308
283
|
following:
|
|
309
284
|
|
|
310
285
|
{coderay:: ruby}
|
|
311
286
|
class RepairTask < Roby::Task
|
|
312
287
|
terminates
|
|
313
288
|
|
|
314
|
-
event :start do
|
|
289
|
+
event :start do |context|
|
|
315
290
|
Robot.info "repair will succeed in 2 seconds"
|
|
316
291
|
forward_to :start, self, :success, :delay => 2
|
|
317
292
|
emit :start
|
|
318
293
|
end
|
|
319
294
|
|
|
320
|
-
on :success do
|
|
295
|
+
on :success do |event|
|
|
321
296
|
current = failed_task.current_waypoint
|
|
322
297
|
execute = plan.respawn(failed_task)
|
|
323
298
|
repair = plan.recreate(self)
|
|
299
|
+
execute.blocked_event.handle_with(repair)
|
|
324
300
|
|
|
325
|
-
# Get the path object, and remove
|
|
326
|
-
|
|
327
|
-
path = execute.path_task.path
|
|
301
|
+
# Get the path object, and remove the points that have already been done
|
|
302
|
+
path = execute.parent_task.path
|
|
328
303
|
while !path.empty? && path[0] != current
|
|
329
304
|
path.shift
|
|
330
305
|
end
|
|
@@ -381,30 +356,30 @@ more details in the plan display (note that this time, you need to display the
|
|
|
381
356
|
ErrorHandling relation as well).
|
|
382
357
|
|
|
383
358
|

|
|
384
|
-
{.fullfigure}
|
|
359
|
+
{: .fullfigure}
|
|
385
360
|
|
|
386
361
|
**Nominal execution**: the plan repair (in blue) is not executed yet and the ExecutePath is running
|
|
387
|
-
{.
|
|
362
|
+
{: .caption}
|
|
388
363
|
|
|
389
364
|

|
|
390
|
-
{.fullfigure}
|
|
365
|
+
{: .fullfigure}
|
|
391
366
|
|
|
392
367
|
**ExecutePath fails**: the plan repair is queued for starting, and will actually start in the next cycle
|
|
393
|
-
{.
|
|
368
|
+
{: .caption}
|
|
394
369
|
|
|
395
370
|

|
|
396
|
-
{.fullfigure}
|
|
371
|
+
{: .fullfigure}
|
|
397
372
|
|
|
398
373
|
**Repair started**
|
|
399
|
-
{.
|
|
374
|
+
{: .caption}
|
|
400
375
|
|
|
401
376
|

|
|
402
|
-
{.fullfigure}
|
|
377
|
+
{: .fullfigure}
|
|
403
378
|
|
|
404
379
|
**Repair successful**: a new ExecutePath task is added with a new repair. The
|
|
405
380
|
new task's start event is queued, and will therefore start at the beginning of
|
|
406
381
|
the next cycle.
|
|
407
|
-
{.figurecaption}
|
|
382
|
+
{: .figurecaption}
|
|
408
383
|
|
|
409
384
|
A simple real-world example is
|
|
410
385
|
[here](http://roby.rubyforge.org/videos/rflex_repaired.avi) In this video, the
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Events
|
|
3
|
+
sort_info: 100
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This page will present the basic tools that allow to define and manipulate
|
|
7
|
+
events. In [the concepts section](../concepts/plans.html), we saw that
|
|
8
|
+
events are two sided objects: one the one hand, they represent the situations
|
|
9
|
+
the system is in (event _emission_). On the other hand, they represent the
|
|
10
|
+
commands that the system accepts (event _commands_). We'll see in this page
|
|
11
|
+
how this is translated in the Roby API: how to add a command block to an event
|
|
12
|
+
(event command), how to call code when an event is emitted (event handlers),
|
|
13
|
+
how to call it and how to emit it.
|
|
14
|
+
|
|
15
|
+
{include_file: {filename: src/basics_shell_header.txt, escape_html: false}}
|
|
16
|
+
|
|
17
|
+
The basics
|
|
18
|
+
----------
|
|
19
|
+
Two classes are used to represent "events". The first is the event generator
|
|
20
|
+
{rdoc_class: EventGenerator}. Event generators are the objects that will emit
|
|
21
|
+
events. In other words, they represent __the event sources__. When a generator
|
|
22
|
+
does emit an event, an instance of {rdoc_class: Event} is created to represent
|
|
23
|
+
this event, with timestamp and additional information.
|
|
24
|
+
|
|
25
|
+
To simplify the discourse, event generators and events are often both called
|
|
26
|
+
events. We will try to make the difference in this tutorial, though, to ease
|
|
27
|
+
the understanding.
|
|
28
|
+
|
|
29
|
+
A free event generator that has no command, also called _contingent_ or
|
|
30
|
+
_non-controllable_ generators are created with:
|
|
31
|
+
|
|
32
|
+
{coderay:: ruby}
|
|
33
|
+
>> ev1 = Roby::EventGenerator.new
|
|
34
|
+
{coderay}
|
|
35
|
+
|
|
36
|
+
Then, before using it, you need to include it in a plan, which is simply done
|
|
37
|
+
with
|
|
38
|
+
|
|
39
|
+
{coderay:: ruby}
|
|
40
|
+
>> plan.add(ev1)
|
|
41
|
+
{coderay}
|
|
42
|
+
|
|
43
|
+
Finally, to be able to see the event's emission, we would display some text
|
|
44
|
+
using an _event handler_: a piece of code that is executed when the event is
|
|
45
|
+
emitted.
|
|
46
|
+
|
|
47
|
+
{coderay:: ruby}
|
|
48
|
+
>> ev1.on { |e| puts "ev1 emitted with context=#{e.context.inspect}" }
|
|
49
|
+
{coderay}
|
|
50
|
+
|
|
51
|
+
The event handler's block gets an argument which is the actual event (the
|
|
52
|
+
instance of {rdoc_class: Event}). See the API documentation for what you can
|
|
53
|
+
get out of it.
|
|
54
|
+
|
|
55
|
+
Let's try to emit it. The event _emission_ says "the event happened just now".
|
|
56
|
+
|
|
57
|
+
{coderay:: ruby}
|
|
58
|
+
>> ev1.emit
|
|
59
|
+
ev1 emitted with context=nil
|
|
60
|
+
{coderay}
|
|
61
|
+
|
|
62
|
+
And if you would like to associate data with the event (what is called the event
|
|
63
|
+
context), you would do
|
|
64
|
+
|
|
65
|
+
{coderay:: ruby}
|
|
66
|
+
>> ev1.emit(10)
|
|
67
|
+
ev1 emitted with context=[10]
|
|
68
|
+
{coderay}
|
|
69
|
+
|
|
70
|
+
Let's now create a second event
|
|
71
|
+
|
|
72
|
+
{coderay:: ruby}
|
|
73
|
+
>> ev2 = Roby::EventGenerator.new do |argument|
|
|
74
|
+
?> puts "ev2 called with argument=#{argument.inspect}"
|
|
75
|
+
?> ev2.emit(argument.first + 1)
|
|
76
|
+
>> end
|
|
77
|
+
>> plan.add(ev2)
|
|
78
|
+
>> ev2.on { |ev| puts "ev2 emitted with context=#{ev.context.inspect}" }
|
|
79
|
+
{coderay}
|
|
80
|
+
|
|
81
|
+
This second event is _controllable_. It has a block of code associated to it
|
|
82
|
+
(the event command) whose purpose it to make sure that the event will _happen_
|
|
83
|
+
(be emitted). As you can see above, a command accepts an argument. In this
|
|
84
|
+
example, the emission is done by calling emit directly. More complex
|
|
85
|
+
(asynchronous) schemes can also be built, but in general they would be
|
|
86
|
+
represented by tasks (that we will see later on).
|
|
87
|
+
|
|
88
|
+
Let's try our controllable event
|
|
89
|
+
|
|
90
|
+
{coderay:: ruby}
|
|
91
|
+
>> ev2.call(10)
|
|
92
|
+
ev2 called with argument=[10]
|
|
93
|
+
ev2 emitted with context=[11]
|
|
94
|
+
{coderay}
|
|
95
|
+
|
|
96
|
+
Reacting to events
|
|
97
|
+
------------------
|
|
98
|
+
The whole point of having a *plan* is to be able to describe _reactions_: i.e.
|
|
99
|
+
what the system should do when something happens. The basic tool to do that,
|
|
100
|
+
is to create a _signal_ between two events:
|
|
101
|
+
|
|
102
|
+
{coderay:: ruby}
|
|
103
|
+
>> ev1.signals ev2
|
|
104
|
+
{coderay}
|
|
105
|
+
|
|
106
|
+
Try it:
|
|
107
|
+
|
|
108
|
+
{coderay:: ruby}
|
|
109
|
+
>> ev1.emit(10)
|
|
110
|
+
ev1 emitted with context=10
|
|
111
|
+
ev2 called with argument=10
|
|
112
|
+
ev2 emitted with context=11
|
|
113
|
+
{coderay}
|
|
114
|
+
|
|
115
|
+
You can therefore see that
|
|
116
|
+
|
|
117
|
+
* because of the signal, the _emission_ of the first event caused the second
|
|
118
|
+
event's command to be called. The signal therefore means "when ev1 happens,
|
|
119
|
+
call ev2"
|
|
120
|
+
* the signalling transforms the event's context into the target command's
|
|
121
|
+
argument.
|
|
122
|
+
|
|
123
|
+
Composing events
|
|
124
|
+
----------------
|
|
125
|
+
|
|
126
|
+
Another important capability built around events is the ability to _compose_ them. Two
|
|
127
|
+
basic operators exist.
|
|
128
|
+
|
|
129
|
+
For instance, in the following snippet, "and\_ev" is emitted when _both_ ev1
|
|
130
|
+
__and__ ev2 have been emitted and "or\_ev" is emitted as soon as _one of_ ev1
|
|
131
|
+
__or__ ev2 have been emitted.
|
|
132
|
+
|
|
133
|
+
{coderay:: ruby}
|
|
134
|
+
>> plan.add(ev1 = EventGenerator.new)
|
|
135
|
+
>> plan.add(ev2 = EventGenerator.new)
|
|
136
|
+
>> and_ev = ev1 & ev2
|
|
137
|
+
>> or_ev = ev1 | ev2
|
|
138
|
+
>> and_ev.on { |ev| puts "AND" }
|
|
139
|
+
>> or_ev.on { |ev| puts "OR" }
|
|
140
|
+
>> ev1.emit
|
|
141
|
+
OR
|
|
142
|
+
>> ev2.emit
|
|
143
|
+
AND
|
|
144
|
+
{coderay}
|
|
145
|
+
|
|
146
|
+
You did not have to add the and\_ev and or\_ev events to the plan. This is because
|
|
147
|
+
they are linked to ev1 and ev2, so Roby added them to the plan automatically.
|
|
148
|
+
{: .info}
|
|
149
|
+
|
|
150
|
+
You can see that the "OR" event is emitted only once. If you want it to be
|
|
151
|
+
emitted every time one of its sources are, you would do:
|
|
152
|
+
|
|
153
|
+
{coderay:: ruby}
|
|
154
|
+
>> or_ev = ev1 | ev2
|
|
155
|
+
>> or_ev.on { |ev| puts "OR" }
|
|
156
|
+
>> or_ev.on { |ev| or_ev.reset }
|
|
157
|
+
>> ev2.emit
|
|
158
|
+
OR
|
|
159
|
+
>> ev2.emit
|
|
160
|
+
OR
|
|
161
|
+
>> ev1.emit
|
|
162
|
+
OR
|
|
163
|
+
{coderay}
|
|
164
|
+
|
|
165
|
+
In the same way, the "AND" event is emitted only once. You can also use #reset
|
|
166
|
+
to make it emit again.
|
|
167
|
+
|
|
168
|
+
Common errors when manipulating events
|
|
169
|
+
---------------------------------------
|
|
170
|
+
|
|
171
|
+
A common error is to try to manipulate an event which is not included in a
|
|
172
|
+
plan (objects are included in plans through the #add call). In that case,
|
|
173
|
+
the event is not executable and you will get the following error:
|
|
174
|
+
|
|
175
|
+
{coderay:: ruby}
|
|
176
|
+
>> ev = EventGenerator.new { }
|
|
177
|
+
>> ev.call
|
|
178
|
+
Roby::EventNotExecutable: #call called on #<Roby::EventGenerator:0x484aa3c0> which is a non-executable event
|
|
179
|
+
>> ev.emit
|
|
180
|
+
Roby::EventNotExecutable: #emit called on #<Roby::EventGenerator:0x484aa3c0> which is a non-executable event
|
|
181
|
+
{coderay}
|
|
182
|
+
|
|
183
|
+
Another common error is to try to call (or signal) and event that is non
|
|
184
|
+
controllable. In that case, Roby raises a {rdoc_class: EventNotControlable}
|
|
185
|
+
exception.
|
|
186
|
+
|
|
187
|
+
{coderay:: ruby}
|
|
188
|
+
>> plan.add(ev = EventGenerator.new)
|
|
189
|
+
>> ev.call
|
|
190
|
+
Roby::EventNotControlable: #call called on a non-controllable event
|
|
191
|
+
>> source = EventGenerator.new
|
|
192
|
+
>> source.signal(ev)
|
|
193
|
+
Roby::EventNotControlable: trying to establish a signal from #<Roby::EventGenerator:0x484a77f8> to #<Roby::EventGenerator:0x484aab88> which is not controllable
|
|
194
|
+
{coderay}
|
|
195
|
+
|