Rivian Automotive

Interning at Rivian under the Body Engineering team was a great interdisciplinary experience. I took on challenging projects that focused more on the intersection of mechanical and electrical design and learned new concepts and skills like CAN protocol and using C++ / Python.

Lighting Rig Project

The lighting rig is a set up of all the lighting and electrical hardware components for a Rivian car. It’s typically used for performing tests and verifying software / hardware changes. For many tests, the brake lights need to be activated as a prerequisite, especially during the process of “turning on the car”. My task was to create a physical switch that simulated the brakes being pressed on the rig.

To start, I familiarized myself with the rig’s hardware by talking with the manufacturers and learned about CAN protocol. I then learned how to inject CAN signals using DBC files and CANalyzer. Perusing Rivian’s confluence pages, I then found the network architecture for the lighting rig’s specific model and practiced injecting various CAN signals like the left and right blinkers. I had a lot of trouble however finding the specific signals to send to simulate the brake lights. This was because I wanted to inject signals from the source controller itself. That is, I wanted to simulate the brake pedal being pressed and not just the light turning on. After looking through many pages of Rivian documentation, I discovered that the brake lights had a checksum and CRC counter that needed to be simulated correctly using specific protocols.

To physically inject the CAN signal, I connected an Arduino nano to an MCP2515 chip and transceiver pcb. I then wrote the software in C++ to calculate and send the CRC plus other signals. Finally, I designed and 3D printed an enclosure for the pcbs so that it could be easily used on the lighting rig. After some debugging, the physical switch worked and was used to more efficiently conduct lighting rig tests. Before leaving, I documented how to make the switch and modify the code to send other CAN signals.

Physical Switch for Pressing Brakes

Jama Test Cases

For my second intern project, I was tasked with writing test cases for all of the new interior lighting features in Jama. I soon discovered that this was an extremely tedious task and was curious to see if it could be automated somehow. After looking through Rivian documentation, I learned about the process of creating test cases from functional requirements in Jama and saw there was an API I can use to access Jama’s database. I then decided to write a python script to try and automate the process.

I had very minimal coding experience (I’ve only taken one python class in high school) so it was a fun challenge refamiliarizing myself with and learning python basics. The main challenge I faced was that I needed to parse the functional requirements in Jama. While most people did follow the EARS pattern as per Rivian protocol, most functional requirements were written colloquially and so my script needed to be robust enough to handle random human writing errors. After parsing each functional requirement, my python script would then generate multiple test cases for each one and organize them into an excel spreadsheet that can be easily uploaded to Jama. In the end, my python script was able to create more than 2000 test cases in approximately 5 minutes.


This internship has been very surprising in how different and interdisciplinary my projects were. Most of my prior work experience has revolved around physical mechanical designs so it was a fun challenge learning about CAN protocols, API’s, using Arduinos, writing software, etc. I enjoy learning new skills and this internship has definitely gave me the opportunity to do so.