openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

73 lines
2.4 KiB

#!/usr/bin/env python
import zmq
from copy import copy
from selfdrive import messaging
from selfdrive.services import service_list
from cereal import log
from common.transformations.coordinates import geodetic2ecef
def main(gctx=None):
context = zmq.Context()
poller = zmq.Poller()
gps_sock = messaging.sub_sock(context, service_list['gpsLocation'].port, poller)
gps_ext_sock = messaging.sub_sock(context, service_list['gpsLocationExternal'].port, poller)
app_sock = messaging.sub_sock(context, service_list['applanixLocation'].port, poller)
loc_sock = messaging.pub_sock(context, service_list['liveLocation'].port)
last_ext, last_gps, last_app = -1, -1, -1
# 5 sec
max_gap = 5*1e9
preferred_type = None
while 1:
for sock, event in poller.poll(500):
if sock is app_sock:
msg = messaging.recv_one(sock)
last_app = msg.logMonoTime
this_type = 'app'
if sock is gps_sock:
msg = messaging.recv_one(sock)
gps_pkt = msg.gpsLocation
last_gps = msg.logMonoTime
this_type = 'gps'
if sock is gps_ext_sock:
msg = messaging.recv_one(sock)
gps_pkt = msg.gpsLocationExternal
last_ext = msg.logMonoTime
this_type = 'ext'
last = max(last_gps, last_ext, last_app)
if last_app > last - max_gap:
new_preferred_type = 'app'
elif last_ext > last - max_gap:
new_preferred_type = 'ext'
else:
new_preferred_type = 'gps'
if preferred_type != new_preferred_type:
print "switching from %s to %s" % (preferred_type, new_preferred_type)
preferred_type = new_preferred_type
if this_type == preferred_type:
new_msg = messaging.new_message()
if this_type == 'app':
# straight proxy the applanix
new_msg.init('liveLocation')
new_msg.liveLocation = copy(msg.applanixLocation)
else:
new_msg.logMonoTime = msg.logMonoTime
new_msg.init('liveLocation')
pkt = new_msg.liveLocation
pkt.lat = gps_pkt.latitude
pkt.lon = gps_pkt.longitude
pkt.alt = gps_pkt.altitude
pkt.speed = gps_pkt.speed
pkt.heading = gps_pkt.bearing
pkt.positionECEF = [float(x) for x in geodetic2ecef([pkt.lat, pkt.lon, pkt.alt])]
pkt.source = log.LiveLocationData.SensorSource.dummy
loc_sock.send(new_msg.to_bytes())
if __name__ == '__main__':
main()