YARP network wrapper servers convention
Introduction
The iCub robot (and all the other models) exposes its functionalities (sensors and actuators) via YARP devices called YARP's Network Wrapper Servers (NWSs) that publish information over YARP ports. For historical reasons, for each type of functionality such as "controlboards" (i.e measure of joint-related sensors and capability of setting setpoints of low-level control loops), inertial measurement units, force torque sensors, multiple devices are used, one for each iCub's "part".
The "parts" of iCub are:
headleft_armright_armtorsoleft_legright_leg
Not all iCubs have all their six parts. There are iCub variants that are composed only by the head, or iCub variants that are composed only by the legs. In some contexts, even a special part called alljoints is defined and used, to represent all the different parts of the robot combined.
To maintain generality, we will use the string robotPortPrefix, which can have different values, depending on the robot:
icubfor physical iCub robotsicubSimfor simulated iCub robotsergoCubfor physical ergoCub robotsergoCubSimfor simulated ergoCub robots
Next, we will list the port convention for each type of functionality. For each part, the name string is used. The YARP port will then be composed as: /<robotPortPrefix>/<partName>/.... For example, functionalities associated to the iCub head start as /icub/head.
Controlboards
The ControlBoard functionality is exposed via the controlBoard_nws_yarp device. It can be used to get and set input-output quantities associated to the part's joints, by communicating with the ETH boards of the robot.
For each part, there will be a controlBoard_nws_yarp device that will open the following YARP ports:
-
/<robotPortPrefix>/<partName>/state:o: Publishes encoders' information for the part -
/<robotPortPrefix>/<partName>/stateExt:o: Publishes extended joint-level sensors information for the part (e.g. joint encoders, motor encoders, pwm values), using the structure defined in stateExt.thrift -
/<robotPortPrefix>/<partName>/rpc:i: Exposes several information related to the part via a YARP RPC port -
/<robotPortPrefix>/<partName>/command:i: Takes in input references for the low-level control loops
Controlboard client device
The YARP ports are not meant to be accessed directly, but should be accessed instead via the client device remote_controlboard. The device will expose sensors data and actuator commands thanks to the related Motor interfaces.
Inertial Measurements Units (IMUs)
Inertial Measurements Units functionalities are exposed via the multipleanalogsensorsserver YARP device. The inertials string added to the YARP port name, to identify the device: /<robotPortPrefix>/<partName>/inertials.
For each part, there will be a multipleanalogsensorsserver device that will open the following YARP ports:
-
/<robotPortPrefix>/<partName>/inertials/measures:o: Publishes sensors information for the part, using the structure defined in multipleAnalogSensorsSerializations.thrift -
/<robotPortPrefix>/<partName>/inertials/rpc:o: Exposes several information related to the part via a YARP RPC port
IMU Client device
Warning
These YARP ports are not meant to be accessed directly, but should be accessed instead via the multipleanalogsensorsclient device.
The client device will expose sensors related to the following Multiple Analog Sensors Interfaces, so they can be easily queried:
Force-Torque Sensors
Force-Torque Sensors functionalities are exposed via the multipleanalogsensorsserver YARP device. The FT string added to the YARP port name, to identify the device: /<robotPortPrefix>/<partName>/FT.
For each part, there will be a multipleanalogsensorsserver device that will open the following YARP ports:
-
/<robotPortPrefix>/<partName>/FT/measures:o: Publishes sensors information for the part, using the structure defined in robotology/yarp@master/src/devices/multipleAnalogSensorsMsgs/multipleAnalogSensorsSerializations.thrift -
/<robotPortPrefix>/<partName>/FT/rpc:o: Exposes several information related to the part via a YARP RPC port
FT Client device
Warning
These YARP ports are not meant to be accessed directly, but should be accessed instead via the multipleanalogsensorsclient device.
The client device will expose sensors related to the following Multiple Analog Sensors Interfaces:
Cameras
Eyes
RGB cameras mounted in the eyes of iCub are exposed via the frameGrabber_nws_yarp YARP device. The port names do not follow the convention mentioned above, but use the naming /<robotPortPrefix>/cam/<side>. the side string can be either left or right, depending on the eye.
For each eye, there will be a frameGrabber_nws_yarp that will open the following YARP ports:
/<robotPortPrefix>/cam/<side>: Publishes the camera's RGB image/<robotPortPrefix>/cam/<side>/rpc: Exposes several information related to the part via a YARP RPC port
Camera client device
Warning
These YARP ports are not meant to be accessed directly, but should be accessed instead via the remote_framegrabber device.
The client device will expose the sensors thanks to the related Media Interfaces.
Depth cameras
Depth cameras, such as the Intel Realsense series of devices, have their capabilities exposed by the RgbdSensor_nws_yarp device. The port names do not follow the convention mentioned above, but use the naming /<robotPortPrefix>/<cameraName>. <cameraName> is a string that is set as depthCamera if only one RGBD device is mounted on the robot.
The RgbdSensor_nws_yarp device will open the following YARP ports:
/<robotPortPrefix>/<cameraName>/image:o: Publishes the camera's RGB image/<robotPortPrefix>/<cameraName>/depth:o: Publishes the camera's depth image as a list of floating point values/<robotPortPrefix>/<cameraName>/rpc: Exposes several information related to the part via a YARP RPC port
RGBD Camera client device
Note
At the moment no client device is available for depth cameras, so the server needs to be accessed directly from the above ports.
Even though client devices are not available, YARP provides interfaces to create a client application: