UNC's entry to the Generalized Racing Intelligence Competition (GRAIC), which took first place at CPS-IoT Week 2021, ahead of entries from UIUC and Penn. Later adapted for GRAIC 2022.
GRAIC asks for a controller that drives a simulated vehicle around an unseen track scattered with obstacles, as fast as possible, without colliding or leaving the drivable area. Competitors do not get the track in advance, so the entry has to plan online from whatever the sensors report rather than following a route tuned offline.
The vehicle is driven by two ROS nodes.
A Voronoi-diagram planner, in C++ (src/VoronoiPlanner.cpp, src/planner_main.cpp).
Lane boundaries and detected obstacles arrive as line segments. The planner builds a
Voronoi roadmap over those segments, which by construction traces the paths that stay
maximally far from everything around them, and searches it for a route to the next
milestone. Clearance is tunable through allowed_obs_dist, so the racing line can be
pushed closer to obstacles when speed matters more than margin. Using the medial axis
this way means obstacle avoidance falls out of the geometry rather than needing a
separate avoidance behavior bolted on.
Decision and control, in Python (src/main.py). VehicleDecision subscribes to the
lane markers, waypoints and obstacle list, assembles the wall segments the planner needs,
and converts between the map frame and the vehicle's rear-axle frame. It fits circles
through the returned path to recover its curvature and derive a minimum turn radius,
which is what bounds how fast the car can take the line it was given. VehicleController
then tracks the plan, with predictive speed control and a safety check that projects the
rear axle's movement forward before committing to a command.
src/VoronoiPlanner.{h,cpp} Voronoi roadmap construction and path search
src/planner_main.cpp the planner ROS node
src/main.py VehicleDecision and VehicleController
src/baseline.py the competition's provided baseline, for comparison
msg/ VoronoiPlannerInput, VoronoiPlannerOutput, LineSegment
launch/race.launch brings up both nodes
The package is a ROS package named GoHeelsRacing. Build it in a catkin workspace
alongside the GRAIC competition stack, which supplies the graic_msgs messages and the
CARLA bridge, then:
roslaunch GoHeelsRacing race.launch
That starts the planner node and the main decision-and-control node together.
Abolfazl Karimi, with contributions from @Gheavenfl. Advisor: Parasara Sridhar Duggirala. UNC-Chapel Hill.
- unc-f1tenth — UNC's F1/10 entry, first place at CPS-IoT Week 2019.
- UnrealF1Tenth — Unreal Engine simulator for the F1/10 platform.