[parrot] improve bebop scripts

old shell scripts are removed and replaced by python script similar to
ardrone2
it is possible to
- install and remove the autostart and network scripts
- configure autostart mode
- configure network to join a wifi router
- it is no longer need to modify the pprz.conf file before sending it to
  the drone
- the security options (AMODE) are not handled yet
This commit is contained in:
Gautier Hattenberger
2019-07-09 19:01:58 +02:00
committed by Freek van Tienen
parent 48e7b20789
commit 7e1fc732be
11 changed files with 200 additions and 83 deletions
+182 -3
View File
@@ -23,18 +23,113 @@
from __future__ import print_function
from parrot_utils import ParrotUtils
import re
import argparse
from time import sleep
class Bebop(ParrotUtils):
uav_name = 'Bebop'
address = '192.168.42.1'
version_file = '/version.txt'
upload_path = '/data/ftp/'
scripts_path = 'internal_000/scripts/'
config_file = upload_path + scripts_path + 'pprz.conf'
check_version_before_run = True
update_time_before_run = True
# Read from config file
def read_from_config(self, name):
self.config_content = self.execute_command('cat ' + self.config_file)
# Search for the name
search = re.search(name + '=([^\r\n\t ]+)',self.config_content)
if search is None:
return 'Unknown'
else:
return search.group(1)
# Write to config
def write_to_config(self, name, value):
if self.read_from_config(name) == 'Unknown':
self.execute_command('echo "' + name + '=' + value + '\" >> ' + self.config_file)
else:
self.execute_command('sed -i "s/\(' + name + ' *= *\).*/\\1' + value + '/g" ' + self.config_file)
def uav_status(self):
print('Parrot version:\t\t' + str(self.check_version()))
join = {'Unknown': 'No', '0': 'No', '1': 'Yes'}
print('Join Wifi:\t\t' + self.read_from_config('JOIN_WIFI'))
print('Network id:\t\t' + self.read_from_config('WIFI_SSID'))
mode = {'0': 'Master', '1': 'Managed'}
print('Wifi Amode:\t\t' + self.read_from_config('WIFI_AMODE'))
print('Currently running:\t' + self.check_running())
autorun = {'Unknown': 'Native (autorun not installed)', '0': 'Native', '1': 'Paparazzi'}
print('Autorun at start:\t'+autorun[self.read_from_config('START_PPRZ')])
def bebop_install_scripts(self):
print('Installing Paparazzi scripts')
self.upload_file('bebop/pprz.conf', self.scripts_path, kill_prog=False)
self.upload_file('bebop/config_network.script', self.scripts_path, kill_prog=False)
self.upload_file('bebop/button_switch', self.scripts_path, kill_prog=False)
self.upload_file('bebop/pprzstarter', self.scripts_path, kill_prog=False)
self.execute_command("mount -o remount,rw /")
self.execute_command("sed -i 's|^exit 0|/data/ftp/internal_000/scripts/pprzstarter \& exit 0|' /etc/init.d/rcS")
self.execute_command("chmod a+x /etc/init.d/rcS")
self.execute_command("chmod a+x /data/ftp/internal_000/scripts/pprzstarter")
self.execute_command("chmod a+x /data/ftp/internal_000/scripts/button_switch")
self.execute_command("chmod a+x /data/ftp/internal_000/scripts/config_network.script")
self.execute_command("dos2unix /data/ftp/internal_000/scripts/pprzstarter")
self.execute_command("dos2unix /data/ftp/internal_000/scripts/button_switch")
self.execute_command("dos2unix /data/ftp/internal_000/scripts/pprz.conf")
self.execute_command("cp /bin/onoffbutton/shortpress_3.sh /bin/onoffbutton/shortpress_3.sh.backup")
self.execute_command("echo '#!/bin/sh' > /bin/onoffbutton/shortpress_3.sh")
self.execute_command("echo '' >> /bin/onoffbutton/shortpress_3.sh")
self.execute_command("echo '/data/ftp/internal_000/scripts/button_switch' >> /bin/onoffbutton/shortpress_3.sh")
def bebop_uninstall_scripts(self):
print('Uninstalling Paparazzi scripts')
self.execute_command("mount -o remount,rw /")
self.execute_command("sed -i 's|^/data/ftp/internal_000/scripts/pprzstarter \& exit 0|exit 0|' /etc/init.d/rcS")
self.execute_command("chmod a+x /etc/init.d/rcS")
self.execute_command("mv /bin/onoffbutton/shortpress_3.sh.backup /bin/onoffbutton/shortpress_3.sh")
self.execute_command("rm -rf /data/ftp/internal_000/scripts/*")
def check_autoboot(self):
pprzstarter = self.execute_command('grep "pprzstarter" /etc/init.d/rcS')
if "pprzstarter" in pprzstarter:
return True
else:
return False
def bebop_set_ssid(self, name):
'''
Set network SSID (of the router to join, not the Bebop SSID in master mode)
'''
self.write_to_config('WIFI_SSID', name)
print('The network ID (SSID) to be joined is changed to ' + name)
def bebop_set_wifi_mode(self, mode):
'''
Set Wifi mode, master or managed
'''
mode_id = { 'master': '0', 'managed': '1' }
self.write_to_config('JOIN_WIFI', mode_id[mode])
print('The Wifi mode is now ' + mode)
def bebop_shutdown(self):
'''
Proper bebop shutdown
'''
print("Shuting down Bebop (restart by hand if needed)")
self.execute_command('/bin/ardrone3_shutdown.sh', timeout=1)
def reboot(self):
'''
Custom reboot, in fact a proper shutdown as simple reboot seems too brutal
Restart has to be done by hand
'''
self.bebop_shutdown()
def init_extra_parser(self):
# Parse the extra arguments
@@ -43,10 +138,94 @@ class Bebop(ParrotUtils):
self.parser.add_argument('--max_version', metavar='MAX', default='4.4.2',
help='force maximum version allowed')
def parse_extra_args(self, args):
# nothing here
pass
ss = self.subparsers.add_parser('networkid', help='Set the network ID (SSID) to join in managed mode')
ss.add_argument('name', help='The new network ID (SSID)')
ss = self.subparsers.add_parser('wifimode', help='Set the Wifi mode the Bebop 1 or 2')
ss.add_argument('mode', help='The new Wifi mode', choices=['master', 'managed'])
ss = self.subparsers.add_parser('configure_network', help='Configure the network on the Bebop 1 or 2')
ss.add_argument('name', help='The network ID (SSID) to join in managed mode')
ss.add_argument('mode', help='The new Wifi mode', choices=['master', 'managed'])
ss = self.subparsers.add_parser('install_autostart', help='Install custom autostart script and set what to start on boot for the Bebop 1 or 2')
ss.add_argument('type', choices=['native', 'paparazzi'],
help='what to start on boot')
ss = self.subparsers.add_parser('autostart', help='Set what to start on boot for the Bebop 1 or 2')
ss.add_argument('type', choices=['native', 'paparazzi'],
help='what to start on boot')
ss = self.subparsers.add_parser('uninstall_autostart', help='Remove custom autostart scripts')
def parse_extra_args(self, args):
# Change the network ID
if args.command == 'networkid':
self.bebop_set_ssid(args.name)
if raw_input("Shall I restart the Bebop? (y/N) ").lower() == 'y':
self.reboot()
# Change the wifi mode
elif args.command == 'wifimode':
self.bebop_set_wifi_mode(args.mode)
if raw_input("Shall I restart the Bebop? (y/N) ").lower() == 'y':
self.reboot()
# Install and configure network
elif args.command == 'configure_network':
print('=== Current network setup ===')
self.uav_status()
print('=============================')
if self.check_autoboot():
print('Custom autostart (and network) script already installed')
if raw_input("Shall I reinstall the autostart (and network) script (y/N) ").lower() == 'y':
self.bebop_install_scripts()
else:
print('Custom autostart (and network) script is required but is not installed')
if raw_input("Shall I reinstall the autostart (and network) script (y/N) ").lower() == 'y':
self.bebop_install_scripts()
else:
print('Scripts not installed, Leaving.')
return
sleep(0.5)
self.bebop_set_ssid(args.name)
self.bebop_set_wifi_mode(args.mode)
sleep(0.5)
print('== New network setup after boot ==')
self.uav_status()
print('==================================')
if raw_input("Shall I restart the Bebop? (y/N) ").lower() == 'y':
self.reboot()
# Install and configure autostart
elif args.command == 'install_autostart':
if self.check_autoboot():
print('Custom autostart script already installed')
if raw_input("Shall I reinstall the autostart script (y/N) ").lower() == 'y':
self.bebop_install_scripts()
else:
self.bebop_install_scripts()
autorun = {'native': '0', 'paparazzi': '1'}
self.write_to_config('START_PPRZ', autorun[args.type])
print('The autostart on boot is changed to ' + args.type)
if raw_input("Shall I restart the ARDrone 2? (y/N) ").lower() == 'y':
self.reboot()
# Change the autostart
elif args.command == 'autostart':
autorun = {'native': '0', 'paparazzi': '1'}
self.write_to_config('START_PPRZ', autorun[args.type])
print('The autostart on boot is changed to ' + args.type)
# Uninstall autostart
elif args.command == 'uninstall_autostart':
if self.check_autoboot():
self.bebop_uninstall_scripts()
else:
print("Autostart script not found")
if __name__ == "__main__":
bebop = Bebop()
@@ -3,8 +3,8 @@
BLDC_Test_Bench -n -M 1
if [ $(bcmwl ap) -eq 1 ]
then
if [ -r /data/ftp/internal_000/scripts/connect2hub ]; then
/data/ftp/internal_000/scripts/connect2hub
if [ -r /data/ftp/internal_000/scripts/pprzstarter ]; then
/data/ftp/internal_000/scripts/pprzstarter
else
echo "Button activating..." | ulogger -t "ShortPressDebug" -p I
/bin/usbnetwork.sh
+8
View File
@@ -0,0 +1,8 @@
[Default config file for PPRZ init script ]
[Starts Paparazzi with Bebop as Wifi hotspot]
START_PPRZ=1
START_TELNET=1
START_ADB=1
JOIN_WIFI=0
WIFI_SSID=pprz
WIFI_AMODE=none
@@ -1,21 +0,0 @@
# Description
These scripts can be used to connect Bebop 2 drones to a Wi-Fi router, so that (for instance) they may be used in a swarm via a central hub.
The drone will then function as follows:
Upon starting up, it will search for the router. If the router is found, it will connect to it.
If the router is not found within a specific time, the drone will become the access point, as "normal".
The "4 button press" will also be removed, so this will not have to be done before loading Paparazzi on the drone.
# How to set it up
To connect the Bebop 2 to a router:
1. Open pprz_swarmhub.conf
2. Write the name of the router after WIFI_SSID
3. Start up the Bebop2 and connect to it normally with your computer's WiFi
4. Start up the router
5. Run connect2ssid.sh
6. The Bebop2 should now turn off and connect to the router. To check that this happened, you can connect to the router and try to ping to it/see all connections.
7. Add to the airframe file of the bebop, in the ap target, the following lines:
~~~~
<configure name="HOST" value="192.168.42.$(AC_ID)" />
<configure name="MODEM_HOST" value="192.168.42.40" />
~~~~
@@ -1,16 +0,0 @@
#!/bin/bash
if [ -z "$1" ]
then
IP="192.168.42.1"
echo "No drone ID specified, using ($IP)"
else
IP="$1"
echo "Drone ID specified, using ($IP)"
fi
wput -nc -u ./pprz_swarmhub.conf ftp://$IP/internal_000/scripts/pprz.conf
wput -nc -u ./scripts/config_network.script ftp://$IP/internal_000/scripts/config_network.script
wput -nc -u ./scripts/button_switch ftp://$IP/internal_000/scripts/button_switch
wput -nc -u ./scripts/connect2hub ftp://$IP/internal_000/scripts/connect2hub
{ echo "mount -o remount,rw /"; echo "sed -i 's|^exit 0|/data/ftp/internal_000/scripts/connect2hub \& exit 0|' /etc/init.d/rcS"; echo "chmod a+x /etc/init.d/rcS"; echo "chmod a+x /data/ftp/internal_000/scripts/connect2hub"; echo "chmod a+x /data/ftp/internal_000/scripts/button_switch"; echo "chmod a+x /data/ftp/internal_000/scripts/config_network.script"; echo "dos2unix /data/ftp/internal_000/scripts/button_switch"; echo "dos2unix /data/ftp/internal_000/scripts/connect2hub"; echo "dos2unix /data/ftp/internal_000/scripts/pprz.conf"; echo "echo '#!/bin/sh' > /bin/onoffbutton/shortpress_3.sh"; echo "echo '' >> /bin/onoffbutton/shortpress_3.sh"; echo "echo '/data/ftp/internal_000/scripts/button_switch' >> /bin/onoffbutton/shortpress_3.sh"; echo "/sbin/reboot"; sleep 10; } | telnet $IP
@@ -1,7 +0,0 @@
# Config file for PPRZ init script
START_PPRZ=1
START_TELNET=1
START_ADB=1
JOIN_WIFI=1
WIFI_SSID=linksys388
WIFI_AMODE=none
@@ -1,12 +0,0 @@
#!/bin/bash
if [ -z "$1" ]
then
IP="192.168.42.1"
echo "No drone ID specified, using ($IP)"
else
IP="$1"
echo "Drone ID specified, using ($IP)"
fi
{ echo "mount -o remount,rw /"; echo "sed -i 's|^/data/ftp/internal_000/scripts/connect2hub \& exit 0|exit 0|' /etc/init.d/rcS"; echo "chmod a+x /etc/init.d/rcS"; echo "/sbin/reboot"; sleep 10; } | telnet $IP
@@ -1,15 +0,0 @@
#!/bin/bash
if [ -z "$1" ]
then
IP="192.168.42.1"
echo "No drone ID specified, using ($IP)"
else
IP="$1"
echo "Drone ID specified, using ($IP)"
fi
wput -u ./pprz_swarmhub.conf ftp://$IP/internal_000/scripts/pprz.conf
wput -u ./scripts/config_network.script ftp://$IP/internal_000/scripts/config_network.script
wput -u ./scripts/connect2hub ftp://$IP/internal_000/scripts/connect2hub
{ echo "mount -o remount,rw /"; echo "sed -i 's|^exit 0|/data/ftp/internal_000/scripts/connect2hub \& exit 0|' /etc/init.d/rcS"; echo "chmod a+x /etc/init.d/rcS"; echo "chmod a+x /data/ftp/internal_000/scripts/connect2hub"; echo "chmod a+x /data/ftp/internal_000/scripts/config_network.script"; echo "dos2unix /data/ftp/internal_000/scripts/pprz.conf"; echo "/sbin/reboot"; sleep 10; } | telnet $IP
+8 -7
View File
@@ -122,9 +122,9 @@ class ParrotUtils:
self.ftp.close()
# Execute a command
def execute_command(self, command):
def execute_command(self, command, timeout=5):
self.tn.write(bytes(command + '\n', 'utf-8'))
s = self.tn.read_until(bytes(self.prompt, 'utf-8'))
s = self.tn.read_until(bytes(self.prompt, 'utf-8'), timeout)
if s.endswith(b'[JS] $ '):
s = s[len(command) + 2:-8]
elif s.endswith(b'[RS.edu] $ '):
@@ -229,7 +229,7 @@ class ParrotUtils:
# Reboot the drone
def reboot(self):
self.execute_command('reboot')
self.execute_command('reboot', timeout=1)
print('The ' + self.uav_name + ' is now rebooting')
# Kill a running program
@@ -254,12 +254,13 @@ class ParrotUtils:
print('Removed directory "' + name + '"')
# Upload a new file
def upload_file(self, name, folder=""):
def upload_file(self, name, folder="", kill_prog=True):
f = self.split_into_path_and_file(name)
# First kill the running program
self.kill_program(f[1])
sleep(1)
if kill_prog:
# First kill the running program
self.kill_program(f[1])
sleep(1)
# Make the upload directory and upload the file
self.create_directory(self.upload_path + folder)