Integrating MORSE into your software architecture

MORSE’s core is independent of any specific robotic implementation. To make it possible to easily integrate with your particular robotic 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 handlers (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 relevant component.

When a component is supported (✔), we specify the middleware-specific format MORSE uses (e.g., 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 pprzlink
  Support notes 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/AccelWithCovarianceStamped or geometry_msgs/TwistStamped
Armature Pose Sensor sensor_msgs/JointState
Attitude sensor ✔ AttitudeSensor
Battery Sensor std_msgs/Float32
Clock rosgraph_msgs/Clock
Compound Sensor
Depth camera (raw Z-Buffer) ✔ a JSON-Encoded message for the DepthCamera sensor_msgs/PointCloud2 Spix3DImage
Depth Camera Aggregator Unit ✔ a JSON-Encoded message for the DepthCamera sensor_msgs/PointCloud2
Depth camera (raw Z-Buffer) ✔ a JSON-Encoded message for the DepthCamera sensor_msgs/Image ✔ YarpImageFloatPublisher ViamImageBank
Depth camera (raw Z-Buffer)
GPS (simple level ) sensor_msgs/NavSatFix POM_ME_POS or POM_POS ✔ GPSNotifier
GPS (raw level ) sensor_msgs/NavSatFix
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 ✔ YarpLaserScannerPublisher ✔ LIDARNotifier
Laser Scanner Sensors (rssi level )
Odometry (raw level )
Odometry (differential level )
Odometry (integrated level ) nav_msgs/Odometry POM_ME_POS or POM_POS ✔ OdometrySensor
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 ✔ YarpImagePublisher 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 geometry_msgs/Wrench
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 ✔ AttitudeTarget
Stabilized Flight for quadrotor
Steer/Force Actuator ✔ MotionReader
Teleport geometry_msgs/Pose ✔ PoseReader ✔ RotorcraftPose

Configuring Morse to handle 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() method for your component. This is explained in detail and with examples in the following tutorials:

Extending MORSE’s middleware support

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!).