一、准备
安装pygame和numpy
退出:ALT+F4
二、示例程序
- 向world中添加100辆车,注意最多添加200辆,默认为10辆
$ python tm_spawn_npc.py -n 100
查到目前用的python3.8.0,但是dist文件夹下的egg文件用的python3.7。下载python3.8,重新安装python3.7即可。
- 手动控制车辆
$ 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
- 自动控制
$ python automatic_control.py
- 动态变化天气
$ python dynamic_weather.py
三、导入actor对象
- 引入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
- 连接模拟器,carla模拟器默认端口为2000,保证该端口没有被占用;设置连接时间,防止联网操作被一直阻止。
client = carla.Client('localhost', 2000)
client.set_timeout(2.0)
也可以通过命令行获取端口号:
client = carla.Client(args.host, args.port)
- 创建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])
- 控制车辆
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()) #打印限速标志位置
- 创建天气时参数有:
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)
- 创建路标:
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