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