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 provides middleware layers which bridge the gap, both for services with the concept of Component overlays and for datastreams 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 by 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
Datastreams ✔ (topics) ✔ (ports) ✔ (posters) ✔ (database) ✔ (attribute update)
Services ✔ (services + actions) ✔ (requests)
Accelerometer geometry_msgs/TwistStamped
Armature Pose Sensor sensor_msgs/JointState
Attitude sensor ATTITUDE
Battery Sensor std_msgs/Float32
Clock rosgraph_msgs/Clock
Compound Sensor
Depth camera ✔ a JSON-Encoded message for the DepthCamera sensor_msgs/PointCloud2 Spix3DImage
Depth camera ✔ a JSON-Encoded message for the DepthCamera sensor_msgs/Image ✔ yarp::ImageFloat ViamImageBank
Depth camera
GPS (simple level ) sensor_msgs/NavSatFix POM_ME_POS or POM_POS ✔ GPSNotifier
GPS (raw level )
GPS (extended level )
Generic Camera
Gyroscope std_msgs/String POM_ME_POS or POM_POS ✔ GyroscopeNotifier
Inertial measurement unit sensor_msgs/Imu ✔ IMUNotifier
Infrared Proximity Sensor
Laser Scanner Sensors                
Laser Scanner Sensors (raw level ) sensor_msgs/LaserScan or sensor_msgs/PointCloud2 ✔ yarp::Bottle ✔ LIDARNotifier
Laser Scanner Sensors (rssi level )
Odometry (raw level )
Odometry (differential level )
Odometry (integrated level ) nav_msgs/Odometry POM_ME_POS or POM_POS LOCAL_POSITION_NED
PTU Pose Sensor sensor_msgs/JointState PLATINE_STATES
Pose geometry_msgs/PoseStamped or std_msgs/Header POM_ME_POS or POM_POS ✔ PoseNotifier
Proximity Sensor std_msgs/String
Radar Altimeter
Search And Rescue sensor GENPOS_TRAJ_POINTS
Semantic camera std_msgs/String or std_msgs/String VimanObjectPublicArray
Stereo Camera Unit ViamImageBank
Thermometer Sensor
Velocity geometry_msgs/TwistStamped
Video camera ✔ base64 encoded RGBA image sensor_msgs/Image ✔ yarp::ImageRGBA ViamImageBank
ArUco Marker geometry_msgs/Pose
Armature Actuator Gb_q7
Destination geometry_msgs/Point
Differential Driver Actuator: Linear and angular speed (V, W) actuator geometry_msgs/Twist GENPOS_CART_SPEED ✔ MotionReader
External Force/Torque
Force/Torque Motion Controller geometry_msgs/Wrench
Joystick Actuator
Keyboard Actuator
Light std_msgs/Bool ✔ LightReader
Linear and angular speed (V, W) actuator geometry_msgs/Twist GENPOS_CART_SPEED ✔ MotionReader
Linear and angular speed (Vx, Vy, W) actuator geometry_msgs/Twist
Mitsubishi PA-10
Orientation Actuator geometry_msgs/Quaternion
Pan-Tilt Unit geometry_msgs/Vector3 POM_SE_POSTER or PLATINE_AXIS_STR
Quadrotor dynamic controller std_msgs/Float32MultiArray
Rotorcraft Velocity motion controller geometry_msgs/Twist
Rotorcraft Waypoint motion controller geometry_msgs/Pose SET_POSITION_TARGET_LOCAL_NED
Rotorcraft attitude motion controller std_msgs/Float32MultiArray SET_ATTITUDE_TARGET
Stabilized Flight for quadrotor
Steer/Force Actuator ✔ MotionReader
Teleport geometry_msgs/Pose ✔ PoseReader

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 morse.builder.abstractcomponent.AbstractComponent.add_stream() on your component. The process is explained in more detail 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.


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’s the main purpose of the middleware layer after all!).