RSBm » History » Version 6

S. Wrede, 10/15/2011 11:24 AM

1 1 S. Wrede
h1. RSB.m
2 1 S. Wrede
3 3 S. Wrede
We are currently exploring the best way to expose RSB in Matlab. The most straightforward way to do this is to use the Java implementation directly from within Matlab. However, as the Matlab Java interpreter is not able to handle Java's Generic types, we need to wrap around some parts of the RSBJava API which use generics.
4 3 S. Wrede
5 3 S. Wrede
For this, a very preliminary support library for Matlab is available in the Trunk repository: https://code.cor-lab.org/projects/rsb/repository/show/trunk/matlab
6 3 S. Wrede
7 3 S. Wrede
It currently includes a simple example demonstrating the live plotting of rst.JointAngles data.
8 3 S. Wrede
9 3 S. Wrede
After installation of this library, the current steps in using RSB in Matlab are as follows:
10 3 S. Wrede
11 4 S. Wrede
h2. Loading the Java RSB libraries into Matlab
12 3 S. Wrede
13 3 S. Wrede
<pre>
14 3 S. Wrede
javaaddpath /vol/cit/share/java/RSBJava-0.5.0.jar
15 3 S. Wrede
javaaddpath /opt/local/share/java/protobuf.jar
16 3 S. Wrede
javaaddpath /vol/cit/share/java/rstsandbox.jar
17 3 S. Wrede
javaaddpath /vol/cit/share/java/rst.jar
18 3 S. Wrede
javaaddpath /vol/cit/lib/rsb.m-0.5.0.jar
19 3 S. Wrede
rsb.matlab.ConverterRegistration.register()
20 3 S. Wrede
</pre>
21 3 S. Wrede
22 3 S. Wrede
The last call initializes the ProtocolBufferConverter instances with a few selected RST types. This mechanism will definitely be changed as it currently introduces an unwanted dependency (at this stage) to RST.
23 1 S. Wrede
24 6 S. Wrede
This code is available as Matlab function in the RSB.m project as: @matlab/addRSB.m@
25 1 S. Wrede
26 6 S. Wrede
h2. Get queue object for domain-specific data
27 1 S. Wrede
28 6 S. Wrede
<pre>
29 6 S. Wrede
%   Scope must map to a rst.kinematics.JointAngles type
30 6 S. Wrede
angles = rsb.matlab.JointAnglesQueue;
31 6 S. Wrede
</pre>
32 6 S. Wrede
33 6 S. Wrede
JointAnglesQueue is a class of the RSB.m library that maps the RSB domain type rst.JointAngles to a matlab vector with floats. Furthermore, it allows access to the underlying BlockingQueue that provides further methods for queue management. See the RSBJava API documentation for more information.
34 6 S. Wrede
35 6 S. Wrede
h2. Connect queue to RSB listener
36 6 S. Wrede
37 6 S. Wrede
<pre>
38 6 S. Wrede
s = rsb.Scope('/oncilla');
39 6 S. Wrede
sub = rsb.Factory.getInstance().createListener(s);
40 6 S. Wrede
sub.activate()
41 6 S. Wrede
sub.addHandler(angles, true)
42 6 S. Wrede
</pre>
43 6 S. Wrede
44 6 S. Wrede
Pretty standard RSB API here. After the call to addHandler the angles queue receives data. You can easily check this by calling: @angles.getQueue().isEmpty()@
45 6 S. Wrede
46 6 S. Wrede
h2. Doing something useful, e.g., data visualization 
47 6 S. Wrede
48 6 S. Wrede
Having the queue, we can now operate directly on the returned floats. For instance, display them in a live plot:
49 6 S. Wrede
50 6 S. Wrede
<pre>
51 6 S. Wrede
a = zeros(1,200)
52 6 S. Wrede
while(1)
53 6 S. Wrede
a(1:end - 1) = a(2:end);
54 6 S. Wrede
% blocks until new data is available
55 6 S. Wrede
a(end) = angles.take;
56 6 S. Wrede
angles.getQueue.clear;
57 6 S. Wrede
plot(a);
58 6 S. Wrede
getframe;
59 6 S. Wrede
end
60 6 S. Wrede
</pre>
61 6 S. Wrede
62 6 S. Wrede
To prevent memory leaks, the above code clears the queue after each (blocking) call to @take@.
63 6 S. Wrede
64 6 S. Wrede
h2. Unload the RSB Java libraries
65 6 S. Wrede
66 6 S. Wrede
<pre>
67 6 S. Wrede
javarmpath /vol/cit/share/java/rsb.m-0.5.0.jar
68 6 S. Wrede
javarmpath /vol/cit/share/java/rst.jar
69 6 S. Wrede
javarmpath /vol/cit/share/java/rstsandbox.jar
70 6 S. Wrede
javarmpath /vol/cit/share/java/RSBJava-0.5.0.jar
71 6 S. Wrede
javarmpath /opt/local/share/java/protobuf.jar
72 6 S. Wrede
</pre>
73 6 S. Wrede
74 6 S. Wrede
h2. Older notes
75 1 S. Wrede
76 1 S. Wrede
First successful test of sending data from Matlab to RSB:
77 1 S. Wrede
78 1 S. Wrede
<pre>
79 1 S. Wrede
>> javaaddpath /vol/cit/share/java/RSBJava-0.4.0.jar
80 1 S. Wrede
>> javaaddpath /opt/local/share/java/protobuf.jar
81 1 S. Wrede
>> f = rsb.Factory.getInstance()
82 1 S. Wrede
 
83 1 S. Wrede
f =
84 1 S. Wrede
 
85 1 S. Wrede
rsb.Factory@5c4e0c39
86 1 S. Wrede
 
87 1 S. Wrede
>> s = Scope('/example/informer')
88 1 S. Wrede
 
89 1 S. Wrede
s =
90 1 S. Wrede
 
91 1 S. Wrede
/example/informer/
92 1 S. Wrede
93 2 S. Wrede
>> i = f.createInformer(s)
94 2 S. Wrede
No rsb.conf found in configuration directory '/Users/swrede/.config'
95 2 S. Wrede
No rsb.conf found in working directory '/Users/swrede/Documents/MATLAB'
96 2 S. Wrede
 
97 2 S. Wrede
i =
98 2 S. Wrede
 
99 2 S. Wrede
rsb.Informer@75222b8e
100 2 S. Wrede
101 2 S. Wrede
>> i.activate
102 2 S. Wrede
18.07.2011 18:21:22 rsb.Informer$InformerStateInactive activate
103 2 S. Wrede
INFO: Informer activated: [Scope:/example/informer/,Type:String]
104 2 S. Wrede
>> i.send('RSB')
105 2 S. Wrede
 
106 2 S. Wrede
ans =
107 2 S. Wrede
 
108 2 S. Wrede
Event[id=4145dcfd-aff7-45de-b00f-0c6c315f0ce7, scope=/example/informer/, type =String, metaData=MetaData[senderId = 4d619c1a-b516-4474-9eed-eb216546ff01, createTime = 1311006099963000, sendTime = 1311006099966000, receiveTime = 0, userTimes = {}, userInfos = {}]]
109 1 S. Wrede
</pre>