From c9fb5028035e23dfca5f09cf9035ae36137c8837 Mon Sep 17 00:00:00 2001 From: ipa-nhg Date: Mon, 2 Oct 2023 12:53:32 +0200 Subject: [PATCH] [to be continued...] Working on up-to-date documentation --- README.md | 33 +++++++++--------- docu/Installation.md | 27 +++++++------- ...{Introspection.md => IntrospectionNode.md} | 0 docu/RosModelDescription.md | 1 + docu/RosSystemModelDescription.md | 1 + docu/images/install_eclipse_jdk_version.png | Bin 0 -> 48005 bytes docu/images/install_eclipse_modeling.png | Bin 0 -> 33017 bytes docu/introspection.rosinstall | 8 ----- docu/{ => old}/CompareSpec.md | 6 ++-- docu/{ => old}/ModelCombine.md | 4 +-- docu/{ => old}/NewComponent.md | 4 +-- docu/{ => old}/NewProject.md | 6 ++-- docu/{ => old}/NewSystem.md | 18 +++++----- docu/{ => old}/Parameters.md | 2 +- docu/{ => old}/ROSSeRoNet.md | 24 ++++++------- docu/{ => old}/deployment.md | 16 ++++----- docu/{ => old}/simulateRuntime.md | 6 ++-- 17 files changed, 75 insertions(+), 81 deletions(-) rename docu/{Introspection.md => IntrospectionNode.md} (100%) create mode 100644 docu/RosModelDescription.md create mode 100644 docu/RosSystemModelDescription.md create mode 100644 docu/images/install_eclipse_jdk_version.png create mode 100644 docu/images/install_eclipse_modeling.png delete mode 100644 docu/introspection.rosinstall rename docu/{ => old}/CompareSpec.md (83%) rename docu/{ => old}/ModelCombine.md (97%) rename docu/{ => old}/NewComponent.md (90%) rename docu/{ => old}/NewProject.md (90%) rename docu/{ => old}/NewSystem.md (93%) rename docu/{ => old}/Parameters.md (98%) rename docu/{ => old}/ROSSeRoNet.md (91%) rename docu/{ => old}/deployment.md (89%) rename docu/{ => old}/simulateRuntime.md (87%) diff --git a/README.md b/README.md index 1f9769a7f..87f44d0d0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Ros Model +# RosTooling [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![ros-model CI](https://github.com/ipa320/ros-model/actions/workflows/build.yml/badge.svg)](https://github.com/ipa320/ros-model/actions/workflows/build.yml) @@ -11,13 +11,10 @@ The models have associated tools, the following are some examples: - Code geneators to automatically generate code, documentation, helper scripts... - (ToBeDone) Graphical editor - Technical Maintainer: [**ipa-nhg**](https://github.com/ipa-nhg/) (**Nadia Hammoudeh Garcia**, **Fraunhofer IPA**) - **nadia.hammoudeh.garcia@ipa.fraunhofer.de** ## Projects/Links related to this repository: -- Eclipse Tooling update site: Tbd - Related repositories: - ROS2 embedded code generator: [rossdl](https://github.com/CoreSenseEU/rossdl) - Python parsers (packed as a ROS package) for the ROS and ROSsystem models: [ros_model_parser](https://github.com/ipa320/ros_model_parser) @@ -25,11 +22,7 @@ Related repositories: - Runtime monitoring pipelines: - ROS1: [rosgraph_monitor](https://github.com/ipa320/rosgraph_monitor) - ROS2: [ros2mode](https://github.com/ipa-cmh/ros2model/) - -OLD: -- Language server for the RosModels (web-based models editor): [theia-ros-model](https://github.com/ipa-nhg/theia-ros-model) -- Web interface to automatically extract models from public source code: [model extractor](http://ros-model.seronet-project.de/) -- Source code for the web interface (extract models for non-public available ROS packages): [ros-model-cloud](https://github.com/ipa320/ros-model-cloud) +- Eclipse update site: [RosTooling-update-site](https://github.com/ipa320/RosTooling-update-site) Publications: - Paper: Bootstrapping MDE Development from ROS Manual Code - Part 1: Metamodeling [IRC19 paper](https://ieeexplore.ieee.org/document/8675668) @@ -39,18 +32,17 @@ Publications: --------------------------------------------------------- -# ROS TOOLING MANUAL +# RosTooling Manual ## Installation -Tbd -- [As VS Code plugin](tbd) +- [Eclipse feature](docu/Installation.md#option-1-using-the-release-version-recommended) - [(Only for tooling developers) From Source code in eclipse](docu/Installation.md#option-2-using-the-eclipse-installer---source-installation-ros-tooling-developers) +- VS Code plugin(tbd) - WIP [vscode-RosTooling](https://github.com/ipa320/vscode-RosTooling) ## Tutorials - Create component models: - - (Prerequisite) [Add communication objects](docu/NewCommunicationObjects.md) - [Create a ROS model from your source code(static code analyzer)](docu/NewRosModel.md) - [Create a ROS model from a deployed robot using our introspection at runtime tool](docu/IntrospectionNode.md) @@ -58,13 +50,22 @@ Tbd - [Generation of code from models](docu/CodeGeneration.md) - Combine components to form a ROS System - - [Create manually a new RosSystem description](docu/RosSystemModelDescription.md) - - [Create a ROS system model from your source code (static code analyzer)](docu/NewRosSystemModel.md) - - [System Model extraction using introspection at runtime](docu/IntrospectionSystem.md) + +- Examples: + - [Simple publisher-subscriber](docu/Example_PubSub.md) + - [Turtlesim](docu/Example_Turtlesim.md) - [Update Release versions (only for administrators)](docu/Release.md) ## Model examples The repository [ros-model-examples](https://github.com/ipa-nhg/ros-model-examples) contains a set components and system examples. + +--------------------------------------------------------- +# OLD (out-of-date) + +Links to related repositories: +- Language server for the RosModels (web-based models editor): [theia-ros-model](https://github.com/ipa-nhg/theia-ros-model) +- Web interface to automatically extract models from public source code: [model extractor](http://ros-model.seronet-project.de/) +- Source code for the web interface (extract models for non-public available ROS packages): [ros-model-cloud](https://github.com/ipa320/ros-model-cloud) diff --git a/docu/Installation.md b/docu/Installation.md index d83a10bf4..500eb2a9b 100644 --- a/docu/Installation.md +++ b/docu/Installation.md @@ -2,43 +2,42 @@ ### Option 1: Using the Release version (Recommended) -In Eclipse, go to *Help* > *Install New Software...*. To install the latest version of the ROS tooling, add the update site URL [http://ros-model.seronet-project.de/updatesite/latest/](http://ros-model.seronet-project.de/updatesite/latest/)(*) in the *Work with* section. If you wish to install an earlier version instead, go to the [the update site](http://ros-model.seronet-project.de/updatesite/), choose the desired version and copy its URL. +The first step is to install eclipse. Please download the installer from the official eclipse [website](https://www.eclipse.org/downloads/packages/installer). Once you start the installer, select the package "Eclipse Modeling Tools". -![alt text](images/install_updatesite.png) - -If none package is listed, please uncheck the option *Group items by category*. The category *ROS Model* appears in the *Name* area. Check the box in front of *ROS model* and click *Next* to review the list of items to be installed. Click *Next* again to read and accept the terms of the license agreements and afterwards click *Finish*. Eclipse will then start to install the ROS tooling and its dependencies. If you get a security warning about the authenticity, click OK. Finally, when asked, restart Eclipse to complete the installation process. +![alt text](images/install_eclipse_modeling.png) +Press next, and then pick the java version 19 and the folder where you would like to install eclipse. -(*) Apart of the latest stable release of the tooling, some pre-releases for new feautures are available. See the following list of current pre-releases: +![alt text](images/install_eclipse_jdk_version.png) -| Name | Code version | Update Site Link | Description | -|---|---|---|---| -|TestComponentStack|https://github.com/ipa320/ros-model/tree/1.4.0_TestComponentStacks|http://ros-model.seronet-project.de/updatesite/TestComponentStacks/latest/| Added to the RosSystem metamodel the option to group components forming components stacks. This pre-release is backward compatible for the models, but the validators and generators are **not** updated. If Xtext report errors, please ignore them. | -| v1.5 | https://github.com/ipa320/ros-model/tree/1.5.0_pre-release |http://ros-model.seronet-project.de/updatesite/pre-release/latest/| Long term version of the grammar (simplified for the 1.4 release). **This version is not backwards compatible with 1.3 and earlier releases**| +Continue the installation, acepting the license, as usual. +Once the installation is completed, go to *Help* > *Install New Software...*. To install the latest version of the ROS tooling, add the update site URL [https://raw.githubusercontent.com/ipa320/RosTooling-update-site/main](https://raw.githubusercontent.com/ipa320/RosTooling-update-site/main)(*) in the *Work with* section. +![alt text](images/install_updatesite.png) +If none package is listed, please uncheck the option *Group items by category*. The category *ROS Model* appears in the *Name* area. Check the box in front of *ROS model* and click *Next* to review the list of items to be installed. Click *Next* again to read and accept the terms of the license agreements and afterwards click *Finish*. Eclipse will then start to install the ROS tooling and its dependencies. If you get a security warning about the authenticity, click OK. Finally, when asked, restart Eclipse to complete the installation process. To start using the ROS tooling continue with the [step 1](#1-switch-to-the-ros-developer-perspective) ### Option 2: Using the Eclipse Installer - Source installation (ROS tooling developers) -First the java environment have to be setup, for eclipse it is recomended the installation of the version 8 (i.e. X=8) for Ubuntu 16.04 and 11 (i.e. X=11) for the 18.04 and 20.04: +First the java environment have to be setup: ``` -sudo apt-get install openjdk-11-jre +sudo apt-get install openjdk-19-jre ``` -Download the official [Eclipse Installer](https://www.eclipse.org/downloads/packages/installer) for your preferred operating system. Execute the installer and choose the advanced mode (menu on the right-up corner). Select the Product *Eclipse Modeling tools* package, for the version it is recommended *2021-12*. +Download the official [Eclipse Installer](https://www.eclipse.org/downloads/packages/installer) for your preferred operating system. Execute the installer and choose the advanced mode (menu on the right-up corner). Select the Product *Eclipse Modeling tools* package. And then pick the java version 19. ![alt text](images/eclipse_installer1.png) Press *Next* and add a new *User project* pressing the green button *+*: ``` Catalog: Github Projects -Resource URIs: https://raw.githubusercontent.com/ipa320/ros-model/master/EclipseInstaller/ROSModel.setup +Resource URIs: https://raw.githubusercontent.com/ipa320/RosTooling/main/EclipseInstaller/ROSModel.setup ``` Sometimes eclipse is not able to find the file, for those cases we recommend to download the file to the local memory of the machine and import it: ``` -wget https://raw.githubusercontent.com/ipa320/ros-model/master/EclipseInstaller/ROSModel.setup +wget https://raw.githubusercontent.com/ipa320/RosTooling/main/EclipseInstaller/ROSModel.setup ``` ![alt text](images/eclipse_installer2.png) diff --git a/docu/Introspection.md b/docu/IntrospectionNode.md similarity index 100% rename from docu/Introspection.md rename to docu/IntrospectionNode.md diff --git a/docu/RosModelDescription.md b/docu/RosModelDescription.md new file mode 100644 index 000000000..c1f6417b2 --- /dev/null +++ b/docu/RosModelDescription.md @@ -0,0 +1 @@ +## TBD diff --git a/docu/RosSystemModelDescription.md b/docu/RosSystemModelDescription.md new file mode 100644 index 000000000..c1f6417b2 --- /dev/null +++ b/docu/RosSystemModelDescription.md @@ -0,0 +1 @@ +## TBD diff --git a/docu/images/install_eclipse_jdk_version.png b/docu/images/install_eclipse_jdk_version.png new file mode 100644 index 0000000000000000000000000000000000000000..62331b5d32c81d8f459aa696b2e0f36b549c339e GIT binary patch literal 48005 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 literal 0 HcmV?d00001 diff --git a/docu/images/install_eclipse_modeling.png b/docu/images/install_eclipse_modeling.png new file mode 100644 index 0000000000000000000000000000000000000000..a21d3b43c760291e7de21091a6fa094c85141739 GIT binary patch literal 33017 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 literal 0 HcmV?d00001 diff --git a/docu/introspection.rosinstall b/docu/introspection.rosinstall deleted file mode 100644 index 6a559db02..000000000 --- a/docu/introspection.rosinstall +++ /dev/null @@ -1,8 +0,0 @@ -- git: - local-name: ros_model_parser - uri: https://github.com/ipa-nhg/ros_model_parser.git - version: fix-value -- git: - local-name: rosgraph_monitor - uri: https://github.com/ipa-nhg/rosgraph_monitor.git - version: rossystem_snapshot diff --git a/docu/CompareSpec.md b/docu/old/CompareSpec.md similarity index 83% rename from docu/CompareSpec.md rename to docu/old/CompareSpec.md index ba82ee5e4..40953c9ee 100644 --- a/docu/CompareSpec.md +++ b/docu/old/CompareSpec.md @@ -4,14 +4,14 @@ If you want to check that the model of your node is following a concrete specifi Press the button of ROS model checker: -![alt text](images/compare_icon.png) +![alt text](../images/compare_icon.png) Select as input your model file and as specification the model that defines the standard you want to follow (some specifications are available under **de.fraunhofer.ipa.ros.communication.objects/BasicSpecs**). -![alt text](images/compare_select.png) +![alt text](../images/compare_select.png) To use this feature you have to locate your model file in your eclipse workspace by importing the project that contains it. By pressing *Finish* a dialog will give you a summary of your analysis: -![alt text](images/compare_result.png) +![alt text](../images/compare_result.png) diff --git a/docu/ModelCombine.md b/docu/old/ModelCombine.md similarity index 97% rename from docu/ModelCombine.md rename to docu/old/ModelCombine.md index 9d1c56d94..c03046404 100644 --- a/docu/ModelCombine.md +++ b/docu/old/ModelCombine.md @@ -6,11 +6,11 @@ This feature allows the merge of two different ROS system models. To combine t -![CombineModels](images/CombineModels_1.png) +![CombineModels](../images/CombineModels_1.png) A pop-up menu will ask you for the two models to combine (have to be on imported project of your workspace) and the path where to save the resulted file (that will be called *result.rossystem*. Finally the user can check the box "Combine to the minimal model (restrictive strategy)" to switch the strategy. -![CombineModels](images/CombineModels_2.png) +![CombineModels](../images/CombineModels_2.png) diff --git a/docu/NewComponent.md b/docu/old/NewComponent.md similarity index 90% rename from docu/NewComponent.md rename to docu/old/NewComponent.md index 3db611ef8..a3e9bac65 100644 --- a/docu/NewComponent.md +++ b/docu/old/NewComponent.md @@ -4,7 +4,7 @@ Please be sure that the tool is installed and your workspace setup, see the [ins To create a new component you have to press the button "Add new Component from Ros node" -![alt text](images/add_new_component.png) +![alt text](../images/add_new_component.png) A dialog will be open and ask you to select a folder to contain your new model (we recommend the "components" one) and to give a name to your component. @@ -12,4 +12,4 @@ The next menu will ask you to give to your component a name and a namespace (opt Your component will be automatically created, in case you want to modify the default remaps of the interfaces you can edit the file using the EMF editor -![](images/modify_component.png) +![](../images/modify_component.png) diff --git a/docu/NewProject.md b/docu/old/NewProject.md similarity index 90% rename from docu/NewProject.md rename to docu/old/NewProject.md index 6b12e25e3..c61ff883d 100644 --- a/docu/NewProject.md +++ b/docu/old/NewProject.md @@ -4,16 +4,16 @@ Please be sure that the tool is installed and your workspace setup, see the [ins To create a new project you have to press the button "Add new Ros Project" -![alt text](images/new_project.png) +![alt text](../images/new_project.png) A pop-up dialog will ask you to define the name of the project. Once you press finish a new folder will be created with a collection of common messages and services and a predefined ROS model. To describe easily the model you can use a Sirius representation. +![](../images/new_artifact_representation.png)--> A new window will be opened where you can choose and add elements by selecting them on the side toolbar. Using the properties view you can modify and describe the properties of each element. -![](images/node_representation.png) +![](../images/node_representation.png) Once you finish you can open the file under the folder "rosnodes" that describes your model and check that all the information is correct. This editor has an autocomplete function (by pressing Ctrl+Space) and will report any error made by editing. diff --git a/docu/NewSystem.md b/docu/old/NewSystem.md similarity index 93% rename from docu/NewSystem.md rename to docu/old/NewSystem.md index e5eac36c7..053ea4547 100644 --- a/docu/NewSystem.md +++ b/docu/old/NewSystem.md @@ -10,21 +10,21 @@ scan_system_demo To create a new system you have to press the button "Add new Ros System" -![alt text](images/add_new_system.gif) +![alt text](../images/add_new_system.gif) A dialog will be open and ask you to select a folder to contain your new model, you can just select the "scan_system_demo" folder. Give a name to your new system and press "Next > ", the new dialog window will ask you for a Ros Components, this step is not required, you can just press "Finish". To modify easily the model you can use a Sirius representation. Open the file representation.aird with the Aird editor and in the menu representations choose the "RosSystem" option and press "New.." then choose the Ros System entity of your "*.rossystem" model and press finish. -![alt text](images/RosSystem_entity.gif) +![alt text](../images/RosSystem_entity.gif) A new window will appear where you can choose and add elements by selecting them on the side toolbar and the properties view. With the toolbar you can add a new component. Press the option "New component", a window will be opened and ask for a new name for you component: -![alt text](images/add_new_component_name.gif) +![alt text](../images/add_new_component_name.gif) Give a name and (optionally) a namespace to a new component, for example: -![alt text](images/new_component1.gif) +![alt text](../images/new_component1.gif) Press the button "Browse.." and select the model "sick_s300.ros" of the rosnode folder. Repeat the previous process for the creation of other tree components: @@ -48,7 +48,7 @@ RosModel: rosnodes/scan_unifier.ros Now that the components are created you can define the desired connections between the components using the tool "Topic Connection", the only imposed rule to create connections is that the information object (message or service type) is the same on both sides. For our example the natural connection to be created are the shown on the following figure: -![alt text](images/rossystem_withconnections.png) +![alt text](../images/rossystem_withconnections.png) If the modifications are correct and after save the changes, two files will be automatically generated 1) a componentinterface file of your full system in the folder "components" and 2) a launch file to start the selected ROS nodes in the correct predefined Namespace (in a new folder "src-gen"). @@ -75,7 +75,7 @@ The resulted launch file contains the defined namespaces and remap the topics of We can also try removing the namespace of the diagnostics topics for the scanners. Choose the different diagnostics publisher and modify using the properties view its names to for example: -![alt text](images/diagnostics_names.gif) +![alt text](../images/diagnostics_names.gif) These changes should change the roslaunch file to: @@ -106,13 +106,13 @@ The next part of this tutorial shows the creation of a new System by the composi To create a new system you have to press the button "Add new Ros System" and a dialog will be open and ask you to select a folder to contain your new model, you can just select the "scan_system_demo" folder. Give a name to your new system and press "Next > ", the new dialog window will ask you for a Ros Components press "Browse.." and select the componentinterface autogenerated by the previous example (i.e. scan_system_demo/components/scan_composition.componentinterface). -![alt text](images/composition_subsystem.gif) +![alt text](../images/composition_subsystem.gif) To modify easily the model you can use a Sirius representation. Open the file representation.aird with the Aird editor and in the menu representations choose the "RosSystem" option and press "New.." then choose the Ros System entity of your "*.rossystem" model and press finish. A new window will appear where you can choose and add elements by selecting them on the side toolbar and the properties view. -![alt text](images/diagnostics_system.gif) +![alt text](../images/diagnostics_system.gif) The new system already contains the previous system model as a single block and can be composed by adding new components, for example you can create a new component with the following configuration: @@ -123,7 +123,7 @@ RosModel: rosnodes/diagnostic_aggregator.ros ``` And join the diagnostics interfaces with a connection. The resulted launch file will include the previous generated launch file and the new imported node. -![alt text](images/diagnostics_system_complete.gif) +![alt text](../images/diagnostics_system_complete.gif) ``` diff --git a/docu/Parameters.md b/docu/old/Parameters.md similarity index 98% rename from docu/Parameters.md rename to docu/old/Parameters.md index cdd33fcbf..c093553ad 100644 --- a/docu/Parameters.md +++ b/docu/old/Parameters.md @@ -15,7 +15,7 @@ and their description is allowed at ROS and ROSSystem model level. The definition of a parameter at ROS model level means that the ROS original node get or set a new parameter, this case is partially supported by the graphical editor, which allows only the definition of parameters of primitive types: String, Double, Integer and Boolean without a default value. -![alt text](images/parameter_set.gif) +![alt text](../images/parameter_set.gif) For the complete definition of parameters the user has to open the ROS model editor, where the language format is the following: diff --git a/docu/ROSSeRoNet.md b/docu/old/ROSSeRoNet.md similarity index 91% rename from docu/ROSSeRoNet.md rename to docu/old/ROSSeRoNet.md index 140affe2a..bb4e546bc 100644 --- a/docu/ROSSeRoNet.md +++ b/docu/old/ROSSeRoNet.md @@ -28,15 +28,15 @@ Go to Menu Window -> Perspective -> Open Perspective -> Other... -> ROS develope This example requires the common ROS interfaces, by clicking the button *Import Common ROS Objects* you will get the latest version from GitHub and import them automatically to your workspace, this function button is only available for the ROS developer perspective: menu *Window* => *Perspective* => *Open Perspective* => *ROS developer*. -![alt text](images/01-ImportCommnObjects.png) +![alt text](../images/01-ImportCommnObjects.png) And you can import now the project to be transformed, for example [cob_light](https://github.com/ipa-nhg/ros-model-examples/tree/master/RosComponents/cob_light) from the ros-model-examples repository (previously cloned). -![alt text](images/ROSSeRoNet_import_cob_light.gif) +![alt text](../images/ROSSeRoNet_import_cob_light.gif) By openning the representation file you can see the following model visualization: -![alt text](images/ROSSeRoNet_cob_light_representation.gif) +![alt text](../images/ROSSeRoNet_cob_light_representation.gif) Or you can create a [new project from an empty model](https://github.com/ipa320/ros-model/blob/master/docu/NewProject.md). In case you have an existing ROS package that contains the C++ code of your component we recommend to use the [extractor](https://github.com/ipa320/ros-model/blob/master/docu/NewRosModel.md) instead of start from scratch the model definition. @@ -46,21 +46,21 @@ NOTE: all the msgs, srvs or actions used by your node (package dependencies) hav By default the tooling will automatically autogenerate the corresponding component interface (a generic model of a component) of all the nodes on your ROS project. The autogenerated components are always located under a new folder called *components/*. This model is the bridge from ROS to other frameworks. For the case of SeRoNet the tooling includes a special function that can be activated by a right click on the file an choosing the option *Generate ROS-SeRoNet Mixed Port*. -![alt text](images/ROSSeRoNet_cob_lightComponentToSeRoNet.gif) +![alt text](../images/ROSSeRoNet_cob_lightComponentToSeRoNet.gif) The result of this call is a rospoolinterface file. Start point of the following tutorial: https://wiki.servicerobotik-ulm.de/tutorials:ros:mixed-port-component-ros. Complementarily and to make easier the relay of interfaces we incorporated an extra help function that automatically relays one of the ROS interfaces. The previous function through its pop-up dialog guides the user to generates not only the rospoolinterface model but also a suggestion of a SeRoNet component with a ROS mixed Port. The resulted files will be generated under the folder *src-gen/SeRoNetComponent* -![alt text](images/ROSSeRoNet_generatedFilesSeRoNet.gif) +![alt text](../images/ROSSeRoNet_generatedFilesSeRoNet.gif) These two files can be used to create a [new SeRoNet component](https://wiki.servicerobotik-ulm.de/tutorials:develop-your-first-component:start). First the presperctive have to be changed to the "Component Supplier" one. This perspective will add the option to create a new Component Project by giving a name and a localization. The previosly generated SeRoNetComponent files can simply be copied to the model folder of the new project. -![alt text](images/ROSSeRoNet_SeRoNetComponent.gif) +![alt text](../images/ROSSeRoNet_SeRoNetComponent.gif) For this example the corresponding SeRoNet component with a ROS Mixed Port (by creating a [new SeRoNet component](https://wiki.servicerobotik-ulm.de/tutorials:develop-your-first-component:start) and including the autogenerated files) will shows: -![alt text](images/result.png) +![alt text](../images/result.png) For further information please check: [Automatic transformation of ROS Components to SeRoNet mixed Ports](https://github.com/seronet-project/SeRoNet-Tooling-ROS-Mixed-Port/tree/master/de.seronet_projekt.ros.componentGateway.generator#automatic-transformation-of-ros-components-to-seronet-mixed-ports) @@ -71,11 +71,11 @@ For some cases like the cob_light driver, the ROS node definition requires some This will generate the file services and the file types under the folder *src-gen*. -![alt text](images/cob_light_obtects_to_SeRoNet.gif) +![alt text](../images/cob_light_obtects_to_SeRoNet.gif) -![alt text](images/cob_light_obtects_to_SeRoNet2.gif) +![alt text](../images/cob_light_obtects_to_SeRoNet2.gif) -![alt text](images/cob_light_obtects_to_SeRoNet3.gif) +![alt text](../images/cob_light_obtects_to_SeRoNet3.gif) For further information please see: https://github.com/ipa-nhg/SeRoNet-Tooling-ROS-Mixed-Port/tree/M2MCommunicationObjectsReadme/de.seronet_projekt.ros.componentGateway.generator#automatic-transformation-of-communication-objects @@ -83,7 +83,7 @@ These files are the input for a SeRoNet Domain Model. By creating a [new Domain Probably after create the new Domain Models project and add the types and services files you will get an error because some dependencies are missed. -![alt text](images/domainModelsError.gif) +![alt text](../images/domainModelsError.gif) For the most common ROS objects the project dependencies are already available. We suggest to import *always* by default the following projects from the GitHub repositories previously cloned: @@ -93,4 +93,4 @@ For the most common ROS objects the project dependencies are already available. Then open the Domain Expert perspective (Go to Menu Window -> Perspective -> Open Perspective -> Other... -> Domain Expert) and for the created Domain Models expert that holds your communcaition object add the import dependencies (Right click on *imports* folder). -![alt text](images/ImportSolve.png) +![alt text](../images/ImportSolve.png) diff --git a/docu/deployment.md b/docu/old/deployment.md similarity index 89% rename from docu/deployment.md rename to docu/old/deployment.md index fcbef5bca..73ca6e0a0 100644 --- a/docu/deployment.md +++ b/docu/old/deployment.md @@ -30,11 +30,11 @@ A dialog will be open and ask you to select a ROS Distro. In this case, the ross This process is as shown blow. -![alt text](images/rostooling_deployment.gif) +![alt text](../images/rostooling_deployment.gif) Then deployment artifacts will automatically created, as you can find under "src-gen" folder -![alt text](images/pub_sub_ros2_deployment_gen.png) +![alt text](../images/pub_sub_ros2_deployment_gen.png) #### Rossystem with parameters @@ -49,11 +49,11 @@ A dialog will be open and ask you to select a ROS Distro. In this case, the ross This process is as shown blow. -![alt text](images/rostooling_deployment_jackal.gif) +![alt text](../images/rostooling_deployment_jackal.gif) Then deployment artifacts will automatically created. -![alt text](images/jackal_deployment_gen.png) +![alt text](../images/jackal_deployment_gen.png) ### Use github action to generate docker images @@ -67,16 +67,16 @@ You also need a dockerhub account. Once you have dockerhub account, you need to The result should looks like below. -![alt text](images/github_secrets.png) +![alt text](../images/github_secrets.png) In this repository, you need to create a folder ".github/workflows". Then you need to put a file with suffix "_workflow.yml" from a generated folder to this folder. For example, you can put "communication_foxy_workflow.yml" or "agriculture_robot_sprint3_noetic_workflow.yml" under ".github/workflows" folder, as shown below. -![alt text](images/github_workflows_folder.png) +![alt text](../images/github_workflows_folder.png) Then you need to put the generated folder in this repository. For example, we put "communication_ros2" and "agriculture_robot_sprint3" in the repository. The locations of these two folder as shown below. -![alt text](images/rossystem_deployment_repo.png) +![alt text](../images/rossystem_deployment_repo.png) You can push them to github. Github action will build docker image and push images in dockerhub. @@ -85,7 +85,7 @@ You can push them to github. Github action will build docker image and push imag Before starting the system, you need to modify "docker-compose" file. You need to add your docker account as prefix before a docker image name. For example, we add "kogrob2" (docker hub account name) in front of "communication_foxy:latest", as shown below. -![alt text](images/docker-compose.png) +![alt text](../images/docker-compose.png) Then you can use the command below to start the system. ``` diff --git a/docu/simulateRuntime.md b/docu/old/simulateRuntime.md similarity index 87% rename from docu/simulateRuntime.md rename to docu/old/simulateRuntime.md index fe4afbf4a..8c28dd153 100644 --- a/docu/simulateRuntime.md +++ b/docu/old/simulateRuntime.md @@ -4,16 +4,16 @@ In ROS, when executing a launch file that defines several nodes, the connections This function can be called from the system graphical editor. The definition of ROS systems is covered in this tutorial: [Define a ROS system as a composition of components](NewSystem.md). -![alt text](images/system_instrospection.png) +![alt text](../images/system_instrospection.png) The menu can be opened by right-clicking on the system background. It offers 3 options: * Simulate Runtime connections: this option will create all connections that are automatically built at runtime (interfaces with same name and same message (communication object) type). In the example diagram these are the "diagnostics" topics: -![alt text](images/system_introspection_simulate_runtime.png) +![alt text](../images/system_introspection_simulate_runtime.png) * Auto Connect open ports: this option will suggest likely connections, i.e. it will join interfaces with the same message (communication object) type and will remap consequently the names of the ports. For the example diagram the result will be: -![alt text](images/system_introspection_autoconnect.png) +![alt text](../images/system_introspection_autoconnect.png) * Remove all connections: to clear the connections of the model