From 2f77c0d9eea980bfe650f5cdbb5a1cbdcd9d4b89 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 3 Jun 2023 20:57:51 -0400 Subject: [PATCH] Docs: sunnypilot README and relevant docs (#167) * Docs: sunnypilot README and relevant docs * Update QR dir * Add icon * Add back later * Dividers --- .github/FUNDING.yml | 12 + README.md | 483 +++++++++++++++++----- docs/HOW-TOS.md | 78 ++++ docs/sunnyhaibin0850_qrcode_paypal.me.png | Bin 0 -> 13021 bytes 4 files changed, 474 insertions(+), 99 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 docs/HOW-TOS.md create mode 100644 docs/sunnyhaibin0850_qrcode_paypal.me.png diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..23ed0ee37a --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [sunnyhaibin] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: ['https://paypal.me/sunnyhaibin0850'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/README.md b/README.md index 5428ea7a95..22442f2393 100755 --- a/README.md +++ b/README.md @@ -1,138 +1,424 @@ -![](https://i.imgur.com/b0ZyIx5.jpg) +![](https://user-images.githubusercontent.com/47793918/233812617-beab2e71-57b9-479e-8bff-c3931347ca40.png) Table of Contents ======================= -* [What is openpilot?](#what-is-openpilot) -* [Running in a car](#running-on-a-dedicated-device-in-a-car) -* [Running on PC](#running-on-pc) -* [Community and Contributing](#community-and-contributing) -* [User Data and comma Account](#user-data-and-comma-account) -* [Safety and Testing](#safety-and-testing) -* [Directory Structure](#directory-structure) +* [Join our Discord](#-join-our-discord) +* [What is sunnypilot?](#-what-is-sunnypilot) +* [Running in a car](#-running-on-a-dedicated-device-in-a-car) +* [Read Before Installing](#-read-before-installing) +* [Prohibited Safety Modifications](#-prohibited-safety-modifications) +* [Installation](#-installation) +* [Highlight Features](#-highlight-features) +* [Driving Enhancements](#-driving-enhancements) +* [Branch Definitions](#-branch-definitions) +* [Recommended Branches](#-recommended-branches) +* [How-To's](#-How-Tos) +* [User Data](#-user-data) +* [Donate](#-donate) +* [Pull Requests](#-Pull-Requests) +* [Special Thanks](#-special-thanks) * [Licensing](#licensing) --- -What is openpilot? +

πŸ’­ Join our Discord

+ +--- + +Join the official sunnypilot Discord server to stay up to date with all the latest features and be a part of shaping the future of sunnypilot! +* https://discord.sunnypilot.com + + ![](https://dcbadge.vercel.app/api/server/wRW3meAgtx?style=flat) ![Discord Shield](https://discordapp.com/api/guilds/880416502577266699/widget.png?style=shield) + +
+ +

🌞 What is sunnypilot?

+ +--- + +[sunnypilot](https://github.com/sunnyhaibin/sunnypilot) is a fork of comma.ai's openpilot, an open source driver assistance system. sunnypilot offers the user a unique driving experience for over 200 supported car makes and models with modified behaviors of driving assist engagements. sunnypilot complies with comma.ai's safety rules as accurately as possible. + +
+ +

🚘 Running on a dedicated device in a car

+ +--- + +To use sunnypilot in a car, you need the following: +* A supported device to run this software + * a [comma three](https://comma.ai/shop/products/three), or + * a comma two (only with older versions below 0.8.13) +* This software +* One of [the 250+ supported cars](https://github.com/commaai/openpilot/blob/master/docs/CARS.md). We support Honda, Toyota, Hyundai, Nissan, Kia, Chrysler, Lexus, Acura, Audi, VW, Ford and more. If your car is not supported but has adaptive cruise control and lane-keeping assist, it's likely able to run sunnypilot. +* A [car harness](https://comma.ai/shop/products/car-harness) to connect to your car + +Detailed instructions for [how to mount the device in a car](https://comma.ai/setup). + +
+ +

🚨 Read Before Installing

+ +--- + +It is recommended to read this **entire page** before proceeding. This will ensure that you fully understand each added feature on sunnypilot, and you are selecting the right branch for your car to have the best driving experience. + +This is a fork of [comma.ai's openpilot](https://github.com/commaai/openpilot). By installing this software, you accept all responsibility for anything that might occur while you use it. All contributors to sunnypilot are not liable. ❗**Use at your own risk.**❗ + +
+ +

β›” Prohibited Safety Modifications

+ +--- + +All [official sunnypilot branches](https://github.com/sunnyhaibin/sunnypilot/branches) strictly adhere to [comma.ai's safety policy](https://github.com/commaai/openpilot/blob/master/docs/SAFETY.md). Any changes that go against this policy will result in your fork and your device being banned from both comma.ai and sunnypilot channels. + +The following changes are a **VIOLATION** of this policy and **ARE NOT** included in any sunnypilot branches: +* Driver Monitoring: + * ❌ "Nerfing" or reducing monitoring parameters. +* Panda safety: + * ❌ No preventing disengaging of **LONGITUDINAL CONTROL** (acceleration/brake) on brake pedal press. + * ❌ No auto re-engaging of **LONGITUDINAL CONTROL** (acceleration/brake) on brake pedal release. + * ❌ No disengaging on ACC MAIN in OFF state. + +
+ + +

βš’ Installation

+ +--- + +
URL (Easy) + +comma three ------ -[openpilot](http://github.com/commaai/openpilot) is an open source driver assistance system. Currently, openpilot performs the functions of Adaptive Cruise Control (ACC), Automated Lane Centering (ALC), Forward Collision Warning (FCW), and Lane Departure Warning (LDW) for a growing variety of [supported car makes, models, and model years](docs/CARS.md). In addition, while openpilot is engaged, a camera-based Driver Monitoring (DM) feature alerts distracted and asleep drivers. See more about [the vehicle integration](docs/INTEGRATION.md) and [limitations](docs/LIMITATIONS.md). +Please refer to [Recommended Branches](#-recommended-branches) to find your preferred/supported branch, this guide will assume you want to install the latest release: - - - - - - - - - - - - - -
+1. [Factory reset/uninstall](https://github.com/commaai/openpilot/wiki/FAQ#how-can-i-reset-the-device) previous software if you already installed another software/fork. +2. Select `Custom Software` when given the option upon reboot. +3. Input the following URL: ```bit.ly/sp-dev-nicki-minaj```[^4] (note: `https://` is not requirement on the comma three) +4. Complete the rest of the installation following the onscreen instructions. +5. Pop into the `#installation-help` channel on Discord for further assistance. - -Running on a dedicated device in a car +comma two ------ -To use openpilot in a car, you need four things -* A supported device to run this software: a [comma three](https://comma.ai/shop/products/three). -* This software. The setup procedure of the comma three allows the user to enter a URL for custom software. -The URL, openpilot.comma.ai will install the release version of openpilot. To install openpilot master, you can use installer.comma.ai/commaai/master, and replacing commaai with another GitHub username can install a fork. -* One of [the 250+ supported cars](docs/CARS.md). We support Honda, Toyota, Hyundai, Nissan, Kia, Chrysler, Lexus, Acura, Audi, VW, Ford and more. If your car is not supported but has adaptive cruise control and lane-keeping assist, it's likely able to run openpilot. -* A [car harness](https://comma.ai/shop/products/car-harness) to connect to your car. +Please refer to [Recommended Branches](#-recommended-branches) to find your preferred/supported branch, this will assume you want to install the latest release: -We have detailed instructions for [how to mount the device in a car](https://comma.ai/setup). +1. Factory reset/uninstall previous software if you already installed another software/fork. +2. Select `Custom Software` when given the option. +3. Input the following URL: ```https://smiskol.com/fork/sunnyhaibin/0.8.12-4-prod``` +4. Complete the rest of the installation following the onscreen instructions. +5. Pop into the `#installation-help` channel on Discord for further assistance. -Running on PC +
+ +
+ SSH (More Versatile) +
+ +Prerequisites: [How to SSH](https://github.com/commaai/openpilot/wiki/SSH) + +If you are looking to install sunnyhaibin's fork via SSH, run the following command in an SSH terminal after connecting to your device: + + +comma three: ------ +* [`dev-nicki-minaj`](https://github.com/sunnyhaibin/openpilot/tree/dev-nicki-minaj): -All openpilot services can run as usual on a PC without requiring special hardware or a car. You can also run openpilot on recorded or simulated data to develop or experiment with openpilot. + ``` + cd /data; rm -rf ./openpilot; git clone -b dev-nicki-minaj --depth 1 --single-branch --recurse-submodules --shallow-submodules https://github.com/sunnyhaibin/sunnypilot.git openpilot; cd openpilot; sudo reboot + ``` -With openpilot's tools, you can plot logs, replay drives, and watch the full-res camera streams. See [the tools README](tools/README.md) for more information. - -You can also run openpilot in simulation [with the CARLA simulator](tools/sim/README.md). This allows openpilot to drive around a virtual car on your Ubuntu machine. The whole setup should only take a few minutes but does require a decent GPU. - -A PC running openpilot can also control your vehicle if it is connected to a [webcam](https://github.com/commaai/openpilot/tree/master/tools/webcam), a [black panda](https://comma.ai/shop/products/panda), and a [harness](https://comma.ai/shop/products/car-harness). - -Community and Contributing +comma two: ------ +* [`0.8.12-prod-personal-hkg`](https://github.com/sunnyhaibin/openpilot/tree/0.8.12-prod-personal-hkg): -openpilot is developed by [comma](https://comma.ai/) and by users like you. We welcome both pull requests and issues on [GitHub](http://github.com/commaai/openpilot). Bug fixes and new car ports are encouraged. Check out [the contributing docs](docs/CONTRIBUTING.md). + ``` + cd /data; rm -rf ./openpilot; git clone -b 0.8.12-prod-personal-hkg --depth 1 --single-branch --recurse-submodules --shallow-submodules https://github.com/sunnyhaibin/sunnypilot.git openpilot; cd openpilot; reboot + ``` -Documentation related to openpilot development can be found on [docs.comma.ai](https://docs.comma.ai). Information about running openpilot (e.g. FAQ, fingerprinting, troubleshooting, custom forks, community hardware) should go on the [wiki](https://github.com/commaai/openpilot/wiki). +After running the command to install the desired branch, your comma device should reboot. +
-You can add support for your car by following guides we have written for [Brand](https://blog.comma.ai/how-to-write-a-car-port-for-openpilot/) and [Model](https://blog.comma.ai/openpilot-port-guide-for-toyota-models/) ports. Generally, a car with adaptive cruise control and lane keep assist is a good candidate. [Join our Discord](https://discord.comma.ai) to discuss car ports: most car makes have a dedicated channel. +
-Want to get paid to work on openpilot? [comma is hiring](https://comma.ai/jobs#open-positions). -And [follow us on Twitter](https://twitter.com/comma_ai). +

πŸš— Highlight Features

-User Data and comma Account ------- +--- -By default, openpilot uploads the driving data to our servers. You can also access your data through [comma connect](https://connect.comma.ai/). We use your data to train better models and improve openpilot for everyone. +### Quality of Life Enhancements +- [**Modified Assistive Driving Safety (MADS)**](#modified-assistive-driving-safety-mads) - Automatic Lane Centering (ALC) / Lane Keep Assist System (LKAS) and Adaptive Cruise Control (ACC) / Smart Cruise Control (SCC) can be engaged independently of each other +- [**Dynamic Lane Profile (DLP)**](#dynamic-lane-profile-dlp) - Dynamically switch lane profile (between Laneful and Laneless) based on lane recognition confidence +- [**Enhanced Speed Control**](#enhanced-speed-control) - Automatically adjust cruise control speed using vision model, OpenStreetMap (OSM) data, and/or Speed Limit control (SLC) without user interaction + * Vision-based Turn Speed Control (V-TSC) - lower speed when going around corners using vision model + * Map-Data-based Turn Speed Control (M-TSC) - lower speed when going around corners using OSM data[^1] + * Speed Limit Control (SLC) - Set speed limit based on map data or car interface (if applicable) + * HKG only: Highway Driving Assist (HDA) status integration - Use cars native speed sign detection to set desired speed (on applicable HKG cars only) +- [**Gap Adjust Cruise (GAC)**](#gap-adjust-cruise) - Allow `GAP`/`INTERVAL`/`DISTANCE` button on the steering wheel or on-screen button to adjust the follow distance from the lead car. See table below for options + - [**Quiet Drive 🀫**](#-quiet-drive) - Toggle to mute all notification sounds (excluding driver safety warnings) + - [**Auto Lane Change Timer**](#Auto-Lane-Change-Timer) - Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set + - [**Force Car Recognition (FCR)**](#Force-Car-Recognition-) - Use a selector to force your car to be recognized by sunnypilot + - [**Fix sunnypilot No Offroad**](#Fix-sunnypilot-No-Offroad) - Enforce sunnypilot to go offroad and turns off after shutting down the car. This feature fixes non-official devices running sunnypilot without comma power + - [**Enable ACC+MADS with RES+/SET-**](#Enable-ACC+MADS-with-RES+/SET-) - Engage both ACC and MADS with a single press of RES+ or SET- button + - [**Offline OSM Maps**](#Offline-OSM-Maps) - OSM database can now be downloaded locally for offline use[^2]. This enables offline SLC, V-TSC and M-TSC. Currently available for US South, US West, US Northeast, Florida, Taiwan, South Africa and New Zealand + - [**Various Live Tuning**](#Various-Live-Tuning) - Ability to tailor your driving experience on the fly: + * Enforce Torque Lateral Control - Use the newest [torque controller](https://blog.comma.ai/0815release/#torque-controller) for all vehicles. + * Torque Lateral Control Live Tune - Ability to adjust the torque controller’s `FRICTION` and `LAT_ACCEL_FACTOR` values to suit your vehicle. + * Torque Lateral Controller Self-Tune - Enable automatic turning for the Torque controller. -openpilot is open source software: the user is free to disable data collection if they wish to do so. +### Visual Enhancements +* **M.A.D.S Status Icon** - Dedicated icon to display M.A.D.S. engagement status + * Green🟒: M.A.D.S. engaged + * Whiteβšͺ: M.A.D.S. suspended or disengaged +* **Lane Path Color** - Various lane path colors to display real-time Lane Model and M.A.D.S. engagement status + * 0.8.14 and later: + * BlueπŸ”΅: Laneful mode & M.A.D.S. engaged + * Green🟒: Laneless mode & M.A.D.S. engaged + * Yellow🟑: Experimental e2e & M.A.D.S. engaged + * Pre 0.8.14: + * Green🟒: Laneful mode & M.A.D.S. engaged + * RedπŸ”΄: Laneless mode & M.A.D.S. engaged + * Whiteβšͺ: M.A.D.S. suspended or disengaged + * Black⚫: M.A.D.S. engaged, steering is being manually overridden by user +* **Developer (Dev) UI** - Display various real-time metrics on screen while driving +* **Stand Still Timer** - Display time spent at a stop with M.A.D.S engaged (i.e., at traffic lights, stop signs, traffic congestions) +* **Braking Status** - Current car speed text turns red when the car is braking by the driver or ACC/SCC -openpilot logs the road-facing cameras, CAN, GPS, IMU, magnetometer, thermal sensors, crashes, and operating system logs. +### Operational Enhancements +* **Fast Boot** - sunnypilot will fast boot by creating a Prebuilt file +* **Disable Onroad Uploads** - Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot +* **Brightness Control (Global)** - Manually adjusts the global brightness of the screen +* **Driving Screen Off Timer** - Turns off the device screen or reduces brightness to protect the screen after car starts +* **Driving Screen Off Brightness (%)** - When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio +* **Max Time Offroad** - Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road) + +
+ +

πŸš— Driving Enhancements

+ +--- + +### Modified Assistive Driving Safety (MADS) +The goal of Modified Assistive Driving Safety (MADS) is to enhance the user driving experience with modified behaviors of driving assist engagements. This feature complies with comma.ai's safety rules as accurately as possible with the following changes: +* sunnypilot Automatic Lane Centering (ALC) and ACC/SCC can be engaged independently of each other +* Dedicated button to toggle sunnypilot ALC: + * `CRUISE (MAIN)` button: All supported cars on sunnypilot + * `LFA` button: Newer HKG cars with `LFA` button + * `LKAS` button: Honda, Toyota, Global Subaru +* `SET-` button enables ACC/SCC +* `CANCEL` button only disables ACC/SCC +* `CRUISE (MAIN)` must be `ON` to use ACC/SCC +* `CRUISE (MAIN)` button disables sunnypilot completely when `OFF` **(strictly enforced in panda safety code)** + +### Disengage Lateral ALC on Brake Press Mode toggle +Dedicated toggle to handle Lateral state on brake pedal press and release: +1. `ON`: `BRAKE pedal` press will pause Automatic Lane Centering; `BRAKE pedal` release will resume Automatic Lane Centering. Note: `BRAKE pedal` release will NOT resume ACC/SCC/Long control without explicit user engagement **(strictly enforced in panda safety code)** +2. `OFF`: `BRAKE pedal` press will NOT pause Automatic Lane Centering; `BRAKE pedal` release will NOT resume ACC/SCC/Long control without explicit user engagement **(strictly enforced in panda safety code)** + +### Miscellaneous +* `TURN SIGNALS` (`Left` or `Right`) will pause Automatic Lane Centering if the vehicle speed is below the [threshold](https://github.com/commaai/openpilot/blob/master/selfdrive/controls/lib/desire_helper.py#L8) for Automatic Lane Change +* Event audible alerts are more relaxed to match manufacturer's stock behavior +* Critical events trigger disengagement of Automatic Lane Centering completely. The disengagement is enforced in sunnypilot and panda safety + +### Dynamic Lane Profile (DLP) + +Dynamic Lane Profile (DLP) aims to provide the best driving experience at staying within a lane confidently. Dynamic Lane Profile allows sunnypilot to dynamically switch between lane profiles based on lane recognition confidence level on road. + +There are 3 modes to select on the onroad camera screen: +* **Auto Lane**: sunnypilot dynamically chooses between `Laneline` or `Laneless` model +* **Laneline**: sunnypilot uses Laneline model only. +* **Laneless**: sunnypilot uses Laneless model only. + +To use Dynamic Lane Profile, do the following: +``` +1. sunnypilot Settings -> `SP - Controls` -> Enable Dynamic Lane Profile -> ON toggle +2. Reboot. +3. Before driving, on the onroad camera screen, toggle between the 3 modes by pressing on the button. +4. Drive. +``` + +### Enhanced Speed Control +This fork now allows supported cars to dynamically adjust the longitudinal plan based on the fetched map data. Big thanks to the Move Fast team for the amazing implementation! + +**Supported cars:** +* sunnypilot Longitudinal Control capable +* Stock Longitudinal Control + * Hyundai/Kia/Genesis (non CAN-FD) + * Honda Bosch + * Volkswagen MQB + +Certain features are only available with an active data connection, via: +* [comma Prime](https://comma.ai/prime) - Intuitive service provided directly by comma, or +* Personal Hotspot - From your mobile device, or a dedicated hotspot from a cellular carrier. + +**Features:** +* Vision-based Turn Speed Control (VTSC) - Use vision path predictions to estimate the appropriate speed to drive through turns ahead - i.e. slowing down for curves +* Map-Data-based Turn Speed Control (MTSC) - Use curvature information from map data to define speed limits to take turns ahead - i.e. slowing down for curves[^1] +* Speed Limit Control (SLC) - Use speed limit signs information from map data and car interface to automatically adapt cruise speed to road limits + * HKG only: Highway Driving Assist (HDA) status integration - on applicable HKG cars only[^1] + * Speed Limit Offset - When Speed Limit Control is enabled, set speed limit slightly higher than the actual speed limit for a more natural drive[^1] +* Toggle Hands on Wheel Monitoring - Monitors and alerts the driver when their hands have not been on the steering wheel for an extended time + +### Custom Stock Longitudinal Control +While using stock Adaptive/Smart Cruise Control, Custom Stock Longitudinal Control in sunnypilot allows sunnypilot to manipulate and take over the set speed on the car's dashboard. + +**Supported Cars:** +* Hyundai/Kia/Genesis + * CAN platform + * CAN-FD platform with 0x1CF broadcasted in CAN traffic +* Honda Bosch +* Volkswagen MQB + +**Instruction** + +**πŸ“— How to use Custom Longitudinal Control on sunnypilot ** + +When using Speed Limit, Vision, or Map based Turn control, you will be setting the "MAX" ACC speed on the sunnypilot display instead of the one in the dashboard. The car will then set the ACC setting in the dashboard to the targeted speed, but will never exceed the max speed set on the sunnypilot display. A quick press of the RES+ or SET- buttons will change this speed by 5 MPH or KM/H on the sunnypilot display, while a long deliberate press (about a 1/2 second press) changes it by 1 MPH or KM/H. DO NOT hold the RES+ or SET- buttons for longer that a 1 second. Either make quick or long deliberate presses only. + +**β€Ό Where to look when setting ACC speed β€Ό** + +Do not look at the dashboard when setting your ACC max speed. Instead, only look at the one on the sunnypilot display, "MAX". The reason you need to look at the sunnypilot display is because sunnypilot will be changing the one in the dashboard. It will be adjusting it as needed, never raising it above the one set on the sunnypilot display. ONLY look at the MAX speed on the sunnypilot display when setting the ACC speed instead of the dashboard! + +(Courtesy instructions from John, author of jvePilot) + +### Gap Adjust Cruise +This fork now allows supported openpilot longitudinal cars to adjust the cruise gap between the car and the lead car. + +**Supported cars:** +* sunnypilot Longitudinal Control capable + +🚨**PROCEED WITH EXTREME CAUTION AND BE READY TO MANUALLY TAKE OVER AT ALL TIMES** + +There are 4 modes to select on the steering wheel and/or the onroad camera screen: +* **Stock Gap**: Stock sunnypilot distance - 1.45 second profile +* **Mild Gap**: Semi-aggressive distance - 1.25 second profile +* 🚨**Aggro Gap**🚨: Aggressive distance - 1.0 second profile + +**Availability** + +| Car Make | Stock Gap | Mild Gap | Aggro Gap | +|:-------------------:|:---------:|:--------:|:---------:| +| Honda/Acura | βœ… | βœ… | βœ… | +| Hyundai/Kia/Genesis | βœ… | βœ… | βœ… | +| Toyota/Lexus | βœ… | βœ… | βœ… | +| Volkswagen MQB/PQ | βœ… | βœ… | βœ… | + +
+ + +

βš’ Branch Definitions

+ +--- + +| Tag | Definition | Description | +|:--------:|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `prod` | Production/Release branches | Include features that are **verified** by trusted testers and the community. Ready to use. βœ… | +| `test` | Test branches | Include new features that are **tested** by trusted testers and the community. Stability may vary. ⚠ | +| `dev` | Development branches | All features are gathered in respective versions. Reviewed and merged features will be committed to `dev`. Stability may vary. ⚠ | +| `master` | Main branch | Syncs with [commaai's openpilot `master`](https://github.com/commaai/openpilot) upstream branch. Accepts all pull requests. Does not include all sunnypilot features. Stability may vary. ⚠ | + +Example: +* [`test-c3`](https://github.com/sunnyhaibin/sunnypilot/tree/test-c3): Latest test branch that are tested by trusted testers and the community, verification required. +* [`dev-nicki-minaj`](https://github.com/sunnyhaibin/sunnypilot/tree/dev-nicki-minaj): Latest development branch that include all sunnypilot features, testing required. + +
+ +

βœ… Recommended Branches

+ +--- + +| Branch | Definition | Compatible Device | Changelogs | +|:----------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------|-------------------|---------------------------------------------------------------------------------------------------------| +| [`0.8.12-prod-full-`](https://github.com/sunnyhaibin/sunnypilot/branches/all?query=0.8.12-prod-full) | β€’ Latest production/stable branch
β€’ Based on comma.ai's openpilot 0.8.12 | comma two/three | [`CHANGELOGS.md`](https://github.com/sunnyhaibin/sunnypilot/blob/0.8.12-prod-full-subaru/CHANGELOGS.md) | +| [`0.8.14-prod-c3`](https://github.com/sunnyhaibin/sunnypilot/tree/0.8.14-prod-c3) | β€’ Latest production/stable branch
β€’ Based on comma.ai's openpilot 0.8.14 | comma three | [`CHANGELOGS.md`](https://github.com/sunnyhaibin/sunnypilot/blob/0.8.14-prod-c3/CHANGELOGS.md) | +| [`test-c3`](https://github.com/sunnyhaibin/sunnypilot/tree/test-c3) | β€’ Latest test branch with experimental features
β€’ Based on comma.ai's openpilot commits up to December 16th, 2022 | comma three | [`CHANGELOGS.md`](https://github.com/sunnyhaibin/sunnypilot/blob/test-c3/CHANGELOGS.md) | +| [`dev-nicki-minaj`](https://github.com/sunnyhaibin/sunnypilot/tree/dev-nicki-minaj) | β€’ Latest development branch
β€’ Based on comma.ai's openpilot 0.9.2 release
β€’ Nicki Minaj driving model | comma three | [`CHANGELOGS.md`](https://github.com/sunnyhaibin/sunnypilot/blob/dev-nicki-minaj/CHANGELOGS.md) | + +
+ +

πŸ“— How To's

+ +--- + +How-To instructions can be found in [HOW-TOS.md](https://github.com/sunnyhaibin/openpilot/blob/(!)README/HOW-TOS.md). + +
+ + +

πŸŽ† Pull Requests

+ +--- + +We welcome both pull requests and issues on GitHub. Bug fixes are encouraged. + +Pull requests should be against the most current `master` branch. + +
+ +

πŸ† Special Thanks

+ +--- + +* [spektor56](https://github.com/spektor56/openpilot) +* [rav4kumar](https://github.com/rav4kumar/openpilot) +* [mob9221](https://github.com/mob9221/opendbc) +* [briantran33](https://github.com/briantran33/openpilot) +* [Aragon7777](https://github.com/aragon7777/openpilot) +* [sshane](https://github.com/sshane/openpilot-installer-generator) +* [jung](https://github.com/chanhojung/openpilot) +* [dri94](https://github.com/dri94/openpilot) +* [JamesKGithub](https://github.com/JamesKGithub/FrogPilot) +* [twilsonco](https://github.com/twilsonco/openpilot) +* [martinl](https://github.com/martinl/openpilot) +* [multikyd](https://github.com/openpilotkr) +* [Move Fast GmbH](https://github.com/move-fast/openpilot) +* [dragonpilot](https://github.com/dragonpilot-community/dragonpilot) +* [neokii](https://github.com/neokii/openpilot) +* [AlexandreSato](https://github.com/AlexandreSato/openpilot) +* [Moodkiller](https://github.com/moodkiller) + +
+ +

πŸ“Š User Data

+ +--- + +By default, sunnypilot uploads the driving data to comma servers. You can also access your data through [comma connect](https://connect.comma.ai/). + +sunnypilot is open source software. The user is free to disable data collection if they wish to do so. + +sunnypilot logs the road-facing camera, CAN, GPS, IMU, magnetometer, thermal sensors, crashes, and operating system logs. The driver-facing camera is only logged if you explicitly opt-in in settings. The microphone is not recorded. -By using openpilot, you agree to [our Privacy Policy](https://comma.ai/privacy). You understand that use of this software or its related services will generate certain types of user data, which may be logged and stored at the sole discretion of comma. By accepting this agreement, you grant an irrevocable, perpetual, worldwide right to comma for the use of this data. +By using this software, you understand that use of this software or its related services will generate certain types of user data, which may be logged and stored at the sole discretion of comma. By accepting this agreement, you grant an irrevocable, perpetual, worldwide right to comma for the use of this data. -Safety and Testing ----- +
-* openpilot observes ISO26262 guidelines, see [SAFETY.md](docs/SAFETY.md) for more details. -* openpilot has software-in-the-loop [tests](.github/workflows/selfdrive_tests.yaml) that run on every commit. -* The code enforcing the safety model lives in panda and is written in C, see [code rigor](https://github.com/commaai/panda#code-rigor) for more details. -* panda has software-in-the-loop [safety tests](https://github.com/commaai/panda/tree/master/tests/safety). -* Internally, we have a hardware-in-the-loop Jenkins test suite that builds and unit tests the various processes. -* panda has additional hardware-in-the-loop [tests](https://github.com/commaai/panda/blob/master/Jenkinsfile). -* We run the latest openpilot in a testing closet containing 10 comma devices continuously replaying routes. +

πŸ’° Donate

+If you find any of the features useful, feel free to donate to support for future feature development. -Directory Structure ------- - . - β”œβ”€β”€ cereal # The messaging spec and libs used for all logs - β”œβ”€β”€ common # Library like functionality we've developed here - β”œβ”€β”€ docs # Documentation - β”œβ”€β”€ opendbc # Files showing how to interpret data from cars - β”œβ”€β”€ panda # Code used to communicate on CAN - β”œβ”€β”€ third_party # External libraries - └── system # Generic services - β”œβ”€β”€ camerad # Driver to capture images from the camera sensors - β”œβ”€β”€ clocksd # Broadcasts current time - β”œβ”€β”€ hardware # Hardware abstraction classes - β”œβ”€β”€ logcatd # systemd journal as a service - β”œβ”€β”€ loggerd # Logger and uploader of car data - β”œβ”€β”€ proclogd # Logs information from /proc - β”œβ”€β”€ sensord # IMU interface code - └── ubloxd # u-blox GNSS module interface code - └── selfdrive # Code needed to drive the car - β”œβ”€β”€ assets # Fonts, images, and sounds for UI - β”œβ”€β”€ athena # Allows communication with the app - β”œβ”€β”€ boardd # Daemon to talk to the board - β”œβ”€β”€ car # Car specific code to read states and control actuators - β”œβ”€β”€ controls # Planning and controls - β”œβ”€β”€ debug # Tools to help you debug and do car ports - β”œβ”€β”€ locationd # Precise localization and vehicle parameter estimation - β”œβ”€β”€ manager # Daemon that starts/stops all other daemons as needed - β”œβ”€β”€ modeld # Driving and monitoring model runners - β”œβ”€β”€ monitoring # Daemon to determine driver attention - β”œβ”€β”€ navd # Turn-by-turn navigation - β”œβ”€β”€ test # Unit tests, system tests, and a car simulator - └── ui # The UI +Thank you for your continuous love and support! Enjoy πŸ₯° + +**PayPal:** + + +PayPal this + +

+ +**PayPal QR Code:** + +![sunnyhaibin0850_qrcode_paypal.me.png](docs/sunnyhaibin0850_qrcode_paypal.me.png) Licensing ------ openpilot is released under the MIT license. Some parts of the software are released under other licenses as specified. -Any user of this software shall indemnify and hold harmless Comma.ai, Inc. and its directors, officers, employees, agents, stockholders, affiliates, subcontractors and customers from and against all allegations, claims, actions, suits, demands, damages, liabilities, obligations, losses, settlements, judgments, costs and expenses (including without limitation attorneys’ fees and costs) which arise out of, relate to or result from any use of this software by user. +Any user of this software shall indemnify and hold harmless comma.ai, Inc. and its directors, officers, employees, agents, stockholders, affiliates, subcontractors and customers from and against all allegations, claims, actions, suits, demands, damages, liabilities, obligations, losses, settlements, judgments, costs and expenses (including without limitation attorneys’ fees and costs) which arise out of, relate to or result from any use of this software by user. **THIS IS ALPHA QUALITY SOFTWARE FOR RESEARCH PURPOSES ONLY. THIS IS NOT A PRODUCT. YOU ARE RESPONSIBLE FOR COMPLYING WITH LOCAL LAWS AND REGULATIONS. @@ -140,7 +426,6 @@ NO WARRANTY EXPRESSED OR IMPLIED.** --- - - -[![openpilot tests](https://github.com/commaai/openpilot/workflows/openpilot%20tests/badge.svg?event=push)](https://github.com/commaai/openpilot/actions) -[![codecov](https://codecov.io/gh/commaai/openpilot/branch/master/graph/badge.svg)](https://codecov.io/gh/commaai/openpilot) +[^1]:Requires data connection if not using Offline Maps data +[^2]:At least 50 GB of storage space is required. If you have the 32 GB version of comma three, upgrading with a compatible 250 GB or 1 TB SSD is strongly recommended +[^4]:Shortened URL for convenience. Full URL is ```smiskol.com/fork/sunnyhaibin/test-c3``` diff --git a/docs/HOW-TOS.md b/docs/HOW-TOS.md new file mode 100644 index 0000000000..8f5033a6d6 --- /dev/null +++ b/docs/HOW-TOS.md @@ -0,0 +1,78 @@ +# How Tos +This page is a repository of useful how-tos as a supplement for additional information. + +Table of Contents +======================= + +* [Radar Tracks](#Radar-Tracks) + * [Enable Radar Tracks](#-Enable-Radar-Tracks) +* [Enable Mapbox Navigation](#-Enable-Mapbox-Navigation) + +--- + +

πŸ“‘ Radar Tracks

+ +Radar tracks can now be enabled manually on applicable cars through SSH thanks to [@greghogan](https://github.com/greghogan) and [@pd0wm](https://github.com/pd0wm). + +Some Hyundai radars can be reconfigured to output (debug) radar points on bus 1. +Reconfiguration is done over UDS by reading/writing to 0x0142 using the Read/Write Data By Identifier +endpoints (0x22 & 0x2E). This script checks your radar firmware version against a list of known +firmware versions. If you want to try on a new radar, make sure to note the default config value +in case it is different from the other radars and you need to revert the changes. +After changing the config the car should not show any faults when openpilot is not running. +These config changes are persistent across car reboots. You need to run this script again +to go back to the default values. + +**USE AT YOUR OWN RISK!** Stock system safety features, like AEB and FCW, might be affected by these changes. + +**How radar points can be used along with vision:** +* Current OP long policy is identify with vision first, if vision sees a vehicle match it to a radar point. If vision sees nothing you get a false negative and no lead car detection. (Source: [Hubblesphere#7894 from comma.ai community Discord](https://discord.com/channels/469524606043160576/872899198738104330/872913890793635872)) + +### 🚨 Enable Radar Tracks + +***(EXPERIMENTAL, as of January 1st, 2022)*** + +***(Only applicable to some Hyundai, Kia, and Genesis cars, as of January 1st, 2022)*** + +*(Base on version 0.8.12 [`devel`](https://github.com/commaai/openpilot/tree/devel))* + +**USE AT YOUR OWN RISK!** Stock system safety features, like AEB and FCW, might be affected by these changes. + +1. Ensure the car is at the `OFF` ignition position. +2. Connect your compatible comma device (EON, C2, C3) to the car. comma device power should be ON. +3. Use a laptop or applicable device to connect to your comma device via SSH. (Tips: Instructions to SSH in [HERE](https://github.com/commaai/openpilot/wiki/SSH)) +4. In the SSH terminal after successfully connected to your comma device, execute the following commands: + 1. `pkill -f openpilot` + 2. `python /data/openpilot/selfdrive/debug/hyundai_enable_radar_points.py` + 3. Follow the instructions in the script: + * `Power on the vehicle keeping the engine off (press start button twice) then type OK to continue`. + * If successful, the following message should appear: `[DONE]. Restart your vehicle and ensure there are no faults`. + * If the script did not run successfully, reach out to the community in [Sunnyhaibin's Openpilot Discord Server](https://discord.gg/wRW3meAgtx) or `#hyundai-kia-genesis channel` on [commaai community Discord Server](https://discord.comma.ai) for assistance. + 4. Reboot your comma device: + 1. C3: `sudo reboot` + 2. C2 or EON: `reboot` +5. Once your comma device is rebooted, start your car with engine on (with or without comma device connected). Ensure that there are no faults from the car. If there are faults, reach out to the community in [Sunnyhaibin's Openpilot Discord Server](https://discord.gg/wRW3meAgtx) or `#hyundai-kia-genesis channel` on [commaai community Discord Server](https://discord.comma.ai) for assistance. +6. Go for a quick drive and drive behind a lead car with varied follow distance. Then, come back and allow the drive to upload its `rlogs` in [comma Connect](https://connect.comma.ai). +7. With all `rlogs` uploaded, open the drive in Cabana from [comma Connect](https://connect.comma.ai). Load DBC -> `hyundai_kia_mando_front_radar.dbc`, then search `RADAR_TRACK_50x` (`x` could be anything), open any of them, and look at `LONG_DIST`. +8. If the radar tracks data is relevant with the lead car you drove behind, you are done! Your car now have radar tracks enabled. +
+ +

πŸ—Ί Enable Mapbox Navigation

+ +1) Create a free mapbox account. Account will ask for a credit card for verification. You will not be charged for the free tier. +2) On the Dashboard, you will see a section called Access Tokens. Click `Create a Token`. Name it whatever you like. Set the scopes to allow everything for both Public and Secret. Copy both of these keys. **YOU WON'T BE ABLE TO ACCESS THE SECRET KEY AFTER THIS WINDOW.** +3) On your C3, go to `SP - Visuals` and toggle `Enable Mapbox Navigation*`. Accept the reboot. +4) Once rebooted, connect your C3 to a network with internet access and find the C3’s IP address. +5) In a browser, navigate to that IP with **port 8082** (i.e 192.168.1.69:8082). You should be greeted with the Comma logo and a public key input field. +6) Paste your Public token (pk.xx), click enter, paste your Secret key (sk.xx), click enter. You can now search for places. This page will be available at your devices’s IP address/port 8082 to search for destinations. +7) To set Home and Work addresses, search for a place, select Home/Work from the dropdown and click Navigate. For non-Home/Work destinations, select Recent Places.
*At this time, it is not possible to search directly on the C3.* + +**TIPS:** +- If your C3 is showing a black screen that says β€œMap Loading”, performing a reboot via the UI should fix it. +- If your phone can create a Hotspot, you are able to connect the C3 to your phone hotspot and use your phone browser to search for places. +- In the Navigation panel on the C3, you can select Home, Work, and from a list of Recent Places you have navigated to without needing a browser (assuming the C3 is connected to the internet.) + +**IMPORTANT NOTE:** Your C3 will require an active internet connection to download map data, generate driving directions, and ETA. Once map data and directions are downloaded, it *is* possible to use it offline, however nothing will update (such as new driving direction after a missed turn, updated ETA, map data further into your drive etc.) + +***NAVIGATION NOTE:** At this time, mapbox does not support alphanumeric addresses (i.e W123N1234 Main St). There is currently no known workaround for this.* +
diff --git a/docs/sunnyhaibin0850_qrcode_paypal.me.png b/docs/sunnyhaibin0850_qrcode_paypal.me.png new file mode 100644 index 0000000000000000000000000000000000000000..e187bb2ea2c32fd3bb3d44d04adb5343b9be2e10 GIT binary patch literal 13021 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 F{2yrVu8{x$ literal 0 HcmV?d00001