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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
title: Representing Abstraction
|
|
3
3
|
routed_title: Representing Abstraction
|
|
4
4
|
sort_info: 0
|
|
5
|
-
---
|
|
5
|
+
---
|
|
6
6
|
Being able to abstract away the little details of execution is crucial. Indeed,
|
|
7
7
|
it allows to apply high-level reasoning algorithms, that are not able to take
|
|
8
8
|
into account too much details.
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: API Overview
|
|
3
|
+
sort_info: 400
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
= Overview
|
|
2
7
|
|
|
3
8
|
This page describes the various components that form a Roby application. It is
|
|
4
9
|
meant to be an "entry point" for people to understand what classes are there
|
|
5
|
-
for.
|
|
10
|
+
for.
|
|
6
11
|
|
|
7
12
|
== Life and death of a Roby Controller
|
|
8
13
|
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Error Handling
|
|
3
|
+
sort_info: 200
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Integration in the execution cycle
|
|
7
|
+
----------------------------------
|
|
8
|
+
As was just explained, errors take two forms in Roby:
|
|
9
|
+
|
|
10
|
+
* failure to meet the constraints set by the task/event relations
|
|
11
|
+
* exceptions that come from the Ruby code
|
|
12
|
+
|
|
13
|
+
For language exceptions, we will actually have to distinguish between exceptions
|
|
14
|
+
that come from task/event code (essentially event commands and handlers, polling
|
|
15
|
+
blocks) and Roby code itself.
|
|
16
|
+
|
|
17
|
+
The root of error handling is to be able to automatically compute what the
|
|
18
|
+
consequences of an error are. In Roby, the plan has the role of showing these
|
|
19
|
+
links (a task's failure impacts the tasks that depend on it, i.e. its parents in
|
|
20
|
+
the hierarchy relation). Therefore, Roby is only able to handle these errors
|
|
21
|
+
that can be associated with a task (this error impacts that task), namely: the
|
|
22
|
+
exceptions that come from task/event code and the constraint violations. The
|
|
23
|
+
other exceptions (that come from Roby code that is not assigned to a task/event)
|
|
24
|
+
are not handled automatically by Roby. They lead by default to a shutdown of the
|
|
25
|
+
whole system.
|
|
26
|
+
|
|
27
|
+
In the execution cycle, Roby runs a constraint analysis on the whole plan _after
|
|
28
|
+
the event propagation phase_. This is because that pass has to see the "big
|
|
29
|
+
picture", i.e. the result of all the event propagation in the current cycle.
|
|
30
|
+
See [this page](../relations/new_relations.html) for details on how to integrate
|
|
31
|
+
a constraint analysis routine from a task/event relation.
|
|
32
|
+
|
|
33
|
+
We will now see the three means of error handling that Roby offers, and then
|
|
34
|
+
conclude with an overview of the whole error handling phase.
|
|
35
|
+
|
|
36
|
+
Repairing the plan during the event propagation
|
|
37
|
+
-----------------------------------------------
|
|
38
|
+
As has just been noticed, Roby has to analyze the plan __after__ all events have
|
|
39
|
+
been propagated. So, if a constraint gets both violated *and* repaired during
|
|
40
|
+
the event propagation phase, that won't really count as an error.
|
|
41
|
+
|
|
42
|
+
That mean of "error repair" is useful for simple cases. The most obvious case is
|
|
43
|
+
when a task should simply be restarted when it fails, for instance because the
|
|
44
|
+
failure is a spurious error.
|
|
45
|
+
|
|
46
|
+
As an example, I had a robot where the control module, in the functional layer,
|
|
47
|
+
was checking that its input data flow was updated often enough (timeout).
|
|
48
|
+
This is a fine design decision given the security it adds. And was working fine
|
|
49
|
+
on the realtime operating system the functional layer was originally running on.
|
|
50
|
+
But when I came at this lab, the functional layer was running on a standard
|
|
51
|
+
Linux kernel, and therefore there were outliers in the command update rate (i.e.
|
|
52
|
+
latencies much higher than expected). They were rare, but they happened.
|
|
53
|
+
|
|
54
|
+
Changing the timeout was not the right solution, as its effect would have to
|
|
55
|
+
actually make it much less useful (we would have had to move it to more than one
|
|
56
|
+
second). So, I had to handle this in the supervision layer.
|
|
57
|
+
|
|
58
|
+
How it was done was the following: whenever that particular failure message was
|
|
59
|
+
coming in (<tt>poster\_not\_updated</tt>), the control task was simply restarted
|
|
60
|
+
_unless it had already been restarted in the last second_.
|
|
61
|
+
|
|
62
|
+
It was implemented like this:
|
|
63
|
+
|
|
64
|
+
{coderay:: ruby}
|
|
65
|
+
on :poster_not_updated do |event|
|
|
66
|
+
if (TrackSpeedStart.last_error - Time.now) > 1
|
|
67
|
+
plan.respawn(self)
|
|
68
|
+
TrackSpeedStart.last_error = Time.now
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
{coderay}
|
|
72
|
+
|
|
73
|
+
Where <tt>plan.respawn</tt> do the job of creating a new task of the same type
|
|
74
|
+
and with the same arguments, replacing the current version with the new instance
|
|
75
|
+
and start the new instance.
|
|
76
|
+
|
|
77
|
+
The execution trace looks like the following, with the original plan in the left
|
|
78
|
+
and the plan after the error on the right.
|
|
79
|
+
|
|
80
|
+

|
|
81
|
+
|
|
82
|
+
Plan repairs: asynchronous reparations
|
|
83
|
+
--------------------------------------
|
|
84
|
+
|
|
85
|
+
Roby's exception system: synchronous reparations
|
|
86
|
+
------------------------------------------------
|
|
87
|
+
|
|
88
|
+
What to do with non-repaired tasks ?
|
|
89
|
+
------------------------------------
|
|
90
|
+
|
|
91
|
+
Well, that's actually the subject of the next page. In summary: since they're
|
|
92
|
+
not repaired, they count as being potentially harmful to the system and
|
|
93
|
+
therefore are stopped automatically by the garbage collection mechanism.
|
|
94
|
+
|
|
95
|
+
Summary
|
|
96
|
+
-------
|
|
97
|
+
|
|
98
|
+
|
|
File without changes
|
|
File without changes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Error
|
|
3
|
-
sort_info:
|
|
4
|
-
---
|
|
2
|
+
title: Error Sources
|
|
3
|
+
sort_info: 190
|
|
4
|
+
---
|
|
5
5
|
|
|
6
6
|
Where do errors come from ?
|
|
7
7
|
---------------------------
|
|
@@ -49,7 +49,7 @@ has two roles:
|
|
|
49
49
|
process states by indirect means. A simple example is to verify that the
|
|
50
50
|
output values of the module is within specified boundaries.
|
|
51
51
|
|
|
52
|
-
The most
|
|
52
|
+
The most robust strategy is to actually do _both_. Simple diagnostics can be
|
|
53
53
|
implemented using the task's __poll__ block. More complex ones can use two
|
|
54
54
|
different tasks (one task for the process, one task for the monitoring), and
|
|
55
55
|
according task relations.
|
|
@@ -80,89 +80,46 @@ end
|
|
|
80
80
|
and then {coderay:: {lang: ruby, wrap: span}}emit :hesitates{coderay} when
|
|
81
81
|
applicable.
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
Linux kernel, and therefore there were outliers in the command update rate (i.e.
|
|
126
|
-
latencies much higher than expected). They were rare, but they happened.
|
|
127
|
-
|
|
128
|
-
Changing the timeout was not the right solution, as its effect would have to
|
|
129
|
-
actually make it much less useful (we would have had to move it to more than one
|
|
130
|
-
second). So, I had to handle this in the supervision layer.
|
|
131
|
-
|
|
132
|
-
How it was done was the following: whenever that particular failure message was
|
|
133
|
-
coming in (<tt>poster\_not\_updated</tt>), the control task was simply restarted
|
|
134
|
-
_unless it had already been restarted in the last second_.
|
|
135
|
-
|
|
136
|
-
It was implemented like this:
|
|
137
|
-
|
|
138
|
-
{coderay:: ruby}
|
|
139
|
-
on :poster_not_updated do |event|
|
|
140
|
-
if (TrackSpeedStart.last_error - Time.now) > 1
|
|
141
|
-
plan.respawn(self)
|
|
142
|
-
TrackSpeedStart.last_error = Time.now
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
{coderay}
|
|
146
|
-
|
|
147
|
-
Where <tt>plan.respawn</tt> do the job of creating a new task of the same type
|
|
148
|
-
and with the same arguments, replacing the current version with the new instance
|
|
149
|
-
and start the new instance.
|
|
150
|
-
|
|
151
|
-
The execution trace looks like the following, with the original plan in the left
|
|
152
|
-
and the plan after the error on the right.
|
|
153
|
-
|
|
154
|
-

|
|
155
|
-
|
|
156
|
-
Roby's exception system: synchronous reparations
|
|
157
|
-
------------------------------------------------
|
|
158
|
-
|
|
159
|
-
Plan repairs: asynchronous reparations
|
|
160
|
-
--------------------------------------
|
|
161
|
-
|
|
162
|
-
What to do with non-repaired tasks ?
|
|
163
|
-
------------------------------------
|
|
164
|
-
|
|
165
|
-
Summary
|
|
166
|
-
-------
|
|
167
|
-
|
|
83
|
+
Using tasks as an error isolation mechanism
|
|
84
|
+
-------------------------------------------
|
|
85
|
+
|
|
86
|
+
As we mentionned earlier, Roby tries to as much as possible isolate exceptions
|
|
87
|
+
that are coming from "user code", i.e. event commands and handlers, polling
|
|
88
|
+
blocks. The "isolation mechanism" is to associate these exceptions to a
|
|
89
|
+
particular operation on a task or event.
|
|
90
|
+
|
|
91
|
+
In practice, the following things can happen in a task's lifetime:
|
|
92
|
+
|
|
93
|
+
1. the 'start' command raises an exception. This exception is wrapped in a
|
|
94
|
+
{rdoc_class: CommandFailed} instance, the task is marked as failed (both
|
|
95
|
+
#failed\_to\_start? and #failed? return true) and all its events are marked as
|
|
96
|
+
unreachable. The failure reason (returned by Task#failure\_reason) and the
|
|
97
|
+
unreachability reason are both the CommandFailed instance.
|
|
98
|
+
2. the command or handlers of an intermediate event, or the polling block raise
|
|
99
|
+
an exception. In that case, the <tt>internal_error</tt> event is emitted
|
|
100
|
+
with said exception as context. This event either signals the stop event if
|
|
101
|
+
the stop event is controlable, or forcefully emits <tt>failed</tt>.
|
|
102
|
+
3. the command or handler of a terminal event raise an exception. If it was
|
|
103
|
+
during a normal termination, then it is handled in the same way than in 2.
|
|
104
|
+
(internal\_error is emitted). Otherwise, then a {rdoc_class:
|
|
105
|
+
TaskTerminationFailure} error is injected in the error handling and the
|
|
106
|
+
[task is put into quarantine](garbage_collection.html).
|
|
107
|
+
|
|
108
|
+
Error representation in the API
|
|
109
|
+
-------------------------------
|
|
110
|
+
|
|
111
|
+
In practice, error handling operates on {rdoc_class: LocalizedError} instances.
|
|
112
|
+
This new instance refers to the original error (if there is one, see for
|
|
113
|
+
instance {rdoc_class: CommandFailed}).
|
|
114
|
+
The error source will be as specific as possible: either a specific event
|
|
115
|
+
emission (returned by #failed\_event), an event generator (returned by
|
|
116
|
+
#failed\_generator, for instance if the error is due to an event that has become
|
|
117
|
+
unreachable) and finally a task (returned by #failed\_task).
|
|
118
|
+
|
|
119
|
+
On creation, LocalizedError will "fill in the blanks", i.e. it will for instance set
|
|
120
|
+
failed\_generator and failed\_task if the error source is an emission that comes
|
|
121
|
+
from a task.
|
|
122
|
+
|
|
123
|
+
Once created, this error gets registered in the execution engine by
|
|
124
|
+
calling <tt>ExecutionEngine#add_error</tt>.
|
|
168
125
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
title: The Execution Cycle
|
|
3
3
|
routed_title: Execution Cycle
|
|
4
4
|
sort_info: 0
|
|
5
|
-
---
|
|
5
|
+
---
|
|
6
6
|
|
|
7
7
|
Now that we saw [the basics](../basics/index.html), this section will present in
|
|
8
8
|
greater details how execution works in Roby. First, we will see how a Roby
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Event Propagation
|
|
3
3
|
sort_info: 100
|
|
4
|
-
---
|
|
4
|
+
---
|
|
5
5
|
|
|
6
6
|
The execution flow in Roby is basically:
|
|
7
7
|
|
|
@@ -152,3 +152,13 @@ simply do
|
|
|
152
152
|
The block will then be called at the beginning of the next execution cycle, in
|
|
153
153
|
the propagation phase.
|
|
154
154
|
|
|
155
|
+
Unreachable events
|
|
156
|
+
------------------
|
|
157
|
+
|
|
158
|
+
There are means, in the engine to declare that an event will __never__ be
|
|
159
|
+
emitted anymore (the principal one being EventGenerator#unreachable!). This is
|
|
160
|
+
useful in general, as it allows to realize that something that is _needed_ by
|
|
161
|
+
the good execution of the system will actually never happen. This is actually
|
|
162
|
+
how a big part of the error detection mechanism works.
|
|
163
|
+
|
|
164
|
+
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Building Plans
|
|
3
|
+
sort_info: 150
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
In a Roby application / Roby controller, the task of building plans, i.e. adding
|
|
7
|
+
[tasks](tasks.html) and [events](events.html), and adding relations between them
|
|
8
|
+
is given the __planning interface__.
|
|
9
|
+
|
|
10
|
+
In effect, the planning interface is not an interface to a planner. It is just
|
|
11
|
+
an interface that allows to, dynamically, ask "something" to build a plan to
|
|
12
|
+
realize an action. This page will describe this planning interface, and how it
|
|
13
|
+
can be accessed at runtime.
|
|
14
|
+
|
|
15
|
+
The planning scripts that we are going to describe below are defined in files in
|
|
16
|
+
the models/planners/* directory, and models/planners/ROBOT directories (i.e.
|
|
17
|
+
models/planners/asguard/ is going to hold planners that should only be defined
|
|
18
|
+
when the system has been started with the -rasguard option).
|
|
19
|
+
|
|
20
|
+
Planning methods
|
|
21
|
+
----------------
|
|
22
|
+
Planning methods are code blocks (in effect, Ruby methods) that get a set of
|
|
23
|
+
arguments and return an instance of Roby::Task. They are describing the __action
|
|
24
|
+
interface__ of your robot. I.e. if one wants to make a robot move, he would do
|
|
25
|
+
(in the relevant planner class, we'll talk about that later)
|
|
26
|
+
|
|
27
|
+
{coderay:: ruby}
|
|
28
|
+
method(:move_to) do
|
|
29
|
+
task = MoveTo.new(arguments[:target_point])
|
|
30
|
+
# Create other tasks, [add relations](../relations) between them tasks, create
|
|
31
|
+
# links between the tasks events, add [polling and scripting](code.html)
|
|
32
|
+
task
|
|
33
|
+
end
|
|
34
|
+
{coderay}
|
|
35
|
+
|
|
36
|
+
The task returned by the planning method will be used to represent the required
|
|
37
|
+
action.
|
|
38
|
+
|
|
39
|
+
In general, building plans manually like this gives you the greatest
|
|
40
|
+
flexibility, but also requires you to understand a lot about Roby. The
|
|
41
|
+
recommended way to do this kind of behaviour aggregation is to create a toplevel
|
|
42
|
+
task, such as the MoveTo task above, and define either a task script -- if that
|
|
43
|
+
is enough -- or a task state machine to represent the more complex behaviour:
|
|
44
|
+
|
|
45
|
+
{coderay:: ruby}
|
|
46
|
+
method(:move_to) do
|
|
47
|
+
task = MoveTo.new(arguments[:target_point])
|
|
48
|
+
task.script do
|
|
49
|
+
# Use the script to define your behaviour. The start(:planning_method_name!)
|
|
50
|
+
# or start(task_model) instructions allow you to add subtasks
|
|
51
|
+
end
|
|
52
|
+
task
|
|
53
|
+
end
|
|
54
|
+
{coderay}
|
|
55
|
+
|
|
56
|
+
MainPlanner and defining additional planners
|
|
57
|
+
--------------------------------------------
|
|
58
|
+
By default, Roby defines a planner class to hold all these planning methods.
|
|
59
|
+
This class is called MainPlanner and is available globally. It is, by default,
|
|
60
|
+
modified in planners/models/main.rb.
|
|
61
|
+
|
|
62
|
+
When systems grow larger, or in order to allow for reusing the planner models,
|
|
63
|
+
one can define its own planning classes. This can be done by subclassing
|
|
64
|
+
Roby::Planning::Planner:
|
|
65
|
+
|
|
66
|
+
{coderay:: ruby}
|
|
67
|
+
class MyPlanner < Roby::Planning::Planner
|
|
68
|
+
end
|
|
69
|
+
{coderay}
|
|
70
|
+
|
|
71
|
+
Moreover, in order for this planning model to be made available to the action
|
|
72
|
+
interfaces that are described below, one has to add the planner to the list of
|
|
73
|
+
planner models in Roby.app.planners. This is usually done in config/ROBOT.rb,
|
|
74
|
+
but could also be done dynamically.
|
|
75
|
+
|
|
76
|
+
Dynamically querying planning methods
|
|
77
|
+
-------------------------------------
|
|
78
|
+
Once planning methods are defined, they can be accessed through two principal
|
|
79
|
+
means:
|
|
80
|
+
|
|
81
|
+
__From within the Roby controller__, one can inject a new mission in the plan
|
|
82
|
+
from the planning interface using the Robot singleton object:
|
|
83
|
+
|
|
84
|
+
{coderay:: ruby}
|
|
85
|
+
Robot.move_to!
|
|
86
|
+
{coderay}
|
|
87
|
+
|
|
88
|
+
__From the Roby shell__, one does the same by using typing move_to!.
|
|
89
|
+
|