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.