Difference between revisions of "Project gps"

From MAE/ECE 148 - Introduction to Autonomous Vehicles
Jump to navigation Jump to search
Line 120: Line 120:


Sample code:
Sample code:
     extract lat and long coordinates
     ''# extract lat and long coordinates''
     lat1 = pointA[0]
     lat1 = pointA[0]
     lon1 = pointA[1]
     lon1 = pointA[1]
Line 130: Line 130:
     y = cos(lat1) * sin(lat2) - (sin(lat1)*cos(lat2)*cos(diffLon))
     y = cos(lat1) * sin(lat2) - (sin(lat1)*cos(lat2)*cos(diffLon))


     initialHeading = arctan2(x, y)
     initialBeading = arctan2(x, y)  ''# bearing (deg)''
    compassBearingRad = (initialBearing + 2*pi) % (2*pi)


=== gps.py ===
=== gps.py ===

Revision as of 01:53, 25 March 2018

Team Members

  • Matthew Gilli, Electrical Engineering B.S.
  • Yu-Chia Hsu, Mechanical Engineering M.S.
  • Jason Mayeda, Mechanical Engineering B.S.
  • Roy Sun, Mechanical Engineering B.S.

GPS and Autonomous Vehicles

Global Positioning System (GPS) is formed by a network of satellites that provides geolocation data (time stamps, coordinates) to compatible GPS receivers. GPS data is commonly used along with a suite of other sensors in autonomous systems for navigation and control. The data provides coordinates in a global coordinate frame (latitude, longitude) that can be used to perform simply point-to-point navigation tasks. For more information about GPS fundamentals, see GPS.gov..

Project Overview

Due to complications with previous plug-and-play GPS modules for DonkeyCar autonomous vehicles, we sought to build our own DonkeyCar-compatible GPS module from scratch. The main flow of our project is as follows:

  1. Initialize a list of waypoints.
  2. Recieve GPS data from GP-20U7 reciever.
  3. Determine current position and bearing of the car with respect to the waypoint.
  4. Calculate throttle and steering commands to direct the car to the waypoint.
  5. Repeat steps 2-4 until the waypoint is reached.
  6. Once the car reaches a waypoint, drive in circle for X amount of time.
  7. Repeat steps 2-6 until all waypoints in the list have been visited.

This project was implemented with two main processes: planning and GPS interface.


GPS Interface

  • Polls for GPS data through the Pi serial port.
  • Parses GPS strings for relevant coordinate and time data.
  • Inputs: Bit/s
  • Outputs: Car location: GPS coordinates in latitude and longitude.

Planner

  • Implements control algorithms to calculate actuator commands for the car.
  • Keeps track of additional stop conditions.
  • Manages waypoint list.
  • Inputs: Car location: GPS coordinates in latitude and longitude
  • Outputs: Throttle and steering commands

Hardware Implementation

To implement our navigation tasks, we used the inexpensive GP-20U7 GPS receiver. Here you can find more information on the receiver including cost, sample projects, and a data sheet.

An embedded system is a system with dedicated function within larger system.

The gps system was embedded into car system

In order for gps to communicate with car they must share a common communication protocol. In this case, serial communication.

Serial interfaces stream their data, one single bit at a time. These interfaces can operate on as little as one wire, usually never more than four. A serial bus consists of just two wires - one for sending data and another for receiving. As such, serial devices should have two serial pins: the receiver, RX, and the transmitter, TX.

Pc1.png

It's important to note that those RX and TX labels are with respect to the device itself. So the RX from one device should go to the TX of the other, and vice-versa.

Some serial busses might get away with just a single connection between a sending and receiving device. In our case, the RPI does not need to relay any data back to the GPS. All that is needed is a single wire from the GP's TX to the pi's RX An example of this is shown in wiring diagram below.

Pc2.png


To connect the GPS unit to the Pi, follow these pinout instructions:

GP-20U7 -->  Pi
VCC --> 3V
GND --> GND
TX --> RX

Software Implementation

Summary

Main

gps_manage.py

Our GPS analog to the Donkey Car manage.py. Add parts to the DK vehicle and calls Vehicle.py.

Dependent libraries:

DonkeyCar, time, threading


DonkeyCar Parts

gps.py

Reads GPS data from the Pi serial port. Waits for identifier in strings to parse relevant GPS data (latitude, longitude coordinates).

Dependent libraries:

numpy, serial, pynmea2


planner.py

Takes GPS coordinates of current and previous time step to calculate distance and bearing to goal. Uses distance and bearing data to calculate the throttle and steering commands, respectively.

Dependent libraries:

numpy, time

Mathematical Equations

Distance Calculation

Our distance equations were based on the haversine derivations on this page.

A Python implementation of the haversine equation can be found in our planner.py part.

Bearing Calculation

GPS.jpg

Important Parameters:

  1. Calculate the bearing θi of the vector made by the current location and the goal point, with respect to North.
  2. Calculate the bearing ψi of the vector made by the previous time step location and the current location, with respect to North.

Method:

Our bearing calculation method is outlined at this page.

Also included on this page is sample JavaScript implementation of all of the equations.

Sample code:

   # extract lat and long coordinates
   lat1 = pointA[0]
   lon1 = pointA[1]
   lat2 = pointB[0]
   lon2 = pointB[1]
   diffLon = lon2 - lon1
   x = sin(diffLon) * cos(lat2)
   y = cos(lat1) * sin(lat2) - (sin(lat1)*cos(lat2)*cos(diffLon))
   initialBeading = arctan2(x, y)  # bearing (deg)
   compassBearingRad = (initialBearing + 2*pi) % (2*pi)

gps.py

planner.py

Results

Trajectory.png

Results of a typical two point waypoint navigation. The starting point is shown in black. The first waypoint, "Warren Mall", is shown in red. The threshold goal circle surrounding the waypoint is shown as the dashed circle. The graph shows that the car did trigger the "drive in circle" method once the goal threshold was reached.

You can see the car LIVE in action here: https://www.youtube.com/watch?v=O6DhMk9fdZ4

Future Work

  • Implement a better control algorithm for improved steering performance.
  • Timing Issues
    • Default loop frequency for Vehicle.py is 20Hz, consider changing refresh rate.
    • Threaded GPS part updates GPS location slowly, consider different baud rates.