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

这篇具有很好参考价值的文章主要介绍了Carla自动驾驶仿真六:pygame多个车辆摄像头画面拼接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


前言

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

一、要点分析

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

自动驾驶侧后相机和侧前相机拼接,Carla,pygame,自动驾驶,python

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

自动驾驶侧后相机和侧前相机拼接,Carla,pygame,自动驾驶,python
自动驾驶侧后相机和侧前相机拼接,Carla,pygame,自动驾驶,python

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

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

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

import numpy as np

a = 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 Front
        Front = img
    elif side == 'Rear':
        global Rear
        Rear = img
    elif side == 'Left':
        global Left
        Left = img
    elif side == 'Right':
        global Right
        Right = img

    if ('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 = world
        self.cameras = {}
        self.ego_vehicle = ego_vehicle
        self.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] = camera
        return self.cameras


if __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 = False
    while 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 loop
            if event.type == pygame.QUIT:
                crashed = True

    # 结束
    ego_vehicle.destroy()
    camera = cameras.values()
    for cam in camera:
        cam.stop
    pygame.quit()

三、拼接效果

自动驾驶侧后相机和侧前相机拼接,Carla,pygame,自动驾驶,python


四、总结

欢迎各位大佬来交流,特别是为什么只支持192倍数的分辨率设置,还是说我的方法不严谨,欢迎交流。文章来源地址https://www.toymoban.com/news/detail-793571.html

到了这里,关于Carla自动驾驶仿真六:pygame多个车辆摄像头画面拼接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • klipper使用webcam设置多个摄像头方式

    使用klipper设置多个摄像头,折腾了好些天,网上资料很少,这里写一个帖子记录一下 参考链接:https://www.cnblogs.com/sjqlwy/p/klipper_webcam.html 我的klipper安装在香橙派上面,系统是debian,使用双摄像头有些卡,建议树莓派3B+以上 首先连接多个摄像头,这是扩展摄像头的第一步,注

    2024年02月06日
    浏览(48)
  • 车辆驾驶自动化分级

    由人类驾驶员全权操作车辆,车辆在行驶中可以得到预警和保护系统的辅助作用 在系统作用范围内,通过系统对转向、制动、驱动等系统中的一项进行短时间连续控制,其他的驾驶动作都由人类驾驶员进行操作 在系统作用范围内,通过系统对转向、制动、驱动等系统中的多

    2024年02月16日
    浏览(45)
  • 自动驾驶——车辆动力学模型

    A矩阵离散化 B矩阵离散化 反馈计算 前馈计算: 超前滞后反馈:steer_angle_feedback_augment 参考【运动控制】Apollo6.0的leadlag_controller解析 控制误差计算 横向距离误差计算 横向误差变化率计算 航向角误差计算 航向角误差变化率计算 参考:Apollo代码学习(三)—车辆动力学模型

    2024年02月12日
    浏览(57)
  • 自动驾驶TPM技术杂谈 ———— 车辆分类

    机动车规格分类 分类 说明 汽车 载客汽车 大型 车长大于或等于 6000mm 或者乘坐人数大于或等于20 人的载客汽车。 中型 车长小于 6000mm 且乘坐人数为10~19 人的载客汽车。 小型 车长小于 6000mm 且乘坐人数小于或等于9 人的载客汽车,但不包括微型载客汽车。 微型 车长小于或等

    2024年02月09日
    浏览(40)
  • 全网最简单实用Android摄像头开发,同时预览多个摄像头,双目摄像头,同时打开手机前后摄像头(红外摄像头、人脸识别、活体检测、Android Camera、缩放、焦距、旋转、镜像、截图保存)

    如果你受够了网上那些乱七八糟的代码,你可以了解下我这个,能同时打开多个摄像头,在界面上预览,并且可以取得摄像头数据,byte[] 转为 Bitmap,保存为 jpg图片。 最近我们的某个项目要加上Android人脸识别,虽然有别人写好的“考勤”、“门口闸机”这些,但不能直接用

    2024年02月08日
    浏览(78)
  • 基于android的 rk3399 同时支持多个USB摄像头

    一、前文 在这里插入图片描述 二、CameraHal_Module.h 三、CameraHal_Module.cpp 四、编译烧录Image 该部分的修改要生效的话,需要进行全编译 五、App验证 AndroidManifest.xml MainActivity.java activity_main.xml

    2024年02月08日
    浏览(50)
  • Android studio APK切换多个摄像头(Camera2)

    1.先设置camera的权限 2.布局 3.主界面代码 这部分代码是用来授权AndroidManifest.xml里面权限的第三方sdk代码 效果:

    2024年02月11日
    浏览(52)
  • 自动驾驶车辆运动规划方法综述 - 论文阅读

    本文旨在对自己的研究方向做一些记录,方便日后自己回顾。论文里面有关其他方向的讲解读者自行阅读。 参考论文:自动驾驶车辆运动规划方法综述 1 摘要 规划决策模块中的运动规划环节负责生成车辆的 局部运动轨迹 ,决定车辆行驶质量的决定因素 未来关注的重点: (

    2024年01月17日
    浏览(60)
  • 自动驾驶控制算法——车辆动力学模型

    考虑车辆 y 方向和绕 z 轴的旋转,可以得到车辆2自由度模型,如下图: m a y = F y f + F y r (2.1) ma_y = F_{yf} + F_{yr} tag{2.1} m a y ​ = F y f ​ + F yr ​ ( 2.1 ) I z ψ ¨ = l f F y f − l r F y r (2.2) I_zddotpsi = l_fF_{yf} - l_rF_{yr} tag{2.2} I z ​ ψ ¨ ​ = l f ​ F y f ​ − l r ​ F yr ​ ( 2.2 ) 经验公

    2024年01月18日
    浏览(58)
  • 自动驾驶港口车辆故障及事故处理机制

    (1)单一传感器数据异常处理。自动驾驶电动平板传感方案为冗余设置,有其他传感器能够覆盖故障传感器观测区域,感知/定位模块将数据异常情况发给到规划决策模块,由“大脑”向中控平台上报故障,同时继续进行当前任务,任务完成后自主前往预设维修地点,或根据

    2024年02月12日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包