YARP  2.3.68+228-20170410.2+git7d0b2e0
Yet Another Robot Platform
An example which shows how to use a Lua script to create a new data type in a port
Author
Ali Paikan

Description

This example demonstrates how to use the port monitor carrier to substitute a data type with another one. The port '/write' from 'yarp write' module is connected to the '/read' port of 'yarp read' using a portmonitor plugged into the receiver side. The portmoniotr loads a Lua script ('type_modifier.lua') which expects to see a command such as 'random N' (where N is an integer number). The command is, then, completely substituted with a vector of N random values which will be delivered to the 'yarp read'. The port monitor also checks for the validity of the command


type_modification.png

Requirements

  • Enable and compile portmonitor carrier (ENABLE_yarpcar_portmonitor_carrier=ON in YARP cmake).
  • Set LUA_CPATH to include Yarp-Lua binding library (e.g., export LUA_CPATH=";;;$YARP_ROOT/build/lib/lua/?.so")

Running the example

  • Open a terminal and run yarpserver
       $ yarpserver
    
  • Open another terminal (lets call this the receiver terminal) and change to the 'type_modification' directory:
       $ cd $YARP_ROOT/example/portmonitor/type_modification
       $ yarp read /read
    
  • Open another terminal (lets call this the sender terminal) and type
       $ yarp write /write
    
  • In another terminal connect the port as follow
       $ yarp connect /write /read tcp+recv.portmonitor+type.lua+file.type_modifier
    

Now if you write a valid command in the 'sender' terminal (e.g., random 3), you will see the command is completely substituted by a vector of 3 random values. For example:

[sender terminal]
   random 3
[receiver terminal]
   0.513401 0.95223 0.916195

\section type_modification_scripts Scripts \subsection type_modification_type_modifier type_modifier.lua

-- loading lua-yarp binding library
require("yarp")

--
-- accept is called when the port receives new data
-- @param thing The Things abstract data type
-- @return Boolean
-- if false is returned, the data will be ignored 
-- and update() will never be called
PortMonitor.accept = function(thing)
     bt = thing:asBottle()
     if bt:size() < 2 or bt:get(0):asString() ~= "random" then
        print("type_modifier: invalid command! (e.g., random 10)")
        return false;
     end
    return true
end

--
-- update is called when the port receives new data
-- @param thing The Things abstract data type
-- @return Things
PortMonitor.update = function(thing)
    bt = thing:asBottle()
    th = yarp.Things()
    vec = yarp.Vector()
    for i=1,bt:get(1):asInt() do
        vec:push_back(math.random())
    end
    th:setPortWriter(vec)
    return th
end