Tesla Bosch Radar

From Tinkla: Tinkering with Tesla
Revision as of 14:29, 9 May 2019 by BogGyver (talk | contribs)
Giraffe rev B Radar Diagram.png
Giraffe rev A.png
The Giraffe rev A board. Use CAN1 for radar..png

The Bosch radar made for Tesla (Bosch MRRevo14, and with few different part numbers like 1038224-00-A/B or 1057551-00-B) have been used on Tesla Model S cars from October 2014 (AP1) until they have been replaced by the Continental radar with AP2.5). The main difference between 1038224-00-B and 1038224-00-A is that the A version does not have the heater element for winter weather (to melt snow and ice).

The radar has a range of about 160m and for the short beam a cone of 45°.

Bosch radars

Many other car manufacturers use the same radar hardware, including Honda, Nissan, VW, Audi, etc. But Tesla (AFAIK) is the only one that reads and processes raw data from the radar instead of letting the radar make the decision about longitudinal control action needed (acceleration or deceleration).

This radar can ben used on any OP supported car. To insall the radar for a non-Tesla car please find a branch that has the code already done or modify your branch and add the code needed to make the radar talk to the Panda code for your car.

Deconding the radar

With a little help from a group of enthusiasts, we were able to reverse engineer all the messages that AP sends to the radar in order to make it "talk". Then we identified the structure of the CAN messages that describe each of the 32 objects this radar can detect. Signals like longitudinal distance, lateral distance (vs radar), longitudinal relative speed, lateral relative speed, longitudinal acceleration, certainty of detection, etc are all now processed and sent to the radar daemon of OpenPilot, improving longitudinal control for the car.

What you need

In order to get the radar working on your car, you need to buy a radar, a mounting bracket (few options here), a connector and then to create a harness and run the cable back to the Giraffe. As a first temporary setup for my research, I used an Audi bracket which I installed on my car's nose cone. Then I created the harness and connected it for both CAN and power to my Giraffe rev B using a car relay. Please also make sure you add the 120Ω resistor between CAN+ and CAN-.

If you have a Giraffe rev A, you will have to solder the CAN wires from the radar directly to the Giraffe. We are using the middle CAN of the Panda (CAN2 when you think of them as CAN1-CH, CAN3-EPAS) and the pins where you should solder your connector are marked in this diagrams. 
Also, you will have to add the same 120Ω resistor between CAN+ and CAN-.

As for power for the radar, if you don't feel like doing my relay setup from the Giraffe rev B, I recommend tapping into Pin 6 of the EPAS harness (which is "ignition" power) and drive a relay the same way i drove it from the Giraffe, but in this case add a 5 Amp fuse on the power from battery to the relay.

For other cars that want to use the Tesla Bosch Radar, please find an unused CAN in your Panda safety implementation and use that CAN to communicate with the radar. The radar has to be on its own specific CAN because any message outside of the ones that it is supposed to receive will make it stop working.

Panda code changes

If you are on a Tesla OP branch (0.5.10 and above), the Panda code already has all you need to get the Tesla Bosch Radar working.

If you want to implement the code for another car, you will have to modify the code as follow:

  • find an existing CAN message on your car that is generated at 100Hz. We will use this message as a clock to trigger all the other messages needed by radar.
  • take a look at my test_teslaradar branch which uses the fake message code in safety_teslaradar.h
  • edit safety_yourcar.h (specific for your car) and add the following:
* add the include for safety_teslaradar.h at the top
#include "safety_teslaradar.h"
* in the rx_hook function, call the radar rx hook
teslaradar_rx_hook(to_push);
* in the rx_hook function, find the CAN message that provides the speed and parse it (this is a Honda example) saving the value in the actual_speed_kph variable
 //speed for radar
 if ((to_push->RIR>>21) == 0x309) {
   // first 2 bytes
   actual_speed_kph = (int)((((to_push->RDLR & 0xFF) << 8) + ((to_push->RDLR >>8) & 0xFF))*0.01);
 }