Communication Standards - ResgreenGroup/Botway-Documentation GitHub Wiki
Current Location: Home->Communication Standards
All RGGI Software, Accessories and Robots are interconnected over a wireless network. In order for all of these different pieces to work together and integrate with Third Party Vendors, RGGI has 3 standards of communication outlined below. For more details on each communication standard visit it's specific page on the wiki.
-
Everything on the network communicates using MQTT (Message Queueing Telemetry Transport) which is a type of publisher/subscriber communication system that works over standard TCP/IP.
-
BotWay and its associated devices have a standard set of messages, topics that messages are sent to, and protocols: keep alive, respond to triggers, report statuses, etc.
-
Finally RGGI has built its communication standards on the existing standard of the Mass-Robotics Interoperability Standard for AMRs.
- We did this in order to retain compatibility with any MRIS ready AMRs, add MQTT functionality, AGV support, Accessories support, which is not part of the base MRIS for AMRs.
Using MQTT, BotWay and the RGGI/MRIS protocol we have a robust, secure, expandable ecosystem that can work for any application.
BotWay MQTT Topic Definitions
Starting with BotWay V2.0.0, all communications between BotWay and other devices will be based on the MQTT messaging protocol. See: https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html. The MQTT protocol is widely used and supported. Code libraries and samples are available for all modern programming languages and most computer architectures including PLCs. Though the MQTT standard covers the low-level TCP/IP packet formation and delivery specifics, for our purposes (and because much of this is handled by available libraries) we will focus on the definitions of the messages being sent.
MQTT is a Publisher/Subscriber protocol that uses a central server (broker) to which one or more clients may connect. Messages (and the data they contain) are organized by Topics. Each client may publish or subscribe to one or more topics. MQTT messages, known as payloads, may be formatted in a variety of ways; BotWay will use JSON messages for all topic messages.
To make BotWay more open as a robot system orchestrator, we will be using the Mass Robotics Interoperability Standard - Version 1.0, spec as a guide for our MQTT Topic messages. See: https://www.massrobotics.org/project/amrinteroperability/. This standard will allow robot manufacturers to communicate in a standard way so that heterogeneous solutions are possible. The Mass Robotics Interoperability guide and associated GitHub repository have a wealth of technical definitions and samples. We will be using the simplest of messaging versions in this guide.
Standard operating procedure for BotWay is as follows:
-
BotWay starts up and connects to the MQTT broker.
-
BotWay publishes a new value to the BotWay/instance topic.
-
BotWay subscribes to the identityReport topic. This topic is published by each robot or device that wants to connect to BotWay.
-
BotWay begins publishing to the BotWay/time topic at a rate set in the botWays.properties file (defaults to 1000ms).
-
Client connects to the MQTT broker and subscribes to the BotWay/time topic.
-
Client publishes an identityReport message and subscribes to its own action topic.
-
All clients shall republish their identityReport message whenever a new BotWay/instance is published. Best practice is for the client to wait a random amount of time (1 - 30 sec) to reconnect.
-
BotWay receives an identityReport message, registers the client and subscribes to that client’s statusReport topic. The statusReport topic is used to provide status and state information to BotWay.
-
All clients will send a statusReport whenever a significant event occurs (such as a state change or error).
-
All clients will send a statusReport whenever they receive a Heartbeat message.
-
If BotWay has not received a statusReport from a robot in a set amount of time, BotWay will publish a Heartbeat to the robot.
-
Device type clients may send two types of status reports. The first type is the standard statusReport where the operationalState is set to "IDLE". When a devices wants to inform BotWay that an action has taken place (such as a button press for a button device), the device will send a statusReport whith an operationalState = "SIGNALING". To confirm that BotWay has received a “Signaling” message, BotWay will "reply" by publishing an “Ack” action message. If the device does not receive an “Ack” from BotWay after sending a “Signaling” message, the device should resend the message. This does not apply to robot type clients.
-
BotWay processes the statusReport message and updates all affected logic.
-
If BotWay does not receive statusReport messages in response to heartbeats, it displays a comms loss error for that robot or device.
Additional for tag reading robots:
-
Robot sends a tagRead message to BotWay whenever it reads a new RFID tag.
-
BotWay receives the tagRead message and responds by sending an action message of type=“Cmd”.
-
Robot receives the “Cmd” message and processes new instructions.
Additional for signaling devices:
-
Device sends a statusReport message with operationalState = “Signaling” whenever a signaling event occurs.
-
BotWay receives the statusReport message and responds by sending an action message of type=“Ack”.
-
BotWay processes the statusReport message and updates all affected logic.
instance Topic (sent from BotWay)
BotWay will publish a random "id" on the instance topic each time it is restarted. The instance topic is set to "Retained" and will only be updated when BotWay is restarted. It is used by all BotWay clients to know if BotWay has been restarted. If the instance ID changes, all clients must reconnect to BotWay by resending an itentityRoport message.
A sample JSON instance message may look like this:
instance Topic (BotWay)
Topic: BotWay/instance:
{
"id": 5950
}
instance Topic Definitions
Topic – BotWay/instance
id – random id from 1 - 50000.
time Topic (sent from BotWay)
BotWay will continuously publish on the time topic at a specified rate. This topic is used by BotWay clients to ensure that they are still receiving BotWay messages. If any client does not see a new time message for a certain amount of time (usually 30 seconds), the client may assume that the connection to BotWay has been lost and the client should attempt to reconnect.
A sample JSON time message may look like this:
time Topic (BotWay)
Topic: BotWay/time:
{
"eSec": 1642775602,
"rate": 5000,
"count": 152,
"time": "2022-01-21T14:33:22.214145600"
}
time Topic Definitions
Topic – BotWay/time
eSec – Epoch Seconds. Number of seconds since start of Epoch (01/01/1970).
rate – How often the time topic is published in milliseconds.
count – Number of publications since startup. From 0 to 255. Resets to 0.
time – Current date and time of message transmission
identityReport Topic (sent from robot)
When BotWay starts, it will connect to the MQTT broker and subscribe to the identityReport topic. This topic is published by each robot that wants to connect to BotWay. A sample JSON identityReport for a robot may look like this:
identityReport JSON Sample (Robot)
Topic: identityReport:
{
"uuid":"bf3dd5c2-1a50-3362-a6c0-ed4b93382e4a",
"timestamp":"2022-01-21T14:33:22.214145600",
"manufacturerName":"RGGI",
"robotModel":"PullBuddy",
"robotSerialNumber":"00000001",
"needsCmd": true,
"baseRobotEnvelope":
{
"x":0.508,
"y":1.379
}
}
identityReport (short) JSON Sample (Robot)
Topic: identityReport:
{
"id":"RUR01",
"mfr":"RGGI",
"model":"PullBuddy",
"sn":"abc01",
"cmd": true
}
identityReport Definitions
Topic – identityReport
uuid – UUID* specified by RFC4122 that all subsequent messages should reference
timestamp – Current date and time of message transmission
manufacturerName – Name of Manufacturer
robotModel – Name of robot model
robotSerialNumber – Unique robot identifier that ideally can be physically linked to the robot
needsCmd – Boolean flag specifying if the robot will receive CMD Action messages from BotWay
baseRobotEnvelope – Footprint of robot based on orientation, centered on current location.
* The uuid field is generated using a md5 hash of the robotModel and robotSerialNumber. For a code example, see Appendix.
identityReport Topic (sent from device)
When BotWay starts, it will connect to the MQTT broker and subscribe to the identityReport topic. This topic is published by each device that wants to connect to BotWay. A sample JSON identityReport for a device may look like this:
identityReport JSON Sample (Device)
Topic: identityReport:
{
"uuid":"62692d8e-f01c-3cf9-bbf2-fc70ff2e3941",
"timestamp":"2022-01-23T11:23:58.122999600",
"manufacturerName":"RGGI",
"deviceType":"Button",
"useHB": true,
"deviceSerialNumber":"VD000001"
}
identityReport (short) JSON Sample (Device)
Topic: identityReport:
{
"id":"ABC123",
"mfr":"RGGI",
"type":"Button",
"HB": true,
"sn":"VD001"
}
identityReport Definitions
Topic – identityReport
uuid – UUID* specified by RFC4122 that all subsequent messages should reference
timestamp – Current date and time of message transmission
manufacturerName – Name of Manufacturer
deviceType – Type of device. See appendix
deviceSerialNumber – Unique device identifier that ideally can be physically linked to the device
* The uuid field is generated using a md5 hash of the deviceType and deviceSerialNumber. For a code example, see appendix.
statusReport Topic (sent from robot)
Once BotWay receives an identityReport from a robot, BotWay will register the robot and subscribe to that robot’s statusReport topic. The statusReport topic is used to provide status and state information to BotWay. All robots will send a statusReport whenever a significant event occurs (such as an error). Additionally, all robots shall send a statusReport upon receiving a “heartbeat” message from BotWay. Heartbeat messages are sent using the action topic described below.
The full topic name for each robot’s statusReport will be prefixed by that robot’s robotModel & robotSerialNumber. A sample JSON statusReport for a robot may look like this:
statusReport JSON Sample (Robot)
Topic: PullBuddy/00000001/statusReport
{
"uuid":"bf3dd5c2-1a50-3362-a6c0-ed4b93382e4a",
"timestamp":"2021-12-21T17:59:09.774",
"operationalState":"Navigating",
"batteryVoltage":"26.4",
"errorNum":"0",
"velocity":
{
"linear": 2
},
"location":
{
"x":"1.0107",
"y":"7.1402",
"planarDatum":"4B8302DA-21AD-401F-AF45-1DFD956B80B5"
},
"route":"10",
"tag":"107"
}
statusReport (short) JSON Sample (Robot)
Topic: PullBuddy/00000001/statusReport
{
"id":"ABC123",
"state":"Navigating",
"battV":"26.4",
"err":"0",
"rte":"10",
"tag":"107"
}
statusReport Definitions (Robot)
Topic – [robotModel]/[robotSerialNumber]/statusReport
uuid – UUID specified in the identityReport for this device
timestamp – Date and time of message transmission
operationalState – Operating State. See appendix
batteryVoltage – Battery Voltage
errorNum – Error Value. See appendix
velocity – Speed
linear – Linear velocity (Speed) in m/s in heading direction, forward is positive
location – Location of robot in 2D X/Y coordinates
x – X coordinate
y – y coordinate
planarDatum – Unique ID of a Planar Datum the device is referencing
route – Current Route
tag – Last tag read
statusReport Topic (sent from device)
All devices shall send a statusReport upon receiving a “heartbeat” message from BotWay. Additionally, devices shall send a statusReport whenever a significant event occurs, such as a button press. To distinguish statusReport types, the device will use operationalState = “Signaling” when a signal event has occurred.
To confirm that BotWay has received a “Signaling” message, BotWay will send an “Ack” action message after receiving the “Signaling” statusReport. If the device does not receive an “Ack” from BotWay after sending a “Signaling” message, the device should resend the message.
The full topic name for each device’s statusReport will be prefixed by that device’s deviceType & deviceSerialNumber. A sample JSON statusReport for a device may look like this:
statusReport JSON Sample (Device)
Topic: WirelessButton/VB000001/statusReport
{
"uuid": "62692d8e-f01c-3cf9-bbf2-fc70ff2e3941",
"timestamp": "2022-01-22T13:06:48.107573300",
"operationalState": "Signaling",
"batteryPercentage": 100,
"deviceData":
{
"sensor1Data": "on",
"sensor2Data": "",
"sensor3Data": "",
"sensor4Data": ""
},
}
statusReport (short) JSON Sample (Device)
Topic: WirelessButton/VB000001/statusReport
{
"id": "ABC123",
"state": "Signaling",
"battP": 100,
"data":
{
"s1": "on",
"s2": "",
"s3": "",
"s4": ""
},
}
statusReport Definitions (Device)
Topic – [deviceType]/[deviceSerialNumber]/statusReport
uuid – UUID specified in the identityReport for this device
timestamp – Date and time of message transmission
operationalState – Operating State. See appendix
batteryPercentage – Percentage of battery life left
deviceData – JSON object containing status data of up to 4 sensors
sensor1Data – Sensor data. eg for a button, sensor1Data = “On”.
sensor2Data – Sensor data
sensor3Data – Sensor data
sensor4Data – Sensor data
action Topic (sent from BotWay)
BotWay will use an action topic to send heartbeat and control commands to devices under its supervision. All devices connected to BotWay should subscribe to their own action topic. BotWay will send periodic heartbeat, “HB”, action messages every 5 seconds by default. All robots shall respond to the “HB” action with a statusReport message.
The full topic name for each device’s action topic will be prefixed by that device’s robotModel & robotSerialNumber. A sample JSON action message may look like this:
action JSON Sample
Topic:PullBuddy/00000001/action
{
"type":"HB",
"data1":"",
"data2":"",
"data3":"",
"data4":""
}
action Definitions
Topic – [robotModel]/[robotSerialNumber]/statusReport
type – Action type. See appendix
data1 – Additional data to support the action type. eg for New Route, data1 = route.
data2 – Additional data to support the action type.
data3 – Additional data to support the action type.
data4 – Additional data to support the action type.
tagRead Topic (sent from robot)
Robots that use RFID tags shall send a tagRead message to BotWay whenever a new tag is read. The tagRead message shall be sent immediately upon reading a new tag. BotWay will respond to this message with a “Cmd” action message. Thus, each robot shall expect this “Cmd” action message after each tagRead message is sent. If the “Cmd” action message is not received, the robot should come to a controlled stop and resend the tagRead message.
The full topic name for each robot’s tagRead topic will be prefixed by that robot’s robotModel & robotSerialNumber. A sample JSON tagRead message may look like this:
tagRead JSON Sample
Topic:PullBuddy/00000001/tagRead
{
"uuid":"bf3dd5c2-1a50-3362-a6c0-ed4b93382e4a",
"timestamp":"2021-12-21T17:59:09.774",
"route":"10",
"tag":"110"
}
tagRead (short) JSON Sample
Topic:PullBuddy/00000001/tagRead
{
"id":"ABC123",
"rte":"10",
"tag":"110"
}
tagRead Definitions
Topic – [robotModel]/[robotSerialNumber]/tagRead
uuid – UUID specified in the identityReport for this device
timestamp – Date and time of message transmission
route – Current route
tag – Last tag read
action “Cmd” Topic (sent from BotWay)
Robots that send tagRead messages will need to subscribe and react to the action message of type “Cmd”. This action message will have type = “Cmd” and will contain a JSON object in the data1 field that holds the command values.
action “Cmd” JSON Sample
Topic:PullBuddy/00000001/action
{
"type":"Cmd",
"data1":
{
"tapeSide":"L",
"fScan":"0",
"rScan":"0",
"speed":"300",
"direction":"F",
"pin":"U",
"action":"N",
"value":"0"
}",
"data2":"20",
"data3":"",
"data4":""
}
action “Cmd” (short) JSON Sample
Topic:PullBuddy/00000001/action
{
"type":"Cmd",
"data1":
{
"tape":"L",
"fScan":"0",
"spd":"300",
"dir":"F",
"pin":"U",
"act":"N",
"val:"0"
}",
"data2":"20"
}
action “cmd” Definitions
Topic – [robotModel]/[robotSerialNumber]/action
type – ”Cmd” Action type
data1 – Command JSON data. See definition below
data2 – Current Route
data3 – n/a
data4 – n/a
tapeSide – Desired tape side robot shall follow (R,L)
fScan – Desired scan pattern for front safety scanner
rScan – Desired scan pattern for rear safety scanner
speed – Desired speed in % of maximum
direction – Desired direction of robot (F,R)
pin – Desired position for pin (U,D)
action – Desired action for robot (N=None, Y=Yield, H=Hold, C=Charge)
value – Value related to action e.g. “5” (seconds) for Hold time
tagData Topic (sent from BotWay)
BotWay publishes the full tagData definition on the BotWay/tagData topic whenever the tag data changes. This topic is set to "Retained"
tagData JSON Sample
Topic:BotWay/tagData
{
"image": "images/layout.plant_test1.png",
"tags": [
{
"id": "10",
"lockList": "100, 105",
"display": {
"orientation": 4,
"xScale": 0.8084061145782471,
"yScale": 0.3077753782272339,
"setDocked": false
},
"location": {
"x": 0,
"y": 0,
"angle": {
"w": 0,
"x": 0,
"y": 0,
"z": 0
},
"planarDatum": ""
}
},
{
"id": "100",
"lockList": "",
"display": {
"orientation": 4,
"xScale": 0.2161571979522705,
"yScale": 0.30561554431915283,
"setDocked": false
},
"location": {
"x": 0,
"y": 0,
"angle": {
"w": 0,
"x": 0,
"y": 0,
"z": 0
},
"planarDatum": ""
}
},
{
"id": "105",
"lockList": "100",
"display": {
"orientation": 2,
"xScale": 0.19720767438411713,
"yScale": 0.4234752655029297,
"setDocked": false
},
"location": {
"x": 0,
"y": 0,
"angle": {
"w": 0,
"x": 0,
"y": 0,
"z": 0
},
"planarDatum": ""
}
}
]
}
tagData
image – path to image file on which tags are displayed
tags – Collection of tags
[
{
id – Identifying string for tag.
lockList – Comma separated list of tag Ids used for traffic management.
display – Attributes that specify how and where the tag is displayed on the image
{
orientation – One of 8 text alignments for the tag text (clockwise from 12:00)
xScale – Position of tag in percent horizontal offset from top-left of image.
yScale – Position of tag in percent vertical offset from top-left of image.
setDocked – Boolean flag specifying if tag is displayed in the dock and hidden from the image.
}
------------ Future usage for specifying physical location of tag --------------
location
{
x – Horizontal location based on origin of planerDatum
y – Vertical location based on origin of planerDatum
angle – Desired orientation of Robot when at tag postion based on Quaternion values.
{
w
x
y
z
},
planarDatum – The plane that is used for location data.
}
--------------------------------------------------------------------------------
}
]
clientTypes Topic (sent from BotWay)
Upon startup, BotWay publishes the full clientTypes definition on the BotWay/clientTypes topic. This topic is set to "Retained". This topic is read from the clientTypes.xml file. This file specifies allowed Robot and Device types. Only types listed in this file may connect to BotWay.
clientTypes JSON Sample
{
"robots": [
{
"type": "AGV",
"battRange": []
},
{
"type": "AMR",
"battRange": []
},
{
"type": "BigBuddy",
"battRange": []
},
{
"type": "PullBuddy",
"battRange": [
{
"high": 30,
"low": 27.3,
"percent": 100
},
{
"high": 27.29,
"low": 26.4,
"percent": 80
},
{
"high": 26.39,
"low": 25.5,
"percent": 60
},
{
"high": 25.49,
"low": 24.4,
"percent": 40
},
{
"high": 24.39,
"low": 0,
"percent": 20
}
],
},
{
"type": "LilBuddy",
"battRange": []
},
{
"type": "Fred",
"battRange": []
}
],
"devices": [
{
"type": "Button"
},
{
"type": "StackLight"
},
{
"type": "LedBar"
},
{
"type": "Lift"
},
{
"type": "Switch"
},
{
"type": "gateway"
}
]
}
robots – Collection of allowed robot types. type – Robot type. battRange – Array of battery ranges for use with battery display. high – Upper value for this range. low – Lower value for this range. percent – Percentage of battery fullness. devices – Collection of allowed device types. type – Device type.
clientData Topic (sent from BotWay)
BotWay publishes the full clientData definition on the BotWay/clientData topic any time a client connects or is removed. This topic is set to "Retained". This topic is based on the identityReports received by BotWay and serves as a list of currently connected clients.
clientData JSON Sample
{
"devices": [
{
"serial": "VD000001",
"name": "VD000001",
"type": "Button",
"uuid": "62692d8e-f01c-3cf9-bbf2-fc70ff2e3941"
}
],
"robots": [
{
"serial": "V1",
"name": "V1",
"model": "PullBuddy",
"uuid": "bf3dd5c2-1a50-3362-a6c0-ed4b93382e4a"
},
{
"serial": "V2",
"name": "V2",
"model": "PullBuddy",
"uuid": "7902f123-0b3d-30cb-bcad-f972cf19c284"
}
],
"timestamp": "2024-06-07T17:51:06.180581800"
}
There are API endpoints published by BotWay that can be used to interact with the system. The API is a RESTful API that uses JSON or Strings for data exchange. The RESTful API can be disabled, enabled and have its port changed in the botway.properties file.
<webAPI use="true">
<port>8080</port>
<user/>
<pass/>
</webAPI>
Below is a table showing the V1 API endpoints and their descriptions.
Endpoint | Description | Example Data |
---|---|---|
/bwapi/v1/getGreeting | Returns a greeting message | "Greetings from BotWay" |
/bwapi/v1/getVersion | Returns the current version of BotWay | "V2.5.35" |
/bwapi/v1/getTime | Returns the current time used by BotWay | {"eSec":1713534759,"rate":5000,"count":19,"time":"2024-04-19T09:52:39.607"} |
/bwapi/v1/getJob? | Returns the data for the given job ID | {"arrivalStatus": "AT_TAG","commStatus": "ACTIVE","curVoltage": 28.6,"curRoute": "G02","lastCmd": "","curVehicleStatus": "Charging","curErrorState": "NONE","curTag": "Q1"} or "{}" if no job found |
/bwapi/v1/getQueue | Returns the current queues of jobs | {"queues": [{"jobs": [],"name": "Q1-Line","stations": [{"returnRoute": "R07","tag": "Q7"},{"returnRoute": "R06","tag": "Q6"}]}]} |
/bwapi/v1/getRobotData?<ID=0&ErrorCode=NONE> | Returns robot data for the robot with the given serial number and error state | [{"arrivalStatus":"AT_TAG","commStatus":"ACTIVE","curVoltage":26.7,"battState":"FULL","curRoute":"S02","lastCmd":"{tape:"L",fScan:"4",rScan:"9",spd:"15",dir:"F",pin:"U",act:"C",val:"0"}","curVehicleStatus":"Charging","id":"V2","curErrorState":"NONE","curTag":"Q2"},{"arrivalStatus":"AT_TAG","commStatus":"ACTIVE","curVoltage":26.2,"battState":"OK","curRoute":"S01","lastCmd":"{tape:"L",fScan:"4",rScan:"9",spd:"15",dir:"F",pin:"U",act:"C",val:"0"}","curVehicleStatus":"Charging","id":"V1","curErrorState":"NONE","curTag":"Q1"}] |
/bwapi/v1/sendButtonPress? | Sends a button press event to BotWay | "ACK" or "NACK" |
curl -X GET http://yourbotwayip:8080/bwapi/v1/getGreeting
curl -X GET http://yourbotwayip:8080/bwapi/v1/getVersion
curl -X GET http://yourbotwayip:8080/bwapi/v1/getTime
curl -X GET http://yourbotwayip:8080/bwapi/v1/getJob?44021
curl -X GET http://yourbotwayip:8080/bwapi/v1/getQueue
curl -X GET http://yourbotwayip:8080/bwapi/v1/getRobotBySerialNumber?V1
curl -X GET http://yourbotwayip:8080/bwapi/v1/sendButtonPress?1
import requests
endpoints = [
"getGreeting",
"getVersion",
"getTime",
"getQueue",
"getRobotBySerialNumber?V1",
"buttonPress?1"
]
for endpoint in endpoints:
response = requests.get(f"http://yourbotwayip:8080/bwapi/v1/{endpoint}")
print(response.json())
Robot Types DeviceTypes SensorTypes
Robot Types | Device Types | Sensor Types | |||||
---|---|---|---|---|---|---|---|
AGV | “AGV” | Thing | “Thing” | PushButton | “PushButton” | ||
AMR | “AMR” | StackLight | “StackLight” | ||||
PullBuddy | “PullBuddy” | LedBar | “LedBar” | ||||
LilBuddy | “LilBuddy” | Lift | “Lift” | ||||
BigBuddy | “BigBuddy” | ProxSensor | “ProxSensor” | ||||
Operational States
Operational States | |
---|---|
IDLE | “IDLE” |
NAVIGATING | “NAVIGATING” |
DISABLED | “DISABLED” |
OFFLINE | “OFFLINE” |
CHARGING | “CHARGING” |
WAITING ON HUMAN EVENT | “WAITING ON HUMAN EVENT” |
WAITING ON EXTERNAL EVENT | “WAITING ON EXTERNAL EVENT” |
WAITING ON INTERNAL EVENT | “WAITING ON INTERNAL EVENT” |
MANUAL MODE | “MANUAL MODE” |
SIGNALING | “SIGNALING” |
Error Numbers
Error Numbers | |
---|---|
NONE | 0 |
UNKNOWN | 1 |
ESTOP | 2 |
BUMPER STOP | 4 |
TRACK LOSS | 8 |
PAYLOAD ERROR | 16 |
LOW VOLTAGE | 32 |
NO CHARGE | 64 |
COMM LOSS | 128 |
BOTWAY LOSS | 256 |
TAG NOT ON ROUTE | 512 |
Action Types
Action Types | |
---|---|
Heartbeat | “HB” |
Acknowledge | “Ack” |
Command | “Cmd” |
New Route | “Route” |
Stop | “Stop” |
Go | “Go” |
Producing the uuid
Java Sample:
// Generate a uuid that will be consistent for this robot
md = MessageDigest.*getInstance*("MD5");
seed = “PullBuddy” + “00000001”;
md.update(seed.getBytes("utf-8"));
uid = UUID.*nameUUIDFromBytes*(md.digest());
Python Sample:
\# Generate a uuid that will be consistent for this robot
md = hashlib.md5()
seed = “PullBuddy” + “00000001”
md.update(seed.encode('utf-8'))
uid = uuid.UUID(md.hexdigest())
identityReport Topic
"identityReport":
{
"type": "object",
"required": \["uuid", "timestamp", "manufacturerName", "robotModel",
"robotSerialNumber", "baseRobotEnvelope"\],
"properties":
{
"uuid":
{
"description": "UUID specified by RFC4122 that all subsequent messages
should reference",
"type": "string",
"format": "uuid",
"pattern":
"^\[0-9a-f\]{8}-\[0-9a-f\]{4}-\[0-9a-f\]{4}-\[0-9a-f\]{4}-\[0-9a-f\]{12}\$"
},
"timestamp": { "type": "string", "format": "date-time" },
"manufacturerName": { "type": "string" },
"robotModel": { "type": "string" },
"robotSerialNumber":
{
"description": "Unique robot identifier that ideally can be physically linked to the AMR",
"type": "string"
},
"baseRobotEnvelope":
{
"description": "Footprint of robot based on orientation - centered on current location.",
"type": "object",
"required": \["x", "y"\],
"properties":
{
"x": { "type": "number" },
"y": { "type": "number" },
"z": {"type": "number", "default" : 0}
},
"additionalProperties": false
},
"maxSpeed":{"description": "Max robot speed in m/s", "type": "number"},
"maxRunTime": {"description": "Estimated Runtime in hours", "type": "number"},
"emergencyContactInformation": {"description": "Emergency Contact - preferrably phone number", "type": "string"},
"chargerType": {"description": "Type of charger", "type": "string"},
"supportVendorName": {"description": "Vendor that supplied robot", "type": "string"},
"supportVendorContactInformation": {"description": "Contect information for vendor", "type": "string"},
"productDocumentation": {"description": "Link to product documenation", "type": "string", "format": "uri"},
"thumbnailImage": {"description": "Link to thumbnail graphic stored as PNG", "type": "string", "format": "uri"},
"cargoType": {"description": "Discription of cargo", "type": "string"},
"cargoMaxVolume": {"description": "Max volume of cargo in meters", "type": "object", "required": \["x", "y"\],
"properties":
{
"x": { "type": "number" },
"y": { "type": "number" },
"z": {"type": "number", "default" : 0}
},
"additionalProperties": false
},
"cargoMaxWeight": {"description": "Max weight of cargo in kg", "type": "string"}
},
"additionalProperties": false
}
statusReport Topic
"statusReport":
{
"type": "object",
"required": \["uuid", "timestamp", "operationalState", "location" \],
"properties":
{
"uuid":
{
"description": "UUID specified in the identityAndCapability message",
"type": "string",
"format": "uuid",
"pattern": "^\[0-9a-f\]{8}-\[0-9a-f\]{4}-\[0-9a-f\]{4}-\[0-9a-f\]{4}-\[0-9a-f\]{12}\$"
},
"timestamp": { "type": "string", "format": "date-time" },
"operationalState":
{
"description": "Current action the robot is performing",
"type": "string",
"enum": \["navigating","idle","disabled","offline","charging","waitingHumanEvent","waitingExternalEvent","waitingInternalEvent","manualOverride"\]
},
"location": {"description": "Current Location of AMR", "\$ref": "#/definitions/location"},
"velocity":
{
"description": "Current velocity of AMR",
"type": "object",
"required": \["linear"\],
"properties":
{
"linear": {"description": "Linear velocity in m/s in heading direction, forward is postive", "type": "number"},
"angular": {"description": "Angular velocity in quaternions per second", "\$ref": "#/definitions/quaternion"}
},
"additionalProperties": false
},
"batteryPercentage" : {"description": "Percentage of battery remaining", "type": "number", "minimum": 0, "maximum": 100},
"remainingRunTime" : {"description": "Estimated remaining runtime in hours", "type": "number", "minimum": 0},
"loadPercentageStillAvailable" : {"description": "Percentage of capacity still available", "type": "number", "minimum": 0, "maximum": 100},
"errorCodes" :
{
"description": "List of current error states - should be omitted for normal operation",
"type": "array",
"items": {"type": "string"},
"uniqueItems": true
},
"destinations" :
{
"description": "Target destination(s) of AGV",
"type": "array",
"items": {"\$ref": "#/definitions/predictedLocation"},
"maxItems": 10,
"uniqueItems": true
},
"path" :
{
"description": "Short term path of AGV \~10 sec",
"type": "array",
"items": {"\$ref": "#/definitions/predictedLocation"},
"maxItems": 10,
"uniqueItems": true
}
},
"additionalProperties": false
}