Sobre este post, vamos a explorar la posibilidad de instalar el Firmware de Ardupilot sobre nuestro piloto atomatico PX4 FMUV2.

Ardupilot, es un desarrollador OpenSource que al igual que el clan PX4 han aportado mucho al desarrollo de Algoritmos robustos para solución a Vehículos Autónomos o Drones/UAVs.

Analizando un poco el panorama de los  desarrollos entre Ardupilot y PX4, podemos comprobar que la linea de tiempo de Ardupilot es mas extensa, dando un aspecto de mas robustez sobre su código base, sobre el análisis que se realizo a las comunidades podemos decir que a pesar de que PX4 es un desarrollador que no lleva mucho tiempo en el mercado, las herramientas y scripts que utilizan para desplegar su código son mucho mas avanzadas y actualizadas.

Herramientas

  • PC de desarrollo con Ubuntu 18.04
  • Piloto Automatico PX4 FMUV2
  • Cable USB V8 Compatible

Instalando Herramientas

GIT

Instalamos GIT para clonar el repositorio principal del proyecto Ardupilot

$ sudo apt install git

Clonando el Repositorio

En este punto, empezaremos a clonar el repositorio principal de Ardupilot con todos sus Submodulos dentro de un directorio de trabajo el cual hemos denominado "Proyectos".

$ git clone --recursive https://github.com/ArduPilot/ardupilot.git

Finalizada la clonacion, tendremos un directorio con el nombre ardupilot sobre nuestro directorio de trabajo

$ ls -l


#Salida del sistema
total 4
drwxrwxr-x 16 heberth heberth 4096 ago 29 12:25 ardupilot

Instalando Dependencias de Ardupilot

Para proceder con la instalación de las dependencias, vamos a hacer uso de un script que ha desarrollado la comunidad, este script es posible encontrarlo dentro del mismo código fuente

$ bash ardupilot/Tools/scripts/install-prereqs-ubuntu.sh


#Salida del sistema
---------- ardupilot/Tools/scripts/install-prereqs-ubuntu.sh start ----------
+ OPT=/opt
+ BASE_PKGS='build-essential ccache g++ gawk git make wget'
+ PYTHON_PKGS='future lxml pymavlink MAVProxy'
+ PX4_PKGS='python-argparse openocd flex bison libncurses5-dev           autoconf texinfo libftdi-dev zlib1g-dev           zip genromfs python-empy cmake cmake-data'
+ ARM_LINUX_PKGS='g++-arm-linux-gnueabihf pkg-config-arm-linux-gnueabihf'
+ SITL_PKGS='libtool libxml2-dev libxslt1-dev python-dev python-pip python-setuptools python-matplotlib python-serial python-scipy python-opencv python-numpy python-pyparsing xterm'
+ ASSUME_YES=false
+ QUIET=false
++ uname -m
+ MACHINE_TYPE=x86_64
+ '[' x86_64 == x86_64 ']'
+ PX4_PKGS+=' libc6-i386'
+ ARM_ROOT=gcc-arm-none-eabi-4_9-2015q3
+ ARM_TARBALL=gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2
+ ARM_TARBALL_URL=http://firmware.ardupilot.org/Tools/STM32-tools/gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2
+ ARDUPILOT_TOOLS=Tools/autotest
+ OPTIND=1
+ getopts y opt
+ APT_GET='sudo apt-get'
+ false
+ false
+ read -r UBUNTU_CODENAME
++ lsb_release -c -s
+ '[' bionic = precise ']'
+ '[' bionic = trusty ']'
+ sudo usermod -a -G dialout heberth
[sudo] contraseña para heberth: 
+ sudo apt-get remove modemmanager
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
El paquete «modemmanager» no está instalado, no se eliminará
0 actualizados, 0 nuevos se instalarán, 0 para eliminar y 3 no actualizados.
+ sudo apt-get update
Obj:1 http://archive.ubuntu.com/ubuntu bionic InRelease                                                        
Ign:2 http://dl.google.com/linux/chrome/deb stable InRelease                                                                          
Des:3 http://dl.google.com/linux/chrome/deb stable Release [1.189 B]                                                                  
Des:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88,7 kB]              
Obj:5 http://repository.spotify.com stable InRelease                                      
Des:6 http://dl.google.com/linux/chrome/deb stable Release.gpg [819 B]                   
Des:7 http://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1.391 B]
Obj:8 http://archive.ubuntu.com/ubuntu bionic-backports InRelease    
Des:9 http://archive.ubuntu.com/ubuntu bionic-security InRelease [83,2 kB]
Des:10 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [304 kB]
Des:11 http://archive.ubuntu.com/ubuntu bionic-updates/main i386 Packages [272 kB]
Des:12 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [172 kB]
Des:13 http://archive.ubuntu.com/ubuntu bionic-updates/universe i386 Packages [173 kB]
Descargados 1.096 kB en 5s (236 kB/s)                      
Leyendo lista de paquetes... Hecho
+ apt-cache search python-wxgtk3.0
+ grep wx
python-wxgtk3.0 - Python interface to the wxWidgets Cross-platform C++ GUI toolkit
python-wxgtk3.0-dev - Development files for wxPython
+ SITL_PKGS+=' python-wxgtk3.0 libtool-bin'
++ apt-cache search -n '^realpath$'
+ RP=
+ '[' -n '' ']'
+ sudo apt-get install build-essential ccache g++ gawk git make wget libtool libxml2-dev libxslt1-dev python-dev python-pip python-setuptools python-matplotlib python-serial python-scipy python-opencv python-numpy python-pyparsing xterm python-wxgtk3.0 libtool-bin python-argparse openocd flex bison libncurses5-dev autoconf texinfo libftdi-dev zlib1g-dev zip genromfs python-empy cmake cmake-data libc6-i386 g++-arm-linux-gnueabihf pkg-config-arm-linux-gnueabihf
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
Nota, seleccionando «libpython2.7-stdlib» en lugar de «python-argparse»
autoconf ya está en su versión más reciente (2.69-11).
bison ya está en su versión más reciente (2:3.0.4.dfsg-1build1).
build-essential ya está en su versión más reciente (12.4ubuntu1).
ccache ya está en su versión más reciente (3.4.1-1).
cmake ya está en su versión más reciente (3.10.2-1ubuntu2).
cmake-data ya está en su versión más reciente (3.10.2-1ubuntu2).
flex ya está en su versión más reciente (2.6.4-6).
g++ ya está en su versión más reciente (4:7.3.0-3ubuntu2).
g++-arm-linux-gnueabihf ya está en su versión más reciente (4:7.3.0-3ubuntu2).
gawk ya está en su versión más reciente (1:4.1.4+dfsg-1build1).
libc6-i386 ya está en su versión más reciente (2.27-3ubuntu1).
libpython2.7-stdlib ya está en su versión más reciente (2.7.15~rc1-1).
libtool ya está en su versión más reciente (2.4.6-2).
libtool-bin ya está en su versión más reciente (2.4.6-2).
libxslt1-dev ya está en su versión más reciente (1.1.29-5).
make ya está en su versión más reciente (4.1-9.1ubuntu1).
python-dev ya está en su versión más reciente (2.7.15~rc1-1).
python-numpy ya está en su versión más reciente (1:1.13.3-2ubuntu1).
python-pyparsing ya está en su versión más reciente (2.2.0+dfsg1-2).
python-serial ya está en su versión más reciente (3.4-2).
python-setuptools ya está en su versión más reciente (39.0.1-2).
zip ya está en su versión más reciente (3.0-11build1).
zlib1g-dev ya está en su versión más reciente (1:1.2.11.dfsg-0ubuntu2).
genromfs ya está en su versión más reciente (0.5.2-2build3).
libftdi-dev ya está en su versión más reciente (0.20-4build3).
openocd ya está en su versión más reciente (0.10.0-4).
pkg-config-arm-linux-gnueabihf ya está en su versión más reciente (4:7.3.0-3ubuntu2).
python-empy ya está en su versión más reciente (3.3.2-1build1).
python-matplotlib ya está en su versión más reciente (2.1.1-2ubuntu3).
python-opencv ya está en su versión más reciente (3.2.0+dfsg-4build2).
python-scipy ya está en su versión más reciente (0.19.1-2ubuntu1).
python-wxgtk3.0 ya está en su versión más reciente (3.0.2.0+dfsg-7).
texinfo ya está en su versión más reciente (6.5.0.dfsg.1-2).
xterm ya está en su versión más reciente (330-1ubuntu2).
git ya está en su versión más reciente (1:2.17.1-1ubuntu0.1).
libncurses5-dev ya está en su versión más reciente (6.1-1ubuntu1.18.04).
libxml2-dev ya está en su versión más reciente (2.9.4+dfsg1-6.1ubuntu1.2).
wget ya está en su versión más reciente (1.19.4-1ubuntu2.1).
python-pip ya está en su versión más reciente (9.0.1-2.3~ubuntu1).
0 actualizados, 0 nuevos se instalarán, 0 para eliminar y 6 no actualizados.
+ sudo pip2 -q install -U future lxml pymavlink MAVProxy
+ '[' '!' -d /opt/gcc-arm-none-eabi-4_9-2015q3 ']'
+++ realpath ardupilot/Tools/scripts/install-prereqs-ubuntu.sh
++ dirname /home/heberth/Proyectos/ardupilot/Tools/scripts/install-prereqs-ubuntu.sh
+ SCRIPT_DIR=/home/heberth/Proyectos/ardupilot/Tools/scripts
++ realpath /home/heberth/Proyectos/ardupilot/Tools/scripts/../../
+ ARDUPILOT_ROOT=/home/heberth/Proyectos/ardupilot
+ exportline='export PATH=/opt/gcc-arm-none-eabi-4_9-2015q3/bin:$PATH'
+ grep -Fxq 'export PATH=/opt/gcc-arm-none-eabi-4_9-2015q3/bin:$PATH' /home/heberth/.profile
+ exportline2='export PATH=/home/heberth/Proyectos/ardupilot/Tools/autotest:$PATH'
+ grep -Fxq 'export PATH=/home/heberth/Proyectos/ardupilot/Tools/autotest:$PATH' /home/heberth/.profile
+ apt-cache search arm-none-eabi
binutils-arm-none-eabi - GNU assembler, linker and binary utilities for ARM Cortex-A/R/M processors
gcc-arm-none-eabi - GCC cross compiler for ARM Cortex-A/R/M processors
gcc-arm-none-eabi-source - GCC cross compiler for ARM Cortex-A/R/M processors (source)
libnewlib-arm-none-eabi - C library and math library compiled for bare metal using Cortex A/R/M
libstdc++-arm-none-eabi-newlib - GNU Standard C++ Library v3 for ARM Cortex-A/R/M processors (newlib)
ubertooth-firmware - Firmware for Ubertooth
ubertooth-firmware-source - Source code for the Ubertooth firmware
+ cd /home/heberth/Proyectos/ardupilot
+ git submodule update --init --recursive
+ echo '---------- ardupilot/Tools/scripts/install-prereqs-ubuntu.sh end ----------'
---------- ardupilot/Tools/scripts/install-prereqs-ubuntu.sh end ----------

Compilando el Codigo Fuente con WAF

WAF es una herramienta que viene instalada y de alguna manera preconfigurada sobre el codigo fuente que hemos descargado, esta herramienta nos permitira configurar y compilar el dispositivo que en este instante queramos programar sobre nuestro piloto automatico.

Para este ejemplo, nosotros vamos a compilar el Firmware actual de ArduCopter

Accedemos al directorio que se a creado cuando clonamos el repositorio y comprobamos que sobre ese repositorio existe waf.

$ cd ardupilot/
$ ls -l | grep waf


#Salida del sistema
-rw-rw-r--   1 heberth heberth  3050 ago 29 12:25 Makefile.waf
-rwxrwxr-x   1 heberth heberth   753 ago 29 12:25 waf

en este punto, podriamos lanzar la ayuda de WAF el cual nos podra orientar en el uso de la herramienta.

$ ./waf  --help
waf [commands] [options]

Main commands (example: ./waf build -j4)
  all           : builds all programs of all group
  antennatracker: builds antennatracker programs
  benchmarks    : builds all programs of benchmarks group
  bin           : builds all programs of bin group
  bootloader    : builds bootloader programs
  build         : executes the build
  check         : builds all programs and run tests
  check-all     : shortcut for `waf check --alltests`
  clean         : cleans the project
  configure     : configures the project
  copter        : builds copter programs
  dist          : makes a tarball for redistributing the sources
  distcheck     : checks if the project compiles (tarball from 'dist')
  distclean     : removes build folders and data
  examples      : builds all programs of examples group
  heli          : builds heli programs
  install       : installs the targets on the system
  list          : lists the targets to execute
  load_pre_build: allow for a pre_build() function in build modules
  localinstall  : runs install using BLD/install as destdir, where BLD is the build variant directory
  plane         : builds plane programs
  rover         : builds rover programs
  rsync         : runs localinstall and then rsyncs BLD/install with the target system
  step          : executes tasks in a step-by-step fashion, for debugging
  sub           : builds sub programs
  tests         : builds all programs of tests group
  tools         : builds all programs of tools group
  uninstall     : removes the targets installed

Options:
  --version             show program's version number and exit
  -c COLORS, --color=COLORS
                        whether to use colors (yes/no/auto) [default: auto]
  -j JOBS, --jobs=JOBS  amount of parallel jobs (4)
  -k, --keep            continue despite errors (-kk to try harder)
  -v, --verbose         verbosity level -v -vv or -vvv [default: 0]
  --zones=ZONES         debugging zones (task_gen, deps, tasks, etc)
  -h, --help            show this help message and exit
  --notests             Exec no unit tests
  --alltests            Exec all unit tests
  --clear-failed        Force failed unit tests to run again next time
  --testcmd=TESTCMD     Run the unit tests using the test-cmd string example "--testcmd="valgrind --error-exitcode=1 %s" to run under valgrind
  --dump-test-scripts   Create python scripts to help debug tests

  Configuration options:
    -o OUT, --out=OUT   build dir for the project
    -t TOP, --top=TOP   src dir for the project
    --check-cxx-compiler=CHECK_CXX_COMPILER
                        list of C++ compilers to try [g++ clang++ icpc]
    --check-c-compiler=CHECK_C_COMPILER
                        list of C compilers to try [gcc clang icc]

  Build and installation options:
    -p, --progress      -p: progress bar; -pp: ide output
    --targets=TARGETS   task generators, e.g. "target1,target2"

  Step options:
    --files=FILES       files to process, by regexp, e.g. "*/main.c,*/test/main.o"

  Installation and uninstallation options:
    -f, --force         force file installation
    --distcheck-args=ARGS
                        arguments to pass to distcheck

  Python Options:
    --nopyc             Do not install bytecode compiled .pyc files (configuration) [Default:install]
    --nopyo             Do not install optimised compiled .pyo files (configuration) [Default:install]
    --nopycache         Do not use __pycache__ directory to install objects [Default:auto]
    --python=PYTHON     python binary to be used [Default: /usr/bin/python]
    --pythondir=PYTHONDIR
                        Installation path for python modules (py, platform-independent .py and .pyc files)
    --pythonarchdir=PYTHONARCHDIR
                        Installation path for python extension (pyext, platform-dependent .so or .dylib files)

  Ardupilot configure options:
    --board=BOARD       Target board to build, choices are ['CUAVv5', 'CubeBlack', 'CubeYellow', 'F4BY', 'KakuteF4', 'KakuteF7', 'MatekF405', 'MatekF405-Wing', 'OMNIBUSF7V2', 'OmnibusNanoV6', 'PH4-mini',
                        'Pixhawk1', 'Pixhawk4', 'Pixracer', 'aero', 'aerofc-v1', 'airbotf4', 'bbbmini', 'bebop', 'bhat', 'blue', 'crazyflie2', 'cube-red', 'dark', 'disco', 'edge', 'erleboard', 'erlebrain2',
                        'f405-min', 'f427-min', 'f767-min', 'fmuv2', 'fmuv3', 'fmuv4', 'fmuv4-beta', 'fmuv5', 'linux', 'mRoX21', 'mindpx-v2', 'mini-pix', 'navio', 'navio2', 'ocpoc_zynq', 'omnibusf4pro',
                        'pocket', 'px4-v1', 'px4-v2', 'px4-v3', 'px4-v4', 'px4-v4pro', 'pxf', 'pxfmini', 'revo-mini', 'rst_zynq', 'sitl', 'skyviper-f412', 'skyviper-f412-rev1', 'skyviper-v2450',
                        'skyviper-v2450-px4', 'sparky2', 'zynq'].
    --debug             Configure as debug variant.
    --enable-asserts    enable OS level asserts.
    --bootloader        Configure for building a bootloader.
    --no-autoconfig     Disable autoconfiguration feature. By default, the build system triggers a reconfiguration whenever it thinks it's necessary - this option disables that.
    --no-submodule-update
                        Don't update git submodules. Useful for building with submodules at specific revisions.
    --enable-header-checks
                        Enable checking of headers
    --default-parameters=DEFAULT_PARAMETERS
                        set default parameters to embed in the firmware

  Linux boards configure options:
    --prefix=PREFIX     installation prefix [default: '/usr/']
    --destdir=DESTDIR   installation root [default: '']
    --bindir=BINDIR     bindir
    --libdir=LIBDIR     libdir
    --apstatedir=APSTATEDIR
                        Where to save data like parameters, log and terrain. This is the --localstatedir + ArduPilots subdirectory [default: board-dependent, usually /var/lib/ardupilot]
    --rsync-dest=RSYNC_DEST
                        Destination for the rsync Waf command. It can be passed during configuration in order to save typing.
    --enable-benchmarks
                        Enable benchmarks.
    --enable-lttng      Enable lttng integration
    --disable-libiio    Don't use libiio even if supported by board and dependencies available
    --disable-tests     Disable compilation and test execution
    --enable-sfml       Enable SFML graphics library
    --static            Force a static build

  Ardupilot build options:
    --program-group=PROGRAM_GROUP
                        Select all programs that go in <PROGRAM_GROUP>/ for the build. Example: `waf --program-group examples` builds all examples. The special group "all" selects all programs.
    --upload            Upload applicable targets to a connected device. Not all platforms may support this. Example: `waf copter --upload` means "build arducopter and upload it to my board".
    --summary-all       Print build summary for all targets. By default, only information about the first 20 targets will be printed.

  Ardupilot check options:
    --check-verbose     Output all test programs.

  Ardupilot clean options:
    --clean-all-sigs    Clean signatures for all tasks. By default, tasks that scan for implicit dependencies (like the compilation tasks) keep the dependency information across clean commands, so that that
                        information is changed only when really necessary. Also, some tasks that don't really produce files persist their signature. This option avoids that behavior when cleaning the build.

Configurando el entorno.

Con WAF y algunos de sus parámetros, es posible configurar y después compilar el código fuente, configuraremos el entorno para el PilotoAutomatico PX4 FMUV2.

$ ./waf --board=fmuv2 configure

#Salida del sistema
Setting top to                           : /home/heberth/Proyectos/ardupilot 
Setting out to                           : /home/heberth/Proyectos/ardupilot/build 
Autoconfiguration                        : enabled 
Setting board to                         : fmuv2 
Checking for program 'arm-none-eabi-ar'  : /opt/gcc-arm-none-eabi-4_9-2015q3/bin/arm-none-eabi-ar 
Using toolchain                          : arm-none-eabi 
Checking for 'g++' (C++ compiler)        : /opt/gcc-arm-none-eabi-4_9-2015q3/bin/arm-none-eabi-g++ 
Checking for 'gcc' (C compiler)          : /opt/gcc-arm-none-eabi-4_9-2015q3/bin/arm-none-eabi-gcc 
Checking for c flags '-MMD'              : yes 
Checking for cxx flags '-MMD'            : yes 
Enabling ChibiOS asserts                 : no 
Checking for intelhex module:            : disabled 
Checking for program 'make'              : /usr/bin/make 
Checking for program 'arm-none-eabi-objcopy' : /opt/gcc-arm-none-eabi-4_9-2015q3/bin/arm-none-eabi-objcopy 
Including /home/heberth/Proyectos/ardupilot/libraries/AP_HAL_ChibiOS/hwdef/fmuv3/hwdef.dat
Setup for MCU STM32F427xx
Writing hwdef setup in /home/heberth/Proyectos/ardupilot/build/fmuv2/hwdef.h
Writing DMA map
Generating ldscript.ld
Checking for env.py
env set FLASH_RESERVE_START_KB=16
env set HAL_WITH_UAVCAN=1
env set CHIBIOS_BUILD_FLAGS=USE_FATFS=yes CHIBIOS_PLATFORM_MK=os/hal/ports/STM32/STM32F4xx/platform.mk CHIBIOS_STARTUP_MK=os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk
Checking for HAVE_CMATH_ISFINITE             : yes 
Checking for HAVE_CMATH_ISINF                : yes 
Checking for HAVE_CMATH_ISNAN                : yes 
Checking for NEED_CMATH_ISFINITE_STD_NAMESPACE : yes 
Checking for NEED_CMATH_ISINF_STD_NAMESPACE    : yes 
Checking for NEED_CMATH_ISNAN_STD_NAMESPACE    : yes 
Checking for header endian.h                   : not found 
Checking for header byteswap.h                 : not found 
Checking for program 'python'                  : /usr/bin/python 
Checking for python version >= 2.7.0           : 2.7.15 
Checking for program 'python'                  : /usr/bin/python 
Checking for python version >= 2.7.0           : 2.7.15 
Source is git repository                       : yes 
Update submodules                              : yes 
Checking for program 'git'                     : /usr/bin/git 
Gtest                                          : STM32 boards currently don't support compiling gtest 
Checking for program 'arm-none-eabi-size'      : /opt/gcc-arm-none-eabi-4_9-2015q3/bin/arm-none-eabi-size 
Benchmarks                                     : disabled 
Unit tests                                     : disabled 
Checking for program 'rsync'                   : /usr/bin/rsync 
'configure' finished successfully (1.216s)

Compilando ArduCopter

Si ya hemos configurado correctamente el entorno con WAF, podremos iniciar la compilacion del codigo utilizando el siguiente comando.

$ ./waf -j4 build

#Salida del sistema
Waf: Entering directory `/home/heberth/Proyectos/ardupilot/build/fmuv2'
Embedding file io_firmware.bin:Tools/IO_Firmware/fmuv2_IO.bin
Checking for env.py
env added FLASH_RESERVE_START_KB=16
env added HAL_WITH_UAVCAN=1
env added CHIBIOS_BUILD_FLAGS=USE_FATFS=yes CHIBIOS_PLATFORM_MK=os/hal/ports/STM32/STM32F4xx/platform.mk CHIBIOS_STARTUP_MK=os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk
[3/8] Creating build/fmuv2/hwdef.h
...

...
[229/834] Compiling libraries/AP_Radio/AP_Radio.cpp
[230/834] Compiling libraries/AP_Radio/AP_Radio_backend.cpp
[231/834] Compiling libraries/AP_RangeFinder/AP_RangeFinder_Wasp.cpp
[232/834] Compiling libraries/AP_RangeFinder/AP_RangeFinder_VL53L0X.cpp
[233/834] Compiling libraries/AP_RangeFinder/AP_RangeFinder_MaxsonarI2CXL.cpp
[234/834] Compiling libraries/AP_RangeFinder/RangeFinder.cpp
[235/834] Compiling libraries/AP_RangeFinder/AP_RangeFinder_Benewake.cpp
...

...
[488/834] Compiling libraries/AC_AttitudeControl/AC_AttitudeControl.cpp
[489/834] Compiling libraries/AC_AttitudeControl/AC_PosControl.cpp
[490/834] Compiling libraries/AP_HAL_ChibiOS/Storage.cpp
[491/834] Compiling libraries/AP_HAL_ChibiOS/HAL_ChibiOS_Class.cpp
[492/834] Compiling libraries/AP_AccelCal/AP_AccelCal.cpp
...

...
Waf: Leaving directory `/home/heberth/Proyectos/ardupilot/build/fmuv2'

BUILD SUMMARY
Build directory: /home/heberth/Proyectos/ardupilot/build/fmuv2
Target               Text    Data  BSS     Total  
--------------------------------------------------
bin/ardurover        799656  3208  193536   996400
bin/antennatracker   684104  4340  192408   880852
bin/arducopter       901588  3228  193532  1098348
bin/arducopter-heli  887692  3228  193532  1084452
bin/arduplane        908568  3212  193536  1105316
bin/ardusub          802596  3236  193516   999348

Build commands will be stored in build/fmuv2/compile_commands.json
'build' finished successfully (7m4.580s)

Compilado el Firware, podremos ver sobre el directorio "Build" el target creado para FMUV2.

Subiendo el Firmware a la placa FMUV2

para poder subir el firmware, necesitamos tener disponible un cable USB tipo V8 compatible con nuestra BOARD, el siguiente comando, selecciona uno de los targets que se han compilado previamente y lo subira.

$ ./waf --targets bin/arducopter --upload


#Salida del sistema
Waf: Entering directory `/home/heberth/Proyectos/ardupilot/build/fmuv2'
Embedding file io_firmware.bin:Tools/IO_Firmware/fmuv2_IO.bin
Checking for env.py
env added FLASH_RESERVE_START_KB=16
env added HAL_WITH_UAVCAN=1
env added CHIBIOS_BUILD_FLAGS=USE_FATFS=yes CHIBIOS_PLATFORM_MK=os/hal/ports/STM32/STM32F4xx/platform.mk CHIBIOS_STARTUP_MK=os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk
[8/8] Linking build/fmuv2/modules/ChibiOS/libch.a
[263/520] Compiling libraries/AP_ROMFS/AP_ROMFS.cpp
[516/520] Linking build/fmuv2/lib/libArduCopter_libs.a
[517/520] Linking build/fmuv2/bin/arducopter
[518/520] Generating bin/arducopter.bin
[519/520] Generating bin/arducopter.apj
[520/520] Uploading build/fmuv2/bin/arducopter.apj
Loaded firmware for 9,0, size: 904828 bytes, waiting for the bootloader...
If the board does not respond within 1-2 seconds, unplug and re-plug the USB connector.

En este punto, la herramienta esta a la espera de la conexión de un piloto automático para proceder a instalar el Firmware, en este caso el que hemos compilado con anterioridad, lo conectamos con el cable V8 a algún puerto USB disponible de nuestro computador para que el Firmware inicie a cargarse.

ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff type: ÿÿÿÿ
idtype: =FF
vid: ffffffff
pid: ffffffff
coa: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=

sn: 004f002e3034511238353334

Erase  : [====================] 100.0%
Program: [====================] 100.0%
Verify : [====================] 100.0%
Rebooting.

Waf: Leaving directory `/home/heberth/Proyectos/ardupilot/build/fmuv2'

BUILD SUMMARY
Build directory: /home/heberth/Proyectos/ardupilot/build/fmuv2
Target          Text    Data  BSS     Total  
---------------------------------------------
bin/arducopter  901588  3228  193532  1098348

Build commands will be stored in build/fmuv2/compile_commands.json
'build' finished successfully (3m52.043s)

Si todo es correcto, la board arrancara y podremos utilizar el sistema con la ultima versión del firmware recién cocinado por nosotros mismos.

Esto habilita un gran de posibilidades sobre la arquitectura ya que nos permitirá a nosotros como Desarrolladores la modificación del código fuente logrando integrar nuevas tecnologías a la plataforma.

Referencias:

http://ardupilot.org/
http://ardupilot.org/dev/
https://github.com/ArduPilot/
https://github.com/ArduPilot/ardupilot
http://ardupilot.org/dev/docs/where-to-get-the-code.html
http://ardupilot.org/dev/docs/building-setup-linux.html
http://ardupilot.org/dev/docs/building-px4-with-make.html
http://ardupilot.org/dev/docs/building-for-navio2-on-rpi3.html
https://github.com/ArduPilot/ardupilot/blob/master/BUILD.md