首页/文章/ 详情

五一人从众,不如在家玩一下场景编辑器

6月前浏览13174

 经常有朋友问如何学习仿真测试,于是想着把自己的一些经验和理解分享出来,希望能有所帮助。不过视野和技术有限,所说不一定对,供大家批评和参考。一直在寻找一个免费的场景编辑器,原来CARLA自带了一个,赶紧研究了一下,与大伙分享。这是第26篇,CARLA的场景编辑器。

交通生成编辑器(TGE,traffic-generation-editor)是CARLA提供的OpenSCENARIO编辑器,采用QGIS作为基础平台,并在其上添加解析OpenDRIVE地图和编辑OpenSCENARIO场景文件的插件而成。
TGE的github地址:https://github.com/carla-simulator/traffic-generation-editor
下面对TGE的安装和使用方法进行介绍,并给出使用的实例。

01

安装



(1)安装QGIS
QGIS是一个开源的地理信息系统桌面软件,可用于地理信息的浏览、设计和数据分析等方面,QGIS的详细使用方法,大伙可以查阅其官方网站[ QGIS官方网站:https://www.qgis.org]
TGE以QGIS为基础平台,并通过插件实现了OpenDRIVE地图加载和OpenSCENARIO编辑功能,因此首先要安装QGIS,Ubuntu20.04系统上的安装步骤如下:
  • 打开一个终端,并输入如下命令,安装必要的依赖

sudo apt install gnupg software-properties-common
  • 安装QGIS签名密匙,以便信任并安装QGIS资源库中的软件

$ sudo mkdir -m755 -p /etc/apt/keyrings$ sudo wget -O /etc/apt/keyrings/qgis-archive-keyring.gpg https://download.qgis.org/downloads/qgis-archive-keyring.gpg
  • 创建/etc/apt/sources.list.d/qgis.sources文件,并在其中填入如下内容






  
Types: deb deb-srcURIs: https://qgis.org/debianSuites: focalArchitectures: amd64Components: mainSigned-By: /etc/apt/keyrings/qgis-archive-keyring.gpg  
注意将“Suites”的值更改为你实际使用的系统名称,对于Ubuntu20.04,其值为“focal”。该值可以通过在终端中输入“lsb_release -cs”命令获取。
  • 更新资源库并安装QGIS


  
$ sudo apt update$ sudo apt install qgis qgis-plugin-grass  

(2)安装CARLA ad_map_access和OpenSCENARIO Editor Toolkit插件
接下来在QGIS上安装场景编辑需要的插件,包括CARLA ad_map_access和OpenSCENARIO Editor Toolkit。ad_map_access实现了对地图的解析,OpenSCENARIO Editor Toolkit实现了场景的编辑。
  • 下载traffic-generation-editor,并安装依赖

$ git clone https://github.com/carla-simulator/traffic-generation-editor.git$ cd traffic-generation-editor$ pip3 install --user -r /path/to/requirements.txt
  • 安装CARLA ad_map_access插件
首先,到https://github.com/carla-simulator/map/releases下载最新的ad_map_access_qgis.zip
然后,打开QGIS,并依次点击Plugins → Manage and Install Plugins→ Install from ZIP,点击“ZIP file”右侧的“...”按钮,选择刚才下载好的ad_map_access_qgis.zip文件,并点击“Install Plugin”,如下图:
安装成功后,可以在“Installed”标签中看到已经安装的CARLA ad_map_access,请确认其前面的复选框被勾选。
此时可以在QGIS的界面上见到CARLA ad_map_access插件的工具栏,如下图:
  • 安装OpenSCENARIO Editor Toolkit插件
首先,在https://github.com/carla-simulator/traffic-generation-editor页面点击“Code”并选择“Download ZIP”下载traffic-generation-editor-main.zip文件。
然后,在QGIS的Plugins→Manage and Install Plugins →Install from ZIP页面选择traffic-generation-editor-main.zip文件,并在“Installed”标签,确认其被勾选。
此时可以在QGIS的界面上见到OpenSCENARIO Editor Toolkit插件的工具栏,如下图:

02

使用实例



下面通过一个实例,说明如何使用TGE搭建并导出场景。需要搭建的场景为:自车初始速度为10m/s,前车初始车速为10m/s,仿真运行20s后,前车按照1m/s2的加速度加速至15m/s,同时向左换道。
(1)加载地图
打开QGIS,上一节中安装的CARLA ad_map_access和OpenSCENARIO Editor Toolkit插件会自动加载。
点击CARLA ad_map_access工具栏的Load图标 ,并选择需要加载的Opendrive地图文件(此处选择CARLA自带的Town06.xodr文件),稍等片刻后加载成功,地图在QGIS中部的窗口显示,如下图所示。此时可以通过左侧Layer窗口的复选框设置需要显示的道路元素,通过鼠标滚轮对画面进行放大缩小,按住鼠标左键对画面进行拖动。

为后续的正确使用,需要对坐标系进行设置。单击状态栏上的 CRS 图标以显示 “Project Properties”窗口,并从左侧的选项卡菜单中选择“CRS” 。在“Filter”文本框中输入“WGS 84”,在“Predefined Coordinate Reference Systems”窗口中会相关的坐标系列表,从“Geographic Coordinate Systems”中选择“WGS84(EPSD:4326)”,然后单击“OK”按钮。


(2)添加自车和前车
单击OpenSCENARIO Editor Toolkit工具栏的Add vehicles按钮 ,并在弹出的Add vehicles窗口中设置自车的属性,如下图。此处选择车型为“Tesla Model 3”,勾选“Ego Vehicle”,设置InitSpeed为10(单位为m/s),选择Agent为“simple_vehicle_control”,不勾选AttachCamera,然后点击“Insert”按钮,此时鼠标光标变为十字形状,在地图的合适位置点击,即可在该位置添加车辆。

按照同样的方法添加前车,并将其放置在自车前方,此处选择车型为“Audi A2”,不勾选“Ego Vehicle”,设置InitSpeed为10,选择Agent为“simple_vehicle_control”,不勾选AttachCamera。添加好的自车Ego_1和前车Vehicle_1如下图所示。

(3)设置前车行为
单击OpenSCENARIO Editor Toolkit工具栏的Add Maneuvers按钮,在弹出的Add Maneuver窗口中设置前车的纵向行为,如下图所示,然后点击下方的“Insert”按钮添加纵向行为。

保持StartTriggers标签的内容不变,将Entity Maneuvers标签中的Maneuver Type更改为Lateral,并设置前车的横向行为,如下图所示,然后点击下方的“Insert”按钮添加横向行为。


横向和纵向行为需要设置的内容和其含义如下表所示。  


(4)添加一个“无法实现”的行为
由于目前ScenarioRunner运行OpenSCENARIO文件的逻辑是所有交通参与者的行为都实现后会停止仿真,这会造成无法在后续场景中进行测试,因此可添加一个“无法实现”的行为,来迫使仿真持续运行。在本实例中选择为自车添加一个变速行为:当仿真时间大于1000s后,自车减速至静止,如下图所示。


(5)导出OpenSCENARIO文件

单击OpenSCENARIO Editor Toolkit工具栏的Export OpenSCENARIO file按钮,并在弹出的Export XOSC窗口中选择Road Network为“Town06”,点击Save to文本框右侧的“...”按钮后选择文件夹并设置文件名(此处设置为“tge_example”)后点击“OK”,即可导出OpenSCENARIO文件。

需要注意的是,当前TGE版本(commit 98ce87b)有个问题,当为某个交通参与者配置多个行为时,每个行为都要单独添加,其生成的OpenSCENARIO文件中会将同一个交通参与者的不同行为错误放置到多个“Maneuver”中,而正确的方式应该是放置到同一“Maneuver”的不同“Event”中。

下面为上述导出的OpenSCENARIO文件中描述Vehicle_1的横向和纵向行为的内容,可以看到横向行为(第4~31行)和纵向行为(第3~61行)在两个“Maneuver”中,并且各含有一个“Actors”内容(第4~6行和第33~35行),这样的描述是错误的。






























































1.<!-- *** Vehicle_1的所有Maneuver *** -->  2.<ManeuverGroup maximumExecutionCount="1" name="Maneuver group for Vehicle_1">  3.    <!-- *** 横向行为 *** -->  4.    <Actors selectTriggeringEntities="false">  5.        <EntityRef entityRef="Vehicle_1"/>  6.    </Actors>  7.    <Maneuver name="Maneuver ID 1">  8.        <Event name="Event Maneuver ID 1" priority="overwrite">  9.            <Action name="Action for Manuever ID 1">  10.                <PrivateAction>  11.                    <LateralAction>  12.                        <LaneChangeAction>  13.                            <LaneChangeActionDynamics dynamicsShape="linear" value="30" dynamicsDimension="distance"/>  14.                            <LaneChangeTarget>  15.                                <RelativeTargetLane entityRef="Vehicle_1" value="1"/>  16.                            </LaneChangeTarget>  17.                        </LaneChangeAction>  18.                    </LateralAction>  19.                </PrivateAction>  20.            </Action>  21.            <StartTrigger>  22.                <ConditionGroup>  23.                    <Condition name="Condition for Maneuver ID 1" delay="0" conditionEdge="rising">  24.                        <ByValueCondition>  25.                            <SimulationTimeCondition value="20.0" rule="greaterThan"/>  26.                        </ByValueCondition>  27.                    </Condition>  28.                </ConditionGroup>  29.            </StartTrigger>  30.        </Event>  31.    </Maneuver>  32.    <!-- *** 纵向行为 *** -->  33.    <Actors selectTriggeringEntities="false">  34.        <EntityRef entityRef="Vehicle_1"/>  35.    </Actors>  36.    <Maneuver name="Maneuver ID 3">  37.        <Event name="Event Maneuver ID 3" priority="overwrite">  38.            <Action name="Action for Manuever ID 3">  39.                <PrivateAction>  40.                    <LongitudinalAction>  41.                        <SpeedAction>  42.                            <SpeedActionDynamics dynamicsShape="linear" value="1" dynamicsDimension="rate"/>  43.                            <SpeedActionTarget>  44.                                <AbsoluteTargetSpeed value="15"/>  45.                            </SpeedActionTarget>  46.                        </SpeedAction>  47.                    </LongitudinalAction>  48.                </PrivateAction>  49.            </Action>  50.            <StartTrigger>  51.                <ConditionGroup>  52.                    <Condition name="Condition for Maneuver ID 3" delay="0" conditionEdge="rising">  53.                        <ByValueCondition>  54.                            <SimulationTimeCondition value="20.0" rule="greaterThan"/>  55.                        </ByValueCondition>  56.                    </Condition>  57.                </ConditionGroup>  58.            </StartTrigger>  59.        </Event>  60.    </Maneuver>  61.</ManeuverGroup>  


下面为将上述错误手动修复后的正确内容,横向行为和纵向行为由同一个“Maneuver”中的两个“Event”来描述,大伙可对比一下。

























































1.<!-- *** Vehicle_1的所有Maneuver *** -->  2.<ManeuverGroup maximumExecutionCount="1" name="Maneuver group for Vehicle_1">  3.    <Actors selectTriggeringEntities="false">  4.        <EntityRef entityRef="Vehicle_1"/>  5.    </Actors>  6.    <Maneuver name="Maneuver ID 1">  7.        <!-- *** 横向行为 *** -->  8.        <Event name="Event Maneuver ID 1" priority="overwrite">  9.            <Action name="Action for Manuever ID 1">  10.                <PrivateAction>  11.                    <LateralAction>  12.                        <LaneChangeAction>  13.                            <LaneChangeActionDynamics dynamicsShape="linear" value="30" dynamicsDimension="distance"/>  14.                            <LaneChangeTarget>  15.                                <RelativeTargetLane entityRef="Vehicle_1" value="1"/>  16.                            </LaneChangeTarget>  17.                        </LaneChangeAction>  18.                    </LateralAction>  19.                </PrivateAction>  20.            </Action>  21.            <StartTrigger>  22.                <ConditionGroup>  23.                    <Condition name="Condition for Maneuver ID 1" delay="0" conditionEdge="rising">  24.                        <ByValueCondition>  25.                            <SimulationTimeCondition value="20.0" rule="greaterThan"/>  26.                        </ByValueCondition>  27.                    </Condition>  28.                </ConditionGroup>  29.            </StartTrigger>  30.        </Event>  31.        <!-- *** 纵向行为 *** -->  32.        <Event name="Event Maneuver ID 3" priority="overwrite">  33.            <Action name="Action for Manuever ID 3">  34.                <PrivateAction>  35.                    <LongitudinalAction>  36.                        <SpeedAction>  37.                            <SpeedActionDynamics dynamicsShape="linear" value="1" dynamicsDimension="rate"/>  38.                            <SpeedActionTarget>  39.                                <AbsoluteTargetSpeed value="15"/>  40.                            </SpeedActionTarget>  41.                        </SpeedAction>  42.                    </LongitudinalAction>  43.                </PrivateAction>  44.            </Action>  45.            <StartTrigger>  46.                <ConditionGroup>  47.                    <Condition name="Condition for Maneuver ID 3" delay="0" conditionEdge="rising">  48.                        <ByValueCondition>  49.                            <SimulationTimeCondition value="20.0" rule="greaterThan"/>  50.                        </ByValueCondition>  51.                    </Condition>  52.                </ConditionGroup>  53.            </StartTrigger>  54.        </Event>  55.    </Maneuver>  56.</ManeuverGroup>  


(6)OpenSCENARIO的运行

参考《仿真测试入门参考(22):CARLA的交通场景》中运行OpenSCENARIO文件的说明,运行导出的OpenSCENARIO文件。

首先,打开一个终端,启动CARLA:



$ cd /path/to/carla$ ./CarlaUE4.sh

然后,再开一个终端,运行ScenarioRunner:



$ cd /path/to/scenario_runner$ python3 scenario_runner.py --output --openscenario tge_example.xosc

成功运行的画面如下图所示。



来源:孙工自动驾驶
ACTSystemADSUGpython自动驾驶
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-05-06
最近编辑:6月前
孙工自动驾驶
硕士 专注自动驾驶仿真测试
获赞 19粉丝 28文章 82课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈