import sys
try:
sys.path.append('D:\work_software\Carla\Carla_0.9.10\CARLA_0.9.10\WindowsNoEditor\PythonAPI\carla\dist\carla-0.9.10-py3.7-win-amd64.egg')
except IndexError:
pass
import carla
import random
import time
# 创建 client
client = carla.Client("localhost", 2000)
client.set_timeout(5.0)
# 创建 world
world = client.get_world()
# 创建 vehicle actor
blueprint_library = world.get_blueprint_library()
vehicle_blueprint = random.choice(blueprint_library.filter("vehicle.*.*"))
vehicle_transform = carla.Transform(carla.Location(x = 100, y = 200 , z = 10), carla.Rotation(yaw = -180))
vehicle_actor = world.spawn_actor(vehicle_blueprint, vehicle_transform)
# 设置 vehicle actor 为自动驾驶模式
vehicle_actor.set_autopilot()
#(3)Types of actorss
# ------------------------------------------------------------------------------------------------------------------------
# 3.交通标志和交通灯 -- Traffic signs / Traffic lights
#
#
# (1)
# ======================================================================================================================================================
# 注1 -- 1.解释什么是【OpenDRIVE】文件: 【OpenDRIVE】是一种开放的文件格式,用于描述道路网络和交通场景,并被广泛应用于自动驾驶领域
# 2.【OpenDRIVE】文件的作用: 【OpenDRIVE】文件包含了【道路拓扑结构】、【车道几何信息】、【路标】、【交通信号灯】、【交通流量】...相关数据,这些信息被用于在自动驾驶仿真环境中构建真实世界的道路网络,并模拟车辆在其中行驶的场景
# 3.【OpenDRIVE】文件在carla中的作用: 在Carla中【OpenDRIVE】文件被用作【道路地图】的【输入】,Carla的仿真引擎会解析OpenDRIVE文件,创建道路网格,通过读取OpenDRIVE文件,Carla能够准确地还原真实道路的拓扑结构和特征,从而提供高度真实的自动驾驶仿真环境
# 总而言之Carla中的【OpenDRIVE文件】是用于【描述】【道路网络】和【交通场景】的文件,用于构建自动驾驶仿真环境,并为仿真中的车辆行驶提供准确的道路信息
# ======================================================================================================================================================
#
#
# (2)
# ======================================================================================================================================================
# 注2 -- Carla模拟器中,只有【道路停止线】【道路让行线】【交通信号灯】是作为【actor】存在的 -- eg:【类 carla.TrafficLight】继承于【类 Carla.TrafficSign】继承于【类 carla.Actor】
# 其他的在【文件 OpenDRIVE】中提及的道路标志,都不能作为【actor】存在,而是以【类 carla.Landmark】的实例化对象的方式存在,即想访问这些道路标志,就要通过【类 carla.Landmark】中的API进行访问
# 补充:类【carla.Landmark】作用:定义影响道路的任何类型的交通地标或标志的类,此类可以检索在OpenDRIVE中定义的地标的所有信息,并提供有关其影响哪些车道以及何时影响的信息
# ======================================================================================================================================================
#
#
# (3)
# ======================================================================================================================================================
# 注3 -- 虽然只【道路停止线】【道路让行线】【交通信号灯】是作为【actor】存在的,但是【蓝图库中并不提供他们的蓝图】,也就是说我们【无法】【人为创建】这三种道路标志,而只能通过【文件 OpenDRIVE】自动生成
# 补充:停止线、让行线和交通信号灯等道路标识并不是基于蓝图创建的,而是根据OpenDRIVE文件中的信息在仿真环境中自动生成的,具体而言,当Carla解析OpenDRIVE文件并创建道路网格时,它会根据文件中的道路属性和几何信息生成相应的道路标识,如停止线和让行线,同样,交通信号灯的位置和状态也会根据OpenDRIVE文件中的交通信号灯信息自动设置
# 因此,由于这些道路标识和交通信号灯是根据OpenDRIVE文件动态生成的,而不是通过蓝图创建的,所以无法在蓝图库中找到它们,并且无法直接通过蓝图进行生成和控制。它们的生成和行为是由Carla的仿真引擎自动管理的
# ======================================================================================================================================================
#
#
# (4)
# ======================================================================================================================================================
# 注4 -- 交通标志是如何影响车辆的:通过类【carla.BoundingBox】来影响处在他的影响范围内的车辆
# 补充:类【carla.BoundingBox】作用:用来得到目前场景中任意【actor】/【道路标志】/【其他元素】的边界框(或几何形状),【类 carla.DebugHelper】或【类 carla.Client】可以使用这些边界框来绘制其形状来进行调试
# ======================================================================================================================================================
# 示例:获得影响车辆的交通灯
if vehicle_actor.is_at_traffic_light(): # 函数【carla.Vehicle.is_at_traffic_light()】 -- 作用:判断有没有和交通灯acator的边界框(Bounding Box)【相交】
traffic_light = vehicle_actor.get_traffic_light() # 函数【carla.Vehicle.get_traffic_light() 】 -- 作用:返回和车辆【相交】的交通灯边界框所属的actor,返回值类型为【carla.TrafficLight】
print("\n", traffic_light)
print(type(traffic_light))
# (5)
# ======================================================================================================================================================
# 注5 -- 每个交通灯(即每个 pole)都有自己的ID --- 指每个路灯杆子
# 每个交汇处(即每个 group)也有自己的ID --- 指某个路口的一组交通灯
# 注6 -- 同一组中的红绿灯遵循一个周期
#
# 注7 -- 交通灯的状态可以用API设置 --- 即每个交通灯的颜色可以通过API设定
# 交通灯的每个状态持续的秒数也可以用API设置 --- 即每个颜色持续的时间可以通过API指定
# 补充:通过类【carla.TrafficLight】 + 类【carla.TrafficLightState】实现 注7 中的功能
# ======================================================================================================================================================
# 示例:将一个交通灯由绿改为红色
if traffic_light.get_state() == carla.TrafficLightState.Red: # 函数【carla.TrafficLight.get_state()】 + 属性【carla.TrafficLightState.Red】
print("\n", carla.TrafficLightState.Red)
print(type(carla.TrafficLightState.Red)) # 应该是属于类型【carla.TrafficLightState】
traffic_light.set_state(carla.TrafficLightState.Green) # 函数【carla.TrafficLight.set_state(参数类型 -- carla.TrafficLightState)】
traffic_light.set_green_time(4.0) # 函数【carla.TrafficLight.set_green_time()】
# 参考示例1 -- 改变交通灯状态:References / Code recipes / Traffic Light Recipe
# https://carla.readthedocs.io/en/0.9.10/ref_code_recipes/#traffic-light-recipe
# 参考示例2 -- 改变交通灯actor的边界框大小:References / Code recipes / Debug Bounding Box Recipe
# https://carla.readthedocs.io/en/0.9.10/ref_code_recipes/#debug-bounding-box-recipe
注:my_test_script_6.py