mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-03-02 09:43:54 +08:00
3d90c7877 Fix wrong event enum
f4c92cf4e add none/invalid usb power mode
12bc18965 Add fields and states required for robust Volkswagen safety compliance (#8)
16b5850f1 let's spell wolkswagen
6243622e6 Safety cereal (#9)
5cf3c2c76 change order of UsbPowerMode to preserve panda lib behavior
18a291779 usbPowerMode is more useful to log and it comes from panda
152678429 add ldw to visual hud alerts (#5)
24f6fa78c merge https://github.com/commaai/cereal/pull/3 after fixing conflicts
4d5862c54 added event about internet connection
ca070f9fd Added usbPowerOn to health
e2eaa762b add HW type for UNO
e528a2041 Read RPM from fan connected to Panda
8472175d6 Added invalidGiraffeToyota event
71be97053 placeholders for mazda, nissan and vw safety models
git-subtree-dir: cereal
git-subtree-split: 3d90c7877f9ef9269735b074c0cb23f5eb6d2b47
old-commit-hash: f66527d0b1
436 lines
10 KiB
Cap'n Proto
436 lines
10 KiB
Cap'n Proto
using Cxx = import "./include/c++.capnp";
|
|
$Cxx.namespace("cereal");
|
|
|
|
using Java = import "./include/java.capnp";
|
|
$Java.package("ai.comma.openpilot.cereal");
|
|
$Java.outerClassname("Car");
|
|
|
|
@0x8e2af1e708af8b8d;
|
|
|
|
# ******* events causing controls state machine transition *******
|
|
|
|
struct CarEvent @0x9b1657f34caf3ad3 {
|
|
name @0 :EventName;
|
|
enable @1 :Bool;
|
|
noEntry @2 :Bool;
|
|
warning @3 :Bool;
|
|
userDisable @4 :Bool;
|
|
softDisable @5 :Bool;
|
|
immediateDisable @6 :Bool;
|
|
preEnable @7 :Bool;
|
|
permanent @8 :Bool;
|
|
|
|
enum EventName @0xbaa8c5d505f727de {
|
|
# TODO: copy from error list
|
|
canError @0;
|
|
steerUnavailable @1;
|
|
brakeUnavailable @2;
|
|
gasUnavailable @3;
|
|
wrongGear @4;
|
|
doorOpen @5;
|
|
seatbeltNotLatched @6;
|
|
espDisabled @7;
|
|
wrongCarMode @8;
|
|
steerTempUnavailable @9;
|
|
reverseGear @10;
|
|
buttonCancel @11;
|
|
buttonEnable @12;
|
|
pedalPressed @13;
|
|
cruiseDisabled @14;
|
|
radarCanError @15;
|
|
dataNeeded @16;
|
|
speedTooLow @17;
|
|
outOfSpace @18;
|
|
overheat @19;
|
|
calibrationIncomplete @20;
|
|
calibrationInvalid @21;
|
|
controlsMismatch @22;
|
|
pcmEnable @23;
|
|
pcmDisable @24;
|
|
noTarget @25;
|
|
radarFault @26;
|
|
modelCommIssueDEPRECATED @27;
|
|
brakeHold @28;
|
|
parkBrake @29;
|
|
manualRestart @30;
|
|
lowSpeedLockout @31;
|
|
plannerError @32;
|
|
ipasOverride @33;
|
|
debugAlert @34;
|
|
steerTempUnavailableMute @35;
|
|
resumeRequired @36;
|
|
preDriverDistracted @37;
|
|
promptDriverDistracted @38;
|
|
driverDistracted @39;
|
|
geofence @40;
|
|
driverMonitorOn @41;
|
|
driverMonitorOff @42;
|
|
preDriverUnresponsive @43;
|
|
promptDriverUnresponsive @44;
|
|
driverUnresponsive @45;
|
|
belowSteerSpeed @46;
|
|
calibrationProgress @47;
|
|
lowBattery @48;
|
|
invalidGiraffeHonda @49;
|
|
vehicleModelInvalid @50;
|
|
controlsFailed @51;
|
|
sensorDataInvalid @52;
|
|
commIssue @53;
|
|
tooDistracted @54;
|
|
posenetInvalid @55;
|
|
soundsUnavailable @56;
|
|
preLaneChangeLeft @57;
|
|
preLaneChangeRight @58;
|
|
laneChange @59;
|
|
invalidGiraffeToyota @60;
|
|
internetConnectivityNeeded @61;
|
|
}
|
|
}
|
|
|
|
# ******* main car state @ 100hz *******
|
|
# all speeds in m/s
|
|
|
|
struct CarState {
|
|
errorsDEPRECATED @0 :List(CarEvent.EventName);
|
|
events @13 :List(CarEvent);
|
|
|
|
# car speed
|
|
vEgo @1 :Float32; # best estimate of speed
|
|
aEgo @16 :Float32; # best estimate of acceleration
|
|
vEgoRaw @17 :Float32; # unfiltered speed from CAN sensors
|
|
yawRate @22 :Float32; # best estimate of yaw rate
|
|
standstill @18 :Bool;
|
|
wheelSpeeds @2 :WheelSpeeds;
|
|
|
|
# gas pedal, 0.0-1.0
|
|
gas @3 :Float32; # this is user + computer
|
|
gasPressed @4 :Bool; # this is user pedal only
|
|
|
|
# brake pedal, 0.0-1.0
|
|
brake @5 :Float32; # this is user pedal only
|
|
brakePressed @6 :Bool; # this is user pedal only
|
|
brakeLights @19 :Bool;
|
|
|
|
# steering wheel
|
|
steeringAngle @7 :Float32; # deg
|
|
steeringRate @15 :Float32; # deg/s
|
|
steeringTorque @8 :Float32; # TODO: standardize units
|
|
steeringTorqueEps @27 :Float32; # TODO: standardize units
|
|
steeringPressed @9 :Bool; # if the user is using the steering wheel
|
|
|
|
# cruise state
|
|
cruiseState @10 :CruiseState;
|
|
|
|
# gear
|
|
gearShifter @14 :GearShifter;
|
|
|
|
# button presses
|
|
buttonEvents @11 :List(ButtonEvent);
|
|
leftBlinker @20 :Bool;
|
|
rightBlinker @21 :Bool;
|
|
genericToggle @23 :Bool;
|
|
|
|
# lock info
|
|
doorOpen @24 :Bool;
|
|
seatbeltUnlatched @25 :Bool;
|
|
canValid @26 :Bool;
|
|
|
|
# clutch (manual transmission only)
|
|
clutchPressed @28 :Bool;
|
|
|
|
# which packets this state came from
|
|
canMonoTimes @12: List(UInt64);
|
|
|
|
struct WheelSpeeds {
|
|
# optional wheel speeds
|
|
fl @0 :Float32;
|
|
fr @1 :Float32;
|
|
rl @2 :Float32;
|
|
rr @3 :Float32;
|
|
}
|
|
|
|
struct CruiseState {
|
|
enabled @0 :Bool;
|
|
speed @1 :Float32;
|
|
available @2 :Bool;
|
|
speedOffset @3 :Float32;
|
|
standstill @4 :Bool;
|
|
}
|
|
|
|
enum GearShifter {
|
|
unknown @0;
|
|
park @1;
|
|
drive @2;
|
|
neutral @3;
|
|
reverse @4;
|
|
sport @5;
|
|
low @6;
|
|
brake @7;
|
|
eco @8;
|
|
manumatic @9;
|
|
}
|
|
|
|
|
|
# send on change
|
|
struct ButtonEvent {
|
|
pressed @0 :Bool;
|
|
type @1 :Type;
|
|
|
|
enum Type {
|
|
unknown @0;
|
|
leftBlinker @1;
|
|
rightBlinker @2;
|
|
accelCruise @3;
|
|
decelCruise @4;
|
|
cancel @5;
|
|
altButton1 @6;
|
|
altButton2 @7;
|
|
altButton3 @8;
|
|
setCruise @9;
|
|
resumeCruise @10;
|
|
gapAdjustCruise @11;
|
|
}
|
|
}
|
|
}
|
|
|
|
# ******* radar state @ 20hz *******
|
|
|
|
struct RadarData @0x888ad6581cf0aacb {
|
|
errors @0 :List(Error);
|
|
points @1 :List(RadarPoint);
|
|
|
|
# which packets this state came from
|
|
canMonoTimes @2 :List(UInt64);
|
|
|
|
enum Error {
|
|
canError @0;
|
|
fault @1;
|
|
wrongConfig @2;
|
|
}
|
|
|
|
# similar to LiveTracks
|
|
# is one timestamp valid for all? I think so
|
|
struct RadarPoint {
|
|
trackId @0 :UInt64; # no trackId reuse
|
|
|
|
# these 3 are the minimum required
|
|
dRel @1 :Float32; # m from the front bumper of the car
|
|
yRel @2 :Float32; # m
|
|
vRel @3 :Float32; # m/s
|
|
|
|
# these are optional and valid if they are not NaN
|
|
aRel @4 :Float32; # m/s^2
|
|
yvRel @5 :Float32; # m/s
|
|
|
|
# some radars flag measurements VS estimates
|
|
measured @6 :Bool;
|
|
}
|
|
}
|
|
|
|
# ******* car controls @ 100hz *******
|
|
|
|
struct CarControl {
|
|
# must be true for any actuator commands to work
|
|
enabled @0 :Bool;
|
|
active @7 :Bool;
|
|
|
|
gasDEPRECATED @1 :Float32;
|
|
brakeDEPRECATED @2 :Float32;
|
|
steeringTorqueDEPRECATED @3 :Float32;
|
|
|
|
actuators @6 :Actuators;
|
|
|
|
cruiseControl @4 :CruiseControl;
|
|
hudControl @5 :HUDControl;
|
|
|
|
struct Actuators {
|
|
# range from 0.0 - 1.0
|
|
gas @0: Float32;
|
|
brake @1: Float32;
|
|
# range from -1.0 - 1.0
|
|
steer @2: Float32;
|
|
steerAngle @3: Float32;
|
|
}
|
|
|
|
struct CruiseControl {
|
|
cancel @0: Bool;
|
|
override @1: Bool;
|
|
speedOverride @2: Float32;
|
|
accelOverride @3: Float32;
|
|
}
|
|
|
|
struct HUDControl {
|
|
speedVisible @0: Bool;
|
|
setSpeed @1: Float32;
|
|
lanesVisible @2: Bool;
|
|
leadVisible @3: Bool;
|
|
visualAlert @4: VisualAlert;
|
|
audibleAlert @5: AudibleAlert;
|
|
rightLaneVisible @6: Bool;
|
|
leftLaneVisible @7: Bool;
|
|
rightLaneDepart @8: Bool;
|
|
leftLaneDepart @9: Bool;
|
|
|
|
enum VisualAlert {
|
|
# these are the choices from the Honda
|
|
# map as good as you can for your car
|
|
none @0;
|
|
fcw @1;
|
|
steerRequired @2;
|
|
brakePressed @3;
|
|
wrongGear @4;
|
|
seatbeltUnbuckled @5;
|
|
speedTooHigh @6;
|
|
ldw @7;
|
|
}
|
|
|
|
enum AudibleAlert {
|
|
# these are the choices from the Honda
|
|
# map as good as you can for your car
|
|
none @0;
|
|
chimeEngage @1;
|
|
chimeDisengage @2;
|
|
chimeError @3;
|
|
chimeWarning1 @4;
|
|
chimeWarning2 @5;
|
|
chimeWarningRepeat @6;
|
|
chimePrompt @7;
|
|
}
|
|
}
|
|
}
|
|
|
|
# ****** car param ******
|
|
|
|
struct CarParams {
|
|
carName @0 :Text;
|
|
carFingerprint @1 :Text;
|
|
|
|
enableGasInterceptor @2 :Bool;
|
|
enableCruise @3 :Bool;
|
|
enableCamera @4 :Bool;
|
|
enableDsu @5 :Bool; # driving support unit
|
|
enableApgs @6 :Bool; # advanced parking guidance system
|
|
|
|
minEnableSpeed @7 :Float32;
|
|
minSteerSpeed @8 :Float32;
|
|
safetyModel @9 :SafetyModel;
|
|
safetyModelPassive @42 :SafetyModel = noOutput;
|
|
safetyParam @10 :Int16;
|
|
|
|
steerMaxBP @11 :List(Float32);
|
|
steerMaxV @12 :List(Float32);
|
|
gasMaxBP @13 :List(Float32);
|
|
gasMaxV @14 :List(Float32);
|
|
brakeMaxBP @15 :List(Float32);
|
|
brakeMaxV @16 :List(Float32);
|
|
|
|
|
|
# things about the car in the manual
|
|
mass @17 :Float32; # [kg] running weight
|
|
wheelbase @18 :Float32; # [m] distance from rear to front axle
|
|
centerToFront @19 :Float32; # [m] GC distance to front axle
|
|
steerRatio @20 :Float32; # [] ratio between front wheels and steering wheel angles
|
|
steerRatioRear @21 :Float32; # [] rear steering ratio wrt front steering (usually 0)
|
|
|
|
# things we can derive
|
|
rotationalInertia @22 :Float32; # [kg*m2] body rotational inertia
|
|
tireStiffnessFront @23 :Float32; # [N/rad] front tire coeff of stiff
|
|
tireStiffnessRear @24 :Float32; # [N/rad] rear tire coeff of stiff
|
|
|
|
longitudinalTuning @25 :LongitudinalPIDTuning;
|
|
lateralTuning :union {
|
|
pid @26 :LateralPIDTuning;
|
|
indi @27 :LateralINDITuning;
|
|
lqr @40 :LateralLQRTuning;
|
|
}
|
|
|
|
steerLimitAlert @28 :Bool;
|
|
|
|
vEgoStopping @29 :Float32; # Speed at which the car goes into stopping state
|
|
directAccelControl @30 :Bool; # Does the car have direct accel control or just gas/brake
|
|
stoppingControl @31 :Bool; # Does the car allows full control even at lows speeds when stopping
|
|
startAccel @32 :Float32; # Required acceleraton to overcome creep braking
|
|
steerRateCost @33 :Float32; # Lateral MPC cost on steering rate
|
|
steerControlType @34 :SteerControlType;
|
|
radarOffCan @35 :Bool; # True when radar objects aren't visible on CAN
|
|
|
|
steerActuatorDelay @36 :Float32; # Steering wheel actuator delay in seconds
|
|
openpilotLongitudinalControl @37 :Bool; # is openpilot doing the longitudinal control?
|
|
carVin @38 :Text; # VIN number queried during fingerprinting
|
|
isPandaBlack @39: Bool;
|
|
dashcamOnly @41: Bool;
|
|
transmissionType @43 :TransmissionType;
|
|
|
|
struct LateralPIDTuning {
|
|
kpBP @0 :List(Float32);
|
|
kpV @1 :List(Float32);
|
|
kiBP @2 :List(Float32);
|
|
kiV @3 :List(Float32);
|
|
kf @4 :Float32;
|
|
}
|
|
|
|
struct LongitudinalPIDTuning {
|
|
kpBP @0 :List(Float32);
|
|
kpV @1 :List(Float32);
|
|
kiBP @2 :List(Float32);
|
|
kiV @3 :List(Float32);
|
|
deadzoneBP @4 :List(Float32);
|
|
deadzoneV @5 :List(Float32);
|
|
}
|
|
|
|
|
|
struct LateralINDITuning {
|
|
outerLoopGain @0 :Float32;
|
|
innerLoopGain @1 :Float32;
|
|
timeConstant @2 :Float32;
|
|
actuatorEffectiveness @3 :Float32;
|
|
}
|
|
|
|
struct LateralLQRTuning {
|
|
scale @0 :Float32;
|
|
ki @1 :Float32;
|
|
dcGain @2 :Float32;
|
|
|
|
# State space system
|
|
a @3 :List(Float32);
|
|
b @4 :List(Float32);
|
|
c @5 :List(Float32);
|
|
|
|
k @6 :List(Float32); # LQR gain
|
|
l @7 :List(Float32); # Kalman gain
|
|
}
|
|
|
|
enum SafetyModel {
|
|
noOutput @0;
|
|
honda @1;
|
|
toyota @2;
|
|
elm327 @3;
|
|
gm @4;
|
|
hondaBosch @5;
|
|
ford @6;
|
|
cadillac @7;
|
|
hyundai @8;
|
|
chrysler @9;
|
|
tesla @10;
|
|
subaru @11;
|
|
gmPassive @12;
|
|
mazda @13;
|
|
nissan @14;
|
|
volkswagen @15;
|
|
toyotaIpas @16;
|
|
allOutput @17;
|
|
gmAscm @18;
|
|
}
|
|
|
|
enum SteerControlType {
|
|
torque @0;
|
|
angle @1;
|
|
}
|
|
|
|
enum TransmissionType {
|
|
unknown @0;
|
|
automatic @1;
|
|
manual @2;
|
|
}
|
|
}
|