diff --git a/tools/car_porting/README.md b/tools/car_porting/README.md index ca21cdd329..4197e3ab76 100644 --- a/tools/car_porting/README.md +++ b/tools/car_porting/README.md @@ -64,3 +64,11 @@ An example of searching through a database of segments for a specific condition, ![steer warning example](https://github.com/commaai/openpilot/assets/9648890/d60ad120-4b44-4974-ac79-adc660fb8fe2) *a plot of the steer_warning vs steering angle, where we can see it is clearly caused by a large steering angle change* + +### [tools/car_porting/examples/subaru_long_accel.ipynb](/tools/car_porting/examples/subaru_long_accel.ipynb) + +An example of plotting the response of an actuator when it is active. + +![brake pressure example](https://github.com/commaai/openpilot/assets/9648890/8f32cf1d-8fc0-4407-b540-70625ebbf082) + +*a plot of the brake_pressure vs acceleration, where we can see it is a fairly linear response.* \ No newline at end of file diff --git a/tools/car_porting/examples/subaru_long_accel.ipynb b/tools/car_porting/examples/subaru_long_accel.ipynb new file mode 100644 index 0000000000..ea685dcd4f --- /dev/null +++ b/tools/car_porting/examples/subaru_long_accel.ipynb @@ -0,0 +1,120 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "segments = [\n", + " \"d9df6f87e8feff94|2023-03-28--17-41-10/1:12\"\n", + "]\n", + "platform = \"SUBARU OUTBACK 6TH GEN\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import copy\n", + "import numpy as np\n", + "\n", + "from opendbc.can.parser import CANParser\n", + "\n", + "from openpilot.selfdrive.car.subaru.values import DBC\n", + "from openpilot.tools.lib.srreader import SegmentRangeReader\n", + "\n", + "\"\"\"\n", + "In this example, we plot the relationship between Cruise_Brake and Acceleration for stock eyesight.\n", + "\"\"\"\n", + "\n", + "for segment in segments:\n", + " lr = SegmentRangeReader(segment)\n", + "\n", + " messages = [\n", + " (\"ES_Distance\", 20),\n", + " (\"ES_Brake\", 20),\n", + " (\"ES_Status\", 20),\n", + " ]\n", + "\n", + " cp = CANParser(DBC[platform][\"pt\"], messages, 1)\n", + "\n", + " es_distance_history = []\n", + " es_status_history = []\n", + " es_brake_history = []\n", + " acceleration_history = []\n", + "\n", + " last_acc = 0\n", + "\n", + " for msg in lr:\n", + " if msg.which() == \"can\":\n", + " cp.update_strings([msg.as_builder().to_bytes()])\n", + " es_distance_history.append(copy.copy(cp.vl[\"ES_Distance\"]))\n", + " es_brake_history.append(copy.copy(cp.vl[\"ES_Brake\"]))\n", + " es_status_history.append(copy.copy(cp.vl[\"ES_Status\"]))\n", + "\n", + " acceleration_history.append(last_acc)\n", + " \n", + " if msg.which() == \"carState\":\n", + " last_acc = msg.carState.aEgo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def process(history, func):\n", + " return np.array([func(h) for h in history])\n", + "\n", + "cruise_activated = process(es_status_history, lambda es_status: es_status[\"Cruise_Activated\"])\n", + "cruise_throttle = process(es_distance_history, lambda es_distance: es_distance[\"Cruise_Throttle\"])\n", + "cruise_rpm = process(es_status_history, lambda es_status: es_status[\"Cruise_RPM\"])\n", + "cruise_brake = process(es_brake_history, lambda es_brake: es_brake[\"Brake_Pressure\"])\n", + "acceleration = process(acceleration_history, lambda acc: acc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "valid_brake = (cruise_activated==1) & (cruise_brake>0) # only when cruise is activated and eyesight is braking\n", + "\n", + "ax = plt.figure().add_subplot()\n", + "\n", + "ax.set_title(\"Brake_Pressure vs Acceleration\")\n", + "ax.set_xlabel(\"Brake_Pessure\")\n", + "ax.set_ylabel(\"Acceleration\")\n", + "ax.scatter(cruise_brake[valid_brake], -acceleration[valid_brake])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}