Otra manera de controlar nuestro vehiculo UAV que ha sido simulado de forma "SITL", es a traves de la red local sobre la cual se encuentra conectado nuestro host de Desarrollo.
Esto nos permite poder extender la simulacion a un dispositivo movil que corre un Sistema Operativo Android el cual tiene instalado QGroundControl.

Si deseas descargar QgroundControl para Android click AQUI

Herramientas

  • PC de desarrollo con Ubuntu instalado.
  • ToolsChain Previamente instaladas sobre host de desarrollo
  • PC con Debian sid y QgroundControl en su version DailyBuild.
  • Red Local, equipos conectados a ella con Direcciones IP dentro del mismo rango y alcanzables entre ellos.

Ejecutando la simulacion de tipo BroadCast

Accedemos al directorio donde actualmente corremos el entorno de desarrollo de PX4.

$ cd src/Firmware/

Para lograr que la simulacion interactue sobre la red Local, es necesario ejecutar sobre "make" el siguiente comando.

$ make broadcast jmavsim

Esto iniciara la simulacion y creara sobre la IP del entorno de desarrollo un dron el cual sera posible controlar desde QGroundControl en un dispositivo Movil o un Computador Remoto.

Pero en este punto no sera posible ya que la salida actual para el codigo recien compilado nos indica que la conexion con la simulacion se puede hacer de manera local solamente y es posible hacerlo de manera remota si se modifica el parametro "MAV_BROADCAST" con el valor "1", pero aqui nace la pregunta y es.... en donde lo modificamos?

Salida del comando

#Salida del sistema
-- PX4 VERSION: v1.8.0-224-geffeae9
-- CONFIG: posix_sitl_broadcast
-- Build Type: RelWithDebInfo
-- The CXX compiler identification is GNU 5.4.0
-- The C compiler identification is GNU 5.4.0
-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/cc
-- Check for working CXX compiler using: Ninja
-- Check for working CXX compiler using: Ninja -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Check for working C compiler using: Ninja
-- Check for working C compiler using: Ninja -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Found PythonInterp: /usr/bin/python (found version "2.7.12") 
-- Found PY_jinja2: /usr/local/lib/python2.7/dist-packages/jinja2  
-- C compiler: cc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
-- C++ compiler: c++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
-- PX4 ECL: Very lightweight Estimation & Control Library v0.9.0-564-g41953ab
-- Configuring done
-- Generating done
-- Build files have been written to: /home/heberth/src/Firmware/build/posix_sitl_broadcast
ninja: Entering directory `/home/heberth/src/Firmware/build/posix_sitl_broadcast'
[628/628] cd /home/heberth/src/Firmware/build/posix_sitl_broadcast/tmp && /home...home/heberth/src/Firmware /home/heberth/src/Firmware/build/posix_sitl_broadcast
args: /home/heberth/src/Firmware/build/posix_sitl_broadcast/px4 posix-configs/SITL/init/ekf2 none jmavsim none /home/heberth/src/Firmware /home/heberth/src/Firmware/build/posix_sitl_broadcast
SITL ARGS
sitl_bin: /home/heberth/src/Firmware/build/posix_sitl_broadcast/px4
rcS_dir: posix-configs/SITL/init/ekf2
debugger: none
program: jmavsim
model: none
src_path: /home/heberth/src/Firmware
build_path: /home/heberth/src/Firmware/build/posix_sitl_broadcast
empty model, setting iris as default
SITL COMMAND: /home/heberth/src/Firmware/build/posix_sitl_broadcast/px4 /home/heberth/src/Firmware /home/heberth/src/Firmware/posix-configs/SITL/init/ekf2/iris
data path: /home/heberth/src/Firmware
commands file: /home/heberth/src/Firmware/posix-configs/SITL/init/ekf2/iris
creating new parameters file
creating new dataman file

______  __   __    ___ 
| ___ \ \ \ / /   /   |
| |_/ /  \ V /   / /| |
|  __/   /   \  / /_| |
| |     / /^\ \ \___  |
\_|     \/   \/     |_/

px4 starting.

1610 WARNING: setRealtimeSched failed (not run as root?)
ERROR [parameters] decoder init failed
ERROR [param] importing from 'rootfs/eeprom/parameters' failed (-61)
Command 'param' failed, returned 1
INFO  [dataman] Unknown restart, data manager file 'rootfs/fs/microsd/dataman' size is 11405132 bytes
  BAT_N_CELLS: curr: 0 -> new: 3
  CAL_ACC0_ID: curr: 0 -> new: 1376264
  CAL_ACC0_XOFF: curr: 0.0000 -> new: 0.0100
  CAL_ACC0_XSCALE: curr: 1.0000 -> new: 1.0100
  CAL_ACC0_YOFF: curr: 0.0000 -> new: -0.0100
  CAL_ACC0_YSCALE: curr: 1.0000 -> new: 1.0100
  CAL_ACC0_ZOFF: curr: 0.0000 -> new: 0.0100
  CAL_ACC0_ZSCALE: curr: 1.0000 -> new: 1.0100
  CAL_ACC1_ID: curr: 0 -> new: 1310728
  CAL_ACC1_XOFF: curr: 0.0000 -> new: 0.0100
  CAL_GYRO0_ID: curr: 0 -> new: 2293768
  CAL_GYRO0_XOFF: curr: 0.0000 -> new: 0.0100
  CAL_MAG0_ID: curr: 0 -> new: 196616
  CAL_MAG0_XOFF: curr: 0.0000 -> new: 0.0100
  COM_DISARM_LAND: curr: 0 -> new: 3
  COM_OBL_ACT: curr: 0 -> new: 2
  COM_OF_LOSS_T: curr: 0.0000 -> new: 5.0000
  COM_RC_IN_MODE: curr: 0 -> new: 1
  EKF2_ANGERR_INIT: curr: 0.1000 -> new: 0.0100
  EKF2_GBIAS_INIT: curr: 0.1000 -> new: 0.0100
  EKF2_MAG_TYPE: curr: 0 -> new: 1
  MC_PITCH_P: curr: 6.5000 -> new: 6.0000
  MC_PITCHRATE_P: curr: 0.1500 -> new: 0.2000
  MC_ROLL_P: curr: 6.5000 -> new: 6.0000
  MC_ROLLRATE_P: curr: 0.1500 -> new: 0.2000
  MPC_HOLD_MAX_Z: curr: 0.6000 -> new: 2.0000
  MPC_Z_VEL_I: curr: 0.0200 -> new: 0.1500
  MPC_Z_VEL_P: curr: 0.2000 -> new: 0.6000
  NAV_ACC_RAD: curr: 10.0000 -> new: 2.0000
  NAV_DLL_ACT: curr: 0 -> new: 2
  RTL_DESCEND_ALT: curr: 30.0000 -> new: 5.0000
  RTL_LAND_DELAY: curr: -1.0000 -> new: 5.0000
  RTL_RETURN_ALT: curr: 60.0000 -> new: 30.0000
  SDLOG_DIRS_MAX: curr: 0 -> new: 7
  SENS_BOARD_X_OFF: curr: 0.0000 -> new: 0.0000
  SYS_AUTOSTART: curr: 0 -> new: 4010
INFO  [simulator] Waiting for initial data on UDP port 14560. Please start the flight simulator to proceed..
Buildfile: /home/heberth/src/Firmware/Tools/jMAVSim/build.xml

make_dirs:

compile:

create_run_jar:

copy_res:

BUILD SUCCESSFUL
Total time: 2 seconds
Options parsed, starting Sim.
Starting GUI...
3D [dev] 1.6.0-pre12-daily-experimental daily

Init MAVLink
INFO  [simulator] Got initial simulation data, running sim..
INFO  [pwm_out_sim] MODE_16PWM
INFO  [mavlink] mode: Normal, data rate: 4000000 B/s on udp port 14556 remote port 14550
INFO  [mavlink] mode: Onboard, data rate: 4000000 B/s on udp port 14557 remote port 14540
INFO  [mavlink] MAVLink only on localhost (set param MAV_BROADCAST = 1 to enable network)
INFO  [logger] logger started (mode=all)
INFO  [logger] log root dir created: rootfs/fs/microsd/log
WARN  [logger] logger: failed to add topic. Too many subscriptions
WARN  [logger] logger: failed to add topic. Too many subscriptions
INFO  [logger] Start file log
pxh> INFO  [logger] Opened log file: rootfs/fs/microsd/log/2018-07-18/05_41_56.ulg
INFO  [ecl/EKF] EKF aligned, (pressure height, IMU buf: 22, OBS buf: 14)
INFO  [ecl/EKF] EKF GPS checks passed (WGS-84 origin set)
INFO  [ecl/EKF] EKF commencing GPS fusion

Activando modo BroadCast para la simulacion por defecto

Si analizamos detalladamente la linea SITL COMMAND: /home/heberth/src/Firmware/build/posix_sitl_broadcast/px4 /home/heberth/src/Firmware /home/heberth/src/Firmware/posix-configs/SITL/init/ekf2/iris podemos validar que al ejecutar la simulacion por defecto el dispositivo que se inicia con la simulacion es el "iris" que se encuentra en el directorio /src/Firmware/posix-configs/SITL/init/ekf2/iris
Una vez identificado esto, procedemos con la configuracion de la variable sobre el dispositivo, para ello abrimos con nuestro editor de texto preferido el archivo y agregamos la linea faltante sobre las variables seteadas.

$ nano posix-configs/SITL/init/ekf2/iris

Crear bajo la ultima variable o parametro seteado una nueva variable, la variable a agregar como nombramos anteriormente es "MAV_BROADCAST" y debe de llevar el valor "1".
sitl-broadcast

Una vez echo esto, procedemos a ejecutar de nuevo la simulacion y validar que sobre la salida de la ejecucion se evidencie que se abre el socket UDP.

$ cd src/Firmware/
$ make broadcast jmavsim


#Salida del sistema
Init MAVLink
INFO  [simulator] Got initial simulation data, running sim..
INFO  [pwm_out_sim] MODE_16PWM
INFO  [mavlink] mode: Normal, data rate: 4000000 B/s on udp port 14556 remote port 14550
INFO  [mavlink] mode: Onboard, data rate: 4000000 B/s on udp port 14557 remote port 14540
pxh> INFO  [logger] logger started (mode=all)
WARN  [logger] logger: failed to add topic. Too many subscriptions
WARN  [logger] logger: failed to add topic. Too many subscriptions
INFO  [logger] Start file log
INFO  [logger] Opened log file: rootfs/fs/microsd/log/2018-07-18/06_00_59.ulg
INFO  [mavlink] using network interface enp1s0, IP: 192.168.2.102
INFO  [mavlink] with netmask: 255.255.255.0
INFO  [mavlink] and broadcast IP: 192.168.2.255
INFO  [ecl/EKF] EKF aligned, (pressure height, IMU buf: 22, OBS buf: 14)
INFO  [ecl/EKF] EKF GPS checks passed (WGS-84 origin set)
INFO  [ecl/EKF] EKF commencing GPS fusion

En este punto, vemos que mavlink esta utilizando la interfaz del dispositivo el cual es nombrada como "enp1s0" logrando servir la simulacion sobre la red local en cualquier dispositivo.

Conectandonos al Socket UDP de JMAVSim desde QGroundControl de manera Remota.

Sobre un equipo remoto, el cual procederemos con la conexion a la simulacion validamos que se pueda alcanzar el puerto UDP remoto sobre el dispositivo, para esto, utilizamos una de las herramientas de linux el cual es NetCat

$ nc -uvz 192.168.2.102 14560


#Salida del sistema
Ubpx4Dev [192.168.2.102] 14560 (?) open

Con esto confirmamos que es posible alcanzar la simulacion desde un host remoto que se encuentra sobre la misma red.

Accedemos via SSH al Host de desarrollo y monitoreamos con NetStat la conexion con el puerto indicado con anterioridad.

$ ssh heberth@192.168.2.102
$ watch -n1 "netstat -puna"


#Salida del sistema
Every 5,0s: netstat -puna                                                                                     Wed Jul 18 15:15:09 2018

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 0.0.0.0:14556           0.0.0.0:*                           2131/px4
udp        0      0 0.0.0.0:14557           0.0.0.0:*                           2131/px4
udp        0      0 0.0.0.0:14560           0.0.0.0:*                           2131/px4
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           -
udp        0      0 0.0.0.0:33336           0.0.0.0:*                           -
udp        0      0 0.0.0.0:631             0.0.0.0:*                           -
udp        0      0 0.0.0.0:50923           0.0.0.0:*                           -
udp        0      0 127.0.1.1:53            0.0.0.0:*                           -
udp        0      0 0.0.0.0:68              0.0.0.0:*                           -
udp6       0      0 :::5353                 :::*                                -
udp6       0      0 127.0.0.1:59017         127.0.0.1:14560         ESTABLISHED 2171/java
udp6       0      0 127.0.0.1:56985         127.0.0.1:14550         ESTABLISHED 2171/java
udp6       0      0 :::57192                :::*                                -


Procedemos a ejecutar QGroundControl sobre el dispositivo cliente y a validar la conexion con la simulacion.

./QGroundControl.AppImage

Para este caso, realizamos la prueba desde el PC con Debian sid y QgroundControl en su version dailyBuild.
gcsRemotoJMAVsim

Demostracion

Sobre el siguiente video, se puede evidenciar como QGroundControl se ejecuta de manera Remota sobre otro dispositivo diferente al de Desarrollo donde corremos actualmente la simulacion

Referencias:
https://dev.px4.io/en/simulation/jmavsim.html