Skip to content

Commit b94014c

Browse files
Merge pull request #146 from f1tenth/feature/trackgenUtils
Trackgen Track Saving
2 parents d661c00 + 31bc6d2 commit b94014c

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed

examples/random_trackgen.py

+15-9
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import matplotlib.pyplot as plt
3838
import numpy as np
3939
import shapely.geometry as shp
40+
from f1tenth_gym.envs.track import Track
4041

4142

4243
def main(args):
@@ -52,8 +53,9 @@ def main(args):
5253
while True:
5354
try:
5455
print(f"[info] creating track {i}")
55-
track, track_int, track_ext = create_track()
56-
convert_track(track, track_int, track_ext, i, outdir)
56+
WIDTH = 10.0
57+
track, track_int, track_ext = create_track(WIDTH)
58+
convert_track(track, track_int, track_ext, WIDTH, i, outdir)
5759
print(f"[info] saved track {i} in {outdir}/")
5860
break
5961
except Exception as _: # noqa: F841
@@ -62,13 +64,12 @@ def main(args):
6264
print()
6365

6466

65-
def create_track():
67+
def create_track(track_width):
6668
CHECKPOINTS = 16
6769
SCALE = 6.0
6870
TRACK_RAD = 900 / SCALE
6971
TRACK_DETAIL_STEP = 21 / SCALE
7072
TRACK_TURN_RATE = 0.31
71-
WIDTH = 10.0
7273

7374
start_alpha = 0.0
7475

@@ -183,15 +184,15 @@ def create_track():
183184
track_poly = shp.Polygon(track_xy)
184185

185186
# Finding interior and exterior walls
186-
track_xy_offset_in = track_poly.buffer(WIDTH)
187-
track_xy_offset_out = track_poly.buffer(-WIDTH)
187+
track_xy_offset_in = track_poly.buffer(track_width)
188+
track_xy_offset_out = track_poly.buffer(-track_width)
188189
track_xy_offset_in_np = np.array(track_xy_offset_in.exterior.xy).T
189190
track_xy_offset_out_np = np.array(track_xy_offset_out.exterior.xy).T
190191

191192
return track_xy, track_xy_offset_in_np, track_xy_offset_out_np
192193

193194

194-
def convert_track(track, track_int, track_ext, track_id, outdir):
195+
def convert_track(track, track_int, track_ext, track_width, track_id, outdir):
195196
# converts track to image and saves the centerline as waypoints
196197
fig, ax = plt.subplots()
197198
fig.set_size_inches(20, 20)
@@ -238,11 +239,16 @@ def convert_track(track, track_int, track_ext, track_id, outdir):
238239

239240
# Saving centerline as a csv
240241
centerline_filepath = outdir / f"map{track_id}_centerline.csv"
242+
x_m, y_m = xy_pixels[:, 0] * 0.05, xy_pixels[:, 1] * 0.05
241243
with open(centerline_filepath, "w") as waypoints_csv:
242-
waypoints_csv.write("#x,y\n")
244+
waypoints_csv.write("# x_m, y_m, w_tr_right_m, w_tr_left_m\n")
243245
for row in xy_pixels:
244-
waypoints_csv.write(f"{0.05 * row[0]}, {0.05 * row[1]}\n")
246+
waypoints_csv.write(f"{0.05 * row[0]}, {0.05 * row[1]}, {track_width}, {track_width}\n")
245247

248+
raceline_format = Track.from_refline(x=x_m, y=y_m, velx=np.ones_like(x_m) * 4.0)
249+
raceline_format.spec.name = f"map{track_id}"
250+
raceline_format.save_raceline(outdir)
251+
print(f"[info] saved centerline in {centerline_filepath}")
246252

247253
if __name__ == "__main__":
248254
import argparse

f1tenth_gym/envs/track/track.py

+41
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from __future__ import annotations
2+
import time
3+
import uuid
24
import pathlib
35
from dataclasses import dataclass
46
from typing import Tuple, Optional
@@ -315,6 +317,45 @@ def from_refline(x: np.ndarray, y: np.ndarray, velx: np.ndarray):
315317
centerline=refline,
316318
)
317319

320+
def save_raceline(self, outdir: pathlib.Path):
321+
"""
322+
Save track raceline.
323+
324+
Parameters
325+
----------
326+
outdir : pathlib.Path
327+
output directory
328+
"""
329+
raceline_filepath = outdir / f"{self.spec.name}_raceline.csv"
330+
with open(raceline_filepath, "w") as raceline_csv:
331+
raceline_csv.write("# " + str(uuid.uuid4()) + "\n") # same as TUM opt
332+
raceline_csv.write('# {}\n'.format(time.strftime('%Y-%m-%d %H:%M:%S'))) # TUM opt uses ggv hash, but no ggv here
333+
raceline_csv.write("# s_m; x_m; y_m; psi_rad; kappa_radpm; vx_mps; ax_mps2\n")
334+
for i in range(len(self.raceline.ss)):
335+
raceline_csv.write(
336+
f"{self.raceline.ss[i]}; {self.raceline.xs[i]}; {self.raceline.ys[i]}; {self.raceline.yaws[i]}; {self.raceline.ks[i]}; {self.raceline.vxs[i]}; {self.raceline.axs[i]}\n"
337+
)
338+
339+
def save_centerline(self, outdir: pathlib.Path, half_width: float):
340+
"""
341+
Save track raceline.
342+
343+
Parameters
344+
----------
345+
outdir : pathlib.Path
346+
output directory
347+
half_width : float
348+
half width of the track
349+
"""
350+
raceline_filepath = outdir / f"{self.spec.name}_raceline.csv"
351+
with open(raceline_filepath, "w") as raceline_csv:
352+
raceline_csv.write("# " + str(uuid.uuid4()) + "\n") # same as TUM opt
353+
raceline_csv.write("# x_m, y_m, w_tr_right_m, w_tr_left_m\n")
354+
for i in range(len(self.centerline.ss)):
355+
raceline_csv.write(
356+
f"{self.centerline.xs[i]}, {self.centerline.ys[i]}, {half_width}, {half_width}\n"
357+
)
358+
318359
def frenet_to_cartesian(self, s, ey, ephi, use_raceline=False):
319360
"""
320361
Convert Frenet coordinates to Cartesian coordinates.

0 commit comments

Comments
 (0)