在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就不更新。不知道为什么,知道的大神欢迎留言。
相关文章:

在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并应用 这里使用固定时…...

【VUE】ArcoDesign之自定义主题样式和命名空间
前言 Arco Design是什么? Arco Design 是由字节跳动推出的企业级产品的完整设计和开发解决方案前端组件库 官网地址:https://arco.design/同时也提供了一套开箱即用的中后台前端解决方案:Arco Design Pro(https://pro.arco.design/) Arco De…...

TVRNet网络PyTorch实现
文章目录 文章地址网络各层结构代码实现 文章地址 An End-to-End Traffic Visibility Regression Algorithm文章通过训练搜集得到的真实道路图像数据集(Actual Road dense image Dataset, ARD),通过专业的能见度计和多人标注,获得…...

opencv之坑(八)——putText中文乱码解决
opencv4.0之前版本和部分4.0版本的putText仅支持英文,如果中文会乱码,可以用下面方法构造函数解决: 头文件如下: #pragma once #ifndef PUTTEXT_H_ #define PUTTEXT_H_#include <windows.h> #include <string> #incl…...

nrf52832 开发板入手笔记:资料搜集
前言 最近翻箱,发现了两块几年前买的 NRF52832 与 NRF52840 的开发板,打算搭个 BLE 的开发环境 NRF52832 与 NRF51822 之前用过, NRF52840 没有用过,好像是 BLE4 与 BLE5 的区别吧 相关介绍 除了开发板,最重要的还是…...

PHP如何批量修改二维数组中值
每个name值加pex,age加5, 原数据: $data[["name">a,age>12],["name">b,age>22],["name">c,age>33],["name">d,age>44], ];实现效果 方案一、foreach引用方式 $data[["…...

Python 算法高级篇:归并排序的优化与外部排序
Python 算法高级篇:归并排序的优化与外部排序 引言 1. 归并排序的基本原理2. 归并排序的优化2.1 自底向上的归并排序2.2 最后优化 3. 外部排序4. 性能比较5. 结论 引言 在计算机科学中,排序是一项基本的任务,而归并排序( Merge S…...

LeetCode--1991.找到数组的中间位置
1 题目描述 给你一个下标从 0 开始的整数数组 nums , 请你找到 最左边 的中间位置 middleIndex (也就是所有可能中间位置下标最小的一个) 中间位置 middleIndex 是满足 nums[0] nums[1] ... nums[middleIndex-1] nums[middleIndex1] nums[middleI…...

物联网数据采集网关连接设备与云平台的关键桥梁
随着工业4.0和智能制造的快速发展,物联网数据采集网关在工业物联网中的应用越来越广泛。物联网数据采集网关作为连接设备与云端之间的关键桥梁,能够实现高效、可靠、安全的数据传输和转换,为智能制造和工业4.0提供了强大的支持。 一、物联网…...

专家级数据恢复:UFS Explorer Professional Recovery Crack
UFS Explorer Professional Recovery - 一款功能强大且方便的数据恢复程序,支持检测大量文件系统、操作系统和各种类型的驱动器:从简单的闪存驱动器到复杂的复合存储(各种级别的 RAID 阵列)。 该程序由执业专家开发,并…...

2023/10/23 mysql学习
数据库修改 show databases; 展示所有数据库 create database 数据库名; 创建数据库 create database if not exists 数据库名; 如果未创建过当前数据库名则创建 drop database 数据库名; drop database if exists 数据库名;用法和创建类似 删除数据库 use 数据库名; 跳…...

软考系统架构师知识点集锦六:项目管理
一、考情分析 二、考点精讲 2.1进度管理(时间管理) 进度管理:为了确保项目按期完成所需要的管理过程。 2.1.1过程 [WBS分解的基本要求] WBS的工作包是可控和可管理的,不能过于复杂。任务分解也不能过细,一般原则WBS的树形结构不超过6层。每个工作包要…...

MacOS系统Chrome开发者模式下载在线视频
操作流程 # step1. 进入开发者模式 command option i # step2. 在搜索栏中搜索 getHttpVideoInfo.do?关键词 # step3. 在Preview的Json界面中找到video,然后选择不同resolution & duration的视频片段; # step4. 选择合适的video::chapters, 选择…...

uniapp v3+ts 使用 u-upload上传图片以及视频
上传图片方法 <u-upload :fileList"fileList1" afterRead"afterRead" delete"deletePic" name"file" multiple :maxCount"6"></u-upload> // maxCount 最大上传数const fileList1 ref([]);const file ref([…...

为什么虚拟dom会提高性能?
虚拟 DOM(Virtual DOM)是一种在前端开发中常用的技术,它可以提高性能并改善用户体验。虚拟 DOM 的原理和用处如下: 原理: 当页面状态发生变化时,虚拟 DOM 会以 JavaScript 对象的形式进行更新,而…...

2015年亚太杯APMCM数学建模大赛A题海上丝绸之路发展战略的影响求解全过程文档及程序
2015年亚太杯APMCM数学建模大赛 A题 海上丝绸之路发展战略的影响 原题再现 一带一路不是实体或机制,而是合作与发展的理念和主张。凭借现有有效的区域合作平台,依托中国与有关国家现有的双边和多边机制,利用古丝绸之路的历史象征࿰…...

js中HTMLCollection如何循环
//不带索引 let divCon document.getElementsByClassName("el-form-item__error"); if (divCon.length > 0) {for (var item of divCon) {console.log("打印:", item.innerText);} }//带有索引 let divCon document.getElementsByClassNam…...

Kafka - 3.x 副本不完全指北
文章目录 kafka 副本的基本信息Leader选举过程Kafka Controllerkafka 分区副本Leader的选举流程实际演示① 查看first的详细信息,注意观察副本分布情况② 停掉hadoop103上的kafka进程③ 再次查看first的相信信息,观察副本分布④ 处理分区leader分布不均匀…...

二分归并法将两个数组合并
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> main() {int a[5] {1,3,4,5,6};int b[4] {2,7,8,9};int c[9];int m0, n0,k0;while (m < 5 && n < 4){if (a[m] < b[n]){c[k] a[m];//谁小谁先进数组m; k;}else{c[k] b[n];k; n;}}while (m <…...

ROS自学笔记十六:URDF优化_xacro文件
xacro 是一种 XML 扩展语言,用于创建和维护 URDF(Unified Robot Description Format)文件。它允许你使用参数化、宏和条件语句等功能来更灵活、更可维护地定义机器人模型。下面是关于 xacro 的详细解释: 1. 参数化(Par…...

XMLHttpRequest拦截请求和响应
环境: angular 实现: 拦截请求 向请求信息增加字段 拦截响应 过滤返回值 响应拦截: 根据angular使用的XMLHttpRequest 将对原本的请求转移到另一个将监听返回事件挂载到另一个世纪发送请求的xml上 使用get set 将客户端获取的res…...

前端 读取/导入 Excel文档
情况: 需要通过Excel表,将数据导入到数据库,但是后台人员出差了,我又只会PHP,没用过node,所以只能前端导入Excel文件,然后循环调用后台的单条添加接口了。 库: Excel.js(…...

聊聊springboot的TomcatMetricsBinder
序 本文主要研究一下springboot的TomcatMetricsBinder TomcatMetricsAutoConfiguration org/springframework/boot/actuate/autoconfigure/metrics/web/tomcat/TomcatMetricsAutoConfiguration.java Configuration(proxyBeanMethods false) ConditionalOnWebApplication C…...

《动手学深度学习 Pytorch版》 10.6 自注意力和位置编码
在注意力机制中,每个查询都会关注所有的键-值对并生成一个注意力输出。由于查询、键和值来自同一组输入,因此被称为 自注意力(self-attention),也被称为内部注意力(intra-attention)…...

2023年第四届MathorCup高校数学建模挑战赛——大数据竞赛B题 实现代码
根据之前发布的思路 第一步 进行数据合并 import pandas as pd# 读取所有附件的数据 data1 pd.read_excel(附件一.xlsx) data2 pd.read_excel(附件二.xlsx) data3 pd.read_excel(附件三.xlsx) data4 pd.read_excel(附件四.xlsx)# 根据商品编码将附件一和附件二连接 combi…...

larvel 中的api.php_Laravel 开发 API
Laravel10中提示了Target *classController does not exist,为什么呢? 原因是:laravel8开始写法变了。换成了新的写法了 解决方法一: 在路由数组加入App\Http\Controllers\即可。 <?phpuse Illuminate\Support\Facades\Route;…...

虚拟机构建部署单体项目及前后端分离项目
目录 一.部署单体项目 1.远程数据库 1.1远程连接数据库 1.2 新建数据库运行sql文件 2.部署项目到服务器中 3.启动服务器运行 二.部署前后端分离项目 1.远程数据库和部署到服务器 2.利用node环境启动前端项目 3.解决主机无法解析服务器localhost问题 方法一 编辑 方法二 一.部…...

C++之特殊类的设计
目录 一、单例模式 1、设计模式 2、单例模式 1、饿汉模式 2、懒汉模式 3、单例对象的释放问题 二、设计一个不能被拷贝的类 三、设计一个只能在堆上创建对象的类 四、设计一个只能在栈上创建对象的类 五、设计一个不能被继承的类 一、单例模式 1、设计模式 概念&am…...

Java练习题2020 -1
统计1到N的整数中,被A除余A-1的偶数的个数 输入说明:整数 N(N<10000), A, (A 输出说明:符合条件的数的个数 输入样例:10 3 输出样例:2 (说明:样例中符合条件的2个数是 2、8) import java.util.Scanner;p…...

LuaTable转C#的列表List和字典Dictionary
LuaTable转C#的列表List和字典Dictionaty 介绍lua中创建表测试lua中list表表转成List表转成Dictionary 键值对表表转成Dictionary 多类型键值对表表转成Dictionary 总结 介绍 之前基本都是从C#中的List或者Dictionary转成luaTable,很少会把LuaTable转成C#的List或者…...