CARLA--车辆激光雷达安装-显示并存储数据[超详细]--[入门4]

2023-10-26

  系列文章目录

CARLA pygame window界面大小调节两种方法-Ubuntu18.04

[收藏]CRALA模拟器全网优质学习资料整合[入门-1]

CARLA蓝图库可调用的车辆和地图模型名称大全

如何在carla中加入车辆群[基于traffic manager]

CARLA--车辆添加segmentation语义相机[超详细]--[入门-2]

CARLA--车辆添加环视RGB相机[超详细]--[入门-3]


 系列文章目录

前言

一、demo模块说明

二、整体代码

三、效果展示 


前言

        下面展示一个能在ubuntu18.4上跑通的激光雷达传感器demo,具体可以实现的效果有:

        1.实时连续显示激光雷达传感器图像画面

        2.可搭载在车上指定位置

        3.定义对应的场视角,视角范围为0~360度

        4.采集的数据以npy文件格式存储


一、demo模块说明

  1.定义对应的数据

具体说明参考官网说明,这篇给出官网地址:[收藏]CARLA模拟器全网优质学习资料整合[入门-1]

 #-------------------------- 进入传感器部分 --------------------------#
        sensor_queue = Queue()
        lidar_bp = blueprint_library.find('sensor.lidar.ray_cast')

        lidar_bp.set_attribute('channels', '64')
        lidar_bp.set_attribute('points_per_second', '200000')
        lidar_bp.set_attribute('range', '64')
        lidar_bp.set_attribute('rotation_frequency','20') 
        lidar_bp.set_attribute('horizontal_fov', '360') 

2.雷达在车上位置定义:

        lidar01 = world.spawn_actor(lidar_bp, carla.Transform(carla.Location(z=args.sensor_h)), attach_to=ego_vehicle)
        lidar01.listen(lambda data: sensor_callback(data, sensor_queue, "lidar"))
        sensor_list.append(lidar01)

        
        #-------------------------- 传感器设置完毕 --------------------------#

3.相机可视化展示:

w_frame = world.get_snapshot().frame
            print("\nWorld's frame: %d" % w_frame)
            try:
                lidars = []
                for i in range (0, len(sensor_list)):
                    s_frame, s_name, s_data = sensor_queue.get(True, 1.0)
                    print("    Frame: %d   Sensor: %s" % (s_frame, s_name))
                    sensor_type = s_name.split('_')[0]
                    if sensor_type == 'lidar':
                        lidar = _parse_lidar_cb(s_data)

                cv2.imshow('vizs', visualize_data(lidar))
                cv2.waitKey(100)

4.存储数据:

mkdir_folder(args.save_path)
filename = args.save_path +'lidar/'+str(w_frame)+'.npy'
np.save(filename, lidar)

二、整体代码


import glob
import os
import sys
import time

try:
    sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (
        sys.version_info.major,
        sys.version_info.minor,
        'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0])
except IndexError:
    pass

import carla
import numpy as np
import cv2
from queue import Queue, Empty
import copy
import random
random.seed(0)

# args
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--host', metavar='H',    default='127.0.0.1', help='IP of the host server (default: 127.0.0.1)')
parser.add_argument('--port', '-p',           default=2000, type=int, help='TCP port to listen to (default: 2000)')
parser.add_argument('--tm_port',              default=8000, type=int, help='Traffic Manager Port (default: 8000)')
parser.add_argument('--ego-spawn', type=list, default=None, help='[x,y] in world coordinate')
parser.add_argument('--top-view',             default=True, help='Setting spectator to top view on ego car')
parser.add_argument('--map',                  default='Town04', help='Town Map')
parser.add_argument('--sync',                 default=True, help='Synchronous mode execution')
parser.add_argument('--sensor-h',             default=2.4, help='Sensor Height')
parser.add_argument('--save-path',            default='储存路径', help='Synchronous mode execution')
args = parser.parse_args() 


actor_list, sensor_list = [], []
sensor_type = ['lidar']
def main(args):
    # We start creating the client
    client = carla.Client(args.host, args.port)
    client.set_timeout(5.0)
    
    world = client.get_world()
    # world = client.load_world('Town01')
    blueprint_library = world.get_blueprint_library()
    try:
        original_settings = world.get_settings()
        settings = world.get_settings()

        # We set CARLA syncronous mode
        settings.fixed_delta_seconds = 0.05
        settings.synchronous_mode = True
        world.apply_settings(settings)
        spectator = world.get_spectator()

        # 手动规定
        # transform_vehicle = carla.Transform(carla.Location(0, 10, 0), carla.Rotation(0, 0, 0))
        # 自动选择
        transform_vehicle = random.choice(world.get_map().get_spawn_points())
        ego_vehicle = world.spawn_actor(random.choice(blueprint_library.filter("model3")), transform_vehicle)
        actor_list.append(ego_vehicle)
        
        # 设置traffic manager
        tm = client.get_trafficmanager(args.tm_port)
        tm.set_synchronous_mode(True)
        # 是否忽略红绿灯
        # tm.ignore_lights_percentage(ego_vehicle, 100)
        # 如果限速30km/h -> 30*(1-10%)=27km/h
        tm.global_percentage_speed_difference(10.0)
        ego_vehicle.set_autopilot(True, tm.get_port())

        #-------------------------- 进入传感器部分 --------------------------#
        sensor_queue = Queue()
        lidar_bp = blueprint_library.find('sensor.lidar.ray_cast')

        lidar_bp.set_attribute('channels', '64')
        lidar_bp.set_attribute('points_per_second', '200000')
        lidar_bp.set_attribute('range', '64')
        lidar_bp.set_attribute('rotation_frequency','20') 
        lidar_bp.set_attribute('horizontal_fov', '360') 
        
        lidar01 = world.spawn_actor(lidar_bp, carla.Transform(carla.Location(z=args.sensor_h)), attach_to=ego_vehicle)
        lidar01.listen(lambda data: sensor_callback(data, sensor_queue, "lidar"))
        sensor_list.append(lidar01)

        
        #-------------------------- 传感器设置完毕 --------------------------#


        while True:
            # Tick the server
            world.tick()

            # 将CARLA界面摄像头跟随车动
            loc = ego_vehicle.get_transform().location
            spectator.set_transform(carla.Transform(carla.Location(x=loc.x,y=loc.y,z=15),carla.Rotation(yaw=0,pitch=-90,roll=0)))

            w_frame = world.get_snapshot().frame
            print("\nWorld's frame: %d" % w_frame)
            try:
                lidars = []
                for i in range (0, len(sensor_list)):
                    s_frame, s_name, s_data = sensor_queue.get(True, 1.0)
                    print("    Frame: %d   Sensor: %s" % (s_frame, s_name))
                    sensor_type = s_name.split('_')[0]
                    if sensor_type == 'lidar':
                        lidar = _parse_lidar_cb(s_data)

                cv2.imshow('vizs', visualize_data(lidar))
                cv2.waitKey(100)
                # if rgb is None or args.save_path is not None:
                    # 检查是否有各自传感器的文件夹
                mkdir_folder(args.save_path)

                filename = args.save_path +'lidar/'+str(w_frame)+'.npy'
                np.save(filename, lidar)

            except Empty:
                print("    Some of the sensor information is missed")

    finally:
        world.apply_settings(original_settings)
        tm.set_synchronous_mode(False)
        for sensor in sensor_list:
            sensor.destroy()
        for actor in actor_list:
            actor.destroy()
        print("All cleaned up!")

def mkdir_folder(path):
    for s_type in sensor_type:
        if not os.path.isdir(os.path.join(path, s_type)):
            os.makedirs(os.path.join(path, s_type))
    return True

def sensor_callback(sensor_data, sensor_queue, sensor_name):
    # Do stuff with the sensor_data data like save it to disk
    # Then you just need to add to the queue
    sensor_queue.put((sensor_data.frame, sensor_name, sensor_data))

# modify from world on rail code
def visualize_data(lidar, text_args=(0.6)):
    
    lidar_viz = lidar_to_bev(lidar).astype(np.uint8)
    lidar_viz = cv2.cvtColor(lidar_viz,cv2.COLOR_GRAY2RGB)

    return lidar_viz

# modify from world on rail code
def lidar_to_bev(lidar, min_x=-100,max_x=100,min_y=-100,max_y=100, pixels_per_meter=4, hist_max_per_pixel=2):
    xbins = np.linspace(
        min_x, max_x+1,
        (max_x - min_x) * pixels_per_meter + 1,
    )
    ybins = np.linspace(
        min_y, max_y+1,
        (max_y - min_y) * pixels_per_meter + 1,
    )
    # Compute histogram of x and y coordinates of points.
    hist = np.histogramdd(lidar[..., :2], bins=(xbins, ybins))[0]
    # Clip histogram
    hist[hist > hist_max_per_pixel] = hist_max_per_pixel
    # Normalize histogram by the maximum number of points in a bin we care about.
    overhead_splat = hist / hist_max_per_pixel * 255.
    # Return splat in X x Y orientation, with X parallel to car axis, Y perp, both parallel to ground.
    return overhead_splat[::-1,:]

# modify from leaderboard
def _parse_lidar_cb(lidar_data):
    points = np.frombuffer(lidar_data.raw_data, dtype=np.dtype('f4'))
    points = copy.deepcopy(points)
    points = np.reshape(points, (int(points.shape[0] / 4), 4))
    return points

if __name__ == "__main__":
    try:
        main(args)
    except KeyboardInterrupt:
        print(' - Exited by user.')

三、效果展示 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CARLA--车辆激光雷达安装-显示并存储数据[超详细]--[入门4] 的相关文章

随机推荐

  • 吐血分享!这几个在线网站超劲爆,福利满满

    现在网上资源丰富 有许多干货都是我们不知道的 小编今天和你们分享一些好的在线资源 今天就免费分享给大家 一 全集网 全集网主要是可以进行全网搜索下载电影或者电视剧的一个在线网站 并且更新的也很快哦 里面有好多好看的电影 喜欢看电视的小伙伴们
  • WPF VirtualizationMode属性Recycling和Standard的区别

    默认情况下 VirtualizingStackPanel 创建每个可见项的项容器以及丢弃 当不再需要时 例如 当项滚动到视图之外时 当 ItemsControl 包含许多项目时 会创建并放弃项容器处理会对性能产生负面影响 当 Virtual
  • Hadoop集群部署

    目录 1 部署规划 2 准备三台虚拟机 1 创建三个文件夹 然后把之前创建的虚拟机里面的文件分别复制到这三个文件夹中 编辑 2 用vmware分别打开这三个文件夹下的虚拟机 并分别重命名 3 修改这三台虚拟机的IP 1 运行master 然
  • Cocos2d 本地数据保存接口封装

    设置key value进行保存 setLocalStorageString function key value key LS key if typeof this key undefined undefined this key sys
  • 设计模式之装饰器模式

    装饰器模式 动态的将责任附加到对象上 若要扩展功能 装饰器提供了比继承更有弹性的替代方案 装饰器中有两个比较重要的角色 装饰者和被装饰者 被装饰者实现我们的核心逻辑 装饰者只是对这些逻辑进行增强 比如点一杯饮料 冰 加豆浆等都是装饰者 是对
  • 自旋锁与互斥锁的对比、手工实现自旋锁

    本文地址 LYanger的博客 http blog csdn net freeelinux article details 53695111 本文之前 我只是对自旋锁有所了解 知道它是做什么的 但是没有去测试实现过 甚至以为自旋锁只有ker
  • 顺序表的插入

    前面讲了关于顺序表的查找 这篇文章将讨论顺序表的插入与删除 首先来看看插入操作 在第i个位置插入一个新元素 使长度为n的线性表变为长度为n 1的线性表 我们在前一篇文章结尾谈到插入与删除需要移动大量的元素 其实就是移动原表的一些位置的结点
  • java - file文件操作

    目录 1 文件属性查询操作 2 创建 txt文件 3 删除 txt文件 4 创建文件夹 5 删除文件夹 6 获取当前目录下所有文件夹的名称 7 文件过滤 1 文件属性查询操作 package file import java io File
  • 一个注解搞定Spring Security 忽略拦截

    Copyright 2021 2022 the original author or authors Licensed under the Apache License Version 2 0 the License you may not
  • day009:HTML表单标签(2)

    接上节
  • 蓝桥杯青少组省赛Python模拟题

    请你编写程序 输入一串数字 输出这串数字的总个数 输入描述 输入一行 内容为数字 输出描述 输出一个正整数 表示输入数字的总个数 样例输入 6789 样例输出 4 代码 n input print len n 已知1小时等于60分钟 1分钟
  • 不上架App Store怎么安装到非越狱苹果手机使用

    很多开发者打包了ipa却不能安装 因为ios不像安卓打包出来就能安装 如苹果手机没越狱 需要提供特定的ios证书打包的ipa才能安装到手机使用 有两种ios证书可以实现 1 ios开发者证书 个人和公司账号申请 需要添加udid 限制100
  • (c语言)单、双精度

    单精度型 1 用符号float表示 2 分配4个字符 3 数值范围3 4E 38 3 4E 38 提供七个有效数字 4 后缀为f或F表示单精度浮点型 双精度型 1 用符号double表示 2 分配8个字符 3 数值范围1 7E 308 1
  • python安装包失败 ModuleNotFoundError: No module named 'lxml'

    最近在学习python 用到了tushare这个包 但是安装的时候 总是报 import lxml html ModuleNotFoundError No module named lxml Command python setup py
  • Matplotlib绘制象限图——支持中文、箭头、自定义轴线交点

    Matplotlib绘制象限图 支持中文 箭头 自定义轴线交点 1 效果图 2 原理 2 1 绘制象限图步骤 2 1 添加文字到图表 3 源码 参考 这篇博客将介绍如何使用matplotlib绘制象限图 写这篇博客源于博友的提问 首先pye
  • GDB first impression

    I never use GDB before though I ve heard of it long times ago Well I never use it simply because I never really debug pr
  • 利用 DAC0832 设计信号发生器

    Proteus 仿真要求 利用 DAC0832 产生一个占空比为 1 3 的矩形波信号 电路图 代码图 利用 DAC0832 产生一个占空比为 1 3 的矩形波信号 include
  • SQL进阶_3

    三值逻辑和 NULL 大多数编程语言都是基于二值逻辑的 即逻辑真值只有真和假两个 而 SQL 语言则采用一种特别的逻辑体系 三值逻辑 即逻辑真值除了真和假 还有第三个值 不确定 普通语言里的布尔型只有 true 和 false 两个值 这种
  • 二分查找BinarySearch原理分析、判定树、及其变种

    二分查找BinarySearch 1 二分查找及其要求 二分查找 又叫折半查找 是一种效率较高的查找算法 1 二分查找的要求 线性表是有序表 即表中结点按关键字有序 并且要用向量作为表的存储结构 不妨设有序表是递增有序的 存储结构 二分查找
  • CARLA--车辆激光雷达安装-显示并存储数据[超详细]--[入门4]

    系列文章目录 CARLA pygame window界面大小调节两种方法 Ubuntu18 04 收藏 CRALA模拟器全网优质学习资料整合 入门 1 CARLA蓝图库可调用的车辆和地图模型名称大全 如何在carla中加入车辆群 基于tra