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

本文主要是介绍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倍数的分辨率设置,还是说我的方法不严谨,欢迎交流。

这篇关于Carla自动驾驶仿真六:pygame多个车辆摄像头画面拼接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/475285

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

struts2中的json返回指定的多个参数

要返回指定的多个参数,就必须在struts.xml中的配置如下: <action name="goodsType_*" class="goodsTypeAction" method="{1}"> <!-- 查询商品类别信息==分页 --> <result type="json" name="goodsType_findPgae"> <!--在这一行进行指定,其中lis是一个List集合,但

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python