Place Cones on Formula Student Skidpad Track Using Simulation 3D Animation Functions
This example shows how to use a Simulink® model and Simulink® 3D Animation™ functions to place cones on the outline of a Formula Student skidpad track from sets of x- and y-coordinates. The Simulink model skidpadcourse.slx
contains a Simulation 3D Scene Configuration block that creates a 3D environment and a Simulation 3D Actor (Simulink 3D Animation) block that executes the custom skidpad_cone_placement.m
script. The script creates the track actor and the cone actors.
For an example that simulates a Formula Student Vehicle on a Formula Student skidpad track, see Generate Skidpad Test.
Open Model
Open the Simulink model.
open_system("skidpadcourse.slx");
Simulink 3D Scene Configuration Block Configuration
The Simulation 3D Scene Configuration block parameters for this example are preset to these values.
Parameter | Value |
---|---|
Scene source |
|
Scene name |
|
Scene view |
|
Simulink 3D Actor Block Configuration
The Simulation 3D Actor block Initialization script is preset to the skidpadConePlacement.m
script. The sections in this example detail the procedure defined in the script for creating the track, assigning cone coordinates for specific cone types, and creating the cones.
Assign Cone Locations
The track in this example is formed using two concentric circles. You need cone locations for these track paths:
Entry path
Right inner and outer ring paths
Left inner and outer ring paths
Exit path
Timekeeping line
The cone x- and y-coordinates used in this example are determined by Formula Student scenario specifications. You can specify your own sets of x- and y-coordinates for your specific track.
Entry Path Cone Locations
Define the array entryConesLoc
with the cone x- and y-coordinates for the entry path. Use the fliplr
function to account for the Unreal Game® engine coordinates.
dbtype skidpadConePlacement.m 1:9;
1 entryWidth =3.453; 2 conesZ0 = 0; 3 4 entryConesLoc = [entryWidth/2 -12;... 5 -entryWidth/2 -12;... 6 -entryWidth/2 -10;... 7 entryWidth/2 -10]; 8 9 entryConesLoc= fliplr(entryConesLoc); % account for game engine coords
Right Inner and Outer Ring Locations
Define the arrays rightInnerRingLoc
and rightOuterRingLoc
with the cone x- and y-coordinates for the right inner and outer ring paths, respectively. Use the fliplr
function to account for the Unreal Game engine coordinates.
dbtype skidpadConePlacement.m 11:45;
11 rightInnerRingLoc = [entryWidth/2 0;...%1 12 4.58/2 -2.834;...%2 13 7.787/2 -5.231;...%3 14 12.588/2 -6.835;...%4 15 18.25/2 -7.398;...%5 16 23.912/2 -6.835;...%6 17 28.713/2 -5.231;...%7 18 31.92/2 -2.834;...%8 19 33.047/2 0;...%9 20 31.92/2 2.834;...%10 21 28.713/2 5.231;...%11 22 23.912/2 6.835;...%12 23 18.25/2 7.398;...%13 24 12.588/2 6.835;...%14 25 7.787/2 5.231;...%15 26 4.58/2 2.834;...%16 27 ]; 28 29 rightOuterRingLoc = [entryWidth/2 7.939;...% right side entry to exit zone 30 9.945/2 10.026;... 31 18.25/2 10.852;... 32 26.555/2 10.026;... 33 33.596/2 7.673;... 34 38.301/2 4.153;... 35 39.953/2 0;... 36 38.301/2 -4.153;... 37 33.596/2 -7.673;... 38 26.555/2 -10.026;... 39 18.25/2 -10.852;... 40 9.945/2 -10.026;... 41 entryWidth/2 -7.939;...% right side after entry zone 42 ]; 43 44 rightInnerRingLoc = fliplr(rightInnerRingLoc); 45 rightOuterRingLoc = fliplr(rightOuterRingLoc);
Left Inner and Outer Ring Locations
Define the arrays leftInnerRingLoc
and leftOuterRingLoc
with the cone x- and y-coordinates for the left inner and outer ring paths, respectively. Note that the left ring cone locations are symmetrical to the right ring cone locations.
dbtype skidpadConePlacement.m 47:48;
47 leftInnerRingLoc = rightInnerRingLoc.*[1 -1]; 48 leftOuterRingLoc = rightOuterRingLoc.*[1 -1];
Exit Cone Locations
Define the array exitConesLoc
with the cone x- and y-coordinates for the exit path. Use the fliplr
function to account for the Unreal Game engine coordinates.
dbtype skidpadConePlacement.m 50:60;
50 exitConesLoc = [entryWidth/2 16;... 51 -entryWidth/2 16;... 52 entryWidth/2-1 16;... 53 -entryWidth/2+1 16;... 54 -entryWidth/2 14;... 55 entryWidth/2 14;... 56 -entryWidth/2 12;... 57 entryWidth/2 12;... 58 -entryWidth/2 10;... 59 entryWidth/2 10]; 60 exitConesLoc= fliplr(exitConesLoc); % account for game engine coords
Timekeeping Line Cone Locations
Define the array timeConesLoc
with the cone x- and y-coordinates for the timekeeping line. Use the fliplr
function to account for the Unreal Game engine coordinates.
dbtype skidpadConePlacement.m 62:66;
62 timeConesLoc = [entryWidth/2 .5;... 63 -entryWidth/2 .5;... 64 entryWidth/2 -.5;... 65 -entryWidth/2 -.5]; 66 timeConesLoc = fliplr(timeConesLoc);
Assign Cone Types
Determine the type of cones to place on the track. This example uses these cones.
Cone Type | Track Path |
---|---|
Blue cones | Right outer ring Left inner ring |
Yellow cones | Right inner ring Left outer ring |
Small orange cones | Entry Exit |
Large orange cones | Timekeeping line |
Assign the arrays defined with the cone locations to variables that describe the cone types.
dbtype skidpadConePlacement.m 68:71;
68 blueCones = [rightOuterRingLoc; leftInnerRingLoc]; 69 yellowCones = [rightInnerRingLoc; leftOuterRingLoc]; 70 smallOrangeCones = [entryConesLoc; exitConesLoc]; 71 largeOrangeCones = timeConesLoc;
Create Formula Student Skidpad Track Using sim3d.Actor
and createShape
Functions
To create the Formula Student skidpad track, use the sim3d.Actor
(Simulink 3D Animation) function to instantiate an actor object. Using the createShape
(Simulink 3D Animation) function, build a 45 meter by 45 meter box shape for the actor object to represent the driving surface. Specify the vdynskidpad.png
image as the texture for the actor object to overlay on top of the box. The image was scaled to represent the typical lane markings of a Formula Student skidpad track. Finally, specify additional actor properties to define the track appearance.
dbtype skidpadConePlacement.m 73:83;
73 skidSurface = sim3d.Actor('ActorName','BaseSurface'); 74 createShape(skidSurface, 'box', [45,45,+0.03]); 75 skidSurface.Color = [68 68 71]./100; 76 skidSurface.Translation = [0 0 0]; 77 skidSurface.Texture = fullfile(pwd,"vdynskidpad.png"); 78 skidSurface.TextureTransform.Scale = [1 1]; 79 skidSurface.TextureTransform.Angle = 0; 80 skidSurface.Shininess = 0; 81 skidSurface.Transparency = 0; 82 skidSurface.TextureMapping.Blend = 1; 83 skidSurface.TextureMapping.Roughness = .8;
Add the actor object to the world.
dbtype skidpadConePlacement.m 85;
85 World.add(skidSurface,Actor);
Create and Place Cones on Track
Create cones to place on the track. This example uses assets from the Vehicle Dynamics Blockset Interface for Unreal Engine® Projects support package to set the appearance of the cone actors. The color of the cone is indicted by the name of the cone asset. For example, the SM_Cone.SM_Cone
asset is the default orange cone, and the SM_Cone_Blue.SM_Cone_Blue
asset is a blue cone.
To create the cones, use the sim3d.Actor
function to instantiate cone actors. Specify the 'Mesh'
name-value argument to define the path to the cone asset and the 'Scale'
name-value argument to define the cone size. Specify the 'Translation'
name-value argument to define the cone locations. Finally, specify additional actor properties to define the cone behavior.
The Vehicle Dynamics Blockset™ Interface for Unreal Engine Projects support package must be installed to access the cone assests. For more information, see Install Support Package and Configure Environment.
dbtype skidpadConePlacement.m 87:96;
87 nCones = length(largeOrangeCones); 88 for coneNum = 1:nCones 89 coneName = "LCone_" + num2str(coneNum); 90 conLoc = [largeOrangeCones(coneNum,:) conesZ0]; 91 cone = sim3d.Actor('ActorName',coneName,... 92 'Mesh','/Game/Environment/Industrial/Props/Cone/Mesh/SM_Cone.SM_Cone',... 93 'Mobility', sim3d.utils.MobilityTypes.Movable,... 94 'SimulatePhysics', true,... 95 'Translation',conLoc,... 96 'EnableGravity', true);
Add the actor object to the world.
dbtype skidpadConePlacement.m 97;
97 World.add(cone,Actor);
Repeat these steps for each cone type.
Run Animation
Run the animation. The model is configured to run for 30 seconds. If you want to adjust the animation length, change the Stop Time parameter value from the Simulation tab in the model.
sim("skidpadcourse.slx");
When you run the animation, view the track in the Simulation 3D Viewer. To navigate in the 3D environment, use keyboard shortcuts. For more information, see Programmatic Interaction (Simulink 3D Animation).
References
[1] FSG Competition Handbook 2024. 11 Dec. 2023, https://www.formulastudent.de/fileadmin/user_upload/all/2024/important_docs/FSG24_Competition_Handbook_v1.0.pdf.