The goal of this project was to design a UAV system that could autonomously locate a radio beacon. The motivation for this system came from the fact that one of the other projects in our club was developing rockets. These rockets had no positional control, so if wind or other inflight mishaps occurred, then the rockets could potentially land a few miles from the initial launch site. If the parachute systems failed to deploy, then the landing would be rapid and location of the rocket could be difficult. Thus, I decided to develop a UAV system that could locate a landed rocket using an internal radio beacon. This project was also used to push forward the development of autonomous UAV flight via a distinct end goal and sensor readings.
The main hardware that I used to drive this project were Frsky XM+ receiver modules as well as a Frsky XJT transmitter module. The transmitter would be placed in the rocket, and the XM+ receivers would be bound to the transmitter prior to the launch of the rocket. Thus, simply by powering both the transmitter and receiver, the Frsky receivers would generate an RSSI value based on the signal strength. If a directional antenna was used on the receiver, then a directional RSSI value could be obtained. Theoretically, by following the highest RSSI values the beacon could be located. This was the top-down theory that the rocket location project relied on.
The first issue that I encountered was that RSSI does not directly correlate to distance. RSSI is the Receiver Signal Strength Indicator which essentially measures the received power in dB and converts that to a value relative to the expected maximum transmission power. There are no entirely proven mathematical models to convert RSSI or the received signal power to distance. Similarly, the UAV solution needed to be robust; it needed to function in different humidity levels, along terrain with complex geometry, and at different temperatures, all of which could skew the RSSI readings in different ways. As a result, the method of direct triangulation via positions and distance vectors was not possible for this project.
Instead of triangulation, a particle filtering method was first used. The theory with the particle filtering was to sample the RSSI in multiple directions at a point and generate the angular probabilities of the beacon being in each direction based on all of the RSSI readings. Then the UAV would travel to a new position, take another set of readings and generate another set of angular probabilities, but these new probabilities and position would be overlaid on top the all previous measurements. Thus, from sets of angular probabilities, a map of 2 dimensional positional probabilities were generated. The particle filtering aspect of the algorithm came from how to determine the next sampling position. When the algorithm starts, the maximum search area needs to be specified, thus generating a finite number of discrete locations that were represented by the 2-D positional probability map. After each sample, 100 “particles” were allocated. Each particle chose random integers for x and y coordinates corresponding to a location in the 2-D positional probability map. Each particle then chose a random float from 0 to 1. If the chosen float was below the value of the probability at the chosen positional probability map location, then that specific particle would save the location. If the chosen float was above, then a new set of random coordinated were chosen. This repeated for all 100 particles. Then, the coordinates of all the particles would be averaged and converted back into a latitude and longitude to send the UAV to the next location. This method was not too computationally intensive and it ensured that a new unique sampling position would be chosen every time regardless of where the UAV started.
Prototype Circuit for Radio Receiver Control with a Mux
Single Antenna on the Octocopter
The right figure above shows the full mounted single antenna prototype. On the octocopter, a Pixhawk 4 flight controller was used with an Nvidia Jetson Nano to facilitate autonomous flight. An Arduino Nano was used to communicate to the XM+ and read the RSSI data continuously (UART). The Jetson Nano was connected to the Arduino via I2C and would prompt over I2C whenever it wanted to receive the RSSI results from the Arduino. The first prototype I built only used one receiver. It carried out the sampling by turning the UAV by a set degree to get multiple directions at a specific point. The single antenna prototype accurately generated the probability map and was able locate test beacons. The main drawback of the single antenna design was that it took a while to sample at all of the different degrees (the UAV took a while to turn at each waypoint). To speed up the sampling, I developed a multi-receiver array.
The left figure above shows my prototype circuit that used an Arduino, a multiplexer, and 4 XM+ receivers. Each XM+ was had their UART TX output connected to the inputs of the analog multiplexer. The multiplexer output was connected to the UART RX of the Arduino since the XM+’s were constantly just transmitting their channel data over UART. This allowed the Arduino to rapidly sample the RSSI of each XM+ while only using one UART connection. I needed to flash the XM+’s with specific D8 firmware that was provided by Frsky. XM+ receivers come stock with D16 protocol firmware from Frsky which among other things, uses a hash to ensure that only one receiver can be bound to a transmitter at a time. A phenomenon I witnessed while configuring tiny whoops for our Quad Camp Project, was that multiple D8 protocol receivers could simultaneously be bound to the same transmitter, each generating its own RSSI value. Thus, each XM+ was configured with D8 protocol firmware and was bound to the XJT transmitter module.
Antenna Array Assembly Front
Antenna Array Assembly Top
2.4 GHz Antenna Array Design
The figures above show the completed antenna array prototype. It consisted of two halves of 4 with a total of 8 XM+ receivers each with a directional antenna. The multi-antenna array was mounted using the same rail system as the single antenna. Everything was powered by the 5v buck converter that I designed and was completed around the same time as the antenna array.
Pre-flight Checking the Tarot 1000
Mounted Array on a Modified Tarot 1000 Octocopter
Top View of the Antenna Array
The figures above show the antenna array mounted on the tarot 1000 octocopter. The same tests were redone. The particle filtering algorithm again worked well, but was expectedly faster as with the array because the drone did not need to turn.
For a comparison, a ‘greedy’ search algorithm was also developed. In this algorithm, the UAV simply moved towards the direction that had the highest RSSI value after sampling. This method worked for the most part, but did not function correctly when the beacon was placed neat large structures that could reflect the RF signal. Thus, the greedy algorithm traversed in the incorrect direction or else was stuck in perpetual loops between a set of few points due to this multipath propogation.
This project taught me a lot about signal processing, RF, and robot pathing. It helped me better understand how to use the Python library Dronekit to control a Pixhawk UAV for autonomous flight. It taught me some RF phenomenon and allowed me to explore some interesting uses of multiplexers and multi-microcontroller communications. In the future, I might continue this project and extend it to swarm applications where multiple UAVs have antenna arrays and together search to locate radio beacons.