Permalink
Browse files

openpilot v0.4.7.2 release

  • Loading branch information...
Vehicle Researcher
Vehicle Researcher committed Jun 25, 2018
1 parent 21b3f53 commit 95509a58cd906827bff61937f6132daa7460122e
@@ -88,15 +88,9 @@ Supported Cars

### GM (Chevrolet + Cadillac) ###

- Chevrolet Volt Premier 2017+
- Driver Confidence II package (adaptive cruise control) required
- Can only be enabled above 18 mph
- Chevrolet Volt Premier 2017+ with Driver Confidence II package
- 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
------
- 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)
==========================
* Fix Acura ILX steer faults
@@ -170,6 +170,7 @@ struct RadarState {
enum Error {
commIssue @0;
fault @1;
wrongConfig @2;
}

# similar to LiveTracks
@@ -332,7 +333,7 @@ struct CarParams {
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
steerRateCostDEPRECATED @40 :Float32; # Lateral MPC cost on steering rate
steerControlType @46 :SteerControlType;
radarOffCan @47 :Bool; # True when radar objects aren't visible on CAN

@@ -5,14 +5,11 @@ if [ -z "$PASSIVE" ]; then
fi

function launch {
DO_UPDATE=$(cat /data/params/d/ShouldDoUpdate)
# 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 clean -xdf &&
exec "${BASH_SOURCE[0]}"
echo -n 0 > /data/params/d/ShouldDoUpdate
echo -n 0 > /data/params/d/IsUpdateAvailable
fi

# no cpu rationing for now
@@ -75,7 +75,6 @@ def get_params(candidate, fingerprint):
ret.steerKpV, ret.steerKiV = [[0.01], [0.005]] # TODO: tune this
ret.steerKf = 1. / MAX_ANGLE # MAX Steer angle to normalize FF
ret.steerActuatorDelay = 0.1 # Default delay, not measured yet
ret.steerRateCost = 0.5

f = 1.2
tireStiffnessFront_civic *= f
@@ -151,7 +151,6 @@ def get_params(candidate, fingerprint):
ret.startAccel = 0.8

ret.steerActuatorDelay = 0.1 # Default delay, not measured yet
ret.steerRateCost = 0.5
ret.steerControlType = car.CarParams.SteerControlType.torque

return ret
@@ -1,4 +1,3 @@
import os
from collections import namedtuple
from selfdrive.boardd.boardd import can_list_to_can_capnp
from selfdrive.controls.lib.drive_helpers import rate_limit
@@ -123,8 +122,7 @@ def update(self, sendcan, enabled, CS, frame, actuators, \
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)
else:
is_fw_modified = os.getenv("DONGLE_ID") in ['99c94dc769b5d96e']
STEER_MAX = 0x1FFF if is_fw_modified else 0x1000
STEER_MAX = 0x1000

# steer torque is converted back to CAN reference (positive when steering right)
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 = {
"COMPUTER_BRAKE": apply_brake,
"COMPUTER_BRAKE_REQUEST": pump_on,
"BRAKE_PUMP_REQUEST": pump_on,
"CRUISE_OVERRIDE": pcm_override,
"CRUISE_FAULT_CMD": pcm_fault_cmd,
"CRUISE_CANCEL_CMD": pcm_cancel_cmd,
"COMPUTER_BRAKE_REQUEST_2": brake_rq,
"COMPUTER_BRAKE_REQUEST": brake_rq,
"SET_ME_0X80": 0x80,
"BRAKE_LIGHTS": brakelights,
"CHIME": chime,
@@ -340,7 +340,6 @@ def get_params(candidate, fingerprint):
ret.startAccel = 0.5

ret.steerActuatorDelay = 0.09
ret.steerRateCost = 0.5

return ret

@@ -78,7 +78,6 @@ def get_params(candidate, fingerprint):
ret.mass = 3045 * CV.LB_TO_KG + std_cargo
ret.steerKpV, ret.steerKiV = [[0.4], [0.01]]
ret.steerKf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594
ret.steerRateCost = 1.5

f = 1.43353663
tireStiffnessFront_civic *= f
@@ -93,23 +92,20 @@ def get_params(candidate, fingerprint):
ret.mass = 3650 * CV.LB_TO_KG + std_cargo # mean between normal and hybrid
ret.steerKpV, ret.steerKiV = [[0.6], [0.05]]
ret.steerKf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594
ret.steerRateCost = 1.
elif candidate == CAR.COROLLA:
ret.safetyParam = 100 # see conversion factor for STEER_TORQUE_EPS in dbc file
ret.wheelbase = 2.70
ret.steerRatio = 17.8
ret.mass = 2860 * CV.LB_TO_KG + std_cargo # mean between normal and hybrid
ret.steerKpV, ret.steerKiV = [[0.2], [0.05]]
ret.steerKf = 0.00003 # full torque for 20 deg at 80mph means 0.00007818594
ret.steerRateCost = 1.
elif candidate == CAR.LEXUS_RXH:
ret.safetyParam = 100 # see conversion factor for STEER_TORQUE_EPS in dbc file
ret.wheelbase = 2.79
ret.steerRatio = 16. # official specs say 14.8, but it does not seem right
ret.mass = 4481 * CV.LB_TO_KG + std_cargo # mean between min and max
ret.steerKpV, ret.steerKiV = [[0.6], [0.1]]
ret.steerKf = 0.00006 # full torque for 10 deg at 80mph means 0.00007818594
ret.steerRateCost = .8

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 @@ def __init__(self, VM):
(VM.CP.steerKiBP, VM.CP.steerKiV),
k_f=VM.CP.steerKf, pos_limit=1.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.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.cur_state = libmpc_py.ffi.new("state_t *")
@@ -90,7 +91,7 @@ def update(self, active, v_ego, angle_steers, steer_override, d_poly, angle_offs
self.mpc_nans = np.any(np.isnan(list(self.mpc_solution[0].delta)))
t = sec_since_boot()
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

if t > self.last_cloudlog_t + 5.0:
@@ -1,6 +1,7 @@
from common.numpy_fast import interp
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):
def __init__(self):
@@ -21,6 +22,10 @@ def update(self, v_ego, md):
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

# 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
l_prob = md.model.leftLane.prob # left line prob
r_prob = md.model.rightLane.prob # right line prob
@@ -101,3 +101,4 @@ def yaw_rate(self, sa, u):
VM = VehicleModel(CP)
print VM.steady_state_sol(.1, 0.15)
print calc_slip_factor(VM)
print VM.yaw_rate(0.2*np.pi/180, 32.) * 180./np.pi
BIN +0 Bytes (100%) selfdrive/loggerd/loggerd
Binary file not shown.
@@ -69,7 +69,11 @@ def clear_locks(root):

def is_on_wifi():
# ConnectivityManager.getActiveNetworkInfo()
result = subprocess.check_output(["service", "call", "connectivity", "2"]).strip().split("\n")
try:
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:])

return "\x00".join("WIFI") in data
@@ -102,7 +102,7 @@
"visiond": ("selfdrive/visiond", ["./visiond"]),
"sensord": ("selfdrive/sensord", ["./sensord"]),
"gpsd": ("selfdrive/sensord", ["./gpsd"]),
"orbd": ("selfdrive/orbd", ["./orbd_wrapper.sh"]),
#"orbd": ("selfdrive/orbd", ["./orbd_wrapper.sh"]),
"updated": "selfdrive.updated",
#"gpsplanner": "selfdrive.controls.gps_plannerd",
}
@@ -665,9 +665,12 @@ def main():
del managed_processes['controlsd']
del managed_processes['radard']

# disable this until we use it
"""
if os.path.isfile('logserver/logserver.py'):
managed_processes["logserver"] = "selfdrive.logserver.wsgi"
persistent_processes.append("logserver")
"""

# support additional internal only extensions
try:
BIN +0 Bytes (100%) selfdrive/sensord/gpsd
Binary file not shown.
BIN +0 Bytes (100%) selfdrive/sensord/sensord
Binary file not shown.
35 selfdrive/updated.py 100644 → 100755
@@ -7,55 +7,30 @@
import subprocess

from common.basedir import BASEDIR
from common.params import Params
from selfdrive.swaglog import cloudlog
from selfdrive.version import dirty

NICE_LOW_PRIORITY = ["nice", "-n", "19"]
def main(gctx=None):
params = Params()

while True:
# try network
r = subprocess.call(["ping", "-W", "4", "-c", "1", "8.8.8.8"])
if r:
time.sleep(60)
continue

# If there are modifications we preserve full history
# and disable update prompting.
# 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)
# download application update
r = subprocess.call(NICE_LOW_PRIORITY + ["git", "fetch"])
cloudlog.info("git fetch: %r", r)
if r:
time.sleep(60)
continue

# 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)

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__":
main()
main()

BIN +0 Bytes (100%) selfdrive/visiond/visiond
Binary file not shown.

0 comments on commit 95509a5

Please sign in to comment.