From 89eb8bdd0b1e701fed1b7b006f99376999a47363 Mon Sep 17 00:00:00 2001 From: sacardoz <sacardoz@uwaterloo.ca> Date: Sat, 30 Dec 2023 02:49:34 -0500 Subject: [PATCH] PDM WORKS --- experiments/test_notebook.ipynb | 148 +++++++++++------- .../ml_planner_agents_observation.yaml | 26 +++ .../observation/ml_planner_agents.py | 81 ++++++---- 3 files changed, 169 insertions(+), 86 deletions(-) diff --git a/experiments/test_notebook.ipynb b/experiments/test_notebook.ipynb index 1b183ce..60cbb31 100644 --- a/experiments/test_notebook.ipynb +++ b/experiments/test_notebook.ipynb @@ -26,7 +26,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_235422/4095267831.py:5: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display\n", + "/tmp/ipykernel_16674/4095267831.py:5: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display\n", " from IPython.core.display import display, HTML\n" ] } @@ -105,18 +105,23 @@ "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "'/media/sacardoz/Storage/nuplan-devkit/experiments'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "/media/sacardoz/Storage/nuplan-devkit\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/IPython/core/magics/osm.py:417: UserWarning: using dhist requires you to install the `pickleshare` library.\n", + " self.shell.db['dhist'] = compress_dhist(dhist)[-100:]\n" + ] } ], "source": [ - "%pwd" + "%cd .." ] }, { @@ -173,7 +178,7 @@ " f\"planner.pdm_hybrid_planner.checkpoint_path={hybrid_ckpt}\" ,\n", " 'observation.model_config=${model}',\n", " f'observation.checkpoint_path={ckpt_dir}',\n", - " f'observation.planner_type=pdm_closed',\n", + " f'observation.planner_type=pdm_hybrid',\n", " f'observation.pdm_hybrid_ckpt={hybrid_ckpt}',\n", " f'observation.occlusions=true',\n", " 'worker=sequential',\n", @@ -205,34 +210,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "2023-12-23 20:52:26,435 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:19} Building WorkerPool...\n", - "2023-12-23 20:52:26,437 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:101} Worker: Sequential\n", - "2023-12-23 20:52:26,437 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:102} Number of nodes: 1\n", + "2023-12-30 01:57:45,114 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:19} Building WorkerPool...\n", + "2023-12-30 01:57:45,115 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:101} Worker: Sequential\n", + "2023-12-30 01:57:45,115 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/utils/multithreading/worker_pool.py:102} Number of nodes: 1\n", "Number of CPUs per node: 1\n", "Number of GPUs per node: 0\n", "Number of threads across all nodes: 1\n", - "2023-12-23 20:52:26,437 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:27} Building WorkerPool...DONE!\n", - "2023-12-23 20:52:26,437 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:32} Building experiment folders...\n", - "2023-12-23 20:52:26,437 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:35} \n", + "2023-12-30 01:57:45,115 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/worker_pool_builder.py:27} Building WorkerPool...DONE!\n", + "2023-12-30 01:57:45,115 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:32} Building experiment folders...\n", + "2023-12-30 01:57:45,115 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:35} \n", "\n", - "\tFolder where all results are stored: /media/sacardoz/Storage/nuplan/exp/exp/simulation/closed_loop_multiagent/2023.12.23.20.52.26\n", + "\tFolder where all results are stored: /media/sacardoz/Storage/nuplan/exp/exp/simulation/closed_loop_multiagent/2023.12.30.01.57.44\n", "\n", - "2023-12-23 20:52:26,438 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:70} Building experiment folders...DONE!\n", - "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:52} Building AbstractCallback...\n", - "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:68} Building AbstractCallback: 0...DONE!\n", - "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:49} Building simulations...\n", - "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:55} Extracting scenarios...\n", - "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/common/utils/distributed_scenario_filter.py:83} Building Scenarios in mode DistributedMode.SINGLE_NODE\n", - "2023-12-23 20:52:26,439 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:18} Building AbstractScenarioBuilder...\n", - "2023-12-23 20:52:26,452 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:21} Building AbstractScenarioBuilder...DONE!\n", - "2023-12-23 20:52:26,452 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:35} Building ScenarioFilter...\n", - "2023-12-23 20:52:26,453 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:44} Building ScenarioFilter...DONE!\n", - "2023-12-23 20:52:26,470 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:76} Building metric engines...\n", - "2023-12-23 20:52:26,498 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:78} Building metric engines...DONE\n", - "2023-12-23 20:52:26,498 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:82} Building simulations from 1 scenarios...\n", - "2023-12-23 20:52:26,633 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/model_builder.py:18} Building TorchModuleWrapper...\n", - "2023-12-23 20:52:26,669 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/model_builder.py:21} Building TorchModuleWrapper...DONE!\n", - "2023-12-23 20:52:27,238 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:142} Building simulations...DONE!\n" + "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/folder_builder.py:70} Building experiment folders...DONE!\n", + "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:52} Building AbstractCallback...\n", + "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_callback_builder.py:68} Building AbstractCallback: 0...DONE!\n", + "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:49} Building simulations...\n", + "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:55} Extracting scenarios...\n", + "2023-12-30 01:57:45,117 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/common/utils/distributed_scenario_filter.py:83} Building Scenarios in mode DistributedMode.SINGLE_NODE\n", + "2023-12-30 01:57:45,118 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:18} Building AbstractScenarioBuilder...\n", + "2023-12-30 01:57:45,129 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_building_builder.py:21} Building AbstractScenarioBuilder...DONE!\n", + "2023-12-30 01:57:45,130 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:35} Building ScenarioFilter...\n", + "2023-12-30 01:57:45,131 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/scenario_filter_builder.py:44} Building ScenarioFilter...DONE!\n", + "2023-12-30 01:57:45,149 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:76} Building metric engines...\n", + "2023-12-30 01:57:45,181 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:78} Building metric engines...DONE\n", + "2023-12-30 01:57:45,181 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:82} Building simulations from 1 scenarios...\n", + "2023-12-30 01:57:45,315 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/model_builder.py:18} Building TorchModuleWrapper...\n", + "2023-12-30 01:57:45,353 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/model_builder.py:21} Building TorchModuleWrapper...DONE!\n", + "2023-12-30 01:57:45,912 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/script/builders/simulation_builder.py:142} Building simulations...DONE!\n" ] } ], @@ -445,8 +450,8 @@ "\n", "while runner.simulation.is_simulation_running():\n", "\n", - " if runner.simulation._time_controller.get_iteration().index == 10:\n", - " runner.simulation._observations.add_agent_to_scene(inserted_agent, inserted_goal, iteration.time_point)\n", + " #if runner.simulation._time_controller.get_iteration().index == 10:\n", + " # runner.simulation._observations.add_agent_to_scene(inserted_agent, inserted_goal, iteration.time_point)\n", "\n", " # Execute specific callback\n", " runner.simulation.callback.on_step_start(runner.simulation.setup, runner.planner)\n", @@ -466,7 +471,6 @@ " iteration = runner.simulation._time_controller.get_iteration()\n", " print(iteration)\n", " runner.simulation.propagate(trajectory)\n", - "\n", " # Execute specific callback\n", " runner.simulation.callback.on_step_end(runner.simulation.setup, runner.planner, runner.simulation.history.last())\n", "\n", @@ -476,10 +480,8 @@ { "cell_type": "code", "execution_count": null, - "id": "e6c22f5f", - "metadata": { - "scrolled": true - }, + "id": "ee4f6784", + "metadata": {}, "outputs": [ { "name": "stderr", @@ -498,7 +500,7 @@ " (function() {\n", " const xhr = new XMLHttpRequest()\n", " xhr.responseType = 'blob';\n", - " xhr.open('GET', \"http://localhost:5009/autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5009&resources=none\", true);\n", + " xhr.open('GET', \"http://localhost:5003/autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5003&resources=none\", true);\n", " xhr.onload = function (event) {\n", " const script = document.createElement('script');\n", " const src = URL.createObjectURL(event.target.response);\n", @@ -512,7 +514,7 @@ }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { - "server_id": "7d9bc83475124657aff7017705e9f4df" + "server_id": "bb87f5db2a334639a9b38e52166acc51" } }, "output_type": "display_data" @@ -521,26 +523,54 @@ "name": "stdout", "output_type": "stream", "text": [ - "2023-12-23 20:59:59,909 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Error creating dataset. Could not read schema from 'run_sim_closed_loop/training_raster_experiment/train_default_raster/2023.11.14.22.55.23/hparams.yaml'. Is this a 'parquet' file?: Could not open Parquet input source 'run_sim_closed_loop/training_raster_experiment/train_default_raster/2023.11.14.22.55.23/hparams.yaml': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", - "2023-12-23 20:59:59,910 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", - "2023-12-23 20:59:59,910 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", - "2023-12-23 20:59:59,911 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Error creating dataset. Could not read schema from 'pretrained_checkpoints/gc_pgp_checkpoint.ckpt'. Is this a 'parquet' file?: Could not open Parquet input source 'pretrained_checkpoints/gc_pgp_checkpoint.ckpt': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", - "2023-12-23 20:59:59,911 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", - "2023-12-23 20:59:59,911 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", - "2023-12-23 20:59:59,911 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", - "2023-12-23 20:59:59,912 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", - "2023-12-23 20:59:59,914 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/simulation_tile.py:172} Minimum frame time=0.017 s\n" + "2023-12-30 02:47:05,264 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet file size is 0 bytes\n", + "2023-12-30 02:47:05,265 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,266 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Error creating dataset. Could not read schema from 'tutorials/media/nuplan_flow.svg'. Is this a 'parquet' file?: Could not open Parquet input source 'tutorials/media/nuplan_flow.svg': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,266 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,266 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,266 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,267 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,267 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,267 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,267 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,268 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,268 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Error creating dataset. Could not read schema from '.github/ISSUE_TEMPLATE/bug_report.md'. Is this a 'parquet' file?: Could not open Parquet input source '.github/ISSUE_TEMPLATE/bug_report.md': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,268 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,269 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,269 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,269 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,278 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Error creating dataset. Could not read schema from 'nuplan/BUILD'. Is this a 'parquet' file?: Could not open Parquet input source 'nuplan/BUILD': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,279 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Error creating dataset. Could not read schema from 'nuplan_devkit.egg-info/PKG-INFO'. Is this a 'parquet' file?: Could not open Parquet input source 'nuplan_devkit.egg-info/PKG-INFO': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,279 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Error creating dataset. Could not read schema from 'tox/requirements_pythonlint.txt'. Is this a 'parquet' file?: Could not open Parquet input source 'tox/requirements_pythonlint.txt': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,280 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,280 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Error creating dataset. Could not read schema from 'docs/Makefile'. Is this a 'parquet' file?: Could not open Parquet input source 'docs/Makefile': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,281 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,281 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,281 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,282 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,282 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,282 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,282 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,283 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,283 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Error creating dataset. Could not read schema from 'experiments/bulk_running_experiments.ipynb'. Is this a 'parquet' file?: Could not open Parquet input source 'experiments/bulk_running_experiments.ipynb': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,283 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,288 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Error creating dataset. Could not read schema from '.git/COMMIT_EDITMSG'. Is this a 'parquet' file?: Could not open Parquet input source '.git/COMMIT_EDITMSG': Parquet file size is 5 bytes, smaller than the minimum file footer (8 bytes)\n", + "2023-12-30 02:47:05,288 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,288 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet file size is 0 bytes\n", + "2023-12-30 02:47:05,288 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,289 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/experiment_file_data.py:140} Could not open Parquet input source '<Buffer>': Parquet magic bytes not found in footer. Either the file is corrupted or this is not a parquet file.\n", + "2023-12-30 02:47:05,300 INFO {/media/sacardoz/Storage/nuplan-devkit/nuplan/planning/nuboard/base/simulation_tile.py:172} Minimum frame time=0.017 s\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Rendering a scenario: 100%|██████████| 1/1 [00:00<00:00, 30.44it/s]\n", + "Rendering a scenario: 100%|██████████| 1/1 [00:00<00:00, 43.62it/s]\n", "WARNING:bokeh.core.validation.check:W-1000 (MISSING_RENDERERS): Plot has no renderers: Figure(id='1005', ...)\n", - "INFO:tornado.access:200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5009&resources=none (::1) 1063.26ms\n", - "INFO:tornado.access:101 GET /ws?id=cd802e51-de22-41c8-bc8e-99ef2dff2bff&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.62ms\n", + "INFO:tornado.access:200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5003&resources=none (::1) 1044.77ms\n", "INFO:bokeh.server.views.ws:WebSocket connection opened\n", + "INFO:tornado.access:101 GET /ws?id=1473284a-b32b-43ae-9821-e330d67bdb31&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.82ms\n", "INFO:bokeh.server.views.ws:ServerConnection created\n" ] }, @@ -548,15 +578,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "2023-12-23 21:00:00,955 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344} 200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5009&resources=none (::1) 1063.26ms\n", - "2023-12-23 21:00:00,986 INFO {/media/sacardoz/Storage/nuplan-devkit/tutorials/utils/tutorial_utils.py:267} Done rendering!\n", - "2023-12-23 21:00:00,987 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344} 101 GET /ws?id=cd802e51-de22-41c8-bc8e-99ef2dff2bff&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.62ms\n" + "2023-12-30 02:47:06,295 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344} 200 GET /autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:5003&resources=none (::1) 1044.77ms\n", + "2023-12-30 02:47:06,344 INFO {/media/sacardoz/Storage/nuplan-devkit/tutorials/utils/tutorial_utils.py:267} Done rendering!\n", + "2023-12-30 02:47:06,351 INFO {/home/sacardoz/miniconda3/envs/nuplan/lib/python3.9/site-packages/tornado/web.py:2344} 101 GET /ws?id=1473284a-b32b-43ae-9821-e330d67bdb31&origin=da2f890a-eb18-4637-9199-dd0f06169aef&swVersion=4&extensionId=&platform=electron&vscode-resource-base-authority=vscode-resource.vscode-cdn.net&parentOrigin=vscode-file%3A%2F%2Fvscode-app&purpose=notebookRenderer (::1) 0.82ms\n" ] } ], "source": [ "from tutorials.utils.tutorial_utils import visualize_history\n", - "visualize_history(runner.simulation._history, runner.scenario, bokeh_port=5009)" + "visualize_history(runner.simulation._history, runner.scenario, bokeh_port=5003)" ] } ], diff --git a/nuplan/planning/script/config/simulation/observation/ml_planner_agents_observation.yaml b/nuplan/planning/script/config/simulation/observation/ml_planner_agents_observation.yaml index fe8ec0e..eb6c5fa 100644 --- a/nuplan/planning/script/config/simulation/observation/ml_planner_agents_observation.yaml +++ b/nuplan/planning/script/config/simulation/observation/ml_planner_agents_observation.yaml @@ -6,3 +6,29 @@ checkpoint_path: ??? # Path to trained model checkpoint occlusions: false # Boolean to determine whether occlusions should be enabled planner_type: "ml" # String to determine planner type (one of "ml", "idm", "pdm_closed", "pdm_hybrid") pdm_hybrid_ckpt: null # Path to trained PDM hybrid model checkpoint + +tracker: + _target_: nuplan.planning.simulation.controller.tracker.lqr.LQRTracker + _convert_: 'all' + + # LQR tuning + q_longitudinal: [10.0] # velocity tracking cost gain + r_longitudinal: [1.0] # acceleration tracking cost gain + q_lateral: [1.0, 10.0, 0.0] # [lateral_error, heading_error, steering_angle] tracking cost gains + r_lateral: [1.0] # steering_rate tracking cost gain + discretization_time: 0.1 # [s] The time interval used for discretizing the continuous time dynamics. + tracking_horizon: 10 # The number of time steps (at discretization_time interval) ahead we consider for LQR. + + # Parameters for velocity and curvature estimation. + jerk_penalty: 1e-4 # Penalty for jerk in velocity profile estimation. + curvature_rate_penalty: 1e-2 # Penalty for curvature rate in curvature profile estimation. + + # Stopping logic + stopping_proportional_gain: 0.5 # Proportional controller tuning for stopping controller + stopping_velocity: 0.2 # [m/s] Velocity threshold for stopping + +motion_model: + _target_: nuplan.planning.simulation.controller.motion_model.kinematic_bicycle.KinematicBicycleModel + _convert_: 'all' + + vehicle: ${scenario_builder.vehicle_parameters} diff --git a/nuplan/planning/simulation/observation/ml_planner_agents.py b/nuplan/planning/simulation/observation/ml_planner_agents.py index 79354eb..b07f94f 100644 --- a/nuplan/planning/simulation/observation/ml_planner_agents.py +++ b/nuplan/planning/simulation/observation/ml_planner_agents.py @@ -11,10 +11,14 @@ from nuplan.common.actor_state.state_representation import StateSE2, StateVector from nuplan.common.actor_state.tracked_objects import TrackedObject, TrackedObjects from nuplan.common.actor_state.tracked_objects_types import TrackedObjectType from nuplan.common.actor_state.vehicle_parameters import VehicleParameters +from nuplan.common.geometry.transform import translate_longitudinally from nuplan.common.maps.abstract_map import AbstractMap -from nuplan.common.maps.abstract_map_objects import LaneGraphEdgeMapObject, RoadBlockGraphEdgeMapObject +from nuplan.common.maps.abstract_map_objects import LaneGraphEdgeMapObject from nuplan.planning.scenario_builder.abstract_scenario import AbstractScenario +from nuplan.planning.simulation.controller.motion_model.abstract_motion_model import AbstractMotionModel +from nuplan.planning.simulation.controller.tracker.abstract_tracker import AbstractTracker +from nuplan.planning.simulation.controller.two_stage_controller import TwoStageController from nuplan.planning.simulation.history.simulation_history_buffer import SimulationHistoryBuffer from nuplan.planning.simulation.observation.abstract_observation import AbstractObservation from nuplan.planning.simulation.observation.observation_type import Observation @@ -25,6 +29,7 @@ from nuplan.planning.simulation.planner.idm_planner import IDMPlanner from nuplan.planning.simulation.planner.ml_planner.ml_planner import MLPlanner from nuplan.planning.simulation.simulation_time_controller.simulation_iteration import SimulationIteration +from nuplan.planning.simulation.trajectory.abstract_trajectory import AbstractTrajectory from nuplan.planning.training.modeling.torch_module_wrapper import TorchModuleWrapper from nuplan.planning.simulation.trajectory.trajectory_sampling import TrajectorySampling @@ -56,24 +61,30 @@ IDM_AGENT_CONFIG = { PDM_CLOSED_AGENT_CONFIG = { "trajectory_sampling": TrajectorySampling(num_poses=80, interval_length= 0.1), "proposal_sampling": TrajectorySampling(num_poses=40, interval_length= 0.1), - "idm_policies": BatchIDMPolicy(speed_limit_fraction= [0.2,0.4,0.6,0.8,1.0], - fallback_target_velocity= 15.0, - min_gap_to_lead_agent= 1.0, - headway_time= 1.5, - accel_max= 1.5, - decel_max= 3.0), "lateral_offsets": [-1.0, 1.0], "map_radius": 50, } +PDM_BATCH_IDM_CONFIG = { + "speed_limit_fraction":[0.2,0.4,0.6,0.8,1.0], + "fallback_target_velocity":15.0, + "min_gap_to_lead_agent":1.0, + "headway_time":1.5, + "accel_max":1.5, + "decel_max":3.0 +} + +PDM_OFFSET_MODEL_CONFIG = { + "trajectory_sampling": TrajectorySampling(num_poses=16, interval_length=0.5), + "history_sampling": TrajectorySampling(num_poses=10, interval_length=0.2), + "planner": None, + "centerline_samples": 120, + "centerline_interval": 1.0, + "hidden_dim": 512 +} + PDM_HYBRID_AGENT_CONFIG = { - "model":PDMOffsetModel(trajectory_sampling=TrajectorySampling(num_poses=16, interval_length=0.5), - history_sampling=TrajectorySampling(num_poses=10, interval_length=0.2), - planner=None, - centerline_samples=120, - centerline_interval=1.0, - hidden_dim=512), - "correction_horizon":2.0, + "correction_horizon": 2.0, } @@ -82,7 +93,7 @@ class MLPlannerAgents(AbstractObservation): Simulate agents based on an ML model. """ - def __init__(self, model: TorchModuleWrapper, scenario: AbstractScenario, occlusions: bool, planner_type: str, pdm_hybrid_ckpt: str) -> None: + def __init__(self, model: TorchModuleWrapper, scenario: AbstractScenario, occlusions: bool, planner_type: str, pdm_hybrid_ckpt: str, tracker: AbstractTracker, motion_model: AbstractMotionModel) -> None: """ Initializes the MLPlannerAgents class. :param model: Model to use for inference. @@ -100,6 +111,8 @@ class MLPlannerAgents(AbstractObservation): self._inference_frequency: float = 0.2 self._full_inference_distance: float = 30 + self._motion_controller = TwoStageController(scenario, tracker, motion_model) + def reset(self) -> None: """Inherited, see superclass.""" self.current_iteration = 0 @@ -202,9 +215,21 @@ class MLPlannerAgents(AbstractObservation): planner_input = PlannerInput(iteration=iteration, history=history_input, traffic_light_data=traffic_light_data) trajectory = agent_data['planner'].compute_trajectory(planner_input) self._trajectory_cache[agent_token] = (next_iteration.time_point.time_s, trajectory) - - agent_data['ego_state'] = trajectory.get_state_at_time(next_iteration.time_point) + + agent_data['ego_state'] = self._get_new_state_from_trajectory(iteration, next_iteration, agent_data['ego_state'], trajectory) self._ego_state_history[agent_token][next_iteration.time_point] = agent_data['ego_state'] + + + def _get_new_state_from_trajectory(self, current_iteration: SimulationIteration, + next_iteration: SimulationIteration, + ego_state: EgoState, + trajectory: AbstractTrajectory) -> EgoState: + """ + Gets the state of the agent at a given timepoint from a trajectory. + """ + self._motion_controller.reset() + self._motion_controller.update_state(current_iteration, next_iteration, ego_state, trajectory) + return self._motion_controller.get_state() def _build_ego_state_from_agent(self, agent: Agent, time_point: TimePoint) -> EgoState: """ @@ -219,10 +244,11 @@ class MLPlannerAgents(AbstractObservation): self._ego_state_history[agent.metadata.track_token] = {} # Most of this is just eyeballed, so there may be a more principled way of setting these values. - output = EgoState.build_from_center( - center=agent.center, - center_velocity_2d=agent.velocity if self.planner_type != "idm" else StateVector2D(agent.velocity.magnitude(), 0), - center_acceleration_2d=StateVector2D(0, 0), + + output = EgoState.build_from_rear_axle( + rear_axle_pose=translate_longitudinally(agent.center, agent.box.length * 1 / 5 - agent.box.length / 2), + rear_axle_velocity_2d=StateVector2D(agent.velocity.magnitude(), 0), #EgoState and Agent uses different velocity representations. It's very weird. + rear_axle_acceleration_2d=StateVector2D(0, 0), tire_steering_angle=0, time_point=time_point, vehicle_parameters=VehicleParameters( @@ -244,12 +270,14 @@ class MLPlannerAgents(AbstractObservation): """ Builds agent state from corresponding ego state. Unlike the inverse this process is well-defined. """ + track_heading = ego_state.car_footprint.oriented_box.center.heading + velocity = ego_state.dynamic_car_state.center_velocity_2d agent_state = Agent( metadata=scene_object_metadata, tracked_object_type=TrackedObjectType.VEHICLE, oriented_box=ego_state.car_footprint.oriented_box, - velocity=ego_state.dynamic_car_state.center_velocity_2d, + velocity=StateVector2D(np.cos(track_heading) * velocity.magnitude(), np.sin(track_heading) * velocity.magnitude()) ) return agent_state @@ -317,12 +345,10 @@ class MLPlannerAgents(AbstractObservation): """ # TODO: Inject IDM agents (and non-ML agents more broadly) - self._agents[agent.metadata.track_token] = self._build_agent_record(agent, timepoint_record) - route_plan = self._get_roadblock_path(agent, goal) if route_plan: - self._agents[agent.metadata.track_token] = self._build_agent_record(agent, self._scenario.start_time) + self._agents[agent.metadata.track_token] = self._build_agent_record(agent, timepoint_record) # Initialize planner. planner_init = PlannerInitialization( @@ -340,10 +366,11 @@ class MLPlannerAgents(AbstractObservation): elif self.planner_type == "idm": planner = IDMPlanner(**IDM_AGENT_CONFIG) elif self.planner_type == "pdm_closed": - planner = PDMClosedPlanner(**PDM_CLOSED_AGENT_CONFIG) + planner = PDMClosedPlanner(**PDM_CLOSED_AGENT_CONFIG, idm_policies=BatchIDMPolicy(**PDM_BATCH_IDM_CONFIG)) elif self.planner_type == "pdm_hybrid": assert self.pdm_hybrid_ckpt, "Must provide checkpoint path for PDM hybrid planner." - planner = PDMHybridPlanner(**PDM_CLOSED_AGENT_CONFIG, **PDM_HYBRID_AGENT_CONFIG, checkpoint_path=self.pdm_hybrid_ckpt) + planner = PDMHybridPlanner(**PDM_CLOSED_AGENT_CONFIG, idm_policies=BatchIDMPolicy(**PDM_BATCH_IDM_CONFIG), \ + **PDM_HYBRID_AGENT_CONFIG, model= PDMOffsetModel(**PDM_OFFSET_MODEL_CONFIG), checkpoint_path=self.pdm_hybrid_ckpt) else: raise ValueError("Invalid planner type.") -- GitLab