ECE434 Project - Vehicle Telemetry

Jump to: navigation, search

thumb‎ Embedded Linux Class by Mark A. Yoder

Team members: Jason Su Harris Wu

Grading Template

I'm using the following template to grade. Each slot is 10 points. 0 = Missing, 5=OK, 10=Wow!

Add Extras

09 Executive Summary
09 Packaging
09 Installation Instructions 
09 User Instructions
09 Highlights
09 Theory of Operation
09 Work Breakdown
09 Future Work/Conclusions
09 Demo/Poster
00 Not Late

Score:  90/100

Executive Summary

This project uses a beaglebone with a cape to build a data logger for vehicles. It uses an extended Kalman filter to integrate GPS and IMU data to achieve a decimeter level accuracy for the position and velocity of a vehicle, and combine with data logged from the CAN bus to build a server. The server is able to real time visualize the data on a webpage. It can be used as a platform for implementing some apps, such as lap time, accel/brake time for analysis purpose.


A beaglebone cape with IMU, GPS and CAN transceiver.

GPS breakout board:

IMU breakout board:

CAN transceiver:

Installation Instructions


1. Connect GPS to UART

2. Connect IMU to I2C2

3. Connect CAN to CAN1


1. Put BB-I2C2-MPU6050 into uEnv.txt and reboot.

2. Get the project:

$ git clone

3. Run ece434Project/ and you can go to step 7

4. Set up MPU6050 on I2C2 at 0x68:

  $ cd /sys/class/i2c-adapter/i2c-2
  $ echo mpu6050 0x68 > new_device

5. Install gpsd:

  $ sudo apt-get install gpsd

6. Install python-can:

  $ pip install python-can

7. Config gpsd:

  $ nano /etc/default/gpsd

You will see the config file and change DEVICES="/dev/ttyS0" to the port you use. (ttyS0 is uart1)

8. Run

git site:

User Instructions

1. Go to the project directory

   $ cd ece434Project

1. Run make to compile if needed

   $ make   

3. Check the status gpsd:

  cgps  //It may take a couple of minutes for the GPS to capture enough satellites depending on the weather and area. 

4. Connect to the OBDII port on your car.

5. Check the connection of CAN bus:

  candump can1

6. If you can see gps information using cpgs, and can messages using candump, you are ready to start the program.

7. Run (Terminate the program by run

8. Go to to see the real-time visualized data


We are almost able to get all the data that OBD2 Interface provides. How OBD2 works is that it listens for request and if you send it a request it will return you a data.

We have both front end task ( and backend task (futionT), front end uses canvas to plot the data which came from back end, it drags multiple lines from the datalog file (see data folder) and plot them all at a specific frequency (see and js file in the templates)

The back end is the one that consumes the CPU Usage the most. Since this device is used to record the data in the vehicle, we want to ensure that it keeps updating at a certain frequency. The maximum frequency that IMU can sample is 160 Hz, but we noticed that it takes too much CPU usage (>=92%), we lowered this frequency to 100Hz. Another reason why we lowered the frequency is that for our non real time kernels, it is difficult to make the sampling rate exactly as expected.

Include a YouTube demo the audio description.

Theory of Operation

For gps, we used gpsd module to get the data from the peripheral. To be specific, we used gpsstream() to read the data from the device. For IMU, we used I2c to communicate with the device. What we did was simply adding the device tree to the kernel and constantly read the raw data from the device tree and process the data in our program. Save the processed raw data and send it to the Kalman filter. For CAN, we used python and a can transceiver to communicate with the vehicle. It is able to get the data after sending a request to the vehicle. See Front End Task: We used canvas to plot the data in the localhost, the port is at 8082 so the website that you need to go to is after the and fusionT both starts. In the website, multiple plots can be added to the page upon click on the options e.g. AccelerationX, Acceleration Y, RPM etc.

Work Breakdown

Tasks Person
Data log Harris
Back End webserver Harris
Extended Kalman filter Jason
Web frontend Jason

Future Work

The extended Kalman filter still needs more work to provide higher accuracy. It would be better to have the beaglebone connect to the car wirelessly through a wireless adaptor. Some applications can be developed based on this platform, such as lap time, 0-60mph, a quarter mile and so on.


In this project, we used many modules including but not limited to : GPSD, CANBUS, I2C, Device tree, flask,canvas, server, uart and kalman filter.

The code part can still be improved since the CPU usage can be decreased by code optimization. Also, the sampling can be more accurate by using real time kernel.

We didn't expect the 1GHz processor not able to handling 160 Hz IMU well, so if possible, we'd like to try to optimize our program or have it run on a more power processor.

thumb‎ Embedded Linux Class by Mark A. Yoder