diff --git a/API/openapi.yaml b/API/openapi.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0b4e4f02ff7401032c296846a90653329099097f
--- /dev/null
+++ b/API/openapi.yaml
@@ -0,0 +1,779 @@
+# Copyright 2022 ETSI. Licensed under the BSD-3-Clause license
+# API for the Augmented Reality Framework (ARF)
+# Working group: ETSI ISG ARF
+# STF group: STF620 (validation)
+#
+# References:
+# - Explaination UUID: https://en.wikipedia.org/wiki/Universally_unique_identifier / https://fr.wikipedia.org/wiki/Universally_unique_identifier
+# - UUID formats: 8-4-4-4-12 format string, lower case (but case insensitive on input)
+# - UUID RFC4122: https://datatracker.ietf.org/doc/html/rfc4122#section-3
+# - online UUID generator: https://www.uuidgenerator.net/
+# - Rules for RESTful error code RFC2616: https://datatracker.ietf.org/doc/html/rfc2616#section-10
+# - Guide: https://restfulapi.net/http-status-codes/
+#
+# Last Version: 01.06.2022
+
+openapi: "3.0.0"
+
+info:
+ version: 1.0.0
+ title: World Storage API
+ description: API ensuring interoperability between an authoring tool and a World Storage service
+ license:
+ name: Copyright 2022 ETSI. Licensed under the BSD-3-Clause license
+ url: https://opensource.org/licenses/BSD-3-Clause
+servers:
+ - url: http://localhost:8080
+
+tags:
+ - name: default
+ description: Default operations to test the current server's state
+ - name: Trackables
+ description: Trackables are models of parts of the real world.
Trackables are elements of the real world of which features are available and/or could be extracted.
Trackables provide a Coordinate Reference System in which a pose can be expressed.
+ - name: World Anchors
+ description: A World Anchor represents a fixed position in relation to one or more elements of the real world.
It has a Coordinate Reference System in which AR Assets stay spatially-registered.
+ - name: World Links
+ description: A World Link represents and defines the relative 3D position and orientation between elements (Trackables and/or World Anchors).
+
+paths:
+ /ping:
+ get:
+ summary: Test the server availability.
+ operationId: getPing
+ responses:
+ '200':
+ description: Ok, returns a string message.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "pong"
+ /admin:
+ get:
+ summary: Get the state of the server.
+ operationId: getAdmin
+ responses:
+ '200':
+ description: OK, world storage server ready.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "Server up and running"
+ /version:
+ get:
+ summary: Get the version of the ARF API.
+ operationId: getVersion
+ responses:
+ '200':
+ description: Current version.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "1.0.0"
+
+##############
+# TRACKABLES #
+##############
+ /trackables:
+ post:
+ summary: Create a Trackable.
+ operationId: addTrackable
+ description: Create a new Trackable from a json object containing all the required informations and add it to the world storage.
As a result you will get the ID of the newly created Trackable.
+ tags:
+ - Trackables
+ requestBody:
+ description: The Trackable to be added to the world storage.
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Trackable'
+ responses:
+ '200':
+ description: OK, return the UUID of the Trackable defined by the world storage.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "777266da-e286-11ec-8fea-0242ac120002"
+ '201':
+ description: Null response.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: ""
+ '400':
+ $ref: '#/components/responses/400_BadRequest'
+ '409':
+ $ref: '#/components/responses/409_NotEmptyUUID'
+ 'default':
+ $ref: '#/components/responses/4xx_UnexpectedError'
+ put:
+ summary: Modify a Trackable.
+ operationId: modifyTrackable
+ description: Modify an existing Trackable given a json object containing all the required informations.
**Please note that ID of the object is required in the JSON**
+ tags:
+ - Trackables
+ requestBody:
+ description: The Trackable to be modified in the world storage.
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Trackable'
+ responses:
+ '200':
+ description: OK, return the UUID of the modified Trackable.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "777266da-e286-11ec-8fea-0242ac120002"
+ '400':
+ $ref: '#/components/responses/400_BadRequest'
+ '404':
+ $ref: '#/components/responses/404_NotFoundUUID'
+ 'default':
+ $ref: '#/components/responses/4xx_UnexpectedError'
+ get:
+ summary: Return all the Trackables.
+ operationId: getTrackables
+ description: Get all the Trackables currently being stored in the world storage.
+ tags:
+ - Trackables
+ responses:
+ '200':
+ description: OK, return all the Trackables defined by the world storage.
+ content:
+ application/json:
+ schema:
+ type : array
+ items :
+ $ref: "#/components/schemas/Trackable"
+ '201':
+ description: Null response.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: ""
+ default:
+ $ref: '#/components/responses/4xx_UnexpectedError'
+
+ /trackables/{trackableUUID}:
+ get:
+ summary: Find a Trackable by its UUID.
+ operationId: getTrackableById
+ description: Get a single Trackable stored in the world storage from its ID.
+ tags:
+ - Trackables
+ parameters:
+ - name: trackableUUID
+ in: path
+ description: UUID of the Trackable to retrieve.
+ required: true
+ schema:
+ type: string
+ format: uuid
+ responses:
+ '200':
+ description: Successful operation.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Trackable'
+ '400':
+ $ref: '#/components/responses/400_InvalidUUID'
+ '404':
+ $ref: '#/components/responses/404_NotFoundUUID'
+ delete:
+ summary: Delete a Trackable.
+ operationId: deleteTrackable
+ description: Delete a single Trackable stored in the world storage from its ID.
+ tags:
+ - Trackables
+ parameters:
+ - name: trackableUUID
+ in: path
+ description: Trackable UUID to delete.
+ required: true
+ schema:
+ type: string
+ format: uuid
+ responses:
+ '200':
+ description: OK, delete successful.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "Element succesfully deleted"
+ '400':
+ $ref: '#/components/responses/400_InvalidUUID'
+ '404':
+ $ref: '#/components/responses/404_NotFoundUUID'
+
+#################
+# WORLD ANCHORS #
+#################
+ /worldAnchors:
+ post:
+ summary: Create a World Anchor.
+ operationId: addWorldAnchor
+ description: Create a new World Anchor from a json object containing all the required informations and add it to the world storage.
As a result you will get the ID of the newly created World Anchor.
+ tags:
+ - World Anchors
+ requestBody:
+ description: The World Anchor to be added to the world storage.
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/WorldAnchor'
+ responses:
+ '200':
+ description: OK, return the UUID of the World Anchor defined by the world storage.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "777266da-e286-11ec-8fea-0242ac120002"
+ '201':
+ description: Null response.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: ""
+ '400':
+ $ref: '#/components/responses/400_BadRequest'
+ '409':
+ $ref: '#/components/responses/409_NotEmptyUUID'
+ 'default':
+ $ref: '#/components/responses/4xx_UnexpectedError'
+ put:
+ summary: Modify a World Anchor.
+ operationId: modifyWorldAnchor
+ description: Modify an existing World Anchor given a json object containing all the required informations.
**Please note that ID of the object is required in the JSON**
+ tags:
+ - World Anchors
+ requestBody:
+ description: The World Anchor to be modified in the world storage.
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/WorldAnchor'
+ responses:
+ '200':
+ description: OK, return the UUID of the modified World Anchor.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "777266da-e286-11ec-8fea-0242ac120002"
+ '400':
+ $ref: '#/components/responses/400_BadRequest'
+ '404':
+ $ref: '#/components/responses/404_NotFoundUUID'
+ 'default':
+ $ref: '#/components/responses/4xx_UnexpectedError'
+ get:
+ summary: Return all the World Anchors.
+ operationId: getWorldAnchors
+ description: Get all the World Anchors currently being stored in the world storage.
+ tags:
+ - World Anchors
+ responses:
+ '200':
+ description: OK, return all the World Anchors defined by the world storage.
+ content:
+ application/json:
+ schema:
+ type : array
+ items :
+ $ref: "#/components/schemas/WorldAnchor"
+ '201':
+ description: Null response.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: ""
+ default:
+ $ref: '#/components/responses/4xx_UnexpectedError'
+
+ /worldAnchors/{worldAnchorUUID}:
+ get:
+ summary: Find a World Anchor by its UUID.
+ operationId: getWorldAnchorById
+ description: Get a single World Anchor stored in the world storage from its ID.
+ tags:
+ - World Anchors
+ parameters:
+ - name: worldAnchorUUID
+ in: path
+ description: UUID of the World Anchor to retrieve.
+ required: true
+ schema:
+ type: string
+ format: uuid
+ responses:
+ '200':
+ description: Successful operation.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/WorldAnchor'
+ '400':
+ $ref: '#/components/responses/400_InvalidUUID'
+ '404':
+ $ref: '#/components/responses/404_NotFoundUUID'
+ delete:
+ summary: Delete a World Anchor.
+ operationId: deleteWorldAnchor
+ description: Delete a single World Anchor stored in the world storage from its ID.
+ tags:
+ - World Anchors
+ parameters:
+ - name: worldAnchorUUID
+ in: path
+ description: World Anchor UUID to delete.
+ required: true
+ schema:
+ type: string
+ format: uuid
+ responses:
+ '200':
+ description: OK, delete successful.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "Element succesfuly deleted"
+ '400':
+ $ref: '#/components/responses/400_InvalidUUID'
+ '404':
+ $ref: '#/components/responses/404_NotFoundUUID'
+
+###############
+# WORLD LINKS #
+###############
+ /worldLinks:
+ post:
+ summary: Create a World Link between elements (world anchors and/or trackables).
+ operationId: addWorldLink
+ description: Create a new World Link from a json object containing all the required informations and add it to the world storage.
As a result you will get the ID of the newly created World Link.
+ tags:
+ - World Links
+ requestBody:
+ description: The link to be added to the world storage.
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/WorldLink'
+ responses:
+ '200':
+ description: OK, return the UUID of the World Link defined by the world storage.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "777266da-e286-11ec-8fea-0242ac120002"
+ '201':
+ description: Null response.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: ""
+ '400':
+ $ref: '#/components/responses/400_BadRequest'
+ '409':
+ $ref: '#/components/responses/409_NotEmptyUUID'
+ 'default':
+ $ref: '#/components/responses/4xx_UnexpectedError'
+ put:
+ summary: Modify a World Link.
+ operationId: modifyWorldLink
+ description: Modify an existing World Link given a json object containing all the required informations.
**Please note that ID of the object is required in the JSON**
+ tags:
+ - World Links
+ requestBody:
+ description: The World Link to be modified in the world storage.
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/WorldLink'
+ responses:
+ '200':
+ description: OK, return the UUID of the modified World Link.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "777266da-e286-11ec-8fea-0242ac120002"
+ '400':
+ $ref: '#/components/responses/400_BadRequest'
+ '404':
+ $ref: '#/components/responses/404_NotFoundUUID'
+ 'default':
+ $ref: '#/components/responses/4xx_UnexpectedError'
+ get:
+ summary: Return all World Links.
+ description: Get all the World Links currently being stored in the world storage.
+ operationId: getWorldLinks
+ tags:
+ - World Links
+ responses:
+ '200':
+ description: OK return all the World Links defined by the world storage.
+ content:
+ application/json:
+ schema:
+ type : array
+ items :
+ $ref: "#/components/schemas/WorldLink"
+ '201':
+ description: Null response.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: ""
+ default:
+ $ref: '#/components/responses/4xx_UnexpectedError'
+
+ /worldLinks/{worldLinkUUID}:
+ get:
+ summary: Find a World Link by its UUID.
+ operationId: getWorldLinkById
+ description: Get a single World Link stored in the world storage from its ID.
+ tags:
+ - World Links
+ parameters:
+ - name: worldLinkUUID
+ in: path
+ description: UUID of the World Link to retrieve.
+ required: true
+ schema:
+ type: string
+ format: uuid
+ responses:
+ '200':
+ description: Successful operation.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/WorldLink'
+ '400':
+ $ref: '#/components/responses/400_InvalidUUID'
+ '404':
+ $ref: '#/components/responses/404_NotFoundUUID'
+ delete:
+ summary: Delete a World Link.
+ operationId: deleteWorldLink
+ description: Delete a single World Link stored in the world storage from its ID.
+ tags:
+ - World Links
+ parameters:
+ - name: worldLinkUUID
+ in: path
+ description: World Link id to delete.
+ required: true
+ schema:
+ type: string
+ format: uuid
+ responses:
+ '200':
+ description: OK, delete successful.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "Element succesfully deleted"
+ '400':
+ $ref: '#/components/responses/400_InvalidUUID'
+ '404':
+ $ref: '#/components/responses/404_NotFoundUUID'
+
+# COMPONENTS ###############################################
+components:
+
+ #-------------------------------
+ # Reusable schemas (data models)
+ #-------------------------------
+ schemas:
+ Trackable:
+ description: An element representing a Trackable object in the real world.
+ type: object
+ required:
+ - name
+ - creatorUUID
+ - trackableType
+ - trackableEncodingInformation
+ - trackablePayload
+ - localCRS
+ - unit
+ - trackableSize
+ - keyvalueTags
+ properties:
+ UUID:
+ description: An Universally Unique IDentifier identifying the Trackable (RFC 4122).
+ type: string
+ format: uuid
+ example: fa8bbe40-8052-11ec-a8a3-0242ac120002
+ name:
+ description: A human readable name for the Trackable.
+ type: string
+ example: myTrackableXYZ
+ creatorUUID:
+ description: An Universally Unique IDentifier identifying the creator of the Trackable (a person, a team or a company).
+ type: string
+ format: uuid
+ example: bd6ce7ce-7fe8-487d-a179-fddfe914f293
+ trackableType:
+ description: Extensible list of Trackable types, possibly handled by complient world storage implementation.
+ type: string
+ enum: [FIDUCIAL_MARKER, IMAGE_MARKER, MAP, GEOPOSE, OTHER]
+ example: FIDUCIAL_MARKER
+ trackableEncodingInformation:
+ $ref: '#/components/schemas/EncodingInformationStructure'
+ trackablePayload:
+ description: The data provided to create the Trackable in a specific format handled by the world storage service.
+ type: string
+ format: byte
+ example: "10110101"
+ localCRS:
+ $ref: '#/components/schemas/Transform3D'
+ unit:
+ $ref: '#/components/schemas/UnitSystem'
+ trackableSize:
+ $ref: '#/components/schemas/Size'
+ keyvalueTags:
+ $ref: '#/components/schemas/KeyvalueTagList'
+
+ WorldAnchor:
+ description: An element describing a pose in the world graph.
+ type: object
+ required:
+ - name
+ - creatorUUID
+ - localCRS
+ - unit
+ - worldAnchorSize
+ - keyvalueTags
+ properties:
+ UUID:
+ description: An Universally Unique IDentifier identifying the World Anchor (RFC 4122).
+ type: string
+ format: uuid
+ example: 49d18ab3-1bf8-481d-919b-cd062a2fd428
+ name:
+ description: A human readable name for the World Anchor.
+ type: string
+ example: myWorldAnchorXYZ
+ creatorUUID:
+ description: An Universally Unique IDentifier identifying the creator of the World Anchor.
+ type: string
+ format: uuid
+ example: 6ddeb59e-7740-42f7-b329-1374b92e7fc2
+ localCRS:
+ $ref: '#/components/schemas/Transform3D'
+ unit:
+ $ref: '#/components/schemas/UnitSystem'
+ worldAnchorSize:
+ $ref: '#/components/schemas/Size'
+ keyvalueTags:
+ $ref: '#/components/schemas/KeyvalueTagList'
+
+ WorldLink:
+ description: An object holding the info of a transform between two elements.
+ type: object
+ required:
+ - creatorUUID
+ - UUIDFrom
+ - UUIDTo
+ - typeFrom
+ - typeTo
+ - transform
+ - unit
+ - keyvalueTags
+ properties:
+ UUID:
+ description: An Universally Unique IDentifier identifying the World Link (RFC 4122).
+ type: string
+ format: uuid
+ example: c6998f4f-1b8d-460b-9de8-4793b92fae2a
+ creatorUUID:
+ description: An Universally Unique IDentifier identifying the creator of the World Link.
+ type: string
+ format: uuid
+ example: 7506001c-9c00-4f84-ae2e-e4dfcb77d36a
+ UUIDFrom:
+ description: An Universally Unique IDentifier identifying a World Anchor or Trackable.
+ type: string
+ format: uuid
+ example: 60e11d81-1230-4588-be4c-93520a275012
+ UUIDTo:
+ description: An Universally Unique IDentifier identifying a World Anchor or Trackable.
+ type: string
+ format: uuid
+ example: 85eed503-875c-4d3d-9569-06c4859bd4cd
+ typeFrom:
+ $ref: '#/components/schemas/ObjectType'
+ typeTo:
+ $ref: '#/components/schemas/ObjectType'
+ transform:
+ $ref: '#/components/schemas/Transform3D'
+ unit:
+ $ref: '#/components/schemas/UnitSystem'
+ keyvalueTags:
+ $ref: '#/components/schemas/KeyvalueTagList'
+
+ EncodingInformationStructure:
+ description: An object holding the info of a Trackable`'`s encoding informations `:` the data format and the version.
+ required:
+ - dataFormat
+ - version
+ properties:
+ dataFormat:
+ description: Identifier of the target framework.
+ type: string
+ enum: [HOLOLENS, ARKIT, ARCORE, VUFORIA, ARUCO, OTHER]
+ example : "HOLOLENS"
+ version:
+ description: The version of the format
+ type: string
+ example : "1.01"
+
+ Transform3D:
+ description: Coordinate reference system of the world anchor, a 4*4 matrix (rowmajor) represented by a float vector.
+ type: array
+ minItems: 16
+ maxItems: 16
+ items:
+ type: number
+ format: float
+ example: [ 1, 0, 0, 3,
+ 0, 1, 0, 3,
+ 0, 0, 1, 3,
+ 0, 0, 0, 1]
+
+ ObjectType:
+ description: Type of a world representaion object.
+ type: string
+ enum: [Trackable, WorldAnchor, NotIdentified]
+ example: Trackable
+
+ UnitSystem:
+ description: Unit of length.
+ type: string
+ enum: [MM, CM, DM, M, DAM, HM, KM, INCH, FOOT, YARD, MILE]
+ example: M
+
+ Size:
+ description: Size object in format {width, length, depth}.
+ type: array
+ items:
+ type: number
+ format: double
+ minItems: 3
+ maxItems: 3
+ example: [1.0,1.0,1.5]
+
+ KeyvalueTagList:
+ description: List of additional parameters to be stored with the object.
+ type: object
+ additionalProperties:
+ type: array
+ items:
+ type: string
+ minItems: 1
+ example: { "Place" : ["Building 123"], "Room" : ["007"]}
+
+ Error:
+ required:
+ - code
+ - message
+ properties:
+ code:
+ type: integer
+ format: int32
+ example: 406
+ message:
+ type: string
+ example: "Error 406"
+
+ #-------------------------------
+ # Reusable responses
+ #-------------------------------
+ responses:
+ #######################
+ # 1xx : Informational #
+ #######################
+
+ #################
+ # 2xx : Success #
+ #################
+
+ #####################
+ # 3xx : Redirection #
+ #####################
+
+ #######################
+ # 4xx : Client Errors #
+ #######################
+ 400_BadRequest:
+ description: Bad request.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "Bad request"
+
+ 400_InvalidUUID:
+ description: Invalid UUID supplied.
+ content:
+ text/plain:
+ schema:
+ example: "The format of the UUID is incorrect"
+ type: string
+
+ 404_NotFoundUUID:
+ description: Not found, could not find UUID in database.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "Element not found"
+
+ 409_NotEmptyUUID:
+ description: Invalid UUID, id must be a Nil value.
+ content:
+ text/plain:
+ schema:
+ type: string
+ example: "The element you sent has already a value and can't be sent to the world storage"
+
+ 4xx_UnexpectedError: # Can be referenced as '#/components/responses/GenericError'
+ description: Unexpected error.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+
+ ########################
+ # 5xx : Server Errors #
+ ########################
+ 5xx_UnexpectedError:
+ description: Unexpected server error.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
diff --git a/API/openapitools.json b/API/openapitools.json
new file mode 100644
index 0000000000000000000000000000000000000000..3b40e47a45fd988f38e0b885958ceb2cac4a6201
--- /dev/null
+++ b/API/openapitools.json
@@ -0,0 +1,7 @@
+{
+ "$schema": "node_modules/@openapitools/openapi-generator-cli/config.schema.json",
+ "spaces": 2,
+ "generator-cli": {
+ "version": "5.3.0"
+ }
+}
diff --git a/README.md b/README.md
index 3b2052ba26c189b9c0cff3ec4776dd8b681c4c5a..6c0c54f5605a3f75d980948916266f365c48854c 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@
# Objectives
-Project dedicated to the development of an API standardizing the exchanges with a World Storage Representation service.
+This repository is dedicated to the development of the augmented reality framework (ARF) API (ETSI-ISG) for standardizing the exchanges with a World Storage. service. The API contains all the accees actions (REST) data (elements) needed to implement a World Representation with a World Graph.
# Associated workspaces
@@ -97,7 +97,37 @@ Contains temporary office documents that are edited collaboratively and all othe
- Visual Studio
- Visual Studio Code
-- Unity 3D
+- Unity 3D (Version 2020.3 LTS)
+
+# Creating Server/Client Code
+
+## Tool: openapi-generator
+
+We recommand the usage of the open source command-line tool **openapi-generator** while it has a good compatibility to API v3.x and produces accurate source code, similar to Swagger.
+
+Find a description here: https://openapi-generator.tech/docs/usage/
+
+Install the tool with "npm", see: https://openapi-generator.tech/docs/installation/
+
+### Help
+
+> npx @openapitools/openapi-generator-cli help
+
+### Validating the api
+
+> npx @openapitools/openapi-generator-cli validate -i API/openapi.yaml
+
+### Example C++ Server (Pistache)
+
+> npx @openapitools/openapi-generator-cli generate -i API/openapi.yaml -g cpp-pistache-server -o ./CodeGeneration/sever/cpp/pistache
+
+### Example ASP.NET Server (C#)
+
+> npx @openapitools/openapi-generator-cli generate -i API/openapi.yaml -g aspnetcore -o ./CodeGeneration/server/aspnetcore
+
+### Example C# Client
+
+> npx @openapitools/openapi-generator-cli generate -i API/openapi.yaml -g csharp -o ./CodeGeneration/client/csharp
# Branching Policy
Distributed version control systems like Git offers developers great flexibility to share and manage code. But a branching policy is crucial to collaborate more easily while keeping track of releases with bug fixes.
@@ -114,5 +144,3 @@ We consider 5 categories of branches:
-
-
diff --git a/UseCases/Fraunhofer HHI/DTWIN-SEQ-AR17-AddTrackable.png b/UseCases/Fraunhofer HHI/DTWIN-SEQ-AR17-AddTrackable.png
new file mode 100644
index 0000000000000000000000000000000000000000..3067079069622d2d763afa8873106c45d526675f
Binary files /dev/null and b/UseCases/Fraunhofer HHI/DTWIN-SEQ-AR17-AddTrackable.png differ
diff --git a/UseCases/Fraunhofer HHI/DTWIN-SEQ-AR17-AddTrackable.puml b/UseCases/Fraunhofer HHI/DTWIN-SEQ-AR17-AddTrackable.puml
new file mode 100644
index 0000000000000000000000000000000000000000..904573f21401821e8369dc9116e7c1c1e7983ca9
--- /dev/null
+++ b/UseCases/Fraunhofer HHI/DTWIN-SEQ-AR17-AddTrackable.puml
@@ -0,0 +1,96 @@
+@startuml
+
+participant "World Storage" as WS
+participant "Authoring Tool" as AT
+
+' THIS IS FOR SYSTEM A (3D-Reg)
+' -------------------------------
+
+WS <- AT: AR17-AddTrackable() - 3D-Registration (System B)
+
+rnote right AT
+**Payload**
+ Creator UID (not possible, external app)
++ Trackable Type (fiducial)
++ Trackable Encoding Information (Aruco)
++ Trackable Payload (no image saved)
++ Local CRS (to the middle of the workbench)
++ Unit System (mm)
++ Trackable Scale
++ KeyValue Tag List (table-id, end-device)
+end rnote
+
+activate WS
+
+WS -> WS : Extract features
+
+
+alt successful case
+rnote right WS
+**Payload**
+ Unique Identifier
+end rnote
+WS -> AT: AR17-Trackable unique Identifier
+deactivate WS
+note right AT
+Stores the identifier with the Trackable in the scene graph
+end note
+else ERROR: Trackable all exceptions
+WS -> AT: AR17-Trackable return exception
+end
+
+' THIS IS FOR SYSTEM B (Unity)
+' -------------------------------
+WS <- AT: AR17-AddTrackable() - Unity (System B)
+
+rnote right AT
+**Payload**
+ Creator UID (Unity Tag)
++ Trackable Type (image)
++ Trackable Encoding Information (Vuforia)
++ Trackable Payload (png image of Vuforia marker, size)
++ Local CRS (to the middle of the workbench)
++ Unit System (meters)
++ Trackable Scale
++ KeyValue Tag List (linked to HoloLens space mapping)
+end rnote
+
+activate WS
+
+WS -> WS : Extract features
+
+
+alt successful case
+rnote right WS
+**Payload**
+ Unique Identifier
+end rnote
+WS -> AT: AR17-Trackable unique Identifier
+deactivate WS
+note right AT
+Stores the identifier with the Trackable in the scene graph
+end note
+else ERROR: Trackable all exceptions
+WS -> AT: AR17-Trackable return exception
+end
+
+rnote left AT
+**Registrated Nodes**
+ QUESTION:
+ Is the 3d-pose (gridshell node) an object-trackable or a world anchor?
+
+ **Payload**
+ Unique Identifier
+ + Type = Node
+ + CAD-Identifier
+ + CAD-Name
+ + 3DT Position
+ + Bounding Box
+ + Ref to Gizmos Objects (position/rotation gizmos)
+ + Ref to annonations (info label)
+ + Logistic State (intern)
+ + Montage Seq
+ + Ticket State (public)
+
+end rnote
+@enduml
diff --git a/UseCases/Fraunhofer HHI/DTWIN-UseCases.png b/UseCases/Fraunhofer HHI/DTWIN-UseCases.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb730ee25d44228ab1d2c4f9abab0ddb45f19351
Binary files /dev/null and b/UseCases/Fraunhofer HHI/DTWIN-UseCases.png differ
diff --git a/UseCases/Fraunhofer HHI/DTWIN-UseCases.puml b/UseCases/Fraunhofer HHI/DTWIN-UseCases.puml
new file mode 100644
index 0000000000000000000000000000000000000000..e3025bae30a70dd65b2cb70858171c26777581e9
--- /dev/null
+++ b/UseCases/Fraunhofer HHI/DTWIN-UseCases.puml
@@ -0,0 +1,47 @@
+@startuml
+'default
+left to right direction
+
+rectangle "Authoring process" {
+ usecase "Login" as ucLOG
+ usecase "Setup Trackable" as ucST
+ usecase "Setup World Anchors" as ucSWA
+ usecase "Build AR Scene" as ucBARS
+ (ucST) -.> (ucLOG): <>
+ (ucSWA) -.> (ucLOG): <>
+ (ucBARS) -.> (ucLOG): <>
+ }
+
+package Users {
+ actor "Trackable Authoring" as TA
+ actor "World Anchor Authoring" as WAA
+ actor "AR Scene Authoring" as ASA
+}
+
+package Services {
+ actor :Authentication Service: as AuS <>
+ actor :World Storage: as WS <>
+ actor :Asset Preparation: as AP <>
+ actor :Content Hosting: as CH <>
+}
+
+'login
+TA ---- (ucLOG)
+WAA - (ucLOG)
+
+'setups
+TA -- (ucST)
+WAA -- (ucSWA)
+ASA -- (ucBARS)
+
+'services
+(ucLOG) ---- AuS
+(ucST) -- WS
+(ucST) -- AP
+(ucSWA) -- WS
+(ucSWA) -- AP
+(ucBARS) -- CH
+(ucBARS) -- WS
+(ucBARS) -- AP
+
+@enduml
\ No newline at end of file
diff --git a/UseCases/Fraunhofer HHI/ReadMe.md b/UseCases/Fraunhofer HHI/ReadMe.md
new file mode 100644
index 0000000000000000000000000000000000000000..b850bbcaddf246cd230a28cde0f5c80fc49a0e86
--- /dev/null
+++ b/UseCases/Fraunhofer HHI/ReadMe.md
@@ -0,0 +1,5 @@
+# Fraunhofer HHI
+
+This is only for testing!
+
+Should be removed later.
\ No newline at end of file
diff --git a/UseCases/Fraunhofer HHI/SEQ-DTWIN-SetupTrackables.puml b/UseCases/Fraunhofer HHI/SEQ-DTWIN-SetupTrackables.puml
new file mode 100644
index 0000000000000000000000000000000000000000..fadc9d9e6d964f27516ab6c689991288f0847976
--- /dev/null
+++ b/UseCases/Fraunhofer HHI/SEQ-DTWIN-SetupTrackables.puml
@@ -0,0 +1,75 @@
+@startuml
+
+participant "World Storage" as WS
+participant "Authoring Tool" as AT
+participant "Trackable Author" as DS
+participant "Asset Preparation" as AP
+participant "Content Hosting" as CH
+participant "Authentication Service" as AS
+
+
+DS -> AS ++ : Login
+return OK
+
+group Loop on 3D models
+DS -> AP ++ : Request 3D Model of the World
+return 3D Model (FBX)
+
+DS -> AT ++ : Load 3D Model into scene graph
+return OK
+end group
+
+
+note right
+Done by hand
+end note
+
+group Loop on Trackables
+DS -> AP ++ : Request Trackable
+return Trackable + Description
+
+DS -> AT ++ : Place the Trackable in the scene graph
+return OK
+
+DS -> AT ++ : Add Key/value tags on the Trackable
+return OK
+note right
+Author level tags
+end note
+
+end group
+note right
+Done by hand
+end note
+
+group Loop on 3D models
+DS -> AT ++ : Associate each 3D model to a Trackable
+return OK
+end group
+
+DS -> AT ++ : Press Save
+
+group Loop on Trackables
+AT-> AT : Add Key/value tags on the Trackables (auto)
+note right
+Authoring application level tags (Author, date, location...)
+end note
+
+AT -> WS ++ : AR17-AddTrackable
+WS -> WS : Extract Feature
+return Trackable ID
+
+AT-> AT : Store Trackable ID in the scene graph
+
+group Loop on associated models
+AT -> WS ++ : AR17-AddModelToTrackable
+return OK
+end group
+end group
+
+AT -> AT ++ : Save AR Project
+return OK
+
+return OK
+
+@enduml