Transport Exploration » History » Version 2

S. Wrede, 09/09/2011 11:23 PM

1 1 J. Wienke
h1. Transport Exploration
2 1 J. Wienke
3 1 J. Wienke
We want to build a fast and easy to use basic transport layer to stream (mostly) binary data like sound or video from the robot to other computers. This should ideally not do any costly marshalling like it is done within the SOAP layer of NaoQi. 
4 1 J. Wienke
5 1 J. Wienke
h2. Underlying toolkits
6 1 J. Wienke
7 1 J. Wienke
Some possibilities: 
8 1 J. Wienke
* Spread: http://www.spread.org/
9 1 J. Wienke
* (Boost.)Asio: http://think-async.com/Asio/
10 1 J. Wienke
* DDS (Data Distribution Service), http://en.wikipedia.org/wiki/Data_Distribution_Service, Implementationen:
11 1 J. Wienke
** OpenDDS: http://www.opendds.org/
12 1 J. Wienke
** OpenSplice DDS: http://www.opensplice.org/cgi-bin/twiki/view/Community/WebHome
13 2 S. Wrede
* ActiveMQ, RabbitMQ
14 2 S. Wrede
* ZeroMQ (ist von der Motivation her ziemlich nah an RSB dran), http://www.zeromq.org/
15 1 J. Wienke
* AMQP? 
16 1 J. Wienke
** http://www.amqp.org/confluence/display/AMQP/Advanced+Message+Queuing+Protocol
17 1 J. Wienke
** http://en.wikipedia.org/wiki/AMQP
18 1 J. Wienke
** Interessante Use-Case-Beschreibung: http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/
19 1 J. Wienke
** OpenAMQ: http://www.openamq.org
20 1 J. Wienke
*** installiert, bringt alles & the kitchen sink an dependencies mit, selbst wenn man sie schon hat
21 1 J. Wienke
*** client api scheinbar nur C, nicht C++, insgesamt etwas "alt"
22 1 J. Wienke
** Apache QPID: http://qpid.apache.org/getting-started.html
23 1 J. Wienke
*** installiert, sieht nach ner netten Client API aus, viele Sprachen
24 1 J. Wienke
*** erster kandidat, der naeher unter die lupe genommen wird
25 1 J. Wienke
26 1 J. Wienke
h2. First results
27 1 J. Wienke
28 1 J. Wienke
* A simple proof of concept was built using Spread, see attached files for audio recorded using this. 
29 1 J. Wienke
* Video sending also works, see "benchmark" results below.
30 1 J. Wienke
* Some first (not really successful) test with Asio...
31 1 J. Wienke
32 1 J. Wienke
h2. Benchmarks
33 1 J. Wienke
34 1 J. Wienke
Some numbers of how fast we can send 640x480 YUV422 video over the network. Without any communication overhead, we can grab around 30 fps on the robot.
35 1 J. Wienke
36 1 J. Wienke
h3. Using Spread
37 1 J. Wienke
38 1 J. Wienke
These numbers are almost unchanged if we switch from FIFO to UNRELIABLE messages...
39 1 J. Wienke
40 1 J. Wienke
<pre>
41 1 J. Wienke
...
42 1 J. Wienke
Average fps after 2350 frames in 229.229 seconds: 11.1076 (last 50 frames), 10.2518 (since beginning).
43 1 J. Wienke
Average fps after 2400 frames in 233.664 seconds: 11.274 (last 50 frames), 10.2712 (since beginning).
44 1 J. Wienke
Average fps after 2450 frames in 238.106 seconds: 11.2542 (last 50 frames), 10.2895 (since beginning).
45 1 J. Wienke
Average fps after 2500 frames in 242.663 seconds: 10.9719 (last 50 frames), 10.3023 (since beginning).
46 1 J. Wienke
</pre>
47 1 J. Wienke
48 1 J. Wienke
h3. Using (Boost.)Asio
49 1 J. Wienke
50 1 J. Wienke
This is a first simple test with Asio, using synchronous (i.e. blocking, not asynchronous) I/O over a simple TCP socket. It's not a perfectly tuned implementation and it is still very buggy (the image is garbled, looks cut in half), so take those numbers with at least a dozen grains of salt: 
51 1 J. Wienke
52 1 J. Wienke
<pre>
53 1 J. Wienke
Average fps after 50 frames in 6.16767 seconds: 8.10679 (last 50 frames), 8.10679 (since beginning).
54 1 J. Wienke
Average fps after 100 frames in 11.9418 seconds: 8.65924 (last 50 frames), 8.37391 (since beginning).
55 1 J. Wienke
Average fps after 150 frames in 17.6628 seconds: 8.73987 (last 50 frames), 8.49245 (since beginning).
56 1 J. Wienke
Average fps after 200 frames in 23.338 seconds: 8.81013 (last 50 frames), 8.5697 (since beginning).
57 1 J. Wienke
Average fps after 250 frames in 29.1206 seconds: 8.64663 (last 50 frames), 8.58498 (since beginning).
58 1 J. Wienke
Average fps after 300 frames in 34.8296 seconds: 8.75815 (last 50 frames), 8.61336 (since beginning).
59 1 J. Wienke
</pre>
60 1 J. Wienke
61 1 J. Wienke
After correcting a bug (incorrect buffer sizes...), we now get the following performance (over tcp) & correct images: 
62 1 J. Wienke
63 1 J. Wienke
<pre>
64 1 J. Wienke
...
65 1 J. Wienke
Average fps after 3950 frames in 310.421 seconds: 13.0615 (last 50 frames), 12.7247 (since beginning).
66 1 J. Wienke
Average fps after 4000 frames in 314.244 seconds: 13.0792 (last 50 frames), 12.729 (since beginning).
67 1 J. Wienke
Average fps after 4050 frames in 318.06 seconds: 13.1028 (last 50 frames), 12.7335 (since beginning).
68 1 J. Wienke
Average fps after 4100 frames in 321.87 seconds: 13.121 (last 50 frames), 12.7381 (since beginning).
69 1 J. Wienke
Average fps after 4150 frames in 325.703 seconds: 13.0441 (last 50 frames), 12.7417 (since beginning).
70 1 J. Wienke
Average fps after 4200 frames in 329.5 seconds: 13.171 (last 50 frames), 12.7466 (since beginning).
71 1 J. Wienke
</pre>