Carla仿真二:Carla多视图切换代码详解

news2024/12/27 11:39:02

文章目录

  • 前言
  • 一、Carla多视图切换效果
  • 二、Camera安装坐标系
      • 1、Carla.Location
      • 2、Carla.Rotation
  • 三、接口及代码详解
      • 1、接口介绍
      • 2、生成上帝视图代码
      • 3、生成Camera视图代码
  • 四、完整代码


前言

1、Carla提供了大量的Python API接口,用户可以通过查找文档实现各类功能,本文介绍该如何通过Tab按键实现多视图切换的功能,视图切换方便我们调试功能以及摄像头画面注入;

2、一般的画面我们可以通过生成Camera,然后将Camera画面设置为当前视图;但是上帝视图我通过设置Camera来实现,但我发现画面会出现严重抖动,后面改成直接生成相对自车的视图就好了;


提示:以下是本篇文章正文内容,下面案例可供参考

一、Carla多视图切换效果

上帝视图:
在这里插入图片描述

后往前视图:
在这里插入图片描述

前视图:
在这里插入图片描述

后视图:
在这里插入图片描述

左视图:

在这里插入图片描述
右视图:
在这里插入图片描述

二、Camera安装坐标系

坐标原点是BoudingBox中心点

1、Carla.Location

在这里插入图片描述

2、Carla.Rotation

在这里插入图片描述

注意:生成摄像头的时候有三种附加方式,Rigid、SpringArm、SpringArmGhost,这里先引入这个坐标系,后面会具体讲到哪里会用到;

1、Rigid:生成摄像头的时候选择Rigid模式,视觉效果不好,画面会抖动,它附加在目标上的坐标系如下;
在这里插入图片描述

2、SpringArmGhost:叫做幽灵弹簧臂,不仅会跟随目标物跳过障碍物遮挡,还会自动调整运动的画面,使得画面变得平滑,UE4官方给出的SpringArmGhost效果如下图:

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

但是SpringArmGhost模式下的Roll有点奇怪,我调参的时候发现当Z轴值不为0时,0°的时候视角有点朝上,具体什么原因我也没搞懂,官方好像也不太清楚是什么原因,可能UE官方才知道什么原因,有懂的小伙伴可以分享下。

在这里插入图片描述

三、接口及代码详解

1、接口介绍

1)get_spectator是获得观察者,我们可以通过设置观察者的坐标系来获取视图;
在这里插入图片描述
2)获取坐标系信息,我们可以获取Camera坐标系,也可以获取车辆的坐标系;
在这里插入图片描述

3)set_transform设置观察者坐标系;
在这里插入图片描述
4)Carla坐标系,参考第二大点,Camera安装参照坐标系;
在这里插入图片描述

5)生成actor,可以用来生成车辆、Camera等,attahment设置附加的类型,上面有讲到他的种类
在这里插入图片描述
···
在这里插入图片描述

2、生成上帝视图代码

1)生成上帝视图不能使用Camera画面作为当前观察视图(会出现抖动的情况),而是通过直接设置相对于自车的观察视图,由于车的位置时刻在变因此更新每一帧的坐标:

import carla

#获得当前车辆的坐标系
Vehicle_transform = vehicle.get_transform()
#更新观察坐标系,在车辆坐标的基础上修改坐标
spectator_tranform = carla.Transform(Vehicle_transform .location + carla.Location(z=50),
            						carla.Rotation(pitch=-90))
#设置观察坐标系
world.get_spectator().set_transform(spectator_tranform )

3、生成Camera视图代码

import carla

#查找Camera蓝图
camera_bp = world.get_blueprint_library().find('sensor.camera.rgb')
#设置生成Camera的附加类型为SpringArmGhost
Atment_SpringArmGhost = carla.libcarla.AttachmentType.SpringArmGhost
#设置Camera的安装坐标系
Camera_transform = carla.Transform(carla.Location(x=-8, y=0, z=5),
                            carla.Rotation(pitch=15, yaw=0, roll=0))
#生成Camera
camera = world.spawn_actor(camera_bp, Camera_transform,attach_to=vehicle,
							attachment_type=Atment_SpringArmGhost )
#设置观察者视图
 world.get_spectator().set_transform(camera.get_transform())

四、完整代码

import carla
import random
import time
import threading
import keyboard

threads = []

def updateSpectator(vehicle,world):
    spectator_obj_list =[]

    #获得车辆的中心点,并将点定位到右上角,便于运算
    bound_x = 0.5 + vehicle.bounding_box.extent.x
    bound_y = 0.5 + vehicle.bounding_box.extent.y
    bound_z = 0.5 + vehicle.bounding_box.extent.z

    #查找相机蓝图
    camera_bp = world.get_blueprint_library().find('sensor.camera.rgb')

    #设置Camera的附加类型Camera跟随车辆(幽灵模式);
    Atment_SpringArmGhost = carla.libcarla.AttachmentType.SpringArmGhost

    Atment_Rigid = carla.libcarla.AttachmentType.Rigid

    #设置相对车辆的安装位置,配置上帝视图(Camera无法实现上帝视图,画面会抖动)
    Vehicle_transform_list = [
                            (carla.Location(z=50),carla.Rotation(pitch=-90))
    ]

    #设置camera的安装位置,配置后往前视图以及前后左右视图
    Camera_transform_list = [
                            (carla.Transform(carla.Location(x=-8, y=0, z=5),
                            carla.Rotation(pitch=15, yaw=0, roll=0)),Atment_SpringArmGhost),

                            (carla.Transform(carla.Location(x=bound_x, y=0, z=bound_z),
                            carla.Rotation(pitch=-15, yaw=180, roll=0)),Atment_SpringArmGhost),

                            (carla.Transform(carla.Location(x=-bound_x, y=0, z=bound_z),
                            carla.Rotation(pitch=-15, yaw=-180, roll=0)),Atment_SpringArmGhost),

                            (carla.Transform(carla.Location(x=bound_x-0.5, y=-bound_y, z=bound_z),
                            carla.Rotation(pitch=-15, yaw=120, roll=20)),Atment_SpringArmGhost),
                            
                            (carla.Transform(carla.Location(x=bound_x-0.5, y=bound_y, z=bound_z),
                            carla.Rotation(pitch=-15, yaw=-120, roll=-20)),Atment_SpringArmGhost)                                     
        ]
    

    #拼接两个transform_list
    spectator_transform_list = Vehicle_transform_list + Camera_transform_list
    
    #上帝视图坐标系以及所有camera对象填入spectator_obj_list;
    for spectator_transform_index in spectator_transform_list:
            
            #spectator_transform_list第0个元素为上帝视图坐标系
            if spectator_transform_list.index(spectator_transform_index) ==0:
                spectator_obj_list.append(spectator_transform_index)
            
            #spectator_transform_list其余元素为Camera安装参数,下面生成Camera对象
            else:
                camera = world.spawn_actor(camera_bp, spectator_transform_index[0],
                attach_to=vehicle,attachment_type=spectator_transform_index[1])
                spectator_obj_list.append(camera)
    
    #设置Vehicle_transform_list[0]为初始视图(上帝视图);
    spectator_obj = Vehicle_transform_list[0]

    # 每一帧都需要更新视图,因为坐标时刻在变化;
    while True:
        #按Tab键切换
        if keyboard.is_pressed("tab"):
            #上一个spectator的索引号;
            last_spectator_obj_index =  spectator_obj_list.index(spectator_obj)
            #计算下一个spectator的索引,如果列表索引超限则重新拿第0个spectator;
            spectator_obj_index = last_spectator_obj_index +1 if len(spectator_obj_list) - last_spectator_obj_index -1 > 0 else 0
            spectator_obj = spectator_obj_list[spectator_obj_index]
            time.sleep(0.2)

        #更新视图
        if spectator_obj_list.index(spectator_obj) == 0:
            #设置上帝视图
            Vehicle_transform = carla.Transform(vehicle.get_transform().location + spectator_obj_list[0][0],
            spectator_obj_list[0][1])
            world.get_spectator().set_transform(Vehicle_transform)
        else:
            #设置其他Camera视图
            world.get_spectator().set_transform(spectator_obj.get_transform())


def autopilot(vehicle):
    #自动领航
    vehicle.set_autopilot()
    
try:
    # 连接至服务器
    client = carla.Client('localhost', 2000)
    client.set_timeout(10)

    # 获取世界对象
    world = client.get_world()

    # 获取车辆原型
    car_blueprnt = world.get_blueprint_library().filter('vehicle.tesla.*')[0]
    car_blueprnt.set_attribute('role_name', 'ego_vehicle')

    # 在随机位置生成车辆
    spawn_point = random.choice(world.get_map().get_spawn_points())
    vehicle = world.spawn_actor(car_blueprnt, spawn_point)

    # 创建自动运行车辆的线程
    Thread_autopilot = threading.Thread(target=autopilot(vehicle))

    # 创建切换视图的线程
    Thread_updateSpectator = threading.Thread(target=updateSpectator(vehicle,world))

    #添加线程
    threads.append(Thread_autopilot)
    threads.append(Thread_updateSpectator)
    for thread in threads:
        thread.start()

finally:
    # 销毁车辆
    vehicle.destroy()

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

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

相关文章

【前缀和】

目录知识框架No.0 筑基No.1 普通前缀和题目来源:牛客网-NC14556:数圈圈题目来源:牛客网-NC14600:珂朵莉与宇宙题目来源:牛客网-NC21195 :Kuangyeye and hamburgers题目来源:牛客网-NC19798&…

混合开发中h5前端离线打包规范流程

1、离线化的目的 首先在H5Native的混合开发实战中,让人头疼最多的恐怕就是网页加载过程中的白屏了,以及弱网、断网状态下h5页面无法正常加载的问题,那么为了解决这些问题,我们H5端跟原生端共同讨论采用Hybrid App离线加载方案&…

fiddler(抓包)的用法和HTTP 协议的基本格式

目录 fiddler(抓包)用法: HTTP 协议的基本格式 HTTP请求: 首行 认识HTTP方法 GET和POST的典型区别: 认识请求“报头”(header) HTTP 响应 HTTP状态码: 状态码的分类: 认识响应 …

SD-WAN基本介绍

一、SD-WAN是什么?它能为我们带来什么? SD-WAN,即软件定义广域网络,是将SDN技术应用到广域网场景中所形成的一种服务。这种服务用于连接广阔地理范围的企业网络、数据中心、互联网应用及云服务,旨在帮助用户降低广域网…

STL——array和vector容器

📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段>——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程&…

解密HTTP协议:探索其组成部分与工作原理

前言 欢迎来到今天的每日一题,每日一提。昨天有聊到,HTTP 和 HTTPS 之间有什么区别?面试官基本秉承着刨根问题的原则,肯定是不会轻易放过我们的,那么自然是要继续拷问了。所以我们今天就聊聊什么是 HTTP,它…

微服务分布式搜索引擎 Elastic Search RestClient 操作文档

文章目录⛄引言一、初始化 Java RestClient二、RestClient 对文档的CRUD操作⛅新增文档⏰查询文档⚡修改文档⌚删除文档三、RestClient 批量文档导入⛵小结⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能…

SpringBoot整合XXL-JOB

XXL-JOB: 官网文档地址:分布式任务调度平台XXL-JOB GitHub地址:https://github.com/xuxueli/xxl-job Gitee地址:https://gitee.com/xuxueli0323/xxl-job 拉取代码,首先执行一下doc/db下的sql文件 tables_xxl_job.sq…

JAVA识别电子发票问题汇总

之前写的java解析电子发票,上线后出现了一下线上的问题,无法解析发票,对问题做个规整,仅供参考! 1. Pdfbox介绍 pdfbox是一款Apache的开源工具,可以进行对pdf进行操作,如题,转图片…

UE4C++学习篇(十九)-- 动画蒙太奇初级使用

用一个第三人称的射击案例来简单介绍一下动画蒙太奇的使用,动画蒙太奇的具体介绍这里就不多说了,不知道的小伙伴可以去搜一下了解。 这里介绍角色射击,射击的时候播放一个射击动画。 选中需要创建出动画蒙太奇的动画,点击创建&am…

物理服务器通过U盘安装CentOS 7操作系统

一、制作U盘启动盘 1、使用UltraISO工具打开需要安装的操作系统iso镜像文件(我安装的是CentOS-7-x86_64-Minimal-2009.iso),如下图所示 镜像下载地址:centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 2、将该系统镜像…

nginx--官方模块

目录 1.概述 2.Nginx的客户端状态 1.使用 2.目录中选择一个随机主页 3.http内容替换 ​编辑 4.nginx请求限制 5.nginx访问控制 1.基于Ip的访问控制 1.1使用 1.2access_mod.conf 1.3只允许自己ip访问 1.4http_x_forwarded_for 1.5http_access_module局限性 2.基于…

【用python将文件夹下面的文件夹里面的文件全部提取出来,并且放到一个新的文件夹】

文件里面有多个文件,每个文件下面有很多jpg格式的照片,把所有照片提取出来并且放在一个新的文件夹下面。 可以使用Python的os和shutil库来完成这个任务。 比如说:我的faces95文件夹下面有95个文件,每个文件下面有十七到十八个照片…

深拷贝和浅拷贝

目录 一.Java的Cloneable和clone()方法 1.Object类中的clone() 2.实现Cloneable接口的类 3.通过clone()生成对象的特点 二.深拷贝和浅拷贝 1.浅拷贝 2.深拷贝 3.实现深拷贝的两种方法 1.一种是递归的进行拷贝 2.Json字符串的方式进行深拷贝 一.Java的Cloneable和clone…

No.037<软考>《(高项)备考大全》【第21章】项目组合管理

【第21章】项目组合管理1 考试相关2 项目组合管理2.1 项目组合管理、项目集管理、项目管理异同2.2 项目组合管理过程组3 练习题参考答案1 考试相关 选择1分必考 案例概率低,知识点看一遍即可 2 项目组合管理 1、项目组合是将项目、项目集,以及其他方面…

2023年MathorCup数学建模赛题浅析

MathorCup俗称妈杯,是除了美赛国赛外参赛人数首屈一指的比赛,而我们的妈杯今天也如期开赛。今年的妈杯难度,至少在我看来应该是2023年截至目前来讲最难的一场比赛。问题的设置、背景的选取等各个方面都吐露着我要难死你们的想法。难度是恒定的…

Servlet、SpringMVC、SpringBoot整合Thymeleaf汇总

介绍 模板引擎,与JSP、JSTL类似。 好处是:直接写在HTML文件中,服务器可以解析,浏览器也可以解析,实现了动静分离,并未破坏html结构,即使无网络、不通过后端渲染也能在浏览器成功打开&#xff…

kettle——数据清洗(数据表-->文本文件)

实验步骤: 1.数据表(图片加分析,创建表的过程和对应的字段及记录) ①选择数据库 ②创建表结构 ③插入数据 2.kettle连接模块(图片加分析,每个模块实现的功能) ①新建“转换”文件,”文件”——>“新建…

JAVA开发运维(Jenkins中踩的坑)

最近尝试通过Jenkins来自动化部署项目,没想到还踩了很多坑。Jenkins部署的基本原理: 通过Jenkins服务器拉取gitlab上的代码进行打包,推送到目标服务器上,并运行启动脚本。 那么Jenkins就要解决三个问题。 1.连接上目标服务器 …

电子行业应如何实施数字工厂管理系统

随着信息技术的快速发展,电子制造企业也正在逐步做好数字化转型,而数字工厂管理系统便是数字化管理中的一个重要系统。数字工厂系统可以帮助电子企业实现生产过程的自动化、智能化和可视化,提高生产效率,降低生产成本,…