Carla控制指定Actor(四)

本文介绍了两种在Carla模拟环境中查找和控制Actor的方法。第一种是通过Actor的id,但id由服务器生成,无法预知。第二种是在创建Actor时设置role_name属性,然后通过此属性搜索Actor。通过示例代码展示了如何实现,并提供了手动控制Actor的脚本修改方法。最后,详细说明了运行步骤。
摘要由CSDN通过智能技术生成

第一种方法

通过carla.Worldget_actor或者get_actors函数查找Actor的id,此种方法简单方便,但是局限性大,因为Actor的id都是由Carla的Server端生成,无法事先知道

第二种方法

  1. 在生成Actor的时候设置carla.ActorBlueprintrole_name属性,将role_name的值设置为你想要查找的值
  2. 通过carla.Worldget_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()

运行方式:

  1. 启动Carla
  2. 运行spawn_vehicle.py文件,python spawn_vehicle.py
  3. 运行manual_control_actor.py文件, python manual_control_actor.py --sync,以同步模式运行
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值