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: Task Hierarchies
|
|
3
3
|
sort_info: 500
|
|
4
|
-
---
|
|
4
|
+
---
|
|
5
5
|
|
|
6
6
|
What building blocks do we have until now ?
|
|
7
7
|
|
|
@@ -21,8 +21,6 @@ generating the plan needed to perform an action.
|
|
|
21
21
|
|
|
22
22
|
This page presents the most important of them: the hierarchy relation.
|
|
23
23
|
|
|
24
|
-
{include_file: {filename: src/basics_shell_header.txt, escape_html: false}}
|
|
25
|
-
|
|
26
24
|
Semantics of task hierarchies
|
|
27
25
|
-----------------------------
|
|
28
26
|
The goal of that relation is to represent the hard dependencies between tasks.
|
|
@@ -46,11 +44,12 @@ Adding dependencies between tasks
|
|
|
46
44
|
The code in that section is not meant to be tried out, but to support the
|
|
47
45
|
explanations. A proper controller, that uses these principles, is shown in the
|
|
48
46
|
following sections.
|
|
49
|
-
{.warning}
|
|
47
|
+
{: .warning}
|
|
50
48
|
|
|
51
49
|
Let's assume our robot's functional layer offers two services:
|
|
52
|
-
|
|
53
|
-
* it has a way to
|
|
50
|
+
|
|
51
|
+
* it has a way to compute a path from A to B (path planning)
|
|
52
|
+
* it has a way to execute that path once its computed
|
|
54
53
|
|
|
55
54
|
What we want here is to build the plan that represents a _movement_ from the
|
|
56
55
|
current robot's position to a goal position. That aggregate action will
|
|
@@ -64,9 +63,10 @@ end
|
|
|
64
63
|
{coderay}
|
|
65
64
|
|
|
66
65
|
So, now, we would have two options:
|
|
67
|
-
|
|
68
|
-
*
|
|
69
|
-
|
|
66
|
+
|
|
67
|
+
* either call the functional layer directly from the MoveTo task
|
|
68
|
+
* or integrate both services independently (in two different tasks) and then
|
|
69
|
+
aggregate their functionality through the plan.
|
|
70
70
|
|
|
71
71
|
In Roby, we would usually use the second method, as it promotes reusability. The
|
|
72
72
|
plan would therefore have to represent the following:
|
|
@@ -109,6 +109,7 @@ again, we could describe this plan with:
|
|
|
109
109
|
The MoveTo task is a sequence of ComputePath followed by ExecutePath
|
|
110
110
|
|
|
111
111
|
and could be written
|
|
112
|
+
|
|
112
113
|
{coderay:: ruby}
|
|
113
114
|
move = MoveTo.new :goal => a
|
|
114
115
|
compute = ComputePath.new :goal => a
|
|
@@ -131,7 +132,7 @@ the ComputePath task to the ExecutePath task. In general, such an endeavour is
|
|
|
131
132
|
done in Roby through the attributes on task objects. Here, we will simply define
|
|
132
133
|
a 'path' attribute on the MoveTo class. Given that the actual actions are
|
|
133
134
|
performed by ComputePath and ExecutePath, the definition of the MoveTo task is
|
|
134
|
-
actually quite simple
|
|
135
|
+
actually quite simple (add in models/tasks/move_to.rb)
|
|
135
136
|
|
|
136
137
|
{coderay:: ruby}
|
|
137
138
|
class MoveTo < Roby::Task
|
|
@@ -149,27 +150,25 @@ model point of view, it will require the 'goal' argument again, and also a
|
|
|
149
150
|
'path\_task' argument which is the task holding the path data when computed.
|
|
150
151
|
|
|
151
152
|
On the implementation side, we will use a standard task, the {rdoc_class:
|
|
152
|
-
|
|
153
|
+
Tasks::Thread}. This task represents in Roby's plan a computation that is done in a
|
|
153
154
|
separate thread. To use this task, one simply needs to define an
|
|
154
155
|
"implementation" block (see below). This block is ran in a separate thread by
|
|
155
|
-
|
|
156
|
+
Tasks::Thread and, upon successful execution of the thread, the result value is
|
|
156
157
|
saved in the tasks's 'result' attribute (and success is emitted). The
|
|
157
158
|
added value is that if the thread fails by raising an exception, the "failed"
|
|
158
159
|
event is simply emitted with the exception as context. Now, open
|
|
159
|
-
tasks/compute\_path.rb and add the following code to it:
|
|
160
|
+
models/tasks/compute\_path.rb and add the following code to it:
|
|
160
161
|
|
|
161
162
|
{coderay:: ruby}
|
|
162
|
-
require 'roby/
|
|
163
|
-
class ComputePath < Roby::
|
|
164
|
-
# Where we should store the path when computed
|
|
165
|
-
argument :path_task
|
|
163
|
+
require 'roby/tasks/thread'
|
|
164
|
+
class ComputePath < Roby::Tasks::Thread
|
|
166
165
|
# The movement goal
|
|
167
166
|
argument :goal
|
|
168
167
|
|
|
169
168
|
# The robot position at which we started planning the path
|
|
170
169
|
attr_reader :start_point
|
|
171
170
|
|
|
172
|
-
# Initialize start_point and call
|
|
171
|
+
# Initialize start_point and call Tasks::Thread's start command
|
|
173
172
|
event :start do |context|
|
|
174
173
|
@start_point = State.pos.dup
|
|
175
174
|
super
|
|
@@ -189,33 +188,25 @@ class ComputePath < Roby::ThreadTask
|
|
|
189
188
|
Robot.info "#{path.size} points between #{start_point} and #{goal}"
|
|
190
189
|
path
|
|
191
190
|
end
|
|
192
|
-
|
|
193
|
-
on :success do |ev|
|
|
194
|
-
path_task.path = result
|
|
195
|
-
end
|
|
196
191
|
end
|
|
197
192
|
{coderay}
|
|
198
193
|
|
|
199
|
-
Finally, ExecutePath takes the path generated and follows it.
|
|
200
|
-
|
|
201
|
-
path (which is everything the task needs). So, edit tasks/execute\_path.rb and
|
|
194
|
+
Finally, ExecutePath takes the path generated and follows it. It assumes that
|
|
195
|
+
its path is stored on its parent task. Edit models/tasks/execute\_path.rb and
|
|
202
196
|
add the following:
|
|
203
197
|
|
|
204
198
|
{coderay:: ruby}
|
|
205
199
|
class ExecutePath < Roby::Task
|
|
206
200
|
terminates
|
|
207
201
|
|
|
208
|
-
# The task holding the path data
|
|
209
|
-
argument :path_task
|
|
210
|
-
|
|
211
202
|
# The current waypoint
|
|
212
|
-
def current_waypoint;
|
|
203
|
+
def current_waypoint; parent_task.path[@waypoint_index] end
|
|
213
204
|
|
|
214
205
|
poll do
|
|
215
206
|
@waypoint_index ||= 0
|
|
216
207
|
State.pos = current_waypoint
|
|
217
208
|
@waypoint_index += 1
|
|
218
|
-
if @waypoint_index ==
|
|
209
|
+
if @waypoint_index == parent_task.path.size
|
|
219
210
|
emit :success
|
|
220
211
|
end
|
|
221
212
|
|
|
@@ -225,51 +216,61 @@ end
|
|
|
225
216
|
{coderay}
|
|
226
217
|
|
|
227
218
|
There are two things left to do: properly initializing the position and adding
|
|
228
|
-
the planning method. For the first point, we will use the Pos::Vector3D class
|
|
229
|
-
that Roby provides (a simple x,y,z tuple). Edit controllers/goForward.rb and
|
|
219
|
+
the planning method. For the first point, we will use the Roby::Pos::Vector3D class
|
|
220
|
+
that Roby provides (a simple x,y,z tuple). Edit scripts/controllers/goForward.rb and
|
|
230
221
|
add:
|
|
231
222
|
|
|
232
|
-
|
|
233
|
-
State.pos = Pos::Vector3D.new
|
|
234
|
-
|
|
223
|
+
~~~ ruby
|
|
224
|
+
State.pos = Roby::Pos::Vector3D.new
|
|
225
|
+
~~~
|
|
235
226
|
|
|
236
|
-
Finally, edit planners/goForward/main.rb and add the following method:
|
|
227
|
+
Finally, edit models/planners/goForward/main.rb and add the following method:
|
|
237
228
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
229
|
+
~~~ ruby
|
|
230
|
+
describe("a movement that is using a planner").
|
|
231
|
+
required_arg('x', 'the X part of the position').
|
|
232
|
+
required_arg('y', 'the Y part of the position')
|
|
233
|
+
def planned_move(arguments)
|
|
234
|
+
goal = Roby::Pos::Vector3D.new(*arguments.values_at(:x, :y))
|
|
241
235
|
move = MoveTo.new :goal => goal
|
|
242
|
-
compute = ComputePath.new :goal => goal
|
|
243
|
-
execute = ExecutePath.new
|
|
236
|
+
compute = ComputePath.new :goal => goal
|
|
237
|
+
execute = ExecutePath.new
|
|
238
|
+
# ExecutePath expects its target path from its parent. Make sure that it
|
|
239
|
+
# happens
|
|
240
|
+
compute.on :success do |event|
|
|
241
|
+
move.path = compute.result
|
|
242
|
+
end
|
|
244
243
|
(compute + execute).to_task(move)
|
|
245
244
|
move
|
|
246
245
|
end
|
|
247
|
-
|
|
246
|
+
~~~
|
|
248
247
|
|
|
249
248
|
Trying it out
|
|
250
249
|
-------------
|
|
251
250
|
|
|
252
251
|
In one Unix shell, do
|
|
253
252
|
|
|
254
|
-
$
|
|
253
|
+
$ roby run -rgoForward -c
|
|
255
254
|
344919:32:59.172 (Roby) GC.enable does not accept an argument. GC will not be controlled by Roby
|
|
256
255
|
344919:32:59.204 (goForward) loaded Roby 0.7.90 on ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
|
|
257
256
|
344919:32:59.272 (goForward) loading controller file /home/joyeux/dev/first_app/controllers/goForward.rb
|
|
258
257
|
344919:32:59.273 (goForward) done initialization
|
|
259
|
-
0
|
|
260
|
-
0
|
|
261
258
|
|
|
262
259
|
Then, **in another one**, start the Roby shell
|
|
263
260
|
|
|
264
|
-
$
|
|
261
|
+
$ roby shell
|
|
265
262
|
localhost:48902 >
|
|
266
263
|
|
|
267
264
|
And do
|
|
268
265
|
|
|
269
|
-
|
|
270
|
-
localhost:48902 >
|
|
271
|
-
=>
|
|
272
|
-
localhost:48902 >
|
|
273
|
-
!
|
|
274
|
-
{
|
|
266
|
+
~~~ ruby
|
|
267
|
+
localhost:48902 > planned_move! :x => 10, :y => 20
|
|
268
|
+
=> #<service Roby::Task:0x7f34d6dce5f8{}[]>
|
|
269
|
+
localhost:48902 >
|
|
270
|
+
[1] planned_move! started to plan
|
|
271
|
+
[1] planned_move!: Roby::Task:0x7f34d6dce5f8{}[] has been replaced by MoveTo:0x7f34d6db7358{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[]
|
|
272
|
+
[1] planned_move!: task MoveTo:0x7f34d6db7358{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] started
|
|
273
|
+
[1] planned_move!: task MoveTo:0x7f34d6db7358{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] finished successfully
|
|
274
|
+
[1] planned_move!: task MoveTo:0x7f34d6db7358{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] has been removed
|
|
275
|
+
~~~
|
|
275
276
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Tutorials
|
|
3
|
+
sort_info: 0
|
|
4
|
+
---
|
|
5
|
+
This section will present the basics of plan management using Roby, this time
|
|
6
|
+
with concrete examples. It assumes that you already have read the
|
|
7
|
+
[concepts](../concepts) section.
|
|
8
|
+
|
|
9
|
+
* the two core objects used in Roby to represent the robot's actions
|
|
10
|
+
* what is a Roby application and how create one
|
|
11
|
+
* how it is possible to interact with a running Roby application
|
|
12
|
+
* how to build complex actions from simple ones
|
|
13
|
+
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Using Plan Display
|
|
3
|
+
sort_info: 600
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
What we will see in this page is how to trace the execution flow (the flow of
|
|
7
|
+
events), and understand a bit more how the plans you will build are actually
|
|
8
|
+
executed by the system. We will re-use the planned\_move planning action we just
|
|
9
|
+
built.
|
|
10
|
+
|
|
11
|
+
Getting a log file
|
|
12
|
+
------------------
|
|
13
|
+
|
|
14
|
+
Using logging is the most common case, so it is enabled by default. However, it
|
|
15
|
+
is can be expensive from a CPU point of view. To disable, edit config/app.yml
|
|
16
|
+
and comment "events: false" around line 23.
|
|
17
|
+
{: .block}
|
|
18
|
+
|
|
19
|
+
Run the controller again
|
|
20
|
+
|
|
21
|
+
# roby run -rgoForward -c
|
|
22
|
+
|
|
23
|
+
and in the shell, do
|
|
24
|
+
|
|
25
|
+
localhost:48902 > planned_move! :x => 10, :y => 20 => #<service Roby::Task:0x7f48f073d6e8{}[]>
|
|
26
|
+
localhost:48902 >
|
|
27
|
+
[1] planned_move! started to plan
|
|
28
|
+
[1] planned_move!: Roby::Task:0x7f48f073d6e8{}[] has been replaced by MoveTo:0x7f48f0726448{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[]
|
|
29
|
+
[1] planned_move!: task MoveTo:0x7f48f0726448{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] started
|
|
30
|
+
[1] planned_move!: task MoveTo:0x7f48f0726448{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] finished successfully
|
|
31
|
+
[1] planned_move!: task MoveTo:0x7f48f0726448{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[] has been removed
|
|
32
|
+
|
|
33
|
+
The log files are saved in the logs/ folder with a name that represents the
|
|
34
|
+
start time of the run (YYYYMMDD-HHMM). The last run (or the current run, if it
|
|
35
|
+
is still running) is symlinked to logs/current. One can use
|
|
36
|
+
|
|
37
|
+
roby results plan_display_tutorial
|
|
38
|
+
|
|
39
|
+
to rename the folder to YYYYMMDD-HHMM_plan_display_tutorial, so that finding
|
|
40
|
+
this particular dataset later is easier.
|
|
41
|
+
|
|
42
|
+
Displaying the log file
|
|
43
|
+
-----------------------
|
|
44
|
+
List the contents of the generated log directory:
|
|
45
|
+
|
|
46
|
+
$ cd /home/doudou/dev/roby-tutorials/
|
|
47
|
+
$ ls logs/current/
|
|
48
|
+
goForward-events.log
|
|
49
|
+
goForward-index.log
|
|
50
|
+
|
|
51
|
+
If you look into it, two goForward files are present:
|
|
52
|
+
<tt>goForward-events.log</tt> and "goForward-index.log". The first one includes
|
|
53
|
+
a trace of everything that happens in the Roby controller which has been traced
|
|
54
|
+
(which virtually includes everything). The second one can actually be generated
|
|
55
|
+
from data in the first one. It is simply used to speed up operations.
|
|
56
|
+
|
|
57
|
+
The data in the event log can be used to display the plan operations in a GUI.
|
|
58
|
+
For that, you need to have installed [Ruby/Qt4](http://korundum.rubyforge.org), as
|
|
59
|
+
the GUI is written using Qt and Ruby. This can be done by installing the
|
|
60
|
+
qtbindings rubygem.
|
|
61
|
+
|
|
62
|
+
To start it, simply do the following in the directory of the log files:
|
|
63
|
+
|
|
64
|
+
$ roby display logs/current/goForward-events.log
|
|
65
|
+
|
|
66
|
+
The following two windows should appear:
|
|
67
|
+
|
|
68
|
+

|
|
69
|
+
|
|
70
|
+
The right window is the replay control. It displays the execution cycles in
|
|
71
|
+
which something happened (an event has been emitted or the plan got modified).
|
|
72
|
+
The left window represents the plan structure at the currently selected cycle,
|
|
73
|
+
the events that got emitted during this cycle as well as the propagation between
|
|
74
|
+
these events. The set of task relations that should be displayed can be selected
|
|
75
|
+
by going into View/Configure.
|
|
76
|
+
|
|
77
|
+
**Very important note** your own display may not look exactly like the ones
|
|
78
|
+
displayed here. Some of the features showed here (like threaded planning) are
|
|
79
|
+
asynchronous and as such the exact displays depend on the execution timing. Note
|
|
80
|
+
that, even though it is the case, the robot _behaviour_ remains unchanged.
|
|
81
|
+
{: .warning}
|
|
82
|
+
|
|
83
|
+
Startup of the "planned\_move!" action {#planning}
|
|
84
|
+
---------------------------------------
|
|
85
|
+
|
|
86
|
+
Let's get to the first task-related events. Click on the first element in
|
|
87
|
+
execution history (cycle @13 in the right window above). It should look like the
|
|
88
|
+
next image:
|
|
89
|
+
|
|
90
|
+

|
|
91
|
+
|
|
92
|
+
What you see here is a representation of the plan built when the planned\_move!
|
|
93
|
+
command is entered in the shell. It consists of a generic task (Roby::Task)
|
|
94
|
+
which is planned\_by a Roby::PlanningTask. This is how Roby handles action
|
|
95
|
+
requests from the shell: (i) it searches a planner defined for that robot with
|
|
96
|
+
the specific action and (ii) generates the plan representing the planning
|
|
97
|
+
process _in a separate thread_.
|
|
98
|
+
|
|
99
|
+
Once that initial plan has been built, the Roby::PlanningTask task has been
|
|
100
|
+
started. The various cases of event propagation are represented in different
|
|
101
|
+
ways, based on whether or not the event is controlable or contingent, if it has been
|
|
102
|
+
called and/or emitted. Finally, two different arrow representations are used for
|
|
103
|
+
signalling (plain) and forwarding (dotted):
|
|
104
|
+
|
|
105
|
+

|
|
106
|
+
|
|
107
|
+
A note about propagation representation: it would be useless to represent all
|
|
108
|
+
the event propagation from the beginning of the execution to the current point.
|
|
109
|
+
The display therefore represents only the propagations that have taken place
|
|
110
|
+
_within the selected cycle_. In our case, we see that, in this cycle, the
|
|
111
|
+
planning task "start" event has been called and emitted.
|
|
112
|
+
|
|
113
|
+
The MoveTo plan
|
|
114
|
+
---------------
|
|
115
|
+
|
|
116
|
+
Advance one step (to the next cycle)
|
|
117
|
+
|
|
118
|
+

|
|
119
|
+
|
|
120
|
+
The MoveTo action has been planned and the executed plan is modified to reflect
|
|
121
|
+
that. The MoveTo action itself is then started, and that is propagated to the
|
|
122
|
+
ComputePath 'start' event through the signalling relation that was established
|
|
123
|
+
in planned\_move.
|
|
124
|
+
|
|
125
|
+
Next execution step gives us the following:
|
|
126
|
+
|
|
127
|
+

|
|
128
|
+
|
|
129
|
+
ComputePath emitted its "success" event. We see here that the emission of the
|
|
130
|
+
"success" event of that task does not mean 'the plan modification has just took
|
|
131
|
+
place' but instead that 'it has taken place some time earlier'.
|
|
132
|
+
|
|
133
|
+
The ComputePath task has also finished generating the path, which is why
|
|
134
|
+
ExecutePath is started. Here, the dotted lines between the events
|
|
135
|
+
represent a forwarding relation between them, while the plain lines
|
|
136
|
+
represent signal relations.
|
|
137
|
+
|
|
138
|
+
Finally, light grey here represents tasks that have finished with the "success"
|
|
139
|
+
event. Tasks whose "failed" event has been emitted are represented in red.
|
|
140
|
+
|
|
141
|
+
To finish: the garbage collection process
|
|
142
|
+
-----------------------------------------
|
|
143
|
+
|
|
144
|
+
Advance a few more steps.
|
|
145
|
+
|
|
146
|
+

|
|
147
|
+
|
|
148
|
+
Here, ExecutePath has finished its execution with success and MoveTo is
|
|
149
|
+
therefore finished as well -- per the forwarding relation between those two
|
|
150
|
+
events. Note that the tasks have this thick dark grey contour. It means that the
|
|
151
|
+
task got [garbage collected](../concepts/garbage_collection.html) in this cycle,
|
|
152
|
+
i.e. removed from the plan because it was not useful anymore.
|
|
153
|
+
|
|
File without changes
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Interactive Shell
|
|
3
|
+
sort_info: 400
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
As we saw earlier, the execution of Roby applications is done by an _event
|
|
7
|
+
loop_. The reactivity of the supervision system obviously depend on the
|
|
8
|
+
non-interruption of that event loop. Therefore, in a Roby application, the user
|
|
9
|
+
runs a remote shell that is used to send specific commands to the Roby
|
|
10
|
+
application itself.
|
|
11
|
+
|
|
12
|
+
Actions
|
|
13
|
+
--------
|
|
14
|
+
Right now, we saw two different places where code is stored:
|
|
15
|
+
|
|
16
|
+
1. the models/tasks/ files, where task models are defined
|
|
17
|
+
2. the scripts/controllers/ files, which is the startup code for the application
|
|
18
|
+
|
|
19
|
+
What we will see in this section is a third component: the **action
|
|
20
|
+
interfaces**. They define what the robot can do, i.e. the overall actions that
|
|
21
|
+
it is able to realize. What we will see here is that they also are the user
|
|
22
|
+
interface of the robot.
|
|
23
|
+
|
|
24
|
+
Exporting actions to the user's shell
|
|
25
|
+
-------------------------------------
|
|
26
|
+
|
|
27
|
+
Edit models/actions/goForward/main.rb and edit so that it looks like this:
|
|
28
|
+
|
|
29
|
+
~~~ ruby
|
|
30
|
+
require 'models/actions/main'
|
|
31
|
+
class Main
|
|
32
|
+
describe('moves the robot in a forward direction').
|
|
33
|
+
required_arg('speed', 'the speed in m/s at which the robot should move')
|
|
34
|
+
def move(arguments)
|
|
35
|
+
GoForward.new :speed => arguments[:speed]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
~~~
|
|
39
|
+
|
|
40
|
+
That defines a very simple 'move' action. Now, we can try it out in the
|
|
41
|
+
Roby shell. First, remove the last three lines in scripts/controllers/goForward.rb so
|
|
42
|
+
that it looks like this:
|
|
43
|
+
|
|
44
|
+
{coderay:: ruby}
|
|
45
|
+
# Define the original value of x
|
|
46
|
+
State.pos.x = 0
|
|
47
|
+
|
|
48
|
+
# Will display the value of x every 1 second
|
|
49
|
+
Roby.every(1) do
|
|
50
|
+
puts State.pos.x
|
|
51
|
+
end
|
|
52
|
+
{coderay}
|
|
53
|
+
|
|
54
|
+
Start the roby application in one console:
|
|
55
|
+
|
|
56
|
+
$ roby run -rgoForward -c
|
|
57
|
+
44848:44:51.498 (Roby) GC.enable does not accept an argument. GC will not be controlled by Roby
|
|
58
|
+
344848:44:51.581 (goForward) loaded Roby 0.7.90 on ruby 1.8.7 (2008-08-11 patchlevel 72) [powerpc-linux]
|
|
59
|
+
344848:44:51.603 (goForward) loading controller file /home/doudou/dev/roby-tutorials/controllers/goForward.rb
|
|
60
|
+
344848:44:51.605 (goForward) done initialization
|
|
61
|
+
0
|
|
62
|
+
0
|
|
63
|
+
|
|
64
|
+
Finally, start the shell in another console:
|
|
65
|
+
|
|
66
|
+
$ roby shell
|
|
67
|
+
localhost:48902 >
|
|
68
|
+
|
|
69
|
+
Note that the shell does not have to be executed on the same machine than the controller.
|
|
70
|
+
You can connect remotely with the --host option. Moreover, even though it
|
|
71
|
+
requires a controller to be running when it starts, it will reconnect
|
|
72
|
+
automatically afterwards.
|
|
73
|
+
{: .note}
|
|
74
|
+
|
|
75
|
+
The new prompt you get is a Ruby prompt (i.e. you should type Ruby code in it).
|
|
76
|
+
Some special commands are available to interact with the Roby controller. For
|
|
77
|
+
instance:
|
|
78
|
+
|
|
79
|
+
~~~ ruby
|
|
80
|
+
localhost:48902 > describe move
|
|
81
|
+
~~~
|
|
82
|
+
|
|
83
|
+
The 'help' command lists the available actions that are exported
|
|
84
|
+
through the Main class. Let's try it (**notice the '!' at the end of
|
|
85
|
+
move!**):
|
|
86
|
+
|
|
87
|
+
~~~ ruby
|
|
88
|
+
localhost:48902 > move! :speed => 1
|
|
89
|
+
=> #<service Roby::Task:0x7f06da2ab308{}[]>
|
|
90
|
+
localhost:48902 >
|
|
91
|
+
[1] move! started to plan
|
|
92
|
+
[1] move!: Roby::Task:0x7f06da2ab308{}[] has been replaced by GoForward:0x7f06da28f298{speed => 1}[]
|
|
93
|
+
[1] move!: task GoForward:0x7f06da28f298{speed => 1}[] started
|
|
94
|
+
> kill_job 1
|
|
95
|
+
[1] move!: task GoForward:0x7f06da28f298{speed => 1}[] failed
|
|
96
|
+
[1] move!: task GoForward:0x7f06da28f298{speed => 1}[] has been removed
|
|
97
|
+
~~~
|
|
98
|
+
|
|
99
|
+
The __intent__ to run the move is first added to the plan. Then, it gets
|
|
100
|
+
developped by calling the action interface (the "started to plan" stanza), and
|
|
101
|
+
the result replaces the placeholder task ("has been replaced by ..."). It then
|
|
102
|
+
becomes eligible for [scheduling](../concepts/execution.html#scheduling) and is started.
|
|
103
|
+
|
|
104
|
+
The value returned by the move! call can also be manipulated as if it was a task itself. For instance:
|
|
105
|
+
|
|
106
|
+
~~~ ruby
|
|
107
|
+
> t = move! :speed => 1
|
|
108
|
+
=> #<service Roby::Task:0x7f06da2ab308{}[]>
|
|
109
|
+
[1] move! started to plan
|
|
110
|
+
[1] move!: Roby::Task:0x7f06da2ab308{}[] has been replaced by GoForward:0x7f06da28f298{speed => 1}[]
|
|
111
|
+
[1] move!: task GoForward:0x7f06da28f298{speed => 1}[] started
|
|
112
|
+
> t.running?
|
|
113
|
+
=> true
|
|
114
|
+
> t.stop!
|
|
115
|
+
[3] move!: task GoForward:0x7f06da215e20{speed => 1}[] failed
|
|
116
|
+
[3] move!: task GoForward:0x7f06da215e20{speed => 1}[] has been removed
|
|
117
|
+
~~~
|
|
118
|
+
|
|
119
|
+
The action interface is described in details in the section about [Building Roby
|
|
120
|
+
applications](../building). The shell in the section about [interacting with
|
|
121
|
+
Roby applications](../interacting).
|