YARP¶
The YARP middleware provides a simple method to share data across components in different computers. It is based on the concept of ports, which are registered in a name server to differentiate between separate channels of communication.
Data is shared in the format of bottles, which are nested data structures of various data types.
Note
Port names used in MORSE have the following format:
/morse/component_name/[direction]
. The term [direction]
is either in
or out
, depending on the type of component being actuator
or sensor, respectively.
Files¶
Python:
$MORSE_ROOT/src/morse/middleware/yarp_datastream.py
Configuration specificities¶
When configuring a component to export its data through YARP, you can pass several options to tune the behaviour of the {ex, im}porter.
The option port
allows to select the explicit name of the port exported by
YARP, instead of the default name. If existing, the option``topic`` will tell
the component to connect automatically to the named topic.
foo.add_stream('yarp', port = '/foo/bar', topic = '/this/interesting/topic')
Service interface¶
MORSE components providing services can expose this interface using YARP ports.
Note
Services handled with YARP will create two ports, named:
/ors/services/[component_name]/[service_name]/request
and
/ors/services/[component_name]/[service_name]/reply
.
Where [service_name] is a string consisting of [component_name]#[service_method]
.
The (ASCII) protocol of the requests is simple:
id component service "[parameters]"
id
is a freely chosen request id. It is mainly useful to identify answers from asynchronous services.component
is the name of the component you want to invoke the service on.
Note
Services that control the whole simulator belong to the special component simulation
.
service
: the name of the request to invoke.parameters
(can be omitted if the request takes no argument): request arguments. Arguments must be enclosed in brackets, and surrounded by quotes.
MORSE answer follows this model:
id status [result]
id
the same id the client used to send the request,status
: one of themorse.core.status
constantsresult
: a JSON-like result (actually, the representation of the Python result object), if any.
Example (sending request on terminal 1):
$ yarp write /request /ors/services/Motion_Controller/Motion_Controller#goto/request
yarp: Port /request active at tcp://140.93.0.93:10173
yarp: Sending output from /request to /ors/services/Motion_Controller/Motion_Controller#goto/request using tcp
req1 Motion_Controller goto "[5.0, 4.0, 0.0]"
Example (receiving reply on terminal 2):
$ yarp read /reply /ors/services/Motion_Controller/Motion_Controller#goto/reply
yarp: Port /reply listening at tcp://140.93.0.93:10174
yarp: Receiving input from /ors/services/Motion_Controller/Motion_Controller#goto/reply to /reply using tcp
"0 SUCCESS Stop"
The YARP service interface is implemented in morse.middleware.yarp_request_manager
.
Known problems¶
Some blender files will start the simulation fine the first time after opening the file, but stopping the simulation and starting it again will give this error:
def open(self, *args): return _yarp.Contactable_open(self, *args)
NotImplementedError: Wrong number of arguments for overloaded function 'Contactable_open'.
To correct this, it is necessary to open the Blender file, then on a Text
Editor window, select the file load_yarp.py
. To the right of the file name,
there is a checkbox named Register
. Check this checkbox, save the file, and
open it again. This will ensure that the script load_yarp.py
is read every
time the file is opened, so that yarp is correctly setup before launching the simulation.