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
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 sender terminal) and type
$ yarp write /write
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
Scripts
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):asInt32() do
vec:push_back(math.random())
end
th:setPortWriter(vec)
return th
end