venerdì 4 ottobre 2013

Ar.Drone mod - parte 1

Finalmente mi sono deciso a prendere l'Ar.Drone! Era da un pò che ci pensavo, in realtà ne volevo fare uno da zero ma la disponibilità economica mi ha costretto a ripiegare sul prodotto della Parrot che, secondo me, vince alla grande se facciamo il rapporto Qualità/Prezzo. Poi usato costa ancora meno :P
Certo un Drone "vero" è un'altra cosa, però anche questo alla fine non è male come primo approccio a questo mondo, inoltre si tratta di un vero e proprio computer volante per cui offre qualche sfida in più oltre al saperlo pilotare.

Per provare il mio nuovo acquisto ho dovuto scaricare il suo sw per Android in modo da usare il cell come controller... il primo tentativo è stato piuttosto disastroso e mi sono subito reso conto quanto il controller scelto dalla Parrot poteva essere solo un buon modo per ridurre i costi globali del prodotto.
Il secondo tentativo, a distanza di una settimana, è andato decisamente meglio, però permane un senso di precarietà nei movimenti che non mi mette a mio agio. Per quanto ci abbia ragionato su, la casualità continua a fare da padrone.
Probabilmente non ho abbastanza esperienza ma distruggere tutto per farmela non mi sembra la scelta migliore, per cui dovrò cercare qualche via alternativa.

Il nostro amico crea una rete WiFi a cui ci si deve collegare per potergli inviare i comandi tramite cellulare.
La rete che troveremo è priva di sicurezza e potenzialmente chiunque ci si potrebbe collegare più che altro per disturbare il nostro volo già instabile a causa delle frequenti perdite di segnale.
Inoltre fa anche da server DHCP per fornire l'indirizzo al client che si deve collegare alla sua rete per permetterne il controllo.

Il drone di default ha indirizzo 192.168.1.1 e tramite Putty  possiamo collegarci in Telnet per  dare un'occhiata a cosa ci offre il sistema.


BusyBox v1.14.0 (2012-08-20 14:37:54 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

#

Abbiamo a che fare con un sistema BusyBox, una versione di Linux sviluppata apposta per sistemi embedded, ( http://www.busybox.net/ ).

# cat /proc/version
Linux version 2.6.27.47-parrot (aferran@Mykuntu) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #1 PREEMPT Mon Aug 20 14:46:29 CEST 2012

Questo è l'output di top, program.elf è il software principale che gestisce tutto il drone

Mem: 23220K used, 102848K free, 0K shrd, 0K buff, 4304K cached
Load average: 0.74 0.74 0.68 3/52 2715
  PID  PPID USER     STAT   VSZ %MEM COMMAND
  971   970 root     S    13892  11% /bin/program.elf
  969     1 root     S     2812   2% inetd
  956     1 root     S     2736   2% telnetd -l /bin/sh
  962     1 root     S     2736   2% /bin/sh /bin/memory_check.sh
  970     1 root     S     2736   2% /bin/sh /bin/check_update.sh
 1349   956 root     S     2736   2% /bin/sh
 1564   956 root     S     2736   2% /bin/sh
    1     0 root     S     2732   2% init
  958     1 root     S     2732   2% udhcpd /tmp/udhcpd.conf
  974     1 root     S     2732   2% init
  976     1 root     S     2732   2% /sbin/syslogd -n -m 0
  977     1 root     S     2732   2% /sbin/klogd -n
 2715  1564 root     R     2732   2% top
 2714   962 root     S     2600   2% sleep 10
  834     1 root     S     1632   1% /bin/factory_reset_cb
    2     0 root     SW<      0   0% [kthreadd]
    3     2 root     SW<      0   0% [ksoftirqd/0]
    4     2 root     SW<      0   0% [watchdog/0]
    5     2 root     SW<      0   0% [events/0]
    6     2 root     SW<      0   0% [khelper]
   75     2 root     SW<      0   0% [kblockd/0]
   87     2 root     SW<      0   0% [khubd]
   93     2 root     SW<      0   0% [kmmcd]
  116     2 root     SW       0   0% [pdflush]
  117     2 root     SW       0   0% [pdflush]
  118     2 root     SW<      0   0% [kswapd0]
  119     2 root     SW<      0   0% [aio/0]
  120     2 root     SW<      0   0% [nfsiod]
  764     2 root     SW<      0   0% [ubi_bgt0d]
  767     2 root     SW<      0   0% [ubi_bgt1d]
  771     2 root     SW<      0   0% [ubi_bgt2d]
  792     2 root     SW<      0   0% [p6-spi.0]
  805     2 root     SW<      0   0% [rpciod/0]
  814     2 root     SW<      0   0% [ubifs_bgt1_0]
  826     2 root     SW<      0   0% [ubifs_bgt2_0]
  828     2 root     SW<      0   0% [ubifs_bgt2_1]
  899     2 root     SW<      0   0% [ksdiorqd]
  900     2 root     SW<      0   0% [ar6000_io]

Questa è la configurazione della scheda WiFi

# iwconfig
lo        no wireless extensions.

ath0      AR6000 802.11g  ESSID:"dronenet"
          Mode:Master  Frequency:2.437 GHz  Bit Rate:24 Mb/s   Tx-Power=16 dBm  
          Sensitivity=0/3
          Encryption key:off
          Power Management:on
          Link Quality:255/94  Signal level:-96 dBm  Noise level:-96 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:3  Invalid misc:0   Missed beacon:0


Diamo un'occhiata al contenuto del disco

# ls
Change    dev       firmware  licenses  root      tmp       var
bin       etc       home      mnt       sbin      update
data      factory   lib       proc      sys       usr
#


Come tutti i sistemi linux ha un log sotto /var/log/messages in cui convergono buona parte dei messaggi di sistema. Non ne riporto il contenuto perchè il sistema logga parecchio soprattutto se è a pancia in su come in questo momento... (perchè a pancia in su? beh... la risposta nelle prossime puntate...)

Sotto /etc troviamo il file di configurazione del dhcp che rilascia fino a quasi 100 indirizzi

# cat etc/udhcpd.conf
start 192.168.1.2
end 192.168.1.100
interface ath0
option subnet 255.255.255.0
#


All'interno della cartella /data troviamo uno dei file più interessanti ovvero "config.ini"

# ls data
accs_infos.bin        fact_accs_infos.bin   syslog.bin
config.ini            navdata_blackbox.bin  video
custom.configs        old_adress.txt
emergency.bin         random_mac.txt

/data/config.ini contiene tutti i parametri per l'inizializzazione del sistema a ogni riavvio. Da qui si può modificare un pò tutto, tra cui il WiFi SSID, la configurazione IP, il funzionamento della scheda di rete stessa, lo stream video e altro.

# cat /data/config.ini

[general]
flying_time                    = 3613
num_version_config             = 1
num_version_mb                 = 17
num_version_soft               = 1.11.5
soft_build_date                = 2012-08-20 14:51
motor1_soft                    = 1.43
motor1_hard                    = 3.0
motor1_supplier                = 1.1
motor2_soft                    = 1.43
motor2_hard                    = 3.0
motor2_supplier                = 1.1
motor3_soft                    = 1.43
motor3_hard                    = 3.0
motor3_supplier                = 1.1
motor4_soft                    = 1.43
motor4_hard                    = 3.0
motor4_supplier                = 1.1
ardrone_name                   = My ARDrone
navdata_demo                   = TRUE
com_watchdog                   = 2
video_enable                   = TRUE
vision_enable                  = TRUE
vbat_min                       = 9000
drone_serial                   = PI040236AD1A218389

[network]
ssid_single_player             = dronenet
ssid_multi_player              = ardrone_v1.7.6
wifi_mode                      = 0
secure                         = FALSE
passkey                        =
navdata_port                   = 5554
video_port                     = 5555
at_port                        = 5556
cmd_port                       = 5559
owner_mac                      = 00:00:00:00:00:00
owner_ip_address               = 0
local_ip_address               = 0
broadcast_address              = 0

[control]
accs_offset                    = { -2.2265967e+03 1.8646592e+03 2.0777571e+03 }
accs_gains                     = {  9.9772358e-01 2.5741236e-02 4.3659292e-02  -2.1074675e-03 -9.9377209e-01 4.6503697e-02  9.8727606e-03 -7.4420400e-02 -9.6668828e-01 }
gyros_offset                   = { 1.6781360e+03 1.6794500e+03 1.7028979e+03 }
gyros_gains                    = { 6.8175443e-03 -6.7480663e-03 -3.8641607e-03 }
gyros110_offset                = { 1.6931400e+03 1.7010179e+03 }
gyros110_gains                 = { 1.4845658e-03 -1.4690076e-03 }
gyro_offset_thr_x              = 4.0000000e+00
gyro_offset_thr_y              = 4.0000000e+00
gyro_offset_thr_z              = 5.0000000e-01
pwm_ref_gyros                  = 470
shield_enable                  = 1
altitude_max                   = 5000
altitude_min                   = 500
outdoor                        = FALSE
flight_without_shell           = TRUE
brushless                      = TRUE
autonomous_flight              = FALSE
control_level                  = 0
euler_angle_max                = 2.0943952e-01
control_trim_z                 = 0.0000000e+00
control_iphone_tilt            = 3.4906584e-01
control_vz_max                 = 7.0000000e+02
control_yaw                    = 1.7453293e+00
manual_trim                    = FALSE
indoor_euler_angle_max         = 2.0943952e-01
indoor_control_vz_max          = 7.0000000e+02
indoor_control_yaw             = 1.7453293e+00
outdoor_euler_angle_max        = 3.4906584e-01
outdoor_control_vz_max         = 1.0000000e+03
outdoor_control_yaw            = 3.4906585e+00
magneto_offset                 = { 0.0000000e+00 0.0000000e+00 0.0000000e+00 }
magneto_radius                 = 0.0000000e+00
osctun_value                   = 0
osctun_test                    = FALSE

[pic]
ultrasound_freq                = 8
ultrasound_watchdog            = 3
pic_version                    = 100925510

[video]
camif_fps                      = 20
camif_buffers                  = 2
num_trackers                   = 12
video_on_usb                   = TRUE
video_file_index               = 1
codec_fps                      = 20

[leds]

[detect]
enemy_colors                   = 1
enemy_without_shell            = 0
groundstripe_colors            = 16
detect_type                    = 3
detections_select_h            = 0
detections_select_v_hsync      = 0
detections_select_v            = 0

[syslog]
output                         = 7
max_size                       = 102400
nb_files                       = 5

[custom]
application_desc               = Default application configuration
profile_desc                   = Default profile configuration
session_desc                   = Default session configuration

[userbox]

[gps]
latitude                       = 5.0000000000000000e+02
longitude                      = 5.0000000000000000e+02
altitude                       = 0.0000000000000000e+00

#

Da notare :

flying_time                    = 3613  (secondi)

Sono stato felicissimo di scoprire che il mio drone usato ha volato solo 40 minuti!! :D  20 li ho fatti io :)

Sotto /bin oltre ai file fondamentali per busybox troviamo anche gli script di configurazione della scheda WiFi.

# ls bin
ash               echo              ls                random_ip         true
busybox           egrep             memory_check.sh   random_mac        umount
cat               factory_reset_cb  mkdir             repairBoxes       uname
channelselector   false             mknod             reset_config.sh   usleep
check_update.sh   fgrep             mktemp            reset_dhcp.sh     vi
checkplf          gdbserver         mount             rm                watch
chgrp             getopt            mv                rmdir             wifi_adhoc.sh
chmod             grep              netstat           sed               wifi_infra.sh
chown             gunzip            nfs.sh            sh                wifi_managed.sh
cp                gzip              pairing_setup.sh  sleep             wifi_setup.sh
cttyhack          hostname          pidof             stat              zcat
date              ip                ping              stty
dd                ipcalc            program.elf       sync
df                kill              ps                tar
dmesg             ln                pwd               touch
#




Ho provato a riconfigurarla nei vari modi disponibili, con o senza i suoi script, ma senza successo. Non so se è dovuto all'ultimo firmware installato, ma ogni tentativo che ho effettuato mi ha portato a un misero fallimento. Ho provato a cambiare la modalità di funzionamento da Master (quella che mi presenta di default) a Managed, Client o Repeater, ma in ogni caso ottenevo solo "richieste scadute" verso qualsiasi altro IP della rete anche se il mio access point vedeva un client connesso.
L'unico metodo che ho trovato per accedervi dal pc fisso è stato collegare l'access point via Ethernet alla mia rete e via WiFi alla rete del drone, come Repeater.

Dopo essere riuscito a raggiungere il drone dal pc fisso, mi si è aperta la possibilità di controllarlo da Tastiera o Joystick tramite qualche SW per windows.
L'unico programma che sono riuscito a utilizzare è Windev16 ( http://repository.windev.com/resource.awp?file_id=76&lang=UK )




WOW! Ora è decisamente più controllabile di prima, non si rischia più di vedere il drone che se ne va per i fatti suoi perchè non ho premuto bene lo schermo o perchè sto inavvertitamente tenendo il telefono inclinato! ahhh che sollievo, è diventato semplicissimo da usare! Fantastico! Non vedo l'ora di provarlo all'aperto per vedere cosa si può fare con un joypad al posto del cellulare :D




Nessun commento:

Posta un commento