Depois de instalado o Sourcery G++ Lite, chegou a hora de compilar o VLC utilizando ele. Com o VLC poderemos faz broadcast do video capturado pelas cameras do ardrone.

Instalar o VLC e Mplayer no Ubuntu também para fazer o teste de recebimento do stream em broadcast feito pelo Drone.

root@ubuntu:~/Downloads# apt-get install vlc mplayer


Baixar e extrair o VLC


root@ubuntu:~/Downloads# wget http://download.videolan.org/pub/videolan/vlc/2.1.1/vlc-2.1.1.tar.xz

root@ubuntu:~/Downloads# tar xfvJ vlc-2.1.1.tar.xz
root@ubuntu:~/Downloads# cd vlc-2.1.1

A configuração do VLC é tensa, é preciso remover várias features para compilar sem problemas. E ativar a opção de executar como root, já que no Drone não tem “su”.

root@ubuntu:~/Downloads/vlc-2.1.1# ./configure –target=arm-none-linux-gnueabi –host=arm-none-linux-gnueabi –disable-lua –disable-mad –disable-avcodec –disable-swscale –disable-a52 –disable-xcb –disable-libgcrypt –disable-dbus –disable-alsa –disable-pulse –disable-libxml2 –disable-udev –disable-freetype –disable-sdl –disable-caca –disable-bonjour –enable-run-as-root –prefix=/data/video/vlc && make && make install

Agora temos o VLC compilado para Drone instalado no nosso /data/video/vlc.

root@ubuntu:~# cd /data/video/vlc/
root@ubuntu:/data/video/vlc# du -hs
48M    .

Nosso recém compilado VLC tem o singelo tamanho de 48MB.

Primeiro é preciso conectar no Access Point WIFI criado pelo ardrone.

Uma vez conectado e conseguindo pingar o 192.168.1.1, provavelmente não haverá problemas.

root@ubuntu:~# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_req=1 ttl=64 time=1.99 ms
64 bytes from 192.168.1.1: icmp_req=2 ttl=64 time=1.77 ms
^C
— 192.168.1.1 ping statistics —
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.773/1.882/1.992/0.117 ms

 Se pingou o Drone segue para o telnet no Drone,

uma vez na linha de comando do Drone, é bom verificar o espaço livre antes de enviar o VLC para o /data/video via FTP.

root@ubuntu:~# telnet 192.168.1.1
Trying 192.168.1.1…
Connected to 192.168.1.1.
Escape character is ‘^]’.

BusyBox v1.14.0 (2011-08-30 12:00:29 CEST) built-in shell (ash)
Enter ‘help’ for a list of built-in commands.

# df -ah
Filesystem                Size      Used Available Use% Mounted on
ubi1:system              12.0M      6.3M      5.1M  55% /
tmp                      61.6M     32.0K     61.5M   0% /tmp
proc                         0         0         0   0% /proc
dev                      61.6M         0     61.6M   0% /dev
devpts                       0         0         0   0% /dev/pts
sys                          0         0         0   0% /sys
ubi0:factory              4.8M     44.0K      4.5M   1% /factory
ubi2:update              13.2M     32.0K     12.5M   0% /update
ubi2:data                67.5M      1.4M     62.6M   2% /data
# </span>

Segundo o telnet ainda tem livre 62,6MB dos 67,5MB da partição /data, que é onde vamos colocar o VLC ocupando 48MB.

Somente a título de curiosidade, o ardrone é todo feito encima de UBIFS.

Aqui temos a configuração do MTD que vai ser passada para o UBI.

 # cat /proc/cmdline
parrotparts=nand0:256K(Pbootloader),8M(Pmain_boot),8M(Pfactory),16M(Psystem),98048K(Pupdate) console=ttyPA0,115200 loglevel=4 ubi.mtd=Pfactory,2048 ubi.mtd=Psystem,2048 ubi.mtd=Pupdate,2048 root=ubi1:system rootfstype=ubifs parrot5.low_latency=1

Olhando o log do kernel, o volume /data tem na verdade 73MB, mas quando tira os espaços reversados fica somente 67,5MB.

# dmesg | grep UBIFS
[    1.361041] UBIFS: recovery needed
[    1.378984] UBIFS: recovery deferred
[    1.379025] UBIFS: mounted UBI device 1, volume 0, name “system”
[    1.379048] UBIFS: mounted read-only
[    1.379071] UBIFS: file system size:   14348288 bytes (14012 KiB, 13 MiB, 113 LEBs)
[    1.379103] UBIFS: journal size:       1015809 bytes (992 KiB, 0 MiB, 6 LEBs)
[    1.379132] UBIFS: media format:       w4/r0 (latest is w4/r0)
[    1.379155] UBIFS: default compressor: none
[    1.379176] UBIFS: reserved for root:  677704 bytes (661 KiB)
[    1.571892] UBIFS: completing deferred recovery
[    1.578212] UBIFS: deferred recovery completed
[    2.314383] UBIFS: mounted UBI device 0, volume 0, name “factory”
[    2.314416] UBIFS: mounted read-only
[    2.314441] UBIFS: file system size:   6221824 bytes (6076 KiB, 5 MiB, 49 LEBs)
[    2.314472] UBIFS: journal size:       1015809 bytes (992 KiB, 0 MiB, 6 LEBs)
[    2.314501] UBIFS: media format:       w4/r0 (latest is w4/r0)
[    2.314524] UBIFS: default compressor: none
[    2.314545] UBIFS: reserved for root:  293871 bytes (286 KiB)
[    2.343121] UBIFS: recovery needed
[    2.369371] UBIFS: recovery completed
[    2.369411] UBIFS: mounted UBI device 2, volume 0, name “update”
[    2.369441] UBIFS: file system size:   15745024 bytes (15376 KiB, 15 MiB, 124 LEBs)
[    2.369474] UBIFS: journal size:       1015809 bytes (992 KiB, 0 MiB, 6 LEBs)
[    2.369503] UBIFS: media format:       w4/r0 (latest is w4/r0)
[    2.369527] UBIFS: default compressor: none
[    2.369548] UBIFS: reserved for root:  743676 bytes (726 KiB)
[    2.398642] UBIFS: recovery needed
[    2.450956] UBIFS: recovery completed
[    2.450996] UBIFS: mounted UBI device 2, volume 1, name “data”
[    2.451027] UBIFS: file system size:   77328384 bytes (75516 KiB, 73 MiB, 609 LEBs)
[    2.451059] UBIFS: journal size:       3809280 bytes (3720 KiB, 3 MiB, 30 LEBs)
[    2.451089] UBIFS: media format:       w4/r0 (latest is w4/r0)
[    2.451112] UBIFS: default compressor: none
[    2.451133] UBIFS: reserved for root:  3652410 bytes (3566 KiB)
#

 

O próximo passo é copiar o diretório vlc para o FTP do Drone.

Lembrando que o modo de transferência deve ser sempre o binário, senão os executáveis serão destruidos durante a cópia.

Para facilitar a cópia recomendo usar o Filezilla (lembre de mudar para modo binário, isto é fundamental)

 root@ubuntu:~# apt-get install filezilla

O Host é o IP do Drone, 192.168.1.1

No mais é só entrar em /data/video e arrastar para dentro do drone.

Quando terminar de transferir tudo, vamos testar via telnet no drone.

 root@ubuntu:~# telnet 192.168.1.1
Trying 192.168.1.1…
Connected to 192.168.1.1.
Escape character is ‘^]’.

BusyBox v1.14.0 (2011-08-30 12:00:29 CEST) built-in shell (ash)
Enter ‘help’ for a list of built-in commands.</span>

De volta ao drone, é hora de colocar as permissões de execução no VLC

# chmod -R +x /data/video/vlc

E por fim testar o VLC

# /data/video/vlc/bin/vlc
/data/video/vlc/bin/vlc: error while loading shared libraries: libvlc.so.5: cannot open shared object file: No such file or directory

Problema de .so faltando, é normal quando não se tem o ldconfig,

para resolver o jeito é linkar na mão e testar denovo

# ln -s /data/video/vlc/lib/libvlc.so.5.4.0 /data/video/vlc/lib/libvlc.so.5

# /data/video/vlc/bin/vlc/data/video/vlc/bin/vlc: error while loading shared libraries: libvlccore.so.7: cannot open shared object file: No such file or directory

Outra lib faltando, ok. Linkar na mão e testar.

# ln -s /data/video/vlc/lib/libvlccore.so.7.0.0 /data/video/vlc/lib/libvlccore.so.7

# /data/video/vlc/bin/vlc
/data/video/vlc/bin/vlc: /lib/libc.so.6: version `GLIBC_2.10’ not found (required by /data/video/vlc/lib/libvlccore.so.7)
/data/video/vlc/bin/vlc: /lib/libc.so.6: version `GLIBC_2.9’ not found (required by /data/video/vlc/lib/libvlccore.so.7)

Agora a coisa ficou feita, provavelmente por causa da versão da GLIBC que tem no

gcc version 4.5.2 (Sourcery G++ Lite 2011.03-41)

# cat /firmware/version.txt
1.7.6
# cat /update/version.txt
1.7.6

# cat /proc/version

Linux version 2.6.27.47-parrot (aferran@FR-B-800-0053) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #1 PREEMPT Tue Aug 30 12:05:09 CEST 2011
#

problema é descobrir qual a versão do GCC que buildou o resto do sistema.

Depois pensar, resolvido matar o inetd e subir com um config nova export a raiz do sistema, dai pude copiar o sistema todo do drone para minha máquina pelo Filezilla.

 Agora com as ferramentas todas fica mais fácil.

root@ubuntu:~/Downloads/drone/lib# strings -a * | grep GLIBC | sort | uniq
GLIBC_2.0
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_PRIVATE

root@ubuntu:~/Downloads/drone/lib# strings -a * | grep GCC | sort | uniq
GCC_3.0
GCC_3.3
GCC_3.3.1
GCC_3.3.4
GCC_3.4
GCC_3.4.2
GCC_3.5
GCC_4.0.0
GCC_4.2.0
GCC_4.3.0


Realmente lascou, a versão Sourcery G++ Lite 2011.03-41 não vai servir para buildar o VLC para o firmware 1.7.6, já que a lista de símbolos é diferente.

Vai ser preciso refazer todo o processo provavelmente com a versão 

gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203)

 Removido a versão 2011 e instalado o 2009.


 root@ubuntu:~# arm-none-linux-gnueabi-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/src/gcc-4.3/configure –build=i686-pc-linux-gnu –host=i686-pc-linux-gnu –target=arm-none-linux-gnueabi –enable-threads –disable-libmudflap –disable-libssp –disable-libstdcxx-pch –with-gnu-as –with-gnu-ld –with-specs=’%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables}’ –enable-languages=c,c++ –enable-shared –enable-symvers=gnu –enable-__cxa_atexit –with-pkgversion=’Sourcery G++ Lite 2009q1-203’ –with-bugurl=https://support.codesourcery.com/GNUToolchain/ –disable-nls –prefix=/opt/codesourcery –with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc –with-build-sysroot=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/libc –with-gmp=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/obj/host-libs-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr –with-mpfr=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/obj/host-libs-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr –disable-libgomp –enable-poison-system-directories –with-build-time-tools=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/bin –with-build-time-tools=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/bin
Thread model: posix
gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203)
root@ubuntu:~#


Build do VLC com a versão 2009, foi de primeira sem nenhum problema.

Agora é copiar pelo FTP e testar no telnet como já tinha feito antes.



# /data/video/vlc/bin/vlc –version
VLC media player 2.1.1 Rincewind (revision 2.1.0-207-g89c9520)
VLC version 2.1.1 Rincewind (2.1.0-207-g89c9520)
Compiled by root on ubuntu (Nov 26 2013 16:26:14)
Compiler: gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203)
This program comes with NO WARRANTY, to the extent permitted by law.
You may redistribute it under the terms of the GNU General Public License;
see the file named COPYING for details.
Written by the VideoLAN team; see the AUTHORS file.
#


Agora sim, funcionou como esperado!!!

Comandos para fazer o stream das câmeras do drone.

# /data/video/vlc/bin/vlc v4l2:///dev/video0:width=640:height=480 -I dummy -v –noaudio –sout ‘#std{access=mmsh,dst=:8080}’
# /data/video/vlc/bin/vlc v4l2:///dev/video1:width=176:height=144 -I dummy -v –noaudio –sout ‘#std{access=mmsh,dst=:8080}’


Agora existe algum problema com as câmeras que ficaram rebeldes e sem funcionar.