From 5565f8c4571bf83f2e157c187962bdca9d198369 Mon Sep 17 00:00:00 2001 From: Gautier Hattenberger Date: Wed, 25 Mar 2015 14:29:09 +0100 Subject: [PATCH] [parrot] improve/fix tools to grab video on parrot UAVs --- .../modules/computer_vision/viewvideo.c | 8 ++- sw/tools/parrot/ardrone2/start_mplayer.sh | 8 +-- sw/tools/parrot/bebop.py | 10 ++-- sw/tools/parrot/bebop/dump_images.sh | 20 ++++++++ sw/tools/parrot/bebop/start_avplay.sh | 21 ++++++++ sw/tools/parrot/bebop/start_mplayer.sh | 50 +++++++++++++++++++ 6 files changed, 107 insertions(+), 10 deletions(-) create mode 100755 sw/tools/parrot/bebop/dump_images.sh create mode 100755 sw/tools/parrot/bebop/start_avplay.sh create mode 100755 sw/tools/parrot/bebop/start_mplayer.sh diff --git a/sw/airborne/modules/computer_vision/viewvideo.c b/sw/airborne/modules/computer_vision/viewvideo.c index 85ebd24e3e..85c276b419 100644 --- a/sw/airborne/modules/computer_vision/viewvideo.c +++ b/sw/airborne/modules/computer_vision/viewvideo.c @@ -81,6 +81,12 @@ PRINT_CONFIG_VAR(VIEWVIDEO_DOWNSIZE_FACTOR); #endif PRINT_CONFIG_VAR(VIEWVIDEO_QUALITY_FACTOR); +// RTP time increment at 90kHz (default: 0 for automatic) +#ifndef VIEWVIDEO_RTP_TIME_INC +#define VIEWVIDEO_RTP_TIME_INC 0 +#endif +PRINT_CONFIG_VAR(VIEWVIDEO_RTP_TIME_INC); + // Frames Per Seconds #ifndef VIEWVIDEO_FPS #define VIEWVIDEO_FPS 4 @@ -251,7 +257,7 @@ static void *viewvideo_thread(void *data __attribute__((unused))) 0, // Format 422 VIEWVIDEO_QUALITY_FACTOR, // Jpeg-Quality 0, // DRI Header - 0 // 90kHz time increment + VIEWVIDEO_RTP_TIME_INC // 90kHz time increment ); // Extra note: when the time increment is set to 0, // it is automaticaly calculated by the send_rtp_frame function diff --git a/sw/tools/parrot/ardrone2/start_mplayer.sh b/sw/tools/parrot/ardrone2/start_mplayer.sh index fa3c09a22e..f6f8c2704e 100755 --- a/sw/tools/parrot/ardrone2/start_mplayer.sh +++ b/sw/tools/parrot/ardrone2/start_mplayer.sh @@ -18,7 +18,7 @@ pid=0 function quit { echo "Stop video" - if [ $pid > 0 ] + if [ "$pid" -gt 0 ] then kill -9 $pid fi @@ -30,9 +30,9 @@ trap quit SIGINT # fetch sdp file on the ARDrone mkdir -p $SDP_DIR/$ADDR -../ardrone2.py --host=$ADDR download_file $SDP_DIR/$ADDR/x86_config-mjpeg.sdp sdp +../ardrone2.py --host=$ADDR download_file $SDP_DIR/$ADDR/stream.sdp images -if [ ! -f $SDP_DIR/$ADDR/x86_config-mjpeg.sdp ]; +if [ ! -f $SDP_DIR/$ADDR/stream.sdp ]; then echo "Unable to download sdp file from $ADDR" exit 0 @@ -42,7 +42,7 @@ fi echo "Start video" while [ 1 ] do - /usr/bin/mplayer -really-quiet $SDP_DIR/$ADDR/x86_config-mjpeg.sdp& + /usr/bin/mplayer -really-quiet $SDP_DIR/$ADDR/stream.sdp& pid=$! wait $pid echo "Restart video" diff --git a/sw/tools/parrot/bebop.py b/sw/tools/parrot/bebop.py index c10f364eec..ff86b8d813 100755 --- a/sw/tools/parrot/bebop.py +++ b/sw/tools/parrot/bebop.py @@ -75,15 +75,15 @@ subparser_upload_and_run.add_argument('file', help='Filename of an executable') subparser_upload_and_run.add_argument('folder', help='Destination subfolder (raw or sdk for Paparazzi autopilot)') subparser_upload = subparsers.add_parser('upload_file', help='Upload a file to the Bebop') subparser_upload.add_argument('file', help='Filename') -subparser_upload.add_argument('folder', help='Destination subfolder (base destination folder is /data/video)') +subparser_upload.add_argument('folder', help='Destination subfolder (base destination folder is /data/ftp)') subparser_download = subparsers.add_parser('download_file', help='Download a file from the Bebop') subparser_download.add_argument('file', help='Filename (with the path on the local machine)') -subparser_download.add_argument('folder', help='Remote subfolder (base folder is /data/video)') +subparser_download.add_argument('folder', help='Remote subfolder (base folder is /data/ftp)') subparser_download_dir = subparsers.add_parser('download_dir', help='Download all files from a folder from the Bebop') subparser_download_dir.add_argument('dest', help='destination folder (on the local machine)') -subparser_download_dir.add_argument('folder', help='Remote subfolder (base folder is /data/video)') +subparser_download_dir.add_argument('folder', help='Remote subfolder (base folder is /data/ftp)') subparser_rm_dir = subparsers.add_parser('rm_dir', help='Remove a directory and all its files from the Bebop') -subparser_rm_dir.add_argument('folder', help='Remote subfolder (base folder is /data/video)') +subparser_rm_dir.add_argument('folder', help='Remote subfolder (base folder is /data/ftp)') subparser_insmod = subparsers.add_parser('insmod', help='Upload and insert kernel module') subparser_insmod.add_argument('file', help='Filename of *.ko kernel module') subparser_start = subparsers.add_parser('start', help='Start a program on the Bebop') @@ -143,7 +143,7 @@ elif args.command == 'upload_file': f = parrot_utils.split_into_path_and_file(args.file) parrot_utils.execute_command(tn, "mkdir -p /data/ftp/" + args.folder) - print('Uploading \'' + f[1] + "\' from " + f[0] + " to /data/video/" + args.folder) + print('Uploading \'' + f[1] + "\' from " + f[0] + " to /data/ftp/" + args.folder) parrot_utils.uploadfile(ftp, args.folder + "/" + f[1], file(args.file, "rb")) print("#pragma message: Upload of " + f[1] + " to Bebop Succes!") diff --git a/sw/tools/parrot/bebop/dump_images.sh b/sw/tools/parrot/bebop/dump_images.sh new file mode 100755 index 0000000000..5c09ca4fd7 --- /dev/null +++ b/sw/tools/parrot/bebop/dump_images.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# base address for Bebop +ADDR_BASE=192.168.42.1 + +# tmp folder for images files (relative path by default) +IMAGES_DIR=${PAPARAZZI_HOME=../../../..}/var/images_tmp + +# test if a complete IP address is passed as first argument +if [ `grep -c '\.' <<< $1` == 1 ] +then + ADDR=$1 +else + ADDR=$ADDR_BASE +fi + +# download images folder from ARDrone +mkdir -p $IMAGES_DIR/$ADDR +../ardrone2.py --host=$ADDR download_dir $IMAGES_DIR/$ADDR images + diff --git a/sw/tools/parrot/bebop/start_avplay.sh b/sw/tools/parrot/bebop/start_avplay.sh new file mode 100755 index 0000000000..49c3266a23 --- /dev/null +++ b/sw/tools/parrot/bebop/start_avplay.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# base address for Bebop +ADDR_BASE=192.168.42.1 +PORT_BASE=5000 + +# test if a complete IP address is passed as first argument +if [ `grep -c '\.' <<< $1` == 1 ] +then + ADDR=$1 + PORT=$2 +else + ADDR=$ADDR_BASE + PORT=$PORT_BASE +fi + +pid=0 + +echo "Start video for $ADDR on port $PORT" +/usr/bin/avplay -loglevel quiet -max_delay 50 -fflags nobuffer rtp://$ADDR:$PORT + diff --git a/sw/tools/parrot/bebop/start_mplayer.sh b/sw/tools/parrot/bebop/start_mplayer.sh new file mode 100755 index 0000000000..1f858632dd --- /dev/null +++ b/sw/tools/parrot/bebop/start_mplayer.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# base address for Bebop +ADDR_BASE=192.168.42.1 + +# tmp folder for sdp files (relative path by default) +SDP_DIR=${PAPARAZZI_HOME=../../../..}/var/sdp_tmp + +# test if a complete IP address is passed as first argument +if [ `grep -c '\.' <<< $1` == 1 ] +then + ADDR=$1 +else + ADDR=$ADDR_BASE +fi + +pid=0 + +function quit { + echo "Stop video" + if [ "$pid" -gt 0 ] + then + kill -9 $pid + fi + exit 0 +} + +# trap control+c to stop mplayer +trap quit SIGINT + +# fetch sdp file on the ARDrone +mkdir -p $SDP_DIR/$ADDR +../bebop.py --host=$ADDR download_file $SDP_DIR/$ADDR/stream.sdp internal_000/images + +if [ ! -f $SDP_DIR/$ADDR/stream.sdp ]; +then + echo "Unable to download sdp file from $ADDR" + exit 0 +fi + +# start mplayer and respawn if needed +echo "Start video" +while [ 1 ] +do + /usr/bin/mplayer -really-quiet $SDP_DIR/$ADDR/stream.sdp& + pid=$! + wait $pid + echo "Restart video" +done +