Carla自动驾驶仿真十:Carlaviz三维可视化平台搭建


前言

Carlaviz是一个开源的可视化工具,主要用于Carla三维场景、传感器数据以及自车数据的可视化,能够作为观测平台使用,本文主要介绍Carlaviz的安装以及基本使用;


一、环境准备

1、docker安装

1)根据所属环境下载对应的docker,然后直接安装即可

点击进入docker官网下载

2、websocket-client安装

1)进入终端输入:pip3 install websocket_client

3、carlaviz代码下载

carlaviz github链接

1)打开终端输入 docker pull mjxu96/carlaviz:0.9.14,请下载与自己carla版本一致的carlaviz,只需修改后面的版本号,如下载0.9.15版本的carlaviz:

在这里插入图片描述

二、carlaviz使用

1、打开carla客户端

在这里插入图片描述

2、输入启动命令

1)windows
终端输入:docker run -it -p 8080-8081:8080-8081 mjxu96/carlaviz:0.9.14 --simulator_host host.docker.internal --simulator_port 2000,注意carla的版本号一定要对上;

2)linux
终端输入:docker run -it --network="host" mjxu96/carlaviz:0.9.14 --simulator_host localhost --simulator_port 2000,注意carla的版本号一定要对上‘

windows输入启动命令后结果:
在这里插入图片描述

3、进入carlaviz

1)打开浏览器输入http://localhost:8080/,或者从docker软件进入,进入carlaviz如下图所示,能够正确加载到路网相关信息,此时没有ego信息以及摄像头画面是正常的,是因为需要启动python脚本生成车辆以及摄像头;

在这里插入图片描述

4、修改manual_control.py脚本

1、启动前需要将manual_control.py中主车的名称改成ego
在这里插入图片描述

5、运行manual_control.py脚本

1)运行脚本后正确接收到主车信息,摄像头画面等信息;

在这里插入图片描述

6、运行carlaviz官方脚本(推荐)

1)我们也可以运行官方脚本,有激光雷达点云信息;

import carla
import random
import time
# from carla_painter import CarlaPainter

def do_something(data):
    pass


def main():
    try:
        # initialize one painter
        # painter = CarlaPainter('localhost', 8089)

        client = carla.Client('localhost', 2000)
        client.set_timeout(10.0)
        world = client.get_world()

        for blue_print in world.get_blueprint_library():
            if blue_print.id.startswith("sensor"):
                print(blue_print)

        # set synchronous mode
        previous_settings = world.get_settings()
        world.apply_settings(carla.WorldSettings(
            synchronous_mode=True,
            fixed_delta_seconds=1.0 / 30.0))

        # randomly spawn an ego vehicle and several other vehicles
        spawn_points = world.get_map().get_spawn_points()
        blueprints_vehicles = world.get_blueprint_library().filter("vehicle.*")

        ego_transform = spawn_points[random.randint(0, len(spawn_points) - 1)]
        other_vehicles_transforms = []
        for _ in range(3):
            other_vehicles_transforms.append(spawn_points[random.randint(0, len(spawn_points) - 1)])

        blueprints_vehicles = [x for x in blueprints_vehicles if int(x.get_attribute('number_of_wheels')) == 4]
        # set ego vehicle's role name to let CarlaViz know this vehicle is the ego vehicle
        blueprints_vehicles[0].set_attribute('role_name', 'ego') # or set to 'hero'
        batch = [carla.command.SpawnActor(blueprints_vehicles[0], ego_transform).then(carla.command.SetAutopilot(carla.command.FutureActor, True))]
        results = client.apply_batch_sync(batch, True)
        if not results[0].error:
            ego_vehicle = world.get_actor(results[0].actor_id)
        else:
            print('spawn ego error, exit')
            ego_vehicle = None
            return

        other_vehicles = []
        batch = []
        for i in range(3):
            batch.append(carla.command.SpawnActor(blueprints_vehicles[i + 1], other_vehicles_transforms[i]).then(carla.command.SetAutopilot(carla.command.FutureActor, True)))

        # set autopilot for all these actors
        ego_vehicle.set_autopilot(True)
        results = client.apply_batch_sync(batch, True)
        for result in results:
            if not result.error:
                other_vehicles.append(result.actor_id)

        # attach a camera and a lidar to the ego vehicle
        camera = None
        # blueprint_camera = world.get_blueprint_library().find('sensor.camera.rgb')
        blueprint_camera = world.get_blueprint_library().find('sensor.camera.instance_segmentation')
        # blueprint_camera = world.get_blueprint_library().find('sensor.camera.depth')
        blueprint_camera.set_attribute('image_size_x', '640')
        blueprint_camera.set_attribute('image_size_y', '480')
        blueprint_camera.set_attribute('fov', '110')
        blueprint_camera.set_attribute('sensor_tick', '0.1')
        transform_camera = carla.Transform(carla.Location(y=+3.0, z=5.0))
        camera = world.spawn_actor(blueprint_camera, transform_camera, attach_to=ego_vehicle)
        camera.listen(lambda data: do_something(data))

        lidar = None
        # blueprint_lidar = world.get_blueprint_library().find('sensor.lidar.ray_cast')
        blueprint_lidar = world.get_blueprint_library().find('sensor.lidar.ray_cast_semantic')
        blueprint_lidar.set_attribute('range', '30')
        blueprint_lidar.set_attribute('rotation_frequency', '10')
        blueprint_lidar.set_attribute('channels', '32')
        blueprint_lidar.set_attribute('lower_fov', '-30')
        blueprint_lidar.set_attribute('upper_fov', '30')
        blueprint_lidar.set_attribute('points_per_second', '56000')
        transform_lidar = carla.Transform(carla.Location(x=0.0, z=5.0))
        lidar = world.spawn_actor(blueprint_lidar, transform_lidar, attach_to=ego_vehicle)
        lidar.listen(lambda data: do_something(data))

        # tick to generate these actors in the game world
        world.tick()

        # save vehicles' trajectories to draw in the frontend
        trajectories = [[]]

        while (True):
            world.tick()
            ego_location = ego_vehicle.get_location()
            trajectories[0].append([ego_location.x, ego_location.y, ego_location.z])

            # draw trajectories
            # painter.draw_polylines(trajectories)

            # draw ego vehicle's velocity just above the ego vehicle
            ego_velocity = ego_vehicle.get_velocity()
            velocity_str = "{:.2f}, ".format(ego_velocity.x) + "{:.2f}".format(ego_velocity.y) \
                    + ", {:.2f}".format(ego_velocity.z)
            # painter.draw_texts([velocity_str],
            #             [[ego_location.x, ego_location.y, ego_location.z + 10.0]], size=20)

            time.sleep(0.05)

    finally:
        if previous_settings is not None:
            world.apply_settings(previous_settings)
        if lidar is not None:
            lidar.stop()
            lidar.destroy()
        if camera is not None:
            camera.stop()
            camera.destroy()
        if ego_vehicle is not None:
            ego_vehicle.destroy()
        if other_vehicles is not None:
            client.apply_batch([carla.command.DestroyActor(x) for x in other_vehicles])

if __name__ == "__main__":

在这里插入图片描述

综上,完成carlaviz的安装及使用,确实是一个较只管的观测平台,如果能在基础上做控制的开发那就完美了。

### 使用Carla仿真平台进行激光雷达建图 #### 创建并启动Carla仿真环境 为了在Carla中使用激光雷达创建地图,首先需要安装并运行Carla模拟器。确保已按照官方文档说明设置好Python API环境。 ```bash cd <path_to_CARLA>/PythonAPI/util ./Setup.sh ``` 启动Carla服务器: ```bash CarlaUE4.exe -carla-server -windowed -ResX=800 -ResY=600 ``` 连接至Carla客户端,并初始化世界对象以便后续操作[^2]。 #### 配置激光雷达传感器 定义一个函数来配置和附加激光雷达传感器到车辆上。这可以通过`carla.SensorBlueprintLibrary`获取预设的LiDAR蓝图,并调整其属性以适应特定需求。 ```python def setup_lidar(world, vehicle): blueprint_library = world.get_blueprint_library() lidar_bp = blueprint_library.find('sensor.lidar.ray_cast') lidar_bp.set_attribute('channels', '32') # 设置通道数为32线 lidar_bp.set_attribute('range', '50.0') # 设定最大探测距离为50米 lidar_bp.set_attribute('points_per_second', str(500 * 1000)) # 每秒点的数量 transform = carla.Transform(carla.Location(x=0.0, z=1.9)) sensor = world.spawn_actor(lidar_bp, transform, attach_to=vehicle) return sensor ``` 此部分利用了Carla内置的支持多种类型的传感器的能力,特别是对于激光雷达的支持。 #### 收集点云数据 通过监听回调机制收集来自激光雷达的数据流。每当接收到新的帧时,处理该帧内的所有点,并将其存储起来形成完整的三维空间表示。 ```python import numpy as np class LidarParamss(object): def __init__(self): self.data = [] def callback(self, point_cloud_data): points = np.frombuffer(point_cloud_data.raw_data, dtype=np.dtype([ ('x', np.float32), ('y', np.float32), ('z', np.float32), ('intensity', np.uint8)])) self.data.append(points.reshape(-1, 4)) ``` 上述代码片段展示了如何接收原始字节形式的点云数据,并转换成易于使用的NumPy数组结构[^3]。 #### 构建地图模型 随着不断积累更多的扫描结果,可以构建出越来越精细的地图模型。考虑到计算效率问题,在实际应用过程中可能还需要考虑降采样技术或其他优化措施。 最后一步涉及将累积下来的点云信息转化为适合长期保存的形式——比如网格文件(.ply),或是直接应用于路径规划算法之中作为输入源之一。 ```python from plyfile import PlyData, PlyElement def save_ply(filename, data): vertex_elements = [] for row in data: vertex_elements.extend([tuple(row)]) vertices = [(v[0], v[1], v[2]) for v in vertex_elements] el = PlyElement.describe(np.array(vertices, dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4')]), 'vertex') PlyData([el]).write(filename) ``` 这段脚本实现了基本的功能:读取之前记录下的点云列表并将它们导出为PLY格式文件,便于后期可视化分析或进一步加工处理[^1]。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自动驾驶simulation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值