mirror of
https://github.com/dragonpilot/dragonpilot.git
synced 2026-02-18 16:23:52 +08:00
141 lines
6.5 KiB
Markdown
141 lines
6.5 KiB
Markdown
|
|
# ALKA (Always-on Lane Keeping Assist) Design v3
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
ALKA enables lateral control (steering) when ACC Main is ON, without requiring cruise to be engaged. This allows lane keeping assist to function independently of longitudinal control.
|
||
|
|
|
||
|
|
**Simplified Behavior (v3):**
|
||
|
|
- All brands use direct tracking: `lkas_on = acc_main_on`
|
||
|
|
- No button/toggle tracking (removed TJA, LKAS button, LKAS HUD)
|
||
|
|
- ACC Main ON = ALKA enabled, ACC Main OFF = ALKA disabled
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Per-Brand Summary
|
||
|
|
|
||
|
|
| Brand | Status | ACC Main Source | Notes |
|
||
|
|
|-------|--------|-----------------|-------|
|
||
|
|
| Body | Disabled | - | No steering capability |
|
||
|
|
| Chrysler | Disabled | - | Needs special handling |
|
||
|
|
| Ford | Enabled | EngBrakeData (0x165) CcStat | |
|
||
|
|
| GM | Disabled | - | No ACC Main signal |
|
||
|
|
| Honda Nidec | Enabled | SCM_FEEDBACK (0x326) MAIN_ON | |
|
||
|
|
| Honda Bosch | Enabled | SCM_FEEDBACK (0x326) MAIN_ON | |
|
||
|
|
| Hyundai | Enabled | SCC11 (0x420) bit 0 | |
|
||
|
|
| Hyundai CAN-FD | Enabled | SCC_CONTROL (0x1A0) bit 66 | |
|
||
|
|
| Hyundai Legacy | Enabled | SCC11 (0x420) bit 0 | |
|
||
|
|
| Mazda | Enabled | CRZ_CTRL (0x21C) bit 17 | |
|
||
|
|
| Nissan | Enabled | CRUISE_THROTTLE (0x239) bit 17 | |
|
||
|
|
| PSA | Disabled | - | Not implemented |
|
||
|
|
| Rivian | Disabled | - | Different architecture |
|
||
|
|
| Subaru | Enabled | CruiseControl (0x240) bit 40 | |
|
||
|
|
| Subaru Preglobal | Enabled | CruiseControl (0x144) bit 48 | |
|
||
|
|
| Tesla | Disabled | - | Different architecture |
|
||
|
|
| Toyota | Enabled | PCM_CRUISE_2 (0x1D3) bit 15 | |
|
||
|
|
| Toyota (UNSUPPORTED_DSU) | Enabled | DSU_CRUISE (0x365) bit 0 | |
|
||
|
|
| VW MQB | Enabled | TSK_06 TSK_Status (>=2) | |
|
||
|
|
| VW PQ | Enabled | Motor_5 (0x480) bit 50 (long) | |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Permission Model
|
||
|
|
|
||
|
|
Lateral control requires checks at both layers. Normal path uses `controls_allowed`, ALKA path uses additional checks.
|
||
|
|
|
||
|
|
| Check | Panda | openpilot | Notes |
|
||
|
|
|-------|:-----:|:---------:|-------|
|
||
|
|
| **Normal Path** |
|
||
|
|
| `controls_allowed` (cruise engaged) | ✓ | ✓ | Either this OR ALKA path |
|
||
|
|
| **ALKA Path** |
|
||
|
|
| `alka_allowed` (brand supports) | ✓ | ✓ | Set per brand in safety init |
|
||
|
|
| `ALT_EXP_ALKA` (user enabled) | ✓ | ✓ | alternativeExperience flag |
|
||
|
|
| `lkas_on` (ACC Main ON) | ✓ | ✓ | Tracked via CAN messages |
|
||
|
|
| `vehicle_moving` / `!standstill` | ✓ | ✓ | |
|
||
|
|
| **openpilot Additional** |
|
||
|
|
| `gear_ok` (not P/N/R) | ✗ | ✓ | Python layer only |
|
||
|
|
| `calibrated` | ✗ | ✓ | Python layer only |
|
||
|
|
| `seatbelt latched` | ✗ | ✓ | Python layer only |
|
||
|
|
| `doors closed` | ✗ | ✓ | Python layer only |
|
||
|
|
| `!steerFaultTemporary` | ✗ | ✓ | Python layer only |
|
||
|
|
| `!steerFaultPermanent` | ✗ | ✓ | Python layer only |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Data Flow
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─────────────────────────────────────────────────────────────────────┐
|
||
|
|
│ CAN Bus │
|
||
|
|
└─────────────────────────────────────────────────────────────────────┘
|
||
|
|
│ │
|
||
|
|
▼ ▼
|
||
|
|
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
|
||
|
|
│ Safety Layer (panda C code) │ │ Python Layer │
|
||
|
|
│ │ │ │
|
||
|
|
│ rx_hook: │ │ carstate.py: │
|
||
|
|
│ - Parse ACC Main signal │ │ - Parse cruiseState.available │
|
||
|
|
│ - Set lkas_on = acc_main_on │ │ - Set self.lkas_on │
|
||
|
|
│ │ │ │
|
||
|
|
│ lat_control_allowed(): │ └─────────────┬───────────────────┘
|
||
|
|
│ - Check lkas_on + other flags │ │
|
||
|
|
│ - Gate steering commands │ ▼
|
||
|
|
└─────────────────────────────────┘ ┌─────────────────────────────────┐
|
||
|
|
│ card.py: │
|
||
|
|
│ - Publish carStateExt.lkasOn │
|
||
|
|
└─────────────┬───────────────────┘
|
||
|
|
│
|
||
|
|
▼
|
||
|
|
┌─────────────────────────────────┐
|
||
|
|
│ controlsd.py: │
|
||
|
|
│ - Read carStateExt.lkasOn │
|
||
|
|
│ - Check ALKA conditions │
|
||
|
|
│ - Set CC.latActive │
|
||
|
|
└─────────────────────────────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
### Key Files
|
||
|
|
|
||
|
|
| File | Purpose |
|
||
|
|
|------|---------|
|
||
|
|
| `custom.capnp` | Defines `CarStateExt` struct with `lkasOn` field |
|
||
|
|
| `log.capnp` | Includes `carStateExt` in event union |
|
||
|
|
| `interfaces.py` | Defines `self.lkas_on = False` default in `CarStateBase` |
|
||
|
|
| `carstate.py` (per brand) | Tracks `lkas_on` based on ACC Main |
|
||
|
|
| `card.py` | Publishes `carStateExt.lkasOn` from `CI.CS.lkas_on` |
|
||
|
|
| `controlsd.py` | Reads `carStateExt.lkasOn` to determine `alka_active` |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## ACC Main Tracking
|
||
|
|
|
||
|
|
All brands use simple direct tracking:
|
||
|
|
|
||
|
|
```c
|
||
|
|
// Panda (C code)
|
||
|
|
if (alka_allowed && (alternative_experience & ALT_EXP_ALKA)) {
|
||
|
|
lkas_on = acc_main_on; // or GET_BIT(msg, bit_position)
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
```python
|
||
|
|
# Python carstate.py
|
||
|
|
self.lkas_on = ret.cruiseState.available
|
||
|
|
```
|
||
|
|
|
||
|
|
This guard ensures:
|
||
|
|
1. Brand supports ALKA (`alka_allowed`)
|
||
|
|
2. User enabled ALKA (`ALT_EXP_ALKA`)
|
||
|
|
|
||
|
|
Without both conditions, no ACC Main tracking occurs, and ALKA remains disabled.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Testing
|
||
|
|
|
||
|
|
Safety tests verify:
|
||
|
|
- `alka_allowed` flag set correctly per brand
|
||
|
|
- ACC Main tracking updates `lkas_on` directly
|
||
|
|
- `lat_control_allowed()` returns true only when all conditions met
|
||
|
|
- Steering TX blocked when ALKA conditions not met
|
||
|
|
- Bus routing variants (camera_scc, unsupported_dsu)
|