mirror of https://github.com/commaai/openpilot.git
Continuously update offset between TSS2 angle sensors (#21943)
* Continuously update offset between TSS2 angle sensors * add comment * less lines * only when initialized * init to None * update ref
This commit is contained in:
parent
3b13eb8c7d
commit
c15a616ac4
|
@ -1,13 +1,18 @@
|
||||||
class FirstOrderFilter:
|
class FirstOrderFilter:
|
||||||
# first order filter
|
# first order filter
|
||||||
def __init__(self, x0, rc, dt):
|
def __init__(self, x0, rc, dt, initialized=True):
|
||||||
self.x = x0
|
self.x = x0
|
||||||
self.dt = dt
|
self.dt = dt
|
||||||
self.update_alpha(rc)
|
self.update_alpha(rc)
|
||||||
|
self.initialized = initialized
|
||||||
|
|
||||||
def update_alpha(self, rc):
|
def update_alpha(self, rc):
|
||||||
self.alpha = self.dt / (rc + self.dt)
|
self.alpha = self.dt / (rc + self.dt)
|
||||||
|
|
||||||
def update(self, x):
|
def update(self, x):
|
||||||
self.x = (1. - self.alpha) * self.x + self.alpha * x
|
if self.initialized:
|
||||||
|
self.x = (1. - self.alpha) * self.x + self.alpha * x
|
||||||
|
else:
|
||||||
|
self.initialized = True
|
||||||
|
self.x = x
|
||||||
return self.x
|
return self.x
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
from cereal import car
|
from cereal import car
|
||||||
from common.numpy_fast import mean
|
from common.numpy_fast import mean
|
||||||
|
from common.filter_simple import FirstOrderFilter
|
||||||
|
from common.realtime import DT_CTRL
|
||||||
from opendbc.can.can_define import CANDefine
|
from opendbc.can.can_define import CANDefine
|
||||||
from selfdrive.car.interfaces import CarStateBase
|
from selfdrive.car.interfaces import CarStateBase
|
||||||
from opendbc.can.parser import CANParser
|
from opendbc.can.parser import CANParser
|
||||||
|
@ -18,7 +20,7 @@ class CarState(CarStateBase):
|
||||||
# Need to apply an offset as soon as the steering angle measurements are both received
|
# Need to apply an offset as soon as the steering angle measurements are both received
|
||||||
self.needs_angle_offset = True
|
self.needs_angle_offset = True
|
||||||
self.accurate_steer_angle_seen = False
|
self.accurate_steer_angle_seen = False
|
||||||
self.angle_offset = 0.
|
self.angle_offset = FirstOrderFilter(None, 60.0, DT_CTRL, initialized=False)
|
||||||
|
|
||||||
self.low_speed_lockout = False
|
self.low_speed_lockout = False
|
||||||
self.acc_type = 1
|
self.acc_type = 1
|
||||||
|
@ -47,21 +49,21 @@ class CarState(CarStateBase):
|
||||||
|
|
||||||
ret.standstill = ret.vEgoRaw < 0.001
|
ret.standstill = ret.vEgoRaw < 0.001
|
||||||
|
|
||||||
|
ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"] + cp.vl["STEER_ANGLE_SENSOR"]["STEER_FRACTION"]
|
||||||
|
torque_sensor_angle_deg = cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]
|
||||||
|
|
||||||
# Some newer models have a more accurate angle measurement in the TORQUE_SENSOR message. Use if non-zero
|
# Some newer models have a more accurate angle measurement in the TORQUE_SENSOR message. Use if non-zero
|
||||||
if abs(cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]) > 1e-3:
|
if abs(torque_sensor_angle_deg) > 1e-3:
|
||||||
self.accurate_steer_angle_seen = True
|
self.accurate_steer_angle_seen = True
|
||||||
|
|
||||||
if self.accurate_steer_angle_seen:
|
if self.accurate_steer_angle_seen:
|
||||||
ret.steeringAngleDeg = cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"] - self.angle_offset
|
# Offset seems to be invalid for large steering angles
|
||||||
ret.steeringAngleOffsetDeg = self.angle_offset
|
if abs(ret.steeringAngleDeg) < 90:
|
||||||
|
self.angle_offset.update(torque_sensor_angle_deg - ret.steeringAngleDeg)
|
||||||
|
|
||||||
if self.needs_angle_offset:
|
if self.angle_offset.initialized:
|
||||||
angle_wheel = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"] + cp.vl["STEER_ANGLE_SENSOR"]["STEER_FRACTION"]
|
ret.steeringAngleOffsetDeg = self.angle_offset.x
|
||||||
if abs(angle_wheel) > 1e-3:
|
ret.steeringAngleDeg = torque_sensor_angle_deg - self.angle_offset.x
|
||||||
self.needs_angle_offset = False
|
|
||||||
self.angle_offset = ret.steeringAngleDeg - angle_wheel
|
|
||||||
else:
|
|
||||||
ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"] + cp.vl["STEER_ANGLE_SENSOR"]["STEER_FRACTION"]
|
|
||||||
|
|
||||||
ret.steeringRateDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_RATE"]
|
ret.steeringRateDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_RATE"]
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
f3e220d82db802c653777634228ce57576ac7aad
|
3e8037d39f40c59a2b9e86539e0952645b2cb3ea
|
Loading…
Reference in New Issue