Carla自动驾驶仿真六:pygame多个车辆摄像头画面拼接

此文章主要介绍carla前后左右摄像头画面拼接到pygame上

文章目录

  • 前言
  • 一、要点分析
  • 二、完整代码
  • 三、拼接效果
  • 四、总结


前言

1、使用carla做仿真测试或者开发时,如果能够将车辆周边的画面拼接并渲染,可以直观地查看周围地环境,便于调试。本文将介绍使用carla中的camera传感器监控自车周边的画面,并通过pygame可视化。

一、要点分析

1、如果摄像头的横向分辨率image_x如果不为192的倍数,可能会导致内存对齐问题,拼接效果则会出现闪屏;调试了很久才发现这个规律,知道具体原因的大佬可以交流下,猜测是显卡解析相关导致。即:Image_x = 192 * N (N为正整数),下图为分辨率不为192倍数的拼接情况。

在这里插入图片描述

2、camera.listen(lambda data : callback(data)),listen方法是carla中用于设置摄像头传感器的回调函数的。当摄像头传感器捕获到新的图像数据image时,它会调用这个回调函数,并将图像数据image作为参数传递给它。下图中的cala.SensorData就是carla.Image,具体更多内容可以到carla官网查看。

在这里插入图片描述
在这里插入图片描述

3、使用np.concatenate拼接不同摄像头的数据。
1)numpy.concatenate是一个用于将多个数组沿指定轴连接在一起的函数。它的基本语法如下:

numpy.concatenate((a1, a2, ...), axis=0)

2)其中,a1, a2, …是你想要连接的数组,axis参数指定了连接的轴。默认情况下,axis是0,这意味着数组将在垂直方向上(即行方向)连接,当axis=1时,数组将在水平方向上(即列方向)连接。

import numpy as npa = np.array([1, 2])
b = np.array([3, 4])
c = np.concatenate((a, b), axis=0)print(c)  # 输出:[1 2 3 4]==============================a1 = np.array([[1, 2], [3, 4]])
a2 = np.array([[5, 6], [7, 8]])c = np.concatenate((a1, a2), axis=1)print(c)
#输出
[[1 2 5 6][3 4 7 8]]

二、完整代码

import carla
import random
import pygame
import numpy as np# 渲染对象来保持和传递 PyGame 表面
class RenderObject(object):def __init__(self, width, height):init_image = np.random.randint(0, 255, (height, width, 3), dtype='uint8')self.surface = pygame.surfarray.make_surface(init_image.swapaxes(0, 1))# 相机传感器回调,将相机的原始数据重塑为 2D RGB,并应用于 PyGame 表面
def pygame_callback(image, side):img = np.reshape(np.copy(image.raw_data), (image.height, image.width, 4))img = img[:, :, :3]img = img[:, :, ::-1]if side == 'Front':global FrontFront = imgelif side == 'Rear':global RearRear = imgelif side == 'Left':global LeftLeft = imgelif side == 'Right':global RightRight = imgif ('Front' in globals() and 'Rear' in globals()and "Left" in globals()and 'Right' in globals()):# 横向拼接(前后)(左右)摄像头的画面img_combined_front = np.concatenate((Front, Rear), axis=1)img_combined_rear = np.concatenate((Left, Right), axis=1)# 纵向拼接(前后)(左右)摄像头的画面img_combined = np.concatenate((img_combined_front, img_combined_rear), axis=0)renderObject.surface = pygame.surfarray.make_surface(img_combined.swapaxes(0, 1))class cameraManage():def __init__(self, world, ego_vehicle, pygame_size):self.world = worldself.cameras = {}self.ego_vehicle = ego_vehicleself.image_size_x = int(pygame_size.get("image_x") / 2)  # 横向放置两个摄像头的画面self.image_size_y = int(pygame_size.get("image_y") / 2)  # 纵向放置两个摄像头的画面def camaraGenarate(self):cameras_transform = [(carla.Transform(carla.Location(x=2.0, y=0.0, z=1.3),  # 前侧摄像头安装位置carla.Rotation(pitch=0, yaw=0, roll=0)), "Front"),(carla.Transform(carla.Location(x=-2.0, y=0.0, z=1.3),  # 后侧摄像头安装位置carla.Rotation(pitch=0, yaw=180, roll=0)), "Rear"),(carla.Transform(carla.Location(x=0.0, y=2.0, z=1.3),  # 左侧摄像头安装位置carla.Rotation(pitch=0, yaw=90, roll=0)), "Left"),(carla.Transform(carla.Location(x=0.0, y=-2.0, z=1.3),  # 右侧的摄像头安装位置carla.Rotation(pitch=0, yaw=-90, roll=0)), "Right")]# 查找RGB相机蓝图camera_bp = self.world.get_blueprint_library().find('sensor.camera.rgb')# 设置摄像头的fov为90°camera_bp.set_attribute('fov', "90")# 设置摄像头的分辨率camera_bp.set_attribute('image_size_x', str(self.image_size_x))camera_bp.set_attribute('image_size_y', str(self.image_size_y))# 生成摄像头for index, (camera_ts, camera_sd) in enumerate(cameras_transform):camera = self.world.spawn_actor(camera_bp, camera_ts, attach_to=self.ego_vehicle)self.cameras[camera_sd] = camerareturn self.camerasif __name__ == "__main__":# 连接到客户端并检索世界对象client = carla.Client('localhost', 2000)world = client.get_world()# 获取地图的刷出点spawn_point = random.choice(world.get_map().get_spawn_points())# 生成车辆并设置自动驾驶vehicle_bp = world.get_blueprint_library().filter('*vehicle*').filter('vehicle.tesla.*')[0]ego_vehicle = world.spawn_actor(vehicle_bp, spawn_point)# ego_vehicle.set_autopilot(True)#设置pygame窗口size,image_x为192的整数倍,用其他分辨率会闪屏,可能是显卡解析原因导致。pygame_size = {"image_x": 1152,"image_y": 600}#调用cameraManage类,生成摄像头cameras = cameraManage(world, ego_vehicle, pygame_size).camaraGenarate()#采集carla世界中camera的图像cameras.get("Front").listen(lambda image: pygame_callback(image, 'Front'))cameras.get("Rear").listen(lambda image: pygame_callback(image, 'Rear'))cameras.get("Left").listen(lambda image: pygame_callback(image, 'Left'))cameras.get("Right").listen(lambda image: pygame_callback(image, 'Right'))# 为渲染实例化对象renderObject = RenderObject(pygame_size.get("image_x"), pygame_size.get("image_y"))# 初始化pygame显示pygame.init()gameDisplay = pygame.display.set_mode((pygame_size.get("image_x"), pygame_size.get("image_y")),pygame.HWSURFACE | pygame.DOUBLEBUF)# 循环执行crashed = Falsewhile not crashed:# 等待同步world.tick()# 按帧更新渲染的 Camera 画面gameDisplay.blit(renderObject.surface, (0, 0))pygame.display.flip()# 获取 pygame 事件for event in pygame.event.get():# If the window is closed, break the while loopif event.type == pygame.QUIT:crashed = True# 结束ego_vehicle.destroy()camera = cameras.values()for cam in camera:cam.stoppygame.quit()

三、拼接效果

在这里插入图片描述


四、总结

欢迎各位大佬来交流,特别是为什么只支持192倍数的分辨率设置,还是说我的方法不严谨,欢迎交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/210478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 工厂模式 + 抽象类 + 泛型干掉重复代码

业务场景:N个Excel导入,实现动态加载,只需要定义Excel实体,即可实现功能开发, 核心代码 import cn.afterturn.easypoi.excel.annotation.ExcelTarget; import cn.hutool.core.annotation.AnnotationUtil; import cn.h…

删除Windows系统中无用的隐藏设备

一些即插即用设备会占用一些隐藏的系统资源,比如USB转串口的设备会占用COM号码,网卡会占用静态IP地址等等。 通常我们使用设备管理器的显示隐藏设备功能,来删除这些设备。但是设备管理器每次只允许删除一个设备,如果设备太多了&a…

【算法集训】基础数据结构:四、栈

栈理解了两天,所以迟了一天发。 一、栈的概念 栈是一个容器,是一个先进后出的线性表,类似与日常生活中的电梯、杯子等。 仅限在表尾部进行插入和删除操作。 使用链表来模拟栈: typedef int DataType; 相当于给int起一个别名 st…

Go 协程基础:轻松入门并发编程,解析 Goroutines 的奥秘

一、协程基本使用 1、启动一个协程 主线程中每个100毫秒打印一次,总共打印2次另外开启一个协程,打印10次情况一:打印是交替,证明是并行的情况二:开启的协程打印2次,就退出了(因为主线程退出了…

做题笔记:SQL Sever 方式做牛客SQL的题目--SQL157

----SQL157 平均播放进度大于60%的视频类别 计算各类视频的平均播放进度,将进度大于60%的类别输出。 注: 播放进度播放时长视频时长*100%,当播放时长大于视频时长时,播放进度均记为100%。 结果保留两位小数,并按播放进…

基于ssm的学生公寓管理中心系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本学生公寓管理中心系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…

[报错]记录IDEA远程开发报错:java: Cannot run program.....

报错内容 IDEA在进行远程开发的时候报错,内容如下: java: Cannot run program "/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java" (in directory "/home/jim/.cache/JetBrains/RemoteDev-IU/_home_jim_DevCodes_Github_zfile/compile-…

redis主从复制【面试必看】

在分布式系统中,希望使用多个服务器来部署redis,存在以下几种redis的部署方式 主从模式主从哨兵集群模式 主从模式 在若干个redis节点中,有的是主节点,有的是从节点 假设有三个物理服务器(称为是三个节点&#xff…

(JSP)EL——优化登录界面,获取对象,获取数据

EL优化登录界面 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"reques…

生产工序(oj题)

很有趣的一道题 关键在于固定工序的整合 看样例是固定工序中间是不能插入其他工序的&#xff08;也不讲清楚&#xff09;&#xff0c;如果可以的话&#xff0c;只能说可能会更麻烦 注意固定工序是按照固定工序中的第一个工序进行排序的 整合完之后&#xff0c;就是递归列出…

Java中的IO流①——IO流的体系、字节流、try...catch异常处理

概述 IO流的分类 IO流的体系 这四个类都是抽象类&#xff0c;所以需要实现类对象才能使用---> 字节流 FileInputStream--> 书写细节 代码示范 此时文件a.txt内容为abcde 使用char强转和read方法调用五次read方法--> public static void main(String[] args) throws IO…

mysql 语言学习

整理了一下 mysql 操作语言&#xff0c;不是很全&#xff0c;部分地方也许需要修改&#xff0c;先放上来&#xff0c;有时间再慢慢完善。 一、数据库操作 连接数据库 $ sudo mysql [-h ip] -u root -p [-P 3306] 初始化数据库 $ mysql_secure_installation备份数据库 # 备…

初出茅庐的小李博客之TobudOS移植到EVB_AIoT开发板

本博客参考教程&#xff1a; https://atomgit.com/OpenAtomFoundation/TobudOS/blob/master/doc/TobudOS_EVB_AIoT_STM32_Guide.md 介绍一下EVB_AIoT开发板 这个开发板是由TobudOS开源社区联合意法半导体、南京厚德物联网设计的一款高性能IoT开发平台&#xff0c;主控芯片是S…

SystemVerilog学习(0)——目录与传送门

一、验证导论 SystemVerilog学习&#xff08;1&#xff09;——验证导论-CSDN博客文章浏览阅读403次。SystemVerilog自学&#xff0c;验证系统概述&#xff0c;什么是SVhttps://blog.csdn.net/apple_53311083/article/details/133953016 二、数据类型 SystemVerilog学习&…

含掩膜mask的单通道灰度图转化为COCO数据集格式标签的json文件(python)

输入&#xff1a;单通道的灰度图&#xff0c;灰度图内含掩膜mask 目标&#xff1a;把灰度图中的语义mask转换为COCO数据集格式的json文件 输出&#xff1a;COCO数据集格式的json文件 期间遇到的问题&#xff1a; 发现有的掩膜内部存在其他类别的掩膜&#xff0c;即mask内部还套…

枚举类简单使用

1、创建一个枚举 public enum DemoEnum {// 引号里面存放的是下面所创建的属性&#xff0c;如果不创建属性则不能输入引号里的值的NORMAL("正常"),DESTORY("废弃");private String label;private DemoEnum(String label){this.label label;}public Strin…

使用.net core MVC实现图片上传下载

今天闲来无事&#xff0c;复习复习 1、上传 上传界面 <div class"text-center"><h1 class"display-4">Welcome</h1><form method"post" enctype"multipart/form-data" asp-controller"Home" asp-ac…

<HarmonyOS主题课>三方库【课后考核】

【习题】三方库 判断题 三方组件是开发者在系统能力的基础上进行了一层具体功能的封装&#xff0c;对其能力进行拓展的工具 。 正确(True) 可以通过ohpm uninstall 指令下载指定的三方库 错误(False) lottie使用loadAnimation方法加载动画。 正确(True) 单选题 通过ohpm安…

@FunctionalInterface、Lambda表达式和方法引用

知识不回顾是会被遗忘的&#xff01; 网上看了一些相关文章&#xff0c;这里记录一下&#xff0c;仅供参考 Java语言从JDK1.8开始引入了函数式编程。 函数式编程的核心特点是&#xff0c;函数作为一段功能代码&#xff0c;可以像变量一样进行引用和传递&#xff0c;以便在有需…

stm32 使用18B20 测试温度

用18b20 测试温度是非常常用的&#xff0c;不过18B20的调试不是这么容易的&#xff0c;有些内容网上很多的&#xff0c;不再重复说了&#xff0c;我先把波形说一下&#xff0c;再说程序部分&#xff1a; 整个都温度数据的顺序是&#xff1a; 1.700uS的低电平复位并测试18B20的…