{"id":9793,"date":"2023-05-16T08:00:00","date_gmt":"2023-05-16T08:00:00","guid":{"rendered":"https:\/\/rocketloop.de\/?p=9793"},"modified":"2023-09-20T16:08:07","modified_gmt":"2023-09-20T16:08:07","slug":"creating-scenarios-carla-scenic","status":"publish","type":"post","link":"https:\/\/rocketloop.de\/en\/blog\/creating-scenarios-carla-scenic\/","title":{"rendered":"How to Create Custom Scenarios for CARLA using Scenic"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">What is Scenic?<\/h2>\n\n\n\n<p>According to the&nbsp;<a href=\"https:\/\/scenic-lang.readthedocs.io\/en\/latest\/index.html\">official documentation<\/a>,&nbsp;<em>&#8220;Scenic is a domain-specific probabilistic programming language for modeling the environments of cyber-physical systems like robots and autonomous cars. A Scenic program defines a distribution over scenes, configurations of physical objects and agents; sampling from this distribution yields concrete scenes which can be simulated to produce training or testing data. Scenic can also define (probabilistic) policies for dynamic agents, allowing modeling scenarios where agents take actions over time in response to the state of the world.&#8221;<\/em><\/p>\n\n\n\n<p>Our main goal with using Scenic is the design of Scenarios &#8211; not data generation. This blog post explores Scenic &#8211; a handy and beneficial tool for specifying what your virtual environment should look like. More specifically, we use flexible ways to place objects into the scene and implement custom characteristics in Scenic.<\/p>\n\n\n\n<p>To build your custom traffic simulation with Scenic, there are 5 steps to take care of. All of the steps follow an example and assume the usage of CARLA, an open-source simulation platform that supports the development, training, and validation of autonomous driving. For more details, check out the post on&nbsp;<a href=\"https:\/\/rocketloop.de\/en\/blog\/carla-autonomous-driving-simulator\/\">What is CARLA and How to Use it To Simulate Autonomous Driving.<\/a><\/p>\n\n\n\n<p>Let&#8217;s look at an example of overtaking to see the steps in a traffic simulation with Scenic. The autonomous car &#8211; which we&#8217;ll call <em>ego vehicle<\/em> in this post, overtakes another car and switches back to its original lane.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"555\" src=\"https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-data-2-1024x555.jpeg\" alt=\"\" class=\"wp-image-9908\" srcset=\"https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-data-2-1024x555.jpeg 1024w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-data-2-300x163.jpeg 300w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-data-2-768x417.jpeg 768w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-data-2-18x10.jpeg 18w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-data-2.jpeg 1226w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Placing Cars into the Scene<\/h2>\n\n\n\n<p>Scenic allows a very flexible way to place objects in the world. The easiest way to do this is the creation of exact Points where the autonomous car, or as we call the \u201c<em>ego vehicle,\u201d<\/em> can be placed. For example: <code>Car at -50 @ 1.75<\/code>. In short, Points are defined, and objects are placed onto those. The exact coordinates for a Point can be retrieved in the UE4 editor directly or by starting a scenic script without the <code>--simulate<\/code> flag.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">scenic<\/span> <span class=\"hljs-selector-tag\">my_traffic_sim<\/span><span class=\"hljs-selector-class\">.scenic<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"542\" src=\"https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/image-20220610-124846-1024x542.png\" alt=\"\" class=\"wp-image-9909\" srcset=\"https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/image-20220610-124846-1024x542.png 1024w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/image-20220610-124846-300x159.png 300w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/image-20220610-124846-768x407.png 768w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/image-20220610-124846-1536x814.png 1536w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/image-20220610-124846-18x10.png 18w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/image-20220610-124846.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Scenic view after starting the scenic script with the above command. The ego vehicle is denoted by the car with the cone. You can see the coordinates from your cursor in the bottom right corner.<\/figcaption><\/figure>\n\n\n\n<p>You can see that the coordinates are displayed in the bottom right corner of the view. Press CTL+C to close the view. Let&#8217;s place the ego vehicle at a Point defined by its x and y coordinates.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># my_traffic_sim.scenic<\/span>\n\nEGO_MODEL = <span class=\"hljs-string\">\"vehicle.audi.tt\"<\/span>\n\nego = Car at <span class=\"hljs-number\">-50<\/span> @ <span class=\"hljs-number\">1.75<\/span>,\n\twith blueprint EGO_MODEL,\n\twith behavior EgoBehavior()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>After the ego vehicle is defined, other cars can be placed more easily. They can be defined relative to the ego vehicle with, for example, &#8220;<em>ahead of<\/em>&#8220;<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CAR_1_MODEL = <span class=\"hljs-string\">\"vehicle.ford.mustang\"<\/span>\n\ncar_1 = Car ahead <span class=\"hljs-keyword\">of<\/span> ego by (<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">10<\/span>),\n    <span class=\"hljs-keyword\">with<\/span> blueprint CAR_1_MODEL,\n    <span class=\"hljs-keyword\">with<\/span> behavior Car1Behavior()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Scenic is very descriptive, and the natural language makes it easy to understand how the cars are placed.<\/p>\n\n\n\n<p>Accessing a specific road\/lane in Scenic is possible because the network has a dictionary structure with keys and values. We use an&nbsp;<a href=\"https:\/\/odrviewer.io\/\">online OpenDRIVE viewer<\/a>&nbsp;to quickly retrieve the names of the roads and assign them to variables.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># the network variable can be directly used without special initialization<\/span>\n\nroad4 = network.elements&#91;<span class=\"hljs-string\">'road4'<\/span>]\nroad7 = network.elements&#91;<span class=\"hljs-string\">'road7'<\/span>]\nroad2 = network.elements&#91;<span class=\"hljs-string\">'road2'<\/span>]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-rules-1024x576.png\" alt=\"\" class=\"wp-image-9910\" srcset=\"https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-rules-1024x576.png 1024w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-rules-300x169.png 300w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-rules-768x432.png 768w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-rules-18x10.png 18w, https:\/\/rocketloop.de\/wp-content\/uploads\/2023\/01\/carla-rules.png 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Create Custom Behaviors &#8211; Example: Overtaking<\/h2>\n\n\n\n<p>You can see two other lines in the code block where we placed the car at a specific point.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">car_1 = Car ahead <span class=\"hljs-keyword\">of<\/span> ego by (<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">10<\/span>),\n    <span class=\"hljs-keyword\">with<\/span> blueprint CAR_1_MODEL,\n    <span class=\"hljs-keyword\">with<\/span> behavior Car1Behavior()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Line 2 assigns the car&#8217;s 3D model, called a blueprint (Unreal Engine 4 specific). Line 3 assigns behavior to the car. The so-called behaviors are responsible for the actions a car takes. You can use basic behaviors directly, like<code>FollowLaneBehavior<\/code> and <code>FollowTrajectoryBehavior<\/code>. But for more complex behaviors, you need to build your own. This is most likely the case if you want to create a traffic simulation. Behaviors can be triggered with the keyword&nbsp;<em>do<\/em>.<\/p>\n\n\n\n<p>Here is an example of how overtaking behavior can be implemented.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">behavior Overtake(leadCar, target_speed, change_back_distance=<span class=\"hljs-number\">10<\/span>, is_oppositeTraffic=<span class=\"hljs-keyword\">False<\/span>):\n    <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n    leadCar: Car object of the leading car\n    target_speed: Integer of the target speed to overtake\n    change_back_distance: Integer of the distance after overtaking to change back to initial lane\n    is_oppositeTraffic: Boolean if there is opposite traffic\n    \"<\/span><span class=\"hljs-string\">\"\"<\/span>\n    <span class=\"hljs-comment\"># get the left lane of the current lane section<\/span>\n    leftLane = <span class=\"hljs-keyword\">self<\/span>.laneSection.laneToLeft\n    \n    <span class=\"hljs-comment\"># blink before overtaking<\/span>\n    take SetVehicleLightStateAction(VehicleLightState.LeftBlinker)\n    \n    <span class=\"hljs-comment\"># follow lane for 2 seconds<\/span>\n    <span class=\"hljs-keyword\">do<\/span> FollowLaneAndDoNotCollideWith(leadCar, target_speed=target_speed, is_oppositeTraffic=is_oppositeTraffic) <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-number\">2<\/span> seconds\n    \n    <span class=\"hljs-comment\"># change to left lane for overtaking and turn of the blinker<\/span>\n    <span class=\"hljs-keyword\">do<\/span> LaneChangeBehavior(laneSectionToSwitch=leftLane, target_speed=target_speed, is_oppositeTraffic=is_oppositeTraffic)\n    take SetVehicleLightStateAction(VehicleLightState.NONE)\n\n    <span class=\"hljs-comment\"># follow the overtaking lane until there is enough distance to the leading car, the car you want to overtake<\/span>\n    <span class=\"hljs-keyword\">do<\/span> FollowLaneBehavior(target_speed=target_speed, laneToFollow=leftLane.lane, is_oppositeTraffic=is_oppositeTraffic) \\\n        until (distance from ego to leadCar) &gt; change_back_distance\n    \n    <span class=\"hljs-comment\"># change back to the initial lane and set the right blinker<\/span>\n    take SetVehicleLightStateAction(VehicleLightState.RightBlinker)\n    <span class=\"hljs-keyword\">do<\/span> FollowLaneBehavior(target_speed=target_speed, laneToFollow=leftLane.lane, is_oppositeTraffic=is_oppositeTraffic) <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-number\">1<\/span> seconds\n    <span class=\"hljs-keyword\">if<\/span> is_oppositeTraffic:\n        rightLane = <span class=\"hljs-keyword\">self<\/span>.laneSection.laneToLeft\n    <span class=\"hljs-keyword\">else<\/span>:\n        rightLane = <span class=\"hljs-keyword\">self<\/span>.laneSection.laneToRight\n    <span class=\"hljs-keyword\">do<\/span> LaneChangeBehavior(laneSectionToSwitch=rightLane, target_speed=target_speed)\n    \n    <span class=\"hljs-comment\"># turn of blinker<\/span>\n    take SetVehicleLightStateAction(VehicleLightState.NONE)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 3: Setting Checkpoints<\/h2>\n\n\n\n<p>All cars are placed in the scene, and the behaviors are defined. Now, we want to trigger behaviors in a controlled manner. This assures a more consistent way of simulations. The trigger moment is well-defined, reducing the risk of unwanted and random observations during the simulation. Note that Scenic allows for simulations that are more or less random. The trigger can be implemented with a Point. We call it a Checkpoint. For the presented example, let&#8217;s define the checkpoints.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># checkpoint when to start overtaking<\/span>\nCHECKPOINT_1 = Point at <span class=\"hljs-number\">-320<\/span> @ <span class=\"hljs-number\">5.25<\/span>\n\n<span class=\"hljs-comment\"># this is needed to terminate the simulation<\/span>\nEGO_GOAL = Point at <span class=\"hljs-number\">-890<\/span> @ <span class=\"hljs-number\">5.25<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Checkpoints can be triggered, for example, whenever the car is close enough. Again, the natural language of Scenic makes it clear:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># example of how to use checkpoint to interrupt behaviors<\/span>\nbehavior ExampleBehavior():\n  <span class=\"hljs-keyword\">try<\/span>\n    <span class=\"hljs-comment\"># default behavior<\/span>\n    <span class=\"hljs-keyword\">do<\/span> ...\n  interrupt when (distance from <span class=\"hljs-keyword\">self<\/span> to CHECKPOINT_1) &lt;= <span class=\"hljs-number\">2<\/span>:\n    <span class=\"hljs-comment\"># default behavior is interrupted<\/span>\n    <span class=\"hljs-comment\"># self refers to the object this behavior is assigned to<\/span>\n    take ...\n    <span class=\"hljs-keyword\">do<\/span> ...\n\n<span class=\"hljs-comment\"># this terminates the simulation and is absolutetly required in the scenic script<\/span>\nterminate when (distance from ego to EGO_GOAL) &lt;= <span class=\"hljs-number\">2<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Let&#8217;s put together the things coded so far. Behaviors not mentioned in detail are most likely built-in behaviors you can use directly.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">### my_traffic_sim.scenic<\/span>\n\n<span class=\"hljs-comment\">## CAR MODELS AND MORE<\/span>\nEGO_MODEL = <span class=\"hljs-string\">\"vehicle.audi.tt\"<\/span>\n<span class=\"hljs-comment\"># it is not clear which unit the speed is given in but we think it is m\/s<\/span>\nEGO_SPEED = <span class=\"hljs-number\">10<\/span>\n\nCAR_1_MODEL = <span class=\"hljs-string\">\"vehicle.ford.mustang\"<\/span>\nCAR_1_SPEED = <span class=\"hljs-number\">10<\/span>\n\n<span class=\"hljs-comment\"># checkpoints<\/span>\nCHECKPOINT_1 = Point at <span class=\"hljs-number\">-320<\/span> @ <span class=\"hljs-number\">5.25<\/span>\nEGO_GOAL = Point at <span class=\"hljs-number\">-890<\/span> @ <span class=\"hljs-number\">5.25<\/span>\nCAR_1_GOAL = Point at <span class=\"hljs-number\">-360<\/span> @ <span class=\"hljs-number\">5.25<\/span> \n\n\n<span class=\"hljs-comment\"># define the ego trajectory that is followed<\/span>\nroad4 = network.elements&#91;<span class=\"hljs-string\">'road4'<\/span>]\nroad7 = network.elements&#91;<span class=\"hljs-string\">'road7'<\/span>]\nroad2 = network.elements&#91;<span class=\"hljs-string\">'road2'<\/span>]\nego_trajectory = &#91;road4.lanes&#91;<span class=\"hljs-number\">1<\/span>], road7.lanes&#91;<span class=\"hljs-number\">0<\/span>], road2.lanes&#91;<span class=\"hljs-number\">0<\/span>]]\n\n<span class=\"hljs-comment\">## BEHAVIORS<\/span>\nbehavior FollowLaneAndDoNotCollideWith(leadCar, target_speed=<span class=\"hljs-number\">10<\/span>, speedier_threshold=<span class=\"hljs-number\">15<\/span>, speed_threshold=<span class=\"hljs-number\">12<\/span>, brake_threshold = <span class=\"hljs-number\">7<\/span>, is_oppositeTraffic=<span class=\"hljs-keyword\">False<\/span>):\n  <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n  leadCar: Car object of the leading car\n  target_speed: Integer of the target speed to overtake\n  speedier_treshold: Integer of distance to lead car (far away)\n  speed_threshold: Integer of distance to lead car (closer)\n  brake_treshold: Integer of distance to lead car (too close)\n  is_oppositeTraffic: Boolean if there is opposite traffic\n  \"<\/span><span class=\"hljs-string\">\"\"<\/span>\n  <span class=\"hljs-keyword\">try<\/span>:\n      <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"The fast xor furious!\"<\/span>)\n      <span class=\"hljs-keyword\">do<\/span> FollowLaneBehavior(target_speed=target_speed, is_oppositeTraffic=is_oppositeTraffic)\n  interrupt when (distance from <span class=\"hljs-keyword\">self<\/span> to leadCar) &lt;= speedier_threshold:\n      <span class=\"hljs-keyword\">try<\/span>:\n          <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"What a sloth in front of me!\"<\/span>)\n          <span class=\"hljs-keyword\">do<\/span> FollowLaneBehavior(target_speed=leadCar.speed + <span class=\"hljs-number\">1<\/span>, is_oppositeTraffic=is_oppositeTraffic) until (distance from <span class=\"hljs-keyword\">self<\/span> to leadCar) &gt; speedier_threshold\n      interrupt when (distance from <span class=\"hljs-keyword\">self<\/span> to leadCar) &lt;= speed_threshold:\n          <span class=\"hljs-keyword\">try<\/span>:\n              <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"I'll better go as fast as this snail!\"<\/span>)\n              <span class=\"hljs-keyword\">do<\/span> FollowLaneBehavior(target_speed=leadCar.speed, is_oppositeTraffic=is_oppositeTraffic) until (distance from <span class=\"hljs-keyword\">self<\/span> to leadCar) &gt; speed_threshold + <span class=\"hljs-number\">2<\/span>\n          interrupt when (distance from <span class=\"hljs-keyword\">self<\/span> to leadCar) &lt;= brake_threshold:\n              <span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">\"Ooof, I must brake! Out of the way!\"<\/span>)\n              brake_intensity = min(max(math.exp(<span class=\"hljs-number\">-0.1535<\/span> * (distance to leadCar)), <span class=\"hljs-number\">0<\/span>), <span class=\"hljs-number\">1<\/span>)\n              take SetBrakeAction(brake_intensity)\n              take SetThrottleAction(<span class=\"hljs-number\">0.0<\/span>)\n\nbehavior Overtake(leadCar, target_speed, change_back_distance=<span class=\"hljs-number\">10<\/span>, is_oppositeTraffic=<span class=\"hljs-keyword\">False<\/span>):\n  <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n  leadCar: Car object of the leading car\n  target_speed: Integer of the target speed to overtake\n  change_back_distance: Integer of the distance after overtaking to change back to initial lane\n  is_oppositeTraffic: Boolean if there is opposite traffic\n  \"<\/span><span class=\"hljs-string\">\"\"<\/span>\n  <span class=\"hljs-comment\"># get the left lane of the current lane section<\/span>\n  leftLane = <span class=\"hljs-keyword\">self<\/span>.laneSection.laneToLeft\n  \n  <span class=\"hljs-comment\"># blink before overtaking<\/span>\n  take SetVehicleLightStateAction(VehicleLightState.LeftBlinker)\n  \n  <span class=\"hljs-comment\"># follow lane for 2 seconds<\/span>\n  <span class=\"hljs-keyword\">do<\/span> FollowLaneAndDoNotCollideWith(leadCar, target_speed=target_speed, is_oppositeTraffic=is_oppositeTraffic) <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-number\">2<\/span> seconds\n  \n  <span class=\"hljs-comment\"># change to left lane for overtaking and turn of the blinker<\/span>\n  <span class=\"hljs-keyword\">do<\/span> LaneChangeBehavior(laneSectionToSwitch=leftLane, target_speed=target_speed, is_oppositeTraffic=is_oppositeTraffic)\n  take SetVehicleLightStateAction(VehicleLightState.NONE)\n\n  <span class=\"hljs-comment\"># follow the overtaking lane until there is enough distance to the leading car, the car you want to overtake<\/span>\n  <span class=\"hljs-keyword\">do<\/span> FollowLaneBehavior(target_speed=target_speed, laneToFollow=leftLane.lane, is_oppositeTraffic=is_oppositeTraffic) \\\n      until (distance from ego to leadCar) &gt; change_back_distance\n  \n  <span class=\"hljs-comment\"># change back to the initial lane and set the right blinker<\/span>\n  take SetVehicleLightStateAction(VehicleLightState.RightBlinker)\n  <span class=\"hljs-keyword\">do<\/span> FollowLaneBehavior(target_speed=target_speed, laneToFollow=leftLane.lane, is_oppositeTraffic=is_oppositeTraffic) <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-number\">1<\/span> seconds\n  <span class=\"hljs-keyword\">if<\/span> is_oppositeTraffic:\n      rightLane = <span class=\"hljs-keyword\">self<\/span>.laneSection.laneToLeft\n  <span class=\"hljs-keyword\">else<\/span>:\n      rightLane = <span class=\"hljs-keyword\">self<\/span>.laneSection.laneToRight\n  <span class=\"hljs-keyword\">do<\/span> LaneChangeBehavior(laneSectionToSwitch=rightLane, target_speed=target_speed)\n  \n  <span class=\"hljs-comment\"># turn of blinker<\/span>\n  take SetVehicleLightStateAction(VehicleLightState.NONE)\n\nbehavior Car1Behavior():\n  <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n  car1 follows the same trajectory as the ego vehicle and slows down after the goal is reached\n  \"<\/span><span class=\"hljs-string\">\"\"<\/span>\n  take SetSpeedAction(<span class=\"hljs-number\">10<\/span>)\n  <span class=\"hljs-keyword\">do<\/span> FollowTrajectoryBehavior(trajectory= ego_trajectory, target_speed=CAR_1_SPEED) until (distance from <span class=\"hljs-keyword\">self<\/span> to CAR_1_GOAL) &lt;= <span class=\"hljs-number\">2<\/span>\n  <span class=\"hljs-keyword\">do<\/span> FollowLaneBehavior(target_speed=<span class=\"hljs-number\">5<\/span>)\n    \nbehavior EgoBehavior():\n  <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n  the ego vehicle follows its trajectory and overtakes after checkpoint 1 is reached\n  \"<\/span><span class=\"hljs-string\">\"\"<\/span>\n  take SetSpeedAction(<span class=\"hljs-number\">10<\/span>)\n  <span class=\"hljs-keyword\">try<\/span>:\n      <span class=\"hljs-keyword\">do<\/span> FollowTrajectoryBehavior(trajectory=ego_trajectory, target_speed=EGO_SPEED, turn_speed=EGO_SPEED)\n  interrupt when (distance from <span class=\"hljs-keyword\">self<\/span> to CHECKPOINT_1) &lt;= <span class=\"hljs-number\">2<\/span>:\n      take SetVehicleLightStateAction(VehicleLightState.NONE)\n      <span class=\"hljs-keyword\">do<\/span> Overtake(car_1, target_speed=EGO_SPEED*<span class=\"hljs-number\">1.2<\/span>, is_oppositeTraffic=<span class=\"hljs-keyword\">False<\/span>, change_back_distance=<span class=\"hljs-number\">10<\/span>)\n      FollowLaneBehavior(target_speed=EGO_SPEED)\n\n<span class=\"hljs-comment\">## DEFINE CARS<\/span>\nego = Car at <span class=\"hljs-number\">-50<\/span> @ <span class=\"hljs-number\">1.75<\/span>,\n  with blueprint EGO_MODEL,\n  with behavior EgoBehavior()\n\t\ncar_1 = Car ahead of ego by (<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">10<\/span>),\n  with blueprint CAR_1_MODEL,\n  with behavior Car1Behavior()\n  \n<span class=\"hljs-comment\"># terminate condition<\/span>\nterminate when (distance from ego to EGO_GOAL) &lt;= <span class=\"hljs-number\">2<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 4: Start Scenic Simulation<\/h2>\n\n\n\n<p>When running a scenic simulation, Scenic looks for the CARLA ports locally. Please, refer to our blog post &#8220;<a href=\"https:\/\/rocketloop.de\/en\/blog\/carla-setup-remote-access\/\">How to set up CARLA on a Server for Remote Access<\/a>&#8221; for more details on how to set up a CARLA server for remote access.<\/p>\n\n\n\n<p>To run the simulation, you need to provide parameters either to the CLI or directly in the scenic script. Add the following to the top of your Scenic script:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## SET MAP AND MODEL<\/span>\n<span class=\"hljs-comment\"># required<\/span>\nparam map = localPath(<span class=\"hljs-string\">'..\/to\/opendrive_map.xodr'<\/span>)\nparam carla_map = <span class=\"hljs-string\">'name of your carla map'<\/span>\nmodel scenic.simulators.carla.model\n\n<span class=\"hljs-comment\"># optional<\/span>\nparam timestep = <span class=\"hljs-number\">0.02<\/span>\nparam timeout = <span class=\"hljs-number\">20<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For Scenic specific parameters, simply run <code>scenic --help<\/code> or have a look <a href=\"https:\/\/scenic-lang.readthedocs.io\/en\/latest\/options.html?highlight=parameter\">here<\/a>. For CARLA-specific parameters, have a look at the table <a href=\"https:\/\/carla.readthedocs.io\/en\/0.9.12\/tuto_G_scenic\/#:~:text=Below%20is%20a%20table%20of%20configurable%20parameters%20in%20the%20CARLA%20model%3A\">here<\/a>. Now you can start your Scenic simulation with the <code>--simulate<\/code> flag. A window of the rendered simulation should appear.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">scenic path\/to\/my_simulation.scenic --simulate<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"578\" src=\"https:\/\/rocketloop.de\/wp-content\/uploads\/2022\/08\/carla-turning-video-1024x578.gif\" alt=\"\" class=\"wp-image-10274\" srcset=\"https:\/\/rocketloop.de\/wp-content\/uploads\/2022\/08\/carla-turning-video-1024x578.gif 1024w, https:\/\/rocketloop.de\/wp-content\/uploads\/2022\/08\/carla-turning-video-300x169.gif 300w, https:\/\/rocketloop.de\/wp-content\/uploads\/2022\/08\/carla-turning-video-768x434.gif 768w, https:\/\/rocketloop.de\/wp-content\/uploads\/2022\/08\/carla-turning-video-18x10.gif 18w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Save Recording (Optional)<\/h2>\n\n\n\n<p>We added additional parameters to Scenic to directly save a recording. The height and width of the window are important parameters. The parameter timestep also had a significant influence on the simulation. For more details, we encourage you to read our blog post, &#8220;<a href=\"https:\/\/rocketloop.de\/en\/blog\/video-capture-scenic-scenarios-carla\/\">How to Capture a Video of Custom Scenic Scenarios with CARLA.<\/a> &#8220;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>According to the official documentation, &#8220;Scenic is a domain-specific probabilistic programming language for modeling the environments of cyber-physical systems like robots and autonomous cars. A Scenic program defines a distribution over scenes&#8230;<\/p>\n","protected":false},"author":4,"featured_media":10757,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_seopress_robots_primary_cat":"none","footnotes":""},"categories":[54],"tags":[],"class_list":["post-9793","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-carla-simulator"],"acf":[],"_links":{"self":[{"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/posts\/9793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/comments?post=9793"}],"version-history":[{"count":12,"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/posts\/9793\/revisions"}],"predecessor-version":[{"id":11337,"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/posts\/9793\/revisions\/11337"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/media\/10757"}],"wp:attachment":[{"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/media?parent=9793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/categories?post=9793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rocketloop.de\/en\/wp-json\/wp\/v2\/tags?post=9793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}