- Zones in place of dynamic object detection
- Acts as a safety net cast over objects in view of the vehicle
diff --git a/docs/_site/planning/design.html b/docs/_site/planning/design.html
index d6529da26..d0421b4b4 100644
--- a/docs/_site/planning/design.html
+++ b/docs/_site/planning/design.html
@@ -1 +1 @@
- Behavior Planning and Controls Design Document (draft) | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied Behavior Planning and Controls Design Document (draft) Maintained by Hansika
Table of contents Important Definitions Used in Doc: System overview Current system: Planning: Controls: What Planning intends to accomplish: What Planning needs: Input: Justification: Proposed Planning System: Proposed structure Current-State Information Required: Representation of Surrounding Environment: Dynamic Occupancy Grid: Structure of Grid: Information within cell: Conversion to Cost Map: Determination of Cost: Distance From End: Number of merges/turns: Good traffic navigation protocols: Calculation of Path Costs: Important Definitions Used in Doc: Configuration Space: set of all configurations of a vehicle
System overview Current system: Planning: We use zones to determine speed at given way points, acting like an ‘on-rails’ vehicle. Zones are an enclosed region of space (represented as a polygon) with a maximum speed, which may be 0 to indicate a no-entry zone. Zones may overlap (in which case the lower speed wins). Zones may come from a variety of sources but currently originate from the Behavior Planner (Traffic Planner) and the Obstacle Zoner. Zones are currently not tagged with a type or origin: all zones are anonymous and equal.
Controls: Uses pure pursuit for steering control. The velocity controller is best not mentioned and should be replaced.
What Planning intends to accomplish: Develop a planning system that can take in a prediction about where cars, pedestrians, and other dynamic agents will be several seconds in the future and how we can find the most efficient trajectory for our autonomous vehicle (hereinafter referred to as the AV) on a short-term distance to get from point A to B (< a hundred feet) on a long-term path determined by widely spaced waypoints (> several miles).
What Planning needs: We choose to represent our prediction of the ground-truth state environment surrounding the AV several seconds in advanced using a Dynamic Occupancy Grid. This Dynamic Occupancy Grid will ideally hold information (in the form of probabilities) about whether a given grid cell (xn, yn) in a 2-Dimensional representation of real space (x, y) is occupied by an obstacle at some time tick t. This Dynamic Occupancy Grid will contain an individual grid frame (hereinafter referred to as a frame) for every discrete decisecond time tick for up to 3 seconds in advance of the current time state t = 0. Each of the frames in the Dynamic Occupancy Grid will be based on the local coordinate grid system around the AV.
Justification: Because safety is the highest priority when designing a AV planning system, our primary goal is to ensure that crashes never occur when our vehicle has the ability to avoid them. For simplicity, we treat all crashes with equal importance, meaning crashing with an animal, pedestrian, or other vehicles are all given equal “badness”. Defining a crash as the collision between the bounding boxes of two objects within real space, the only information we need to know is when another object’s bounding box will collide with our own. Knowing this, we can track all possible collisions with other dynamic and static objects through creating a Dynamic Occupancy Grid that tells us the spaces that contain other objects at some time t, for which we should not also occupy at that time t. The usefulness of the Dynamic Occupancy Grid is that all agents within our environment can be easily represented under the Grid because they all can be easily and efficiently sampled for any (x, y, t), whereas Zones struggled with efficiency and was unable to represent time altogether.
Proposed Planning System: Our proposed behavior planning and controls subsystem takes in a dynamic Occupancy Grid as the input for our planning system. Our planning system will output a path of waypoints finely spaced by equal time steps to help navigate the car to the correct location.
In order to make this possible, we have outlined some approaches/options for planning and controls. This document outlines our proposed methods and how they fit together to form a cohesive subsystem. It describes what our system is not responsible for as well. Finally, it compares our proposed methods to Navigator’s current approach and to other popular methods in the literature.
Proposed structure
Position (x,y,z) Linear velocities (vx, vy, vz)
Orientation (Theta_x, Theya_y, Theta_z) angular velocities (wx, wy, wz) (Egan: take a brief look into use of quaternions for modeling orientation and its derivatives, as that’s what currently is used)
Short-term local coordinate transform history
Representation of Surrounding Environment: Source: [1]
Voroni Diagrams: unsuitable for non-holonomic vehicles (cars)
State lattices: repeating primitive paths which connect possible states for the vehicle [1]
Dynamic Occupancy Grid: Structure of Grid: Each frame of the grid will be created around the local coordinate grid of the AV. It will span 40 meters to the left, 40 meters to the right, 40 meters behind, and 80 meters in front of the current position of the AV at time t = 0. Each grid cell will be made of squares spanning 0.2 meters long and wide. Each frame will represent a discrete time t = a/10 where a = (0, 30) such that our dynamic grid includes predictions from times t = (0, 3).
The grid must be timestamped with when it was created so coordinate systems can be properly matched. The map is accessed via M[t, x,y], where higher values of x and y are to the front and right of the vehicle respectively. (The rear leftmost point is index (0,0)).
Each cell is associated with a probability of cell being occupied by an obstacle (float value). This probability will be in the range [0, 1].
Conversion to Cost Map: Determination of Cost: The primary factor associated with cost will be crashes. Trajectories that lead to crashes will be given extremely high costs to deter the planner from choosing them. The Dynamic Occupancy Grid can be converted into a Cost Map. Other factors to associate with cost are: Travel distance, number of merges/turns, good traffic navigation protocols, etc. We would also use the measure of traffic in different lanes to help us determine cost of a given path.
Distance From End: Each path should be assigned a cost value proportional to the maximum distance from its final position of the AV and the next waypoint.
(Egan: I’m confused about this one. The point is that we maximize travel distance in the direction we want to go, and costs are relative to other paths, so consant cost increase don’t matter.) (Response – Chitsein: I think I was thinking incorrectly about travel distance’s relevance to the cost map – I meant for it to originally represent the travel distance between two points a and b. I realize that the RRT won’t be creating paths to get from a point a to b, but will rather find all paths that could be taken by the AV, so I think making Travel Distance represent a cost proportional to the maximum distance like you suggested would be the better design. )
Number of merges/turns: Increasing the cost of a path every time the AV merges or makes a turn to deter from paths that make unneccessary merges or turns. For example, we probably don’t want the vehicle to be merging in and out of lanes constantly on the highway to move a little faster at the expense of slowing down others cars it merges in front of and possibly increasing risk of collision.
Good traffic navigation protocols: Increase the cost of a path that do not follow good traffic navigation protocols. For example, imagine there is a line up of cars to turn right into the highway. Based on the cost map before good traffic navigation protocols are applied, the car could choose to turn into the left lane and then try to merge at the front of the line because it would decrease the time taken to get onto the highway. However, this would go against courteous driving practices, so we should teach the AV to wait it’s turn in the line.
Calculation of Path Costs: Each path’s cost is calculated based on the summation of the costs of each grid cell at time t (C[t, x, y]) plus the other factors associated with cost, including distance from end, number of merges/turns, and good traffic navigation protocols.
Cost for travel from a given to another: Source [4]
We can represent the points into a graph with vertices being possible options given current position and environment. Edges are the transition from a given point (where AV currently is) to next point. We weight transition to be the following equation: Source [4]
Proposal (Egan, I think this makes sense, I also think that we may need to tweak this conversion when we try to decide algorithms that work best for RRTs - Hansika): We may additionally want a cost function more general than a summation over occupied cells. The specific case I’m thinking of is we want to encode that, where possible, the vehicle should end in drivable area at the prediction horizon- we don’t want to attempt to overtake where since it looks good now, but when the horizon rolls forward the vehicle realizes it was impossible halfway through. This cannot be encoded by a cost map alone. So a more general approach is: C(P)=∑C_i (P), where Pis the path under consideration, C(P) is the associated cost, and C_i (P) is a component cost function. So grid cost C_g (P)=∑8t▒∑ {x \〖in X〗t }▒∑ {y∈Y_t }▒〖C[t,x,y]〗
Tweaks based on the 10/13 meeting: We have two places to inject cost, which is the RRT cost function evaluated on a per-node basis and a function of the leaf nodes. • RRT cost: cost that can be evaluated at each node without knowing where it will end up ○ Cost map: occupancy grid, road semantics (drivable area) ○ Safety/Dynamic considerations: physical obtainability, difference between trajectory speed and road speed limit. A function of the state more than a lookup in the cost map. • Leaf nodes: ○ Whether the trajectory ends up in drivable area ○ Whether the trajectory ends up closer to the goal? This may be possible to push into RRT cost but makes more sense based on endpoints.
RRTs:
Approach 1: Algorithm for RRTs with random sampling: [1] Input requirements: Configuration Space Ouputs: best state to go to next or Xnear
Benefits: 1. probabilistically complete a. If solution for path problem exists, RRT will find a soln with probability of 1 as running time goes to infinity 2. Guarantee kinematic feasibility 3. Quick to explore free space
Detractions: 1. Jerky paths created 2. Strong dependence on Neares Neighbor metric 3. Need to do collision checking for every expanded node
Approach 2: Source [3]
RRT* - works towards shortest path
Records distance each vertex has traveled relative to parent Closest node to parent vertex can be replaced by node with lower cost in given radius Neighbhors can be changed higher up in the tree if a cheaper path is found. Disadvantages:
More computationally expensive Psuedo Code: Source [3]:
Approach 3: Instead of using random point, all feasible connections are evaluated and only minimum cost paths are added to the tree.
Given a cost map, we could build off it in the following manner:
Cost functions: c_safety and c_time calculations can be found in source [4] To expand tree: souce [5]
Sample a pposition uniformly at random and then sample two dimenssionaly gaussian distribution centered at the around intial path.
Approach 4: CL-RRT
Tree expansion: grows a tree of feasible trajectories originating from the current vehicle state that attempts to reach a specified goal set [2]
Further RRT approaches are described here: https://en.wikipedia.org/wiki/Rapidly-exploring_random_tree Once we decide on a cost map approach, we can determine an algorithm to use using the cost map to create edge weights. Using heuristic algorithms such as A-star, greedy, BFS, etc. We can see if building off the avalaible methods (cost-functions, and weight functions) mentioned above into one of these algorithms, will help with making the best decision.
Other choices than RRTs:
Lattice Planners: We don’t wnat to use this because we are getting a dynamic grid:
Source 1: https://www.sciencedirect.com/science/article/pii/S0968090X15003447
Source 2: https://dspace.mit.edu/bitstream/handle/1721.1/65396/Frazzoli-2009-Real-Time%20Motion%20Planning%20With%20Applications%20to%20Autonomous%20Urban%20Driving.pdf?sequence=1&isAllowed=y
Source 3: https://theclassytim.medium.com/robotic-path-planning-rrt-and-rrt-212319121378
Source 4: https://www.scitepress.org/Papers/2012/40334/pdf/index.html
Source 5: https://www.researchgate.net/profile/Michael-Brunner-9/publication/236847575_Hierarchical_Rough_Terrain_Motion_Planning_using_an_Optimal_Sampling-Based_Method/links/0c9605196187ad600f000000/Hierarchical-Rough-Terrain-Motion-Planning-using-an-Optimal-Sampling-Based-Method.pdf
Creating occupancy map: https://www.scitepress.org/Papers/2012/40334/pdf/index.html -> to share with perception team if they want
Control:
Current System (Severely lacking, high potential): • PurePursuit ○ Tracking algorithm enabling the vehicle’s steering wheel to smoothly adjust steering angle in relation to the curve of the given trajectory. ○ ***Possibly can breakdown this algorithm and apply similar smoothing to other aspects of our vehicle’s movement, such as velocity, acceleration, breaking.
Input: Final, Unidisputed Trajectory: Set of discrete points, x(t), in a local coordinate system taken at time t0 Current Vehicle State Coordinate transform history between t0 and now
Output: Commands to hardware on vehicle
Planned System: • PurePursuit likely kept ○ Possibly expanded/using similar approaches to smoothing velocity along trajectory • Input: ○ Final, Unidisputed Trajectory: Set of discrete points (waypoints), x(t) or v(t) [Depends on RRT and how we determine cost-effective routes) • Output: ○ Precise commands to vehicle hardware ▪ Steering ▪ Pedal ▪ Break ○ Communicate with HFE team PurePursuit More PurePursuit
+ Behavior Planning and Controls Design Document (draft) | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied Behavior Planning and Controls Design Document (draft) Maintained by Hansika
Table of contents Important Definitions Used in Doc: System overview Current system: Planning: Controls: What Planning intends to accomplish: What Planning needs: Input: Justification: Proposed Planning System: Proposed structure Current-State Information Required: Representation of Surrounding Environment: Dynamic Occupancy Grid: Structure of Grid: Information within cell: Conversion to Cost Map: Determination of Cost: Distance From End: Number of merges/turns: Good traffic navigation protocols: Calculation of Path Costs: Important Definitions Used in Doc: Configuration Space: set of all configurations of a vehicle
System overview Current system: Planning: We use zones to determine speed at given way points, acting like an ‘on-rails’ vehicle. Zones are an enclosed region of space (represented as a polygon) with a maximum speed, which may be 0 to indicate a no-entry zone. Zones may overlap (in which case the lower speed wins). Zones may come from a variety of sources but currently originate from the Behavior Planner (Traffic Planner) and the Obstacle Zoner. Zones are currently not tagged with a type or origin: all zones are anonymous and equal.
Controls: Uses pure pursuit for steering control. The velocity controller is best not mentioned and should be replaced.
What Planning intends to accomplish: Develop a planning system that can take in a prediction about where cars, pedestrians, and other dynamic agents will be several seconds in the future and how we can find the most efficient trajectory for our autonomous vehicle (hereinafter referred to as the AV) on a short-term distance to get from point A to B (< a hundred feet) on a long-term path determined by widely spaced waypoints (> several miles).
What Planning needs: We choose to represent our prediction of the ground-truth state environment surrounding the AV several seconds in advanced using a Dynamic Occupancy Grid. This Dynamic Occupancy Grid will ideally hold information (in the form of probabilities) about whether a given grid cell (xn, yn) in a 2-Dimensional representation of real space (x, y) is occupied by an obstacle at some time tick t. This Dynamic Occupancy Grid will contain an individual grid frame (hereinafter referred to as a frame) for every discrete decisecond time tick for up to 3 seconds in advance of the current time state t = 0. Each of the frames in the Dynamic Occupancy Grid will be based on the local coordinate grid system around the AV.
Justification: Because safety is the highest priority when designing a AV planning system, our primary goal is to ensure that crashes never occur when our vehicle has the ability to avoid them. For simplicity, we treat all crashes with equal importance, meaning crashing with an animal, pedestrian, or other vehicles are all given equal “badness”. Defining a crash as the collision between the bounding boxes of two objects within real space, the only information we need to know is when another object’s bounding box will collide with our own. Knowing this, we can track all possible collisions with other dynamic and static objects through creating a Dynamic Occupancy Grid that tells us the spaces that contain other objects at some time t, for which we should not also occupy at that time t. The usefulness of the Dynamic Occupancy Grid is that all agents within our environment can be easily represented under the Grid because they all can be easily and efficiently sampled for any (x, y, t), whereas Zones struggled with efficiency and was unable to represent time altogether.
Proposed Planning System: Our proposed behavior planning and controls subsystem takes in a dynamic Occupancy Grid as the input for our planning system. Our planning system will output a path of waypoints finely spaced by equal time steps to help navigate the car to the correct location.
In order to make this possible, we have outlined some approaches/options for planning and controls. This document outlines our proposed methods and how they fit together to form a cohesive subsystem. It describes what our system is not responsible for as well. Finally, it compares our proposed methods to Navigator’s current approach and to other popular methods in the literature.
Proposed structure
Position (x,y,z) Linear velocities (vx, vy, vz)
Orientation (Theta_x, Theya_y, Theta_z) angular velocities (wx, wy, wz) (Egan: take a brief look into use of quaternions for modeling orientation and its derivatives, as that’s what currently is used)
Short-term local coordinate transform history
Representation of Surrounding Environment: Source: [1]
Voroni Diagrams: unsuitable for non-holonomic vehicles (cars)
State lattices: repeating primitive paths which connect possible states for the vehicle [1]
Dynamic Occupancy Grid: Structure of Grid: Each frame of the grid will be created around the local coordinate grid of the AV. It will span 40 meters to the left, 40 meters to the right, 40 meters behind, and 80 meters in front of the current position of the AV at time t = 0. Each grid cell will be made of squares spanning 0.2 meters long and wide. Each frame will represent a discrete time t = a/10 where a = (0, 30) such that our dynamic grid includes predictions from times t = (0, 3).
The grid must be timestamped with when it was created so coordinate systems can be properly matched. The map is accessed via M[t, x,y], where higher values of x and y are to the front and right of the vehicle respectively. (The rear leftmost point is index (0,0)).
Each cell is associated with a probability of cell being occupied by an obstacle (float value). This probability will be in the range [0, 1].
Conversion to Cost Map: Determination of Cost: The primary factor associated with cost will be crashes. Trajectories that lead to crashes will be given extremely high costs to deter the planner from choosing them. The Dynamic Occupancy Grid can be converted into a Cost Map. Other factors to associate with cost are: Travel distance, number of merges/turns, good traffic navigation protocols, etc. We would also use the measure of traffic in different lanes to help us determine cost of a given path.
Distance From End: Each path should be assigned a cost value proportional to the maximum distance from its final position of the AV and the next waypoint.
(Egan: I’m confused about this one. The point is that we maximize travel distance in the direction we want to go, and costs are relative to other paths, so consant cost increase don’t matter.) (Response – Chitsein: I think I was thinking incorrectly about travel distance’s relevance to the cost map – I meant for it to originally represent the travel distance between two points a and b. I realize that the RRT won’t be creating paths to get from a point a to b, but will rather find all paths that could be taken by the AV, so I think making Travel Distance represent a cost proportional to the maximum distance like you suggested would be the better design. )
Number of merges/turns: Increasing the cost of a path every time the AV merges or makes a turn to deter from paths that make unneccessary merges or turns. For example, we probably don’t want the vehicle to be merging in and out of lanes constantly on the highway to move a little faster at the expense of slowing down others cars it merges in front of and possibly increasing risk of collision.
Good traffic navigation protocols: Increase the cost of a path that do not follow good traffic navigation protocols. For example, imagine there is a line up of cars to turn right into the highway. Based on the cost map before good traffic navigation protocols are applied, the car could choose to turn into the left lane and then try to merge at the front of the line because it would decrease the time taken to get onto the highway. However, this would go against courteous driving practices, so we should teach the AV to wait it’s turn in the line.
Calculation of Path Costs: Each path’s cost is calculated based on the summation of the costs of each grid cell at time t (C[t, x, y]) plus the other factors associated with cost, including distance from end, number of merges/turns, and good traffic navigation protocols.
Cost for travel from a given to another: Source [4]
We can represent the points into a graph with vertices being possible options given current position and environment. Edges are the transition from a given point (where AV currently is) to next point. We weight transition to be the following equation: Source [4]
Proposal (Egan, I think this makes sense, I also think that we may need to tweak this conversion when we try to decide algorithms that work best for RRTs - Hansika): We may additionally want a cost function more general than a summation over occupied cells. The specific case I’m thinking of is we want to encode that, where possible, the vehicle should end in drivable area at the prediction horizon- we don’t want to attempt to overtake where since it looks good now, but when the horizon rolls forward the vehicle realizes it was impossible halfway through. This cannot be encoded by a cost map alone. So a more general approach is: C(P)=∑C_i (P), where Pis the path under consideration, C(P) is the associated cost, and C_i (P) is a component cost function. So grid cost C_g (P)=∑8t▒∑ {x \〖in X〗t }▒∑ {y∈Y_t }▒〖C[t,x,y]〗
Tweaks based on the 10/13 meeting: We have two places to inject cost, which is the RRT cost function evaluated on a per-node basis and a function of the leaf nodes. • RRT cost: cost that can be evaluated at each node without knowing where it will end up ○ Cost map: occupancy grid, road semantics (drivable area) ○ Safety/Dynamic considerations: physical obtainability, difference between trajectory speed and road speed limit. A function of the state more than a lookup in the cost map. • Leaf nodes: ○ Whether the trajectory ends up in drivable area ○ Whether the trajectory ends up closer to the goal? This may be possible to push into RRT cost but makes more sense based on endpoints.
RRTs:
Approach 1: Algorithm for RRTs with random sampling: [1] Input requirements: Configuration Space Ouputs: best state to go to next or Xnear
Benefits: 1. probabilistically complete a. If solution for path problem exists, RRT will find a soln with probability of 1 as running time goes to infinity 2. Guarantee kinematic feasibility 3. Quick to explore free space
Detractions: 1. Jerky paths created 2. Strong dependence on Neares Neighbor metric 3. Need to do collision checking for every expanded node
Approach 2: Source [3]
RRT* - works towards shortest path
Records distance each vertex has traveled relative to parent Closest node to parent vertex can be replaced by node with lower cost in given radius Neighbhors can be changed higher up in the tree if a cheaper path is found. Disadvantages:
More computationally expensive Psuedo Code: Source [3]:
Approach 3: Instead of using random point, all feasible connections are evaluated and only minimum cost paths are added to the tree.
Given a cost map, we could build off it in the following manner:
Cost functions: c_safety and c_time calculations can be found in source [4] To expand tree: souce [5]
Sample a pposition uniformly at random and then sample two dimenssionaly gaussian distribution centered at the around intial path.
Approach 4: CL-RRT
Tree expansion: grows a tree of feasible trajectories originating from the current vehicle state that attempts to reach a specified goal set [2]
Further RRT approaches are described here: https://en.wikipedia.org/wiki/Rapidly-exploring_random_tree Once we decide on a cost map approach, we can determine an algorithm to use using the cost map to create edge weights. Using heuristic algorithms such as A-star, greedy, BFS, etc. We can see if building off the avalaible methods (cost-functions, and weight functions) mentioned above into one of these algorithms, will help with making the best decision.
Other choices than RRTs:
Lattice Planners: We don’t wnat to use this because we are getting a dynamic grid:
Source 1: https://www.sciencedirect.com/science/article/pii/S0968090X15003447
Source 2: https://dspace.mit.edu/bitstream/handle/1721.1/65396/Frazzoli-2009-Real-Time%20Motion%20Planning%20With%20Applications%20to%20Autonomous%20Urban%20Driving.pdf?sequence=1&isAllowed=y
Source 3: https://theclassytim.medium.com/robotic-path-planning-rrt-and-rrt-212319121378
Source 4: https://www.scitepress.org/Papers/2012/40334/pdf/index.html
Source 5: https://www.researchgate.net/profile/Michael-Brunner-9/publication/236847575_Hierarchical_Rough_Terrain_Motion_Planning_using_an_Optimal_Sampling-Based_Method/links/0c9605196187ad600f000000/Hierarchical-Rough-Terrain-Motion-Planning-using-an-Optimal-Sampling-Based-Method.pdf
Creating occupancy map: https://www.scitepress.org/Papers/2012/40334/pdf/index.html -> to share with perception team if they want
Control:
Current System (Severely lacking, high potential): • PurePursuit ○ Tracking algorithm enabling the vehicle’s steering wheel to smoothly adjust steering angle in relation to the curve of the given trajectory. ○ ***Possibly can breakdown this algorithm and apply similar smoothing to other aspects of our vehicle’s movement, such as velocity, acceleration, breaking.
Input: Final, Unidisputed Trajectory: Set of discrete points, x(t), in a local coordinate system taken at time t0 Current Vehicle State Coordinate transform history between t0 and now
Output: Commands to hardware on vehicle
Planned System: • PurePursuit likely kept ○ Possibly expanded/using similar approaches to smoothing velocity along trajectory • Input: ○ Final, Unidisputed Trajectory: Set of discrete points (waypoints), x(t) or v(t) [Depends on RRT and how we determine cost-effective routes) • Output: ○ Precise commands to vehicle hardware ▪ Steering ▪ Pedal ▪ Break ○ Communicate with HFE team PurePursuit More PurePursuit
diff --git a/docs/_site/planning/planning-overview.html b/docs/_site/planning/planning-overview.html
index 11400914d..0f26457ee 100755
--- a/docs/_site/planning/planning-overview.html
+++ b/docs/_site/planning/planning-overview.html
@@ -1 +1 @@
- Planning | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied The car should follow three instructions, in order of priority:
Don’t run into anything. Drive forward along a route until the goal is reached. Obey traffic laws. The car should be rewarded for obeying these three instructions, and the Planning system’s objective should be to maximize this reward.
To help the car make appropriate decisions, we can feed it “costmaps” that represent the reward that the car will receive if it drives through a given spot on the map. Each costmap might represent a specific quality (the drivable surfaces near the car, for example), and we can simply take the weighted sum of each costmap to generate a hollistic overview for the car.
Keep in mind that “cost” and “reward” are really the same concept. The car’s goal is to select a path that moves through regions of the greatest reward, a.k.a. of the least cost.
The more costmaps we sum together and the more carefully we select the weights for the sum, the better our car will be at making decisions.
Costmaps Here are the costmaps that we should calculate at minimum, along with their justification:
Drivable area This describes a surface that the car is allowed to drive over, mainly lanes, parking spaces, and intersections.
We can expand this drivable area if the car’s current options are exhausted. For example, the default drivable area may only include lanes that match the car’s current driving direction, but this region can be expanded to include lanes with oncoming traffic if the current region is blocked.
Justification: The car should only be allowed to drive on “drivable” surfaces: no sidewalks, lawns, etc.
Suggested format: 0.4m cell size, 40m range.
Above: Example where drivable region expansion may be useful. Credit: CARLA Leaderboard.
Predicted occupancy Occupancy grids are a common concept in robotics used to describe obstacles. The world is divided into cells. If a given cell contains an obstacle, then it is marked as occupied.
Using machine learning, we can generate occupancy grids not just for the present ($t=0$), but also for the future (such as $t=3s$).
For a simple costmap that compresses all temporal considerations into the present, we can simply add the predicted occupancies across all frames, creating a single costmap for both the current and future occupancies.
Justification: The car should not run into anything.
Suggested format: 0.4m, 20m range minimum , 40m ideal.
Distance to route & goal This is a combined costmap that describes both how far the car is from the route and from the goal.
Justification: The car should drive along the route until the goal is reached.
Costmap specifications All costmaps should be in the map
frame, aligned with the x/y axes of the map. This eliminates the need to perform costly transforms. All costmaps should have resolutions (cell sizes) that are multiples of the same base resolution. Example: 0.4, 0.8, and 1.6 meters. This allows them to be cleanly scaled. The costmaps do not necessarily need to share an origin nor size, though their sum will only be accurate in the region where they align.
+ Planning | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied The car should follow three instructions, in order of priority:
Don’t run into anything. Drive forward along a route until the goal is reached. Obey traffic laws. The car should be rewarded for obeying these three instructions, and the Planning system’s objective should be to maximize this reward.
To help the car make appropriate decisions, we can feed it “costmaps” that represent the reward that the car will receive if it drives through a given spot on the map. Each costmap might represent a specific quality (the drivable surfaces near the car, for example), and we can simply take the weighted sum of each costmap to generate a hollistic overview for the car.
Keep in mind that “cost” and “reward” are really the same concept. The car’s goal is to select a path that moves through regions of the greatest reward, a.k.a. of the least cost.
The more costmaps we sum together and the more carefully we select the weights for the sum, the better our car will be at making decisions.
Costmaps Here are the costmaps that we should calculate at minimum, along with their justification:
Drivable area This describes a surface that the car is allowed to drive over, mainly lanes, parking spaces, and intersections.
We can expand this drivable area if the car’s current options are exhausted. For example, the default drivable area may only include lanes that match the car’s current driving direction, but this region can be expanded to include lanes with oncoming traffic if the current region is blocked.
Justification: The car should only be allowed to drive on “drivable” surfaces: no sidewalks, lawns, etc.
Suggested format: 0.4m cell size, 40m range.
Above: Example where drivable region expansion may be useful. Credit: CARLA Leaderboard.
Predicted occupancy Occupancy grids are a common concept in robotics used to describe obstacles. The world is divided into cells. If a given cell contains an obstacle, then it is marked as occupied.
Using machine learning, we can generate occupancy grids not just for the present ($t=0$), but also for the future (such as $t=3s$).
For a simple costmap that compresses all temporal considerations into the present, we can simply add the predicted occupancies across all frames, creating a single costmap for both the current and future occupancies.
Justification: The car should not run into anything.
Suggested format: 0.4m, 20m range minimum , 40m ideal.
Distance to route & goal This is a combined costmap that describes both how far the car is from the route and from the goal.
Justification: The car should drive along the route until the goal is reached.
Costmap specifications All costmaps should be in the base_link
frame, centered on the vehicle. All costmaps should have resolutions (cell sizes) that are multiples of the same base resolution. Example: 0.4, 0.8, and 1.6 meters. This allows them to be cleanly scaled. The costmaps do not necessarily need to share an origin nor size, though their sum will only be accurate in the region where they align.
diff --git a/docs/_site/sensing/sensing-overview.html b/docs/_site/sensing/sensing-overview.html
index f72d71ea5..8cfeb166b 100755
--- a/docs/_site/sensing/sensing-overview.html
+++ b/docs/_site/sensing/sensing-overview.html
@@ -1 +1 @@
- Sensing | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied Sensing overview Table of contents The Sensing system is responsible for processing raw sensor data into a usable form for the Perception system.
For example, raw LiDAR data from our front and rear sensors is merged into a single reference frame, downsampled, and cropped to remove points along the vehicle itself (points of our vehicle’s doors, for example).
More info to come! But our filters aren’t reinvinting the wheel.
+ Sensing | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied Sensing overview Table of contents The Sensing system is responsible for processing raw sensor data into a usable form for the Perception system.
For example, raw LiDAR data from our front and rear sensors is merged into a single reference frame, downsampled, and cropped to remove points along the vehicle itself (points of our vehicle’s doors, for example).
More info to come! But our filters aren’t reinvinting the wheel.
diff --git a/docs/_site/simulation/simulation-overview.html b/docs/_site/simulation/simulation-overview.html
index 51ce33d4d..7ab4411c0 100755
--- a/docs/_site/simulation/simulation-overview.html
+++ b/docs/_site/simulation/simulation-overview.html
@@ -1,2 +1,2 @@
- Simulation | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied Simulation overview Maintained by Connor Scally & Daniel Vayman
Table of contents Simulation Enviroment Launching the simulator & running Navigator: Using the Simulator: Troubleshooting: Sourcing Foxy Automatically in Bash: Before demonstrating our codebase on the vehicle, in the real world, we must first test our stack in a virtual one. The following documentation outlines essential CARLA usage and syntax, to allow for simulating our stack in a virtual enviroment.
Nova utilizes CARLA for virtualization. For further information on CARLA, and to learn more about advanced usage, please see the following links:
https://carla.org/ https://carla.readthedocs.io/en/latest/ Simulation Enviroment Prerequisites:
CARLA Simulator: Please follow the instructions in the above links to install CARLA on your chosen operating system Navigator: Please see our GitHub page for the latest releases of Navigator RVIZ (Or an equivalent ROS visualizer) ROS2 Dependencies for the above: Self-explanatory, Navigator comes with most of what you need, CARLA may not, do not forget to check! Launching the simulator & running Navigator: Launching CARLA :
Your first step should be to navigate to your CARLA directory and launch CARLA with the CARLAUE4.sh script with the -RenderOffScreen flag. If you are on a unix system, the command will look like this: $ /home/share/carla/CarlaUE4.sh -RenderOffscreen
+ Simulation | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied Simulation overview Maintained by Connor Scally & Daniel Vayman
Table of contents Simulation Enviroment Launching the simulator & running Navigator: Using the Simulator: Troubleshooting: Sourcing Foxy Automatically in Bash: Before demonstrating our codebase on the vehicle, in the real world, we must first test our stack in a virtual one. The following documentation outlines essential CARLA usage and syntax, to allow for simulating our stack in a virtual enviroment.
Nova utilizes CARLA for virtualization. For further information on CARLA, and to learn more about advanced usage, please see the following links:
https://carla.org/ https://carla.readthedocs.io/en/latest/ Simulation Enviroment Prerequisites:
CARLA Simulator: Please follow the instructions in the above links to install CARLA on your chosen operating system Navigator: Please see our GitHub page for the latest releases of Navigator RVIZ (Or an equivalent ROS visualizer) ROS2 Dependencies for the above: Self-explanatory, Navigator comes with most of what you need, CARLA may not, do not forget to check! Launching the simulator & running Navigator: Launching CARLA :
Your first step should be to navigate to your CARLA directory and launch CARLA with the CARLAUE4.sh script with the -RenderOffScreen flag. If you are on a unix system, the command will look like this: $ /home/share/carla/CarlaUE4.sh -RenderOffscreen
The “RenderOffscreen” flag hides the rendering window, which saves some resources. See here for more details
Launching RVIZ (within our Docker container ):
Open a new terminal window.
Navigate to the root directory of Navigator
Enable Docker to launch GUI programs
$ xhost +
Run our docker container start script. (If first time running container, refer to step 3 )
$ ./start.sh
Source the setup script via a command like: . install/setup.bash
Run: rviz2
Select File followed by Open Config Select default.rviz from the share folder. It is recommended that you have your own copy of this as well for your own configuration. Launching Navigator :
Open a new terminal window.
Navigate to the root directory of Navigator.
Run the docker container ./start.sh
Run source /install/setup.bash
(if you have bash sourcing ROS automatically (see below), that works too)
Run ros2 launch carla_interface carla-lite.launch.py
Check RVIZ and terminal output. The sim_bridge will publish sensor data just as if you were driving on campus, and it will similary accept commands from our standard topics . As of writing, our custom bridge publishes:
GNSS (GPS) IMU Front and rear Lidar (not fully functional) Front RGB camera Front depth camera CARLA ground truths for Car’s odometry (position, orientation, speed) CARLA virtual bird’s-eye camera (/carla/birds_eye_rgb) The most up-to-date information on our bridge’s capabilities can be found at the top of the script itself .
Using the Simulator: You can control our ego vehicle with ros2 run manual_control manual_control_node
At the moment, this only supports keyboard control through NoMachine or similar, not SSH . If you get a “pynput” error, try running pip3 install pynput
. You can change a number of simulation settings by editing our script’s contants (here ). Don’t forget to rebuild the package or use colcon build --symlink-install
(recommended). ROS param support in the works. Troubleshooting: If you get a “pynput” error, try running pip3 install pynput
. If you get a CARLA segmentation fault, it’s likely you just need to restart CARLA. This will be fixed… eventually. This should only happen after starting the bridge 10 times or so, and should not happen while the bridge is running. If CARLA gives you a SIGFAULT error attach the -carla-rpc-port=N where N = your favorite (Not in use) port number. Sourcing Foxy Automatically in Bash: Open your terminal Write the command –> gedit ~/.bashrc
(or nano, whatever really) Go under the last line line and write –> source /opt/ros/foxy/setup.bash
Save and exit Now with every new shell you open, it will source automatically
diff --git a/docs/_site/system-overview.html b/docs/_site/system-overview.html
index 10f54fb6a..83d7f1c83 100755
--- a/docs/_site/system-overview.html
+++ b/docs/_site/system-overview.html
@@ -1 +1 @@
- System overview | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied System overview Maintained by Will Heitman
Table of contents Design Subsystems Example Design Navigator is designed to be:
Simple , with components that are easy to use an extend When a more powerful but complex algorithm is used, a simpler alternative should also be present Modular , with nodes that can be swapped, added, and updated with the help of ROS2 Since nodes are all built using standard C++ and Python libraries, code is future-proofed. Open source , with all of our code licensed under the highly permissable MIT license Our dependencies are also open-source Subsystems
Navigator is split into five main subsystems:
Sensing , where raw sensor data from cameras, GNSS, and more is filtered before being passed along Perception , which uses the filtered sensor data to build a rich understanding of the car’s surroundings Planning , which uses this rich understanding, plus the desired destination, to decide how the car should act on a high level Controls , where the desired action is compared to the car’s current state and low-level action is calculated Interface , where the low-level action is sent to the steering wheel and pedals. We also have some important code to support testing, visualization, and simulation. Simulation plays a big role in our development, and you can find an overview of it here .
Example Our sensing system takes in a red blob from our front camera and does some white balancing to make the image more clear. The perception system identifies this red blob as a stop sign and generates a bounding box with the coordinates of the stop sign relative to the car. The planning system determines that we must set our speed to zero at the stop sign. The controls system notes that our car is still moving, and calculates that we must decelerate a certain amount. Finally, our actuation system converts this desired deceleration into a brake pedal command, which is sent out to the pedal’s motor.
+ System overview | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied System overview Maintained by Will Heitman
Table of contents Design About nodes and topics Subsystems Cost maps Topics Design Navigator is designed to be:
Simple , with components that are easy to use an extend When a more powerful but complex algorithm is used, a simpler alternative should also be present Modular , with nodes that can be swapped, added, and updated with the help of ROS2 Since nodes are all built using standard C++ and Python libraries, code is future-proofed. Open source , with all of our code licensed under the highly permissable MIT license Our dependencies are also open-source About nodes and topics Navigator is built upon ROS2, a communications framework where individual executables called “nodes” exchange messages throguh “topics.” A node can either subscribe to a topic or publish to it. In this fashion, individual nodes form a dense network where everything from camera streams to steering commands are passed from one node to the next.
Nodes can be grouped into packages. Packages are then grouped in workspaces. Navigator itself is a ROS workspace. It contains many packages, and each package contains at least one node.
Using ROS2, one node can gather raw LiDAR data from a sensor, where it publishes the pointcloud as a PointCloud2
message to a topic called /lidar/raw
. Another node can then subscribe to /lidar/raw
, filter the data, and publish the result to /lidar/filtered
.
To learn more about ROS, watch this lecture by Katherine Scott , a developer advocate at Open Robotics. <!– ## Subsystems
Navigator is split into five main subsystems:
Sensing , where raw sensor data from cameras, GNSS, and more is filtered before being passed along Perception , which uses the filtered sensor data to build a rich understanding of the car’s surroundings Planning , which uses this rich understanding, plus the desired destination, to decide how the car should act on a high level Controls , where the desired action is compared to the car’s current state and low-level action is calculated Interface , where the low-level action is sent to the steering wheel and pedals. –> Subsystems We can divide Navigator’s nodes into four groups.
The sensing subsystem takes raw sensor data and publishes them as Image
messages, PointCloud2
messages, Imu
messages, and so on. This subsystem also include sensor filters, which subscribe to raw data and publish their filtered results.
The perception subsystem draws inferences from the sensor data, including the location of pedestrians, our position on the map, and the predicted motion of surrounding vehicles. Nodes in this subsystem often publish their results as cost maps .
The planning subsystem takes our perception results and decides what our vehicle should do. This subsystem handles both high-level decisions (Should we pass a car that’s stopped in the road?) and low-level ones (How far should we press the throttle pedal to reach our desired speed?).
The interface subsystem is the link between our software and hardware. It includes nodes that communicate with our steering hardware, our microcontroller, and more. Both the sensing and interface subsystems are vehicle-specific , which means that they need to be configured to suite each individual vehicle. At Nova, we have separate configurations for simulated driving and real-world use.
Cost maps During execution, Navigator calculates several cost maps, which are grid-based maps of our surrounding area that describe where our car should or should not drive.
Each cell in the grid is assigned a cost. The higher the cost, the less likely our car will generate a path that moves through the cell. This results in paths that weave their way through only low-cost cells. If no low-cost cells are available, the car stops and waits.
We calculate and use multiple cost maps, each one representing a unique factor to consider. For example:
Our occupancy grid generator describes the location of objects (cars, people, curbs). Our prediction network (PredNet) node describes the future location of obstacles. Our red light detector marks intersections as high-cost regions if the light is red. Our map manager assigns costs based on how far a cell is from the route and from the goal. We add as many of these layers together to form a single, holisitic costmap that our motion planner uses as its input.
Above: Cost map dimensions
Cost maps should be in the base_link
(vehicle) reference frame. They should extend 40 meters in front and to the side of the car and 20 meters behind, forming a total area of 80 x 60 meters. Cells should have a side length of either 0.2, 0.4, 0.8, or 1.6 meters.
In the above example, each image is 200 x 150 pixels, representing a cost map layer with a resolution of 0.4 meters/cell. Clockwise from top left: Current occupancy, junction cost (due to a stop sign), route distance, and drivable area.
Topics /lidar/fused
: Raw LiDAR fused together to create a 360-degree picture. Otherwise unfiltered. /lidar/filtered
: Filtered LiDAR, with ground points removed. /grid/drivable
/grid/route_distance
/grid/occupancy/current
: Only the current occupancy grid. /grid/occupancy/combined
: Both the current and all future prediction occupancy grids, summed together.
diff --git a/docs/_site/writing-documentation.html b/docs/_site/writing-documentation.html
index 7bb5781a7..d82168571 100644
--- a/docs/_site/writing-documentation.html
+++ b/docs/_site/writing-documentation.html
@@ -1,2 +1,2 @@
- Writing documentation | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied System overview Table of contents Testing locally Editing online This documentation site is built off of Navigator’s dev
branch. All files within the /doc
directory are remapped to nova-utd.github.io
.
Adding to the site is easy. Here are two good options:
Testing locally To test locally, cd into /docs
and run
docker run --rm --volume="$PWD:/srv/jekyll:Z" -p 8083:8083 jekyll/jekyll jekyll serve --port 8083
+ Writing documentation | Navigator Skip to main content Link Expand (external link) Document Search Copy Copied System overview Table of contents Testing locally Editing online This documentation site is built off of Navigator’s dev
branch. All files within the /doc
directory are remapped to nova-utd.github.io
.
Adding to the site is easy. Here are two good options:
Testing locally To test locally, cd into /docs
and run
docker run --rm --volume="$PWD:/srv/jekyll:Z" -p 8083:8083 jekyll/jekyll jekyll serve --port 8083
Use a browser to view localhost:8083
. Refresh the page to show the latest updates. See the official Docker README for more info.
Editing online On GitHub, move to the /docs
directory on the dev
branch (here ), then press the period key on your keyboard. This will open GitHub’s web editor. See here for more info.
diff --git a/docs/assets/res/airbags.png b/docs/assets/res/airbags.png
new file mode 100644
index 000000000..5b60b868f
Binary files /dev/null and b/docs/assets/res/airbags.png differ
diff --git a/docs/assets/res/airbags.xcf b/docs/assets/res/airbags.xcf
new file mode 100644
index 000000000..ff1f12f63
Binary files /dev/null and b/docs/assets/res/airbags.xcf differ
diff --git a/docs/assets/res/cost_map_size.jpg b/docs/assets/res/cost_map_size.jpg
new file mode 100644
index 000000000..b97c489c8
Binary files /dev/null and b/docs/assets/res/cost_map_size.jpg differ
diff --git a/docs/assets/res/cost_maps.png b/docs/assets/res/cost_maps.png
new file mode 100644
index 000000000..f5a1f0cec
Binary files /dev/null and b/docs/assets/res/cost_maps.png differ
diff --git a/docs/assets/res/logo-alt.gif b/docs/assets/res/logo-alt.gif
new file mode 100644
index 000000000..efe6fe38d
Binary files /dev/null and b/docs/assets/res/logo-alt.gif differ
diff --git a/docs/assets/res/routing-sections.png b/docs/assets/res/routing-sections.png
new file mode 100644
index 000000000..9e7d2bedd
Binary files /dev/null and b/docs/assets/res/routing-sections.png differ
diff --git a/docs/contributing/tricks.md b/docs/contributing/tricks.md
new file mode 100755
index 000000000..37ea15663
--- /dev/null
+++ b/docs/contributing/tricks.md
@@ -0,0 +1,31 @@
+---
+layout: default
+title: Tricks
+nav_order: 5
+---
+
+# Tricks
+
+{: .no_toc }
+
+_Maintained by Nova members_
+
+## Table of contents
+
+{: .no_toc .text-delta }
+
+1. TOC
+ {:toc}
+
+---
+
+## Tools
+
+- You can get the publishing frequency of a topic with `$ ros2 topic hz [topic_name]`
+- Show a graph of all current topics and nodes with `$ rqt_graph`
+- VS Code's "Remote - SSH" extension is a good way to develop remotely on the Quad. Files, terminals, and more all appear as though you were working locally on the Quad.
+- Other useful VS Code extensions include Prettier, GitLens, Doxygen Documenttion Generator (C++), autoDocstring (Python), and the C/C++ entension pack.
+
+## Other
+
+- ROS [Services](https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Service-And-Client.html) are alternatives to publishers/subscribers. They return results only when requested by a Client.
diff --git a/docs/index.md b/docs/index.md
index a6bfb7f1a..3c1a0f22f 100755
--- a/docs/index.md
+++ b/docs/index.md
@@ -13,11 +13,9 @@ Despite major advances in autonomous driving research, there has yet to exist a
Navigator is our answer to this delimma. It's built on standard technologies, is kept as simple as possible, and its modular design makes adding new features straightforward.
## System requirements
-- System running Ubuntu 20.04 LTS or similar ([see here](http://docs.ros.org.ros.informatik.uni-freiburg.de/en/foxy/Installation/Alternatives/Ubuntu-Development-Setup.html#system-requirements))
- - *[**Docker**](https://docs.docker.com/desktop/) engine already installed on Ubuntu*
-- [**Ros2 Foxy**](https://docs.ros.org/en/foxy/Installation.html)
-- [**CARLA 0.9.13**](https://carla.readthedocs.io/en/latest/start_quickstart/)
-- A dedicated GPU with at least 6 GB of memory, ideally 8 GB
+- [**Docker**](https://docs.docker.com/desktop/)
+- [**CARLA 0.9.13**](https://carla.readthedocs.io/en/latest/start_quickstart/) for simulated testing (optional)
+- For best results, a dedicated GPU with at least 6 GB of memory, ideally 8 GB
- x86_64 CPU
- About 20 GB of disk space
@@ -25,9 +23,9 @@ Navigator is our answer to this delimma. It's built on standard technologies, is
> Note: Lines with "$" are on host, while lines with "#" are within the container.
-1. [Install ROS2 Foxy](https://docs.ros.org/en/foxy/Installation.html) if you haven't already done so
-2. [Install Docker](https://www.docker.com/get-started/) if you haven't already done so
-3. Clone our repository
+1. [Install Docker](https://www.docker.com/get-started/) if you haven't already done so
+2. If not already set, choose a number between 0-100 and use this for your user-wide ROS_DOMAIN_ID. Add this to your `.bashrc` with `echo 'export ROS_DOMAIN_ID=[your number]' >> ~/.bashrc`
+2. Clone our repository
```
$ git clone --recursive https://github.com/Nova-UTD/navigator
$ cd navigator
@@ -39,7 +37,7 @@ $ ./docker.sh
```
which gives:
```
-wheitman@justingpu:~/navigator$ ./docker.sh
+[username]@justingpu:~/navigator$ ./docker.sh
=====================================================================
▀█▄ ▀█▀ ██ ▄
█▀█ █ ▄▄▄▄ ▄▄▄▄ ▄▄▄ ▄▄▄ ▄▄▄ ▄ ▄▄▄▄ ▄██▄ ▄▄▄ ▄▄▄ ▄▄
@@ -72,7 +70,7 @@ That's it!
$ ./docker.sh
...
root@yourhost:/navigator# ./navigator
-root@yourhost:/navigator# ros2 launch carla_interface carla-lite.launch.py
+root@yourhost:/navigator# ros2 launch carla_interface carla.launch.py
```
This should start a series of ROS nodes, spawning an ego vehicle in the simulator along with a number of sensors:
```
@@ -91,3 +89,8 @@ $ ./docker.sh
...
root@yourhost:/navigator# rviz2
```
+
+## Real-world use
+To run in the real-world, you'll need to provide your own LiDAR stream, map data, and throttle/brake/steering interface. We provide our own interface, for use with our specific hardware, as an example.
+
+To use, run `./docker.sh` to enter the container, then source Navigator with `. install/setup.bash`, and finally launch the real-world script with `ros2 launch main.launch.py`. If you haven't built the workspace yet, run `colcon build --symlink-install` after sourcing.
diff --git a/docs/perception/segmentation.md b/docs/perception/segmentation.md
new file mode 100644
index 000000000..89e99e860
--- /dev/null
+++ b/docs/perception/segmentation.md
@@ -0,0 +1,54 @@
+---
+layout: default
+title: Semantic segmentation
+nav_order: 3
+---
+
+# Semantic segmentation
+
+{: .no_toc }
+
+_Maintained by Will Heitman_
+
+## Table of contents
+
+{: .no_toc .text-delta }
+
+1. TOC
+ {:toc}
+
+---
+
+## Class dictionary
+
+Our semantic segmentation model is trained on the [Cityscapes Dataset](https://www.cityscapes-dataset.com/).
+
+| Description | Class ID (int) | RGB | Unpacked |
+| --------------------------------------- | -------------- | ----------------------------------------------------------- | ---------- |
+| Road | 0 | (128, 64, 128) | 4286595200 |
+| Sidewalk | 1 | (244, 35, 232) | 4294190056 |
+| ~~Building~~ (overwritten by wall) | 2 | | |
+| Wall | 3 | (102,102,156) | ? |
+| ~~Fence~~ (overwritten by wall) | 4 | | |
+| Pole | 5 | (153, 153, 153) | 4288256409 |
+| Traffic light | 6 | (250, 170, 30) | 4294617630 |
+| Traffic sign | 7 | (220, 220, 0) | 4292664320 |
+| Vegetation | 8 | (107, 142, 35) | ? |
+| Terrain | 9 | (145, 170, 100) | 4287736420 |
+| Sky | 10 | (70, 130, 180) | ? |
+| Person | 11 | (220, 20, 60) | ? |
+| ~~Rider~~ (overwritten by Car) | 12 | | |
+| Car | 13 | (0, 0, 142) | 4278190222 |
+| ~~Truck~~ (overwritten by Car) | 14 | | |
+| ~~Bus~~ (overwritten by Car) | 15 | | |
+| ~~Train~~ (overwritten by Car) | 16 | | |
+| ~~Motorcycle~~ (overwritten by Bicycle) | 17 | | |
+| Bicycle | 18 | (119, 11, 32) | 4285991711 |
+
+```python
+import struct
+r,g,b = 119,11,31
+a = 255 # always
+unpacked = struct.unpack('I', struct.pack('BBBB', b, g, r, a))[0] # 4285991711
+```
+
diff --git a/docs/planning/airbags.md b/docs/planning/airbags.md
new file mode 100644
index 000000000..aa8117b9d
--- /dev/null
+++ b/docs/planning/airbags.md
@@ -0,0 +1,20 @@
+---
+layout: default
+title: Airbags
+---
+
+# Airbags
+
+_Maintained by Will Heitman_
+
+"Airbags" are what we call safety zones that limit our vehicle's speed. Airbags form a low-level safety system that is one step above a similar automatic emergency braking (AEB) system.
+
+The logic is simple. We establish three safety zones (red, amber, and yellow), where our speed is limited to varying degrees. If any region within these zones is occupied by a LiDAR point, the vehicle's speed will be limited to the zone's value. If no LiDAR point falls within the zone, the speed is not limited.
+
+In the case of a speed limitation, if the car is currently traveling faster than the zone allows, the airbag system will send a 100% brake command.
+
+Airbags extend in front of the vehicle, and slightly to either side.
+
+![Diagram of airbag dimensions](/navigator/assets/res/airbags.png)
+
+Above: Diagram of airbag dimensions
diff --git a/docs/planning/maps.md b/docs/planning/maps.md
new file mode 100644
index 000000000..400f284d5
--- /dev/null
+++ b/docs/planning/maps.md
@@ -0,0 +1,43 @@
+---
+layout: default
+title: Maps
+---
+
+# Maps
+
+{: .no_toc }
+
+_Maintained by Will Heitman_
+
+## Table of contents
+
+{: .no_toc .text-delta }
+
+1. TOC
+ {:toc}
+
+## Grid maps
+
+All grid maps are in the `base_link` (vehicle) reference frame. The semantic grid extends 40 meters ahead, 20 meters behind, and 30 meters to either side of the car.
+![Cost map dimensions](assets/res/cost_map_size.jpg)
+
+---
+
+## Semantic map
+
+This is a general-purpose grid map drawn from OpenDRIVE map data, where each cell is tagged with an appropriate class.
+
+| ID | Description | Class | Name | Included? |
+| ---- | ------------------------------------------------------------ | ------ | ---------------------------------- | --------- |
+| 0 | None/unknown. Grass, buildings, and other regions not described in the OpenDRIVE map. | | ✅ | |
+| 1 | Driving lane | Lane | ✅ | |
+| 2 | Shoulder | Lane | ✅ | |
+| 3 | Curb | Lane | ✅ | |
+| 4 | Sidewalk | Lane | ✅ | |
+| 5 | Median | Lane | ✅ | |
+| 6 | Parking | Lane | ✅ | |
+| 11 | Stop sign | Signal | `Sign_Stop` | |
+| 12 | Speed limit sign | Object | `Speed_30`, `Speed_60`, `Speed_90` | |
+| 13 | Traffic light | Signal | `Signal_3Light_Post01` | |
+| 21 | Crosswalk | Object | `CContinentalCrosswalk` | |
+
diff --git a/docs/planning/planning-overview.md b/docs/planning/planning-overview.md
index 008afff99..1ae9af5dd 100755
--- a/docs/planning/planning-overview.md
+++ b/docs/planning/planning-overview.md
@@ -4,23 +4,26 @@ title: Planning
---
The car should follow three instructions, in order of priority:
+
1. Don't run into anything.
2. Drive forward along a route until the goal is reached.
3. Obey traffic laws.
-The car should be *rewarded* for obeying these three instructions, and the Planning system's objective should be to maximize this reward.
+The car should be _rewarded_ for obeying these three instructions, and the Planning system's objective should be to maximize this reward.
-To help the car make appropriate decisions, we can feed it "costmaps" that represent the reward that the car will receive if it drives through a given spot on the map. Each costmap might represent a specific quality (the drivable surfaces near the car, for example), and we can simply take the *weighted sum* of each costmap to generate a hollistic overview for the car.
+To help the car make appropriate decisions, we can feed it "costmaps" that represent the reward that the car will receive if it drives through a given spot on the map. Each costmap might represent a specific quality (the drivable surfaces near the car, for example), and we can simply take the _weighted sum_ of each costmap to generate a hollistic overview for the car.
Keep in mind that "cost" and "reward" are really the same concept. The car's goal is to select a path that moves through regions of the greatest reward, a.k.a. of the least cost.
The more costmaps we sum together and the more carefully we select the weights for the sum, the better our car will be at making decisions.
# Costmaps
+
Here are the costmaps that we should calculate at minimum, along with their justification:
## Drivable area
-This describes a surface that the car is allowed to drive over, mainly lanes, parking spaces, and intersections.
+
+This describes a surface that the car is allowed to drive over, mainly lanes, parking spaces, and intersections.
We can expand this drivable area if the car's current options are exhausted. For example, the default drivable area may only include lanes that match the car's current driving direction, but this region can be expanded to include lanes with oncoming traffic if the current region is blocked.
@@ -32,6 +35,7 @@ Suggested format: 0.4m cell size, 40m range.
Above: Example where drivable region expansion may be useful. Credit: CARLA Leaderboard.
## Predicted occupancy
+
Occupancy grids are a common concept in robotics used to describe obstacles. The world is divided into cells. If a given cell contains an obstacle, then it is marked as occupied.
Using machine learning, we can generate occupancy grids not just for the present ($t=0$), but also for the future (such as $t=3s$).
@@ -40,14 +44,16 @@ For a simple costmap that compresses all temporal considerations into the presen
Justification: The car should not run into anything.
-Suggested format: 0.4m, 20m range *minimum*, 40m ideal.
+Suggested format: 0.4m, 20m range _minimum_, 40m ideal.
## Distance to route & goal
+
This is a combined costmap that describes both how far the car is from the route and from the goal.
Justification: The car should drive along the route until the goal is reached.
# Costmap specifications
-1. All costmaps should be in the `map` frame, aligned with the x/y axes of the map. This eliminates the need to perform costly transforms.
+
+1. All costmaps should be in the `base_link` frame, centered on the vehicle.
2. All costmaps should have resolutions (cell sizes) that are multiples of the same base resolution. Example: 0.4, 0.8, and 1.6 meters. This allows them to be cleanly scaled.
-3. The costmaps do not necessarily need to share an origin nor size, though their sum will only be accurate in the region where they align.
\ No newline at end of file
+3. The costmaps do not necessarily need to share an origin nor size, though their sum will only be accurate in the region where they align.
diff --git a/docs/planning/routes.md b/docs/planning/routes.md
new file mode 100644
index 000000000..c38b37336
--- /dev/null
+++ b/docs/planning/routes.md
@@ -0,0 +1,57 @@
+---
+layout: default
+title: Routes
+---
+
+# Routes
+
+_Maintained by Will Heitman_
+
+A route is a sequence of poses that our AV is encouraged to follow. At its simplest, a route constitutes the start and goal poses. However, routes can contain many poses in between.
+
+The AV's goal is to _loosely_ follow the poses contained in the route. How loosely? That depends on the priorities given to the downstream motion planner. In general, though, we consider that the AV has reached a pose along the route when it is within about 10 meters. That means that if we drive through the lane adjacent to the pose, or if we park the vehicle near the goal pose, for example, the route is still satisfied.
+
+This loose approach is in contrast to the specific path that the downstream motion planner calculates. That path, which factors in the route as well as occupancy and other perception data, serves as a precise target for the car. In other words, the car does not have to drive over the route, but it should drive over the motion planner's path.
+
+As an example, consider making a turn at an intersection. The route planner will set the route to be the precise centerline of the turn lane, but human drivers will follow a curve that bends slightly away from the center, creating a smoother ride. We want to give Navigator the flexibility to make these kinds of adjustments.
+
+## Route format
+
+Let's define some operational constraints on the route.
+
+First, the route will be formatted as a standard ROS [Path](http://docs.ros.org/en/noetic/api/nav_msgs/html/msg/Path.html) message, where each pose is stamped with a timestamp reflecting the general goal arrival time. For example, the final pose in the Path message (that is, the goal pose of the route) may have a timestamp set to fifteen minutes past the current time for a neighborhood route four miles long.
+
+Second, these goal timestamps should be taken lightly. Unlike the timestamp from the motion planner, these should serve as loose targets, just like the poses themselves.
+
+Third, the route should be updated routinely to ensure that any poses already reached are removed from the route. In other words, all poses in the latest route should be ahead of the car in terms of route progression.
+
+Fourth, the route should be divided into a **refined** and a **rough** section. In the rough section, the route poses have _no maximum spacing_. The rough section should have the goal pose as its final point, and it should always succeed the refined section.
+
+The refined section extends from the car's current position to the area immediately ahead in the route, with the section's length determined by a "lookahead distance" set as a node parameter. In the refined section, the route poses should have a spacing of between 0.5-10 meters (see the table below).
+
+As the car progresses along the route, the refined section will move with it, refining more and more of the route. When the goal pose is sufficiently close, the refined section will cover the entirety of the remaining route, and the rough section will be empty.
+
+![Route sections](assets/res/routing-sections.png)
+
+### Message
+
+```
+# Path.msg containing the route
+std_msgs/Header header
+geometry_msgs/PoseStamped[] poses
+```
+
+### Parameters
+
+| Parameter | Worst case | Best case |
+| --------------------------------------------- | ------------------------------- | ----------------------------------- |
+| Spacing between refined section as crow flies | 10m (seen along straight roads) | 0.5 meters (seen along tight turns) |
+| | | |
+| | | |
+
+## Route generation
+
+1. Receive rough route from CARLA
+2. Get closest route point to car
+3. Trim all points not within interval (closestPoint, goalPoint), where the goal point is the final point in the list
+4. While distanceFromCar < some param, insert refined points. using HD map data for lane centerlines
diff --git a/docs/system-overview.md b/docs/system-overview.md
index e52a54370..86cd9030e 100755
--- a/docs/system-overview.md
+++ b/docs/system-overview.md
@@ -27,7 +27,16 @@ Navigator is designed to be:
- **Open source**, with all of our code licensed under the highly permissable MIT license
- Our dependencies are also open-source
-## Subsystems
+### About nodes and topics
+Navigator is built upon ROS2, a communications framework where individual executables called "nodes" exchange messages throguh "topics." A node can either subscribe to a topic or publish to it. In this fashion, individual nodes form a dense network where everything from camera streams to steering commands are passed from one node to the next.
+
+Nodes can be grouped into packages. Packages are then grouped in workspaces. Navigator itself is a ROS workspace. It contains many packages, and each package contains at least one node.
+
+{: .example}
+Using ROS2, one node can gather raw LiDAR data from a sensor, where it publishes the pointcloud as a `PointCloud2` message to a topic called `/lidar/raw`. Another node can then subscribe to `/lidar/raw`, filter the data, and publish the result to `/lidar/filtered`.
+
+To learn more about ROS, watch [this lecture by Katherine Scott](https://www.youtube.com/watch?v=FTA4Ia2vLS8), a developer advocate at Open Robotics.
+
+
+
+
+
+
+## Subsystems
+We can divide Navigator's nodes into four groups.
+
+The **sensing** subsystem takes raw sensor data and publishes them as [`Image`](https://docs.ros.org/en/indigo/api/sensor_msgs/html/msg/Image.html) messages, [`PointCloud2`](https://docs.ros.org/en/indigo/api/sensor_msgs/html/msg/PointCloud2.html) messages, [`Imu`](https://docs.ros.org/en/indigo/api/sensor_msgs/html/msg/Imu.html) messages, and so on. This subsystem also include sensor filters, which subscribe to raw data and publish their filtered results.
+
+The **perception** subsystem draws inferences from the sensor data, including the location of pedestrians, our position on the map, and the predicted motion of surrounding vehicles. Nodes in this subsystem often publish their results as [**cost maps**](#cost-maps).
+
+The **planning** subsystem takes our perception results and decides what our vehicle should do. This subsystem handles both high-level decisions (Should we pass a car that's stopped in the road?) and low-level ones (How far should we press the throttle pedal to reach our desired speed?).
+
+The **interface** subsystem is the link between our software and hardware. It includes nodes that communicate with our steering hardware, our microcontroller, and more. Both the sensing and interface subsystems are **vehicle-specific**, which means that they need to be configured to suite each individual vehicle. At Nova, we have separate configurations for simulated driving and real-world use.
+
+## Cost maps
+During execution, Navigator calculates several cost maps, which are grid-based maps of our surrounding area that describe where our car should or should not drive.
+
+Each cell in the grid is assigned a cost. The higher the cost, the less likely our car will generate a path that moves through the cell. This results in paths that weave their way through only low-cost cells. If no low-cost cells are available, the car stops and waits.
+
+We calculate and use multiple cost maps, each one representing a unique factor to consider. For example:
+- Our occupancy grid generator describes the location of objects (cars, people, curbs).
+- Our prediction network (PredNet) node describes the *future* location of obstacles.
+- Our red light detector marks intersections as high-cost regions if the light is red.
+- Our map manager assigns costs based on how far a cell is from the route and from the goal.
+
+We add as many of these layers together to form a single, holisitic costmap that our motion planner uses as its input.
+
+![Cost map dimensions](assets/res/cost_map_size.jpg)
+
+Above: Cost map dimensions
+
+Cost maps should be in the `base_link` (vehicle) reference frame. They should extend 40 meters in front and to the side of the car and 20 meters behind, forming a total area of 80 x 60 meters. Cells should have a side length of either 0.2, 0.4, 0.8, or 1.6 meters.
-We also have some important code to support testing, visualization, and simulation. Simulation plays a big role in our development, and you can find an overview of it [here](/navigator/simulation/simulation-overview).
+![Examples of cost maps](assets/res/cost_maps.png)
-#### Example
-Our **sensing** system takes in a red blob from our front camera and does some white balancing to make the image more clear. The **perception** system identifies this red blob as a stop sign and generates a bounding box with the coordinates of the stop sign relative to the car. The **planning** system determines that we must set our speed to zero at the stop sign. The **controls** system notes that our car is still moving, and calculates that we must decelerate a certain amount. Finally, our **actuation** system converts this desired deceleration into a brake pedal command, which is sent out to the pedal's motor.
+In the above example, each image is 200 x 150 pixels, representing a cost map layer with a resolution of 0.4 meters/cell. Clockwise from top left: Current occupancy, junction cost (due to a stop sign), route distance, and drivable area.
## Topics
- `/lidar/fused`: Raw LiDAR fused together to create a 360-degree picture. Otherwise unfiltered.
diff --git a/leaderboard.bash b/leaderboard.bash
index d73fd5db1..72701dd73 100755
--- a/leaderboard.bash
+++ b/leaderboard.bash
@@ -1,14 +1,17 @@
#!/bin/bash
+echo "Sourcing Navigator"
+source /navigator/install/setup.bash
+
echo "Starting the CARLA evaluation script."
echo "This may take some time. Sit tight!"
# For description of flags, see:
# https://leaderboard.carla.org/get_started/#22-understanding-the-leaderboard-components
python3 ${LEADERBOARD_ROOT}/leaderboard/leaderboard_evaluator.py \
---port=2014 \
---routes=${LEADERBOARD_ROOT}/data/routes_training.xml \
---routes-subset="10" \
+--port=2005 \
+--routes=/navigator/data/routes_town02.xml \
+--routes-subset="0" \
--repetitions=1 \
--track=MAP \
--checkpoint=/navigator/log/checkpoints.json \
diff --git a/main.launch.py b/main.launch.py
new file mode 100644
index 000000000..e0fa84c37
--- /dev/null
+++ b/main.launch.py
@@ -0,0 +1,197 @@
+from os import name, path, environ
+
+from launch.launch_description_sources import PythonLaunchDescriptionSource
+from launch.actions import IncludeLaunchDescription
+from launch import LaunchDescription
+from launch.actions import DeclareLaunchArgument
+from launch.actions import ExecuteProcess
+from launch.conditions import IfCondition
+from launch.substitutions import LaunchConfiguration
+from launch_ros.actions import Node
+
+from ament_index_python import get_package_share_directory
+
+
+def generate_launch_description():
+
+ # leaderboard_liaison = Node(
+ # package='carla_interface',
+ # executable='liaison_node',
+ # parameters=[]
+ # )
+
+ lidar_processor = Node(
+ package='sensor_processing',
+ executable='lidar_processing_node'
+ )
+
+ mcl = Node(
+ package='state_estimation',
+ executable='mcl_node'
+ )
+
+ # carla_spawner = IncludeLaunchDescription(
+ # PythonLaunchDescriptionSource([get_package_share_directory(
+ # 'carla_spawn_objects'), '/carla_spawn_objects.launch.py']),
+ # launch_arguments={
+ # 'objects_definition_file': '/navigator/data/carla_objects.json'}.items(),
+ # )
+
+ # carla_controller = Node(
+ # package='carla_controller',
+ # executable='controller'
+ # )
+
+ urdf_publisher = Node(
+ package='robot_state_publisher',
+ executable='robot_state_publisher',
+ arguments=[path.join("/navigator/data", "hail_bopp.urdf")]
+ )
+
+ # carla_bridge_official = IncludeLaunchDescription(
+ # PythonLaunchDescriptionSource([get_package_share_directory(
+ # 'carla_ros_bridge'), '/carla_ros_bridge.launch.py']),
+ # launch_arguments={
+ # 'host': 'localhost',
+ # 'port': str(2000 + int(environ['ROS_DOMAIN_ID'])),
+ # 'synchronous_mode': 'True',
+ # 'town': 'Town02',
+ # 'register_all_sensors': 'False',
+ # 'ego_vehicle_role_name': 'hero',
+ # 'timeout': '30'
+ # }.items(),
+ # )
+
+ gnss_processor = Node(
+ package='state_estimation',
+ executable='gnss_processing_node'
+ )
+
+ mcl = Node(
+ package='state_estimation',
+ executable='mcl_node'
+ )
+
+ map_manager = Node(
+ package='map_management',
+ executable='map_management_node'
+ )
+
+ rviz = Node(
+ package='rviz2',
+ namespace='',
+ executable='rviz2',
+ name='rviz2',
+ arguments=['-d' + '/navigator/data/mcl.rviz']
+ )
+
+ ground_seg = Node(
+ package='occupancy_cpp',
+ executable='ground_segmentation_exe'
+ )
+
+ image_segmentation = Node(
+ package='segmentation',
+ executable='image_segmentation_node'
+ )
+
+ semantic_projection = Node(
+ package='segmentation',
+ executable='image_projection_node'
+ )
+
+ mcu_interface = Node(
+ package='mcu_interface',
+ executable='mcu_interface_node'
+ )
+
+ joy = Node(
+ package='joy_linux',
+ executable='joy_linux_node'
+ )
+
+ joy_translator = Node(
+ package='joy_translation',
+ executable='joy_translation_node'
+ )
+
+ epas = Node(
+ package='epas',
+ executable='epas_node'
+ )
+
+ linear_actuator = Node(
+ package='linear_actuator',
+ executable='linear_actuator_node'
+ )
+
+ controller = Node(
+ package="parade_controller",
+ executable="parade_controller_node"
+ )
+
+ left_lidar_driver = Node(
+ package = 'velodyne_driver',
+ executable = 'velodyne_driver_node',
+ parameters = ["/navigator/param/perception/lidar_driver_left.param.yaml"],
+ namespace='velo_left'
+ )
+
+ right_lidar_driver = Node(
+ package = 'velodyne_driver',
+ executable = 'velodyne_driver_node',
+ parameters = ["/navigator/param/perception/lidar_driver_right.param.yaml"],
+ namespace='velo_right'
+
+ )
+
+ left_lidar_pointcloud = Node(
+ package = 'velodyne_pointcloud',
+ executable = 'velodyne_convert_node',
+ parameters = ["/navigator/param/perception/lidar_pointcloud_left.param.yaml"],
+ namespace='velo_left'
+ )
+
+ right_lidar_pointcloud = Node(
+ package = 'velodyne_pointcloud',
+ executable = 'velodyne_convert_node',
+ parameters = ["/navigator/param/perception/lidar_pointcloud_right.param.yaml"],
+ namespace='velo_right'
+ )
+
+ camera = Node(
+ package = 'camera',
+ executable = 'camera_node'
+ )
+
+ gps_node = Node(
+ package = 'nmea_navsat_driver',
+ executable = 'nmea_serial_driver'
+ )
+
+
+
+ return LaunchDescription([
+ # CONTROL
+ # controller,
+
+ # INTERFACE
+ #joy,
+ #joy_translator,
+ #epas,
+ #mcu_interface,
+ #linear_actuator,
+
+ left_lidar_driver,
+ left_lidar_pointcloud,
+ right_lidar_driver,
+ right_lidar_pointcloud,
+
+ camera,
+
+ gps_node,
+
+ # MISC
+ urdf_publisher,
+ # rviz,
+ ])
diff --git a/param/atlas/map_baselink.param.yaml b/param/atlas/map_baselink.param.yaml
deleted file mode 100755
index 9428bf992..000000000
--- a/param/atlas/map_baselink.param.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# param/robot_localization.param.yaml
----
-/**:
- ros__parameters:
- frequency: 10.0 # Estimate update frequency, Hz, double
- world_frame: "map"
- two_d_mode: true
-
- odom0: "/odom0" # xyz and yaw
- odom0_config: [true, true, true, false, false, false,
- false, false, false, false, false, false,
- false, false, false]
-
- imu0: "/imu0" # Angular vel, linear acc
- imu0_config: [false, false, false, true, true, true,
- false, false, false, true, true, true,
- true, true, true]
-
- # twist0: "/twist0" # Only use x velocity (speedometer)
- # twist0_config: [false, false, false, false, false, false,
- # true, false, false, true, true, false,
- # false, false, false]
\ No newline at end of file
diff --git a/param/atlas/map_odom.param.yaml b/param/atlas/map_odom.param.yaml
new file mode 100755
index 000000000..6ef976ba2
--- /dev/null
+++ b/param/atlas/map_odom.param.yaml
@@ -0,0 +1,52 @@
+# param/robot_localization.param.yaml
+---
+/**:
+ ros__parameters:
+ frequency: 10.0 # Estimate update frequency, Hz, double
+ world_frame: "map"
+ two_d_mode: true
+
+ odom0: "/odometry/gnss_raw" # xyz and yaw
+ odom0_config:
+ [
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ ]
+
+ imu0: "/carla/hero/imu" # Angular vel, linear acc
+ imu0_config:
+ [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ ]
+
+ # twist0: "/twist0" # Only use x velocity (speedometer)
+ # twist0_config: [false, false, false, false, false, false,
+ # true, false, false, true, true, false,
+ # false, false, false]
diff --git a/param/atlas/odom_baselink.param.yaml b/param/atlas/odom_baselink.param.yaml
new file mode 100755
index 000000000..d1838b235
--- /dev/null
+++ b/param/atlas/odom_baselink.param.yaml
@@ -0,0 +1,33 @@
+# param/robot_localization.param.yaml
+---
+/**:
+ ros__parameters:
+ frequency: 10.0 # Estimate update frequency, Hz, double
+ world_frame: "odom"
+ base_link_frame: "hero"
+ two_d_mode: true
+
+ imu0: "/carla/hero/imu" # Angular vel, linear acc
+ imu0_config:
+ [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ ]
+
+ # twist0: "/twist0" # Only use x velocity (speedometer)
+ # twist0_config: [false, false, false, false, false, false,
+ # true, false, false, true, true, false,
+ # false, false, false]
diff --git a/param/mapping/lio_sam.param.yaml b/param/mapping/lio_sam.param.yaml
index 95c36f150..e31195da3 100755
--- a/param/mapping/lio_sam.param.yaml
+++ b/param/mapping/lio_sam.param.yaml
@@ -2,7 +2,7 @@
ros__parameters:
# Topics
- pointCloudTopic: "/lidar_front/points_raw" # Point cloud data
+ pointCloudTopic: "/lidar_right/points_raw" # Point cloud data
imuTopic: "/zed2i/zed_node/imu/data" # IMU data
odomTopic: "odometry/imu" # IMU pre-preintegration odometry, same frequency as IMU
gpsTopic: "/lgsvl/gnss_odom" # GPS odometry topic from navsat, see module_navsat.launch file
diff --git a/param/perception/lidar_driver_rear.param.yaml b/param/perception/lidar_driver_left.param.yaml
similarity index 92%
rename from param/perception/lidar_driver_rear.param.yaml
rename to param/perception/lidar_driver_left.param.yaml
index 795419c74..ec764dc0d 100755
--- a/param/perception/lidar_driver_rear.param.yaml
+++ b/param/perception/lidar_driver_left.param.yaml
@@ -1,4 +1,4 @@
-# param/perception/lidar_driver_front.param.yaml
+# param/perception/lidar_driver_left.param.yaml
# See: https://github.com/ros-drivers/velodyne/tree/foxy-devel/velodyne_driver
/**:
ros__parameters:
@@ -6,7 +6,7 @@
gps_time: false # Whether to use data capture time from a GPS, or from the local time. Should only be set to True if a GPS is attached to the Velodyne. False by default.
time_offset: 0.0 # An arbitrary "skew", in seconds, to add to the acquisition timestamp. Defaults to 0.0.
enabled: true # Whether the device should start-up enabled or not. Defaults to True.
- frame_id: "lidar_rear" # The frame_id to use when constructing the header for the packet to be published. Defaults to "velodyne".
+ frame_id: "lidar_left" # The frame_id to use when constructing the header for the packet to be published. Defaults to "velodyne".
model: "VLP16" # The model number of the Velodyne attached. This should be one of 64E, 64E_S2, 64E_S2.1, 64E_S3, 32E, 32C, or VLP16. Defaults to 64E.
rpm: 600.0 # The RPM that the Velodyne is configured for. Note that this is descriptive, not prescriptive, so this should be set to match the value configured through the Velodyne web interface.
cut_angle: 6.283185307179586 # The azimuth angle at which to declare a single rotation complete. If this is less than 0, then a fixed number of packets (device-dependent) is used per rotation. This mostly works, but can vary because of variations in the hardware. If a positive number <= 2Pi, a rotation will be declared "complete" when the azimuth reported by the device reaches that value. Defaults to 2Pi.
diff --git a/param/perception/lidar_driver_front.param.yaml b/param/perception/lidar_driver_right.param.yaml
similarity index 92%
rename from param/perception/lidar_driver_front.param.yaml
rename to param/perception/lidar_driver_right.param.yaml
index b79bbf013..1a2b65c0b 100755
--- a/param/perception/lidar_driver_front.param.yaml
+++ b/param/perception/lidar_driver_right.param.yaml
@@ -1,4 +1,4 @@
-# param/perception/lidar_driver_front.param.yaml
+# param/perception/lidar_driver_right.param.yaml
# See: https://github.com/ros-drivers/velodyne/tree/foxy-devel/velodyne_driver
/**:
ros__parameters:
@@ -6,7 +6,7 @@
gps_time: false # Whether to use data capture time from a GPS, or from the local time. Should only be set to True if a GPS is attached to the Velodyne. False by default.
time_offset: 0.0 # An arbitrary "skew", in seconds, to add to the acquisition timestamp. Defaults to 0.0.
enabled: true # Whether the device should start-up enabled or not. Defaults to True.
- frame_id: "lidar_front" # The frame_id to use when constructing the header for the packet to be published. Defaults to "velodyne".
+ frame_id: "lidar_right" # The frame_id to use when constructing the header for the packet to be published. Defaults to "velodyne".
model: "VLP16" # The model number of the Velodyne attached. This should be one of 64E, 64E_S2, 64E_S2.1, 64E_S3, 32E, 32C, or VLP16. Defaults to 64E.
rpm: 600.0 # The RPM that the Velodyne is configured for. Note that this is descriptive, not prescriptive, so this should be set to match the value configured through the Velodyne web interface.
cut_angle: 6.283185307179586 # The azimuth angle at which to declare a single rotation complete. If this is less than 0, then a fixed number of packets (device-dependent) is used per rotation. This mostly works, but can vary because of variations in the hardware. If a positive number <= 2Pi, a rotation will be declared "complete" when the azimuth reported by the device reaches that value. Defaults to 2Pi.
diff --git a/param/perception/lidar_front.param.yaml b/param/perception/lidar_front.param.yaml
index 42745ca73..22343728d 100755
--- a/param/perception/lidar_front.param.yaml
+++ b/param/perception/lidar_front.param.yaml
@@ -4,6 +4,6 @@
port: 2369
cloud_size: 55000
topic: "points_raw" # UdpDriverNode strictly expects to get the topic via `declare_parameter`.
- frame_id: "lidar_front"
+ frame_id: "lidar_right"
timeout_ms: 10
rpm: 600
diff --git a/param/perception/lidar_pointcloud_rear.param.yaml b/param/perception/lidar_pointcloud_left.param.yaml
similarity index 85%
rename from param/perception/lidar_pointcloud_rear.param.yaml
rename to param/perception/lidar_pointcloud_left.param.yaml
index b5bcb888e..edadec8d0 100755
--- a/param/perception/lidar_pointcloud_rear.param.yaml
+++ b/param/perception/lidar_pointcloud_left.param.yaml
@@ -2,12 +2,12 @@
# See: https://github.com/ros-drivers/velodyne/tree/foxy-devel/velodyne_driver
/**:
ros__parameters:
- calibration: "/opt/ws_vol/data/VLP16db.yaml" # The path to the calibration file for the particular device. There are a set of default calibration files to start with in the "params" subdirectory in this package. Defaults to the empty string.
+ calibration: "/navigator/data/VLP16db.yaml" # The path to the calibration file for the particular device. There are a set of default calibration files to start with in the "params" subdirectory in this package. Defaults to the empty string.
min_range: 1.0 # The minimum range in meters that a point must be to be added to the resulting point cloud. Points closer than this are discarded. Must be between 0.1 and 10.0. Defaults to 0.9.
max_range: 130.0 # The maximum range in meters that a point must be to be added to the resulting point cloud. Points further away than this are discarded. Must be between 0.1 and 200.0. Defaults to 130.0.
view_direction: 0.0 # The point around the circumference of the device, in radians, to "center" the view. Combined with view_width, this allows the node to generate a pointcloud only for the given width, centered at this point. This can vastly reduce the CPU requirements of the node. Must be between -Pi and Pi, where 0 is straight ahead from the device. Defaults to 0.0.
view_width: 6.283185307179586 # The width, in radians, of the view to generate for the resulting pointcloud. Combined with view_direction, this allows the node to generate a pointcloud only for the given width, centered at the view_direction point. This can vastly reduce the CPU requirements of the node. Must be between 0 and 2Pi. Defaults to 2Pi.
organize_cloud: True # Whether to organize the cloud by ring (True), or to use the order as it comes directly from the driver (False). Defaults to True.
target_frame: "base_link" # The coordinate frame to apply to the generated point cloud header before publishing. If the empty string (the default), the frame is passed along from the driver packet. If this frame is different than the fixed_frame, a transformation to this coordinate frame is performed while creating the pointcloud.
- fixed_frame: "lidar_rear" # The fixed coordinate frame to transform the data from.
+ fixed_frame: "lidar_left" # The fixed coordinate frame to transform the data from.
\ No newline at end of file
diff --git a/param/perception/lidar_pointcloud_front.param.yaml b/param/perception/lidar_pointcloud_right.param.yaml
similarity index 85%
rename from param/perception/lidar_pointcloud_front.param.yaml
rename to param/perception/lidar_pointcloud_right.param.yaml
index d72445a8e..c85510d50 100755
--- a/param/perception/lidar_pointcloud_front.param.yaml
+++ b/param/perception/lidar_pointcloud_right.param.yaml
@@ -2,12 +2,12 @@
# See: https://github.com/ros-drivers/velodyne/tree/foxy-devel/velodyne_driver
/**:
ros__parameters:
- calibration: "/opt/ws_vol/data/VLP16db.yaml" # The path to the calibration file for the particular device. There are a set of default calibration files to start with in the "params" subdirectory in this package. Defaults to the empty string.
+ calibration: "/navigator/data/VLP16db.yaml" # The path to the calibration file for the particular device. There are a set of default calibration files to start with in the "params" subdirectory in this package. Defaults to the empty string.
min_range: 1.0 # The minimum range in meters that a point must be to be added to the resulting point cloud. Points closer than this are discarded. Must be between 0.1 and 10.0. Defaults to 0.9.
max_range: 130.0 # The maximum range in meters that a point must be to be added to the resulting point cloud. Points further away than this are discarded. Must be between 0.1 and 200.0. Defaults to 130.0.
view_direction: 0.0 # The point around the circumference of the device, in radians, to "center" the view. Combined with view_width, this allows the node to generate a pointcloud only for the given width, centered at this point. This can vastly reduce the CPU requirements of the node. Must be between -Pi and Pi, where 0 is straight ahead from the device. Defaults to 0.0.
view_width: 6.283185307179586 # The width, in radians, of the view to generate for the resulting pointcloud. Combined with view_direction, this allows the node to generate a pointcloud only for the given width, centered at the view_direction point. This can vastly reduce the CPU requirements of the node. Must be between 0 and 2Pi. Defaults to 2Pi.
organize_cloud: True # Whether to organize the cloud by ring (True), or to use the order as it comes directly from the driver (False). Defaults to True.
target_frame: "base_link" # The coordinate frame to apply to the generated point cloud header before publishing. If the empty string (the default), the frame is passed along from the driver packet. If this frame is different than the fixed_frame, a transformation to this coordinate frame is performed while creating the pointcloud.
- fixed_frame: "lidar_front" # The fixed coordinate frame to transform the data from.
+ fixed_frame: "lidar_right" # The fixed coordinate frame to transform the data from.
\ No newline at end of file
diff --git a/param/perception/lidar_rear.param.yaml b/param/perception/lidar_rear.param.yaml
index a2d562a53..e70a83ab2 100755
--- a/param/perception/lidar_rear.param.yaml
+++ b/param/perception/lidar_rear.param.yaml
@@ -4,6 +4,6 @@
port: 2368
cloud_size: 55000
topic: "points_raw" # UdpDriverNode strictly expects to get the topic via `declare_parameter`.
- frame_id: "lidar_rear"
+ frame_id: "lidar_left"
timeout_ms: 10
rpm: 600
diff --git a/param/perception/pc_filter_transform_front.param.yaml b/param/perception/pc_filter_transform_front.param.yaml
deleted file mode 100755
index 796e70847..000000000
--- a/param/perception/pc_filter_transform_front.param.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-# config/test.param.yaml
----
-lidar_front:
- point_cloud_filter_transform_node:
- ros__parameters:
- timeout_ms: 110
- pcl_size: 55000
- input_frame_id: "lidar_front"
- output_frame_id: "base_link"
- init_timeout_ms: 5000
- expected_num_subscribers: 1
- expected_num_publishers: 1
- start_angle: 4.61 # radius
- end_angle: 2.85
- min_radius: 1.5 # meters
- max_radius: 150.0
- static_transformer:
- quaternion:
- x: 0.0
- y: 0.0
- z: -0.6631354427
- w: 0.7484994220
- translation:
- x: 1.43
- y: 3.35
- z: 0.7876
diff --git a/param/perception/pc_filter_transform_front_sim.param.yaml b/param/perception/pc_filter_transform_front_sim.param.yaml
deleted file mode 100755
index 0e28d12ff..000000000
--- a/param/perception/pc_filter_transform_front_sim.param.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-# config/test.param.yaml
----
-lidar_front:
- point_cloud_filter_transform_node:
- ros__parameters:
- timeout_ms: 110
- pcl_size: 55000
- input_frame_id: "lidar_front"
- output_frame_id: "base_link"
- init_timeout_ms: 5000
- expected_num_subscribers: 1
- expected_num_publishers: 1
- start_angle: 0.0 # radians
- end_angle: 6.28
- min_radius: 3.0 # meters
- max_radius: 50.0
- static_transformer:
- quaternion:
- x: 0.0
- y: 0.0
- z: 0.0
- w: 1.0
- translation:
- x: 1.498
- y: -0.022
- z: 1.49
diff --git a/param/perception/pc_filter_transform_rear.param.yaml b/param/perception/pc_filter_transform_rear.param.yaml
deleted file mode 100755
index f8b207628..000000000
--- a/param/perception/pc_filter_transform_rear.param.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-# config/test.param.yaml
----
-lidar_rear:
- point_cloud_filter_transform_node:
- ros__parameters:
- timeout_ms: 110
- pcl_size: 55000
- input_frame_id: "lidar_rear"
- output_frame_id: "base_link" # Use URDF transform
- init_timeout_ms: 5000
- expected_num_subscribers: 1
- expected_num_publishers: 1
- start_angle: 3.7 # radius
- end_angle: 2.0
- min_radius: 1.5 # meters
- max_radius: 150.0
- static_transformer:
- quaternion:
- x: 0.032584 #0.0
- y: 0.0081743 #0.0
- z: 0.9693964 #0.9699438633
- w: 0.2431915 #0.2433287941
- translation:
- x: 0.52
- y: -0.72
- z: 1.0
diff --git a/param/perception/pc_filter_transform_rear_sim.param.yaml b/param/perception/pc_filter_transform_rear_sim.param.yaml
deleted file mode 100755
index 4c5f37a19..000000000
--- a/param/perception/pc_filter_transform_rear_sim.param.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-# config/test.param.yaml
----
-lidar_rear:
- point_cloud_filter_transform_node:
- ros__parameters:
- timeout_ms: 110
- pcl_size: 55000
- input_frame_id: "lidar_rear"
- output_frame_id: "base_link"
- init_timeout_ms: 5000
- expected_num_subscribers: 1
- expected_num_publishers: 1
- start_angle: 0.0 # radians
- end_angle: 6.28
- min_radius: 3.0 # meters
- max_radius: 150.0
- static_transformer:
- quaternion:
- x: 0.0
- y: 0.0
- z: 0.0
- w: 1.0
- translation:
- x: 0.308
- y: -0.022
- z: 1.49
diff --git a/params.yaml b/params.yaml
index 1898bc097..eb89db718 100755
--- a/params.yaml
+++ b/params.yaml
@@ -115,7 +115,7 @@ mapping:
ros__parameters:
# lio sam
## Topics
- pointCloudTopic: "/lidar_front/velodyne_points" # Point cloud data
+ pointCloudTopic: "/lidar_right/velodyne_points" # Point cloud data
imuTopic: "/sensors/zed/imu" # IMU data
odomTopic: "odometry/imu" # IMU pre-preintegration odometry, same frequency as IMU
gpsTopic: "/sensors/gnss/odometry" # GPS odometry topic from navsat, see module_navsat.launch file
@@ -252,7 +252,7 @@ perception:
view_width: 6.283185307179586 # The width, in radians, of the view to generate for the resulting pointcloud. Combined with view_direction, this allows the node to generate a pointcloud only for the given width, centered at the view_direction point. This can vastly reduce the CPU requirements of the node. Must be between 0 and 2Pi. Defaults to 2Pi.
organize_cloud: True # Whether to organize the cloud by ring (True), or to use the order as it comes directly from the driver (False). Defaults to True.
target_frame: "base_link" # The coordinate frame to apply to the generated point cloud header before publishing. If the empty string (the default), the frame is passed along from the driver packet. If this frame is different than the fixed_frame, a transformation to this coordinate frame is performed while creating the pointcloud.
- fixed_frame: "lidar_front" # The fixed coordinate frame to transform the data from.
+ fixed_frame: "lidar_right" # The fixed coordinate frame to transform the data from.
# lidar pointcloud rear
calibration: "/home/main/navigator/data/VLP16db.yaml" # The path to the calibration file for the particular device. There are a set of default calibration files to start with in the "params" subdirectory in this package. Defaults to the empty string.
@@ -262,21 +262,21 @@ perception:
view_width: 6.283185307179586 # The width, in radians, of the view to generate for the resulting pointcloud. Combined with view_direction, this allows the node to generate a pointcloud only for the given width, centered at the view_direction point. This can vastly reduce the CPU requirements of the node. Must be between 0 and 2Pi. Defaults to 2Pi.
organize_cloud: True # Whether to organize the cloud by ring (True), or to use the order as it comes directly from the driver (False). Defaults to True.
target_frame: "base_link" # The coordinate frame to apply to the generated point cloud header before publishing. If the empty string (the default), the frame is passed along from the driver packet. If this frame is different than the fixed_frame, a transformation to this coordinate frame is performed while creating the pointcloud.
- fixed_frame: "lidar_rear" # The fixed coordinate frame to transform the data from.
+ fixed_frame: "lidar_left" # The fixed coordinate frame to transform the data from.
# lidar rear
ip: "0.0.0.0"
port: 2368
cloud_size: 55000
topic: "points_raw" # UdpDriverNode strictly expects to get the topic via `declare_parameter`.
- frame_id: "lidar_rear"
+ frame_id: "lidar_left"
timeout_ms: 10
rpm: 600
# pc filter transform front
timeout_ms: 110
pcl_size: 55000
- input_frame_id: "lidar_front"
+ input_frame_id: "lidar_right"
output_frame_id: "base_link"
init_timeout_ms: 5000
expected_num_subscribers: 1
@@ -299,7 +299,7 @@ perception:
# pc filter transform front
timeout_ms: 110
pcl_size: 55000
- input_frame_id: "lidar_front"
+ input_frame_id: "lidar_right"
output_frame_id: "base_link"
init_timeout_ms: 5000
expected_num_subscribers: 1
@@ -322,7 +322,7 @@ perception:
# pc filter transform rear
timeout_ms: 110
pcl_size: 55000
- input_frame_id: "lidar_rear"
+ input_frame_id: "lidar_left"
output_frame_id: "base_link" # Use URDF transform
init_timeout_ms: 5000
expected_num_subscribers: 1
@@ -345,7 +345,7 @@ perception:
# pc filter transform rear sim
timeout_ms: 110
pcl_size: 55000
- input_frame_id: "lidar_rear"
+ input_frame_id: "lidar_left"
output_frame_id: "base_link"
init_timeout_ms: 5000
expected_num_subscribers: 1
diff --git a/plot_pts.py b/plot_pts.py
deleted file mode 100644
index a51db5fa1..000000000
--- a/plot_pts.py
+++ /dev/null
@@ -1,31 +0,0 @@
-import matplotlib.pyplot as plt
-import numpy as np
-from tqdm import tqdm, trange
-
-shape_data = np.genfromtxt('shapes.csv', delimiter=',')
-# shape_data = shape_data[shape_data[:, 3] == 278]
-
-# print(shape_data)
-
-# plt.fill()
-
-# for i in range(183):
-# lane_pts = shape_data[shape_data[:, 0] == i]
-# if (len(lane_pts) == 0):
-# continue
-# print(lane_pts)
-# if lane_pts[0, 3] == 278:
-# plt.fill(lane_pts[:, 1], lane_pts[:, 2], c='purple')
-# else:
-# plt.fill(lane_pts[:, 1], lane_pts[:, 2], c='gray')
-
-# plt.show()
-
-data = np.genfromtxt('grid.csv', delimiter=',')
-
-plt.imshow(data)
-
-# occupied = data[data[:, 2] == 1]
-# plt.scatter(occupied[:, 0], occupied[:, 1])
-
-plt.show()
diff --git a/points.csv b/points.csv
deleted file mode 100644
index e397818bf..000000000
--- a/points.csv
+++ /dev/null
@@ -1,13014 +0,0 @@
--99.0652,-71.1218
--95.1347,-27.376
--99.1347,-27.3823
--99.0652,-71.1218
--95.0652,-71.1154
--95.1347,-27.376
--99.1347,-27.3823
--95.1419,2.4466
--99.1419,2.4457
--99.1347,-27.3823
--95.1347,-27.376
--95.1419,2.4466
--99.1419,2.4457
--95.1468,24.3332
--99.1468,24.3323
--99.1419,2.4457
--95.1419,2.4466
--95.1468,24.3332
--99.3652,-71.1222
--99.1347,-27.3823
--99.4347,-27.3828
--99.3652,-71.1222
--99.0652,-71.1218
--99.1347,-27.3823
--99.4347,-27.3828
--99.1419,2.4457
--99.4419,2.44563
--99.4347,-27.3828
--99.1347,-27.3823
--99.1419,2.4457
--99.4419,2.44563
--99.1468,24.3323
--99.4468,24.3323
--99.4419,2.44563
--99.1419,2.4457
--99.1468,24.3323
--103.365,-71.1286
--99.4347,-27.3828
--103.435,-27.3892
--103.365,-71.1286
--99.3652,-71.1222
--99.4347,-27.3828
--103.435,-27.3892
--99.4419,2.44563
--103.442,2.44472
--103.435,-27.3892
--99.4347,-27.3828
--99.4419,2.44563
--103.442,2.44472
--99.4468,24.3323
--103.447,24.3313
--103.442,2.44472
--99.4419,2.44563
--99.4468,24.3323
--103.365,-71.1286
--103.435,-27.3892
--103.435,-27.3892
--103.365,-71.1286
--103.365,-71.1286
--103.435,-27.3892
--103.435,-27.3892
--103.442,2.44472
--103.442,2.44472
--103.435,-27.3892
--103.435,-27.3892
--103.442,2.44472
--103.442,2.44472
--103.447,24.3313
--103.447,24.3313
--103.442,2.44472
--103.442,2.44472
--103.447,24.3313
--103.365,-71.1286
--103.435,-27.3892
--107.435,-27.3955
--103.365,-71.1286
--107.435,-27.3955
--107.365,-71.1349
--103.435,-27.3892
--103.442,2.44472
--107.442,2.44382
--103.435,-27.3892
--107.442,2.44382
--107.435,-27.3955
--103.442,2.44472
--103.447,24.3313
--107.447,24.3304
--103.442,2.44472
--107.447,24.3304
--107.442,2.44382
--107.365,-71.1349
--107.435,-27.3955
--107.735,-27.396
--107.365,-71.1349
--107.735,-27.396
--107.665,-71.1354
--107.435,-27.3955
--107.442,2.44382
--107.742,2.44375
--107.435,-27.3955
--107.742,2.44375
--107.735,-27.396
--107.442,2.44382
--107.447,24.3304
--107.747,24.3304
--107.442,2.44382
--107.747,24.3304
--107.742,2.44375
--107.665,-71.1354
--107.735,-27.396
--111.735,-27.4023
--107.665,-71.1354
--111.735,-27.4023
--111.665,-71.1418
--107.735,-27.396
--107.742,2.44375
--111.742,2.44285
--107.735,-27.396
--111.742,2.44285
--111.735,-27.4023
--107.742,2.44375
--107.747,24.3304
--111.747,24.3295
--107.742,2.44375
--111.747,24.3295
--111.742,2.44285
--99.1509,42.3323
--95.1551,60.9148
--99.1551,60.9139
--99.1509,42.3323
--95.1509,42.3332
--95.1551,60.9148
--99.1551,60.9139
--95.1538,62.1312
--99.1538,62.1402
--99.1551,60.9139
--95.1551,60.9148
--95.1538,62.1312
--99.1538,62.1402
--95.0552,105.993
--99.0552,106.002
--99.1538,62.1402
--95.1538,62.1312
--95.0552,105.993
--99.4509,42.3323
--99.1551,60.9139
--99.4551,60.9138
--99.4509,42.3323
--99.1509,42.3323
--99.1551,60.9139
--99.4551,60.9138
--99.1538,62.1402
--99.4538,62.1409
--99.4551,60.9138
--99.1551,60.9139
--99.1538,62.1402
--99.4538,62.1409
--99.0552,106.002
--99.3552,106.002
--99.4538,62.1409
--99.1538,62.1402
--99.0552,106.002
--103.451,42.3313
--99.4551,60.9138
--103.455,60.9129
--103.451,42.3313
--99.4509,42.3323
--99.4551,60.9138
--103.455,60.9129
--99.4538,62.1409
--103.454,62.1499
--103.455,60.9129
--99.4551,60.9138
--99.4538,62.1409
--103.454,62.1499
--99.3552,106.002
--103.355,106.011
--103.454,62.1499
--99.4538,62.1409
--99.3552,106.002
--103.451,42.3313
--103.455,60.9129
--103.455,60.9129
--103.451,42.3313
--103.451,42.3313
--103.455,60.9129
--103.455,60.9129
--103.454,62.1499
--103.454,62.1499
--103.455,60.9129
--103.455,60.9129
--103.454,62.1499
--103.454,62.1499
--103.355,106.011
--103.355,106.011
--103.454,62.1499
--103.454,62.1499
--103.355,106.011
--103.451,42.3313
--103.455,60.9129
--107.455,60.912
--103.451,42.3313
--107.455,60.912
--107.451,42.3304
--103.455,60.9129
--103.454,62.1499
--107.454,62.1589
--103.455,60.9129
--107.454,62.1589
--107.455,60.912
--103.454,62.1499
--103.355,106.011
--107.355,106.02
--103.454,62.1499
--107.355,106.02
--107.454,62.1589
--107.451,42.3304
--107.455,60.912
--107.755,60.9119
--107.451,42.3304
--107.755,60.9119
--107.751,42.3304
--107.455,60.912
--107.454,62.1589
--107.754,62.1596
--107.455,60.912
--107.754,62.1596
--107.755,60.9119
--107.454,62.1589
--107.355,106.02
--107.655,106.021
--107.454,62.1589
--107.655,106.021
--107.754,62.1596
--107.751,42.3304
--107.755,60.9119
--111.755,60.911
--107.751,42.3304
--111.755,60.911
--111.751,42.3295
--107.755,60.9119
--107.754,62.1596
--111.754,62.1686
--107.755,60.9119
--111.754,62.1686
--111.755,60.911
--107.754,62.1596
--107.655,106.021
--111.655,106.03
--107.754,62.1596
--111.655,106.03
--111.754,62.1686
-84.5274,-11.083
-44.9898,-7.05899
-44.9874,-11.059
-84.5274,-11.083
-84.5298,-7.083
-44.9898,-7.05899
-84.5272,-11.383
-44.9874,-11.059
-44.9872,-11.359
-84.5272,-11.383
-84.5274,-11.083
-44.9874,-11.059
-84.5248,-15.383
-44.9872,-11.359
-44.9848,-15.359
-84.5248,-15.383
-84.5272,-11.383
-44.9872,-11.359
-84.5248,-15.383
-44.9848,-15.359
-44.9848,-15.359
-84.5248,-15.383
-84.5248,-15.383
-44.9848,-15.359
-84.5248,-15.383
-44.9848,-15.359
-44.9824,-19.359
-84.5248,-15.383
-44.9824,-19.359
-84.5224,-19.383
-84.5224,-19.383
-44.9824,-19.359
-44.9822,-19.659
-84.5224,-19.383
-44.9822,-19.659
-84.5222,-19.683
-84.5222,-19.683
-44.9822,-19.659
-44.9798,-23.659
-84.5222,-19.683
-44.9798,-23.659
-84.5197,-23.683
--54.1401,-24.3286
--50.1402,-23.2083
--54.1402,-23.2086
--54.1401,-24.3286
--50.1401,-24.3283
--50.1402,-23.2083
--54.1402,-23.2086
--50.1403,-22.1748
--54.1403,-22.1751
--54.1402,-23.2086
--50.1402,-23.2083
--50.1403,-22.1748
--54.1403,-22.1751
--50.1057,-21.7134
--54.0608,-21.116
--54.1403,-22.1751
--50.1403,-22.1748
--50.1057,-21.7134
--54.0608,-21.116
--50.0025,-21.2624
--53.824,-20.0807
--54.0608,-21.116
--50.1057,-21.7134
--50.0025,-21.2624
--53.824,-20.0807
--49.8331,-20.8319
--53.435,-19.0923
--53.824,-20.0807
--50.0025,-21.2624
--49.8331,-20.8319
--53.435,-19.0923
--49.6012,-20.4315
--52.9028,-18.1732
--53.435,-19.0923
--49.8331,-20.8319
--49.6012,-20.4315
--52.9028,-18.1732
--49.3296,-20.0892
--52.2793,-17.3875
--52.9028,-18.1732
--49.6012,-20.4315
--49.3296,-20.0892
--52.2793,-17.3875
--49.0463,-19.8247
--51.5323,-16.6911
--52.2793,-17.3875
--49.3296,-20.0892
--49.0463,-19.8247
--51.5323,-16.6911
--48.7264,-19.6102
--50.6814,-16.1205
--51.5323,-16.6911
--49.0463,-19.8247
--48.7264,-19.6102
--50.6814,-16.1205
--48.3764,-19.4494
--49.7504,-15.6928
--50.6814,-16.1205
--48.7264,-19.6102
--48.3764,-19.4494
--49.7504,-15.6928
--48.0052,-19.3465
--48.7632,-15.4189
--49.7504,-15.6928
--48.3764,-19.4494
--48.0052,-19.3465
--48.7632,-15.4189
--47.6224,-19.3039
--47.745,-15.3058
--48.7632,-15.4189
--48.0052,-19.3465
--47.6224,-19.3039
--47.745,-15.3058
--46.2476,-19.3036
--46.2452,-15.3036
--47.745,-15.3058
--47.6224,-19.3039
--46.2476,-19.3036
--46.2452,-15.3036
--43.2776,-19.3054
--43.2752,-15.3054
--46.2452,-15.3036
--46.2476,-19.3036
--43.2776,-19.3054
--54.1401,-24.3286
--54.1402,-23.2086
--54.1402,-23.2086
--54.1401,-24.3286
--54.1401,-24.3286
--54.1402,-23.2086
--54.1402,-23.2086
--54.1403,-22.1751
--54.1403,-22.1751
--54.1402,-23.2086
--54.1402,-23.2086
--54.1403,-22.1751
--54.1403,-22.1751
--54.0608,-21.116
--54.0608,-21.116
--54.1403,-22.1751
--54.1403,-22.1751
--54.0608,-21.116
--54.0608,-21.116
--53.824,-20.0807
--53.824,-20.0807
--54.0608,-21.116
--54.0608,-21.116
--53.824,-20.0807
--53.824,-20.0807
--53.435,-19.0923
--53.435,-19.0923
--53.824,-20.0807
--53.824,-20.0807
--53.435,-19.0923
--53.435,-19.0923
--52.9028,-18.1732
--52.9028,-18.1732
--53.435,-19.0923
--53.435,-19.0923
--52.9028,-18.1732
--52.9028,-18.1732
--52.2793,-17.3875
--52.2793,-17.3875
--52.9028,-18.1732
--52.9028,-18.1732
--52.2793,-17.3875
--52.2793,-17.3875
--51.5323,-16.6911
--51.5323,-16.6911
--52.2793,-17.3875
--52.2793,-17.3875
--51.5323,-16.6911
--51.5323,-16.6911
--50.6814,-16.1205
--50.6814,-16.1205
--51.5323,-16.6911
--51.5323,-16.6911
--50.6814,-16.1205
--50.6814,-16.1205
--49.7504,-15.6928
--49.7504,-15.6928
--50.6814,-16.1205
--50.6814,-16.1205
--49.7504,-15.6928
--49.7504,-15.6928
--48.7632,-15.4189
--48.7632,-15.4189
--49.7504,-15.6928
--49.7504,-15.6928
--48.7632,-15.4189
--48.7632,-15.4189
--47.745,-15.3058
--47.745,-15.3058
--48.7632,-15.4189
--48.7632,-15.4189
--47.745,-15.3058
--47.745,-15.3058
--46.2452,-15.3036
--46.2452,-15.3036
--47.745,-15.3058
--47.745,-15.3058
--46.2452,-15.3036
--46.2452,-15.3036
--43.2752,-15.3054
--43.2752,-15.3054
--46.2452,-15.3036
--46.2452,-15.3036
--43.2752,-15.3054
-26.9874,-11.0481
--43.2701,-7.0054
--43.2726,-11.0054
-26.9874,-11.0481
-26.9898,-7.04806
--43.2701,-7.0054
-26.9872,-11.3481
--43.2726,-11.0054
--43.2728,-11.3054
-26.9872,-11.3481
-26.9874,-11.0481
--43.2726,-11.0054
-26.9848,-15.3481
--43.2728,-11.3054
--43.2752,-15.3054
-26.9848,-15.3481
-26.9872,-11.3481
--43.2728,-11.3054
-26.9848,-15.3481
--43.2752,-15.3054
--43.2752,-15.3054
-26.9848,-15.3481
-26.9848,-15.3481
--43.2752,-15.3054
-26.9848,-15.3481
--43.2752,-15.3054
--43.2776,-19.3054
-26.9848,-15.3481
--43.2776,-19.3054
-26.9824,-19.3481
-26.9824,-19.3481
--43.2776,-19.3054
--43.2778,-19.6054
-26.9824,-19.3481
--43.2778,-19.6054
-26.9822,-19.6481
-26.9822,-19.6481
--43.2778,-19.6054
--43.2802,-23.6054
-26.9822,-19.6481
--43.2802,-23.6054
-26.9798,-23.6481
--45.8401,-24.3279
--45.8259,-24.1924
--45.8259,-24.1924
--45.8401,-24.3279
--45.8401,-24.3279
--45.8259,-24.1924
--45.8259,-24.1924
--45.7837,-24.0629
--45.7837,-24.0629
--45.8259,-24.1924
--45.8259,-24.1924
--45.7837,-24.0629
--45.7837,-24.0629
--45.7154,-23.945
--45.7154,-23.945
--45.7837,-24.0629
--45.7837,-24.0629
--45.7154,-23.945
--45.7154,-23.945
--45.4765,-23.6851
--45.4765,-23.6851
--45.7154,-23.945
--45.7154,-23.945
--45.4765,-23.6851
--45.4765,-23.6851
--45.4287,-23.6471
--45.4287,-23.6471
--45.4765,-23.6851
--45.4765,-23.6851
--45.4287,-23.6471
--45.4287,-23.6471
--45.3738,-23.6204
--45.3738,-23.6204
--45.4287,-23.6471
--45.4287,-23.6471
--45.3738,-23.6204
--45.3738,-23.6204
--45.3144,-23.6063
--45.3144,-23.6063
--45.3738,-23.6204
--45.3738,-23.6204
--45.3144,-23.6063
--45.3144,-23.6063
--43.2802,-23.6054
--43.2802,-23.6054
--45.3144,-23.6063
--45.3144,-23.6063
--43.2802,-23.6054
--45.8401,-24.3279
--45.8259,-24.1924
--49.7381,-23.3589
--45.8401,-24.3279
--49.7381,-23.3589
--49.8401,-24.3282
--45.8259,-24.1924
--45.7837,-24.0629
--49.4362,-22.4322
--45.8259,-24.1924
--49.4362,-22.4322
--49.7381,-23.3589
--45.7837,-24.0629
--45.7154,-23.945
--48.9477,-21.5887
--45.7837,-24.0629
--48.9477,-21.5887
--49.4362,-22.4322
--45.7154,-23.945
--45.4765,-23.6851
--48.2974,-20.8492
--45.7154,-23.945
--48.2974,-20.8492
--48.9477,-21.5887
--45.4765,-23.6851
--45.4287,-23.6471
--47.5628,-20.2639
--45.4765,-23.6851
--47.5628,-20.2639
--48.2974,-20.8492
--45.4287,-23.6471
--45.3738,-23.6204
--46.7181,-19.853
--45.4287,-23.6471
--46.7181,-19.853
--47.5628,-20.2639
--45.3738,-23.6204
--45.3144,-23.6063
--45.8042,-19.6364
--45.3738,-23.6204
--45.8042,-19.6364
--46.7181,-19.853
--45.3144,-23.6063
--43.2802,-23.6054
--43.2778,-19.6054
--45.3144,-23.6063
--43.2778,-19.6054
--45.8042,-19.6364
--49.8401,-24.3282
--49.7381,-23.3589
--50.0315,-23.2964
--49.8401,-24.3282
--50.0315,-23.2964
--50.1401,-24.3283
--49.7381,-23.3589
--49.4362,-22.4322
--49.7101,-22.3099
--49.7381,-23.3589
--49.7101,-22.3099
--50.0315,-23.2964
--49.4362,-22.4322
--48.9477,-21.5887
--49.1902,-21.412
--49.4362,-22.4322
--49.1902,-21.412
--49.7101,-22.3099
--48.9477,-21.5887
--48.2974,-20.8492
--48.509,-20.6365
--48.9477,-21.5887
--48.509,-20.6365
--49.1902,-21.412
--48.2974,-20.8492
--47.5628,-20.2639
--47.7228,-20.0101
--48.2974,-20.8492
--47.7228,-20.0101
--48.509,-20.6365
--47.5628,-20.2639
--46.7181,-19.853
--46.819,-19.5705
--47.5628,-20.2639
--46.819,-19.5705
--47.7228,-20.0101
--46.7181,-19.853
--45.8042,-19.6364
--45.8409,-19.3386
--46.7181,-19.853
--45.8409,-19.3386
--46.819,-19.5705
--45.8042,-19.6364
--43.2778,-19.6054
--43.2776,-19.3054
--45.8042,-19.6364
--43.2776,-19.3054
--45.8409,-19.3386
--43.2752,-15.3054
--45.2728,-11.3042
--45.2752,-15.3042
--43.2752,-15.3054
--43.2728,-11.3054
--45.2728,-11.3042
--45.2752,-15.3042
--47.9083,-11.3026
--47.9108,-15.3026
--45.2752,-15.3042
--45.2728,-11.3042
--47.9083,-11.3026
--47.9108,-15.3026
--48.2484,-11.2734
--48.9275,-15.2153
--47.9108,-15.3026
--47.9083,-11.3026
--48.2484,-11.2734
--48.9275,-15.2153
--48.5786,-11.1871
--49.9149,-14.9573
--48.9275,-15.2153
--48.2484,-11.2734
--48.5786,-11.1871
--49.9149,-14.9573
--48.8895,-11.0462
--50.8443,-14.536
--49.9149,-14.9573
--48.5786,-11.1871
--48.8895,-11.0462
--50.8443,-14.536
--49.172,-10.8547
--51.6891,-13.9635
--50.8443,-14.536
--48.8895,-11.0462
--49.172,-10.8547
--51.6891,-13.9635
--49.4327,-10.6017
--52.4457,-13.2326
--51.6891,-13.9635
--49.172,-10.8547
--49.4327,-10.6017
--52.4457,-13.2326
--49.6908,-10.2572
--53.0631,-12.4083
--52.4457,-13.2326
--49.4327,-10.6017
--49.6908,-10.2572
--53.0631,-12.4083
--49.8944,-9.87792
--53.5503,-11.5009
--53.0631,-12.4083
--49.6908,-10.2572
--49.8944,-9.87792
--53.5503,-11.5009
--50.0391,-9.47251
--53.8965,-10.531
--53.5503,-11.5009
--49.8944,-9.87792
--50.0391,-9.47251
--53.8965,-10.531
--50.1216,-9.05003
--54.0939,-9.52016
--53.8965,-10.531
--50.0391,-9.47251
--50.1216,-9.05003
--54.0939,-9.52016
--50.1415,-8.49827
--54.1415,-8.49862
--54.0939,-9.52016
--50.1216,-9.05003
--50.1415,-8.49827
--54.1415,-8.49862
--50.1417,-6.32827
--54.1417,-6.32862
--54.1415,-8.49862
--50.1415,-8.49827
--50.1417,-6.32827
--54.1417,-6.32862
--50.1419,-4.01827
--54.1419,-4.01862
--54.1417,-6.32862
--50.1417,-6.32827
--50.1419,-4.01827
--43.2752,-15.3054
--45.2752,-15.3042
--45.2752,-15.3042
--43.2752,-15.3054
--43.2752,-15.3054
--45.2752,-15.3042
--45.2752,-15.3042
--47.9108,-15.3026
--47.9108,-15.3026
--45.2752,-15.3042
--45.2752,-15.3042
--47.9108,-15.3026
--47.9108,-15.3026
--48.9275,-15.2153
--48.9275,-15.2153
--47.9108,-15.3026
--47.9108,-15.3026
--48.9275,-15.2153
--48.9275,-15.2153
--49.9149,-14.9573
--49.9149,-14.9573
--48.9275,-15.2153
--48.9275,-15.2153
--49.9149,-14.9573
--49.9149,-14.9573
--50.8443,-14.536
--50.8443,-14.536
--49.9149,-14.9573
--49.9149,-14.9573
--50.8443,-14.536
--50.8443,-14.536
--51.6891,-13.9635
--51.6891,-13.9635
--50.8443,-14.536
--50.8443,-14.536
--51.6891,-13.9635
--51.6891,-13.9635
--52.4457,-13.2326
--52.4457,-13.2326
--51.6891,-13.9635
--51.6891,-13.9635
--52.4457,-13.2326
--52.4457,-13.2326
--53.0631,-12.4083
--53.0631,-12.4083
--52.4457,-13.2326
--52.4457,-13.2326
--53.0631,-12.4083
--53.0631,-12.4083
--53.5503,-11.5009
--53.5503,-11.5009
--53.0631,-12.4083
--53.0631,-12.4083
--53.5503,-11.5009
--53.5503,-11.5009
--53.8965,-10.531
--53.8965,-10.531
--53.5503,-11.5009
--53.5503,-11.5009
--53.8965,-10.531
--53.8965,-10.531
--54.0939,-9.52016
--54.0939,-9.52016
--53.8965,-10.531
--53.8965,-10.531
--54.0939,-9.52016
--54.0939,-9.52016
--54.1415,-8.49862
--54.1415,-8.49862
--54.0939,-9.52016
--54.0939,-9.52016
--54.1415,-8.49862
--54.1415,-8.49862
--54.1417,-6.32862
--54.1417,-6.32862
--54.1415,-8.49862
--54.1415,-8.49862
--54.1417,-6.32862
--54.1417,-6.32862
--54.1419,-4.01862
--54.1419,-4.01862
--54.1417,-6.32862
--54.1417,-6.32862
--54.1419,-4.01862
-83.5019,120.451
-39.669,124.422
-39.6717,120.422
-83.5019,120.451
-83.4991,124.451
-39.669,124.422
-39.6717,120.422
-10.0565,124.441
-10.0537,120.441
-39.6717,120.422
-39.669,124.422
-10.0565,124.441
-10.0537,120.441
--19.3656,124.461
--19.3683,120.461
-10.0537,120.441
-10.0565,124.441
--19.3656,124.461
--19.3683,120.461
--47.797,124.481
--47.7997,120.481
--19.3683,120.461
--19.3656,124.461
--47.797,124.481
--47.7997,120.481
--49.9777,124.477
--49.9633,120.477
--47.7997,120.481
--47.797,124.481
--49.9777,124.477
--49.9633,120.477
--93.2252,124.321
--93.2107,120.321
--49.9633,120.477
--49.9777,124.477
--93.2252,124.321
-83.5021,120.151
-39.6717,120.422
-39.6719,120.122
-83.5021,120.151
-83.5019,120.451
-39.6717,120.422
-39.6719,120.122
-10.0537,120.441
-10.0535,120.141
-39.6719,120.122
-39.6717,120.422
-10.0537,120.441
-10.0535,120.141
--19.3683,120.461
--19.3685,120.161
-10.0535,120.141
-10.0537,120.441
--19.3683,120.461
--19.3685,120.161
--47.7997,120.481
--47.7999,120.181
--19.3685,120.161
--19.3683,120.461
--47.7997,120.481
--47.7999,120.181
--49.9633,120.477
--49.9622,120.177
--47.7999,120.181
--47.7997,120.481
--49.9633,120.477
--49.9622,120.177
--93.2107,120.321
--93.2097,120.021
--49.9622,120.177
--49.9633,120.477
--93.2107,120.321
-83.5048,116.151
-39.6719,120.122
-39.6746,116.122
-83.5048,116.151
-83.5021,120.151
-39.6719,120.122
-39.6746,116.122
-10.0535,120.141
-10.0508,116.141
-39.6746,116.122
-39.6719,120.122
-10.0535,120.141
-10.0508,116.141
--19.3685,120.161
--19.3712,116.161
-10.0508,116.141
-10.0535,120.141
--19.3685,120.161
--19.3712,116.161
--47.7999,120.181
--47.8027,116.181
--19.3712,116.161
--19.3685,120.161
--47.7999,120.181
--47.8027,116.181
--49.9622,120.177
--49.9478,116.178
--47.8027,116.181
--47.7999,120.181
--49.9622,120.177
--49.9478,116.178
--93.2097,120.021
--93.1952,116.021
--49.9478,116.178
--49.9622,120.177
--93.2097,120.021
-83.5048,116.151
-39.6746,116.122
-39.6746,116.122
-83.5048,116.151
-83.5048,116.151
-39.6746,116.122
-39.6746,116.122
-10.0508,116.141
-10.0508,116.141
-39.6746,116.122
-39.6746,116.122
-10.0508,116.141
-10.0508,116.141
--19.3712,116.161
--19.3712,116.161
-10.0508,116.141
-10.0508,116.141
--19.3712,116.161
--19.3712,116.161
--47.8027,116.181
--47.8027,116.181
--19.3712,116.161
--19.3712,116.161
--47.8027,116.181
--47.8027,116.181
--49.9478,116.178
--49.9478,116.178
--47.8027,116.181
--47.8027,116.181
--49.9478,116.178
--49.9478,116.178
--93.1952,116.021
--93.1952,116.021
--49.9478,116.178
--49.9478,116.178
--93.1952,116.021
-83.5048,116.151
-39.6746,116.122
-39.6773,112.122
-83.5048,116.151
-39.6773,112.122
-83.5075,112.151
-39.6746,116.122
-10.0508,116.141
-10.0481,112.141
-39.6746,116.122
-10.0481,112.141
-39.6773,112.122
-10.0508,116.141
--19.3712,116.161
--19.3739,112.161
-10.0508,116.141
--19.3739,112.161
-10.0481,112.141
--19.3712,116.161
--47.8027,116.181
--47.8054,112.181
--19.3712,116.161
--47.8054,112.181
--19.3739,112.161
--47.8027,116.181
--49.9478,116.178
--49.9333,112.178
--47.8027,116.181
--49.9333,112.178
--47.8054,112.181
--49.9478,116.178
--93.1952,116.021
--93.1808,112.021
--49.9478,116.178
--93.1808,112.021
--49.9333,112.178
-83.5075,112.151
-39.6773,112.122
-39.6775,111.822
-83.5075,112.151
-39.6775,111.822
-83.5077,111.851
-39.6773,112.122
-10.0481,112.141
-10.0479,111.841
-39.6773,112.122
-10.0479,111.841
-39.6775,111.822
-10.0481,112.141
--19.3739,112.161
--19.3741,111.861
-10.0481,112.141
--19.3741,111.861
-10.0479,111.841
--19.3739,112.161
--47.8054,112.181
--47.8056,111.881
--19.3739,112.161
--47.8056,111.881
--19.3741,111.861
--47.8054,112.181
--49.9333,112.178
--49.9322,111.878
--47.8054,112.181
--49.9322,111.878
--47.8056,111.881
--49.9333,112.178
--93.1808,112.021
--93.1797,111.721
--49.9333,112.178
--93.1797,111.721
--49.9322,111.878
-83.5077,111.851
-39.6775,111.822
-39.6803,107.822
-83.5077,111.851
-39.6803,107.822
-83.5104,107.851
-39.6775,111.822
-10.0479,111.841
-10.0452,107.841
-39.6775,111.822
-10.0452,107.841
-39.6803,107.822
-10.0479,111.841
--19.3741,111.861
--19.3768,107.861
-10.0479,111.841
--19.3768,107.861
-10.0452,107.841
--19.3741,111.861
--47.8056,111.881
--47.8083,107.881
--19.3741,111.861
--47.8083,107.881
--19.3768,107.861
--47.8056,111.881
--49.9322,111.878
--49.9178,107.878
--47.8056,111.881
--49.9178,107.878
--47.8083,107.881
--49.9322,111.878
--93.1797,111.721
--93.1653,107.721
--49.9322,111.878
--93.1653,107.721
--49.9178,107.878
--49.8419,-4.01825
--50.1417,-6.32846
--49.8417,-6.32842
--49.8419,-4.01825
--50.1419,-4.01827
--50.1417,-6.32846
--49.8417,-6.32842
--50.0331,-7.35763
--49.7397,-7.29506
--49.8417,-6.32842
--50.1417,-6.32846
--50.0331,-7.35763
--49.7397,-7.29506
--49.7124,-8.34156
--49.4384,-8.2192
--49.7397,-7.29506
--50.0331,-7.35763
--49.7124,-8.34156
--49.4384,-8.2192
--49.1936,-9.23701
--48.9512,-9.06023
--49.4384,-8.2192
--49.7124,-8.34156
--49.1936,-9.23701
--48.9512,-9.06023
--48.5166,-10.006
--48.307,-9.79136
--48.9512,-9.06023
--49.1936,-9.23701
--48.5166,-10.006
--48.307,-9.79136
--47.728,-10.6227
--47.5702,-10.3676
--48.307,-9.79136
--48.5166,-10.006
--47.728,-10.6227
--47.5702,-10.3676
--46.8237,-11.0526
--46.7254,-10.7691
--47.5702,-10.3676
--47.728,-10.6227
--46.8237,-11.0526
--46.7254,-10.7691
--45.8474,-11.2747
--45.8134,-10.9766
--46.7254,-10.7691
--46.8237,-11.0526
--45.8474,-11.2747
--45.8134,-10.9766
--43.2728,-11.3054
--43.2726,-11.0054
--45.8134,-10.9766
--45.8474,-11.2747
--43.2728,-11.3054
--45.8419,-4.0179
--49.8417,-6.32842
--45.8417,-6.32792
--45.8419,-4.0179
--49.8419,-4.01825
--49.8417,-6.32842
--45.8417,-6.32792
--49.7397,-7.29506
--45.8277,-6.46073
--45.8417,-6.32792
--49.8417,-6.32842
--49.7397,-7.29506
--45.8277,-6.46073
--49.4384,-8.2192
--45.7863,-6.5877
--45.8277,-6.46073
--49.7397,-7.29506
--49.4384,-8.2192
--45.7863,-6.5877
--48.9512,-9.06023
--45.7193,-6.70325
--45.7863,-6.5877
--49.4384,-8.2192
--48.9512,-9.06023
--45.7193,-6.70325
--48.307,-9.79136
--45.5118,-6.93009
--45.7193,-6.70325
--48.9512,-9.06023
--48.307,-9.79136
--45.5118,-6.93009
--47.5702,-10.3676
--45.4668,-6.96528
--45.5118,-6.93009
--48.307,-9.79136
--47.5702,-10.3676
--45.4668,-6.96528
--46.7254,-10.7691
--45.4152,-6.9898
--45.4668,-6.96528
--47.5702,-10.3676
--46.7254,-10.7691
--45.4152,-6.9898
--45.8134,-10.9766
--45.3595,-7.00247
--45.4152,-6.9898
--46.7254,-10.7691
--45.8134,-10.9766
--45.3595,-7.00247
--43.2726,-11.0054
--43.2701,-7.0054
--45.3595,-7.00247
--45.8134,-10.9766
--43.2726,-11.0054
--45.8419,-4.0179
--45.8417,-6.32792
--45.8417,-6.32792
--45.8419,-4.0179
--45.8419,-4.0179
--45.8417,-6.32792
--45.8417,-6.32792
--45.8277,-6.46073
--45.8277,-6.46073
--45.8417,-6.32792
--45.8417,-6.32792
--45.8277,-6.46073
--45.8277,-6.46073
--45.7863,-6.5877
--45.7863,-6.5877
--45.8277,-6.46073
--45.8277,-6.46073
--45.7863,-6.5877
--45.7863,-6.5877
--45.7193,-6.70325
--45.7193,-6.70325
--45.7863,-6.5877
--45.7863,-6.5877
--45.7193,-6.70325
--45.7193,-6.70325
--45.5118,-6.93009
--45.5118,-6.93009
--45.7193,-6.70325
--45.7193,-6.70325
--45.5118,-6.93009
--45.5118,-6.93009
--45.4668,-6.96528
--45.4668,-6.96528
--45.5118,-6.93009
--45.5118,-6.93009
--45.4668,-6.96528
--45.4668,-6.96528
--45.4152,-6.9898
--45.4152,-6.9898
--45.4668,-6.96528
--45.4668,-6.96528
--45.4152,-6.9898
--45.4152,-6.9898
--45.3595,-7.00247
--45.3595,-7.00247
--45.4152,-6.9898
--45.4152,-6.9898
--45.3595,-7.00247
--45.3595,-7.00247
--43.2701,-7.0054
--43.2701,-7.0054
--45.3595,-7.00247
--45.3595,-7.00247
--43.2701,-7.0054
-97.9748,-71.0115
-102.005,-27.3818
-98.0046,-27.3791
-97.9748,-71.0115
-101.975,-71.0143
-102.005,-27.3818
-98.0046,-27.3791
-102.004,-24.7767
-98.0042,-24.7776
-98.0046,-27.3791
-102.005,-27.3818
-102.004,-24.7767
-97.6748,-71.0113
-98.0046,-27.3791
-97.7046,-27.3789
-97.6748,-71.0113
-97.9748,-71.0115
-98.0046,-27.3791
-97.7046,-27.3789
-98.0042,-24.7776
-97.7042,-24.7777
-97.7046,-27.3789
-98.0046,-27.3791
-98.0042,-24.7776
-93.6748,-71.0086
-97.7046,-27.3789
-93.7046,-27.3761
-93.6748,-71.0086
-97.6748,-71.0113
-97.7046,-27.3789
-93.7046,-27.3761
-97.7042,-24.7777
-93.7042,-24.7786
-93.7046,-27.3761
-97.7046,-27.3789
-97.7042,-24.7777
-93.6748,-71.0086
-93.7046,-27.3761
-93.7046,-27.3761
-93.6748,-71.0086
-93.6748,-71.0086
-93.7046,-27.3761
-93.7046,-27.3761
-93.7042,-24.7786
-93.7042,-24.7786
-93.7046,-27.3761
-93.7046,-27.3761
-93.7042,-24.7786
-93.6748,-71.0086
-93.7046,-27.3761
-89.7046,-27.3734
-93.6748,-71.0086
-89.7046,-27.3734
-89.6748,-71.0059
-93.7046,-27.3761
-93.7042,-24.7786
-89.7042,-24.7795
-93.7046,-27.3761
-89.7042,-24.7795
-89.7046,-27.3734
-89.6748,-71.0059
-89.7046,-27.3734
-89.4046,-27.3732
-89.6748,-71.0059
-89.4046,-27.3732
-89.3748,-71.0057
-89.7046,-27.3734
-89.7042,-24.7795
-89.4042,-24.7796
-89.7046,-27.3734
-89.4042,-24.7796
-89.4046,-27.3732
-89.3748,-71.0057
-89.4046,-27.3732
-85.4046,-27.3705
-89.3748,-71.0057
-85.4046,-27.3705
-85.3748,-71.0029
-89.4046,-27.3732
-89.4042,-24.7796
-85.4042,-24.7805
-89.4046,-27.3732
-85.4042,-24.7805
-85.4046,-27.3705
--43.2756,-15.3054
--44.2975,-15.2715
--44.2975,-15.2715
--43.2756,-15.3054
--43.2756,-15.3054
--44.2975,-15.2715
--44.2975,-15.2715
--45.3293,-15.1359
--45.3293,-15.1359
--44.2975,-15.2715
--44.2975,-15.2715
--45.3293,-15.1359
--45.3293,-15.1359
--46.3426,-14.898
--46.3426,-14.898
--45.3293,-15.1359
--45.3293,-15.1359
--46.3426,-14.898
--46.3426,-14.898
--47.3269,-14.5602
--47.3269,-14.5602
--46.3426,-14.898
--46.3426,-14.898
--47.3269,-14.5602
--47.3269,-14.5602
--48.2727,-14.1258
--48.2727,-14.1258
--47.3269,-14.5602
--47.3269,-14.5602
--48.2727,-14.1258
--48.2727,-14.1258
--49.1703,-13.5991
--49.1703,-13.5991
--48.2727,-14.1258
--48.2727,-14.1258
--49.1703,-13.5991
--49.1703,-13.5991
--50.0109,-12.9854
--50.0109,-12.9854
--49.1703,-13.5991
--49.1703,-13.5991
--50.0109,-12.9854
--50.0109,-12.9854
--50.7861,-12.2909
--50.7861,-12.2909
--50.0109,-12.9854
--50.0109,-12.9854
--50.7861,-12.2909
--50.7861,-12.2909
--51.5114,-11.4971
--51.5114,-11.4971
--50.7861,-12.2909
--50.7861,-12.2909
--51.5114,-11.4971
--51.5114,-11.4971
--52.131,-10.6781
--52.131,-10.6781
--51.5114,-11.4971
--51.5114,-11.4971
--52.131,-10.6781
--52.131,-10.6781
--52.6745,-9.8067
--52.6745,-9.8067
--52.131,-10.6781
--52.131,-10.6781
--52.6745,-9.8067
--52.6745,-9.8067
--53.1374,-8.88999
--53.1374,-8.88999
--52.6745,-9.8067
--52.6745,-9.8067
--53.1374,-8.88999
--53.1374,-8.88999
--53.5161,-7.93538
--53.5161,-7.93538
--53.1374,-8.88999
--53.1374,-8.88999
--53.5161,-7.93538
--53.5161,-7.93538
--53.8075,-6.95059
--53.8075,-6.95059
--53.5161,-7.93538
--53.5161,-7.93538
--53.8075,-6.95059
--53.8075,-6.95059
--54.0091,-5.94361
--54.0091,-5.94361
--53.8075,-6.95059
--53.8075,-6.95059
--54.0091,-5.94361
--54.0091,-5.94361
--54.1195,-4.92257
--54.1195,-4.92257
--54.0091,-5.94361
--54.0091,-5.94361
--54.1195,-4.92257
--54.1195,-4.92257
--54.1419,-4.01862
--54.1419,-4.01862
--54.1195,-4.92257
--54.1195,-4.92257
--54.1419,-4.01862
--43.2756,-15.3054
--44.2975,-15.2715
--44.6195,-19.2585
--43.2756,-15.3054
--44.6195,-19.2585
--43.278,-19.3054
--44.2975,-15.2715
--45.3293,-15.1359
--46.0479,-19.0709
--44.2975,-15.2715
--46.0479,-19.0709
--44.6195,-19.2585
--45.3293,-15.1359
--46.3426,-14.898
--47.4503,-18.7416
--45.3293,-15.1359
--47.4503,-18.7416
--46.0479,-19.0709
--46.3426,-14.898
--47.3269,-14.5602
--48.8129,-18.274
--46.3426,-14.898
--48.8129,-18.274
--47.4503,-18.7416
--47.3269,-14.5602
--48.2727,-14.1258
--50.122,-17.6726
--47.3269,-14.5602
--50.122,-17.6726
--48.8129,-18.274
--48.2727,-14.1258
--49.1703,-13.5991
--51.3645,-16.9436
--48.2727,-14.1258
--51.3645,-16.9436
--50.122,-17.6726
--49.1703,-13.5991
--50.0109,-12.9854
--52.528,-16.0942
--49.1703,-13.5991
--52.528,-16.0942
--51.3645,-16.9436
--50.0109,-12.9854
--50.7861,-12.2909
--53.6009,-15.1328
--50.0109,-12.9854
--53.6009,-15.1328
--52.528,-16.0942
--50.7861,-12.2909
--51.5114,-11.4971
--54.5896,-14.0514
--50.7861,-12.2909
--54.5896,-14.0514
--53.6009,-15.1328
--51.5114,-11.4971
--52.131,-10.6781
--55.4263,-12.9454
--51.5114,-11.4971
--55.4263,-12.9454
--54.5896,-14.0514
--52.131,-10.6781
--52.6745,-9.8067
--56.1602,-11.7687
--52.131,-10.6781
--56.1602,-11.7687
--55.4263,-12.9454
--52.6745,-9.8067
--53.1374,-8.88999
--56.7854,-10.5307
--52.6745,-9.8067
--56.7854,-10.5307
--56.1602,-11.7687
--53.1374,-8.88999
--53.5161,-7.93538
--57.2968,-9.24159
--53.1374,-8.88999
--57.2968,-9.24159
--56.7854,-10.5307
--53.5161,-7.93538
--53.8075,-6.95059
--57.6903,-7.91171
--53.5161,-7.93538
--57.6903,-7.91171
--57.2968,-9.24159
--53.8075,-6.95059
--54.0091,-5.94361
--57.9626,-6.55186
--53.8075,-6.95059
--57.9626,-6.55186
--57.6903,-7.91171
--54.0091,-5.94361
--54.1195,-4.92257
--58.1116,-5.17303
--54.0091,-5.94361
--58.1116,-5.17303
--57.9626,-6.55186
--54.1195,-4.92257
--54.1419,-4.01862
--58.1419,-4.01897
--54.1195,-4.92257
--58.1419,-4.01897
--58.1116,-5.17303
-27.8237,-6.6002
-27.8223,-6.61158
-27.8223,-6.61158
-27.8237,-6.6002
-27.8237,-6.6002
-27.8223,-6.61158
-27.8223,-6.61158
-27.8184,-6.62236
-27.8184,-6.62236
-27.8223,-6.61158
-27.8223,-6.61158
-27.8184,-6.62236
-27.8184,-6.62236
-27.8122,-6.63197
-27.8122,-6.63197
-27.8184,-6.62236
-27.8184,-6.62236
-27.8122,-6.63197
-27.8122,-6.63197
-27.5935,-6.82451
-27.5935,-6.82451
-27.8122,-6.63197
-27.8122,-6.63197
-27.5935,-6.82451
-27.5935,-6.82451
-27.4421,-6.93034
-27.4421,-6.93034
-27.5935,-6.82451
-27.5935,-6.82451
-27.4421,-6.93034
-27.4421,-6.93034
-27.2726,-7.00398
-27.2726,-7.00398
-27.4421,-6.93034
-27.4421,-6.93034
-27.2726,-7.00398
-27.2726,-7.00398
-27.0919,-7.04248
-27.0919,-7.04248
-27.2726,-7.00398
-27.2726,-7.00398
-27.0919,-7.04248
-27.0919,-7.04248
-26.9899,-7.04806
-26.9899,-7.04806
-27.0919,-7.04248
-27.0919,-7.04248
-26.9899,-7.04806
-27.8237,-6.6002
-27.8223,-6.61158
-31.7161,-7.52744
-27.8237,-6.6002
-31.7161,-7.52744
-31.8237,-6.60425
-27.8223,-6.61158
-27.8184,-6.62236
-31.4009,-8.40179
-27.8223,-6.61158
-31.4009,-8.40179
-31.7161,-7.52744
-27.8184,-6.62236
-27.8122,-6.63197
-30.8946,-9.18125
-27.8184,-6.62236
-30.8946,-9.18125
-31.4009,-8.40179
-27.8122,-6.63197
-27.5935,-6.82451
-30.2006,-9.8582
-27.8122,-6.63197
-30.2006,-9.8582
-30.8946,-9.18125
-27.5935,-6.82451
-27.4421,-6.93034
-29.3945,-10.4215
-27.5935,-6.82451
-29.3945,-10.4215
-30.2006,-9.8582
-27.4421,-6.93034
-27.2726,-7.00398
-28.4925,-10.8134
-27.4421,-6.93034
-28.4925,-10.8134
-29.3945,-10.4215
-27.2726,-7.00398
-27.0919,-7.04248
-27.5306,-11.0183
-27.2726,-7.00398
-27.5306,-11.0183
-28.4925,-10.8134
-27.0919,-7.04248
-26.9899,-7.04806
-26.9876,-11.0481
-27.0919,-7.04248
-26.9876,-11.0481
-27.5306,-11.0183
-31.8237,-6.60425
-31.7161,-7.52744
-32.0081,-7.59613
-31.8237,-6.60425
-32.0081,-7.59613
-32.1237,-6.60456
-31.7161,-7.52744
-31.4009,-8.40179
-31.6695,-8.53524
-31.7161,-7.52744
-31.6695,-8.53524
-32.0081,-7.59613
-31.4009,-8.40179
-30.8946,-9.18125
-31.1258,-9.37244
-31.4009,-8.40179
-31.1258,-9.37244
-31.6695,-8.53524
-30.8946,-9.18125
-30.2006,-9.8582
-30.3961,-10.0857
-30.8946,-9.18125
-30.3961,-10.0857
-31.1258,-9.37244
-30.2006,-9.8582
-29.3945,-10.4215
-29.5409,-10.6833
-30.2006,-9.8582
-29.5409,-10.6833
-30.3961,-10.0857
-29.3945,-10.4215
-28.4925,-10.8134
-28.584,-11.0991
-29.3945,-10.4215
-28.584,-11.0991
-29.5409,-10.6833
-28.4925,-10.8134
-27.5306,-11.0183
-27.5635,-11.3165
-28.4925,-10.8134
-27.5635,-11.3165
-28.584,-11.0991
-27.5306,-11.0183
-26.9876,-11.0481
-26.9874,-11.3481
-27.5306,-11.0183
-26.9874,-11.3481
-27.5635,-11.3165
-36.1237,-6.60861
-36.1221,-8.09861
-36.1221,-8.09861
-36.1237,-6.60861
-36.1237,-6.60861
-36.1221,-8.09861
-36.1221,-8.09861
-36.1199,-9.12244
-36.1199,-9.12244
-36.1221,-8.09861
-36.1221,-8.09861
-36.1199,-9.12244
-36.1199,-9.12244
-36.011,-10.146
-36.011,-10.146
-36.1199,-9.12244
-36.1199,-9.12244
-36.011,-10.146
-36.011,-10.146
-35.7304,-11.1364
-35.7304,-11.1364
-36.011,-10.146
-36.011,-10.146
-35.7304,-11.1364
-35.7304,-11.1364
-35.2864,-12.0651
-35.2864,-12.0651
-35.7304,-11.1364
-35.7304,-11.1364
-35.2864,-12.0651
-35.2864,-12.0651
-34.6917,-12.9053
-34.6917,-12.9053
-35.2864,-12.0651
-35.2864,-12.0651
-34.6917,-12.9053
-34.6917,-12.9053
-33.9576,-13.6378
-33.9576,-13.6378
-34.6917,-12.9053
-34.6917,-12.9053
-33.9576,-13.6378
-33.9576,-13.6378
-33.1417,-14.2357
-33.1417,-14.2357
-33.9576,-13.6378
-33.9576,-13.6378
-33.1417,-14.2357
-33.1417,-14.2357
-32.2503,-14.7139
-32.2503,-14.7139
-33.1417,-14.2357
-33.1417,-14.2357
-32.2503,-14.7139
-32.2503,-14.7139
-31.3008,-15.0631
-31.3008,-15.0631
-32.2503,-14.7139
-32.2503,-14.7139
-31.3008,-15.0631
-31.3008,-15.0631
-30.312,-15.2763
-30.312,-15.2763
-31.3008,-15.0631
-31.3008,-15.0631
-30.312,-15.2763
-30.312,-15.2763
-29.303,-15.3494
-29.303,-15.3494
-30.312,-15.2763
-30.312,-15.2763
-29.303,-15.3494
-29.303,-15.3494
-28.1148,-15.3487
-28.1148,-15.3487
-29.303,-15.3494
-29.303,-15.3494
-28.1148,-15.3487
-28.1148,-15.3487
-26.9848,-15.3481
-26.9848,-15.3481
-28.1148,-15.3487
-28.1148,-15.3487
-26.9848,-15.3481
-36.1237,-6.60861
-36.1221,-8.09861
-40.1221,-8.10266
-36.1237,-6.60861
-40.1221,-8.10266
-40.1237,-6.61266
-36.1221,-8.09861
-36.1199,-9.12244
-40.119,-9.20649
-36.1221,-8.09861
-40.119,-9.20649
-40.1221,-8.10266
-36.1199,-9.12244
-36.011,-10.146
-39.9382,-10.9054
-36.1199,-9.12244
-39.9382,-10.9054
-40.119,-9.20649
-36.011,-10.146
-35.7304,-11.1364
-39.4726,-12.5493
-36.011,-10.146
-39.4726,-12.5493
-39.9382,-10.9054
-35.7304,-11.1364
-35.2864,-12.0651
-38.7356,-14.0907
-35.7304,-11.1364
-38.7356,-14.0907
-39.4726,-12.5493
-35.2864,-12.0651
-34.6917,-12.9053
-37.7484,-15.4852
-35.2864,-12.0651
-37.7484,-15.4852
-38.7356,-14.0907
-34.6917,-12.9053
-33.9576,-13.6378
-36.5418,-16.6911
-34.6917,-12.9053
-36.5418,-16.6911
-37.7484,-15.4852
-33.9576,-13.6378
-33.1417,-14.2357
-35.2745,-17.6197
-33.9576,-13.6378
-35.2745,-17.6197
-36.5418,-16.6911
-33.1417,-14.2357
-32.2503,-14.7139
-33.89,-18.3624
-33.1417,-14.2357
-33.89,-18.3624
-35.2745,-17.6197
-32.2503,-14.7139
-31.3008,-15.0631
-32.4154,-18.9046
-32.2503,-14.7139
-32.4154,-18.9046
-33.89,-18.3624
-31.3008,-15.0631
-30.312,-15.2763
-30.8795,-19.2358
-31.3008,-15.0631
-30.8795,-19.2358
-32.4154,-18.9046
-30.312,-15.2763
-29.303,-15.3494
-29.3125,-19.3494
-30.312,-15.2763
-29.3125,-19.3494
-30.8795,-19.2358
-29.303,-15.3494
-28.1148,-15.3487
-28.1124,-19.3487
-29.303,-15.3494
-28.1124,-19.3487
-29.3125,-19.3494
-28.1148,-15.3487
-26.9848,-15.3481
-26.9824,-19.3481
-28.1148,-15.3487
-26.9824,-19.3481
-28.1124,-19.3487
-98.0002,-6.77764
-101.998,2.24575
-97.9981,2.24484
-98.0002,-6.77764
-102,-6.77673
-101.998,2.24575
-97.9981,2.24484
-101.993,24.4833
-97.9931,24.4824
-97.9981,2.24484
-101.998,2.24575
-101.993,24.4833
-97.7002,-6.77771
-97.9981,2.24484
-97.6981,2.24478
-97.7002,-6.77771
-98.0002,-6.77764
-97.9981,2.24484
-97.6981,2.24478
-97.9931,24.4824
-97.6931,24.4823
-97.6981,2.24478
-97.9981,2.24484
-97.9931,24.4824
-93.7002,-6.77861
-97.6981,2.24478
-93.6981,2.24387
-93.7002,-6.77861
-97.7002,-6.77771
-97.6981,2.24478
-93.6981,2.24387
-97.6931,24.4823
-93.6931,24.4814
-93.6981,2.24387
-97.6981,2.24478
-97.6931,24.4823
-93.7002,-6.77861
-93.6981,2.24387
-93.6981,2.24387
-93.7002,-6.77861
-93.7002,-6.77861
-93.6981,2.24387
-93.6981,2.24387
-93.6931,24.4814
-93.6931,24.4814
-93.6981,2.24387
-93.6981,2.24387
-93.6931,24.4814
-93.7002,-6.77861
-93.6981,2.24387
-89.6981,2.24297
-93.7002,-6.77861
-89.6981,2.24297
-89.7002,-6.77951
-93.6981,2.24387
-93.6931,24.4814
-89.6931,24.4805
-93.6981,2.24387
-89.6931,24.4805
-89.6981,2.24297
-89.7002,-6.77951
-89.6981,2.24297
-89.3981,2.2429
-89.7002,-6.77951
-89.3981,2.2429
-89.4002,-6.77958
-89.6981,2.24297
-89.6931,24.4805
-89.3931,24.4804
-89.6981,2.24297
-89.3931,24.4804
-89.3981,2.2429
-89.4002,-6.77958
-89.3981,2.2429
-85.3981,2.242
-89.4002,-6.77958
-85.3981,2.242
-85.4002,-6.78049
-89.3981,2.2429
-89.3931,24.4804
-85.3931,24.4795
-89.3981,2.2429
-85.3931,24.4795
-85.3981,2.242
-26.9848,-15.3481
-29.5932,-15.3496
-29.5932,-15.3496
-26.9848,-15.3481
-26.9848,-15.3481
-29.5932,-15.3496
-29.5932,-15.3496
-30.6407,-15.2663
-30.6407,-15.2663
-29.5932,-15.3496
-29.5932,-15.3496
-30.6407,-15.2663
-30.6407,-15.2663
-31.6616,-15.0171
-31.6616,-15.0171
-30.6407,-15.2663
-30.6407,-15.2663
-31.6616,-15.0171
-31.6616,-15.0171
-32.6297,-14.6085
-32.6297,-14.6085
-31.6616,-15.0171
-31.6616,-15.0171
-32.6297,-14.6085
-32.6297,-14.6085
-33.5204,-14.0509
-33.5204,-14.0509
-32.6297,-14.6085
-32.6297,-14.6085
-33.5204,-14.0509
-33.5204,-14.0509
-34.2901,-13.3796
-34.2901,-13.3796
-33.5204,-14.0509
-33.5204,-14.0509
-34.2901,-13.3796
-34.2901,-13.3796
-34.9461,-12.5934
-34.9461,-12.5934
-34.2901,-13.3796
-34.2901,-13.3796
-34.9461,-12.5934
-34.9461,-12.5934
-35.4685,-11.7128
-35.4685,-11.7128
-34.9461,-12.5934
-34.9461,-12.5934
-35.4685,-11.7128
-35.4685,-11.7128
-35.8439,-10.7602
-35.8439,-10.7602
-35.4685,-11.7128
-35.4685,-11.7128
-35.8439,-10.7602
-35.8439,-10.7602
-36.0627,-9.75997
-36.0627,-9.75997
-35.8439,-10.7602
-35.8439,-10.7602
-36.0627,-9.75997
-36.0627,-9.75997
-36.1221,-8.09861
-36.1221,-8.09861
-36.0627,-9.75997
-36.0627,-9.75997
-36.1221,-8.09861
-36.1221,-8.09861
-36.1236,-6.61861
-36.1236,-6.61861
-36.1221,-8.09861
-36.1221,-8.09861
-36.1236,-6.61861
-36.1236,-6.61861
-36.1237,-6.60861
-36.1237,-6.60861
-36.1236,-6.61861
-36.1236,-6.61861
-36.1237,-6.60861
-26.9848,-15.3481
-29.5932,-15.3496
-29.5956,-11.3496
-26.9848,-15.3481
-29.5956,-11.3496
-26.9872,-11.3481
-29.5932,-15.3496
-30.6407,-15.2663
-30.0058,-11.317
-29.5932,-15.3496
-30.0058,-11.317
-29.5956,-11.3496
-30.6407,-15.2663
-31.6616,-15.0171
-30.4056,-11.2194
-30.6407,-15.2663
-30.4056,-11.2194
-30.0058,-11.317
-31.6616,-15.0171
-32.6297,-14.6085
-30.7847,-11.0594
-31.6616,-15.0171
-30.7847,-11.0594
-30.4056,-11.2194
-32.6297,-14.6085
-33.5204,-14.0509
-31.1335,-10.841
-32.6297,-14.6085
-31.1335,-10.841
-30.7847,-11.0594
-33.5204,-14.0509
-34.2901,-13.3796
-31.4335,-10.5796
-33.5204,-14.0509
-31.4335,-10.5796
-31.1335,-10.841
-34.2901,-13.3796
-34.9461,-12.5934
-31.6799,-10.2843
-34.2901,-13.3796
-31.6799,-10.2843
-31.4335,-10.5796
-34.9461,-12.5934
-35.4685,-11.7128
-31.8761,-9.95355
-34.9461,-12.5934
-31.8761,-9.95355
-31.6799,-10.2843
-35.4685,-11.7128
-35.8439,-10.7602
-32.0171,-9.59575
-35.4685,-11.7128
-32.0171,-9.59575
-31.8761,-9.95355
-35.8439,-10.7602
-36.0627,-9.75997
-32.0993,-9.22006
-35.8439,-10.7602
-32.0993,-9.22006
-32.0171,-9.59575
-36.0627,-9.75997
-36.1221,-8.09861
-32.1221,-8.09455
-36.0627,-9.75997
-32.1221,-8.09455
-32.0993,-9.22006
-36.1221,-8.09861
-36.1236,-6.61861
-32.1236,-6.61456
-36.1221,-8.09861
-32.1236,-6.61456
-32.1221,-8.09455
-36.1236,-6.61861
-36.1237,-6.60861
-32.1237,-6.60456
-36.1236,-6.61861
-32.1237,-6.60456
-32.1236,-6.61456
-40.4237,-6.61297
-40.2333,-7.62488
-40.5262,-7.55969
-40.4237,-6.61297
-40.1237,-6.61266
-40.2333,-7.62488
-40.5262,-7.55969
-40.559,-8.57882
-40.8306,-8.4513
-40.5262,-7.55969
-40.2333,-7.62488
-40.559,-8.57882
-40.8306,-8.4513
-41.0851,-9.43868
-41.3223,-9.25498
-40.8306,-8.4513
-40.559,-8.57882
-41.0851,-9.43868
-41.3223,-9.25498
-41.7801,-10.1646
-41.9762,-9.93758
-41.3223,-9.25498
-41.0851,-9.43868
-41.7801,-10.1646
-41.9762,-9.93758
-42.6254,-10.7521
-42.7699,-10.4892
-41.9762,-9.93758
-41.7801,-10.1646
-42.6254,-10.7521
-42.7699,-10.4892
-43.5746,-11.1506
-43.6611,-10.8633
-42.7699,-10.4892
-42.6254,-10.7521
-43.5746,-11.1506
-43.6611,-10.8633
-44.5861,-11.3423
-44.6107,-11.0434
-43.6611,-10.8633
-43.5746,-11.1506
-44.5861,-11.3423
-44.6107,-11.0434
-44.9872,-11.359
-44.9874,-11.059
-44.6107,-11.0434
-44.5861,-11.3423
-44.9872,-11.359
-44.4237,-6.61702
-40.5262,-7.55969
-44.4306,-6.69057
-44.4237,-6.61702
-40.4237,-6.61297
-40.5262,-7.55969
-44.4306,-6.69057
-40.8306,-8.4513
-44.4513,-6.75106
-44.4306,-6.69057
-40.5262,-7.55969
-40.8306,-8.4513
-44.4513,-6.75106
-41.3223,-9.25498
-44.4846,-6.80559
-44.4513,-6.75106
-40.8306,-8.4513
-41.3223,-9.25498
-44.4846,-6.80559
-41.9762,-9.93758
-44.5907,-6.91036
-44.4846,-6.80559
-41.3223,-9.25498
-41.9762,-9.93758
-44.5907,-6.91036
-42.7699,-10.4892
-44.6959,-6.98347
-44.5907,-6.91036
-41.9762,-9.93758
-42.7699,-10.4892
-44.6959,-6.98347
-43.6611,-10.8633
-44.814,-7.03305
-44.6959,-6.98347
-42.7699,-10.4892
-43.6611,-10.8633
-44.814,-7.03305
-44.6107,-11.0434
-44.9399,-7.05692
-44.814,-7.03305
-43.6611,-10.8633
-44.6107,-11.0434
-44.9399,-7.05692
-44.9874,-11.059
-44.9898,-7.05899
-44.9399,-7.05692
-44.6107,-11.0434
-44.9874,-11.059
-44.4237,-6.61702
-44.4306,-6.69057
-44.4306,-6.69057
-44.4237,-6.61702
-44.4237,-6.61702
-44.4306,-6.69057
-44.4306,-6.69057
-44.4513,-6.75106
-44.4513,-6.75106
-44.4306,-6.69057
-44.4306,-6.69057
-44.4513,-6.75106
-44.4513,-6.75106
-44.4846,-6.80559
-44.4846,-6.80559
-44.4513,-6.75106
-44.4513,-6.75106
-44.4846,-6.80559
-44.4846,-6.80559
-44.5907,-6.91036
-44.5907,-6.91036
-44.4846,-6.80559
-44.4846,-6.80559
-44.5907,-6.91036
-44.5907,-6.91036
-44.6959,-6.98347
-44.6959,-6.98347
-44.5907,-6.91036
-44.5907,-6.91036
-44.6959,-6.98347
-44.6959,-6.98347
-44.814,-7.03305
-44.814,-7.03305
-44.6959,-6.98347
-44.6959,-6.98347
-44.814,-7.03305
-44.814,-7.03305
-44.9399,-7.05692
-44.9399,-7.05692
-44.814,-7.03305
-44.814,-7.03305
-44.9399,-7.05692
-44.9399,-7.05692
-44.9898,-7.05899
-44.9898,-7.05899
-44.9399,-7.05692
-44.9399,-7.05692
-44.9898,-7.05899
-44.9848,-15.359
-43.8248,-15.3583
-43.8248,-15.3583
-44.9848,-15.359
-44.9848,-15.359
-43.8248,-15.3583
-43.8248,-15.3583
-42.1072,-15.3572
-42.1072,-15.3572
-43.8248,-15.3583
-43.8248,-15.3583
-42.1072,-15.3572
-42.1072,-15.3572
-41.1052,-15.2713
-41.1052,-15.2713
-42.1072,-15.3572
-42.1072,-15.3572
-41.1052,-15.2713
-41.1052,-15.2713
-40.1321,-15.017
-40.1321,-15.017
-41.1052,-15.2713
-41.1052,-15.2713
-40.1321,-15.017
-40.1321,-15.017
-39.2162,-14.6017
-39.2162,-14.6017
-40.1321,-15.017
-40.1321,-15.017
-39.2162,-14.6017
-39.2162,-14.6017
-38.3836,-14.0375
-38.3836,-14.0375
-39.2162,-14.6017
-39.2162,-14.6017
-38.3836,-14.0375
-38.3836,-14.0375
-37.6527,-13.3344
-37.6527,-13.3344
-38.3836,-14.0375
-38.3836,-14.0375
-37.6527,-13.3344
-37.6527,-13.3344
-37.0317,-12.4929
-37.0317,-12.4929
-37.6527,-13.3344
-37.6527,-13.3344
-37.0317,-12.4929
-37.0317,-12.4929
-36.5621,-11.5585
-36.5621,-11.5585
-37.0317,-12.4929
-37.0317,-12.4929
-36.5621,-11.5585
-36.5621,-11.5585
-36.2572,-10.5581
-36.2572,-10.5581
-36.5621,-11.5585
-36.5621,-11.5585
-36.2572,-10.5581
-36.2572,-10.5581
-36.1261,-9.52052
-36.1261,-9.52052
-36.2572,-10.5581
-36.2572,-10.5581
-36.1261,-9.52052
-36.1261,-9.52052
-36.1219,-8.36861
-36.1219,-8.36861
-36.1261,-9.52052
-36.1261,-9.52052
-36.1219,-8.36861
-36.1219,-8.36861
-36.1236,-6.61861
-36.1236,-6.61861
-36.1219,-8.36861
-36.1219,-8.36861
-36.1236,-6.61861
-36.1236,-6.61861
-36.1237,-6.60861
-36.1237,-6.60861
-36.1236,-6.61861
-36.1236,-6.61861
-36.1237,-6.60861
-44.9848,-15.359
-43.8248,-15.3583
-43.8224,-19.3583
-44.9848,-15.359
-43.8224,-19.3583
-44.9824,-19.359
-43.8248,-15.3583
-42.1072,-15.3572
-42.1048,-19.3572
-43.8248,-15.3583
-42.1048,-19.3572
-43.8224,-19.3583
-42.1072,-15.3572
-41.1052,-15.2713
-40.426,-19.2132
-42.1072,-15.3572
-40.426,-19.2132
-42.1048,-19.3572
-41.1052,-15.2713
-40.1321,-15.017
-38.7959,-18.7872
-41.1052,-15.2713
-38.7959,-18.7872
-40.426,-19.2132
-40.1321,-15.017
-39.2162,-14.6017
-37.2613,-18.0915
-40.1321,-15.017
-37.2613,-18.0915
-38.7959,-18.7872
-39.2162,-14.6017
-38.3836,-14.0375
-35.8666,-17.1463
-39.2162,-14.6017
-35.8666,-17.1463
-37.2613,-18.0915
-38.3836,-14.0375
-37.6527,-13.3344
-34.6475,-15.9743
-38.3836,-14.0375
-34.6475,-15.9743
-35.8666,-17.1463
-37.6527,-13.3344
-37.0317,-12.4929
-33.6232,-14.5863
-37.6527,-13.3344
-33.6232,-14.5863
-34.6475,-15.9743
-37.0317,-12.4929
-36.5621,-11.5585
-32.8485,-13.045
-37.0317,-12.4929
-32.8485,-13.045
-33.6232,-14.5863
-36.5621,-11.5585
-36.2572,-10.5581
-32.3458,-11.3949
-36.5621,-11.5585
-32.3458,-11.3949
-32.8485,-13.045
-36.2572,-10.5581
-36.1261,-9.52052
-32.1294,-9.68349
-36.2572,-10.5581
-32.1294,-9.68349
-32.3458,-11.3949
-36.1261,-9.52052
-36.1219,-8.36861
-32.1219,-8.36455
-36.1261,-9.52052
-32.1219,-8.36455
-32.1294,-9.68349
-36.1219,-8.36861
-36.1236,-6.61861
-32.1236,-6.61456
-36.1219,-8.36861
-32.1236,-6.61456
-32.1219,-8.36455
-36.1236,-6.61861
-36.1237,-6.60861
-32.1237,-6.60456
-36.1236,-6.61861
-32.1237,-6.60456
-32.1236,-6.61456
-97.989,42.4824
-101.985,60.9372
-97.9849,60.9363
-97.989,42.4824
-101.989,42.4833
-101.985,60.9372
-97.9849,60.9363
-102.045,105.49
-98.0448,105.496
-97.9849,60.9363
-101.985,60.9372
-102.045,105.49
-97.689,42.4823
-97.9849,60.9363
-97.6849,60.9362
-97.689,42.4823
-97.989,42.4824
-97.9849,60.9363
-97.6849,60.9362
-98.0448,105.496
-97.7448,105.496
-97.6849,60.9362
-97.9849,60.9363
-98.0448,105.496
-93.689,42.4814
-97.6849,60.9362
-93.6849,60.9353
-93.689,42.4814
-97.689,42.4823
-97.6849,60.9362
-93.6849,60.9353
-97.7448,105.496
-93.7448,105.501
-93.6849,60.9353
-97.6849,60.9362
-97.7448,105.496
-93.689,42.4814
-93.6849,60.9353
-93.6849,60.9353
-93.689,42.4814
-93.689,42.4814
-93.6849,60.9353
-93.6849,60.9353
-93.7448,105.501
-93.7448,105.501
-93.6849,60.9353
-93.6849,60.9353
-93.7448,105.501
-93.689,42.4814
-93.6849,60.9353
-89.6849,60.9344
-93.689,42.4814
-89.6849,60.9344
-89.689,42.4805
-93.6849,60.9353
-93.7448,105.501
-89.7448,105.507
-93.6849,60.9353
-89.7448,105.507
-89.6849,60.9344
-89.689,42.4805
-89.6849,60.9344
-89.3849,60.9343
-89.689,42.4805
-89.3849,60.9343
-89.389,42.4804
-89.6849,60.9344
-89.7448,105.507
-89.4448,105.507
-89.6849,60.9344
-89.4448,105.507
-89.3849,60.9343
-89.389,42.4804
-89.3849,60.9343
-85.3849,60.9334
-89.389,42.4804
-85.3849,60.9334
-85.389,42.4795
-89.3849,60.9343
-89.4448,105.507
-85.4448,105.513
-89.3849,60.9343
-85.4448,105.513
-85.3849,60.9334
-44.9848,-15.359
-43.8272,-11.3583
-43.8248,-15.3583
-44.9848,-15.359
-44.9872,-11.359
-43.8272,-11.3583
-43.8248,-15.3583
-42.7306,-11.3576
-42.7282,-15.3576
-43.8248,-15.3583
-43.8272,-11.3583
-42.7306,-11.3576
-42.7282,-15.3576
-42.3122,-11.3238
-41.6725,-15.2723
-42.7282,-15.3576
-42.7306,-11.3576
-42.3122,-11.3238
-41.6725,-15.2723
-41.9044,-11.2238
-40.6439,-15.02
-41.6725,-15.2723
-42.3122,-11.3238
-41.9044,-11.2238
-40.6439,-15.02
-41.5179,-11.0601
-39.6686,-14.6069
-40.6439,-15.02
-41.9044,-11.2238
-41.5179,-11.0601
-39.6686,-14.6069
-41.1623,-10.8368
-38.7716,-14.0438
-39.6686,-14.6069
-41.5179,-11.0601
-41.1623,-10.8368
-38.7716,-14.0438
-40.8606,-10.5739
-38.0099,-13.3799
-38.7716,-14.0438
-41.1623,-10.8368
-40.8606,-10.5739
-38.0099,-13.3799
-40.5965,-10.2588
-37.3352,-12.5747
-38.0099,-13.3799
-40.8606,-10.5739
-40.5965,-10.2588
-37.3352,-12.5747
-40.386,-9.90558
-36.7974,-11.6724
-37.3352,-12.5747
-40.5965,-10.2588
-40.386,-9.90558
-36.7974,-11.6724
-40.2345,-9.52336
-36.4102,-10.6958
-36.7974,-11.6724
-40.386,-9.90558
-40.2345,-9.52336
-36.4102,-10.6958
-40.1457,-9.12188
-36.1835,-9.67011
-36.4102,-10.6958
-40.2345,-9.52336
-40.1457,-9.12188
-36.1835,-9.67011
-40.122,-8.25266
-36.122,-8.24861
-36.1835,-9.67011
-40.1457,-9.12188
-40.122,-8.25266
-36.122,-8.24861
-40.1236,-6.62266
-36.1236,-6.61861
-36.122,-8.24861
-40.122,-8.25266
-40.1236,-6.62266
-36.1236,-6.61861
-40.1237,-6.61266
-36.1237,-6.60861
-36.1236,-6.61861
-40.1236,-6.62266
-40.1237,-6.61266
-44.9848,-15.359
-43.8248,-15.3583
-43.8248,-15.3583
-44.9848,-15.359
-44.9848,-15.359
-43.8248,-15.3583
-43.8248,-15.3583
-42.7282,-15.3576
-42.7282,-15.3576
-43.8248,-15.3583
-43.8248,-15.3583
-42.7282,-15.3576
-42.7282,-15.3576
-41.6725,-15.2723
-41.6725,-15.2723
-42.7282,-15.3576
-42.7282,-15.3576
-41.6725,-15.2723
-41.6725,-15.2723
-40.6439,-15.02
-40.6439,-15.02
-41.6725,-15.2723
-41.6725,-15.2723
-40.6439,-15.02
-40.6439,-15.02
-39.6686,-14.6069
-39.6686,-14.6069
-40.6439,-15.02
-40.6439,-15.02
-39.6686,-14.6069
-39.6686,-14.6069
-38.7716,-14.0438
-38.7716,-14.0438
-39.6686,-14.6069
-39.6686,-14.6069
-38.7716,-14.0438
-38.7716,-14.0438
-38.0099,-13.3799
-38.0099,-13.3799
-38.7716,-14.0438
-38.7716,-14.0438
-38.0099,-13.3799
-38.0099,-13.3799
-37.3352,-12.5747
-37.3352,-12.5747
-38.0099,-13.3799
-38.0099,-13.3799
-37.3352,-12.5747
-37.3352,-12.5747
-36.7974,-11.6724
-36.7974,-11.6724
-37.3352,-12.5747
-37.3352,-12.5747
-36.7974,-11.6724
-36.7974,-11.6724
-36.4102,-10.6958
-36.4102,-10.6958
-36.7974,-11.6724
-36.7974,-11.6724
-36.4102,-10.6958
-36.4102,-10.6958
-36.1835,-9.67011
-36.1835,-9.67011
-36.4102,-10.6958
-36.4102,-10.6958
-36.1835,-9.67011
-36.1835,-9.67011
-36.122,-8.24861
-36.122,-8.24861
-36.1835,-9.67011
-36.1835,-9.67011
-36.122,-8.24861
-36.122,-8.24861
-36.1236,-6.61861
-36.1236,-6.61861
-36.122,-8.24861
-36.122,-8.24861
-36.1236,-6.61861
-36.1236,-6.61861
-36.1237,-6.60861
-36.1237,-6.60861
-36.1236,-6.61861
-36.1236,-6.61861
-36.1237,-6.60861
--99.0552,106.002
--95.053,106.997
--99.053,107.006
--99.0552,106.002
--95.0552,105.993
--95.053,106.997
--99.053,107.006
--95.0538,106.984
--99.0189,107.512
--99.053,107.006
--95.053,106.997
--95.0538,106.984
--99.0189,107.512
--95.0563,106.972
--98.9195,108.009
--99.0189,107.512
--95.0538,106.984
--95.0563,106.972
--98.9195,108.009
--95.0603,106.96
--98.7566,108.489
--98.9195,108.009
--95.0563,106.972
--95.0603,106.96
--98.7566,108.489
--95.0659,106.949
--98.5327,108.944
--98.7566,108.489
--95.0603,106.96
--95.0659,106.949
--98.5327,108.944
--95.0729,106.938
--98.2518,109.366
--98.5327,108.944
--95.0659,106.949
--95.0729,106.938
--98.2518,109.366
--95.0812,106.929
--97.9185,109.748
--98.2518,109.366
--95.0729,106.938
--95.0812,106.929
--97.9185,109.748
--95.0906,106.92
--97.5385,110.084
--97.9185,109.748
--95.0812,106.929
--95.0906,106.92
--97.5385,110.084
--94.6346,107.26
--96.9081,110.551
--97.5385,110.084
--95.0906,106.92
--94.6346,107.26
--96.9081,110.551
--94.4135,107.397
--96.3472,110.899
--96.9081,110.551
--94.6346,107.26
--94.4135,107.397
--96.3472,110.899
--94.1799,107.511
--95.7543,111.189
--96.3472,110.899
--94.4135,107.397
--94.1799,107.511
--95.7543,111.189
--93.936,107.602
--95.1354,111.418
--95.7543,111.189
--94.1799,107.511
--93.936,107.602
--95.1354,111.418
--93.6843,107.667
--94.4968,111.584
--95.1354,111.418
--93.936,107.602
--93.6843,107.667
--94.4968,111.584
--93.4274,107.707
--93.8448,111.685
--94.4968,111.584
--93.6843,107.667
--93.4274,107.707
--93.8448,111.685
--93.1677,107.721
--93.1859,111.721
--93.8448,111.685
--93.4274,107.707
--93.1677,107.721
--93.1859,111.721
--93.1653,107.721
--93.1799,111.721
--93.1859,111.721
--93.1677,107.721
--93.1653,107.721
--99.3552,106.002
--99.053,107.006
--99.353,107.006
--99.3552,106.002
--99.0552,106.002
--99.053,107.006
--99.353,107.006
--99.0189,107.512
--99.3163,107.551
--99.353,107.006
--99.053,107.006
--99.0189,107.512
--99.3163,107.551
--98.9195,108.009
--99.2093,108.087
--99.3163,107.551
--99.0189,107.512
--98.9195,108.009
--99.2093,108.087
--98.7566,108.489
--99.0338,108.604
--99.2093,108.087
--98.9195,108.009
--98.7566,108.489
--99.0338,108.604
--98.5327,108.944
--98.7927,109.094
--99.0338,108.604
--98.7566,108.489
--98.5327,108.944
--98.7927,109.094
--98.2518,109.366
--98.4902,109.548
--98.7927,109.094
--98.5327,108.944
--98.2518,109.366
--98.4902,109.548
--97.9185,109.748
--98.1313,109.96
--98.4902,109.548
--98.2518,109.366
--97.9185,109.748
--98.1313,109.96
--97.5385,110.084
--97.7221,110.321
--98.1313,109.96
--97.9185,109.748
--97.5385,110.084
--97.7221,110.321
--96.9081,110.551
--97.0787,110.798
--97.7221,110.321
--97.5385,110.084
--96.9081,110.551
--97.0787,110.798
--96.3472,110.899
--96.4922,111.161
--97.0787,110.798
--96.9081,110.551
--96.3472,110.899
--96.4922,111.161
--95.7543,111.189
--95.8724,111.464
--96.4922,111.161
--96.3472,110.899
--95.7543,111.189
--95.8724,111.464
--95.1354,111.418
--95.2254,111.704
--95.8724,111.464
--95.7543,111.189
--95.1354,111.418
--95.2254,111.704
--94.4968,111.584
--94.5577,111.878
--95.2254,111.704
--95.1354,111.418
--94.4968,111.584
--94.5577,111.878
--93.8448,111.685
--93.8761,111.984
--94.5577,111.878
--94.4968,111.584
--93.8448,111.685
--93.8761,111.984
--93.1859,111.721
--93.1872,112.021
--93.8761,111.984
--93.8448,111.685
--93.1859,111.721
--93.1872,112.021
--93.1799,111.721
--93.181,112.021
--93.1872,112.021
--93.1859,111.721
--93.1799,111.721
--103.355,106.011
--99.353,107.006
--103.353,107.015
--103.355,106.011
--99.3552,106.002
--99.353,107.006
--103.353,107.015
--99.3163,107.551
--103.281,108.079
--103.353,107.015
--99.353,107.006
--99.3163,107.551
--103.281,108.079
--99.2093,108.087
--103.073,109.124
--103.281,108.079
--99.3163,107.551
--99.2093,108.087
--103.073,109.124
--99.0338,108.604
--102.73,110.133
--103.073,109.124
--99.2093,108.087
--99.0338,108.604
--102.73,110.133
--98.7927,109.094
--102.26,111.089
--102.73,110.133
--99.0338,108.604
--98.7927,109.094
--102.26,111.089
--98.4902,109.548
--101.669,111.976
--102.26,111.089
--98.7927,109.094
--98.4902,109.548
--101.669,111.976
--98.1313,109.96
--100.969,112.779
--101.669,111.976
--98.4902,109.548
--98.1313,109.96
--100.969,112.779
--97.7221,110.321
--100.17,113.485
--100.969,112.779
--98.1313,109.96
--97.7221,110.321
--100.17,113.485
--97.0787,110.798
--99.3522,114.089
--100.17,113.485
--97.7221,110.321
--97.0787,110.798
--99.3522,114.089
--96.4922,111.161
--98.4258,114.663
--99.3522,114.089
--97.0787,110.798
--96.4922,111.161
--98.4258,114.663
--95.8724,111.464
--97.4468,115.141
--98.4258,114.663
--96.4922,111.161
--95.8724,111.464
--97.4468,115.141
--95.2254,111.704
--96.4248,115.52
--97.4468,115.141
--95.8724,111.464
--95.2254,111.704
--96.4248,115.52
--94.5577,111.878
--95.3702,115.794
--96.4248,115.52
--95.2254,111.704
--94.5577,111.878
--95.3702,115.794
--93.8761,111.984
--94.2935,115.962
--95.3702,115.794
--94.5577,111.878
--93.8761,111.984
--94.2935,115.962
--93.1872,112.021
--93.2054,116.021
--94.2935,115.962
--93.8761,111.984
--93.1872,112.021
--93.2054,116.021
--93.181,112.021
--93.1956,116.021
--93.2054,116.021
--93.1872,112.021
--93.181,112.021
--103.355,106.011
--103.353,107.015
--103.353,107.015
--103.355,106.011
--103.355,106.011
--103.353,107.015
--103.353,107.015
--103.281,108.079
--103.281,108.079
--103.353,107.015
--103.353,107.015
--103.281,108.079
--103.281,108.079
--103.073,109.124
--103.073,109.124
--103.281,108.079
--103.281,108.079
--103.073,109.124
--103.073,109.124
--102.73,110.133
--102.73,110.133
--103.073,109.124
--103.073,109.124
--102.73,110.133
--102.73,110.133
--102.26,111.089
--102.26,111.089
--102.73,110.133
--102.73,110.133
--102.26,111.089
--102.26,111.089
--101.669,111.976
--101.669,111.976
--102.26,111.089
--102.26,111.089
--101.669,111.976
--101.669,111.976
--100.969,112.779
--100.969,112.779
--101.669,111.976
--101.669,111.976
--100.969,112.779
--100.969,112.779
--100.17,113.485
--100.17,113.485
--100.969,112.779
--100.969,112.779
--100.17,113.485
--100.17,113.485
--99.3522,114.089
--99.3522,114.089
--100.17,113.485
--100.17,113.485
--99.3522,114.089
--99.3522,114.089
--98.4258,114.663
--98.4258,114.663
--99.3522,114.089
--99.3522,114.089
--98.4258,114.663
--98.4258,114.663
--97.4468,115.141
--97.4468,115.141
--98.4258,114.663
--98.4258,114.663
--97.4468,115.141
--97.4468,115.141
--96.4248,115.52
--96.4248,115.52
--97.4468,115.141
--97.4468,115.141
--96.4248,115.52
--96.4248,115.52
--95.3702,115.794
--95.3702,115.794
--96.4248,115.52
--96.4248,115.52
--95.3702,115.794
--95.3702,115.794
--94.2935,115.962
--94.2935,115.962
--95.3702,115.794
--95.3702,115.794
--94.2935,115.962
--94.2935,115.962
--93.2054,116.021
--93.2054,116.021
--94.2935,115.962
--94.2935,115.962
--93.2054,116.021
--93.2054,116.021
--93.1956,116.021
--93.1956,116.021
--93.2054,116.021
--93.2054,116.021
--93.1956,116.021
--103.355,106.011
--103.353,107.015
--107.353,107.024
--103.355,106.011
--107.353,107.024
--107.355,106.02
--103.353,107.015
--103.281,108.079
--107.246,108.606
--103.353,107.015
--107.246,108.606
--107.353,107.024
--103.281,108.079
--103.073,109.124
--106.936,110.161
--103.281,108.079
--106.936,110.161
--107.246,108.606
--103.073,109.124
--102.73,110.133
--106.426,111.662
--103.073,109.124
--106.426,111.662
--106.936,110.161
--102.73,110.133
--102.26,111.089
--105.726,113.084
--102.73,110.133
--105.726,113.084
--106.426,111.662
--102.26,111.089
--101.669,111.976
--104.848,114.404
--102.26,111.089
--104.848,114.404
--105.726,113.084
--101.669,111.976
--100.969,112.779
--103.806,115.599
--101.669,111.976
--103.806,115.599
--104.848,114.404
--100.969,112.779
--100.17,113.485
--102.618,116.648
--100.969,112.779
--102.618,116.648
--103.806,115.599
--100.17,113.485
--99.3522,114.089
--101.626,117.38
--100.17,113.485
--101.626,117.38
--102.618,116.648
--99.3522,114.089
--98.4258,114.663
--100.359,118.165
--99.3522,114.089
--100.359,118.165
--101.626,117.38
--98.4258,114.663
--97.4468,115.141
--99.0212,118.819
--98.4258,114.663
--99.0212,118.819
--100.359,118.165
--97.4468,115.141
--96.4248,115.52
--97.6243,119.336
--97.4468,115.141
--97.6243,119.336
--99.0212,118.819
--96.4248,115.52
--95.3702,115.794
--96.1827,119.711
--96.4248,115.52
--96.1827,119.711
--97.6243,119.336
--95.3702,115.794
--94.2935,115.962
--94.7109,119.94
--95.3702,115.794
--94.7109,119.94
--96.1827,119.711
--94.2935,115.962
--93.2054,116.021
--93.2236,120.021
--94.2935,115.962
--93.2236,120.021
--94.7109,119.94
--93.2054,116.021
--93.1956,116.021
--93.2102,120.021
--93.2054,116.021
--93.2102,120.021
--93.2236,120.021
--107.355,106.02
--107.353,107.024
--107.653,107.025
--107.355,106.02
--107.653,107.025
--107.655,106.021
--107.353,107.024
--107.246,108.606
--107.544,108.646
--107.353,107.024
--107.544,108.646
--107.653,107.025
--107.246,108.606
--106.936,110.161
--107.225,110.238
--107.246,108.606
--107.225,110.238
--107.544,108.646
--106.936,110.161
--106.426,111.662
--106.703,111.776
--106.936,110.161
--106.703,111.776
--107.225,110.238
--106.426,111.662
--105.726,113.084
--105.986,113.234
--106.426,111.662
--105.986,113.234
--106.703,111.776
--105.726,113.084
--104.848,114.404
--105.086,114.586
--105.726,113.084
--105.086,114.586
--105.986,113.234
--104.848,114.404
--103.806,115.599
--104.019,115.81
--104.848,114.404
--104.019,115.81
--105.086,114.586
--103.806,115.599
--102.618,116.648
--102.801,116.885
--103.806,115.599
--102.801,116.885
--104.019,115.81
--102.618,116.648
--101.626,117.38
--101.796,117.627
--102.618,116.648
--101.796,117.627
--102.801,116.885
--101.626,117.38
--100.359,118.165
--100.504,118.427
--101.626,117.38
--100.504,118.427
--101.796,117.627
--100.359,118.165
--99.0212,118.819
--99.1392,119.094
--100.359,118.165
--99.1392,119.094
--100.504,118.427
--99.0212,118.819
--97.6243,119.336
--97.7142,119.622
--99.0212,118.819
--97.7142,119.622
--99.1392,119.094
--97.6243,119.336
--96.1827,119.711
--96.2437,120.005
--97.6243,119.336
--96.2437,120.005
--97.7142,119.622
--96.1827,119.711
--94.7109,119.94
--94.7422,120.238
--96.1827,119.711
--94.7422,120.238
--96.2437,120.005
--94.7109,119.94
--93.2236,120.021
--93.225,120.321
--94.7109,119.94
--93.225,120.321
--94.7422,120.238
--93.2236,120.021
--93.2102,120.021
--93.2113,120.321
--93.2236,120.021
--93.2113,120.321
--93.225,120.321
--107.655,106.021
--107.653,107.025
--111.653,107.034
--107.655,106.021
--111.653,107.034
--111.655,106.03
--107.653,107.025
--107.544,108.646
--111.509,109.173
--107.653,107.025
--111.509,109.173
--111.653,107.034
--107.544,108.646
--107.225,110.238
--111.089,111.275
--107.544,108.646
--111.089,111.275
--111.509,109.173
--107.225,110.238
--106.703,111.776
--110.4,113.305
--107.225,110.238
--110.4,113.305
--111.089,111.275
--106.703,111.776
--105.986,113.234
--109.453,115.229
--106.703,111.776
--109.453,115.229
--110.4,113.305
--105.986,113.234
--105.086,114.586
--108.265,117.014
--105.986,113.234
--108.265,117.014
--109.453,115.229
--105.086,114.586
--104.019,115.81
--106.856,118.629
--105.086,114.586
--106.856,118.629
--108.265,117.014
--104.019,115.81
--102.801,116.885
--105.249,120.049
--104.019,115.81
--105.249,120.049
--106.856,118.629
--102.801,116.885
--101.796,117.627
--104.07,120.918
--102.801,116.885
--104.07,120.918
--105.249,120.049
--101.796,117.627
--100.504,118.427
--102.438,121.929
--101.796,117.627
--102.438,121.929
--104.07,120.918
--100.504,118.427
--99.1392,119.094
--100.714,122.772
--100.504,118.427
--100.714,122.772
--102.438,121.929
--99.1392,119.094
--97.7142,119.622
--98.9137,123.438
--99.1392,119.094
--98.9137,123.438
--100.714,122.772
--97.7142,119.622
--96.2437,120.005
--97.0562,123.921
--97.7142,119.622
--97.0562,123.921
--98.9137,123.438
--96.2437,120.005
--94.7422,120.238
--95.1597,124.217
--96.2437,120.005
--95.1597,124.217
--97.0562,123.921
--94.7422,120.238
--93.225,120.321
--93.2432,124.321
--94.7422,120.238
--93.2432,124.321
--95.1597,124.217
--93.225,120.321
--93.2113,120.321
--93.2258,124.321
--93.225,120.321
--93.2258,124.321
--93.2432,124.321
-89.3748,-71.0057
-85.3732,-71.3519
-89.3602,-71.6743
-89.3748,-71.0057
-85.3748,-71.0029
-85.3732,-71.3519
-89.3602,-71.6743
-85.3661,-71.4018
-89.2859,-72.1991
-89.3602,-71.6743
-85.3732,-71.3519
-85.3661,-71.4018
-89.2859,-72.1991
-85.3532,-71.4504
-89.1493,-72.7113
-89.2859,-72.1991
-85.3661,-71.4018
-85.3532,-71.4504
-89.1493,-72.7113
-85.3345,-71.4971
-88.9523,-73.2034
-89.1493,-72.7113
-85.3532,-71.4504
-85.3345,-71.4971
-88.9523,-73.2034
-85.3103,-71.5413
-88.6979,-73.6684
-88.9523,-73.2034
-85.3345,-71.4971
-85.3103,-71.5413
-88.6979,-73.6684
-85.281,-71.5822
-88.3896,-74.0995
-88.6979,-73.6684
-85.3103,-71.5413
-85.281,-71.5822
-88.3896,-74.0995
-85.2471,-71.6194
-88.0319,-74.4907
-88.3896,-74.0995
-85.281,-71.5822
-85.2471,-71.6194
-88.0319,-74.4907
-85.2089,-71.6522
-87.63,-74.8363
-88.0319,-74.4907
-85.2471,-71.6194
-85.2089,-71.6522
-87.63,-74.8363
-84.6652,-72.054
-86.9249,-75.3546
-87.63,-74.8363
-85.2089,-71.6522
-84.6652,-72.054
-86.9249,-75.3546
-84.414,-72.2099
-86.3679,-75.7002
-86.9249,-75.3546
-84.6652,-72.054
-84.414,-72.2099
-86.3679,-75.7002
-84.1498,-72.3426
-85.7821,-75.9944
-86.3679,-75.7002
-84.414,-72.2099
-84.1498,-72.3426
-85.7821,-75.9944
-83.8747,-72.451
-85.1722,-76.2347
-85.7821,-75.9944
-84.1498,-72.3426
-83.8747,-72.451
-85.1722,-76.2347
-83.591,-72.5342
-84.5432,-76.4192
-85.1722,-76.2347
-83.8747,-72.451
-83.591,-72.5342
-84.5432,-76.4192
-83.301,-72.5916
-83.9001,-76.5464
-84.5432,-76.4192
-83.591,-72.5342
-83.301,-72.5916
-83.9001,-76.5464
-83.007,-72.6226
-83.2482,-76.6154
-83.9001,-76.5464
-83.301,-72.5916
-83.007,-72.6226
-83.2482,-76.6154
-82.8135,-72.6286
-82.8191,-76.6286
-83.2482,-76.6154
-83.007,-72.6226
-82.8135,-72.6286
-89.6748,-71.0059
-89.3602,-71.6743
-89.6592,-71.6985
-89.6748,-71.0059
-89.3748,-71.0057
-89.3602,-71.6743
-89.6592,-71.6985
-89.2859,-72.1991
-89.5798,-72.2589
-89.6592,-71.6985
-89.3602,-71.6743
-89.2859,-72.1991
-89.5798,-72.2589
-89.1493,-72.7113
-89.434,-72.8058
-89.5798,-72.2589
-89.2859,-72.1991
-89.1493,-72.7113
-89.434,-72.8058
-88.9523,-73.2034
-89.2236,-73.3313
-89.434,-72.8058
-89.1493,-72.7113
-88.9523,-73.2034
-89.2236,-73.3313
-88.6979,-73.6684
-88.9519,-73.8279
-89.2236,-73.3313
-88.9523,-73.2034
-88.6979,-73.6684
-88.9519,-73.8279
-88.3896,-74.0995
-88.6227,-74.2883
-88.9519,-73.8279
-88.6979,-73.6684
-88.3896,-74.0995
-88.6227,-74.2883
-88.0319,-74.4907
-88.2408,-74.7061
-88.6227,-74.2883
-88.3896,-74.0995
-88.0319,-74.4907
-88.2408,-74.7061
-87.63,-74.8363
-87.8116,-75.0751
-88.2408,-74.7061
-88.0319,-74.4907
-87.63,-74.8363
-87.8116,-75.0751
-86.9249,-75.3546
-87.0944,-75.6022
-87.8116,-75.0751
-87.63,-74.8363
-86.9249,-75.3546
-87.0944,-75.6022
-86.3679,-75.7002
-86.5144,-75.962
-87.0944,-75.6022
-86.9249,-75.3546
-86.3679,-75.7002
-86.5144,-75.962
-85.7821,-75.9944
-85.9045,-76.2683
-86.5144,-75.962
-86.3679,-75.7002
-85.7821,-75.9944
-85.9045,-76.2683
-85.1722,-76.2347
-85.2695,-76.5185
-85.9045,-76.2683
-85.7821,-75.9944
-85.1722,-76.2347
-85.2695,-76.5185
-84.5432,-76.4192
-84.6146,-76.7106
-85.2695,-76.5185
-85.1722,-76.2347
-84.5432,-76.4192
-84.6146,-76.7106
-83.9001,-76.5464
-83.945,-76.8431
-84.6146,-76.7106
-84.5432,-76.4192
-83.9001,-76.5464
-83.945,-76.8431
-83.2482,-76.6154
-83.2663,-76.9148
-83.945,-76.8431
-83.9001,-76.5464
-83.2482,-76.6154
-83.2663,-76.9148
-82.8191,-76.6286
-82.8196,-76.9286
-83.2663,-76.9148
-83.2482,-76.6154
-82.8191,-76.6286
-93.6748,-71.0086
-89.6592,-71.6985
-93.6462,-72.0209
-93.6748,-71.0086
-89.6748,-71.0059
-89.6592,-71.6985
-93.6462,-72.0209
-89.5798,-72.2589
-93.4996,-73.0563
-93.6462,-72.0209
-89.6592,-71.6985
-89.5798,-72.2589
-93.4996,-73.0563
-89.434,-72.8058
-93.23,-74.0667
-93.4996,-73.0563
-89.5798,-72.2589
-89.434,-72.8058
-93.23,-74.0667
-89.2236,-73.3313
-92.8415,-75.0376
-93.23,-74.0667
-89.434,-72.8058
-89.2236,-73.3313
-92.8415,-75.0376
-88.9519,-73.8279
-92.3395,-75.955
-92.8415,-75.0376
-89.2236,-73.3313
-88.9519,-73.8279
-92.3395,-75.955
-88.6227,-74.2883
-91.7313,-76.8056
-92.3395,-75.955
-88.9519,-73.8279
-88.6227,-74.2883
-91.7313,-76.8056
-88.2408,-74.7061
-91.0257,-77.5774
-91.7313,-76.8056
-88.6227,-74.2883
-88.2408,-74.7061
-91.0257,-77.5774
-87.8116,-75.0751
-90.2327,-78.2591
-91.0257,-77.5774
-88.2408,-74.7061
-87.8116,-75.0751
-90.2327,-78.2591
-87.0944,-75.6022
-89.3541,-78.9027
-90.2327,-78.2591
-87.8116,-75.0751
-87.0944,-75.6022
-89.3541,-78.9027
-86.5144,-75.962
-88.4683,-79.4523
-89.3541,-78.9027
-87.0944,-75.6022
-86.5144,-75.962
-88.4683,-79.4523
-85.9045,-76.2683
-87.5368,-79.9201
-88.4683,-79.4523
-86.5144,-75.962
-85.9045,-76.2683
-87.5368,-79.9201
-85.2695,-76.5185
-86.5669,-80.3022
-87.5368,-79.9201
-85.9045,-76.2683
-85.2695,-76.5185
-86.5669,-80.3022
-84.6146,-76.7106
-85.5667,-80.5956
-86.5669,-80.3022
-85.2695,-76.5185
-84.6146,-76.7106
-85.5667,-80.5956
-83.945,-76.8431
-84.5441,-80.7979
-85.5667,-80.5956
-84.6146,-76.7106
-83.945,-76.8431
-84.5441,-80.7979
-83.2663,-76.9148
-83.5075,-80.9075
-84.5441,-80.7979
-83.945,-76.8431
-83.2663,-76.9148
-83.5075,-80.9075
-82.8196,-76.9286
-82.8252,-80.9286
-83.5075,-80.9075
-83.2663,-76.9148
-82.8196,-76.9286
-93.6748,-71.0086
-93.6462,-72.0209
-93.6462,-72.0209
-93.6748,-71.0086
-93.6748,-71.0086
-93.6462,-72.0209
-93.6462,-72.0209
-93.4996,-73.0563
-93.4996,-73.0563
-93.6462,-72.0209
-93.6462,-72.0209
-93.4996,-73.0563
-93.4996,-73.0563
-93.23,-74.0667
-93.23,-74.0667
-93.4996,-73.0563
-93.4996,-73.0563
-93.23,-74.0667
-93.23,-74.0667
-92.8415,-75.0376
-92.8415,-75.0376
-93.23,-74.0667
-93.23,-74.0667
-92.8415,-75.0376
-92.8415,-75.0376
-92.3395,-75.955
-92.3395,-75.955
-92.8415,-75.0376
-92.8415,-75.0376
-92.3395,-75.955
-92.3395,-75.955
-91.7313,-76.8056
-91.7313,-76.8056
-92.3395,-75.955
-92.3395,-75.955
-91.7313,-76.8056
-91.7313,-76.8056
-91.0257,-77.5774
-91.0257,-77.5774
-91.7313,-76.8056
-91.7313,-76.8056
-91.0257,-77.5774
-91.0257,-77.5774
-90.2327,-78.2591
-90.2327,-78.2591
-91.0257,-77.5774
-91.0257,-77.5774
-90.2327,-78.2591
-90.2327,-78.2591
-89.3541,-78.9027
-89.3541,-78.9027
-90.2327,-78.2591
-90.2327,-78.2591
-89.3541,-78.9027
-89.3541,-78.9027
-88.4683,-79.4523
-88.4683,-79.4523
-89.3541,-78.9027
-89.3541,-78.9027
-88.4683,-79.4523
-88.4683,-79.4523
-87.5368,-79.9201
-87.5368,-79.9201
-88.4683,-79.4523
-88.4683,-79.4523
-87.5368,-79.9201
-87.5368,-79.9201
-86.5669,-80.3022
-86.5669,-80.3022
-87.5368,-79.9201
-87.5368,-79.9201
-86.5669,-80.3022
-86.5669,-80.3022
-85.5667,-80.5956
-85.5667,-80.5956
-86.5669,-80.3022
-86.5669,-80.3022
-85.5667,-80.5956
-85.5667,-80.5956
-84.5441,-80.7979
-84.5441,-80.7979
-85.5667,-80.5956
-85.5667,-80.5956
-84.5441,-80.7979
-84.5441,-80.7979
-83.5075,-80.9075
-83.5075,-80.9075
-84.5441,-80.7979
-84.5441,-80.7979
-83.5075,-80.9075
-83.5075,-80.9075
-82.8252,-80.9286
-82.8252,-80.9286
-83.5075,-80.9075
-83.5075,-80.9075
-82.8252,-80.9286
-93.6748,-71.0086
-93.6462,-72.0209
-97.6332,-72.3433
-93.6748,-71.0086
-97.6332,-72.3433
-97.6748,-71.0113
-93.6462,-72.0209
-93.4996,-73.0563
-97.4193,-73.8536
-93.6462,-72.0209
-97.4193,-73.8536
-97.6332,-72.3433
-93.4996,-73.0563
-93.23,-74.0667
-97.0261,-75.3276
-93.4996,-73.0563
-97.0261,-75.3276
-97.4193,-73.8536
-93.23,-74.0667
-92.8415,-75.0376
-96.4593,-76.7438
-93.23,-74.0667
-96.4593,-76.7438
-97.0261,-75.3276
-92.8415,-75.0376
-92.3395,-75.955
-95.7271,-78.082
-92.8415,-75.0376
-95.7271,-78.082
-96.4593,-76.7438
-92.3395,-75.955
-91.7313,-76.8056
-94.8399,-79.3229
-92.3395,-75.955
-94.8399,-79.3229
-95.7271,-78.082
-91.7313,-76.8056
-91.0257,-77.5774
-93.8105,-80.4487
-91.7313,-76.8056
-93.8105,-80.4487
-94.8399,-79.3229
-91.0257,-77.5774
-90.2327,-78.2591
-92.6538,-81.4432
-91.0257,-77.5774
-92.6538,-81.4432
-93.8105,-80.4487
-90.2327,-78.2591
-89.3541,-78.9027
-91.6137,-82.2033
-90.2327,-78.2591
-91.6137,-82.2033
-92.6538,-81.4432
-89.3541,-78.9027
-88.4683,-79.4523
-90.4222,-82.9426
-89.3541,-78.9027
-90.4222,-82.9426
-91.6137,-82.2033
-88.4683,-79.4523
-87.5368,-79.9201
-89.169,-83.5719
-88.4683,-79.4523
-89.169,-83.5719
-90.4222,-82.9426
-87.5368,-79.9201
-86.5669,-80.3022
-87.8644,-84.0859
-87.5368,-79.9201
-87.8644,-84.0859
-89.169,-83.5719
-86.5669,-80.3022
-85.5667,-80.5956
-86.5188,-84.4806
-86.5669,-80.3022
-86.5188,-84.4806
-87.8644,-84.0859
-85.5667,-80.5956
-84.5441,-80.7979
-85.1432,-84.7528
-85.5667,-80.5956
-85.1432,-84.7528
-86.5188,-84.4806
-84.5441,-80.7979
-83.5075,-80.9075
-83.7487,-84.9003
-84.5441,-80.7979
-83.7487,-84.9003
-85.1432,-84.7528
-83.5075,-80.9075
-82.8252,-80.9286
-82.8308,-84.9286
-83.5075,-80.9075
-82.8308,-84.9286
-83.7487,-84.9003
-97.6748,-71.0113
-97.6332,-72.3433
-97.9322,-72.3674
-97.6748,-71.0113
-97.9322,-72.3674
-97.9748,-71.0115
-97.6332,-72.3433
-97.4193,-73.8536
-97.7133,-73.9134
-97.6332,-72.3433
-97.7133,-73.9134
-97.9322,-72.3674
-97.4193,-73.8536
-97.0261,-75.3276
-97.3108,-75.4221
-97.4193,-73.8536
-97.3108,-75.4221
-97.7133,-73.9134
-97.0261,-75.3276
-96.4593,-76.7438
-96.7307,-76.8718
-97.0261,-75.3276
-96.7307,-76.8718
-97.3108,-75.4221
-96.4593,-76.7438
-95.7271,-78.082
-95.9811,-78.2415
-96.4593,-76.7438
-95.9811,-78.2415
-96.7307,-76.8718
-95.7271,-78.082
-94.8399,-79.3229
-95.073,-79.5117
-95.7271,-78.082
-95.073,-79.5117
-95.9811,-78.2415
-94.8399,-79.3229
-93.8105,-80.4487
-94.0194,-80.6641
-94.8399,-79.3229
-94.0194,-80.6641
-95.073,-79.5117
-93.8105,-80.4487
-92.6538,-81.4432
-92.8354,-81.682
-93.8105,-80.4487
-92.8354,-81.682
-94.0194,-80.6641
-92.6538,-81.4432
-91.6137,-82.2033
-91.7832,-82.4509
-92.6538,-81.4432
-91.7832,-82.4509
-92.8354,-81.682
-91.6137,-82.2033
-90.4222,-82.9426
-90.5687,-83.2044
-91.6137,-82.2033
-90.5687,-83.2044
-91.7832,-82.4509
-90.4222,-82.9426
-89.169,-83.5719
-89.2915,-83.8458
-90.4222,-82.9426
-89.2915,-83.8458
-90.5687,-83.2044
-89.169,-83.5719
-87.8644,-84.0859
-87.9617,-84.3697
-89.169,-83.5719
-87.9617,-84.3697
-89.2915,-83.8458
-87.8644,-84.0859
-86.5188,-84.4806
-86.5902,-84.772
-87.8644,-84.0859
-86.5902,-84.772
-87.9617,-84.3697
-86.5188,-84.4806
-85.1432,-84.7528
-85.1881,-85.0494
-86.5188,-84.4806
-85.1881,-85.0494
-86.5902,-84.772
-85.1432,-84.7528
-83.7487,-84.9003
-83.7668,-85.1997
-85.1432,-84.7528
-83.7668,-85.1997
-85.1881,-85.0494
-83.7487,-84.9003
-82.8308,-84.9286
-82.8312,-85.2286
-83.7487,-84.9003
-82.8312,-85.2286
-83.7668,-85.1997
-97.9748,-71.0115
-97.9322,-72.3674
-101.919,-72.6898
-97.9748,-71.0115
-101.919,-72.6898
-101.975,-71.0143
-97.9322,-72.3674
-97.7133,-73.9134
-101.633,-74.7108
-97.9322,-72.3674
-101.633,-74.7108
-101.919,-72.6898
-97.7133,-73.9134
-97.3108,-75.4221
-101.107,-76.683
-97.7133,-73.9134
-101.107,-76.683
-101.633,-74.7108
-97.3108,-75.4221
-96.7307,-76.8718
-100.349,-78.578
-97.3108,-75.4221
-100.349,-78.578
-101.107,-76.683
-96.7307,-76.8718
-95.9811,-78.2415
-99.3687,-80.3686
-96.7307,-76.8718
-99.3687,-80.3686
-100.349,-78.578
-95.9811,-78.2415
-95.073,-79.5117
-98.1816,-82.029
-95.9811,-78.2415
-98.1816,-82.029
-99.3687,-80.3686
-95.073,-79.5117
-94.0194,-80.6641
-96.8042,-83.5354
-95.073,-79.5117
-96.8042,-83.5354
-98.1816,-82.029
-94.0194,-80.6641
-92.8354,-81.682
-95.2565,-84.8661
-94.0194,-80.6641
-95.2565,-84.8661
-96.8042,-83.5354
-92.8354,-81.682
-91.7832,-82.4509
-94.0429,-85.7514
-92.8354,-81.682
-94.0429,-85.7514
-95.2565,-84.8661
-91.7832,-82.4509
-90.5687,-83.2044
-92.5226,-86.6947
-91.7832,-82.4509
-92.5226,-86.6947
-94.0429,-85.7514
-90.5687,-83.2044
-89.2915,-83.8458
-90.9237,-87.4976
-90.5687,-83.2044
-90.9237,-87.4976
-92.5226,-86.6947
-89.2915,-83.8458
-87.9617,-84.3697
-89.2591,-88.1534
-89.2915,-83.8458
-89.2591,-88.1534
-90.9237,-87.4976
-87.9617,-84.3697
-86.5902,-84.772
-87.5423,-88.6571
-87.9617,-84.3697
-87.5423,-88.6571
-89.2591,-88.1534
-86.5902,-84.772
-85.1881,-85.0494
-85.7872,-89.0043
-86.5902,-84.772
-85.7872,-89.0043
-87.5423,-88.6571
-85.1881,-85.0494
-83.7668,-85.1997
-84.008,-89.1924
-85.1881,-85.0494
-84.008,-89.1924
-85.7872,-89.0043
-83.7668,-85.1997
-82.8312,-85.2286
-82.8369,-89.2286
-83.7668,-85.1997
-82.8369,-89.2286
-84.008,-89.1924
-44.9848,-15.359
-43.8272,-11.3583
-43.8248,-15.3583
-44.9848,-15.359
-44.9872,-11.359
-43.8272,-11.3583
-43.8248,-15.3583
-36.0572,-11.3536
-36.0548,-15.3536
-43.8248,-15.3583
-43.8272,-11.3583
-36.0572,-11.3536
-36.0548,-15.3536
-28.2672,-11.3488
-28.2648,-15.3488
-36.0548,-15.3536
-36.0572,-11.3536
-28.2672,-11.3488
-28.2648,-15.3488
-26.9872,-11.3481
-26.9848,-15.3481
-28.2648,-15.3488
-28.2672,-11.3488
-26.9872,-11.3481
-44.9848,-15.359
-43.8248,-15.3583
-43.8248,-15.3583
-44.9848,-15.359
-44.9848,-15.359
-43.8248,-15.3583
-43.8248,-15.3583
-36.0548,-15.3536
-36.0548,-15.3536
-43.8248,-15.3583
-43.8248,-15.3583
-36.0548,-15.3536
-36.0548,-15.3536
-28.2648,-15.3488
-28.2648,-15.3488
-36.0548,-15.3536
-36.0548,-15.3536
-28.2648,-15.3488
-28.2648,-15.3488
-26.9848,-15.3481
-26.9848,-15.3481
-28.2648,-15.3488
-28.2648,-15.3488
-26.9848,-15.3481
-44.9848,-15.359
-43.8248,-15.3583
-43.8248,-15.3583
-44.9848,-15.359
-44.9848,-15.359
-43.8248,-15.3583
-43.8248,-15.3583
-36.0548,-15.3536
-36.0548,-15.3536
-43.8248,-15.3583
-43.8248,-15.3583
-36.0548,-15.3536
-36.0548,-15.3536
-28.2648,-15.3488
-28.2648,-15.3488
-36.0548,-15.3536
-36.0548,-15.3536
-28.2648,-15.3488
-28.2648,-15.3488
-26.9848,-15.3481
-26.9848,-15.3481
-28.2648,-15.3488
-28.2648,-15.3488
-26.9848,-15.3481
-44.9848,-15.359
-43.8248,-15.3583
-43.8224,-19.3583
-44.9848,-15.359
-43.8224,-19.3583
-44.9824,-19.359
-43.8248,-15.3583
-36.0548,-15.3536
-36.0524,-19.3536
-43.8248,-15.3583
-36.0524,-19.3536
-43.8224,-19.3583
-36.0548,-15.3536
-28.2648,-15.3488
-28.2624,-19.3488
-36.0548,-15.3536
-28.2624,-19.3488
-36.0524,-19.3536
-28.2648,-15.3488
-26.9848,-15.3481
-26.9824,-19.3481
-28.2648,-15.3488
-26.9824,-19.3481
-28.2624,-19.3488
-44.9824,-19.359
-43.8224,-19.3583
-43.8222,-19.6583
-44.9824,-19.359
-43.8222,-19.6583
-44.9822,-19.659
-43.8224,-19.3583
-36.0524,-19.3536
-36.0522,-19.6536
-43.8224,-19.3583
-36.0522,-19.6536
-43.8222,-19.6583
-36.0524,-19.3536
-28.2624,-19.3488
-28.2622,-19.6488
-36.0524,-19.3536
-28.2622,-19.6488
-36.0522,-19.6536
-28.2624,-19.3488
-26.9824,-19.3481
-26.9822,-19.6481
-28.2624,-19.3488
-26.9822,-19.6481
-28.2622,-19.6488
-44.9822,-19.659
-43.8222,-19.6583
-43.8198,-23.6583
-44.9822,-19.659
-43.8198,-23.6583
-44.9798,-23.659
-43.8222,-19.6583
-36.0522,-19.6536
-36.0498,-23.6536
-43.8222,-19.6583
-36.0498,-23.6536
-43.8198,-23.6583
-36.0522,-19.6536
-28.2622,-19.6488
-28.2598,-23.6488
-36.0522,-19.6536
-28.2598,-23.6488
-36.0498,-23.6536
-28.2622,-19.6488
-26.9822,-19.6481
-26.9798,-23.6481
-28.2622,-19.6488
-26.9798,-23.6481
-28.2598,-23.6488
--93.3723,-85.2886
--63.3296,-89.2681
--63.3323,-85.2681
--93.3723,-85.2886
--93.3696,-89.2886
--63.3296,-89.2681
--93.3725,-84.9886
--63.3323,-85.2681
--63.3325,-84.9681
--93.3725,-84.9886
--93.3723,-85.2886
--63.3323,-85.2681
--93.3752,-80.9886
--63.3325,-84.9681
--63.3352,-80.9681
--93.3752,-80.9886
--93.3725,-84.9886
--63.3325,-84.9681
--93.3752,-80.9886
--63.3352,-80.9681
--63.3352,-80.9681
--93.3752,-80.9886
--93.3752,-80.9886
--63.3352,-80.9681
--93.3752,-80.9886
--63.3352,-80.9681
--63.3379,-76.9681
--93.3752,-80.9886
--63.3379,-76.9681
--93.3779,-76.9886
--93.3779,-76.9886
--63.3379,-76.9681
--63.3382,-76.6681
--93.3779,-76.9886
--63.3382,-76.6681
--93.3781,-76.6886
--93.3781,-76.6886
--63.3382,-76.6681
--63.3409,-72.6681
--93.3781,-76.6886
--63.3409,-72.6681
--93.3809,-72.6886
--45.3367,-85.26
--19.8306,-89.2686
--19.8293,-85.2686
--45.3367,-85.26
--45.338,-89.26
--19.8306,-89.2686
--19.8293,-85.2686
-9.68453,-89.2786
-9.68589,-85.2786
--19.8293,-85.2686
--19.8306,-89.2686
-9.68453,-89.2786
-9.68589,-85.2786
-38.7238,-89.2885
-38.7251,-85.2885
-9.68589,-85.2786
-9.68453,-89.2786
-38.7238,-89.2885
-38.7251,-85.2885
-82.8362,-89.2286
-82.8307,-85.2286
-38.7251,-85.2885
-38.7238,-89.2885
-82.8362,-89.2286
--45.3366,-84.96
--19.8293,-85.2686
--19.8292,-84.9686
--45.3366,-84.96
--45.3367,-85.26
--19.8293,-85.2686
--19.8292,-84.9686
-9.68589,-85.2786
-9.68599,-84.9786
--19.8292,-84.9686
--19.8293,-85.2686
-9.68589,-85.2786
-9.68599,-84.9786
-38.7251,-85.2885
-38.7252,-84.9885
-9.68599,-84.9786
-9.68589,-85.2786
-38.7251,-85.2885
-38.7252,-84.9885
-82.8307,-85.2286
-82.8303,-84.9286
-38.7252,-84.9885
-38.7251,-85.2885
-82.8307,-85.2286
--45.3352,-80.96
--19.8292,-84.9686
--19.8278,-80.9686
--45.3352,-80.96
--45.3366,-84.96
--19.8292,-84.9686
--19.8278,-80.9686
-9.68599,-84.9786
-9.68735,-80.9786
--19.8278,-80.9686
--19.8292,-84.9686
-9.68599,-84.9786
-9.68735,-80.9786
-38.7252,-84.9885
-38.7266,-80.9885
-9.68735,-80.9786
-9.68599,-84.9786
-38.7252,-84.9885
-38.7266,-80.9885
-82.8303,-84.9286
-82.8248,-80.9286
-38.7266,-80.9885
-38.7252,-84.9885
-82.8303,-84.9286
--45.3352,-80.96
--19.8278,-80.9686
--19.8278,-80.9686
--45.3352,-80.96
--45.3352,-80.96
--19.8278,-80.9686
--19.8278,-80.9686
-9.68735,-80.9786
-9.68735,-80.9786
--19.8278,-80.9686
--19.8278,-80.9686
-9.68735,-80.9786
-9.68735,-80.9786
-38.7266,-80.9885
-38.7266,-80.9885
-9.68735,-80.9786
-9.68735,-80.9786
-38.7266,-80.9885
-38.7266,-80.9885
-82.8248,-80.9286
-82.8248,-80.9286
-38.7266,-80.9885
-38.7266,-80.9885
-82.8248,-80.9286
--45.3352,-80.96
--19.8278,-80.9686
--19.8264,-76.9686
--45.3352,-80.96
--19.8264,-76.9686
--45.3339,-76.96
--19.8278,-80.9686
-9.68735,-80.9786
-9.6887,-76.9786
--19.8278,-80.9686
-9.6887,-76.9786
--19.8264,-76.9686
-9.68735,-80.9786
-38.7266,-80.9885
-38.7279,-76.9885
-9.68735,-80.9786
-38.7279,-76.9885
-9.6887,-76.9786
-38.7266,-80.9885
-82.8248,-80.9286
-82.8193,-76.9286
-38.7266,-80.9885
-82.8193,-76.9286
-38.7279,-76.9885
--45.3339,-76.96
--19.8264,-76.9686
--19.8263,-76.6686
--45.3339,-76.96
--19.8263,-76.6686
--45.3338,-76.66
--19.8264,-76.9686
-9.6887,-76.9786
-9.6888,-76.6786
--19.8264,-76.9686
-9.6888,-76.6786
--19.8263,-76.6686
-9.6887,-76.9786
-38.7279,-76.9885
-38.728,-76.6885
-9.6887,-76.9786
-38.728,-76.6885
-9.6888,-76.6786
-38.7279,-76.9885
-82.8193,-76.9286
-82.8189,-76.6286
-38.7279,-76.9885
-82.8189,-76.6286
-38.728,-76.6885
--45.3338,-76.66
--19.8263,-76.6686
--19.825,-72.6686
--45.3338,-76.66
--19.825,-72.6686
--45.3324,-72.66
--19.8263,-76.6686
-9.6888,-76.6786
-9.69016,-72.6786
--19.8263,-76.6686
-9.69016,-72.6786
--19.825,-72.6686
-9.6888,-76.6786
-38.728,-76.6885
-38.7294,-72.6885
-9.6888,-76.6786
-38.7294,-72.6885
-9.69016,-72.6786
-38.728,-76.6885
-82.8189,-76.6286
-82.8134,-72.6286
-38.728,-76.6885
-82.8134,-72.6286
-38.7294,-72.6885
--63.2952,34.0032
--61.6871,30.0025
--61.6852,34.0025
--63.2952,34.0032
--63.2971,30.0032
--61.6871,30.0025
--61.6852,34.0025
--53.8671,29.9989
--53.8652,33.9989
--61.6852,34.0025
--61.6871,30.0025
--53.8671,29.9989
--53.8652,33.9989
--47.4371,29.996
--47.4352,33.996
--53.8652,33.9989
--53.8671,29.9989
--47.4371,29.996
--47.4352,33.996
--45.2971,29.995
--45.2952,33.995
--47.4352,33.996
--47.4371,29.996
--45.2971,29.995
--63.2952,34.0032
--61.6852,34.0025
--61.6852,34.0025
--63.2952,34.0032
--63.2952,34.0032
--61.6852,34.0025
--61.6852,34.0025
--53.8652,33.9989
--53.8652,33.9989
--61.6852,34.0025
--61.6852,34.0025
--53.8652,33.9989
--53.8652,33.9989
--47.4352,33.996
--47.4352,33.996
--53.8652,33.9989
--53.8652,33.9989
--47.4352,33.996
--47.4352,33.996
--45.2952,33.995
--45.2952,33.995
--47.4352,33.996
--47.4352,33.996
--45.2952,33.995
--93.3781,-76.6886
--94.4243,-72.6909
--94.4216,-76.6893
--93.3781,-76.6886
--93.3809,-72.6886
--94.4243,-72.6909
--94.4216,-76.6893
--94.5836,-72.6866
--95.0194,-76.6568
--94.4216,-76.6893
--94.4243,-72.6909
--94.5836,-72.6866
--95.0194,-76.6568
--94.7425,-72.6668
--95.61,-76.5589
--95.0194,-76.6568
--94.5836,-72.6866
--94.7425,-72.6668
--95.61,-76.5589
--94.8993,-72.6308
--96.1863,-76.3967
--95.61,-76.5589
--94.7425,-72.6668
--94.8993,-72.6308
--96.1863,-76.3967
--95.0524,-72.5782
--96.7414,-76.1722
--96.1863,-76.3967
--94.8993,-72.6308
--95.0524,-72.5782
--96.7414,-76.1722
--95.1996,-72.5087
--97.2684,-75.8882
--96.7414,-76.1722
--95.0524,-72.5782
--95.1996,-72.5087
--97.2684,-75.8882
--95.3387,-72.4224
--97.7611,-75.548
--97.2684,-75.8882
--95.1996,-72.5087
--95.3387,-72.4224
--97.7611,-75.548
--95.3273,-72.4466
--98.1385,-75.218
--97.7611,-75.548
--95.3387,-72.4224
--95.3273,-72.4466
--98.1385,-75.218
--95.2638,-72.5278
--98.4305,-74.877
--98.1385,-75.218
--95.3273,-72.4466
--95.2638,-72.5278
--98.4305,-74.877
--95.2103,-72.6153
--98.6721,-74.4987
--98.4305,-74.877
--95.2638,-72.5278
--95.2103,-72.6153
--98.6721,-74.4987
--95.1667,-72.708
--98.8585,-74.0903
--98.6721,-74.4987
--95.2103,-72.6153
--95.1667,-72.708
--98.8585,-74.0903
--95.1325,-72.8052
--98.9861,-73.6599
--98.8585,-74.0903
--95.1667,-72.708
--95.1325,-72.8052
--98.9861,-73.6599
--95.1077,-72.9066
--99.0525,-73.2159
--98.9861,-73.6599
--95.1325,-72.8052
--95.1077,-72.9066
--99.0525,-73.2159
--95.0652,-71.1158
--99.0652,-71.1221
--99.0525,-73.2159
--95.1077,-72.9066
--95.0652,-71.1158
--93.3779,-76.9886
--94.4216,-76.6893
--94.4214,-76.9893
--93.3779,-76.9886
--93.3781,-76.6886
--94.4216,-76.6893
--94.4214,-76.9893
--95.0194,-76.6568
--95.0521,-76.955
--94.4214,-76.9893
--94.4216,-76.6893
--95.0194,-76.6568
--95.0521,-76.955
--95.61,-76.5589
--95.6753,-76.8517
--95.0521,-76.955
--95.0194,-76.6568
--95.61,-76.5589
--95.6753,-76.8517
--96.1863,-76.3967
--96.2834,-76.6806
--95.6753,-76.8517
--95.61,-76.5589
--96.1863,-76.3967
--96.2834,-76.6806
--96.7414,-76.1722
--96.869,-76.4437
--96.2834,-76.6806
--96.1863,-76.3967
--96.7414,-76.1722
--96.869,-76.4437
--97.2684,-75.8882
--97.425,-76.1441
--96.869,-76.4437
--96.7414,-76.1722
--97.2684,-75.8882
--97.425,-76.1441
--97.7611,-75.548
--97.9448,-75.7851
--97.425,-76.1441
--97.2684,-75.8882
--97.7611,-75.548
--97.9448,-75.7851
--98.1385,-75.218
--98.3521,-75.4286
--97.9448,-75.7851
--97.7611,-75.548
--98.1385,-75.218
--98.3521,-75.4286
--98.4305,-74.877
--98.6714,-75.0558
--98.3521,-75.4286
--98.1385,-75.218
--98.4305,-74.877
--98.6714,-75.0558
--98.6721,-74.4987
--98.9356,-74.6421
--98.6714,-75.0558
--98.4305,-74.877
--98.6721,-74.4987
--98.9356,-74.6421
--98.8585,-74.0903
--99.1395,-74.1955
--98.9356,-74.6421
--98.6721,-74.4987
--98.8585,-74.0903
--99.1395,-74.1955
--98.9861,-73.6599
--99.279,-73.7249
--99.1395,-74.1955
--98.8585,-74.0903
--98.9861,-73.6599
--99.279,-73.7249
--99.0525,-73.2159
--99.3515,-73.2394
--99.279,-73.7249
--98.9861,-73.6599
--99.0525,-73.2159
--99.3515,-73.2394
--99.0652,-71.1221
--99.3652,-71.1226
--99.3515,-73.2394
--99.0525,-73.2159
--99.0652,-71.1221
--93.3752,-80.9886
--94.4214,-76.9893
--94.4186,-80.9893
--93.3752,-80.9886
--93.3779,-76.9886
--94.4214,-76.9893
--94.4186,-80.9893
--95.0521,-76.955
--95.4885,-80.9312
--94.4186,-80.9893
--94.4214,-76.9893
--95.0521,-76.955
--95.4885,-80.9312
--95.6753,-76.8517
--96.5456,-80.7559
--95.4885,-80.9312
--95.0521,-76.955
--95.6753,-76.8517
--96.5456,-80.7559
--96.2834,-76.6806
--97.577,-80.4656
--96.5456,-80.7559
--95.6753,-76.8517
--96.2834,-76.6806
--97.577,-80.4656
--96.869,-76.4437
--98.5703,-80.0639
--97.577,-80.4656
--96.2834,-76.6806
--96.869,-76.4437
--98.5703,-80.0639
--97.425,-76.1441
--99.5135,-79.5556
--98.5703,-80.0639
--96.869,-76.4437
--97.425,-76.1441
--99.5135,-79.5556
--97.9448,-75.7851
--100.395,-78.9468
--99.5135,-79.5556
--97.425,-76.1441
--97.9448,-75.7851
--100.395,-78.9468
--98.3521,-75.4286
--101.201,-78.2368
--100.395,-78.9468
--97.9448,-75.7851
--98.3521,-75.4286
--101.201,-78.2368
--98.6714,-75.0558
--101.884,-77.439
--101.201,-78.2368
--98.3521,-75.4286
--98.6714,-75.0558
--101.884,-77.439
--98.9356,-74.6421
--102.449,-76.5537
--101.884,-77.439
--98.6714,-75.0558
--98.9356,-74.6421
--102.449,-76.5537
--99.1395,-74.1955
--102.885,-75.5981
--102.449,-76.5537
--98.9356,-74.6421
--99.1395,-74.1955
--102.885,-75.5981
--99.279,-73.7249
--103.184,-74.591
--102.885,-75.5981
--99.1395,-74.1955
--99.279,-73.7249
--103.184,-74.591
--99.3515,-73.2394
--103.339,-73.5522
--103.184,-74.591
--99.279,-73.7249
--99.3515,-73.2394
--103.339,-73.5522
--99.3652,-71.1226
--103.365,-71.1289
--103.339,-73.5522
--99.3515,-73.2394
--99.3652,-71.1226
--93.3752,-80.9886
--94.4186,-80.9893
--94.4186,-80.9893
--93.3752,-80.9886
--93.3752,-80.9886
--94.4186,-80.9893
--94.4186,-80.9893
--95.4885,-80.9312
--95.4885,-80.9312
--94.4186,-80.9893
--94.4186,-80.9893
--95.4885,-80.9312
--95.4885,-80.9312
--96.5456,-80.7559
--96.5456,-80.7559
--95.4885,-80.9312
--95.4885,-80.9312
--96.5456,-80.7559
--96.5456,-80.7559
--97.577,-80.4656
--97.577,-80.4656
--96.5456,-80.7559
--96.5456,-80.7559
--97.577,-80.4656
--97.577,-80.4656
--98.5703,-80.0639
--98.5703,-80.0639
--97.577,-80.4656
--97.577,-80.4656
--98.5703,-80.0639
--98.5703,-80.0639
--99.5135,-79.5556
--99.5135,-79.5556
--98.5703,-80.0639
--98.5703,-80.0639
--99.5135,-79.5556
--99.5135,-79.5556
--100.395,-78.9468
--100.395,-78.9468
--99.5135,-79.5556
--99.5135,-79.5556
--100.395,-78.9468
--100.395,-78.9468
--101.201,-78.2368
--101.201,-78.2368
--100.395,-78.9468
--100.395,-78.9468
--101.201,-78.2368
--101.201,-78.2368
--101.884,-77.439
--101.884,-77.439
--101.201,-78.2368
--101.201,-78.2368
--101.884,-77.439
--101.884,-77.439
--102.449,-76.5537
--102.449,-76.5537
--101.884,-77.439
--101.884,-77.439
--102.449,-76.5537
--102.449,-76.5537
--102.885,-75.5981
--102.885,-75.5981
--102.449,-76.5537
--102.449,-76.5537
--102.885,-75.5981
--102.885,-75.5981
--103.184,-74.591
--103.184,-74.591
--102.885,-75.5981
--102.885,-75.5981
--103.184,-74.591
--103.184,-74.591
--103.339,-73.5522
--103.339,-73.5522
--103.184,-74.591
--103.184,-74.591
--103.339,-73.5522
--103.339,-73.5522
--103.365,-71.1289
--103.365,-71.1289
--103.339,-73.5522
--103.339,-73.5522
--103.365,-71.1289
--93.3752,-80.9886
--94.4186,-80.9893
--94.4159,-84.9893
--93.3752,-80.9886
--94.4159,-84.9893
--93.3725,-84.9886
--94.4186,-80.9893
--95.4885,-80.9312
--95.9249,-84.9073
--94.4186,-80.9893
--95.9249,-84.9073
--94.4159,-84.9893
--95.4885,-80.9312
--96.5456,-80.7559
--97.4158,-84.6601
--95.4885,-80.9312
--97.4158,-84.6601
--95.9249,-84.9073
--96.5456,-80.7559
--97.577,-80.4656
--98.8705,-84.2507
--96.5456,-80.7559
--98.8705,-84.2507
--97.4158,-84.6601
--97.577,-80.4656
--98.5703,-80.0639
--100.272,-83.6841
--97.577,-80.4656
--100.272,-83.6841
--98.8705,-84.2507
--98.5703,-80.0639
--99.5135,-79.5556
--101.602,-82.9671
--98.5703,-80.0639
--101.602,-82.9671
--100.272,-83.6841
--99.5135,-79.5556
--100.395,-78.9468
--102.845,-82.1084
--99.5135,-79.5556
--102.845,-82.1084
--101.602,-82.9671
--100.395,-78.9468
--101.201,-78.2368
--104.049,-81.045
--100.395,-78.9468
--104.049,-81.045
--102.845,-82.1084
--101.201,-78.2368
--101.884,-77.439
--105.096,-79.8222
--101.201,-78.2368
--105.096,-79.8222
--104.049,-81.045
--101.884,-77.439
--102.449,-76.5537
--105.963,-78.4653
--101.884,-77.439
--105.963,-78.4653
--105.096,-79.8222
--102.449,-76.5537
--102.885,-75.5981
--106.632,-77.0007
--102.449,-76.5537
--106.632,-77.0007
--105.963,-78.4653
--102.885,-75.5981
--103.184,-74.591
--107.089,-75.4572
--102.885,-75.5981
--107.089,-75.4572
--106.632,-77.0007
--103.184,-74.591
--103.339,-73.5522
--107.327,-73.8649
--103.184,-74.591
--107.327,-73.8649
--107.089,-75.4572
--103.339,-73.5522
--103.365,-71.1289
--107.365,-71.1353
--103.339,-73.5522
--107.365,-71.1353
--107.327,-73.8649
--93.3725,-84.9886
--94.4159,-84.9893
--94.4157,-85.2893
--93.3725,-84.9886
--94.4157,-85.2893
--93.3723,-85.2886
--94.4159,-84.9893
--95.9249,-84.9073
--95.9577,-85.2055
--94.4159,-84.9893
--95.9577,-85.2055
--94.4157,-85.2893
--95.9249,-84.9073
--97.4158,-84.6601
--97.4811,-84.9529
--95.9249,-84.9073
--97.4811,-84.9529
--95.9577,-85.2055
--97.4158,-84.6601
--98.8705,-84.2507
--98.9676,-84.5346
--97.4158,-84.6601
--98.9676,-84.5346
--97.4811,-84.9529
--98.8705,-84.2507
--100.272,-83.6841
--100.399,-83.9556
--98.8705,-84.2507
--100.399,-83.9556
--98.9676,-84.5346
--100.272,-83.6841
--101.602,-82.9671
--101.759,-83.223
--100.272,-83.6841
--101.759,-83.223
--100.399,-83.9556
--101.602,-82.9671
--102.845,-82.1084
--103.029,-82.3455
--101.602,-82.9671
--103.029,-82.3455
--101.759,-83.223
--102.845,-82.1084
--104.049,-81.045
--104.263,-81.2556
--102.845,-82.1084
--104.263,-81.2556
--103.029,-82.3455
--104.049,-81.045
--105.096,-79.8222
--105.337,-80.001
--104.049,-81.045
--105.337,-80.001
--104.263,-81.2556
--105.096,-79.8222
--105.963,-78.4653
--106.226,-78.6087
--105.096,-79.8222
--106.226,-78.6087
--105.337,-80.001
--105.963,-78.4653
--106.632,-77.0007
--106.912,-77.1059
--105.963,-78.4653
--106.912,-77.1059
--106.226,-78.6087
--106.632,-77.0007
--107.089,-75.4572
--107.382,-75.5222
--106.632,-77.0007
--107.382,-75.5222
--106.912,-77.1059
--107.089,-75.4572
--107.327,-73.8649
--107.626,-73.8884
--107.089,-75.4572
--107.626,-73.8884
--107.382,-75.5222
--107.327,-73.8649
--107.365,-71.1353
--107.665,-71.1358
--107.327,-73.8649
--107.665,-71.1358
--107.626,-73.8884
--93.3723,-85.2886
--94.4157,-85.2893
--94.413,-89.2893
--93.3723,-85.2886
--94.413,-89.2893
--93.3696,-89.2886
--94.4157,-85.2893
--95.9577,-85.2055
--96.3941,-89.1816
--94.4157,-85.2893
--96.3941,-89.1816
--94.413,-89.2893
--95.9577,-85.2055
--97.4811,-84.9529
--98.3513,-88.8571
--95.9577,-85.2055
--98.3513,-88.8571
--96.3941,-89.1816
--97.4811,-84.9529
--98.9676,-84.5346
--100.261,-88.3196
--97.4811,-84.9529
--100.261,-88.3196
--98.3513,-88.8571
--98.9676,-84.5346
--100.399,-83.9556
--102.1,-87.5758
--98.9676,-84.5346
--102.1,-87.5758
--100.261,-88.3196
--100.399,-83.9556
--101.759,-83.223
--103.847,-86.6345
--100.399,-83.9556
--103.847,-86.6345
--102.1,-87.5758
--101.759,-83.223
--103.029,-82.3455
--105.48,-85.5072
--101.759,-83.223
--105.48,-85.5072
--103.847,-86.6345
--103.029,-82.3455
--104.263,-81.2556
--107.111,-84.0638
--103.029,-82.3455
--107.111,-84.0638
--105.48,-85.5072
--104.263,-81.2556
--105.337,-80.001
--108.55,-82.3842
--104.263,-81.2556
--108.55,-82.3842
--107.111,-84.0638
--105.337,-80.001
--106.226,-78.6087
--109.74,-80.5203
--105.337,-80.001
--109.74,-80.5203
--108.55,-82.3842
--106.226,-78.6087
--106.912,-77.1059
--110.658,-78.5085
--106.226,-78.6087
--110.658,-78.5085
--109.74,-80.5203
--106.912,-77.1059
--107.382,-75.5222
--111.287,-76.3883
--106.912,-77.1059
--111.287,-76.3883
--110.658,-78.5085
--107.382,-75.5222
--107.626,-73.8884
--111.614,-74.2011
--107.382,-75.5222
--111.614,-74.2011
--111.287,-76.3883
--107.626,-73.8884
--107.665,-71.1358
--111.665,-71.1421
--107.626,-73.8884
--111.665,-71.1421
--111.614,-74.2011
--63.2952,34.0032
--61.6852,34.0025
--61.6852,34.0025
--63.2952,34.0032
--63.2952,34.0032
--61.6852,34.0025
--61.6852,34.0025
--53.8652,33.9989
--53.8652,33.9989
--61.6852,34.0025
--61.6852,34.0025
--53.8652,33.9989
--53.8652,33.9989
--47.4352,33.996
--47.4352,33.996
--53.8652,33.9989
--53.8652,33.9989
--47.4352,33.996
--47.4352,33.996
--45.2952,33.995
--45.2952,33.995
--47.4352,33.996
--47.4352,33.996
--45.2952,33.995
--63.2952,34.0032
--61.6852,34.0025
--61.6834,38.0025
--63.2952,34.0032
--61.6834,38.0025
--63.2934,38.0032
--61.6852,34.0025
--53.8652,33.9989
--53.8634,37.9989
--61.6852,34.0025
--53.8634,37.9989
--61.6834,38.0025
--53.8652,33.9989
--47.4352,33.996
--47.4334,37.996
--53.8652,33.9989
--47.4334,37.996
--53.8634,37.9989
--47.4352,33.996
--45.2952,33.995
--45.2934,37.995
--47.4352,33.996
--45.2934,37.995
--47.4334,37.996
--63.2934,38.0032
--61.6834,38.0025
--61.6832,38.3025
--63.2934,38.0032
--61.6832,38.3025
--63.2932,38.3032
--61.6834,38.0025
--53.8634,37.9989
--53.8632,38.2989
--61.6834,38.0025
--53.8632,38.2989
--61.6832,38.3025
--53.8634,37.9989
--47.4334,37.996
--47.4332,38.296
--53.8634,37.9989
--47.4332,38.296
--53.8632,38.2989
--47.4334,37.996
--45.2934,37.995
--45.2932,38.295
--47.4334,37.996
--45.2932,38.295
--47.4332,38.296
--63.2932,38.3032
--61.6832,38.3025
--61.6814,42.3025
--63.2932,38.3032
--61.6814,42.3025
--63.2914,42.3032
--61.6832,38.3025
--53.8632,38.2989
--53.8614,42.2989
--61.6832,38.3025
--53.8614,42.2989
--61.6814,42.3025
--53.8632,38.2989
--47.4332,38.296
--47.4314,42.296
--53.8632,38.2989
--47.4314,42.296
--53.8614,42.2989
--47.4332,38.296
--45.2932,38.295
--45.2914,42.295
--47.4332,38.296
--45.2914,42.295
--47.4314,42.296
--45.2974,29.695
--46.3006,29.8693
--46.2265,29.5786
--45.2974,29.695
--45.2972,29.995
--46.3006,29.8693
--46.2265,29.5786
--47.2417,29.4993
--47.098,29.236
--46.2265,29.5786
--46.3006,29.8693
--47.2417,29.4993
--47.098,29.236
--48.062,28.908
--47.8576,28.6884
--47.098,29.236
--47.2417,29.4993
--48.062,28.908
--47.8576,28.6884
--48.7544,28.1075
--48.519,27.9215
--47.8576,28.6884
--48.062,28.908
--48.7544,28.1075
--48.519,27.9215
--49.3434,27.2848
--49.0858,27.1309
--48.519,27.9215
--48.7544,28.1075
--49.3434,27.2848
--49.0858,27.1309
--49.7845,26.3681
--49.5036,26.2628
--49.0858,27.1309
--49.3434,27.2848
--49.7845,26.3681
--49.5036,26.2628
--50.0544,25.3872
--49.7592,25.3339
--49.5036,26.2628
--49.7845,26.3681
--50.0544,25.3872
--49.7592,25.3339
--50.1444,24.3817
--49.8444,24.3818
--49.7592,25.3339
--50.0544,25.3872
--50.1444,24.3817
--49.8444,24.3818
--50.1444,24.3617
--49.8444,24.3618
--49.8444,24.3818
--50.1444,24.3817
--50.1444,24.3617
--45.299,25.695
--46.2265,29.5786
--45.2385,25.7026
--45.299,25.695
--45.2974,29.695
--46.2265,29.5786
--45.2385,25.7026
--47.098,29.236
--45.1817,25.7249
--45.2385,25.7026
--46.2265,29.5786
--47.098,29.236
--45.1817,25.7249
--47.8576,28.6884
--45.1322,25.7606
--45.1817,25.7249
--47.098,29.236
--47.8576,28.6884
--45.1322,25.7606
--48.519,27.9215
--45.38,25.4422
--45.1322,25.7606
--47.8576,28.6884
--48.519,27.9215
--45.38,25.4422
--49.0858,27.1309
--45.652,25.0794
--45.38,25.4422
--48.519,27.9215
--49.0858,27.1309
--45.652,25.0794
--49.5036,26.2628
--45.7579,24.8592
--45.652,25.0794
--49.0858,27.1309
--49.5036,26.2628
--45.7579,24.8592
--49.7592,25.3339
--45.8228,24.6236
--45.7579,24.8592
--49.5036,26.2628
--49.7592,25.3339
--45.8228,24.6236
--49.8444,24.3818
--45.8444,24.3821
--45.8228,24.6236
--49.7592,25.3339
--49.8444,24.3818
--45.8444,24.3821
--49.8444,24.3618
--45.8444,24.3621
--45.8444,24.3821
--49.8444,24.3818
--49.8444,24.3618
--45.299,25.695
--45.2385,25.7026
--45.2385,25.7026
--45.299,25.695
--45.299,25.695
--45.2385,25.7026
--45.2385,25.7026
--45.1817,25.7249
--45.1817,25.7249
--45.2385,25.7026
--45.2385,25.7026
--45.1817,25.7249
--45.1817,25.7249
--45.1322,25.7606
--45.1322,25.7606
--45.1817,25.7249
--45.1817,25.7249
--45.1322,25.7606
--45.1322,25.7606
--45.38,25.4422
--45.38,25.4422
--45.1322,25.7606
--45.1322,25.7606
--45.38,25.4422
--45.38,25.4422
--45.652,25.0794
--45.652,25.0794
--45.38,25.4422
--45.38,25.4422
--45.652,25.0794
--45.652,25.0794
--45.7579,24.8592
--45.7579,24.8592
--45.652,25.0794
--45.652,25.0794
--45.7579,24.8592
--45.7579,24.8592
--45.8228,24.6236
--45.8228,24.6236
--45.7579,24.8592
--45.7579,24.8592
--45.8228,24.6236
--45.8228,24.6236
--45.8444,24.3821
--45.8444,24.3821
--45.8228,24.6236
--45.8228,24.6236
--45.8444,24.3821
--45.8444,24.3821
--45.8444,24.3621
--45.8444,24.3621
--45.8444,24.3821
--45.8444,24.3821
--45.8444,24.3621
--54.1444,24.3614
--50.1445,25.5017
--54.1445,25.5014
--54.1444,24.3614
--50.1444,24.3617
--50.1445,25.5017
--54.1445,25.5014
--50.1446,26.5808
--54.1446,26.5805
--54.1445,25.5014
--50.1445,25.5017
--50.1446,26.5808
--54.1446,26.5805
--50.1081,27.1414
--54.0744,27.6596
--54.1446,26.5805
--50.1446,26.5808
--50.1081,27.1414
--54.0744,27.6596
--49.9993,27.6926
--53.865,28.7206
--54.0744,27.6596
--50.1081,27.1414
--49.9993,27.6926
--53.865,28.7206
--49.82,28.225
--53.5197,29.7454
--53.865,28.7206
--49.9993,27.6926
--49.82,28.225
--53.5197,29.7454
--49.5731,28.7296
--53.0446,30.7169
--53.5197,29.7454
--49.82,28.225
--49.5731,28.7296
--53.0446,30.7169
--49.2629,29.198
--52.4475,31.6185
--53.0446,30.7169
--49.5731,28.7296
--49.2629,29.198
--52.4475,31.6185
--49.0213,29.4708
--51.7588,32.3872
--52.4475,31.6185
--49.2629,29.198
--49.0213,29.4708
--51.7588,32.3872
--48.7629,29.6749
--50.9676,33.0125
--51.7588,32.3872
--49.0213,29.4708
--48.7629,29.6749
--50.9676,33.0125
--48.4738,29.8324
--50.082,33.4949
--50.9676,33.0125
--48.7629,29.6749
--48.4738,29.8324
--50.082,33.4949
--48.1621,29.9388
--49.1276,33.8205
--50.082,33.4949
--48.4738,29.8324
--48.1621,29.9388
--49.1276,33.8205
--47.837,29.9908
--48.1318,33.9799
--49.1276,33.8205
--48.1621,29.9388
--47.837,29.9908
--48.1318,33.9799
--47.1271,29.9958
--47.1252,33.9958
--48.1318,33.9799
--47.837,29.9908
--47.1271,29.9958
--47.1252,33.9958
--45.2971,29.995
--45.2952,33.995
--47.1252,33.9958
--47.1271,29.9958
--45.2971,29.995
--54.1444,24.3614
--54.1445,25.5014
--54.1445,25.5014
--54.1444,24.3614
--54.1444,24.3614
--54.1445,25.5014
--54.1445,25.5014
--54.1446,26.5805
--54.1446,26.5805
--54.1445,25.5014
--54.1445,25.5014
--54.1446,26.5805
--54.1446,26.5805
--54.0744,27.6596
--54.0744,27.6596
--54.1446,26.5805
--54.1446,26.5805
--54.0744,27.6596
--54.0744,27.6596
--53.865,28.7206
--53.865,28.7206
--54.0744,27.6596
--54.0744,27.6596
--53.865,28.7206
--53.865,28.7206
--53.5197,29.7454
--53.5197,29.7454
--53.865,28.7206
--53.865,28.7206
--53.5197,29.7454
--53.5197,29.7454
--53.0446,30.7169
--53.0446,30.7169
--53.5197,29.7454
--53.5197,29.7454
--53.0446,30.7169
--53.0446,30.7169
--52.4475,31.6185
--52.4475,31.6185
--53.0446,30.7169
--53.0446,30.7169
--52.4475,31.6185
--52.4475,31.6185
--51.7588,32.3872
--51.7588,32.3872
--52.4475,31.6185
--52.4475,31.6185
--51.7588,32.3872
--51.7588,32.3872
--50.9676,33.0125
--50.9676,33.0125
--51.7588,32.3872
--51.7588,32.3872
--50.9676,33.0125
--50.9676,33.0125
--50.082,33.4949
--50.082,33.4949
--50.9676,33.0125
--50.9676,33.0125
--50.082,33.4949
--50.082,33.4949
--49.1276,33.8205
--49.1276,33.8205
--50.082,33.4949
--50.082,33.4949
--49.1276,33.8205
--49.1276,33.8205
--48.1318,33.9799
--48.1318,33.9799
--49.1276,33.8205
--49.1276,33.8205
--48.1318,33.9799
--48.1318,33.9799
--47.1252,33.9958
--47.1252,33.9958
--48.1318,33.9799
--48.1318,33.9799
--47.1252,33.9958
--47.1252,33.9958
--45.2952,33.995
--45.2952,33.995
--47.1252,33.9958
--47.1252,33.9958
--45.2952,33.995
--54.1444,24.3614
--54.1445,25.5014
--54.1445,25.5014
--54.1444,24.3614
--54.1444,24.3614
--54.1445,25.5014
--54.1445,25.5014
--54.1374,26.5257
--54.1374,26.5257
--54.1445,25.5014
--54.1445,25.5014
--54.1374,26.5257
--54.1374,26.5257
--54.0305,27.5925
--54.0305,27.5925
--54.1374,26.5257
--54.1374,26.5257
--54.0305,27.5925
--54.0305,27.5925
--53.7966,28.6388
--53.7966,28.6388
--54.0305,27.5925
--54.0305,27.5925
--53.7966,28.6388
--53.7966,28.6388
--53.4391,29.6496
--53.4391,29.6496
--53.7966,28.6388
--53.7966,28.6388
--53.4391,29.6496
--53.4391,29.6496
--52.9632,30.6103
--52.9632,30.6103
--53.4391,29.6496
--53.4391,29.6496
--52.9632,30.6103
--52.9632,30.6103
--52.3758,31.5072
--52.3758,31.5072
--52.9632,30.6103
--52.9632,30.6103
--52.3758,31.5072
--52.3758,31.5072
--51.7014,32.2784
--51.7014,32.2784
--52.3758,31.5072
--52.3758,31.5072
--51.7014,32.2784
--51.7014,32.2784
--50.8972,32.9336
--50.8972,32.9336
--51.7014,32.2784
--51.7014,32.2784
--50.8972,32.9336
--50.8972,32.9336
--49.9938,33.4433
--49.9938,33.4433
--50.8972,32.9336
--50.8972,32.9336
--49.9938,33.4433
--49.9938,33.4433
--49.0172,33.7928
--49.0172,33.7928
--49.9938,33.4433
--49.9938,33.4433
--49.0172,33.7928
--49.0172,33.7928
--47.9955,33.972
--47.9955,33.972
--49.0172,33.7928
--49.0172,33.7928
--47.9955,33.972
--47.9955,33.972
--46.9652,33.9958
--46.9652,33.9958
--47.9955,33.972
--47.9955,33.972
--46.9652,33.9958
--46.9652,33.9958
--45.2952,33.995
--45.2952,33.995
--46.9652,33.9958
--46.9652,33.9958
--45.2952,33.995
--54.1444,24.3614
--54.1445,25.5014
--58.1445,25.501
--54.1444,24.3614
--58.1445,25.501
--58.1444,24.361
--54.1445,25.5014
--54.1374,26.5257
--58.1342,26.6853
--54.1445,25.5014
--58.1342,26.6853
--58.1445,25.501
--54.1374,26.5257
--54.0305,27.5925
--57.9794,28.2294
--54.1374,26.5257
--57.9794,28.2294
--58.1342,26.6853
--54.0305,27.5925
--53.7966,28.6388
--57.6409,29.7439
--54.0305,27.5925
--57.6409,29.7439
--57.9794,28.2294
--53.7966,28.6388
--53.4391,29.6496
--57.1235,31.207
--53.7966,28.6388
--57.1235,31.207
--57.6409,29.7439
--53.4391,29.6496
--52.9632,30.6103
--56.4347,32.5976
--53.4391,29.6496
--56.4347,32.5976
--57.1235,31.207
--52.9632,30.6103
--52.3758,31.5072
--55.5844,33.8957
--52.9632,30.6103
--55.5844,33.8957
--56.4347,32.5976
--52.3758,31.5072
--51.7014,32.2784
--54.4821,35.1538
--52.3758,31.5072
--54.4821,35.1538
--55.5844,33.8957
--51.7014,32.2784
--50.8972,32.9336
--53.1514,36.238
--51.7014,32.2784
--53.1514,36.238
--54.4821,35.1538
--50.8972,32.9336
--49.9938,33.4433
--51.6564,37.0814
--50.8972,32.9336
--51.6564,37.0814
--53.1514,36.238
--49.9938,33.4433
--49.0172,33.7928
--50.0403,37.6597
--49.9938,33.4433
--50.0403,37.6597
--51.6564,37.0814
--49.0172,33.7928
--47.9955,33.972
--48.3497,37.9563
--49.0172,33.7928
--48.3497,37.9563
--50.0403,37.6597
--47.9955,33.972
--46.9652,33.9958
--46.9634,37.9958
--47.9955,33.972
--46.9634,37.9958
--48.3497,37.9563
--46.9652,33.9958
--45.2952,33.995
--45.2934,37.995
--46.9652,33.9958
--45.2934,37.995
--46.9634,37.9958
--63.299,25.7032
--63.2952,25.7028
--63.2952,25.7028
--63.299,25.7032
--63.299,25.7032
--63.2952,25.7028
--63.2952,25.7028
--63.2917,25.7014
--63.2917,25.7014
--63.2952,25.7028
--63.2952,25.7028
--63.2917,25.7014
--63.2917,25.7014
--63.2885,25.6993
--63.2885,25.6993
--63.2917,25.7014
--63.2917,25.7014
--63.2885,25.6993
--63.2885,25.6993
--62.6836,25.0016
--62.6836,25.0016
--63.2885,25.6993
--63.2885,25.6993
--62.6836,25.0016
--62.6836,25.0016
--62.5758,24.8504
--62.5758,24.8504
--62.6836,25.0016
--62.6836,25.0016
--62.5758,24.8504
--62.5758,24.8504
--62.4985,24.6816
--62.4985,24.6816
--62.5758,24.8504
--62.5758,24.8504
--62.4985,24.6816
--62.4985,24.6816
--62.4545,24.5012
--62.4545,24.5012
--62.4985,24.6816
--62.4985,24.6816
--62.4545,24.5012
--62.4545,24.5012
--62.4444,24.3607
--62.4444,24.3607
--62.4545,24.5012
--62.4545,24.5012
--62.4444,24.3607
--63.299,25.7032
--63.2952,25.7028
--62.3426,29.5877
--63.299,25.7032
--62.3426,29.5877
--63.2972,29.7032
--63.2952,25.7028
--63.2917,25.7014
--61.4429,29.2486
--63.2952,25.7028
--61.4429,29.2486
--62.3426,29.5877
--63.2917,25.7014
--63.2885,25.6993
--60.6496,28.7053
--63.2917,25.7014
--60.6496,28.7053
--61.4429,29.2486
--63.2885,25.6993
--62.6836,25.0016
--59.6611,27.6218
--63.2885,25.6993
--59.6611,27.6218
--60.6496,28.7053
--62.6836,25.0016
--62.5758,24.8504
--59.1129,26.8526
--62.6836,25.0016
--59.1129,26.8526
--59.6611,27.6218
--62.5758,24.8504
--62.4985,24.6816
--58.7199,25.9937
--62.5758,24.8504
--58.7199,25.9937
--59.1129,26.8526
--62.4985,24.6816
--62.4545,24.5012
--58.4961,25.0761
--62.4985,24.6816
--58.4961,25.0761
--58.7199,25.9937
--62.4545,24.5012
--62.4444,24.3607
--58.4444,24.3612
--62.4545,24.5012
--58.4444,24.3612
--58.4961,25.0761
--63.2972,29.7032
--62.3426,29.5877
--62.2712,29.8791
--63.2972,29.7032
--62.2712,29.8791
--63.2971,30.0032
--62.3426,29.5877
--61.4429,29.2486
--61.3043,29.5146
--62.3426,29.5877
--61.3043,29.5146
--62.2712,29.8791
--61.4429,29.2486
--60.6496,28.7053
--60.4517,28.9308
--61.4429,29.2486
--60.4517,28.9308
--61.3043,29.5146
--60.6496,28.7053
--59.6611,27.6218
--59.4344,27.8183
--60.6496,28.7053
--59.4344,27.8183
--60.4517,28.9308
--59.6611,27.6218
--59.1129,26.8526
--58.8532,27.0027
--59.6611,27.6218
--58.8532,27.0027
--59.4344,27.8183
--59.1129,26.8526
--58.7199,25.9937
--58.4365,26.0921
--59.1129,26.8526
--58.4365,26.0921
--58.8532,27.0027
--58.7199,25.9937
--58.4961,25.0761
--58.1992,25.1192
--58.7199,25.9937
--58.1992,25.1192
--58.4365,26.0921
--58.4961,25.0761
--58.4444,24.3612
--58.1444,24.3612
--58.4961,25.0761
--58.1444,24.3612
--58.1992,25.1192
--63.2952,34.0032
--61.6871,30.0025
--61.6852,34.0025
--63.2952,34.0032
--63.2971,30.0032
--61.6871,30.0025
--61.6852,34.0025
--60.9778,29.9933
--60.6563,33.9803
--61.6852,34.0025
--61.6871,30.0025
--60.9778,29.9933
--60.6563,33.9803
--60.5645,29.9285
--59.6508,33.8227
--60.6563,33.9803
--60.9778,29.9933
--60.5645,29.9285
--59.6508,33.8227
--60.1655,29.8027
--58.6801,33.5166
--59.6508,33.8227
--60.5645,29.9285
--60.1655,29.8027
--58.6801,33.5166
--59.7898,29.6186
--57.766,33.0689
--58.6801,33.5166
--60.1655,29.8027
--59.7898,29.6186
--57.766,33.0689
--59.4458,29.3805
--56.9292,32.4896
--57.766,33.0689
--59.7898,29.6186
--59.4458,29.3805
--56.9292,32.4896
--59.1412,29.0937
--56.1882,31.7918
--56.9292,32.4896
--59.4458,29.3805
--59.1412,29.0937
--56.1882,31.7918
--58.8236,28.6946
--55.5346,30.9711
--56.1882,31.7918
--59.1412,29.0937
--58.8236,28.6946
--55.5346,30.9711
--58.5683,28.269
--55.0119,30.0999
--55.5346,30.9711
--58.8236,28.6946
--58.5683,28.269
--55.0119,30.0999
--58.3702,27.814
--54.6065,29.1683
--55.0119,30.0999
--58.5683,28.269
--58.3702,27.814
--54.6065,29.1683
--58.2329,27.337
--54.3253,28.1921
--54.6065,29.1683
--58.3702,27.814
--58.2329,27.337
--54.3253,28.1921
--58.1585,26.8463
--54.1731,27.1876
--54.3253,28.1921
--58.2329,27.337
--58.1585,26.8463
--54.1731,27.1876
--58.1444,24.991
--54.1444,24.9914
--54.1731,27.1876
--58.1585,26.8463
--58.1444,24.991
--54.1444,24.9914
--58.1444,24.361
--54.1444,24.3614
--54.1444,24.9914
--58.1444,24.991
--58.1444,24.361
--63.2952,34.0032
--61.6852,34.0025
--61.6852,34.0025
--63.2952,34.0032
--63.2952,34.0032
--61.6852,34.0025
--61.6852,34.0025
--60.6563,33.9803
--60.6563,33.9803
--61.6852,34.0025
--61.6852,34.0025
--60.6563,33.9803
--60.6563,33.9803
--59.6508,33.8227
--59.6508,33.8227
--60.6563,33.9803
--60.6563,33.9803
--59.6508,33.8227
--59.6508,33.8227
--58.6801,33.5166
--58.6801,33.5166
--59.6508,33.8227
--59.6508,33.8227
--58.6801,33.5166
--58.6801,33.5166
--57.766,33.0689
--57.766,33.0689
--58.6801,33.5166
--58.6801,33.5166
--57.766,33.0689
--57.766,33.0689
--56.9292,32.4896
--56.9292,32.4896
--57.766,33.0689
--57.766,33.0689
--56.9292,32.4896
--56.9292,32.4896
--56.1882,31.7918
--56.1882,31.7918
--56.9292,32.4896
--56.9292,32.4896
--56.1882,31.7918
--56.1882,31.7918
--55.5346,30.9711
--55.5346,30.9711
--56.1882,31.7918
--56.1882,31.7918
--55.5346,30.9711
--55.5346,30.9711
--55.0119,30.0999
--55.0119,30.0999
--55.5346,30.9711
--55.5346,30.9711
--55.0119,30.0999
--55.0119,30.0999
--54.6065,29.1683
--54.6065,29.1683
--55.0119,30.0999
--55.0119,30.0999
--54.6065,29.1683
--54.6065,29.1683
--54.3253,28.1921
--54.3253,28.1921
--54.6065,29.1683
--54.6065,29.1683
--54.3253,28.1921
--54.3253,28.1921
--54.1731,27.1876
--54.1731,27.1876
--54.3253,28.1921
--54.3253,28.1921
--54.1731,27.1876
--54.1731,27.1876
--54.1444,24.9914
--54.1444,24.9914
--54.1731,27.1876
--54.1731,27.1876
--54.1444,24.9914
--54.1444,24.9914
--54.1444,24.3614
--54.1444,24.3614
--54.1444,24.9914
--54.1444,24.9914
--54.1444,24.3614
--54.1444,24.3614
--50.1445,25.5017
--54.1445,25.5014
--54.1444,24.3614
--50.1444,24.3617
--50.1445,25.5017
--54.1445,25.5014
--50.1974,26.932
--54.1812,26.5721
--54.1445,25.5014
--50.1445,25.5017
--50.1974,26.932
--54.1812,26.5721
--50.4315,28.4799
--54.3436,27.6458
--54.1812,26.5721
--50.1974,26.932
--50.4315,28.4799
--54.3436,27.6458
--50.8492,29.9888
--54.6333,28.6923
--54.3436,27.6458
--50.4315,28.4799
--50.8492,29.9888
--54.6333,28.6923
--51.4446,31.4367
--55.0462,29.6966
--54.6333,28.6923
--50.8492,29.9888
--51.4446,31.4367
--55.0462,29.6966
--52.209,32.803
--55.5764,30.6442
--55.0462,29.6966
--51.4446,31.4367
--52.209,32.803
--55.5764,30.6442
--53.1034,34.0339
--56.1968,31.4979
--55.5764,30.6442
--52.209,32.803
--53.1034,34.0339
--56.1968,31.4979
--54.2248,35.2098
--56.9045,32.24
--56.1968,31.4979
--53.1034,34.0339
--54.2248,35.2098
--56.9045,32.24
--55.5094,36.2048
--57.7152,32.868
--56.9045,32.24
--54.2248,35.2098
--55.5094,36.2048
--57.7152,32.868
--56.9282,36.9968
--58.6106,33.3678
--57.7152,32.868
--55.5094,36.2048
--56.9282,36.9968
--58.6106,33.3678
--58.4495,37.5678
--59.5706,33.7281
--58.6106,33.3678
--56.9282,36.9968
--58.4495,37.5678
--59.5706,33.7281
--60.039,37.9051
--60.5737,33.941
--59.5706,33.7281
--58.4495,37.5678
--60.039,37.9051
--60.5737,33.941
--61.5834,38.0025
--61.5852,34.0025
--60.5737,33.941
--60.039,37.9051
--61.5834,38.0025
--61.5852,34.0025
--63.2934,38.0032
--63.2952,34.0032
--61.5852,34.0025
--61.5834,38.0025
--63.2934,38.0032
--54.1444,24.3614
--54.1445,25.5014
--54.1445,25.5014
--54.1444,24.3614
--54.1444,24.3614
--54.1445,25.5014
--54.1445,25.5014
--54.1812,26.5721
--54.1812,26.5721
--54.1445,25.5014
--54.1445,25.5014
--54.1812,26.5721
--54.1812,26.5721
--54.3436,27.6458
--54.3436,27.6458
--54.1812,26.5721
--54.1812,26.5721
--54.3436,27.6458
--54.3436,27.6458
--54.6333,28.6923
--54.6333,28.6923
--54.3436,27.6458
--54.3436,27.6458
--54.6333,28.6923
--54.6333,28.6923
--55.0462,29.6966
--55.0462,29.6966
--54.6333,28.6923
--54.6333,28.6923
--55.0462,29.6966
--55.0462,29.6966
--55.5764,30.6442
--55.5764,30.6442
--55.0462,29.6966
--55.0462,29.6966
--55.5764,30.6442
--55.5764,30.6442
--56.1968,31.4979
--56.1968,31.4979
--55.5764,30.6442
--55.5764,30.6442
--56.1968,31.4979
--56.1968,31.4979
--56.9045,32.24
--56.9045,32.24
--56.1968,31.4979
--56.1968,31.4979
--56.9045,32.24
--56.9045,32.24
--57.7152,32.868
--57.7152,32.868
--56.9045,32.24
--56.9045,32.24
--57.7152,32.868
--57.7152,32.868
--58.6106,33.3678
--58.6106,33.3678
--57.7152,32.868
--57.7152,32.868
--58.6106,33.3678
--58.6106,33.3678
--59.5706,33.7281
--59.5706,33.7281
--58.6106,33.3678
--58.6106,33.3678
--59.5706,33.7281
--59.5706,33.7281
--60.5737,33.941
--60.5737,33.941
--59.5706,33.7281
--59.5706,33.7281
--60.5737,33.941
--60.5737,33.941
--61.5852,34.0025
--61.5852,34.0025
--60.5737,33.941
--60.5737,33.941
--61.5852,34.0025
--61.5852,34.0025
--63.2952,34.0032
--63.2952,34.0032
--61.5852,34.0025
--61.5852,34.0025
--63.2952,34.0032
-85.389,42.4795
-85.3941,42.5197
-85.3941,42.5197
-85.389,42.4795
-85.389,42.4795
-85.3941,42.5197
-85.3941,42.5197
-85.4089,42.5575
-85.4089,42.5575
-85.3941,42.5197
-85.3941,42.5197
-85.4089,42.5575
-85.4089,42.5575
-85.4326,42.5904
-85.4326,42.5904
-85.4089,42.5575
-85.4089,42.5575
-85.4326,42.5904
-85.4326,42.5904
-85.2739,42.4658
-85.2739,42.4658
-85.4326,42.5904
-85.4326,42.5904
-85.2739,42.4658
-85.2739,42.4658
-85.0734,42.3487
-85.0734,42.3487
-85.2739,42.4658
-85.2739,42.4658
-85.0734,42.3487
-85.0734,42.3487
-84.8543,42.2716
-84.8543,42.2716
-85.0734,42.3487
-85.0734,42.3487
-84.8543,42.2716
-84.8543,42.2716
-84.6247,42.2372
-84.6247,42.2372
-84.8543,42.2716
-84.8543,42.2716
-84.6247,42.2372
-84.6247,42.2372
-84.5486,42.2355
-84.5486,42.2355
-84.6247,42.2372
-84.6247,42.2372
-84.5486,42.2355
-85.389,42.4795
-85.3941,42.5197
-89.27,41.531
-85.389,42.4795
-89.27,41.531
-89.389,42.4804
-85.3941,42.5197
-85.4089,42.5575
-88.9197,40.6406
-85.3941,42.5197
-88.9197,40.6406
-89.27,41.531
-85.4089,42.5575
-85.4326,42.5904
-88.36,39.8645
-85.4089,42.5575
-88.36,39.8645
-88.9197,40.6406
-85.4326,42.5904
-85.2739,42.4658
-87.6097,39.2187
-85.4326,42.5904
-87.6097,39.2187
-88.36,39.8645
-85.2739,42.4658
-85.0734,42.3487
-86.7539,38.7189
-85.2739,42.4658
-86.7539,38.7189
-87.6097,39.2187
-85.0734,42.3487
-84.8543,42.2716
-85.8191,38.3897
-85.0734,42.3487
-85.8191,38.3897
-86.7539,38.7189
-84.8543,42.2716
-84.6247,42.2372
-84.839,38.243
-84.8543,42.2716
-84.839,38.243
-85.8191,38.3897
-84.6247,42.2372
-84.5486,42.2355
-84.5467,38.2355
-84.6247,42.2372
-84.5467,38.2355
-84.839,38.243
-89.389,42.4804
-89.27,41.531
-89.5607,41.4568
-89.389,42.4804
-89.5607,41.4568
-89.689,42.4805
-89.27,41.531
-88.9197,40.6406
-89.183,40.4968
-89.27,41.531
-89.183,40.4968
-89.5607,41.4568
-88.9197,40.6406
-88.36,39.8645
-88.5796,39.66
-88.9197,40.6406
-88.5796,39.66
-89.183,40.4968
-88.36,39.8645
-87.6097,39.2187
-87.7849,38.9752
-88.36,39.8645
-87.7849,38.9752
-88.5796,39.66
-87.6097,39.2187
-86.7539,38.7189
-86.8799,38.4466
-87.6097,39.2187
-86.8799,38.4466
-87.7849,38.9752
-86.7539,38.7189
-85.8191,38.3897
-85.8914,38.0985
-86.7539,38.7189
-85.8914,38.0985
-86.8799,38.4466
-85.8191,38.3897
-84.839,38.243
-84.855,37.9434
-85.8191,38.3897
-84.855,37.9434
-85.8914,38.0985
-84.839,38.243
-84.5467,38.2355
-84.5466,37.9355
-84.839,38.243
-84.5466,37.9355
-84.855,37.9434
-84.5448,33.9355
-85.5948,33.935
-85.5948,33.935
-84.5448,33.9355
-84.5448,33.9355
-85.5948,33.935
-85.5948,33.935
-87.9405,33.9339
-87.9405,33.9339
-85.5948,33.935
-85.5948,33.935
-87.9405,33.9339
-87.9405,33.9339
-88.9501,34.0144
-88.9501,34.0144
-87.9405,33.9339
-87.9405,33.9339
-88.9501,34.0144
-88.9501,34.0144
-89.934,34.2547
-89.934,34.2547
-88.9501,34.0144
-88.9501,34.0144
-89.934,34.2547
-89.934,34.2547
-90.8559,34.6429
-90.8559,34.6429
-89.934,34.2547
-89.934,34.2547
-90.8559,34.6429
-90.8559,34.6429
-91.7255,35.1863
-91.7255,35.1863
-90.8559,34.6429
-90.8559,34.6429
-91.7255,35.1863
-91.7255,35.1863
-92.4894,35.878
-92.4894,35.878
-91.7255,35.1863
-91.7255,35.1863
-92.4894,35.878
-92.4894,35.878
-93.0919,36.7256
-93.0919,36.7256
-92.4894,35.878
-92.4894,35.878
-93.0919,36.7256
-93.0919,36.7256
-93.4948,37.6843
-93.4948,37.6843
-93.0919,36.7256
-93.0919,36.7256
-93.4948,37.6843
-93.4948,37.6843
-93.6789,38.7078
-93.6789,38.7078
-93.4948,37.6843
-93.4948,37.6843
-93.6789,38.7078
-93.6789,38.7078
-93.6896,40.1914
-93.6896,40.1914
-93.6789,38.7078
-93.6789,38.7078
-93.6896,40.1914
-93.6896,40.1914
-93.6893,41.2314
-93.6893,41.2314
-93.6896,40.1914
-93.6896,40.1914
-93.6893,41.2314
-93.6893,41.2314
-93.689,42.4814
-93.689,42.4814
-93.6893,41.2314
-93.6893,41.2314
-93.689,42.4814
-84.5448,33.9355
-85.5948,33.935
-85.5966,37.935
-84.5448,33.9355
-85.5966,37.935
-84.5466,37.9355
-85.5948,33.935
-87.9405,33.9339
-87.9423,37.9339
-85.5948,33.935
-87.9423,37.9339
-85.5966,37.935
-87.9405,33.9339
-88.9501,34.0144
-88.3147,37.9636
-87.9405,33.9339
-88.3147,37.9636
-87.9423,37.9339
-88.9501,34.0144
-89.934,34.2547
-88.6775,38.0522
-88.9501,34.0144
-88.6775,38.0522
-88.3147,37.9636
-89.934,34.2547
-90.8559,34.6429
-89.0175,38.1954
-89.934,34.2547
-89.0175,38.1954
-88.6775,38.0522
-90.8559,34.6429
-91.7255,35.1863
-89.3382,38.3958
-90.8559,34.6429
-89.3382,38.3958
-89.0175,38.1954
-91.7255,35.1863
-92.4894,35.878
-89.5032,38.5393
-91.7255,35.1863
-89.5032,38.5393
-89.3382,38.3958
-92.4894,35.878
-93.0919,36.7256
-89.5968,38.6711
-92.4894,35.878
-89.5968,38.6711
-89.5032,38.5393
-93.0919,36.7256
-93.4948,37.6843
-89.6595,38.8202
-93.0919,36.7256
-89.6595,38.8202
-89.5968,38.6711
-93.4948,37.6843
-93.6789,38.7078
-89.6881,38.9793
-93.4948,37.6843
-89.6881,38.9793
-89.6595,38.8202
-93.6789,38.7078
-93.6896,40.1914
-89.6896,40.1905
-93.6789,38.7078
-89.6896,40.1905
-89.6881,38.9793
-93.6896,40.1914
-93.6893,41.2314
-89.6893,41.2305
-93.6896,40.1914
-89.6893,41.2305
-89.6896,40.1905
-93.6893,41.2314
-93.689,42.4814
-89.689,42.4805
-93.6893,41.2314
-89.689,42.4805
-89.6893,41.2305
-84.5448,33.9355
-85.5929,29.935
-85.5948,33.935
-84.5448,33.9355
-84.5429,29.9355
-85.5929,29.935
-85.5948,33.935
-87.5377,29.9341
-87.5395,33.9341
-85.5948,33.935
-85.5929,29.935
-87.5377,29.9341
-87.5395,33.9341
-89.0142,30.0221
-88.5371,33.9936
-87.5395,33.9341
-87.5377,29.9341
-89.0142,30.0221
-88.5371,33.9936
-90.4695,30.2863
-89.5205,34.172
-88.5371,33.9936
-89.0142,30.0221
-90.4695,30.2863
-89.5205,34.172
-91.8828,30.7227
-90.4754,34.467
-89.5205,34.172
-90.4695,30.2863
-91.8828,30.7227
-90.4754,34.467
-93.2336,31.3252
-91.3881,34.874
-90.4754,34.467
-91.8828,30.7227
-93.2336,31.3252
-91.3881,34.874
-94.7978,32.3381
-92.2575,35.4279
-91.3881,34.874
-93.2336,31.3252
-94.7978,32.3381
-92.2575,35.4279
-96.1904,33.821
-92.9472,36.1624
-92.2575,35.4279
-94.7978,32.3381
-96.1904,33.821
-92.9472,36.1624
-97.1744,35.6483
-93.4346,37.0674
-92.9472,36.1624
-96.1904,33.821
-97.1744,35.6483
-93.4346,37.0674
-97.6482,37.6477
-93.6693,38.0577
-93.4346,37.0674
-97.1744,35.6483
-97.6482,37.6477
-93.6693,38.0577
-97.6897,39.5023
-93.6897,39.5014
-93.6693,38.0577
-97.6482,37.6477
-97.6897,39.5023
-93.6897,39.5014
-97.6894,40.9523
-93.6894,40.9514
-93.6897,39.5014
-97.6897,39.5023
-97.6894,40.9523
-93.6894,40.9514
-97.689,42.4823
-93.689,42.4814
-93.6894,40.9514
-97.6894,40.9523
-97.689,42.4823
-84.5448,33.9355
-85.5948,33.935
-85.5948,33.935
-84.5448,33.9355
-84.5448,33.9355
-85.5948,33.935
-85.5948,33.935
-87.5395,33.9341
-87.5395,33.9341
-85.5948,33.935
-85.5948,33.935
-87.5395,33.9341
-87.5395,33.9341
-88.5371,33.9936
-88.5371,33.9936
-87.5395,33.9341
-87.5395,33.9341
-88.5371,33.9936
-88.5371,33.9936
-89.5205,34.172
-89.5205,34.172
-88.5371,33.9936
-88.5371,33.9936
-89.5205,34.172
-89.5205,34.172
-90.4754,34.467
-90.4754,34.467
-89.5205,34.172
-89.5205,34.172
-90.4754,34.467
-90.4754,34.467
-91.3881,34.874
-91.3881,34.874
-90.4754,34.467
-90.4754,34.467
-91.3881,34.874
-91.3881,34.874
-92.2575,35.4279
-92.2575,35.4279
-91.3881,34.874
-91.3881,34.874
-92.2575,35.4279
-92.2575,35.4279
-92.9472,36.1624
-92.9472,36.1624
-92.2575,35.4279
-92.2575,35.4279
-92.9472,36.1624
-92.9472,36.1624
-93.4346,37.0674
-93.4346,37.0674
-92.9472,36.1624
-92.9472,36.1624
-93.4346,37.0674
-93.4346,37.0674
-93.6693,38.0577
-93.6693,38.0577
-93.4346,37.0674
-93.4346,37.0674
-93.6693,38.0577
-93.6693,38.0577
-93.6897,39.5014
-93.6897,39.5014
-93.6693,38.0577
-93.6693,38.0577
-93.6897,39.5014
-93.6897,39.5014
-93.6894,40.9514
-93.6894,40.9514
-93.6897,39.5014
-93.6897,39.5014
-93.6894,40.9514
-93.6894,40.9514
-93.689,42.4814
-93.689,42.4814
-93.6894,40.9514
-93.6894,40.9514
-93.689,42.4814
-97.9931,24.4824
-101.993,26.2033
-97.9927,26.2024
-97.9931,24.4824
-101.993,24.4833
-101.993,26.2033
-97.9927,26.2024
-101.991,31.7508
-97.9915,31.7499
-97.9927,26.2024
-101.993,26.2033
-101.991,31.7508
-97.9915,31.7499
-101.991,33.6933
-97.991,33.6924
-97.9915,31.7499
-101.991,31.7508
-101.991,33.6933
-97.991,33.6924
-101.99,39.5033
-97.9897,39.5024
-97.991,33.6924
-101.991,33.6933
-101.99,39.5033
-97.9897,39.5024
-101.989,40.9533
-97.9894,40.9524
-97.9897,39.5024
-101.99,39.5033
-101.989,40.9533
-97.9894,40.9524
-101.989,42.4833
-97.989,42.4824
-97.9894,40.9524
-101.989,40.9533
-101.989,42.4833
-97.6931,24.4823
-97.9927,26.2024
-97.6927,26.2023
-97.6931,24.4823
-97.9931,24.4824
-97.9927,26.2024
-97.6927,26.2023
-97.9915,31.7499
-97.6915,31.7498
-97.6927,26.2023
-97.9927,26.2024
-97.9915,31.7499
-97.6915,31.7498
-97.991,33.6924
-97.691,33.6923
-97.6915,31.7498
-97.9915,31.7499
-97.991,33.6924
-97.691,33.6923
-97.9897,39.5024
-97.6897,39.5023
-97.691,33.6923
-97.991,33.6924
-97.9897,39.5024
-97.6897,39.5023
-97.9894,40.9524
-97.6894,40.9523
-97.6897,39.5023
-97.9897,39.5024
-97.9894,40.9524
-97.6894,40.9523
-97.989,42.4824
-97.689,42.4823
-97.6894,40.9523
-97.9894,40.9524
-97.989,42.4824
-93.6931,24.4814
-97.6927,26.2023
-93.6927,26.2014
-93.6931,24.4814
-97.6931,24.4823
-97.6927,26.2023
-93.6927,26.2014
-97.6915,31.7498
-93.6915,31.7489
-93.6927,26.2014
-97.6927,26.2023
-97.6915,31.7498
-93.6915,31.7489
-97.691,33.6923
-93.691,33.6914
-93.6915,31.7489
-97.6915,31.7498
-97.691,33.6923
-93.691,33.6914
-97.6897,39.5023
-93.6897,39.5014
-93.691,33.6914
-97.691,33.6923
-97.6897,39.5023
-93.6897,39.5014
-97.6894,40.9523
-93.6894,40.9514
-93.6897,39.5014
-97.6897,39.5023
-97.6894,40.9523
-93.6894,40.9514
-97.689,42.4823
-93.689,42.4814
-93.6894,40.9514
-97.6894,40.9523
-97.689,42.4823
-93.6931,24.4814
-93.6927,26.2014
-93.6927,26.2014
-93.6931,24.4814
-93.6931,24.4814
-93.6927,26.2014
-93.6927,26.2014
-93.6915,31.7489
-93.6915,31.7489
-93.6927,26.2014
-93.6927,26.2014
-93.6915,31.7489
-93.6915,31.7489
-93.691,33.6914
-93.691,33.6914
-93.6915,31.7489
-93.6915,31.7489
-93.691,33.6914
-93.691,33.6914
-93.6897,39.5014
-93.6897,39.5014
-93.691,33.6914
-93.691,33.6914
-93.6897,39.5014
-93.6897,39.5014
-93.6894,40.9514
-93.6894,40.9514
-93.6897,39.5014
-93.6897,39.5014
-93.6894,40.9514
-93.6894,40.9514
-93.689,42.4814
-93.689,42.4814
-93.6894,40.9514
-93.6894,40.9514
-93.689,42.4814
-93.6931,24.4814
-93.6927,26.2014
-93.6927,26.2014
-93.6931,24.4814
-93.6931,24.4814
-93.6927,26.2014
-93.6927,26.2014
-93.6915,31.7489
-93.6915,31.7489
-93.6927,26.2014
-93.6927,26.2014
-93.6915,31.7489
-93.6915,31.7489
-93.691,33.6914
-93.691,33.6914
-93.6915,31.7489
-93.6915,31.7489
-93.691,33.6914
-93.691,33.6914
-93.6897,39.5014
-93.6897,39.5014
-93.691,33.6914
-93.691,33.6914
-93.6897,39.5014
-93.6897,39.5014
-93.6894,40.9514
-93.6894,40.9514
-93.6897,39.5014
-93.6897,39.5014
-93.6894,40.9514
-93.6894,40.9514
-93.689,42.4814
-93.689,42.4814
-93.6894,40.9514
-93.6894,40.9514
-93.689,42.4814
-93.6931,24.4814
-93.6927,26.2014
-89.6927,26.2005
-93.6931,24.4814
-89.6927,26.2005
-89.6931,24.4805
-93.6927,26.2014
-93.6915,31.7489
-89.6915,31.748
-93.6927,26.2014
-89.6915,31.748
-89.6927,26.2005
-93.6915,31.7489
-93.691,33.6914
-89.691,33.6905
-93.6915,31.7489
-89.691,33.6905
-89.6915,31.748
-93.691,33.6914
-93.6897,39.5014
-89.6897,39.5005
-93.691,33.6914
-89.6897,39.5005
-89.691,33.6905
-93.6897,39.5014
-93.6894,40.9514
-89.6894,40.9505
-93.6897,39.5014
-89.6894,40.9505
-89.6897,39.5005
-93.6894,40.9514
-93.689,42.4814
-89.689,42.4805
-93.6894,40.9514
-89.689,42.4805
-89.6894,40.9505
-84.5448,33.9355
-85.5929,29.935
-85.5948,33.935
-84.5448,33.9355
-84.5429,29.9355
-85.5929,29.935
-85.5948,33.935
-86.4773,29.9316
-86.6391,33.9283
-85.5948,33.935
-85.5929,29.935
-86.4773,29.9316
-86.6391,33.9283
-86.9597,29.8805
-87.6382,33.8226
-86.6391,33.9283
-86.4773,29.9316
-86.9597,29.8805
-87.6382,33.8226
-87.4314,29.7674
-88.6152,33.5882
-87.6382,33.8226
-86.9597,29.8805
-87.4314,29.7674
-88.6152,33.5882
-87.8844,29.594
-89.5535,33.2291
-88.6152,33.5882
-87.4314,29.7674
-87.8844,29.594
-89.5535,33.2291
-88.3111,29.3634
-90.4374,32.7515
-89.5535,33.2291
-87.8844,29.594
-88.3111,29.3634
-90.4374,32.7515
-88.7044,29.0794
-91.2519,32.1632
-90.4374,32.7515
-88.3111,29.3634
-88.7044,29.0794
-91.2519,32.1632
-89.0234,28.7762
-92.0047,31.4429
-91.2519,32.1632
-88.7044,29.0794
-89.0234,28.7762
-92.0047,31.4429
-89.2774,28.4418
-92.6456,30.5995
-92.0047,31.4429
-89.0234,28.7762
-89.2774,28.4418
-92.6456,30.5995
-89.475,28.0711
-93.1439,29.6647
-92.6456,30.5995
-89.2774,28.4418
-89.475,28.0711
-93.1439,29.6647
-89.611,27.6738
-93.4869,28.6624
-93.1439,29.6647
-89.475,28.0711
-89.611,27.6738
-93.4869,28.6624
-89.682,27.2598
-93.6659,27.6184
-93.4869,28.6624
-89.611,27.6738
-89.682,27.2598
-93.6659,27.6184
-89.6927,26.3905
-93.6927,26.3914
-93.6659,27.6184
-89.682,27.2598
-89.6927,26.3905
-93.6927,26.3914
-89.6931,24.4805
-93.6931,24.4814
-93.6927,26.3914
-89.6927,26.3905
-89.6931,24.4805
-84.5448,33.9355
-85.5948,33.935
-85.5948,33.935
-84.5448,33.9355
-84.5448,33.9355
-85.5948,33.935
-85.5948,33.935
-86.6391,33.9283
-86.6391,33.9283
-85.5948,33.935
-85.5948,33.935
-86.6391,33.9283
-86.6391,33.9283
-87.6382,33.8226
-87.6382,33.8226
-86.6391,33.9283
-86.6391,33.9283
-87.6382,33.8226
-87.6382,33.8226
-88.6152,33.5882
-88.6152,33.5882
-87.6382,33.8226
-87.6382,33.8226
-88.6152,33.5882
-88.6152,33.5882
-89.5535,33.2291
-89.5535,33.2291
-88.6152,33.5882
-88.6152,33.5882
-89.5535,33.2291
-89.5535,33.2291
-90.4374,32.7515
-90.4374,32.7515
-89.5535,33.2291
-89.5535,33.2291
-90.4374,32.7515
-90.4374,32.7515
-91.2519,32.1632
-91.2519,32.1632
-90.4374,32.7515
-90.4374,32.7515
-91.2519,32.1632
-91.2519,32.1632
-92.0047,31.4429
-92.0047,31.4429
-91.2519,32.1632
-91.2519,32.1632
-92.0047,31.4429
-92.0047,31.4429
-92.6456,30.5995
-92.6456,30.5995
-92.0047,31.4429
-92.0047,31.4429
-92.6456,30.5995
-92.6456,30.5995
-93.1439,29.6647
-93.1439,29.6647
-92.6456,30.5995
-92.6456,30.5995
-93.1439,29.6647
-93.1439,29.6647
-93.4869,28.6624
-93.4869,28.6624
-93.1439,29.6647
-93.1439,29.6647
-93.4869,28.6624
-93.4869,28.6624
-93.6659,27.6184
-93.6659,27.6184
-93.4869,28.6624
-93.4869,28.6624
-93.6659,27.6184
-93.6659,27.6184
-93.6927,26.3914
-93.6927,26.3914
-93.6659,27.6184
-93.6659,27.6184
-93.6927,26.3914
-93.6927,26.3914
-93.6931,24.4814
-93.6931,24.4814
-93.6927,26.3914
-93.6927,26.3914
-93.6931,24.4814
-93.6931,24.4814
-97.6927,26.2023
-93.6927,26.2014
-93.6931,24.4814
-97.6931,24.4823
-97.6927,26.2023
-93.6927,26.2014
-97.6568,27.5512
-93.6697,27.2307
-93.6927,26.2014
-97.6927,26.2023
-97.6568,27.5512
-93.6697,27.2307
-97.3991,29.1982
-93.5047,28.2854
-93.6697,27.2307
-97.6568,27.5512
-97.3991,29.1982
-93.5047,28.2854
-96.8982,30.7882
-93.1838,29.3037
-93.5047,28.2854
-97.3991,29.1982
-96.8982,30.7882
-93.1838,29.3037
-96.1652,32.2854
-92.7145,30.2625
-93.1838,29.3037
-96.8982,30.7882
-96.1652,32.2854
-92.7145,30.2625
-95.2168,33.6563
-92.1071,31.1405
-92.7145,30.2625
-96.1652,32.2854
-95.2168,33.6563
-92.1071,31.1405
-94.1952,34.7665
-91.4104,31.895
-92.1071,31.1405
-95.2168,33.6563
-94.1952,34.7665
-91.4104,31.895
-92.9938,35.7785
-90.637,32.5465
-91.4104,31.895
-94.1952,34.7665
-92.9938,35.7785
-90.637,32.5465
-91.663,36.613
-89.7803,33.0838
-90.637,32.5465
-92.9938,35.7785
-91.663,36.613
-89.7803,33.0838
-90.2288,37.2536
-88.8569,33.4962
-89.7803,33.0838
-91.663,36.613
-90.2288,37.2536
-88.8569,33.4962
-88.7192,37.6878
-87.8851,33.7757
-88.8569,33.4962
-90.2288,37.2536
-88.7192,37.6878
-87.8851,33.7757
-87.1638,37.9071
-86.8837,33.9169
-87.8851,33.7757
-88.7192,37.6878
-87.1638,37.9071
-86.8837,33.9169
-85.5966,37.935
-85.5948,33.935
-86.8837,33.9169
-87.1638,37.9071
-85.5966,37.935
-85.5948,33.935
-84.5566,37.9355
-84.5548,33.9355
-85.5948,33.935
-85.5966,37.935
-84.5566,37.9355
-84.5548,33.9355
-84.5466,37.9355
-84.5448,33.9355
-84.5548,33.9355
-84.5566,37.9355
-84.5466,37.9355
-93.6931,24.4814
-93.6927,26.2014
-93.6927,26.2014
-93.6931,24.4814
-93.6931,24.4814
-93.6927,26.2014
-93.6927,26.2014
-93.6697,27.2307
-93.6697,27.2307
-93.6927,26.2014
-93.6927,26.2014
-93.6697,27.2307
-93.6697,27.2307
-93.5047,28.2854
-93.5047,28.2854
-93.6697,27.2307
-93.6697,27.2307
-93.5047,28.2854
-93.5047,28.2854
-93.1838,29.3037
-93.1838,29.3037
-93.5047,28.2854
-93.5047,28.2854
-93.1838,29.3037
-93.1838,29.3037
-92.7145,30.2625
-92.7145,30.2625
-93.1838,29.3037
-93.1838,29.3037
-92.7145,30.2625
-92.7145,30.2625
-92.1071,31.1405
-92.1071,31.1405
-92.7145,30.2625
-92.7145,30.2625
-92.1071,31.1405
-92.1071,31.1405
-91.4104,31.895
-91.4104,31.895
-92.1071,31.1405
-92.1071,31.1405
-91.4104,31.895
-91.4104,31.895
-90.637,32.5465
-90.637,32.5465
-91.4104,31.895
-91.4104,31.895
-90.637,32.5465
-90.637,32.5465
-89.7803,33.0838
-89.7803,33.0838
-90.637,32.5465
-90.637,32.5465
-89.7803,33.0838
-89.7803,33.0838
-88.8569,33.4962
-88.8569,33.4962
-89.7803,33.0838
-89.7803,33.0838
-88.8569,33.4962
-88.8569,33.4962
-87.8851,33.7757
-87.8851,33.7757
-88.8569,33.4962
-88.8569,33.4962
-87.8851,33.7757
-87.8851,33.7757
-86.8837,33.9169
-86.8837,33.9169
-87.8851,33.7757
-87.8851,33.7757
-86.8837,33.9169
-86.8837,33.9169
-85.5948,33.935
-85.5948,33.935
-86.8837,33.9169
-86.8837,33.9169
-85.5948,33.935
-85.5948,33.935
-84.5548,33.9355
-84.5548,33.9355
-85.5948,33.935
-85.5948,33.935
-84.5548,33.9355
-84.5548,33.9355
-84.5448,33.9355
-84.5448,33.9355
-84.5548,33.9355
-84.5548,33.9355
-84.5448,33.9355
-84.541,25.6355
-84.5784,25.6311
-84.5784,25.6311
-84.541,25.6355
-84.541,25.6355
-84.5784,25.6311
-84.5784,25.6311
-84.6139,25.6184
-84.6139,25.6184
-84.5784,25.6311
-84.5784,25.6311
-84.6139,25.6184
-84.6139,25.6184
-84.6455,25.5978
-84.6455,25.5978
-84.6139,25.6184
-84.6139,25.6184
-84.6455,25.5978
-84.6455,25.5978
-85.1291,25.0705
-85.1291,25.0705
-84.6455,25.5978
-84.6455,25.5978
-85.1291,25.0705
-85.1291,25.0705
-85.2743,24.8927
-85.2743,24.8927
-85.1291,25.0705
-85.1291,25.0705
-85.2743,24.8927
-85.2743,24.8927
-85.3433,24.7534
-85.3433,24.7534
-85.2743,24.8927
-85.2743,24.8927
-85.3433,24.7534
-85.3433,24.7534
-85.3832,24.6032
-85.3832,24.6032
-85.3433,24.7534
-85.3433,24.7534
-85.3832,24.6032
-85.3832,24.6032
-85.3931,24.4795
-85.3931,24.4795
-85.3832,24.6032
-85.3832,24.6032
-85.3931,24.4795
-84.541,25.6355
-84.5784,25.6311
-85.4921,29.5254
-84.541,25.6355
-85.4921,29.5254
-84.5428,29.6355
-84.5784,25.6311
-84.6139,25.6184
-86.3913,29.2018
-84.5784,25.6311
-86.3913,29.2018
-85.4921,29.5254
-84.6139,25.6184
-84.6455,25.5978
-87.1931,28.6817
-84.6139,25.6184
-87.1931,28.6817
-86.3913,29.2018
-84.6455,25.5978
-85.1291,25.0705
-88.0835,27.767
-84.6455,25.5978
-88.0835,27.767
-87.1931,28.6817
-85.1291,25.0705
-85.2743,24.8927
-88.6638,27.0166
-85.1291,25.0705
-88.6638,27.0166
-88.0835,27.767
-85.2743,24.8927
-85.3433,24.7534
-89.0872,26.1616
-85.2743,24.8927
-89.0872,26.1616
-88.6638,27.0166
-85.3433,24.7534
-85.3832,24.6032
-89.3322,25.2396
-85.3433,24.7534
-89.3322,25.2396
-89.0872,26.1616
-85.3832,24.6032
-85.3931,24.4795
-89.3931,24.4806
-85.3832,24.6032
-89.3931,24.4806
-89.3322,25.2396
-84.5428,29.6355
-85.4921,29.5254
-85.5606,29.8174
-84.5428,29.6355
-85.5606,29.8174
-84.5429,29.9355
-85.4921,29.5254
-86.3913,29.2018
-86.5246,29.4705
-85.4921,29.5254
-86.5246,29.4705
-85.5606,29.8174
-86.3913,29.2018
-87.1931,28.6817
-87.3842,28.9129
-86.3913,29.2018
-87.3842,28.9129
-86.5246,29.4705
-87.1931,28.6817
-88.0835,27.767
-88.3051,27.9692
-87.1931,28.6817
-88.3051,27.9692
-87.3842,28.9129
-88.0835,27.767
-88.6638,27.0166
-88.918,27.1759
-88.0835,27.767
-88.918,27.1759
-88.3051,27.9692
-88.6638,27.0166
-89.0872,26.1616
-89.368,26.2673
-88.6638,27.0166
-89.368,26.2673
-88.918,27.1759
-89.0872,26.1616
-89.3322,25.2396
-89.6284,25.2873
-89.0872,26.1616
-89.6284,25.2873
-89.368,26.2673
-89.3322,25.2396
-89.3931,24.4806
-89.6931,24.4807
-89.3322,25.2396
-89.6931,24.4807
-89.6284,25.2873
-31.8551,24.4159
-32.061,25.414
-31.7663,25.3577
-31.8551,24.4159
-32.1551,24.4156
-32.061,25.414
-31.7663,25.3577
-31.7799,26.3767
-31.5012,26.2657
-31.7663,25.3577
-32.061,25.414
-31.7799,26.3767
-31.5012,26.2657
-31.3222,27.269
-31.0694,27.1073
-31.5012,26.2657
-31.7799,26.3767
-31.3222,27.269
-31.0694,27.1073
-30.3896,28.4307
-30.1627,28.2344
-31.0694,27.1073
-31.3222,27.269
-30.3896,28.4307
-30.1627,28.2344
-29.6609,29.1137
-29.4824,28.8726
-30.1627,28.2344
-30.3896,28.4307
-29.6609,29.1137
-29.4824,28.8726
-28.7625,29.6252
-28.6463,29.3485
-29.4824,28.8726
-29.6609,29.1137
-28.7625,29.6252
-28.6463,29.3485
-27.7682,29.9084
-27.7212,29.6121
-28.6463,29.3485
-28.7625,29.6252
-27.7682,29.9084
-27.7212,29.6121
-25.1829,29.9627
-25.1828,29.6627
-27.7212,29.6121
-27.7682,29.9084
-25.1829,29.9627
-27.8551,24.4198
-31.7663,25.3577
-27.8375,24.6061
-27.8551,24.4198
-31.8551,24.4159
-31.7663,25.3577
-27.8375,24.6061
-31.5012,26.2657
-27.7851,24.7857
-27.8375,24.6061
-31.7663,25.3577
-31.5012,26.2657
-27.7851,24.7857
-31.0694,27.1073
-27.6997,24.9521
-27.7851,24.7857
-31.5012,26.2657
-31.0694,27.1073
-27.6997,24.9521
-30.1627,28.2344
-27.1379,25.6171
-27.6997,24.9521
-31.0694,27.1073
-30.1627,28.2344
-27.1379,25.6171
-29.4824,28.8726
-27.1016,25.6583
-27.1379,25.6171
-30.1627,28.2344
-29.4824,28.8726
-27.1016,25.6583
-28.6463,29.3485
-27.0979,25.6604
-27.1016,25.6583
-29.4824,28.8726
-28.6463,29.3485
-27.0979,25.6604
-27.7212,29.6121
-27.0938,25.6616
-27.0979,25.6604
-28.6463,29.3485
-27.7212,29.6121
-27.0938,25.6616
-25.1828,29.6627
-25.181,25.6627
-27.0938,25.6616
-27.7212,29.6121
-25.1828,29.6627
-27.8551,24.4198
-27.8375,24.6061
-27.8375,24.6061
-27.8551,24.4198
-27.8551,24.4198
-27.8375,24.6061
-27.8375,24.6061
-27.7851,24.7857
-27.7851,24.7857
-27.8375,24.6061
-27.8375,24.6061
-27.7851,24.7857
-27.7851,24.7857
-27.6997,24.9521
-27.6997,24.9521
-27.7851,24.7857
-27.7851,24.7857
-27.6997,24.9521
-27.6997,24.9521
-27.1379,25.6171
-27.1379,25.6171
-27.6997,24.9521
-27.6997,24.9521
-27.1379,25.6171
-27.1379,25.6171
-27.1016,25.6583
-27.1016,25.6583
-27.1379,25.6171
-27.1379,25.6171
-27.1016,25.6583
-27.1016,25.6583
-27.0979,25.6604
-27.0979,25.6604
-27.1016,25.6583
-27.1016,25.6583
-27.0979,25.6604
-27.0979,25.6604
-27.0938,25.6616
-27.0938,25.6616
-27.0979,25.6604
-27.0979,25.6604
-27.0938,25.6616
-27.0938,25.6616
-25.181,25.6627
-25.181,25.6627
-27.0938,25.6616
-27.0938,25.6616
-25.181,25.6627
-83.5077,111.851
-83.7625,107.842
-84.1591,111.822
-83.5077,111.851
-83.5104,107.851
-83.7625,107.842
-84.1591,111.822
-83.96,107.812
-84.752,111.733
-84.1591,111.822
-83.7625,107.842
-83.96,107.812
-84.752,111.733
-84.1536,107.763
-85.3331,111.585
-84.752,111.733
-83.96,107.812
-84.1536,107.763
-85.3331,111.585
-84.3414,107.694
-85.8965,111.379
-85.3331,111.585
-84.1536,107.763
-84.3414,107.694
-85.8965,111.379
-84.5213,107.607
-86.4366,111.119
-85.8965,111.379
-84.3414,107.694
-84.5213,107.607
-86.4366,111.119
-84.6917,107.503
-86.948,110.806
-86.4366,111.119
-84.5213,107.607
-84.6917,107.503
-86.948,110.806
-84.8508,107.382
-87.4256,110.443
-86.948,110.806
-84.6917,107.503
-84.8508,107.382
-87.4256,110.443
-84.9928,107.25
-87.8682,110.031
-87.4256,110.443
-84.8508,107.382
-84.9928,107.25
-87.8682,110.031
-85.1087,107.117
-88.272,109.565
-87.8682,110.031
-84.9928,107.25
-85.1087,107.117
-88.272,109.565
-85.2092,106.971
-88.6221,109.057
-88.272,109.565
-85.1087,107.117
-85.2092,106.971
-88.6221,109.057
-85.2931,106.815
-88.9144,108.514
-88.6221,109.057
-85.2092,106.971
-85.2931,106.815
-88.9144,108.514
-85.3594,106.651
-89.1453,107.942
-88.9144,108.514
-85.2931,106.815
-85.3594,106.651
-89.1453,107.942
-85.4073,106.48
-89.312,107.348
-89.1453,107.942
-85.3594,106.651
-85.4073,106.48
-89.312,107.348
-85.4361,106.305
-89.4125,106.739
-89.312,107.348
-85.4073,106.48
-85.4361,106.305
-89.4125,106.739
-85.4456,106.129
-89.4456,106.123
-89.4125,106.739
-85.4361,106.305
-85.4456,106.129
-89.4456,106.123
-85.4448,105.513
-89.4448,105.508
-89.4456,106.123
-85.4456,106.129
-85.4448,105.513
-83.5075,112.151
-84.1591,111.822
-84.1888,112.12
-83.5075,112.151
-83.5077,111.851
-84.1591,111.822
-84.1888,112.12
-84.752,111.733
-84.8114,112.027
-84.1888,112.12
-84.1591,111.822
-84.752,111.733
-84.8114,112.027
-85.3331,111.585
-85.4216,111.871
-84.8114,112.027
-84.752,111.733
-85.3331,111.585
-85.4216,111.871
-85.8965,111.379
-86.0132,111.656
-85.4216,111.871
-85.3331,111.585
-85.8965,111.379
-86.0132,111.656
-86.4366,111.119
-86.5803,111.382
-86.0132,111.656
-85.8965,111.379
-86.4366,111.119
-86.5803,111.382
-86.948,110.806
-87.1173,111.054
-86.5803,111.382
-86.4366,111.119
-86.948,110.806
-87.1173,111.054
-87.4256,110.443
-87.6187,110.673
-87.1173,111.054
-86.948,110.806
-87.4256,110.443
-87.6187,110.673
-87.8682,110.031
-88.0839,110.24
-87.6187,110.673
-87.4256,110.443
-87.8682,110.031
-88.0839,110.24
-88.272,109.565
-88.5092,109.748
-88.0839,110.24
-87.8682,110.031
-88.272,109.565
-88.5092,109.748
-88.6221,109.057
-88.8781,109.213
-88.5092,109.748
-88.272,109.565
-88.6221,109.057
-88.8781,109.213
-88.9144,108.514
-89.186,108.641
-88.8781,109.213
-88.6221,109.057
-88.9144,108.514
-89.186,108.641
-89.1453,107.942
-89.4293,108.039
-89.186,108.641
-88.9144,108.514
-89.1453,107.942
-89.4293,108.039
-89.312,107.348
-89.6049,107.413
-89.4293,108.039
-89.1453,107.942
-89.312,107.348
-89.6049,107.413
-89.4125,106.739
-89.7108,106.772
-89.6049,107.413
-89.312,107.348
-89.4125,106.739
-89.7108,106.772
-89.4456,106.123
-89.7456,106.123
-89.7108,106.772
-89.4125,106.739
-89.4456,106.123
-89.7456,106.123
-89.4448,105.508
-89.7448,105.507
-89.7456,106.123
-89.4456,106.123
-89.4448,105.508
-83.5048,116.151
-84.1888,112.12
-84.5855,116.101
-83.5048,116.151
-83.5075,112.151
-84.1888,112.12
-84.5855,116.101
-84.8114,112.027
-85.6035,115.948
-84.5855,116.101
-84.1888,112.12
-84.8114,112.027
-85.6035,115.948
-85.4216,111.871
-86.6011,115.694
-85.6035,115.948
-84.8114,112.027
-85.4216,111.871
-86.6011,115.694
-86.0132,111.656
-87.5683,115.341
-86.6011,115.694
-85.4216,111.871
-86.0132,111.656
-87.5683,115.341
-86.5803,111.382
-88.4956,114.894
-87.5683,115.341
-86.0132,111.656
-86.5803,111.382
-88.4956,114.894
-87.1173,111.054
-89.3736,114.357
-88.4956,114.894
-86.5803,111.382
-87.1173,111.054
-89.3736,114.357
-87.6187,110.673
-90.1935,113.734
-89.3736,114.357
-87.1173,111.054
-87.6187,110.673
-90.1935,113.734
-88.0839,110.24
-90.9592,113.02
-90.1935,113.734
-87.6187,110.673
-88.0839,110.24
-90.9592,113.02
-88.5092,109.748
-91.6725,112.197
-90.9592,113.02
-88.0839,110.24
-88.5092,109.748
-91.6725,112.197
-88.8781,109.213
-92.291,111.3
-91.6725,112.197
-88.5092,109.748
-88.8781,109.213
-92.291,111.3
-89.186,108.641
-92.8073,110.34
-92.291,111.3
-88.8781,109.213
-89.186,108.641
-92.8073,110.34
-89.4293,108.039
-93.2152,109.33
-92.8073,110.34
-89.186,108.641
-89.4293,108.039
-93.2152,109.33
-89.6049,107.413
-93.5097,108.281
-93.2152,109.33
-89.4293,108.039
-89.6049,107.413
-93.5097,108.281
-89.7108,106.772
-93.6872,107.206
-93.5097,108.281
-89.6049,107.413
-89.7108,106.772
-93.6872,107.206
-89.7456,106.123
-93.7456,106.118
-93.6872,107.206
-89.7108,106.772
-89.7456,106.123
-93.7456,106.118
-89.7448,105.507
-93.7448,105.502
-93.7456,106.118
-89.7456,106.123
-89.7448,105.507
-83.5048,116.151
-84.5855,116.101
-84.5855,116.101
-83.5048,116.151
-83.5048,116.151
-84.5855,116.101
-84.5855,116.101
-85.6035,115.948
-85.6035,115.948
-84.5855,116.101
-84.5855,116.101
-85.6035,115.948
-85.6035,115.948
-86.6011,115.694
-86.6011,115.694
-85.6035,115.948
-85.6035,115.948
-86.6011,115.694
-86.6011,115.694
-87.5683,115.341
-87.5683,115.341
-86.6011,115.694
-86.6011,115.694
-87.5683,115.341
-87.5683,115.341
-88.4956,114.894
-88.4956,114.894
-87.5683,115.341
-87.5683,115.341
-88.4956,114.894
-88.4956,114.894
-89.3736,114.357
-89.3736,114.357
-88.4956,114.894
-88.4956,114.894
-89.3736,114.357
-89.3736,114.357
-90.1935,113.734
-90.1935,113.734
-89.3736,114.357
-89.3736,114.357
-90.1935,113.734
-90.1935,113.734
-90.9592,113.02
-90.9592,113.02
-90.1935,113.734
-90.1935,113.734
-90.9592,113.02
-90.9592,113.02
-91.6725,112.197
-91.6725,112.197
-90.9592,113.02
-90.9592,113.02
-91.6725,112.197
-91.6725,112.197
-92.291,111.3
-92.291,111.3
-91.6725,112.197
-91.6725,112.197
-92.291,111.3
-92.291,111.3
-92.8073,110.34
-92.8073,110.34
-92.291,111.3
-92.291,111.3
-92.8073,110.34
-92.8073,110.34
-93.2152,109.33
-93.2152,109.33
-92.8073,110.34
-92.8073,110.34
-93.2152,109.33
-93.2152,109.33
-93.5097,108.281
-93.5097,108.281
-93.2152,109.33
-93.2152,109.33
-93.5097,108.281
-93.5097,108.281
-93.6872,107.206
-93.6872,107.206
-93.5097,108.281
-93.5097,108.281
-93.6872,107.206
-93.6872,107.206
-93.7456,106.118
-93.7456,106.118
-93.6872,107.206
-93.6872,107.206
-93.7456,106.118
-93.7456,106.118
-93.7448,105.502
-93.7448,105.502
-93.7456,106.118
-93.7456,106.118
-93.7448,105.502
-83.5048,116.151
-84.5855,116.101
-84.9821,120.081
-83.5048,116.151
-84.9821,120.081
-83.5021,120.151
-84.5855,116.101
-85.6035,115.948
-86.3955,119.868
-84.5855,116.101
-86.3955,119.868
-84.9821,120.081
-85.6035,115.948
-86.6011,115.694
-87.7806,119.516
-85.6035,115.948
-87.7806,119.516
-86.3955,119.868
-86.6011,115.694
-87.5683,115.341
-89.1235,119.026
-86.6011,115.694
-89.1235,119.026
-87.7806,119.516
-87.5683,115.341
-88.4956,114.894
-90.4109,118.406
-87.5683,115.341
-90.4109,118.406
-89.1235,119.026
-88.4956,114.894
-89.3736,114.357
-91.6299,117.659
-88.4956,114.894
-91.6299,117.659
-90.4109,118.406
-89.3736,114.357
-90.1935,113.734
-92.7683,116.795
-89.3736,114.357
-92.7683,116.795
-91.6299,117.659
-90.1935,113.734
-90.9592,113.02
-93.8346,115.801
-90.1935,113.734
-93.8346,115.801
-92.7683,116.795
-90.9592,113.02
-91.6725,112.197
-94.8358,114.645
-90.9592,113.02
-94.8358,114.645
-93.8346,115.801
-91.6725,112.197
-92.291,111.3
-95.7039,113.386
-91.6725,112.197
-95.7039,113.386
-94.8358,114.645
-92.291,111.3
-92.8073,110.34
-96.4286,112.039
-92.291,111.3
-96.4286,112.039
-95.7039,113.386
-92.8073,110.34
-93.2152,109.33
-97.0011,110.621
-92.8073,110.34
-97.0011,110.621
-96.4286,112.039
-93.2152,109.33
-93.5097,108.281
-97.4144,109.148
-93.2152,109.33
-97.4144,109.148
-97.0011,110.621
-93.5097,108.281
-93.6872,107.206
-97.6636,107.639
-93.5097,108.281
-97.6636,107.639
-97.4144,109.148
-93.6872,107.206
-93.7456,106.118
-97.7456,106.112
-93.6872,107.206
-97.7456,106.112
-97.6636,107.639
-93.7456,106.118
-93.7448,105.502
-97.7448,105.496
-93.7456,106.118
-97.7448,105.496
-97.7456,106.112
-83.5021,120.151
-84.9821,120.081
-85.0118,120.379
-83.5021,120.151
-85.0118,120.379
-83.5019,120.451
-84.9821,120.081
-86.3955,119.868
-86.4549,120.162
-84.9821,120.081
-86.4549,120.162
-85.0118,120.379
-86.3955,119.868
-87.7806,119.516
-87.869,119.802
-86.3955,119.868
-87.869,119.802
-86.4549,120.162
-87.7806,119.516
-89.1235,119.026
-89.2401,119.303
-87.7806,119.516
-89.2401,119.303
-87.869,119.802
-89.1235,119.026
-90.4109,118.406
-90.5546,118.669
-89.1235,119.026
-90.5546,118.669
-89.2401,119.303
-90.4109,118.406
-91.6299,117.659
-91.7991,117.907
-90.4109,118.406
-91.7991,117.907
-90.5546,118.669
-91.6299,117.659
-92.7683,116.795
-92.9614,117.025
-91.6299,117.659
-92.9614,117.025
-91.7991,117.907
-92.7683,116.795
-93.8346,115.801
-94.0503,116.01
-92.7683,116.795
-94.0503,116.01
-92.9614,117.025
-93.8346,115.801
-94.8358,114.645
-95.073,114.828
-93.8346,115.801
-95.073,114.828
-94.0503,116.01
-94.8358,114.645
-95.7039,113.386
-95.9599,113.542
-94.8358,114.645
-95.9599,113.542
-95.073,114.828
-95.7039,113.386
-96.4286,112.039
-96.7002,112.166
-95.7039,113.386
-96.7002,112.166
-95.9599,113.542
-96.4286,112.039
-97.0011,110.621
-97.285,110.718
-96.4286,112.039
-97.285,110.718
-96.7002,112.166
-97.0011,110.621
-97.4144,109.148
-97.7073,109.213
-97.0011,110.621
-97.7073,109.213
-97.285,110.718
-97.4144,109.148
-97.6636,107.639
-97.9618,107.672
-97.4144,109.148
-97.9618,107.672
-97.7073,109.213
-97.6636,107.639
-97.7456,106.112
-98.0456,106.112
-97.6636,107.639
-98.0456,106.112
-97.9618,107.672
-97.7456,106.112
-97.7448,105.496
-98.0448,105.496
-97.7456,106.112
-98.0448,105.496
-98.0456,106.112
-83.5019,120.451
-85.0118,120.379
-85.4085,124.36
-83.5019,120.451
-85.4085,124.36
-83.4991,124.451
-85.0118,120.379
-86.4549,120.162
-87.2469,124.083
-85.0118,120.379
-87.2469,124.083
-85.4085,124.36
-86.4549,120.162
-87.869,119.802
-89.0485,123.624
-86.4549,120.162
-89.0485,123.624
-87.2469,124.083
-87.869,119.802
-89.2401,119.303
-90.7953,122.988
-87.869,119.802
-90.7953,122.988
-89.0485,123.624
-89.2401,119.303
-90.5546,118.669
-92.4699,122.181
-89.2401,119.303
-92.4699,122.181
-90.7953,122.988
-90.5546,118.669
-91.7991,117.907
-94.0555,121.21
-90.5546,118.669
-94.0555,121.21
-92.4699,122.181
-91.7991,117.907
-92.9614,117.025
-95.5362,120.086
-91.7991,117.907
-95.5362,120.086
-94.0555,121.21
-92.9614,117.025
-94.0503,116.01
-96.9257,118.79
-92.9614,117.025
-96.9257,118.79
-95.5362,120.086
-94.0503,116.01
-95.073,114.828
-98.2363,117.277
-94.0503,116.01
-98.2363,117.277
-96.9257,118.79
-95.073,114.828
-95.9599,113.542
-99.3728,115.628
-95.073,114.828
-99.3728,115.628
-98.2363,117.277
-95.9599,113.542
-96.7002,112.166
-100.322,113.865
-95.9599,113.542
-100.322,113.865
-99.3728,115.628
-96.7002,112.166
-97.285,110.718
-101.071,112.009
-96.7002,112.166
-101.071,112.009
-100.322,113.865
-97.285,110.718
-97.7073,109.213
-101.612,110.081
-97.285,110.718
-101.612,110.081
-101.071,112.009
-97.7073,109.213
-97.9618,107.672
-101.938,108.106
-97.7073,109.213
-101.938,108.106
-101.612,110.081
-97.9618,107.672
-98.0456,106.112
-102.046,106.106
-97.9618,107.672
-102.046,106.106
-101.938,108.106
-98.0456,106.112
-98.0448,105.496
-102.045,105.491
-98.0456,106.112
-102.045,105.491
-102.046,106.106
-25.1848,33.9627
-27.0929,29.9618
-27.0948,33.9618
-25.1848,33.9627
-25.1829,29.9627
-27.0929,29.9618
-27.0948,33.9618
-28.7629,29.961
-28.7648,33.961
-27.0948,33.9618
-27.0929,29.9618
-28.7629,29.961
-28.7648,33.961
-29.8128,29.9606
-29.8146,33.9606
-28.7648,33.961
-28.7629,29.961
-29.8128,29.9606
-29.8146,33.9606
-30.1389,29.931
-30.8569,33.866
-29.8146,33.9606
-29.8128,29.9606
-30.1389,29.931
-30.8569,33.866
-30.4546,29.8435
-31.8654,33.5864
-30.8569,33.866
-30.1389,29.931
-30.4546,29.8435
-31.8654,33.5864
-30.7494,29.7009
-32.8075,33.1308
-31.8654,33.5864
-30.4546,29.8435
-30.7494,29.7009
-32.8075,33.1308
-31.0139,29.5078
-33.6529,32.5138
-32.8075,33.1308
-30.7494,29.7009
-31.0139,29.5078
-33.6529,32.5138
-31.2397,29.2705
-34.3741,31.7555
-33.6529,32.5138
-31.0139,29.5078
-31.2397,29.2705
-34.3741,31.7555
-31.5441,28.8273
-34.976,30.8821
-34.3741,31.7555
-31.2397,29.2705
-31.5441,28.8273
-34.976,30.8821
-31.8003,28.3284
-35.4697,29.9209
-34.976,30.8821
-31.5441,28.8273
-31.8003,28.3284
-35.4697,29.9209
-31.9898,27.8003
-35.8346,28.9037
-35.4697,29.9209
-31.8003,28.3284
-31.9898,27.8003
-35.8346,28.9037
-32.1092,27.2522
-36.0646,27.8479
-35.8346,28.9037
-31.9898,27.8003
-32.1092,27.2522
-36.0646,27.8479
-32.1565,26.6933
-36.1557,26.7712
-36.0646,27.8479
-32.1092,27.2522
-32.1565,26.6933
-36.1557,26.7712
-32.1562,25.5354
-36.1562,25.5314
-36.1557,26.7712
-32.1565,26.6933
-32.1562,25.5354
-36.1562,25.5314
-32.1552,24.4854
-36.1552,24.4814
-36.1562,25.5314
-32.1562,25.5354
-32.1552,24.4854
-36.1552,24.4814
-32.1551,24.4154
-36.1551,24.4114
-36.1552,24.4814
-32.1552,24.4854
-32.1551,24.4154
-25.1848,33.9627
-27.0948,33.9618
-27.0948,33.9618
-25.1848,33.9627
-25.1848,33.9627
-27.0948,33.9618
-27.0948,33.9618
-28.7648,33.961
-28.7648,33.961
-27.0948,33.9618
-27.0948,33.9618
-28.7648,33.961
-28.7648,33.961
-29.8146,33.9606
-29.8146,33.9606
-28.7648,33.961
-28.7648,33.961
-29.8146,33.9606
-29.8146,33.9606
-30.8569,33.866
-30.8569,33.866
-29.8146,33.9606
-29.8146,33.9606
-30.8569,33.866
-30.8569,33.866
-31.8654,33.5864
-31.8654,33.5864
-30.8569,33.866
-30.8569,33.866
-31.8654,33.5864
-31.8654,33.5864
-32.8075,33.1308
-32.8075,33.1308
-31.8654,33.5864
-31.8654,33.5864
-32.8075,33.1308
-32.8075,33.1308
-33.6529,32.5138
-33.6529,32.5138
-32.8075,33.1308
-32.8075,33.1308
-33.6529,32.5138
-33.6529,32.5138
-34.3741,31.7555
-34.3741,31.7555
-33.6529,32.5138
-33.6529,32.5138
-34.3741,31.7555
-34.3741,31.7555
-34.976,30.8821
-34.976,30.8821
-34.3741,31.7555
-34.3741,31.7555
-34.976,30.8821
-34.976,30.8821
-35.4697,29.9209
-35.4697,29.9209
-34.976,30.8821
-34.976,30.8821
-35.4697,29.9209
-35.4697,29.9209
-35.8346,28.9037
-35.8346,28.9037
-35.4697,29.9209
-35.4697,29.9209
-35.8346,28.9037
-35.8346,28.9037
-36.0646,27.8479
-36.0646,27.8479
-35.8346,28.9037
-35.8346,28.9037
-36.0646,27.8479
-36.0646,27.8479
-36.1557,26.7712
-36.1557,26.7712
-36.0646,27.8479
-36.0646,27.8479
-36.1557,26.7712
-36.1557,26.7712
-36.1562,25.5314
-36.1562,25.5314
-36.1557,26.7712
-36.1557,26.7712
-36.1562,25.5314
-36.1562,25.5314
-36.1552,24.4814
-36.1552,24.4814
-36.1562,25.5314
-36.1562,25.5314
-36.1552,24.4814
-36.1552,24.4814
-36.1551,24.4114
-36.1551,24.4114
-36.1552,24.4814
-36.1552,24.4814
-36.1551,24.4114
-36.1551,24.4114
-40.1562,25.5273
-36.1562,25.5314
-36.1551,24.4114
-40.1551,24.4073
-40.1562,25.5273
-36.1562,25.5314
-40.1574,26.6533
-36.1574,26.6573
-36.1562,25.5314
-40.1562,25.5273
-40.1574,26.6533
-36.1574,26.6573
-40.056,28.2357
-36.0892,27.7212
-36.1574,26.6573
-40.1574,26.6533
-40.056,28.2357
-36.0892,27.7212
-39.7503,29.7916
-35.8837,28.7672
-36.0892,27.7212
-40.056,28.2357
-39.7503,29.7916
-35.8837,28.7672
-39.2455,31.2948
-35.5443,29.7778
-35.8837,28.7672
-39.7503,29.7916
-39.2455,31.2948
-35.5443,29.7778
-38.5501,32.7198
-35.0768,30.7358
-35.5443,29.7778
-39.2455,31.2948
-38.5501,32.7198
-35.0768,30.7358
-37.6759,34.0427
-34.4891,31.6251
-35.0768,30.7358
-38.5501,32.7198
-37.6759,34.0427
-34.4891,31.6251
-36.5669,35.2816
-33.8222,32.3718
-34.4891,31.6251
-37.6759,34.0427
-36.5669,35.2816
-33.8222,32.3718
-35.1779,36.3735
-32.9985,33.0194
-33.8222,32.3718
-36.5669,35.2816
-35.1779,36.3735
-32.9985,33.0194
-33.6158,37.1991
-32.0721,33.509
-32.9985,33.0194
-35.1779,36.3735
-33.6158,37.1991
-32.0721,33.509
-31.9312,37.7317
-31.073,33.8248
-32.0721,33.509
-33.6158,37.1991
-31.9312,37.7317
-31.073,33.8248
-30.1784,37.9541
-30.0336,33.9567
-31.073,33.8248
-31.9312,37.7317
-30.1784,37.9541
-30.0336,33.9567
-28.8366,37.961
-28.8348,33.961
-30.0336,33.9567
-30.1784,37.9541
-28.8366,37.961
-28.8348,33.961
-27.0966,37.9618
-27.0948,33.9618
-28.8348,33.961
-28.8366,37.961
-27.0966,37.9618
-27.0948,33.9618
-25.1866,37.9627
-25.1848,33.9627
-27.0948,33.9618
-27.0966,37.9618
-25.1866,37.9627
-36.1551,24.4114
-36.1562,25.5314
-36.1562,25.5314
-36.1551,24.4114
-36.1551,24.4114
-36.1562,25.5314
-36.1562,25.5314
-36.1574,26.6573
-36.1574,26.6573
-36.1562,25.5314
-36.1562,25.5314
-36.1574,26.6573
-36.1574,26.6573
-36.0892,27.7212
-36.0892,27.7212
-36.1574,26.6573
-36.1574,26.6573
-36.0892,27.7212
-36.0892,27.7212
-35.8837,28.7672
-35.8837,28.7672
-36.0892,27.7212
-36.0892,27.7212
-35.8837,28.7672
-35.8837,28.7672
-35.5443,29.7778
-35.5443,29.7778
-35.8837,28.7672
-35.8837,28.7672
-35.5443,29.7778
-35.5443,29.7778
-35.0768,30.7358
-35.0768,30.7358
-35.5443,29.7778
-35.5443,29.7778
-35.0768,30.7358
-35.0768,30.7358
-34.4891,31.6251
-34.4891,31.6251
-35.0768,30.7358
-35.0768,30.7358
-34.4891,31.6251
-34.4891,31.6251
-33.8222,32.3718
-33.8222,32.3718
-34.4891,31.6251
-34.4891,31.6251
-33.8222,32.3718
-33.8222,32.3718
-32.9985,33.0194
-32.9985,33.0194
-33.8222,32.3718
-33.8222,32.3718
-32.9985,33.0194
-32.9985,33.0194
-32.0721,33.509
-32.0721,33.509
-32.9985,33.0194
-32.9985,33.0194
-32.0721,33.509
-32.0721,33.509
-31.073,33.8248
-31.073,33.8248
-32.0721,33.509
-32.0721,33.509
-31.073,33.8248
-31.073,33.8248
-30.0336,33.9567
-30.0336,33.9567
-31.073,33.8248
-31.073,33.8248
-30.0336,33.9567
-30.0336,33.9567
-28.8348,33.961
-28.8348,33.961
-30.0336,33.9567
-30.0336,33.9567
-28.8348,33.961
-28.8348,33.961
-27.0948,33.9618
-27.0948,33.9618
-28.8348,33.961
-28.8348,33.961
-27.0948,33.9618
-27.0948,33.9618
-25.1848,33.9627
-25.1848,33.9627
-27.0948,33.9618
-27.0948,33.9618
-25.1848,33.9627
-93.7042,-24.7786
-93.704,-23.7786
-93.704,-23.7786
-93.7042,-24.7786
-93.7042,-24.7786
-93.704,-23.7786
-93.704,-23.7786
-93.7021,-15.4286
-93.7021,-15.4286
-93.704,-23.7786
-93.704,-23.7786
-93.7021,-15.4286
-93.7021,-15.4286
-93.7007,-9.05861
-93.7007,-9.05861
-93.7021,-15.4286
-93.7021,-15.4286
-93.7007,-9.05861
-93.7007,-9.05861
-93.7004,-7.92861
-93.7004,-7.92861
-93.7007,-9.05861
-93.7007,-9.05861
-93.7004,-7.92861
-93.7004,-7.92861
-93.7002,-6.77861
-93.7002,-6.77861
-93.7004,-7.92861
-93.7004,-7.92861
-93.7002,-6.77861
-93.7042,-24.7786
-93.704,-23.7786
-89.704,-23.7795
-93.7042,-24.7786
-89.704,-23.7795
-89.7042,-24.7795
-93.704,-23.7786
-93.7021,-15.4286
-89.7021,-15.4295
-93.704,-23.7786
-89.7021,-15.4295
-89.704,-23.7795
-93.7021,-15.4286
-93.7007,-9.05861
-89.7007,-9.05951
-93.7021,-15.4286
-89.7007,-9.05951
-89.7021,-15.4295
-93.7007,-9.05861
-93.7004,-7.92861
-89.7004,-7.92951
-93.7007,-9.05861
-89.7004,-7.92951
-89.7007,-9.05951
-93.7004,-7.92861
-93.7002,-6.77861
-89.7002,-6.77951
-93.7004,-7.92861
-89.7002,-6.77951
-89.7004,-7.92951
-36.1551,24.4114
-36.1562,25.5316
-36.1562,25.5316
-36.1551,24.4114
-36.1551,24.4114
-36.1562,25.5316
-36.1562,25.5316
-36.1575,26.7416
-36.1575,26.7416
-36.1562,25.5316
-36.1562,25.5316
-36.1575,26.7416
-36.1575,26.7416
-36.2262,27.7806
-36.2262,27.7806
-36.1575,26.7416
-36.1575,26.7416
-36.2262,27.7806
-36.2262,27.7806
-36.429,28.802
-36.429,28.802
-36.2262,27.7806
-36.2262,27.7806
-36.429,28.802
-36.429,28.802
-36.7624,29.7884
-36.7624,29.7884
-36.429,28.802
-36.429,28.802
-36.7624,29.7884
-36.7624,29.7884
-37.221,30.7233
-37.221,30.7233
-36.7624,29.7884
-36.7624,29.7884
-37.221,30.7233
-37.221,30.7233
-37.7969,31.5908
-37.7969,31.5908
-37.221,30.7233
-37.221,30.7233
-37.7969,31.5908
-37.7969,31.5908
-38.4884,32.3627
-38.4884,32.3627
-37.7969,31.5908
-37.7969,31.5908
-38.4884,32.3627
-38.4884,32.3627
-39.2729,32.9819
-39.2729,32.9819
-38.4884,32.3627
-38.4884,32.3627
-39.2729,32.9819
-39.2729,32.9819
-40.1509,33.4595
-40.1509,33.4595
-39.2729,32.9819
-39.2729,32.9819
-40.1509,33.4595
-40.1509,33.4595
-41.0971,33.7816
-41.0971,33.7816
-40.1509,33.4595
-40.1509,33.4595
-41.0971,33.7816
-41.0971,33.7816
-42.0841,33.939
-42.0841,33.939
-41.0971,33.7816
-41.0971,33.7816
-42.0841,33.939
-42.0841,33.939
-43.0848,33.9545
-43.0848,33.9545
-42.0841,33.939
-42.0841,33.939
-43.0848,33.9545
-43.0848,33.9545
-45.0948,33.9536
-45.0948,33.9536
-43.0848,33.9545
-43.0848,33.9545
-45.0948,33.9536
-45.0948,33.9536
-47.1048,33.9526
-47.1048,33.9526
-45.0948,33.9536
-45.0948,33.9536
-47.1048,33.9526
-36.1551,24.4114
-36.1562,25.5316
-32.1562,25.5357
-36.1551,24.4114
-32.1562,25.5357
-32.1551,24.4154
-36.1562,25.5316
-36.1575,26.7416
-32.1575,26.7456
-36.1562,25.5316
-32.1575,26.7456
-32.1562,25.5357
-36.1575,26.7416
-36.2262,27.7806
-32.2604,28.3032
-36.1575,26.7416
-32.2604,28.3032
-32.1575,26.7456
-36.2262,27.7806
-36.429,28.802
-32.5644,29.8342
-36.2262,27.7806
-32.5644,29.8342
-32.2604,28.3032
-36.429,28.802
-36.7624,29.7884
-33.0644,31.3129
-36.429,28.802
-33.0644,31.3129
-32.5644,29.8342
-36.7624,29.7884
-37.221,30.7233
-33.7517,32.7143
-36.7624,29.7884
-33.7517,32.7143
-33.0644,31.3129
-37.221,30.7233
-37.7969,31.5908
-34.615,34.0148
-37.221,30.7233
-34.615,34.0148
-33.7517,32.7143
-37.7969,31.5908
-38.4884,32.3627
-35.7526,35.2809
-37.7969,31.5908
-35.7526,35.2809
-34.615,34.0148
-38.4884,32.3627
-39.2729,32.9819
-37.0703,36.3209
-38.4884,32.3627
-37.0703,36.3209
-35.7526,35.2809
-39.2729,32.9819
-40.1509,33.4595
-38.545,37.1229
-39.2729,32.9819
-38.545,37.1229
-37.0703,36.3209
-40.1509,33.4595
-41.0971,33.7816
-40.1341,37.6639
-40.1509,33.4595
-40.1341,37.6639
-38.545,37.1229
-41.0971,33.7816
-42.0841,33.939
-41.7918,37.9283
-41.0971,33.7816
-41.7918,37.9283
-40.1341,37.6639
-42.0841,33.939
-43.0848,33.9545
-43.0866,37.9545
-42.0841,33.939
-43.0866,37.9545
-41.7918,37.9283
-43.0848,33.9545
-45.0948,33.9536
-45.0966,37.9536
-43.0848,33.9545
-45.0966,37.9536
-43.0866,37.9545
-45.0948,33.9536
-47.1048,33.9526
-47.1066,37.9526
-45.0948,33.9536
-47.1066,37.9526
-45.0966,37.9536
-98.0042,-24.7776
-102.004,-23.7767
-98.004,-23.7776
-98.0042,-24.7776
-102.004,-24.7767
-102.004,-23.7767
-98.004,-23.7776
-102.002,-15.4267
-98.0021,-15.4276
-98.004,-23.7776
-102.004,-23.7767
-102.002,-15.4267
-98.0021,-15.4276
-102.001,-9.05673
-98.0007,-9.05764
-98.0021,-15.4276
-102.002,-15.4267
-102.001,-9.05673
-98.0007,-9.05764
-102,-7.92673
-98.0004,-7.92764
-98.0007,-9.05764
-102.001,-9.05673
-102,-7.92673
-98.0004,-7.92764
-102,-6.77673
-98.0002,-6.77764
-98.0004,-7.92764
-102,-7.92673
-102,-6.77673
-97.7042,-24.7777
-98.004,-23.7776
-97.704,-23.7777
-97.7042,-24.7777
-98.0042,-24.7776
-98.004,-23.7776
-97.704,-23.7777
-98.0021,-15.4276
-97.7021,-15.4277
-97.704,-23.7777
-98.004,-23.7776
-98.0021,-15.4276
-97.7021,-15.4277
-98.0007,-9.05764
-97.7007,-9.05771
-97.7021,-15.4277
-98.0021,-15.4276
-98.0007,-9.05764
-97.7007,-9.05771
-98.0004,-7.92764
-97.7004,-7.92771
-97.7007,-9.05771
-98.0007,-9.05764
-98.0004,-7.92764
-97.7004,-7.92771
-98.0002,-6.77764
-97.7002,-6.77771
-97.7004,-7.92771
-98.0004,-7.92764
-98.0002,-6.77764
-93.7042,-24.7786
-97.704,-23.7777
-93.704,-23.7786
-93.7042,-24.7786
-97.7042,-24.7777
-97.704,-23.7777
-93.704,-23.7786
-97.7021,-15.4277
-93.7021,-15.4286
-93.704,-23.7786
-97.704,-23.7777
-97.7021,-15.4277
-93.7021,-15.4286
-97.7007,-9.05771
-93.7007,-9.05861
-93.7021,-15.4286
-97.7021,-15.4277
-97.7007,-9.05771
-93.7007,-9.05861
-97.7004,-7.92771
-93.7004,-7.92861
-93.7007,-9.05861
-97.7007,-9.05771
-97.7004,-7.92771
-93.7004,-7.92861
-97.7002,-6.77771
-93.7002,-6.77861
-93.7004,-7.92861
-97.7004,-7.92771
-97.7002,-6.77771
-93.7042,-24.7786
-93.704,-23.7786
-93.704,-23.7786
-93.7042,-24.7786
-93.7042,-24.7786
-93.704,-23.7786
-93.704,-23.7786
-93.7021,-15.4286
-93.7021,-15.4286
-93.704,-23.7786
-93.704,-23.7786
-93.7021,-15.4286
-93.7021,-15.4286
-93.7007,-9.05861
-93.7007,-9.05861
-93.7021,-15.4286
-93.7021,-15.4286
-93.7007,-9.05861
-93.7007,-9.05861
-93.7004,-7.92861
-93.7004,-7.92861
-93.7007,-9.05861
-93.7007,-9.05861
-93.7004,-7.92861
-93.7004,-7.92861
-93.7002,-6.77861
-93.7002,-6.77861
-93.7004,-7.92861
-93.7004,-7.92861
-93.7002,-6.77861
-36.1551,24.4114
-40.1562,25.5273
-36.1562,25.5314
-36.1551,24.4114
-40.1551,24.4073
-40.1562,25.5273
-36.1562,25.5314
-40.1575,26.5621
-36.1577,26.6062
-36.1562,25.5314
-40.1562,25.5273
-40.1575,26.5621
-36.1577,26.6062
-40.1959,27.0665
-36.2356,27.6287
-36.1577,26.6062
-40.1575,26.5621
-40.1959,27.0665
-36.2356,27.6287
-40.2994,27.5617
-36.4454,28.6325
-36.2356,27.6287
-40.1959,27.0665
-40.2994,27.5617
-36.4454,28.6325
-40.4662,28.0393
-36.7835,29.6007
-36.4454,28.6325
-40.2994,27.5617
-40.4662,28.0393
-36.7835,29.6007
-40.6935,28.4912
-37.2443,30.5168
-36.7835,29.6007
-40.4662,28.0393
-40.6935,28.4912
-37.2443,30.5168
-40.9774,28.9098
-37.8199,31.3655
-37.2443,30.5168
-40.6935,28.4912
-40.9774,28.9098
-37.8199,31.3655
-41.4071,29.4087
-38.4807,32.1357
-37.8199,31.3655
-40.9774,28.9098
-41.4071,29.4087
-38.4807,32.1357
-41.6367,29.6145
-39.2458,32.8213
-38.4807,32.1357
-41.4071,29.4087
-41.6367,29.6145
-39.2458,32.8213
-41.8995,29.7758
-40.1214,33.3589
-39.2458,32.8213
-41.6367,29.6145
-41.8995,29.7758
-40.1214,33.3589
-42.187,29.8876
-41.079,33.731
-40.1214,33.3589
-41.8995,29.7758
-42.187,29.8876
-41.079,33.731
-42.4898,29.946
-42.0878,33.9257
-41.079,33.731
-42.187,29.8876
-42.4898,29.946
-42.0878,33.9257
-45.0929,29.9536
-45.0948,33.9536
-42.0878,33.9257
-42.4898,29.946
-45.0929,29.9536
-45.0948,33.9536
-47.1029,29.9526
-47.1048,33.9526
-45.0948,33.9536
-45.0929,29.9536
-47.1029,29.9526
-36.1551,24.4114
-36.1562,25.5314
-36.1562,25.5314
-36.1551,24.4114
-36.1551,24.4114
-36.1562,25.5314
-36.1562,25.5314
-36.1577,26.6062
-36.1577,26.6062
-36.1562,25.5314
-36.1562,25.5314
-36.1577,26.6062
-36.1577,26.6062
-36.2356,27.6287
-36.2356,27.6287
-36.1577,26.6062
-36.1577,26.6062
-36.2356,27.6287
-36.2356,27.6287
-36.4454,28.6325
-36.4454,28.6325
-36.2356,27.6287
-36.2356,27.6287
-36.4454,28.6325
-36.4454,28.6325
-36.7835,29.6007
-36.7835,29.6007
-36.4454,28.6325
-36.4454,28.6325
-36.7835,29.6007
-36.7835,29.6007
-37.2443,30.5168
-37.2443,30.5168
-36.7835,29.6007
-36.7835,29.6007
-37.2443,30.5168
-37.2443,30.5168
-37.8199,31.3655
-37.8199,31.3655
-37.2443,30.5168
-37.2443,30.5168
-37.8199,31.3655
-37.8199,31.3655
-38.4807,32.1357
-38.4807,32.1357
-37.8199,31.3655
-37.8199,31.3655
-38.4807,32.1357
-38.4807,32.1357
-39.2458,32.8213
-39.2458,32.8213
-38.4807,32.1357
-38.4807,32.1357
-39.2458,32.8213
-39.2458,32.8213
-40.1214,33.3589
-40.1214,33.3589
-39.2458,32.8213
-39.2458,32.8213
-40.1214,33.3589
-40.1214,33.3589
-41.079,33.731
-41.079,33.731
-40.1214,33.3589
-40.1214,33.3589
-41.079,33.731
-41.079,33.731
-42.0878,33.9257
-42.0878,33.9257
-41.079,33.731
-41.079,33.731
-42.0878,33.9257
-42.0878,33.9257
-45.0948,33.9536
-45.0948,33.9536
-42.0878,33.9257
-42.0878,33.9257
-45.0948,33.9536
-45.0948,33.9536
-47.1048,33.9526
-47.1048,33.9526
-45.0948,33.9536
-45.0948,33.9536
-47.1048,33.9526
-44.4551,24.403
-44.4726,24.6639
-44.4726,24.6639
-44.4551,24.403
-44.4551,24.403
-44.4726,24.6639
-44.4726,24.6639
-44.5277,24.8586
-44.5277,24.8586
-44.4726,24.6639
-44.4726,24.6639
-44.5277,24.8586
-44.5277,24.8586
-44.6187,25.0394
-44.6187,25.0394
-44.5277,24.8586
-44.5277,24.8586
-44.6187,25.0394
-44.6187,25.0394
-44.9393,25.4349
-44.9393,25.4349
-44.6187,25.0394
-44.6187,25.0394
-44.9393,25.4349
-44.9393,25.4349
-45.1372,25.6704
-45.1372,25.6704
-44.9393,25.4349
-44.9393,25.4349
-45.1372,25.6704
-45.1372,25.6704
-45.1228,25.661
-45.1228,25.661
-45.1372,25.6704
-45.1372,25.6704
-45.1228,25.661
-45.1228,25.661
-45.1066,25.6553
-45.1066,25.6553
-45.1228,25.661
-45.1228,25.661
-45.1066,25.6553
-45.1066,25.6553
-47.101,25.6526
-47.101,25.6526
-45.1066,25.6553
-45.1066,25.6553
-47.101,25.6526
-44.4551,24.403
-44.4726,24.6639
-40.5379,25.384
-44.4551,24.403
-40.5379,25.384
-40.4551,24.407
-44.4726,24.6639
-44.5277,24.8586
-40.7999,26.3089
-44.4726,24.6639
-40.7999,26.3089
-40.5379,25.384
-44.5277,24.8586
-44.6187,25.0394
-41.2318,27.1676
-44.5277,24.8586
-41.2318,27.1676
-40.7999,26.3089
-44.6187,25.0394
-44.9393,25.4349
-41.8855,28.0183
-44.6187,25.0394
-41.8855,28.0183
-41.2318,27.1676
-44.9393,25.4349
-45.1372,25.6704
-42.5645,28.7332
-44.9393,25.4349
-42.5645,28.7332
-41.8855,28.0183
-45.1372,25.6704
-45.1228,25.661
-43.3519,29.2476
-45.1372,25.6704
-43.3519,29.2476
-42.5645,28.7332
-45.1228,25.661
-45.1066,25.6553
-44.239,29.56
-45.1228,25.661
-44.239,29.56
-43.3519,29.2476
-45.1066,25.6553
-47.101,25.6526
-47.1028,29.6526
-45.1066,25.6553
-47.1028,29.6526
-44.239,29.56
-40.4551,24.407
-40.5379,25.384
-40.2428,25.438
-40.4551,24.407
-40.2428,25.438
-40.1551,24.4073
-40.5379,25.384
-40.7999,26.3089
-40.5203,26.4176
-40.5379,25.384
-40.5203,26.4176
-40.2428,25.438
-40.7999,26.3089
-41.2318,27.1676
-40.9778,27.3272
-40.7999,26.3089
-40.9778,27.3272
-40.5203,26.4176
-41.2318,27.1676
-41.8855,28.0183
-41.6565,28.2121
-41.2318,27.1676
-41.6565,28.2121
-40.9778,27.3272
-41.8855,28.0183
-42.5645,28.7332
-42.3715,28.963
-41.8855,28.0183
-42.3715,28.963
-41.6565,28.2121
-42.5645,28.7332
-43.3519,29.2476
-43.2191,29.5166
-42.5645,28.7332
-43.2191,29.5166
-42.3715,28.963
-43.3519,29.2476
-44.239,29.56
-44.1739,29.8529
-43.3519,29.2476
-44.1739,29.8529
-43.2191,29.5166
-44.239,29.56
-47.1028,29.6526
-47.1029,29.9526
-44.239,29.56
-47.1029,29.9526
-44.1739,29.8529
-25.1848,33.9627
-27.0948,33.9618
-27.0948,33.9618
-25.1848,33.9627
-25.1848,33.9627
-27.0948,33.9618
-27.0948,33.9618
-28.7648,33.961
-28.7648,33.961
-27.0948,33.9618
-27.0948,33.9618
-28.7648,33.961
-28.7648,33.961
-36.1448,33.9577
-36.1448,33.9577
-28.7648,33.961
-28.7648,33.961
-36.1448,33.9577
-36.1448,33.9577
-42.6648,33.9547
-42.6648,33.9547
-36.1448,33.9577
-36.1448,33.9577
-42.6648,33.9547
-42.6648,33.9547
-45.0948,33.9536
-45.0948,33.9536
-42.6648,33.9547
-42.6648,33.9547
-45.0948,33.9536
-45.0948,33.9536
-47.1048,33.9526
-47.1048,33.9526
-45.0948,33.9536
-45.0948,33.9536
-47.1048,33.9526
-25.1848,33.9627
-27.0948,33.9618
-27.0966,37.9618
-25.1848,33.9627
-27.0966,37.9618
-25.1866,37.9627
-27.0948,33.9618
-28.7648,33.961
-28.7666,37.961
-27.0948,33.9618
-28.7666,37.961
-27.0966,37.9618
-28.7648,33.961
-36.1448,33.9577
-36.1466,37.9577
-28.7648,33.961
-36.1466,37.9577
-28.7666,37.961
-36.1448,33.9577
-42.6648,33.9547
-42.6666,37.9547
-36.1448,33.9577
-42.6666,37.9547
-36.1466,37.9577
-42.6648,33.9547
-45.0948,33.9536
-45.0966,37.9536
-42.6648,33.9547
-45.0966,37.9536
-42.6666,37.9547
-45.0948,33.9536
-47.1048,33.9526
-47.1066,37.9526
-45.0948,33.9536
-47.1066,37.9526
-45.0966,37.9536
-25.1866,37.9627
-27.0966,37.9618
-27.0967,38.2618
-25.1866,37.9627
-27.0967,38.2618
-25.1867,38.2627
-27.0966,37.9618
-28.7666,37.961
-28.7667,38.261
-27.0966,37.9618
-28.7667,38.261
-27.0967,38.2618
-28.7666,37.961
-36.1466,37.9577
-36.1467,38.2577
-28.7666,37.961
-36.1467,38.2577
-28.7667,38.261
-36.1466,37.9577
-42.6666,37.9547
-42.6667,38.2547
-36.1466,37.9577
-42.6667,38.2547
-36.1467,38.2577
-42.6666,37.9547
-45.0966,37.9536
-45.0967,38.2536
-42.6666,37.9547
-45.0967,38.2536
-42.6667,38.2547
-45.0966,37.9536
-47.1066,37.9526
-47.1067,38.2526
-45.0966,37.9536
-47.1067,38.2526
-45.0967,38.2536
-25.1867,38.2627
-27.0967,38.2618
-27.0986,42.2618
-25.1867,38.2627
-27.0986,42.2618
-25.1886,42.2627
-27.0967,38.2618
-28.7667,38.261
-28.7686,42.261
-27.0967,38.2618
-28.7686,42.261
-27.0986,42.2618
-28.7667,38.261
-36.1467,38.2577
-36.1486,42.2577
-28.7667,38.261
-36.1486,42.2577
-28.7686,42.261
-36.1467,38.2577
-42.6667,38.2547
-42.6686,42.2547
-36.1467,38.2577
-42.6686,42.2547
-36.1486,42.2577
-42.6667,38.2547
-45.0967,38.2536
-45.0986,42.2536
-42.6667,38.2547
-45.0986,42.2536
-42.6686,42.2547
-45.0967,38.2536
-47.1067,38.2526
-47.1086,42.2526
-45.0967,38.2536
-47.1086,42.2526
-45.0986,42.2536
-25.1848,33.9627
-27.0929,29.9618
-27.0948,33.9618
-25.1848,33.9627
-25.1829,29.9627
-27.0929,29.9618
-27.0948,33.9618
-28.7629,29.961
-28.7648,33.961
-27.0948,33.9618
-27.0929,29.9618
-28.7629,29.961
-28.7648,33.961
-36.1429,29.9577
-36.1448,33.9577
-28.7648,33.961
-28.7629,29.961
-36.1429,29.9577
-36.1448,33.9577
-42.6629,29.9547
-42.6648,33.9547
-36.1448,33.9577
-36.1429,29.9577
-42.6629,29.9547
-42.6648,33.9547
-45.0929,29.9536
-45.0948,33.9536
-42.6648,33.9547
-42.6629,29.9547
-45.0929,29.9536
-45.0948,33.9536
-47.1029,29.9526
-47.1048,33.9526
-45.0948,33.9536
-45.0929,29.9536
-47.1029,29.9526
-25.1848,33.9627
-27.0948,33.9618
-27.0948,33.9618
-25.1848,33.9627
-25.1848,33.9627
-27.0948,33.9618
-27.0948,33.9618
-28.7648,33.961
-28.7648,33.961
-27.0948,33.9618
-27.0948,33.9618
-28.7648,33.961
-28.7648,33.961
-36.1448,33.9577
-36.1448,33.9577
-28.7648,33.961
-28.7648,33.961
-36.1448,33.9577
-36.1448,33.9577
-42.6648,33.9547
-42.6648,33.9547
-36.1448,33.9577
-36.1448,33.9577
-42.6648,33.9547
-42.6648,33.9547
-45.0948,33.9536
-45.0948,33.9536
-42.6648,33.9547
-42.6648,33.9547
-45.0948,33.9536
-45.0948,33.9536
-47.1048,33.9526
-47.1048,33.9526
-45.0948,33.9536
-45.0948,33.9536
-47.1048,33.9526
--45.3324,-72.66
--45.5031,-72.6471
--45.5031,-72.6471
--45.3324,-72.66
--45.3324,-72.66
--45.5031,-72.6471
--45.5031,-72.6471
--45.6315,-72.6067
--45.6315,-72.6067
--45.5031,-72.6471
--45.5031,-72.6471
--45.6315,-72.6067
--45.6315,-72.6067
--45.7486,-72.5403
--45.7486,-72.5403
--45.6315,-72.6067
--45.6315,-72.6067
--45.7486,-72.5403
--45.7486,-72.5403
--45.8149,-72.4856
--45.8149,-72.4856
--45.7486,-72.5403
--45.7486,-72.5403
--45.8149,-72.4856
--45.8149,-72.4856
--45.8257,-72.4705
--45.8257,-72.4705
--45.8149,-72.4856
--45.8149,-72.4856
--45.8257,-72.4705
--45.8257,-72.4705
--45.8329,-72.4533
--45.8329,-72.4533
--45.8257,-72.4705
--45.8257,-72.4705
--45.8329,-72.4533
--45.8329,-72.4533
--45.8359,-72.4349
--45.8359,-72.4349
--45.8329,-72.4533
--45.8329,-72.4533
--45.8359,-72.4349
--45.8359,-72.4349
--45.836,-72.3881
--45.836,-72.3881
--45.8359,-72.4349
--45.8359,-72.4349
--45.836,-72.3881
--45.3324,-72.66
--45.5031,-72.6471
--46.2991,-76.5671
--45.3324,-72.66
--46.2991,-76.5671
--45.3338,-76.66
--45.5031,-72.6471
--45.6315,-72.6067
--47.2272,-76.2746
--45.5031,-72.6471
--47.2272,-76.2746
--46.2991,-76.5671
--45.6315,-72.6067
--45.7486,-72.5403
--48.0739,-75.795
--45.6315,-72.6067
--48.0739,-75.795
--47.2272,-76.2746
--45.7486,-72.5403
--45.8149,-72.4856
--48.7746,-75.1763
--45.7486,-72.5403
--48.7746,-75.1763
--48.0739,-75.795
--45.8149,-72.4856
--45.8257,-72.4705
--49.3209,-74.4156
--45.8149,-72.4856
--49.3209,-74.4156
--48.7746,-75.1763
--45.8257,-72.4705
--45.8329,-72.4533
--49.6795,-73.5504
--45.8257,-72.4705
--49.6795,-73.5504
--49.3209,-74.4156
--45.8329,-72.4533
--45.8359,-72.4349
--49.8313,-72.6262
--45.8329,-72.4533
--49.8313,-72.6262
--49.6795,-73.5504
--45.8359,-72.4349
--45.836,-72.3881
--49.836,-72.3884
--45.8359,-72.4349
--49.836,-72.3884
--49.8313,-72.6262
--45.3338,-76.66
--46.2991,-76.5671
--46.3588,-76.8611
--45.3338,-76.66
--46.3588,-76.8611
--45.3339,-76.96
--46.2991,-76.5671
--47.2272,-76.2746
--47.3469,-76.5497
--46.2991,-76.5671
--47.3469,-76.5497
--46.3588,-76.8611
--47.2272,-76.2746
--48.0739,-75.795
--48.2483,-76.0392
--47.2272,-76.2746
--48.2483,-76.0392
--47.3469,-76.5497
--48.0739,-75.795
--48.7746,-75.1763
--48.9966,-75.3781
--48.0739,-75.795
--48.9966,-75.3781
--48.2483,-76.0392
--48.7746,-75.1763
--49.3209,-74.4156
--49.5831,-74.5615
--48.7746,-75.1763
--49.5831,-74.5615
--48.9966,-75.3781
--49.3209,-74.4156
--49.6795,-73.5504
--49.968,-73.6326
--49.3209,-74.4156
--49.968,-73.6326
--49.5831,-74.5615
--49.6795,-73.5504
--49.8313,-72.6262
--50.1309,-72.6405
--49.6795,-73.5504
--50.1309,-72.6405
--49.968,-73.6326
--49.8313,-72.6262
--49.836,-72.3884
--50.136,-72.3885
--49.8313,-72.6262
--50.136,-72.3885
--50.1309,-72.6405
--45.3352,-80.96
--46.3952,-80.9596
--46.3952,-80.9596
--45.3352,-80.96
--45.3352,-80.96
--46.3952,-80.9596
--46.3952,-80.9596
--49.2861,-80.9586
--49.2861,-80.9586
--46.3952,-80.9596
--46.3952,-80.9596
--49.2861,-80.9586
--49.2861,-80.9586
--50.3111,-80.8399
--50.3111,-80.8399
--49.2861,-80.9586
--49.2861,-80.9586
--50.3111,-80.8399
--50.3111,-80.8399
--51.2821,-80.4906
--51.2821,-80.4906
--50.3111,-80.8399
--50.3111,-80.8399
--51.2821,-80.4906
--51.2821,-80.4906
--52.1478,-79.9291
--52.1478,-79.9291
--51.2821,-80.4906
--51.2821,-80.4906
--52.1478,-79.9291
--52.1478,-79.9291
--52.8619,-79.187
--52.8619,-79.187
--52.1478,-79.9291
--52.1478,-79.9291
--52.8619,-79.187
--52.8619,-79.187
--53.4235,-78.3167
--53.4235,-78.3167
--52.8619,-79.187
--52.8619,-79.187
--53.4235,-78.3167
--53.4235,-78.3167
--53.8297,-77.3639
--53.8297,-77.3639
--53.4235,-78.3167
--53.4235,-78.3167
--53.8297,-77.3639
--53.8297,-77.3639
--54.069,-76.3561
--54.069,-76.3561
--53.8297,-77.3639
--53.8297,-77.3639
--54.069,-76.3561
--54.069,-76.3561
--54.1358,-74.2086
--54.1358,-74.2086
--54.069,-76.3561
--54.069,-76.3561
--54.1358,-74.2086
--54.1358,-74.2086
--54.136,-72.3886
--54.136,-72.3886
--54.1358,-74.2086
--54.1358,-74.2086
--54.136,-72.3886
--45.3352,-80.96
--46.3952,-80.9596
--46.3966,-84.9596
--45.3352,-80.96
--46.3966,-84.9596
--45.3366,-84.96
--46.3952,-80.9596
--49.2861,-80.9586
--49.2875,-84.9586
--46.3952,-80.9596
--49.2875,-84.9586
--46.3966,-84.9596
--49.2861,-80.9586
--50.3111,-80.8399
--51.2244,-84.7342
--49.2861,-80.9586
--51.2244,-84.7342
--49.2875,-84.9586
--50.3111,-80.8399
--51.2821,-80.4906
--53.0591,-84.0742
--50.3111,-80.8399
--53.0591,-84.0742
--51.2244,-84.7342
--51.2821,-80.4906
--52.1478,-79.9291
--54.695,-83.0133
--51.2821,-80.4906
--54.695,-83.0133
--53.0591,-84.0742
--52.1478,-79.9291
--52.8619,-79.187
--56.0266,-81.6333
--52.1478,-79.9291
--56.0266,-81.6333
--54.695,-83.0133
--52.8619,-79.187
--53.4235,-78.3167
--56.9565,-80.1923
--52.8619,-79.187
--56.9565,-80.1923
--56.0266,-81.6333
--53.4235,-78.3167
--53.8297,-77.3639
--57.6291,-78.6147
--53.4235,-78.3167
--57.6291,-78.6147
--56.9565,-80.1923
--53.8297,-77.3639
--54.069,-76.3561
--58.0252,-76.9461
--53.8297,-77.3639
--58.0252,-76.9461
--57.6291,-78.6147
--54.069,-76.3561
--54.1358,-74.2086
--58.1358,-74.209
--54.069,-76.3561
--58.1358,-74.209
--58.0252,-76.9461
--54.1358,-74.2086
--54.136,-72.3886
--58.136,-72.389
--54.1358,-74.2086
--58.136,-72.389
--58.1358,-74.209
--54.136,-72.3886
--54.1359,-73.6389
--54.1359,-73.6389
--54.136,-72.3886
--54.136,-72.3886
--54.1359,-73.6389
--54.1359,-73.6389
--54.1345,-74.6681
--54.1345,-74.6681
--54.1359,-73.6389
--54.1359,-73.6389
--54.1345,-74.6681
--54.1345,-74.6681
--54.0338,-75.6707
--54.0338,-75.6707
--54.1345,-74.6681
--54.1345,-74.6681
--54.0338,-75.6707
--54.0338,-75.6707
--53.7747,-76.6444
--53.7747,-76.6444
--54.0338,-75.6707
--54.0338,-75.6707
--53.7747,-76.6444
--53.7747,-76.6444
--53.3637,-77.5645
--53.3637,-77.5645
--53.7747,-76.6444
--53.7747,-76.6444
--53.3637,-77.5645
--53.3637,-77.5645
--52.8115,-78.4073
--52.8115,-78.4073
--53.3637,-77.5645
--53.3637,-77.5645
--52.8115,-78.4073
--52.8115,-78.4073
--52.0919,-79.1885
--52.0919,-79.1885
--52.8115,-78.4073
--52.8115,-78.4073
--52.0919,-79.1885
--52.0919,-79.1885
--51.3024,-79.8119
--51.3024,-79.8119
--52.0919,-79.1885
--52.0919,-79.1885
--51.3024,-79.8119
--51.3024,-79.8119
--50.4285,-80.3103
--50.4285,-80.3103
--51.3024,-79.8119
--51.3024,-79.8119
--50.4285,-80.3103
--50.4285,-80.3103
--49.49,-80.6725
--49.49,-80.6725
--50.4285,-80.3103
--50.4285,-80.3103
--49.49,-80.6725
--49.49,-80.6725
--48.5079,-80.8904
--48.5079,-80.8904
--49.49,-80.6725
--49.49,-80.6725
--48.5079,-80.8904
--48.5079,-80.8904
--46.1652,-80.9597
--46.1652,-80.9597
--48.5079,-80.8904
--48.5079,-80.8904
--46.1652,-80.9597
--46.1652,-80.9597
--45.3352,-80.96
--45.3352,-80.96
--46.1652,-80.9597
--46.1652,-80.9597
--45.3352,-80.96
--54.136,-72.3886
--54.1359,-73.6389
--50.1359,-73.6385
--54.136,-72.3886
--50.1359,-73.6385
--50.136,-72.3883
--54.1359,-73.6389
--54.1345,-74.6681
--50.1353,-74.5878
--54.1359,-73.6389
--50.1353,-74.5878
--50.1359,-73.6385
--54.1345,-74.6681
--54.0338,-75.6707
--50.0985,-74.9542
--54.1345,-74.6681
--50.0985,-74.9542
--50.1353,-74.5878
--54.0338,-75.6707
--53.7747,-76.6444
--50.0038,-75.3102
--54.0338,-75.6707
--50.0038,-75.3102
--50.0985,-74.9542
--53.7747,-76.6444
--53.3637,-77.5645
--49.8536,-75.6465
--53.7747,-76.6444
--49.8536,-75.6465
--50.0038,-75.3102
--53.3637,-77.5645
--52.8115,-78.4073
--49.6517,-75.9545
--53.3637,-77.5645
--49.6517,-75.9545
--49.8536,-75.6465
--52.8115,-78.4073
--52.0919,-79.1885
--49.3849,-76.2436
--52.8115,-78.4073
--49.3849,-76.2436
--49.6517,-75.9545
--52.0919,-79.1885
--51.3024,-79.8119
--49.0658,-76.4955
--52.0919,-79.1885
--49.0658,-76.4955
--49.3849,-76.2436
--51.3024,-79.8119
--50.4285,-80.3103
--48.7127,-76.697
--51.3024,-79.8119
--48.7127,-76.697
--49.0658,-76.4955
--50.4285,-80.3103
--49.49,-80.6725
--48.3334,-76.8433
--50.4285,-80.3103
--48.3334,-76.8433
--48.7127,-76.697
--49.49,-80.6725
--48.5079,-80.8904
--47.9365,-76.9314
--49.49,-80.6725
--47.9365,-76.9314
--48.3334,-76.8433
--48.5079,-80.8904
--46.1652,-80.9597
--46.1639,-76.9597
--48.5079,-80.8904
--46.1639,-76.9597
--47.9365,-76.9314
--46.1652,-80.9597
--45.3352,-80.96
--45.3339,-76.96
--46.1652,-80.9597
--45.3339,-76.96
--46.1639,-76.9597
--63.3323,-85.2681
--61.6796,-89.267
--61.6823,-85.267
--63.3323,-85.2681
--63.3296,-89.2681
--61.6796,-89.267
--61.6823,-85.267
--54.2896,-89.262
--54.2923,-85.262
--61.6823,-85.267
--61.6796,-89.267
--54.2896,-89.262
--54.2923,-85.262
--49.6147,-89.2588
--49.6174,-85.2588
--54.2923,-85.262
--54.2896,-89.262
--49.6147,-89.2588
--49.6174,-85.2588
--47.048,-89.2594
--47.0467,-85.2594
--49.6174,-85.2588
--49.6147,-89.2588
--47.048,-89.2594
--47.0467,-85.2594
--45.338,-89.26
--45.3367,-85.26
--47.0467,-85.2594
--47.048,-89.2594
--45.338,-89.26
--63.3325,-84.9681
--61.6823,-85.267
--61.6825,-84.967
--63.3325,-84.9681
--63.3323,-85.2681
--61.6823,-85.267
--61.6825,-84.967
--54.2923,-85.262
--54.2925,-84.962
--61.6825,-84.967
--61.6823,-85.267
--54.2923,-85.262
--54.2925,-84.962
--49.6174,-85.2588
--49.6176,-84.9588
--54.2925,-84.962
--54.2923,-85.262
--49.6174,-85.2588
--49.6176,-84.9588
--47.0467,-85.2594
--47.0466,-84.9594
--49.6176,-84.9588
--49.6174,-85.2588
--47.0467,-85.2594
--47.0466,-84.9594
--45.3367,-85.26
--45.3366,-84.96
--47.0466,-84.9594
--47.0467,-85.2594
--45.3367,-85.26
--63.3352,-80.9681
--61.6825,-84.967
--61.6852,-80.967
--63.3352,-80.9681
--63.3325,-84.9681
--61.6825,-84.967
--61.6852,-80.967
--54.2925,-84.962
--54.2952,-80.962
--61.6852,-80.967
--61.6825,-84.967
--54.2925,-84.962
--54.2952,-80.962
--49.6176,-84.9588
--49.6203,-80.9588
--54.2952,-80.962
--54.2925,-84.962
--49.6176,-84.9588
--49.6203,-80.9588
--47.0466,-84.9594
--47.0452,-80.9594
--49.6203,-80.9588
--49.6176,-84.9588
--47.0466,-84.9594
--47.0452,-80.9594
--45.3366,-84.96
--45.3352,-80.96
--47.0452,-80.9594
--47.0466,-84.9594
--45.3366,-84.96
--63.3352,-80.9681
--61.6852,-80.967
--61.6852,-80.967
--63.3352,-80.9681
--63.3352,-80.9681
--61.6852,-80.967
--61.6852,-80.967
--54.2952,-80.962
--54.2952,-80.962
--61.6852,-80.967
--61.6852,-80.967
--54.2952,-80.962
--54.2952,-80.962
--49.6203,-80.9588
--49.6203,-80.9588
--54.2952,-80.962
--54.2952,-80.962
--49.6203,-80.9588
--49.6203,-80.9588
--47.0452,-80.9594
--47.0452,-80.9594
--49.6203,-80.9588
--49.6203,-80.9588
--47.0452,-80.9594
--47.0452,-80.9594
--45.3352,-80.96
--45.3352,-80.96
--47.0452,-80.9594
--47.0452,-80.9594
--45.3352,-80.96
--63.3352,-80.9681
--61.6852,-80.967
--61.6852,-80.967
--63.3352,-80.9681
--63.3352,-80.9681
--61.6852,-80.967
--61.6852,-80.967
--54.2952,-80.962
--54.2952,-80.962
--61.6852,-80.967
--61.6852,-80.967
--54.2952,-80.962
--54.2952,-80.962
--49.6203,-80.9588
--49.6203,-80.9588
--54.2952,-80.962
--54.2952,-80.962
--49.6203,-80.9588
--49.6203,-80.9588
--47.0452,-80.9594
--47.0452,-80.9594
--49.6203,-80.9588
--49.6203,-80.9588
--47.0452,-80.9594
--47.0452,-80.9594
--45.3352,-80.96
--45.3352,-80.96
--47.0452,-80.9594
--47.0452,-80.9594
--45.3352,-80.96
--63.3352,-80.9681
--61.6852,-80.967
--61.6879,-76.967
--63.3352,-80.9681
--61.6879,-76.967
--63.3379,-76.9681
--61.6852,-80.967
--54.2952,-80.962
--54.2979,-76.962
--61.6852,-80.967
--54.2979,-76.962
--61.6879,-76.967
--54.2952,-80.962
--49.6203,-80.9588
--49.6231,-76.9588
--54.2952,-80.962
--49.6231,-76.9588
--54.2979,-76.962
--49.6203,-80.9588
--47.0452,-80.9594
--47.0439,-76.9594
--49.6203,-80.9588
--47.0439,-76.9594
--49.6231,-76.9588
--47.0452,-80.9594
--45.3352,-80.96
--45.3339,-76.96
--47.0452,-80.9594
--45.3339,-76.96
--47.0439,-76.9594
--63.3352,-80.9681
--61.6852,-80.967
--61.6852,-80.967
--63.3352,-80.9681
--63.3352,-80.9681
--61.6852,-80.967
--61.6852,-80.967
--59.7198,-80.9657
--59.7198,-80.9657
--61.6852,-80.967
--61.6852,-80.967
--59.7198,-80.9657
--59.7198,-80.9657
--58.6725,-80.8652
--58.6725,-80.8652
--59.7198,-80.9657
--59.7198,-80.9657
--58.6725,-80.8652
--58.6725,-80.8652
--57.663,-80.5687
--57.663,-80.5687
--58.6725,-80.8652
--58.6725,-80.8652
--57.663,-80.5687
--57.663,-80.5687
--56.7277,-80.0868
--56.7277,-80.0868
--57.663,-80.5687
--57.663,-80.5687
--56.7277,-80.0868
--56.7277,-80.0868
--55.9002,-79.4371
--55.9002,-79.4371
--56.7277,-80.0868
--56.7277,-80.0868
--55.9002,-79.4371
--55.9002,-79.4371
--55.2144,-78.6513
--55.2144,-78.6513
--55.9002,-79.4371
--55.9002,-79.4371
--55.2144,-78.6513
--55.2144,-78.6513
--54.692,-77.7714
--54.692,-77.7714
--55.2144,-78.6513
--55.2144,-78.6513
--54.692,-77.7714
--54.692,-77.7714
--54.3356,-76.8121
--54.3356,-76.8121
--54.692,-77.7714
--54.692,-77.7714
--54.3356,-76.8121
--54.3356,-76.8121
--54.1566,-75.8046
--54.1566,-75.8046
--54.3356,-76.8121
--54.3356,-76.8121
--54.1566,-75.8046
--54.1566,-75.8046
--54.1358,-73.9586
--54.1358,-73.9586
--54.1566,-75.8046
--54.1566,-75.8046
--54.1358,-73.9586
--54.1358,-73.9586
--54.136,-72.3886
--54.136,-72.3886
--54.1358,-73.9586
--54.1358,-73.9586
--54.136,-72.3886
--63.3352,-80.9681
--61.6852,-80.967
--61.6879,-76.967
--63.3352,-80.9681
--61.6879,-76.967
--63.3379,-76.9681
--61.6852,-80.967
--59.7198,-80.9657
--59.7225,-76.9657
--61.6852,-80.967
--59.7225,-76.9657
--61.6879,-76.967
--59.7198,-80.9657
--58.6725,-80.8652
--59.4306,-76.9377
--59.7198,-80.9657
--59.4306,-76.9377
--59.7225,-76.9657
--58.6725,-80.8652
--57.663,-80.5687
--59.1492,-76.855
--58.6725,-80.8652
--59.1492,-76.855
--59.4306,-76.9377
--57.663,-80.5687
--56.7277,-80.0868
--58.8885,-76.7207
--57.663,-80.5687
--58.8885,-76.7207
--59.1492,-76.855
--56.7277,-80.0868
--55.9002,-79.4371
--58.6579,-76.5396
--56.7277,-80.0868
--58.6579,-76.5396
--58.8885,-76.7207
--55.9002,-79.4371
--55.2144,-78.6513
--58.4565,-76.3084
--55.9002,-79.4371
--58.4565,-76.3084
--58.6579,-76.5396
--55.2144,-78.6513
--54.692,-77.7714
--58.3011,-76.0468
--55.2144,-78.6513
--58.3011,-76.0468
--58.4565,-76.3084
--54.692,-77.7714
--54.3356,-76.8121
--58.1951,-75.7615
--54.692,-77.7714
--58.1951,-75.7615
--58.3011,-76.0468
--54.3356,-76.8121
--54.1566,-75.8046
--58.1419,-75.4619
--54.3356,-76.8121
--58.1419,-75.4619
--58.1951,-75.7615
--54.1566,-75.8046
--54.1358,-73.9586
--58.1358,-73.959
--54.1566,-75.8046
--58.1358,-73.959
--58.1419,-75.4619
--54.1358,-73.9586
--54.136,-72.3886
--58.136,-72.389
--54.1358,-73.9586
--58.136,-72.389
--58.1358,-73.959
--63.3352,-80.9681
--61.6825,-84.967
--61.6852,-80.967
--63.3352,-80.9681
--63.3325,-84.9681
--61.6825,-84.967
--61.6852,-80.967
--59.7917,-84.9657
--59.7944,-80.9657
--61.6852,-80.967
--61.6825,-84.967
--59.7917,-84.9657
--59.7944,-80.9657
--58.0377,-84.7974
--58.7958,-80.8699
--59.7944,-80.9657
--59.7917,-84.9657
--58.0377,-84.7974
--58.7958,-80.8699
--56.347,-84.3008
--57.8332,-80.5872
--58.7958,-80.8699
--58.0377,-84.7974
--56.347,-84.3008
--57.8332,-80.5872
--54.7806,-83.4939
--56.9414,-80.1277
--57.8332,-80.5872
--56.347,-84.3008
--54.7806,-83.4939
--56.9414,-80.1277
--53.3947,-82.4056
--56.1524,-79.5082
--56.9414,-80.1277
--54.7806,-83.4939
--53.3947,-82.4056
--56.1524,-79.5082
--52.3011,-81.1786
--55.4605,-78.7255
--56.1524,-79.5082
--53.3947,-82.4056
--52.3011,-81.1786
--55.4605,-78.7255
--51.3983,-79.8012
--54.9082,-77.8828
--55.4605,-78.7255
--52.3011,-81.1786
--51.3983,-79.8012
--54.9082,-77.8828
--50.7264,-78.2976
--54.4971,-76.9628
--54.9082,-77.8828
--51.3983,-79.8012
--50.7264,-78.2976
--54.4971,-76.9628
--50.3026,-76.7062
--54.2379,-75.9892
--54.4971,-76.9628
--50.7264,-78.2976
--50.3026,-76.7062
--54.2379,-75.9892
--50.1379,-75.0675
--54.137,-74.9866
--54.2379,-75.9892
--50.3026,-76.7062
--50.1379,-75.0675
--54.137,-74.9866
--50.1358,-73.9583
--54.1358,-73.9586
--54.137,-74.9866
--50.1379,-75.0675
--50.1358,-73.9583
--54.1358,-73.9586
--50.136,-72.3883
--54.136,-72.3886
--54.1358,-73.9586
--50.1358,-73.9583
--50.136,-72.3883
--63.3352,-80.9681
--61.6852,-80.967
--61.6852,-80.967
--63.3352,-80.9681
--63.3352,-80.9681
--61.6852,-80.967
--61.6852,-80.967
--59.7944,-80.9657
--59.7944,-80.9657
--61.6852,-80.967
--61.6852,-80.967
--59.7944,-80.9657
--59.7944,-80.9657
--58.7958,-80.8699
--58.7958,-80.8699
--59.7944,-80.9657
--59.7944,-80.9657
--58.7958,-80.8699
--58.7958,-80.8699
--57.8332,-80.5872
--57.8332,-80.5872
--58.7958,-80.8699
--58.7958,-80.8699
--57.8332,-80.5872
--57.8332,-80.5872
--56.9414,-80.1277
--56.9414,-80.1277
--57.8332,-80.5872
--57.8332,-80.5872
--56.9414,-80.1277
--56.9414,-80.1277
--56.1524,-79.5082
--56.1524,-79.5082
--56.9414,-80.1277
--56.9414,-80.1277
--56.1524,-79.5082
--56.1524,-79.5082
--55.4605,-78.7255
--55.4605,-78.7255
--56.1524,-79.5082
--56.1524,-79.5082
--55.4605,-78.7255
--55.4605,-78.7255
--54.9082,-77.8828
--54.9082,-77.8828
--55.4605,-78.7255
--55.4605,-78.7255
--54.9082,-77.8828
--54.9082,-77.8828
--54.4971,-76.9628
--54.4971,-76.9628
--54.9082,-77.8828
--54.9082,-77.8828
--54.4971,-76.9628
--54.4971,-76.9628
--54.2379,-75.9892
--54.2379,-75.9892
--54.4971,-76.9628
--54.4971,-76.9628
--54.2379,-75.9892
--54.2379,-75.9892
--54.137,-74.9866
--54.137,-74.9866
--54.2379,-75.9892
--54.2379,-75.9892
--54.137,-74.9866
--54.137,-74.9866
--54.1358,-73.9586
--54.1358,-73.9586
--54.137,-74.9866
--54.137,-74.9866
--54.1358,-73.9586
--54.1358,-73.9586
--54.136,-72.3886
--54.136,-72.3886
--54.1358,-73.9586
--54.1358,-73.9586
--54.136,-72.3886
--62.436,-72.3893
--62.4302,-72.3437
--62.4302,-72.3437
--62.436,-72.3893
--62.436,-72.3893
--62.4302,-72.3437
--62.4302,-72.3437
--62.4134,-72.3009
--62.4134,-72.3009
--62.4302,-72.3437
--62.4302,-72.3437
--62.4134,-72.3009
--62.4134,-72.3009
--62.3865,-72.2636
--62.3865,-72.2636
--62.4134,-72.3009
--62.4134,-72.3009
--62.3865,-72.2636
--62.3865,-72.2636
--62.5801,-72.4162
--62.5801,-72.4162
--62.3865,-72.2636
--62.3865,-72.2636
--62.5801,-72.4162
--62.5801,-72.4162
--62.7759,-72.536
--62.7759,-72.536
--62.5801,-72.4162
--62.5801,-72.4162
--62.7759,-72.536
--62.7759,-72.536
--62.99,-72.6188
--62.99,-72.6188
--62.7759,-72.536
--62.7759,-72.536
--62.99,-72.6188
--62.99,-72.6188
--63.2155,-72.6619
--63.2155,-72.6619
--62.99,-72.6188
--62.99,-72.6188
--63.2155,-72.6619
--63.2155,-72.6619
--63.3408,-72.6681
--63.3408,-72.6681
--63.2155,-72.6619
--63.2155,-72.6619
--63.3408,-72.6681
--62.436,-72.3893
--62.4302,-72.3437
--58.5545,-73.333
--62.436,-72.3893
--58.5545,-73.333
--58.436,-72.389
--62.4302,-72.3437
--62.4134,-72.3009
--58.9029,-74.2183
--62.4302,-72.3437
--58.9029,-74.2183
--58.5545,-73.333
--62.4134,-72.3009
--62.3865,-72.2636
--59.4595,-74.9899
--62.4134,-72.3009
--59.4595,-74.9899
--58.9029,-74.2183
--62.3865,-72.2636
--62.5801,-72.4162
--60.1945,-75.627
--62.3865,-72.2636
--60.1945,-75.627
--59.4595,-74.9899
--62.5801,-72.4162
--62.7759,-72.536
--61.0038,-76.122
--62.5801,-72.4162
--61.0038,-76.122
--60.1945,-75.627
--62.7759,-72.536
--62.99,-72.6188
--61.8885,-76.4641
--62.7759,-72.536
--61.8885,-76.4641
--61.0038,-76.122
--62.99,-72.6188
--63.2155,-72.6619
--62.8202,-76.6423
--62.99,-72.6188
--62.8202,-76.6423
--61.8885,-76.4641
--63.2155,-72.6619
--63.3408,-72.6681
--63.338,-76.6681
--63.2155,-72.6619
--63.338,-76.6681
--62.8202,-76.6423
--58.436,-72.389
--58.5545,-73.333
--58.2638,-73.4072
--58.436,-72.389
--58.2638,-73.4072
--58.136,-72.389
--58.5545,-73.333
--58.9029,-74.2183
--58.6396,-74.3621
--58.5545,-73.333
--58.6396,-74.3621
--58.2638,-73.4072
--58.9029,-74.2183
--59.4595,-74.9899
--59.24,-75.1944
--58.9029,-74.2183
--59.24,-75.1944
--58.6396,-74.3621
--59.4595,-74.9899
--60.1945,-75.627
--60.0156,-75.8678
--59.4595,-74.9899
--60.0156,-75.8678
--59.24,-75.1944
--60.1945,-75.627
--61.0038,-76.122
--60.8708,-76.3909
--60.1945,-75.627
--60.8708,-76.3909
--60.0156,-75.8678
--61.0038,-76.122
--61.8885,-76.4641
--61.8059,-76.7525
--61.0038,-76.122
--61.8059,-76.7525
--60.8708,-76.3909
--61.8885,-76.4641
--62.8202,-76.6423
--62.7906,-76.9408
--61.8885,-76.4641
--62.7906,-76.9408
--61.8059,-76.7525
--62.8202,-76.6423
--63.338,-76.6681
--63.3378,-76.9681
--62.8202,-76.6423
--63.3378,-76.9681
--62.7906,-76.9408
--94.5972,29.7176
--63.299,25.7032
--63.2972,29.7032
--94.5972,29.7176
--94.599,25.7176
--63.299,25.7032
--94.597,30.0176
--63.2972,29.7032
--63.2971,30.0032
--94.597,30.0176
--94.5972,29.7176
--63.2972,29.7032
--94.5952,34.0176
--63.2971,30.0032
--63.2952,34.0032
--94.5952,34.0176
--94.597,30.0176
--63.2971,30.0032
--94.5952,34.0176
--63.2952,34.0032
--63.2952,34.0032
--94.5952,34.0176
--94.5952,34.0176
--63.2952,34.0032
--94.5952,34.0176
--63.2952,34.0032
--63.2934,38.0032
--94.5952,34.0176
--63.2934,38.0032
--94.5934,38.0176
--94.5934,38.0176
--63.2934,38.0032
--63.2932,38.3032
--94.5934,38.0176
--63.2932,38.3032
--94.5932,38.3176
--94.5932,38.3176
--63.2932,38.3032
--63.2914,42.3032
--94.5932,38.3176
--63.2914,42.3032
--94.5914,42.3176
--103.447,24.3313
--103.447,25.3413
--103.447,25.3413
--103.447,24.3313
--103.447,24.3313
--103.447,25.3413
--103.447,25.3413
--103.449,31.978
--103.449,31.978
--103.447,25.3413
--103.447,25.3413
--103.449,31.978
--103.449,31.978
--103.449,33.5513
--103.449,33.5513
--103.449,31.978
--103.449,31.978
--103.449,33.5513
--103.449,33.5513
--103.45,40.5713
--103.45,40.5713
--103.449,33.5513
--103.449,33.5513
--103.45,40.5713
--103.45,40.5713
--103.451,42.3313
--103.451,42.3313
--103.45,40.5713
--103.45,40.5713
--103.451,42.3313
--103.447,24.3313
--103.447,25.3413
--107.447,25.3404
--103.447,24.3313
--107.447,25.3404
--107.447,24.3304
--103.447,25.3413
--103.449,31.978
--107.449,31.9771
--103.447,25.3413
--107.449,31.9771
--107.447,25.3404
--103.449,31.978
--103.449,33.5513
--107.449,33.5504
--103.449,31.978
--107.449,33.5504
--107.449,31.9771
--103.449,33.5513
--103.45,40.5713
--107.45,40.5704
--103.449,33.5513
--107.45,40.5704
--107.449,33.5504
--103.45,40.5713
--103.451,42.3313
--107.451,42.3304
--103.45,40.5713
--107.451,42.3304
--107.45,40.5704
--107.447,24.3304
--107.447,25.3404
--107.747,25.3404
--107.447,24.3304
--107.747,25.3404
--107.747,24.3304
--107.447,25.3404
--107.449,31.9771
--107.749,31.977
--107.447,25.3404
--107.749,31.977
--107.747,25.3404
--107.449,31.9771
--107.449,33.5504
--107.749,33.5504
--107.449,31.9771
--107.749,33.5504
--107.749,31.977
--107.449,33.5504
--107.45,40.5704
--107.75,40.5704
--107.449,33.5504
--107.75,40.5704
--107.749,33.5504
--107.45,40.5704
--107.451,42.3304
--107.751,42.3304
--107.45,40.5704
--107.751,42.3304
--107.75,40.5704
--107.747,24.3304
--107.747,25.3404
--111.747,25.3395
--107.747,24.3304
--111.747,25.3395
--111.747,24.3295
--107.747,25.3404
--107.749,31.977
--111.749,31.9761
--107.747,25.3404
--111.749,31.9761
--111.747,25.3395
--107.749,31.977
--107.749,33.5504
--111.749,33.5495
--107.749,31.977
--111.749,33.5495
--111.749,31.9761
--107.749,33.5504
--107.75,40.5704
--111.75,40.5695
--107.749,33.5504
--111.75,40.5695
--111.749,33.5495
--107.75,40.5704
--107.751,42.3304
--111.751,42.3295
--107.75,40.5704
--111.751,42.3295
--111.75,40.5695
--103.447,24.3313
--99.447,25.3423
--103.447,25.3413
--103.447,24.3313
--99.4468,24.3323
--99.447,25.3423
--103.447,25.3413
--99.4485,31.9789
--103.449,31.978
--103.447,25.3413
--99.447,25.3423
--99.4485,31.9789
--103.449,31.978
--99.4489,33.5523
--103.449,33.5513
--103.449,31.978
--99.4485,31.9789
--99.4489,33.5523
--103.449,33.5513
--99.4505,40.5723
--103.45,40.5713
--103.449,33.5513
--99.4489,33.5523
--99.4505,40.5723
--103.45,40.5713
--99.4509,42.3323
--103.451,42.3313
--103.45,40.5713
--99.4505,40.5723
--99.4509,42.3323
--103.447,24.3313
--103.447,25.3413
--103.447,25.3413
--103.447,24.3313
--103.447,24.3313
--103.447,25.3413
--103.447,25.3413
--103.449,31.978
--103.449,31.978
--103.447,25.3413
--103.447,25.3413
--103.449,31.978
--103.449,31.978
--103.449,33.5513
--103.449,33.5513
--103.449,31.978
--103.449,31.978
--103.449,33.5513
--103.449,33.5513
--103.45,40.5713
--103.45,40.5713
--103.449,33.5513
--103.449,33.5513
--103.45,40.5713
--103.45,40.5713
--103.451,42.3313
--103.451,42.3313
--103.45,40.5713
--103.45,40.5713
--103.451,42.3313
--103.447,24.3313
--99.447,25.3423
--103.447,25.3413
--103.447,24.3313
--99.4468,24.3323
--99.447,25.3423
--103.447,25.3413
--99.4409,26.1553
--103.436,26.3543
--103.447,25.3413
--99.447,25.3423
--99.4409,26.1553
--103.436,26.3543
--99.3744,26.7589
--103.317,27.4348
--103.436,26.3543
--99.4409,26.1553
--99.3744,26.7589
--103.317,27.4348
--99.2361,27.3502
--103.069,28.4932
--103.317,27.4348
--99.3744,26.7589
--99.2361,27.3502
--103.069,28.4932
--99.028,27.9207
--102.697,29.5143
--103.069,28.4932
--99.2361,27.3502
--99.028,27.9207
--102.697,29.5143
--98.7531,28.4622
--102.205,30.4835
--102.697,29.5143
--99.028,27.9207
--98.7531,28.4622
--102.205,30.4835
--98.3293,29.099
--101.615,31.38
--102.205,30.4835
--98.7531,28.4622
--98.3293,29.099
--101.615,31.38
--98.0975,29.3788
--100.95,32.1828
--101.615,31.38
--98.3293,29.099
--98.0975,29.3788
--100.95,32.1828
--97.8218,29.6153
--100.159,32.8615
--100.95,32.1828
--98.0975,29.3788
--97.8218,29.6153
--100.159,32.8615
--97.51,29.8018
--99.2642,33.3966
--100.159,32.8615
--97.8218,29.6153
--97.51,29.8018
--99.2642,33.3966
--97.1711,29.9328
--98.2919,33.7726
--99.2642,33.3966
--97.51,29.8018
--97.1711,29.9328
--98.2919,33.7726
--96.815,30.0046
--97.27,33.9786
--98.2919,33.7726
--97.1711,29.9328
--96.815,30.0046
--97.27,33.9786
--94.857,30.0177
--94.8552,34.0177
--97.27,33.9786
--96.815,30.0046
--94.857,30.0177
--94.8552,34.0177
--94.597,30.0176
--94.5952,34.0176
--94.8552,34.0177
--94.857,30.0177
--94.597,30.0176
--103.447,24.3313
--103.447,25.3413
--103.447,25.3413
--103.447,24.3313
--103.447,24.3313
--103.447,25.3413
--103.447,25.3413
--103.436,26.3543
--103.436,26.3543
--103.447,25.3413
--103.447,25.3413
--103.436,26.3543
--103.436,26.3543
--103.317,27.4348
--103.317,27.4348
--103.436,26.3543
--103.436,26.3543
--103.317,27.4348
--103.317,27.4348
--103.069,28.4932
--103.069,28.4932
--103.317,27.4348
--103.317,27.4348
--103.069,28.4932
--103.069,28.4932
--102.697,29.5143
--102.697,29.5143
--103.069,28.4932
--103.069,28.4932
--102.697,29.5143
--102.697,29.5143
--102.205,30.4835
--102.205,30.4835
--102.697,29.5143
--102.697,29.5143
--102.205,30.4835
--102.205,30.4835
--101.615,31.38
--101.615,31.38
--102.205,30.4835
--102.205,30.4835
--101.615,31.38
--101.615,31.38
--100.95,32.1828
--100.95,32.1828
--101.615,31.38
--101.615,31.38
--100.95,32.1828
--100.95,32.1828
--100.159,32.8615
--100.159,32.8615
--100.95,32.1828
--100.95,32.1828
--100.159,32.8615
--100.159,32.8615
--99.2642,33.3966
--99.2642,33.3966
--100.159,32.8615
--100.159,32.8615
--99.2642,33.3966
--99.2642,33.3966
--98.2919,33.7726
--98.2919,33.7726
--99.2642,33.3966
--99.2642,33.3966
--98.2919,33.7726
--98.2919,33.7726
--97.27,33.9786
--97.27,33.9786
--98.2919,33.7726
--98.2919,33.7726
--97.27,33.9786
--97.27,33.9786
--94.8552,34.0177
--94.8552,34.0177
--97.27,33.9786
--97.27,33.9786
--94.8552,34.0177
--94.8552,34.0177
--94.5952,34.0176
--94.5952,34.0176
--94.8552,34.0177
--94.8552,34.0177
--94.5952,34.0176
--103.447,24.3313
--103.447,25.3416
--103.447,25.3416
--103.447,24.3313
--103.447,24.3313
--103.447,25.3416
--103.447,25.3416
--103.447,26.4236
--103.447,26.4236
--103.447,25.3416
--103.447,25.3416
--103.447,26.4236
--103.447,26.4236
--103.381,27.4459
--103.381,27.4459
--103.447,26.4236
--103.447,26.4236
--103.381,27.4459
--103.381,27.4459
--103.183,28.4511
--103.183,28.4511
--103.381,27.4459
--103.381,27.4459
--103.183,28.4511
--103.183,28.4511
--102.856,29.4221
--102.856,29.4221
--103.183,28.4511
--103.183,28.4511
--102.856,29.4221
--102.856,29.4221
--102.406,30.3425
--102.406,30.3425
--102.856,29.4221
--102.856,29.4221
--102.406,30.3425
--102.406,30.3425
--101.84,31.1967
--101.84,31.1967
--102.406,30.3425
--102.406,30.3425
--101.84,31.1967
--101.84,31.1967
--101.179,31.9589
--101.179,31.9589
--101.84,31.1967
--101.84,31.1967
--101.179,31.9589
--101.179,31.9589
--100.388,32.6435
--100.388,32.6435
--101.179,31.9589
--101.179,31.9589
--100.388,32.6435
--100.388,32.6435
--99.5038,33.2022
--99.5038,33.2022
--100.388,32.6435
--100.388,32.6435
--99.5038,33.2022
--99.5038,33.2022
--98.5458,33.6224
--98.5458,33.6224
--99.5038,33.2022
--99.5038,33.2022
--98.5458,33.6224
--98.5458,33.6224
--97.5358,33.8948
--97.5358,33.8948
--98.5458,33.6224
--98.5458,33.6224
--97.5358,33.8948
--97.5358,33.8948
--96.4964,34.0132
--96.4964,34.0132
--97.5358,33.8948
--97.5358,33.8948
--96.4964,34.0132
--96.4964,34.0132
--94.5952,34.0176
--94.5952,34.0176
--96.4964,34.0132
--96.4964,34.0132
--94.5952,34.0176
--103.447,24.3313
--103.447,25.3416
--107.447,25.3407
--103.447,24.3313
--107.447,25.3407
--107.447,24.3304
--103.447,25.3416
--103.447,26.4236
--107.447,26.4227
--103.447,25.3416
--107.447,26.4227
--107.447,25.3407
--103.447,26.4236
--103.381,27.4459
--107.347,27.9636
--103.447,26.4236
--107.347,27.9636
--107.447,26.4227
--103.381,27.4459
--103.183,28.4511
--107.048,29.4785
--103.381,27.4459
--107.048,29.4785
--107.347,27.9636
--103.183,28.4511
--102.856,29.4221
--106.556,30.942
--103.183,28.4511
--106.556,30.942
--107.048,29.4785
--102.856,29.4221
--102.406,30.3425
--105.877,32.3292
--102.856,29.4221
--105.877,32.3292
--106.556,30.942
--102.406,30.3425
--101.84,31.1967
--105.025,33.6168
--102.406,30.3425
--105.025,33.6168
--105.877,32.3292
--101.84,31.1967
--101.179,31.9589
--104.016,34.7789
--101.84,31.1967
--104.016,34.7789
--105.025,33.6168
--101.179,31.9589
--100.388,32.6435
--102.772,35.8557
--101.179,31.9589
--102.772,35.8557
--104.016,34.7789
--100.388,32.6435
--99.5038,33.2022
--101.381,36.7345
--100.388,32.6435
--101.381,36.7345
--102.772,35.8557
--99.5038,33.2022
--98.5458,33.6224
--99.8737,37.3956
--99.5038,33.2022
--99.8737,37.3956
--101.381,36.7345
--98.5458,33.6224
--97.5358,33.8948
--98.285,37.824
--98.5458,33.6224
--98.285,37.824
--99.8737,37.3956
--97.5358,33.8948
--96.4964,34.0132
--96.65,38.0102
--97.5358,33.8948
--96.65,38.0102
--98.285,37.824
--96.4964,34.0132
--94.5952,34.0176
--94.5934,38.0176
--96.4964,34.0132
--94.5934,38.0176
--96.65,38.0102
--95.1468,24.3332
--95.1214,24.6159
--95.1214,24.6159
--95.1468,24.3332
--95.1468,24.3332
--95.1214,24.6159
--95.1214,24.6159
--95.0457,24.8895
--95.0457,24.8895
--95.1214,24.6159
--95.1214,24.6159
--95.0457,24.8895
--95.0457,24.8895
--94.9223,25.1452
--94.9223,25.1452
--95.0457,24.8895
--95.0457,24.8895
--94.9223,25.1452
--94.9223,25.1452
--94.3955,25.8589
--94.3955,25.8589
--94.9223,25.1452
--94.9223,25.1452
--94.3955,25.8589
--94.3955,25.8589
--94.46,25.7932
--94.46,25.7932
--94.3955,25.8589
--94.3955,25.8589
--94.46,25.7932
--94.46,25.7932
--94.5391,25.7463
--94.5391,25.7463
--94.46,25.7932
--94.46,25.7932
--94.5391,25.7463
--94.5391,25.7463
--94.6276,25.7213
--94.6276,25.7213
--94.5391,25.7463
--94.5391,25.7463
--94.6276,25.7213
--94.6276,25.7213
--94.599,25.7176
--94.599,25.7176
--94.6276,25.7213
--94.6276,25.7213
--94.599,25.7176
--95.1468,24.3332
--95.1214,24.6159
--99.0569,25.3312
--95.1468,24.3332
--99.0569,25.3312
--99.1468,24.3323
--95.1214,24.6159
--95.0457,24.8895
--98.7896,26.2978
--95.1214,24.6159
--98.7896,26.2978
--99.0569,25.3312
--95.0457,24.8895
--94.9223,25.1452
--98.3536,27.2009
--95.0457,24.8895
--98.3536,27.2009
--98.7896,26.2978
--94.9223,25.1452
--94.3955,25.8589
--97.59,28.2663
--94.9223,25.1452
--97.59,28.2663
--98.3536,27.2009
--94.3955,25.8589
--94.46,25.7932
--96.9281,28.9409
--94.3955,25.8589
--96.9281,28.9409
--97.59,28.2663
--94.46,25.7932
--94.5391,25.7463
--96.1151,29.4228
--94.46,25.7932
--96.1151,29.4228
--96.9281,28.9409
--94.5391,25.7463
--94.6276,25.7213
--95.2055,29.6794
--94.5391,25.7463
--95.2055,29.6794
--96.1151,29.4228
--94.6276,25.7213
--94.599,25.7176
--94.5972,29.7176
--94.6276,25.7213
--94.5972,29.7176
--95.2055,29.6794
--99.1468,24.3323
--99.0569,25.3312
--99.3521,25.3848
--99.1468,24.3323
--99.3521,25.3848
--99.4468,24.3323
--99.0569,25.3312
--98.7896,26.2978
--99.0704,26.4034
--99.0569,25.3312
--99.0704,26.4034
--99.3521,25.3848
--98.7896,26.2978
--98.3536,27.2009
--98.6109,27.3551
--98.7896,26.2978
--98.6109,27.3551
--99.0704,26.4034
--98.3536,27.2009
--97.59,28.2663
--97.8296,28.4468
--98.3536,27.2009
--97.8296,28.4468
--98.6109,27.3551
--97.59,28.2663
--96.9281,28.9409
--97.1132,29.177
--97.59,28.2663
--97.1132,29.177
--97.8296,28.4468
--96.9281,28.9409
--96.1151,29.4228
--96.2333,29.6985
--96.9281,28.9409
--96.2333,29.6985
--97.1132,29.177
--96.1151,29.4228
--95.2055,29.6794
--95.2488,29.9762
--96.1151,29.4228
--95.2488,29.9762
--96.2333,29.6985
--95.2055,29.6794
--94.5972,29.7176
--94.597,30.0176
--95.2055,29.6794
--94.597,30.0176
--95.2488,29.9762
--94.5952,34.0176
--97.0937,34.0187
--97.0937,34.0187
--94.5952,34.0176
--94.5952,34.0176
--97.0937,34.0187
--97.0937,34.0187
--98.1085,34.0853
--98.1085,34.0853
--97.0937,34.0187
--97.0937,34.0187
--98.1085,34.0853
--98.1085,34.0853
--99.1061,34.2828
--99.1061,34.2828
--98.1085,34.0853
--98.1085,34.0853
--99.1061,34.2828
--99.1061,34.2828
--100.07,34.6079
--100.07,34.6079
--99.1061,34.2828
--99.1061,34.2828
--100.07,34.6079
--100.07,34.6079
--100.983,35.0553
--100.983,35.0553
--100.07,34.6079
--100.07,34.6079
--100.983,35.0553
--100.983,35.0553
--101.823,35.6232
--101.823,35.6232
--100.983,35.0553
--100.983,35.0553
--101.823,35.6232
--101.823,35.6232
--102.54,36.3729
--102.54,36.3729
--101.823,35.6232
--101.823,35.6232
--102.54,36.3729
--102.54,36.3729
--103.064,37.2622
--103.064,37.2622
--102.54,36.3729
--102.54,36.3729
--103.064,37.2622
--103.064,37.2622
--103.371,38.2476
--103.371,38.2476
--103.064,37.2622
--103.064,37.2622
--103.371,38.2476
--103.371,38.2476
--103.45,40.5713
--103.45,40.5713
--103.371,38.2476
--103.371,38.2476
--103.45,40.5713
--103.45,40.5713
--103.451,42.3313
--103.451,42.3313
--103.45,40.5713
--103.45,40.5713
--103.451,42.3313
--94.5952,34.0176
--97.0937,34.0187
--97.0955,30.0187
--94.5952,34.0176
--97.0955,30.0187
--94.597,30.0176
--97.0937,34.0187
--98.1085,34.0853
--98.6288,30.1192
--97.0937,34.0187
--98.6288,30.1192
--97.0955,30.0187
--98.1085,34.0853
--99.1061,34.2828
--100.136,30.4177
--98.1085,34.0853
--100.136,30.4177
--98.6288,30.1192
--99.1061,34.2828
--100.07,34.6079
--101.592,30.909
--99.1061,34.2828
--101.592,30.909
--100.136,30.4177
--100.07,34.6079
--100.983,35.0553
--102.972,31.5849
--100.07,34.6079
--102.972,31.5849
--101.592,30.909
--100.983,35.0553
--101.823,35.6232
--104.376,32.5439
--100.983,35.0553
--104.376,32.5439
--102.972,31.5849
--101.823,35.6232
--102.54,36.3729
--105.73,33.9603
--101.823,35.6232
--105.73,33.9603
--104.376,32.5439
--102.54,36.3729
--103.064,37.2622
--106.72,35.6405
--102.54,36.3729
--106.72,35.6405
--105.73,33.9603
--103.064,37.2622
--103.371,38.2476
--107.301,37.5022
--103.064,37.2622
--107.301,37.5022
--106.72,35.6405
--103.371,38.2476
--103.45,40.5713
--107.45,40.5704
--103.371,38.2476
--107.45,40.5704
--107.301,37.5022
--103.45,40.5713
--103.451,42.3313
--107.451,42.3304
--103.45,40.5713
--107.451,42.3304
--107.45,40.5704
--103.451,42.3313
--103.451,41.2511
--103.451,41.2511
--103.451,42.3313
--103.451,42.3313
--103.451,41.2511
--103.451,41.2511
--103.45,39.6618
--103.45,39.6618
--103.451,41.2511
--103.451,41.2511
--103.45,39.6618
--103.45,39.6618
--103.355,38.6649
--103.355,38.6649
--103.45,39.6618
--103.45,39.6618
--103.355,38.6649
--103.355,38.6649
--103.073,37.7038
--103.073,37.7038
--103.355,38.6649
--103.355,38.6649
--103.073,37.7038
--103.073,37.7038
--102.615,36.8133
--102.615,36.8133
--103.073,37.7038
--103.073,37.7038
--102.615,36.8133
--102.615,36.8133
--101.997,36.0253
--101.997,36.0253
--102.615,36.8133
--102.615,36.8133
--101.997,36.0253
--101.997,36.0253
--101.22,35.3491
--101.22,35.3491
--101.997,36.0253
--101.997,36.0253
--101.22,35.3491
--101.22,35.3491
--100.348,34.8045
--100.348,34.8045
--101.22,35.3491
--101.22,35.3491
--100.348,34.8045
--100.348,34.8045
--99.4047,34.3963
--99.4047,34.3963
--100.348,34.8045
--100.348,34.8045
--99.4047,34.3963
--99.4047,34.3963
--98.4105,34.1337
--98.4105,34.1337
--99.4047,34.3963
--99.4047,34.3963
--98.4105,34.1337
--98.4105,34.1337
--97.3884,34.0226
--97.3884,34.0226
--98.4105,34.1337
--98.4105,34.1337
--97.3884,34.0226
--97.3884,34.0226
--94.9752,34.0178
--94.9752,34.0178
--97.3884,34.0226
--97.3884,34.0226
--94.9752,34.0178
--94.9752,34.0178
--94.5952,34.0176
--94.5952,34.0176
--94.9752,34.0178
--94.9752,34.0178
--94.5952,34.0176
--103.451,42.3313
--103.451,41.2511
--99.4506,41.252
--103.451,42.3313
--99.4506,41.252
--99.4509,42.3323
--103.451,41.2511
--103.45,39.6618
--99.4503,39.6627
--103.451,41.2511
--99.4503,39.6627
--99.4506,41.252
--103.45,39.6618
--103.355,38.6649
--99.4272,39.4212
--103.45,39.6618
--99.4272,39.4212
--99.4503,39.6627
--103.355,38.6649
--103.073,37.7038
--99.3589,39.1883
--103.355,38.6649
--99.3589,39.1883
--99.4272,39.4212
--103.073,37.7038
--102.615,36.8133
--99.2479,38.9726
--103.073,37.7038
--99.2479,38.9726
--99.3589,39.1883
--102.615,36.8133
--101.997,36.0253
--99.0981,38.7817
--102.615,36.8133
--99.0981,38.7817
--99.2479,38.9726
--101.997,36.0253
--101.22,35.3491
--98.8533,38.5735
--101.997,36.0253
--98.8533,38.5735
--99.0981,38.7817
--101.22,35.3491
--100.348,34.8045
--98.4897,38.3464
--101.22,35.3491
--98.4897,38.3464
--98.8533,38.5735
--100.348,34.8045
--99.4047,34.3963
--98.0961,38.1762
--100.348,34.8045
--98.0961,38.1762
--98.4897,38.3464
--99.4047,34.3963
--98.4105,34.1337
--97.6816,38.0667
--99.4047,34.3963
--97.6816,38.0667
--98.0961,38.1762
--98.4105,34.1337
--97.3884,34.0226
--97.2553,38.0203
--98.4105,34.1337
--97.2553,38.0203
--97.6816,38.0667
--97.3884,34.0226
--94.9752,34.0178
--94.9734,38.0178
--97.3884,34.0226
--94.9734,38.0178
--97.2553,38.0203
--94.9752,34.0178
--94.5952,34.0176
--94.5934,38.0176
--94.9752,34.0178
--94.5934,38.0176
--94.9734,38.0178
-89.4042,-24.7794
-89.6037,-23.7796
-89.3097,-23.8392
-89.4042,-24.7794
-89.7042,-24.7793
-89.6037,-23.7796
-89.3097,-23.8392
-89.3065,-22.8197
-89.0302,-22.9366
-89.3097,-23.8392
-89.6037,-23.7796
-89.3065,-22.8197
-89.0302,-22.9366
-88.8245,-21.938
-88.577,-22.1075
-89.0302,-22.9366
-89.3065,-22.8197
-88.8245,-21.938
-88.577,-22.1075
-87.8737,-20.8283
-87.653,-21.0315
-88.577,-22.1075
-88.8245,-21.938
-87.8737,-20.8283
-87.653,-21.0315
-87.0959,-20.1572
-86.9273,-20.4053
-87.653,-21.0315
-87.8737,-20.8283
-87.0959,-20.1572
-86.9273,-20.4053
-86.1856,-19.681
-86.078,-19.961
-86.9273,-20.4053
-87.0959,-20.1572
-86.1856,-19.681
-86.078,-19.961
-85.1907,-19.4249
-85.1497,-19.7221
-86.078,-19.961
-86.1856,-19.681
-85.1907,-19.4249
-85.1497,-19.7221
-84.5224,-19.383
-84.5222,-19.683
-85.1497,-19.7221
-85.1907,-19.4249
-84.5224,-19.383
-85.4042,-24.7805
-89.3097,-23.8392
-85.3896,-24.6349
-85.4042,-24.7805
-89.4042,-24.7794
-89.3097,-23.8392
-85.3896,-24.6349
-89.0302,-22.9366
-85.3464,-24.4952
-85.3896,-24.6349
-89.3097,-23.8392
-89.0302,-22.9366
-85.3464,-24.4952
-88.577,-22.1075
-85.2762,-24.3669
-85.3464,-24.4952
-89.0302,-22.9366
-88.577,-22.1075
-85.2762,-24.3669
-87.653,-21.0315
-84.7096,-23.7401
-85.2762,-24.3669
-88.577,-22.1075
-87.653,-21.0315
-84.7096,-23.7401
-86.9273,-20.4053
-84.6789,-23.7136
-84.7096,-23.7401
-87.653,-21.0315
-86.9273,-20.4053
-84.6789,-23.7136
-86.078,-19.961
-84.643,-23.6948
-84.6789,-23.7136
-86.9273,-20.4053
-86.078,-19.961
-84.643,-23.6948
-85.1497,-19.7221
-84.6037,-23.6847
-84.643,-23.6948
-86.078,-19.961
-85.1497,-19.7221
-84.6037,-23.6847
-84.5222,-19.683
-84.5197,-23.683
-84.6037,-23.6847
-85.1497,-19.7221
-84.5222,-19.683
-85.4042,-24.7805
-85.3896,-24.6349
-85.3896,-24.6349
-85.4042,-24.7805
-85.4042,-24.7805
-85.3896,-24.6349
-85.3896,-24.6349
-85.3464,-24.4952
-85.3464,-24.4952
-85.3896,-24.6349
-85.3896,-24.6349
-85.3464,-24.4952
-85.3464,-24.4952
-85.2762,-24.3669
-85.2762,-24.3669
-85.3464,-24.4952
-85.3464,-24.4952
-85.2762,-24.3669
-85.2762,-24.3669
-84.7096,-23.7401
-84.7096,-23.7401
-85.2762,-24.3669
-85.2762,-24.3669
-84.7096,-23.7401
-84.7096,-23.7401
-84.6789,-23.7136
-84.6789,-23.7136
-84.7096,-23.7401
-84.7096,-23.7401
-84.6789,-23.7136
-84.6789,-23.7136
-84.643,-23.6948
-84.643,-23.6948
-84.6789,-23.7136
-84.6789,-23.7136
-84.643,-23.6948
-84.643,-23.6948
-84.6037,-23.6847
-84.6037,-23.6847
-84.643,-23.6948
-84.643,-23.6948
-84.6037,-23.6847
-84.6037,-23.6847
-84.5197,-23.683
-84.5197,-23.683
-84.6037,-23.6847
-84.6037,-23.6847
-84.5197,-23.683
--99.1509,42.3321
--99.3563,41.3375
--99.0635,41.403
--99.1509,42.3321
--99.4509,42.3321
--99.3563,41.3375
--99.0635,41.403
--99.008,40.384
--98.7419,40.5225
--99.0635,41.403
--99.3563,41.3375
--99.008,40.384
--98.7419,40.5225
--98.4262,39.552
--98.2047,39.7543
--98.7419,40.5225
--99.008,40.384
--98.4262,39.552
--98.2047,39.7543
--97.6496,38.8888
--97.4808,39.1368
--98.2047,39.7543
--98.4262,39.552
--97.6496,38.8888
--97.4808,39.1368
--96.7676,38.4097
--96.6515,38.6863
--97.4808,39.1368
--97.6496,38.8888
--96.7676,38.4097
--96.6515,38.6863
--95.808,38.1155
--95.7491,38.4096
--96.6515,38.6863
--96.7676,38.4097
--95.808,38.1155
--95.7491,38.4096
--94.6834,38.0176
--94.6832,38.3176
--95.7491,38.4096
--95.808,38.1155
--94.6834,38.0176
--94.6832,38.3176
--94.5934,38.0176
--94.5932,38.3176
--94.6832,38.3176
--94.6834,38.0176
--94.5934,38.0176
--95.1509,42.333
--99.0635,41.403
--95.1601,42.2768
--95.1509,42.333
--99.1509,42.3321
--99.0635,41.403
--95.1601,42.2768
--98.7419,40.5225
--95.1943,42.3705
--95.1601,42.2768
--99.0635,41.403
--98.7419,40.5225
--95.1943,42.3705
--98.2047,39.7543
--95.2515,42.4522
--95.1943,42.3705
--98.7419,40.5225
--98.2047,39.7543
--95.2515,42.4522
--97.4808,39.1368
--95.2304,42.4437
--95.2515,42.4522
--98.2047,39.7543
--97.4808,39.1368
--95.2304,42.4437
--96.6515,38.6863
--95.1028,42.3744
--95.2304,42.4437
--97.4808,39.1368
--96.6515,38.6863
--95.1028,42.3744
--95.7491,38.4096
--94.964,42.3318
--95.1028,42.3744
--96.6515,38.6863
--95.7491,38.4096
--94.964,42.3318
--94.6832,38.3176
--94.6814,42.3176
--94.964,42.3318
--95.7491,38.4096
--94.6832,38.3176
--94.6814,42.3176
--94.5932,38.3176
--94.5914,42.3176
--94.6814,42.3176
--94.6832,38.3176
--94.5932,38.3176
--95.1509,42.333
--95.1601,42.2768
--95.1601,42.2768
--95.1509,42.333
--95.1509,42.333
--95.1601,42.2768
--95.1601,42.2768
--95.1943,42.3705
--95.1943,42.3705
--95.1601,42.2768
--95.1601,42.2768
--95.1943,42.3705
--95.1943,42.3705
--95.2515,42.4522
--95.2515,42.4522
--95.1943,42.3705
--95.1943,42.3705
--95.2515,42.4522
--95.2515,42.4522
--95.2304,42.4437
--95.2304,42.4437
--95.2515,42.4522
--95.2515,42.4522
--95.2304,42.4437
--95.2304,42.4437
--95.1028,42.3744
--95.1028,42.3744
--95.2304,42.4437
--95.2304,42.4437
--95.1028,42.3744
--95.1028,42.3744
--94.964,42.3318
--94.964,42.3318
--95.1028,42.3744
--95.1028,42.3744
--94.964,42.3318
--94.964,42.3318
--94.6814,42.3176
--94.6814,42.3176
--94.964,42.3318
--94.964,42.3318
--94.6814,42.3176
--94.6814,42.3176
--94.5914,42.3176
--94.5914,42.3176
--94.6814,42.3176
--94.6814,42.3176
--94.5914,42.3176
-93.7042,-24.7786
-97.704,-23.7777
-93.704,-23.7786
-93.7042,-24.7786
-97.7042,-24.7777
-97.704,-23.7777
-93.704,-23.7786
-97.7038,-22.59
-93.7038,-22.5909
-93.704,-23.7786
-97.704,-23.7777
-97.7038,-22.59
-93.7038,-22.5909
-97.5905,-20.9805
-93.6298,-21.5396
-93.7038,-22.5909
-97.7038,-22.59
-97.5905,-20.9805
-93.6298,-21.5396
-97.2538,-19.4026
-93.4099,-20.5088
-93.6298,-21.5396
-97.5905,-20.9805
-97.2538,-19.4026
-93.4099,-20.5088
-96.7002,-17.887
-93.0482,-19.5189
-93.4099,-20.5088
-97.2538,-19.4026
-96.7002,-17.887
-93.0482,-19.5189
-95.9406,-16.4636
-92.552,-18.5891
-93.0482,-19.5189
-96.7002,-17.887
-95.9406,-16.4636
-92.552,-18.5891
-94.9897,-15.16
-91.9309,-17.7376
-92.552,-18.5891
-95.9406,-16.4636
-94.9897,-15.16
-91.9309,-17.7376
-93.8196,-13.9691
-91.196,-16.9885
-91.9309,-17.7376
-94.9897,-15.16
-93.8196,-13.9691
-91.196,-16.9885
-92.4633,-12.969
-90.3543,-16.3679
-91.196,-16.9885
-93.8196,-13.9691
-92.4633,-12.969
-90.3543,-16.3679
-90.965,-12.1978
-89.4244,-15.8892
-90.3543,-16.3679
-92.4633,-12.969
-90.965,-12.1978
-89.4244,-15.8892
-89.363,-11.6751
-88.4302,-15.5649
-89.4244,-15.8892
-90.965,-12.1978
-89.363,-11.6751
-88.4302,-15.5649
-87.6981,-11.4144
-87.397,-15.403
-88.4302,-15.5649
-89.363,-11.6751
-87.6981,-11.4144
-87.397,-15.403
-85.6772,-11.3837
-85.6748,-15.3837
-87.397,-15.403
-87.6981,-11.4144
-85.6772,-11.3837
-85.6748,-15.3837
-84.5872,-11.383
-84.5848,-15.383
-85.6748,-15.3837
-85.6772,-11.3837
-84.5872,-11.383
-84.5848,-15.383
-84.5272,-11.383
-84.5248,-15.383
-84.5848,-15.383
-84.5872,-11.383
-84.5272,-11.383
-93.7042,-24.7786
-93.704,-23.7786
-93.704,-23.7786
-93.7042,-24.7786
-93.7042,-24.7786
-93.704,-23.7786
-93.704,-23.7786
-93.7038,-22.5909
-93.7038,-22.5909
-93.704,-23.7786
-93.704,-23.7786
-93.7038,-22.5909
-93.7038,-22.5909
-93.6298,-21.5396
-93.6298,-21.5396
-93.7038,-22.5909
-93.7038,-22.5909
-93.6298,-21.5396
-93.6298,-21.5396
-93.4099,-20.5088
-93.4099,-20.5088
-93.6298,-21.5396
-93.6298,-21.5396
-93.4099,-20.5088
-93.4099,-20.5088
-93.0482,-19.5189
-93.0482,-19.5189
-93.4099,-20.5088
-93.4099,-20.5088
-93.0482,-19.5189
-93.0482,-19.5189
-92.552,-18.5891
-92.552,-18.5891
-93.0482,-19.5189
-93.0482,-19.5189
-92.552,-18.5891
-92.552,-18.5891
-91.9309,-17.7376
-91.9309,-17.7376
-92.552,-18.5891
-92.552,-18.5891
-91.9309,-17.7376
-91.9309,-17.7376
-91.196,-16.9885
-91.196,-16.9885
-91.9309,-17.7376
-91.9309,-17.7376
-91.196,-16.9885
-91.196,-16.9885
-90.3543,-16.3679
-90.3543,-16.3679
-91.196,-16.9885
-91.196,-16.9885
-90.3543,-16.3679
-90.3543,-16.3679
-89.4244,-15.8892
-89.4244,-15.8892
-90.3543,-16.3679
-90.3543,-16.3679
-89.4244,-15.8892
-89.4244,-15.8892
-88.4302,-15.5649
-88.4302,-15.5649
-89.4244,-15.8892
-89.4244,-15.8892
-88.4302,-15.5649
-88.4302,-15.5649
-87.397,-15.403
-87.397,-15.403
-88.4302,-15.5649
-88.4302,-15.5649
-87.397,-15.403
-87.397,-15.403
-85.6748,-15.3837
-85.6748,-15.3837
-87.397,-15.403
-87.397,-15.403
-85.6748,-15.3837
-85.6748,-15.3837
-84.5848,-15.383
-84.5848,-15.383
-85.6748,-15.3837
-85.6748,-15.3837
-84.5848,-15.383
-84.5848,-15.383
-84.5248,-15.383
-84.5248,-15.383
-84.5848,-15.383
-84.5848,-15.383
-84.5248,-15.383
--45.2972,29.695
-25.181,25.6627
-25.1828,29.6627
--45.2972,29.695
--45.299,25.695
-25.181,25.6627
--45.2971,29.995
-25.1828,29.6627
-25.1829,29.9627
--45.2971,29.995
--45.2972,29.695
-25.1828,29.6627
--45.2952,33.995
-25.1829,29.9627
-25.1848,33.9627
--45.2952,33.995
--45.2971,29.995
-25.1829,29.9627
--45.2952,33.995
-25.1848,33.9627
-25.1848,33.9627
--45.2952,33.995
--45.2952,33.995
-25.1848,33.9627
--45.2952,33.995
-25.1848,33.9627
-25.1866,37.9627
--45.2952,33.995
-25.1866,37.9627
--45.2934,37.995
--45.2934,37.995
-25.1866,37.9627
-25.1867,38.2627
--45.2934,37.995
-25.1867,38.2627
--45.2932,38.295
--45.2932,38.295
-25.1867,38.2627
-25.1886,42.2627
--45.2932,38.295
-25.1886,42.2627
--45.2914,42.295
-93.7042,-24.7786
-93.704,-23.7783
-93.704,-23.7783
-93.7042,-24.7786
-93.7042,-24.7786
-93.704,-23.7783
-93.704,-23.7783
-93.7003,-22.7696
-93.7003,-22.7696
-93.704,-23.7783
-93.704,-23.7783
-93.7003,-22.7696
-93.7003,-22.7696
-93.6043,-21.7648
-93.6043,-21.7648
-93.7003,-22.7696
-93.7003,-22.7696
-93.6043,-21.7648
-93.6043,-21.7648
-93.3789,-20.781
-93.3789,-20.781
-93.6043,-21.7648
-93.6043,-21.7648
-93.3789,-20.781
-93.3789,-20.781
-93.0279,-19.8347
-93.0279,-19.8347
-93.3789,-20.781
-93.3789,-20.781
-93.0279,-19.8347
-93.0279,-19.8347
-92.5571,-18.9418
-92.5571,-18.9418
-93.0279,-19.8347
-93.0279,-19.8347
-92.5571,-18.9418
-92.5571,-18.9418
-91.9746,-18.1176
-91.9746,-18.1176
-92.5571,-18.9418
-92.5571,-18.9418
-91.9746,-18.1176
-91.9746,-18.1176
-91.2941,-17.3804
-91.2941,-17.3804
-91.9746,-18.1176
-91.9746,-18.1176
-91.2941,-17.3804
-91.2941,-17.3804
-90.5069,-16.7329
-90.5069,-16.7329
-91.2941,-17.3804
-91.2941,-17.3804
-90.5069,-16.7329
-90.5069,-16.7329
-89.6369,-16.2017
-89.6369,-16.2017
-90.5069,-16.7329
-90.5069,-16.7329
-89.6369,-16.2017
-89.6369,-16.2017
-88.7014,-15.797
-88.7014,-15.797
-89.6369,-16.2017
-89.6369,-16.2017
-88.7014,-15.797
-88.7014,-15.797
-87.7185,-15.5268
-87.7185,-15.5268
-88.7014,-15.797
-88.7014,-15.797
-87.7185,-15.5268
-87.7185,-15.5268
-86.7076,-15.3964
-86.7076,-15.3964
-87.7185,-15.5268
-87.7185,-15.5268
-86.7076,-15.3964
-86.7076,-15.3964
-85.6748,-15.3837
-85.6748,-15.3837
-86.7076,-15.3964
-86.7076,-15.3964
-85.6748,-15.3837
-85.6748,-15.3837
-84.5848,-15.383
-84.5848,-15.383
-85.6748,-15.3837
-85.6748,-15.3837
-84.5848,-15.383
-84.5848,-15.383
-84.5248,-15.383
-84.5248,-15.383
-84.5848,-15.383
-84.5848,-15.383
-84.5248,-15.383
-93.7042,-24.7786
-93.704,-23.7783
-89.704,-23.7792
-93.7042,-24.7786
-89.704,-23.7792
-89.7042,-24.7795
-93.704,-23.7783
-93.7003,-22.7696
-89.7021,-22.8905
-93.704,-23.7783
-89.7021,-22.8905
-89.704,-23.7792
-93.7003,-22.7696
-93.6043,-21.7648
-89.6556,-22.403
-93.7003,-22.7696
-89.6556,-22.403
-89.7021,-22.8905
-93.6043,-21.7648
-93.3789,-20.781
-89.5462,-21.9257
-93.6043,-21.7648
-89.5462,-21.9257
-89.6556,-22.403
-93.3789,-20.781
-93.0279,-19.8347
-89.3759,-21.4665
-93.3789,-20.781
-89.3759,-21.4665
-89.5462,-21.9257
-93.0279,-19.8347
-92.5571,-18.9418
-89.1475,-21.0333
-93.0279,-19.8347
-89.1475,-21.0333
-89.3759,-21.4665
-92.5571,-18.9418
-91.9746,-18.1176
-88.8648,-20.6334
-92.5571,-18.9418
-88.8648,-20.6334
-89.1475,-21.0333
-91.9746,-18.1176
-91.2941,-17.3804
-88.5435,-20.2845
-91.9746,-18.1176
-88.5435,-20.2845
-88.8648,-20.6334
-91.2941,-17.3804
-90.5069,-16.7329
-88.1884,-19.9925
-91.2941,-17.3804
-88.1884,-19.9925
-88.5435,-20.2845
-90.5069,-16.7329
-89.6369,-16.2017
-87.796,-19.7529
-90.5069,-16.7329
-87.796,-19.7529
-88.1884,-19.9925
-89.6369,-16.2017
-88.7014,-15.797
-87.374,-19.5703
-89.6369,-16.2017
-87.374,-19.5703
-87.796,-19.7529
-88.7014,-15.797
-87.7185,-15.5268
-86.9307,-19.4485
-88.7014,-15.797
-86.9307,-19.4485
-87.374,-19.5703
-87.7185,-15.5268
-86.7076,-15.3964
-86.4747,-19.3896
-87.7185,-15.5268
-86.4747,-19.3896
-86.9307,-19.4485
-86.7076,-15.3964
-85.6748,-15.3837
-85.6724,-19.3837
-86.7076,-15.3964
-85.6724,-19.3837
-86.4747,-19.3896
-85.6748,-15.3837
-84.5848,-15.383
-84.5824,-19.383
-85.6748,-15.3837
-84.5824,-19.383
-85.6724,-19.3837
-84.5848,-15.383
-84.5248,-15.383
-84.5224,-19.383
-84.5848,-15.383
-84.5224,-19.383
-84.5824,-19.383
-47.1028,29.6526
-84.541,25.6355
-84.5428,29.6355
-47.1028,29.6526
-47.101,25.6526
-84.541,25.6355
-47.1029,29.9526
-84.5428,29.6355
-84.5429,29.9355
-47.1029,29.9526
-47.1028,29.6526
-84.5428,29.6355
-47.1048,33.9526
-84.5429,29.9355
-84.5448,33.9355
-47.1048,33.9526
-47.1029,29.9526
-84.5429,29.9355
-47.1048,33.9526
-84.5448,33.9355
-84.5448,33.9355
-47.1048,33.9526
-47.1048,33.9526
-84.5448,33.9355
-47.1048,33.9526
-84.5448,33.9355
-84.5466,37.9355
-47.1048,33.9526
-84.5466,37.9355
-47.1066,37.9526
-47.1066,37.9526
-84.5466,37.9355
-84.5467,38.2355
-47.1066,37.9526
-84.5467,38.2355
-47.1067,38.2526
-47.1067,38.2526
-84.5467,38.2355
-84.5486,42.2355
-47.1067,38.2526
-84.5486,42.2355
-47.1086,42.2526
-85.4002,-6.78049
-85.4038,-6.75069
-85.4038,-6.75069
-85.4002,-6.78049
-85.4002,-6.78049
-85.4038,-6.75069
-85.4038,-6.75069
-85.4143,-6.72261
-85.4143,-6.72261
-85.4038,-6.75069
-85.4038,-6.75069
-85.4143,-6.72261
-85.4143,-6.72261
-85.4313,-6.69784
-85.4313,-6.69784
-85.4143,-6.72261
-85.4143,-6.72261
-85.4313,-6.69784
-85.4313,-6.69784
-85.2641,-6.8325
-85.2641,-6.8325
-85.4313,-6.69784
-85.4313,-6.69784
-85.2641,-6.8325
-85.2641,-6.8325
-85.0717,-6.95395
-85.0717,-6.95395
-85.2641,-6.8325
-85.2641,-6.8325
-85.0717,-6.95395
-85.0717,-6.95395
-84.8599,-7.0369
-84.8599,-7.0369
-85.0717,-6.95395
-85.0717,-6.95395
-84.8599,-7.0369
-84.8599,-7.0369
-84.6362,-7.07834
-84.6362,-7.07834
-84.8599,-7.0369
-84.8599,-7.0369
-84.6362,-7.07834
-84.6362,-7.07834
-84.5299,-7.083
-84.5299,-7.083
-84.6362,-7.07834
-84.6362,-7.07834
-84.5299,-7.083
-85.4002,-6.78049
-85.4038,-6.75069
-89.2893,-7.70063
-85.4002,-6.78049
-89.2893,-7.70063
-89.4002,-6.77958
-85.4038,-6.75069
-85.4143,-6.72261
-88.9627,-8.56892
-85.4038,-6.75069
-88.9627,-8.56892
-89.2893,-7.70063
-85.4143,-6.72261
-85.4313,-6.69784
-88.4391,-9.3347
-85.4143,-6.72261
-88.4391,-9.3347
-88.9627,-8.56892
-85.4313,-6.69784
-85.2641,-6.8325
-87.7108,-9.99686
-85.4313,-6.69784
-87.7108,-9.99686
-88.4391,-9.3347
-85.2641,-6.8325
-85.0717,-6.95395
-86.8768,-10.5235
-85.2641,-6.8325
-86.8768,-10.5235
-87.7108,-9.99686
-85.0717,-6.95395
-84.8599,-7.0369
-85.9584,-10.8831
-85.0717,-6.95395
-85.9584,-10.8831
-86.8768,-10.5235
-84.8599,-7.0369
-84.6362,-7.07834
-84.9885,-11.0628
-84.8599,-7.0369
-84.9885,-11.0628
-85.9584,-10.8831
-84.6362,-7.07834
-84.5299,-7.083
-84.5276,-11.083
-84.6362,-7.07834
-84.5276,-11.083
-84.9885,-11.0628
-89.4002,-6.77958
-89.2893,-7.70063
-89.5807,-7.77187
-89.4002,-6.77958
-89.5807,-7.77187
-89.7002,-6.77951
-89.2893,-7.70063
-88.9627,-8.56892
-89.2289,-8.7074
-89.2893,-7.70063
-89.2289,-8.7074
-89.5807,-7.77187
-88.9627,-8.56892
-88.4391,-9.3347
-88.6647,-9.53246
-88.9627,-8.56892
-88.6647,-9.53246
-89.2289,-8.7074
-88.4391,-9.3347
-87.7108,-9.99686
-87.8944,-10.2342
-88.4391,-9.3347
-87.8944,-10.2342
-88.6647,-9.53246
-87.7108,-9.99686
-86.8768,-10.5235
-87.0122,-10.7912
-87.7108,-9.99686
-87.0122,-10.7912
-87.8944,-10.2342
-86.8768,-10.5235
-85.9584,-10.8831
-86.0408,-11.1716
-86.8768,-10.5235
-86.0408,-11.1716
-87.0122,-10.7912
-85.9584,-10.8831
-84.9885,-11.0628
-85.015,-11.3616
-85.9584,-10.8831
-85.015,-11.3616
-86.0408,-11.1716
-84.9885,-11.0628
-84.5276,-11.083
-84.5274,-11.383
-84.9885,-11.0628
-84.5274,-11.383
-85.015,-11.3616
-93.7002,-6.77861
-93.7004,-7.92861
-93.7004,-7.92861
-93.7002,-6.77861
-93.7002,-6.77861
-93.7004,-7.92861
-93.7004,-7.92861
-93.7007,-9.02887
-93.7007,-9.02887
-93.7004,-7.92861
-93.7004,-7.92861
-93.7007,-9.02887
-93.7007,-9.02887
-93.6137,-10.0523
-93.6137,-10.0523
-93.7007,-9.02887
-93.7007,-9.02887
-93.6137,-10.0523
-93.6137,-10.0523
-93.3548,-11.0463
-93.3548,-11.0463
-93.6137,-10.0523
-93.6137,-10.0523
-93.3548,-11.0463
-93.3548,-11.0463
-92.9314,-11.9821
-92.9314,-11.9821
-93.3548,-11.0463
-93.3548,-11.0463
-92.9314,-11.9821
-92.9314,-11.9821
-92.3559,-12.8328
-92.3559,-12.8328
-92.9314,-11.9821
-92.9314,-11.9821
-92.3559,-12.8328
-92.3559,-12.8328
-91.6202,-13.5965
-91.6202,-13.5965
-92.3559,-12.8328
-92.3559,-12.8328
-91.6202,-13.5965
-91.6202,-13.5965
-90.7748,-14.2404
-90.7748,-14.2404
-91.6202,-13.5965
-91.6202,-13.5965
-90.7748,-14.2404
-90.7748,-14.2404
-89.8427,-14.7508
-89.8427,-14.7508
-90.7748,-14.2404
-90.7748,-14.2404
-89.8427,-14.7508
-89.8427,-14.7508
-88.8448,-15.1162
-88.8448,-15.1162
-89.8427,-14.7508
-89.8427,-14.7508
-88.8448,-15.1162
-88.8448,-15.1162
-87.8034,-15.3283
-87.8034,-15.3283
-88.8448,-15.1162
-88.8448,-15.1162
-87.8034,-15.3283
-87.8034,-15.3283
-85.4348,-15.3836
-85.4348,-15.3836
-87.8034,-15.3283
-87.8034,-15.3283
-85.4348,-15.3836
-85.4348,-15.3836
-84.5248,-15.383
-84.5248,-15.383
-85.4348,-15.3836
-85.4348,-15.3836
-84.5248,-15.383
-93.7002,-6.77861
-93.7004,-7.92861
-97.7004,-7.92771
-93.7002,-6.77861
-97.7004,-7.92771
-97.7002,-6.77771
-93.7004,-7.92861
-93.7007,-9.02887
-97.7007,-9.02814
-93.7004,-7.92861
-97.7007,-9.02814
-97.7004,-7.92771
-93.7007,-9.02887
-93.6137,-10.0523
-97.5561,-10.7283
-93.7007,-9.02887
-97.5561,-10.7283
-97.7007,-9.02814
-93.6137,-10.0523
-93.3548,-11.0463
-97.126,-12.3795
-93.6137,-10.0523
-97.126,-12.3795
-97.5561,-10.7283
-93.3548,-11.0463
-92.9314,-11.9821
-96.4228,-13.9342
-93.3548,-11.0463
-96.4228,-13.9342
-97.126,-12.3795
-92.9314,-11.9821
-92.3559,-12.8328
-95.4666,-15.3474
-92.9314,-11.9821
-95.4666,-15.3474
-96.4228,-13.9342
-92.3559,-12.8328
-91.6202,-13.5965
-94.2756,-16.5879
-92.3559,-12.8328
-94.2756,-16.5879
-95.4666,-15.3474
-91.6202,-13.5965
-90.7748,-14.2404
-92.9534,-17.5951
-91.6202,-13.5965
-92.9534,-17.5951
-94.2756,-16.5879
-90.7748,-14.2404
-89.8427,-14.7508
-91.4955,-18.3934
-90.7748,-14.2404
-91.4955,-18.3934
-92.9534,-17.5951
-89.8427,-14.7508
-88.8448,-15.1162
-89.9346,-18.9648
-89.8427,-14.7508
-89.9346,-18.9648
-91.4955,-18.3934
-88.8448,-15.1162
-87.8034,-15.3283
-88.3059,-19.2966
-88.8448,-15.1162
-88.3059,-19.2966
-89.9346,-18.9648
-87.8034,-15.3283
-85.4348,-15.3836
-85.4324,-19.3836
-87.8034,-15.3283
-85.4324,-19.3836
-88.3059,-19.2966
-85.4348,-15.3836
-84.5248,-15.383
-84.5224,-19.383
-85.4348,-15.3836
-84.5224,-19.383
-85.4324,-19.3836
-84.5248,-15.383
-85.6748,-15.3837
-85.6748,-15.3837
-84.5248,-15.383
-84.5248,-15.383
-85.6748,-15.3837
-85.6748,-15.3837
-86.7914,-15.3844
-86.7914,-15.3844
-85.6748,-15.3837
-85.6748,-15.3837
-86.7914,-15.3844
-86.7914,-15.3844
-87.8187,-15.313
-87.8187,-15.313
-86.7914,-15.3844
-86.7914,-15.3844
-87.8187,-15.313
-87.8187,-15.313
-88.826,-15.0989
-88.826,-15.0989
-87.8187,-15.313
-87.8187,-15.313
-88.826,-15.0989
-88.826,-15.0989
-89.7936,-14.7464
-89.7936,-14.7464
-88.826,-15.0989
-88.826,-15.0989
-89.7936,-14.7464
-89.7936,-14.7464
-90.6861,-14.2725
-90.6861,-14.2725
-89.7936,-14.7464
-89.7936,-14.7464
-90.6861,-14.2725
-90.6861,-14.2725
-91.5349,-13.6561
-91.5349,-13.6561
-90.6861,-14.2725
-90.6861,-14.2725
-91.5349,-13.6561
-91.5349,-13.6561
-92.2593,-12.9385
-92.2593,-12.9385
-91.5349,-13.6561
-91.5349,-13.6561
-92.2593,-12.9385
-92.2593,-12.9385
-92.8553,-12.1049
-92.8553,-12.1049
-92.2593,-12.9385
-92.2593,-12.9385
-92.8553,-12.1049
-92.8553,-12.1049
-93.3016,-11.1826
-93.3016,-11.1826
-92.8553,-12.1049
-92.8553,-12.1049
-93.3016,-11.1826
-93.3016,-11.1826
-93.5855,-10.198
-93.5855,-10.198
-93.3016,-11.1826
-93.3016,-11.1826
-93.5855,-10.198
-93.5855,-10.198
-93.6987,-9.17955
-93.6987,-9.17955
-93.5855,-10.198
-93.5855,-10.198
-93.6987,-9.17955
-93.6987,-9.17955
-93.7004,-7.92861
-93.7004,-7.92861
-93.6987,-9.17955
-93.6987,-9.17955
-93.7004,-7.92861
-93.7004,-7.92861
-93.7002,-6.77861
-93.7002,-6.77861
-93.7004,-7.92861
-93.7004,-7.92861
-93.7002,-6.77861
-84.5248,-15.383
-85.6748,-15.3837
-85.6772,-11.3837
-84.5248,-15.383
-85.6772,-11.3837
-84.5272,-11.383
-85.6748,-15.3837
-86.7914,-15.3844
-86.7938,-11.3844
-85.6748,-15.3837
-86.7938,-11.3844
-85.6772,-11.3837
-86.7914,-15.3844
-87.8187,-15.313
-87.2629,-11.3518
-86.7914,-15.3844
-87.2629,-11.3518
-86.7938,-11.3844
-87.8187,-15.313
-88.826,-15.0989
-87.7229,-11.254
-87.8187,-15.313
-87.7229,-11.254
-87.2629,-11.3518
-88.826,-15.0989
-89.7936,-14.7464
-88.1647,-11.093
-88.826,-15.0989
-88.1647,-11.093
-87.7229,-11.254
-89.7936,-14.7464
-90.6861,-14.2725
-88.5723,-10.8766
-89.7936,-14.7464
-88.5723,-10.8766
-88.1647,-11.093
-90.6861,-14.2725
-91.5349,-13.6561
-88.9599,-10.5952
-90.6861,-14.2725
-88.9599,-10.5952
-88.5723,-10.8766
-91.5349,-13.6561
-92.2593,-12.9385
-89.2147,-10.3442
-91.5349,-13.6561
-89.2147,-10.3442
-88.9599,-10.5952
-92.2593,-12.9385
-92.8553,-12.1049
-89.4156,-10.0632
-92.2593,-12.9385
-89.4156,-10.0632
-89.2147,-10.3442
-92.8553,-12.1049
-93.3016,-11.1826
-89.5661,-9.75215
-92.8553,-12.1049
-89.5661,-9.75215
-89.4156,-10.0632
-93.3016,-11.1826
-93.5855,-10.198
-89.6618,-9.42015
-93.3016,-11.1826
-89.6618,-9.42015
-89.5661,-9.75215
-93.5855,-10.198
-93.6987,-9.17955
-89.7,-9.07675
-93.5855,-10.198
-89.7,-9.07675
-89.6618,-9.42015
-93.6987,-9.17955
-93.7004,-7.92861
-89.7004,-7.92951
-93.6987,-9.17955
-89.7004,-7.92951
-89.7,-9.07675
-93.7004,-7.92861
-93.7002,-6.77861
-89.7002,-6.77951
-93.7004,-7.92861
-89.7002,-6.77951
-89.7004,-7.92951
--49.836,-72.3882
--45.8401,-24.3279
--49.8401,-24.3282
--49.836,-72.3882
--45.836,-72.3879
--45.8401,-24.3279
--50.136,-72.3883
--49.8401,-24.3282
--50.1401,-24.3283
--50.136,-72.3883
--49.836,-72.3882
--49.8401,-24.3282
--54.136,-72.3886
--50.1401,-24.3283
--54.1401,-24.3286
--54.136,-72.3886
--50.136,-72.3883
--50.1401,-24.3283
--54.136,-72.3886
--54.1401,-24.3286
--54.1401,-24.3286
--54.136,-72.3886
--54.136,-72.3886
--54.1401,-24.3286
--54.136,-72.3886
--54.1401,-24.3286
--58.1401,-24.329
--54.136,-72.3886
--58.1401,-24.329
--58.136,-72.389
--58.136,-72.389
--58.1401,-24.329
--58.4401,-24.329
--58.136,-72.389
--58.4401,-24.329
--58.436,-72.389
--58.436,-72.389
--58.4401,-24.329
--62.4401,-24.3293
--58.436,-72.389
--62.4401,-24.3293
--62.436,-72.3893
--49.8419,-4.01825
--45.8444,24.3621
--49.8444,24.3618
--49.8419,-4.01825
--45.8419,-4.0179
--45.8444,24.3621
--50.1419,-4.01827
--49.8444,24.3618
--50.1444,24.3617
--50.1419,-4.01827
--49.8419,-4.01825
--49.8444,24.3618
--54.1419,-4.01862
--50.1444,24.3617
--54.1444,24.3614
--54.1419,-4.01862
--50.1419,-4.01827
--50.1444,24.3617
--54.1419,-4.01862
--54.1444,24.3614
--54.1444,24.3614
--54.1419,-4.01862
--54.1419,-4.01862
--54.1444,24.3614
--54.1419,-4.01862
--54.1444,24.3614
--58.1444,24.361
--54.1419,-4.01862
--58.1444,24.361
--58.1419,-4.01897
--58.1419,-4.01897
--58.1444,24.361
--58.4444,24.361
--58.1419,-4.01897
--58.4444,24.361
--58.4419,-4.01899
--58.4419,-4.01899
--58.4444,24.361
--62.4444,24.3607
--58.4419,-4.01899
--62.4444,24.3607
--62.4419,-4.01934
-40.4237,-6.61297
-44.4551,24.403
-40.4551,24.407
-40.4237,-6.61297
-44.4237,-6.61702
-44.4551,24.403
-40.1237,-6.61266
-40.4551,24.407
-40.1551,24.4073
-40.1237,-6.61266
-40.4237,-6.61297
-40.4551,24.407
-36.1237,-6.60861
-40.1551,24.4073
-36.1551,24.4114
-36.1237,-6.60861
-40.1237,-6.61266
-40.1551,24.4073
-36.1237,-6.60861
-36.1551,24.4114
-36.1551,24.4114
-36.1237,-6.60861
-36.1237,-6.60861
-36.1551,24.4114
-36.1237,-6.60861
-36.1551,24.4114
-32.1551,24.4154
-36.1237,-6.60861
-32.1551,24.4154
-32.1237,-6.60456
-32.1237,-6.60456
-32.1551,24.4154
-31.8551,24.4157
-32.1237,-6.60456
-31.8551,24.4157
-31.8237,-6.60425
-31.8237,-6.60425
-31.8551,24.4157
-27.8551,24.4198
-31.8237,-6.60425
-27.8551,24.4198
-27.8237,-6.6002
--54.1401,-24.3286
--54.1402,-23.2086
--54.1402,-23.2086
--54.1401,-24.3286
--54.1401,-24.3286
--54.1402,-23.2086
--54.1402,-23.2086
--54.1409,-15.0586
--54.1409,-15.0586
--54.1402,-23.2086
--54.1402,-23.2086
--54.1409,-15.0586
--54.1409,-15.0586
--54.1415,-8.49862
--54.1415,-8.49862
--54.1409,-15.0586
--54.1409,-15.0586
--54.1415,-8.49862
--54.1415,-8.49862
--54.1417,-6.32862
--54.1417,-6.32862
--54.1415,-8.49862
--54.1415,-8.49862
--54.1417,-6.32862
--54.1417,-6.32862
--54.1419,-4.01862
--54.1419,-4.01862
--54.1417,-6.32862
--54.1417,-6.32862
--54.1419,-4.01862
--54.1401,-24.3286
--54.1402,-23.2086
--58.1402,-23.209
--54.1401,-24.3286
--58.1402,-23.209
--58.1401,-24.329
--54.1402,-23.2086
--54.1409,-15.0586
--58.1409,-15.059
--54.1402,-23.2086
--58.1409,-15.059
--58.1402,-23.209
--54.1409,-15.0586
--54.1415,-8.49862
--58.1415,-8.49897
--54.1409,-15.0586
--58.1415,-8.49897
--58.1409,-15.059
--54.1415,-8.49862
--54.1417,-6.32862
--58.1417,-6.32897
--54.1415,-8.49862
--58.1417,-6.32897
--58.1415,-8.49897
--54.1417,-6.32862
--54.1419,-4.01862
--58.1419,-4.01897
--54.1417,-6.32862
--58.1419,-4.01897
--58.1417,-6.32897
--58.1401,-24.329
--58.1402,-23.209
--58.4402,-23.209
--58.1401,-24.329
--58.4402,-23.209
--58.4401,-24.329
--58.1402,-23.209
--58.1409,-15.059
--58.4409,-15.059
--58.1402,-23.209
--58.4409,-15.059
--58.4402,-23.209
--58.1409,-15.059
--58.1415,-8.49897
--58.4415,-8.49899
--58.1409,-15.059
--58.4415,-8.49899
--58.4409,-15.059
--58.1415,-8.49897
--58.1417,-6.32897
--58.4417,-6.32899
--58.1415,-8.49897
--58.4417,-6.32899
--58.4415,-8.49899
--58.1417,-6.32897
--58.1419,-4.01897
--58.4419,-4.01899
--58.1417,-6.32897
--58.4419,-4.01899
--58.4417,-6.32899
--58.4401,-24.329
--58.4402,-23.209
--62.4402,-23.2093
--58.4401,-24.329
--62.4402,-23.2093
--62.4401,-24.3293
--58.4402,-23.209
--58.4409,-15.059
--62.4409,-15.0593
--58.4402,-23.209
--62.4409,-15.0593
--62.4402,-23.2093
--58.4409,-15.059
--58.4415,-8.49899
--62.4415,-8.49934
--58.4409,-15.059
--62.4415,-8.49934
--62.4409,-15.0593
--58.4415,-8.49899
--58.4417,-6.32899
--62.4417,-6.32934
--58.4415,-8.49899
--62.4417,-6.32934
--62.4415,-8.49934
--58.4417,-6.32899
--58.4419,-4.01899
--62.4419,-4.01934
--58.4417,-6.32899
--62.4419,-4.01934
--62.4417,-6.32934
--54.1401,-24.3286
--50.1402,-23.2083
--54.1402,-23.2086
--54.1401,-24.3286
--50.1401,-24.3283
--50.1402,-23.2083
--54.1402,-23.2086
--50.1409,-15.0583
--54.1409,-15.0586
--54.1402,-23.2086
--50.1402,-23.2083
--50.1409,-15.0583
--54.1409,-15.0586
--50.1415,-8.49827
--54.1415,-8.49862
--54.1409,-15.0586
--50.1409,-15.0583
--50.1415,-8.49827
--54.1415,-8.49862
--50.1417,-6.32827
--54.1417,-6.32862
--54.1415,-8.49862
--50.1415,-8.49827
--50.1417,-6.32827
--54.1417,-6.32862
--50.1419,-4.01827
--54.1419,-4.01862
--54.1417,-6.32862
--50.1417,-6.32827
--50.1419,-4.01827
--54.1401,-24.3286
--54.1402,-23.2086
--54.1402,-23.2086
--54.1401,-24.3286
--54.1401,-24.3286
--54.1402,-23.2086
--54.1402,-23.2086
--54.1409,-15.0586
--54.1409,-15.0586
--54.1402,-23.2086
--54.1402,-23.2086
--54.1409,-15.0586
--54.1409,-15.0586
--54.1415,-8.49862
--54.1415,-8.49862
--54.1409,-15.0586
--54.1409,-15.0586
--54.1415,-8.49862
--54.1415,-8.49862
--54.1417,-6.32862
--54.1417,-6.32862
--54.1415,-8.49862
--54.1415,-8.49862
--54.1417,-6.32862
--54.1417,-6.32862
--54.1419,-4.01862
--54.1419,-4.01862
--54.1417,-6.32862
--54.1417,-6.32862
--54.1419,-4.01862
--43.2752,-15.3054
--45.2728,-11.3042
--45.2752,-15.3042
--43.2752,-15.3054
--43.2728,-11.3054
--45.2728,-11.3042
--45.2752,-15.3042
--47.4084,-11.3029
--47.4108,-15.3029
--45.2752,-15.3042
--45.2728,-11.3042
--47.4084,-11.3029
--47.4108,-15.3029
--49.0428,-11.4247
--48.4474,-15.3801
--47.4108,-15.3029
--47.4084,-11.3029
--49.0428,-11.4247
--48.4474,-15.3801
--50.6406,-11.7894
--49.4608,-15.6114
--48.4474,-15.3801
--49.0428,-11.4247
--50.6406,-11.7894
--49.4608,-15.6114
--52.166,-12.3887
--50.4283,-15.9916
--49.4608,-15.6114
--50.6406,-11.7894
--52.166,-12.3887
--50.4283,-15.9916
--53.5846,-13.2093
--51.3281,-16.512
--50.4283,-15.9916
--52.166,-12.3887
--53.5846,-13.2093
--51.3281,-16.512
--54.8648,-14.2327
--52.14,-17.1611
--51.3281,-16.512
--53.5846,-13.2093
--54.8648,-14.2327
--52.14,-17.1611
--55.9756,-15.4462
--52.8184,-17.9022
--52.14,-17.1611
--54.8648,-14.2327
--55.9756,-15.4462
--52.8184,-17.9022
--56.8771,-16.8187
--53.3689,-18.7404
--52.8184,-17.9022
--55.9756,-15.4462
--56.8771,-16.8187
--53.3689,-18.7404
--57.5484,-18.3174
--53.7788,-19.6556
--53.3689,-18.7404
--56.8771,-16.8187
--57.5484,-18.3174
--53.7788,-19.6556
--57.9723,-19.9038
--54.0377,-20.6244
--53.7788,-19.6556
--57.5484,-18.3174
--57.9723,-19.9038
--54.0377,-20.6244
--58.1381,-21.5375
--54.139,-21.622
--54.0377,-20.6244
--57.9723,-19.9038
--58.1381,-21.5375
--54.139,-21.622
--58.1403,-22.799
--54.1403,-22.7986
--54.139,-21.622
--58.1381,-21.5375
--58.1403,-22.799
--54.1403,-22.7986
--58.1401,-24.329
--54.1401,-24.3286
--54.1403,-22.7986
--58.1403,-22.799
--58.1401,-24.329
--43.2752,-15.3054
--45.2752,-15.3042
--45.2752,-15.3042
--43.2752,-15.3054
--43.2752,-15.3054
--45.2752,-15.3042
--45.2752,-15.3042
--47.4108,-15.3029
--47.4108,-15.3029
--45.2752,-15.3042
--45.2752,-15.3042
--47.4108,-15.3029
--47.4108,-15.3029
--48.4474,-15.3801
--48.4474,-15.3801
--47.4108,-15.3029
--47.4108,-15.3029
--48.4474,-15.3801
--48.4474,-15.3801
--49.4608,-15.6114
--49.4608,-15.6114
--48.4474,-15.3801
--48.4474,-15.3801
--49.4608,-15.6114
--49.4608,-15.6114
--50.4283,-15.9916
--50.4283,-15.9916
--49.4608,-15.6114
--49.4608,-15.6114
--50.4283,-15.9916
--50.4283,-15.9916
--51.3281,-16.512
--51.3281,-16.512
--50.4283,-15.9916
--50.4283,-15.9916
--51.3281,-16.512
--51.3281,-16.512
--52.14,-17.1611
--52.14,-17.1611
--51.3281,-16.512
--51.3281,-16.512
--52.14,-17.1611
--52.14,-17.1611
--52.8184,-17.9022
--52.8184,-17.9022
--52.14,-17.1611
--52.14,-17.1611
--52.8184,-17.9022
--52.8184,-17.9022
--53.3689,-18.7404
--53.3689,-18.7404
--52.8184,-17.9022
--52.8184,-17.9022
--53.3689,-18.7404
--53.3689,-18.7404
--53.7788,-19.6556
--53.7788,-19.6556
--53.3689,-18.7404
--53.3689,-18.7404
--53.7788,-19.6556
--53.7788,-19.6556
--54.0377,-20.6244
--54.0377,-20.6244
--53.7788,-19.6556
--53.7788,-19.6556
--54.0377,-20.6244
--54.0377,-20.6244
--54.139,-21.622
--54.139,-21.622
--54.0377,-20.6244
--54.0377,-20.6244
--54.139,-21.622
--54.139,-21.622
--54.1403,-22.7986
--54.1403,-22.7986
--54.139,-21.622
--54.139,-21.622
--54.1403,-22.7986
--54.1403,-22.7986
--54.1401,-24.3286
--54.1401,-24.3286
--54.1403,-22.7986
--54.1403,-22.7986
--54.1401,-24.3286
diff --git a/result.jpg b/result.jpg
deleted file mode 100644
index a33c5d886..000000000
Binary files a/result.jpg and /dev/null differ
diff --git a/src/control/carla_controller/carla_controller/simple_route_controller.py b/src/control/carla_controller/carla_controller/simple_route_controller.py
index 6d6939a18..f10e0e5a9 100644
--- a/src/control/carla_controller/carla_controller/simple_route_controller.py
+++ b/src/control/carla_controller/carla_controller/simple_route_controller.py
@@ -7,10 +7,17 @@
'''
from carla_msgs.msg import CarlaEgoVehicleControl
+from geometry_msgs.msg import TransformStamped
from nav_msgs.msg import Path
from rosgraph_msgs.msg import Clock
import rclpy
from rclpy.node import Node
+from tf2_ros import TransformException
+from tf2_ros.buffer import Buffer
+from tf2_ros.transform_listener import TransformListener
+
+import numpy as np
+import shapely
class SimpleRouteControllerNode(Node):
@@ -34,11 +41,51 @@ def __init__(self):
Path, '/route/smooth_path', self.path_cb, 10)
self.path_msg = Path()
+ # Transform listener
+ self.tf_buffer = Buffer()
+ self.tf_listener = TransformListener(self.tf_buffer, self)
+
+ self.path_linestring = None
+
# self.control_timer = self.create_timer(0.05, self.generate_commands)
def path_cb(self, msg: Path):
+ self.get_logger().info("Received smooth path")
self.path_msg = msg
+ if self.path_linestring is None:
+ # Construct a shapely LineString
+ pts = []
+ for pose in msg.poses:
+ pts.append(np.array([pose.pose.position.x, pose.pose.position.y]))
+
+ self.route_pts_arr = np.array(pts)
+
+ print(str(self.route_pts_arr))
+
+ # Get map->base_link transform
+ t = TransformStamped()
+ try:
+ t = self.tf_buffer.lookup_transform(
+ 'base_link',
+ 'map',
+ rclpy.time.Time())
+ except TransformException as ex:
+ self.get_logger().info(
+ f'Could not transform from map to base_link: {ex}')
+ return
+
+ # Transform linestring to base_link
+ self.route_pts_arr[:,0] += t.transform.translation.x
+ self.route_pts_arr[:,1] += t.transform.translation.y
+
+ linestring = shapely.LineString(self.route_pts_arr)
+ current_pos = shapely.Point(0.0, 0.0) # Our vehicle is at the origin of base_link, by definition
+
+ distance = shapely.distance(linestring, current_pos)
+ self.get_logger().info(str(distance))
+
+
def generate_commands(self):
# Form a blank command message
diff --git a/src/control/parade_controller/package.xml b/src/control/parade_controller/package.xml
new file mode 100755
index 000000000..3896b2c68
--- /dev/null
+++ b/src/control/parade_controller/package.xml
@@ -0,0 +1,19 @@
+
+
+
+ parade_controller
+ 1.0.0
+ A simple controller that moves the car forward relative to our reflective banner
+ Daniel Vayman
+ MIT
+
+ ament_copyright
+ ament_flake8
+ ament_pep257
+ carla_msgs
+ python3-pytest
+
+
+ ament_python
+
+
diff --git a/src/mapping/map_management_old/map_management/__init__.py b/src/control/parade_controller/parade_controller/__init__.py
similarity index 100%
rename from src/mapping/map_management_old/map_management/__init__.py
rename to src/control/parade_controller/parade_controller/__init__.py
diff --git a/src/control/parade_controller/parade_controller/parade_controller_node.py b/src/control/parade_controller/parade_controller/parade_controller_node.py
new file mode 100755
index 000000000..1fe51cde4
--- /dev/null
+++ b/src/control/parade_controller/parade_controller/parade_controller_node.py
@@ -0,0 +1,180 @@
+'''
+Package: parade_controller
+Filename: controller.py
+Author: Daniel Vayman
+
+Controller for the hoco parade that follows our flag
+'''
+
+from carla_msgs.msg import CarlaEgoVehicleControl
+from geometry_msgs.msg import TransformStamped
+from rosgraph_msgs.msg import Clock
+from rclpy.node import Node
+
+from sensor_msgs.msg import PointCloud2
+
+from scipy.spatial.transform import Rotation as R
+
+import rclpy
+import ros2_numpy as rnp
+import numpy as np
+from tf2_ros import TransformException
+from tf2_ros.buffer import Buffer
+from tf2_ros.transform_listener import TransformListener
+
+
+class ParadeController(Node):
+
+ def __init__(self):
+ super().__init__('parade_controller_node')
+
+ self.INTENSITY_THRESHOLD = 200
+ self.DESIRED_DISTANCE = 3.7
+
+ # PID control params
+ self.Kp_Throttle = 1 # Proportional gain
+ self.Kp_Steer = .3
+
+ self.tf_buffer = Buffer()
+ self.tf_listener = TransformListener(self.tf_buffer, self)
+
+ # Subscriber
+ self.lidar_left_sub = self.create_subscription(PointCloud2, 'velodyne_points', self.pointclouds_cb, 10)
+
+ # TF listener
+
+ # Publisher
+ self.throttle_pub = self.create_publisher(
+ CarlaEgoVehicleControl, '/carla/hero/vehicle_control_cmd', 10)
+
+ # Debug publisher
+ self.transformed_lidar_pub = self.create_publisher(PointCloud2, '/lidar_tfed', 1)
+
+ def pointclouds_cb(self, msg: PointCloud2):
+
+ pcd: np.array = rnp.numpify(msg)
+
+
+
+ # Removes all points below the intensity threshold
+
+ self.get_logger().info(f"Orig: {pcd.shape}")
+ pcd = pcd[pcd['intensity'] > self.INTENSITY_THRESHOLD]
+ self.get_logger().info(f"Now: {pcd.shape}")
+
+
+ t = TransformStamped()
+
+ try:
+ t = self.tf_buffer.lookup_transform(
+ 'base_link',
+ msg.header.frame_id,
+ rclpy.time.Time())
+ except TransformException as ex:
+ self.get_logger().info(
+ f'Could not transform base_link to {msg.header.frame_id}: {ex}')
+ return
+
+ t: TransformStamped
+ q = t.transform.rotation
+
+ r = R.from_quat([q.x, q.y, q.z, q.w])
+
+ x = pcd['x']
+ y = pcd['y']
+ z = pcd['z']
+
+ xyz = np.vstack((x, y, z)).T
+
+ xyz = R.apply(r, xyz)
+
+ pcd['x'] = xyz[:,0]
+ pcd['y'] = xyz[:,1]
+ pcd['z'] = xyz[:,2]
+
+ pcd['x'] += t.transform.translation.x
+ pcd['y'] += t.transform.translation.y
+ pcd['z'] += t.transform.translation.z
+
+ x = pcd['x']
+ y = pcd['y']
+ z = pcd['z']
+ xy = np.vstack((x, y)).T
+
+ # Finds the center of mass of banner points, resulting in a 1D numpy array (x, y) with the center coordinate of the banner
+ banner = np.mean(xy[:, :2], axis=0)
+
+
+ # Finds the distance to the banner (distance_x) and how far it is to the right or left (distance_y)
+ distance_x = abs(banner[0])
+ distance_y = banner[1]
+
+ # Error
+ error_x = distance_x - self.DESIRED_DISTANCE
+ error_y = distance_y
+
+ # Throttle & steering values TODO: integral & derivative terms
+ throttle = self.Kp_Throttle * error_x
+ steer = self.Kp_Steer * error_y
+
+ # Set msg fields and publish throttle value
+ throttle_msg = CarlaEgoVehicleControl()
+
+ if throttle < 0.:
+ throttle = 0.
+
+ if steer > 1.:
+ steer = 1.
+ elif steer < -1.:
+ steer = -1.
+
+ throttle_msg.throttle = (1. if throttle > 1. else throttle)
+ throttle_msg.steer = -1.*steer
+
+
+ self.get_logger().info("Distance X: " + str(distance_x))
+ self.get_logger().info("Distance Y: " + str(distance_y))
+ self.get_logger().info("Thr: " + str(throttle))
+
+ self.throttle_pub.publish(throttle_msg)
+
+ total_length = pcd['x'].shape[0]
+
+ msg_array = np.zeros(total_length, dtype=[
+ ('x', np.float32),
+ ('y', np.float32),
+ ('z', np.float32),
+ ('intensity', np.float32)
+ ])
+
+ msg_array['x'] = pcd['x']
+ msg_array['y'] = pcd['y']
+ msg_array['z'] = pcd['z']
+ msg_array['intensity'] = pcd['intensity']
+
+ tfed_msg: PointCloud2 = rnp.msgify(PointCloud2, msg_array)
+
+ tfed_msg.header = msg.header
+ tfed_msg.header.frame_id = 'base_link'
+
+ self.transformed_lidar_pub.publish(tfed_msg)
+
+
+
+
+def main(args=None):
+ rclpy.init(args=args)
+
+ parade_controller_node = ParadeController()
+
+ rclpy.spin(parade_controller_node)
+
+ # Destroy the node explicitly
+ # (optional - otherwise it will be done automatically
+ # when the garbage collector destroys the node object)
+ parade_controller_node.destroy_node()
+ rclpy.shutdown()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/src/interface/linear_actuator/COLCON_IGNORE b/src/control/parade_controller/resource/parade_controller
similarity index 100%
rename from src/interface/linear_actuator/COLCON_IGNORE
rename to src/control/parade_controller/resource/parade_controller
diff --git a/src/control/parade_controller/setup.cfg b/src/control/parade_controller/setup.cfg
new file mode 100755
index 000000000..9d138780f
--- /dev/null
+++ b/src/control/parade_controller/setup.cfg
@@ -0,0 +1,4 @@
+[develop]
+script-dir=$base/lib/parade_controller
+[install]
+install-scripts=$base/lib/parade_controller
diff --git a/src/control/parade_controller/setup.py b/src/control/parade_controller/setup.py
new file mode 100755
index 000000000..afc7d8052
--- /dev/null
+++ b/src/control/parade_controller/setup.py
@@ -0,0 +1,26 @@
+from setuptools import setup
+
+package_name = 'parade_controller'
+
+setup(
+ name=package_name,
+ version='0.0.0',
+ packages=[package_name],
+ data_files=[
+ ('share/ament_index/resource_index/packages',
+ ['resource/' + package_name]),
+ ('share/' + package_name, ['package.xml']),
+ ],
+ install_requires=['setuptools'],
+ zip_safe=True,
+ maintainer='root',
+ maintainer_email='root@todo.todo',
+ description='TODO: Package description',
+ license='TODO: License declaration',
+ tests_require=['pytest'],
+ entry_points={
+ 'console_scripts': [
+ 'parade_controller_node = parade_controller.parade_controller_node:main'
+ ],
+ },
+)
diff --git a/src/perception/dynamic_grid/dynamic_grid/__init__.py b/src/interface/camera/camera/__init__.py
similarity index 100%
rename from src/perception/dynamic_grid/dynamic_grid/__init__.py
rename to src/interface/camera/camera/__init__.py
diff --git a/src/interface/camera/camera/camera_node.py b/src/interface/camera/camera/camera_node.py
new file mode 100644
index 000000000..679f60bc9
--- /dev/null
+++ b/src/interface/camera/camera/camera_node.py
@@ -0,0 +1,112 @@
+'''
+Package: camera
+Filename: camera_node.py
+Author: Will Heitman (w at heit.mn)
+
+Connects to USB webcams and publishes their streams to ROS
+
+Available webcams are listed using \
+
+'''
+
+import cv2
+from cv_bridge import CvBridge
+import numpy as np
+from rosgraph_msgs.msg import Clock
+from sensor_msgs.msg import Image
+import time
+
+import rclpy
+from rclpy.node import Node
+
+
+class camera_node(Node):
+
+ def __init__(self):
+ super().__init__('camera_node')
+
+ self.bridge = CvBridge()
+
+ # Get active UVC cameras
+ _, working_ports, _ = self.list_ports()
+
+ self.cameras = []
+ self.camera_publishers = []
+
+ # For each working port, check if it's a ZED cam (not a laptop webcam etc)
+ for port in working_ports:
+ with open(f'/sys/class/video4linux/video{port}/name') as f:
+ contents = f.readline()
+ if contents.find('ZED') >= 0:
+ camera = cv2.VideoCapture(port)
+ self.cameras.append(camera)
+
+ camera_pub = self.create_publisher(Image, f'/camera/camera{len(self.camera_publishers)}', 1)
+ self.camera_publishers.append(camera_pub)
+
+ # Call publishFrames very frequently.
+ self.capture_timer = self.create_timer(0.01, self.publishFrames)
+
+ def publishFrames(self):
+ """Iterate through each camera and publish the latest frame
+ """
+ start = time.time()
+
+ for idx, camera in enumerate(self.cameras):
+ if not camera.isOpened():
+ self.get_logger().warn("Camera could not be opened")
+ ret, frame = camera.read()
+
+ # Crop to left frame only. ZEDs return both camera in stereo by default.
+ original_width = frame.shape[1]
+ frame = frame[:,0:int(original_width/2),:]
+
+ msg = self.bridge.cv2_to_imgmsg(frame, encoding="passthrough")
+ self.camera_publishers[idx].publish(msg)
+
+ def list_ports(self) -> tuple:
+ """
+ Test the ports and returns a tuple with the available ports and the ones that are working.
+
+ Taken from S.O.
+
+ Returns:
+ tuple: available, working, and broken ports
+ """
+ non_working_ports = []
+ dev_port = 0
+ working_ports = []
+ available_ports = []
+ while len(non_working_ports) < 10: # if there are more than 5 non working ports stop the testing.
+ camera = cv2.VideoCapture(dev_port)
+ if not camera.isOpened():
+ non_working_ports.append(dev_port)
+ # print("Port %s is not working." %dev_port)
+ else:
+ is_reading, img = camera.read()
+ w = camera.get(3)
+ h = camera.get(4)
+ if is_reading:
+ # print("Port %s is working and reads images (%s x %s)" %(dev_port,h,w))
+ working_ports.append(dev_port)
+ else:
+ # print("Port %s for camera ( %s x %s) is present but does not reads." %(dev_port,h,w))
+ available_ports.append(dev_port)
+ dev_port +=1
+ return available_ports,working_ports,non_working_ports
+
+ def releaseCameras(self):
+ """Disconnect from all cameras on shutdown.
+ """
+ for camera in self.cameras:
+ camera.release()
+
+
+def main(args=None):
+ rclpy.init(args=args)
+ node = camera_node()
+ rclpy.spin(node)
+
+ camera_node.releaseCameras()
+ camera_node.destroy_node()
+ rclpy.shutdown()
diff --git a/src/perception/dynamic_grid/package.xml b/src/interface/camera/package.xml
similarity index 77%
rename from src/perception/dynamic_grid/package.xml
rename to src/interface/camera/package.xml
index 691a6cdb9..effe2a4db 100755
--- a/src/perception/dynamic_grid/package.xml
+++ b/src/interface/camera/package.xml
@@ -1,9 +1,9 @@
- dynamic_grid
+ camera
1.0.0
- Nodes for processing sensor data: camera images, LiDAR pointclouds, and more.
+ Tools to connect to USB webcams and publish the streams to ROS
Will Heitman
MIT
diff --git a/src/mapping/lio_sam/COLCON_IGNORE b/src/interface/camera/resource/camera
similarity index 100%
rename from src/mapping/lio_sam/COLCON_IGNORE
rename to src/interface/camera/resource/camera
diff --git a/src/interface/camera/setup.cfg b/src/interface/camera/setup.cfg
new file mode 100755
index 000000000..19b8cf928
--- /dev/null
+++ b/src/interface/camera/setup.cfg
@@ -0,0 +1,4 @@
+[develop]
+script-dir=$base/lib/camera
+[install]
+install-scripts=$base/lib/camera
diff --git a/src/interface/camera/setup.py b/src/interface/camera/setup.py
new file mode 100755
index 000000000..42f243c14
--- /dev/null
+++ b/src/interface/camera/setup.py
@@ -0,0 +1,30 @@
+from setuptools import setup
+from glob import glob
+import os
+
+package_name = 'camera'
+
+setup(
+ name=package_name,
+ version='0.0.0',
+ packages=[package_name],
+ data_files=[
+ ('share/ament_index/resource_index/packages',
+ ['resource/' + package_name]),
+ ('share/' + package_name, ['package.xml']),
+ (os.path.join('share', package_name), glob('launch/*.launch.py'))
+ ],
+ install_requires=['setuptools'],
+ zip_safe=True,
+ maintainer='main',
+ maintainer_email='will.heitman@utdallas.edu',
+ description='See package.xml',
+ license='See package.xml',
+ tests_require=['pytest'],
+ entry_points={
+ 'console_scripts': [
+ #'dynamic_grid_node = dynamic_grid.dynamic_grid_node:main',
+ 'camera_node = camera.camera_node:main',
+ ],
+ },
+)
diff --git a/src/interface/carla_interface/carla_interface/carla_agent.py b/src/interface/carla_interface/carla_interface/carla_agent.py
index 60d194f4d..cd5cf288f 100755
--- a/src/interface/carla_interface/carla_interface/carla_agent.py
+++ b/src/interface/carla_interface/carla_interface/carla_agent.py
@@ -29,33 +29,19 @@ def sensors(self):
base_link_pos = [0.7, 0.0, 0.28]
sensors = [
- {'type': 'sensor.camera.rgb', 'id': 'rgb_center',
- 'x': base_link_pos[0]+0.15,
- 'y': base_link_pos[1]+0.0,
- 'z': base_link_pos[2]+1.6,
- 'roll': 0.0, 'pitch': 0.0, 'yaw': 0.0,
- 'width': 600, 'height': 400, 'fov': 120},
-
{'type': 'sensor.camera.rgb', 'id': 'rgb_left',
'x': base_link_pos[0]+0.0,
'y': base_link_pos[1]-0.15,
'z': base_link_pos[2]+1.6,
'roll': 0.0, 'pitch': 0.0, 'yaw': -0.9,
- 'width': 600, 'height': 400, 'fov': 120},
+ 'width': 1024, 'height': 512, 'fov': 120},
{'type': 'sensor.camera.rgb', 'id': 'rgb_right',
'x': base_link_pos[0]+0.0,
'y': base_link_pos[1]+0.15,
'z': base_link_pos[2]+1.6,
'roll': 0.0, 'pitch': 0.0, 'yaw': 0.9,
- 'width': 600, 'height': 400, 'fov': 120},
-
- {'type': 'sensor.camera.rgb', 'id': 'rgb_zoom',
- 'x': base_link_pos[0]+0.15,
- 'y': base_link_pos[1]+0.0,
- 'z': base_link_pos[2]+1.6,
- 'roll': 0.0, 'pitch': 0.0, 'yaw': 0.0,
- 'width': 600, 'height': 400, 'fov': 40},
+ 'width': 1024, 'height': 512, 'fov': 120},
{'type': 'sensor.lidar.ray_cast', 'id': 'lidar',
'x': base_link_pos[0]+0.0,
@@ -67,7 +53,7 @@ def sensors(self):
{'type': 'sensor.other.gnss', 'id': 'gnss',
'x': base_link_pos[0]+0.0,
'y': base_link_pos[1]+0.0,
- 'z': base_link_pos[2]+0.0,},
+ 'z': base_link_pos[2]+0.0, },
{'type': 'sensor.other.imu', 'id': 'imu',
'x': base_link_pos[0]+0.0,
'y': base_link_pos[1]+0.0,
diff --git a/src/interface/carla_interface/carla_interface/liaison_node.py b/src/interface/carla_interface/carla_interface/liaison_node.py
old mode 100755
new mode 100644
index ec29671a9..96185a643
--- a/src/interface/carla_interface/carla_interface/liaison_node.py
+++ b/src/interface/carla_interface/carla_interface/liaison_node.py
@@ -8,9 +8,12 @@
but more functionality will be added in the future.
'''
+import os
import rclpy
+import random
from rclpy.node import Node
from rclpy.qos import DurabilityPolicy, QoSProfile
+import time
from carla_msgs.msg import CarlaRoute, CarlaWorldInfo
from geometry_msgs.msg import Pose, PoseStamped
@@ -38,31 +41,101 @@ def __init__(self):
self.wp_marker_pub = self.create_publisher(
MarkerArray, '/viz/wayppoints', 10)
- self.world_info_sub = self.create_subscription(CarlaWorldInfo, '/carla/world_info', self.world_info_cb, 10)
- self.world_info_pub = self.create_publisher(CarlaWorldInfo, '/carla/world_info', 10)
+ self.world_info_sub = self.create_subscription(
+ CarlaWorldInfo, '/carla/world_info', self.world_info_cb, 10)
+ self.world_info_pub = self.create_publisher(
+ CarlaWorldInfo, '/carla/world_info', 10)
- self.route_path_pub = self.create_publisher(Path, '/route/rough_path', 10)
+ self.route_path_pub = self.create_publisher(
+ Path, '/route/rough_path', 10)
self.route_repub_timer = self.create_timer(1.0, self.publish_route)
self.world_info_cached = None
- self.world_info_repub_timer = self.create_timer(5.0, self.repub_world_info)
-
- # self.client = carla.Client('localhost', 2005)
- # self.client.set_timeout(60)
- # self.world = self.client.get_world()
+ self.world_info_repub_timer = self.create_timer(
+ 5.0, self.repub_world_info)
- # settings = self.world.get_settings()
- # settings.fixed_delta_seconds = 1.0 / 20
- # settings.synchronous_mode = True
- # settings.tile_stream_distance = 650
- # settings.actor_active_distance = 650
+ self.route = None
+ self.clock = Clock()
- # self.world.apply_settings(settings)
+ connect_to_carla = True # TODO: Make this a param
- # self.get_logger().info("Settings applied!")
+ if connect_to_carla is False:
+ return
- self.route = None
- self.clock = Clock()
+ self.client = carla.Client(
+ 'localhost', 2000 + int(os.environ['ROS_DOMAIN_ID']))
+ self.client.set_timeout(60)
+ self.world = self.client.get_world()
+ blueprint_library = self.world.get_blueprint_library()
+
+ WALKER_COUNT = 0
+ CAR_COUNT = 60
+
+ # Wait for ego to spawn
+ time.sleep(5.0)
+
+ # Find ego vehicle
+ actor_list = self.world.get_actors()
+ self.ego = actor_list.filter("vehicle.tesla.model3")[0]
+ self.get_logger().info(str(self.ego))
+
+ self.actor_true_pose_timer = self.create_timer(
+ 0.1, self.publish_true_pose)
+ self.true_pose_pub = self.create_publisher(
+ PoseStamped, '/true_pose', 10)
+
+ # Spawn some cars
+ car_count = 0
+ car_spawns = self.world.get_map().get_spawn_points()
+ for spawn in car_spawns:
+ if car_count > CAR_COUNT:
+ continue
+ vehicle_bp = random.choice(blueprint_library.filter('vehicle.*.*'))
+ actor = self.world.try_spawn_actor(vehicle_bp, spawn)
+ if actor is not None:
+ actor.set_autopilot(True)
+ car_count += 1
+
+ self.get_logger().info(f"Spawned {car_count} cars!")
+
+ # Spawn some walkers (pedestrians)
+ walker_ai_bp = blueprint_library.filter('controller.ai.walker')[0]
+ walker_count = 0
+ while walker_count < WALKER_COUNT:
+ if walker_count > 30:
+ continue
+ walker_bp = random.choice(blueprint_library.filter('walker.*.*'))
+ spawn_point = carla.Transform()
+ spawn_point.location = self.world.get_random_location_from_navigation()
+ actor = self.world.try_spawn_actor(
+ walker_bp, spawn_point)
+ if actor is not None:
+ ai_controller = self.world.try_spawn_actor(
+ walker_ai_bp, spawn_point, attach_to=actor)
+ if ai_controller is not None:
+ ai_controller.go_to_location(
+ self.world.get_random_location_from_navigation())
+ walker_count += 1
+
+ def publish_true_pose(self):
+ carla_tf = self.ego.get_transform()
+ carla_pos = carla_tf.location
+ msg = PoseStamped()
+ msg.pose.position.x = carla_pos.x
+ msg.pose.position.y = carla_pos.y
+ msg.pose.position.z = carla_pos.z
+ msg.header.frame_id = 'map'
+ msg.header.stamp = self.clock.clock
+
+ self.true_pose_pub.publish(msg)
+
+ def set_all_lights_to_green(self):
+ actors = self.world.get_actors()
+ print(actors)
+ for actor in actors:
+ if actor.type_id == 'traffic.traffic_light':
+ actor.set_red_time(1.0)
+ actor.set_yellow_time(0.5)
def world_info_cb(self, msg: CarlaWorldInfo):
if msg.opendrive == "":
@@ -74,7 +147,6 @@ def repub_world_info(self):
return
self.world_info_pub.publish(self.world_info_cached)
-
def clock_cb(self, msg: Clock):
self.clock = msg
@@ -91,7 +163,7 @@ def publish_route(self):
for pose in self.route.poses:
pose: Pose
- pose.position.z = 0.0 # Ignore height. TODO: Support z != 0.
+ pose.position.z = 0.0 # Ignore height. TODO: Support z != 0.
pose_stamped = PoseStamped()
pose_stamped.pose = pose
pose_stamped.header.frame_id = 'map'
diff --git a/src/interface/carla_interface/carla_interface/route_reader.py b/src/interface/carla_interface/carla_interface/route_reader.py
new file mode 100644
index 000000000..197c31c12
--- /dev/null
+++ b/src/interface/carla_interface/carla_interface/route_reader.py
@@ -0,0 +1,91 @@
+'''
+Package: carla
+Filename: route_reader.py
+Author: Will Heitman (w at heit.mn)
+
+Reads routes from a CARLA-formatted XML file and
+publishes it as a Path message
+'''
+
+import os
+import rclpy
+import random
+from rclpy.node import Node
+from rclpy.qos import DurabilityPolicy, QoSProfile
+import time
+import xml.etree.ElementTree as ET
+
+from carla_msgs.msg import CarlaRoute, CarlaWorldInfo
+from geometry_msgs.msg import Pose, PoseStamped
+from nav_msgs.msg import Path
+from rosgraph_msgs.msg import Clock
+from std_msgs.msg import Bool, ColorRGBA
+from visualization_msgs.msg import Marker, MarkerArray
+
+import carla
+
+
+class RouteReaderNode(Node):
+
+ def __init__(self):
+ super().__init__('route_reader_node')
+ self.route_pub = self.create_publisher(
+ Path, '/planning/rough_route', qos_profile=QoSProfile(depth=1, durability=DurabilityPolicy.TRANSIENT_LOCAL))
+ route_timer = self.create_timer(1.0, self.publish_route)
+
+ self.clock_sub = self.create_subscription(
+ Clock, '/clock', self.clock_cb, 10)
+
+ self.route = None
+ self.clock = Clock()
+
+ tree = ET.parse('/navigator/data/routes_town02.xml')
+
+ TARGET_ROUTE_ID: str = "0"
+
+ route_elem = None
+
+ for route in tree.getroot():
+ if route.attrib['id'] == TARGET_ROUTE_ID:
+ route_elem = route
+
+ if route_elem is None:
+ self.get_logger().error("Route not found!")
+ quit(-1)
+
+ self.route = Path()
+ self.route.header.frame_id = 'map'
+ self.route.header.stamp = self.clock.clock
+
+ for position in route_elem.find('waypoints'):
+ print(position.attrib)
+ wp = PoseStamped()
+ wp.header.frame_id = 'map'
+ wp.header.stamp = self.clock.clock
+ wp.pose.position.x = float(position.attrib.get('x'))
+ wp.pose.position.y = float(position.attrib.get('y'))
+ self.route.poses.append(wp)
+
+ def clock_cb(self, msg: Clock):
+ self.clock = msg
+
+ def publish_route(self):
+ self.route_pub.publish(self.route)
+
+
+def main(args=None):
+ rclpy.init(args=args)
+
+ liaison_node = RouteReaderNode()
+
+ rclpy.spin(liaison_node)
+
+ # Destroy the node explicitly
+ # (optional - otherwise it will be done automatically
+ # when the garbage collector destroys the node object)
+ liaison_node.destroy_node()
+ rclpy.shutdown()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/src/interface/carla_interface/launch/carla.launch.py b/src/interface/carla_interface/launch/carla.launch.py
index f20bb7c0c..310a613ab 100644
--- a/src/interface/carla_interface/launch/carla.launch.py
+++ b/src/interface/carla_interface/launch/carla.launch.py
@@ -48,6 +48,26 @@ def generate_launch_description():
arguments=[path.join("/navigator/data", "carla.urdf")]
)
+ airbags = Node(
+ package='airbags',
+ executable='airbag_node'
+ )
+
+ camera_streamer = Node(
+ package='web_video_server',
+ executable='web_video_server'
+ )
+
+ joy_linux = Node(
+ package="joy_linux",
+ executable="joy_linux_node"
+ )
+
+ joy_translation = Node(
+ package="joy_translation",
+ executable="joy_translation_node"
+ )
+
carla_bridge_official = IncludeLaunchDescription(
PythonLaunchDescriptionSource([get_package_share_directory(
'carla_ros_bridge'), '/carla_ros_bridge.launch.py']),
@@ -58,15 +78,26 @@ def generate_launch_description():
'town': 'Town02',
'register_all_sensors': 'False',
'ego_vehicle_role_name': 'hero',
- 'timeout': '30'
+ 'timeout': '30',
+ 'fixed_delta_seconds': '0.1'
}.items(),
)
- state_estimation = Node(
+ gnss_processor = Node(
package='state_estimation',
executable='gnss_processing_node'
)
+ gnss_averager = Node(
+ package='state_estimation',
+ executable='gnss_averaging_node'
+ )
+
+ mcl = Node(
+ package='state_estimation',
+ executable='mcl_node'
+ )
+
map_manager = Node(
package='map_management',
executable='map_management_node'
@@ -74,9 +105,7 @@ def generate_launch_description():
rviz = Node(
package='rviz2',
- namespace='',
executable='rviz2',
- name='rviz2',
arguments=['-d' + '/navigator/data/mcl.rviz']
)
@@ -90,30 +119,100 @@ def generate_launch_description():
executable='image_segmentation_node'
)
+ semantic_projection = Node(
+ package='segmentation',
+ executable='image_projection_node'
+ )
+
+ static_grid = Node(
+ package='occupancy_cpp',
+ executable='static_grid_exe'
+ )
+
+ grid_summation = Node(
+ package='costs',
+ executable='grid_summation_node'
+ )
+
+ junction_manager = Node(
+ package='costs',
+ executable='junction_manager'
+ )
+
+ rqt = Node(
+ package='rqt_gui',
+ executable='rqt_gui',
+ arguments=["--perspective-file=/navigator/data/rqt.perspective"]
+ )
+
+ route_reader = Node(
+ package='carla_interface',
+ executable='route_reader_node'
+ )
+
+ rtp = Node(
+ package='rtp',
+ executable='rtp_node'
+ )
+
+ prednet_inference = Node(
+ package='prednet_inference',
+ executable='prednet_inference_node'
+ )
+
+ web_bridge = Node(
+ package='rosbridge_server',
+ executable='rosbridge_websocket'
+ )
+
+ guardian = Node(
+ package='guardian',
+ executable='guardian_node'
+ )
+
return LaunchDescription([
# CONTROL
- carla_controller,
+ # carla_controller,
# INTERFACE
- # carla_bridge_official,
- # carla_spawner,
+ carla_bridge_official,
+ carla_spawner,
leaderboard_liaison,
+ web_bridge,
+ joy_linux,
+ joy_translation,
# LOCALIZATION
- # mcl
+ # gnss_averager,
+ # mcl,
# MAPPING
# MISC
urdf_publisher,
- rviz,
+ # rviz,
+ # rqt,
+ camera_streamer,
# PERCEPTION
- image_segmentation,
+ # image_segmentation,
+ # semantic_projection,
lidar_processor,
ground_seg,
+ static_grid,
+ # prednet_inference,
+
+ # PLANNING
+ grid_summation,
+ route_reader,
+ junction_manager,
+ rtp,
+
+ # SAFETY
+ airbags,
+ # guardian,
# STATE ESTIMATION
- # map_manager,
- state_estimation,
+ map_manager,
+ # gnss_processor,
])
diff --git a/src/interface/carla_interface/launch/lite.launch.py b/src/interface/carla_interface/launch/lite.launch.py
deleted file mode 100755
index 8122f87c3..000000000
--- a/src/interface/carla_interface/launch/lite.launch.py
+++ /dev/null
@@ -1,54 +0,0 @@
-'''
-Spawn all nodes needed to connect to and drive in the CARLA
-simulator WITHOUT Leaderboard evaluation. This speeds up load times
-and therefore facilitates quick iteration.
-
-WSH.
-'''
-
-from os import name, path, environ
-
-from launch.launch_description_sources import PythonLaunchDescriptionSource
-from launch.actions import IncludeLaunchDescription
-from launch import LaunchDescription
-from launch.actions import DeclareLaunchArgument
-from launch.actions import ExecuteProcess
-from launch.conditions import IfCondition
-from launch.substitutions import LaunchConfiguration
-from launch_ros.actions import Node
-
-from ament_index_python import get_package_share_directory
-
-
-def generate_launch_description():
-
- carla_spawner = IncludeLaunchDescription(
- PythonLaunchDescriptionSource([get_package_share_directory(
- 'carla_spawn_objects'), '/carla_spawn_objects.launch.py']),
- launch_arguments={
- 'objects_definition_file': '/navigator/data/carla_objects.json'}.items(),
- )
-
- carla_bridge_official = IncludeLaunchDescription(
- PythonLaunchDescriptionSource([get_package_share_directory(
- 'carla_ros_bridge'), '/carla_ros_bridge.launch.py']),
- launch_arguments={
- 'host': 'localhost',
- 'port': str(2000 + int(environ['ROS_DOMAIN_ID'])),
- 'synchronous_mode': 'True',
- 'town': 'Town01',
- 'register_all_sensors': 'False',
- 'ego_vehicle_role_name': 'hero'
- }.items(),
- )
-
- main_launch = IncludeLaunchDescription(
- PythonLaunchDescriptionSource(
- [get_package_share_directory('carla_interface'), '/carla.launch.py'])
- )
-
- return LaunchDescription([
- carla_spawner,
- carla_bridge_official,
- main_launch
- ])
diff --git a/src/interface/carla_interface/setup.py b/src/interface/carla_interface/setup.py
index 86e3f88d3..4ba563d97 100755
--- a/src/interface/carla_interface/setup.py
+++ b/src/interface/carla_interface/setup.py
@@ -23,7 +23,8 @@
tests_require=['pytest'],
entry_points={
'console_scripts': [
- 'liaison_node = carla_interface.liaison_node:main'
+ 'liaison_node = carla_interface.liaison_node:main',
+ 'route_reader_node = carla_interface.route_reader:main'
],
},
)
diff --git a/src/perception/ground_seg/ground_seg/__init__.py b/src/interface/epas/epas/__init__.py
similarity index 100%
rename from src/perception/ground_seg/ground_seg/__init__.py
rename to src/interface/epas/epas/__init__.py
diff --git a/src/interface/epas/epas/epas_node.py b/src/interface/epas/epas/epas_node.py
new file mode 100644
index 000000000..7bafb85d0
--- /dev/null
+++ b/src/interface/epas/epas/epas_node.py
@@ -0,0 +1,142 @@
+import can
+import math
+from rosgraph_msgs.msg import Clock
+
+
+from carla_msgs.msg import CarlaEgoVehicleControl
+import rclpy
+from rclpy.node import Node
+from dataclasses import dataclass
+
+
+@dataclass
+class EpasState():
+ duty: int
+ current: int
+ supply_voltage_mv: int
+ temperature: int
+ angle: int
+ errors: int
+
+
+class EpasNode(Node):
+
+ def __init__(self):
+ super().__init__('epas_node')
+
+ self.limit_left:int = 19
+ self.limit_right:int = 230
+
+ self.bus = can.interface.Bus(bustype='slcan', channel='/dev/serial/by-id/usb-Protofusion_Labs_CANable_1205aa6_https:__github.com_normaldotcom_cantact-fw_001500174E50430520303838-if00', bitrate=500000, receive_own_messages=True)
+ self.command_sub = self.create_subscription(
+ CarlaEgoVehicleControl, '/carla/hero/vehicle_control_cmd', self.first_sub, 1)
+ self.cmd_msg = None
+ self.cmd_timer = self.create_timer(.01,self.vehicleControlCb)
+ self.current_angle = 0.0
+ self.target_angle = 0.0
+ self.cached_msg1 = None
+
+ def first_sub(self,msg: CarlaEgoVehicleControl):
+ self.cmd_msg = msg
+
+ def parseIncomingMessages(self, msg1_data: bytearray, msg2_data: bytearray) -> EpasState:
+ torque = msg1_data[0]
+ duty = msg1_data[1]
+ current = msg1_data[2]
+ supply_voltage = msg1_data[3]
+ switch_pos = msg1_data[4]
+ temp = msg1_data[5]
+ torque_a = msg1_data[6]
+ torque_b = msg1_data[7]
+
+ angle = msg2_data[0]
+ analog_c1 = msg2_data[1]
+ analog_c2 = msg2_data[2]
+ selected_map = msg2_data[3]
+ errors = msg2_data[4]
+ dio_bitfield = msg2_data[5]
+ status_bitfield = msg2_data[6]
+ limit_bitfield = msg2_data[7]
+
+ current_state = EpasState(
+ duty, current, supply_voltage, temp, angle, errors)
+
+ return current_state
+
+ def sendCommand(self, target, bus):
+ current_angle_normalized = ((self.current_angle-self.limit_left)/(self.limit_right-self.limit_left)*2)-1
+ #self.get_logger().info('current angle'+str(current_angle_normalized))
+ e = target - current_angle_normalized # Error = target - current
+ self.get_logger().info('current_angle_normalized: '+str(current_angle_normalized))
+ self.get_logger().info('target: '+str(target))
+
+ # We need to map [-1.0, 1.0] to [0, 255]
+
+ Kp = 1
+
+ power = e * Kp # Power is an abstract value from [-1., 1.], where -1 is hard push left
+
+ torqueA: int = min(255, max(0, math.ceil((power+1) * (255/2))))
+ torqueB: int = 255-torqueA
+
+ print (f"{torqueA}")
+ #self.get_logger().info(str(torqueA))
+
+ data = [0x03, torqueA, torqueB, 0x00, 0x00, 0x00, 0x00, 0x00]
+ message = can.Message(arbitration_id=0x296, data=data, check=True, is_extended_id=False)
+ bus.send(message, timeout=0.2)
+
+ print (f"{torqueA}")
+ # print(e)
+
+ def vehicleControlCb(self):
+ if self.cmd_msg!=None:
+ self.target_angle = self.cmd_msg.steer
+ #self.get_logger().info(str(msg.steer))
+
+
+ response_msg = self.bus.recv(0.1)
+ if (response_msg is None):
+ print("No message received")
+ elif (response_msg.arbitration_id == 0x290):
+ self.cached_msg1 = response_msg.data
+ elif (response_msg.arbitration_id == 0x292):
+ if (self.cached_msg1 is None):
+ return
+ msg1 = self.cached_msg1
+ msg2 = response_msg.data
+ current_state = self.parseIncomingMessages(msg1, msg2)
+ self.current_angle = current_state.angle
+
+ #self.get_logger().info(str(self.current_angle))
+
+ # self.get_logger().info(f"Target: {self.target_angle}, current: {self.current_angle}")
+
+ self.sendCommand(self.target_angle, self.bus)
+
+ # current_angle_norm = (
+ # (self.current_angle-self.limit_left)/(self.limit_right-self.limit_left)*2)-1
+ # self.error = self.target_angle-current_angle_norm
+ # self.torque_a = int(
+ # min(255, max(0, math.ceil((self.error+1) * (255/2)))))
+ # self.torque_b = 255-self.torque_a
+
+ # data = [0x03, self.torque_a, self.torque_b,
+ # 0x00, 0x00, 0x00, 0x00, 0x00]
+ # message = can.Message(arbitration_id=0x296, data=data,
+ # check=True, is_extended_id=False)
+ # self.bus.send(message, timeout=0.2)
+
+ # The EPAS sends response info in two halves, each its own
+ # kind of CAN message. Combining the two gives us a complete state
+ # of the EPAS. Let's combine the two now.
+
+
+
+
+def main(args=None):
+ rclpy.init(args=args)
+ epas_node = EpasNode()
+ rclpy.spin(epas_node)
+ epas_node.destroy_node()
+ rclpy.shutdown()
diff --git a/src/interface/epas/package.xml b/src/interface/epas/package.xml
new file mode 100755
index 000000000..c50150129
--- /dev/null
+++ b/src/interface/epas/package.xml
@@ -0,0 +1,16 @@
+
+
+
+ epas
+ 1.0.0
+ Nodes for processing vehicle turn data and contacting CAN
+ Ashwin Somasundaram
+ MIT
+
+ ament_lint_auto
+ ament_lint_common
+
+
+ ament_python
+
+
diff --git a/src/mapping/map_management_old/COLCON_IGNORE b/src/interface/epas/resource/epas
old mode 100644
new mode 100755
similarity index 100%
rename from src/mapping/map_management_old/COLCON_IGNORE
rename to src/interface/epas/resource/epas
diff --git a/src/interface/epas/setup.cfg b/src/interface/epas/setup.cfg
new file mode 100755
index 000000000..cece4d1d9
--- /dev/null
+++ b/src/interface/epas/setup.cfg
@@ -0,0 +1,4 @@
+[develop]
+script-dir=$base/lib/epas
+[install]
+install-scripts=$base/lib/epas
diff --git a/src/tools/nova_viz/setup.py b/src/interface/epas/setup.py
similarity index 89%
rename from src/tools/nova_viz/setup.py
rename to src/interface/epas/setup.py
index 7aff2855b..6fc927b76 100755
--- a/src/tools/nova_viz/setup.py
+++ b/src/interface/epas/setup.py
@@ -2,7 +2,7 @@
from glob import glob
import os
-package_name = 'nova_viz'
+package_name = 'epas'
setup(
name=package_name,
@@ -23,7 +23,7 @@
tests_require=['pytest'],
entry_points={
'console_scripts': [
- 'nova_viz_exe = nova_viz.nova_viz_exe:main',
+ 'epas_node = epas.epas_node:main',
],
},
)
diff --git a/src/tools/nova_viz/nova_viz/__init__.py b/src/interface/joy_translation/joy_translation/__init__.py
old mode 100755
new mode 100644
similarity index 100%
rename from src/tools/nova_viz/nova_viz/__init__.py
rename to src/interface/joy_translation/joy_translation/__init__.py
diff --git a/src/interface/joy_translation/joy_translation/joy_translation_node.py b/src/interface/joy_translation/joy_translation/joy_translation_node.py
new file mode 100644
index 000000000..42c9d2d68
--- /dev/null
+++ b/src/interface/joy_translation/joy_translation/joy_translation_node.py
@@ -0,0 +1,97 @@
+'''
+Package: joy_translation
+Filename: joy_translation_node.py
+Author: Ashwin Somasundaram, Will Heitman (w at heit.mn)
+
+Converts Joy messages to vehicle control commands
+
+Xbox One controller axes:
+[0]: LS, X
+[1]: LS, Y
+[2]: LT
+[3]: LS, X
+[4]: LS, Y
+[5]: RT
+[6]: Dpad X
+[7]: Dpad Y
+
+Xbox One controller buttons:
+[0]: A
+[1]: B
+[2]: X
+[3]: Y
+[4]: LB
+[5]: RB
+[6]: Select (left)
+[7]: Start (right)
+[8]: Xbox
+[9]: LSB
+[10]: RSB
+
+Controls:
+A: Auto enable (hold)
+X: Manual enable (hold, takes precedence over A)
+LS: Steering position
+LT: Brake
+RT: Throttle
+
+Subscribes to:
+ /joy (sensor_msgs/Joy)
+
+Publishes to:
+/carla/hero/vehicle_control_cmd (CarlaEgoVehicleControl)
+'''
+
+import numpy as np
+from rosgraph_msgs.msg import Clock
+import time
+
+from carla_msgs.msg import CarlaEgoVehicleControl
+from nova_msgs.msg import Mode
+import rclpy
+from rclpy.node import Node
+from sensor_msgs.msg import Joy
+
+
+class joy_translation_node(Node):
+ current_mode = Mode.DISABLED
+
+ def __init__(self):
+ super().__init__('joy_translation_node')
+ self.joy_sub = self.create_subscription(
+ Joy, '/joy', self.joyCb, 10)
+
+ def process_joy(self, joy_msg: Joy):
+ #self.get_logger().info('bruh')
+ msg = CarlaEgoVehicleControl()
+ msg.header.stamp = Clock().clock
+ msg.header.frame_id = 'base_link'
+ msg.throttle = ((joy_msg.axes[5]*-1)+1)/2
+
+ # TODO: Fix this jank.
+ if command_msg.throttle == 0.5:
+ command_msg.throttle = 0.0
+
+ msg.steer = joy_msg.axes[0]*-1
+
+ if abs(msg.steer)<0.2:
+ msg.steer = 0.0
+ #self.get_logger().info(str(msg.steer))
+ msg.brake = joy_msg.axes[2]
+
+ #self.get_logger().info('this is the val of brake sent in')
+ #self.get_logger().info(str(msg.brake))
+ msg.hand_brake = True if joy_msg.buttons[2]==1 else False
+ msg.reverse = True if joy_msg.buttons[0]==1 else False
+ msg.gear = True if joy_msg.buttons[3]==1 else False
+ msg.manual_gear_shift = True if joy_msg.buttons[1]==1 else False
+ self.output_msg.publish(msg)
+
+
+def main(args=None):
+ rclpy.init(args=args)
+ joy_translator = joy_translation_node()
+ rclpy.spin(joy_translator)
+
+ joy_translation_node.destroy_node()
+ rclpy.shutdown()
diff --git a/src/interface/joy_translation/package.xml b/src/interface/joy_translation/package.xml
new file mode 100755
index 000000000..a61f4acd7
--- /dev/null
+++ b/src/interface/joy_translation/package.xml
@@ -0,0 +1,16 @@
+
+
+
+ joy_translation
+ 1.0.0
+ Nodes for processing vehicle turn data through the XBOX controller
+ Will Heitman
+ MIT
+
+ ament_lint_auto
+ ament_lint_common
+
+
+ ament_python
+
+
diff --git a/src/mapping/map_management_old/resource/map_management b/src/interface/joy_translation/resource/joy_translation
similarity index 100%
rename from src/mapping/map_management_old/resource/map_management
rename to src/interface/joy_translation/resource/joy_translation
diff --git a/src/interface/joy_translation/setup.cfg b/src/interface/joy_translation/setup.cfg
new file mode 100755
index 000000000..8c869c236
--- /dev/null
+++ b/src/interface/joy_translation/setup.cfg
@@ -0,0 +1,4 @@
+[develop]
+script-dir=$base/lib/joy_translation
+[install]
+install-scripts=$base/lib/joy_translation
diff --git a/src/mapping/map_management_old/setup.py b/src/interface/joy_translation/setup.py
similarity index 78%
rename from src/mapping/map_management_old/setup.py
rename to src/interface/joy_translation/setup.py
index 978550460..ef0a04710 100755
--- a/src/mapping/map_management_old/setup.py
+++ b/src/interface/joy_translation/setup.py
@@ -2,7 +2,7 @@
from glob import glob
import os
-package_name = 'map_management'
+package_name = 'joy_translation'
setup(
name=package_name,
@@ -23,7 +23,8 @@
tests_require=['pytest'],
entry_points={
'console_scripts': [
- 'map_management_node = map_management.map_management_node:main',
+ #'dynamic_grid_node = dynamic_grid.dynamic_grid_node:main',
+ 'joy_translation_node = joy_translation.joy_translation_node:main',
],
- }
+ },
)
diff --git a/src/interface/linear_actuator/CMakeLists.txt b/src/interface/linear_actuator/CMakeLists.txt
deleted file mode 100755
index 514f6d150..000000000
--- a/src/interface/linear_actuator/CMakeLists.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-# Filename: CMakeLists.txt
-# Author: Joshua Williams
-# Email: joshmackwilliams@protonmail.com
-# Copyright: 2021, Nova UTD
-# License: MIT License
-
-# No package name is specified above since this is our standard
-# CMakeLists.txt file and will be the same across multiple
-# projects. To use it, just add nova_auto_package as a
-# buildtool_depend in package.xml and copy this file into the root of
-# your package.
-
-cmake_minimum_required(VERSION 3.5)
-get_filename_component(directory_name ${CMAKE_CURRENT_SOURCE_DIR} NAME)
-project(${directory_name})
-
-find_package(nova_auto_package REQUIRED)
-nova_auto_package()
diff --git a/src/interface/linear_actuator/exe/controller.cpp b/src/interface/linear_actuator/exe/controller.cpp
deleted file mode 100755
index a5f330a70..000000000
--- a/src/interface/linear_actuator/exe/controller.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Package: linear_actuator
- * Filename: controller.cpp
- * Author: Joshua Williams
- * Email: joshmackwilliams@protonmail.com
- * Copyright: 2022, Nova UTD
- * License: MIT License
- */
-
-#include // std::make_shared
-#include "rclcpp/rclcpp.hpp"
-#include "linear_actuator/ControllerNode.hpp"
-
-int main(int argc, char ** argv) {
- rclcpp::init(argc, argv);
- rclcpp::spin(std::make_shared());
- rclcpp::shutdown();
- return 0;
-}
diff --git a/src/interface/linear_actuator/include/linear_actuator/ControllerNode.hpp b/src/interface/linear_actuator/include/linear_actuator/ControllerNode.hpp
deleted file mode 100755
index d22f58fac..000000000
--- a/src/interface/linear_actuator/include/linear_actuator/ControllerNode.hpp
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Package: linear_actuator
- * Filename: include/linear_actuator/ControllerNode.hpp
- * Author: Joshua Williams
- * Email: joshmackwilliams@protonmail.com
- * Copyright: 2022, Nova UTD
- * License: MIT License
- */
-
-#pragma once
-
-#include // Time literals
-#include
-
-#include "rclcpp/rclcpp.hpp"
-#include "nova_msgs/msg/can_frame.hpp"
-#include "std_msgs/msg/float32.hpp"
-
-#include "linear_actuator/controller_params.hpp"
-#include "linear_actuator/types.hpp"
-
-using namespace std::chrono_literals;
-
-namespace navigator {
-namespace linear_actuator {
-
-class ControllerNode : public rclcpp::Node {
-public:
- ControllerNode();
- ControllerNode(controller_params params);
- virtual ~ControllerNode();
-
-private:
- void send_control_message();
- void update_target_position(const std_msgs::msg::Float32::SharedPtr position);
- void init();
-
- float target_position;
- controller_params params;
-
- rclcpp::Publisher::SharedPtr can_publisher;
- rclcpp::Subscription::SharedPtr position_subscription;
- rclcpp::TimerBase::SharedPtr control_timer;
-};
-}
-}
diff --git a/src/interface/linear_actuator/include/linear_actuator/controller_params.hpp b/src/interface/linear_actuator/include/linear_actuator/controller_params.hpp
deleted file mode 100755
index f2f412b86..000000000
--- a/src/interface/linear_actuator/include/linear_actuator/controller_params.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Package: linear_actuator
- * Filename: include/linear_actuator/controller_params.hpp
- * Author: Joshua Williams
- * Email: joshmackwilliams@protonmail.com
- * Copyright: 2022, Nova UTD
- * License: MIT License
- */
-
-#pragma once
-
-#include "linear_actuator/types.hpp"
-
-namespace navigator {
-namespace linear_actuator {
-
-struct controller_params {
- int disengaged_position;
- int engaged_position;
- can_id_t command_id;
-};
-
-}
-}
diff --git a/src/interface/linear_actuator/include/linear_actuator/types.hpp b/src/interface/linear_actuator/include/linear_actuator/types.hpp
deleted file mode 100755
index ee200079f..000000000
--- a/src/interface/linear_actuator/include/linear_actuator/types.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Package: linear_actuator
- * Filename: include/linear_actuator/types.hpp
- * Author: Joshua Williams
- * Email: joshmackwilliams@protonmail.com
- * Copyright: 2022, Nova UTD
- * License: MIT License
- */
-
-#pragma once
-
-#include
-
-namespace navigator {
-namespace linear_actuator {
-
-typedef uint32_t can_id_t;
-typedef uint64_t can_data_t;
-
-}
-}
diff --git a/src/perception/ROSOccupancyGridPrediction/COLCON_IGNORE b/src/interface/linear_actuator/linear_actuator/__init__.py
old mode 100644
new mode 100755
similarity index 100%
rename from src/perception/ROSOccupancyGridPrediction/COLCON_IGNORE
rename to src/interface/linear_actuator/linear_actuator/__init__.py
diff --git a/src/interface/linear_actuator/linear_actuator/linear_actuator_node.py b/src/interface/linear_actuator/linear_actuator/linear_actuator_node.py
new file mode 100755
index 000000000..547ef39a7
--- /dev/null
+++ b/src/interface/linear_actuator/linear_actuator/linear_actuator_node.py
@@ -0,0 +1,281 @@
+'''
+Package: linear_actuator
+Filename: linear_actuator_node.py
+Author: Will Heitman (w at heit.mn)
+
+Subscribes to CarlaEgoVehicleControl messages (https://github.com/carla-simulator/ros-carla-msgs/blob/leaderboard-2.0/msg/CarlaEgoVehicleControl.msg)
+
+Sends the appropriate brake data to the LA
+'''
+
+import os
+import random
+import time
+
+import can
+import rclpy
+from carla_msgs.msg import CarlaEgoVehicleControl
+from rclpy.node import Node
+from rclpy.qos import DurabilityPolicy, QoSProfile
+
+#bus = None
+COMMAND_ID = 0xFF0000
+REPORT_ID = 0xFF0001
+
+
+class linear_actuator_node(Node):
+ vehicle_command_sub = None
+ brake = None
+ def __init__(self):
+ super().__init__('linear_actuator_node')
+
+ self.vehicle_command_sub = self.create_subscription(CarlaEgoVehicleControl, '/carla/hero/vehicle_control_cmd', self.sendBrakeControl, 10)
+ #self.get_logger().info(str(vehicle_command_sub))
+ #self.brake = 0.0 # 0.0 is released, 1.0 is fully pressed
+ self.get_logger().info("Bus now connected.")
+
+ channel = '/dev/serial/by-id/usb-Protofusion_Labs_CANable_1205aa6_https:__github.com_normaldotcom_cantact-fw_001C000F4E50430120303838-if00'
+ bitrate = 250000
+ self.bus = can.interface.Bus(bustype='slcan', channel=channel, bitrate=bitrate, receive_own_messages=True)
+
+ while self.bus is None:
+ self.get_logger().warn("Bus not yet set. Waiting...")
+ time.sleep(1.0)
+
+ self.get_logger().info("Bus now connected.")
+ response = self.enableClutch(self.bus)
+ self.get_logger().debug(f"Clutch enabled with response {response}")
+
+ #self.brake_control_timer = self.create_timer(
+ #0.1, self.sendBrakeControl(self.bus))
+
+ def commandCb(self, msg: CarlaEgoVehicleControl):
+ self.brake = msg.brake
+ self.get_logger().info('this is the val of the brake currently')
+ self.get_logger().info(str(self.brake))
+
+ def sendBrakeControl(self, msg: CarlaEgoVehicleControl):
+ #self.get_logger().info('Printing self.brake in sendBrakeControl')
+ #self.get_logger().info(str(msg.brake))
+ if self.bus is None:
+ self.get_logger().warn("Bus not yet set. Skipping command")
+ if msg.brake < 0.0:
+ msg.brake = 0.0
+ elif msg.brake == 0.0:
+ msg.brake = 1.0
+ response = self.sendToPosition(msg.brake, self.bus)
+ print(response)
+
+ def enableClutch(self, bus: can.Bus):
+ clutch_enable = True
+ motor_enable = False
+ clutch_enable_byte = clutch_enable * 0x80
+ motor_enable_byte = motor_enable * 0x40
+ byte3 = clutch_enable_byte + motor_enable_byte
+
+ data = [0x0F, 0x4A, 0, byte3, 0, 0, 0]
+
+ message = can.Message(
+ arbitration_id=COMMAND_ID, data=data, is_extended_id=True)
+
+ msg = bus.recv(0.1)
+ return msg
+
+ def sendToPosition(self, pos: float, bus: can.Bus):
+
+ #self.get_logger().info('hey im in the sendtoposition function')
+ """Given position, send appropriate CAN messages to LA
+
+ Args:
+ pos (float): Position from 0.0 (fully extended) to 1.0 (fully retracted)
+
+ Position command format:
+ [0x0F 0x4A DPOS_LOW Byte3 0 0 0 0]
+
+ Byte 3:
+ [ClutchEnable MotorEnable POS7 POS6 POS5 POS4 POS3]
+ """
+
+ POSITION_MAX = 3.45
+ POSITION_MIN = 0.80
+ range = POSITION_MAX - POSITION_MIN
+ pos_inches = pos * range + POSITION_MIN
+
+ # Account for 0.5 inch offset
+ pos_value = int(pos_inches * 1000) + 500
+
+ dpos_hi = int(pos_value / 0x100)
+ dpos_low = pos_value % 0x100
+
+ clutch_enable = True
+ motor_enable = True
+ clutch_enable_byte = clutch_enable * 0x80
+ motor_enable_byte = motor_enable * 0x40
+ byte3 = sum([dpos_hi, clutch_enable_byte, motor_enable_byte])
+
+ data = [0x0F, 0x4A, dpos_low, byte3, 0, 0, 0]
+
+ message = can.Message(
+ arbitration_id=COMMAND_ID, data=data, is_extended_id=True)
+
+ bus.send(message)
+
+ msg = bus.recv(0.1)
+
+ return msg
+
+
+# class LAController:
+
+# def parseResponseMsg(self, msg: can.Message):
+# if msg.data[0] == 0x98 and msg.data[1] == 0x00:
+# self.parseEPR(msg)
+
+# else:
+# print(msg)
+
+# def parseEPR(self, msg: can.Message):
+# """Parse an Enhanced Position Report message
+
+# Args:
+# msg (can.Message): EPR message
+
+# EPR message format:
+# [0x98 0x00 ShaftA ShaftB Errors CurrentA CurrentB Status]
+# """
+
+# data = msg.data
+
+# # Parse int from shaftA, shaftB
+# shaft_extension_inches = int.from_bytes(
+# data[2:4], byteorder='little')*0.001
+
+# # Parse errors
+# fault_code = data[4]
+# is_faulty = fault_code > 0 # True if one of the bit flags is set
+
+# # Parse current
+# current_mA = int.from_bytes(data[5:7], byteorder='little')
+
+# print(
+# f"Pos: {shaft_extension_inches} inches, status: {fault_code}, current: {current_mA} mA")
+
+# def enableClutch(self, bus: can.Bus):
+# clutch_enable = True
+# motor_enable = False
+# clutch_enable_byte = clutch_enable * 0x80
+# motor_enable_byte = motor_enable * 0x40
+# byte3 = clutch_enable_byte + motor_enable_byte
+
+# data = [0x0F, 0x4A, 0, byte3, 0, 0, 0]
+
+# message = can.Message(
+# arbitration_id=COMMAND_ID, data=data, is_extended_id=True)
+
+# msg = bus.recv(0.1)
+# return msg
+
+# def disableClutch(self, bus: can.Bus):
+# clutch_enable = False
+# motor_enable = False
+# clutch_enable_byte = clutch_enable * 0x80
+# motor_enable_byte = motor_enable * 0x40
+# byte3 = clutch_enable_byte + motor_enable_byte
+
+# data = [0x0F, 0x4A, 0, byte3, 0, 0, 0]
+
+# message = can.Message(
+# arbitration_id=COMMAND_ID, data=data, is_extended_id=True)
+
+# msg = bus.recv(0.1)
+# return msg
+
+# def sendToPosition(self, pos: float, bus: can.Bus):
+# """Given position, send appropriate CAN messages to LA
+
+# Args:
+# pos (float): Position from 0.0 (fully extended) to 1.0 (fully retracted)
+
+# Position command format:
+# [0x0F 0x4A DPOS_LOW Byte3 0 0 0 0]
+
+# Byte 3:
+# [ClutchEnable MotorEnable POS7 POS6 POS5 POS4 POS3]
+# """
+
+# POSITION_MAX = 3.45
+# POSITION_MIN = 0.80
+# range = POSITION_MAX - POSITION_MIN
+# pos_inches = pos * range + POSITION_MIN
+
+# # Account for 0.5 inch offset
+# pos_value = int(pos_inches * 1000) + 500
+
+# dpos_hi = int(pos_value / 0x100)
+# dpos_low = pos_value % 0x100
+
+# clutch_enable = True
+# motor_enable = True
+# clutch_enable_byte = clutch_enable * 0x80
+# motor_enable_byte = motor_enable * 0x40
+# byte3 = sum([dpos_hi, clutch_enable_byte, motor_enable_byte])
+
+# data = [0x0F, 0x4A, dpos_low, byte3, 0, 0, 0]
+# # print(hex(clutch_enable_byte))
+# # print(hex(motor_enable_byte))
+# # print(hex(byte3))
+
+# message = can.Message(
+# arbitration_id=COMMAND_ID, data=data, is_extended_id=True)
+
+# bus.send(message)
+
+# msg = bus.recv(0.1)
+
+# return msg
+
+# def run(self, channel, bitrate):
+# print("Opening bus... ", end="")
+# bus = can.interface.Bus(
+# bustype='slcan', channel=channel, bitrate=bitrate, receive_own_messages=True)
+# print("Bus open.")
+
+# x = np.linspace(0.0, 4*np.pi, 201)
+# positions = (np.sin(x) + 1.0) / 2
+# print(positions)
+
+# self.enableClutch(bus=bus)
+
+# for pos in tqdm(positions):
+# response = self.sendToPosition(pos, bus=bus)
+# time.sleep(0.05)
+# # print(pos, end=" ")
+# # self.parseResponseMsg(response)
+
+# self.disableClutch(bus=bus)
+
+# # self.sendToPosition(0.0, bus=bus)
+# # time.sleep(0.4)
+# # self.sendToPosition(0.5, bus=bus)
+# # time.sleep(1.4)
+# # self.sendToPosition(1.0, bus=bus)
+# # time.sleep(2.4)
+
+
+def main(args=None):
+ rclpy.init(args=args)
+
+ LAN = linear_actuator_node()
+
+
+ rclpy.spin(LAN)
+
+ # Destroy the node explicitly
+ # (optional - otherwise it will be done automatically
+ # when the garbage collector destroys the node object)
+ linear_actuator_node.destroy_node()
+ rclpy.shutdown()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/src/interface/linear_actuator/package.xml b/src/interface/linear_actuator/package.xml
index c396c22b1..121289075 100755
--- a/src/interface/linear_actuator/package.xml
+++ b/src/interface/linear_actuator/package.xml
@@ -2,19 +2,12 @@
linear_actuator
- 0.0.0
- ROS nodes to control linear actuators
- Joshua Williams
- MIT License
-
- nova_auto_package
-
- rclcpp
- nova_msgs
-
- voltron_test_utils
+ 1.1.0
+ Simple package to interface with a Kar-Tech CAN linear actuator
+ Will Heitman
+ MIT
- ament_cmake
+ ament_python
diff --git a/src/perception/dynamic_grid/resource/dynamic_grid b/src/interface/linear_actuator/resource/linear_actuator
similarity index 100%
rename from src/perception/dynamic_grid/resource/dynamic_grid
rename to src/interface/linear_actuator/resource/linear_actuator
diff --git a/src/interface/linear_actuator/setup.cfg b/src/interface/linear_actuator/setup.cfg
new file mode 100755
index 000000000..0fb8a11df
--- /dev/null
+++ b/src/interface/linear_actuator/setup.cfg
@@ -0,0 +1,4 @@
+[develop]
+script-dir=$base/lib/linear_actuator
+[install]
+install-scripts=$base/lib/linear_actuator
diff --git a/src/interface/linear_actuator/setup.py b/src/interface/linear_actuator/setup.py
new file mode 100755
index 000000000..b5cf907eb
--- /dev/null
+++ b/src/interface/linear_actuator/setup.py
@@ -0,0 +1,29 @@
+from setuptools import setup
+from glob import glob
+import os
+
+package_name = 'linear_actuator'
+
+setup(
+ name=package_name,
+ version='1.0.0',
+ packages=[package_name],
+ data_files=[
+ ('share/ament_index/resource_index/packages',
+ ['resource/' + package_name]),
+ ('share/' + package_name, ['package.xml']),
+ (os.path.join('share', package_name), glob('launch/*.launch.py'))
+ ],
+ install_requires=['setuptools'],
+ zip_safe=True,
+ maintainer='Nova at UT Dallas',
+ maintainer_email='project.nova@utdallas.edu',
+ description='See package.xml',
+ license='MIT',
+ tests_require=['pytest'],
+ entry_points={
+ 'console_scripts': [
+ 'linear_actuator_node = linear_actuator.linear_actuator_node:main'
+ ],
+ },
+)
diff --git a/src/interface/linear_actuator/src/ControllerNode.cpp b/src/interface/linear_actuator/src/ControllerNode.cpp
deleted file mode 100755
index 7c85136a1..000000000
--- a/src/interface/linear_actuator/src/ControllerNode.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Package: linear_actuator
- * Filename: src/ControllerNode.cpp
- * Author: Joshua Williams
- * Email: joshmackwilliams@protonmail.com
- * Copyright: 2022, Nova UTD
- * License: MIT License
- */
-
-#include
-#include
-#include
-#include "rclcpp/rclcpp.hpp"
-#include "nova_msgs/msg/can_frame.hpp"
-#include "std_msgs/msg/float32.hpp"
-
-#include "linear_actuator/ControllerNode.hpp"
-
-using namespace navigator::linear_actuator;
-
-ControllerNode::ControllerNode() : Node("linear_actuator") {
- this->declare_parameter("engaged_position");
- this->declare_parameter("disengaged_position");
- this->declare_parameter("command_id");
- this->get_parameter("engaged_position", this->params.engaged_position);
- this->get_parameter("disengaged_position", this->params.disengaged_position);
- this->get_parameter("command_id", this->params.command_id);
- this->init();
-}
-
-ControllerNode::ControllerNode(controller_params params) : Node("linear_actuator") {
- this->params = params;
- this->init();
-}
-
-ControllerNode::~ControllerNode() {}
-
-void ControllerNode::init() {
- this->can_publisher = this->create_publisher
- ("outgoing_can_frames", 8);
- this->position_subscription = this->create_subscription
- ("target_position", 8, bind(& ControllerNode::update_target_position, this, std::placeholders::_1));
- this->control_timer = this->create_wall_timer(100ms,
- bind(& ControllerNode::send_control_message, this));
-}
-
-void ControllerNode::send_control_message() {
- can_data_t target_position = (can_data_t) std::lerp(
- (float) this->params.disengaged_position,
- (float) this->params.engaged_position,
- this->target_position);
-
- auto message = nova_msgs::msg::CanFrame();
- message.identifier = this->params.command_id;
- message.data = 0x00000000C0000A0F;
- message.data = message.data | target_position << 16;
-
- this->can_publisher->publish(message);
-}
-
-void ControllerNode::update_target_position(const std_msgs::msg::Float32::SharedPtr message) {
- this->target_position = message->data;
-}
diff --git a/src/perception/ground_seg/resource/ground_seg b/src/interface/mcu_interface/mcu_interface/__init__.py
old mode 100644
new mode 100755
similarity index 100%
rename from src/perception/ground_seg/resource/ground_seg
rename to src/interface/mcu_interface/mcu_interface/__init__.py
diff --git a/src/interface/mcu_interface/mcu_interface/mcu_interface_node.py b/src/interface/mcu_interface/mcu_interface/mcu_interface_node.py
new file mode 100755
index 000000000..59243b51f
--- /dev/null
+++ b/src/interface/mcu_interface/mcu_interface/mcu_interface_node.py
@@ -0,0 +1,108 @@
+'''
+Package: mcu_interface
+Filename: mcu_interface_node.py
+Author: Jai Peris
+
+Subscribes to CarlaEgoVehicleControl messages (https://github.com/carla-simulator/ros-carla-msgs/blob/leaderboard-2.0/msg/CarlaEgoVehicleControl.msg)
+
+Sends the appropriate brake data to the LA
+'''
+
+import os
+import random
+import time
+import io
+
+import serial
+import rclpy
+from carla_msgs.msg import CarlaEgoVehicleControl
+from rclpy.node import Node
+from rclpy.qos import DurabilityPolicy, QoSProfile
+
+bus = None
+COMMAND_ID = 0xFF0000
+REPORT_ID = 0xFF0001
+
+
+class McuInterfaceNode(Node):
+
+ def __init__(self, bus):
+ super().__init__('mcu_interface_node')
+
+ self.last_command_rcv_time = None
+
+ self.vehicle_command_sub = self.create_subscription(
+ CarlaEgoVehicleControl, '/carla/hero/vehicle_control_cmd', self.commandCb, 1)
+
+ self.brake = 0.0 # 0.0 is released, 1.0 is fully pressed
+ self.bus: serial.Serial = bus
+
+ while bus is None:
+ self.get_logger().warn("Bus not yet set. Waiting...")
+ time.sleep(1.0)
+
+ self.sio = io.TextIOWrapper(io.BufferedRWPair(self.bus, self.bus))
+
+ self.get_logger().info("Bus now connected.")
+
+ # what is create_timer? -Jai
+ self.vehicle_command_timer = self.create_timer(.5, self.publishCommand)
+ self.throttle = 0
+
+ def commandCb(self, msg: CarlaEgoVehicleControl):
+ self.throttle = msg.throttle
+ print(f"Joystick Throttle: {self.throttle}\n")
+
+ # publishes the number (0-1) received from the subscription
+ def publishCommand(self):
+ throttle = self.throttle
+ if throttle < 0.1:
+ return
+ throttle = min(throttle, 0.3)
+ self.get_logger().info(f"Throttle = {throttle}")
+
+ # command = str.encode(f"$throttle,{throttle};\n")
+ # s stands for start and e stands for end
+ command = f"s{throttle}e\r".encode()
+ self.get_logger().info(f"Command: s{throttle}e")
+ self.bus.write(command)
+
+ # self.sio.write(f"$throttle,{throttle};\n")
+
+ response = self.sio.readline()
+ # self.get_logger().info(response)
+ # self.sio.flush()
+
+
+def main(args=None):
+ rclpy.init(args=args)
+
+ # Try ls /dev/seria/by-id
+ channel = '/dev/serial/by-id/usb-Adafruit_Industries_LLC_Grand_Central_M4_Express_BA3E99D033533853202020350D3B12FF-if00'
+ bitrate = 115200
+
+ bus = None
+
+ while bus is None:
+ try:
+ bus = serial.Serial(channel, bitrate, timeout=1)
+ except Exception as e:
+ print(f"An error occured opening the bus: {e} Retrying...")
+ time.sleep(1.0)
+
+ mcu_interface_node = McuInterfaceNode(bus)
+
+ rclpy.spin(mcu_interface_node)
+
+ # Close the serial connection
+ bus.close()
+
+ # Destroy the node explicitly
+ # (optional - otherwise it will be done automatically
+ # when the garbage collector destroys the node object)
+ mcu_interface_node.destroy_node()
+ rclpy.shutdown()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/src/interface/mcu_interface/package.xml b/src/interface/mcu_interface/package.xml
new file mode 100755
index 000000000..302207c58
--- /dev/null
+++ b/src/interface/mcu_interface/package.xml
@@ -0,0 +1,13 @@
+
+
+
+ mcu_interface
+ 1.1.0
+ Simple package to interface with a Kar-Tech CAN linear actuator
+ Will Heitman
+ MIT
+
+
+ ament_python
+
+
diff --git a/src/planning/cost_map_maker/COLCON_IGNORE b/src/interface/mcu_interface/resource/mcu_interface
similarity index 100%
rename from src/planning/cost_map_maker/COLCON_IGNORE
rename to src/interface/mcu_interface/resource/mcu_interface
diff --git a/src/interface/mcu_interface/setup.cfg b/src/interface/mcu_interface/setup.cfg
new file mode 100755
index 000000000..abd54e355
--- /dev/null
+++ b/src/interface/mcu_interface/setup.cfg
@@ -0,0 +1,4 @@
+[develop]
+script-dir=$base/lib/mcu_interface
+[install]
+install-scripts=$base/lib/mcu_interface
diff --git a/src/interface/mcu_interface/setup.py b/src/interface/mcu_interface/setup.py
new file mode 100755
index 000000000..b663454ed
--- /dev/null
+++ b/src/interface/mcu_interface/setup.py
@@ -0,0 +1,29 @@
+from setuptools import setup
+from glob import glob
+import os
+
+package_name = 'mcu_interface'
+
+setup(
+ name=package_name,
+ version='1.0.0',
+ packages=[package_name],
+ data_files=[
+ ('share/ament_index/resource_index/packages',
+ ['resource/' + package_name]),
+ ('share/' + package_name, ['package.xml']),
+ (os.path.join('share', package_name), glob('launch/*.launch.py'))
+ ],
+ install_requires=['setuptools'],
+ zip_safe=True,
+ maintainer='Nova at UT Dallas',
+ maintainer_email='project.nova@utdallas.edu',
+ description='See package.xml',
+ license='MIT',
+ tests_require=['pytest'],
+ entry_points={
+ 'console_scripts': [
+ 'mcu_interface_node = mcu_interface.mcu_interface_node:main'
+ ],
+ },
+)
diff --git a/src/interface/nmea_navsat_driver/CHANGELOG.rst b/src/interface/nmea_navsat_driver/CHANGELOG.rst
new file mode 100644
index 000000000..132c4f894
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/CHANGELOG.rst
@@ -0,0 +1,118 @@
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Changelog for package nmea_navsat_driver
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+2.0.0 (2022-06-25)
+------------------
+
+* Replace dependency on transforms3d pip package to tf_transformations. (`#147 `_)
+* Added log for successful connection. (`#149 `_)
+* Removed printing every time the checksum is checked. (`#148 `_)
+* nmea_socket_driver fixes for ROS2 (`#127 `_)
+ * Fix white space for PEP8 compliance
+ * Fix socket driver for ROS2 Foxy
+ * Add config file for socket driver
+ * Decode bytes as ASCII
+* Fix bug where ROS node is not assigned correctly (`#114 `_)
+ Fixes `#71 `_
+* Update launch file for ROS2 Foxy (`#110 `_)
+ * Remove get_default_launch_description, which no longer exists.
+ * Update the parameters of the Node initializer to the Foxy API.
+* Update pyserial dependency to make it findable with rosdep (`#109 `_)
+ This allows rosdep to find the correct serial package and install it.
+* ROS2: Eloquent changes for python packages (`#101 `_)
+ Fix some warnings when installing packages that first appear in ROS2 Eloquent:
+ - A missing the resource folder
+ - Not explicitly installing package.xml in the share folder.
+* ROS2 updates for Dashing (`#80 `_)
+ Change subscriptions and parameters to conform to API changes in ROS 2 Dashing.
+* Remove scripts directory in favor of nodes subpackage (`#77 `_)
+ Since these modules will no longer be called as scripts in ROS 2,
+ move them to a nodes subpackage, and remove the option to call them
+ as executables.
+ Addresses `#75 `_ for ROS 2.
+* Fix nmea_topic_serial_reader name (`#74 `_)
+ - Fix `#72 `_ (no module name scripts.nmea_topic_serial_driver)
+ - Fix exception handling in nmea_topic_serial_reader ('rclpy' has no attribute 'ROSInterruptException')
+* Clean up launch file and make it runnable with ROS2 launch (`#73 `_)
+ Fixes `#70 `_
+ - Rename config file and put it into a config directory.
+ - Make setup.py install the launch and config files.
+ - Rename the launch file with the .launch.py suffix used by OSRF
+ packages.
+ - Refactor the launch file so that it works with `ros2 launch`.
+* Fix PEP8 Violations and update setup.cfg file for pycodestyle. (`#69 `_)
+* Port to ROS 2 (`#64 `_)
+ Initial work to port nmea_navsat_driver to ROS2 by @klintan.
+* Add nmea_serial_driver launch file (`#60 `_)
+ Add example nmea_serial_driver launch file.
+* Remove automatic prefixing of forward slash to frame_id. (`#33 `_/`#57 `_)
+ To be consistent with the current default behavior, the default frame_id has been set to /gps with the prepended forward slash.
+* Add support for IMU aided GPS systems (`#30 `_/`#58 `_)
+ * Add support for IMU aided GPS systems like the Applanix POS/MV, whose NMEA strings typically begin '$IN'. (e.g. $INGGA).
+ * Add support for VTG messages, which contain Course Over Ground and Speed Made Good. These are useful when not using RMC messages and you don't have a heading sensor.
+* Add support for publishing heading from GPHDT as a QuaternionStamped message on the topic /heading (`#25 `_)
+* Improve Covariance Estimation (`#46 `_)
+ Use GST covariance where available, otherwise uses default covariances estimated from fix type.
+ The previous implementation set covariance to HDOP^2. Instead, it should multiply that by the measurement variance. HDOP should be greater than 1.0.
+* Add Socket Driver (`#32 `_)
+ Add a NMEA socket driver node, which is like the existing serial driver node, but instead of attaching to a TTY handle from a serial port, it listens to a UDP port for NMEA sentences.
+* Add code to handle serial exception to allow node to exit cleanly (`#52 `_)
+ - Catch Serial exceptions and exit cleanly, instead of printing Python stack trace.
+ - Catch Serial exception when opening the serial port, log a FATAL message, and exit instead of printing Python stack trace.
+* Remove MSL compensation (`#36 `_)
+ Fix for `#29 `_ Altitude vs Elipsoid Height.
+* Add GLONASS support
+ GLONASS capable devices send different NMEA sentences, which are
+ basically identical to the GPS sentences, but with other prefixes.
+* Updated driver to accept status of 9 which some novatel receivers report for a WAAS (SBAS) fix.
+ See http://www.novatel.com/support/known-solutions/which-novatel-position-types-correspond-to-the-gga-quality-indicator/
+
+0.5.0 (2015-04-23)
+------------------
+* Release to Jade.
+
+0.4.2 (2015-04-23)
+------------------
+* Fix remaining parse problem with NovAtel receivers (empty field specified for num_satellite).
+
+0.4.1 (2014-08-03)
+------------------
+* Add debug logging output to the parser (PR #8, Mike Purvis)
+* Add queue size argument to publishers to fix warning on Indigo (PR #9, Mike Purvis)
+* Add support for roslint and some related cleanup (PR #10, Mike Purvis)
+
+0.4.0 (2014-05-04)
+-------------------
+* Initial release for Indigo
+* Fix #5: Empty fields spam rosout with warnings. Driver now outputs sensor_msgs/NavSatFix messages that may contain NaNs in position and covariance when receiving invalid fixes from the device.
+
+0.3.3 (2013-10-08)
+-------------------
+* Allow the driver to output velocity information anytime an RMC message is received
+
+0.3.2 (2013-07-21)
+-------------------
+* Moved to nmea_navsat_driver package
+* Removed .py extensions from new-in-Hydro scripts
+* Now uses nmea_msgs/Sentence instead of custom sentence type
+* nmea_topic_driver reads the `frame_id` parameter from the sentence, not from the parameter server
+
+0.3.1 (2013-05-07)
+-------------------
+* Removed incorrect find_package dependencies
+
+0.3.0 (2013-05-05)
+-------------------
+* Initial release for Hydro
+* Converted to Catkin
+* nmea_gps_driver.py is now deprecated and will be removed in I-Turtle. Replacement node is nmea_serial_driver.py .
+* Refactored code into NMEA parser, common ROS driver and separate nodes for reading directly from serial or from topic.
+* Bugs fixed:
+ - nmea_gps_driver crashes when a sentence doesn't have a checksum * character ( http://kforge.ros.org/gpsdrivers/trac/ticket/4 )
+ - Add ability for nmea_gps_driver to support reading from string topic ( https://github.com/ros-drivers/nmea_gps_driver/issues/1 ). Use the nmea_topic_driver.py node to get this support.
+
+0.2.0 (2012-03-15)
+------------------
+* Initial version (released into Fuerte)
+* Supports GGA or RMC+GSA sentences to generate sensor_msgs/NavSatFix messages
diff --git a/src/interface/nmea_navsat_driver/README.rst b/src/interface/nmea_navsat_driver/README.rst
new file mode 100644
index 000000000..398155693
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/README.rst
@@ -0,0 +1,11 @@
+nmea_navsat_driver
+===============
+
+ROS driver to parse NMEA strings and publish standard ROS NavSat message types. Does not require the GPSD daemon to be running.
+
+API
+---
+
+This package has no released Code API.
+
+The ROS API documentation and other information can be found at http://ros.org/wiki/nmea_navsat_driver
diff --git a/src/interface/nmea_navsat_driver/config/nmea_serial_driver.yaml b/src/interface/nmea_navsat_driver/config/nmea_serial_driver.yaml
new file mode 100644
index 000000000..1e3b55d5f
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/config/nmea_serial_driver.yaml
@@ -0,0 +1,7 @@
+nmea_navsat_driver:
+ ros__parameters:
+ port: "/dev/tty.usbserial"
+ baud: 4800
+ frame_id: "gps"
+ time_ref_source: "gps"
+ useRMC: False
\ No newline at end of file
diff --git a/src/interface/nmea_navsat_driver/config/nmea_socket_driver.yaml b/src/interface/nmea_navsat_driver/config/nmea_socket_driver.yaml
new file mode 100644
index 000000000..8ca2f307a
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/config/nmea_socket_driver.yaml
@@ -0,0 +1,6 @@
+nmea_navsat_driver:
+ ros__parameters:
+ ip: "0.0.0.0"
+ port: 10110
+ buffer_size: 4096
+ timeout_sec: 2
diff --git a/src/interface/nmea_navsat_driver/config/nmea_tcpclient_driver.yaml b/src/interface/nmea_navsat_driver/config/nmea_tcpclient_driver.yaml
new file mode 100644
index 000000000..c7a314199
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/config/nmea_tcpclient_driver.yaml
@@ -0,0 +1,5 @@
+nmea_navsat_driver:
+ ros__parameters:
+ ip: "192.168.131.22"
+ port: 9001
+ buffer_size: 4096
\ No newline at end of file
diff --git a/src/interface/nmea_navsat_driver/launch/nmea_serial_driver.launch.py b/src/interface/nmea_navsat_driver/launch/nmea_serial_driver.launch.py
new file mode 100644
index 000000000..77a4e5774
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/launch/nmea_serial_driver.launch.py
@@ -0,0 +1,55 @@
+# Copyright 2018 Open Source Robotics Foundation, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+""" A simple launch file for the nmea_serial_driver node. """
+
+import os
+import sys
+
+from ament_index_python.packages import get_package_share_directory
+from launch import LaunchDescription, LaunchIntrospector, LaunchService
+from launch_ros import actions
+
+
+def generate_launch_description():
+ """Generate a launch description for a single serial driver."""
+ config_file = os.path.join(get_package_share_directory("nmea_navsat_driver"), "config", "nmea_serial_driver.yaml")
+ driver_node = actions.Node(
+ package='nmea_navsat_driver',
+ executable='nmea_serial_driver',
+ output='screen',
+ parameters=[config_file])
+
+ return LaunchDescription([driver_node])
+
+
+def main(argv):
+ ld = generate_launch_description()
+
+ print('Starting introspection of launch description...')
+ print('')
+
+ print(LaunchIntrospector().format_launch_description(ld))
+
+ print('')
+ print('Starting launch of launch description...')
+ print('')
+
+ ls = LaunchService()
+ ls.include_launch_description(ld)
+ return ls.run()
+
+
+if __name__ == '__main__':
+ main(sys.argv)
diff --git a/src/interface/nmea_navsat_driver/launch/nmea_socket_driver.launch.py b/src/interface/nmea_navsat_driver/launch/nmea_socket_driver.launch.py
new file mode 100644
index 000000000..59ef40bad
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/launch/nmea_socket_driver.launch.py
@@ -0,0 +1,55 @@
+# Copyright 2022 Open Source Robotics Foundation, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+""" A simple launch file for the nmea_socket_driver node. """
+
+import os
+import sys
+
+from ament_index_python.packages import get_package_share_directory
+from launch import LaunchDescription, LaunchIntrospector, LaunchService
+from launch_ros import actions
+
+
+def generate_launch_description():
+ """Generate a launch description for a single socket driver."""
+ config_file = os.path.join(get_package_share_directory("nmea_navsat_driver"), "config", "nmea_socket_driver.yaml")
+ driver_node = actions.Node(
+ package='nmea_navsat_driver',
+ executable='nmea_socket_driver',
+ output='screen',
+ parameters=[config_file])
+
+ return LaunchDescription([driver_node])
+
+
+def main(argv):
+ ld = generate_launch_description()
+
+ print('Starting introspection of launch description...')
+ print('')
+
+ print(LaunchIntrospector().format_launch_description(ld))
+
+ print('')
+ print('Starting launch of launch description...')
+ print('')
+
+ ls = LaunchService()
+ ls.include_launch_description(ld)
+ return ls.run()
+
+
+if __name__ == '__main__':
+ main(sys.argv)
diff --git a/src/interface/nmea_navsat_driver/launch/nmea_tcpclient_driver.launch.py b/src/interface/nmea_navsat_driver/launch/nmea_tcpclient_driver.launch.py
new file mode 100644
index 000000000..7d31361e9
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/launch/nmea_tcpclient_driver.launch.py
@@ -0,0 +1,55 @@
+# Copyright 2022 Open Source Robotics Foundation, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+""" A simple launch file for the nmea_tcpclient_driver node. """
+
+import os
+import sys
+
+from ament_index_python.packages import get_package_share_directory
+from launch import LaunchDescription, LaunchIntrospector, LaunchService
+from launch_ros import actions
+
+
+def generate_launch_description():
+ """Generate a launch description for a single tcpclient driver."""
+ config_file = os.path.join(get_package_share_directory("nmea_navsat_driver"), "config", "nmea_tcpclient_driver.yaml")
+ driver_node = actions.Node(
+ package='nmea_navsat_driver',
+ executable='nmea_tcpclient_driver',
+ output='screen',
+ parameters=[config_file])
+
+ return LaunchDescription([driver_node])
+
+
+def main(argv):
+ ld = generate_launch_description()
+
+ print('Starting introspection of launch description...')
+ print('')
+
+ print(LaunchIntrospector().format_launch_description(ld))
+
+ print('')
+ print('Starting launch of launch description...')
+ print('')
+
+ ls = LaunchService()
+ ls.include_launch_description(ld)
+ return ls.run()
+
+
+if __name__ == '__main__':
+ main(sys.argv)
diff --git a/src/interface/nmea_navsat_driver/package.xml b/src/interface/nmea_navsat_driver/package.xml
new file mode 100644
index 000000000..612ee9bde
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/package.xml
@@ -0,0 +1,33 @@
+
+
+
+ nmea_navsat_driver
+ 2.0.0
+
+ Package to parse NMEA strings and publish a very simple GPS message. Does not
+ require or use the GPSD deamon.
+
+
+ Ed Venator
+
+ BSD
+
+ http://ros.org/wiki/nmea_navsat_driver
+
+ Eric Perko
+ Steven Martin
+
+ geometry_msgs
+ nmea_msgs
+ rclpy
+ sensor_msgs
+ python3-numpy
+ python3-serial
+ tf_transformations
+
+ python3-pytest
+
+
+ ament_python
+
+
diff --git a/src/planning/path_publisher/COLCON_IGNORE b/src/interface/nmea_navsat_driver/resource/nmea_navsat_driver
similarity index 100%
rename from src/planning/path_publisher/COLCON_IGNORE
rename to src/interface/nmea_navsat_driver/resource/nmea_navsat_driver
diff --git a/src/interface/nmea_navsat_driver/setup.cfg b/src/interface/nmea_navsat_driver/setup.cfg
new file mode 100644
index 000000000..2d1bda2c1
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/setup.cfg
@@ -0,0 +1,10 @@
+[develop]
+script_dir=$base/lib/nmea_navsat_driver
+
+[install]
+install_scripts=$base/lib/nmea_navsat_driver
+
+[pycodestyle]
+max-line-length = 120
+statistics = True
+show-pep8 = True
diff --git a/src/interface/nmea_navsat_driver/setup.py b/src/interface/nmea_navsat_driver/setup.py
new file mode 100644
index 000000000..88df5a20c
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/setup.py
@@ -0,0 +1,37 @@
+from glob import glob
+import os
+from setuptools import setup
+
+PACKAGE_NAME = "nmea_navsat_driver"
+SHARE_DIR = os.path.join("share", PACKAGE_NAME)
+
+setup(
+ name=PACKAGE_NAME,
+ version='2.0.0',
+ packages=["libnmea_navsat_driver", "libnmea_navsat_driver.nodes"],
+ data_files=[
+ ('share/ament_index/resource_index/packages',
+ ['resource/' + PACKAGE_NAME]),
+ ('share/' + PACKAGE_NAME, ['package.xml']),
+ (os.path.join(SHARE_DIR, "launch"), glob(os.path.join("launch", "*.launch.py"))),
+ (os.path.join(SHARE_DIR, "config"), glob(os.path.join("config", "*.yaml")))],
+ package_dir={'': 'src', },
+ py_modules=[],
+ zip_safe=True,
+ install_requires=['setuptools',
+ 'pyserial',
+ 'numpy',
+ 'pyyaml'],
+ author='Eric Perko',
+ maintainer='Ed Venator',
+ keywords=['ROS2'],
+ description='Package to parse NMEA strings and publish a very simple GPS message.',
+ license='BSD',
+ entry_points={
+ 'console_scripts': ['nmea_serial_driver = libnmea_navsat_driver.nodes.nmea_serial_driver:main',
+ 'nmea_socket_driver = libnmea_navsat_driver.nodes.nmea_socket_driver:main',
+ 'nmea_tcpclient_driver = libnmea_navsat_driver.nodes.nmea_tcpclient_driver:main',
+ 'nmea_topic_driver = libnmea_navsat_driver.nodes.nmea_topic_driver:main',
+ 'nmea_topic_serial_reader = libnmea_navsat_driver.nodes.nmea_topic_serial_reader:main'],
+ }
+)
diff --git a/src/planning/zone_lib/COLCON_IGNORE b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/__init__.py
similarity index 100%
rename from src/planning/zone_lib/COLCON_IGNORE
rename to src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/__init__.py
diff --git a/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/checksum_utils.py b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/checksum_utils.py
new file mode 100644
index 000000000..822da92b1
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/checksum_utils.py
@@ -0,0 +1,48 @@
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2013, Eric Perko
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the names of the authors nor the names of their
+# affiliated organizations may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+
+# Check the NMEA sentence checksum. Return True if passes and False if failed
+def check_nmea_checksum(nmea_sentence):
+ split_sentence = nmea_sentence.split('*')
+ if len(split_sentence) != 2:
+ # No checksum bytes were found... improperly formatted/incomplete NMEA data?
+ return False
+ transmitted_checksum = split_sentence[1].strip()
+
+ # Remove the $ at the front
+ data_to_checksum = split_sentence[0][1:]
+ checksum = 0
+ for c in data_to_checksum:
+ checksum ^= ord(c)
+
+ return ("%02X" % checksum) == transmitted_checksum.upper()
diff --git a/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/driver.py b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/driver.py
new file mode 100644
index 000000000..82110b7a0
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/driver.py
@@ -0,0 +1,281 @@
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2013, Eric Perko
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the names of the authors nor the names of their
+# affiliated organizations may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import math
+
+import rclpy
+
+from rclpy.node import Node
+from sensor_msgs.msg import NavSatFix, NavSatStatus, TimeReference
+from geometry_msgs.msg import TwistStamped, QuaternionStamped
+from tf_transformations import quaternion_from_euler
+from libnmea_navsat_driver.checksum_utils import check_nmea_checksum
+from libnmea_navsat_driver import parser
+
+
+class Ros2NMEADriver(Node):
+ def __init__(self):
+ super().__init__('nmea_navsat_driver')
+
+ self.fix_pub = self.create_publisher(NavSatFix, 'fix', 10)
+ self.vel_pub = self.create_publisher(TwistStamped, 'vel', 10)
+ self.heading_pub = self.create_publisher(QuaternionStamped, 'heading', 10)
+ self.time_ref_pub = self.create_publisher(TimeReference, 'time_reference', 10)
+
+ self.time_ref_source = self.declare_parameter('time_ref_source', 'gps').value
+ self.use_RMC = self.declare_parameter('useRMC', False).value
+ self.valid_fix = False
+
+ # epe = estimated position error
+ self.default_epe_quality0 = self.declare_parameter('epe_quality0', 1000000).value
+ self.default_epe_quality1 = self.declare_parameter('epe_quality1', 4.0).value
+ self.default_epe_quality2 = self.declare_parameter('epe_quality2', 0.1).value
+ self.default_epe_quality4 = self.declare_parameter('epe_quality4', 0.02).value
+ self.default_epe_quality5 = self.declare_parameter('epe_quality5', 4.0).value
+ self.default_epe_quality9 = self.declare_parameter('epe_quality9', 3.0).value
+
+ self.using_receiver_epe = False
+
+ self.lon_std_dev = float("nan")
+ self.lat_std_dev = float("nan")
+ self.alt_std_dev = float("nan")
+
+ """Format for this dictionary is the fix type from a GGA message as the key, with
+ each entry containing a tuple consisting of a default estimated
+ position error, a NavSatStatus value, and a NavSatFix covariance value."""
+ self.gps_qualities = {
+ # Unknown
+ -1: [
+ self.default_epe_quality0,
+ NavSatStatus.STATUS_NO_FIX,
+ NavSatFix.COVARIANCE_TYPE_UNKNOWN
+ ],
+ # Invalid
+ 0: [
+ self.default_epe_quality0,
+ NavSatStatus.STATUS_NO_FIX,
+ NavSatFix.COVARIANCE_TYPE_UNKNOWN
+ ],
+ # SPS
+ 1: [
+ self.default_epe_quality1,
+ NavSatStatus.STATUS_FIX,
+ NavSatFix.COVARIANCE_TYPE_APPROXIMATED
+ ],
+ # DGPS
+ 2: [
+ self.default_epe_quality2,
+ NavSatStatus.STATUS_SBAS_FIX,
+ NavSatFix.COVARIANCE_TYPE_APPROXIMATED
+ ],
+ # RTK Fix
+ 4: [
+ self.default_epe_quality4,
+ NavSatStatus.STATUS_GBAS_FIX,
+ NavSatFix.COVARIANCE_TYPE_APPROXIMATED
+ ],
+ # RTK Float
+ 5: [
+ self.default_epe_quality5,
+ NavSatStatus.STATUS_GBAS_FIX,
+ NavSatFix.COVARIANCE_TYPE_APPROXIMATED
+ ],
+ # WAAS
+ 9: [
+ self.default_epe_quality9,
+ NavSatStatus.STATUS_GBAS_FIX,
+ NavSatFix.COVARIANCE_TYPE_APPROXIMATED
+ ]
+ }
+
+ # Returns True if we successfully did something with the passed in
+ # nmea_string
+ def add_sentence(self, nmea_string, frame_id, timestamp=None):
+ if not check_nmea_checksum(nmea_string):
+ self.get_logger().warn("Received a sentence with an invalid checksum. " +
+ "Sentence was: %s" % nmea_string)
+ return False
+
+ parsed_sentence = parser.parse_nmea_sentence(nmea_string)
+ if not parsed_sentence:
+ self.get_logger().debug("Failed to parse NMEA sentence. Sentence was: %s" % nmea_string)
+ return False
+
+ if timestamp:
+ current_time = timestamp
+ else:
+ current_time = self.get_clock().now().to_msg()
+
+ current_fix = NavSatFix()
+ current_fix.header.stamp = current_time
+ current_fix.header.frame_id = frame_id
+ current_time_ref = TimeReference()
+ current_time_ref.header.stamp = current_time
+ current_time_ref.header.frame_id = frame_id
+ if self.time_ref_source:
+ current_time_ref.source = self.time_ref_source
+ else:
+ current_time_ref.source = frame_id
+
+ if not self.use_RMC and 'GGA' in parsed_sentence:
+ current_fix.position_covariance_type = NavSatFix.COVARIANCE_TYPE_APPROXIMATED
+
+ data = parsed_sentence['GGA']
+ fix_type = data['fix_type']
+ if not (fix_type in self.gps_qualities):
+ fix_type = -1
+ gps_qual = self.gps_qualities[fix_type]
+ default_epe = gps_qual[0]
+ current_fix.status.status = gps_qual[1]
+ current_fix.position_covariance_type = gps_qual[2]
+ if current_fix.status.status > 0:
+ self.valid_fix = True
+ else:
+ self.valid_fix = False
+
+ current_fix.status.service = NavSatStatus.SERVICE_GPS
+ latitude = data['latitude']
+ if data['latitude_direction'] == 'S':
+ latitude = -latitude
+ current_fix.latitude = latitude
+
+ longitude = data['longitude']
+ if data['longitude_direction'] == 'W':
+ longitude = -longitude
+ current_fix.longitude = longitude
+
+ # Altitude is above ellipsoid, so adjust for mean-sea-level
+ altitude = data['altitude'] + data['mean_sea_level']
+ current_fix.altitude = altitude
+
+ # use default epe std_dev unless we've received a GST sentence with epes
+ if not self.using_receiver_epe or math.isnan(self.lon_std_dev):
+ self.lon_std_dev = default_epe
+ if not self.using_receiver_epe or math.isnan(self.lat_std_dev):
+ self.lat_std_dev = default_epe
+ if not self.using_receiver_epe or math.isnan(self.alt_std_dev):
+ self.alt_std_dev = default_epe * 2
+
+ hdop = data['hdop']
+ current_fix.position_covariance[0] = (hdop * self.lon_std_dev) ** 2
+ current_fix.position_covariance[4] = (hdop * self.lat_std_dev) ** 2
+ current_fix.position_covariance[8] = (2 * hdop * self.alt_std_dev) ** 2 # FIXME
+
+ self.fix_pub.publish(current_fix)
+
+ if not math.isnan(data['utc_time']):
+ current_time_ref.time_ref = rclpy.time.Time(seconds=data['utc_time']).to_msg()
+ self.last_valid_fix_time = current_time_ref
+ self.time_ref_pub.publish(current_time_ref)
+
+ elif not self.use_RMC and 'VTG' in parsed_sentence:
+ data = parsed_sentence['VTG']
+
+ # Only report VTG data when you've received a valid GGA fix as well.
+ if self.valid_fix:
+ current_vel = TwistStamped()
+ current_vel.header.stamp = current_time
+ current_vel.header.frame_id = frame_id
+ current_vel.twist.linear.x = data['speed'] * math.sin(data['true_course'])
+ current_vel.twist.linear.y = data['speed'] * math.cos(data['true_course'])
+ self.vel_pub.publish(current_vel)
+
+ elif 'RMC' in parsed_sentence:
+ data = parsed_sentence['RMC']
+
+ # Only publish a fix from RMC if the use_RMC flag is set.
+ if self.use_RMC:
+ if data['fix_valid']:
+ current_fix.status.status = NavSatStatus.STATUS_FIX
+ else:
+ current_fix.status.status = NavSatStatus.STATUS_NO_FIX
+
+ current_fix.status.service = NavSatStatus.SERVICE_GPS
+
+ latitude = data['latitude']
+ if data['latitude_direction'] == 'S':
+ latitude = -latitude
+ current_fix.latitude = latitude
+
+ longitude = data['longitude']
+ if data['longitude_direction'] == 'W':
+ longitude = -longitude
+ current_fix.longitude = longitude
+
+ current_fix.altitude = float('NaN')
+ current_fix.position_covariance_type = \
+ NavSatFix.COVARIANCE_TYPE_UNKNOWN
+
+ self.fix_pub.publish(current_fix)
+
+ if not math.isnan(data['utc_time']):
+ current_time_ref.time_ref = rclpy.time.Time(seconds=data['utc_time']).to_msg()
+ self.time_ref_pub.publish(current_time_ref)
+
+ # Publish velocity from RMC regardless, since GGA doesn't provide it.
+ if data['fix_valid']:
+ current_vel = TwistStamped()
+ current_vel.header.stamp = current_time
+ current_vel.header.frame_id = frame_id
+ current_vel.twist.linear.x = data['speed'] * math.sin(data['true_course'])
+ current_vel.twist.linear.y = data['speed'] * math.cos(data['true_course'])
+ self.vel_pub.publish(current_vel)
+ elif 'GST' in parsed_sentence:
+ data = parsed_sentence['GST']
+
+ # Use receiver-provided error estimate if available
+ self.using_receiver_epe = True
+ self.lon_std_dev = data['lon_std_dev']
+ self.lat_std_dev = data['lat_std_dev']
+ self.alt_std_dev = data['alt_std_dev']
+ elif 'HDT' in parsed_sentence:
+ data = parsed_sentence['HDT']
+ if data['heading']:
+ current_heading = QuaternionStamped()
+ current_heading.header.stamp = current_time
+ current_heading.header.frame_id = frame_id
+ q = quaternion_from_euler(0, 0, math.radians(data['heading']))
+ current_heading.quaternion.x = q[0]
+ current_heading.quaternion.y = q[1]
+ current_heading.quaternion.z = q[2]
+ current_heading.quaternion.w = q[3]
+ self.heading_pub.publish(current_heading)
+ else:
+ return False
+
+ """Helper method for getting the frame_id with the correct TF prefix"""
+ def get_frame_id(self):
+ frame_id = self.declare_parameter('frame_id', 'gps').value
+ prefix = self.declare_parameter('tf_prefix', '').value
+ if len(prefix):
+ return '%s/%s' % (prefix, frame_id)
+ return frame_id
diff --git a/src/tools/nova_viz/resource/nova_viz b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/__init__.py
old mode 100755
new mode 100644
similarity index 100%
rename from src/tools/nova_viz/resource/nova_viz
rename to src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/__init__.py
diff --git a/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_serial_driver.py b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_serial_driver.py
new file mode 100755
index 000000000..ce6083858
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_serial_driver.py
@@ -0,0 +1,69 @@
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2013, Eric Perko
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the names of the authors nor the names of their
+# affiliated organizations may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import serial
+
+import rclpy
+
+from libnmea_navsat_driver.driver import Ros2NMEADriver
+
+
+def main(args=None):
+ rclpy.init(args=args)
+
+ driver = Ros2NMEADriver()
+ frame_id = driver.get_frame_id()
+
+ serial_port = driver.declare_parameter('port', '/dev/ttyUSB0').value
+ serial_baud = driver.declare_parameter('baud', 4800).value
+
+ try:
+ GPS = serial.Serial(port=serial_port, baudrate=serial_baud, timeout=2)
+ driver.get_logger().info("Successfully connected to {0} at {1}.".format(serial_port, serial_baud))
+ try:
+ while rclpy.ok():
+ data = GPS.readline().strip()
+ try:
+ if isinstance(data, bytes):
+ data = data.decode("utf-8")
+ driver.add_sentence(data, frame_id)
+ except ValueError as e:
+ driver.get_logger().warn(
+ "Value error, likely due to missing fields in the NMEA message. Error was: %s. "
+ "Please report this issue at github.com/ros-drivers/nmea_navsat_driver, including a bag file "
+ "with the NMEA sentences that caused it." % e)
+
+ except Exception as e:
+ driver.get_logger().error("Ros error: {0}".format(e))
+ GPS.close() # Close GPS serial port
+ except serial.SerialException as ex:
+ driver.get_logger().fatal("Could not open serial port: I/O error({0}): {1}".format(ex.errno, ex.strerror))
diff --git a/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_socket_driver.py b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_socket_driver.py
new file mode 100755
index 000000000..da5dcadf9
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_socket_driver.py
@@ -0,0 +1,99 @@
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2016, Rein Appeldoorn
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the names of the authors nor the names of their
+# affiliated organizations may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import socket
+import sys
+
+import rclpy
+
+from libnmea_navsat_driver.driver import Ros2NMEADriver
+
+
+def main(args=None):
+ rclpy.init(args=args)
+ driver = Ros2NMEADriver()
+
+ try:
+ local_ip = driver.declare_parameter('ip', '0.0.0.0').value
+ local_port = driver.declare_parameter('port', 10110).value
+ buffer_size = driver.declare_parameter('buffer_size', 4096).value
+ timeout = driver.declare_parameter('timeout_sec', 2).value
+ except KeyError as e:
+ driver.get_logger().err("Parameter %s not found" % e)
+ sys.exit(1)
+
+ frame_id = driver.get_frame_id()
+
+ driver.get_logger().info(
+ " Using parameters ip {} port {} buffer_size {} timeout_sec {}"
+ .format(local_ip, local_port, buffer_size, timeout))
+
+ # Connection-loop: connect and keep receiving. If receiving fails, reconnect
+ while rclpy.ok():
+ try:
+ # Create a socket
+ socket_ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
+ # Bind the socket to the port
+ socket_.bind((local_ip, local_port))
+
+ # Set timeout
+ socket_.settimeout(timeout)
+ except socket.error as exc:
+ driver.get_logger().error("Caught exception socket.error when setting up socket: %s" % exc)
+ sys.exit(1)
+
+ # recv-loop: When we're connected, keep receiving stuff until that fails
+ while rclpy.ok():
+ try:
+ data, remote_address = socket_.recvfrom(buffer_size)
+
+ # strip the data
+ data_list = data.decode("ascii").strip().split("\n")
+
+ for data in data_list:
+
+ try:
+ driver.add_sentence(data, frame_id)
+ except ValueError as e:
+ driver.get_logger().warn(
+ "Value error, likely due to missing fields in the NMEA message. "
+ "Error was: %s. Please report this issue at github.com/ros-drivers/nmea_navsat_driver, "
+ "including a bag file with the NMEA sentences that caused it." % e)
+
+ except socket.error as exc:
+ driver.get_logger().error("Caught exception socket.error during recvfrom: %s" % exc)
+ socket_.close()
+ # This will break out of the recv-loop so we start another iteration of the connection-loop
+ break
+
+ socket_.close() # Close socket
diff --git a/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_tcpclient_driver.py b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_tcpclient_driver.py
new file mode 100644
index 000000000..d06a1ff07
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_tcpclient_driver.py
@@ -0,0 +1,83 @@
+# Copyright 2022 Open Source Robotics Foundation, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import socket
+import sys
+
+import rclpy
+
+from libnmea_navsat_driver.driver import Ros2NMEADriver
+
+def main(args=None):
+ rclpy.init(args=args)
+ driver = Ros2NMEADriver()
+
+ try:
+ gnss_ip = driver.declare_parameter('ip', '192.168.131.22').value
+ gnss_port = driver.declare_parameter('port', 9001).value
+ buffer_size = driver.declare_parameter('buffer_size', 4096).value
+ except KeyError as e:
+ driver.get_logger().err("Parameter %s not found" % e)
+ sys.exit(1)
+
+ frame_id = driver.get_frame_id()
+
+ driver.get_logger().info("Using gnss sensor with ip {} and port {}".format(gnss_ip, gnss_port))
+
+ # Connection-loop: connect and keep receiving. If receiving fails, reconnect
+ # Connect to the gnss sensor using tcp
+ while rclpy.ok():
+ try:
+ # Create a socket
+ gnss_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+ # Connect to the gnss sensor
+ gnss_socket.connect((gnss_ip, gnss_port))
+ except socket.error as exc:
+ driver.get_logger().error("Caught exception socket.error when setting up socket: %s" % exc)
+ sys.exit(1)
+
+ # recv-loop: When we're connected, keep receiving stuff until that fails
+ partial = ""
+ while rclpy.ok():
+ try:
+ partial += gnss_socket.recv(buffer_size).decode("ascii")
+
+ # strip the data
+ lines = partial.splitlines()
+ if partial.endswith('\n'):
+ full_lines = lines
+ partial = ""
+ else:
+ full_lines = lines[:-1]
+ partial = lines[-1]
+
+ for data in full_lines:
+ try:
+ if driver.add_sentence(data, frame_id):
+ driver.get_logger().info("Received sentence: %s" % data)
+ else:
+ driver.get_logger().warn("Error with sentence: %s" % data)
+ except ValueError as e:
+ driver.get_logger().warn(
+ "Value error, likely due to missing fields in the NMEA message. "
+ "Error was: %s. Please report this issue to me. " % e)
+
+ except socket.error as exc:
+ driver.get_logger().error("Caught exception socket.error when receiving: %s" % exc)
+ gnss_socket.close()
+ break
+
+
+ gnss_socket.close()
diff --git a/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_topic_driver.py b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_topic_driver.py
new file mode 100755
index 000000000..064071d9d
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_topic_driver.py
@@ -0,0 +1,64 @@
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2013, Eric Perko
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the names of the authors nor the names of their
+# affiliated organizations may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+
+from functools import partial
+
+from nmea_msgs.msg import Sentence
+import rclpy
+
+from libnmea_navsat_driver.driver import Ros2NMEADriver
+
+
+def nmea_sentence_callback(nmea_sentence, driver):
+ try:
+ driver.add_sentence(nmea_sentence.sentence, frame_id=nmea_sentence.header.frame_id,
+ timestamp=nmea_sentence.header.stamp)
+ except ValueError as e:
+ rclpy.get_logger().warn(
+ "Value error, likely due to missing fields in the NMEA message. Error was: %s. "
+ "Please report this issue at github.com/ros-drivers/nmea_navsat_driver, including a bag file with "
+ "the NMEA sentences that caused it." % e)
+
+
+def main(args=None):
+ rclpy.init(args=args)
+
+ driver = Ros2NMEADriver()
+ driver.get_frame_id()
+
+ driver.create_subscription(
+ Sentence, 'nmea_sentence', partial(nmea_sentence_callback, driver=driver), 10)
+
+ rclpy.spin(driver)
+
+ rclpy.shutdown()
diff --git a/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_topic_serial_reader.py b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_topic_serial_reader.py
new file mode 100755
index 000000000..fe5f702fd
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/nodes/nmea_topic_serial_reader.py
@@ -0,0 +1,70 @@
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2013, Eric Perko
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the names of the authors nor the names of their
+# affiliated organizations may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import serial
+
+from nmea_msgs.msg import Sentence
+import rclpy
+
+from libnmea_navsat_driver.driver import Ros2NMEADriver
+
+
+def main(args=None):
+ rclpy.init(args=args)
+
+ driver = Ros2NMEADriver()
+
+ nmea_pub = driver.create_publisher(Sentence, "nmea_sentence", 10)
+
+ serial_port = driver.declare_parameter('port', '/dev/ttyUSB0').value
+ serial_baud = driver.declare_parameter('baud', 4800).value
+
+ # Get the frame_id
+ frame_id = driver.get_frame_id()
+
+ try:
+ GPS = serial.Serial(port=serial_port, baudrate=serial_baud, timeout=2)
+ try:
+ while rclpy.ok():
+ data = GPS.readline().strip()
+
+ sentence = Sentence()
+ sentence.header.stamp = driver.get_clock().now().to_msg()
+ sentence.header.frame_id = frame_id
+ sentence.sentence = data
+ nmea_pub.publish(sentence)
+
+ except Exception as e:
+ driver.get_logger().error("Ros error: {0}".format(e))
+ GPS.close() # Close GPS serial port
+ except serial.SerialException as ex:
+ driver.get_logger().fatal("Could not open serial port: I/O error({0}): {1}".format(ex.errno, ex.strerror))
diff --git a/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/parser.py b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/parser.py
new file mode 100644
index 000000000..767e5183e
--- /dev/null
+++ b/src/interface/nmea_navsat_driver/src/libnmea_navsat_driver/parser.py
@@ -0,0 +1,169 @@
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2013, Eric Perko
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the names of the authors nor the names of their
+# affiliated organizations may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import re
+import time
+import calendar
+import math
+import logging
+
+logger = logging.getLogger('rosout')
+
+
+def safe_float(field):
+ try:
+ return float(field)
+ except ValueError:
+ return float('NaN')
+
+
+def safe_int(field):
+ try:
+ return int(field)
+ except ValueError:
+ return 0
+
+
+def convert_latitude(field):
+ return safe_float(field[0:2]) + safe_float(field[2:]) / 60.0
+
+
+def convert_longitude(field):
+ return safe_float(field[0:3]) + safe_float(field[3:]) / 60.0
+
+
+def convert_time(nmea_utc):
+ # Get current time in UTC for date information
+ utc_struct = time.gmtime() # immutable, so cannot modify this one
+ utc_list = list(utc_struct)
+ # If one of the time fields is empty, return NaN seconds
+ if not nmea_utc[0:2] or not nmea_utc[2:4] or not nmea_utc[4:6]:
+ return float('NaN')
+ else:
+ hours = int(nmea_utc[0:2])
+ minutes = int(nmea_utc[2:4])
+ seconds = int(nmea_utc[4:6])
+ utc_list[3] = hours
+ utc_list[4] = minutes
+ utc_list[5] = seconds
+ unix_time = calendar.timegm(tuple(utc_list))
+ return unix_time
+
+
+def convert_status_flag(status_flag):
+ if status_flag == "A":
+ return True
+ elif status_flag == "V":
+ return False
+ else:
+ return False
+
+
+def convert_knots_to_mps(knots):
+ return safe_float(knots) * 0.514444444444
+
+
+# Need this wrapper because math.radians doesn't auto convert inputs
+def convert_deg_to_rads(degs):
+ return math.radians(safe_float(degs))
+
+
+"""Format for this dictionary is a sentence identifier (e.g. "GGA") as the key, with a
+list of tuples where each tuple is a field name, conversion function and index
+into the split sentence"""
+parse_maps = {
+ "GGA": [
+ ("fix_type", int, 6),
+ ("latitude", convert_latitude, 2),
+ ("latitude_direction", str, 3),
+ ("longitude", convert_longitude, 4),
+ ("longitude_direction", str, 5),
+ ("altitude", safe_float, 9),
+ ("mean_sea_level", safe_float, 11),
+ ("hdop", safe_float, 8),
+ ("num_satellites", safe_int, 7),
+ ("utc_time", convert_time, 1),
+ ],
+ "RMC": [
+ ("utc_time", convert_time, 1),
+ ("fix_valid", convert_status_flag, 2),
+ ("latitude", convert_latitude, 3),
+ ("latitude_direction", str, 4),
+ ("longitude", convert_longitude, 5),
+ ("longitude_direction", str, 6),
+ ("speed", convert_knots_to_mps, 7),
+ ("true_course", convert_deg_to_rads, 8),
+ ],
+ "GST": [
+ ("utc_time", convert_time, 1),
+ ("ranges_std_dev", safe_float, 2),
+ ("semi_major_ellipse_std_dev", safe_float, 3),
+ ("semi_minor_ellipse_std_dev", safe_float, 4),
+ ("semi_major_orientation", safe_float, 5),
+ ("lat_std_dev", safe_float, 6),
+ ("lon_std_dev", safe_float, 7),
+ ("alt_std_dev", safe_float, 8),
+ ],
+ "HDT": [
+ ("heading", safe_float, 1),
+ ],
+ "VTG": [
+ ("true_course", safe_float, 1),
+ ("speed", convert_knots_to_mps, 5)
+ ]
+}
+
+
+def parse_nmea_sentence(nmea_sentence):
+ # Check for a valid nmea sentence
+
+ if not re.match(r'(^\$GP|^\$GN|^\$GL|^\$IN).*\*[0-9A-Fa-f]{2}$', nmea_sentence):
+ logger.debug("Regex didn't match, sentence not valid NMEA? Sentence was: %s"
+ % repr(nmea_sentence))
+ return False
+ fields = [field.strip(',') for field in nmea_sentence.split(',')]
+
+ # Ignore the $ and talker ID portions (e.g. GP)
+ sentence_type = fields[0][3:]
+
+ if sentence_type not in parse_maps:
+ logger.debug("Sentence type %s not in parse map, ignoring."
+ % repr(sentence_type))
+ return False
+
+ parse_map = parse_maps[sentence_type]
+
+ parsed_sentence = {}
+ for entry in parse_map:
+ parsed_sentence[entry[0]] = entry[1](fields[entry[2]])
+
+ return {sentence_type: parsed_sentence}
diff --git a/src/interface/rosbridge_suite/.github/ISSUE_TEMPLATE.md b/src/interface/rosbridge_suite/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 000000000..0f5edeb48
--- /dev/null
+++ b/src/interface/rosbridge_suite/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,22 @@
+
+
+
+
+## Expected Behavior
+
+
+## Actual Behavior
+
+
+## Steps to Reproduce the Problem
+
+ 1.
+ 1.
+ 1.
+
+## Specifications
+
+ - ROS Version (`echo $ROS_DISTRO`):
+ - OS Version (`grep DISTRIB_CODENAME /etc/lsb-release`):
+ - Rosbridge Version (`roscat rosbridge_server package.xml | grep ''`):
+ - Tornado Version (`python -c 'import tornado; print tornado.version'`):
diff --git a/src/interface/rosbridge_suite/.github/dependabot.yml b/src/interface/rosbridge_suite/.github/dependabot.yml
new file mode 100644
index 000000000..123014908
--- /dev/null
+++ b/src/interface/rosbridge_suite/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "daily"
diff --git a/src/interface/rosbridge_suite/.github/workflows/ci.yml b/src/interface/rosbridge_suite/.github/workflows/ci.yml
new file mode 100644
index 000000000..d6d841356
--- /dev/null
+++ b/src/interface/rosbridge_suite/.github/workflows/ci.yml
@@ -0,0 +1,45 @@
+name: CI
+
+on: [push, pull_request]
+
+jobs:
+ lint:
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v3
+
+ - uses: actions/setup-python@v4.5.0
+ with:
+ python-version: '3.8'
+
+ - uses: pre-commit/action@v3.0.0
+
+ test:
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ # Test supported ROS 2 distributions
+ # https://docs.ros.org/en/rolling/Releases.html
+ - ros: foxy
+ os: ubuntu-20.04
+ - ros: galactic
+ os: ubuntu-20.04
+ - ros: humble
+ os: ubuntu-22.04
+ - ros: rolling
+ os: ubuntu-22.04
+
+ name: ROS 2 ${{ matrix.ros }} (${{ matrix.os }})
+ runs-on: ${{ matrix.os }}
+
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ path: ros_ws/src
+
+ - uses: ros-tooling/setup-ros@0.6.1
+
+ - uses: ros-tooling/action-ros-ci@v0.3
+ with:
+ target-ros2-distro: ${{ matrix.ros }}
diff --git a/src/interface/rosbridge_suite/.github/workflows/stale.yml b/src/interface/rosbridge_suite/.github/workflows/stale.yml
new file mode 100644
index 000000000..d12e7c97f
--- /dev/null
+++ b/src/interface/rosbridge_suite/.github/workflows/stale.yml
@@ -0,0 +1,25 @@
+name: Stale
+
+on:
+ schedule:
+ - cron: "0 0 * * *"
+
+jobs:
+ stale:
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ pull-requests: write
+ steps:
+ - uses: actions/stale@v7.0.0
+ with:
+ stale-issue-message: "This issue has been marked as stale because there has been no activity in the past 12 months. Please add a comment to keep it open."
+ stale-issue-label: stale
+ days-before-issue-stale: 365
+ days-before-issue-close: 30
+
+ stale-pr-message: "This PR has been marked as stale because there has been no activity in the past 6 months. Please add a comment to keep it open."
+ stale-pr-label: stale
+ days-before-pr-stale: 180
+ days-before-pr-close: 30
+ delete-branch: true
diff --git a/src/interface/rosbridge_suite/.pre-commit-config.yaml b/src/interface/rosbridge_suite/.pre-commit-config.yaml
new file mode 100644
index 000000000..9af419349
--- /dev/null
+++ b/src/interface/rosbridge_suite/.pre-commit-config.yaml
@@ -0,0 +1,42 @@
+# See https://pre-commit.com for more information
+repos:
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.0.1
+ hooks:
+ - id: check-added-large-files
+ - id: check-case-conflict
+ - id: check-merge-conflict
+ - id: check-symlinks
+ - id: check-yaml
+ - id: debug-statements
+ - id: destroyed-symlinks
+ - id: detect-private-key
+ - id: end-of-file-fixer
+ - id: mixed-line-ending
+ - id: trailing-whitespace
+
+ - repo: https://github.com/pycqa/isort
+ rev: 5.12.0
+ hooks:
+ - id: isort
+
+ - repo: https://github.com/psf/black
+ rev: 22.3.0
+ hooks:
+ - id: black
+
+ - repo: https://github.com/PyCQA/flake8
+ rev: 3.9.2
+ hooks:
+ - id: flake8
+
+ - repo: https://github.com/PyCQA/bandit
+ rev: 1.7.0
+ hooks:
+ - id: bandit
+ args: ["--skip", "B101,B110,B311"]
+
+ - repo: https://github.com/codespell-project/codespell
+ rev: v2.1.0
+ hooks:
+ - id: codespell
diff --git a/src/interface/rosbridge_suite/AUTHORS.md b/src/interface/rosbridge_suite/AUTHORS.md
new file mode 100644
index 000000000..d94fccc78
--- /dev/null
+++ b/src/interface/rosbridge_suite/AUTHORS.md
@@ -0,0 +1,11 @@
+## Contributors
+
+- Brandon Alexander
+- David Bertram
+- Hans-Joachim Krauch
+- Jacob Bandes-Storch
+- Jihoon Lee
+- Jonathan Mace
+- Matthias Gruhler
+- Russell Toris
+- Travis Prosser
diff --git a/src/msg/lgsvl_msgs/LICENSE b/src/interface/rosbridge_suite/LICENSE
old mode 100755
new mode 100644
similarity index 59%
rename from src/msg/lgsvl_msgs/LICENSE
rename to src/interface/rosbridge_suite/LICENSE
index 5cffa862d..5b627689a
--- a/src/msg/lgsvl_msgs/LICENSE
+++ b/src/interface/rosbridge_suite/LICENSE
@@ -1,19 +1,20 @@
-Copyright (c) 2019-2020, LG Electronics
-All rights reserved.
+BSD 3-Clause License
+
+Copyright (c) The Rosbridge Authors
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
-* Neither the name of LG Electronics nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -24,4 +25,4 @@ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/src/interface/rosbridge_suite/QUALITY_DECLARATION.md b/src/interface/rosbridge_suite/QUALITY_DECLARATION.md
new file mode 100644
index 000000000..d7732d86c
--- /dev/null
+++ b/src/interface/rosbridge_suite/QUALITY_DECLARATION.md
@@ -0,0 +1,78 @@
+This document is a declaration of software quality for the `rosbridge_suite` packages, based on the guidelines in [REP-2004](https://www.ros.org/reps/rep-2004.html). The following packages are covered by this declaration:
+
+- rosapi
+- rosapi_msgs
+- rosbridge_library
+- rosbridge_msgs
+- rosbridge_server
+- rosbridge_suite
+- rosbridge_test_msgs
+
+# `rosbridge_suite` Quality Declaration
+
+The package `rosbridge_suite` claims to be in the **Quality Level 3** category.
+
+Below are the rationales, notes, and caveats for this claim, organized by each requirement listed in the [Package Requirements for Quality Level N in REP-2004](https://www.ros.org/reps/rep-2004.html).
+
+## Version Policy [1]
+
+### Version Scheme [1.i]
+
+`rosbridge_suite` uses [semver](https://semver.org/) according to the recommendation in the [ROS 2 Developer Guide](https://docs.ros.org/en/rolling/Contributing/Developer-Guide.html#versioning).
+
+### Version Stability [1.ii]
+
+`rosbridge_suite` is at a stable version, i.e. `>= 1.0.0`. The current version can be found in its [package.xml](/rosbridge_server/package.xml), and its change history can be found in its [CHANGELOG](/rosbridge_server/CHANGELOG.rst).
+
+### Public API Declaration [1.iii]
+
+The public API is not explicitly defined.
+
+### API Stability Within a Released ROS Distribution [1.iv]/[1.vi]
+
+The public API is not guaranteed to be stable within a released ROS distribution.
+
+### ABI Stability Within a Released ROS Distribution [1.v]/[1.vi]
+
+`rosbridge_suite` is written in Python and therefore is not concerned with ABI stability.
+
+## Change Control Process [2]
+
+`rosbridge_suite` follows the recommended guidelines for ROS Core packages in the [ROS 2 Developer Guide](https://docs.ros.org/en/rolling/Contributing/Developer-Guide.html#change-control-process).
+
+### Change Requests [2.i]
+
+All changes will occur through a pull request, check [ROS 2 Developer Guide](https://index.ros.org/doc/ros2/Contributing/Developer-Guide/#change-control-process) for additional information.
+
+### Continuous Integration [2.ii]
+
+All pull request must pass CI on all supported platforms.
+
+## Documentation [3]
+
+### License [3.i]
+
+The license for `rosbridge_suite` is BSD 3-clause, and a full copy is in the [LICENSE](/LICENSE) file.
+
+### Copyright Statement [3.ii]
+
+The copyright statement is in the [LICENSE](/LICENSE) file.
+
+## Testing [4]
+
+New features are required to have tests before being added.
+
+## Dependencies [5]
+
+
+`rosbridge_suite` has a runtime dependency on `rclpy`, which does not have a quality declaration.
+
+## Platform Support [6]
+
+`rosbridge_suite` supports all of the tier 1 platforms as described in [REP-2000](https://www.ros.org/reps/rep-2000.html#support-tiers). Tests are currently only run against Ubuntu Linux.
+
+## Security [7]
+
+### Vulnerability Disclosure Policy [7.i]
+
+This package conforms to the Vulnerability Disclosure Policy in [REP-2006](https://www.ros.org/reps/rep-2006.html).
diff --git a/src/interface/rosbridge_suite/README.md b/src/interface/rosbridge_suite/README.md
new file mode 100644
index 000000000..d1117e494
--- /dev/null
+++ b/src/interface/rosbridge_suite/README.md
@@ -0,0 +1,62 @@
+rosbridge_suite
+===============
+
+[![ROS Foxy version](https://img.shields.io/ros/v/foxy/rosbridge_suite)](https://index.ros.org/p/rosbridge_suite/github-RobotWebTools-rosbridge_suite/#foxy)
+[![ROS Galactic version](https://img.shields.io/ros/v/galactic/rosbridge_suite)](https://index.ros.org/p/rosbridge_suite/github-RobotWebTools-rosbridge_suite/#galactic)
+[![ROS Humble version](https://img.shields.io/ros/v/humble/rosbridge_suite)](https://index.ros.org/p/rosbridge_suite/github-RobotWebTools-rosbridge_suite/#humble)
+[![ROS Rolling version](https://img.shields.io/ros/v/rolling/rosbridge_suite)](https://index.ros.org/p/rosbridge_suite/github-RobotWebTools-rosbridge_suite/#rolling)
+
+
+#### Server Implementations of the rosbridge v2 Protocol
+
+rosbridge provides a JSON interface to ROS, allowing any client to send JSON to publish or subscribe to ROS topics, call ROS services, and more. rosbridge supports a variety of transport layers, including WebSockets and TCP. For information on the protocol itself, see the [rosbridge protocol specification](ROSBRIDGE_PROTOCOL.md).
+
+For full documentation, see [the ROS wiki](http://ros.org/wiki/rosbridge_suite).
+
+This project is released as part of the [Robot Web Tools](http://robotwebtools.org/) effort.
+
+### Packages
+
+ * [rosbridge_suite](rosbridge_suite) is a [ROS meta-package](http://www.ros.org/wiki/catkin/conceptual_overview#Metapackages_and_the_Elimination_of_Stacks) including all the rosbridge packages.
+
+ * [rosbridge_library](rosbridge_library) contains the Python API that receives JSON-formatted strings as input and controls ROS publishers/subscribers/service calls according to the content of the JSON strings.
+
+ * [rosbridge_server](rosbridge_server) contains a WebSocket server implementation that exposes the rosbridge_library.
+
+ * [rosapi](rosapi) provides service calls for getting meta-information related to ROS like topic lists as well as interacting with the Parameter Server.
+
+### Clients
+
+A rosbridge client is a program that communicates with rosbridge using its JSON API. rosbridge clients include:
+
+ * [roslibjs](https://github.com/RobotWebTools/roslibjs) - A JavaScript API, which communicates with rosbridge over WebSockets.
+ * [jrosbridge](https://github.com/WPI-RAIL/jrosbridge) - A Java API, which communicates with rosbridge over WebSockets.
+ * [roslibpy](https://github.com/gramaziokohler/roslibpy) - A Python API, which communicates with rosbridge over WebSockets.
+ * [roslibrust](https://github.com/Carter12s/roslibrust) - A Rust API, which communicates with rosbridge over WebSockets.
+
+### License
+rosbridge_suite is released with a BSD license. For full terms and conditions, see the [LICENSE](LICENSE) file.
+
+### Authors
+See the [AUTHORS](AUTHORS.md) file for a full list of contributors.
+
+### Quality Declaration
+This package claims to be in the **Quality Level 3** category, see the [Quality Declaration](/QUALITY_DECLARATION.md) for more details.
+
+### Troubleshooting
+
+See the [TROUBLESHOOTING](TROUBLESHOOTING.md) doc for common problems and solutions.
+
+### Release process
+
+Releasing requires push access to [RobotWebTools/rosbridge_suite](https://github.com/RobotWebTools/rosbridge_suite) as well as [ros2-gbp/rosbridge_suite-release](https://github.com/ros2-gbp/rosbridge_suite-release). For more details on how the release process works, see the [bloom tutorial](https://docs.ros.org/en/galactic/How-To-Guides/Releasing-a-ROS-2-package-with-bloom.html).
+
+1. Run `catkin_generate_changelog` to update CHANGELOG.rst files.
+2. Manually edit and clean up the changelogs. Commit the changes.
+3. Run `catkin_prepare_release --bump [major/minor/patch]` to bump versions in package.xml and push changes to origin.
+4. Run bloom-release commands to create PRs to update rosdistro:
+ - `bloom-release --rosdistro foxy --track foxy rosbridge_suite`
+ - `bloom-release --rosdistro galactic --track galactic rosbridge_suite`
+ - `bloom-release --rosdistro rolling --track rolling rosbridge_suite`
+
+Once the PRs are merged, packages will be available for each distro after the next sync. Build/sync status can be viewed at: [foxy](http://repo.ros2.org/status_page/ros_foxy_default.html), [galactic](http://repo.ros2.org/status_page/ros_galactic_default.html), [rolling](http://repo.ros2.org/status_page/ros_rolling_default.html).
diff --git a/src/interface/rosbridge_suite/ROSBRIDGE_PROTOCOL.md b/src/interface/rosbridge_suite/ROSBRIDGE_PROTOCOL.md
new file mode 100644
index 000000000..0d1b93758
--- /dev/null
+++ b/src/interface/rosbridge_suite/ROSBRIDGE_PROTOCOL.md
@@ -0,0 +1,507 @@
+# rosbridge v2.0 Protocol Specification
+
+> This document describes the ROS 2 version of rosbridge. For ROS 1, please see the [ros1 branch](https://github.com/RobotWebTools/rosbridge_suite/blob/ros1/ROSBRIDGE_PROTOCOL.md).
+
+This document outlines the rosbridge v2.0 protocol. The v2.0 protocol
+incorporates a number of requirements which have arisen since the first version
+of rosbridge was released, and makes a small number of modifications to
+facilitate greater extensibility to the protocol. At its core, the protocol
+still contains the same operations with the same semantics as the prior
+versions of rosbridge. The main change is to the structure of messages,
+separating control information from message information. The main new additions
+are fragmentation, compression, and logging.
+
+This document outlines the protocol specification, but also touches upon the
+intended direction for the rosbridge server implementation. The rosbridge v2.0
+server implementation is architected in a way to make it easy to add and modify
+protocol operations. Furthermore, the rosbridge v2.0 server decouples
+JSON-handling from the websockets server, allowing users to arbitrarily change
+the specific websockets server implementation they are using.
+
+The message transport of rosbridge is JSON objects. The only required field is
+the 'op' field, which specifies the operation of that message. Each 'op' then
+specifies its own message semantics.
+
+The rosbridge protocol is a set of 'op' codes which define a number of
+operations, along with the semantics for each operation.
+
+The rosbridge server is a server which accepts websockets connections and
+implements the rosbridge protocol.
+
+The full source code of rosbridge is located in the rosbridge_suite package.
+The package is located at https://github.com/robotwebtools/rosbridge_suite, and
+the full breakdown of the stack and its packages is detailed in section 4.5 of
+this document.
+
+## 1. The rosbridge transport
+
+A rosbridge message is, in the base case, a JSON object with a string field
+called "op". For example:
+
+```json
+{ "op": "Example" }
+```
+
+The op field indicates the type of message that this is. Messages with
+different values for op may be handled differently.
+
+So long as the message is a JSON object with the op field, it is a valid
+rosbridge message.
+
+Optionally, a message can also provide an arbitrary string or integer ID:
+
+```json
+{ "op": "Example",
+ "id":"fred"
+}
+```
+
+If an ID is provided with a message to the server, then related response
+messages will typically contain that ID as well. Log messages caused by this
+operation will also contain the ID.
+
+Semantically, the ID is not an identifier of the specific message that it is
+in, but instead is an identifier for an interaction which may consist of a
+number of operations in back-and-forth messages. Thus, the ID may be used by
+multiple messages referring to the same transaction.
+
+## 2. The rosbridge protocol
+
+The rosbridge protocol defines a number of different operations. They are as follows:
+
+Message compression / transformation:
+
+ * **fragment** - a part of a fragmented message
+ * **png** - a part of a PNG compressed fragmented message
+
+Rosbridge status messages:
+
+ * **set_status_level** - a request to set the reporting level for rosbridge status messages
+ * **status** - a status message
+
+ROS operations:
+
+ * **advertise** – advertise that you are publishing a topic
+ * **unadvertise** – stop advertising that you are publishing topic
+ * **publish** - a published ROS-message
+ * **subscribe** - a request to subscribe to a topic
+ * **unsubscribe** - a request to unsubscribe from a topic
+ * **call_service** - a service call
+ * **advertise_service** - advertise an external service server
+ * **unadvertise_service** - unadvertise an external service server
+ * **service_request** - a service request
+ * **service_response** - a service response
+
+In general, actions or operations that the client takes (such as publishing and
+subscribing) have opcodes which are verbs (subscribe, call_service, unadvertise
+etc.).
+
+Response messages from the server are things that the client is giving back, so
+they are nouns (fragment, status, service_response etc.)
+
+(The only slight exception to this naming convention is publish)
+
+## 3. Details of the rosbridge protocol
+
+Following is the specification of operations in the rosbridge protocol,
+supported by the rosbridge server. Anything marked with [experimental] may be
+subject to change after review.
+
+### 3.1 Data Encoding and Transformation
+
+The rosbridge protocol provides the ability to fragment messages and to compress messages.
+
+#### 3.1.1 Fragmentation ( _fragment_ ) [experimental]
+
+Messages may be fragmented if they are particularly large, or if the client
+requests fragmentation. A fragmented message has the following format:
+
+```json
+{ "op": "fragment",
+ "id": ,
+ "data": ,
+ "num": ,
+ "total":
+}
+```
+
+**id** - an id is required for fragmented messages, in order to identify
+corresponding fragments for the fragmented message:
+
+ * **data** - a fragment of data that, when combined with other fragments of data, makes up another message
+ * **num** - the index of the fragment in the message
+ * **total** - the total number of fragments
+
+To fragment a message, its JSON string is taken and split up into multiple
+substrings. For each substring, a fragment message is constructed, with the
+data field of the fragment populated by the substring.
+
+To reconstruct an original message, the data fields of the fragments are
+concatenated, resulting in the JSON string of the original message.
+
+#### 3.1.2 PNG compression ( _png_ ) [experimental]
+
+Some messages (such as images and maps) can be extremely large, and for efficiency
+reasons we may wish to transfer them as PNG-encoded bytes. The PNG opcode
+duplicates the fragmentation logic of the FRG opcode (and it is possible and
+reasonable to only have a single fragment), except that the data field consists
+of ASCII-encoded PNG bytes.
+
+```json
+{ "op": "png",
+ (optional) "id": ,
+ "data": ,
+ (optional) "num": ,
+ (optional) "total":
+}
+```
+
+ * **id** – only required if the message is fragmented. Identifies the
+ fragments for the fragmented message.
+ * **data** – a fragment of a PNG-encoded message or an entire message.
+ * **num** – only required if the message is fragmented. The index of the fragment.
+ * **total** – only required if the message is fragmented. The total number of fragments.
+
+To construct a PNG compressed message, take the JSON string of the original
+message and read the bytes of the string into a PNG image. Then, ASCII-encode
+the image. This string is now used as the data field. If fragmentation is
+necessary, then fragment the data and set the ID, num and total fields to the
+appropriate values in the fragments. Otherwise these fields can be left out.
+
+#### 3.1.3 CBOR encoding ( _cbor_ )
+
+[CBOR](https://tools.ietf.org/html/rfc7049) encoding is the fastest
+compression method for messages containing large blobs of data, such as
+byte arrays and numeric typed arrays.
+
+When CBOR compression is requested by a subscriber, a binary message will be
+produced instead of a JSON string. Once decoded, the message will contain
+a normal protocol message.
+
+The implementation uses [draft typed array tags] for efficient packing of
+homogeneous arrays. At the moment, only little-endian packing is supported.
+
+[draft typed array tags]: https://tools.ietf.org/html/draft-ietf-cbor-array-tags-00
+
+#### 3.1.4 CBOR-RAW encoding ( _cbor-raw_ )
+
+While CBOR encodes the entire message as CBOR, sometimes it's desirable to get the raw binary message in the
+[ROS serialization format](https://wiki.ros.org/roscpp/Overview/MessagesSerializationAndAdaptingTypes),
+which is the same format as sent between ROS nodes and stored in [Bag files](http://wiki.ros.org/Bags/Format/2.0).
+
+This can be useful in several cases:
+- Your application already knows how to parse messages in bag files (e.g. using
+ [rosbag.js](https://github.com/cruise-automation/rosbag.js), which means that now you can use
+ consistent code paths for both bags and live messages.
+- You want to parse messages as late as possible, or in parallel, e.g. only in the thread
+ or WebWorker that cares about the message. Delaying the parsing of the message means that moving
+ or copying the message to the thread is cheaper when its in binary form, since no serialization
+ between threads is necessary.
+- You only care about part of the message, and don't need to parse the rest of it.
+- You really care about performance; no conversion between the ROS binary format and CBOR is done in
+ the rosbridge_sever.
+
+The format is similar to CBOR above, but instead of the "msg" field containing the message itself
+in CBOR format, instead it contains an object with a "bytes" field which is a byte array containing
+the raw message. The "msg" object also includes "secs" and "nsecs" of the `get_rostime()` upon
+receiving the message, which is especially useful when `use_sim_time` is set, since it will give you
+the simulated time the message was received.
+
+When using this encoding, a client application will need to know exactly how to parse the raw
+message. For this it's useful to use the `/rosapi/get_topics_and_raw_types` service, which will give
+you all topics and their raw message definitions, similar to `gendeps --cat`. This is the same
+format as used by bag files.
+
+### 3.2 Status messages
+
+rosbridge sends status messages to the client relating to the successes and
+failures of rosbridge protocol commands. There are four status levels: info,
+warning, error, none. By default, rosbridge uses a status level of error.
+
+A rough guide for what causes the levels of status message:
+
+ * **error** – Whenever a user sends a message that is invalid or requests
+ something that does not exist (ie. Sending an incorrect opcode or publishing
+ to a topic that doesn't exist)
+ * **warning** – error, plus, whenever a user does something that may succeed
+ but the user has still done something incorrectly (ie. Providing a
+ partially-complete published message)
+ * **info** – warning, plus messages indicating success of various operations
+
+#### 3.2.1 Set Status Level ( _status_level_ ) [experimental]
+
+```json
+{ "op": "set_level",
+ (optional) "id": ,
+ "level":
+}
+```
+
+ * **level** – one of 'info', 'warning', 'error', or 'none'
+
+Sets the status level to the level specified. If a bad string is specified, the
+message is dropped.
+
+#### 3.2.2 Status message ( _status_ ) [experimental]
+
+```json
+{ "op": "status",
+ (optional) "id": ,
+ "level": ,
+ "msg":
+}
+```
+
+ * **level** – the level of this status message
+ * **msg** – the string message being logged
+ * **id** – if the status message was the result of some operation that had an
+ id, then that id is included
+
+### 3.3 ROS messages
+
+These rosbridge messages interact with ROS, and correspond roughly to the
+messages that already exist in the current version of rosbridge.
+
+#### 3.3.1 Advertise ( _advertise_ )
+
+If you wish to advertise that you are or will be publishing a topic, then use
+the advertise command.
+
+```json
+{ "op": "advertise",
+ (optional) "id": ,
+ "topic": ,
+ "type":
+}
+```
+
+ * **topic** – the string name of the topic to advertise
+ * **type** – the string type to advertise for the topic
+
+ * If the topic does not already exist, and the type specified is a valid
+ type, then the topic will be established with this type.
+ * If the topic already exists with a different type, an error status message
+ is sent and this message is dropped.
+ * If the topic already exists with the same type, the sender of this message
+ is registered as another publisher.
+ * If the topic doesn't already exist but the type cannot be resolved, then
+ an error status message is sent and this message is dropped.
+
+#### 3.3.2 Unadvertise ( _unadvertise_ )
+
+This stops advertising that you are publishing a topic.
+
+```json
+{ "op": "unadvertise",
+ (optional) "id": ,
+ "topic":
+}
+```
+
+ * **topic** – the string name of the topic being unadvertised
+
+ * If the topic does not exist, a warning status message is sent and this
+ message is dropped
+ * If the topic exists and there are still clients left advertising it,
+ rosbridge will continue to advertise it until all of them have unadvertised
+ * If the topic exists but rosbridge is not advertising it, a warning status
+ message is sent and this message is dropped
+
+#### 3.3.3 Publish ( _publish_ )
+
+The publish message is used to send data on a topic.
+
+```json
+{ "op": "publish",
+ (optional) "id": ,
+ "topic": ,
+ "msg":
+}
+```
+
+The publish command publishes a message on a topic.
+
+ * **topic** - the string name of the topic to publish to
+ * **msg** - the message to publish on the topic
+
+ * If the topic does not exist, then an error status message is sent and this
+ message is dropped
+ * If the msg does not conform to the type of the topic, then an error status
+ message is sent and this message is dropped
+ * If the msg is a subset of the type of the topic, then a warning status
+ message is sent and the unspecified fields are filled in with defaults
+
+Special case: if the type being published has a 'header' field, then the client
+can optionally omit the header from the msg. If this happens, rosbridge will
+automatically populate the header with a frame id of "" and the timestamp as
+the current time. Alternatively, just the timestamp field can be omitted, and
+then the current time will be automatically inserted.
+
+#### 3.3.4 Subscribe
+
+```json
+{ "op": "subscribe",
+ (optional) "id": ,
+ "topic": ,
+ (optional) "type": ,
+ (optional) "throttle_rate": ,
+ (optional) "queue_length": ,
+ (optional) "fragment_size": ,
+ (optional) "compression":
+}
+```
+
+This command subscribes the client to the specified topic. It is recommended
+that if the client has multiple components subscribing to the same topic, that
+each component makes its own subscription request providing an ID. That way,
+each can individually unsubscribe and rosbridge can select the correct rate at
+which to send messages.
+
+ * **type** – the (expected) type of the topic to subscribe to. If left off,
+ type will be inferred, and if the topic doesn't exist then the command to
+ subscribe will fail
+ * **topic** – the name of the topic to subscribe to
+ * **throttle_rate** – the minimum amount of time (in ms) that must elapse
+ between messages being sent. Defaults to 0
+ * **queue_length** – the size of the queue to buffer messages. Messages are
+ buffered as a result of the throttle_rate. Defaults to 0 (no queueing).
+ * **id** – if specified, then this specific subscription can be unsubscribed
+ by referencing the ID.
+ * **fragment_size** – the maximum size that a message can take before it is to
+ be fragmented.
+ * **compression** – an optional string to specify the compression scheme to be
+ used on messages. Valid values are "none", "png", "cbor", and "cbor-raw".
+
+If queue_length is specified, then messages are placed into the queue before
+being sent. Messages are sent from the head of the queue. If the queue gets
+full, the oldest message is removed and replaced by the newest message.
+
+If a client has multiple subscriptions to the same topic, then messages are
+sent at the lowest throttle_rate, with the lowest fragmentation size, and
+highest queue_length. It is recommended that the client provides IDs for its
+subscriptions, to enable rosbridge to effectively choose the appropriate
+fragmentation size and publishing rate.
+
+#### 3.3.5 Unsubscribe
+
+```json
+{ "op": "unsubscribe",
+ (optional) "id": ,
+ "topic":
+}
+```
+
+ * **topic** – the name of the topic to unsubscribe from
+ * **id** – an id of the subscription to unsubscribe
+
+If an id is provided, then only the corresponding subscription is unsubscribed.
+If no ID is provided, then all subscriptions are unsubscribed.
+
+#### 3.3.6 Call Service
+
+```json
+{ "op": "call_service",
+ (optional) "id": ,
+ "service": ,
+ (optional) "args": >,
+ (optional) "fragment_size": ,
+ (optional) "compression":
+}
+```
+
+Calls a ROS service
+
+ * **service** – the name of the service to call
+ * **args** – if the service has no args, then args does not have to be
+ provided, though an empty list is equally acceptable. Args should be a list
+ of json objects representing the arguments to the service
+ * **id** – an optional id to distinguish this service call
+ * **fragment_size** – the maximum size that the response message can take
+ before it is fragmented
+ * **compression** – an optional string to specify the compression scheme to be
+ used on messages. Valid values are "none" and "png"
+
+#### 3.3.7 Advertise Service
+
+```json
+{ "op": "advertise_service",
+ "type": ,
+ "service":
+}
+```
+
+Advertises an external ROS service server. Requests come to the client via Call Service.
+
+ * **service** – the name of the service to advertise
+ * **type** – the advertised service message type
+
+#### 3.3.8 Unadvertise Service
+
+```json
+{ "op": "unadvertise_service",
+ "service":
+}
+```
+
+Stops advertising an external ROS service server
+
+ * **service** – the name of the service to unadvertise
+
+#### 3.3.9 Service Response
+
+```json
+{ "op": "service_response",
+ (optional) "id": ,
+ "service": ,
+ (optional) "values": >,
+ "result":
+}
+```
+
+A response to a ROS service call
+
+ * **service** – the name of the service that was called
+ * **values** – the return values. If the service had no return values, then
+ this field can be omitted (and will be by the rosbridge server)
+ * **id** – if an ID was provided to the service request, then the service
+ response will contain the ID
+ * **result** - return value of service callback. true means success, false failure.
+
+## 4 Further considerations
+
+Further considerations for the rosbridge protocol are listed below.
+
+### 4.1 Rosbridge psuedo-services
+
+Rosbridge no longer provides the ROS-api introspection pseudo services that it
+previously did. These are, for example rosbridge/topics and rosbridge/services.
+Instead, these services are provided as proper ROS services by the new rosapi
+package.
+
+### 4.2 Sampling
+
+It has been suggested that rosbridge may be extended to provide an operation to
+sample a single message from a topic.
+
+### 4.3 Latching
+
+Rosbridge will support messages that were latched to topics internally in ROS.
+It is possible that the publish opcode will be extended so that remote clients
+can latch messages too.
+
+### 4.5 Rosbridge package structure
+
+Rosbridge 2.0 resides in a package named rosbridge_suite, located at
+https://github.com/robotwebtools/rosbridge_suite.
+
+The meta-package will contain the following packages:
+
+ * **rosbridge_library** – the core rosbridge JSON-to-ROS implementation. This
+ is be a Python library.
+ * **rosbridge_server** – depends on the rosbridge library, and implements the
+ WebSockets server, passing incoming messages to the API and outgoing
+ messages back to the WebSockets connection. The default server uses
+ tornado, a python server implementation.
+ * **rosapi** – provides ROS services for various master API calls, such as
+ listing all the topics, services, types currently in ROS
+
diff --git a/src/interface/rosbridge_suite/TROUBLESHOOTING.md b/src/interface/rosbridge_suite/TROUBLESHOOTING.md
new file mode 100644
index 000000000..1900068f5
--- /dev/null
+++ b/src/interface/rosbridge_suite/TROUBLESHOOTING.md
@@ -0,0 +1,27 @@
+### Tornado Version
+
+Often the server breaks because it is using the wrong version of Tornado. Tornado's interfaces and behavior change very quickly, Rosbridge is only tested against the version installed by rosdep. On Debian-based systems, this is the apt package python-tornado.
+
+To check your imported Tornado version, run:
+
+```
+python -c 'import tornado; print tornado.version'
+```
+
+The imported version should the `apt` version:
+
+```
+apt-cache show python-tornado | grep Version
+```
+
+If the versions don't match, it's likely that the wrong version of Tornado was installed with `pip`. Try uninstalling it:
+
+```
+pip uninstall tornado
+```
+
+If the wrong version is still imported, you will need to find it and remove it. You might find it with something like:
+
+```
+find /usr/local/lib/python*/*-packages/ -type d | grep '/tornado/'
+```
diff --git a/src/interface/rosbridge_suite/pyproject.toml b/src/interface/rosbridge_suite/pyproject.toml
new file mode 100644
index 000000000..2ebe07a83
--- /dev/null
+++ b/src/interface/rosbridge_suite/pyproject.toml
@@ -0,0 +1,5 @@
+[tool.bandit]
+skips = ["B101", "B110", "B311"]
+
+[tool.black]
+line-length = 100
diff --git a/src/interface/rosbridge_suite/rosapi/CHANGELOG.rst b/src/interface/rosbridge_suite/rosapi/CHANGELOG.rst
new file mode 100644
index 000000000..10e36faa6
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/CHANGELOG.rst
@@ -0,0 +1,370 @@
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Changelog for package rosapi
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+1.3.1 (2022-10-21)
+------------------
+* Add graceful shutdown (`#794 `_)
+* Contributors: Hans-Joachim Krauch
+
+1.3.0 (2022-08-16)
+------------------
+* Fixed /get_param service for arrays (`#776 `_)
+* Contributors: p0rys
+
+1.2.0 (2022-05-20)
+------------------
+* Added `/rosapi/get_ros_version` service (`#708 `_)
+* Fixed node name collision with websocket launch file (`#707 `_)
+* Contributors: Jacob Bandes-Storch, Kedus Mathewos, rob-clarke
+
+1.1.2 (2022-01-03)
+------------------
+
+1.1.1 (2021-12-09)
+------------------
+
+1.1.0 (2021-10-22)
+------------------
+* Move msg/srv from rosapi and rosbridge_library into separate packages; enable Rolling in CI (`#665 `_)
+* Exit cleanly on SIGINT; remove sleep in test (`#667 `_)
+* Remove unused service_host and search_param services (`#660 `_)
+* Migrate remaining linters to pre-commit (`#657 `_)
+* Add pre-commit, format with black and isort (`#648 `_)
+* Contributors: Adrian Macneil, Jacob Bandes-Storch, Kenji Miyake
+
+1.0.8 (2021-08-26)
+------------------
+* Add missing test_depends and buildtool_depends (`#617 `_)
+* Fix various Python code style and lint issues
+* Contributors: Christian Clauss, Jacob Bandes-Storch
+
+1.0.7 (2021-08-18)
+------------------
+* Load message definitions from .msg files; exclude /msg/ and include builtin_interfaces in combined definitions (`#597 `_)
+* Fix typos discovered by codespell (`#600 `_)
+* Contributors: Christian Clauss, Jacob Bandes-Storch
+
+1.0.6 (2021-08-17)
+------------------
+* Include /msg/ in type names (`#591 `_)
+* Fix broken links in changelogs
+* Contributors: Jacob Bandes-Storch
+
+1.0.5 (2021-08-12)
+------------------
+
+1.0.4 (2021-08-11)
+------------------
+* Include /msg/ in type names (`#584 `_)
+ It's more canonical for ROS 2 type names to be of the form `foo_msgs/msg/Bar` rather than just `foo_msgs/Bar`. This is occasionally reflected in documentation and command line tooling: https://docs.ros.org/en/galactic/Tutorials/Topics/Understanding-ROS2-Topics.html#ros2-interface-show
+ So rather than stripping out `/msg/`, we include it in the type definitions.
+ See also: https://github.com/RobotWebTools/rosmsg/pull/12
+* Contributors: Jacob Bandes-Storch
+
+1.0.3 (2021-08-03)
+------------------
+* Add TopicsAndRawTypes service (`#574 `_, adapted from ROS 1 implementation `#452 `_)
+* fix: remove json encoding before setting string params (`#521 `_)
+* Update rosapi/proxy.py to match eloquent API (`#447 `_)
+* Contributors: Jacob Bandes-Storch, justinscorringe, travipross
+
+1.0.2 (2019-09-24)
+------------------
+
+1.0.1 (2019-09-20)
+------------------
+* fix missing dependency
+
+1.0.0 (2019-09-19)
+------------------
+* Port to ROS 2
+
+0.11.3 (2019-08-07)
+-------------------
+* Travis CI: Look for Python syntax errors and undefined name (`#420 `_)
+ * Travis CI: Look for Python syntax errors and undefined name
+ _It would be prudent to start running the tests in both 2 and 3._ https://github.com/RobotWebTools/rosbridge_suite/issues/401#issuecomment-512069249
+ * Add names to protect the guilty
+ * Five jobs, not six
+ * Identity is not the same thing as equality in Python
+ * Flake8 tests now pass on Python 2
+* Contributors: cclauss
+
+0.11.2 (2019-07-08)
+-------------------
+* constnames and constvalues in typedef (`#412 `_)
+* Contributors: Kad91
+
+0.11.1 (2019-05-08)
+-------------------
+
+0.11.0 (2019-03-29)
+-------------------
+
+0.10.2 (2019-03-04)
+-------------------
+* Use Master.getTopicTypes() in /rosapi/topics to increase performance (`#381 `_)
+* Contributors: Affonso, Guilherme
+
+0.10.1 (2018-12-16)
+-------------------
+
+0.10.0 (2018-12-14)
+-------------------
+* Drop use of ros Python module (`#374 `_)
+* Fixes passing of globs to proxy (`#355 `_)
+ * Fixes handling and passing of globs to proxy
+ * Removes some confusing imports
+* Fix a few problems (`#350 `_)
+ * xrange is not available in Python3, range works for both Python versions
+ * the variable v is undefined in search_param, comparing the implementation with the sibling functions I expect name to be the intended variable
+ * The module udp_handler is using the Authentication service but wasn't importing the module
+* use package format 2, remove unnecessary dependencies (`#348 `_)
+* Contributors: Anwar, Dirk Thomas, Jochen Sprickerhof
+
+0.9.0 (2018-04-09)
+------------------
+
+0.8.6 (2017-12-08)
+------------------
+* Fixed action_servers filter to allow more than one namespace (`#305 `_)
+ * Modified action_servers filter to detect topics with more than one namespace
+ * Fixed to return the full namespace
+* Contributors: milesial
+
+0.8.5 (2017-11-23)
+------------------
+* Add Python3 compatibility (`#300 `_)
+ * First pass at Python 3 compatibility
+ * message_conversion: Only call encode on a Python2 str or bytes type
+ * protocol.py: Changes for dict in Python3. Compatible with Python 2 too.
+ * More Python 3 fixes, all tests pass
+ * Move definition of string_types to rosbridge_library.util
+* Contributors: Kartik Mohta
+
+0.8.4 (2017-10-16)
+------------------
+* Handles empty globes properly (`#297 `_)
+ * Refactors get_globs function to a separate module
+ * Refactors the filtering that uses the globs
+ * Some linting
+ * Handles topic types for empty globs
+ * Refactors out an any_match function
+ * Simplifies filter_action_servers
+ * Imports socket for the errors
+ * Uses import .glob_helper
+* Contributors: Anwar
+
+0.8.3 (2017-09-11)
+------------------
+
+0.8.2 (2017-09-11)
+------------------
+* Removes array delimiters while parsing parameters (`#292 `_)
+* Contributors: Anwar
+
+0.8.1 (2017-08-30)
+------------------
+
+0.8.0 (2017-08-30)
+------------------
+* fix delete_param in rosapi (`#284 `_)
+* Merge pull request `#276 `_ from sevenbitbyte/DOCUMENT_GLOB
+ Document glob
+* Update README.md
+ Formatting and examples
+* Create README.md
+* Contributors: 7bit, Jihoon Lee
+
+0.7.17 (2017-01-25)
+-------------------
+* Added bug fix in rosapi
+* no rospy needed, just for debug logging
+* new service: get actionlib servers
+* adjust log level for security globs
+ Normal operation (i.e. no globs or successful verification of requests) is now silent, with illegal requests producing a warning.
+* correct default values for security globs
+ also accept empty list as the default "do not check globs" value in addition to None.
+ Finally, append rosapi service glob after processing command line input so it's not overwritten
+* Added services_glob to CallServices, added globs to rosbridge_tcp and rosbridge_udp, and other miscellaneous fixes.
+* As per the suggestions of @T045T, fixed several typos, improved logging, and made some style fixes.
+* Fixed time object field definitions to match documentation.
+* Two minor fixes.
+* Added new parameters for topic and service security.
+ Added 3 new parameters to rosapi and rosbridge_server which filter the
+ topics, services, and parameters broadcast by the server to match an
+ array of glob strings.
+* Contributors: Devon Ash, Eric, Marco Arruda, Nils Berg
+
+0.7.16 (2016-08-15)
+-------------------
+* new srv: topics types and details
+* Contributors: Marco Arruda
+
+0.7.15 (2016-04-25)
+-------------------
+* changelog updated
+* Contributors: Russell Toris
+
+0.7.14 (2016-02-11)
+-------------------
+* Update proxy.py
+ Fixes an issue when call the service "/rosapi/service_type"
+* Contributors: Robert Codd-Downey
+
+0.7.13 (2015-08-14)
+-------------------
+* Fix catkin_lint issues
+* Contributors: Matt Vollrath
+
+0.7.12 (2015-04-07)
+-------------------
+
+0.7.11 (2015-03-23)
+-------------------
+* rename rosapi script to rosapi_node to address `#170 `_
+* Contributors: Jihoon Lee
+
+0.7.10 (2015-02-25)
+-------------------
+* Make get_topics() and get_topic_type() reference the full list of active topics.
+* Contributors: Justin Huang
+
+0.7.9 (2015-02-24)
+------------------
+* add findding service function as specific service type
+* Contributors: dwlee
+
+0.7.8 (2015-01-16)
+------------------
+
+0.7.7 (2015-01-06)
+------------------
+
+0.7.6 (2014-12-26)
+------------------
+* 0.7.5
+* update changelog
+* 0.7.4
+* changelog updated
+* 0.7.3
+* changelog updated
+* 0.7.2
+* changelog updated
+* 0.7.1
+* update changelog
+* 0.7.0
+* changelog updated
+* Contributors: Jihoon Lee, Russell Toris
+
+0.7.5 (2014-12-26)
+------------------
+
+0.7.4 (2014-12-16)
+------------------
+
+0.7.3 (2014-12-15)
+------------------
+
+0.7.2 (2014-12-15)
+------------------
+* 0.7.1
+* update changelog
+* Contributors: Jihoon Lee
+
+0.7.1 (2014-12-09)
+------------------
+
+0.7.0 (2014-12-02)
+------------------
+
+0.6.8 (2014-11-05)
+------------------
+
+0.6.7 (2014-10-22)
+------------------
+* updated package manifests
+* Contributors: Russell Toris
+
+0.6.6 (2014-10-21)
+------------------
+
+0.6.5 (2014-10-14)
+------------------
+* 0.6.4
+* update changelog
+* 0.6.3
+* update change log
+* Contributors: Jihoon Lee
+
+0.6.4 (2014-10-08)
+------------------
+
+0.6.3 (2014-10-07)
+------------------
+
+0.6.2 (2014-10-06)
+------------------
+
+0.6.1 (2014-09-01)
+------------------
+* make rosapis use absolute namespace
+* Contributors: Jihoon Lee
+
+0.6.0 (2014-05-23)
+------------------
+* Ensure proper locking for Parameter Server access
+* Contributors: Lasse Rasinen
+
+0.5.4 (2014-04-17)
+------------------
+* add rosnode and rosgraph
+* Contributors: Jihoon Lee
+
+0.5.3 (2014-03-28)
+------------------
+
+0.5.2 (2014-03-14)
+------------------
+
+0.5.1 (2013-10-31)
+------------------
+
+0.5.0 (2013-07-17)
+------------------
+* 0.5.0 preparation for hydro release
+* Removes trailing commas.
+* removing global bin installation in setup.py
+* Contributors: Brandon Alexander, Jihoon Lee
+
+0.4.4 (2013-04-08)
+------------------
+
+0.4.3 (2013-04-03 08:24)
+------------------------
+
+0.4.2 (2013-04-03 08:12)
+------------------------
+* eclipse projects removed
+* Contributors: Russell Toris
+
+0.4.1 (2013-03-07)
+------------------
+* fixes import issue in rosapi
+* Contributors: Russell Toris
+
+0.4.0 (2013-03-05)
+------------------
+* Fixes ambiguous params class reference.
+* Uses only 1 .gitignore to avoid confusion.
+* Fixing rosapi's "Cannot include proxy..." errors.
+* Adds BSD license header to code files.
+ See Issue `#13 `_.
+* rosbridge_server requires rosapi.
+* Adds message and service generation to rosapi.
+* Adding setup.py to rosapi.
+* Clarifies name of rosapi is rosapi.
+* Catkinizes rosapi.
+* Collapse directory structure.
+* Contributors: Austin Hendrix, Brandon Alexander
diff --git a/src/interface/rosbridge_suite/rosapi/CMakeLists.txt b/src/interface/rosbridge_suite/rosapi/CMakeLists.txt
new file mode 100644
index 000000000..1f41d5e42
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/CMakeLists.txt
@@ -0,0 +1,27 @@
+cmake_minimum_required(VERSION 3.5)
+project(rosapi)
+
+find_package(ament_cmake_ros REQUIRED)
+
+if(NOT CMAKE_CXX_STANDARD)
+ set(CMAKE_CXX_STANDARD 14)
+endif()
+
+ament_python_install_package(
+ ${PROJECT_NAME} PACKAGE_DIR "src/${PROJECT_NAME}")
+
+ament_package()
+
+install(PROGRAMS scripts/rosapi_node
+ DESTINATION lib/${PROJECT_NAME}
+)
+
+install(
+ FILES mapping_rules.yaml
+ DESTINATION share/${PROJECT_NAME}
+)
+
+if(BUILD_TESTING)
+ find_package(ament_cmake_pytest REQUIRED)
+ ament_add_pytest_test(${PROJECT_NAME}_test_stringify_field_types test/test_stringify_field_types.py)
+endif()
diff --git a/src/interface/rosbridge_suite/rosapi/README.md b/src/interface/rosbridge_suite/rosapi/README.md
new file mode 100644
index 000000000..1244fc675
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/README.md
@@ -0,0 +1,29 @@
+rosapi
+===============
+
+#### Parameters
+
+ * `~topics_glob` (string, default '')
+ * `~services_glob` (string, default '')
+ * `~params_glob` (string, default '')
+
+ ```Note: By default the rosapi calls for details about topics, services, and parameters will return nothing. You must specify a list of allowed resources.```
+ Each of the glob parameters may contain an array of one or more match patterns. Resources that match any of the specified patterns will be returned by calls to the rosapi services.
+
+An example launch file which enables all information to be returned.
+
+```
+
+
+
+
+
+```
+
+
+This example launch file enables only rosout and certain camera topics
+```
+
+
+
+```
diff --git a/src/interface/rosbridge_suite/rosapi/mapping_rules.yaml b/src/interface/rosbridge_suite/rosapi/mapping_rules.yaml
new file mode 100644
index 000000000..ae367c8a1
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/mapping_rules.yaml
@@ -0,0 +1,8 @@
+-
+ ros1_package_name: 'rosapi'
+ ros1_service_name: 'GetParam'
+ ros2_package_name: 'rosapi'
+ ros2_service_name: 'GetParam'
+ request_fields_1_to_2:
+ name: 'name'
+ default: 'default_value'
diff --git a/src/interface/rosbridge_suite/rosapi/package.xml b/src/interface/rosbridge_suite/rosapi/package.xml
new file mode 100644
index 000000000..0071c9f0c
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/package.xml
@@ -0,0 +1,47 @@
+
+
+ rosapi
+ 1.3.1
+
+ Provides service calls for getting ros meta-information, like list of
+ topics, services, params, etc.
+
+
+ BSD
+
+ http://ros.org/wiki/rosapi
+ https://github.com/RobotWebTools/rosbridge_suite/issues
+ https://github.com/RobotWebTools/rosbridge_suite
+
+ Jonathan Mace
+ Jihoon Lee
+ Foxglove
+
+ ament_cmake_ros
+
+ rosapi_msgs
+ builtin_interfaces
+ rclpy
+ rcl_interfaces
+ rosbridge_library
+ ros2node
+ ros2param
+ ros2pkg
+ ros2service
+ ros2topic
+
+
+ ament_cmake_pytest
+ sensor_msgs
+ shape_msgs
+ geometry_msgs
+ rmw_dds_common
+
+
+ ament_cmake
+
+
+
diff --git a/src/interface/rosbridge_suite/rosapi/scripts/rosapi_node b/src/interface/rosbridge_suite/rosapi/scripts/rosapi_node
new file mode 100755
index 000000000..af478ee52
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/scripts/rosapi_node
@@ -0,0 +1,329 @@
+#!/usr/bin/env python3
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2012, Willow Garage, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the name of Willow Garage, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import os
+import sys
+
+import rclpy
+from rclpy.clock import Clock, ClockType
+from rclpy.node import Node
+
+from rosapi import glob_helper, objectutils, params, proxy
+from rosapi_msgs.msg import TypeDef
+from rosapi_msgs.srv import (
+ DeleteParam,
+ GetActionServers,
+ GetParam,
+ GetParamNames,
+ GetROSVersion,
+ GetTime,
+ HasParam,
+ MessageDetails,
+ NodeDetails,
+ Nodes,
+ Publishers,
+ ServiceNode,
+ ServiceProviders,
+ ServiceRequestDetails,
+ ServiceResponseDetails,
+ Services,
+ ServicesForType,
+ ServiceType,
+ SetParam,
+ Subscribers,
+ Topics,
+ TopicsAndRawTypes,
+ TopicsForType,
+ TopicType,
+)
+
+
+class Rosapi(Node):
+
+ NAME = "rosapi"
+
+ def __init__(self):
+ super().__init__(self.NAME)
+ self.declare_parameter("topics_glob", "[*]")
+ self.declare_parameter("services_glob", "[*]")
+ self.declare_parameter("params_glob", "[*]")
+ self.globs = self.get_globs()
+ self.register_services()
+
+ # Initialises the ROS node
+ def register_services(self):
+ proxy.init(self)
+ if self.get_namespace() == "/":
+ full_name = self.get_namespace() + self.get_name()
+ else:
+ full_name = self.get_namespace() + "/" + self.get_name()
+ params.init(full_name)
+ self.create_service(Topics, "/rosapi/topics", self.get_topics)
+ self.create_service(TopicsForType, "/rosapi/topics_for_type", self.get_topics_for_type)
+ self.create_service(
+ TopicsAndRawTypes,
+ "/rosapi/topics_and_raw_types",
+ self.get_topics_and_raw_types,
+ )
+ self.create_service(Services, "/rosapi/services", self.get_services)
+ self.create_service(
+ ServicesForType, "/rosapi/services_for_type", self.get_services_for_type
+ )
+ self.create_service(Nodes, "/rosapi/nodes", self.get_nodes)
+ self.create_service(NodeDetails, "/rosapi/node_details", self.get_node_details)
+ self.create_service(GetActionServers, "/rosapi/action_servers", self.get_action_servers)
+ self.create_service(TopicType, "/rosapi/topic_type", self.get_topic_type)
+ self.create_service(ServiceType, "/rosapi/service_type", self.get_service_type)
+ self.create_service(Publishers, "/rosapi/publishers", self.get_publishers)
+ self.create_service(Subscribers, "/rosapi/subscribers", self.get_subscribers)
+ self.create_service(
+ ServiceProviders, "/rosapi/service_providers", self.get_service_providers
+ )
+ self.create_service(ServiceNode, "/rosapi/service_node", self.get_service_node)
+ self.create_service(MessageDetails, "/rosapi/message_details", self.get_message_details)
+ self.create_service(
+ ServiceRequestDetails,
+ "/rosapi/service_request_details",
+ self.get_service_request_details,
+ )
+ self.create_service(
+ ServiceResponseDetails,
+ "/rosapi/service_response_details",
+ self.get_service_response_details,
+ )
+ self.create_service(SetParam, "/rosapi/set_param", self.set_param)
+ self.create_service(GetParam, "/rosapi/get_param", self.get_param)
+ self.create_service(HasParam, "/rosapi/has_param", self.has_param)
+ self.create_service(DeleteParam, "/rosapi/delete_param", self.delete_param)
+ self.create_service(GetParamNames, "/rosapi/get_param_names", self.get_param_names)
+ self.create_service(GetTime, "/rosapi/get_time", self.get_time)
+ self.create_service(GetROSVersion, "/rosapi/get_ros_version", self.get_ros_version)
+
+ def get_globs(self):
+ return glob_helper.get_globs(self)
+
+ def get_topics(self, request, response):
+ """Called by the rosapi/Topics service. Returns a list of all the topics being published."""
+ response.topics, response.types = proxy.get_topics_and_types(self.globs.topics)
+ return response
+
+ def get_topics_for_type(self, request, response):
+ """Called by the rosapi/TopicsForType service. Returns a list of all the topics that are publishing a given type"""
+ response.topics = proxy.get_topics_for_type(request.type, self.globs.topics)
+ return response
+
+ def get_topics_and_raw_types(self, request, response):
+ """Called by the rosapi/TopicsAndRawTypes service. Returns a list of all the topics being published, and their
+ raw types, similar to `gendeps --cat`."""
+ response.topics, response.types = proxy.get_topics_and_types(self.globs.topics)
+ response.typedefs_full_text = [
+ objectutils.get_typedef_full_text(type) for type in response.types
+ ]
+ return response
+
+ def get_services(self, request, response):
+ """Called by the rosapi/Services service. Returns a list of all the services being advertised."""
+ response.services = proxy.get_services(self.globs.services)
+ return response
+
+ def get_services_for_type(self, request, response):
+ """Called by the rosapi/ServicesForType service. Returns a list of all the services that are publishing a given type"""
+ response.services = proxy.get_services_for_type(request.type, self.globs.services)
+ return response
+
+ def get_nodes(self, request, response):
+ """Called by the rosapi/Nodes service. Returns a list of all the nodes that are registered"""
+ response.nodes = proxy.get_nodes()
+ return response
+
+ def get_node_details(self, request, response):
+ """Called by the rosapi/Nodes service. Returns a node description"""
+ (
+ response.subscribing,
+ response.publishing,
+ response.services,
+ ) = proxy.get_node_info(request.node)
+ return response
+
+ def get_action_servers(self, request, response):
+ """Called by the rosapi/GetActionServers service. Returns a list of action servers based on actions standard topics"""
+ topics = proxy.get_topics(self.globs.topics, include_hidden=True)
+ response.action_servers = proxy.filter_action_servers(topics)
+ return response
+
+ def get_topic_type(self, request, response):
+ """Called by the rosapi/TopicType service. Given the name of a topic, returns the name of the type of that topic.
+ Request class has one field, 'topic', which is a string value (the name of the topic)
+ Response class has one field, 'type', which is a string value (the type of the topic)
+ If the topic does not exist, an empty string is returned."""
+ response.type = proxy.get_topic_type(request.topic, self.globs.topics)
+ return response
+
+ def get_service_type(self, request, response):
+ """Called by the rosapi/ServiceType service. Given the name of a service, returns the type of that service
+ Request class has one field, 'service', which is a string value (the name of the service)
+ Response class has one field, 'type', which is a string value (the type of the service)
+ If the service does not exist, an empty string is returned."""
+ response.type = proxy.get_service_type(request.service, self.globs.services)
+ return response
+
+ def get_publishers(self, request, response):
+ """Called by the rosapi/Publishers service. Given the name of a topic, returns a list of node names
+ that are publishing on that topic."""
+ response.publishers = proxy.get_publishers(request.topic, self.globs.topics)
+ return response
+
+ def get_subscribers(self, request, response):
+ """Called by the rosapi/Subscribers service. Given the name of a topic, returns a list of node names
+ that are subscribing to that topic."""
+ response.subscribers = proxy.get_subscribers(request.topic, self.globs.topics)
+ return response
+
+ def get_service_providers(self, request, response):
+ """Called by the rosapi/ServiceProviders service. Given the name of a topic, returns a list of node names
+ that are advertising that service type"""
+ response.providers = proxy.get_service_providers(request.service, self.globs.services)
+ return response
+
+ def get_service_node(self, request, response):
+ """Called by the rosapi/ServiceNode service. Given the name of a service, returns the name of the node
+ that is providing that service."""
+ response.node = proxy.get_service_node(request.service, self.globs.services)
+ return response
+
+ def get_message_details(self, request, response):
+ """Called by the rosapi/MessageDetails service. Given the name of a message type, returns the TypeDef
+ for that type."""
+ response.typedefs = [
+ dict_to_typedef(d) for d in objectutils.get_typedef_recursive(request.type)
+ ]
+ return response
+
+ def get_service_request_details(self, request, response):
+ """Called by the rosapi/ServiceRequestDetails service. Given the name of a service type, returns the TypeDef
+ for the request message of that service type."""
+ response.typedefs = [
+ dict_to_typedef(d)
+ for d in objectutils.get_service_request_typedef_recursive(request.type)
+ ]
+ return response
+
+ def get_service_response_details(self, request, response):
+ """Called by the rosapi/ServiceResponseDetails service. Given the name of a service type, returns the TypeDef
+ for the response message of that service type."""
+ response.typedefs = [
+ dict_to_typedef(d)
+ for d in objectutils.get_service_response_typedef_recursive(request.type)
+ ]
+ return response
+
+ def set_param(self, request, response):
+ try:
+ node_name, param_name = self._get_node_and_param_name(request.name)
+ params.set_param(node_name, param_name, request.value, self.globs.params)
+ except ValueError:
+ self._print_malformed_param_name_warning(request.name)
+ return response
+
+ def get_param(self, request, response):
+ try:
+ node_name, param_name = self._get_node_and_param_name(request.name)
+ response.value = params.get_param(
+ node_name, param_name, request.default_value, self.globs.params
+ )
+ except ValueError:
+ self._print_malformed_param_name_warning(request.name)
+ return response
+
+ def has_param(self, request, response):
+ try:
+ node_name, param_name = self._get_node_and_param_name(request.name)
+ response.exists = params.has_param(node_name, param_name, self.globs.params)
+ except ValueError:
+ self._print_malformed_param_name_warning(request.name)
+ return response
+
+ def delete_param(self, request, response):
+ params.delete_param(request.node_name, request.name, self.globs.params)
+ return response
+
+ def get_param_names(self, request, response):
+ response.names = params.get_param_names(self.globs.params)
+ return response
+
+ def get_time(self, request, response):
+ response.time = Clock(clock_type=ClockType.ROS_TIME).now().to_msg()
+ return response
+
+ def _get_node_and_param_name(self, param):
+ return tuple(param.split(":"))
+
+ def _print_malformed_param_name_warning(self, param_name):
+ self.get_logger().warn(
+ "Malformed parameter name: {}; expecting :".format(param_name)
+ )
+
+ def get_ros_version(self, request, response):
+ response.version = 2
+ response.distro = str(os.environ["ROS_DISTRO"])
+ return response
+
+
+def dict_to_typedef(typedefdict):
+ typedef = TypeDef()
+ typedef.type = typedefdict["type"]
+ typedef.fieldnames = typedefdict["fieldnames"]
+ typedef.fieldtypes = typedefdict["fieldtypes"]
+ typedef.fieldarraylen = typedefdict["fieldarraylen"]
+ typedef.examples = typedefdict["examples"]
+ typedef.constnames = typedefdict["constnames"]
+ typedef.constvalues = typedefdict["constvalues"]
+ return typedef
+
+
+def main(args=None):
+ if args is None:
+ args = sys.argv
+
+ rclpy.init(args=args)
+ node = Rosapi()
+ try:
+ rclpy.spin(node)
+ node.destroy_node()
+ rclpy.shutdown()
+ except KeyboardInterrupt:
+ print("Exiting due to SIGINT")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/tools/opendrive_utils/COLCON_IGNORE b/src/interface/rosbridge_suite/rosapi/src/rosapi/__init__.py
similarity index 100%
rename from src/tools/opendrive_utils/COLCON_IGNORE
rename to src/interface/rosbridge_suite/rosapi/src/rosapi/__init__.py
diff --git a/src/interface/rosbridge_suite/rosapi/src/rosapi/glob_helper.py b/src/interface/rosbridge_suite/rosapi/src/rosapi/glob_helper.py
new file mode 100644
index 000000000..e62883016
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/src/rosapi/glob_helper.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+
+import fnmatch
+from collections import namedtuple
+
+from rcl_interfaces.msg import ParameterType
+
+Globs = namedtuple("Globs", ["topics", "services", "params"])
+
+
+def get_globs(node):
+ def get_param(parameter_name):
+ parameter_value = node.get_parameter(parameter_name).get_parameter_value()
+ if parameter_value.type == ParameterType.PARAMETER_STRING:
+ parameter_value = parameter_value.string_value
+ else:
+ parameter_value = ""
+ # strips array delimiters in case of an array style value
+ return [
+ element.strip().strip("'")
+ for element in parameter_value.strip("[").strip("]").split(",")
+ if len(element.strip().strip("'")) > 0
+ ]
+
+ topics_glob = get_param("topics_glob")
+ services_glob = get_param("services_glob")
+ params_glob = get_param("params_glob")
+ return Globs(topics_glob, services_glob, params_glob)
+
+
+def filter_globs(globs, full_list):
+ # If the globs are empty (weren't defined in the params), return the full list
+ if globs is not None and len(globs) > 0:
+ return list(filter(lambda x: any_match(x, globs), full_list))
+ else:
+ return full_list
+
+
+def any_match(query, globs):
+ return (
+ globs is None or len(globs) == 0 or any(fnmatch.fnmatch(str(query), glob) for glob in globs)
+ )
diff --git a/src/interface/rosbridge_suite/rosapi/src/rosapi/objectutils.py b/src/interface/rosbridge_suite/rosapi/src/rosapi/objectutils.py
new file mode 100644
index 000000000..49877d078
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/src/rosapi/objectutils.py
@@ -0,0 +1,259 @@
+#!/usr/bin/env python
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2012, Willow Garage, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the name of Willow Garage, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import inspect
+
+from rosapi.stringify_field_types import stringify_field_types
+from rosbridge_library.internal import ros_loader
+
+# Keep track of atomic types and special types
+atomics = [
+ "bool",
+ "byte",
+ "int8",
+ "uint8",
+ "int16",
+ "uint16",
+ "int32",
+ "uint32",
+ "int64",
+ "uint64",
+ "float32",
+ "float64",
+ "string",
+]
+specials = ["time", "duration"]
+
+
+def get_typedef(type):
+ """A typedef is a dict containing the following fields:
+ - string type
+ - string[] fieldnames
+ - string[] fieldtypes
+ - int[] fieldarraylen
+ - string[] examples
+ - string[] constnames
+ - string[] constvalues
+ get_typedef will return a typedef dict for the specified message type"""
+ if type in atomics:
+ # Atomics don't get a typedef
+ return None
+
+ if type in specials:
+ # Specials get their type def mocked up
+ return _get_special_typedef(type)
+
+ # Fetch an instance and return its typedef
+ instance = ros_loader.get_message_instance(type)
+ return _get_typedef(instance)
+
+
+def get_service_request_typedef(servicetype):
+ """Returns a typedef dict for the service request class for the specified service type"""
+ # Get an instance of the service request class and return its typedef
+ instance = ros_loader.get_service_request_instance(servicetype)
+ return _get_typedef(instance)
+
+
+def get_service_response_typedef(servicetype):
+ """Returns a typedef dict for the service response class for the specified service type"""
+ # Get an instance of the service response class and return its typedef
+ instance = ros_loader.get_service_response_instance(servicetype)
+ return _get_typedef(instance)
+
+
+def get_typedef_recursive(type):
+ """Returns a list of typedef dicts for this type and all contained type fields"""
+ # Just go straight into the recursive method
+ return _get_typedefs_recursive(type, [])
+
+
+def get_service_request_typedef_recursive(servicetype):
+ """Returns a list of typedef dicts for this type and all contained type fields"""
+ # Get an instance of the service request class and get its typedef
+ instance = ros_loader.get_service_request_instance(servicetype)
+ typedef = _get_typedef(instance)
+
+ # Return the list of sub-typedefs
+ return _get_subtypedefs_recursive(typedef, [])
+
+
+def get_service_response_typedef_recursive(servicetype):
+ """Returns a list of typedef dicts for this type and all contained type fields"""
+ # Get an instance of the service response class and get its typedef
+ instance = ros_loader.get_service_response_instance(servicetype)
+ typedef = _get_typedef(instance)
+
+ # Return the list of sub-typedefs
+ return _get_subtypedefs_recursive(typedef, [])
+
+
+def get_typedef_full_text(ty):
+ """Returns the full text (similar to `gendeps --cat`) for the specified message type"""
+ try:
+ return stringify_field_types(ty)
+ except Exception as e:
+ return f"# failed to get full definition text for {ty}: {str(e)}"
+
+
+def _get_typedef(instance):
+ """Gets a typedef dict for the specified instance"""
+ if (
+ instance is None
+ or not hasattr(instance, "__slots__")
+ or not hasattr(instance, "_fields_and_field_types")
+ ):
+ return None
+
+ fieldnames = []
+ fieldtypes = []
+ fieldarraylen = []
+ examples = []
+ constnames = []
+ constvalues = []
+ for i in range(len(instance.__slots__)):
+ # Pull out the name
+ name = instance.__slots__[i]
+ fieldnames.append(name)
+
+ # Pull out the type and determine whether it's an array
+ field_type = instance._fields_and_field_types[name[1:]] # Remove trailing underscore.
+ arraylen = -1
+ if field_type[-1:] == "]":
+ if field_type[-2:-1] == "[":
+ arraylen = 0
+ field_type = field_type[:-2]
+ else:
+ split = field_type.find("[")
+ arraylen = int(field_type[split + 1 : -1])
+ field_type = field_type[:split]
+ fieldarraylen.append(arraylen)
+
+ # Get the fully qualified type
+ field_instance = getattr(instance, name)
+ fieldtypes.append(_type_name(field_type, field_instance))
+
+ # Set the example as appropriate
+ example = field_instance
+ if arraylen >= 0:
+ example = []
+ elif field_type not in atomics:
+ example = {}
+ examples.append(str(example))
+
+ # Add pseudo constants names and values filtering members
+ attributes = inspect.getmembers(instance)
+ for attribute in attributes:
+ if (
+ attribute[0] not in instance.__slots__
+ and not attribute[0].startswith("_")
+ and not inspect.isroutine(attribute[1])
+ ):
+ constnames.append(str(attribute[0]))
+ constvalues.append(str(attribute[1]))
+
+ typedef = {
+ "type": _type_name_from_instance(instance),
+ "fieldnames": fieldnames,
+ "fieldtypes": fieldtypes,
+ "fieldarraylen": fieldarraylen,
+ "examples": examples,
+ "constnames": constnames,
+ "constvalues": constvalues,
+ }
+
+ return typedef
+
+
+def _get_special_typedef(type):
+ example = None
+ if type == "time" or type == "duration":
+ example = {
+ "type": type,
+ "fieldnames": ["secs", "nsecs"],
+ "fieldtypes": ["int32", "int32"],
+ "fieldarraylen": [-1, -1],
+ "examples": ["0", "0"],
+ "constnames": [],
+ "constvalues": [],
+ }
+ return example
+
+
+def _get_typedefs_recursive(type, typesseen):
+ """returns the type def for this type as well as the type defs for any fields within the type"""
+ if type in typesseen:
+ # Don't put a type if it's already been seen
+ return []
+
+ # Note that we have now seen this type
+ typesseen.append(type)
+
+ # Get the typedef for this type and make sure it's not None
+ typedef = get_typedef(type)
+
+ return _get_subtypedefs_recursive(typedef, typesseen)
+
+
+def _get_subtypedefs_recursive(typedef, typesseen):
+ if typedef is None:
+ return []
+
+ # Create the list of subtypes and get the typedefs for fields
+ typedefs = [typedef]
+ for fieldtype in typedef["fieldtypes"]:
+ typedefs = typedefs + _get_typedefs_recursive(fieldtype, typesseen)
+
+ return typedefs
+
+
+def _type_name(type, instance):
+ """given a short type, and an object instance of that type,
+ determines and returns the fully qualified type"""
+ # The fully qualified type of atomic and special types is just their original name
+ if type in atomics or type in specials:
+ return type
+
+ # If the instance is a list, then we can get no more information from the instance.
+ # However, luckily, the 'type' field for list types is usually already inflated to the full type.
+ if isinstance(instance, list):
+ return type
+
+ # Otherwise, the type will come from the module and class name of the instance
+ return _type_name_from_instance(instance)
+
+
+def _type_name_from_instance(instance):
+ mod = instance.__module__
+ type = mod[0 : mod.find(".")] + "/" + instance.__class__.__name__
+ return type
diff --git a/src/interface/rosbridge_suite/rosapi/src/rosapi/params.py b/src/interface/rosbridge_suite/rosapi/src/rosapi/params.py
new file mode 100644
index 000000000..2e88455ef
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/src/rosapi/params.py
@@ -0,0 +1,243 @@
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2012, Willow Garage, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the name of Willow Garage, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import fnmatch
+import threading
+from json import dumps, loads
+
+import rclpy
+from rcl_interfaces.msg import Parameter, ParameterType, ParameterValue
+from rcl_interfaces.srv import ListParameters
+from ros2node.api import get_absolute_node_name
+from ros2param.api import call_get_parameters, call_set_parameters, get_parameter_value
+from rosapi.proxy import get_nodes
+
+""" Methods to interact with the param server. Values have to be passed
+as JSON in order to facilitate dynamically typed SRV messages """
+
+# Ensure thread safety for setting / getting parameters.
+param_server_lock = threading.RLock()
+_node = None
+_parent_node_name = ""
+
+_parameter_type_mapping = [
+ "",
+ "bool_value",
+ "integer_value",
+ "double_value",
+ "string_value",
+ "byte_array_value",
+ "bool_array_value",
+ "integer_array_value",
+ "double_array_value",
+ "string_array_value",
+]
+
+
+def init(parent_node_name):
+ """
+ Initializes params module with a rclpy.node.Node for further use.
+ This function has to be called before any other for the module to work.
+ """
+ global _node, _parent_node_name
+ # TODO(@jubeira): remove this node; use rosapi node with MultiThreadedExecutor or
+ # async / await to prevent the service calls from blocking.
+ parent_node_basename = parent_node_name.split("/")[-1]
+ param_node_name = f"{parent_node_basename}_params"
+ _node = rclpy.create_node(
+ param_node_name, cli_args=["--ros-args", "-r", f"__node:={param_node_name}"]
+ )
+ _parent_node_name = get_absolute_node_name(parent_node_name)
+
+
+def set_param(node_name, name, value, params_glob):
+ """Sets a parameter in a given node"""
+
+ if params_glob and not any(fnmatch.fnmatch(str(name), glob) for glob in params_glob):
+ # If the glob list is not empty and there are no glob matches,
+ # stop the attempt to set the parameter.
+ return
+ # If the glob list is empty (i.e. false) or the parameter matches
+ # one of the glob strings, continue to set the parameter.
+ d = None
+ try:
+ d = loads(value)
+ value = d if isinstance(d, str) else value
+ except ValueError:
+ raise Exception(
+ "Due to the type flexibility of the ROS parameter server, the value argument to set_param must be a JSON-formatted string."
+ )
+
+ node_name = get_absolute_node_name(node_name)
+ with param_server_lock:
+ _set_param(node_name, name, value)
+
+
+def _set_param(node_name, name, value, parameter_type=None):
+ """
+ Internal helper function for set_param.
+ Attempts to set the given parameter in the target node with the desired value,
+ deducing the parameter type if it's not specified.
+ parameter_type allows forcing a type for the given value; this is useful to delete parameters.
+ """
+ parameter = Parameter()
+ parameter.name = name
+ if parameter_type is None:
+ parameter.value = get_parameter_value(string_value=value)
+ else:
+ parameter.value = ParameterValue()
+ parameter.value.type = parameter_type
+ if parameter_type != ParameterType.PARAMETER_NOT_SET:
+ setattr(parameter.value, _parameter_type_mapping[parameter_type])
+
+ try:
+ # call_get_parameters will fail if node does not exist.
+ call_set_parameters(node=_node, node_name=node_name, parameters=[parameter])
+ except Exception:
+ pass
+
+
+def get_param(node_name, name, default, params_glob):
+ """Gets a parameter from a given node"""
+
+ if params_glob and not any(fnmatch.fnmatch(str(name), glob) for glob in params_glob):
+ # If the glob list is not empty and there are no glob matches,
+ # stop the attempt to get the parameter.
+ return
+ # If the glob list is empty (i.e. false) or the parameter matches
+ # one of the glob strings, continue to get the parameter.
+ if default != "":
+ try:
+ default = loads(default)
+ except ValueError:
+ pass # Keep default without modifications.
+
+ node_name = get_absolute_node_name(node_name)
+ with param_server_lock:
+ try:
+ # call_get_parameters will fail if node does not exist.
+ response = call_get_parameters(node=_node, node_name=node_name, parameter_names=[name])
+ pvalue = response.values[0]
+ # if type is 0 (parameter not set), the next line will raise an exception
+ # and return value shall go to default.
+ value = getattr(pvalue, _parameter_type_mapping[pvalue.type])
+ except Exception:
+ # If either the node or the parameter does not exist, return default.
+ value = default
+
+ return dumps(value)
+
+
+def has_param(node_name, name, params_glob):
+ """Checks whether a given node has a parameter or not"""
+
+ if params_glob and not any(fnmatch.fnmatch(str(name), glob) for glob in params_glob):
+ # If the glob list is not empty and there are no glob matches,
+ # stop the attempt to set the parameter.
+ return False
+ # If the glob list is empty (i.e. false) or the parameter matches
+ # one of the glob strings, check whether the parameter exists.
+ node_name = get_absolute_node_name(node_name)
+ with param_server_lock:
+ try:
+ response = call_get_parameters(node=_node, node_name=node_name, parameter_names=[name])
+ except Exception:
+ return False
+
+ return response.values[0].type > 0 and response.values[0].type < len(_parameter_type_mapping)
+
+
+def delete_param(node_name, name, params_glob):
+ """Deletes a parameter in a given node"""
+
+ if params_glob and not any(fnmatch.fnmatch(str(name), glob) for glob in params_glob):
+ # If the glob list is not empty and there are no glob matches,
+ # stop the attempt to delete the parameter.
+ return
+ # If the glob list is empty (i.e. false) or the parameter matches
+ # one of the glob strings, continue to delete the parameter.
+ node_name = get_absolute_node_name(node_name)
+ if has_param(node_name, name, params_glob):
+ with param_server_lock:
+ _set_param(node_name, name, None, ParameterType.PARAMETER_NOT_SET)
+
+
+def get_param_names(params_glob):
+ params = []
+ nodes = get_nodes()
+
+ for node in nodes:
+ params.extend(get_node_param_names(node, params_glob))
+
+ return params
+
+
+def get_node_param_names(node_name, params_glob):
+ """Gets list of parameter names for a given node"""
+ node_name = get_absolute_node_name(node_name)
+
+ with param_server_lock:
+ if params_glob:
+ # If there is a parameter glob, filter by it.
+ return list(
+ filter(
+ lambda x: any(fnmatch.fnmatch(str(x), glob) for glob in params_glob),
+ _get_param_names(node_name),
+ )
+ )
+ else:
+ # If there is no parameter glob, don't filter.
+ return _get_param_names(node_name)
+
+
+def _get_param_names(node_name):
+ # This method is called in a service callback; calling a service of the same node
+ # will cause a deadlock.
+ global _parent_node_name
+ if node_name == _parent_node_name:
+ return []
+
+ client = _node.create_client(ListParameters, f"{node_name}/list_parameters")
+
+ ready = client.wait_for_service(timeout_sec=5.0)
+ if not ready:
+ raise RuntimeError("Wait for list_parameters service timed out")
+
+ request = ListParameters.Request()
+ future = client.call_async(request)
+ rclpy.spin_until_future_complete(_node, future)
+ response = future.result()
+
+ if response is not None:
+ return [f"{node_name}:{param_name}" for param_name in response.result.names]
+ else:
+ return []
diff --git a/src/interface/rosbridge_suite/rosapi/src/rosapi/proxy.py b/src/interface/rosbridge_suite/rosapi/src/rosapi/proxy.py
new file mode 100644
index 000000000..c3bdbb4a0
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/src/rosapi/proxy.py
@@ -0,0 +1,260 @@
+#!/usr/bin/env python
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2012, Willow Garage, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the name of Willow Garage, Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+from ros2node.api import (
+ get_node_names,
+ get_publisher_info,
+ get_service_server_info,
+ get_subscriber_info,
+)
+from ros2service.api import get_service_names, get_service_names_and_types
+from ros2topic.api import get_topic_names, get_topic_names_and_types
+
+from .glob_helper import any_match, filter_globs
+
+_node = None
+
+
+def init(node):
+ """
+ Initializes proxy module with a rclpy.node.Node for further use.
+ This function has to be called before any other for the module to work.
+ """
+ global _node
+ _node = node
+
+
+def get_topics(topics_glob, include_hidden=False):
+ """Returns a list of all the active topics in the ROS system"""
+ topic_names = get_topic_names(node=_node, include_hidden_topics=include_hidden)
+ return filter_globs(topics_glob, topic_names)
+
+
+def get_topics_and_types(topics_glob, include_hidden=False):
+ return get_publications_and_types(
+ topics_glob, get_topic_names_and_types, include_hidden_topics=include_hidden
+ )
+
+
+def get_topics_for_type(topic_type, topics_glob, include_hidden=False):
+ topic_names_and_types = get_topic_names_and_types(
+ node=_node, include_hidden_topics=include_hidden
+ )
+ # topic[0] has the topic name and topic[1] has the type wrapped in a list.
+ topics_for_type = [topic[0] for topic in topic_names_and_types if topic[1][0] == topic_type]
+ return filter_globs(topics_glob, topics_for_type)
+
+
+def get_services(services_glob, include_hidden=False):
+ """Returns a list of all the services advertised in the ROS system"""
+ # Filter the list of services by whether they are public before returning.
+ service_names = get_service_names(node=_node, include_hidden_services=include_hidden)
+ return filter_globs(services_glob, service_names)
+
+
+def get_services_and_types(services_glob, include_hidden=False):
+ return get_publications_and_types(
+ services_glob,
+ get_service_names_and_types,
+ include_hidden_services=include_hidden,
+ )
+
+
+def get_services_for_type(service_type, services_glob, include_hidden=False):
+ """Returns a list of services as specific service type"""
+ # Filter the list of services by whether they are public before returning.
+ services_names_and_types = get_service_names_and_types(
+ node=_node, include_hidden_services=include_hidden
+ )
+ # service[0] has the topic name and service[1] has the type wrapped in a list.
+ services_for_type = [
+ service[0] for service in services_names_and_types if service[1][0] == service_type
+ ]
+ return filter_globs(services_glob, services_for_type)
+
+
+def get_publications_and_types(glob, getter_function, **include_hidden_publications):
+ """Generic getter function for both services and topics"""
+ publication_names_and_types = getter_function(node=_node, **include_hidden_publications)
+ # publication[0] has the publication name and publication[1] has the type wrapped in a list.
+ all_publications = [publication[0] for publication in publication_names_and_types]
+ filtered_publications = filter_globs(glob, all_publications)
+ filtered_publication_types = [
+ publication[1][0]
+ for publication in publication_names_and_types
+ if publication[0] in filtered_publications
+ ]
+ return filtered_publications, filtered_publication_types
+
+
+def get_nodes(include_hidden=False):
+ """Returns a list of all the nodes registered in the ROS system"""
+ node_names = get_node_names(node=_node, include_hidden_nodes=include_hidden)
+ full_names = [node_name.full_name for node_name in node_names]
+ return full_names
+
+
+def get_node_info(node_name, include_hidden=False):
+ node_names = get_node_names(node=_node, include_hidden_nodes=include_hidden)
+ if node_name in [n.full_name for n in node_names]:
+ # Only the name of each item is required as output.
+ subscribers = get_node_subscriptions(node_name)
+ publishers = get_node_publications(node_name)
+ services = get_node_services(node_name)
+
+ return subscribers, publishers, services
+
+
+def get_node_publications(node_name):
+ """Returns a list of topic names that are being published by the specified node"""
+ publishers = get_publisher_info(node=_node, remote_node_name=node_name)
+ return [publisher.name for publisher in publishers]
+
+
+def get_node_subscriptions(node_name):
+ """Returns a list of topic names that are being subscribed by the specified node"""
+ subscribers = get_subscriber_info(node=_node, remote_node_name=node_name)
+ return [subscriber.name for subscriber in subscribers]
+
+
+def get_node_services(node_name):
+ """Returns a list of service names that are being hosted by the specified node"""
+ services = get_service_server_info(node=_node, remote_node_name=node_name)
+ return [service.name for service in services]
+
+
+def get_node_service_types(node_name):
+ """Returns a list of service types that are being hosted by the specified node"""
+ services = get_service_server_info(node=_node, remote_node_name=node_name)
+ return [service.types[0] for service in services]
+
+
+def get_topic_type(topic, topics_glob):
+ """Returns the type of the specified ROS topic"""
+ # Note: this doesn't consider hidden topics.
+ topics, types = get_topics_and_types(topics_glob)
+ try:
+ return types[topics.index(topic)]
+ except ValueError:
+ # Return empty string if the topic is not present.
+ return ""
+
+
+def filter_action_servers(topics):
+ """Returns a list of action servers"""
+ # Note(@jubeira): filtering by topic should be enough; services can be taken into account as well.
+ action_servers = []
+ possible_action_server = ""
+ possibility = [0, 0]
+
+ action_topics = ["feedback", "status"]
+ for topic in sorted(topics):
+ split = topic.split("/")
+ if len(split) >= 4:
+ topic = split.pop()
+ action_prefix = split.pop()
+ if action_prefix != "_action":
+ continue
+
+ namespace = "/".join(split)
+ if possible_action_server != namespace:
+ possible_action_server = namespace
+ possibility = [0, 0]
+ if possible_action_server == namespace and topic in action_topics:
+ possibility[action_topics.index(topic)] = 1
+ if all(p == 1 for p in possibility):
+ action_servers.append(possible_action_server)
+ possibility = [0, 0]
+
+ return action_servers
+
+
+def get_service_type(service, services_glob):
+ """Returns the type of the specified ROS service,"""
+ # Note: this doesn't consider hidden services.
+ services, types = get_services_and_types(services_glob)
+ try:
+ return types[services.index(service)]
+ except ValueError:
+ # Return empty string if the service is not present.
+ return ""
+
+
+def get_channel_info(channel, channels_glob, getter_function, include_hidden=False):
+ """Returns a list of node names that are publishing / subscribing to the specified topic,
+ or advertising a given service."""
+ if any_match(str(channel), channels_glob):
+ channel_info_list = []
+ node_list = get_nodes(include_hidden)
+ for node in node_list:
+ channel_info = getter_function(node)
+ if channel in channel_info:
+ channel_info_list.append(node)
+ return channel_info_list
+ else:
+ return []
+
+
+def get_publishers(topic, topics_glob, include_hidden=False):
+ """Returns a list of node names that are publishing the specified topic"""
+ return get_channel_info(
+ topic, topics_glob, get_node_publications, include_hidden=include_hidden
+ )
+
+
+def get_subscribers(topic, topics_glob, include_hidden=False):
+ """Returns a list of node names that are subscribing to the specified topic"""
+ return get_channel_info(
+ topic, topics_glob, get_node_subscriptions, include_hidden=include_hidden
+ )
+
+
+def get_service_providers(queried_type, services_glob, include_hidden=False):
+ """Returns a list of node names that are advertising a service with the specified type"""
+ return get_channel_info(
+ queried_type,
+ services_glob,
+ get_node_service_types,
+ include_hidden=include_hidden,
+ )
+
+
+def get_service_node(queried_type, services_glob, include_hidden=False):
+ """Returns the name of the node that is providing the given service, or empty string"""
+ node_name = get_channel_info(
+ queried_type, services_glob, get_node_services, include_hidden=include_hidden
+ )
+ if node_name:
+ return node_name[0]
+ else:
+ return ""
diff --git a/src/interface/rosbridge_suite/rosapi/src/rosapi/stringify_field_types.py b/src/interface/rosbridge_suite/rosapi/src/rosapi/stringify_field_types.py
new file mode 100644
index 000000000..10d4288ec
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/src/rosapi/stringify_field_types.py
@@ -0,0 +1,33 @@
+from rosidl_adapter.parser import parse_message_string
+from rosidl_runtime_py import get_interface_path
+
+
+def stringify_field_types(root_type):
+ definition = ""
+ seen_types = set()
+ deps = [root_type]
+ is_root = True
+ while deps:
+ ty = deps.pop()
+ parts = ty.split("/")
+ if not is_root:
+ definition += "\n================================================================================\n"
+ definition += f"MSG: {ty}\n"
+ is_root = False
+
+ msg_name = parts[2] if len(parts) == 3 else parts[1]
+ interface_name = ty if len(parts) == 3 else f"{parts[0]}/msg/{parts[1]}"
+ with open(get_interface_path(interface_name), encoding="utf-8") as msg_file:
+ msg_definition = msg_file.read()
+ definition += msg_definition
+
+ spec = parse_message_string(parts[0], msg_name, msg_definition)
+ for field in spec.fields:
+ is_builtin = field.type.pkg_name is None
+ if not is_builtin:
+ field_ty = f"{field.type.pkg_name}/{field.type.type}"
+ if field_ty not in seen_types:
+ deps.append(field_ty)
+ seen_types.add(field_ty)
+
+ return definition
diff --git a/src/interface/rosbridge_suite/rosapi/test/__init__.py b/src/interface/rosbridge_suite/rosapi/test/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/interface/rosbridge_suite/rosapi/test/test_stringify_field_types.py b/src/interface/rosbridge_suite/rosapi/test/test_stringify_field_types.py
new file mode 100644
index 000000000..a1d43563e
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi/test/test_stringify_field_types.py
@@ -0,0 +1,155 @@
+#!/usr/bin/env python
+import unittest
+
+from rosapi.stringify_field_types import stringify_field_types
+from rosbridge_library.internal.ros_loader import InvalidModuleException
+
+
+class TestObjectUtils(unittest.TestCase):
+ def test_stringify_field_types(self):
+ self.maxDiff = None
+
+ self.assertRegex(
+ stringify_field_types("std_msgs/String"),
+ r"(?ms)^string data",
+ )
+
+ self.assertRegex(
+ stringify_field_types("std_msgs/msg/String"),
+ r"(?ms)^string data",
+ )
+
+ self.assertRegex(
+ stringify_field_types("std_msgs/ByteMultiArray"),
+ r"""(?s)
+MultiArrayLayout layout.*
+byte\[\] data.*
+
+================================================================================
+MSG: std_msgs/MultiArrayLayout
+.*
+MultiArrayDimension\[\] dim.*
+uint32 data_offset.*
+
+================================================================================
+MSG: std_msgs/MultiArrayDimension
+.*
+string label.*
+uint32 size.*
+uint32 stride.*
+""",
+ )
+ self.assertRegex(
+ stringify_field_types("sensor_msgs/Image"),
+ r"""(?s)
+std_msgs/Header header.*
+.*
+uint32 height.*
+uint32 width.*
+.*
+string encoding.*
+.*
+uint8 is_bigendian.*
+uint32 step.*
+uint8\[\] data.*
+
+================================================================================
+MSG: std_msgs/Header
+.*
+builtin_interfaces/Time stamp.*
+string frame_id
+
+================================================================================
+MSG: builtin_interfaces/Time
+.*
+int32 sec.*
+uint32 nanosec
+""",
+ )
+ self.assertRegex(
+ stringify_field_types("sensor_msgs/CameraInfo"),
+ r"""(?s)
+std_msgs/Header header.*
+uint32 height.*
+uint32 width.*
+string distortion_model.*
+float64\[\] d.*
+float64\[9\] k.*
+float64\[9\] r.*
+float64\[12\] p.*
+uint32 binning_x.*
+uint32 binning_y.*
+RegionOfInterest roi.*
+
+================================================================================
+MSG: sensor_msgs/RegionOfInterest
+.*
+uint32 x_offset.*
+uint32 y_offset.*
+uint32 height.*
+uint32 width.*
+bool do_rectify
+
+================================================================================
+MSG: std_msgs/Header
+.*
+builtin_interfaces/Time stamp.*
+string frame_id
+
+================================================================================
+MSG: builtin_interfaces/Time
+.*
+int32 sec.*
+uint32 nanosec
+""",
+ )
+
+ self.assertRegex(
+ stringify_field_types("shape_msgs/SolidPrimitive"),
+ r"""(?s)
+uint8 BOX=1.*
+uint8 SPHERE=2.*
+uint8 CYLINDER=3.*
+uint8 CONE=4.*
+uint8 type.*
+float64\[<=3\] dimensions.*
+uint8 BOX_X=0.*
+uint8 BOX_Y=1.*
+uint8 BOX_Z=2.*
+uint8 SPHERE_RADIUS=0.*
+uint8 CYLINDER_HEIGHT=0.*
+uint8 CYLINDER_RADIUS=1.*
+uint8 CONE_HEIGHT=0.*
+uint8 CONE_RADIUS=1.*
+""",
+ )
+
+ self.assertEqual(
+ stringify_field_types("geometry_msgs/Quaternion"),
+ """\
+# This represents an orientation in free space in quaternion form.
+
+float64 x 0
+float64 y 0
+float64 z 0
+float64 w 1
+""",
+ )
+
+ try:
+ self.assertEqual(
+ stringify_field_types("rmw_dds_common/NodeEntitiesInfo"),
+ """\
+string<=256 node_namespace
+string<=256 node_name
+Gid[] reader_gid_seq
+Gid[] writer_gid_seq
+
+================================================================================
+MSG: rmw_dds_common/Gid
+char[24] data
+""",
+ )
+ except InvalidModuleException:
+ # This message is not present on older ROS distributions
+ pass
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/CHANGELOG.rst b/src/interface/rosbridge_suite/rosapi_msgs/CHANGELOG.rst
new file mode 100644
index 000000000..fd75ceb30
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/CHANGELOG.rst
@@ -0,0 +1,25 @@
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Changelog for package rosapi_msgs
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+1.3.1 (2022-10-21)
+------------------
+
+1.3.0 (2022-08-16)
+------------------
+
+1.2.0 (2022-05-20)
+------------------
+* Added `/rosapi/get_ros_version` service (`#708 `_)
+* Contributors: Jacob Bandes-Storch, Kedus Mathewos
+
+1.1.2 (2022-01-03)
+------------------
+
+1.1.1 (2021-12-09)
+------------------
+
+1.1.0 (2021-10-22)
+------------------
+* Move msg/srv from rosapi and rosbridge_library into separate packages; enable Rolling in CI (`#665 `_)
+* Contributors: Jacob Bandes-Storch
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/CMakeLists.txt b/src/interface/rosbridge_suite/rosapi_msgs/CMakeLists.txt
new file mode 100644
index 000000000..477ab48e4
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/CMakeLists.txt
@@ -0,0 +1,39 @@
+cmake_minimum_required(VERSION 3.5)
+project(rosapi_msgs)
+
+find_package(ament_cmake_ros REQUIRED)
+find_package(builtin_interfaces REQUIRED)
+find_package(rosidl_default_generators REQUIRED)
+
+rosidl_generate_interfaces(${PROJECT_NAME}
+ msg/TypeDef.msg
+ srv/DeleteParam.srv
+ srv/GetActionServers.srv
+ srv/GetParam.srv
+ srv/GetParamNames.srv
+ srv/GetROSVersion.srv
+ srv/GetTime.srv
+ srv/HasParam.srv
+ srv/MessageDetails.srv
+ srv/Nodes.srv
+ srv/NodeDetails.srv
+ srv/Publishers.srv
+ srv/ServiceNode.srv
+ srv/ServiceProviders.srv
+ srv/ServiceRequestDetails.srv
+ srv/ServiceResponseDetails.srv
+ srv/Services.srv
+ srv/ServicesForType.srv
+ srv/ServiceType.srv
+ srv/SetParam.srv
+ srv/Subscribers.srv
+ srv/Topics.srv
+ srv/TopicsAndRawTypes.srv
+ srv/TopicsForType.srv
+ srv/TopicType.srv
+ DEPENDENCIES builtin_interfaces
+)
+
+ament_export_dependencies(builtin_interfaces rosidl_default_runtime)
+
+ament_package()
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/msg/TypeDef.msg b/src/interface/rosbridge_suite/rosapi_msgs/msg/TypeDef.msg
new file mode 100644
index 000000000..48a6f35da
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/msg/TypeDef.msg
@@ -0,0 +1,7 @@
+string type
+string[] fieldnames
+string[] fieldtypes
+int32[] fieldarraylen
+string[] examples
+string[] constnames
+string[] constvalues
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/package.xml b/src/interface/rosbridge_suite/rosapi_msgs/package.xml
new file mode 100644
index 000000000..bc2920e96
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/package.xml
@@ -0,0 +1,35 @@
+
+
+ rosapi_msgs
+ 1.3.1
+
+ Provides service calls for getting ros meta-information, like list of
+ topics, services, params, etc.
+
+
+ BSD
+
+ http://ros.org/wiki/rosapi
+ https://github.com/RobotWebTools/rosbridge_suite/issues
+ https://github.com/RobotWebTools/rosbridge_suite
+
+ Jonathan Mace
+ Jihoon Lee
+ Foxglove
+
+ ament_cmake_ros
+
+ rosidl_default_generators
+
+ builtin_interfaces
+
+ builtin_interfaces
+ rcl_interfaces
+ rosidl_default_runtime
+
+ rosidl_interface_packages
+
+
+ ament_cmake
+
+
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/DeleteParam.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/DeleteParam.srv
new file mode 100644
index 000000000..22a97d597
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/DeleteParam.srv
@@ -0,0 +1,2 @@
+string name
+---
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/GetActionServers.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/GetActionServers.srv
new file mode 100644
index 000000000..5a835e04b
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/GetActionServers.srv
@@ -0,0 +1,3 @@
+
+---
+string[] action_servers
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/GetParam.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/GetParam.srv
new file mode 100644
index 000000000..cdbf3fd17
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/GetParam.srv
@@ -0,0 +1,4 @@
+string name
+string default_value
+---
+string value
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/GetParamNames.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/GetParamNames.srv
new file mode 100644
index 000000000..536ee0c90
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/GetParamNames.srv
@@ -0,0 +1,2 @@
+---
+string[] names
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/GetROSVersion.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/GetROSVersion.srv
new file mode 100644
index 000000000..287420966
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/GetROSVersion.srv
@@ -0,0 +1,3 @@
+---
+uint8 version
+string distro
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/GetTime.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/GetTime.srv
new file mode 100644
index 000000000..285ad7443
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/GetTime.srv
@@ -0,0 +1,2 @@
+---
+builtin_interfaces/Time time
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/HasParam.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/HasParam.srv
new file mode 100644
index 000000000..210c81eab
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/HasParam.srv
@@ -0,0 +1,3 @@
+string name
+---
+bool exists
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/MessageDetails.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/MessageDetails.srv
new file mode 100644
index 000000000..722449676
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/MessageDetails.srv
@@ -0,0 +1,3 @@
+string type
+---
+TypeDef[] typedefs
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/NodeDetails.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/NodeDetails.srv
new file mode 100644
index 000000000..7de5d39a4
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/NodeDetails.srv
@@ -0,0 +1,5 @@
+string node
+---
+string[] subscribing
+string[] publishing
+string[] services
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/Nodes.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/Nodes.srv
new file mode 100644
index 000000000..3be5a63d1
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/Nodes.srv
@@ -0,0 +1,3 @@
+
+---
+string[] nodes
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/Publishers.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/Publishers.srv
new file mode 100644
index 000000000..baaa8e434
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/Publishers.srv
@@ -0,0 +1,3 @@
+string topic
+---
+string[] publishers
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceNode.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceNode.srv
new file mode 100644
index 000000000..ac516bd22
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceNode.srv
@@ -0,0 +1,3 @@
+string service
+---
+string node
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceProviders.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceProviders.srv
new file mode 100644
index 000000000..789dc0d4c
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceProviders.srv
@@ -0,0 +1,3 @@
+string service
+---
+string[] providers
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceRequestDetails.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceRequestDetails.srv
new file mode 100644
index 000000000..722449676
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceRequestDetails.srv
@@ -0,0 +1,3 @@
+string type
+---
+TypeDef[] typedefs
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceResponseDetails.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceResponseDetails.srv
new file mode 100644
index 000000000..722449676
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceResponseDetails.srv
@@ -0,0 +1,3 @@
+string type
+---
+TypeDef[] typedefs
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceType.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceType.srv
new file mode 100644
index 000000000..4c7e2ecaf
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServiceType.srv
@@ -0,0 +1,3 @@
+string service
+---
+string type
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/Services.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/Services.srv
new file mode 100644
index 000000000..5c44b4719
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/Services.srv
@@ -0,0 +1,3 @@
+
+---
+string[] services
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/ServicesForType.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServicesForType.srv
new file mode 100644
index 000000000..74085b0d3
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/ServicesForType.srv
@@ -0,0 +1,3 @@
+string type
+---
+string[] services
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/SetParam.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/SetParam.srv
new file mode 100644
index 000000000..426e15cec
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/SetParam.srv
@@ -0,0 +1,3 @@
+string name
+string value
+---
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/Subscribers.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/Subscribers.srv
new file mode 100644
index 000000000..cd893b4c9
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/Subscribers.srv
@@ -0,0 +1,3 @@
+string topic
+---
+string[] subscribers
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/TopicType.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/TopicType.srv
new file mode 100644
index 000000000..e08657a28
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/TopicType.srv
@@ -0,0 +1,3 @@
+string topic
+---
+string type
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/Topics.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/Topics.srv
new file mode 100644
index 000000000..32765ea15
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/Topics.srv
@@ -0,0 +1,4 @@
+
+---
+string[] topics
+string[] types
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/TopicsAndRawTypes.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/TopicsAndRawTypes.srv
new file mode 100644
index 000000000..12fb143a2
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/TopicsAndRawTypes.srv
@@ -0,0 +1,5 @@
+
+---
+string[] topics
+string[] types
+string[] typedefs_full_text
diff --git a/src/interface/rosbridge_suite/rosapi_msgs/srv/TopicsForType.srv b/src/interface/rosbridge_suite/rosapi_msgs/srv/TopicsForType.srv
new file mode 100644
index 000000000..4afeaed32
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosapi_msgs/srv/TopicsForType.srv
@@ -0,0 +1,3 @@
+string type
+---
+string[] topics
diff --git a/src/interface/rosbridge_suite/rosbridge_library/CHANGELOG.rst b/src/interface/rosbridge_suite/rosbridge_library/CHANGELOG.rst
new file mode 100644
index 000000000..0761255d3
--- /dev/null
+++ b/src/interface/rosbridge_suite/rosbridge_library/CHANGELOG.rst
@@ -0,0 +1,617 @@
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Changelog for package rosbridge_library
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+1.3.1 (2022-10-21)
+------------------
+* Optimized large binary array publishing (`#819 `_)
+* Skip unnecessary conversion for cbor/cbor-raw compression (`#792 `_) (`#800 `_)
+* Improve robustness for multiple client connections (`#803 `_)
+* Minor performance improvements (`#809 `_)
+* Remove unnecessary checking of topic globs. (`#793 `_) (`#799 `_)
+* Fix duplicate subscription created with wrong 'raw' attribute. (`#798