Carla控制指定Actor(四)
第一种方法
通过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 Vec2Dtry: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:passimport carla
import randomdef 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()).locationtransform = 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 += -89if rotation.pitch >= 90: rotation.pitch = 89elif rotation.pitch <= -90:rotation.pitch = -89spectator.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 actorreturn Nonedef restart(self):self.player_max_speed = 1.589self.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 0cam_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.0spawn_point.rotation.roll = 0.0spawn_point.rotation.pitch = 0.0self.destroy()self.player = self.find_player()self.show_vehicle_telemetry = Falseself.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 = Falseself.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_indexself.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,以同步模式运行
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
