mirror of
https://github.com/dragonpilot/dragonpilot.git
synced 2026-08-20 23:53:44 +08:00
e311cb647f
* Interpolate ki/kp for steering PID loop Very much needed for the Volt port: car ping-pongs with low kp on high speeeds, and the loop is unstable with high kp on low speeds. Also, removes "number or array?" logic from PIController, now that all the callers use interpolation ofr ki/kp. * Pass speed to steering PID loop for ki/kp interpolation * Remove unused numbers import
328 lines
7.7 KiB
Cap'n Proto
328 lines
7.7 KiB
Cap'n Proto
using Cxx = import "c++.capnp";
|
|
$Cxx.namespace("cereal");
|
|
|
|
using Java = import "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
|
|
commIssue @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;
|
|
radarCommIssue @15;
|
|
dataNeeded @16;
|
|
speedTooLow @17;
|
|
outOfSpace @18;
|
|
overheat @19;
|
|
calibrationInProgress @20;
|
|
calibrationInvalid @21;
|
|
controlsMismatch @22;
|
|
pcmEnable @23;
|
|
pcmDisable @24;
|
|
noTarget @25;
|
|
radarFault @26;
|
|
modelCommIssue @27;
|
|
brakeHold @28;
|
|
parkBrake @29;
|
|
manualRestart @30;
|
|
lowSpeedLockout @31;
|
|
}
|
|
}
|
|
|
|
# ******* 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
|
|
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;
|
|
|
|
# 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;
|
|
}
|
|
|
|
|
|
# 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;
|
|
}
|
|
}
|
|
}
|
|
|
|
# ******* radar state @ 20hz *******
|
|
|
|
struct RadarState {
|
|
errors @0 :List(Error);
|
|
points @1 :List(RadarPoint);
|
|
|
|
# which packets this state came from
|
|
canMonoTimes @2 :List(UInt64);
|
|
|
|
enum Error {
|
|
commIssue @0;
|
|
fault @1;
|
|
}
|
|
|
|
# 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;
|
|
|
|
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;
|
|
}
|
|
|
|
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;
|
|
|
|
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;
|
|
}
|
|
|
|
enum AudibleAlert {
|
|
# these are the choices from the Honda
|
|
# map as good as you can for your car
|
|
none @0;
|
|
beepSingle @1;
|
|
beepTriple @2;
|
|
beepRepeated @3;
|
|
chimeSingle @4;
|
|
chimeDouble @5;
|
|
chimeRepeated @6;
|
|
chimeContinuous @7;
|
|
}
|
|
}
|
|
}
|
|
|
|
# ****** car param ******
|
|
|
|
struct CarParams {
|
|
carName @0 :Text;
|
|
radarNameDEPRECATED @1 :Text;
|
|
carFingerprint @2 :Text;
|
|
|
|
enableSteer @3 :Bool;
|
|
enableGas @4 :Bool;
|
|
enableBrake @5 :Bool;
|
|
enableCruise @6 :Bool;
|
|
enableCamera @26 :Bool;
|
|
enableDsu @27 :Bool; # driving support unit
|
|
enableApgs @28 :Bool; # advanced parking guidance system
|
|
|
|
minEnableSpeed @17 :Float32;
|
|
safetyModel @18 :Int16;
|
|
safetyParam @41 :Int16;
|
|
|
|
steerMaxBP @19 :List(Float32);
|
|
steerMaxV @20 :List(Float32);
|
|
gasMaxBP @21 :List(Float32);
|
|
gasMaxV @22 :List(Float32);
|
|
brakeMaxBP @23 :List(Float32);
|
|
brakeMaxV @24 :List(Float32);
|
|
|
|
longPidDeadzoneBP @32 :List(Float32);
|
|
longPidDeadzoneV @33 :List(Float32);
|
|
|
|
enum SafetyModels {
|
|
# does NOT match board setting
|
|
noOutput @0;
|
|
honda @1;
|
|
toyota @2;
|
|
elm327 @3;
|
|
gm @4;
|
|
hondaBosch @5;
|
|
}
|
|
|
|
# things about the car in the manual
|
|
mass @7 :Float32; # [kg] running weight
|
|
wheelbase @8 :Float32; # [m] distance from rear to front axle
|
|
centerToFront @9 :Float32; # [m] GC distance to front axle
|
|
steerRatio @10 :Float32; # [] ratio between front wheels and steering wheel angles
|
|
steerRatioRear @11 :Float32; # [] rear steering ratio wrt front steering (usually 0)
|
|
|
|
# things we can derive
|
|
rotationalInertia @12 :Float32; # [kg*m2] body rotational inertia
|
|
tireStiffnessFront @13 :Float32; # [N/rad] front tire coeff of stiff
|
|
tireStiffnessRear @14 :Float32; # [N/rad] rear tire coeff of stiff
|
|
|
|
# Kp and Ki for the lateral control
|
|
steerKpBP @42 :List(Float32);
|
|
steerKpV @43 :List(Float32);
|
|
steerKiBP @44 :List(Float32);
|
|
steerKiV @45 :List(Float32);
|
|
steerKpDEPRECATED @15 :Float32;
|
|
steerKiDEPRECATED @16 :Float32;
|
|
steerKf @25 :Float32;
|
|
|
|
# Kp and Ki for the longitudinal control
|
|
longitudinalKpBP @36 :List(Float32);
|
|
longitudinalKpV @37 :List(Float32);
|
|
longitudinalKiBP @38 :List(Float32);
|
|
longitudinalKiV @39 :List(Float32);
|
|
|
|
steerLimitAlert @29 :Bool;
|
|
|
|
vEgoStopping @30 :Float32; # Speed at which the car goes into stopping state
|
|
directAccelControl @31 :Bool; # Does the car have direct accel control or just gas/brake
|
|
stoppingControl @34 :Bool; # Does the car allows full control even at lows speeds when stopping
|
|
startAccel @35 :Float32; # Required acceleraton to overcome creep braking
|
|
steerRateCost @40 :Float32; # Lateral MPC cost on steering rate
|
|
}
|