在CARLA中手动开车,添加双目相机stereo camera,激光雷达Lidar

CARLA的使用逻辑:

首先创建客户端

设置如果2秒没有从服务器返回任何内容,则终止

client = carla.Client("127.0.0.1", 2000)
client.set_timeout(2.0)

从客户端中get world

world = client.get_world()

设置setting并应用

这里使用固定时间步长的异步模式

settings = world.get_settings()
settings.synchronous_mode = False    # Enables synchronous mode
settings.fixed_delta_seconds = None
delta = 0.05
settings.fixed_delta_seconds = delta
world.apply_settings(settings)

设置traffic manager

traffic_manager = client.get_trafficmanager(8000)
traffic_manager.set_synchronous_mode(False)
traffic_manager.set_random_device_seed(0)
random.seed(0)

创建一个观察视角

spectator是我们观察的视角,在后面的循环中,我们让视角始终跟随车,显示从上往下看的车的俯视图

spectator = world.get_spectator()

 从map中获得所有可行的出生点

spawn_points是所有可行的出生点,在后面生成车的时候要指定一个出生点。

spawn_points = world.get_map().get_spawn_points()

carla中添加任何东西(车辆,相机,激光雷达等)的逻辑是:

以车为例,添加车的逻辑是:先从world中get所有东西的blueprint库,从所有blueprint库中filter车的blueprint,再将车的blueprint与出生点结合,生成一个车。

blueprint_library = world.get_blueprint_library()
vehicle_bp = blueprint_library.filter("model3")[0]
vehicle = world.try_spawn_actor(vehicle_bp, spawn_points[0])

blueprint_library是所有blueprint的库,vehicle_bp是车的blueprint,与一个出生点结合,生成车的实例vehicle。

相机也是同样的逻辑:

camera_init_trans = carla.Transform(carla.Location(x=1, y=-1, z=2), carla.Rotation(pitch=0))
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera_bp.set_attribute("image_size_x", str(1280))
camera_bp.set_attribute("image_size_y", str(720))
camera_bp.set_attribute("fov", str(105))
camera = world.spawn_actor(camera_bp, camera_init_trans, attach_to=vehicle)

相机要设置附着在车上面,carla.Location是固定在车身的随车坐标系,原点的高度在车轮与地面接触的平面,俯视图看原点在车的中心。x轴正方向指向车头,y轴指向车辆右舷,z轴指向天空,单位是米。

相机监听回调函数:

# Get camera dimensions
image_w = camera_bp.get_attribute("image_size_x").as_int()
image_h = camera_bp.get_attribute("image_size_y").as_int()# Instantiate objects for rendering and vehicle control
renderObject = RenderObject(image_w, image_h)
controlObject = ControlObject(vehicle)camera.listen(lambda image: pygame_callback1(image, renderObject))

carla中没有双目相机,需要自己添加两个rgb相机实现双目相机的效果。

如何理解CARLA中相机的焦距的概念?

定义相机的时候,没有焦距这个概念,首先定义窗口的大小,也就是相当于相机的传感器横竖各有多少像素,再定义fov视角范围,单位是度,定义好这两个概念,相机的焦距f根据这两个数来算,如果双目相机恢复深度,需要这样去算f。假如相机的归一化平面,即距离相机z=1米的位置(这个z是slam相机坐标系,不是carla坐标系)有一根横棒,那么多长的横棒可以正好横向填满相机传感器,根据视角范围fov解相似三角形,求出slam中定义的相机内参概念f,窗口大小的一般,也就是slam中相机内参的c

键盘控制器:

见完整代码 ControlObject类

每一步循环中:

world.tick() # 获取服务器结果
# 获取观察视角
transform = vehicle.get_transform()  # we get the transform of vehicle
spectator.set_transform(carla.Transform(transform.location + carla.Location(z=50),carla.Rotation(pitch=-90)))for event in pygame.event.get():  # 获取键盘操作

完整代码:

import carla
import random
import time
import sys
import pygame
import datetime
import numpy as np
import open3d as o3d
from matplotlib import cmVIDIDIS = np.array(cm.get_cmap("plasma").colors)
VID_RANGE = np.linspace(0.0, 1.0, VIDIDIS.shape[0])# Render object to keep and pass the PyGame surface
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))# Control object to manage vehicle controls
class ControlObject(object):def __init__(self, veh):# Conrol parameters to store the control stateself._vehicle = vehself._steer = 0self._throttle = Falseself._brake = Falseself._steer = Noneself._steer_cache = 0# A carla.VehicleControl object is needed to alter the# vehicle's control stateself._control = carla.VehicleControl()# Check for key press events in the PyGame window# and define the control statedef parse_control(self, event):if event.type == pygame.KEYDOWN:if event.key == pygame.K_RETURN:self._vehicle.set_autopilot(True)if event.key == pygame.K_UP:self._throttle = Trueif event.key == pygame.K_DOWN:self._brake = Trueif event.key == pygame.K_RIGHT:self._steer = 1if event.key == pygame.K_LEFT:self._steer = -1if event.type == pygame.KEYUP:if event.key == pygame.K_UP:self._throttle = Falseif event.key == pygame.K_DOWN:self._brake = Falseself._control.reverse = Falseif event.key == pygame.K_RIGHT:self._steer = Noneif event.key == pygame.K_LEFT:self._steer = None# Process the current control state, change the control parameter# if the key remains presseddef process_control(self):if self._throttle:self._control.throttle = min(self._control.throttle + 0.01, 1)self._control.gear = 1self._control.brake = Falseelif not self._brake:self._control.throttle = 0.0if self._brake:# If the down arrow is held down when the car is stationary, switch to reverseif self._vehicle.get_velocity().length() < 0.01 and not self._control.reverse:self._control.brake = 0.0self._control.gear = 1self._control.reverse = Trueself._control.throttle = min(self._control.throttle + 0.1, 1)elif self._control.reverse:self._control.throttle = min(self._control.throttle + 0.1, 1)else:self._control.throttle = 0.0self._control.brake = min(self._control.brake + 0.3, 1)else:self._control.brake = 0.0if self._steer is not None:if self._steer == 1:self._steer_cache += 0.03if self._steer == -1:self._steer_cache -= 0.03min(0.7, max(-0.7, self._steer_cache))self._control.steer = round(self._steer_cache,1)else:if self._steer_cache > 0.0:self._steer_cache *= 0.2if self._steer_cache < 0.0:self._steer_cache *= 0.2if 0.01 > self._steer_cache > -0.01:self._steer_cache = 0.0self._control.steer = round(self._steer_cache,1)# Ápply the control parameters to the ego vehicleself._vehicle.apply_control(self._control)def generate_lidar_bp(blueprint_library, delta):"""To get lidar bp:param blueprint_library: the world blueprint_library:param delta: update rate(s):return: lidar bp"""lidar_bp = blueprint_library.find("sensor.lidar.ray_cast")lidar_bp.set_attribute("dropoff_general_rate", "0.0")lidar_bp.set_attribute("dropoff_intensity_limit", "1.0")lidar_bp.set_attribute("dropoff_zero_intensity", "0.0")lidar_bp.set_attribute("upper_fov", str(15.0))lidar_bp.set_attribute("lower_fov", str(-25.0))lidar_bp.set_attribute("channels", str(64.0))lidar_bp.set_attribute("range", str(100.0))lidar_bp.set_attribute("rotation_frequency", str(1.0 / delta))lidar_bp.set_attribute("points_per_second", str(500000))return lidar_bpdef lidar_callback(point_cloud, point_list):# We need to convert point cloud(carla-format) into numpy.ndarraydata = np.copy(np.frombuffer(point_cloud.raw_data, dtype = np.dtype("f4")))data = np.reshape(data, (int(data.shape[0] / 4), 4))intensity = data[:, -1]intensity_col = 1.0 - np.log(intensity) / np.log(np.exp(-0.004 * 100))int_color = np.c_[np.interp(intensity_col, VID_RANGE, VIDIDIS[:, 0]),np.interp(intensity_col, VID_RANGE, VIDIDIS[:, 1]),np.interp(intensity_col, VID_RANGE, VIDIDIS[:, 2])]points = data[:, :-1] # we only use x, y, z coordinatespoints[:, 1] = -points[:, 1] # This is different from official scriptpoint_list.points = o3d.utility.Vector3dVector(points)point_list.colors = o3d.utility.Vector3dVector(int_color)# Camera sensor callback, reshapes raw data from camera into 2D RGB and applies to PyGame surface
def pygame_callback1(data, obj):img = np.reshape(np.copy(data.raw_data), (data.height, data.width, 4))img = img[:, :, :3]img = img[:, :, ::-1]# msg = bridge.cv2_to_imgmsg(img, encoding="bgr8")obj.surface = pygame.surfarray.make_surface(img.swapaxes(0, 1))# pub.publish(msg)print("taking photos1")def pygame_callback2(data, obj):img = np.reshape(np.copy(data.raw_data), (data.height, data.width, 4))img = img[:, :, :3]img = img[:, :, ::-1]# msg = bridge.cv2_to_imgmsg(img, encoding="bgr8")# pub2.publish(msg)print("taking photos2")client = carla.Client("127.0.0.1", 2000)
client.set_timeout(2.0)
world = client.get_world()settings = world.get_settings()
settings.synchronous_mode = False    # Enables synchronous mode
settings.fixed_delta_seconds = None
delta = 0.05
settings.fixed_delta_seconds = delta
world.apply_settings(settings)traffic_manager = client.get_trafficmanager(8000)
traffic_manager.set_synchronous_mode(False)
traffic_manager.set_random_device_seed(0)
random.seed(0)# We will set up the spectator so we can see what we do
spectator = world.get_spectator()
# Retrieve the map's spawn points
spawn_points = world.get_map().get_spawn_points()blueprint_library = world.get_blueprint_library()
vehicle_bp = blueprint_library.filter("model3")[0]
vehicle = world.try_spawn_actor(vehicle_bp, spawn_points[0])
vehicle.set_autopilot(False)# Initialise the camera floating behind the vehicle
camera_init_trans = carla.Transform(carla.Location(x=1, y=-1, z=2), carla.Rotation(pitch=0))
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera_bp.set_attribute("image_size_x", str(1280))
camera_bp.set_attribute("image_size_y", str(720))
camera_bp.set_attribute("fov", str(105))
camera = world.spawn_actor(camera_bp, camera_init_trans, attach_to=vehicle)
# Start camera with PyGame callbackcamera2_init_trans = carla.Transform(carla.Location(x=1, y=1, z=2), carla.Rotation(pitch=0))
camera2_bp = blueprint_library.find('sensor.camera.rgb')
camera2_bp.set_attribute("image_size_x", str(1280))
camera2_bp.set_attribute("image_size_y", str(720))
camera2_bp.set_attribute("fov", str(105))
camera2 = world.spawn_actor(camera2_bp, camera2_init_trans, attach_to=vehicle)# Get camera dimensions
image_w = camera_bp.get_attribute("image_size_x").as_int()
image_h = camera_bp.get_attribute("image_size_y").as_int()# Instantiate objects for rendering and vehicle control
renderObject = RenderObject(image_w, image_h)
controlObject = ControlObject(vehicle)camera.listen(lambda image: pygame_callback1(image, renderObject))lidar_bp = generate_lidar_bp(blueprint_library, delta)
lidar_transform = carla.Transform(carla.Location(x=-0.5, z=1.8))
lidar = world.spawn_actor(lidar_bp, lidar_transform, attach_to=vehicle)point_list = o3d.geometry.PointCloud()lidar.listen(lambda data: lidar_callback(data, point_list))vis = o3d.visualization.Visualizer()
vis.create_window(window_name= "Display Point Cloud",width= 960,height= 540,left= 480,top= 270)vis.get_render_option().background_color = [0.05, 0.05, 0.05]
vis.get_render_option().point_size = 1
vis.get_render_option().show_coordinate_frame = Trueframe = 0
dt0 = datetime.datetime.now()# Initialise the display
pygame.init()
gameDisplay = pygame.display.set_mode((image_w,image_h), pygame.HWSURFACE | pygame.DOUBLEBUF)
# Draw black to the display
gameDisplay.fill((0,0,0))
gameDisplay.blit(renderObject.surface, (0,0))
pygame.display.flip()crashed = False
while not crashed:# if frame == 2:#     vis.add_geometry(point_list)## vis.update_geometry(point_list)# vis.poll_events()# vis.update_renderer()# time.sleep(0.005)world.tick()transform = vehicle.get_transform()  # we get the transform of vehiclespectator.set_transform(carla.Transform(transform.location + carla.Location(z=50),carla.Rotation(pitch=-90)))# Update the displaygameDisplay.blit(renderObject.surface, (0, 0))pygame.display.flip()controlObject.process_control()for event in pygame.event.get():if event.type == pygame.QUIT:crashed = TruecontrolObject.parse_control(event)process_time = datetime.datetime.now() - dt0sys.stdout.write("\r" + "FPS: " + str(1.0 / process_time.total_seconds()) + "Current Frame: " + str(frame))sys.stdout.flush()dt0 = datetime.datetime.now()frame += 1# Stop camera and quit PyGame after exiting game loop
camera.stop()
camera2.stop()
pygame.quit()

这里有一个bug,我的代码里分别有Lidar点云可视化的代码和相机照片可视化的代码,可是这两个可视化不能共存,如果Lidar的点云可视化更新,相机图片可视化就不更新,相机更新,Lidar就不更新。不知道为什么,知道的大神欢迎留言。

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

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

相关文章

【C++的OpenCV】第十四课-OpenCV基础强化(三):Mat元素的访问之data和step属性

&#x1f389;&#x1f389;&#x1f389; 欢迎来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎来到小白piao的学习空间&#xff01;} 欢迎来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496; C\Python所有的入门技术皆在 我…

【年终特惠】基于最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇系统性实践技能提升

根据生态环评内容庞杂、综合性强的特点&#xff0c;依据生态环评最新导则&#xff0c;将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量及…

前端Vue页面中如何展示本地图片

<el-table :data"tableData" stripe style"width: 100%"><el-table-column prop"imgUrl" label"图片"><template v-slot"scope"><img :src "http://localhost:8888/image/ scope.row.imgUrl&qu…

R-FCN: Object Detection via Region-based Fully Convolutional Networks(2016.6)

文章目录 AbstractIntroduction当前最先进目标检测存在的问题针对上述问题&#xff0c;我们提出... Our approachOverviewBackbone architecturePosition-sensitive score maps & Position-sensitive RoI pooling Related WorkExperimentsConclusion 原文链接 源代码 Abstr…

飞天使-mysql8.0远程连接允许

mysql -u root -p 查看身份验证类型 mysql> use mysql; Database changed mysql> SELECT Host, User, plugin from user; ------------------------------------------------- | Host | User | plugin | ------------------------------------------------- | % | root …

Sass、Less和Stylus之间有什么主要的区别?

Sass、Less和Stylus是三种常见的CSS预处理器&#xff0c;它们在功能和语法上有一些区别。以下是它们之间的主要区别&#xff1a; 1&#xff1a;语法差异&#xff1a; Sass使用缩进的语法&#xff0c;使用类似于Python的缩进来表示嵌套规则和块级作用域。Less和Stylus使用类似…

大数据之LibrA数据库系统告警处理(ALM-12002 HA资源异常)

告警解释 HA软件周期性检测Manager的WebService浮动IP地址和数据库。当HA软件检测到浮动IP地址或数据库异常时&#xff0c;产生该告警。 当HA检测到浮动IP地址或数据库正常后&#xff0c;告警恢复。 告警属性 告警参数 对系统的影响 如果Manager的WebService浮动IP地址异常…

SSM咖啡点餐管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 咖啡点餐管理系统是一套完善的信息系统&#xff0c;结合SSM框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开…

selenium : TypeError: object of type ‘float‘ has no len()

使用selenium时报错 TypeError: object of type float has no len() 。 显然selenium不允许直接输入浮点类型数据&#xff08;字符串与整形可以&#xff09;。 但是问题excel中这个数据值为空&#xff0c;只能猜测不同电脑打开excel时格式不同影响读取数据。 将该数据使用st…

vue3 Suspense组件

在 Vue 3 中&#xff0c;<Suspense> 组件用于处理异步组件加载时的等待状态和错误处理。它允许你在加载异步组件时显示一个自定义的加载指示器&#xff0c;以及在加载失败时显示错误信息。以下是一个详细的 <Suspense> 组件的使用示例&#xff1a; 首先&#xff0…

CSS基础入门04

目录 1.内边距 1.1基础写法 1.2复合写法 2.外边距 2.1基础写法 2.2复合写法 2.3块级元素水平居中 3.去除浏览器默认样式 4.弹性布局 4.1初体验 5.flex 布局基本概念 6.常用属性 6.1justify-content 6.2align-items 1.内边距 padding 设置内容和边框之间的距离. …

java的字符串字面量

在同一个类中&#xff0c;字符串字面量引用同一个字符串对象。例如&#xff1a; package com.thb;public class Demo4 {public static void main(String[] args) {String world "world";System.out.println(world "world");}}运行输出&#xff1a; tru…

01函数的基础

函数是一段功能性代码&#xff0c;可以让python做特殊的事情 函数是代码重用的一种方式&#xff0c;可以让你多次使用函数 abs函数bool函数float函数 绝对值 abs 绝对值 绝对值数值距离原点的位置 0和所有的正数绝对值等于它本身 负数的绝对值等于他的相反数 bool函数 boo…

NewStarCTF2023week4-midsql(利用二分查找实现时间盲注攻击)

大致测试一下&#xff0c;发现空格被过滤了 使用内联注释/**/绕过&#xff0c;可行 1/**/-- 使用%a0替代空格&#xff0c;也可以 1%a0-- 再次测试发现等号也被过滤&#xff0c;我们使用 like 代替 &#xff08;我最开始以为是and被过滤&#xff0c;并没有&#xff0c;如果是…

使用Python批量修改PPT字体和提取全部文字到word

目录 一、修改PPT中每一页的字体二、将文本框中的字都放到word里 将一份PPT的每一页字体、大小、是否加粗都统一&#xff0c;是一个常见需求。特别是字体统一是高频、热点需求。在python操控PPT常用库python-pptx中有一个bug&#xff0c;对字体的修改只能修改数字和英文字母&am…

智慧公厕:提升城市卫生与舒适体验的未来之选

智慧公厕作为城市管理的一项重要创新&#xff0c;已经在环境监测调控、厕位监测引导、自动化清洁、自动灯光控制、远程控制等方面展现出先进而完善的功能。它不仅提升了市民对公共厕所卫生、舒适、安全等方面的使用体验&#xff0c;同时也为城市管理带来了颇具引领性的改革和升…

大数据Flink(一百零三):SQL 表值聚合函数(Table Aggregate Function)

文章目录 SQL 表值聚合函数(Table Aggregate Function) SQL 表值聚合函数(Table Aggregate Function) Python UDTAF,即 Python TableAggregateFunction。Python UDTAF 用来针对一组数据进行聚合运算,比如同一个 window 下的多条数据、或者同一个 key 下的多条数据等,与…

一文详解汽车电子LIN总线

0.摘要 汽车电子LIN总线不同于CAN总线。 LIN总线基本上是CAN总线的廉价补充&#xff0c;相比于CAN总线&#xff0c;它提供较低的可靠性和性能。同时LIN总线也是一个应用非常广泛的网络协议&#xff0c;并且越来越受欢迎。 再一次&#xff0c;我们准备了一个关于LIN总线的简要…

PHP | php入门知识(if、switch、数组、数组排序、超级全局变量)

文章目录 一、php条件语句&#xff08;if、switch&#xff09;1. if语句2. if...else语句3. if...elseif...else语句4. switch语句 二、数组1&#xff09;数值数组1. 创建数值数组的两种方法&#xff1a;2. 获取数组的长度&#xff08;count()函数&#xff09;3. 遍历数值数组&…

JavaScript 中的负无穷大是什么?

在 JavaScript 中&#xff0c;负无穷大表示为 -Infinity。它是一个特殊的数值&#xff0c;用于表示比任何实数都要小的值。 负无穷大用于表示超出数值范围的情况&#xff0c;例如在进行数学计算时发生了溢出或出现了无法表示的结果。它可以通过将负无穷大赋值给变量或通过某些…