RSBm » History » Version 19

S. Wrede, 10/17/2011 05:43 PM

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 8 S. Wrede
javaaddpath /usr/share/java/RSBJava-0.5.0.jar
15 9 S. Wrede
javaaddpath /usr/share/java/protobuf.jar
16 1 S. Wrede
javaaddpath /usr/share/java/rstsandbox.jar
17 15 Anonymous
javaaddpath /usr/share/java/rst.jar
18 13 S. Wrede
</pre>
19 13 S. Wrede
20 14 S. Wrede
For the Matlab bindings, please replace @${home}@ with the full path to your workspace in case you have a checked out version of RSB.m. Otherwise just change the path to an installed version of RSB.m.
21 13 S. Wrede
<pre>
22 15 Anonymous
javaaddpath /public/amarsi_workshop/lib/rsb.m-0.5.0.jar
23 13 S. Wrede
</pre>
24 13 S. Wrede
25 13 S. Wrede
<pre>
26 3 S. Wrede
rsb.matlab.ConverterRegistration.register()
27 3 S. Wrede
</pre>
28 3 S. Wrede
29 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.
30 1 S. Wrede
31 6 S. Wrede
h2. Get queue object for domain-specific data
32 1 S. Wrede
33 6 S. Wrede
<pre>
34 6 S. Wrede
%   Scope must map to a rst.kinematics.JointAngles type
35 6 S. Wrede
angles = rsb.matlab.JointAnglesQueue;
36 6 S. Wrede
</pre>
37 6 S. Wrede
38 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.
39 6 S. Wrede
40 6 S. Wrede
h2. Connect queue to RSB listener
41 6 S. Wrede
42 6 S. Wrede
<pre>
43 10 S. Wrede
sub = rsb.Factory.getInstance().createListener('/oncilla');
44 6 S. Wrede
sub.activate()
45 6 S. Wrede
sub.addHandler(angles, true)
46 6 S. Wrede
</pre>
47 6 S. Wrede
48 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()@
49 6 S. Wrede
50 6 S. Wrede
h2. Doing something useful, e.g., data visualization 
51 6 S. Wrede
52 6 S. Wrede
Having the queue, we can now operate directly on the returned floats. For instance, display them in a live plot:
53 6 S. Wrede
54 6 S. Wrede
<pre>
55 6 S. Wrede
a = zeros(1,200)
56 6 S. Wrede
while(1)
57 6 S. Wrede
a(1:end - 1) = a(2:end);
58 6 S. Wrede
% blocks until new data is available
59 6 S. Wrede
a(end) = angles.take;
60 6 S. Wrede
angles.getQueue.clear;
61 6 S. Wrede
plot(a);
62 6 S. Wrede
getframe;
63 6 S. Wrede
end
64 6 S. Wrede
</pre>
65 6 S. Wrede
66 6 S. Wrede
To prevent memory leaks, the above code clears the queue after each (blocking) call to @take@.
67 6 S. Wrede
68 6 S. Wrede
h2. Unload the RSB Java libraries
69 6 S. Wrede
70 6 S. Wrede
<pre>
71 11 S. Wrede
javarmpath ${home}/workspace/RSB.m/dist/lib/rsb.m-0.5.0.jar
72 11 S. Wrede
javarmpath /usr/share/java/rst.jar
73 11 S. Wrede
javarmpath /usr/share/java/rstsandbox.jar
74 11 S. Wrede
javarmpath /usr/share/java/RSBJava-0.5.0.jar
75 11 S. Wrede
javarmpath /usr/share/java/protobuf.jar
76 1 S. Wrede
</pre>
77 7 S. Wrede
78 7 S. Wrede
This example code is available as Matlab functions in the RSB.m project here: https://code.cor-lab.org/projects/rsb/repository/show/trunk/matlab/matlab
79 6 S. Wrede
80 6 S. Wrede
h2. Older notes
81 1 S. Wrede
82 12 S. Wrede
Sending data from Matlab to RSB:
83 1 S. Wrede
84 1 S. Wrede
<pre>
85 1 S. Wrede
>> javaaddpath /vol/cit/share/java/RSBJava-0.4.0.jar
86 1 S. Wrede
>> javaaddpath /opt/local/share/java/protobuf.jar
87 1 S. Wrede
>> f = rsb.Factory.getInstance()
88 1 S. Wrede
 
89 1 S. Wrede
f =
90 1 S. Wrede
 
91 1 S. Wrede
rsb.Factory@5c4e0c39
92 1 S. Wrede
 
93 1 S. Wrede
>> s = Scope('/example/informer')
94 1 S. Wrede
 
95 1 S. Wrede
s =
96 1 S. Wrede
 
97 1 S. Wrede
/example/informer/
98 1 S. Wrede
99 2 S. Wrede
>> i = f.createInformer(s)
100 2 S. Wrede
No rsb.conf found in configuration directory '/Users/swrede/.config'
101 2 S. Wrede
No rsb.conf found in working directory '/Users/swrede/Documents/MATLAB'
102 2 S. Wrede
 
103 2 S. Wrede
i =
104 2 S. Wrede
 
105 2 S. Wrede
rsb.Informer@75222b8e
106 2 S. Wrede
107 2 S. Wrede
>> i.activate
108 2 S. Wrede
18.07.2011 18:21:22 rsb.Informer$InformerStateInactive activate
109 2 S. Wrede
INFO: Informer activated: [Scope:/example/informer/,Type:String]
110 2 S. Wrede
>> i.send('RSB')
111 2 S. Wrede
 
112 2 S. Wrede
ans =
113 2 S. Wrede
 
114 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 = {}]]
115 1 S. Wrede
</pre>
116 16 Anonymous
117 16 Anonymous
h2. Helpers
118 16 Anonymous
119 16 Anonymous
*Catching Java exceptions*
120 16 Anonymous
121 16 Anonymous
<pre>
122 16 Anonymous
>> try
123 16 Anonymous
lhhipangles.take(12)
124 16 Anonymous
catch,
125 16 Anonymous
s = lasterror();
126 16 Anonymous
end
127 16 Anonymous
>> s
128 16 Anonymous
</pre>
129 17 S. Wrede
130 17 S. Wrede
*Working with the returned Java arrays*
131 17 S. Wrede
132 18 Anonymous
Naive conversion to matrix type:
133 18 Anonymous
<pre>
134 18 Anonymous
function [ matrix ] = parseArray( array )
135 18 Anonymous
%PARSEARRAY Parse Java array into Matlab matrix
136 18 Anonymous
%   Not nice. We need to find a better solution.
137 18 Anonymous
matrix = zeros(8,1);
138 18 Anonymous
for i = 1:8
139 18 Anonymous
    matrix(i) = array(i);
140 18 Anonymous
end
141 18 Anonymous
end
142 18 Anonymous
</pre>
143 18 Anonymous
144 19 S. Wrede
*Helpful Mathworks Documentation* 
145 19 S. Wrede
146 19 S. Wrede
* "Matrices and arrays":http://www.mathworks.de/help/techdoc/ref/cell.html
147 19 S. Wrede
* "Working with Java arrays":http://www.mathworks.de/help/techdoc/matlab_external/f15351.html