IQ.Pilot Release Commit @ 1399ceb
This commit is contained in:
@@ -1 +0,0 @@
|
|||||||
5dd3eebe813d76a72d63c76b1aac25e1c70b36bf
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"python/_iqclosure/_vendored.json": {
|
"python/_iqclosure/_vendored.json": {
|
||||||
"mode": 420,
|
"mode": 420,
|
||||||
"sha256": "6312a5dbc6e57c32c9ac07dbc30244d76e30f628f3633e576a02782fc140f522",
|
"sha256": "7129a872d199127747c6b251d90633857f0e179a8079063d060eeafbdced03ab",
|
||||||
"size": 1734
|
"size": 1773
|
||||||
},
|
},
|
||||||
"python/_iqclosure/iqpilot/__init__.py": {
|
"python/_iqclosure/iqpilot/__init__.py": {
|
||||||
"mode": 420,
|
"mode": 420,
|
||||||
@@ -156,8 +156,8 @@
|
|||||||
},
|
},
|
||||||
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py": {
|
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py": {
|
||||||
"mode": 420,
|
"mode": 420,
|
||||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
"sha256": "5865243a95ca4557d2a960302124a9898545cc3a8387e88ef569308e3d0f7077",
|
||||||
"size": 0
|
"size": 119
|
||||||
},
|
},
|
||||||
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py": {
|
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py": {
|
||||||
"mode": 420,
|
"mode": 420,
|
||||||
@@ -356,27 +356,27 @@
|
|||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "33808d1f465badf479acd5c52421820b1099ba45dffd05069ae020c0ab27956b",
|
"sha256": "ac62a6876710b148e793f3bab5e6a52d22e83468992fa05dbaa7d29e846ac399",
|
||||||
"size": 135552
|
"size": 135552
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "447102fb8ebb45404bb34c7a8219e77a6813b841596a590f0c649c8b016d161e",
|
"sha256": "02107df593150737b365238580006470af5f394c29a04516d07fcea6c0c7969f",
|
||||||
"size": 67664
|
"size": 67664
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "f560709ef0c7b2b2186fe79369b52e4825ea9de7dd931492528605315b4e88bf",
|
"sha256": "8fd8fa511d44cf667faad7c5dd92bd68ba7f98457d1e65b57115c9cc920fb316",
|
||||||
"size": 204640
|
"size": 204640
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "a26def1e1570d41ff76289be1232c9eb2f6d401006a817ec0e6d1892dbdfca3e",
|
"sha256": "e9a8759405e96ace952c49004303d189fb2be1a777b56956d9a90fa32e325f19",
|
||||||
"size": 69768
|
"size": 69768
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "e00f1fde78e58eb86270730f41279615dd8f1132e0d37f6e75e0b07b6a14967a",
|
"sha256": "d495b424ec0066020e1694a22cfca59e4998d4b11de4823fd8aee4add91a2407",
|
||||||
"size": 203088
|
"size": 203088
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/flockd/__init__.py": {
|
"python/iqpilot_private/konn3kt/flockd/__init__.py": {
|
||||||
@@ -386,12 +386,12 @@
|
|||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "d240551319c007e1defd47d9e280b54199f32905024f3c549f8abf4f2183cb8a",
|
"sha256": "466054f522dd6eb7e32f85bfd2d014cab5534662deb5b7b4d2842668f34bde6e",
|
||||||
"size": 202184
|
"size": 202184
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "b756bbe5241a27cb1eeb3bd7acc881eaf533ecb88a81d44b0b28d0355c2ce67a",
|
"sha256": "9b96c82bf946c8e4166d41487902a23750dec210d684ae153d86e7922d64b7bf",
|
||||||
"size": 68080
|
"size": 68080
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/__init__.py": {
|
"python/iqpilot_private/konn3kt/hephaestus/__init__.py": {
|
||||||
@@ -401,67 +401,67 @@
|
|||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip": {
|
"python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip": {
|
||||||
"mode": 420,
|
"mode": 420,
|
||||||
"sha256": "ebd0dfe45771ce084690a6dfe4f8f5c198a167b4df2ed7a609fc31bccea7d6a1",
|
"sha256": "7a9fe9bc8d6141e80e8e4c2befb5860ee287d820a62893729098114628d00357",
|
||||||
"size": 2100238
|
"size": 2100238
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "f4a10a4ade9e9104eaa95b6cccbee87485293090437106683ac157596f305620",
|
"sha256": "d7befce62715f669cbd763bac96e33eae8289ebe8085e2a842e7daa8bb42aeec",
|
||||||
"size": 268080
|
"size": 268080
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "81588dedf772af8847505f2b6ff2bb99f9988140b0ed26bbaaf8b178038881e8",
|
"sha256": "134fa9773cd5b502b6c791bad720f8c1b22ef71571543d366feb27fd2ce11b21",
|
||||||
"size": 406176
|
"size": 406176
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "1d847dc09d7a9253e75b4712ea74a57cfacc45f7af28eb8e4096390f50512548",
|
"sha256": "3b34c918c56bd534d661470c44f0aa1149126f68f013d8d0b631e6fcbf6b7fb3",
|
||||||
"size": 68048
|
"size": 68048
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "3ce8f20ab0cf2d72f8f7003b5ef669b82eabbf42a1232ebb1858532d4607947f",
|
"sha256": "c5e5b50579d97356e67db887588ffc2b5fa2225dc59a6c473bcfb0bd9c4fa482",
|
||||||
"size": 335776
|
"size": 335776
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "0c40d0452abf32d61c589f6c0450ace82b394daeef5ffa37578f4cbc2eed3ab2",
|
"sha256": "3b6704277d4c5a8713bfc45673c548e30a3d2111dc2b39bbba05ad98a072b4f8",
|
||||||
"size": 272112
|
"size": 272112
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "92844c34453ae2c7848be78d2694014696194f7d3f1bdce3f9200f5f02c46afd",
|
"sha256": "914e0027aa9926ed8433e40ec9b31a09826ccf145f243f1c228174ef618d69ef",
|
||||||
"size": 134408
|
"size": 134408
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "960b75c5cd0a71268e5b7feeb2564ec955b787620a878cd9568072cc0f856172",
|
"sha256": "2ea4610ac0d27268d2764beb86d3f0e363325de591f02bb1139b6ce5ccefdc8e",
|
||||||
"size": 3782232
|
"size": 3847768
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "a56bc2bec547cda4b7301d4f39899f2178a985b36fd82f7c8440f44e3a18714b",
|
"sha256": "172ff41c5d3728f6186fd705c56313bd8910bd271d76d38ebbe9f94f1110d88d",
|
||||||
"size": 136472
|
"size": 136472
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "f75e5bb8b1f08b0091e048402a80592a53e5c3c8ee9c299fc9a06538f74cae7e",
|
"sha256": "b3b96b633a4e5ced01b382cb423d2d44e5acd2ed08bc36b376c74ef0db5ef763",
|
||||||
"size": 68208
|
"size": 68208
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "558bdc66ebaa83b24f967ebc7f67479119d5ff8dc1853fd4ed6137b292050cbf",
|
"sha256": "b49c0e72b91db359e9c97ef91362e2a708228361b90e028a4cf029495aae65a5",
|
||||||
"size": 67840
|
"size": 67840
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "fa5503ef3e8b428a290252de3a7f7dae1bdbcc276505b20e77993057feb48c08",
|
"sha256": "0d9389cd00d0bcf85ece329b3e7ff0a106fea9772cf6663d995c059eabd680ae",
|
||||||
"size": 135664
|
"size": 135664
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "865c3c52118802edab7999b9f046de23757d26c504b3d33d77d7862c9e49bc7f",
|
"sha256": "650079ec882ae4aac58c2251c57617a47fe29f2848097a703dd4e4dd11cd4df1",
|
||||||
"size": 269600
|
"size": 269600
|
||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/uploaderd/__init__.py": {
|
"python/iqpilot_private/konn3kt/uploaderd/__init__.py": {
|
||||||
@@ -471,7 +471,7 @@
|
|||||||
},
|
},
|
||||||
"python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": {
|
"python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": {
|
||||||
"mode": 493,
|
"mode": 493,
|
||||||
"sha256": "af6f8c6d5c7e99316953f4249317a6c86ae68263445e570c659809fb05c03e15",
|
"sha256": "fdd33b9c9bbe5b6c699461f627c1d5fb327cb2f1494a83f09e0ecfd1d6eb8ddb",
|
||||||
"size": 336280
|
"size": 336280
|
||||||
},
|
},
|
||||||
"runtime": {
|
"runtime": {
|
||||||
@@ -515,25 +515,25 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"signatures": {
|
"signatures": {
|
||||||
"python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "I5WvMYxvGUQ21GFf3z5Bb/iwHyX9DXkImJPcJ2+pvYKepYkWXfKv44bsoN4gi+MszZDRfByXWOBpglSVL5G3Aw==",
|
"python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "OZaZmVdETSWhIHiKL/tiS8BJH9nIhZvOSdwokaWwz8A4DAXHDc6ZxPVvNthpt9tWeD3gdLVA1l3NoDxOL+vaAQ==",
|
||||||
"python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "rE32aIZL5MMCi/bx9Xn2i6YA8wg1Y2FkkrKpZcXRvd7k+eIPny0Rftle54HfxuKm6atBp8Gy2yWTgt2+pl8+AQ==",
|
"python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "fOnIVo0lkVPJccWVr+i3LLVzhlIkAQ/jUM8JRV78Cyyzy7mLepnN38qQ/Y/zLIMNgYowM5Uh3lQtXhpi73HRCw==",
|
||||||
"python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "QqiXU+Mfh/tcjB7S2ZBGoV0F4QrCi1Fz1NgBDWVQhYwnZh99vrBcZWuKkpCf8l1ej7cfsei6dPEIZ2ppnGIwCw==",
|
"python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "KBZ0V3Saibcb3sbD9LIMTYibszxoEV+pprWLZTf8FeWRrIh6s8aFLWSPALrv3AsdP9OQ4Uu6qH4gPY7+7BUADw==",
|
||||||
"python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "h4w1OXzywntiUNy9DZ4lIoimrIqzPbmD/Kx66veVsAZYuH4U2mAtTSRIU3OVD+01QCJTraux0ky21UmdbLLWBQ==",
|
"python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "gqMC+b4o9TzEZaIJLTZeQcjBZO0dePgGtEl754YpxiYTwJKNsu8wDgip960+dRs4TH30RNppSnsKTzByEHFfDQ==",
|
||||||
"python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "NFd15/tCR0axTA271DvJDg/UkGT7hJztxpjS9SnwgjSGawY3OseP8RjFT1eBk7aj6+j4zld3gIzfBbbYv6gxBQ==",
|
"python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "zMoW2sGwo+O9QurXu/kI1rBuy88//+heDjhrtmloEk7m6BUGGCVaYo18RTyERN5lhpjGGArC4uo+qQ0XqWlODA==",
|
||||||
"python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": "Kd1ueNtTDzE6rVn8dfTA6NtjGgzQOTuNq/eSmnvX+Y3CqSZXHsSEdts/hXTcieJaPBX3S1HYb9lJCRYPqqHJBg==",
|
"python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": "j+x6R2Kc3lmR3Vbzsfue/kYuK5n1pNdEUQm8DpgZK66xDSsMTxBd/hK+ucfiutfFXchOitBvNegqBjXD+qa3AA==",
|
||||||
"python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": "bA+/ixBULXSP2307fH18UnkQH8Ld6L9F9RtiFTgLeNC+sPyAM917lN7FBeY2HmFhOY3fqrwWmKI/2l1krgXcAg==",
|
"python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": "orpZvvoluLpjZ+92jmyrUbyqD7EOv2WlEBsEaMAFOCZiWxXrQxnHgUs/Van6gBmDMyT8zKTYuqsMovupBmQkDQ==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "z1gIQSglkHTy0Kt3fNocuxc8A6BxpsOgCWNkU0+bqU04YDibWFTYMhWwysMyG7rs8WH286R6oHAQJXCSD9FUAg==",
|
"python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "tbeuIL+jaDy4IJya/gJHNWGvU8xA2JcCyLRmQdopF68DCVwhzBnpF+9l2cPTPQ4+c+j/itwGwkwlkfMYDrVWDw==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "l0jmZ40q0Don2N8dqLWbWXfjA1QSE0hpWN9egEVlKeW+uKEEzdEqdCuVhpgGEhqwpT7T0PRIyu9ljs9BM0lLCw==",
|
"python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "HdkKaV0vEn/qnNPiMoKQ9BmUJOn/fFs8WKBYtT2VtAxP/UNOnHzVidOCEthgFBmcDGia2iJpAUzJJtaVW2plBg==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "KsBNelgm9ymfgcNkxKIPCGs0u3XY4cZV/WoWZ0a2kc75EeGb18Wvb/sEoNFIZJ5TAuUjty0CPGXSrBsQhzTZAQ==",
|
"python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "khgAZ6q6XZA4DyrNn+GeWl/pbVExjxfiiYgVDVb91TcfExQ0NKOHVFDjEOw+4sWDzjwJgqVOrq6ctFtZ4P+HCw==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "pqqHfl09zhLuNxfuUjbN8CKrXJhlSzLdkXn37Lw8XnwCBZKzYeq8FT/PCvi3EF/YTMi/Xd/tfLP4Zs86Jn5YDA==",
|
"python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "6ncETsGmDllGix8F7eEECALhCYjhzzBVz1ZtNIDs1l3Ydy2XJ8L8FigNJ/bed9SBb20gtGwYXMXRmiu/hZZfDA==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "tC0FMPYQToZvSvG/DIAUEpuRDGyhHt7KvygVWwdk9Iz1/oIp8zquQ9tIGM5xAEt2y+i2w2jSz88OJBaYZvmtDA==",
|
"python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "3CNA1ZxBEwKX1/XftG3bGEYjN/+j6Hts1JKM0gfgd9qW1J90XCF1U4sYUvutBXyITBAFoGwPG813d/juwCGkBg==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "uDYCHGcv2Mp1RURMROVAyJBFLOumSOzUJGEQoioXkyVoAhRG2UoguXikj0oBWGXKos98L4kI/TIAv0z73F5hBw==",
|
"python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "2VuGKUTtPfuwSxnLs5/EQ4QteD+6wgxDpzUiIkrxIbdeQ5RNeTWdq1oju6bPctUXZ97SJgm2q26rZhchF13PDg==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "F8BHYoLSCoNw9SVvp0cH8ZRFGuj7Ojg9FzJvKOgLiNkKsr5Kp5Da/t0jqLljUjRlEZh0a6lSBGRCj0VqS6n7BQ==",
|
"python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "7QUTUZNrIxuFyMR5Ksp8LZvUsziXqLrXN2XAcTeY5jOSl0eu0wwk0Vn0KUA4/C+zBJWF7Azok3m2oIPV+vQiBQ==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "sJXu00WLY6Xsbkc7YqoGbyKz8V07TTAda+LbtFmVyKTsfx1I/w4BrR6rK9QQ0uIvG80X/onVyWcJYkHcHI8GAg==",
|
"python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "4/CrUNcQQM+QRtZeRoUWHh0dlq2tFVYESqXn9ByRNG5jcwvCaTMhA3qbHnK7LnNcLqZf6nKPlKJG8gNZrnW3CA==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "2g0YPlO4c9mwv2p1FtVrQEatX/WM69bLDhVEhIg5rHeBBx75sdWRaKmnCKfR/odNleLhXWLolABESA830u4cAg==",
|
"python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "6j0Fl7SPymEo9Bhj8Rg2+56pkjZVY7yFPFjz1Mv5PnkZZUzCvmqbqArrxfKY8tmt17Zfn+Uq0XUx/A4ns868Aw==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "ATjdthMRDwYdJT00DALdiXQVoHTUNB9iyjPU6vUIf4GfC4vaOOBirUPZ4gtBOrLQS+hLn9w7nM2gF4fbSMsxCg==",
|
"python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "8/td493hepBmhe7AGfTiZ0DyGy7G1R2aQM8S5kOH8/7lxP1yOzPJNp0Q4IUdiO7PAv4K/Qs3mZXRqIb9m6muAQ==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "7N+zB4DBl9X2izAm4qBVafrtg5uaX7/sKyU4WzHgYtwo38qNZPSEALXcLdFHZ0bF3n3qvOZPKL7zGDLgNuapAg==",
|
"python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "YL4VfWwVM4LA30Ug/D5da0dpL2CrtS9k1iZGcHzxn0UZXg7gvn/CwofgPrAgqxKOuvwy8OAN4dseKCgvVl7tBw==",
|
||||||
"python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "LS6HrT0pDfbHnLHbfH60IRhAwO3kK5oFYsCiJhDbpPI8MxyNSqg7tU7SOoo3m0a+CzBKfEQP7ri0ZC2FFBhIBw==",
|
"python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "9ae5f6k/QFWnu/NcLHR4Jdp9teHEreFVqMstcgCS2krd2WDrA4RyenCMpAW5DssCVgK/SSYZ5R/mt784LtX5Dg==",
|
||||||
"python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "uQbFciwEpkVFn/LMozK0Jm9+ZDh2VuNpryBmT6m1NaC4v9bxJSFxC/CT4JvvtipRgJRTbFnzxOppiX+bt5pOBQ=="
|
"python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "FEavK888fANFifz5HwjkSnzyUicwrDoVMor1xg7dIDlflvBGeE+q+N45+EJNYuT+Gtu7z5NeBh3QWx8S9KHTDw=="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
0MdDcjhhpW0t9PD/b+przWxHmtrchzKk9Q24ViXNM7b46lNHbM1s5AfPwX2gFYhaJb9HKrSNDqq6GukmhdUBAw==
|
7unLWRQJMpEA37ml8a0VSDmIhihtSdBcl8LG9zT7eXqtHofgwK7hTGUGVWvGro/g7STaxm2yDGLe9maVHRpcAg==
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
"iqpilot.konn3kt.service_health",
|
"iqpilot.konn3kt.service_health",
|
||||||
"iqpilot.selfdrive.car.vehicle_catalog",
|
"iqpilot.selfdrive.car.vehicle_catalog",
|
||||||
"iqpilot.selfdrive.iqmodeld.config",
|
"iqpilot.selfdrive.iqmodeld.config",
|
||||||
|
"iqpilot.selfdrive.iqmodeld.models",
|
||||||
"iqpilot.selfdrive.iqmodeld.models.fetcher",
|
"iqpilot.selfdrive.iqmodeld.models.fetcher",
|
||||||
"iqpilot.selfdrive.iqmodeld.models.helpers",
|
"iqpilot.selfdrive.iqmodeld.models.helpers",
|
||||||
"iqpilot.selfdrive.locationd.calibrationd",
|
"iqpilot.selfdrive.locationd.calibrationd",
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
"""
|
||||||
|
Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
|
||||||
|
"""
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -22,6 +22,7 @@ from iqpilot.selfdrive.controls.lib.latcontrol_pid import LatControlPID
|
|||||||
from iqpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle, STEER_ANGLE_SATURATION_THRESHOLD
|
from iqpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle, STEER_ANGLE_SATURATION_THRESHOLD
|
||||||
from iqpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque
|
from iqpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque
|
||||||
from iqpilot.selfdrive.controls.lib.latcontrol_torque_pq import LatControlTorquePQ
|
from iqpilot.selfdrive.controls.lib.latcontrol_torque_pq import LatControlTorquePQ
|
||||||
|
from iqpilot.selfdrive.controls.lib.latcontrol_torque_v0 import LatControlTorqueV0, is_vw_mqb_torque
|
||||||
from iqpilot.selfdrive.controls.lib.longcontrol import LongControl
|
from iqpilot.selfdrive.controls.lib.longcontrol import LongControl
|
||||||
from iqpilot.system.proprietary_runtime._verified_import import import_verified_module
|
from iqpilot.system.proprietary_runtime._verified_import import import_verified_module
|
||||||
from iqpilot.selfdrive.locationd.helpers import PoseCalibrator, Pose
|
from iqpilot.selfdrive.locationd.helpers import PoseCalibrator, Pose
|
||||||
@@ -111,12 +112,20 @@ class Controls(IQControlsLayer):
|
|||||||
elif self.CP.lateralTuning.which() == 'pid':
|
elif self.CP.lateralTuning.which() == 'pid':
|
||||||
self.LaC = LatControlPID(self.CP, self.CP_IQ, self.CI, DT_CTRL)
|
self.LaC = LatControlPID(self.CP, self.CP_IQ, self.CI, DT_CTRL)
|
||||||
elif self.CP.lateralTuning.which() == 'torque':
|
elif self.CP.lateralTuning.which() == 'torque':
|
||||||
self.LaC = LatControlTorque(self.CP, self.CP_IQ, self.CI, DT_CTRL)
|
|
||||||
if self._use_pq_torque():
|
if self._use_pq_torque():
|
||||||
try:
|
try:
|
||||||
self.LaC = LatControlTorquePQ(self.CP, self.CP_IQ, self.CI, DT_CTRL)
|
self.LaC = LatControlTorquePQ(self.CP, self.CP_IQ, self.CI, DT_CTRL)
|
||||||
except Exception:
|
except Exception:
|
||||||
cloudlog.exception("LatControlTorquePQ init failed; using generic torque")
|
cloudlog.exception("LatControlTorquePQ init failed; using generic torque")
|
||||||
|
self.LaC = LatControlTorque(self.CP, self.CP_IQ, self.CI, DT_CTRL)
|
||||||
|
elif self._use_mqb_torque_v0():
|
||||||
|
try:
|
||||||
|
self.LaC = LatControlTorqueV0(self.CP, self.CP_IQ, self.CI, DT_CTRL)
|
||||||
|
except Exception:
|
||||||
|
cloudlog.exception("LatControlTorqueV0 init failed; using generic torque")
|
||||||
|
self.LaC = LatControlTorque(self.CP, self.CP_IQ, self.CI, DT_CTRL)
|
||||||
|
else:
|
||||||
|
self.LaC = LatControlTorque(self.CP, self.CP_IQ, self.CI, DT_CTRL)
|
||||||
|
|
||||||
def _use_pq_torque(self) -> bool:
|
def _use_pq_torque(self) -> bool:
|
||||||
try:
|
try:
|
||||||
@@ -128,6 +137,13 @@ class Controls(IQControlsLayer):
|
|||||||
cloudlog.exception("pq torque selection failed; using generic torque")
|
cloudlog.exception("pq torque selection failed; using generic torque")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def _use_mqb_torque_v0(self) -> bool:
|
||||||
|
try:
|
||||||
|
return is_vw_mqb_torque(self.CP)
|
||||||
|
except Exception:
|
||||||
|
cloudlog.exception("mqb torque v0 selection failed; using generic torque")
|
||||||
|
return False
|
||||||
|
|
||||||
def _update_params(self) -> None:
|
def _update_params(self) -> None:
|
||||||
self.enable_curvature_controller = self.params.get_bool("EnableCurvatureController")
|
self.enable_curvature_controller = self.params.get_bool("EnableCurvatureController")
|
||||||
self.enable_smooth_steer = self.params.get_bool("EnableSmoothSteer")
|
self.enable_smooth_steer = self.params.get_bool("EnableSmoothSteer")
|
||||||
@@ -320,7 +336,7 @@ class Controls(IQControlsLayer):
|
|||||||
hudControl.leftLaneDepart = self.sm['driverAssistance'].leftLaneDeparture
|
hudControl.leftLaneDepart = self.sm['driverAssistance'].leftLaneDeparture
|
||||||
hudControl.rightLaneDepart = self.sm['driverAssistance'].rightLaneDeparture
|
hudControl.rightLaneDepart = self.sm['driverAssistance'].rightLaneDeparture
|
||||||
|
|
||||||
if self.sm['selfdriveState'].active:
|
if CC.latActive:
|
||||||
CO = self.sm['carOutput']
|
CO = self.sm['carOutput']
|
||||||
if self.CP.steerControlType in (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED):
|
if self.CP.steerControlType in (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED):
|
||||||
self.steer_limited_by_safety = abs(CC.actuators.steeringAngleDeg - CO.actuatorsOutput.steeringAngleDeg) > \
|
self.steer_limited_by_safety = abs(CC.actuators.steeringAngleDeg - CO.actuatorsOutput.steeringAngleDeg) > \
|
||||||
|
|||||||
118
iqpilot/selfdrive/controls/lib/latcontrol_torque_v0.py
Normal file
118
iqpilot/selfdrive/controls/lib/latcontrol_torque_v0.py
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
# Copyright (c) 2018, Comma.ai, Inc.
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
|
||||||
|
# to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
# and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
# IN THE SOFTWARE.
|
||||||
|
|
||||||
|
import math
|
||||||
|
from collections import deque
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from iqpilot.cereal import log
|
||||||
|
from iqdbc.car.lateral import FRICTION_THRESHOLD, get_friction
|
||||||
|
from iqpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY
|
||||||
|
from iqpilot.common.filter_simple import FirstOrderFilter
|
||||||
|
from iqpilot.common.pid import PIDController
|
||||||
|
from iqpilot.selfdrive.controls.lib.latcontrol import LatControl
|
||||||
|
|
||||||
|
|
||||||
|
KP = 1.0
|
||||||
|
KI = 0.3
|
||||||
|
KD = 0.0
|
||||||
|
INTERP_SPEEDS = [1, 1.5, 2.0, 3.0, 5, 7.5, 10, 15, 30]
|
||||||
|
KP_INTERP = [250, 120, 65, 30, 11.5, 5.5, 3.5, 2.0, KP]
|
||||||
|
|
||||||
|
LP_FILTER_CUTOFF_HZ = 1.2
|
||||||
|
LAT_ACCEL_REQUEST_BUFFER_SECONDS = 1.0
|
||||||
|
VERSION = 0
|
||||||
|
|
||||||
|
|
||||||
|
def is_vw_mqb_torque(CP):
|
||||||
|
if CP.brand != 'volkswagen':
|
||||||
|
return False
|
||||||
|
from iqdbc.car.volkswagen.values import VolkswagenFlags
|
||||||
|
excluded_platforms = VolkswagenFlags.PQ | VolkswagenFlags.MLB | VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO
|
||||||
|
return not bool(CP.flags & excluded_platforms)
|
||||||
|
|
||||||
|
|
||||||
|
class LatControlTorqueV0(LatControl):
|
||||||
|
def __init__(self, CP, CP_IQ, CI, dt):
|
||||||
|
super().__init__(CP, CP_IQ, CI, dt)
|
||||||
|
self.torque_params = CP.lateralTuning.torque.as_builder()
|
||||||
|
self.torque_from_lateral_accel = CI.torque_from_lateral_accel()
|
||||||
|
self.lateral_accel_from_torque = CI.lateral_accel_from_torque()
|
||||||
|
self.pid = PIDController([INTERP_SPEEDS, KP_INTERP], KI, KD, rate=1 / self.dt)
|
||||||
|
self.update_limits()
|
||||||
|
self.steering_angle_deadzone_deg = self.torque_params.steeringAngleDeadzoneDeg
|
||||||
|
self.lat_accel_request_buffer_len = int(LAT_ACCEL_REQUEST_BUFFER_SECONDS / self.dt)
|
||||||
|
self.lat_accel_request_buffer = deque([0.] * self.lat_accel_request_buffer_len, maxlen=self.lat_accel_request_buffer_len)
|
||||||
|
self.previous_measurement = 0.0
|
||||||
|
self.measurement_rate_filter = FirstOrderFilter(0.0, 1 / (2 * np.pi * LP_FILTER_CUTOFF_HZ), self.dt)
|
||||||
|
|
||||||
|
def update_live_torque_params(self, latAccelFactor, latAccelOffset, friction):
|
||||||
|
self.torque_params.latAccelFactor = latAccelFactor
|
||||||
|
self.torque_params.latAccelOffset = latAccelOffset
|
||||||
|
self.torque_params.friction = friction
|
||||||
|
self.update_limits()
|
||||||
|
|
||||||
|
def update_limits(self):
|
||||||
|
self.pid.set_limits(self.lateral_accel_from_torque(self.steer_max, self.torque_params),
|
||||||
|
self.lateral_accel_from_torque(-self.steer_max, self.torque_params))
|
||||||
|
|
||||||
|
def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, calibrated_pose, curvature_limited, lat_delay,
|
||||||
|
lookahead_curvature=None):
|
||||||
|
pid_log = log.ControlsState.LateralTorqueState.new_message()
|
||||||
|
pid_log.version = VERSION
|
||||||
|
if not active:
|
||||||
|
output_torque = 0.0
|
||||||
|
pid_log.active = False
|
||||||
|
else:
|
||||||
|
measured_curvature = -VM.calc_curvature(math.radians(CS.steeringAngleDeg - params.angleOffsetDeg), CS.vEgo, params.roll)
|
||||||
|
roll_compensation = params.roll * ACCELERATION_DUE_TO_GRAVITY
|
||||||
|
curvature_deadzone = abs(VM.calc_curvature(math.radians(self.steering_angle_deadzone_deg), CS.vEgo, 0.0))
|
||||||
|
lateral_accel_deadzone = curvature_deadzone * CS.vEgo ** 2
|
||||||
|
|
||||||
|
delay_frames = int(np.clip(lat_delay / self.dt, 1, self.lat_accel_request_buffer_len))
|
||||||
|
expected_lateral_accel = self.lat_accel_request_buffer[-delay_frames]
|
||||||
|
future_desired_lateral_accel = desired_curvature * CS.vEgo ** 2
|
||||||
|
self.lat_accel_request_buffer.append(future_desired_lateral_accel)
|
||||||
|
gravity_adjusted_future_lateral_accel = future_desired_lateral_accel - roll_compensation
|
||||||
|
desired_lateral_jerk = (future_desired_lateral_accel - expected_lateral_accel) / lat_delay
|
||||||
|
|
||||||
|
measurement = measured_curvature * CS.vEgo ** 2
|
||||||
|
measurement_rate = self.measurement_rate_filter.update((measurement - self.previous_measurement) / self.dt)
|
||||||
|
self.previous_measurement = measurement
|
||||||
|
|
||||||
|
setpoint = lat_delay * desired_lateral_jerk + expected_lateral_accel
|
||||||
|
error = setpoint - measurement
|
||||||
|
|
||||||
|
pid_log.error = float(error)
|
||||||
|
feedforward = gravity_adjusted_future_lateral_accel
|
||||||
|
feedforward -= self.torque_params.latAccelOffset
|
||||||
|
feedforward += get_friction(error, lateral_accel_deadzone, FRICTION_THRESHOLD, self.torque_params)
|
||||||
|
|
||||||
|
freeze_integrator = steer_limited_by_safety or CS.steeringPressed or CS.vEgo < 5
|
||||||
|
output_lataccel = self.pid.update(pid_log.error, -measurement_rate, feedforward=feedforward, speed=CS.vEgo,
|
||||||
|
freeze_integrator=freeze_integrator)
|
||||||
|
output_torque = self.torque_from_lateral_accel(output_lataccel, self.torque_params)
|
||||||
|
|
||||||
|
pid_log.active = True
|
||||||
|
pid_log.p = float(self.pid.p)
|
||||||
|
pid_log.i = float(self.pid.i)
|
||||||
|
pid_log.d = float(self.pid.d)
|
||||||
|
pid_log.f = float(self.pid.f)
|
||||||
|
pid_log.output = float(-output_torque)
|
||||||
|
pid_log.actualLateralAccel = float(measurement)
|
||||||
|
pid_log.desiredLateralAccel = float(setpoint)
|
||||||
|
pid_log.desiredLateralJerk = float(desired_lateral_jerk)
|
||||||
|
pid_log.saturated = bool(self._check_saturation(self.steer_max - abs(output_torque) < 1e-3, CS, steer_limited_by_safety, curvature_limited))
|
||||||
|
|
||||||
|
return -output_torque, 0.0, pid_log
|
||||||
@@ -6,12 +6,14 @@ from iqdbc.car.honda.values import CAR as HONDA
|
|||||||
from iqdbc.car.toyota.values import CAR as TOYOTA
|
from iqdbc.car.toyota.values import CAR as TOYOTA
|
||||||
from iqdbc.car.nissan.values import CAR as NISSAN
|
from iqdbc.car.nissan.values import CAR as NISSAN
|
||||||
from iqdbc.car.gm.values import CAR as GM
|
from iqdbc.car.gm.values import CAR as GM
|
||||||
|
from iqdbc.car.volkswagen.values import CAR as VOLKSWAGEN
|
||||||
from iqdbc.car.vehicle_model import VehicleModel
|
from iqdbc.car.vehicle_model import VehicleModel
|
||||||
from iqpilot.common.realtime import DT_CTRL
|
from iqpilot.common.realtime import DT_CTRL
|
||||||
from iqpilot.selfdrive.car.helpers import convert_to_capnp
|
from iqpilot.selfdrive.car.helpers import convert_to_capnp
|
||||||
from iqpilot.selfdrive.controls.lib.latcontrol_pid import LatControlPID
|
from iqpilot.selfdrive.controls.lib.latcontrol_pid import LatControlPID
|
||||||
from iqpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque
|
from iqpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque
|
||||||
from iqpilot.selfdrive.controls.lib.latcontrol_torque_pq import LatControlTorquePQ
|
from iqpilot.selfdrive.controls.lib.latcontrol_torque_pq import LatControlTorquePQ
|
||||||
|
from iqpilot.selfdrive.controls.lib.latcontrol_torque_v0 import LatControlTorqueV0, is_vw_mqb_torque
|
||||||
import iqpilot.selfdrive.controls.lib.latcontrol_torque_pq as latcontrol_torque_pq
|
import iqpilot.selfdrive.controls.lib.latcontrol_torque_pq as latcontrol_torque_pq
|
||||||
from iqpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle
|
from iqpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle
|
||||||
from iqpilot.selfdrive.locationd.helpers import Pose
|
from iqpilot.selfdrive.locationd.helpers import Pose
|
||||||
@@ -31,7 +33,17 @@ class TestLatControl:
|
|||||||
iqpilot_interfaces.apply_iq_car_config(CI)
|
iqpilot_interfaces.apply_iq_car_config(CI)
|
||||||
return CP, LatControlTorquePQ(CP.as_reader(), convert_to_capnp(CP_IQ).as_reader(), CI, DT_CTRL)
|
return CP, LatControlTorquePQ(CP.as_reader(), convert_to_capnp(CP_IQ).as_reader(), CI, DT_CTRL)
|
||||||
|
|
||||||
@parameterized.expand([(HONDA.HONDA_CIVIC, LatControlPID), (TOYOTA.TOYOTA_RAV4, LatControlTorque),
|
@staticmethod
|
||||||
|
def build_v0_controller():
|
||||||
|
car_name = TOYOTA.TOYOTA_RAV4
|
||||||
|
CarInterface = interfaces[car_name]
|
||||||
|
CP = CarInterface.get_non_essential_params(car_name)
|
||||||
|
CP_IQ = CarInterface.get_non_essential_params_iq(CP, car_name)
|
||||||
|
CI = CarInterface(CP, CP_IQ)
|
||||||
|
iqpilot_interfaces.apply_iq_car_config(CI)
|
||||||
|
return CP, LatControlTorqueV0(CP.as_reader(), convert_to_capnp(CP_IQ).as_reader(), CI, DT_CTRL)
|
||||||
|
|
||||||
|
@parameterized.expand([(HONDA.HONDA_CIVIC, LatControlPID), (TOYOTA.TOYOTA_RAV4, LatControlTorque), (TOYOTA.TOYOTA_RAV4, LatControlTorqueV0),
|
||||||
(NISSAN.NISSAN_LEAF, LatControlAngle), (GM.CHEVROLET_BOLT_EUV, LatControlTorque)])
|
(NISSAN.NISSAN_LEAF, LatControlAngle), (GM.CHEVROLET_BOLT_EUV, LatControlTorque)])
|
||||||
def test_saturation(self, car_name, controller):
|
def test_saturation(self, car_name, controller):
|
||||||
CarInterface = interfaces[car_name]
|
CarInterface = interfaces[car_name]
|
||||||
@@ -78,6 +90,28 @@ class TestLatControl:
|
|||||||
_, _, lac_log = controller.update(True, CS, VM, params, False, 0.001, pose, False, 0.2)
|
_, _, lac_log = controller.update(True, CS, VM, params, False, 0.001, pose, False, 0.2)
|
||||||
assert lac_log.active
|
assert lac_log.active
|
||||||
|
|
||||||
|
def test_v0_uses_current_lateral_acceleration_setpoint(self):
|
||||||
|
CP, controller = self.build_v0_controller()
|
||||||
|
VM = VehicleModel(CP)
|
||||||
|
CS = car.CarState.new_message(vEgo=30)
|
||||||
|
params = log.VehicleParameters.new_message()
|
||||||
|
pose = Pose.from_live_pose(generate_deviceMotion().deviceMotion)
|
||||||
|
|
||||||
|
_, _, lac_log = controller.update(True, CS, VM, params, False, 0.001, pose, False, 0.3)
|
||||||
|
|
||||||
|
assert lac_log.version == 0
|
||||||
|
assert abs(lac_log.desiredLateralAccel - 0.9) < 1e-6
|
||||||
|
|
||||||
|
def test_v0_platform_selection(self):
|
||||||
|
mqb_interface = interfaces[VOLKSWAGEN.VOLKSWAGEN_PASSAT_MK8]
|
||||||
|
mqb_params = mqb_interface.get_non_essential_params(VOLKSWAGEN.VOLKSWAGEN_PASSAT_MK8)
|
||||||
|
|
||||||
|
assert is_vw_mqb_torque(mqb_params)
|
||||||
|
for car_name in (VOLKSWAGEN.VOLKSWAGEN_PASSAT_MK7, VOLKSWAGEN.VOLKSWAGEN_GOLF_MK8,
|
||||||
|
VOLKSWAGEN.VOLKSWAGEN_ID4_MK1, VOLKSWAGEN.AUDI_A4_MK4, TOYOTA.TOYOTA_RAV4):
|
||||||
|
CarInterface = interfaces[car_name]
|
||||||
|
assert not is_vw_mqb_torque(CarInterface.get_non_essential_params(car_name))
|
||||||
|
|
||||||
def test_pq_controller_inactive_lookahead_and_slew_reset(self):
|
def test_pq_controller_inactive_lookahead_and_slew_reset(self):
|
||||||
CP, controller = self.build_pq_controller()
|
CP, controller = self.build_pq_controller()
|
||||||
controller.curvature_lookahead_enabled = True
|
controller.curvature_lookahead_enabled = True
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ MIN_VEGO = 50.0 * CV.MPH_TO_MS
|
|||||||
MIN_ABS_YAW_RATE = 0.0
|
MIN_ABS_YAW_RATE = 0.0
|
||||||
MAX_YAW_RATE_SANITY_CHECK = 1.0
|
MAX_YAW_RATE_SANITY_CHECK = 1.0
|
||||||
MIN_NCC = 0.95
|
MIN_NCC = 0.95
|
||||||
MAX_LAG = 1.0
|
MAX_LAG = 0.65
|
||||||
MIN_LAG = 0.15
|
MIN_LAG = 0.15
|
||||||
MAX_LAG_STD = 0.1
|
MAX_LAG_STD = 0.1
|
||||||
MAX_LAT_ACCEL = 2.0
|
MAX_LAT_ACCEL = 2.0
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ class TestLagd:
|
|||||||
assert np.argmax(corr) in range(lag_frames - MAX_ERR_FRAMES, lag_frames + MAX_ERR_FRAMES + 1)
|
assert np.argmax(corr) in range(lag_frames - MAX_ERR_FRAMES, lag_frames + MAX_ERR_FRAMES + 1)
|
||||||
|
|
||||||
def test_empty_estimator(self):
|
def test_empty_estimator(self):
|
||||||
mocked_CP = car.CarParams(steerActuatorDelay=0.8)
|
mocked_CP = car.CarParams(steerActuatorDelay=0.5)
|
||||||
estimator = LateralLagEstimator(mocked_CP, DT)
|
estimator = LateralLagEstimator(mocked_CP, DT)
|
||||||
msg = estimator.get_msg(True)
|
msg = estimator.get_msg(True)
|
||||||
assert msg.lateralDelay.status == 'unestimated'
|
assert msg.lateralDelay.status == 'unestimated'
|
||||||
@@ -100,7 +100,7 @@ class TestLagd:
|
|||||||
def test_estimator_basics(self, subtests):
|
def test_estimator_basics(self, subtests):
|
||||||
for lag_frames in range(LAGD_MIN_LAG_FRAMES, LAGD_MAX_LAG_FRAMES - 1):
|
for lag_frames in range(LAGD_MIN_LAG_FRAMES, LAGD_MAX_LAG_FRAMES - 1):
|
||||||
with subtests.test(msg=f"lag_frames={lag_frames}"):
|
with subtests.test(msg=f"lag_frames={lag_frames}"):
|
||||||
mocked_CP = car.CarParams(steerActuatorDelay=0.8)
|
mocked_CP = car.CarParams(steerActuatorDelay=0.5)
|
||||||
estimator = LateralLagEstimator(mocked_CP, DT, min_recovery_buffer_sec=0.0, min_yr=0.0)
|
estimator = LateralLagEstimator(mocked_CP, DT, min_recovery_buffer_sec=0.0, min_yr=0.0)
|
||||||
process_messages(estimator, lag_frames, int(MIN_OKAY_WINDOW_SEC / DT) + BLOCK_NUM_NEEDED * BLOCK_SIZE)
|
process_messages(estimator, lag_frames, int(MIN_OKAY_WINDOW_SEC / DT) + BLOCK_NUM_NEEDED * BLOCK_SIZE)
|
||||||
msg = estimator.get_msg(True)
|
msg = estimator.get_msg(True)
|
||||||
@@ -112,7 +112,7 @@ class TestLagd:
|
|||||||
assert msg.lateralDelay.calPerc == 100
|
assert msg.lateralDelay.calPerc == 100
|
||||||
|
|
||||||
def test_estimator_masking(self):
|
def test_estimator_masking(self):
|
||||||
mocked_CP, lag_frames = car.CarParams(steerActuatorDelay=0.8), random.randint(LAGD_MIN_LAG_FRAMES, LAGD_MAX_LAG_FRAMES - 1)
|
mocked_CP, lag_frames = car.CarParams(steerActuatorDelay=0.5), random.randint(LAGD_MIN_LAG_FRAMES, LAGD_MAX_LAG_FRAMES - 1)
|
||||||
estimator = LateralLagEstimator(mocked_CP, DT, min_recovery_buffer_sec=0.0, min_yr=0.0, min_valid_block_count=1)
|
estimator = LateralLagEstimator(mocked_CP, DT, min_recovery_buffer_sec=0.0, min_yr=0.0, min_valid_block_count=1)
|
||||||
process_messages(estimator, lag_frames, (int(MIN_OKAY_WINDOW_SEC / DT) + BLOCK_SIZE) * 2, rejection_threshold=0.4)
|
process_messages(estimator, lag_frames, (int(MIN_OKAY_WINDOW_SEC / DT) + BLOCK_SIZE) * 2, rejection_threshold=0.4)
|
||||||
msg = estimator.get_msg(True)
|
msg = estimator.get_msg(True)
|
||||||
@@ -122,7 +122,7 @@ class TestLagd:
|
|||||||
|
|
||||||
@pytest.mark.timeout(60)
|
@pytest.mark.timeout(60)
|
||||||
def test_estimator_performance(self):
|
def test_estimator_performance(self):
|
||||||
mocked_CP = car.CarParams(steerActuatorDelay=0.8)
|
mocked_CP = car.CarParams(steerActuatorDelay=0.5)
|
||||||
estimator = LateralLagEstimator(mocked_CP, DT)
|
estimator = LateralLagEstimator(mocked_CP, DT)
|
||||||
|
|
||||||
ds = []
|
ds = []
|
||||||
|
|||||||
Reference in New Issue
Block a user