carla使用pythonAPI创建演员

一、准备
安装pygame和numpy
退出:ALT+F4
二、示例程序

  1. 向world中添加100辆车,注意最多添加200辆,默认为10辆
$ python tm_spawn_npc.py -n 100
image.png

查到目前用的python3.8.0,但是dist文件夹下的egg文件用的python3.7。下载python3.8,重新安装python3.7即可。


image.png
  1. 手动控制车辆
$ python manual_control.py  
    W            : throttle 油门    
    S            : brake  刹车
    AD           : steer  方向盘角度
    Q            : toggle reverse  方向切换
    Space        : hand-brake  手刹
    P            : toggle autopilot 切换自动驾驶仪
    M            : toggle manual transmission  拨动式手动驾驶器
    ,/.          : gear up/down 下载/上传

    TAB          : change sensor position 改变传感器位置
    `            : next sensor 下一个传感器
    [1-9]        : change to sensor [1-9]
    C            : change weather (Shift+C reverse)  天气
    Backspace    : change vehicle

    R            : toggle recording images to disk

    CTRL + R     : toggle recording of simulation (replacing any previous) 模拟切换记录
    CTRL + P     : start replaying last recorded simulation 开始重放上次录制的模拟
    CTRL + +     : increments the start time of the replay by 1 second (+SHIFT = 10 seconds)
    CTRL + -     : decrements the start time of the replay by 1 second (+SHIFT = 10 seconds)

    F1           : toggle HUD
    H/?          : toggle help
    ESC          : quit
image.png
  1. 自动控制
$ python automatic_control.py
  1. 动态变化天气
$ python dynamic_weather.py

三、导入actor对象

  1. 引入carla模块,须将pythonAPI同级目录下carla/dist下的egg文件解压,否则程序找不到carla模块;另外,需要用egg文件对应的python版本打开程序,否则可能出错。
import glob
import os
import sys

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
  1. 连接模拟器,carla模拟器默认端口为2000,保证该端口没有被占用;设置连接时间,防止联网操作被一直阻止。
client = carla.Client('localhost', 2000)
client.set_timeout(2.0)

也可以通过命令行获取端口号:

client = carla.Client(args.host, args.port)
  1. 创建world,添加演员
world = client.get_world()  #模拟世界
blueprints = world.blueprint_library().filter('vehicle.*') #寻找目标actor库,如:vehicle
spawn_points = world.get_map().get_spawn_points()  #每一个地图都会提供一组可用坐标点

获取所有2轮车

bps = [x for x in blueprints if not x.id.endswith('isetta')]
bps = [x for x in blueprints if not x.id.endswith('carlacola')]

actor属性设置

color = random.choice(blueprint.get_attribute('carla').recommend_values)  #获取随机颜色
blueprint = random.choice(blueprints)   #在actor库中选择任意一个actor
blueprint.setattribute('color', color)
blueprint.setattribut('role-name', 'autopilot')   #设置自动驾驶仪

颜色属性也可用rgb比例设置:

buleprint.setattribut('color', '255,0,0')

创建actor生成点坐标

location = random.choice(spawn_points).location
transform = carla.Transform(location, carla.Rotation(yaw = 180))

transform = Transform(Location(x=230,y=195,z=40), Rotation(yaw = 180))

检查生成点坐标是否碰撞,若发生碰撞则报错

actor = world.spawn_actor(blueprint,transform)  #创建actor

注意,carla提供了两种创建carla的函数,spawn_actor和try_spawn_actor;
spawn_actor添加actor失败会引发异常;try_spawn_actor添加失败返回none。
添加actor失败通常是因为生成点发生碰撞。

添加传感器:

sensor_bp = world.get_blueprint_library().find('sensor.camera.rgb')
sensor = world.spawn_actor(sensor_bp, carla.Transform(), attach_to = my_vehicle)
sensor.listen(lambda image: image.save_to_disk('_out/%8d'%image.frame_number)) #将传感器的数据保存到本地

spawn_actor后面附加参数可以控制物体是否和其他actor绑定。

批量添加actor:

batch = []
actor_list = []
batch.append(SpawnActor(blueprint, transform).then(SetAutopilot(FutureActor,True)))

for response in client.apply_batch_sync(batch):
  if response.error:
    logging.error(response.error)
  else:
    actor_list.append(response.actor_id)  

SetAutopilot(FutureActor,True)设置车辆位自动驾驶

程序结束时需销毁演员:

vehicle.destroy()
client.apply_batch([carla.command.DestroyActor(x) for x in actor_list])
  1. 控制车辆
vehicle.apply_control(carla.VehicleControl(throtte=1.0, steer = -1.0))

carla.VehicleControl 车辆控制函数
carla.WalkerControl 行人控制函数

carla.VehicleControl(
throtte = 0.0,
steer = 0.0,
brake = 0.0,
hand_brake = False,
reverse = False,
manual_gear_shift = False,
gear = 0)
车辆动力学特性

vehicle.apply_physics_control(carla.VehiclePhysicsControl(max_rmp=5000.0, center_of_mass=carla.Ventor3D(0.0, 0.0, 0.0), torque_curve=[[0,400],[5000,400]]))

轮胎控制

carla.WheelPhysicsControl(tire_firction, damping_rate, steer_angle, disable_steering)

四、创建其他actor

actor_list = world.get_actors()  #获取所有actor列表
actor = actor_list.find(id)  #根据id查找actor
for speed_sign in actor_list.filter('traffic.speed_limit.*'):
    print(speed_sign.get_location())  #打印限速标志位置
  1. 创建天气时参数有:
    cloudyness(0-100), precipition(0-100), precipition_deposits(主要用于控制道路上的积水面积)(0-100),wind_instensity(0-100), sun_azimuth_angle(0-360), sun_altitude_angle(-90 - 90)
weather = world.get_weather()   #获取天气
world.set_weather(weather)   #设置天气

也可以直接应用world的预定义天气预设列表:

world.set_weather(carla.WeatherParameters.WetCloudySunset)
  1. 创建路标:
waypoint = map.get_waypoint(vehicle.get_location())  #获取所有路标位置
vehicle.set_simulate_physics(False)  #关闭车辆动力学特性

while true:
    waypoint = random.choice(waypoint.next(2.0))   #查找前面2m处的路标
    vehicle.set_transform(waypoint.transform)  #将路标信息发送给车辆

3.录放系统

client.start_recorder('recording01.log')  #开始记录,recording01.log为文件名
client.stop_recorder()  #停止记录
client.replay_file('recording01.log')  #回放
client.set_replayer_time_factor(2.0)  #设置播放速率,1.0为正常播放,小于1.0为慢放,大于1.0为快放
client.show_recorder_file_info('recording01.log')

上面回放方法是从头全部回放,我们也可以通过添加参数控制回放指定时长

client.reply_file('recording01.log', start, duration, camera)

其中:start--开始回放时间,若为正,则从头开始的第start秒开始回放;若为负,则从倒数第start秒开始回放
duration--回放时长
camera--聚焦并跟随的演员id

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容