{"id":9795,"date":"2023-05-23T08:00:00","date_gmt":"2023-05-23T08:00:00","guid":{"rendered":"https:\/\/rocketloop.de\/?p=9795"},"modified":"2023-09-20T16:07:54","modified_gmt":"2023-09-20T16:07:54","slug":"video-capture-scenic-scenarios-carla","status":"publish","type":"post","link":"https:\/\/rocketloop.de\/de\/blog\/videoaufzeichnung-scenic-szenarien-carla\/","title":{"rendered":"Videoaufzeichnung von benutzerdefinierten Szenarien mit CARLA"},"content":{"rendered":"<p class=\" translation-block\">In diesem Blog-Beitrag zeigen wir Ihnen, wie Sie ein Video von einer <a href=\"https:\/\/scenic-lang.readthedocs.io\/en\/1.x\/quickstart.html\" target=\"_self\">Scenic<\/a>-Szene aufnehmen k\u00f6nnen. Wenn Sie mehr \u00fcber die Scenic-Bibliothek erfahren m\u00f6chten, finden Sie weitere Informationen in unserem vorherigen Blog-Beitrag \u201c<a href=\"https:\/\/rocketloop.de\/en\/blog\/creating-scenarios-carla-scenic\/\" target=\"_self\">Erstellen von benutzerdefinierten Szenarien f\u00fcr CARLA mit Scenic<\/a>\u201c. Der Prozess der Videoaufzeichnung in Scenic erwies sich als schwieriger als erwartet, so dass wir \u00c4nderungen vornehmen und die Bibliothek forken mussten. Sie k\u00f6nnen sich unseren Fork <a href=\"https:\/\/gitlab.com\/rocketloop\/hella-aglaia\/Scenic\/-\/tree\/master\" target=\"_self\">hier<\/a> ansehen. Es ist wichtig zu beachten, dass der in diesem Blogbeitrag erw\u00e4hnte Code nur mit unserem Fork kompatibel sein kann.<\/p>\n\n\n\n<p>In diesem Blogbeitrag zeigen wir Ihnen die Schritte, die wir befolgt haben, um erfolgreich ein Video mit Scenic aufzunehmen, einschlie\u00dflich der \u00c4nderungen, die wir an der Bibliothek vornehmen mussten. Indem wir unsere Erfahrungen und die Lektionen, die wir auf diesem Weg gelernt haben, mit Ihnen teilen, bietet dieser Beitrag wertvolle Informationen sowohl f\u00fcr Anf\u00e4nger als auch f\u00fcr erfahrene Benutzer von Scenic. Unabh\u00e4ngig davon, ob Sie gerade erst anfangen oder die Funktionen von Scenic bereits erforscht haben, bietet dieser Beitrag Einblicke, die Ihnen helfen, das Beste aus Scenic herauszuholen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Herausforderungen bei der Aufzeichnung von Scenic Szenarien in CARLA<\/h2>\n\n\n\n<p>Theoretisch w\u00e4re es m\u00f6glich, einfach das Scenic-Skript auszuf\u00fchren und das Fenster aufzuzeichnen. Ein Nachteil dieses Ansatzes ist jedoch, dass er zu einer inkonsistenten oder unterdurchschnittlichen Bildrate f\u00fchren kann. Daher ist es vorteilhaft, die M\u00f6glichkeit zu haben, Frames mit einem festen Delta und variablen Frame-Zeiten zu rendern, um ein Video mit konstanten und anpassbaren fps zu produzieren. Um dies zu erreichen, m\u00fcssen wir die Bilder beim Rendern sammeln und an einen Videostream anh\u00e4ngen, der dann gespeichert werden kann.<\/p>\n\n\n\n<p>Diese Art der Videoaufzeichnung wird von Scenic (oder CARLA) nicht standardm\u00e4\u00dfig unterst\u00fctzt. Die Aufzeichnung eines \"Replays\" wird jedoch von Scenic unterst\u00fctzt, d.h. es kann eine Datei erzeugt werden, die Informationen \u00fcber die Positionen aller Akteure in der Szene f\u00fcr jeden relevanten Zeitpunkt speichert. Eine solche Datei kann dann in CARLA wiedergegeben werden. Unsere erste Idee war es, eine solche Datei zu erzeugen und dann einen einfachen Videorekorder zu programmieren, der diese Datei in CARLA mit einem festen Frame-Delta abspielt, die Bilder von einem Sensor in CARLA erh\u00e4lt und diese Bilder zu einem Video zusammensetzt.<\/p>\n\n\n\n<p>Obwohl das Konzept vielversprechend war, hat es letztendlich nicht die gew\u00fcnschten Ergebnisse geliefert. Offenbar f\u00fchrte die Wiederholung einer Wiedergabe in CARLA dazu, dass das Auto nicht die richtigen Bewegungsvektoren hatte. Wir vermuten, dass das Auto w\u00e4hrend der Wiedergabe abrupt von einem Ort zum anderen bewegt wird, was dazu f\u00fchrt, dass es abrupt beschleunigt und pl\u00f6tzlich f\u00fcr kurze Zeit zum Stillstand kommt. Die Unreal Engine verwendet temporales Anti-Aliasing und eine Bildwiederherstellung zwischen den Frames und verl\u00e4sst sich auf korrekte Bewegungsvektorinformationen, um die letzten Frames mit dem neuen Frame zusammenzuf\u00fchren. Da dies nicht der Fall ist, wurden viele visuelle Artefakte wie Aliasing, starkes Ghosting und abgeschnittene Schatten erzeugt.<\/p>\n\n\n\n<p>Der visuelle Aspekt des Ergebnisses hatte f\u00fcr uns oberste Priorit\u00e4t, und als sich der urspr\u00fcngliche Ansatz als unzureichend erwies, mussten wir nach einer alternativen L\u00f6sung suchen, die unseren Zielen besser entsprach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Patching von Scenic f\u00fcr die Aufnahme von Videos<\/h2>\n\n\n\n<p>Die L\u00f6sung, f\u00fcr die wir uns entschieden haben, war, Scenic zu modifizieren und die Videoerfassung darin zu integrieren. Wir haben dann das Frame-Delta festgelegt, das Szenario ausgef\u00fchrt und die gerenderten Bilder in einen Videostream eingespeist.<\/p>\n\n\n\n<p>Mit anderen Worten: In den Callback von CARLA haben wir eine Methode integriert, die den Video Writer mit Bildern versorgt. Um dies konfigurierbar zu machen, haben wir Scenic erweitert, um zus\u00e4tzliche Parameter zu erhalten. Der neu hinzugef\u00fcgte Parameter <code>resolution<\/code> steuert die Aufl\u00f6sung des gerenderten CARLA-Streams. Er akzeptiert einen String mit der Formatierung <code>1280x720<\/code>Der Parameter <code>video_output_path<\/code> bestimmt, wo ein Video gespeichert werden soll. Er erwartet einen Pfad, an dessen Ende eine MP4-Datei steht.  Die Parameter werden in <code>src\/scenic\/simulators\/carla\/model.scenic<\/code> definiert und die Videoerfassung erfolgt in <code>src\/scenic\/simulators\/carla\/utils\/visuals.py<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt-f\u00fcr-Schritt-Anleitung zur Aufnahme eines Videos f\u00fcr ein Szene-Szenario<\/h2>\n\n\n\n<p>Mit diesen \u00c4nderungen k\u00f6nnen wir ein Video von einem beliebigen Szenario aufnehmen. Zun\u00e4chst m\u00fcssen wir entscheiden, welche Bildrate das Video haben soll, und diese als Zeitschritt pro Bild angeben. Zum Beispiel entsprechen 30 FPS einer Bildzeit von ~0,0333 Sekunden und 60 FPS entsprechen ~0,0166 Sekunden. Nehmen wir an, wir wollen ein Video mit 60 FPS und einer Aufl\u00f6sung von 1920x1080 unter <code>\/home\/user\/test.mp4<\/code>aufnehmen. Dann w\u00fcrden wir ein Scenic-Skript auf folgende Weise ausf\u00fchren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">scenic &lt;SCENIC SCRIPT&gt; --simulate --count <span class=\"hljs-number\">1<\/span> --param resolution <span class=\"hljs-string\">\"1920x1080\"<\/span> --param video_output_path <span class=\"hljs-string\">\"\/home\/user\/test.mp4\"<\/span> --param timestep <span class=\"hljs-number\">0.0166<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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>Wenn das Fenster geschlossen wird, wird das Video unter dem angegebenen Pfad gespeichert.<\/p>\n\n\n\n<p>Der nachfolgende Blog-Beitrag \"<a href=\"https:\/\/rocketloop.de\/de\/blog\/scenic-carla-best-practices\/\">Best Practices bei der Verwendung von Scenic mit CARLA<\/a>\" enth\u00e4lt bew\u00e4hrte Praktiken f\u00fcr die Verwendung von Scenic mit CARLA, einschlie\u00dflich Modifikationen, um wesentliche Parameter, die die Fahrzeugsteuerung beeinflussen, offenzulegen. Er behandelt die Manipulation von Parametern wie Gas, Lenkung und Bremsen sowie die Anpassung der Bildrate f\u00fcr eine fl\u00fcssigere Fahrzeugsteuerung. Dar\u00fcber hinaus geht der Beitrag auf die Details ein, wie Scenic die Bewegung eines Fahrzeugs steuert und wie man sie beeinflussen kann.<\/p>","protected":false},"excerpt":{"rendered":"<p>The process of recording video within Scenic proved to be more challenging than anticipated, requiring us to make modifications and fork the library. You can check out our fork&#8230;<\/p>","protected":false},"author":10,"featured_media":10608,"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-9795","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\/9795","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\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/comments?post=9795"}],"version-history":[{"count":6,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/posts\/9795\/revisions"}],"predecessor-version":[{"id":11336,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/posts\/9795\/revisions\/11336"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/media\/10608"}],"wp:attachment":[{"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/media?parent=9795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/categories?post=9795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rocketloop.de\/de\/wp-json\/wp\/v2\/tags?post=9795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}