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

news/2024/9/17 8:44:20/ 标签: 自动驾驶, python, carla, 自动驾驶仿真

文章目录

  • 前言
  • 一、环境准备
      • 1、docker安装
      • 2、websocket-client安装
      • 3、carlaviz代码下载
  • 二、carlaviz使用
      • 1、打开carla客户端
      • 2、输入启动命令
      • 3、进入carlaviz
      • 4、修改manual_control.py脚本
      • 5、运行manual_control.py脚本
      • 6、运行carlaviz官方脚本(推荐)


前言

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


一、环境准备

1、docker安装

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

点击进入docker官网下载

2、websocket-client安装

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

carlaviz_23">3、carlaviz代码下载

carlaviz github链接

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

在这里插入图片描述

carlaviz_32">二、carlaviz使用

carla_33">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输入启动命令后结果:
在这里插入图片描述

carlaviz_44">3、进入carlaviz

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

在这里插入图片描述

4、修改manual_control.py脚本

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

5、运行manual_control.py脚本

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

在这里插入图片描述

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

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

python">import carla
import random
import time
# from carla_painter import CarlaPainterdef do_something(data):passdef 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 modeprevious_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 vehiclesspawn_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 vehicleblueprints_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 = Nonereturnother_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 actorsego_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 vehiclecamera = 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 worldworld.tick()# save vehicles' trajectories to draw in the frontendtrajectories = [[]]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 vehicleego_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的安装及使用,确实是一个较只管的观测平台,如果能在基础上做控制的开发那就完美了。


http://www.ppmy.cn/news/1521596.html

相关文章

【Go - 10分钟,快速搭建一个简易日志回传系统】

上周一个平凡的工作日傍晚,快要下班的时候,客户端新产品线负责人突然火急火燎的找到我 ,说新的APP马上要release了,发现还少个APP异常崩溃时,用户上报日志的功能 ,需要后端支持,提供个日志回传接…

中新赛克嵌入式面试题及参考答案

目录 在编码中使用过的数据结构 描述如何实现链表 当发生哈希冲突时的解决策略 在调用 malloc 分配内存后确保分配成功的操作 解释 TCP 的三次握手过程及说明两次握手不可行的原因 优化多个客户端同时连接到服务器的连接管理 设计和实现心跳检测机制 在项目中是否使用了…

【数据结构】【java】leetcode刷题记录--链表

简介 链表是一种常见的基础数据结构,它由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。在Java中,链表通常用于实现动态数据结构,因为它可以根据需要动态地增加或减少节点。 链表简介: 节点结构&#…

【开源免费】基于SpringBoot+Vue.JS课程管理平台(JAVA毕业设计)

本文项目编号 T 006 ,文末自助获取源码 \color{red}{T006,文末自助获取源码} T006,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 数据库设计 六、…

针对不同区域的摄像头,完成不同的算法配置的智慧快消开源了

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。 基于多年的深度…

后端开发刷题 | 最长公共子序列(非连续)

描述 给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列。 数据范围:0≤∣str1∣,∣str2∣≤2000 要求:空…

【Java】一文看懂Thread 线程池的 7 种创建方式、任务队列及自定义线程池(代码示例)

本文摘要:【Java】Thread 线程池的 7 种创建方式及自定义线程池(代码示例版) 😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专…

负载均衡 Ribbon 与 Fegin 远程调用原理

文章目录 一、什么是负载均衡二、Ribbon 负载均衡2.1 Ribbon 使用2.2 Ribbon 实现原理 (★)2.3 Ribbon 负载均衡算法 三、Feign 远程调用3.1 Feign 简述3.2 Feign 的集成3.3 Feign 实现原理 (★) 一、什么是负载均衡 《服务治理:Nacos 注册中心》 末尾提到了负载均…

数据治理技术的主要工具和工具集

数据治理技术是确保企业数据质量、安全性、可访问性和合规性的关键手段。为了实现高效的数据治理,企业和组织通常会采用一系列的工具和工具集来支持这一过程。以下是数据治理技术中一些主要工具和工具集的介绍: 一、数据治理平台 数据治理平台是集成多…

阿里云对象存储服务(Aliyun OSS):企业级云存储解决方案

在当今数字化时代,数据的存储、管理和访问已成为企业运营的核心部分。阿里云对象存储服务(Aliyun OSS),作为业界领先的云存储解决方案,提供了一个可靠、安全且易于扩展的存储平台。本文将详细介绍Aliyun OSS的关键特性…

python-小理的三角形

题目描述 小理有一个数组长度大小为 n ,数组中有 n 个正整数。 现在小理请你从其中选出三个元素(注意选择元素的下标不能相同,但是其值可以相同)组成一个三角形。 无法做到,请输出一行一个字符串"No solution&quo…

构建STM32智能平衡车项目:PID控制算法与蓝牙通信技术

一、项目概述 项目目标和用途 本项目旨在设计和实现一款基于STM32单片机的平衡车。平衡车是一种新型的个人交通工具,广泛应用于短途出行、休闲娱乐等场景。通过本项目,我们希望能够实现一款具备良好稳定性和操控性的平衡车,能够在不同的地形…

用矩阵乘法的底层原理来理解“特征融合”

大家好啊,我是董董灿。 在很多 AI 模型中,都会出现内积运算。无论是卷积/全连接还是 Transformer 架构中的矩阵乘法(或线性映射),其核心运算逻辑都是内积运算。 因此,很多时候,我们也把内积运…

celery inspect stats

stats() 方法是Celery inspect 模块中的一个方法,用于收集和返回关于Celery worker的各种统计信息。这些统计信息可以帮助你了解worker的当前状态和性能指标。stats() 返回的结果是一个字典,其中键是worker的名字,值是一个包含多个统计指标的…

反射: 获取变量类型

更高级的编程语言,提供反射、解释机制,获取对象类型非常方便,因为运行时保存有对象的全部信息,也包括类型,而对于编译型语言而言,变量类型要靠编译期或构造/依赖类型某个存储类型的结构。 不同语言的反射 …

Python3.12兼容性问题-ImpImporter替换的解决办法

前言 目前现有的很多Python代码都是基于Python3.8、或者Python3.9的甚至是更早的版本。 当我们用最新的Python3.12来跑这些程序的时候,就会出现很多兼容性的问题。 本文就对“ImpImporter”和“zipimporter”的替换问题给出了一个解决方案。 1、错误描述 Attribu…

类加载过程中的静态成员初始化和实例成员初始化有什么区别?

在C#中,类的加载过程中涉及到静态成员初始化和实例成员初始化,它们之间有几个关键的区别: 初始化时机: 静态成员初始化:静态成员(包括静态字段和静态构造函数中的代码)在类第一次被引用时初始化…

骨传导耳机哪款好?精选五款热门骨传导耳机分享让你避免踩雷

目前在市面当中,骨传导耳机被称之为是黑科技耳机,骨传导耳机拥有很多优势,在听歌时不需要入耳,不会伤耳朵。随着骨传导耳机品牌的不断发展,人们在选购骨传导耳机时,也会觉得非常困难,可能一不小…

mysql的整理

插入数据: INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...); insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,1,Itcast,男,-1,123456789012345678,2000-01-01); insert into employee values(3,3,韦一笑,男,38,1…

OpenJudge | 全在其中

总时间限制: 1000ms 内存限制: 65536kB 描述 你设计了一个新的加密技术,可以用一种聪明的方式在一个字符串的字符间插入随机的字符串从而对信息进行编码。由于专利问题,我们将不会详细讨论如何在原有信息中产生和插入字符串。不过,为了验证…