carla学习笔记(十)
实验室同学需要做仿真数据的采集实验,为记录以下整个采集过程。方便未来进行类似数据采集时减少写代码的时间。
采集数据要求:
控制一辆车,从a点到b点。然后在路侧架设一个lidar,采集车辆通过激光lidar区域时的数据。
一、首先确定a点和b点。
地图选取的是carla的town03。
具体区域是这里:
首先确定选择的a点:start_point;b点:end_point。
这里使用draw_string函数,将确定的点在地图中显示出来,方便之后的路径确定:
源码如下:
import carla
def show_point(world, point_location):
world.debug.draw_string(point_location, 'X', draw_shadow=False,
color=carla.Color(r=0, g=255, b=0), life_time=50,
persistent_lines=True)
def main():
client = carla.Client('localhost', 2000)
client.set_timeout(2.0)
world = client.get_world()
start_point = carla.Location(229, 116, 2)
end_point = carla.Location(20,194,2)
show_point(world, start_point)
show_point(world, end_point)
main()
地图显示:
图中两个绿色的x就是分别确定的start_point和end_point。
这里有几个点需要注意:
1.注意区分carla.Location和carla.Transform之间的关系。
2.注意在使用系统提供的函数的时候,它的参数的格式要求,尤其是spawn_vehicle函数。
怎么才好知道点的坐标呢?
可以使用这个函数测试。首先确定原点,然后确定x轴正向,再确定y轴正向。就可以将地图的坐标系确定出来。好久没有使用carla了,当时在这一步卡了好久,主要原因就是对于相关的函数的数据格式不熟悉了,解决报错问题花了快一个小时。。。
下面是源码:
import carla
def show_point(world, point_location):
world.debug.draw_string(point_location, 'P', draw_shadow=False,
color=carla.Color(r=0, g=255, b=0), life_time=50,
persistent_lines=True)
def show_x_point(world, point_location):
world.debug.draw_string(point_location, 'X', draw_shadow=False,
color=carla.Color(r=0, g=255, b=0), life_time=50,
persistent_lines=True)
def show_y_point(world, point_location):
world.debug.draw_string(point_location, 'Y', draw_shadow=False,
color=carla.Color(r=0, g=255, b=0), life_time=50,
persistent_lines=True)
def show_O_point(world, point_location):
world.debug.draw_string(point_location, 'O', draw_shadow=False,
color=carla.Color(r=0, g=255, b=0), life_time=50,
persistent_lines=True)
def main():
client = carla.Client('localhost', 2000)
client.set_timeout(2.0)
world = client.get_world()
start_point = carla.Location(229, 116, 2)
end_point = carla.Location(20,194,2)
origin_point = carla.Location(0,0,0)
x_axis = carla.Location(10, 0, 0)
y_axis = carla.Location(0, 10, 0)
show_point(world, start_point)
show_point(world, end_point)
show_O_point(world, origin_point)
show_x_point(world, x_axis)
show_y_point(world, y_axis)
main()
地图显示:
二、选择lidar点
和第一步类似,使用draw函数来找点。
源码就将上面的简单修改就可以了。
地图显示如下:
O为架设lidar的坐标。
三、实现vehilce从a点到b点
主要调用的是agent里面的set_destination函数。
参考小飞大佬的源码,自己改了一下:
# -*- coding: utf-8 -*-
import os
import random
import sys
import carla
from agents.navigation.behavior_agent import BehaviorAgent
def main():
try:
client = carla.Client('localhost', 2000)
client.set_timeout(2.0)
world = client.get_world()
origin_settings = world.get_settings()
settings = world.get_settings()
settings.synchronous_mode = True
settings.fixed_delta_seconds = 0.05
world.apply_settings(settings)
blueprint_library = world.get_blueprint_library()
# 确定起点和终点
p1 = carla.Location(229, 116, 2)
p2 = carla.Location(20, 194, 2)
start_point = carla.Transform(p1, carla.Rotation(0,0,0))
end_point = carla.Transform(p2, carla.Rotation(0, 0, 0))
# 创建车辆
ego_vehicle_bp = blueprint_library.find('vehicle.lincoln.mkz2017')
ego_vehicle_bp.set_attribute('color', '0, 0, 0')
vehicle = world.spawn_actor(ego_vehicle_bp, start_point)
world.tick()
# 设置车辆的驾驶模式
agent = BehaviorAgent(vehicle, behavior='normal')
# 核心函数
agent.set_destination(agent.vehicle.get_location(), end_point.location, clean=True)
while True:
agent.update_information(vehicle)
world.tick()
if len(agent._local_planner.waypoints_queue)<1:
print('======== Success, Arrivied at Target Point!')
break
# 设置速度限制
speed_limit = vehicle.get_speed_limit()
agent.get_local_planner().set_speed(speed_limit)
control = agent.run_step(debug=True)
vehicle.apply_control(control)
finally:
world.apply_settings(origin_settings)
vehicle.destroy()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print(' - Exited by user.')
比较简单,看注释就好。
四、生成lidar并采集数据
将生成lidar的部分加入到第三章里面的源码中。
# -*- coding: utf-8 -*-
import os
import carla
from agents.navigation.behavior_agent import BehaviorAgent
def main():
try:
client = carla.Client('localhost', 2000)
client.set_timeout(2.0)
world = client.get_world()
origin_settings = world.get_settings()
settings = world.get_settings()
settings.synchronous_mode = True
settings.fixed_delta_seconds = 0.05
world.apply_settings(settings)
blueprint_library = world.get_blueprint_library()
# 设置储存位置
output_path = 'lidar_data'
# 确定起点和终点
p1 = carla.Location(229, 116, 2)
p2 = carla.Location(20, 194, 2)
start_point = carla.Transform(p1, carla.Rotation(0,0,0))
end_point = carla.Transform(p2, carla.Rotation(0, 0, 0))
# 创建车辆
ego_vehicle_bp = blueprint_library.find('vehicle.lincoln.mkz2017')
ego_vehicle_bp.set_attribute('color', '0, 0, 0')
vehicle = world.spawn_actor(ego_vehicle_bp, start_point)
# 创建lidar,设置lidar的参数
lidar_bp = blueprint_library.find('sensor.lidar.ray_cast')
lidar_bp.set_attribute('channels', str(32))
lidar_bp.set_attribute('points_per_second', str(90000))
lidar_bp.set_attribute('rotation_frequency', str(40))
lidar_bp.set_attribute('range', str(20))
# 设置lidar架设的点
lidar_location = carla.Location(100, 190, 2)
lidar_rotation = carla.Rotation(0, 0, 0)
lidar_transform = carla.Transform(lidar_location, lidar_rotation)
# 生成lidar并采集数据
lidar = world.spawn_actor(lidar_bp, lidar_transform)
lidar.listen(
lambda point_cloud: point_cloud.save_to_disk(os.path.join(output_path, '%06d.ply' % point_cloud.frame)))
world.tick()
# 设置车辆的驾驶模式
agent = BehaviorAgent(vehicle, behavior='normal')
# 核心函数
agent.set_destination(agent.vehicle.get_location(), end_point.location, clean=True)
while True:
agent.update_information(vehicle)
world.tick()
if len(agent._local_planner.waypoints_queue)<1:
print('======== Success, Arrivied at Target Point!')
break
# 设置速度限制
speed_limit = vehicle.get_speed_limit()
agent.get_local_planner().set_speed(speed_limit)
control = agent.run_step(debug=True)
vehicle.apply_control(control)
finally:
world.apply_settings(origin_settings)
vehicle.destroy()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print(' - Exited by user.')
比较简单,整个实验采集都比较简单。在这里记录一下,方便未来做类似工作是可以直接代码服用。