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.
		
		
		
		
		
			
		
			
				
					
					
						
							89 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
	
	
							89 lines
						
					
					
						
							2.3 KiB
						
					
					
				#!/usr/bin/env python3
 | 
						|
import sys
 | 
						|
import time
 | 
						|
 | 
						|
import matplotlib.pyplot as plt
 | 
						|
import numpy as np
 | 
						|
import cereal.messaging as messaging
 | 
						|
import zmq
 | 
						|
from common.transformations.coordinates import LocalCoord
 | 
						|
from cereal.services import service_list
 | 
						|
 | 
						|
SCALE = 20.
 | 
						|
 | 
						|
def mpc_vwr_thread(addr="127.0.0.1"):
 | 
						|
  plt.ion()
 | 
						|
  fig = plt.figure(figsize=(15, 15))
 | 
						|
  ax = fig.add_subplot(1,1,1)
 | 
						|
  ax.set_xlim([-SCALE, SCALE])
 | 
						|
  ax.set_ylim([-SCALE, SCALE])
 | 
						|
  ax.grid(True)
 | 
						|
 | 
						|
  line, = ax.plot([0.0], [0.0], ".b")
 | 
						|
  line2, = ax.plot([0.0], [0.0], 'r')
 | 
						|
 | 
						|
  ax.set_aspect('equal', 'datalim')
 | 
						|
  plt.show()
 | 
						|
 | 
						|
  live_location = messaging.sub_sock('liveLocation', addr=addr, conflate=True)
 | 
						|
  gps_planner_points = messaging.sub_sock('gpsPlannerPoints', conflate=True)
 | 
						|
  gps_planner_plan = messaging.sub_sock('gpsPlannerPlan', conflate=True)
 | 
						|
 | 
						|
  last_points = messaging.recv_one(gps_planner_points)
 | 
						|
  last_plan = messaging.recv_one(gps_planner_plan)
 | 
						|
  while True:
 | 
						|
    p = messaging.recv_one_or_none(gps_planner_points)
 | 
						|
    pl = messaging.recv_one_or_none(gps_planner_plan)
 | 
						|
    ll = messaging.recv_one(live_location).liveLocation
 | 
						|
 | 
						|
    if p is not None:
 | 
						|
      last_points = p
 | 
						|
    if pl is not None:
 | 
						|
      last_plan = pl
 | 
						|
 | 
						|
    if not last_plan.gpsPlannerPlan.valid:
 | 
						|
      time.sleep(0.1)
 | 
						|
      line2.set_color('r')
 | 
						|
      continue
 | 
						|
 | 
						|
    p0 = last_points.gpsPlannerPoints.points[0]
 | 
						|
    p0 = np.array([p0.x, p0.y, p0.z])
 | 
						|
 | 
						|
    n = LocalCoord.from_geodetic(np.array([ll.lat, ll.lon, ll.alt]))
 | 
						|
    points = []
 | 
						|
    print(len(last_points.gpsPlannerPoints.points))
 | 
						|
    for p in last_points.gpsPlannerPoints.points:
 | 
						|
      ecef = np.array([p.x, p.y, p.z])
 | 
						|
      points.append(n.ecef2ned(ecef))
 | 
						|
 | 
						|
    points = np.vstack(points)
 | 
						|
    line.set_xdata(points[:, 1])
 | 
						|
    line.set_ydata(points[:, 0])
 | 
						|
 | 
						|
    y = np.matrix(np.arange(-100, 100.0, 0.5))
 | 
						|
    x = -np.matrix(np.polyval(last_plan.gpsPlannerPlan.poly, y))
 | 
						|
    xy = np.hstack([x.T, y.T])
 | 
						|
 | 
						|
    cur_heading = np.radians(ll.heading - 90)
 | 
						|
    c, s = np.cos(cur_heading), np.sin(cur_heading)
 | 
						|
    R = np.array([[c, -s], [s, c]])
 | 
						|
    xy = xy.dot(R)
 | 
						|
 | 
						|
    line2.set_xdata(xy[:, 1])
 | 
						|
    line2.set_ydata(-xy[:, 0])
 | 
						|
    line2.set_color('g')
 | 
						|
 | 
						|
 | 
						|
    ax.set_xlim([-SCALE, SCALE])
 | 
						|
    ax.set_ylim([-SCALE, SCALE])
 | 
						|
 | 
						|
    fig.canvas.draw()
 | 
						|
    fig.canvas.flush_events()
 | 
						|
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
  if len(sys.argv) > 1:
 | 
						|
    mpc_vwr_thread(sys.argv[1])
 | 
						|
  else:
 | 
						|
    mpc_vwr_thread()
 | 
						|
 |