参考
环境配置
carla: 0.9.14
安装
为了更方便地在不同的场景中测试自动驾驶的性能,以及测试运行中不同的工况,在carla里面推荐使用scenario runner。但是在着一块网上的资料还是很不完善,绝大多数得自己学习。
今天我主要要学习的是如何使用scenario runner。在下载carla以后,我们需要下载scenario runner,使用anaconda以及如何安装相关依赖由于csdn上面有很多的教程,所以在这里不再赘述。需要注意的是carla仅支持python3.7,所以在配置python环境的时候,得将python版本锁定在python3.7。
git clone https://github.com/carla-simulator/scenario_runner.git
这里我推荐给carla以及carla scenario runner的根目录添加一个宏定义(写在~/.bashrc目录下面),这样就可以直接通过宏定义内容直接到达目标目录下面。
~/.bashrc 或者是 ~/.zshrc:
export CARLA_ROOT=~/env/CARLA_Leaderboard_20
export SCENARIO_RUNNER_ROOT=~/carla/scenario_runner
export PYTHONPATH="${CARLA_ROOT}/PythonAPI/carla/":"${SCENARIO_RUNNER_ROOT}":"${CARLA_ROOT}/PythonAPI/carla/dist/carla-0.9.14-py3.7-linux-x86_64.egg":${PYTHONPATH}
通过定义路径我们可以直接使用以下指令到达相应的目录。
cd $SCENARIO_RUNNER_ROOT
初探(以FreeRide为例)
首先进入到carla的根目录,并运行carla
cd $CARLA_ROOT
./CarlaUE4.sh --low
在这里我把画质设置为低来获取更高的运行速度。然后尝试运行它
conda activate (your env)
cd $SCENARIO_RUNNER_ROOT
python scenario_runner.py --scenario FreeRide_1 --reloadWorld --sync
--reloadWord表示重新加载世界,如果当前世界和目标世界不一致的时候,我们可以使用这个命令加载。--sync表示设置模式为同步模式。FreeRide是当前的scenario。
然后运行manual control,人工生成一个控制器,控制汽车的运动。
cd $SCENARIO_RUNNER_ROOT
python manual_control.py
Free ride对应的scenario的路径在srunner/scenarios/freeride.py目录下面。以下是它的源代码
#!/usr/bin/env python
# Copyright (c) 2019-2020 Intel Corporation
#
# This work is licensed under the terms of the MIT license.
# For a copy, see <https://opensource.org/licenses/MIT>.
"""
Simple freeride scenario. No action, no triggers. Ego vehicle can simply cruise around.
"""
import py_trees
from srunner.scenariomanager.scenarioatomics.atomic_behaviors import Idle
from srunner.scenariomanager.scenarioatomics.atomic_criteria import CollisionTest
from srunner.scenarios.basic_scenario import BasicScenario
class FreeRide(BasicScenario):
"""
Implementation of a simple free ride scenario that consits only of the ego vehicle
"""
def __init__(self, world, ego_vehicles, config, randomize=False, debug_mode=False, criteria_enable=True,
timeout=10000000):
"""
Setup all relevant parameters and create scenario
"""
# Timeout of scenario in seconds
self.timeout = timeout
super(FreeRide, self).__init__("FreeRide",
ego_vehicles,
config,
world,
debug_mode,
criteria_enable=criteria_enable)
def _setup_scenario_trigger(self, config):
"""
"""
return None
def _create_behavior(self):
"""
"""
sequence = py_trees.composites.Sequence("Sequence Behavior")
sequence.add_child(Idle())
return sequence
def _create_test_criteria(self):
"""
A list of all test criteria will be created that is later used
in parallel behavior tree.
"""
criteria = []
for ego_vehicle in self.ego_vehicles:
collision_criterion = CollisionTest(ego_vehicle)
criteria.append(collision_criterion)
return criteria
def __del__(self):
"""
Remove all actors upon deletion
"""
self.remove_all_actors()
它继承了basic_scenario的基类。在这个scenario中,他有三个关键的成员函数_setup_scenario_trigger, _create_test_criteria, _create_behavior。
- _setup_scenario_trigger,这个函数在真实场景开始之前完成,该函数可以由用户定义的场景类内的用户实现重载。
- _create_test_criteria,用来获取这个工况下,车辆的运行评价,这个运行评价是自己设置的,用于对算法的验证,如果工况表现比较好的话,就可以获得更高的分数。反之相反。
- _create_behavior,是scenario的关键,呈现树状结构,用来定义车辆的动作。由于这个scenario比较简单,所以没有任何动作。之后在其他例子中会介绍如何使用这个树状图来生成不同的车辆状况。
srunner/examples/FreeRide.xml这个目录定义了freeride的地图以及车辆在世界地图里面初始化的位置。
接下来打开scenario runner并让车初始化在一个不同的地图上,将FreeRide_1改成以下内容:
<scenario name="FreeRide_1" type="FreeRide" town="Town13">
<ego_vehicle x="2385" y="6120" z="168" yaw="-90" model="vehicle.tesla.model3" rolename="hero"/>
</scenario>
运行carla服务器以后,运行scenario runner,因为Town13 是一个大地图,所以会用很长时间去加载,我们需要把这里的timeout时间改长一点。
python scenario_runner.py --scenario FreeRide_1 --reloadWorld --sync --timeout 60
加载成功以后,使用manural control去控制车辆:
cd $SCENARIO_RUNNER_ROOT
python manual_control.py
可以看到车辆的出生地图改变了。
这次内容主要是简单运行一下scenario runner,并改变初始化时生成的地图,以后将会着重通过其他的例子着重介绍怎么修改代码使得汽车按照自己的预定轨迹运动。