Developer Portal
Simple, configurable and easy to integrate, these are the tools every engineer needs to get the best out of InOrbit
dev-portal-banner-87dabb5e
Developer Portal

Contents

InOrbit is a RobOps platform aimed at resolving common infrastructure needs and integrating into the broader robotics solution. Here you can find a menu of the different options you can choose from including SDKs, APIs and tools.

Authentication

All API and SDK access is authenticated with the InOrbit system using an API Key which can be obtained and managed through InOrbit Console, in the API Key section. An API Key is always associated with a service user in your account and its access is managed using role-based access control.

Integrating applications

These are interfaces that allow utilizing robot capabilities in other applications. There are various alternatives that are suitable for different types of applications and technologies

REST APIs

InOrbit REST APIs are best suited for integrating robot functionality in custom applications and business workflows. They include specifications to query online and historical robot data, execute remote actions, organize robots in collections, track ongoing and past mission status, inspect audit logs and more.

Embeds

InOrbit's Embeds make it easy to include pre-made robot-specific UI components into any Web Client application. Through the InOrbit Console, you can configure dashboards with the widgets that you need for specific use cases and then using an embed code, make them available as part of your application, giving you total control of the user experience.

Incident Management

InOrbit provides different ways to integrate robot monitoring capabilities into your overall incident management workflow. Through the Incident Management interface, it’s possible to dispatch robot alerts in real-time, react to them with context-specific actions from external systems and keep track of ongoing incident updates.

Out-of-the-box integrations with Slack, Google Chat, OpsGenie and PagerDuty can be configured through the InOrbit Console and are best suited for standard workflows.

An outgoing Webhook interface and incoming API are available to integrate with additional systems or implement custom integration behaviors. We’ve provided a code sample to make it easier to get started with these APIs.

Integrating robots

InOrbit provides different alternatives to connect your robots. This section will help you select the best option for your use case.

ROS-based agent

If your robot supports ROS, connecting it to InOrbit can be done in less than a minute using our Quickstart installer. From there, you can take control of the customization using a Debian or Docker based installation and/or applying advanced agent settings. You can also use and extend the InOrbit republisher ROS node to be in control of what specific data you want to expose.

Robot SDK

The Robot SDK enables developers to implement bidirectional communication between robots and the cloud using any robotics framework without using ROS. It leverages a stripped down version of the InOrbit agent to manage the communication between your robot and the cloud and provides simplified bindings for popular robot programming languages such as C++.

Edge SDK

The Edge SDK is useful for connecting robots from intermediary applications without requiring the installation of a software agent on individual robots. It provides a set of interfaces using language bindings to connect to the cloud and submit robot data selectively. This SDK is the recommended path for connecting the InOrbit platform through an existing Fleet Manager.

Interoperability standards

If your robot supports the Mass Robotics AMR Interoperability standard, you can connect it to InOrbit without installing any software or building on any SDK. You can configure and get the endpoint URL through the InOrbit Console. VDA-5050 compliant robots can be connected to InOrbit using the VDA-5050 to InOrbit Proxy. You can also find some open source tools and code samples to ease the implementation of interoperability standards on the robot side in our public GitHub organization.

Tools and samples

    Here are some open source code samples and tools to make it easier to integrate and manage robots:

  • The Google Chat Incident Management sample shows how to connect the InOrbit Incident Management webhook to dispatch alerts into a third-party system

  • This Brickmart Executive Page shows how to use Embeds on a static site. You can see it live here

  • The ros_amr_interop repository brings together resources to help with the adoption of interoperability standards. It includes the massrobotics_amr_sender_py package, which allows you to make a ROS 2 robot compatible with the standard using only configuration.

  • The VDA5050 to InOrbit Proxy is a useful starting point for connecting VDA-5050 compliant devices to InOrbit and it also doubles as a sample code and starting point for using the InOrbit Edge SDK

  • The ros_inorbit_samples repository provides code samples to make it easier to customize the integration of ROS robots with InOrbit. It includes the inorbit_republisher allowing you to use configuration to manage what data is published to InOrbit, and is available for ROS Melodic and Noetic.

Authentication

InOrbit uses API keys to authenticate API requests, use of Embeds and calls from the Edge SDK. An API key identifies your company’s service user. This key provides security so that no one outside of your company can access your data.

To generate your API Key go to InOrbit Console and open the API Key tab. Here you’ll be able to create a new API Key for your company.

ApiKey

You should copy and save the generated key because it will not appear again. On this tab you are also able to delete the API Key, if you need to generate a new one or you don’t need to use it any more.

With the creation of a new API Key, InOrbit will create a new user named Service user, this user will be linked to the created API Key so that when the key is used the actions are logged under Service user.

Restricting API requests: To control access to the API requests made by your company you can change the role of Service user. You can create custom roles or use existing ones by simply changing the role of a user on the Admin tab in InOrbit Console.

API requests

Application Integration

REST APIs

Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

InOrbit offers REST and streaming APIs that enable programmatic access to InOrbit features. Using these APIs you can fetch data related to your robots, trigger actions, integrate with incident management systems and more.

Base URLs:

https://api.inorbit.ai/

Robots

Operations to list and retrieve robots information

Retrieves a robot

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}', headers = headers)

print(r.json())

GET /robots/{robotId}

Returns information about a robot given its id

Parameters
Name In Type Required Description
robotId path string true The robot's id

Example responses

200 Response

{
  "id": "0011-aabb-cccc",
  "name": "demo-robot-1234",
  "agentOnline": true,
  "agentVersion": "1.2.3",
  "updatedTs": 1594944602962
}

404 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
200 OK A robot object Robot
404 Not Found error Error

Returns the list of tags for a robot

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/tags \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/tags', headers = headers)

print(r.json())

GET /robots/{robotId}/tags

Returns the list of tags applied to a robot

Parameters
Name In Type Required Description
robotId path string true The robot's id

Example responses

200 Response

[
  {
    "id": "string",
    "name": "string",
    "collectionId": "string",
    "collectionName": "string"
  }
]
Responses
Status Meaning Description Schema
200 OK The list of tags Inline
403 Forbidden Authentication error Error
404 Not Found error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None
Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [RobotTag] false none none
» id string false none Unique identifier of the tag
» name string false none Tag name
» collectionId string false none Id of the collection this tag belongs to
» collectionName string false none Collection name

Untag a robot

Code samples

## You can also use wget
curl -X DELETE https://api.inorbit.ai/robots/{robotId}/tags/{tagId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.delete('https://api.inorbit.ai/robots/{robotId}/tags/{tagId}', headers = headers)

print(r.json())

DELETE /robots/{robotId}/tags/{tagId}

Parameters
Name In Type Required Description
robotId path string true The robot's id
tagId path string true The id of the tag

Example responses

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
204 No Content The robot was untagged successfully None
400 Bad Request The robot couldn't be untagged Error
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None

Retrieves a list of robots

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots', headers = headers)

print(r.json())

GET /robots

Returns information all robots this account can access

Example responses

200 Response

[
  {
    "id": "string",
    "name": "string",
    "agentOnline": true,
    "agentVersion": "string",
    "updatedTs": 0
  }
]
Responses
Status Meaning Description Schema
200 OK A list of robots Inline
Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Robot] false none none
» id string true none none
» name string true none none
» agentOnline boolean true none none
» agentVersion string true none none
» updatedTs integer false none none

Collections

Operations on collections and tags

Returns the list of tags

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/tags \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/tags', headers = headers)

print(r.json())

GET /tags

Returns the list of tags defined in the company. Note that only tags visible to the user are included in the result.

Parameters
Name In Type Required Description
collectionId query string false Filter only tags that belong to the specified collection

Example responses

200 Response

[
  {
    "id": "string",
    "name": "string",
    "description": "string",
    "collectionId": "string"
  }
]
Responses
Status Meaning Description Schema
200 OK The list of tags Inline
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None
Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Tag] false none [A tag that can be used to organize robots in a collection]
» id string true none Unique identifier of the tag
» name string true none Tag name
» description string true none Tag description
» collectionId string false none Id of the collection this tag belongs to

Returns a tag

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/tags/{tagId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/tags/{tagId}', headers = headers)

print(r.json())

GET /tags/{tagId}

Returns a tag.

Parameters
Name In Type Required Description
tagId path string true The tag id

Example responses

200 Response

{
  "id": "string",
  "name": "string",
  "description": "string",
  "collectionId": "string"
}
Responses
Status Meaning Description Schema
200 OK The tag object Tag
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None

Updates a tag

Code samples

## You can also use wget
curl -X PUT https://api.inorbit.ai/tags/{tagId} \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.put('https://api.inorbit.ai/tags/{tagId}', headers = headers)

print(r.json())

PUT /tags/{tagId}

Body parameter

{
  "name": "string",
  "description": "string"
}
Parameters
Name In Type Required Description
body body TagCreateEdit true Updates a tag
tagId path string true The tag id

Example responses

201 Response

{
  "id": "string",
  "name": "string",
  "description": "string",
  "collectionId": "string"
}
Responses
Status Meaning Description Schema
201 Created The just updated tag Tag
400 Bad Request Input error found in request body. Check the body data before sending the request. None
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None

Deletes a tag

Code samples

## You can also use wget
curl -X DELETE https://api.inorbit.ai/tags/{tagId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.delete('https://api.inorbit.ai/tags/{tagId}', headers = headers)

print(r.json())

DELETE /tags/{tagId}

Parameters
Name In Type Required Description
tagId path string true The tag id

Example responses

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
204 No Content The tag was deleted None
400 Bad Request The tag couldn't be deleted Error
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None

Returns the list of tags for a collection

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/collections/{collectionId}/tags \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/collections/{collectionId}/tags', headers = headers)

print(r.json())

GET /collections/{collectionId}/tags

Returns the list of tags for a collection. Only tags visible to the user are included in the result. Note that this is equivalent to the endpoint /tags?collectionId=xx

Parameters
Name In Type Required Description
collectionId path string true The collection id

Example responses

200 Response

[
  {
    "id": "string",
    "name": "string",
    "description": "string",
    "collectionId": "string"
  }
]
Responses
Status Meaning Description Schema
200 OK The list of tags Inline
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None
Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Tag] false none [A tag that can be used to organize robots in a collection]
» id string true none Unique identifier of the tag
» name string true none Tag name
» description string true none Tag description
» collectionId string false none Id of the collection this tag belongs to

Creates a new tag for a collection

Code samples

## You can also use wget
curl -X POST https://api.inorbit.ai/collections/{collectionId}/tags \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.post('https://api.inorbit.ai/collections/{collectionId}/tags', headers = headers)

print(r.json())

POST /collections/{collectionId}/tags

Body parameter

{
  "name": "string",
  "description": "string"
}
Parameters
Name In Type Required Description
body body TagCreateEdit true Creates a new tag for a collection
collectionId path string true The collection id

Example responses

201 Response

{
  "id": "string",
  "name": "string",
  "description": "string",
  "collectionId": "string"
}
Responses
Status Meaning Description Schema
201 Created The just created tag Tag
400 Bad Request Input error found in request body. Check the body data before sending the request. None
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None

Returns a collection

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/collections/{collectionId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/collections/{collectionId}', headers = headers)

print(r.json())

GET /collections/{collectionId}

Returns a collection

Parameters
Name In Type Required Description
collectionId path string true The collection id

Example responses

200 Response

{
  "id": "string",
  "name": "string",
  "tags": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "collectionId": "string"
    }
  ]
}
Responses
Status Meaning Description Schema
200 OK The collection object Collection
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None

Updates a collection

Code samples

## You can also use wget
curl -X PUT https://api.inorbit.ai/collections/{collectionId} \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.put('https://api.inorbit.ai/collections/{collectionId}', headers = headers)

print(r.json())

PUT /collections/{collectionId}

Body parameter

{
  "name": "string"
}
Parameters
Name In Type Required Description
body body CollectionCreateEdit true Updates a collection
collectionId path string true The collection id

Example responses

201 Response

{
  "id": "string",
  "name": "string",
  "tags": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "collectionId": "string"
    }
  ]
}
Responses
Status Meaning Description Schema
201 Created The just updated collection Collection
400 Bad Request Input error found in request body. Check the body data before sending the request. None
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None

Deletes a collection

Code samples

## You can also use wget
curl -X DELETE https://api.inorbit.ai/collections/{collectionId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.delete('https://api.inorbit.ai/collections/{collectionId}', headers = headers)

print(r.json())

DELETE /collections/{collectionId}

Parameters
Name In Type Required Description
collectionId path string true The collection id

Example responses

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
204 No Content The collections was deleted None
400 Bad Request The collection couldn't be deleted Error
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None

Returns the list of all collections

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/collections \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/collections', headers = headers)

print(r.json())

GET /collections

Returns the list of all collections Note that only collections visible to the user are included in the result.

Example responses

200 Response

[
  {
    "id": "string",
    "name": "string",
    "tags": [
      {
        "id": "string",
        "name": "string",
        "description": "string",
        "collectionId": "string"
      }
    ]
  }
]
Responses
Status Meaning Description Schema
200 OK The list of collections Inline
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None
Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [Collection] false none [A collection that can be used to group robots using a set of tags]
» id string true none Unique identifier of the collection
» name string true none Collection name
» tags [Tag] true none List of tags defined for this collections
»» id string true none Unique identifier of the tag
»» name string true none Tag name
»» description string true none Tag description
»» collectionId string false none Id of the collection this tag belongs to

Creates a new collection

Code samples

## You can also use wget
curl -X POST https://api.inorbit.ai/collections \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.post('https://api.inorbit.ai/collections', headers = headers)

print(r.json())

POST /collections

Body parameter

{
  "name": "string"
}
Parameters
Name In Type Required Description
body body CollectionCreateEdit true Creates a collection

Example responses

201 Response

{
  "id": "string",
  "name": "string",
  "tags": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "collectionId": "string"
    }
  ]
}
Responses
Status Meaning Description Schema
201 Created The just created collection Collection
400 Bad Request Input error found in request body. Check the body data before sending the request. None
403 Forbidden Authentication error Error
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None

Attributes

Operations on attributes (data sources values)

Returns an attribute last value and last update time

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/attributes/{attributeId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/attributes/{attributeId}', headers = headers)

print(r.json())

GET /robots/{robotId}/attributes/{attributeId}

Returns an attribute last value and the timestamp of the last update

Parameters
Name In Type Required Description
robotId path string true The robot's id
attributeId path string true The attribute id

Example responses

200 Response

{
  "attribute": "agentOnline",
  "value": true,
  "ts": 1594944602962
}

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
200 OK Attribute value and last update AttributeValue
400 Bad Request error Error

Returns a list with the values for a selected attribute

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/attributes/{attributeId}/timerange \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/attributes/{attributeId}/timerange', headers = headers)

print(r.json())

GET /robots/{robotId}/attributes/{attributeId}/timerange

Returns a list with the values for a selected attribute

Parameters
Name In Type Required Description
robotId path string true The robot's id
attributeId path string true The attribute id
startTs query string false The start timestamp
endTs query string false The end timestamp

Example responses

200 Response

{
  "type": "array",
  "values": {
    "values": "##/components/schemas/AttributeDefinition"
  }
}

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
200 OK Attributes values AttributeValue
400 Bad Request error Error
403 Forbidden unauthorized Error

Returns an attribute definition from a specific robot

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/attributeDefinitions/{attributeId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/attributeDefinitions/{attributeId}', headers = headers)

print(r.json())

GET /robots/{robotId}/attributeDefinitions/{attributeId}

Returns an attribute definition from a specific robot. Note that these are normally the same definitions from the company it belongs to; unless it has specific configuration overrides.

Parameters
Name In Type Required Description
robotId path string true The robot's id
attributeId path string true The attribute id

Example responses

200 Response

{
  "id": "string",
  "label": "string",
  "mapping": {
    "source": "string",
    "key": "string",
    "topic": "string",
    "namespace": "string"
  }
}
Responses
Status Meaning Description Schema
200 OK The attribute definition AttributeDefinition
400 Bad Request error Error

Returns all attribute definitions for a robot

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/attributeDefinitions \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/attributeDefinitions', headers = headers)

print(r.json())

GET /robots/{robotId}/attributeDefinitions

Returns all attribute definitions for a robot. They are normally the same as the attribute definitions for the company it belongs to, except the case when configuration overrides have been defined for the robot.

Parameters
Name In Type Required Description
robotId path string true The robot's id

Example responses

200 Response

[
  {
    "id": "string",
    "label": "string",
    "mapping": {
      "source": "string",
      "key": "string",
      "topic": "string",
      "namespace": "string"
    }
  }
]
Responses
Status Meaning Description Schema
200 OK A list with all attributes definitions Inline
400 Bad Request error Error
Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [AttributeDefinition] false none none
» id string true none Attribute id
» label string true none User-defined label
» mapping object false none Defines the mapping from a robot data source
»» source string true none Identifies the type of data source for this attribute.

Accepted values include 'key-value' for values reported in ROS topics;
'diagnostics' for elements retrieved from ROS diagnostics;
'file' for file contents retrieved from filesystem.

Each source type may contain different additional fields.
»» key string false none The 'key' for key-value sources, as well as for ROS diagnostics.
»» topic string false none Optional, the ROS topic from which a key-value source is captured. Defaults to /inorbit/custom_data/0
»» namespace string false none The route (namespace) in the ROS diagnostics tree

Returns all attribute definitions

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/config/attributeDefinitions \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/config/attributeDefinitions', headers = headers)

print(r.json())

GET /config/attributeDefinitions

Returns all attribute definitions

Example responses

200 Response

[
  {
    "id": "string",
    "label": "string",
    "mapping": {
      "source": "string",
      "key": "string",
      "topic": "string",
      "namespace": "string"
    }
  }
]
Responses
Status Meaning Description Schema
200 OK A list with all attributes definitions Inline
400 Bad Request error Error
Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [AttributeDefinition] false none none
» id string true none Attribute id
» label string true none User-defined label
» mapping object false none Defines the mapping from a robot data source
»» source string true none Identifies the type of data source for this attribute.

Accepted values include 'key-value' for values reported in ROS topics;
'diagnostics' for elements retrieved from ROS diagnostics;
'file' for file contents retrieved from filesystem.

Each source type may contain different additional fields.
»» key string false none The 'key' for key-value sources, as well as for ROS diagnostics.
»» topic string false none Optional, the ROS topic from which a key-value source is captured. Defaults to /inorbit/custom_data/0
»» namespace string false none The route (namespace) in the ROS diagnostics tree

Returns an attribute definition

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/config/attributeDefinitions/{attributeId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/config/attributeDefinitions/{attributeId}', headers = headers)

print(r.json())

GET /config/attributeDefinitions/{attributeId}

Returns an attribute definition

Parameters
Name In Type Required Description
attributeId path string true The attribute id

Example responses

200 Response

{
  "id": "string",
  "label": "string",
  "mapping": {
    "source": "string",
    "key": "string",
    "topic": "string",
    "namespace": "string"
  }
}
Responses
Status Meaning Description Schema
200 OK The attribute definition AttributeDefinition
400 Bad Request error Error

Localization

Queries on robots localization and maps

Retrieves a list of maps available for a robot

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/maps \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/maps', headers = headers)

print(r.json())

GET /robots/{robotId}/maps

Returns a list of maps available for the requested robot

Parameters
Name In Type Required Description
robotId path string true The robot's id

Example responses

200 Response

[
  {
    "robotId": "string",
    "mapId": "string",
    "label": "string",
    "width": 0,
    "height": 0,
    "resolution": 0,
    "x": 0,
    "y": 0,
    "dataHash": "string",
    "updatedTs": 0
  }
]
Responses
Status Meaning Description Schema
200 OK The current list of maps in this robot Inline
Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [MapMetadata] false none none
» robotId string false none Unique robot ID
» mapId string false none Map ID (unique only within robot)
» label string false none Map label (usually corresponds to ROS topic)
» width integer false none Map width, in pixels
» height integer false none Map height, in pixels
» resolution number false none Map resolution
» x number false none Map origin, X
» y number false none Map origin, Y
» dataHash string false none Internal data hash. Can be safely used to determine if map has been modified.
» updatedTs number false none Latest modification timestamp (unix epoch millis)

Upload map data

Code samples

## You can also use wget
curl -X POST https://api.inorbit.ai/robots/{robotId}/maps \
  -H 'Content-Type: multipart/form-data' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Content-Type': 'multipart/form-data',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.post('https://api.inorbit.ai/robots/{robotId}/maps', headers = headers)

print(r.json())

POST /robots/{robotId}/maps

This is a multi-part request composed two parts:

  • An object which defines the map metadata
  • A PNG image of the map

Body parameter

metadata:
  mapId: string
  label: string
  dataHash: string
  resolution: 0
  x: 0
  y: 0
image: string
Parameters
Name In Type Required Description
robotId path string true The robot's id
body body SentMapMetadata true Multipart request with map metadata and map image.
Responses
Status Meaning Description Schema
201 Created Map saved successfully. None
400 Bad Request Input error found in request body. Check the JSON body data before sending the request. None
403 Forbidden You do not have access to this feature. Please contact with support@inorbit.ai if you are interested in obtaining access. None
500 Internal Server Error Internal server error. Please wait a few minutes until it gets solved. None

Retrieves the robot's current map metadata

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/maps/current \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/maps/current', headers = headers)

print(r.json())

GET /robots/{robotId}/maps/current

Retrieves the map metadata for the robot's current map. By default, a map metadata including size, resolution, last updated timestamp and other fields is returned in JSON format.

Parameters
Name In Type Required Description
robotId path string true The robot's id

Example responses

200 Response

[
  {
    "robotId": "string",
    "mapId": "string",
    "label": "string",
    "width": 0,
    "height": 0,
    "resolution": 0,
    "x": 0,
    "y": 0,
    "dataHash": "string",
    "updatedTs": 0
  }
]
Responses
Status Meaning Description Schema
200 OK The current map's metadata, in JSON format. string
302 Found Redirect to retrieve the actual map image; if served from elsewhere. None
304 Not Modified Not Modified. The response object is empty None
404 Not Found error Error

Retrieves a robot's map metadata given is id

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/maps/{mapId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/maps/{mapId}', headers = headers)

print(r.json())

GET /robots/{robotId}/maps/{mapId}

Retrieves an individual map's metadata or binary data. By default, a map metadata including size, resolution, last updated timestamp and other fields is returned in JSON format (see application/json response). By specifying Accept: image/png the map in binary image form can be retrieved. See also /download API path.

Parameters
Name In Type Required Description
robotId path string true The robot's id
mapId path string true The map id

Example responses

200 Response

[
  {
    "robotId": "string",
    "mapId": "string",
    "label": "string",
    "width": 0,
    "height": 0,
    "resolution": 0,
    "x": 0,
    "y": 0,
    "dataHash": "string",
    "updatedTs": 0
  }
]
Responses
Status Meaning Description Schema
200 OK A binary map image. Note that response 302 is more frequently implemented. string
302 Found Redirect to retrieve the actual map image; if served from elsewhere. None
304 Not Modified Not Modified. The response object is empty None
404 Not Found error Error

Downloads a map binary image

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/maps/{mapId}/download \
  -H 'Accept: image/png' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'image/png',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/maps/{mapId}/download', headers = headers)

print(r.json())

GET /robots/{robotId}/maps/{mapId}/download

Retrieves the raw map image from a robot, given its id. The resulting image is always in PNG format, with Content-Type: image/png. To use this map, the metadata from /{mapId} API is also necessary (resolution, origin).

Parameters
Name In Type Required Description
robotId path string true The robot's id
mapId path string true The map id

Example responses

200 Response

404 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
200 OK A binary map image. Note that response 302 is more frequently implemented. string
302 Found Redirect to retrieve the actual map image; if served from elsewhere. None
304 Not Modified Not Modified. The response object is empty.

This response can be returned if using If-Modified-Since HTTP header, and the map has not been changed since the specified date.|None| |404|Not Found|error|Error|

Returns a robot's current pose

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/localization/pose \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/localization/pose', headers = headers)

print(r.json())

GET /robots/{robotId}/localization/pose

Returns the pose of a robot, including position and orientation

Parameters
Name In Type Required Description
robotId path string true The robot's id

Example responses

200 Response

{
  "mapId": "string",
  "mapDataHash": "string",
  "x": 0,
  "y": 0,
  "theta": 0,
  "ts": 0,
  "xPixels": 0,
  "yPixels": 0
}
Responses
Status Meaning Description Schema
200 OK The current pose of a robot RobotPose

Returns all available localization data for a robot

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/localization/full \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/localization/full', headers = headers)

print(r.json())

GET /robots/{robotId}/localization/full

Returns all available localization data for a robot, including pose and lasers if available. If an include query param is sent, only those values are returned.

Parameters
Name In Type Required Description
robotId path string true The robot's id
include query array[string] false Data to be included in the response. If not set, all available data is returned.
## Enumerated Values
Parameter Value
include pose
include laser
include costmap

Example responses

200 Response

{
  "pose": {
    "mapId": "string",
    "mapDataHash": "string",
    "x": 0,
    "y": 0,
    "theta": 0,
    "ts": 0,
    "xPixels": 0,
    "yPixels": 0
  },
  "lasers": [
    {
      "ranges": [
        {
          "x": 0,
          "y": 0
        }
      ],
      "ts": 0
    }
  ],
  "costmap": {
    "ts": 0
  }
}
Responses
Status Meaning Description Schema
200 OK The current localization data of a robot RobotLocalization

Operations related to robots navigation

Sends a list of waypoints to a robot

Code samples

## You can also use wget
curl -X POST https://api.inorbit.ai/robots/{robotId}/navigation/waypoints \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.post('https://api.inorbit.ai/robots/{robotId}/navigation/waypoints', headers = headers)

print(r.json())

POST /robots/{robotId}/navigation/waypoints

Sends a list of navigation waypoints to a robot

Body parameter

{
  "waypoints": [
    {
      "frameId": "string",
      "x": 0,
      "y": 0,
      "theta": 0
    }
  ]
}
Parameters
Name In Type Required Description
robotId path string true The robot's id
body body NavigationWaypointRequest true Waypoints list

Example responses

200 Response

{
  "message": "string"
}
Responses
Status Meaning Description Schema
200 OK Waypoints sent to the robot successfully. NavigationWaypointResponse
400 Bad Request Request error Error
403 Forbidden Authentication error Error
404 Not Found Robot not found Error
500 Internal Server Error Internal error Error

Locks

APIs to lock and unlock robots

Checks if a robot is locked

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/lock \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/lock', headers = headers)

print(r.json())

GET /robots/{robotId}/lock

Checks if a robot is locked

Parameters
Name In Type Required Description
robotId path string true The robot's id

Example responses

200 Response

{
  "locked": {
    "userId": "M3ojid92H7rq3hvac",
    "userName": "service user",
    "userEmail": null,
    "locked": true,
    "ts": 1597342004918,
    "expirationTs": 1597342604918
  },
  "lockedForUser": false
}

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
200 OK robot lock status Inline
400 Bad Request error Error
Response Schema

Locks a robot

Code samples

## You can also use wget
curl -X PUT https://api.inorbit.ai/robots/{robotId}/lock \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.put('https://api.inorbit.ai/robots/{robotId}/lock', headers = headers)

print(r.json())

PUT /robots/{robotId}/lock

Locks a robot

Parameters
Name In Type Required Description
robotId path string true The robot's id

Example responses

201 Response

{
  "lock": {
    "userId": "M3ojid92H7rq3hvac",
    "userName": "service user",
    "userEmail": null,
    "locked": true,
    "ts": 1597342004918,
    "expirationTs": 1597342604918
  }
}

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
201 Created created lock attributes Lock
400 Bad Request error Error

Unlocks a robot

Code samples

## You can also use wget
curl -X DELETE https://api.inorbit.ai/robots/{robotId}/lock \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.delete('https://api.inorbit.ai/robots/{robotId}/lock', headers = headers)

print(r.json())

DELETE /robots/{robotId}/lock

Locks a robot

Parameters
Name In Type Required Description
robotId path string true The robot's id

Example responses

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
204 No Content created lock attributes None
400 Bad Request error Error

Actions

Operations on robots actions

Returns the list of all actions defined for a robot

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/actionDefinitions \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/actionDefinitions', headers = headers)

print(r.json())

GET /robots/{robotId}/actionDefinitions

Returns the list of all actions defined for a robot

Parameters
Name In Type Required Description
robotId path string true The robot's id

Example responses

200 Response

[
  {
    "actionId": "string",
    "type": "PublishToTopic",
    "label": "string",
    "parameters": [
      {
        "name": "string",
        "type": "string",
        "default": null
      }
    ],
    "requiresLock": true
  }
]
Responses
Status Meaning Description Schema
200 OK The list of actions definitions Inline
Response Schema

Status Code 200

Name Type Required Restrictions Description
anonymous [ActionDefinition] false none [A robot action definition]
» actionId string false none ID of the action definition
» type string false none Type of action
» label string false none Action descriptive label
» parameters [ActionDefinitionParameter] false none List of expected parameters and their types
»» name string false none Parameter name
»» type string false none Parameter type
»» default any false none Parameter default value
» requiresLock boolean false none True if the robot must be locked by the caller before triggering this action
## Enumerated Values
Property Value
type PublishToTopic
type RunScript

Executes an action on a robot

Code samples

## You can also use wget
curl -X POST https://api.inorbit.ai/robots/{robotId}/actions \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.post('https://api.inorbit.ai/robots/{robotId}/actions', headers = headers)

print(r.json())

POST /robots/{robotId}/actions

Executes an action on a robot

Body parameter

{
  "actionId": "string",
  "parameters": {
    "param1": "some value",
    "param2": "otherValue"
  }
}
Parameters
Name In Type Required Description
robotId path string true The robot's id
body body ActionExecutionRequest true Action execution request

Example responses

201 Response

{
  "executionId": "string",
  "status": "started",
  "statusDetails": "string",
  "startTs": 0,
  "lastUpdateTs": 0,
  "returnCode": 0,
  "stderr": "string",
  "stdout": "string"
}
Responses
Status Meaning Description Schema
201 Created The status of the action execution ActionExecutionStatus

Queries the status of an action execution reported by a robot

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/actions/{executionId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/actions/{executionId}', headers = headers)

print(r.json())

GET /robots/{robotId}/actions/{executionId}

Queries the status of an action execution for a robot

Parameters
Name In Type Required Description
robotId path string true The robot's id
executionId path string true The action executionId of a previously triggered action

Example responses

200 Response

{
  "executionId": "string",
  "status": "started",
  "statusDetails": "string",
  "startTs": 0,
  "lastUpdateTs": 0,
  "returnCode": 0,
  "stderr": "string",
  "stdout": "string"
}
Responses
Status Meaning Description Schema
200 OK Current status of the action execution ActionExecutionStatus

Incidents

Operations to open and close incidents

Code samples

## You can also use wget
curl -X POST https://api.inorbit.ai/robots/{robotId}/incidents \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.post('https://api.inorbit.ai/robots/{robotId}/incidents', headers = headers)

print(r.json())

POST /robots/{robotId}/incidents

Opens an incident related to a robot using the provided alias as key.

The triggerId must match a trigger defined in InOrbit's Settings -> Insights -> Incidents screen. The alias is also used for deduplication. Multiple invocations of this operation for the same robot and alias will create only one incident.

Body parameter

{
  "triggerId": "string",
  "alias": "string",
  "level": "error",
  "label": "string",
  "message": "string"
}
Parameters
Name In Type Required Description
robotId path string true The robot's id
body body Incident true Incident object to be created

Example responses

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
201 Created Incident created None
400 Bad Request error Error

Code samples

## You can also use wget
curl -X DELETE https://api.inorbit.ai/robots/{robotId}/incidents/{incidentAlias} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.delete('https://api.inorbit.ai/robots/{robotId}/incidents/{incidentAlias}', headers = headers)

print(r.json())

DELETE /robots/{robotId}/incidents/{incidentAlias}

Closes an incident related to a robot

Parameters
Name In Type Required Description
robotId path string true The robot's id
incidentAlias path string true The incident alias used during incident creation

Example responses

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
204 No Content Incident updated None
400 Bad Request error Error

Missions

Operations on robot missions

Queries missions

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/missions \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/missions', headers = headers)

print(r.json())

GET /missions

Returns a list of missions that satisfy some filters

Parameters
Name In Type Required Description
robotId query string false The robot id
inProgress query boolean false Filter missions that are in progress

Example responses

200 Response

{
  "missions": [
    {
      "missionId": "string",
      "robotId": "string",
      "status": "string",
      "state": "string",
      "inProgress": true,
      "label": "string",
      "startTs": 0,
      "endTs": 0,
      "completedPercent": 0,
      "estimatedDurationSecs": 0,
      "tasks": [
        {
          "taskId": "string",
          "status": "string",
          "inProgress": true,
          "completed": true,
          "label": "string",
          "updatedTs": 0,
          "startTs": 0,
          "endTs": 0,
          "completedPercent": 0,
          "estimatedDurationSecs": 0,
          "type": "navigation",
          "arguments": {}
        }
      ],
      "arguments": {},
      "data": {}
    }
  ]
}
Responses
Status Meaning Description Schema
200 OK List of missions matching the given filters MissionSearchResults
403 Forbidden Authentication error Error

Creates a mission

Code samples

## You can also use wget
curl -X POST https://api.inorbit.ai/missions \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.post('https://api.inorbit.ai/missions', headers = headers)

print(r.json())

POST /missions

Creates a mission for the robot. It returns the mission information in the response

Body parameter

{
  "missionId": "string",
  "robotId": "string",
  "status": "string",
  "state": "string",
  "inProgress": true,
  "label": "string",
  "startTs": 0,
  "endTs": 0,
  "completedPercent": 0,
  "estimatedDurationSecs": 0,
  "tasks": [
    {
      "taskId": "string",
      "status": "string",
      "inProgress": true,
      "completed": true,
      "label": "string",
      "updatedTs": 0,
      "startTs": 0,
      "endTs": 0,
      "completedPercent": 0,
      "estimatedDurationSecs": 0,
      "type": "navigation",
      "arguments": {}
    }
  ],
  "arguments": {},
  "data": {}
}
Parameters
Name In Type Required Description
body body BasicMission true Mission object to be created

Example responses

201 Response

{
  "missionId": "string",
  "robotId": "string",
  "status": "string",
  "state": "string",
  "inProgress": true,
  "label": "string",
  "startTs": 0,
  "endTs": 0,
  "completedPercent": 0,
  "estimatedDurationSecs": 0,
  "tasks": [
    {
      "taskId": "string",
      "status": "string",
      "inProgress": true,
      "completed": true,
      "label": "string",
      "updatedTs": 0,
      "startTs": 0,
      "endTs": 0,
      "completedPercent": 0,
      "estimatedDurationSecs": 0,
      "type": "navigation",
      "arguments": {}
    }
  ],
  "arguments": {},
  "data": {},
  "createdTs": 0,
  "updatedTs": 0,
  "currentTaskId": "string"
}
Responses
Status Meaning Description Schema
201 Created A Mission object containing all mission's attributes Mission
403 Forbidden Authentication error Error
404 Not Found Robot does not exist Error
412 Precondition Failed Conflict, the robot is executing another mission (and auto-ending missions is not configured) Error

Updates a mission

Code samples

## You can also use wget
curl -X PUT https://api.inorbit.ai/missions/{missionId} \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.put('https://api.inorbit.ai/missions/{missionId}', headers = headers)

print(r.json())

PUT /missions/{missionId}

Communicates updates on a mission execution. It should be called whenever a mission status changes (has started, has finished) or any of its tasks has just been completed. Times are recorded assuming these updates are called immediately.

Body parameter

{
  "status": "string",
  "state": "string",
  "currentTaskId": "string",
  "inProgress": true,
  "label": "string",
  "startTs": 0,
  "endTs": 0,
  "completedPercent": 0,
  "estimatedDurationSecs": 0,
  "tasks": [
    {
      "taskId": "string",
      "status": "string",
      "inProgress": true,
      "completed": true,
      "estimatedDurationSecs": 0
    }
  ]
}
Parameters
Name In Type Required Description
body body MissionUpdate true Mission attributes to be modified
missionId path string true The mission id

Example responses

200 Response

{
  "missionId": "string",
  "robotId": "string",
  "status": "string",
  "state": "string",
  "inProgress": true,
  "label": "string",
  "startTs": 0,
  "endTs": 0,
  "completedPercent": 0,
  "estimatedDurationSecs": 0,
  "tasks": [
    {
      "taskId": "string",
      "status": "string",
      "inProgress": true,
      "completed": true,
      "label": "string",
      "updatedTs": 0,
      "startTs": 0,
      "endTs": 0,
      "completedPercent": 0,
      "estimatedDurationSecs": 0,
      "type": "navigation",
      "arguments": {}
    }
  ],
  "arguments": {},
  "data": {},
  "createdTs": 0,
  "updatedTs": 0,
  "currentTaskId": "string"
}
Responses
Status Meaning Description Schema
200 OK A Mission object containing all mission's attributes Mission
403 Forbidden Authentication error Error
404 Not Found Mission does not exist Error

Terminates a mission

Code samples

## You can also use wget
curl -X DELETE https://api.inorbit.ai/missions/{missionId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.delete('https://api.inorbit.ai/missions/{missionId}', headers = headers)

print(r.json())

DELETE /missions/{missionId}

Communicates that the current mission has been cancelled. It is equivalent to PUT on the same path, with { status: cancelled }. Note: Does NOT actually delete a mission.

Parameters
Name In Type Required Description
missionId path string true The mission id

Example responses

403 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
204 No Content The mission was terminated successfuly None
403 Forbidden Authentication error Error
404 Not Found Mission not found error Error

Retrieves a mission

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/missions/{missionId} \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/missions/{missionId}', headers = headers)

print(r.json())

GET /missions/{missionId}

Returns information about a mission

Parameters
Name In Type Required Description
missionId path string true The mission id

Example responses

200 Response

{
  "missionId": "string",
  "robotId": "string",
  "status": "string",
  "state": "string",
  "inProgress": true,
  "label": "string",
  "startTs": 0,
  "endTs": 0,
  "completedPercent": 0,
  "estimatedDurationSecs": 0,
  "tasks": [
    {
      "taskId": "string",
      "status": "string",
      "inProgress": true,
      "completed": true,
      "label": "string",
      "updatedTs": 0,
      "startTs": 0,
      "endTs": 0,
      "completedPercent": 0,
      "estimatedDurationSecs": 0,
      "type": "navigation",
      "arguments": {}
    }
  ],
  "arguments": {},
  "data": {},
  "createdTs": 0,
  "updatedTs": 0,
  "currentTaskId": "string"
}
Responses
Status Meaning Description Schema
200 OK A Mission object containing all mission's attributes Mission
403 Forbidden Authentication error Error
404 Not Found Mission not found error Error

AuditLogs

Returns a list of robot logged events

Code samples

## You can also use wget
curl -X GET https://api.inorbit.ai/robots/{robotId}/auditLogs \
  -H 'Accept: application/json' \
  -H 'x-auth-inorbit-app-key: API_KEY'

import requests
headers = {
  'Accept': 'application/json',
  'x-auth-inorbit-app-key': 'API_KEY'
}

r = requests.get('https://api.inorbit.ai/robots/{robotId}/auditLogs', headers = headers)

print(r.json())

GET /robots/{robotId}/auditLogs

Returns a list of robot logged events

Parameters
Name In Type Required Description
robotId path string true The robot's id
startTs query string false The start timestamp
endTs query string false The end timestamp
limit query integer false Events per page limit
page query integer false The results page to be returned

Example responses

200 Response

{
  "type": "array",
  "values": {
    "values": "##/components/schemas/RobotAuditLogEvent"
  }
}

400 Response

{
  "error": "string"
}
Responses
Status Meaning Description Schema
200 OK List of robot event logs RobotAuditLogEvent
400 Bad Request error Error
404 Not Found error Error

Schemas

Robot

{
  "id": "string",
  "name": "string",
  "agentOnline": true,
  "agentVersion": "string",
  "updatedTs": 0
}
Properties
Name Type Required Restrictions Description
id string true none none
name string true none none
agentOnline boolean true none none
agentVersion string true none none
updatedTs integer false none none

RobotTag

{
  "id": "string",
  "name": "string",
  "collectionId": "string",
  "collectionName": "string"
}
Properties
Name Type Required Restrictions Description
id string false none Unique identifier of the tag
name string false none Tag name
collectionId string false none Id of the collection this tag belongs to
collectionName string false none Collection name

AttributeValue

{
  "attribute": "string",
  "value": "string",
  "ts": 0
}
Properties
Name Type Required Restrictions Description
attribute string true none Attribute id
value any true none Attribute value

oneOf

Name Type Required Restrictions Description
» anonymous string false none none

xor

Name Type Required Restrictions Description
» anonymous boolean false none none

xor

Name Type Required Restrictions Description
» anonymous number false none none

continued

Name Type Required Restrictions Description
ts integer true none Last update timestamp

AttributeDefinition

{
  "id": "string",
  "label": "string",
  "mapping": {
    "source": "string",
    "key": "string",
    "topic": "string",
    "namespace": "string"
  }
}
Properties
Name Type Required Restrictions Description
id string true none Attribute id
label string true none User-defined label
mapping object false none Defines the mapping from a robot data source
» source string true none Identifies the type of data source for this attribute.

Accepted values include 'key-value' for values reported in ROS topics;
'diagnostics' for elements retrieved from ROS diagnostics;
'file' for file contents retrieved from filesystem.

Each source type may contain different additional fields.
» key string false none The 'key' for key-value sources, as well as for ROS diagnostics.
» topic string false none Optional, the ROS topic from which a key-value source is captured. Defaults to /inorbit/custom_data/0
» namespace string false none The route (namespace) in the ROS diagnostics tree

AttributeValuesList

{
  "values": []
}
Properties
Name Type Required Restrictions Description
values array true none Array with attribute values

RobotLockedResult

{
  "locked": {
    "userId": "string",
    "userName": "string",
    "userEmail": "string",
    "locked": true,
    "ts": 0,
    "expirationTs": 0
  },
  "lockedForUser": true
}
Properties
Name Type Required Restrictions Description
locked Lock true none none
lockedForUser boolean true none Is there any lock that does not allow the user to use the robot ?

RobotNotLockedResult

{
  "locked": true,
  "lockedForUser": true
}
Properties
Name Type Required Restrictions Description
locked boolean true none Indicates if the robot is locked
lockedForUser boolean true none Is there any lock that does not allow the user to use the robot ?

Lock

{
  "userId": "string",
  "userName": "string",
  "userEmail": "string",
  "locked": true,
  "ts": 0,
  "expirationTs": 0
}
Properties
Name Type Required Restrictions Description
userId string false none none
userName string false none none
userEmail string false none none
locked boolean false none none
ts integer false none none
expirationTs integer false none none

RobotAuditLogEvent

[]
Properties
Name Type Required Restrictions Description
entries object false none none
» ts integer true none Event timestamp
» message string true none Event log message

Incident

{
  "triggerId": "string",
  "alias": "string",
  "level": "error",
  "label": "string",
  "message": "string"
}
Properties
Name Type Required Restrictions Description
triggerId string true none Trigger as shown in InOrbit Settings -> Insights -> Incidents screen.
alias string true none The incident alias serves as the incident identifier and deduplication
key. The caller can choose any value, like for example a related
incident id in another incident management system.
level string true none Incident level
label string true none Incident label to use in the incidents list
message string true none Incident message
# Enumerated Values
Property Value
level error
level warning

Error

{
  "error": "string"
}
Properties
Name Type Required Restrictions Description
error string false none none

CollectionCreateEdit

{
  "name": "string"
}

A collection that can be used to group robots using a set of tags

Properties
Name Type Required Restrictions Description
name string true none Collection name

Collection

{
  "id": "string",
  "name": "string",
  "tags": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "collectionId": "string"
    }
  ]
}

A collection that can be used to group robots using a set of tags

Properties
Name Type Required Restrictions Description
id string true none Unique identifier of the collection
name string true none Collection name
tags [Tag] true none List of tags defined for this collections

Tag

{
  "id": "string",
  "name": "string",
  "description": "string",
  "collectionId": "string"
}

A tag that can be used to organize robots in a collection

Properties
Name Type Required Restrictions Description
id string true none Unique identifier of the tag
name string true none Tag name
description string true none Tag description
collectionId string false none Id of the collection this tag belongs to

TagCreateEdit

{
  "name": "string",
  "description": "string"
}

A tag that can be used to organize robots in a collection

Properties
Name Type Required Restrictions Description
name string true none Tag name
description string false none Tag description

ActionDefinition

{
  "actionId": "string",
  "type": "PublishToTopic",
  "label": "string",
  "parameters": [
    {
      "name": "string",
      "type": "string",
      "default": null
    }
  ],
  "requiresLock": true
}

A robot action definition

Properties
Name Type Required Restrictions Description
actionId string false none ID of the action definition
type string false none Type of action
label string false none Action descriptive label
parameters [ActionDefinitionParameter] false none List of expected parameters and their types
requiresLock boolean false none True if the robot must be locked by the caller before triggering this action
## Enumerated Values
Property Value
type PublishToTopic
type RunScript

Action Definition Parameter

{
  "name": "string",
  "type": "string",
  "default": null
}

A robot action definition parameter

Properties
Name Type Required Restrictions Description
name string false none Parameter name
type string false none Parameter type
default any false none Parameter default value

ActionExecutionRequest

{
  "actionId": "string",
  "parameters": {
    "param1": "some value",
    "param2": "otherValue"
  }
}

A robot action execution request

Properties
Name Type Required Restrictions Description
actionId string false none ID of the action definition to be executed
parameters object false none Parameters to be used to execute the action

ActionExecutionStatus

{
  "executionId": "string",
  "status": "started",
  "statusDetails": "string",
  "startTs": 0,
  "lastUpdateTs": 0,
  "returnCode": 0,
  "stderr": "string",
  "stdout": "string"
}

An action execution status, including return code and outputs

Properties
Name Type Required Restrictions Description
executionId string false none ID that identifies the action execution and can be used to later query it's status.
Only the execution of actions of type RunScript have an associated executionId.
status string true none Execution status
statusDetails string false none Optional extra information related to the status
startTs integer true none timestamp (unix epoch millis) when the action execution started
lastUpdateTs integer true none timestamp (unix epoch millis) when the action status was last updated
returnCode integer false none none
stderr string false none none
stdout string false none none
### Enumerated Values
Property Value
status started
status finished
status aborted

SentMapMetadata

{
  "metadata": {
    "mapId": "string",
    "label": "string",
    "dataHash": "string",
    "resolution": 0,
    "x": 0,
    "y": 0
  },
  "image": "string"
}
Properties
Name Type Required Restrictions Description
metadata object false none An application/JSON object that defines the map metadata. It is composed of the map label, resolution and coordinates x and y.
» mapId string false none none
» label string false none none
» dataHash string false none none
» resolution number false none none
» x number false none Map origin, X
» y number false none Map origin, Y
image string(binary) false none Map image in PNG format

MapMetadata

{
  "robotId": "string",
  "mapId": "string",
  "label": "string",
  "width": 0,
  "height": 0,
  "resolution": 0,
  "x": 0,
  "y": 0,
  "dataHash": "string",
  "updatedTs": 0
}
Properties
Name Type Required Restrictions Description
robotId string false none Unique robot ID
mapId string false none Map ID (unique only within robot)
label string false none Map label (usually corresponds to ROS topic)
width integer false none Map width, in pixels
height integer false none Map height, in pixels
resolution number false none Map resolution
x number false none Map origin, X
y number false none Map origin, Y
dataHash string false none Internal data hash. Can be safely used to determine if map has been modified.
updatedTs number false none Latest modification timestamp (unix epoch millis)

RobotPose

{
  "mapId": "string",
  "mapDataHash": "string",
  "x": 0,
  "y": 0,
  "theta": 0,
  "ts": 0,
  "xPixels": 0,
  "yPixels": 0
}

Robot position and orientation

Properties
Name Type Required Restrictions Description
mapId string false none ID of the map that the robot was using when it last reported the pose
mapDataHash string false none Map internal data hash. Can be safely used to determine if map has been modified.
x number false none Robot pose X coordinate
y number false none Robot pose Y coordinate
theta number false none Robot orientation
ts number false none timestamp (unix epoch millis) when the pose was reported by the robot
xPixels number false none Robot pose.x in pixels
yPixels number false none Robot pose.y in pixels (following right-hand rule 0 is the bottom)

RobotLocalization

{
  "pose": {
    "mapId": "string",
    "mapDataHash": "string",
    "x": 0,
    "y": 0,
    "theta": 0,
    "ts": 0,
    "xPixels": 0,
    "yPixels": 0
  },
  "lasers": [
    {
      "ranges": [
        {
          "x": 0,
          "y": 0
        }
      ],
      "ts": 0
    }
  ],
  "costmap": {
    "ts": 0
  }
}
Properties
Name Type Required Restrictions Description
pose RobotPose false none Robot position and orientation
lasers [LaserData] false none [All laser's coordinates in relation to the Robot's position.]
costmap CostMap false none TBD

CostMap

{
  "ts": 0
}

TBD

Properties
Name Type Required Restrictions Description
ts number false none timestamp (unix epoch millis) when the costmap was reported by the robot

LaserData

{
  "ranges": [
    {
      "x": 0,
      "y": 0
    }
  ],
  "ts": 0
}

All laser's coordinates in relation to the Robot's position.

Properties
Name Type Required Restrictions Description
ranges [object] false none none
» x number false none Laser pose X coordinate
» y number false none Laser pose Y coordinate
ts number false none timestamp (unix epoch millis) when the laser data was reported by the robot

{
  "waypoints": [
    {
      "frameId": "string",
      "x": 0,
      "y": 0,
      "theta": 0
    }
  ]
}

A navigation waypoint request

Properties
Name Type Required Restrictions Description
waypoints [NavigationWaypoint] true none [A navigation waypoint]

{
  "message": "string"
}

Response to a successfully issued navigation command

Properties
Name Type Required Restrictions Description
message string true none Additional data about the command execution, like for example if the robot was automatically locked.

{
  "frameId": "string",
  "x": 0,
  "y": 0,
  "theta": 0
}

A navigation waypoint

Properties
Name Type Required Restrictions Description
frameId string false none Reference frame id. This field is optional, if omitted the current frame of the robot is used
x number true none Waypoint x coordinate
y number true none Waypoint y coordinate
theta number true none Waypoint yaw angle in radians

MissionUpdate

{
  "status": "string",
  "state": "string",
  "currentTaskId": "string",
  "inProgress": true,
  "label": "string",
  "startTs": 0,
  "endTs": 0,
  "completedPercent": 0,
  "estimatedDurationSecs": 0,
  "tasks": [
    {
      "taskId": "string",
      "status": "string",
      "inProgress": true,
      "completed": true,
      "estimatedDurationSecs": 0
    }
  ]
}
Properties
Name Type Required Restrictions Description
status string false none Optional. Mission status (error, warning, ok). Most of the times this value is not needed; it will be derived from status and other fields.
state string false none Optional. Mission state. For example "running", "stuck", "late". Mostly customer-dependent; although some states will have their own semantics (configurable).
currentTaskId string false none Updates the task currently being executed by the robot. When updating this values, other fields are also automatically updated (such as start or end time of tasks, and overall mission progress percentage).
inProgress boolean false none Optional. Whether this mission is still running. When inProgress is first changed to true, a startTs value is updated; and when changed from true to false, the endTs field is updated.
label string false none _Optional._Mission description (in the PUT call, missino can be renamed)
startTs number false none Optional. Start time (millis, epoch time). Updates the time the mission actually started. Note that there is no need to update it manually if the flag inProgress is used in POST and PUT calls.
endTs number false none Optional. End time (millis, epoch time). Updates the time the mission ended. Note that there is no need to update it manually if the flag inProgress is used in PUT calls.
completedPercent number false none Optional. Progress of the mission; number from 0.0 to 1.0. This value can be explicitly updated; but in most cases it is not necessary: it can be calculated based on completed tasks and milestones and their declared duration.
estimatedDurationSecs number false none Optional. Updates the mission estimated duration (in seconds).
tasks [object] false none Array of task objects to perform point-wise updates on mission tasks. Not all tasks in the mission are required to appear; only those to be updated. The taskId field in each task object identifies the task (it must exist in the original mission creation) and a few other fields are allowed to be updadted.
» taskId string true none Identifies which task object to update
» status string false none Optional. Updates the status of the task (error, warning, ok)
» inProgress boolean false none Optional. Marks this task as currently in progress. It can sometimes be automatically set to true, by updating the mission currentTaskId field.
» completed boolean false none Optional. Marks this task as complete or incomplete
» estimatedDurationSecs number false none Optional. Updates the tasks estimated duration (in seconds).

BasicMission

{
  "missionId": "string",
  "robotId": "string",
  "status": "string",
  "state": "string",
  "inProgress": true,
  "label": "string",
  "startTs": 0,
  "endTs": 0,
  "completedPercent": 0,
  "estimatedDurationSecs": 0,
  "tasks": [
    {
      "taskId": "string",
      "status": "string",
      "inProgress": true,
      "completed": true,
      "label": "string",
      "updatedTs": 0,
      "startTs": 0,
      "endTs": 0,
      "completedPercent": 0,
      "estimatedDurationSecs": 0,
      "type": "navigation",
      "arguments": {}
    }
  ],
  "arguments": {},
  "data": {}
}
Properties
Name Type Required Restrictions Description
missionId string false none Unique mission id
robotId string true none The id of the robot associated to this mission
status string false none Optional. Mission status (error, warning, ok). Most of the times this value is not needed; it will be derived from status and other fields.
state string false none Optional. Mission state. For example "running", "stuck", "late". Mostly customer-dependent; although some states will have their own semantics (configurable).
inProgress boolean false none Optional. Whether this mission is still running. When inProgress is first changed to true, a startTs value is updated; and when changed from true to false, the endTs field is updated.
label string false none _Optional._Mission description (in the PUT call, missino can be renamed)
startTs number false none Optional. Start time (millis, epoch time). Updates the time the mission actually started. Note that there is no need to update it manually if the flag inProgress is used in POST and PUT calls.
endTs number false none Optional. End time (millis, epoch time). Updates the time the mission ended. Note that there is no need to update it manually if the flag inProgress is used in PUT calls.
completedPercent number false none Optional. Progress of the mission; number from 0.0 to 1.0. This value can be explicitly updated; but in most cases it is not necessary: it can be calculated based on completed tasks and milestones and their declared duration.
estimatedDurationSecs number false none Optional. Updates the mission estimated duration (in seconds).
tasks [Task] false none List of mission tasks
arguments object false none Arguments passed to this mission. Free-form, key-value dictionary.
data object false none Metadata associated to this mission; including telemetry or results collected while running the mission. Free-form, key-value dictionary.

MissionSearchResults

{
  "missions": [
    {
      "missionId": "string",
      "robotId": "string",
      "status": "string",
      "state": "string",
      "inProgress": true,
      "label": "string",
      "startTs": 0,
      "endTs": 0,
      "completedPercent": 0,
      "estimatedDurationSecs": 0,
      "tasks": [
        {
          "taskId": "string",
          "status": "string",
          "inProgress": true,
          "completed": true,
          "label": "string",
          "updatedTs": 0,
          "startTs": 0,
          "endTs": 0,
          "completedPercent": 0,
          "estimatedDurationSecs": 0,
          "type": "navigation",
          "arguments": {}
        }
      ],
      "arguments": {},
      "data": {}
    }
  ]
}
Properties
Name Type Required Restrictions Description
missions [BasicMission] false none List of missions satisfying search criteria

Mission

{
  "missionId": "string",
  "robotId": "string",
  "status": "string",
  "state": "string",
  "inProgress": true,
  "label": "string",
  "startTs": 0,
  "endTs": 0,
  "completedPercent": 0,
  "estimatedDurationSecs": 0,
  "tasks": [
    {
      "taskId": "string",
      "status": "string",
      "inProgress": true,
      "completed": true,
      "label": "string",
      "updatedTs": 0,
      "startTs": 0,
      "endTs": 0,
      "completedPercent": 0,
      "estimatedDurationSecs": 0,
      "type": "navigation",
      "arguments": {}
    }
  ],
  "arguments": {},
  "data": {},
  "createdTs": 0,
  "updatedTs": 0,
  "currentTaskId": "string"
}
Properties

allOf

Name Type Required Restrictions Description
anonymous BasicMission false none none

and

Name Type Required Restrictions Description
anonymous object false none none
» inProgress boolean false none Is the robot currently executing the mission ?
» createdTs number false none Mission creation timestamp
» updatedTs number false none Mission last update timestamp
» startTs number false none Mission last update timestamp
» endTs number false none Mission last update timestamp
» completedPercent number false none Progress of the mission
» currentTaskId string false none Id of the task currently being executed by the robot

Task

{
  "taskId": "string",
  "status": "string",
  "inProgress": true,
  "completed": true,
  "label": "string",
  "updatedTs": 0,
  "startTs": 0,
  "endTs": 0,
  "completedPercent": 0,
  "estimatedDurationSecs": 0,
  "type": "navigation",
  "arguments": {}
}
Properties
Name Type Required Restrictions Description
taskId string true none Task id
status string false none Status of the task (error, warning, ok)
inProgress boolean false none Marks this task as currently in progress. It can sometimes be automatically set to true, by updating the mission currentTaskId field.
completed boolean false none Marks this task as complete or incomplete
label string false none Task label
updatedTs number false none Task last update timestamp
startTs number false none Task last update timestamp
endTs number false none Task last update timestamp
completedPercent number false none Task of the mission
estimatedDurationSecs number false none Task estimated duration in seconds
type string false none Task type. Some types (e.g. "navigation") will receive special treatment in the API, for example assuming the task will finish as approaching a destination navigation point.
arguments object false none Arguments passed to this task. Free-form, key-value dictionary.
# Enumerated Values
Property Value
type navigation

Embeds

InOrbit Embeds allows you to create a dashboard from InOrbit Console and embed it in any application. Leveraging Embeds you can show robot or fleet level information in your applications without having to implement the UI from scratch.

Some example use cases include:

  • Dedicated role based experience on a tablet for a Floor Operator
  • White-labeled end-user portal
  • Unattended team dashboard running on a centralized monitor
  • UI running on your robot’s physical screen to trigger actions

Defining an Embed

Embeds are created by defining a dashboard from the Console and then generating the embedding code for it.

To manage your dashboards go to Robot Data → Dashboards. From there you can create and edit dashboards, including setting visibility rules and modifying sections and widgets. As shown in the following image:

embed-dev-console

Using the gray plus sign you can add new sections. Each section has a name and scope, that can be robot or fleet.

kpi-dash

Using the gray plus sign inside the section you can add widgets from the widgets palette, as shown below:

widget-section

Once you have defined the dashboard, you are ready to embed it into your applications.

Using an Embed in your application

To generate the embedding code, go to InOrbit Console > Robot Data tab > Dashboards section and use the “< >” button on the right, near the top.

using-embed-in-api

Clicking this button shows a code fragment that can be used to embed the dashboard into any HTML page.

code-fragment

You can customize the iframe’s properties to match your application layout. Remember to replace YOUR_APP_KEY_HERE with your InOrbit API Key.

The following image shows how an Embed looks as part of a web application from a fictional company named Brickmart:

embed-looks

Robot Integration

The InOrbit SDK delivers a set of tools and libraries that ease your integration with InOrbit. Robotics companies can leverage the SDK to accelerate development of products while retaining total control of implementation.

The SDK consists of two parts:

  • Robot SDK: This helps developers implement a bidirectional communication channel between robots and InOrbit. This can be used to feed robot data into InOrbit and then implement actions, such as teleoperation and more. The Robot SDK also streamlines integration with ROS and ROS2 by allowing developers to map ROS topics to InOrbit using simple configuration files.
  • Edge SDK: This simplifies integration with third-party or custom applications, like fleet managers, or warehouse management systems. This can allow data to be fed from multiple robots directly into InOrbit.

Robot SDK

The Robot SDK enables developers to implement bidirectional communication between robots and the cloud. It leverages the InOrbit agent to implement the core communication mechanism in an efficient and secure way. Particularly the agent takes care of:

  • Adaptive sampling & throttling
  • Connection handling & offline buffering
  • Security / Encryption
  • Scripted actions
  • Video processing

The Robot SDK provides various methods to ease communication between the agent and other software running on your robot, including:

  • Language Bindings: High-level language-specific APIs that communicate with the agent. Currently the only supported programming language is C++11.
  • Helper components: reduce integration friction with ROS-based robots, but providing zero-code integration mappings from ROS topics.

The following diagram shows how the InOrbit agent interfaces with other software running on the robot:

Robot SDK Interfaces

Software on the robot can communicate with the agent using various mechanisms, depending on the chosen software stack.

Integrating with C++

The Robot SDK for C++ is provided as a C++11 header-only library that can be used to communicate with the InOrbit agent from C++ programs. The library can be downloaded from the Robot SDK for C++ GitHub repository. Note that it is designed to work with the non-ROS InOrbit agent (the Setup section explains how to install the agent).

Using the InOrbit Robot SDK C++ Library you’ll be able to publish data from your programs as shown in example in the right column:

#include "robot-sdk-cpp/include/inorbit/inorbit.hpp"
int main() {
 // Create an InOrbitSDK object
 inorbit::InOrbitSDK sdk;

 // Publish custom data
 sdk.sendKeyValue("battery", 0.56);

 // Publish the pose
 double location[] = {5, 4, 0};
 double rotation_quaternion[] = {0, 0, -0.131, 0.991};
 sdk.sendPose("my_reference_frame", location, rotation_quaternion);
 return 0;
}

The example uses the InOrbitSDK class to publish the pose of the robot and it’s battery level.

Non-ROS agent installation

To integrate from C++ you must use the non-ROS InOrbit agent. It can be installed in different ways, including via a Debian package. For simplicity in this documentation a one-line command that downloads and executes the agent installer is used. After installing the agent you’ll be able to start seeing data from your robot, such as CPU usage, when using InOrbit.

As a prerequisite you’ll have to fetch your company key to add a robot to InOrbit. You can get the key from the InOrbit Console in the “Add Robot” page as shown in the next image:

Developer Console Add a Robot

Your company key is the last segment of the URL, A9wXdA5dsD5in this screenshot. Take note of it since you’ll need it for the next step.

Run the following one-line command on your robot to install the agent, remember to replace ${YOUR_COMPANY_KEY} with the key you obtained in the previous step:

curl "https://control.inorbit.ai/liftoff/${YOUR_COMPANY_KEY}?variant=nonros" | sh

Executing the command will trigger the agent installation process, follow its steps to get the agent running on your robot. NOTE that you must include ?variant=nonros as part of the URL to install the right agent!

After completing the installation, the agent will automatically start and connect to InOrbit. By default the robot name is its “hostname”.

To be sure that everything is configured correctly you can try the following command to check that the agent is up and running:

curl http://localhost:5000

Executing the above should produce the following output: “InOrbit Agent API: OK”.

If for some reason you don't see your robot connected or reporting data, check the agent logs at ~/.inorbit/local/inorbit_agent.log. You are welcome to contact our Support Team if you need additional help fixing the problem.

You can customize the port and binding address used by the agent by editing ~/.inorbit/local/agent.env.sh and setting the following variables:

  • INORBIT_AGENT_API_DEFAULT_PORT: Port used by the agent to listen for connections from the SDK, default values is 5000.
  • INORBIT_AGENT_API_DEFAULT_BINDING: Address used by the agent to listen for connections from the SDK, default value is “localhost”.

Installing the C++ library

You can use the following command to include the library in your project as a git-submodule:

git submodule add https://github.com/inorbit-ai/robot-sdk-cpp.git robot-sdk-cpp

This command will create a new directory named robot-sdk-cpp containing the C++ library.

The InOrbit Robot SDK C++ Library is a header-only C++11 library that encapsulates the communication between C++ programs and the InOrbit agent. It is licensed under the MIT license.

Depending on your preferences, you can add the library to your project in a few different ways. The recommended way, if you are already using Git, is to use git-submodules to include the library's repository in your project. Another option is to just grab the files from the repository and copy them into your project.

Note that if you prefer you can download the library from its repository at GitHub.

Publishing data from C++

#include "robot-sdk-cpp/include/inorbit/inorbit.hpp"
int main() {
  // Create an InOrbitSDK object
  inorbit::InOrbitSDK sdk;
  return 0;
}

All the functionality provided by the SDK library is encapsulated in a class called inorbit::InOrbitSDK, so the first steps to communicate with the InOrbit agent is to include the library and then create an object of this class. This is shown in the code block on the right:

This code includes the library, added to the project in the previous section, and creates the sdk object.

By default the sdk object will talk to the agent using TCP, targeting localhost on port 5000. These and other parameters can be changed using more verbose versions of the constructor.

InOrbitSDK(const std::string &agent_host, int agent_port, bool log_errors);

Using this constructor, you can set the agent host, port and if errors should be reported on stderr (default is true).

The sdk object created in the previous step has a sendPose method that you can use to publish poses data from your program. It receives the reference frame, the robot position and its orientation as a quaternion.

Note that InOrbit uses the Right-hand rule to define the axes and rotation ordering, with X representing the forward direction and Y representing a direction towards the left of the robot. The SDK also uses the XYZW notation for quaternions. So, if you are using a different convention for your localization data, you must apply a conversion before calling sendPose.

#include "robot-sdk-cpp/include/inorbit/inorbit.hpp"
int main() {
 // Create an InOrbitSDK object
 inorbit::InOrbitSDK sdk;

 // Publish the pose
 double location[] = {5, 1, 0};
 double rotation_quaternion[] = {0, 0, 0.383, 0.924};
 sdk.sendPose("map", location, rotation_quaternion);
 return 0;
}

The example on the right shows how you can publish a pose to InOrbit:

The code reports the robot pose as being at x = 5, y = 1, z = 0 with a yaw of 45 degrees counterclockwise in the map reference frame.

The sdk object also provides a sendKeyValue method that you can use to publish almost any data value from your program. You can use this method for different data types, including double, integer and strings.

The example on the right shows how you can publish different values to InOrbit:

#include "robot-sdk-cpp/include/inorbit/inorbit.hpp"
int main() {
 // Create an InOrbitSDK object
 inorbit::InOrbitSDK sdk;

 // Publish custom data of different types: string, double, integer
 sdk.sendKeyValue("battery", 0.56);
 sdk.sendKeyValue("pending_tasks", 4);
 sdk.sendKeyValue("serial", "dd2bc73b");

 return 0;
}

This code publishes the battery level, number of pending tasks and the serial number of the robot. The reported data can be queried using APIs or be visualized from InOrbit Control.

Integrating with ROS 1

The InOrbit agent includes native support for ROS, using the publish/subscribe communication mechanism to exchange data with other software running on your robot. The agent automatically detects topics about maps, cameras and more. You can fine tune this configuration from InOrbit Console.

Publishing Custom Data

rostopic pub /inorbit/custom_data/0 std_msgs/String "battery=55"
rostopic pub /inorbit/custom_data/0 std_msgs/String "status=docked"

The SDK custom data mechanism, allows you to publish telemetry data, static/semi-static robot attributes, and events from your robot to InOrbit.

You can publish any string data to /inorbit/custom_data/0 to send it to InOrbit. You can easily send different elements by publishing a key-value pair either by writing a custom node or by leveraging InOrbit's configuration-based republisher node.

The example on the right shows how to publish some values.

Installing and configuring the InOrbit republisher

republishers:
  - topic: "/mission_data"
    msg_type: "my_custom_msgs/MissionData"
    mappings:
    - field: "goal_id.stamp"
      out:
        topic: "/inorbit/custom_data/0"
        key: "mission_status_goal_timestamp"
    - field: "status"
      out:
        topic: "/inorbit/custom_data/0"
        key: "mission_status"
  - topic: "/errors"
    msg_type: "my_custom_msgs/CustomError"
    mappings:
    - field: "error"
      out:
        topic: "/inorbit/custom_data/0"
        key: "error_code"
    - field: "error_message"
      out:
        topic: "/inorbit/custom_data/0"
        key: "error_string"

The node republisher can be installed like any other standard ROS package e.g. for noetic you'd need to install ros-noetic-inorbit-republisher. To illustrate how to use it, let's assume you want to publish data from a complex custom message my_custom_msgs/ComplexCustomMessage.

The InOrbit republisher configuration shown on the right creates the required publishers and subscribers in order to send the data to InOrbit. To see all the possible parameters, please refer to InOrbit's configuration-based republisher node.

The messages that will arrive at InOrbit read:

  • Two key-value messages for each message on the topic /mission_data:

    • mission_status_goal_timestamp=123456789
    • mission_status="ok"
  • Two key-value messages for each message on the topic /errors:

    • error_code=9
    • error_string="something went wrong"

Running the InOrbit republisher

This node can be executed by using the roslaunch tool and a ROS launchfile pointing to the republisher configuration file, as shown in the example.

<launch>
  <node name="inorbit_republisher" pkg="inorbit_republisher" type="republisher.py">
    <param name="config" textfile="/path/to/config.yaml" />
  </node>
</launch>

Integrating with ROS 2

The InOrbit agent includes support for ROS 2, using the publish/subscribe communication mechanism to exchange data with other software running on your robot.

Publishing Custom Data

ros2 topic pub /inorbit/custom_data/0 std_msgs/String "{data: 'battery=55'}"
ros2 topic pub /inorbit/custom_data/0 std_msgs/String "{data: 'status=docked'}"

The SDK custom data mechanism, allows you to publish telemetry data, static/semi-static robot attributes, and events from your robot to InOrbit.

You can publish any string data to inorbit/custom_data/0 to send it to InOrbit. You can send different elements by publishing a key-value pair, as shown in the example on the right.

Edge SDK

The Edge SDK can be used to build integrations between third-party or custom applications running on the edge and the InOrbit platform. For example, it can be used to feed data from a fleet manager system into InOrbit, without requiring the installation of software on your individual robots.

Edge-SDK

Here a custom component acts as a proxy between the fleet manager system and InOrbit cloud using the Edge SDK.

Any data fed into InOrbit can then be used and queried from other components, like InOrbit Control or REST APIs. This SDK allows the publishing of data related to multiple robots, including their connection state, odometry, poses and any custom attributes you’d like to track..

The Edge SDK is distributed as a NPM package, and you can check the package’s web page at InOrbit Edge SDK npm package for more information. It can be run from Javascript and Typescript projects.

Installation

npm install inorbit@edge-sdk

The Edge SDK can be installed using npm by running the command from the right. This adds the edge-sdk package as a dependency of your project.

Using the SDK

This section explains how to initialize the Edge SDK and publish data to InOrbit. As a prerequisite you should have already installed the npm package and obtained your InOrbit API key.

Initialization

The first step is to initialize the SDK by creating an InOrbit object as shown in the next code block:

import { InOrbit } from '@inorbit/edge-sdk';

const sdk = new InOrbit({ appKey: "YOUR_INORBIT_APP_KEY" });

The code above imports the edge-sdk package and creates the sdk that can then be used to publish robot related data to InOrbit.

Reporting robot connection status

The sdk object can be used to report the connection status of each robot to InOrbit. In order to do this, you need to know the IDs of your robots and use the connectRobot and disconnectRobot methods, as shown here:

const robotId = '12345';
await sdk.connectRobot({ robotId, name: 'MyRobot' });

// Sleep some seconds

await sdk.disconnectRobot(robotId);

The code reports the robot with id 12345 as connected and then as disconnected. Note that when a robot is reported as online, you can also optionally report its name.

The following sections show how data can be published. Note that the robot must be reported as “online” before publishing any data.

Publishing poses

The publishPose method can be used to report a time stamped pose to InOrbit as shown here:

const robotId = '12345';
await sdk.publishPose(robotId, {
  ts: new Date().getTime(),
  x: 5,
  y: 3,
  yaw: 0,
  frameId: 'map'
});

The code here reports that the robot with id 12345 is currently at the position (5, 3) in the “map” reference frame.

Publishing odometry

The publishOdometry method can be used to report odometry data to InOrbit as shown here:

const robotId = '12345';
await sdk.publishOdometry(robotId, {
  tsStart: new Date().getTime(),
  ts: new Date().getTime(),
  speed: {
    linear: 10,
    angular: 1
  }
});

This code reports that the robot with id 12345 is moving with a linear speed of 10 m/s and an angular speed of 1 rad/s.

Publishing other attributes

Other custom attribute can also be reported using the publishCustomDataKV method, as shown in the next code block:

const robotId = '12345';
await sdk.publishCustomDataKV(robotId, {
  battery: 60,
  status: 'Idle'
});

The code here reports two custom attributes, battery and status.

Final Notes

Using the Edge SDK allows you to feed data from multiple robots into InOrbit. Contact us if you need help to use this SDK, integrate it with your software or generate your robot IDs.

Complete examples about using the Edge SDK to publish data from multiple robots to InOrbit can be found at:

Interoperability

This section details the different solutions provided by InOrbit Platform to work with robot interoperability standards, such as VDA 5050 and MassRobotics AMR interoperability. These standards are useful to orchestrate heterogeneous fleets that mix robots from different vendors.

Companies that use robots can leverage InOrbit Platform to connect standards compliant robots to the cloud without having to set up dedicated infrastructure. It’s also possible to connect robots that use different standards and orchestrate them in a homogeneous way using InOrbit’s UI and/or APIs.

Robot makers can also benefit from InOrbit Platform by using its open source packages to make any robot standard compliant using just configuration files.

The following sections detail the different interoperability options and solutions included in InOrbit Platform for different standards.

MassRobotics AMR Interoperability

The MassRobotics AMR Interoperability Standard allows AMRs from different vendors to publish information about their state, location, velocity, health, etc using a well defined set of messages. Data transmission is done over web sockets.

Robots compliant with this standard can be connected to InOrbit without requiring the installation of the InOrbit agent on them. ROS2 based robots can become compliant with the standard using the massrobotics_amr_sender package.

Connecting robots to InOrbit

Standard compliant robots can be connected to InOrbit without requiring the installation of the InOrbit agent. To do so, you have to configure your robots to point to InOrbit’s receiver.

You can find the receiver URL for your account in the Console, under Admin → Interoperability.

Interoperability

The next step is to configure the receiver URL on your robots to start sending data to InOrbit. The details about this step depend on your specific robot model and software.

Making ROS2 robots compliant with the standard

Using the open source massrobotics_amr_sender ROS package, ROS2 based robots can become compliant with the standard using just configuration files. Check the package documentation for more details and examples.

VDA 5050

The VDA 5050 V 1.1. AGV Communication Interface describes the communication interface for exchanging order and status data between a central master control and automated guided vehicles (AGV).

You can leverage InOrbit Platform infrastructure to provision the required components, including the MQTT broker, and connect your VDA 5050 compliant robots to the cloud.

Contact our support team for more information.