wiki:HardWare/MobileNode/startup_script

Initial startup script to configure WiFi and MAVProxy

/etc/rc.local is almost the last script called at boot up of Ubuntu. We use this script to do our init.
NOTE: exit 0 is a mandatory statement added in the end.

#!/bin/bash
/usr/bin/wireless_card_startup.sh
/usr/bin/mav_wrapper.py /etc/mavproxy_config
/usr/bin/drone_app_wrapper.py /etc/drone_app_cmd
exit 0

There are several startup scripts, one for the wireless card and the other is for mavproxy. The scripts are explained as follows:

Wireless Card

The wireless card used is TL-WN7200ND and its plug and play with Ubuntu 12.04 LTS. If you are not using Ubuntu OS, it is recommended that you have the ath9k_htc driver for the wireless card to work.

The script /usr/bin/wireless_card_startup.sh configures the wireless card as follows:

#!/bin/bash
ifconfig wlan0 down
iwconfig wlan0 mode Ad-Hoc freq 2.412G ap 22:22:22:22:22:22
iwconfig wlan0 essid centMeshAir
ifconfig wlan0 152.14.189.16/24

MAVProxy

mavwrapper.py is a wrapper python routine to start MAVProxy with appropriate arguments and also enables MAVProxy to store logs instead of overwriting them. It takes a config file /etc/mavproxy_config as its input.

Config file (/etc/mavproxy_config)

mav_log: 81

Script (/usr/bin/mav_wrapper.py)

#!/usr/bin/python
import os
import re
import sys
from tempfile import mkstemp
from shutil import move

"""
This script acts as a wrapper for invoking mavproxy. It performs two key functions:
1) Read the value stored in a configuration file, increment the value by 1 and use that for logging. We need this as the BBBK has no concept of date.
2) Start the mavproxy with a list of IP addresses (read from another file) as --out.
"""

# This variable is used if any of the file handling functionality fails. So we skip that value when actually using it.
error_handle_value = 1357
value_for_logging = 0
aircraft_name = "garuda"

"""
This function performs the process of incrementing the given value by 1 and returning it.
Before that, it performs a check to see if that value is already used. If it is, then the change
is made accordingly.
"""
def val_to_be_used(int_value_from_file):
    global error_handle_value
    # TODO: Perform additional checking
    int_value_from_file += 1
    if int_value_from_file == error_handle_value:
	int_value_from_file += 1
    return int_value_from_file

"""main() function"""
def main():
    global error_handle_value
    global value_for_logging
    global aircraft_name

    if len(sys.argv) != 2:
	print len(sys.argv)
    else:
    	print sys.argv[1]

    file_handle = ""

    # Open the file name for reading
    try:
    	file_handle = open (sys.argv[1],'r')
        # Read file contents
    	file_contents = file_handle.read()
    	# Get the value corresponding to mav_log
	search_log_value_in_file = re.search(r'mav_log:\s+(.+)',file_contents)
	if not search_log_value_in_file:
	    print "No value found, using a predefined value of %d" % error_handle_value
	    if file_handle:
		file_handle.close()
	    output_file_for_writing = open('/etc/mavproxy_config','w')
	    output_file_for_writing.write ('mav_log: '+str(error_handle_value))
	    output_file_for_writing.close()
	else:
	    value_from_file_as_string = search_log_value_in_file.group(1)
	    int_value_from_file = int(value_from_file_as_string)
	    print "Value found: %s" % int_value_from_file
    
	    # This is the value from the file, calculate the value to be used 
            # after necessary checks
	    value_for_logging = val_to_be_used(int_value_from_file)
	    print "Value after modification is %d " % value_for_logging
	    #Since we have already performed a 'read()' once , rewind
	    file_handle.seek(0)
	    # Write the updated value to the file
	    fh, abs_path = mkstemp()
	    output_file_for_writing = open(abs_path,"w")
	    for line in file_handle:
		new_line = re.sub(r'mav_log:\s+(.+)','mav_log: '+str(value_for_logging),line)
		output_file_for_writing.write(new_line)
	    if file_handle:
		file_handle.close()
	    if output_file_for_writing:
		output_file_for_writing.close()
	    move(abs_path, sys.argv[1])

    except:
    	print "File open exception, using a predefined value of %d" % error_handle_value
	value_for_logging = error_handle_value
	if file_handle:
	    file_handle.close()
	output_file_for_writing = open('/etc/mavproxy_config','w')
	output_file_for_writing.write ('mav_log: '+str(value_for_logging))
	output_file_for_writing.close()
    

    # TODO: This is hardcoded for now, change this to read from a file with the list of 
    # IP addresses and ports which will be used as --out=<IP>:<port>
    aircraft_name_for_logging = aircraft_name + "_" + str(value_for_logging)
    command_to_be_used_for_mavproxy = 'screen -S garuda -s /bin/bash -d -m /usr/local/bin/mavproxy.py --aircraft="'+aircraft_name_for_logging+'"  --master=/dev/ttyACM0 --out=152.14.189.18:14550 --out=152.14.189.15:14550 --out=152.14.189.20:14550 --out=localhost:12345'
    print command_to_be_used_for_mavproxy
    # Start mavproxy 
    os.system (command_to_be_used_for_mavproxy)

if __name__ == '__main__':
    main()

DroneAppWrapper

This script is located in /usr/bin/drone_app_wrapper.py

#!/usr/bin/python
import os
import re
import sys

"""
This script acts as a wrapper for invoking the drone application. It performs 
two key functions:
1) Read the command of the sample application that needs to be executed
2) Invoke the drone application in a screen session
"""

# Default location where the command for the drone application is stored.
# This is used if no argument is provided to this script.
default_location = "/etc/drone_app_cmd"

# Default command that will be run in case of any error reading the drone
# app command
default_cmd = "/usr/bin/application_code/sample_prog_mavutil/program_ss2/mcp_ss2.py 152.14.189.255 7889 7890"

"""main() function"""
def main():
    global default_location
    global default_cmd
    file_location = None
    command_to_be_used_for_drone_app = None

    if len(sys.argv) != 2:
        print "File name not specified, using default location"
        file_location = default_location
    else:
        print sys.argv[1]
        file_location = sys.argv[1]

    file_handle = None

    # Open the file name for reading
    try:
        file_handle = open (file_location,'r')
        # Read file contents
        file_contents = file_handle.read()
        # Get the value corresponding to command
        search_command_in_file = re.search(r'command:\s+(.+)',file_contents)
        if not search_command_in_file:
            print "No command found, using the default command"
            if file_handle:
                file_handle.close()
            command_to_be_used_for_drone_app = default_cmd
        else:
            command_to_be_used_for_drone_app = search_command_in_file.group(1)
            print "Value found: %s" % command_to_be_used_for_drone_app
    
    except:
        print "File open exception, using %s as command" % default_location
        command_to_be_used_for_drone_app = default_cmd
        if file_handle:
            file_handle.close()
    
    command_to_run = 'screen -S drone_app -s /bin/bash -d -m '+command_to_be_used_for_drone_app+''
    print command_to_run
    # Start drone_app 
    os.system (command_to_run)

if __name__ == '__main__':
    main()

Drone Application Command

This file is located in /etc/drone_app_cmd

command: /usr/bin/application_code/sample_prog_mavutil/program_ss3/mcp_ss3.py 152.14.189.255 7889 7890
Last modified 17 months ago Last modified on Jul 4, 2014, 1:03:11 PM