Initial commit

This commit is contained in:
2026-07-03 16:37:12 +07:00
commit 63b8c1ea8b
1931 changed files with 640587 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "connection",
"description": "The last will message of the AGV. Has to be sent with retain flag.\nOnce the AGV comes online, it has to send this message on its connect topic, with the connectionState enum set to \"ONLINE\".\n The last will message is to be configured with the connection state set to \"CONNECTIONBROKEN\".\nThus, if the AGV disconnects from the broker, master control gets notified via the topic \"connection\".\nIf the AGV is disconnecting in an orderly fashion (e.g. shutting down, sleeping), the AGV is to publish a message on this topic with the connectionState set to \"DISCONNECTED\".",
"subtopic": "/connection",
"type": "object",
"required": [
"headerId",
"timestamp",
"version",
"manufacturer",
"serialNumber",
"connectionState"
],
"properties": {
"headerId": {
"type": "integer",
"description": "Header ID of the message. The headerId is defined per topic and incremented by 1 with each sent (but not necessarily received) message."
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "Timestamp in ISO8601 format (YYYY-MM-DDTHH:mm:ss.ssZ).",
"examples": [
"1991-03-11T11:40:03.12Z"
]
},
"version": {
"type": "string",
"description": "Version of the protocol [Major].[Minor].[Patch]",
"examples": [
"1.3.2"
]
},
"manufacturer": {
"type": "string",
"description": "Manufacturer of the AGV."
},
"serialNumber": {
"type": "string",
"description": "Serial number of the AGV."
},
"connectionState": {
"type": "string",
"enum": [
"ONLINE",
"OFFLINE",
"CONNECTIONBROKEN"
],
"description": "ONLINE: connection between AGV and broker is active. OFFLINE: connection between AGV and broker has gone offline in a coordinated way. CONNECTIONBROKEN: The connection between AGV and broker has unexpectedly ended."
}
}
}

View File

@@ -0,0 +1,831 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "AGV Factsheet",
"description": "The factsheet provides basic information about a specific AGV type series. This information allows comparison of different AGV types and can be applied for the planning, dimensioning and simulation of an AGV system. The factsheet also includes information about AGV communication interfaces which are required for the integration of an AGV type series into a VD[M]A-5050-compliant master control.",
"required": [
"headerId",
"timestamp",
"version",
"manufacturer",
"serialNumber",
"typeSpecification",
"physicalParameters",
"protocolLimits",
"protocolFeatures",
"agvGeometry",
"loadSpecification"
],
"subtopic": "/factsheet",
"type": "object",
"properties":{
"headerId": {
"type": "integer",
"description": "header ID of the message. The headerId is defined per topic and incremented by 1 with each sent (but not necessarily received) message.",
"minimum": 0
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "Timestamp in ISO8601 format (YYYY-MM-DDTHH:mm:ss.ffZ).",
"examples": [
"1991-03-11T11:40:03.12Z"
]
},
"version": {
"type": "string",
"description": "Version of the VD[M]A-5050 protocol [Major].[Minor].[Patch] (e.g. 1.3.2)",
"examples": [
"2.0.0"
]
},
"manufacturer": {
"type": "string",
"description": "Manufacturer of the AGV"
},
"serialNumber": {
"type": "string",
"description": "Serial number of the AGV"
},
"typeSpecification": {
"type": "object",
"required": [
"seriesName",
"agvKinematic",
"agvClass",
"maxLoadMass",
"localizationTypes",
"navigationTypes"
],
"description": "These parameters generally specify the class and the capabilities of the AGV",
"properties": {
"seriesName": {
"type": "string",
"description": "Free text generalized series name as specified by manufacturer"
},
"seriesDescription": {
"type": "string",
"description": "Free text human readable description of the AGV type series"
},
"agvKinematic": {
"type": "string",
"description": "simplified description of AGV kinematics-type.",
"enum": [
"DIFF",
"OMNI",
"THREEWHEEL"
]
},
"agvClass": {
"type": "string",
"description": "Simplified description of AGV class.",
"enum": [
"FORKLIFT",
"CONVEYOR",
"TUGGER",
"CARRIER"
]
},
"maxLoadMass": {
"type": "number",
"description": "maximum loadable mass",
"unit": "kg",
"minimum": 0
},
"localizationTypes": {
"type": "array",
"description": "simplified description of localization type",
"items": {
"type": "string",
"enum": [
"NATURAL",
"REFLECTOR",
"RFID",
"DMC",
"SPOT",
"GRID"
]
}
},
"navigationTypes": {
"type": "array",
"description": "List of path planning types supported by the AGV, sorted by priority",
"items": {
"type": "string",
"enum": [
"PHYSICAL_LINE_GUIDED",
"VIRTUAL_LINE_GUIDED",
"AUTONOMOUS"
]
}
}
}
},
"physicalParameters": {
"type": "object",
"required": [
"speedMin",
"speedMax",
"accelerationMax",
"decelerationMax",
"heightMax",
"width",
"length"
],
"description": "These parameters specify the basic physical properties of the AGV",
"properties": {
"speedMin": {
"type": "number",
"description": "minimal controlled continuous speed of the AGV",
"unit": "m/s"
},
"speedMax": {
"type": "number",
"description": "maximum speed of the AGV",
"unit": "m/s"
},
"accelerationMax": {
"type": "number",
"description": "maximum acceleration with maximum load",
"unit": "m/s^2"
},
"decelerationMax": {
"type": "number",
"description": "maximum deceleration with maximum load",
"unit": "m/s^2"
},
"heightMin": {
"type": "number",
"description": "minimum height of AGV",
"unit": "m"
},
"heightMax": {
"type": "number",
"description": "maximum height of AGV",
"unit": "m"
},
"width": {
"type": "number",
"description": "width of AGV",
"unit": "m"
},
"length": {
"type": "number",
"description": "length of AGV",
"unit": "m"
}
}
},
"protocolLimits": {
"type": "object",
"required": [
"maxStringLens",
"maxArrayLens",
"timing"
],
"description": "This JSON-object describes the protocol limitations of the AGV. If a parameter is not defined or set to zero then there is no explicit limit for this parameter.",
"properties": {
"maxStringLens": {
"type": "object",
"description": "maximum lengths of strings",
"properties": {
"msgLen": {
"type": "integer",
"description": "maximum MQTT Message length"
},
"topicSerialLen": {
"type": "integer",
"description": "maximum length of serial-number part in MQTT-topics. Affected Parameters: order.serialNumber, instantActions.serialNumber, state.SerialNumber, visualization.serialNumber, connection.serialNumber"
},
"topicElemLen": {
"type": "integer",
"description": "maximum length of all other parts in MQTT-topics. Affected parameters: order.timestamp, order.version, order.manufacturer, instantActions.timestamp, instantActions.version, instantActions.manufacturer, state.timestamp, state.version, state.manufacturer, visualization.timestamp, visualization.version, visualization.manufacturer, connection.timestamp, connection.version, connection.manufacturer"
},
"idLen": {
"type": "integer",
"description": "maximum length of ID-Strings. Affected parameters: order.orderId, order.zoneSetId, node.nodeId, nodePosition.mapId, action.actionId, edge.edgeId, edge.startNodeId, edge.endNodeId"
},
"idNumericalOnly": {
"type": "boolean",
"description": "If true ID-strings need to contain numerical values only"
},
"enumLen": {
"type": "integer",
"description": "maximum length of ENUM- and Key-Strings. Affected parameters: action.actionType, action.blockingType, edge.direction, actionParameter.key, state.operatingMode, load.loadPosition, load.loadType, actionState.actionStatus, error.errorType, error.errorLevel, errorReference.referenceKey, info.infoType, info.infoLevel, safetyState.eStop, connection.connectionState"
},
"loadIdLen": {
"type": "integer",
"description": "maximum length of loadId Strings"
}
}
},
"maxArrayLens": {
"type": "object",
"description": "maximum lengths of arrays",
"properties": {
"order.nodes": {
"type": "integer",
"description": "maximum number of nodes per order processable by the AGV"
},
"order.edges": {
"type": "integer",
"description": "maximum number of edges per order processable by the AGV"
},
"node.actions": {
"type": "integer",
"description": "maximum number of actions per node processable by the AGV"
},
"edge.actions": {
"type": "integer",
"description": "maximum number of actions per edge processable by the AGV"
},
"actions.actionsParameters": {
"type": "integer",
"description": "maximum number of parameters per action processable by the AGV"
},
"instantActions": {
"type": "integer",
"description": "maximum number of instant actions per message processable by the AGV"
},
"trajectory.knotVector": {
"type": "integer",
"description": "maximum number of knots per trajectory processable by the AGV"
},
"trajectory.controlPoints": {
"type": "integer",
"description": "maximum number of control points per trajectory processable by the AGV"
},
"state.nodeStates": {
"type": "integer",
"description": "maximum number of nodeStates sent by the AGV, maximum number of nodes in base of AGV"
},
"state.edgeStates": {
"type": "integer",
"description": "maximum number of edgeStates sent by the AGV, maximum number of edges in base of AGV"
},
"state.loads": {
"type": "integer",
"description": "maximum number of load-objects sent by the AGV"
},
"state.actionStates": {
"type": "integer",
"description": "maximum number of actionStates sent by the AGV"
},
"state.errors": {
"type": "integer",
"description": "maximum number of errors sent by the AGV in one state-message"
},
"state.information": {
"type": "integer",
"description": "maximum number of information objects sent by the AGV in one state-message"
},
"error.errorReferences": {
"type": "integer",
"description": "maximum number of error references sent by the AGV for each error"
},
"information.infoReferences": {
"type": "integer",
"description": "maximum number of info references sent by the AGV for each information"
}
}
},
"timing": {
"type": "object",
"required": [
"minOrderInterval",
"minStateInterval"
],
"description": "timing information",
"properties": {
"minOrderInterval": {
"type": "number",
"description": "minimum interval sending order messages to the AGV",
"unit": "s"
},
"minStateInterval": {
"type": "number",
"description": "minimum interval for sending state-messages",
"unit": "s"
},
"defaultStateInterval": {
"type": "number",
"description": "default interval for sending state-messages if not defined, the default value from the main document is used",
"unit": "s"
},
"visualizationInterval": {
"type": "number",
"description": "default interval for sending messages on visualization topic",
"unit": "s"
}
}
}
}
},
"protocolFeatures": {
"type": "object",
"required": [
"optionalParameters",
"agvActions"
],
"description": "Supported features of VDA5050 protocol",
"properties": {
"optionalParameters": {
"type": "array",
"description": "list of supported and/or required optional parameters. Optional parameters, that are not listed here, are assumed to be not supported by the AGV.",
"items": {
"type": "object",
"required": [
"parameter",
"support"
],
"properties": {
"parameter": {
"type": "string",
"description": "full name of optional parameter, e.g. “order.nodes.nodePosition.allowedDeviationTheta”"
},
"support": {
"type": "string",
"description": "type of support for the optional parameter, the following values are possible: SUPPORTED: optional parameter is supported like specified. REQUIRED: optional parameter is required for proper AGV-operation.",
"enum": [
"SUPPORTED",
"REQUIRED"
]
},
"description": {
"type": "string",
"description": "free text. Description of optional parameter. E.g. Reason, why the optional parameter direction is necessary for this AGV-type and which values it can contain. The parameter nodeMarker must contain unsigned interger-numbers only. Nurbs-Support is limited to straight lines and circle segments."
}
}
}
},
"agvActions": {
"type": "array",
"description": "list of all actions with parameters supported by this AGV. This includes standard actions specified in VDA5050 and manufacturer-specific actions",
"items": {
"required": [
"actionType",
"actionScopes"
],
"type": "object",
"properties": {
"actionType": {
"type": "string",
"description": "unique actionType corresponding to action.actionType"
},
"actionDescription": {
"type": "string",
"description": "free text: description of the action"
},
"actionScopes": {
"type": "array",
"description": "list of allowed scopes for using this action-type. INSTANT: usable as instantAction, NODE: usable on nodes, EDGE: usable on edges.",
"items": {
"type": "string",
"enum": [
"INSTANT",
"NODE",
"EDGE"
]
}
},
"actionParameters": {
"type": "array",
"description": "list of parameters. if not defined, the action has no parameters",
"items": {
"type": "object",
"required": [
"key",
"valueDataType"
],
"properties": {
"key": {
"type": "string",
"description": "key-String for Parameter"
},
"valueDataType": {
"type": "string",
"description": "data type of Value, possible data types are: BOOL, NUMBER, INTEGER, FLOAT, STRING, OBJECT, ARRAY",
"enum": [
"BOOL",
"NUMBER",
"INTEGER",
"FLOAT",
"STRING",
"OBJECT",
"ARRAY"
]
},
"description": {
"type": "string",
"description": "free text: description of the parameter"
},
"isOptional": {
"type": "boolean",
"description": "True: optional parameter"
}
}
}
},
"resultDescription": {
"type": "string",
"description": "free text: description of the resultDescription"
},
"blockingTypes": {
"type": "array",
"description": "Array of possible blocking types for defined action.",
"items": {
"type":"string",
"enum": [
"NONE",
"SOFT",
"HARD"
]
}
}
}
}
}
}
},
"agvGeometry": {
"type": "object",
"description": "Detailed definition of AGV geometry",
"properties": {
"wheelDefinitions": {
"type": "array",
"description": "list of wheels, containing wheel-arrangement and geometry",
"items": {
"type": "object",
"required": [
"type",
"isActiveDriven",
"isActiveSteered",
"position",
"diameter",
"width"
],
"properties": {
"type": {
"type": "string",
"description": "wheel type. DRIVE, CASTER, FIXED, MECANUM",
"enum": [
"DRIVE",
"CASTER",
"FIXED",
"MECANUM"
]
},
"isActiveDriven": {
"type": "boolean",
"description": "True: wheel is actively driven (de: angetrieben)"
},
"isActiveSteered": {
"type": "boolean",
"description": "True: wheel is actively steered (de: aktiv gelenkt)"
},
"position": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number",
"description": "[m] x-position in AGV-coordinate system",
"unit": "m"
},
"y": {
"type": "number",
"description": "y-position in AGV-coordinate system",
"unit": "m"
},
"theta": {
"type": "number",
"description": "orientation of wheel in AGV-coordinate system Necessary for fixed wheels",
"unit": "rad"
}
}
},
"diameter": {
"type": "number",
"description": "nominal diameter of wheel",
"unit": "m"
},
"width": {
"type": "number",
"description": "nominal width of wheel",
"unit": "m"
},
"centerDisplacement": {
"type": "number",
"unit": "m",
"description": "nominal displacement of the wheels center to the rotation point (necessary for caster wheels). If the parameter is not defined, it is assumed to be 0"
},
"constraints": {
"type": "string",
"description": "free text: can be used by the manufacturer to define constraints"
}
}
}
},
"envelopes2d": {
"type": "array",
"items": {
"type": "object",
"required": [
"set",
"polygonPoints"
],
"properties": {
"set": {
"type": "string",
"description": "name of the envelope curve set"
},
"polygonPoints": {
"type": "array",
"description": "envelope curve as a x/y-polygon polygon is assumed as closed and must be non-self-intersecting",
"items": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number",
"description": "x-position of polygon-point",
"unit": "m"
},
"y": {
"type": "number",
"description": " y-position of polygon-point",
"unit": "m"
}
}
}
},
"description": {
"type": "string",
"description": "free text: description of envelope curve set"
}
}
}
},
"envelopes3d": {
"type": "array",
"description": "list of AGV-envelope curves in 3D (german: „Hüllkurven“)",
"items": {
"type": "object",
"required": [
"set",
"format"
],
"properties": {
"set": {
"type": "string",
"description": "name of the envelope curve set"
},
"format": {
"type": "string",
"description": "format of data e.g. DXF"
},
"data": {
"type": "object",
"description": "3D-envelope curve data, format specified in format"
},
"url": {
"type": "string",
"description": "protocol and url-definition for downloading the 3D-envelope curve data e.g. ftp://xxx.yyy.com/ac4dgvhoif5tghji"
},
"description": {
"type": "string",
"description": "free text: description of envelope curve set"
}
}
}
}
}
},
"loadSpecification": {
"type": "object",
"description": "Abstract specification of load capabilities",
"properties": {
"loadPositions": {
"type": "array",
"description": "list of load positions / load handling devices. This lists contains the valid values for the parameter “state.loads[].loadPosition” and for the action parameter “lhd” of the actions pick and drop. If this list doesnt exist or is empty, the AGV has no load handling device.",
"items": {
"type": "string"
}
},
"loadSets": {
"type": "array",
"description": "list of load-sets that can be handled by the AGV",
"items": {
"type": "object",
"required": [
"setName",
"loadType"
],
"properties": {
"setName": {
"type": "string",
"description": "Unique name of the load set, e.g. DEFAULT, SET1, ..."
},
"loadType": {
"type": "string",
"description": "type of load e.g. EPAL, XLT1200, …."
},
"loadPositions": {
"type": "array",
"description": "list of load positions btw. load handling devices, this load-set is valid for. If this parameter does not exist or is empty, this load-set is valid for all load handling devices on this AGV.",
"items": {
"type": "string"
}
},
"boundingBoxReference": {
"type": "object",
"required": [
"x",
"y",
"z"
],
"description": "bounding box reference as defined in parameter loads[] in state-message",
"properties": {
"x": {
"type": "number",
"description": "x-coordinate of the point of reference."
},
"y": {
"type": "number",
"description": "y-coordinate of the point of reference."
},
"z": {
"type": "number",
"description": "z-coordinate of the point of reference."
},
"theta": {
"type": "number",
"description": "Orientation of the loads bounding box. Important for tugger trains, etc."
}
}
},
"loadDimensions": {
"type": "object",
"required": [
"length",
"width"
],
"properties": {
"length": {
"type": "number",
"description": "Absolute length of the load´s bounding box."
},
"width": {
"type": "number",
"description": "Absolute width of the load´s bounding bo"
},
"height": {
"type": "number",
"description": "Absolute height of the load´s bounding box. Optional: Set value only if known."
}
}
},
"maxWeight": {
"type": "number",
"description": "maximum weight of loadtype",
"unit": "kg"
},
"minLoadhandlingHeight": {
"type": "number",
"unit": "m",
"description": "minimum allowed height for handling of this load-type and weight. References to boundingBoxReference"
},
"maxLoadhandlingHeight": {
"type": "number",
"unit": "m",
"description": "maximum allowed height for handling of this load-type and weight. references to boundingBoxReference"
},
"minLoadhandlingDepth": {
"type": "number",
"unit": "m",
"description": "minimum allowed depth for this load-type and weight. references to boundingBoxReference"
},
"maxLoadhandlingDepth": {
"type": "number",
"unit": "m",
"description": "maximum allowed depth for this load-type and weight. references to boundingBoxReference"
},
"minLoadhandlingTilt": {
"type": "number",
"unit": "rad",
"description": "minimum allowed tilt for this load-type and weight"
},
"maxLoadhandlingTilt": {
"type": "number",
"unit": "rad",
"description": "maximum allowed tilt for this load-type and weight"
},
"agvSpeedLimit": {
"type": "number",
"unit": "m/s^2",
"description": "maximum allowed speed for this load-type and weight"
},
"agvAccelerationLimit": {
"type": "number",
"unit": "m/s^2",
"description": "maximum allowed acceleration for this load-type and weight"
},
"agvDecelerationLimit": {
"type": "number",
"unit": "m/s^2",
"description": "maximum allowed deceleration for this load-type and weight"
},
"pickTime": {
"type": "number",
"unit": "s",
"description": "approx. time for picking up the load"
},
"dropTime": {
"type": "number",
"unit": "s",
"description": "approx. time for dropping the load"
},
"description": {
"type": "string",
"description": "free text description of the load handling set"
}
}
}
}
}
},
"vehicleConfig": {
"type": "object",
"properties": {
"versions": {
"type": "array",
"description": "Array containing various hardware and software versions running on the vehicle.",
"items": {
"title": "version",
"type": "object",
"required": [
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"description": "The key of the version.",
"examples": [
"softwareVersion",
"cameraVersion",
"plcSoftChecksum"
]
},
"value": {
"type": "string",
"description": "The value of the action parameter.",
"examples": [
"v1.03.2",
"0620NL51805A0",
"0x4297F30C"
]
}
}
}
},
"network": {
"type": "object",
"properties": {
"dnsServers": {
"type": "array",
"description": "List of DNS servers used by the vehicle.",
"items": {
"type": "string"
}
},
"localIpAddress": {
"type": "string",
"description": "A priori assigned IP address of the vehicle used to communicate with the MQTT broker. Note that this IP address should not be modified/changed during operations."
},
"ntpServers": {
"type": "array",
"description": "List of NTP servers used by the vehicle.",
"items": {
"type": "string"
}
},
"netmask": {
"type": "string",
"description": "Network subnet mask."
},
"defaultGateway": {
"type": "string",
"description": "Default gateway used by the vehicle."
}
}
}
}
}
}
}

View File

@@ -0,0 +1,126 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "instantActions",
"description": "JSON Schema for publishing instantActions that the AGV is to execute as soon as they arrive.",
"required": [
"headerId",
"timestamp",
"version",
"manufacturer",
"serialNumber",
"actions"
],
"subtopic": "/instantActions",
"type": "object",
"properties": {
"headerId": {
"title": "headerId",
"type": "integer",
"description": "headerId of the message. The headerId is defined per topic and incremented by 1 with each sent (but not necessarily received) message."
},
"timestamp": {
"title": "timestamp",
"type": "string",
"format": "date-time",
"description": "Timestamp in ISO8601 format (YYYY-MM-DDTHH:mm:ss.ffZ).",
"examples": [
"1991-03-11T11:40:03.12Z"
]
},
"version": {
"title": "Version",
"type": "string",
"description": "Version of the protocol [Major].[Minor].[Patch]",
"examples": [
"1.3.2"
]
},
"manufacturer": {
"type": "string",
"description": "Manufacturer of the AGV"
},
"serialNumber": {
"type": "string",
"description": "Serial number of the AGV."
},
"actions": {
"type": "array",
"items": {
"type": "object",
"description": "Describes an action that the AGV can perform.",
"required": [
"actionId",
"actionType",
"blockingType"
],
"properties": {
"actionType": {
"type": "string",
"description": "Name of action as described in the first column of \"Actions and Parameters\". Identifies the function of the action."
},
"actionId": {
"type": "string",
"description": "Unique ID to identify the action and map them to the actionState in the state. Suggestion: Use UUIDs."
},
"actionDescription": {
"type": "string",
"description": "Additional information on the action."
},
"blockingType": {
"type": "string",
"description": "Regulates if the action is allowed to be executed during movement and/or parallel to other actions.\nnone: action can happen in parallel with others, including movement.\nsoft: action can happen simultaneously with others, but not while moving.\nhard: no other actions can be performed while this action is running.",
"enum": [
"NONE",
"SOFT",
"HARD"
]
},
"actionParameters": {
"type": "array",
"description": "Array of actionParameter-objects for the indicated action e. g. deviceId, loadId, external Triggers.",
"items": {
"title": "actionParameter",
"type": "object",
"required": [
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"description": "The key of the action parameter.",
"examples": [
"duration",
"direction",
"signal"
]
},
"value": {
"type": [
"array",
"boolean",
"number",
"string",
"object"
],
"description": "The value of the action parameter",
"examples": [
103.2,
"left",
true,
[
"arrays",
"are",
"also",
"valid"
]
]
}
}
}
}
}
}
}
}
}

View File

@@ -0,0 +1,394 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Order Message",
"description": "The message schema to communicate orders from master control to the AGV.",
"subtopic": "/order",
"type": "object",
"required": [
"headerId",
"timestamp",
"version",
"manufacturer",
"serialNumber",
"orderId",
"orderUpdateId",
"nodes",
"edges"
],
"properties": {
"headerId": {
"type": "integer",
"description": "headerId of the message. The headerId is defined per topic and incremented by 1 with each sent (but not necessarily received) message."
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "Timestamp in ISO8601 format (YYYY-MM-DDTHH:mm:ss.ffZ).",
"examples": [
"1991-03-11T11:40:03.12Z"
]
},
"version": {
"type": "string",
"description": "Version of the protocol [Major].[Minor].[Patch]",
"examples": [
"1.3.2"
]
},
"manufacturer": {
"type": "string",
"description": "Manufacturer of the AGV"
},
"serialNumber": {
"type": "string",
"description": "Serial number of the AGV."
},
"orderId": {
"description": "Order Identification. This is to be used to identify multiple order messages that belong to the same order.",
"type": "string"
},
"orderUpdateId": {
"description": "orderUpdate identification. Is unique per orderId. If an order update is rejected, this field is to be passed in the rejection message.",
"type": "integer",
"minimum": 0
},
"zoneSetId": {
"description": "Unique identifier of the zone set that the AGV has to use for navigation or that was used by MC for planning.\nOptional: Some MC systems do not use zones. Some AGVs do not understand zones. Do not add to message if no zones are used.",
"type": "string"
},
"nodes": {
"description": "Array of nodes objects to be traversed for fulfilling the order. One node is enough for a valid order. Leave edge list empty for that case.",
"type": "array",
"items": {
"type": "object",
"title": "node",
"required": [
"nodeId",
"sequenceId",
"released",
"actions"
],
"properties": {
"nodeId": {
"type": "string",
"description": "Unique node identification",
"examples": [
"pumpenhaus_1",
"MONTAGE"
]
},
"sequenceId": {
"type": "integer",
"minimum": 0,
"description": "Number to track the sequence of nodes and edges in an order and to simplify order updates.\nThe main purpose is to distinguish between a node which is passed more than once within one orderId. The variable sequenceId runs across all nodes and edges of the same order and is reset when a new orderId is issued."
},
"nodeDescription": {
"type": "string",
"description": "Additional information on the node."
},
"released": {
"type": "boolean",
"description": "True indicates that the node is part of the base. False indicates that the node is part of the horizon."
},
"nodePosition": {
"description": "Defines the position on a map in world coordinates. Each floor has its own map. All maps must use the same project specific global origin. \nOptional for vehicle-types that do not require the node position (e.g., line-guided vehicles).",
"type": "object",
"required": [
"x",
"y",
"mapId"
],
"properties": {
"x": {
"type": "number",
"description": "X-position on the map in reference to the map coordinate system. Precision is up to the specific implementation."
},
"y": {
"type": "number",
"description":"Y-position on the map in reference to the map coordinate system. Precision is up to the specific implementation."
},
"theta": {
"type": "number",
"description": "Absolute orientation of the AGV on the node. \nOptional: vehicle can plan the path by itself.\nIf defined, the AGV has to assume the theta angle on this node. If previous edge disallows rotation, the AGV must rotate on the node. If following edge has a differing orientation defined but disallows rotation, the AGV is to rotate on the node to the edges desired rotation before entering the edge.",
"minimum": -3.14159265359,
"maximum": 3.14159265359
},
"allowedDeviationXY": {
"type": "number",
"description": "Indicates how exact an AGV has to drive over a node in order for it to count as traversed.\nIf = 0: no deviation is allowed (no deviation means within the normal tolerance of the AGV manufacturer).\nIf > 0: allowed deviation-radius in meters. If the AGV passes a node within the deviation-radius, the node is considered to have been traversed.",
"minimum": 0
},
"allowedDeviationTheta": {
"type": "number",
"minimum": 0.0,
"maximum": 3.141592654,
"description": "Indicates how big the deviation of theta angle can be. \nThe lowest acceptable angle is theta - allowedDeviationTheta and the highest acceptable angle is theta + allowedDeviationTheta."
},
"mapId": {
"description": "Unique identification of the map in which the position is referenced.\nEach map has the same origin of coordinates. When an AGV uses an elevator, e.g., leading from a departure floor to a target floor, it will disappear off the map of the departure floor and spawn in the related lift node on the map of the target floor.",
"type": "string"
},
"mapDescription": {
"description": "Additional information on the map.",
"type": "string"
}
}
},
"actions": {
"description": "Array of actions to be executed on a node. Empty array, if no actions required.",
"type": "array",
"items": {
"$ref": "#/definitions/action"
}
}
}
}
},
"edges": {
"type": "array",
"description": "Directional connection between two nodes. Array of edge objects to be traversed for fulfilling the order. One node is enough for a valid order. Leave edge list empty for that case.",
"items": {
"type": "object",
"title": "edge",
"required": [
"edgeId",
"sequenceId",
"released",
"startNodeId",
"endNodeId",
"actions"
],
"properties": {
"edgeId": {
"type": "string",
"description": "Unique edge identification"
},
"sequenceId": {
"type": "integer",
"minimum": 0,
"description": "Number to track the sequence of nodes and edges in an order and to simplify order updates. The variable sequenceId runs across all nodes and edges of the same order and is reset when a new orderId is issued."
},
"edgeDescription": {
"type": "string",
"description": "Additional information on the edge."
},
"released": {
"type": "boolean",
"description": "True indicates that the edge is part of the base. False indicates that the edge is part of the horizon."
},
"startNodeId": {
"type": "string",
"description": "The nodeId of the start node."
},
"endNodeId": {
"type": "string",
"description": "The nodeId of the end node."
},
"maxSpeed": {
"type": "number",
"description": "Permitted maximum speed on the edge in m/s. Speed is defined by the fastest measurement of the vehicle."
},
"maxHeight": {
"type": "number",
"description": "Permitted maximum height of the vehicle, including the load, on edge in meters."
},
"minHeight": {
"type": "number",
"description": "Permitted minimal height of the load handling device on the edge in meters"
},
"orientation": {
"type": "number",
"description": "Orientation of the AGV on the edge. The value orientationType defines if it has to be interpreted relative to the global project specific map coordinate system or tangential to the edge. In case of interpreted tangential to the edge 0.0 = forwards and PI = backwards. Example: orientation Pi/2 rad will lead to a rotation of 90 degrees. \nIf AGV starts in different orientation, rotate the vehicle on the edge to the desired orientation if rotationAllowed is set to True. If rotationAllowed is False, rotate before entering the edge. If that is not possible, reject the order. \nIf no trajectory is defined, apply the rotation to the direct path between the two connecting nodes of the edge. If a trajectory is defined for the edge, apply the orientation to the trajectory.",
"minimum": -3.14159265359,
"maximum": 3.14159265359
},
"orientationType":{
"type": "string",
"description": "Enum {GLOBAL, TANGENTIAL}: \n\"GLOBAL\"- relative to the global project specific map coordinate system; \n\"TANGENTIAL\"- tangential to the edge. \nIf not defined, the default value is \"TANGENTIAL\"."
},
"direction": {
"type": "string",
"description": "Sets direction at junctions for line-guided or wire-guided vehicles, to be defined initially (vehicle-individual)."
},
"rotationAllowed": {
"type": "boolean",
"description": "True: rotation is allowed on the edge. False: rotation is not allowed on the edge. \nOptional: No limit, if not set."
},
"maxRotationSpeed": {
"type": "number",
"description": "Maximum rotation speed in rad/s. \nOptional: No limit, if not set."
},
"length": {
"type": "number",
"description": "Distance of the path from startNode to endNode in meters. \nOptional: This value is used by line-guided AGVs to decrease their speed before reaching a stop position."
},
"trajectory": {
"type": "object",
"description": "Trajectory JSON-object for this edge as a NURBS. Defines the curve, on which the AGV should move between startNode and endNode. \nOptional: Can be omitted, if AGV cannot process trajectories or if AGV plans its own trajectory.",
"required": [
"degree",
"knotVector",
"controlPoints"
],
"properties": {
"degree": {
"type": "integer",
"description": "Defines the number of control points that influence any given point on the curve. Increasing the degree increases continuity. If not defined, the default value is 1.",
"minimum": 1
},
"knotVector": {
"type": "array",
"description": "Sequence of parameter values that determines where and how the control points affect the NURBS curve. knotVector has size of number of control points + degree + 1.",
"items": {
"type": "number",
"maximum": 1,
"minimum": 0
}
},
"controlPoints": {
"type": "array",
"description": "List of JSON controlPoint objects defining the control points of the NURBS, which includes the beginning and end point.",
"items": {
"type": "object",
"title": "controlPoint",
"properties": {
"x": {
"type": "number",
"description": "X coordinate described in the world coordinate system."
},
"y": {
"type": "number",
"description": "Y coordinate described in the world coordinate system."
},
"weight": {
"type": "number",
"minimum": 0,
"description": "The weight, with which this control point pulls on the curve. When not defined, the default will be 1.0."
}
},
"required": [
"x",
"y"
]
}
}
}
},
"corridor": {
"description": "Definition of boundaries in which a vehicle can deviate from its trajectory, e. g. to avoid obstacles.",
"type": "object",
"required": [
"leftWidth",
"rightWidth"
],
"properties": {
"leftWidth": {
"type": "number",
"description": "Defines the width of the corridor in meters to the left related to the trajectory of the vehicle.",
"minimum": 0.0
},
"rightWidth": {
"type": "number",
"description":"Defines the width of the corridor in meters to the right related to the trajectory of the vehicle.",
"minimum": 0.0
},
"corridorRefPoint": {
"type": "string",
"description": "Defines whether the boundaries are valid for the kinematic center or the contour of the vehicle.",
"enum": [
"KINEMATICCENTER",
"CONTOUR"
]
}
}
},
"actions": {
"description": "Array of action objects with detailed information.",
"type": "array",
"items": {
"$ref": "#/definitions/action"
}
}
}
}
}
},
"definitions": {
"action": {
"type": "object",
"description": "Describes an action that the AGV can perform.",
"required": [
"actionId",
"actionType",
"blockingType"
],
"properties": {
"actionType": {
"type": "string",
"description": "Name of action as described in the first column of \"Actions and Parameters\". Identifies the function of the action."
},
"actionId": {
"type": "string",
"description": "Unique ID to identify the action and map them to the actionState in the state. Suggestion: Use UUIDs."
},
"actionDescription": {
"type": "string",
"description": "Additional information on the action."
},
"blockingType": {
"type": "string",
"description": "Regulates if the action is allowed to be executed during movement and/or parallel to other actions.\nnone: action can happen in parallel with others, including movement.\nsoft: action can happen simultaneously with others, but not while moving.\nhard: no other actions can be performed while this action is running.",
"enum": [
"NONE",
"SOFT",
"HARD"
]
},
"actionParameters": {
"type": "array",
"description": "Array of actionParameter-objects for the indicated action e. g. deviceId, loadId, external Triggers.",
"items": {
"title": "actionParameter",
"type": "object",
"required": [
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"description": "The key of the action parameter.",
"examples": [
"duration",
"direction",
"signal"
]
},
"value": {
"type": [
"array",
"boolean",
"number",
"string",
"object"
],
"description": "The value of the action parameter",
"examples": [
103.2,
"left",
true,
[
"arrays",
"are",
"also",
"valid"
]
]
}
}
}
}
}
}
}
}

View File

@@ -0,0 +1,615 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "state",
"description": "all encompassing state of the AGV.",
"subtopic": "/state",
"type": "object",
"required": [
"headerId",
"timestamp",
"version",
"manufacturer",
"serialNumber",
"orderId",
"orderUpdateId",
"lastNodeId",
"lastNodeSequenceId",
"nodeStates",
"edgeStates",
"driving",
"actionStates",
"batteryState",
"operatingMode",
"errors",
"safetyState"
],
"properties": {
"headerId": {
"type": "integer",
"description": "headerId of the message. The headerId is defined per topic and incremented by 1 with each sent (but not necessarily received) message."
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "Timestamp in ISO8601 format (YYYY-MM-DDTHH:mm:ss.ffZ).",
"examples": [
"1991-03-11T11:40:03.12Z"
]
},
"version": {
"type": "string",
"description": "Version of the protocol [Major].[Minor].[Patch]",
"examples": [
"1.3.2"
]
},
"manufacturer": {
"type": "string",
"description": "Manufacturer of the AGV"
},
"serialNumber": {
"type": "string",
"description": "Serial number of the AGV."
},
"maps":{
"type": "array",
"description": "Array of map-objects that are currently stored on the vehicle.",
"items": {
"type": "object",
"title": "map",
"required": [
"mapId",
"mapVersion",
"mapStatus"
],
"properties": {
"mapId": {
"type": "string",
"description": "ID of the map describing a defined area of the vehicle's workspace."
},
"mapVersion": {
"type": "string",
"description": "Version of the map."
},
"mapDescription": {
"type": "string",
"description": "Additional information on the map."
},
"mapStatus": {
"type": "string",
"description": "Information on the status of the map indicating, if a map version is currently used on the vehicle. ENABLED: Indicates this map is currently active / used on the AGV. At most one map with the same mapId can have its status set to ENABLED.<br>DISABLED: Indicates this map version is currently not enabled on the AGV and thus could be enabled or deleted by request.",
"enum": [
"ENABLED",
"DISABLED"
]
}
}
}
},
"orderId": {
"type": "string",
"description": "Unique order identification of the current order or the previous finished order. The orderId is kept until a new order is received. Empty string (\"\") if no previous orderId is available. "
},
"orderUpdateId": {
"type": "integer",
"description": "Order Update Identification to identify that an order update has been accepted by the AGV. \"0\" if no previous orderUpdateId is available."
},
"zoneSetId": {
"type": "string",
"description": "Unique ID of the zone set that the AGV currently uses for path planning. Must be the same as the one used in the order, otherwise the AGV is to reject the order.\nOptional: If the AGV does not use zones, this field can be omitted."
},
"lastNodeId": {
"type": "string",
"description": "nodeID of last reached node or, if AGV is currently on a node, current node (e.g., \"node7\"). Empty string (\"\") if no lastNodeId is available."
},
"lastNodeSequenceId": {
"type": "integer",
"description": "sequenceId of the last reached node or, if the AGV is currently on a node, sequenceId of current node. \"0\" if no lastNodeSequenceId is available. "
},
"driving": {
"type": "boolean",
"description": "True: indicates that the AGV is driving and/or rotating. Other movements of the AGV (e.g., lift movements) are not included here.\nFalse: indicates that the AGV is neither driving nor rotating "
},
"paused": {
"type": "boolean",
"description": "True: AGV is currently in a paused state, either because of the push of a physical button on the AGV or because of an instantAction. The AGV can resume the order.\nFalse: The AGV is currently not in a paused state."
},
"newBaseRequest": {
"type": "boolean",
"description": "True: AGV is almost at the end of the base and will reduce speed if no new base is transmitted. Trigger for master control to send new base\nFalse: no base update required."
},
"distanceSinceLastNode": {
"type": "number",
"description": "Used by line guided vehicles to indicate the distance it has been driving past the \"lastNodeId\".\nDistance is in meters."
},
"operatingMode": {
"type": "string",
"description": "Current operating mode of the AGV.",
"enum": [
"AUTOMATIC",
"SEMIAUTOMATIC",
"MANUAL",
"SERVICE",
"TEACHIN"
]
},
"nodeStates": {
"type": "array",
"description": "Array of nodeState-Objects, that need to be traversed for fulfilling the order. Empty list if idle.",
"items": {
"type": "object",
"title": "nodeState",
"required": [
"nodeId",
"sequenceId",
"released"
],
"properties": {
"nodeId": {
"type": "string",
"description": "Unique node identification"
},
"sequenceId": {
"type": "integer",
"description": "sequenceId to discern multiple nodes with same nodeId."
},
"nodeDescription": {
"type": "string",
"description": "Additional information on the node."
},
"released": {
"type": "boolean",
"description": "True: indicates that the node is part of the base. False: indicates that the node is part of the horizon."
},
"nodePosition": {
"type": "object",
"required": [
"x",
"y",
"mapId"
],
"description": "Node position. The object is defined in chapter 5.4 Topic: Order (from master control to AGV).\nOptional:Master control has this information. Can be sent additionally, e.g., for debugging purposes. ",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"theta": {
"type": "number"
},
"mapId": {
"type": "string"
}
}
}
}
}
},
"edgeStates": {
"type": "array",
"description": "Array of edgeState-Objects, that need to be traversed for fulfilling the order, empty list if idle.",
"items": {
"type": "object",
"required": [
"edgeId",
"sequenceId",
"released"
],
"properties": {
"edgeId": {
"type": "string",
"description": "Unique edge identification"
},
"sequenceId": {
"type": "integer",
"description": "sequenceId of the edge."
},
"edgeDescription": {
"type": "string",
"description": "Additional information on the edge."
},
"released": {
"type": "boolean",
"description": "True indicates that the edge is part of the base. False indicates that the edge is part of the horizon."
},
"trajectory": {
"type": "object",
"description": "The trajectory is to be communicated as a NURBS and is defined in chapter 6.7 Implementation of the Order message.\nTrajectory segments reach from the point, where the AGV starts to enter the edge to the point where it reports that the next node was traversed. ",
"required": [
"degree",
"knotVector",
"controlPoints"
],
"properties": {
"degree": {
"type": "integer",
"description": "Defines the number of control points that influence any given point on the curve. Increasing the degree increases continuity. If not defined, the default value is 1."
},
"knotVector": {
"type": "array",
"description": "Sequence of parameter values that determine where and how the control points affect the NURBS curve. knotVector has size of number of control points + degree + 1",
"items": {
"type": "number",
"maximum": 1.0,
"minimum": 0.0
}
},
"controlPoints": {
"type": "array",
"description": "List of JSON controlPoint objects defining the control points of the NURBS, which includes the beginning and end point.",
"items": {
"type": "object",
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"weight": {
"type": "number",
"description": "The weight, with which this control point pulls on the curve.\nWhen not defined, the default will be 1.0."
}
}
}
}
}
}
}
}
},
"agvPosition": {
"type": "object",
"required": [
"x",
"y",
"theta",
"mapId",
"positionInitialized"
],
"description": "Defines the position on a map in world coordinates. Each floor has its own map.",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"theta": {
"type": "number"
},
"mapId": {
"type": "string"
},
"mapDescription": {
"type": "string"
},
"positionInitialized": {
"type": "boolean",
"description": "True: position is initialized. False: position is not initizalized."
},
"localizationScore": {
"type": "number",
"description": "Describes the quality of the localization and therefore, can be used, e.g., by SLAM-AGV to describe how accurate the current position information is.\n0.0: position unknown\n1.0: position known\nOptional for vehicles that cannot estimate their localization score.\nOnly for logging and visualization purposes",
"minimum": 0.0,
"maximum": 1.0
},
"deviationRange": {
"type": "number",
"description": "Value for position deviation range in meters. Optional for vehicles that cannot estimate their deviation, e.g., grid-based localization. Only for logging and visualization purposes."
}
}
},
"velocity": {
"type": "object",
"description": "The AGVs velocity in vehicle coordinates",
"properties": {
"vx": {
"type": "number",
"description":"The AVGs velocity in its x direction"
},
"vy": {
"type": "number",
"description":"The AVGs velocity in its y direction"
},
"omega": {
"type": "number",
"description":"The AVGs turning speed around its z axis."
}
}
},
"loads": {
"type": "array",
"description": "Loads, that are currently handled by the AGV. Optional: If AGV cannot determine load state, leave the array out of the state. If the AGV can determine the load state, but the array is empty, the AGV is considered unloaded.",
"items": {
"type": "object",
"required": [],
"description": "Load object that describes the load if the AGV has information about it.",
"title": "load",
"properties": {
"loadId": {
"type": "string",
"description": "Unique identification number of the load (e.g., barcode or RFID). Empty field, if the AGV can identify the load, but did not identify the load yet. Optional, if the AGV cannot identify the load."
},
"loadType": {
"type": "string",
"description":"Type of load."
},
"loadPosition": {
"type": "string",
"description": "Indicates, which load handling/carrying unit of the AGV is used, e.g., in case the AGV has multiple spots/positions to carry loads. Optional for vehicles with only one loadPosition.",
"examples":[
"front", "back", "positionC1"
]
},
"boundingBoxReference": {
"type": "object",
"required": [
"x",
"y",
"z"
],
"description": "Point of reference for the location of the bounding box. The point of reference is always the center of the bounding box bottom surface (at height = 0) and is described in coordinates of the AGV coordinate system.",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"z": {
"type": "number"
},
"theta": {
"type": "number",
"description":"Orientation of the loads bounding box. Important for tugger, trains, etc."
}
}
},
"loadDimensions": {
"type": "object",
"required": [
"length",
"width"
],
"description": "Dimensions of the loads bounding box in meters.",
"properties": {
"length": {
"type": "number",
"description": "Absolute length of the loads bounding box in meter."
},
"width": {
"type": "number",
"description": "Absolute width of the loads bounding box in meter."
},
"height": {
"type": "number",
"description": "Absolute height of the loads bounding box in meter.\nOptional:\nSet value only if known."
}
}
},
"weight": {
"type": "number",
"description": "Absolute weight of the load measured in kg.",
"minimum":0.0
}
}
}
},
"actionStates": {
"type": "array",
"description": "Contains a list of the current actions and the actions which are yet to be finished. This may include actions from previous nodes that are still in progress\nWhen an action is completed, an updated state message is published with actionStatus set to finished and if applicable with the corresponding resultDescription. The actionStates are kept until a new order is received.",
"items": {
"type": "object",
"required": [
"actionId",
"actionStatus"
],
"title": "actionState",
"properties": {
"actionId": {
"type": "string",
"description": "Unique actionId",
"examples": [
"blink_123jdaimoim234"
]
},
"actionType": {
"type": "string",
"description": "actionType of the action.\nOptional: Only for informational or visualization purposes. Order knows the type."
},
"actionDescription": {
"type": "string",
"description": "Additional information on the current action."
},
"actionStatus": {
"type": "string",
"description": "WAITING: waiting for the trigger (passing the mode, entering the edge) PAUSED: paused by instantAction or external trigger FAILED: action could not be performed.",
"enum": [
"WAITING",
"INITIALIZING",
"RUNNING",
"PAUSED",
"FINISHED",
"FAILED"
]
},
"resultDescription": {
"type": "string",
"description": "Description of the result, e.g., the result of a RFID-read. Errors will be transmitted in errors."
}
}
}
},
"batteryState": {
"type": "object",
"required": [
"batteryCharge",
"charging"
],
"description": "Contains all battery-related information.",
"properties": {
"batteryCharge": {
"type": "number",
"description": "State of Charge in %:\nIf AGV only provides values for good or bad battery levels, these will be indicated as 20% (bad) and 80% (good)."
},
"batteryVoltage": {
"type": "number",
"description": "Battery voltage"
},
"batteryHealth": {
"type": "number",
"description": "State of health in percent.",
"minimum":0,
"maximum":100
},
"charging": {
"type": "boolean",
"description": "True: charging in progress. False: AGV is currently not charging."
},
"reach": {
"type": "number",
"description": "Estimated reach with current State of Charge in meter.",
"minimum": 0
}
}
},
"errors": {
"type": "array",
"description": "Array of error-objects. All active errors of the AGV should be in the list. An empty array indicates that the AGV has no active errors.",
"items": {
"type": "object",
"required": [
"errorType",
"errorLevel"
],
"title": "Error",
"properties": {
"errorType": {
"type": "string",
"description": "Type/name of error."
},
"errorReferences": {
"type": "array",
"items": {
"type": "object",
"title": "errorReference",
"description": "Array of references (e.g. nodeId, edgeId, orderId, actionId, etc.) to provide more information related to the error.",
"properties": {
"referenceKey": {
"type": "string",
"description":"Specifies the type of reference used (e.g. nodeId, edgeId, orderId, actionId, etc.)."
},
"referenceValue": {
"type": "string",
"description":"The value that belongs to the reference key. For example, the id of the node where the error occurred."
}
},
"required": [
"referenceKey",
"referenceValue"
]
}
},
"errorDescription": {
"type": "string",
"description": "Verbose description providing details and possible causes of the error."
},
"errorHint": {
"type": "string",
"description": "Hint on how to approach or solve the reported error."
},
"errorLevel": {
"type": "string",
"description": "WARNING: AGV is ready to start (e.g., maintenance cycle expiration warning). FATAL: AGV is not in running condition, user intervention required (e.g., laser scanner is contaminated).",
"enum": [
"WARNING",
"FATAL"
]
}
}
}
},
"information": {
"type": "array",
"description": "Array of info-objects. An empty array indicates, that the AGV has no information. This should only be used for visualization or debugging it must not be used for logic in master control.",
"items": {
"type": "object",
"required": [
"infoType",
"infoLevel"
],
"properties": {
"infoType": {
"type": "string",
"description": "Type/name of information."
},
"infoReferences": {
"type": "array",
"items": {
"type": "object",
"required": [
"referenceKey",
"referenceValue"
],
"title": "infoReference",
"description": "Array of references.",
"properties": {
"referenceKey": {
"type": "string",
"description":"References the type of reference (e.g., headerId, orderId, actionId, etc.)."
},
"referenceValue": {
"type": "string",
"description":"References the value, which belongs to the reference key."
}
}
}
},
"infoDescription": {
"type": "string",
"description": "Info of description."
},
"infoLevel": {
"type": "string",
"description": "DEBUG: used for debugging. INFO: used for visualization.",
"enum": [
"INFO",
"DEBUG"
]
}
}
}
},
"safetyState": {
"type": "object",
"required": [
"eStop",
"fieldViolation"
],
"description": "Contains all safety-related information.",
"properties": {
"eStop": {
"type": "string",
"description": "Acknowledge-Type of eStop: AUTOACK: auto-acknowledgeable e-stop is activated, e.g., by bumper or protective field. MANUAL: e-stop hast to be acknowledged manually at the vehicle. REMOTE: facility e-stop has to be acknowledged remotely. NONE: no e-stop activated.",
"enum": [
"AUTOACK",
"MANUAL",
"REMOTE",
"NONE"
]
},
"fieldViolation": {
"type": "boolean",
"description": "Protective field violation. True: field is violated. False: field is not violated."
}
}
}
}
}

View File

@@ -0,0 +1,95 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "visualization",
"description": "AGV position and/or velocity for visualization purposes. Can be published at a higher rate if wanted. Since bandwidth may be expensive depening on the update rate for this topic, all fields are optional.",
"subtopic": "/visualization",
"type": "object",
"properties": {
"headerId": {
"type": "integer",
"description": "headerId of the message. The headerId is defined per topic and incremented by 1 with each sent (but not necessarily received) message."
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "Timestamp in ISO8601 format (YYYY-MM-DDTHH:mm:ss.ffZ).",
"examples": [
"1991-03-11T11:40:03.12Z"
]
},
"version": {
"type": "string",
"description": "Version of the protocol [Major].[Minor].[Patch]",
"examples": [
"1.3.2"
]
},
"manufacturer": {
"type": "string",
"description": "Manufacturer of the AGV"
},
"serialNumber": {
"type": "string",
"description": "Serial number of the AGV."
},
"agvPosition": {
"type": "object",
"title": "agvPosition",
"description": "The AGVs position",
"required": [
"x",
"y",
"theta",
"mapId",
"positionInitialized"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"theta": {
"type": "number"
},
"mapId": {
"type": "string"
},
"mapDescription": {
"type": "string"
},
"positionInitialized": {
"type": "boolean",
"description": "True if the AGVs position is initialized, false, if position is not initizalized."
},
"localizationScore": {
"type": "number",
"description": "Localization score for SLAM based vehicles, if the AGV can communicate it.",
"minimum": 0.0,
"maximum": 1.0
},
"deviationRange": {
"type": "number",
"description": "Value for position deviation range in meters. Can be used if the AGV is able to derive it."
}
}
},
"velocity": {
"type": "object",
"title": "velocity",
"description": "The AGVs velocity in vehicle coordinates",
"properties": {
"vx": {
"type": "number"
},
"vy": {
"type": "number"
},
"omega": {
"type": "number"
}
}
}
}
}