rsb_scenemanager

Function Description

The module provides information about the objects in the scene.

Usage

Prerequisites

  • None.

Command-line Parameters

Defaults are shown bellow with each parameter.

  • -h
    • Displays help.
  • -i scenedef.txt
    • Scene definition file, see bellow for more information.
  • -o /scenemanager
    • Scope for Scene Manager RPC calls.

RPC Interface

The module implements a registered method queryObjects. The method takes rst::scene::SceneManagerQuery object as an argument and return the list of queried objects in the form of rst::scene::Objects, see the corresponding proto files for a description.

The RPC Call Examples

Before doing any calls, the corresponding converters must be registered.

#include <rsb/Factory.h>
#include <rsb/converter/Repository.h>
#include <rsb/converter/ProtocolBufferConverter.h>
#include <rst/scene/Objects.pb.h>
#include <rst/scene/SceneManagerQuery.pb.h>

using namespace std;
using namespace rsb;
using namespace rst;
using namespace rsb::patterns;

...

// Register the converters
converter::stringConverterRepository()->registerConverter(
    boost::shared_ptr<converter::ProtocolBufferConverter<scene::Objects> > (
      new converter::ProtocolBufferConverter<scene::Objects> ()));

converter::stringConverterRepository()->registerConverter(
    boost::shared_ptr<converter::ProtocolBufferConverter<scene::SceneManagerQuery> > (
      new converter::ProtocolBufferConverter<scene::SceneManagerQuery> ()));

Once the converters are registered the factory and the remote server can be created.

// Use the RSB factory to create a RemoteServer instance for the server at
// our scope
Factory& factory = Factory::getInstance();
string scopre("/scenemanager");
RemoteServerPtr remoteServer = factory.createRemoteServer(scope);

The query is performed as follows.

// Call the method "queryObjects", passing the query object as argument and
// accepting a list of scene objects as result. 
boost::shared_ptr<scene::SceneManagerQuery> query(new scene::SceneManagerQuery());
boost::shared_ptr<scene::Objects> objects(
    remoteServer->call<scene::Objects>("queryObjects", query));

The retrieved objects can be filtered by the name using a regular expression,

// Call the method "queryObjects", passing the query object as argument and
// accepting a list of scene objects as result. 
boost::shared_ptr<scene::SceneManagerQuery> query(new scene::SceneManagerQuery());
// Query object which name starts with letter P.
query->set_name_filter("^P");
boost::shared_ptr<scene::Objects> objects(
    remoteServer->call<scene::Objects>("queryObjects", query));

or by the object class,

// Call the method "queryObjects", passing the query object as argument and
// accepting a list of scene objects as result. 
boost::shared_ptr<scene::SceneManagerQuery> query(new scene::SceneManagerQuery());
// Query furniture and paintings only.
query->set_class_filter(scene::Object_Class_FURNITURE|scene::Object_Class_PAINTINGS);
boost::shared_ptr<scene::Objects> objects(
    remoteServer->call<scene::Objects>("queryObjects", query));

or by both.

// Call the method "queryObjects", passing the query object as argument and
// accepting a list of scene objects as result. 
boost::shared_ptr<scene::SceneManagerQuery> query(new scene::SceneManagerQuery());
// Query POIs which name starts with letter P.
query->set_name_filter("^P");
query->set_class_filter(scene::Object_Class_POI);
boost::shared_ptr<scene::Objects> objects(
    remoteServer->call<scene::Objects>("queryObjects", query));

See also test.cpp (compiled as rsb_scenemanagertest executable) and rsb_scenemanagertest.sh for the complete example.

Scene Definition

The scene is defined in a scene definition file. The attributed grammar of the definition file follows.

Rule Attribute
SceneDef -> SceneDef Object SceneDef.value = SceneDef.value + Object.value
SceneDef -> E SceneDef.value = NULL
Object -> Name Class HasCenter Center CornersCount Corners Object.value = ( Name.value, Class.value, Center.value, Corners.value )
Name -> string WhiteSpace Name.value = string.value
Class -> string WhiteSpace Class.value = string.value
HasCenter -> 0 WhiteSpace HasCenter.value = 0
HasCenter -> 1 WhiteSpace HasCenter.value = 1
Center -> Vector      if HasCenter.value = 1 Center.value = Vector.value
            -> E              if HasCenter.value = 0 Center.value = NULL
CornersCount -> integer WhiteSpace CornersCount.value = integer.value
Corners -> Vector{ repeated CornersCount.value times} Corners.value = list of all vectors values
Vector -> X Y Z Vector.value = ( X.value, Y.value, Z.value )
X -> float WhiteSpace X.value = float.value
Y -> float WhiteSpace Y.value = float.value
Z -> float WhiteSpace Z.value = float.value
WhiteSpace -> WhiteSpace white_space_char
WhiteSpace -> white_space_char
WhiteSpace -> EOF

Terminal symbols are:

E epsilon, i.e. empty symbol
string string of non white space characters
0 character 0
1 character 1
integer non-negatve integer
float floating point number
white_space_char white space character
EOF end of file symbol

+ means concatenation.

See scenedef.txt for an example of the definition file.