Integrate MORSE in your software architecture

The core of MORSE is pure and independent of any specific robotic implementation. To make it possible to integrate easily with your architecture, MORSE proposes a middleware layers which bridge this gap, both for services with the concept of Component overlays and for datastream with the concept of datastream handler (this page).

Features compatibility matrix

The table below summarizes the level of support of MORSE features for each middleware. Further information can be found in clicking on the desired component.

When a component is supported (✔), we specify the middleware-specific format we use (like Viam or YarpImage).

If no format is specified, MORSE uses a generic serialization mechanism, e.g., a straight serialization of the JSON representation of the component data.

socket

ros

yarp

pocolibs

moos

mavlink

hla

text

Support notes

Support notes

Support notes

Support notes

Support notes

Support notes

Support notes

Support notes

Communications

Datastreams

✔ (topics)

✔ (ports)

✔ (posters)

✔ (database)

✔ (attribute update)

Services

✔ (services + actions)

✔ (requests)

Sensors

Accelerometer

✔ TwistPublisher

Airspeed

Armature Pose Sensor

✔ JointStatePublisher

Barometer

Battery Sensor

✔ Float32Publisher

Clock

✔ ClockPublisher

Collision

Compound Sensor

Depth camera (raw Z-Buffer)

✔ a JSON-Encoded message for the DepthCamera

✔ DepthCameraPublisher

Spix3DImage

Depth camera (raw Z-Buffer)

✔ a JSON-Encoded message for the DepthCamera

✔ DepthCameraPublisher

✔ yarp::ImageFloat

ViamImageBank

Depth camera (raw Z-Buffer)

Generic Camera

Gyroscope

✔ StringPublisher

POM_ME_POS or POM_POS

✔ db entries

Hokuyo

Human Posture

STRUCT_SPARK_CONFIGURATION

Infrared Proximity Sensor

Kinect

Laser Scanner Sensors

Laser Scanner Sensors (raw level )

✔ LaserScanPublisher or PointCloud2Publisher

✔ yarp::Bottle

✔ db entries

Laser Scanner Sensors (rssi level )

Odometry

Odometry (raw level )

Odometry (differential level )

Odometry (integrated level )

✔ OdometryPublisher

POM_ME_POS or POM_POS

LOCAL_POSITION_NED

PTU Pose Sensor

✔ JointStatePublisher

PLATINE_STATES

Pose

✔ PoseStampedPublisher or TFPublisher

POM_ME_POS or POM_POS

✔ db entries

Proximity Sensor

✔ StringPublisher

Radar Altimeter

SICK

SICK LD-MRS

Search And Rescue sensor

GENPOS_TRAJ_POINTS

Semantic camera

✔ SemanticCameraPublisher or SemanticCameraPublisherLisp

VimanObjectPublicArray

Stereo Camera Unit

ViamImageBank

Thermometer Sensor

Velocity

✔ TwistStampedPublisher

Video camera

✔ base64 encoded RGBA image

✔ VideoCameraPublisher

✔ yarp::ImageRGBA

ViamImageBank

Actuators

ArUco Marker

✔ PoseReader

Armature Actuator

Gb_q7

Destination

✔ PointReader

Differential Driver Actuator: Linear and angular speed (V, W) actuator

✔ TwistReader

GENPOS_CART_SPEED

✔ db entries

Drag

External Force/Torque

Force/Torque Motion Controller

✔ WrenchReader

Gripper

Joystick Actuator

KUKA LWR

Gb_q7

Keyboard Actuator

Light

✔ BoolReader

✔ db entries

Linear and angular speed (V, W) actuator

✔ TwistReader

GENPOS_CART_SPEED

✔ db entries

Linear and angular speed (Vx, Vy, W) actuator

✔ TwistReader

Mitsubishi PA-10

Orientation Actuator

✔ QuaternionReader

Pan-Tilt Unit

✔ Vector3Reader

POM_SE_POSTER or PLATINE_AXIS_STR

Quadrotor dynamic controller

Rotorcraft Velocity motion controller

✔ TwistReader

Rotorcraft Waypoint motion controller

✔ PoseReader

SET_POSITION_TARGET_LOCAL_NED

Sound

Stabilized Flight for quadrotor

Steer/Force Actuator

✔ db entries

Teleport

✔ PoseReader

✔ db entries

Waypoint

Configuring Morse to export data in a specified way

To configure a component to export or import data using a specific method, you need to call the morse.builder.abstractcomponent.AbstractComponent.add_stream() on your component. The process is explained in more details and with numerous examples in the following tutorials:

Extending middleware support of MORSE

The following documentation explains how to add a specific datastream handler for one existing middleware. If you want to add a completely new middleware, you can refer to these instructions.

Bindings

We provide some bindings to access the different components using the socket interface and to control the simulation. At the moment, we only have bindings for the Python language but contributions are welcome! These bindings are documented here.

For other middlewares, you can, of course, rely on standard tools provided by these middlewares (that the main purpose of the middleware layer after all!).