第一种方法
通过carla.World
的get_actor
或者get_actors
函数查找Actor的id,此种方法简单方便,但是局限性大,因为Actor的id都是由Carla的Server
端生成,无法事先知道
第二种方法
- 在生成Actor的时候设置
carla.ActorBlueprint
的role_name
属性,将role_name
的值设置为你想要查找的值 - 通过
carla.World
的get_actors
函数获取当前所有的actor
,其role_name
的值是否是你想要的
spawn_vehicle.py 放在PythonAPI\examples
目录下
import glob
import os
import sys
from turtle import Vec2D
try:
sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (
sys.version_info.major,
sys.version_info.minor,
'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0])
except IndexError:
pass
import carla
import random
def main():
client = carla.Client('localhost', 2000)
client.set_timeout(20.0)
world = client.get_world()
spectator = world.get_spectator()
vehicle_blueprints = world.get_blueprint_library().filter('vehicle')
blueprint = random.choice(vehicle_blueprints)
blueprint.set_attribute('role_name', '9527') # 设置role_name的值
location = random.choice(world.get_map().get_spawn_points()).location
transform = carla.Transform(location)
vehicle = world.spawn_actor(blueprint, transform)
try:
while True:
transform = vehicle.get_transform()
location = transform.location + carla.Location(0, 0, 15)
rotation = transform.rotation
# 避免万向锁
rotation.pitch += -89
if rotation.pitch >= 90:
rotation.pitch = 89
elif rotation.pitch <= -90:
rotation.pitch = -89
spectator.set_transform(carla.Transform(location, rotation)) # 将视角设置在车辆上方
world.wait_for_tick()
finally:
print('end')
if __name__ == '__main__':
main()
将PythonAPI\examples
目录下的manual_control.py
文件复制一份,改名为manual_control_actor.py
修改restart
函数,同时新增find_player
函数
def find_player(self):
actor_list = self.world.get_actors()
for actor in actor_list:
if 'role_name' in actor.attributes and actor.attributes['role_name'] == '9527':
return actor
return None
def restart(self):
self.player_max_speed = 1.589
self.player_max_speed_fast = 3.713
# Keep same camera config if the camera manager exists.
cam_index = self.camera_manager.index if self.camera_manager is not None else 0
cam_pos_index = self.camera_manager.transform_index if self.camera_manager is not None else 0
# Spawn the player.
if self.player is not None:
spawn_point = self.player.get_transform()
spawn_point.location.z += 2.0
spawn_point.rotation.roll = 0.0
spawn_point.rotation.pitch = 0.0
self.destroy()
self.player = self.find_player()
self.show_vehicle_telemetry = False
self.modify_vehicle_physics(self.player)
while self.player is None:
if not self.map.get_spawn_points():
print('There are no spawn points available in your map/town.')
print('Please add some Vehicle Spawn Point to your UE4 scene.')
sys.exit(1)
spawn_points = self.map.get_spawn_points()
spawn_point = random.choice(spawn_points) if spawn_points else carla.Transform()
self.player = self.find_player()
if self.player is None:
print("Can't find id %d" % (self.vehicle_id))
sys.exit(1)
# self.player.set_transform(spawn_point)
self.show_vehicle_telemetry = False
self.modify_vehicle_physics(self.player)
# Set up the sensors.
self.collision_sensor = CollisionSensor(self.player, self.hud)
self.lane_invasion_sensor = LaneInvasionSensor(self.player, self.hud)
self.gnss_sensor = GnssSensor(self.player)
self.imu_sensor = IMUSensor(self.player)
self.camera_manager = CameraManager(self.player, self.hud, self._gamma)
self.camera_manager.transform_index = cam_pos_index
self.camera_manager.set_sensor(cam_index, notify=False)
actor_type = get_actor_display_name(self.player)
self.hud.notification(actor_type)
if self.sync:
self.world.tick()
else:
self.world.wait_for_tick()
运行方式:
- 启动Carla
- 运行
spawn_vehicle.py
文件,python spawn_vehicle.py
- 运行
manual_control_actor.py
文件,python manual_control_actor.py --sync
,以同步模式运行