diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e7016708cb4b4fda69d2ab52475234034d970dad
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,141 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# vscode
+.vscode/settings.json
diff --git a/README.md b/README.md
index 8dd1d3c33f4d6c075298637fd8a6166caa4a166f..20d02101648073c00e3820ae9ef16be972f3b101 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,6 @@
 # ABB EGM examples
 
+```bash
+conda env create -f environment.yml
+conda activate abb_egm_examples
+```
diff --git a/abb_egm_client/__init__.py b/abb_egm_client/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..8776898633a8a701addb9fb0df417872d5f424c1
--- /dev/null
+++ b/abb_egm_client/__init__.py
@@ -0,0 +1 @@
+from .egm_client import EGMClient  # noqa: F401,F403
diff --git a/abb_egm_client/egm_client.py b/abb_egm_client/egm_client.py
new file mode 100644
index 0000000000000000000000000000000000000000..aba35977295568d636952b1ee0e7d883f5898ab8
--- /dev/null
+++ b/abb_egm_client/egm_client.py
@@ -0,0 +1,123 @@
+import socket
+import select
+from errno import EINTR
+
+try:
+    from egm_pb2 import EgmRobot
+except ModuleNotFoundError:
+    from .egm_pb2 import EgmRobot
+
+
+class EGMClient:
+    def __init__(self, port=6510):
+        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+        self.socket.bind("", port)
+
+    def receive_from_robot(self, timeout=0):
+
+        try:
+            result = select.select([self.socket], [], [self.socket], timeout=timeout)
+        except select.error as err:
+            if err.args[0] == EINTR:
+                return False, None
+            else:
+                raise
+
+        if len(res[0]) == 0 and len(res[2]) == 0:
+            return False, None
+        # try:
+        buf, addr = self.socket.recvfrom(65536)
+        # except:
+        #    self.egm_addr=None
+        #    return False, None
+
+        # self.egm_addr=addr
+
+        msg = egm_pb2.EgmRobot()
+        msg.ParseFromString(buf)
+
+        Robot_pos = None
+        joint_angles = None
+        rapid_running = False
+        motors_on = False
+        global Robot_Position_Flag
+
+        if robot_message.HasField("feedBack"):
+            if Robot_Position_Flag == False:
+                Robot_pos = robot_message.feedBack.cartesian.pos
+                Robot_Position_Flag = True
+            Joints = robot_message.feedBack.joints.joints
+            print(robot_message.feedBack.joints.joints)
+        if robot_message.HasField("rapidExecState"):
+            rapid_running = (
+                robot_message.rapidExecState.state
+                == robot_message.rapidExecState.RAPID_RUNNING
+            )
+        if robot_message.HasField("motorState"):
+            motors_on = (
+                robot_message.motorState.state == robot_message.motorState.MOTORS_ON
+            )
+
+        return True, Robot_pos, Joints
+
+    def send_to_robot_joints(self, joint_angles):
+
+        if not self.egm_addr:
+            return False
+
+        self.send_sequence_number += 1
+
+        sensorMessage = egm_pb2.EgmSensor()
+
+        header = sensorMessage.header
+        header.mtype = egm_pb2.EgmHeader.MessageType.Value("MSGTYPE_CORRECTION")
+        header.seqno = self.send_sequence_number
+        self.send_sequence_number += 1
+
+        planned = sensorMessage.planned
+
+        if joint_angles is not None:
+            joint_angles2 = list(np.rad2deg(cartesian))
+            print(joint_angles2)
+            print(planned.joints.joints)
+        buf2 = sensorMessage.SerializeToString()
+
+        try:
+            self.socket.sendto(buf2, self.egm_addr)
+        except:
+            return False
+
+        return True
+
+    def send_to_robot_cartesian(self, Position, Rob_pos):
+
+        if not self.egm_addr:
+            return False
+
+        self.send_sequence_number += 1
+
+        sensorMessage = egm_pb2.EgmSensor()
+
+        header = sensorMessage.header
+        header.mtype = egm_pb2.EgmHeader.MessageType.Value("MSGTYPE_CORRECTION")
+        header.seqno = self.send_sequence_number
+        self.send_sequence_number += 1
+
+        planned = sensorMessage.planned
+
+        if Position is not None:
+            planned.cartesian.pos.x = Rob_pos.x + Position[2]
+            planned.cartesian.pos.y = Rob_pos.y + Position[0]
+            planned.cartesian.pos.z = Rob_pos.z + Position[1]
+            planned.cartesian.euler.x = -90
+            planned.cartesian.euler.y = 180
+            planned.cartesian.euler.z = 0
+            print(planned.cartesian.pos)
+        buf2 = sensorMessage.SerializeToString()
+
+        try:
+            self.socket.sendto(buf2, self.egm_addr)
+        except:
+            return False
+
+        return True
diff --git a/abb_egm_client/egm_pb2.py b/abb_egm_client/egm_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..07ec37a0ae041d40fc80da8eb0595ec2e04c3604
--- /dev/null
+++ b/abb_egm_client/egm_pb2.py
@@ -0,0 +1,1158 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: egm.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='egm.proto',
+  package='abb.egm',
+  syntax='proto2',
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\tegm.proto\x12\x07\x61\x62\x62.egm\"\xeb\x01\n\tEgmHeader\x12\r\n\x05seqno\x18\x01 \x01(\r\x12\n\n\x02tm\x18\x02 \x01(\r\x12@\n\x05mtype\x18\x03 \x01(\x0e\x32\x1e.abb.egm.EgmHeader.MessageType:\x11MSGTYPE_UNDEFINED\"\x80\x01\n\x0bMessageType\x12\x15\n\x11MSGTYPE_UNDEFINED\x10\x00\x12\x13\n\x0fMSGTYPE_COMMAND\x10\x01\x12\x10\n\x0cMSGTYPE_DATA\x10\x02\x12\x16\n\x12MSGTYPE_CORRECTION\x10\x03\x12\x1b\n\x17MSGTYPE_PATH_CORRECTION\x10\x04\"/\n\x0c\x45gmCartesian\x12\t\n\x01x\x18\x01 \x02(\x01\x12\t\n\x01y\x18\x02 \x02(\x01\x12\t\n\x01z\x18\x03 \x02(\x01\"?\n\rEgmQuaternion\x12\n\n\x02u0\x18\x01 \x02(\x01\x12\n\n\x02u1\x18\x02 \x02(\x01\x12\n\n\x02u2\x18\x03 \x02(\x01\x12\n\n\x02u3\x18\x04 \x02(\x01\"+\n\x08\x45gmEuler\x12\t\n\x01x\x18\x01 \x02(\x01\x12\t\n\x01y\x18\x02 \x02(\x01\x12\t\n\x01z\x18\x03 \x02(\x01\"w\n\x07\x45gmPose\x12\"\n\x03pos\x18\x01 \x01(\x0b\x32\x15.abb.egm.EgmCartesian\x12&\n\x06orient\x18\x02 \x01(\x0b\x32\x16.abb.egm.EgmQuaternion\x12 \n\x05\x65uler\x18\x03 \x01(\x0b\x32\x11.abb.egm.EgmEuler\"\"\n\x11\x45gmCartesianSpeed\x12\r\n\x05value\x18\x01 \x03(\x01\"\x1b\n\tEgmJoints\x12\x0e\n\x06joints\x18\x01 \x03(\x01\"#\n\x11\x45gmExternalJoints\x12\x0e\n\x06joints\x18\x01 \x03(\x01\"\x81\x01\n\nEgmPlanned\x12\"\n\x06joints\x18\x01 \x01(\x0b\x32\x12.abb.egm.EgmJoints\x12#\n\tcartesian\x18\x02 \x01(\x0b\x32\x10.abb.egm.EgmPose\x12*\n\x0e\x65xternalJoints\x18\x03 \x01(\x0b\x32\x12.abb.egm.EgmJoints\"\x8d\x01\n\x0b\x45gmSpeedRef\x12\"\n\x06joints\x18\x01 \x01(\x0b\x32\x12.abb.egm.EgmJoints\x12.\n\ncartesians\x18\x02 \x01(\x0b\x32\x1a.abb.egm.EgmCartesianSpeed\x12*\n\x0e\x65xternalJoints\x18\x03 \x01(\x0b\x32\x12.abb.egm.EgmJoints\">\n\x0b\x45gmPathCorr\x12\"\n\x03pos\x18\x01 \x02(\x0b\x32\x15.abb.egm.EgmCartesian\x12\x0b\n\x03\x61ge\x18\x02 \x02(\r\"\x82\x01\n\x0b\x45gmFeedBack\x12\"\n\x06joints\x18\x01 \x01(\x0b\x32\x12.abb.egm.EgmJoints\x12#\n\tcartesian\x18\x02 \x01(\x0b\x32\x10.abb.egm.EgmPose\x12*\n\x0e\x65xternalJoints\x18\x03 \x01(\x0b\x32\x12.abb.egm.EgmJoints\"\x8c\x01\n\rEgmMotorState\x12\x34\n\x05state\x18\x01 \x02(\x0e\x32%.abb.egm.EgmMotorState.MotorStateType\"E\n\x0eMotorStateType\x12\x14\n\x10MOTORS_UNDEFINED\x10\x00\x12\r\n\tMOTORS_ON\x10\x01\x12\x0e\n\nMOTORS_OFF\x10\x02\"\xa2\x01\n\x0b\x45gmMCIState\x12?\n\x05state\x18\x01 \x02(\x0e\x32!.abb.egm.EgmMCIState.MCIStateType:\rMCI_UNDEFINED\"R\n\x0cMCIStateType\x12\x11\n\rMCI_UNDEFINED\x10\x00\x12\r\n\tMCI_ERROR\x10\x01\x12\x0f\n\x0bMCI_STOPPED\x10\x02\x12\x0f\n\x0bMCI_RUNNING\x10\x03\"\xc3\x01\n\x15\x45gmRapidCtrlExecState\x12U\n\x05state\x18\x01 \x02(\x0e\x32\x35.abb.egm.EgmRapidCtrlExecState.RapidCtrlExecStateType:\x0fRAPID_UNDEFINED\"S\n\x16RapidCtrlExecStateType\x12\x13\n\x0fRAPID_UNDEFINED\x10\x00\x12\x11\n\rRAPID_STOPPED\x10\x01\x12\x11\n\rRAPID_RUNNING\x10\x02\"!\n\x0e\x45gmTestSignals\x12\x0f\n\x07signals\x18\x01 \x03(\x01\"\xd1\x02\n\x08\x45gmRobot\x12\"\n\x06header\x18\x01 \x01(\x0b\x32\x12.abb.egm.EgmHeader\x12&\n\x08\x66\x65\x65\x64\x42\x61\x63k\x18\x02 \x01(\x0b\x32\x14.abb.egm.EgmFeedBack\x12$\n\x07planned\x18\x03 \x01(\x0b\x32\x13.abb.egm.EgmPlanned\x12*\n\nmotorState\x18\x04 \x01(\x0b\x32\x16.abb.egm.EgmMotorState\x12&\n\x08mciState\x18\x05 \x01(\x0b\x32\x14.abb.egm.EgmMCIState\x12\x19\n\x11mciConvergenceMet\x18\x06 \x01(\x08\x12,\n\x0btestSignals\x18\x07 \x01(\x0b\x32\x17.abb.egm.EgmTestSignals\x12\x36\n\x0erapidExecState\x18\x08 \x01(\x0b\x32\x1e.abb.egm.EgmRapidCtrlExecState\"}\n\tEgmSensor\x12\"\n\x06header\x18\x01 \x01(\x0b\x32\x12.abb.egm.EgmHeader\x12$\n\x07planned\x18\x02 \x01(\x0b\x32\x13.abb.egm.EgmPlanned\x12&\n\x08speedRef\x18\x03 \x01(\x0b\x32\x14.abb.egm.EgmSpeedRef\"_\n\x11\x45gmSensorPathCorr\x12\"\n\x06header\x18\x01 \x01(\x0b\x32\x12.abb.egm.EgmHeader\x12&\n\x08pathCorr\x18\x02 \x01(\x0b\x32\x14.abb.egm.EgmPathCorr'
+)
+
+
+
+_EGMHEADER_MESSAGETYPE = _descriptor.EnumDescriptor(
+  name='MessageType',
+  full_name='abb.egm.EgmHeader.MessageType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='MSGTYPE_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MSGTYPE_COMMAND', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MSGTYPE_DATA', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MSGTYPE_CORRECTION', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MSGTYPE_PATH_CORRECTION', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=130,
+  serialized_end=258,
+)
+_sym_db.RegisterEnumDescriptor(_EGMHEADER_MESSAGETYPE)
+
+_EGMMOTORSTATE_MOTORSTATETYPE = _descriptor.EnumDescriptor(
+  name='MotorStateType',
+  full_name='abb.egm.EgmMotorState.MotorStateType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='MOTORS_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MOTORS_ON', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MOTORS_OFF', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1187,
+  serialized_end=1256,
+)
+_sym_db.RegisterEnumDescriptor(_EGMMOTORSTATE_MOTORSTATETYPE)
+
+_EGMMCISTATE_MCISTATETYPE = _descriptor.EnumDescriptor(
+  name='MCIStateType',
+  full_name='abb.egm.EgmMCIState.MCIStateType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='MCI_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MCI_ERROR', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MCI_STOPPED', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MCI_RUNNING', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1339,
+  serialized_end=1421,
+)
+_sym_db.RegisterEnumDescriptor(_EGMMCISTATE_MCISTATETYPE)
+
+_EGMRAPIDCTRLEXECSTATE_RAPIDCTRLEXECSTATETYPE = _descriptor.EnumDescriptor(
+  name='RapidCtrlExecStateType',
+  full_name='abb.egm.EgmRapidCtrlExecState.RapidCtrlExecStateType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='RAPID_UNDEFINED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='RAPID_STOPPED', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='RAPID_RUNNING', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1536,
+  serialized_end=1619,
+)
+_sym_db.RegisterEnumDescriptor(_EGMRAPIDCTRLEXECSTATE_RAPIDCTRLEXECSTATETYPE)
+
+
+_EGMHEADER = _descriptor.Descriptor(
+  name='EgmHeader',
+  full_name='abb.egm.EgmHeader',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='seqno', full_name='abb.egm.EgmHeader.seqno', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tm', full_name='abb.egm.EgmHeader.tm', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mtype', full_name='abb.egm.EgmHeader.mtype', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=True, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _EGMHEADER_MESSAGETYPE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=23,
+  serialized_end=258,
+)
+
+
+_EGMCARTESIAN = _descriptor.Descriptor(
+  name='EgmCartesian',
+  full_name='abb.egm.EgmCartesian',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='x', full_name='abb.egm.EgmCartesian.x', index=0,
+      number=1, type=1, cpp_type=5, label=2,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='y', full_name='abb.egm.EgmCartesian.y', index=1,
+      number=2, type=1, cpp_type=5, label=2,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='z', full_name='abb.egm.EgmCartesian.z', index=2,
+      number=3, type=1, cpp_type=5, label=2,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=260,
+  serialized_end=307,
+)
+
+
+_EGMQUATERNION = _descriptor.Descriptor(
+  name='EgmQuaternion',
+  full_name='abb.egm.EgmQuaternion',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='u0', full_name='abb.egm.EgmQuaternion.u0', index=0,
+      number=1, type=1, cpp_type=5, label=2,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='u1', full_name='abb.egm.EgmQuaternion.u1', index=1,
+      number=2, type=1, cpp_type=5, label=2,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='u2', full_name='abb.egm.EgmQuaternion.u2', index=2,
+      number=3, type=1, cpp_type=5, label=2,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='u3', full_name='abb.egm.EgmQuaternion.u3', index=3,
+      number=4, type=1, cpp_type=5, label=2,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=309,
+  serialized_end=372,
+)
+
+
+_EGMEULER = _descriptor.Descriptor(
+  name='EgmEuler',
+  full_name='abb.egm.EgmEuler',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='x', full_name='abb.egm.EgmEuler.x', index=0,
+      number=1, type=1, cpp_type=5, label=2,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='y', full_name='abb.egm.EgmEuler.y', index=1,
+      number=2, type=1, cpp_type=5, label=2,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='z', full_name='abb.egm.EgmEuler.z', index=2,
+      number=3, type=1, cpp_type=5, label=2,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=374,
+  serialized_end=417,
+)
+
+
+_EGMPOSE = _descriptor.Descriptor(
+  name='EgmPose',
+  full_name='abb.egm.EgmPose',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='pos', full_name='abb.egm.EgmPose.pos', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='orient', full_name='abb.egm.EgmPose.orient', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='euler', full_name='abb.egm.EgmPose.euler', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=419,
+  serialized_end=538,
+)
+
+
+_EGMCARTESIANSPEED = _descriptor.Descriptor(
+  name='EgmCartesianSpeed',
+  full_name='abb.egm.EgmCartesianSpeed',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='value', full_name='abb.egm.EgmCartesianSpeed.value', index=0,
+      number=1, type=1, cpp_type=5, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=540,
+  serialized_end=574,
+)
+
+
+_EGMJOINTS = _descriptor.Descriptor(
+  name='EgmJoints',
+  full_name='abb.egm.EgmJoints',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='joints', full_name='abb.egm.EgmJoints.joints', index=0,
+      number=1, type=1, cpp_type=5, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=576,
+  serialized_end=603,
+)
+
+
+_EGMEXTERNALJOINTS = _descriptor.Descriptor(
+  name='EgmExternalJoints',
+  full_name='abb.egm.EgmExternalJoints',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='joints', full_name='abb.egm.EgmExternalJoints.joints', index=0,
+      number=1, type=1, cpp_type=5, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=605,
+  serialized_end=640,
+)
+
+
+_EGMPLANNED = _descriptor.Descriptor(
+  name='EgmPlanned',
+  full_name='abb.egm.EgmPlanned',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='joints', full_name='abb.egm.EgmPlanned.joints', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='cartesian', full_name='abb.egm.EgmPlanned.cartesian', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='externalJoints', full_name='abb.egm.EgmPlanned.externalJoints', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=643,
+  serialized_end=772,
+)
+
+
+_EGMSPEEDREF = _descriptor.Descriptor(
+  name='EgmSpeedRef',
+  full_name='abb.egm.EgmSpeedRef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='joints', full_name='abb.egm.EgmSpeedRef.joints', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='cartesians', full_name='abb.egm.EgmSpeedRef.cartesians', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='externalJoints', full_name='abb.egm.EgmSpeedRef.externalJoints', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=775,
+  serialized_end=916,
+)
+
+
+_EGMPATHCORR = _descriptor.Descriptor(
+  name='EgmPathCorr',
+  full_name='abb.egm.EgmPathCorr',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='pos', full_name='abb.egm.EgmPathCorr.pos', index=0,
+      number=1, type=11, cpp_type=10, label=2,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='age', full_name='abb.egm.EgmPathCorr.age', index=1,
+      number=2, type=13, cpp_type=3, label=2,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=918,
+  serialized_end=980,
+)
+
+
+_EGMFEEDBACK = _descriptor.Descriptor(
+  name='EgmFeedBack',
+  full_name='abb.egm.EgmFeedBack',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='joints', full_name='abb.egm.EgmFeedBack.joints', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='cartesian', full_name='abb.egm.EgmFeedBack.cartesian', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='externalJoints', full_name='abb.egm.EgmFeedBack.externalJoints', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=983,
+  serialized_end=1113,
+)
+
+
+_EGMMOTORSTATE = _descriptor.Descriptor(
+  name='EgmMotorState',
+  full_name='abb.egm.EgmMotorState',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='abb.egm.EgmMotorState.state', index=0,
+      number=1, type=14, cpp_type=8, label=2,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _EGMMOTORSTATE_MOTORSTATETYPE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1116,
+  serialized_end=1256,
+)
+
+
+_EGMMCISTATE = _descriptor.Descriptor(
+  name='EgmMCIState',
+  full_name='abb.egm.EgmMCIState',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='abb.egm.EgmMCIState.state', index=0,
+      number=1, type=14, cpp_type=8, label=2,
+      has_default_value=True, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _EGMMCISTATE_MCISTATETYPE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1259,
+  serialized_end=1421,
+)
+
+
+_EGMRAPIDCTRLEXECSTATE = _descriptor.Descriptor(
+  name='EgmRapidCtrlExecState',
+  full_name='abb.egm.EgmRapidCtrlExecState',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='abb.egm.EgmRapidCtrlExecState.state', index=0,
+      number=1, type=14, cpp_type=8, label=2,
+      has_default_value=True, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _EGMRAPIDCTRLEXECSTATE_RAPIDCTRLEXECSTATETYPE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1424,
+  serialized_end=1619,
+)
+
+
+_EGMTESTSIGNALS = _descriptor.Descriptor(
+  name='EgmTestSignals',
+  full_name='abb.egm.EgmTestSignals',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='signals', full_name='abb.egm.EgmTestSignals.signals', index=0,
+      number=1, type=1, cpp_type=5, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1621,
+  serialized_end=1654,
+)
+
+
+_EGMROBOT = _descriptor.Descriptor(
+  name='EgmRobot',
+  full_name='abb.egm.EgmRobot',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='header', full_name='abb.egm.EgmRobot.header', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='feedBack', full_name='abb.egm.EgmRobot.feedBack', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='planned', full_name='abb.egm.EgmRobot.planned', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='motorState', full_name='abb.egm.EgmRobot.motorState', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mciState', full_name='abb.egm.EgmRobot.mciState', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mciConvergenceMet', full_name='abb.egm.EgmRobot.mciConvergenceMet', index=5,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='testSignals', full_name='abb.egm.EgmRobot.testSignals', index=6,
+      number=7, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='rapidExecState', full_name='abb.egm.EgmRobot.rapidExecState', index=7,
+      number=8, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1657,
+  serialized_end=1994,
+)
+
+
+_EGMSENSOR = _descriptor.Descriptor(
+  name='EgmSensor',
+  full_name='abb.egm.EgmSensor',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='header', full_name='abb.egm.EgmSensor.header', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='planned', full_name='abb.egm.EgmSensor.planned', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='speedRef', full_name='abb.egm.EgmSensor.speedRef', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1996,
+  serialized_end=2121,
+)
+
+
+_EGMSENSORPATHCORR = _descriptor.Descriptor(
+  name='EgmSensorPathCorr',
+  full_name='abb.egm.EgmSensorPathCorr',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='header', full_name='abb.egm.EgmSensorPathCorr.header', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='pathCorr', full_name='abb.egm.EgmSensorPathCorr.pathCorr', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2123,
+  serialized_end=2218,
+)
+
+_EGMHEADER.fields_by_name['mtype'].enum_type = _EGMHEADER_MESSAGETYPE
+_EGMHEADER_MESSAGETYPE.containing_type = _EGMHEADER
+_EGMPOSE.fields_by_name['pos'].message_type = _EGMCARTESIAN
+_EGMPOSE.fields_by_name['orient'].message_type = _EGMQUATERNION
+_EGMPOSE.fields_by_name['euler'].message_type = _EGMEULER
+_EGMPLANNED.fields_by_name['joints'].message_type = _EGMJOINTS
+_EGMPLANNED.fields_by_name['cartesian'].message_type = _EGMPOSE
+_EGMPLANNED.fields_by_name['externalJoints'].message_type = _EGMJOINTS
+_EGMSPEEDREF.fields_by_name['joints'].message_type = _EGMJOINTS
+_EGMSPEEDREF.fields_by_name['cartesians'].message_type = _EGMCARTESIANSPEED
+_EGMSPEEDREF.fields_by_name['externalJoints'].message_type = _EGMJOINTS
+_EGMPATHCORR.fields_by_name['pos'].message_type = _EGMCARTESIAN
+_EGMFEEDBACK.fields_by_name['joints'].message_type = _EGMJOINTS
+_EGMFEEDBACK.fields_by_name['cartesian'].message_type = _EGMPOSE
+_EGMFEEDBACK.fields_by_name['externalJoints'].message_type = _EGMJOINTS
+_EGMMOTORSTATE.fields_by_name['state'].enum_type = _EGMMOTORSTATE_MOTORSTATETYPE
+_EGMMOTORSTATE_MOTORSTATETYPE.containing_type = _EGMMOTORSTATE
+_EGMMCISTATE.fields_by_name['state'].enum_type = _EGMMCISTATE_MCISTATETYPE
+_EGMMCISTATE_MCISTATETYPE.containing_type = _EGMMCISTATE
+_EGMRAPIDCTRLEXECSTATE.fields_by_name['state'].enum_type = _EGMRAPIDCTRLEXECSTATE_RAPIDCTRLEXECSTATETYPE
+_EGMRAPIDCTRLEXECSTATE_RAPIDCTRLEXECSTATETYPE.containing_type = _EGMRAPIDCTRLEXECSTATE
+_EGMROBOT.fields_by_name['header'].message_type = _EGMHEADER
+_EGMROBOT.fields_by_name['feedBack'].message_type = _EGMFEEDBACK
+_EGMROBOT.fields_by_name['planned'].message_type = _EGMPLANNED
+_EGMROBOT.fields_by_name['motorState'].message_type = _EGMMOTORSTATE
+_EGMROBOT.fields_by_name['mciState'].message_type = _EGMMCISTATE
+_EGMROBOT.fields_by_name['testSignals'].message_type = _EGMTESTSIGNALS
+_EGMROBOT.fields_by_name['rapidExecState'].message_type = _EGMRAPIDCTRLEXECSTATE
+_EGMSENSOR.fields_by_name['header'].message_type = _EGMHEADER
+_EGMSENSOR.fields_by_name['planned'].message_type = _EGMPLANNED
+_EGMSENSOR.fields_by_name['speedRef'].message_type = _EGMSPEEDREF
+_EGMSENSORPATHCORR.fields_by_name['header'].message_type = _EGMHEADER
+_EGMSENSORPATHCORR.fields_by_name['pathCorr'].message_type = _EGMPATHCORR
+DESCRIPTOR.message_types_by_name['EgmHeader'] = _EGMHEADER
+DESCRIPTOR.message_types_by_name['EgmCartesian'] = _EGMCARTESIAN
+DESCRIPTOR.message_types_by_name['EgmQuaternion'] = _EGMQUATERNION
+DESCRIPTOR.message_types_by_name['EgmEuler'] = _EGMEULER
+DESCRIPTOR.message_types_by_name['EgmPose'] = _EGMPOSE
+DESCRIPTOR.message_types_by_name['EgmCartesianSpeed'] = _EGMCARTESIANSPEED
+DESCRIPTOR.message_types_by_name['EgmJoints'] = _EGMJOINTS
+DESCRIPTOR.message_types_by_name['EgmExternalJoints'] = _EGMEXTERNALJOINTS
+DESCRIPTOR.message_types_by_name['EgmPlanned'] = _EGMPLANNED
+DESCRIPTOR.message_types_by_name['EgmSpeedRef'] = _EGMSPEEDREF
+DESCRIPTOR.message_types_by_name['EgmPathCorr'] = _EGMPATHCORR
+DESCRIPTOR.message_types_by_name['EgmFeedBack'] = _EGMFEEDBACK
+DESCRIPTOR.message_types_by_name['EgmMotorState'] = _EGMMOTORSTATE
+DESCRIPTOR.message_types_by_name['EgmMCIState'] = _EGMMCISTATE
+DESCRIPTOR.message_types_by_name['EgmRapidCtrlExecState'] = _EGMRAPIDCTRLEXECSTATE
+DESCRIPTOR.message_types_by_name['EgmTestSignals'] = _EGMTESTSIGNALS
+DESCRIPTOR.message_types_by_name['EgmRobot'] = _EGMROBOT
+DESCRIPTOR.message_types_by_name['EgmSensor'] = _EGMSENSOR
+DESCRIPTOR.message_types_by_name['EgmSensorPathCorr'] = _EGMSENSORPATHCORR
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+EgmHeader = _reflection.GeneratedProtocolMessageType('EgmHeader', (_message.Message,), {
+  'DESCRIPTOR' : _EGMHEADER,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmHeader)
+  })
+_sym_db.RegisterMessage(EgmHeader)
+
+EgmCartesian = _reflection.GeneratedProtocolMessageType('EgmCartesian', (_message.Message,), {
+  'DESCRIPTOR' : _EGMCARTESIAN,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmCartesian)
+  })
+_sym_db.RegisterMessage(EgmCartesian)
+
+EgmQuaternion = _reflection.GeneratedProtocolMessageType('EgmQuaternion', (_message.Message,), {
+  'DESCRIPTOR' : _EGMQUATERNION,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmQuaternion)
+  })
+_sym_db.RegisterMessage(EgmQuaternion)
+
+EgmEuler = _reflection.GeneratedProtocolMessageType('EgmEuler', (_message.Message,), {
+  'DESCRIPTOR' : _EGMEULER,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmEuler)
+  })
+_sym_db.RegisterMessage(EgmEuler)
+
+EgmPose = _reflection.GeneratedProtocolMessageType('EgmPose', (_message.Message,), {
+  'DESCRIPTOR' : _EGMPOSE,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmPose)
+  })
+_sym_db.RegisterMessage(EgmPose)
+
+EgmCartesianSpeed = _reflection.GeneratedProtocolMessageType('EgmCartesianSpeed', (_message.Message,), {
+  'DESCRIPTOR' : _EGMCARTESIANSPEED,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmCartesianSpeed)
+  })
+_sym_db.RegisterMessage(EgmCartesianSpeed)
+
+EgmJoints = _reflection.GeneratedProtocolMessageType('EgmJoints', (_message.Message,), {
+  'DESCRIPTOR' : _EGMJOINTS,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmJoints)
+  })
+_sym_db.RegisterMessage(EgmJoints)
+
+EgmExternalJoints = _reflection.GeneratedProtocolMessageType('EgmExternalJoints', (_message.Message,), {
+  'DESCRIPTOR' : _EGMEXTERNALJOINTS,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmExternalJoints)
+  })
+_sym_db.RegisterMessage(EgmExternalJoints)
+
+EgmPlanned = _reflection.GeneratedProtocolMessageType('EgmPlanned', (_message.Message,), {
+  'DESCRIPTOR' : _EGMPLANNED,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmPlanned)
+  })
+_sym_db.RegisterMessage(EgmPlanned)
+
+EgmSpeedRef = _reflection.GeneratedProtocolMessageType('EgmSpeedRef', (_message.Message,), {
+  'DESCRIPTOR' : _EGMSPEEDREF,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmSpeedRef)
+  })
+_sym_db.RegisterMessage(EgmSpeedRef)
+
+EgmPathCorr = _reflection.GeneratedProtocolMessageType('EgmPathCorr', (_message.Message,), {
+  'DESCRIPTOR' : _EGMPATHCORR,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmPathCorr)
+  })
+_sym_db.RegisterMessage(EgmPathCorr)
+
+EgmFeedBack = _reflection.GeneratedProtocolMessageType('EgmFeedBack', (_message.Message,), {
+  'DESCRIPTOR' : _EGMFEEDBACK,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmFeedBack)
+  })
+_sym_db.RegisterMessage(EgmFeedBack)
+
+EgmMotorState = _reflection.GeneratedProtocolMessageType('EgmMotorState', (_message.Message,), {
+  'DESCRIPTOR' : _EGMMOTORSTATE,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmMotorState)
+  })
+_sym_db.RegisterMessage(EgmMotorState)
+
+EgmMCIState = _reflection.GeneratedProtocolMessageType('EgmMCIState', (_message.Message,), {
+  'DESCRIPTOR' : _EGMMCISTATE,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmMCIState)
+  })
+_sym_db.RegisterMessage(EgmMCIState)
+
+EgmRapidCtrlExecState = _reflection.GeneratedProtocolMessageType('EgmRapidCtrlExecState', (_message.Message,), {
+  'DESCRIPTOR' : _EGMRAPIDCTRLEXECSTATE,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmRapidCtrlExecState)
+  })
+_sym_db.RegisterMessage(EgmRapidCtrlExecState)
+
+EgmTestSignals = _reflection.GeneratedProtocolMessageType('EgmTestSignals', (_message.Message,), {
+  'DESCRIPTOR' : _EGMTESTSIGNALS,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmTestSignals)
+  })
+_sym_db.RegisterMessage(EgmTestSignals)
+
+EgmRobot = _reflection.GeneratedProtocolMessageType('EgmRobot', (_message.Message,), {
+  'DESCRIPTOR' : _EGMROBOT,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmRobot)
+  })
+_sym_db.RegisterMessage(EgmRobot)
+
+EgmSensor = _reflection.GeneratedProtocolMessageType('EgmSensor', (_message.Message,), {
+  'DESCRIPTOR' : _EGMSENSOR,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmSensor)
+  })
+_sym_db.RegisterMessage(EgmSensor)
+
+EgmSensorPathCorr = _reflection.GeneratedProtocolMessageType('EgmSensorPathCorr', (_message.Message,), {
+  'DESCRIPTOR' : _EGMSENSORPATHCORR,
+  '__module__' : 'egm_pb2'
+  # @@protoc_insertion_point(class_scope:abb.egm.EgmSensorPathCorr)
+  })
+_sym_db.RegisterMessage(EgmSensorPathCorr)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/environment.yml b/environment.yml
new file mode 100644
index 0000000000000000000000000000000000000000..df4382de52de5b4a6e882466a24169f23ffad80d
--- /dev/null
+++ b/environment.yml
@@ -0,0 +1,6 @@
+name: abb-egm-examples
+channels:
+  - conda-forge
+dependencies:
+  - numpy
+  - protobuf
diff --git a/examples/print_egm_feedback.py b/examples/print_egm_feedback.py
new file mode 100644
index 0000000000000000000000000000000000000000..67e621a9cc5781a642fb66c22dff966529dd63a9
--- /dev/null
+++ b/examples/print_egm_feedback.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+import logging
+import sys
+
+log = logging.getLogger()
+
+try:
+    from abb_egm_client import EGMClient
+except ImportError:
+    raise ImportWarning("abb_egm not found, have you installed the package?")
+
+UDP_PORT = 6510
+
+
+def print_egm_feedback(rate: int):
+    """Print EGM feedback.
+
+    Parameters
+    ----------
+    rate
+        Frequency of prints in hertz.
+
+    """
+
+    egm_client = EGMClient(port=UDP_PORT)
+
+    counter = 0
+    while True:
+        try:
+            ok, feedback = egm_client.receive_from_robot()
+            if ok and counter % rate:
+                print(f"Seq: {counter}\tMsg: {feedback}")
+            else:
+                log.error("False from EGMClient.recieve_from_robot")
+        except Exception as exc:
+            log.error(f"Exception raised {exc}")
+            log.info("Retrying")
+            counter = 0
+
+
+if __name__ == "__main__":
+    print_egm_feedback(sys.argv[0])
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..9ac9b912aae30d4a63758999e0698edd94e3c2e4
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,6 @@
+[build-system]
+requires = [
+  "setuptools >= 40.9.0",
+  "wheel",
+]
+build-backend = "setuptools.build_meta"
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..d267f5d768649409db3bbb5c27d29bc6c4a731b5
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,9 @@
+[metadata]
+name = abb_egm_client
+version = 0.1.0
+
+[options]
+packages = abb_egm_client
+python_requires = >= 3.8
+install_requires =
+    protobuf
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..b908cbe55cb344569d32de1dfc10ca7323828dc5
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,3 @@
+import setuptools
+
+setuptools.setup()