openpilot v0.4.7.2 release

old-commit-hash: 95509a58cd
commatwo_master
Vehicle Researcher 7 years ago
parent 760ba02ef6
commit 405e7c1b02
  1. 8
      README.md
  2. 6
      RELEASES.md
  3. 3
      cereal/car.capnp
  4. 5
      launch_chffrplus.sh
  5. 1
      selfdrive/car/ford/interface.py
  6. 1
      selfdrive/car/gm/interface.py
  7. 4
      selfdrive/car/honda/carcontroller.py
  8. 4
      selfdrive/car/honda/hondacan.py
  9. 1
      selfdrive/car/honda/interface.py
  10. 4
      selfdrive/car/toyota/interface.py
  11. 2
      selfdrive/common/version.h
  12. 9
      selfdrive/controls/lib/latcontrol.py
  13. 5
      selfdrive/controls/lib/pathplanner.py
  14. 1
      selfdrive/controls/lib/vehicle_model.py
  15. 2
      selfdrive/loggerd/loggerd
  16. 4
      selfdrive/loggerd/uploader.py
  17. 5
      selfdrive/manager.py
  18. 2
      selfdrive/sensord/gpsd
  19. 2
      selfdrive/sensord/sensord
  20. 33
      selfdrive/updated.py
  21. 2
      selfdrive/visiond/visiond

@ -88,15 +88,9 @@ Supported Cars
### GM (Chevrolet + Cadillac) ### ### GM (Chevrolet + Cadillac) ###
- Chevrolet Volt Premier 2017+ - Chevrolet Volt Premier 2017+ with Driver Confidence II package
- Driver Confidence II package (adaptive cruise control) required
- Can only be enabled above 18 mph
- Read the [installation guide](https://www.zoneos.com/volt.htm) - Read the [installation guide](https://www.zoneos.com/volt.htm)
- Cadillac CT6
- Uses stock ACC for longitudinal control
- Requires multiple panda for proxying the ASCMs
In Progress Cars In Progress Cars
------ ------
- All TSS-P Toyota with Steering Assist. - All TSS-P Toyota with Steering Assist.

@ -1,3 +1,9 @@
Version 0.4.7.2 (2018-06-25)
==========================
* Fix loggerd lag issue
* No longer prompt for updates
* Mitigate right lane hugging for properly mounted EON (procedure on wiki)
Version 0.4.7.1 (2018-06-18) Version 0.4.7.1 (2018-06-18)
========================== ==========================
* Fix Acura ILX steer faults * Fix Acura ILX steer faults

@ -170,6 +170,7 @@ struct RadarState {
enum Error { enum Error {
commIssue @0; commIssue @0;
fault @1; fault @1;
wrongConfig @2;
} }
# similar to LiveTracks # similar to LiveTracks
@ -332,7 +333,7 @@ struct CarParams {
directAccelControl @31 :Bool; # Does the car have direct accel control or just gas/brake 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 stoppingControl @34 :Bool; # Does the car allows full control even at lows speeds when stopping
startAccel @35 :Float32; # Required acceleraton to overcome creep braking startAccel @35 :Float32; # Required acceleraton to overcome creep braking
steerRateCost @40 :Float32; # Lateral MPC cost on steering rate steerRateCostDEPRECATED @40 :Float32; # Lateral MPC cost on steering rate
steerControlType @46 :SteerControlType; steerControlType @46 :SteerControlType;
radarOffCan @47 :Bool; # True when radar objects aren't visible on CAN radarOffCan @47 :Bool; # True when radar objects aren't visible on CAN

@ -5,14 +5,11 @@ if [ -z "$PASSIVE" ]; then
fi fi
function launch { function launch {
DO_UPDATE=$(cat /data/params/d/ShouldDoUpdate)
# apply update # apply update
if [ "$DO_UPDATE" == "1" ] && [ "$(git rev-parse HEAD)" != "$(git rev-parse @{u})" ]; then if [ "$(git rev-parse HEAD)" != "$(git rev-parse @{u})" ]; then
git reset --hard @{u} && git reset --hard @{u} &&
git clean -xdf && git clean -xdf &&
exec "${BASH_SOURCE[0]}" exec "${BASH_SOURCE[0]}"
echo -n 0 > /data/params/d/ShouldDoUpdate
echo -n 0 > /data/params/d/IsUpdateAvailable
fi fi
# no cpu rationing for now # no cpu rationing for now

@ -75,7 +75,6 @@ class CarInterface(object):
ret.steerKpV, ret.steerKiV = [[0.01], [0.005]] # TODO: tune this ret.steerKpV, ret.steerKiV = [[0.01], [0.005]] # TODO: tune this
ret.steerKf = 1. / MAX_ANGLE # MAX Steer angle to normalize FF ret.steerKf = 1. / MAX_ANGLE # MAX Steer angle to normalize FF
ret.steerActuatorDelay = 0.1 # Default delay, not measured yet ret.steerActuatorDelay = 0.1 # Default delay, not measured yet
ret.steerRateCost = 0.5
f = 1.2 f = 1.2
tireStiffnessFront_civic *= f tireStiffnessFront_civic *= f

@ -151,7 +151,6 @@ class CarInterface(object):
ret.startAccel = 0.8 ret.startAccel = 0.8
ret.steerActuatorDelay = 0.1 # Default delay, not measured yet ret.steerActuatorDelay = 0.1 # Default delay, not measured yet
ret.steerRateCost = 0.5
ret.steerControlType = car.CarParams.SteerControlType.torque ret.steerControlType = car.CarParams.SteerControlType.torque
return ret return ret

@ -1,4 +1,3 @@
import os
from collections import namedtuple from collections import namedtuple
from selfdrive.boardd.boardd import can_list_to_can_capnp from selfdrive.boardd.boardd import can_list_to_can_capnp
from selfdrive.controls.lib.drive_helpers import rate_limit from selfdrive.controls.lib.drive_helpers import rate_limit
@ -123,8 +122,7 @@ class CarController(object):
elif CS.CP.carFingerprint in (CAR.CRV, CAR.ACURA_RDX): elif CS.CP.carFingerprint in (CAR.CRV, CAR.ACURA_RDX):
STEER_MAX = 0x3e8 # CR-V only uses 12-bits and requires a lower value (max value from energee) STEER_MAX = 0x3e8 # CR-V only uses 12-bits and requires a lower value (max value from energee)
else: else:
is_fw_modified = os.getenv("DONGLE_ID") in ['99c94dc769b5d96e'] STEER_MAX = 0x1000
STEER_MAX = 0x1FFF if is_fw_modified else 0x1000
# steer torque is converted back to CAN reference (positive when steering right) # steer torque is converted back to CAN reference (positive when steering right)
apply_gas = clip(actuators.gas, 0., 1.) apply_gas = clip(actuators.gas, 0., 1.)

@ -37,11 +37,11 @@ def create_brake_command(packer, apply_brake, pcm_override, pcm_cancel_cmd, chim
values = { values = {
"COMPUTER_BRAKE": apply_brake, "COMPUTER_BRAKE": apply_brake,
"COMPUTER_BRAKE_REQUEST": pump_on, "BRAKE_PUMP_REQUEST": pump_on,
"CRUISE_OVERRIDE": pcm_override, "CRUISE_OVERRIDE": pcm_override,
"CRUISE_FAULT_CMD": pcm_fault_cmd, "CRUISE_FAULT_CMD": pcm_fault_cmd,
"CRUISE_CANCEL_CMD": pcm_cancel_cmd, "CRUISE_CANCEL_CMD": pcm_cancel_cmd,
"COMPUTER_BRAKE_REQUEST_2": brake_rq, "COMPUTER_BRAKE_REQUEST": brake_rq,
"SET_ME_0X80": 0x80, "SET_ME_0X80": 0x80,
"BRAKE_LIGHTS": brakelights, "BRAKE_LIGHTS": brakelights,
"CHIME": chime, "CHIME": chime,

@ -340,7 +340,6 @@ class CarInterface(object):
ret.startAccel = 0.5 ret.startAccel = 0.5
ret.steerActuatorDelay = 0.09 ret.steerActuatorDelay = 0.09
ret.steerRateCost = 0.5
return ret return ret

@ -78,7 +78,6 @@ class CarInterface(object):
ret.mass = 3045 * CV.LB_TO_KG + std_cargo ret.mass = 3045 * CV.LB_TO_KG + std_cargo
ret.steerKpV, ret.steerKiV = [[0.4], [0.01]] ret.steerKpV, ret.steerKiV = [[0.4], [0.01]]
ret.steerKf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594 ret.steerKf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594
ret.steerRateCost = 1.5
f = 1.43353663 f = 1.43353663
tireStiffnessFront_civic *= f tireStiffnessFront_civic *= f
@ -93,7 +92,6 @@ class CarInterface(object):
ret.mass = 3650 * CV.LB_TO_KG + std_cargo # mean between normal and hybrid ret.mass = 3650 * CV.LB_TO_KG + std_cargo # mean between normal and hybrid
ret.steerKpV, ret.steerKiV = [[0.6], [0.05]] ret.steerKpV, ret.steerKiV = [[0.6], [0.05]]
ret.steerKf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594 ret.steerKf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594
ret.steerRateCost = 1.
elif candidate == CAR.COROLLA: elif candidate == CAR.COROLLA:
ret.safetyParam = 100 # see conversion factor for STEER_TORQUE_EPS in dbc file ret.safetyParam = 100 # see conversion factor for STEER_TORQUE_EPS in dbc file
ret.wheelbase = 2.70 ret.wheelbase = 2.70
@ -101,7 +99,6 @@ class CarInterface(object):
ret.mass = 2860 * CV.LB_TO_KG + std_cargo # mean between normal and hybrid ret.mass = 2860 * CV.LB_TO_KG + std_cargo # mean between normal and hybrid
ret.steerKpV, ret.steerKiV = [[0.2], [0.05]] ret.steerKpV, ret.steerKiV = [[0.2], [0.05]]
ret.steerKf = 0.00003 # full torque for 20 deg at 80mph means 0.00007818594 ret.steerKf = 0.00003 # full torque for 20 deg at 80mph means 0.00007818594
ret.steerRateCost = 1.
elif candidate == CAR.LEXUS_RXH: elif candidate == CAR.LEXUS_RXH:
ret.safetyParam = 100 # see conversion factor for STEER_TORQUE_EPS in dbc file ret.safetyParam = 100 # see conversion factor for STEER_TORQUE_EPS in dbc file
ret.wheelbase = 2.79 ret.wheelbase = 2.79
@ -109,7 +106,6 @@ class CarInterface(object):
ret.mass = 4481 * CV.LB_TO_KG + std_cargo # mean between min and max ret.mass = 4481 * CV.LB_TO_KG + std_cargo # mean between min and max
ret.steerKpV, ret.steerKiV = [[0.6], [0.1]] ret.steerKpV, ret.steerKiV = [[0.6], [0.1]]
ret.steerKf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594 ret.steerKf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594
ret.steerRateCost = .8
ret.centerToFront = ret.wheelbase * 0.44 ret.centerToFront = ret.wheelbase * 0.44

@ -1 +1 @@
#define COMMA_VERSION "0.4.7.1-release" #define COMMA_VERSION "0.4.7.2-release"

@ -28,11 +28,12 @@ class LatControl(object):
(VM.CP.steerKiBP, VM.CP.steerKiV), (VM.CP.steerKiBP, VM.CP.steerKiV),
k_f=VM.CP.steerKf, pos_limit=1.0) k_f=VM.CP.steerKf, pos_limit=1.0)
self.last_cloudlog_t = 0.0 self.last_cloudlog_t = 0.0
self.setup_mpc(VM.CP.steerRateCost) self.setup_mpc()
def setup_mpc(self, steer_rate_cost): def setup_mpc(self):
self.libmpc = libmpc_py.libmpc self.libmpc = libmpc_py.libmpc
self.libmpc.init(MPC_COST_LAT.PATH, MPC_COST_LAT.LANE, MPC_COST_LAT.HEADING, steer_rate_cost) self.libmpc.init(MPC_COST_LAT.PATH, MPC_COST_LAT.LANE,
MPC_COST_LAT.HEADING, MPC_COST_LAT.STEER_RATE)
self.mpc_solution = libmpc_py.ffi.new("log_t *") self.mpc_solution = libmpc_py.ffi.new("log_t *")
self.cur_state = libmpc_py.ffi.new("state_t *") self.cur_state = libmpc_py.ffi.new("state_t *")
@ -90,7 +91,7 @@ class LatControl(object):
self.mpc_nans = np.any(np.isnan(list(self.mpc_solution[0].delta))) self.mpc_nans = np.any(np.isnan(list(self.mpc_solution[0].delta)))
t = sec_since_boot() t = sec_since_boot()
if self.mpc_nans: if self.mpc_nans:
self.libmpc.init(MPC_COST_LAT.PATH, MPC_COST_LAT.LANE, MPC_COST_LAT.HEADING, VM.CP.steerRateCost) self.libmpc.init(MPC_COST_LAT.PATH, MPC_COST_LAT.LANE, MPC_COST_LAT.HEADING, MPC_COST_LAT.STEER_RATE)
self.cur_state[0].delta = math.radians(angle_steers) / VM.CP.steerRatio self.cur_state[0].delta = math.radians(angle_steers) / VM.CP.steerRatio
if t > self.last_cloudlog_t + 5.0: if t > self.last_cloudlog_t + 5.0:

@ -1,6 +1,7 @@
from common.numpy_fast import interp from common.numpy_fast import interp
from selfdrive.controls.lib.latcontrol_helpers import model_polyfit, calc_desired_path, compute_path_pinv from selfdrive.controls.lib.latcontrol_helpers import model_polyfit, calc_desired_path, compute_path_pinv
CAMERA_OFFSET = 0.12 # ~12cm from center car to camera
class PathPlanner(object): class PathPlanner(object):
def __init__(self): def __init__(self):
@ -21,6 +22,10 @@ class PathPlanner(object):
l_poly = model_polyfit(md.model.leftLane.points, self._path_pinv) # left line l_poly = model_polyfit(md.model.leftLane.points, self._path_pinv) # left line
r_poly = model_polyfit(md.model.rightLane.points, self._path_pinv) # right line r_poly = model_polyfit(md.model.rightLane.points, self._path_pinv) # right line
# only offset left and right lane lines; offsetting p_poly does not make sense
l_poly[3] += CAMERA_OFFSET
r_poly[3] += CAMERA_OFFSET
p_prob = 1. # model does not tell this probability yet, so set to 1 for now p_prob = 1. # model does not tell this probability yet, so set to 1 for now
l_prob = md.model.leftLane.prob # left line prob l_prob = md.model.leftLane.prob # left line prob
r_prob = md.model.rightLane.prob # right line prob r_prob = md.model.rightLane.prob # right line prob

@ -101,3 +101,4 @@ if __name__ == '__main__':
VM = VehicleModel(CP) VM = VehicleModel(CP)
print VM.steady_state_sol(.1, 0.15) print VM.steady_state_sol(.1, 0.15)
print calc_slip_factor(VM) print calc_slip_factor(VM)
print VM.yaw_rate(0.2*np.pi/180, 32.) * 180./np.pi

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:41c0efcbf738804666592169f5845472dfdc230c192e50db16898c69a3a34985 oid sha256:fb9ada8972a8a79dcf9af70260b9ac2ada87eea7acf680349a3581e75028587a
size 1622712 size 1622712

@ -69,7 +69,11 @@ def clear_locks(root):
def is_on_wifi(): def is_on_wifi():
# ConnectivityManager.getActiveNetworkInfo() # ConnectivityManager.getActiveNetworkInfo()
try:
result = subprocess.check_output(["service", "call", "connectivity", "2"]).strip().split("\n") result = subprocess.check_output(["service", "call", "connectivity", "2"]).strip().split("\n")
except subprocess.CalledProcessError:
return False
data = ''.join(''.join(w.decode("hex")[::-1] for w in l[14:49].split()) for l in result[1:]) data = ''.join(''.join(w.decode("hex")[::-1] for w in l[14:49].split()) for l in result[1:])
return "\x00".join("WIFI") in data return "\x00".join("WIFI") in data

@ -102,7 +102,7 @@ managed_processes = {
"visiond": ("selfdrive/visiond", ["./visiond"]), "visiond": ("selfdrive/visiond", ["./visiond"]),
"sensord": ("selfdrive/sensord", ["./sensord"]), "sensord": ("selfdrive/sensord", ["./sensord"]),
"gpsd": ("selfdrive/sensord", ["./gpsd"]), "gpsd": ("selfdrive/sensord", ["./gpsd"]),
"orbd": ("selfdrive/orbd", ["./orbd_wrapper.sh"]), #"orbd": ("selfdrive/orbd", ["./orbd_wrapper.sh"]),
"updated": "selfdrive.updated", "updated": "selfdrive.updated",
#"gpsplanner": "selfdrive.controls.gps_plannerd", #"gpsplanner": "selfdrive.controls.gps_plannerd",
} }
@ -665,9 +665,12 @@ def main():
del managed_processes['controlsd'] del managed_processes['controlsd']
del managed_processes['radard'] del managed_processes['radard']
# disable this until we use it
"""
if os.path.isfile('logserver/logserver.py'): if os.path.isfile('logserver/logserver.py'):
managed_processes["logserver"] = "selfdrive.logserver.wsgi" managed_processes["logserver"] = "selfdrive.logserver.wsgi"
persistent_processes.append("logserver") persistent_processes.append("logserver")
"""
# support additional internal only extensions # support additional internal only extensions
try: try:

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fb638743ad0d9db5b1ecdc44b1a8058fc78cb453a7302ff5d543f1c2c3a22259 oid sha256:d51ec7f5e069ab8d9b03b672cb65df0ddae9abe82b220debb9aecc1a36f20f45
size 1171544 size 1171544

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:57fe440a4732a791446ff62d7b47b9299b4b978653e095f1f7cd521b5d85738d oid sha256:05853b1b3324b420d1463daf806797bb3d85659a0637ca7836b137a84e619be0
size 1159016 size 1159016

@ -7,14 +7,10 @@ import time
import subprocess import subprocess
from common.basedir import BASEDIR from common.basedir import BASEDIR
from common.params import Params
from selfdrive.swaglog import cloudlog from selfdrive.swaglog import cloudlog
from selfdrive.version import dirty
NICE_LOW_PRIORITY = ["nice", "-n", "19"] NICE_LOW_PRIORITY = ["nice", "-n", "19"]
def main(gctx=None): def main(gctx=None):
params = Params()
while True: while True:
# try network # try network
r = subprocess.call(["ping", "-W", "4", "-c", "1", "8.8.8.8"]) r = subprocess.call(["ping", "-W", "4", "-c", "1", "8.8.8.8"])
@ -22,40 +18,19 @@ def main(gctx=None):
time.sleep(60) time.sleep(60)
continue continue
# If there are modifications we preserve full history # download application update
# and disable update prompting. r = subprocess.call(NICE_LOW_PRIORITY + ["git", "fetch"])
# Otherwise, only store head to save space
if dirty:
r = subprocess.call(NICE_LOW_PRIORITY + ["git", "fetch", "--unshallow"])
is_update_available = False
else:
r = subprocess.call(NICE_LOW_PRIORITY + ["git", "fetch", "--depth=1"])
is_update_available = check_is_update_available()
is_update_available_str = "1" if is_update_available else "0"
params.put("IsUpdateAvailable", is_update_available_str)
cloudlog.info("IsUpdateAvailable: %s", is_update_available_str)
cloudlog.info("git fetch: %r", r) cloudlog.info("git fetch: %r", r)
if r: if r:
time.sleep(60) time.sleep(60)
continue continue
# download apks # download apks
r = subprocess.call(["nice", "-n", "19", os.path.join(BASEDIR, "apk/external/patcher.py"), "download"]) r = subprocess.call(NICE_LOW_PRIORITY + [os.path.join(BASEDIR, "apk/external/patcher.py"), "download"])
cloudlog.info("patcher download: %r", r) cloudlog.info("patcher download: %r", r)
time.sleep(60*60*3) time.sleep(60*60*3)
def check_is_update_available():
try:
local_rev = subprocess.check_output(NICE_LOW_PRIORITY + ["git", "rev-parse", "@"])
upstream_rev = subprocess.check_output(NICE_LOW_PRIORITY + ["git", "rev-parse", "@{u}"])
return upstream_rev != local_rev
except subprocess.CalledProcessError:
cloudlog.exception("updated: failed to compare local and upstream")
return False
if __name__ == "__main__": if __name__ == "__main__":
main() main()

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ae0213abe0c6f76c4850386459ee1d8478e5a965a311c9f12c3300f6367ef526 oid sha256:9cbff07d194fcd129b105b4b9b6aa6a274e130911f10dda614db1ef60092600e
size 13522344 size 13522344

Loading…
Cancel
Save