{"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\/de\/blog\/szenarien-erstellen-carla-scenic\/","title":{"rendered":"Erstellen von benutzerdefinierten Szenarien f\u00fcr CARLA mit Scenic"},"content":{"rendered":"<h2 class=\"wp-block-heading\">What is Scenic?<\/h2>\n\n\n\n<p>In der&nbsp;<a href=\"https:\/\/scenic-lang.readthedocs.io\/en\/latest\/index.html\">offiziellen Dokumentation<\/a>,&nbsp;<em>hei\u00dft es: \"Scenic ist eine dom\u00e4nenspezifische probabilistische Programmiersprache zur Modellierung der Umgebung von cyber-physischen Systemen wie Robotern und autonomen Fahrzeugen. Ein Scenic-Programm definiert eine Verteilung \u00fcber Szenen, Konfigurationen von physischen Objekten und Agenten; Stichproben aus dieser Verteilung ergeben konkrete Szenen, die simuliert werden k\u00f6nnen, um Trainings- oder Testdaten zu erzeugen. Scenic kann auch (probabilistische) Richtlinien f\u00fcr dynamische Agenten definieren, was die Modellierung von Szenarien erm\u00f6glicht, in denen Agenten im Laufe der Zeit als Reaktion auf den Zustand der Welt Aktionen ausf\u00fchren.\"<\/em><\/p>\n\n\n\n<p>Unser Hauptziel bei der Verwendung von Scenic ist der Entwurf von Szenarien - nicht die Datengenerierung. Dieser Blog-Beitrag befasst sich mit Scenic - einem praktischen und n\u00fctzlichen Tool, mit dem Sie festlegen k\u00f6nnen, wie Ihre virtuelle Umgebung aussehen soll. Genauer gesagt nutzen wir flexible M\u00f6glichkeiten, um Objekte in der Szene zu platzieren und benutzerdefinierte Eigenschaften in Scenic zu implementieren.<\/p>\n\n\n\n<p>Um Ihre eigene Verkehrssimulation mit Scenic zu erstellen, sind 5 Schritte zu beachten. Alle Schritte folgen einem Beispiel und setzen die Verwendung von CARLA voraus, einer Open-Source-Simulationsplattform, die die Entwicklung, das Training und die Validierung des autonomen Fahrens unterst\u00fctzt. Weitere Details finden Sie in dem Beitrag&nbsp;<a href=\"https:\/\/rocketloop.de\/de\/blog\/carla-autonomer-fahrsimulator\/\">Was ist CARLA und wie nutzt man es um autonomes Fahren zu simulieren?<\/a><\/p>\n\n\n\n<p>Schauen wir uns ein Beispiel eines \u00dcberholvorgangs an, um die Schritte in einer Verkehrssimulation mit Scenic zu sehen. Das autonome Fahrzeug, das wir in diesem Beitrag <em>ego vehicle<\/em> nennen, \u00fcberholt ein anderes Fahrzeug und wechselt zur\u00fcck auf seine urspr\u00fcngliche Fahrspur.<\/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\">Schritt 1: Platzieren von Autos in der Szene<\/h2>\n\n\n\n<p>Scenic bietet eine sehr flexible M\u00f6glichkeit, Objekte in der Welt zu platzieren. Der einfachste Weg dies zu tun ist die Erstellung von exakten Punkten, an denen das autonome Auto, oder wie wir es nennen, das<em>\u201cego vehicle\u201d,<\/em> platziert werden kann. Zum Beispiel: <code>Car at -50 @ 1.75<\/code>. Kurz gesagt, es werden Punkte definiert und Objekte auf diesen Punkten platziert. Die genauen Koordinaten f\u00fcr einen Punkt k\u00f6nnen direkt im UE4-Editor abgerufen werden oder indem man ein Scenic Skript ohne das Flag <code>--simulate<\/code> startet.<\/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-Sprache:<\/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\">Landschaftliche Ansicht nach dem Start des Skripts mit dem obigen Befehl. Das Ego-Fahrzeug ist durch das Auto mit dem Kegel gekennzeichnet. Sie k\u00f6nnen die Koordinaten von Ihrem Cursor in der unteren rechten Ecke sehen.<\/figcaption><\/figure>\n\n\n\n<p>Sie k\u00f6nnen sehen, dass die Koordinaten in der unteren rechten Ecke der Ansicht angezeigt werden. Dr\u00fccken Sie CTL+C, um die Ansicht zu schlie\u00dfen. Platzieren wir das ego vehicle an einem Punkt, der durch seine x- und y-Koordinaten definiert ist.<\/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-Sprache:<\/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>Nachdem das Ego Vehicle definiert ist, k\u00f6nnen andere Fahrzeuge einfacher platziert werden. Sie k\u00f6nnen relativ zum Ego Vehicle definiert werden, z. B. mit \"<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-Sprache:<\/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 ist sehr anschaulich und die nat\u00fcrliche Sprache macht es einfach zu verstehen, wie die Autos platziert sind.<\/p>\n\n\n\n<p>Der Zugriff auf eine bestimmte Stra\u00dfe\/Spur in Scenic ist m\u00f6glich, da das hinterliegende Netzwerk eine Dictionary-Struktur mit Schl\u00fcsseln und Werten hat. Wir verwenden einen&nbsp;<a href=\"https:\/\/odrviewer.io\/\">online OpenDRIVE viewer<\/a>&nbsp;, um die Stra\u00dfennamen schnell abzurufen und sie Variablen zuzuordnen.<\/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-Sprache:<\/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\">Schritt 2: Benutzerdefinierte Verhaltensweisen erstellen - Beispiel: \u00dcberholen<\/h2>\n\n\n\n<p>Sie k\u00f6nnen zwei weitere Zeilen in dem Codeblock sehen, in denen wir das Auto an einem bestimmten Punkt platziert haben.<\/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-Sprache:<\/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>In Zeile 2 wird das 3D-Modell des Fahrzeugs zugewiesen, ein sogenannter Blueprint (spezifisch f\u00fcr Unreal Engine 4). In Zeile 3 wird dem Auto ein Verhalten zugewiesen. Die so genannten Behaviors sind f\u00fcr die Aktionen verantwortlich, die ein Auto ausf\u00fchrt. Sie k\u00f6nnen grundlegende Verhaltensweisen wie<code>FollowLaneBehavior<\/code> und <code>FollowTrajectoryBehavior<\/code>direkt verwenden. F\u00fcr komplexere Verhaltensweisen m\u00fcssen Sie jedoch Ihre eigenen erstellen. Dies ist h\u00f6chstwahrscheinlich der Fall, wenn Sie eine Verkehrssimulation erstellen m\u00f6chten. Verhaltensweisen k\u00f6nnen mit dem Schl\u00fcsselwort&nbsp;<em>do<\/em>.<\/p>\n\n\n\n<p>Hier ein Beispiel daf\u00fcr, wie ein \u00dcberholverhalten implementiert werden kann.<\/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-Sprache:<\/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\">Schritt 3: Checkpoints setzen<\/h2>\n\n\n\n<p>Alle Fahrzeuge sind in der Szene platziert und die Verhaltensweisen sind definiert. Nun wollen wir die Verhaltensweisen kontrolliert ausl\u00f6sen. Dies gew\u00e4hrleistet eine konsistentere Art der Simulationen. Der Trigger, an dem ein Verhalten ausgel\u00f6st wird, ist genau definiert und reduziert das Risiko von unerw\u00fcnschten und zuf\u00e4lligen Verhaltensmustern w\u00e4hrend der Simulation. Beachten Sie, dass Scenic Simulationen zul\u00e4sst, die mehr oder weniger zuf\u00e4llig sind. Der Ausl\u00f6ser kann mit einem Punkt implementiert werden. Wir nennen ihn einen Checkpoint. F\u00fcr das vorgestellte Beispiel definieren wir die 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-Sprache:<\/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 k\u00f6nnen zum Beispiel ausgel\u00f6st werden, wenn das Auto nahe genug ist. Auch hier macht die nat\u00fcrliche Sprache von Scenic dies deutlich:<\/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-Sprache:<\/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>Fassen wir die bisher gecodeten Dinge zusammen. Verhaltensweisen, die nicht im Detail erw\u00e4hnt werden, sind h\u00f6chstwahrscheinlich integrierte Verhaltensweisen, die Sie direkt verwenden k\u00f6nnen.<\/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-Sprache:<\/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\">Schritt 4: Starten der Scenic Simulation<\/h2>\n\n\n\n<p class=\" translation-block\">Bei der Ausf\u00fchrung einer Scenic Simulation sucht Scenic lokal nach dem CARLA-Server. Weitere Informationen zur Einrichtung eines CARLA-Servers f\u00fcr den Fernzugriff finden Sie in unserem Blog-Beitrag \u201c<a href=\"https:\/\/rocketloop.de\/en\/blog\/carla-setup-remote-access\/\" target=\"_self\">Einrichten von CARLA auf einem Server f\u00fcr den Fernzugriff<\/a>\u201d.<\/p>\n\n\n\n<p>Um die Simulation auszuf\u00fchren, m\u00fcssen Sie Parameter entweder an die CLI oder direkt im Skript angeben. F\u00fcgen Sie oben in Ihrem Scenic-Skript Folgendes hinzu:<\/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-Sprache:<\/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>F\u00fcr Scenic-spezifische Parameter f\u00fchren Sie einfach <code>scenic --help<\/code> aus oder sehen Sie <a href=\"https:\/\/scenic-lang.readthedocs.io\/en\/latest\/options.html?highlight=parameter\">hier<\/a>F\u00fcr CARLA-spezifische Parameter sehen Sie sich die Tabelle <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\">hier<\/a>an. Nun k\u00f6nnen Sie Ihre Scenic-Simulation mit dem Flag <code>--simulate<\/code> starten. Es sollte ein Fenster mit der gerenderten Simulation erscheinen.<\/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\">Schritt 5: Aufnahme speichern (optional)<\/h2>\n\n\n\n<p class=\" translation-block\">Wir haben Scenic zus\u00e4tzliche Parameter hinzugef\u00fcgt, um eine Aufnahme direkt zu speichern. Die H\u00f6he und Breite des Fensters sind wichtige Parameter. Auch der Parameter timestep hatte einen erheblichen Einfluss auf die Simulation. F\u00fcr weitere Details empfehlen wir Ihnen unseren Blog-Beitrag \u201c<a href=\"https:\/\/rocketloop.de\/en\/blog\/video-capture-scenic-scenarios-carla\/\" target=\"_self\">Videoaufzeichnung von benutzerdefinierten Szenarien mit CARLA<\/a>\u201c zu lesen.<\/p>","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>","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\/de\/wp-json\/wp\/v2\/posts\/9793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/comments?post=9793"}],"version-history":[{"count":12,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/posts\/9793\/revisions"}],"predecessor-version":[{"id":11337,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/posts\/9793\/revisions\/11337"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/media\/10757"}],"wp:attachment":[{"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/media?parent=9793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/categories?post=9793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/tags?post=9793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}