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.
		
		
		
		
			
				
					90 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					90 lines
				
				2.3 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								#!/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()
							 |