openpilot v0.4.7.2 release

pull/277/head
Vehicle Researcher 7 years ago
parent 21b3f5321a
commit 95509a58cd
  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. BIN
      selfdrive/loggerd/loggerd
  16. 4
      selfdrive/loggerd/uploader.py
  17. 5
      selfdrive/manager.py
  18. BIN
      selfdrive/sensord/gpsd
  19. BIN
      selfdrive/sensord/sensord
  20. 33
      selfdrive/updated.py
  21. BIN
      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

Binary file not shown.

@ -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:

Binary file not shown.

Binary file not shown.

@ -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()

Binary file not shown.
Loading…
Cancel
Save