一涩禀、準(zhǔn)備
安裝pygame和numpy
退出:ALT+F4
二、示例程序
- 向world中添加100輛車(chē)瓣履,注意最多添加200輛檐薯,默認(rèn)為10輛
$ python tm_spawn_npc.py -n 100
查到目前用的python3.8.0,但是dist文件夾下的egg文件用的python3.7。下載python3.8袍冷,重新安裝python3.7即可磷醋。
- 手動(dòng)控制車(chē)輛
$ python manual_control.py
W : throttle 油門(mén)
S : brake 剎車(chē)
AD : steer 方向盤(pán)角度
Q : toggle reverse 方向切換
Space : hand-brake 手剎
P : toggle autopilot 切換自動(dòng)駕駛儀
M : toggle manual transmission 撥動(dòng)式手動(dòng)駕駛器
,/. : gear up/down 下載/上傳
TAB : change sensor position 改變傳感器位置
` : next sensor 下一個(gè)傳感器
[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 開(kāi)始重放上次錄制的模擬
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
- 自動(dòng)控制
$ python automatic_control.py
- 動(dòng)態(tài)變化天氣
$ python dynamic_weather.py
三、導(dǎo)入actor對(duì)象
- 引入carla模塊难裆,須將pythonAPI同級(jí)目錄下carla/dist下的egg文件解壓子檀,否則程序找不到carla模塊镊掖;另外,需要用egg文件對(duì)應(yīng)的python版本打開(kāi)程序褂痰,否則可能出錯(cuò)亩进。
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
- 連接模擬器,carla模擬器默認(rèn)端口為2000缩歪,保證該端口沒(méi)有被占用归薛;設(shè)置連接時(shí)間押袍,防止聯(lián)網(wǎng)操作被一直阻止火本。
client = carla.Client('localhost', 2000)
client.set_timeout(2.0)
也可以通過(guò)命令行獲取端口號(hào):
client = carla.Client(args.host, args.port)
- 創(chuàng)建world,添加演員
world = client.get_world() #模擬世界
blueprints = world.blueprint_library().filter('vehicle.*') #尋找目標(biāo)actor庫(kù)乳愉,如:vehicle
spawn_points = world.get_map().get_spawn_points() #每一個(gè)地圖都會(huì)提供一組可用坐標(biāo)點(diǎn)
獲取所有2輪車(chē)
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屬性設(shè)置
color = random.choice(blueprint.get_attribute('carla').recommend_values) #獲取隨機(jī)顏色
blueprint = random.choice(blueprints) #在actor庫(kù)中選擇任意一個(gè)actor
blueprint.setattribute('color', color)
blueprint.setattribut('role-name', 'autopilot') #設(shè)置自動(dòng)駕駛儀
顏色屬性也可用rgb比例設(shè)置:
buleprint.setattribut('color', '255,0,0')
創(chuàng)建actor生成點(diǎn)坐標(biāo)
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))
檢查生成點(diǎn)坐標(biāo)是否碰撞逛球,若發(fā)生碰撞則報(bào)錯(cuò)
actor = world.spawn_actor(blueprint,transform) #創(chuàng)建actor
注意千元,carla提供了兩種創(chuàng)建carla的函數(shù),spawn_actor和try_spawn_actor颤绕;
spawn_actor添加actor失敗會(huì)引發(fā)異常幸海;try_spawn_actor添加失敗返回none。
添加actor失敗通常是因?yàn)樯牲c(diǎn)發(fā)生碰撞奥务。
添加傳感器:
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)) #將傳感器的數(shù)據(jù)保存到本地
spawn_actor后面附加參數(shù)可以控制物體是否和其他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)設(shè)置車(chē)輛位自動(dòng)駕駛
程序結(jié)束時(shí)需銷(xiāo)毀演員:
vehicle.destroy()
client.apply_batch([carla.command.DestroyActor(x) for x in actor_list])
- 控制車(chē)輛
vehicle.apply_control(carla.VehicleControl(throtte=1.0, steer = -1.0))
carla.VehicleControl 車(chē)輛控制函數(shù)
carla.WalkerControl 行人控制函數(shù)
carla.VehicleControl(
throtte = 0.0,
steer = 0.0,
brake = 0.0,
hand_brake = False,
reverse = False,
manual_gear_shift = False,
gear = 0)
車(chē)輛動(dòng)力學(xué)特性
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)
四、創(chuàng)建其他actor
actor_list = world.get_actors() #獲取所有actor列表
actor = actor_list.find(id) #根據(jù)id查找actor
for speed_sign in actor_list.filter('traffic.speed_limit.*'):
print(speed_sign.get_location()) #打印限速標(biāo)志位置
- 創(chuàng)建天氣時(shí)參數(shù)有:
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) #設(shè)置天氣
也可以直接應(yīng)用world的預(yù)定義天氣預(yù)設(shè)列表:
world.set_weather(carla.WeatherParameters.WetCloudySunset)
- 創(chuàng)建路標(biāo):
waypoint = map.get_waypoint(vehicle.get_location()) #獲取所有路標(biāo)位置
vehicle.set_simulate_physics(False) #關(guān)閉車(chē)輛動(dòng)力學(xué)特性
while true:
waypoint = random.choice(waypoint.next(2.0)) #查找前面2m處的路標(biāo)
vehicle.set_transform(waypoint.transform) #將路標(biāo)信息發(fā)送給車(chē)輛
3.錄放系統(tǒng)
client.start_recorder('recording01.log') #開(kāi)始記錄挡篓,recording01.log為文件名
client.stop_recorder() #停止記錄
client.replay_file('recording01.log') #回放
client.set_replayer_time_factor(2.0) #設(shè)置播放速率,1.0為正常播放帚称,小于1.0為慢放官研,大于1.0為快放
client.show_recorder_file_info('recording01.log')
上面回放方法是從頭全部回放,我們也可以通過(guò)添加參數(shù)控制回放指定時(shí)長(zhǎng)
client.reply_file('recording01.log', start, duration, camera)
其中:start--開(kāi)始回放時(shí)間世杀,若為正阀参,則從頭開(kāi)始的第start秒開(kāi)始回放;若為負(fù)瞻坝,則從倒數(shù)第start秒開(kāi)始回放
duration--回放時(shí)長(zhǎng)
camera--聚焦并跟隨的演員id