roby 0.8.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.deep-cover.rb +3 -0
- data/.gitattributes +1 -0
- data/.gitignore +24 -0
- data/.simplecov +10 -0
- data/.travis.yml +17 -0
- data/.yardopts +4 -0
- data/Gemfile +15 -0
- data/README.md +11 -0
- data/Rakefile +47 -177
- data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
- data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
- data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
- data/benchmark/{genom.rb → attic/genom.rb} +0 -0
- data/benchmark/attic/transactions.rb +62 -0
- data/benchmark/plan_basic_operations.rb +28 -0
- data/benchmark/relations/graph.rb +63 -0
- data/benchmark/ruby/identity.rb +18 -0
- data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
- data/benchmark/ruby/yield_vs_block.rb +35 -0
- data/benchmark/run +5 -0
- data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
- data/benchmark/transactions.rb +99 -51
- data/bin/roby +38 -197
- data/bin/roby-display +14 -0
- data/bin/roby-log +3 -176
- data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
- data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
- data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
- data/doc/guide/{src → attic}/abstraction/index.page +1 -1
- data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
- data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
- data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
- data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
- data/doc/guide/attic/cycle/error_handling.page +98 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
- data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
- data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
- data/doc/guide/{src → attic}/cycle/index.page +1 -1
- data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
- data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
- data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
- data/doc/guide/attic/plans/building_plans.page +89 -0
- data/doc/guide/attic/plans/code.page +192 -0
- data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
- data/doc/guide/attic/plans/index.page +7 -0
- data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
- data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
- data/doc/guide/attic/plans/querying_plans.page +5 -0
- data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
- data/doc/guide/config.yaml +7 -4
- data/doc/guide/ext/extended_menu.rb +29 -0
- data/doc/guide/ext/init.rb +6 -0
- data/doc/guide/ext/rdoc_links.rb +7 -6
- data/doc/guide/src/advanced_concepts/history.page +5 -0
- data/doc/guide/src/advanced_concepts/index.page +11 -0
- data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
- data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
- data/doc/guide/src/advanced_concepts/transactions.page +5 -0
- data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
- data/doc/guide/src/base.template +96 -0
- data/doc/guide/src/basics_shell_header.txt +5 -7
- data/doc/guide/src/building/action_coordination.page +96 -0
- data/doc/guide/src/building/actions.page +124 -0
- data/doc/guide/src/building/file_layout.page +71 -0
- data/doc/guide/src/building/index.page +50 -0
- data/doc/guide/src/building/patterns.page +86 -0
- data/doc/guide/src/building/patterns_forwarding.png +0 -0
- data/doc/guide/src/building/patterns_forwarding.svg +277 -0
- data/doc/guide/src/building/runtime.page +95 -0
- data/doc/guide/src/building/task_models.page +94 -0
- data/doc/guide/src/building/tasks.page +284 -0
- data/doc/guide/src/concepts/error_handling.page +100 -0
- data/doc/guide/src/concepts/exception_propagation.png +0 -0
- data/doc/guide/src/concepts/exception_propagation.svg +445 -0
- data/doc/guide/src/concepts/execution.page +85 -0
- data/doc/guide/src/concepts/execution.png +0 -0
- data/doc/guide/src/concepts/execution.svg +573 -0
- data/doc/guide/src/concepts/execution_cycle.png +0 -0
- data/doc/guide/src/concepts/garbage_collection.page +57 -0
- data/doc/guide/src/concepts/index.page +27 -0
- data/doc/guide/src/concepts/plans.page +101 -0
- data/doc/guide/src/concepts/policy.page +31 -0
- data/doc/guide/src/concepts/reactor.page +61 -0
- data/doc/guide/src/concepts/simple_plan_example.png +0 -0
- data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
- data/doc/guide/src/default.template +9 -74
- data/doc/guide/src/event_relations/forward.page +71 -0
- data/doc/guide/src/event_relations/index.page +12 -0
- data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
- data/doc/guide/src/event_relations/signal.page +55 -0
- data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
- data/doc/guide/src/htmldoc.metainfo +21 -8
- data/doc/guide/src/index.page +8 -3
- data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
- data/doc/guide/src/installation/publications.page +14 -0
- data/doc/guide/src/{introduction → installation}/videos.page +14 -7
- data/doc/guide/src/interacting/index.page +16 -0
- data/doc/guide/src/interacting/run.page +33 -0
- data/doc/guide/src/interacting/shell.page +95 -0
- data/doc/guide/src/plugins/creating_plugins.page +72 -0
- data/doc/guide/src/plugins/index.page +27 -5
- data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
- data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
- data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
- data/doc/guide/src/style_screen.css +687 -0
- data/doc/guide/src/task_relations/dependency.page +107 -0
- data/doc/guide/src/task_relations/executed_by.page +77 -0
- data/doc/guide/src/task_relations/index.page +12 -0
- data/doc/guide/src/task_relations/new_relations.page +119 -0
- data/doc/guide/src/task_relations/planned_by.page +46 -0
- data/doc/guide/src/tutorial/app.page +117 -0
- data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
- data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
- data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
- data/doc/guide/src/tutorial/events.page +195 -0
- data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
- data/doc/guide/src/tutorial/index.page +13 -0
- data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
- data/doc/guide/src/tutorial/relations_display.page +153 -0
- data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
- data/doc/guide/src/tutorial/shell.page +121 -0
- data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
- data/doc/guide/src/tutorial/tasks.page +374 -0
- data/lib/roby.rb +102 -47
- data/lib/roby/actions.rb +17 -0
- data/lib/roby/actions/action.rb +80 -0
- data/lib/roby/actions/interface.rb +45 -0
- data/lib/roby/actions/library.rb +23 -0
- data/lib/roby/actions/models/action.rb +224 -0
- data/lib/roby/actions/models/coordination_action.rb +58 -0
- data/lib/roby/actions/models/interface.rb +22 -0
- data/lib/roby/actions/models/interface_base.rb +294 -0
- data/lib/roby/actions/models/library.rb +12 -0
- data/lib/roby/actions/models/method_action.rb +90 -0
- data/lib/roby/actions/task.rb +114 -0
- data/lib/roby/and_generator.rb +125 -0
- data/lib/roby/app.rb +2795 -829
- data/lib/roby/app/autotest_console_reporter.rb +138 -0
- data/lib/roby/app/base.rb +21 -0
- data/lib/roby/app/cucumber.rb +2 -0
- data/lib/roby/app/cucumber/controller.rb +439 -0
- data/lib/roby/app/cucumber/helpers.rb +280 -0
- data/lib/roby/app/cucumber/world.rb +32 -0
- data/lib/roby/app/debug.rb +136 -0
- data/lib/roby/app/gen.rb +2 -0
- data/lib/roby/app/rake.rb +178 -38
- data/lib/roby/app/robot_config.rb +9 -0
- data/lib/roby/app/robot_names.rb +115 -0
- data/lib/roby/app/run.rb +3 -2
- data/lib/roby/app/scripts.rb +72 -0
- data/lib/roby/app/scripts/autotest.rb +173 -0
- data/lib/roby/app/scripts/display.rb +2 -0
- data/lib/roby/app/scripts/restart.rb +52 -0
- data/lib/roby/app/scripts/results.rb +17 -8
- data/lib/roby/app/scripts/run.rb +155 -24
- data/lib/roby/app/scripts/shell.rb +147 -62
- data/lib/roby/app/scripts/test.rb +107 -22
- data/lib/roby/app/test_reporter.rb +74 -0
- data/lib/roby/app/test_server.rb +159 -0
- data/lib/roby/app/vagrant.rb +47 -0
- data/lib/roby/backports.rb +16 -0
- data/lib/roby/cli/display.rb +190 -0
- data/lib/roby/cli/exceptions.rb +17 -0
- data/lib/roby/cli/gen/actions/class.rb +5 -0
- data/lib/roby/cli/gen/actions/test.rb +6 -0
- data/lib/roby/cli/gen/app/.yardopts +6 -0
- data/lib/roby/cli/gen/app/README.md +28 -0
- data/lib/roby/cli/gen/app/Rakefile +15 -0
- data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
- data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
- data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
- data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
- data/lib/roby/cli/gen/class/class.rb +6 -0
- data/lib/roby/cli/gen/class/test.rb +7 -0
- data/lib/roby/cli/gen/helpers.rb +203 -0
- data/lib/roby/cli/gen/module/module.rb +5 -0
- data/lib/roby/cli/gen/module/test.rb +6 -0
- data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
- data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
- data/lib/roby/cli/gen/task/class.rb +44 -0
- data/lib/roby/cli/gen/task/test.rb +6 -0
- data/lib/roby/cli/gen_main.rb +120 -0
- data/lib/roby/cli/log.rb +276 -0
- data/lib/roby/cli/log/flamegraph.html +499 -0
- data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
- data/lib/roby/cli/main.rb +153 -0
- data/lib/roby/coordination.rb +60 -0
- data/lib/roby/coordination/action_script.rb +25 -0
- data/lib/roby/coordination/action_state_machine.rb +125 -0
- data/lib/roby/coordination/actions.rb +106 -0
- data/lib/roby/coordination/base.rb +145 -0
- data/lib/roby/coordination/calculus.rb +40 -0
- data/lib/roby/coordination/child.rb +28 -0
- data/lib/roby/coordination/event.rb +29 -0
- data/lib/roby/coordination/fault_handler.rb +25 -0
- data/lib/roby/coordination/fault_handling_task.rb +13 -0
- data/lib/roby/coordination/fault_response_table.rb +110 -0
- data/lib/roby/coordination/models/action_script.rb +64 -0
- data/lib/roby/coordination/models/action_state_machine.rb +224 -0
- data/lib/roby/coordination/models/actions.rb +191 -0
- data/lib/roby/coordination/models/arguments.rb +55 -0
- data/lib/roby/coordination/models/base.rb +176 -0
- data/lib/roby/coordination/models/capture.rb +86 -0
- data/lib/roby/coordination/models/child.rb +35 -0
- data/lib/roby/coordination/models/event.rb +41 -0
- data/lib/roby/coordination/models/exceptions.rb +42 -0
- data/lib/roby/coordination/models/fault_handler.rb +219 -0
- data/lib/roby/coordination/models/fault_response_table.rb +77 -0
- data/lib/roby/coordination/models/root.rb +22 -0
- data/lib/roby/coordination/models/script.rb +283 -0
- data/lib/roby/coordination/models/task.rb +184 -0
- data/lib/roby/coordination/models/task_from_action.rb +50 -0
- data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
- data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
- data/lib/roby/coordination/models/task_from_variable.rb +27 -0
- data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
- data/lib/roby/coordination/models/variable.rb +32 -0
- data/lib/roby/coordination/script.rb +200 -0
- data/lib/roby/coordination/script_instruction.rb +12 -0
- data/lib/roby/coordination/task.rb +45 -0
- data/lib/roby/coordination/task_base.rb +69 -0
- data/lib/roby/coordination/task_script.rb +293 -0
- data/lib/roby/coordination/task_state_machine.rb +308 -0
- data/lib/roby/decision_control.rb +33 -21
- data/lib/roby/distributed_object.rb +76 -0
- data/lib/roby/droby.rb +17 -0
- data/lib/roby/droby/droby_id.rb +6 -0
- data/lib/roby/droby/enable.rb +153 -0
- data/lib/roby/droby/event_logger.rb +189 -0
- data/lib/roby/droby/event_logging.rb +57 -0
- data/lib/roby/droby/exceptions.rb +14 -0
- data/lib/roby/droby/identifiable.rb +22 -0
- data/lib/roby/droby/logfile.rb +141 -0
- data/lib/roby/droby/logfile/client.rb +176 -0
- data/lib/roby/droby/logfile/file_format.md +97 -0
- data/lib/roby/droby/logfile/index.rb +117 -0
- data/lib/roby/droby/logfile/reader.rb +139 -0
- data/lib/roby/droby/logfile/server.rb +199 -0
- data/lib/roby/droby/logfile/writer.rb +114 -0
- data/lib/roby/droby/marshal.rb +264 -0
- data/lib/roby/droby/marshallable.rb +12 -0
- data/lib/roby/droby/null_event_logger.rb +25 -0
- data/lib/roby/droby/object_manager.rb +205 -0
- data/lib/roby/droby/peer_id.rb +6 -0
- data/lib/roby/droby/plan_rebuilder.rb +373 -0
- data/lib/roby/droby/rebuilt_plan.rb +160 -0
- data/lib/roby/droby/remote_droby_id.rb +6 -0
- data/lib/roby/droby/timepoints.rb +205 -0
- data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
- data/lib/roby/droby/timepoints_ctf.rb +125 -0
- data/lib/roby/droby/v5.rb +14 -0
- data/lib/roby/droby/v5/builtin.rb +120 -0
- data/lib/roby/droby/v5/droby_class.rb +45 -0
- data/lib/roby/droby/v5/droby_constant.rb +81 -0
- data/lib/roby/droby/v5/droby_dump.rb +1026 -0
- data/lib/roby/droby/v5/droby_id.rb +44 -0
- data/lib/roby/droby/v5/droby_model.rb +82 -0
- data/lib/roby/droby/v5/peer_id.rb +10 -0
- data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
- data/lib/roby/event.rb +79 -957
- data/lib/roby/event_constraints.rb +835 -0
- data/lib/roby/event_generator.rb +1047 -0
- data/lib/roby/event_structure/causal_link.rb +6 -0
- data/lib/roby/event_structure/forwarding.rb +6 -0
- data/lib/roby/event_structure/precedence.rb +7 -0
- data/lib/roby/event_structure/signal.rb +8 -0
- data/lib/roby/event_structure/temporal_constraints.rb +640 -0
- data/lib/roby/exceptions.rb +446 -152
- data/lib/roby/executable_plan.rb +549 -0
- data/lib/roby/execution_engine.rb +1997 -950
- data/lib/roby/filter_generator.rb +26 -0
- data/lib/roby/gui/chronicle_view.rb +225 -0
- data/lib/roby/gui/chronicle_widget.rb +925 -0
- data/lib/roby/gui/dot_id.rb +11 -0
- data/lib/roby/gui/exception_view.rb +44 -0
- data/lib/roby/gui/log_display.rb +273 -0
- data/lib/roby/gui/model_views.rb +2 -0
- data/lib/roby/gui/model_views/action_interface.rb +53 -0
- data/lib/roby/gui/model_views/task.rb +47 -0
- data/lib/roby/gui/model_views/task.rhtml +41 -0
- data/lib/roby/gui/object_info_view.rb +89 -0
- data/lib/roby/gui/plan_dot_layout.rb +427 -0
- data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
- data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
- data/lib/roby/gui/relations_view.rb +278 -0
- data/lib/roby/gui/relations_view/relations.ui +139 -0
- data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
- data/lib/roby/gui/relations_view/relations_config.rb +292 -0
- data/lib/roby/gui/relations_view/relations_view.ui +53 -0
- data/lib/roby/gui/scheduler_view.css +24 -0
- data/lib/roby/gui/scheduler_view.rb +46 -0
- data/lib/roby/gui/scheduler_view.rhtml +53 -0
- data/lib/roby/gui/stepping.rb +93 -0
- data/lib/roby/gui/stepping.ui +181 -0
- data/lib/roby/gui/styles.rb +81 -0
- data/lib/roby/gui/task_display_configuration.rb +42 -0
- data/lib/roby/gui/task_state_at.rb +38 -0
- data/lib/roby/hooks.rb +26 -0
- data/lib/roby/interface.rb +136 -469
- data/lib/roby/interface/async.rb +20 -0
- data/lib/roby/interface/async/action_monitor.rb +188 -0
- data/lib/roby/interface/async/interface.rb +498 -0
- data/lib/roby/interface/async/job_monitor.rb +213 -0
- data/lib/roby/interface/async/log.rb +238 -0
- data/lib/roby/interface/async/new_job_listener.rb +79 -0
- data/lib/roby/interface/async/ui_connector.rb +183 -0
- data/lib/roby/interface/client.rb +553 -0
- data/lib/roby/interface/command.rb +24 -0
- data/lib/roby/interface/command_argument.rb +16 -0
- data/lib/roby/interface/command_library.rb +92 -0
- data/lib/roby/interface/droby_channel.rb +174 -0
- data/lib/roby/interface/exceptions.rb +22 -0
- data/lib/roby/interface/interface.rb +655 -0
- data/lib/roby/interface/job.rb +47 -0
- data/lib/roby/interface/rest.rb +10 -0
- data/lib/roby/interface/rest/api.rb +29 -0
- data/lib/roby/interface/rest/helpers.rb +24 -0
- data/lib/roby/interface/rest/server.rb +212 -0
- data/lib/roby/interface/server.rb +154 -0
- data/lib/roby/interface/shell_client.rb +468 -0
- data/lib/roby/interface/shell_subcommand.rb +24 -0
- data/lib/roby/interface/subcommand_client.rb +35 -0
- data/lib/roby/interface/tcp.rb +168 -0
- data/lib/roby/models/arguments.rb +112 -0
- data/lib/roby/models/plan_object.rb +83 -0
- data/lib/roby/models/task.rb +835 -0
- data/lib/roby/models/task_event.rb +62 -0
- data/lib/roby/models/task_service.rb +78 -0
- data/lib/roby/or_generator.rb +88 -0
- data/lib/roby/plan.rb +1751 -864
- data/lib/roby/plan_object.rb +611 -0
- data/lib/roby/plan_service.rb +200 -0
- data/lib/roby/promise.rb +332 -0
- data/lib/roby/queries.rb +23 -0
- data/lib/roby/queries/and_matcher.rb +32 -0
- data/lib/roby/queries/any.rb +27 -0
- data/lib/roby/queries/code_error_matcher.rb +58 -0
- data/lib/roby/queries/event_generator_matcher.rb +9 -0
- data/lib/roby/queries/execution_exception_matcher.rb +165 -0
- data/lib/roby/queries/index.rb +165 -0
- data/lib/roby/queries/localized_error_matcher.rb +149 -0
- data/lib/roby/queries/matcher_base.rb +107 -0
- data/lib/roby/queries/none.rb +27 -0
- data/lib/roby/queries/not_matcher.rb +30 -0
- data/lib/roby/queries/op_matcher.rb +8 -0
- data/lib/roby/queries/or_matcher.rb +30 -0
- data/lib/roby/queries/plan_object_matcher.rb +363 -0
- data/lib/roby/queries/query.rb +188 -0
- data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
- data/lib/roby/queries/task_matcher.rb +344 -0
- data/lib/roby/relations.rb +42 -678
- data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
- data/lib/roby/relations/directed_relation_support.rb +268 -0
- data/lib/roby/relations/event_relation_graph.rb +19 -0
- data/lib/roby/relations/fork_merge_visitor.rb +154 -0
- data/lib/roby/relations/graph.rb +533 -0
- data/lib/roby/relations/models/directed_relation_support.rb +11 -0
- data/lib/roby/relations/models/graph.rb +75 -0
- data/lib/roby/relations/models/task_relation_graph.rb +18 -0
- data/lib/roby/relations/space.rb +380 -0
- data/lib/roby/relations/task_relation_graph.rb +20 -0
- data/lib/roby/robot.rb +85 -38
- data/lib/roby/schedulers/basic.rb +155 -25
- data/lib/roby/schedulers/null.rb +20 -0
- data/lib/roby/schedulers/reporting.rb +31 -0
- data/lib/roby/schedulers/state.rb +129 -0
- data/lib/roby/schedulers/temporal.rb +91 -0
- data/lib/roby/singletons.rb +87 -0
- data/lib/roby/standalone.rb +4 -2
- data/lib/roby/standard_errors.rb +405 -82
- data/lib/roby/state.rb +6 -3
- data/lib/roby/state/conf_model.rb +5 -0
- data/lib/roby/state/events.rb +181 -95
- data/lib/roby/state/goal_model.rb +77 -0
- data/lib/roby/state/open_struct.rb +591 -0
- data/lib/roby/state/open_struct_model.rb +68 -0
- data/lib/roby/state/pos.rb +45 -45
- data/lib/roby/state/shapes.rb +11 -11
- data/lib/roby/state/state_model.rb +303 -0
- data/lib/roby/state/task.rb +43 -0
- data/lib/roby/support.rb +88 -148
- data/lib/roby/task.rb +1361 -1750
- data/lib/roby/task_arguments.rb +428 -0
- data/lib/roby/task_event.rb +127 -0
- data/lib/roby/task_event_generator.rb +337 -0
- data/lib/roby/task_service.rb +6 -0
- data/lib/roby/task_structure/conflicts.rb +104 -0
- data/lib/roby/task_structure/dependency.rb +932 -0
- data/lib/roby/task_structure/error_handling.rb +118 -0
- data/lib/roby/task_structure/executed_by.rb +234 -0
- data/lib/roby/task_structure/planned_by.rb +90 -0
- data/lib/roby/tasks/aggregator.rb +37 -0
- data/lib/roby/tasks/external_process.rb +275 -0
- data/lib/roby/tasks/group.rb +27 -0
- data/lib/roby/tasks/null.rb +19 -0
- data/lib/roby/tasks/parallel.rb +43 -0
- data/lib/roby/tasks/sequence.rb +88 -0
- data/lib/roby/tasks/simple.rb +21 -0
- data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
- data/lib/roby/tasks/timeout.rb +17 -0
- data/lib/roby/tasks/virtual.rb +55 -0
- data/lib/roby/template_plan.rb +7 -0
- data/lib/roby/test/aruba_minitest.rb +74 -0
- data/lib/roby/test/assertion.rb +16 -0
- data/lib/roby/test/assertions.rb +490 -0
- data/lib/roby/test/common.rb +368 -591
- data/lib/roby/test/dsl.rb +149 -0
- data/lib/roby/test/error.rb +18 -0
- data/lib/roby/test/event_reporter.rb +83 -0
- data/lib/roby/test/execution_expectations.rb +1134 -0
- data/lib/roby/test/expect_execution.rb +151 -0
- data/lib/roby/test/minitest_helpers.rb +166 -0
- data/lib/roby/test/roby_app_helpers.rb +200 -0
- data/lib/roby/test/run_planners.rb +155 -0
- data/lib/roby/test/self.rb +112 -0
- data/lib/roby/test/spec.rb +198 -0
- data/lib/roby/test/tasks/empty_task.rb +4 -4
- data/lib/roby/test/tasks/goto.rb +28 -27
- data/lib/roby/test/teardown_plans.rb +100 -0
- data/lib/roby/test/testcase.rb +239 -307
- data/lib/roby/test/tools.rb +159 -155
- data/lib/roby/test/validate_state_machine.rb +75 -0
- data/lib/roby/transaction.rb +1125 -0
- data/lib/roby/transaction/event_generator_proxy.rb +63 -0
- data/lib/roby/transaction/plan_object_proxy.rb +99 -0
- data/lib/roby/transaction/plan_service_proxy.rb +43 -0
- data/lib/roby/transaction/proxying.rb +120 -0
- data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
- data/lib/roby/transaction/task_proxy.rb +135 -0
- data/lib/roby/until_generator.rb +30 -0
- data/lib/roby/version.rb +5 -0
- data/lib/roby/yard.rb +169 -0
- data/lib/yard-roby.rb +1 -0
- data/manifest.xml +32 -6
- data/roby.gemspec +59 -0
- metadata +788 -587
- data/Manifest.txt +0 -321
- data/NOTES +0 -4
- data/README.txt +0 -166
- data/TODO.txt +0 -146
- data/app/README.txt +0 -24
- data/app/Rakefile +0 -8
- data/app/config/ROBOT.rb +0 -5
- data/app/config/init.rb +0 -33
- data/app/config/roby.yml +0 -3
- data/app/controllers/ROBOT.rb +0 -2
- data/app/planners/ROBOT/main.rb +0 -6
- data/app/planners/main.rb +0 -5
- data/app/scripts/distributed +0 -3
- data/app/scripts/generate/bookmarks +0 -3
- data/app/scripts/replay +0 -3
- data/app/scripts/results +0 -3
- data/app/scripts/run +0 -3
- data/app/scripts/server +0 -3
- data/app/scripts/shell +0 -3
- data/app/scripts/test +0 -3
- data/app/tasks/.gitattributes +0 -0
- data/app/tasks/ROBOT/.gitattributes +0 -0
- data/bin/roby-shell +0 -25
- data/doc/guide/src/basics/app.page +0 -139
- data/doc/guide/src/basics/index.page +0 -11
- data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/basics/relations_display.page +0 -203
- data/doc/guide/src/basics/shell.page +0 -102
- data/doc/guide/src/default.css +0 -319
- data/doc/guide/src/introduction/index.page +0 -29
- data/doc/guide/src/introduction/publications.page +0 -14
- data/doc/guide/src/relations/dependency.page +0 -89
- data/doc/guide/src/relations/index.page +0 -12
- data/ext/droby/dump.cc +0 -175
- data/ext/droby/extconf.rb +0 -3
- data/ext/graph/algorithm.cc +0 -746
- data/ext/graph/extconf.rb +0 -7
- data/ext/graph/graph.cc +0 -575
- data/ext/graph/graph.hh +0 -183
- data/ext/graph/iterator_sequence.hh +0 -102
- data/ext/graph/undirected_dfs.hh +0 -226
- data/ext/graph/undirected_graph.hh +0 -421
- data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
- data/lib/roby/app/scripts/replay.rb +0 -31
- data/lib/roby/app/scripts/server.rb +0 -18
- data/lib/roby/basic_object.rb +0 -151
- data/lib/roby/config.rb +0 -14
- data/lib/roby/distributed.rb +0 -36
- data/lib/roby/distributed/base.rb +0 -448
- data/lib/roby/distributed/communication.rb +0 -875
- data/lib/roby/distributed/connection_space.rb +0 -616
- data/lib/roby/distributed/distributed_object.rb +0 -206
- data/lib/roby/distributed/drb.rb +0 -62
- data/lib/roby/distributed/notifications.rb +0 -531
- data/lib/roby/distributed/peer.rb +0 -555
- data/lib/roby/distributed/protocol.rb +0 -529
- data/lib/roby/distributed/proxy.rb +0 -343
- data/lib/roby/distributed/subscription.rb +0 -311
- data/lib/roby/distributed/transaction.rb +0 -498
- data/lib/roby/external_process_task.rb +0 -225
- data/lib/roby/graph.rb +0 -160
- data/lib/roby/log.rb +0 -3
- data/lib/roby/log/chronicle.rb +0 -303
- data/lib/roby/log/console.rb +0 -74
- data/lib/roby/log/data_stream.rb +0 -275
- data/lib/roby/log/dot.rb +0 -279
- data/lib/roby/log/event_stream.rb +0 -161
- data/lib/roby/log/file.rb +0 -396
- data/lib/roby/log/gui/basic_display.ui +0 -83
- data/lib/roby/log/gui/basic_display_ui.rb +0 -89
- data/lib/roby/log/gui/chronicle.rb +0 -26
- data/lib/roby/log/gui/chronicle_view.rb +0 -40
- data/lib/roby/log/gui/chronicle_view.ui +0 -70
- data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
- data/lib/roby/log/gui/data_displays.rb +0 -171
- data/lib/roby/log/gui/data_displays.ui +0 -155
- data/lib/roby/log/gui/data_displays_ui.rb +0 -146
- data/lib/roby/log/gui/notifications.rb +0 -26
- data/lib/roby/log/gui/relations.rb +0 -269
- data/lib/roby/log/gui/relations.ui +0 -123
- data/lib/roby/log/gui/relations_ui.rb +0 -120
- data/lib/roby/log/gui/relations_view.rb +0 -185
- data/lib/roby/log/gui/relations_view.ui +0 -149
- data/lib/roby/log/gui/relations_view_ui.rb +0 -144
- data/lib/roby/log/gui/replay.rb +0 -366
- data/lib/roby/log/gui/replay_controls.rb +0 -206
- data/lib/roby/log/gui/replay_controls.ui +0 -282
- data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
- data/lib/roby/log/gui/runtime.rb +0 -130
- data/lib/roby/log/hooks.rb +0 -186
- data/lib/roby/log/logger.rb +0 -203
- data/lib/roby/log/notifications.rb +0 -244
- data/lib/roby/log/plan_rebuilder.rb +0 -468
- data/lib/roby/log/relations.rb +0 -1084
- data/lib/roby/log/server.rb +0 -547
- data/lib/roby/log/sqlite.rb +0 -47
- data/lib/roby/log/timings.rb +0 -233
- data/lib/roby/plan-object.rb +0 -371
- data/lib/roby/planning.rb +0 -13
- data/lib/roby/planning/loops.rb +0 -309
- data/lib/roby/planning/model.rb +0 -1012
- data/lib/roby/planning/task.rb +0 -180
- data/lib/roby/query.rb +0 -655
- data/lib/roby/relations/conflicts.rb +0 -67
- data/lib/roby/relations/dependency.rb +0 -358
- data/lib/roby/relations/ensured.rb +0 -19
- data/lib/roby/relations/error_handling.rb +0 -22
- data/lib/roby/relations/events.rb +0 -7
- data/lib/roby/relations/executed_by.rb +0 -208
- data/lib/roby/relations/influence.rb +0 -10
- data/lib/roby/relations/planned_by.rb +0 -63
- data/lib/roby/state/information.rb +0 -55
- data/lib/roby/state/state.rb +0 -367
- data/lib/roby/task-operations.rb +0 -186
- data/lib/roby/task_index.rb +0 -80
- data/lib/roby/test/distributed.rb +0 -230
- data/lib/roby/test/tasks/simple_task.rb +0 -23
- data/lib/roby/transactions.rb +0 -507
- data/lib/roby/transactions/proxy.rb +0 -325
- data/plugins/fault_injection/History.txt +0 -4
- data/plugins/fault_injection/README.txt +0 -34
- data/plugins/fault_injection/Rakefile +0 -12
- data/plugins/fault_injection/TODO.txt +0 -0
- data/plugins/fault_injection/app.rb +0 -52
- data/plugins/fault_injection/fault_injection.rb +0 -89
- data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
- data/plugins/subsystems/README.txt +0 -37
- data/plugins/subsystems/Rakefile +0 -13
- data/plugins/subsystems/app.rb +0 -182
- data/plugins/subsystems/test/app/README +0 -24
- data/plugins/subsystems/test/app/Rakefile +0 -8
- data/plugins/subsystems/test/app/config/app.yml +0 -71
- data/plugins/subsystems/test/app/config/init.rb +0 -12
- data/plugins/subsystems/test/app/config/roby.yml +0 -3
- data/plugins/subsystems/test/app/planners/main.rb +0 -20
- data/plugins/subsystems/test/app/scripts/distributed +0 -3
- data/plugins/subsystems/test/app/scripts/replay +0 -3
- data/plugins/subsystems/test/app/scripts/results +0 -3
- data/plugins/subsystems/test/app/scripts/run +0 -3
- data/plugins/subsystems/test/app/scripts/server +0 -3
- data/plugins/subsystems/test/app/scripts/shell +0 -3
- data/plugins/subsystems/test/app/scripts/test +0 -3
- data/plugins/subsystems/test/app/tasks/services.rb +0 -15
- data/plugins/subsystems/test/test_subsystems.rb +0 -78
- data/test/distributed/test_communication.rb +0 -195
- data/test/distributed/test_connection.rb +0 -284
- data/test/distributed/test_execution.rb +0 -378
- data/test/distributed/test_mixed_plan.rb +0 -341
- data/test/distributed/test_plan_notifications.rb +0 -238
- data/test/distributed/test_protocol.rb +0 -525
- data/test/distributed/test_query.rb +0 -106
- data/test/distributed/test_remote_plan.rb +0 -491
- data/test/distributed/test_transaction.rb +0 -466
- data/test/mockups/external_process +0 -28
- data/test/mockups/tasks.rb +0 -27
- data/test/planning/test_loops.rb +0 -432
- data/test/planning/test_model.rb +0 -427
- data/test/planning/test_task.rb +0 -126
- data/test/relations/test_conflicts.rb +0 -42
- data/test/relations/test_dependency.rb +0 -324
- data/test/relations/test_ensured.rb +0 -38
- data/test/relations/test_executed_by.rb +0 -224
- data/test/relations/test_planned_by.rb +0 -56
- data/test/suite_core.rb +0 -29
- data/test/suite_distributed.rb +0 -10
- data/test/suite_planning.rb +0 -4
- data/test/suite_relations.rb +0 -8
- data/test/tasks/test_external_process.rb +0 -126
- data/test/tasks/test_thread_task.rb +0 -70
- data/test/test_bgl.rb +0 -528
- data/test/test_event.rb +0 -969
- data/test/test_exceptions.rb +0 -591
- data/test/test_execution_engine.rb +0 -987
- data/test/test_gui.rb +0 -20
- data/test/test_interface.rb +0 -43
- data/test/test_log.rb +0 -125
- data/test/test_log_server.rb +0 -133
- data/test/test_plan.rb +0 -418
- data/test/test_query.rb +0 -424
- data/test/test_relations.rb +0 -260
- data/test/test_state.rb +0 -432
- data/test/test_support.rb +0 -16
- data/test/test_task.rb +0 -1181
- data/test/test_testcase.rb +0 -138
- data/test/test_transactions.rb +0 -610
- data/test/test_transactions_proxy.rb +0 -216
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
class OpenStructModel < OpenStruct
|
|
3
|
+
# Returns the superclass, i.e. the state model this is a refinement on
|
|
4
|
+
attr_reader :superclass
|
|
5
|
+
|
|
6
|
+
def __get(name, create_substruct = true, &update)
|
|
7
|
+
if result = super(name, false, &update)
|
|
8
|
+
return result
|
|
9
|
+
elsif superclass && (result = superclass.__get(name, false, &update))
|
|
10
|
+
if result.kind_of?(OpenStructModel)
|
|
11
|
+
return super(name, true, &update)
|
|
12
|
+
else return result
|
|
13
|
+
end
|
|
14
|
+
elsif create_substruct
|
|
15
|
+
return super
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def __respond_to__(name)
|
|
20
|
+
super || (superclass.__respond_to__(name) if superclass)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def create_subfield(name)
|
|
24
|
+
if superclass
|
|
25
|
+
self.class.new(superclass.get(name), self, name)
|
|
26
|
+
else
|
|
27
|
+
self.class.new(nil, self, name)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def each_member(&block)
|
|
32
|
+
super(&block)
|
|
33
|
+
if superclass
|
|
34
|
+
superclass.each_member do |name, value|
|
|
35
|
+
if !@members.has_key?(name)
|
|
36
|
+
yield(name, value)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def initialize(super_or_obj = nil, attach_to = nil, attach_name = nil)
|
|
43
|
+
@superclass = super_or_obj
|
|
44
|
+
super(nil, attach_to, attach_name)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Base implementation for "leaf" values in an extended struct model
|
|
48
|
+
class Variable
|
|
49
|
+
# The name of this leaf in its parent field
|
|
50
|
+
attr_accessor :name
|
|
51
|
+
|
|
52
|
+
# The parent field
|
|
53
|
+
attr_accessor :field
|
|
54
|
+
|
|
55
|
+
def initialize(field = nil, name = nil)
|
|
56
|
+
@field, @name = field, name
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Returns the full path of this leaf w.r.t. the root of the state
|
|
60
|
+
# structure
|
|
61
|
+
def path
|
|
62
|
+
path = field.path.dup
|
|
63
|
+
path << name
|
|
64
|
+
path
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
data/lib/roby/state/pos.rb
CHANGED
|
@@ -3,13 +3,13 @@ module Roby::Pos
|
|
|
3
3
|
# A (x, y, z) vector
|
|
4
4
|
class Vector3D
|
|
5
5
|
# The vector coordinates
|
|
6
|
-
|
|
6
|
+
attr_accessor :x, :y, :z
|
|
7
7
|
# Initializes a 3D vector
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
def initialize(x = 0, y = 0, z = 0)
|
|
9
|
+
@x, @y, @z = x, y, z
|
|
10
|
+
end
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
def to_s # :nodoc:
|
|
13
13
|
"Vector3D(x=%f,y=%f,z=%f)" % [x,y,z]
|
|
14
14
|
end
|
|
15
15
|
def pretty_print(pp)
|
|
@@ -17,31 +17,31 @@ def pretty_print(pp)
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
# The length of the vector
|
|
20
|
-
|
|
20
|
+
def length; distance(0, 0, 0) end
|
|
21
21
|
# Returns self + v
|
|
22
|
-
|
|
22
|
+
def +(v); Vector3D.new(x + v.x, y + v.y, z + v.z) end
|
|
23
23
|
# Returns self - v
|
|
24
|
-
|
|
24
|
+
def -(v); Vector3D.new(x - v.x, y - v.y, z - v.z) end
|
|
25
25
|
# Returns the product of this vector with the scalar +a+
|
|
26
|
-
|
|
26
|
+
def *(a); Vector3D.new(x * a, y * a, z * a) end
|
|
27
27
|
# Returns the division of this vector with the scalar +a+
|
|
28
|
-
|
|
28
|
+
def /(a); Vector3D.new(x / a, y / a, z / a) end
|
|
29
29
|
# Returns the opposite of this vector
|
|
30
|
-
|
|
30
|
+
def -@; Vector3D.new(-x, -y, -z) end
|
|
31
31
|
|
|
32
32
|
# Returns the [x, y, z] array
|
|
33
|
-
|
|
33
|
+
def xyz; [x, y, z] end
|
|
34
34
|
# True if +v+ is the same vector than +self+
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
def ==(v)
|
|
36
|
+
v.kind_of?(Vector3D) &&
|
|
37
|
+
v.x == x && v.y == y && v.z == z
|
|
38
|
+
end
|
|
39
39
|
|
|
40
40
|
# True if this vector is of zero length. If +tolerance+ is non-zero,
|
|
41
41
|
# returns true if length <= tolerance.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
def null?(tolerance = 0)
|
|
43
|
+
length <= tolerance
|
|
44
|
+
end
|
|
45
45
|
|
|
46
46
|
# call-seq:
|
|
47
47
|
# v.distance2d w
|
|
@@ -53,15 +53,15 @@ def null?(tolerance = 0)
|
|
|
53
53
|
# If +w+ is a scalar, it is taken as the X coordinate and y = 0.
|
|
54
54
|
#
|
|
55
55
|
# In the second form, both +x+ and +y+ must be scalars.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
def distance2d(x = 0, y = nil)
|
|
57
|
+
if !y && x.respond_to?(:x)
|
|
58
|
+
x, y = x.x, x.y
|
|
59
|
+
else
|
|
60
|
+
y ||= 0
|
|
61
|
+
end
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
Math.sqrt( (x - self.x) ** 2 + (y - self.y) ** 2 )
|
|
64
|
+
end
|
|
65
65
|
|
|
66
66
|
# call-seq:
|
|
67
67
|
# v.distance2d w
|
|
@@ -74,35 +74,35 @@ def distance2d(x = 0, y = nil)
|
|
|
74
74
|
# If +w+ is a scalar, it is taken as the X coordinate and y = z = 0.
|
|
75
75
|
#
|
|
76
76
|
# In the second form, both +x+ and +y+ must be scalars and z == 0.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
77
|
+
def distance(x = 0, y = nil, z = nil)
|
|
78
|
+
if !y && x.respond_to?(:x)
|
|
79
|
+
x, y, z = x.x, x.y, x.z
|
|
80
|
+
else
|
|
81
|
+
y ||= 0
|
|
82
|
+
z ||= 0
|
|
83
|
+
end
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
Math.sqrt( (x - self.x) ** 2 + (y - self.y) ** 2 + (z - self.z) ** 2)
|
|
86
|
+
end
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
# This class represents both a position and an orientation
|
|
90
90
|
class Euler3D < Vector3D
|
|
91
91
|
# The orientation angles
|
|
92
|
-
|
|
92
|
+
attr_accessor :yaw, :pitch, :roll
|
|
93
93
|
|
|
94
94
|
# Create an euler position object
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
def initialize(x = 0, y = 0, z = 0, yaw = 0, pitch = 0, roll = 0)
|
|
96
|
+
super(x, y, z)
|
|
97
|
+
@yaw, @pitch, @roll = yaw, pitch, roll
|
|
98
|
+
end
|
|
99
99
|
|
|
100
100
|
# Returns [yaw, pitch, roll]
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
def ypr
|
|
102
|
+
[yaw, pitch, roll]
|
|
103
|
+
end
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
def to_s # :nodoc:
|
|
106
106
|
"Euler3D(x=%f,y=%f,z=%f,y=%f,p=%f,r=%f)" % [x,y,z,yaw,pitch,roll]
|
|
107
107
|
end
|
|
108
108
|
end
|
data/lib/roby/state/shapes.rb
CHANGED
|
@@ -4,11 +4,11 @@ def initialize(radius, height, axis)
|
|
|
4
4
|
@radius, @height, @axis = radius.to_f, height.to_f, axis.to_f
|
|
5
5
|
end
|
|
6
6
|
def diameter(axis)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
if axis == self.axis
|
|
8
|
+
radius * 2
|
|
9
|
+
else
|
|
10
|
+
raise NotImplementedError
|
|
11
|
+
end
|
|
12
12
|
end
|
|
13
13
|
alias :max_length :diameter
|
|
14
14
|
def length; diameter(:z) end
|
|
@@ -18,15 +18,15 @@ def width; diameter(:z) end
|
|
|
18
18
|
class Cube
|
|
19
19
|
attr_accessor :length, :width, :height
|
|
20
20
|
def initialize(length, width, height)
|
|
21
|
-
|
|
21
|
+
@length, @width, @height = length.to_f, width.to_f, height.to_f
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
def max_length(axis)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
if axis == :z
|
|
26
|
+
[length, width].max
|
|
27
|
+
else
|
|
28
|
+
height
|
|
29
|
+
end
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
class Class
|
|
2
|
+
# Implementation of a conversion to StateVariableModel
|
|
3
|
+
#
|
|
4
|
+
# It makes it possible to use a class to initialize a state leaf model with
|
|
5
|
+
#
|
|
6
|
+
# state.model.path.to.value = MyClass
|
|
7
|
+
def to_state_variable_model(field, name)
|
|
8
|
+
model = Roby::StateVariableModel.new(field, name)
|
|
9
|
+
model.type = self
|
|
10
|
+
return model
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
module Roby
|
|
15
|
+
# Representation of a leaf in the state model
|
|
16
|
+
class StateVariableModel < OpenStructModel::Variable
|
|
17
|
+
# Returns the type of this field. nil means any type. It is matched
|
|
18
|
+
# against values using #===
|
|
19
|
+
attr_accessor :type
|
|
20
|
+
|
|
21
|
+
# Returns a data source for that field
|
|
22
|
+
#
|
|
23
|
+
# At this level, the format data source is unspecified. It is meant to
|
|
24
|
+
# be used by other mechanisms to fill the data_source tree in the state
|
|
25
|
+
# object (this is the state model)
|
|
26
|
+
attr_accessor :data_source
|
|
27
|
+
|
|
28
|
+
def to_state_variable_model(field, name)
|
|
29
|
+
result = dup
|
|
30
|
+
result.field = field
|
|
31
|
+
result.name = name
|
|
32
|
+
result
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Representation of a level in the state model
|
|
37
|
+
class StateModel < OpenStructModel
|
|
38
|
+
# Returns the superclass, i.e. the state model this is a refinement on
|
|
39
|
+
attr_reader :superclass
|
|
40
|
+
|
|
41
|
+
def to_s
|
|
42
|
+
"#<StateModel:#{object_id} path=#{path.join("/")} fields=#{@members.keys.sort.join(",")}>"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def initialize(super_or_obj = nil, attach_to = nil, attach_name = nil)
|
|
46
|
+
super(super_or_obj, attach_to, attach_name)
|
|
47
|
+
global_filter do |name, value|
|
|
48
|
+
if value.respond_to?(:to_state_variable_model)
|
|
49
|
+
value.to_state_variable_model(self, name)
|
|
50
|
+
else
|
|
51
|
+
raise ArgumentError, "cannot set #{value} on #{name} in a state model. Only allowed values are StateVariableModel, and values that respond to #to_state_variable_model"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# This methods iterates over the state model, and for each state
|
|
57
|
+
# variable for which a data source model is provided, create the
|
|
58
|
+
# corresponding data source by calling #resolve
|
|
59
|
+
def resolve_data_sources(object, state)
|
|
60
|
+
each_member do |name, field|
|
|
61
|
+
if field.respond_to?(:data_source)
|
|
62
|
+
state.data_sources.set(name, field.data_source.resolve(object))
|
|
63
|
+
else
|
|
64
|
+
field.resolve_data_sources(object, state.__get(name, true))
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Representation of the last known state
|
|
71
|
+
class StateLastValueField < OpenStruct
|
|
72
|
+
def method_missing(name, *args)
|
|
73
|
+
if name =~ /=$/
|
|
74
|
+
raise ArgumentError, "cannot write to a StateLastValueField object"
|
|
75
|
+
end
|
|
76
|
+
return super
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Representation of the data sources in the state
|
|
81
|
+
class StateDataSourceField < OpenStruct
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Representation of a level in the current state
|
|
85
|
+
class StateField < OpenStruct
|
|
86
|
+
def to_s
|
|
87
|
+
"#<StateField:#{object_id} path=#{path.join("/")} fields=#{@members.keys.sort.join(",")}>"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Returns a structure that gives access to the models of the
|
|
91
|
+
# members of this struct. I.e.
|
|
92
|
+
#
|
|
93
|
+
# state.pose.model.position
|
|
94
|
+
#
|
|
95
|
+
# is the model for state.pose.position
|
|
96
|
+
#
|
|
97
|
+
# Due to the use of open structures, one should always check for the
|
|
98
|
+
# presence of the field first with
|
|
99
|
+
#
|
|
100
|
+
# if state.pose.model.position?
|
|
101
|
+
# # do something with state.pose.model.position
|
|
102
|
+
# end
|
|
103
|
+
#
|
|
104
|
+
# Note that the models are accessible from any level, i.e.
|
|
105
|
+
# state.model.pose.position is an equivalent of the above example.
|
|
106
|
+
def model
|
|
107
|
+
@model
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Returns a structure that gives access to the last known values for the
|
|
111
|
+
# members of this struct. I.e.
|
|
112
|
+
#
|
|
113
|
+
# state.pose.last_known.position
|
|
114
|
+
#
|
|
115
|
+
# is the last value known for state.pose.position
|
|
116
|
+
#
|
|
117
|
+
# Note that the last known values are accessible from any level, i.e.
|
|
118
|
+
# state.last_known.pose.position is an equivalent of the above example.
|
|
119
|
+
def last_known
|
|
120
|
+
@last_known
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# Returns a structure that gives access to the data sources for the
|
|
125
|
+
# members of this struct. I.e.
|
|
126
|
+
#
|
|
127
|
+
# state.pose.data_sources.position
|
|
128
|
+
#
|
|
129
|
+
# will give the data source for state.pose.position if there is one.
|
|
130
|
+
#
|
|
131
|
+
# Due to the use of open structures, one should always check for the
|
|
132
|
+
# presence of the field first with
|
|
133
|
+
#
|
|
134
|
+
# if state.pose.data_sources.position?
|
|
135
|
+
# # do something with state.pose.data_sources.position
|
|
136
|
+
# end
|
|
137
|
+
#
|
|
138
|
+
# Note that the models are accessible from any level, i.e.
|
|
139
|
+
# state.model.pose.position is an equivalent of the above example.
|
|
140
|
+
def data_sources
|
|
141
|
+
@data_sources
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def initialize(model = nil, attach_to = nil, attach_name = nil)
|
|
145
|
+
if !attach_to
|
|
146
|
+
# We are root, initialize last_known and data_sources
|
|
147
|
+
@last_known = StateLastValueField.new
|
|
148
|
+
@data_sources = StateDataSourceField.new
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
super(model, attach_to, attach_name)
|
|
152
|
+
|
|
153
|
+
if model
|
|
154
|
+
# If we do have a model, verify that the assigned values match
|
|
155
|
+
# the model's type
|
|
156
|
+
global_filter do |name, value|
|
|
157
|
+
if (field_model = model.get(name)) && (field_type = field_model.type)
|
|
158
|
+
if !(field_type === value)
|
|
159
|
+
raise ArgumentError, "field #{name} is expected to have values of type #{field_type.name}, #{value} is of type #{value.class}"
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
value
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def link_to(parent, name)
|
|
168
|
+
super
|
|
169
|
+
@last_known = parent.last_known.get(name) ||
|
|
170
|
+
StateLastValueField.new(nil, parent.last_known, name)
|
|
171
|
+
@data_sources = parent.data_sources.get(name) ||
|
|
172
|
+
StateDataSourceField.new(nil, parent.data_sources, name)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def attach
|
|
176
|
+
super
|
|
177
|
+
@last_known.attach
|
|
178
|
+
@data_sources.attach
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Reimplemented from OpenStruct
|
|
182
|
+
def method_missing(name, *args)
|
|
183
|
+
if name =~ /(.*)=$/
|
|
184
|
+
if data_source = data_sources.get($1)
|
|
185
|
+
raise ArgumentError, "cannot explicitely set a field for which a data source exists"
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
super
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Reimplemented from OpenStruct
|
|
192
|
+
#
|
|
193
|
+
# It disables automatic substruct creation for state variables for which
|
|
194
|
+
# a data source exists
|
|
195
|
+
def __get(name, create_substruct = true)
|
|
196
|
+
if (source = data_sources.get(name)) && !source.kind_of?(StateDataSourceField)
|
|
197
|
+
# Don't create a substruct, we know that this subfield should be
|
|
198
|
+
# populated by the data source
|
|
199
|
+
create_substruct = false
|
|
200
|
+
end
|
|
201
|
+
return super(name, create_substruct)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# Read each subfield that have a source, and update both their
|
|
205
|
+
# last_known and current value.
|
|
206
|
+
def read
|
|
207
|
+
data_sources.each_member do |field_name, field_source|
|
|
208
|
+
new_value = field_source.read
|
|
209
|
+
set(field_name, new_value)
|
|
210
|
+
if new_value
|
|
211
|
+
last_known.set(field_name, new_value)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def create_model
|
|
217
|
+
StateModel.new
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# Implementation of the state representation at runtime.
|
|
222
|
+
#
|
|
223
|
+
# It gives access to three views to the state:
|
|
224
|
+
# * the current values are directly accessible from this state object
|
|
225
|
+
# * the last known value is stored in last_known.path.to.value
|
|
226
|
+
# * the state model is stored in model.path.to.value
|
|
227
|
+
# * the current data source for a state variable is stored in
|
|
228
|
+
# data_sources.path.to.value
|
|
229
|
+
class StateSpace < StateField
|
|
230
|
+
def initialize(model = nil)
|
|
231
|
+
@exported_fields = nil
|
|
232
|
+
super(model)
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Declares that no state fields should be marshalled. The default is to
|
|
236
|
+
# export everything
|
|
237
|
+
#
|
|
238
|
+
# It cancels any list of fields exported with #export
|
|
239
|
+
#
|
|
240
|
+
# See also #export_all and #export
|
|
241
|
+
def export_none
|
|
242
|
+
@exported_fields = Set.new
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
# Declares that all the state fields should be marshalled. This is the
|
|
246
|
+
# default
|
|
247
|
+
#
|
|
248
|
+
# It cancels any list of fields exported with #export
|
|
249
|
+
#
|
|
250
|
+
# See also #export_none and #export
|
|
251
|
+
def export_all
|
|
252
|
+
@exported_fields = nil
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
# Declares that only the given names should be marshalled, instead of
|
|
256
|
+
# marshalling every field. It is cumulative, i.e. if multiple calls to
|
|
257
|
+
# #export follow each other then the fields get added to the list of
|
|
258
|
+
# exported fields instead of replacing it.
|
|
259
|
+
#
|
|
260
|
+
# If #export_all has been called, a call to #export cancels it.
|
|
261
|
+
#
|
|
262
|
+
# See also #export_none and #export_all
|
|
263
|
+
def export(*names)
|
|
264
|
+
@exported_fields ||= Set.new
|
|
265
|
+
@exported_fields.merge names.map { |n| n.to_s }.to_set
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def create_subfield(name)
|
|
269
|
+
model = if self.model then self.model.get(name) end
|
|
270
|
+
StateField.new(model, self, name)
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
# Implementation of marshalling with Ruby's Marshal
|
|
274
|
+
#
|
|
275
|
+
# Only the fields that can be marshalled will be saved. Any other field
|
|
276
|
+
# will silently be ignored.
|
|
277
|
+
#
|
|
278
|
+
# Which fields get marshalled can be controlled with #export_all,
|
|
279
|
+
# #export_none and #export. The default is to marshal all fields.
|
|
280
|
+
def _dump(lvl = -1)
|
|
281
|
+
if !@exported_fields
|
|
282
|
+
super
|
|
283
|
+
else
|
|
284
|
+
marshalled_members = @exported_fields.map do |name|
|
|
285
|
+
value = @members[name]
|
|
286
|
+
[name, Marshal.dump(value)] rescue nil
|
|
287
|
+
end
|
|
288
|
+
marshalled_members.compact!
|
|
289
|
+
Marshal.dump([marshalled_members, @aliases])
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
def deep_copy
|
|
294
|
+
exported_fields, @exported_fields = @exported_fields, Set.new
|
|
295
|
+
Marshal.load(Marshal.dump(self))
|
|
296
|
+
ensure
|
|
297
|
+
@exported_fields = exported_fields
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def testing?; Roby.app.testing? end
|
|
301
|
+
def simulation?; Roby.app.simulation? end
|
|
302
|
+
end
|
|
303
|
+
end
|